ELF0@ Z @8@ @pY  00$$ Ptd```llQtdRtd XXGNUmu*0 Xz ;m i RH@ADa@ <jKd BG @ 4`E Y! &! \&(`"(,E!!($@ !:Ȁ  0 @0 ` "cE B'H!!P0,W @@4 H ` 0!D $hC0IDH! @2 b"ChDZ D&H"T@XH@I0YB"#   (@ d&@p(B1" P`   #&b ` E@ A0  KQQ7@ H )@   0$ -t@P  Ahq:V$ @ HB!Rb`@ ` B $ X!+ J4 AF!0($ 2DX @ h?ACDFGJLORTXZ[^_`bcefijlopsuxz{~   !%')*,-/01289:;=>?ACDFIKLMQRUVWXY^_`adgmopstvwy}~   %'(*/134579;=ACDGHIMNOQRSTVZ\^_`aehkmqrtxyz~f#7-,LdOٕW sgg~Nzخi=2 &љb1yl<~T-غtpn9g"E`߫, ߳".B^kR1dV}hh3܆VjnLi?sdChh﬜԰>[2f};'`4$eDЏ);Eם͗pujcgS'pep[!g\>l8~FM" }J.U =xӠRwcAހ*S~f#MS+tϴ:¥F)E(YPV H}5yu_rGJ6<#/ Iu:!u0r4KAWľ* m*:`!% ./V2g%lo@ݙ4M6f}6՝Chbq4M4kJ.\~Y͂]^O8t!NcORSnH5`!gFUWp|z:# IɁ +.f#+U2zůɝu*3Ed?XZsʙ}􏞑R0M. z{ƥF)|v95ק/ygF9ysE}d/Bp:cTϰE`1ScŢ0yXzavz[p 9K( } yBOsBq2aAa3/ 5poħׄ}ˣ$>84󛭬JƂ M6{=0%*_P,#,A 4Y@'#a _:Ps  :EAЄ*UƣrlP¦0P1"k3E8uQQ 6wbgS`t1 hL9WCEL6)sFyʥF5+ZNg10)>GG6rՐ^$,%c+ҠzBWࣶJ$d"db)Y͏ͬ#@PeG "gq?uojmgz/<4q"sFaji|$}sHFdDx0^?A|~d 4oR3VT"yGLB4vL?PI&fPjO`f p. -]3A|b)ܧR 3EZݰV=d~Βbf+uy[4=yr%69jpvXަ_ 7{N;MDdKFS+T_طj:Ns\R%a솬owmbkKK[YC$.|GT2G }@)Z.#ur5 -.x/'*1xIk,AM4ۮ _S `uՖYlH!E.h.w(y$;S_)ATCPdLҧPvTCqc]/l~"u(p8*&$ǥ h]uxFd`aS]91TV*AKR)|!XDG_x:6L`9BNu&S0gmmU4flL`^Dp8[tBWEj*"2FkMwގܗՍ6r:cjCMJ2җ[ĕLVTxy)ȯc»wKo` Ȕ?fb~jζ H\n1q2müqI4GEn-p_Edu+Wު/8i@Hy R˘=ITA+I-$jᄦXy$A(KRZ*ά`(v}afhsouWC3vK!C{2bVFljYxn,Nw&G.BYy$1Lv=M3N (Ҡm%3oOKO4vh\Em-u@o0,%' N䇜ȻuUuĹQ;w1wc+B'|f KV?=UHl)y7.V3%t/-C-p"|7i.)x+g#=p2Y[q+ri,Xy @L'RYqW2b+SdqXVj!XX]gH.f}Á<r 5/ZɗʱSȥnzvW!gr2wT@v_^CF3E01,5!@jqwc%! t c V x= (L"(& x)tP@c X0,e_8d ʗc ^G?esNK [R@  Eb >" l{"c WyKd {2 s7e s$1mej $m" pyQd P y h$Ob" 54z 0" 1 (& tr!X P" 0 Ho hb" k @$6" ШNm ( q 0Q/" (#2" (T/" آ ! % \^" & 0Pq " 4w" 44" ('"  G8" h" 0$  ('!X M" 0*" P" .q  =" 3w!  3J" [ tj 3"  H?="  x pr  (^" 44vr! " 8P p!0  80Y" @\J" H" D>" @! X j n" 94@ x:" 4  e $3 80x P`A" <u! H'u 84w|! (" "! 2"  D" @ s" PBS" hn \" x-" (+" x" 8" |dk (" hf" Xb ` (/  iR"  ( 0҄" $ 8L<" X(v! X& \ " X =i O" a x(c !3" ئ\" x ȈLې" +\c H4y  ؍=" ȯ8 va ̌" `d$ ("  3C" l;"  @\! i  J&!@ 0" D(!  _! (G_ ,w   !! (" (X" `)4/"  ` t) t" @4j!H x $ ȚN" " (H" @LH" z! X/ h` 03c $w {! P6|! {e cO" ( 00̏" %u" )" h94" ,"  0X h" Td!! P as" P.n  Ȍ r!0 +f # ,u 00  " L1"  L" D  h Xi `|! ;" P/ 8dF" hL{f Q$! (R" ]" 8L" POu 00o" \v! #B w$ xtK" `]w ( K" 0#H" P0h `\;*" " TH" 5" 7"  ,  r" #)~ `!0 (|z 0P-" $v f" h "B" @E5" Xc Պ"  w! 8iu H= Н3" "  ~% P" Xsx $w" j hX" n @L L# 4-:" " DV" " e   x4 " `w x4" P (" a! ( 0X" " pD A" شU S^ Fk h!|! d ($)" Пo x" H!*" hp! ( T{ 0t! (Q" @D!" 14" ,T L 0ҋ" 4" 0 ` (0=g  l 3" $9" $ 0(" X$ p!! $~6" . `" (Cl (_ H,} x% P0z 0?" ذDu  p~b 0Dh H$@c& w K" pL " `(9" a" p"  " pl () H H" " x z 0x " P% | 1X " $LJ" Ha 0Dx h$" 83" H" `:" ~ H Pi Ǎ" pH^c a  h0/" (H" (H" XDq{ 0Ɏ" @! _" ,!X @qp $;" i | he1" i " x8" xg;" XI" T˂ h0Mc" 4_" u9" ت,C" {>>" 4V" P v( Xx99" , { 0Q" (x>" X@!! x j )" 2" 84tE (GL" b 0G" 944b Ht" 4 P|} xX" x|"  " PH:" 8|cY" Lh 0ɖ" H:" P&:N" 8f #z 0"! ("  =" '1" 4"  { 0[x Xv!8 (| n! "$ :" h'! U" W" XF ! b " xZ" ? ɐ" (+v (t} 8" 9/s" @ ܏" &8_ xtd ` } @6"  &" 0((9" _! (u! p)g $4@" 8Py $" 83j:" (:{ 0\(" | " 7H%!( H" xg {! hD" PH" X c _" 4mm $!x (} ،cb H`% 0}a " !4" (o P$W" XB" 8<*0" d؇" D"  D" " 2" @)" }" (" (H%h 0" ,e  @Ň" m  8 { 0' X0 "  " $*" P-" (~ + 0z X(m $" :4R!X -x K" hD' X\PD" L" tw" {"  -" ` @n x 0w;" Э8"  R" YM" )V" 'l N4" C" L} 8C~ Y} ( yl" |do" p ` 0G" к3p xP;W" pn xl! (T" /z$! w," P, )" <" x8 M" 8 XE" o` P0)( f 8"  !H )" ȟn" " TG"  #`! ('$!`  H ْ" 2dV" P" pyy $Г" 54i" )4a !" 3\" 0 ،KcX 4" 9TNo 8r!  +" d t" 8H" x 0 @`" x#DH" 84t^ tJ" @"   `S L"  " # [" `G" D8" X) K 0,e l Ȇ" { " HD~' \ |! '! 9." `(a ( D_" 9T$;" 0$P" D7$ 4>% \y 8H0v p Px "  ! " 0t" 8" ةTy@"  (" |7" %" @8L1"  8"  8^ P2" X2" X"  Df R" hy Cw   `<w " 7" 0(" " Tv " X  h " h ,! $! " ' Л$eB" H?c" } I" P,' SP" L" P0җ @4`!X (։" 8s! (" p,`7[" k h{! @lo 8X" " 08 ( 0-_ #y P$ /m (?t" h" X " p9" 8 yT" 0h B"  w (" P 0d `x" ` $l N" Dq0" p1 " 5q  ! 4rd XQU" Q" S" ph [" H" 2dy[" Hj  +" py 8H,"  0  5" @ Pxb kZ" \ pg)" " :4 ! 8` 08"  " X+Z" @\i 0! Y" LP\" `b?" c ?E" PO" ch pf T" ׌" ` Xpa X0" P"  jy q $3r!@ ! %" P9" i" 8B" x|a ea! (Y! 0 t! ' \&  x" 8s" hs_ 0 07" ,?" 0@>z 0"  ~ TN" $ \c$  pSy $" *T " *2," 0q" @j'!p " H @*T" xV`! (i  \A" p<L|!   (Xx ($z @H)%! c" @9{G" P|hn  " " X." 8(z 0F" L<7" بh" S" p" #DHr " .v  ` `0" )M" ` x r" 0 nq 7]" " _ 0I" , ! A" 0@" 4]z 0 `0" @%X "  xp 8" L" 0@ x(1 " h S" e b 8$Z" \ w S' x( w _& RI" Tq $w  hO6" ] x1K" Xr! " (o x{ @HM" % uC" hH__gmon_start___fini_ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizelibdl.so.2rkalgo_plat_initrkalgo_plat_deinitrkalgo_plat_alloc_initg_MyLog_Level__printf_chkrkalgo_plat_alloc_deinitrkalgo_plat_allocmallocrkalgo_plat_callocrkalgo_plat_freerkalgo_plat_alloc_dmarkalgo_plat_free_dmarkalgo_plat_dmabuf_sync_start__stack_chk_guardioctl__errno_location__stack_chk_failrkalgo_plat_dmabuf_sync_end__gxx_personality_v0pthread_mutex_initpthread_mutex_destroypthread_mutex_lockpthread_mutex_unlock_Unwind_Resume__cxa_atexit_ZNSt6vectorIiSaIiEED2Ev_ZdlPv_ZNSt6vectorIiSaIiEED1Evgetgidsyscallpthread_cond_waitmemmovepthread_cond_signalfopenfeoffgetsfclose_Znwmpthread_cond_initpthread_cond_destroy_ZNSt6vectorIiSaIiEE17_M_default_appendEmmemset_ZSt20__throw_length_errorPKc__sprintf_chkfscanfpthread_join_ZNSt6vectorISt4pairIiiESaIS1_EE17_M_default_appendEm_ZNSt6vectorImSaImEE17_M_realloc_insertIJRKmEEEvN9__gnu_cxx17__normal_iteratorIPmS1_EEDpOT_memcpypthread_create_ZN5RKALG5TimerD2Ev_ZN5RKALG5TimerD1Ev_ZN5RKALG5Timer5resetEvgettimeofday_ZN5RKALG5TimerC2Ev_ZN5RKALG5TimerC1Ev_ZN5RKALG5Timer12durationInUsEv_ZN5RKALG8AutoTimeC2EiPKcstrdup_ZN5RKALG8AutoTimeC1EiPKc_ZN5RKALG8AutoTimeD2Ev_ZN5RKALG8AutoTimeD1Ev_ZN5RKALG24RKGetExtraBackendCreatorE13RKForwardType_ZSt15__once_callable_ZSt11__once_call__once_proxy_ZSt20__throw_system_errori__cxa_begin_catch__cxa_rethrow__cxa_end_catch_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS__ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base_ZN5RKALG27RKInsertExtraBackendCreatorE13RKForwardTypePKNS_14BackendCreatorEb_ZTSSt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE2EE_ZTISt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE2EE_ZTVN10__cxxabiv117__class_type_infoE_ZTSSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE_ZTISt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE_ZTVN10__cxxabiv120__si_class_type_infoE__pthread_key_createpthread_once_ZN5RKALG14BackendFactory6createERKNS_7Backend4InfoE_ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE10_M_releaseEv_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE8_M_eraseEPSt13_Rb_tree_nodeIS5_E_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm__cxa_guard_acquire__cxa_guard_release__cxa_guard_abort_ZTSSt19_Sp_make_shared_tagstrcmp_ZSt19__throw_logic_errorPKcstrlen_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEPKcmm_ZSt17__throw_bad_allocv_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_fESt10_Select1stIS8_ESt4lessIS5_ESaIS8_EE8_M_eraseEPSt13_Rb_tree_nodeIS8_E_ZNSt6vectorIlSaIlEE12emplace_backIJlEEEvDpOT__ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_M_realloc_insertIJRKS5_EEEvN9__gnu_cxx17__normal_iteratorIPS5_S7_EEDpOT_memcmp_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7reserveEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_fESt10_Select1stIS8_ESt4lessIS5_ESaIS8_EE24_M_get_insert_unique_posERS7__ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_fESt10_Select1stIS8_ESt4lessIS5_ESaIS8_EE29_M_get_insert_hint_unique_posESt23_Rb_tree_const_iteratorIS8_ERS7__ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base_ZTISt19_Sp_make_shared_tag_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEPKc_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareERKS4__ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EED2Ev_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EED1Evdlclosedlopendlsymdlerror_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EEC2ESt16initializer_listIS5_ERKS6__ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EEC1ESt16initializer_listIS5_ERKS6__ZNSt6vectorIhSaIhEEC2ESt16initializer_listIhERKS0__ZNSt6vectorIhSaIhEEC1ESt16initializer_listIhERKS0__ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIhSaIhEEEC2IRA6_KcLb1EEEOT_RKS9__ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIhSaIhEEEC1IRA6_KcLb1EEEOT_RKS9__ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_St6vectorIhSaIhEEESt10_Select1stISB_ESt4lessIS5_ESaISB_EE8_M_eraseEPSt13_Rb_tree_nodeISB_E_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_St6vectorIhSaIhEEESt10_Select1stISB_ESt4lessIS5_ESaISB_EE24_M_get_insert_unique_posERS7__ZNSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIhSaIhEESt4lessIS5_ESaISt4pairIKS5_S8_EEEC2ESt16initializer_listISD_ERKSA_RKSE__ZNSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIhSaIhEESt4lessIS5_ESaISt4pairIKS5_S8_EEEC1ESt16initializer_listISD_ERKSA_RKSE_freadstrerrorfwritesnprintflocaltimestrftimemkdirgetenvstrtol__fprintf_chkrk_swcac_initrk_swcac_getversionrk_swcac_loglevl_set_Z18rk_swcac_readparamPcP18tag_RKSwCac_Paramsstrtokrk_swcac_procrk_swcac_deinitpthread_mutexattr_initpthread_mutexattr_settypepthread_mutexattr_destroystrnlen__snprintf_chkposix_memalignreallocstrtoulstdout__vfprintf_chkstderrstrstralphasortscandirmmapsysconfmunmapaccesslibpthread.so.0__cxa_get_exception_ptr__cxa_get_globals_ZSt9terminatev__cxa_get_globals_fast_Unwind_DeleteException_ZSt18uncaught_exceptionv_ZSt19uncaught_exceptionsv_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv_ZNK10__cxxabiv117__class_type_info20__do_find_public_srcElPKvPKS0_S2__ZN10__cxxabiv117__class_type_infoD2Ev_ZNSt9type_infoD2Ev_ZN10__cxxabiv117__class_type_infoD1Ev_ZN10__cxxabiv117__class_type_infoD0Ev_ZdlPvm_ZNK10__cxxabiv117__class_type_info12__do_dyncastElNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE_ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj_ZTSN10__cxxabiv117__class_type_infoE_ZTIN10__cxxabiv117__class_type_infoE_ZTISt9type_info_ZNKSt9type_info14__is_pointer_pEv_ZNKSt9type_info15__is_function_pEv_Unwind_GetDataRelBase_Unwind_GetRegionStart_Unwind_GetTextRelBase_Unwind_SetGR_Unwind_SetIP_Unwind_GetLanguageSpecificData_Unwind_GetIPInfo__cxa_call_terminate_ZTIN10__cxxabiv119__foreign_exceptionE_ZTIN10__cxxabiv115__forced_unwindE_ZSt10unexpectedv__cxa_call_unexpected_ZN10__cxxabiv112__unexpectedEPFvvE_ZTISt13bad_exception__cxa_allocate_exception_ZTVSt13bad_exception_ZNSt13bad_exceptionD1Ev__cxa_throw_ZN10__cxxabiv111__terminateEPFvvE_ZNSt9type_infoD1Ev_ZNKSt9type_info11__do_upcastEPKN10__cxxabiv117__class_type_infoEPPv_ZNSt9type_infoD0Ev_ZNKSt9type_info10__do_catchEPKS_PPvj_ZTSSt9type_info_ZTVSt9type_info_ZSt13set_terminatePFvvE_ZN10__cxxabiv119__terminate_handlerE_ZSt13get_terminatev_ZSt14set_unexpectedPFvvE_ZN10__cxxabiv120__unexpected_handlerE_ZSt14get_unexpectedv_ZN10__cxxabiv120__si_class_type_infoD2Ev_ZN10__cxxabiv120__si_class_type_infoD1Ev_ZN10__cxxabiv120__si_class_type_infoD0Ev_ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcElPKvPKNS_17__class_type_infoES2__ZNK10__cxxabiv120__si_class_type_info12__do_dyncastElNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE_ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE_ZTSN10__cxxabiv120__si_class_type_infoE_ZTIN10__cxxabiv120__si_class_type_infoE_ZSt15get_new_handlerv_ZTVSt9bad_alloc_ZNSt9bad_allocD1Ev_ZTISt9bad_alloc__cxa_free_exception__cxa_init_primary_exception_Unwind_RaiseException_Unwind_Resume_or_Rethrow_ZNKSt9bad_alloc4whatEv_ZNSt9bad_allocD2Ev_ZNSt9exceptionD2Ev_ZNSt9bad_allocD0Ev_ZTSSt9bad_alloc_ZTISt9exception_ZNSt9exceptionD1Ev_ZNSt13bad_exceptionD2Ev_ZNKSt9exception4whatEv_ZNKSt13bad_exception4whatEv_ZNSt9exceptionD0Ev_ZNSt13bad_exceptionD0Ev_ZN10__cxxabiv115__forced_unwindD2Ev_ZN10__cxxabiv115__forced_unwindD1Ev_ZN10__cxxabiv115__forced_unwindD0Ev_ZN10__cxxabiv119__foreign_exceptionD2Ev_ZN10__cxxabiv119__foreign_exceptionD1Ev_ZN10__cxxabiv119__foreign_exceptionD0Ev_ZGTtNKSt9exceptionD1Ev_ZGTtNKSt9exception4whatEv_ZGTtNKSt13bad_exceptionD1Ev_ZGTtNKSt13bad_exception4whatEv_ZTSSt9exception_ZTSSt13bad_exception_ZTSN10__cxxabiv115__forced_unwindE_ZTSN10__cxxabiv119__foreign_exceptionE_ZTVSt9exception_ZTVN10__cxxabiv115__forced_unwindE__cxa_pure_virtual_ZTVN10__cxxabiv119__foreign_exceptionE_ZN9__gnu_cxx20recursive_init_errorC1Ev_ZN9__gnu_cxx20recursive_init_errorD1Ev_ZTIN9__gnu_cxx20recursive_init_errorE_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base_ZSt20_Rb_tree_rotate_leftPSt18_Rb_tree_node_baseRS0__ZSt21_Rb_tree_rotate_rightPSt18_Rb_tree_node_baseRS0__ZSt28_Rb_tree_rebalance_for_erasePSt18_Rb_tree_node_baseRS__ZSt20_Rb_tree_black_countPKSt18_Rb_tree_node_baseS1__ZSt21__throw_bad_exceptionv_ZSt16__throw_bad_castv_ZTVSt8bad_cast_ZNSt8bad_castD1Ev_ZTISt8bad_cast_ZSt18__throw_bad_typeidv_ZTVSt10bad_typeid_ZNSt10bad_typeidD1Ev_ZTISt10bad_typeidgettext_ZNSt11logic_errorC1EPKc_ZNSt11logic_errorD1Ev_ZTISt11logic_error_ZSt20__throw_domain_errorPKc_ZNSt12domain_errorC1EPKc_ZNSt12domain_errorD1Ev_ZTISt12domain_error_ZSt24__throw_invalid_argumentPKc_ZNSt16invalid_argumentC1EPKc_ZNSt16invalid_argumentD1Ev_ZTISt16invalid_argument_ZNSt12length_errorC1EPKc_ZNSt12length_errorD1Ev_ZTISt12length_error_ZSt20__throw_out_of_rangePKc_ZNSt12out_of_rangeC1EPKc_ZNSt12out_of_rangeD1Ev_ZTISt12out_of_range_ZSt24__throw_out_of_range_fmtPKcz_ZN9__gnu_cxx15__snprintf_liteEPcmPKcSt9__va_list_ZSt21__throw_runtime_errorPKc_ZNSt13runtime_errorC1EPKc_ZNSt13runtime_errorD1Ev_ZTISt13runtime_error_ZSt19__throw_range_errorPKc_ZNSt11range_errorC1EPKc_ZNSt11range_errorD1Ev_ZTISt11range_error_ZSt22__throw_overflow_errorPKc_ZNSt14overflow_errorC1EPKc_ZNSt14overflow_errorD1Ev_ZTISt14overflow_error_ZSt23__throw_underflow_errorPKc_ZNSt15underflow_errorC1EPKc_ZNSt15underflow_errorD1Ev_ZTISt15underflow_error_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_M_dataEPc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_lengthEm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_M_dataEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_M_local_dataEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_M_local_dataEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_M_capacityEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_M_set_lengthEm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_M_is_localEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_disposeEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_destroyEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructEmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE18_M_construct_aux_2Emc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_get_allocatorEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_get_allocatorEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8_M_checkEmPKc_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE15_M_check_lengthEmmPKc_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8_M_limitEmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_M_disjunctEPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_S_copyEPcPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_S_moveEPcPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_S_assignEPcmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS5_S4_EES8__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcS4_EESA__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcS5_S5__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcPKcS7__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_S_compareEmm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_assignERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8_M_eraseEmm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2Ev_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EmcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EmcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EOS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EOS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EOS4_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EOS4_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEOS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5beginEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5beginEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE3endEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE3endEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6rbeginEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6rbeginEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4rendEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4rendEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6cbeginEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4cendEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7crbeginEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5crendEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4sizeEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6lengthEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8max_sizeEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8capacityEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13shrink_to_fitEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5clearEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5emptyEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEixEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEixEm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE2atEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE2atEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5frontEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5frontEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4backEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4backEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLEc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9push_backEc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEOS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEmm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEN9__gnu_cxx17__normal_iteratorIPKcS4_EE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8pop_backEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendEmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6resizeEmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6resizeEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPKcS4_EEc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_mc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPKcS4_EEmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSESt16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignESt16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmRKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmRKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8_m_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_PcSA__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8_S8__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_St16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_RKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_NS6_IPcS4_EESB__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S9_S9__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPcS4_EESt16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmRKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmRKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendERKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendEPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendEPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLEPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLESt16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendESt16initializer_listIcE_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4copyEPcmm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4swapERS4__ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4dataEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13get_allocatorEvmemchr_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEmmRKS4__ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEmmRKS4_mm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEmmPKc_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEmmPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderC2EPcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderC1EPcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderC2EPcOS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderC1EPcOS3__ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8__ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EES5_RKS8__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIN9__gnu_cxx17__normal_iteratorIPcS4_EEEEvT_SA_St20forward_iterator_tag_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IN9__gnu_cxx17__normal_iteratorIPcS4_EEvEET_SA_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1IN9__gnu_cxx17__normal_iteratorIPcS4_EEvEET_SA_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIN9__gnu_cxx17__normal_iteratorIPKcS4_EEEEvT_SB_St20forward_iterator_tag_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4__ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EERKS8_SA__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IPcvEET_S7_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1IPcvEET_S7_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_mRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_mRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_mmRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_mmRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EPKcmRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcmRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EPKcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ESt16initializer_listIcERKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ESt16initializer_listIcERKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IPKcvEET_S8_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1IPKcvEET_S8_RKS3__ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6substrEmm_ZN9__gnu_cxxeqIPcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEbRKNS_17__normal_iteratorIT_T0_EESD__ZN9__gnu_cxxeqIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEbRKNS_17__normal_iteratorIT_T0_EESE__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4nposE_Z27_txnal_cow_string_D1_commitPv_ZNSs4_Rep20_S_empty_rep_storageE_ZNSs4_Rep10_M_destroyERKSaIcE_ZNSt11logic_errorC2ERKS__ZTVSt11logic_error_ZNSsC1ERKSs_ZNSt11logic_errorC1ERKS__ZNSt11logic_erroraSERKS__ZNSs6assignERKSs_ZNSt13runtime_errorC2ERKS__ZTVSt13runtime_error_ZNSt13runtime_errorC1ERKS__ZNSt13runtime_erroraSERKS__ZNSt11logic_errorC2EPKc_ZNSsC1EPKcRKSaIcE_ZNSt12domain_errorC2EPKc_ZTVSt12domain_error_ZNSt16invalid_argumentC2EPKc_ZTVSt16invalid_argument_ZNSt12length_errorC2EPKc_ZTVSt12length_error_ZNSt12out_of_rangeC2EPKc_ZTVSt12out_of_range_ZNSt13runtime_errorC2EPKc_ZNSt11range_errorC2EPKc_ZTVSt11range_error_ZNSt14overflow_errorC2EPKc_ZTVSt14overflow_error_ZNSt15underflow_errorC2EPKc_ZTVSt15underflow_error_ZNSt12__sso_stringC2ERKSs_ZNSt12__sso_stringC1EPKcm_ZNSt12__sso_stringC1ERKSs_ZNSt12__cow_stringC2Ev_ZNSt12__cow_stringC1Ev_ZNSt12__cow_stringC2ERKSs_ZNSt12__cow_stringC1ERKSs_ZNSt12__cow_stringC2EPKcm_ZNSsC1EPKcmRKSaIcE_ZNSt12__cow_stringC1EPKcm_ZNSt12__cow_stringC2ERKS__ZNSt12__cow_stringC1ERKS__ZNSt12__cow_stringaSERKS__ZNSt12__cow_stringD2Ev_ZNSt12__cow_stringD1Ev_ZNSt12__cow_stringC2EOS__ZNSt12__cow_stringC1EOS__ZNSt12__cow_stringaSEOS__ZNSs4swapERSs_ZNKSt3_V214error_category10_M_messageEi_Z35_txnal_cow_string_C1_for_exceptionsPvPKcS__ITM_RU1_ZGTtnam_ITM_memcpyRtWn_Z23_txnal_cow_string_c_strPKv_ITM_RU8_Z23_txnal_sso_string_c_strPKv_Z20_txnal_cow_string_D1Pv_ITM_addUserCommitAction_Z26_txnal_logic_error_get_msgPv_Z28_txnal_runtime_error_get_msgPv_ZGTtNSt11logic_errorC1EPKc_ITM_memcpyRnWt_ZGTtNSt11logic_errorC2EPKc_ZGTtNSt11logic_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt11logic_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt11logic_errorD1Ev_ZGTtNSt11logic_errorD2Ev_ZGTtNSt11logic_errorD0Ev_ZGTtdlPv_ZGTtNKSt11logic_error4whatEv_ZGTtNSt12domain_errorC1EPKc_ZGTtNSt12domain_errorC2EPKc_ZGTtNSt12domain_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12domain_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12domain_errorD1Ev_ZGTtNSt12domain_errorD2Ev_ZGTtNSt12domain_errorD0Ev_ZGTtNSt16invalid_argumentC1EPKc_ZGTtNSt16invalid_argumentC2EPKc_ZGTtNSt16invalid_argumentC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt16invalid_argumentC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt16invalid_argumentD1Ev_ZGTtNSt16invalid_argumentD2Ev_ZGTtNSt16invalid_argumentD0Ev_ZGTtNSt12length_errorC1EPKc_ZGTtNSt12length_errorC2EPKc_ZGTtNSt12length_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12length_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12length_errorD1Ev_ZGTtNSt12length_errorD2Ev_ZGTtNSt12length_errorD0Ev_ZGTtNSt12out_of_rangeC1EPKc_ZGTtNSt12out_of_rangeC2EPKc_ZGTtNSt12out_of_rangeC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12out_of_rangeC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12out_of_rangeD1Ev_ZGTtNSt12out_of_rangeD2Ev_ZGTtNSt12out_of_rangeD0Ev_ZGTtNSt13runtime_errorC1EPKc_ZGTtNSt13runtime_errorC2EPKc_ZGTtNSt13runtime_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt13runtime_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt13runtime_errorD1Ev_ZGTtNSt13runtime_errorD2Ev_ZGTtNSt13runtime_errorD0Ev_ZGTtNKSt13runtime_error4whatEv_ZGTtNSt11range_errorC1EPKc_ZGTtNSt11range_errorC2EPKc_ZGTtNSt11range_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt11range_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt11range_errorD1Ev_ZGTtNSt11range_errorD2Ev_ZGTtNSt11range_errorD0Ev_ZGTtNSt14overflow_errorC1EPKc_ZGTtNSt14overflow_errorC2EPKc_ZGTtNSt14overflow_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt14overflow_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt14overflow_errorD1Ev_ZGTtNSt14overflow_errorD2Ev_ZGTtNSt14overflow_errorD0Ev_ZGTtNSt15underflow_errorC1EPKc_ZGTtNSt15underflow_errorC2EPKc_ZGTtNSt15underflow_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt15underflow_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt15underflow_errorD1Ev_ZGTtNSt15underflow_errorD2Ev_ZGTtNSt15underflow_errorD0Ev_ZN9__gnu_cxx26__throw_insufficient_spaceEPKcS1__ZN9__gnu_cxx15__concat_size_tEPcmm_ZNKSt3_V214error_category23default_error_conditionEi_ZNKSt3_V214error_category10equivalentEiRKSt15error_condition_ZNKSt3_V214error_category10equivalentERKSt10error_codei_ZNSt12system_errorD2Ev_ZTVSt12system_error_ZNSt13runtime_errorD2Ev_ZNSt12system_errorD1Ev_ZNSt12system_errorD0Ev_ZNKSt3_V214error_category10_M_messageB5cxx11Ei_ZNSt3_V214error_categoryD2Ev_ZNSt3_V214error_categoryD1Ev_ZNSt3_V214error_categoryD0Ev_ZNSt3_V215system_categoryEv_ZNSt3_V216generic_categoryEv_ZNSt13runtime_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZTISt12system_error_ZNKSt10error_code23default_error_conditionEv_ZTSNSt3_V214error_categoryE_ZTINSt3_V214error_categoryE_ZTSSt12system_error_ZTVNSt3_V214error_categoryE_ZNKSt13runtime_error4whatEv_ZNK9__gnu_cxx24__concurrence_lock_error4whatEv_ZNK9__gnu_cxx26__concurrence_unlock_error4whatEv_ZN9__gnu_cxx24__concurrence_lock_errorD2Ev_ZTVN9__gnu_cxx24__concurrence_lock_errorE_ZN9__gnu_cxx24__concurrence_lock_errorD1Ev_ZN9__gnu_cxx26__concurrence_unlock_errorD2Ev_ZTVN9__gnu_cxx26__concurrence_unlock_errorE_ZN9__gnu_cxx26__concurrence_unlock_errorD1Ev_ZN9__gnu_cxx24__concurrence_lock_errorD0Ev_ZN9__gnu_cxx26__concurrence_unlock_errorD0Ev_ZN9__gnu_cxx30__throw_concurrence_lock_errorEv_ZTIN9__gnu_cxx24__concurrence_lock_errorE_ZTIN9__gnu_cxx26__concurrence_unlock_errorE_ZN9__gnu_cxx9__freeresEv__cxa_allocate_dependent_exception__cxa_free_dependent_exception_ZTSN9__gnu_cxx24__concurrence_lock_errorE_ZTSN9__gnu_cxx26__concurrence_unlock_errorE_ZN9__gnu_cxx27__verbose_terminate_handlerEv_ZN9__gnu_cxx20recursive_init_errorD2Ev_ZTVN9__gnu_cxx20recursive_init_errorE_ZN9__gnu_cxx20recursive_init_errorD0Ev_ZN9__gnu_cxx20recursive_init_errorC2Ev_ZTSN9__gnu_cxx20recursive_init_errorE_ZNKSt8bad_cast4whatEv_ZNSt8bad_castD2Ev_ZNSt8bad_castD0Ev_ZTSSt8bad_cast_ZNKSt10bad_typeid4whatEv_ZNSt10bad_typeidD2Ev_ZNSt10bad_typeidD0Ev_ZTSSt10bad_typeid__cxa_deleted_virtual_ZSt15set_new_handlerPFvvE_ZSt7nothrow__cxa_current_exception_type__cxa_demanglefputsfputc_ZNKSt11logic_error4whatEv_ZNSt11logic_errorD2Ev_ZNSt11logic_errorD0Ev_ZNSt12domain_errorD2Ev_ZNSt12domain_errorD0Ev_ZNSt16invalid_argumentD2Ev_ZNSt16invalid_argumentD0Ev_ZNSt12length_errorD2Ev_ZNSt12length_errorD0Ev_ZNSt12out_of_rangeD2Ev_ZNSt12out_of_rangeD0Ev_ZNSt13runtime_errorD0Ev_ZNSt11range_errorD2Ev_ZNSt11range_errorD0Ev_ZNSt14overflow_errorD2Ev_ZNSt14overflow_errorD0Ev_ZNSt15underflow_errorD2Ev_ZNSt15underflow_errorD0Ev_ZNSt11logic_errorC2ERKSs_ZNSt11logic_errorC1ERKSs_ZNSt12domain_errorC2ERKSs_ZNSt12domain_errorC1ERKSs_ZNSt16invalid_argumentC2ERKSs_ZNSt16invalid_argumentC1ERKSs_ZNSt12length_errorC2ERKSs_ZNSt12length_errorC1ERKSs_ZNSt12out_of_rangeC2ERKSs_ZNSt12out_of_rangeC1ERKSs_ZNSt13runtime_errorC2ERKSs_ZNSt13runtime_errorC1ERKSs_ZNSt11range_errorC2ERKSs_ZNSt11range_errorC1ERKSs_ZNSt14overflow_errorC2ERKSs_ZNSt14overflow_errorC1ERKSs_ZNSt15underflow_errorC2ERKSs_ZNSt15underflow_errorC1ERKSs_ZTSSt11logic_error_ZTSSt12domain_error_ZTSSt16invalid_argument_ZTSSt12length_error_ZTSSt12out_of_range_ZTSSt13runtime_error_ZTSSt11range_error_ZTSSt14overflow_error_ZTSSt15underflow_error_ZNSt12__sso_stringC2Ev_ZNSt12__sso_stringC1Ev_ZNSt12__sso_stringC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt12__sso_stringC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt12__sso_stringC2EPKcm_ZNSt12__sso_stringC2ERKS__ZNSt12__sso_stringC1ERKS__ZNSt12__sso_stringaSERKS__ZNSt12__sso_stringD2Ev_ZNSt12__sso_stringD1Ev_ZNSt12__sso_stringC2EOS__ZNSt12__sso_stringC1EOS__ZNSt12__sso_stringaSEOS__ZNSt12__cow_stringC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt12__cow_stringC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt11logic_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt11logic_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt12domain_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt12domain_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt16invalid_argumentC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt16invalid_argumentC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt12length_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt12length_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt12out_of_rangeC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt12out_of_rangeC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt13runtime_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt11range_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt11range_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt14overflow_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt14overflow_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt15underflow_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt15underflow_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNKSs7_M_dataEv_ZNSs7_M_dataEPc_ZNKSs6_M_repEv_ZNKSs9_M_ibeginEv_ZNKSs7_M_iendEv_ZNKSs8_M_checkEmPKc_ZNKSs15_M_check_lengthEmmPKc_ZNKSs8_M_limitEmm_ZNKSs11_M_disjunctEPKc_ZNSs7_M_copyEPcPKcm_ZNSs7_M_moveEPcPKcm_ZNSs9_M_assignEPcmc_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2__ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4__ZNSs13_S_copy_charsEPcS_S__ZNSs13_S_copy_charsEPcPKcS1__ZNSs10_S_compareEmm_ZNSs12_S_empty_repEv_ZNSsC2Ev_ZNSsC1Ev_ZNSsC2EOSs_ZNSsC1EOSs_ZNKSs5beginEv_ZNKSs3endEv_ZNKSs6rbeginEv_ZNKSs4rendEv_ZNKSs6cbeginEv_ZNKSs4cendEv_ZNKSs7crbeginEv_ZNKSs5crendEv_ZNKSs4sizeEv_ZNKSs6lengthEv_ZNKSs8max_sizeEv_ZNKSs8capacityEv_ZNKSs5emptyEv_ZNKSsixEm_ZNKSs2atEm_ZNKSs5frontEv_ZNKSs4backEv_ZNKSs4copyEPcmm_ZNSsaSEOSs_ZNSs6assignEOSs_ZNKSs5c_strEv_ZNKSs4dataEv_ZNKSs13get_allocatorEv_ZNKSs4findEPKcmm_ZNKSs4findERKSsm_ZNKSs4findEPKcm_ZNKSs4findEcm_ZNKSs5rfindEPKcmm_ZNKSs5rfindERKSsm_ZNKSs5rfindEPKcm_ZNKSs5rfindEcm_ZNKSs13find_first_ofEPKcmm_ZNKSs13find_first_ofERKSsm_ZNKSs13find_first_ofEPKcm_ZNKSs13find_first_ofEcm_ZNKSs12find_last_ofEPKcmm_ZNKSs12find_last_ofERKSsm_ZNKSs12find_last_ofEPKcm_ZNKSs12find_last_ofEcm_ZNKSs17find_first_not_ofEPKcmm_ZNKSs17find_first_not_ofERKSsm_ZNKSs17find_first_not_ofEPKcm_ZNKSs17find_first_not_ofEcm_ZNKSs16find_last_not_ofEPKcmm_ZNKSs16find_last_not_ofERKSsm_ZNKSs16find_last_not_ofEPKcm_ZNKSs16find_last_not_ofEcm_ZNKSs7compareERKSs_ZNKSs7compareEmmRKSs_ZNKSs7compareEmmRKSsmm_ZNKSs7compareEPKc_ZNKSs7compareEmmPKc_ZNKSs7compareEmmPKcm_ZNSs12_Alloc_hiderC2EPcRKSaIcE_ZNSs12_Alloc_hiderC1EPcRKSaIcE_ZNSs4_Rep12_S_empty_repEv_ZNKSs4_Rep12_M_is_leakedEv_ZNKSs4_Rep12_M_is_sharedEv_ZNSs4_Rep13_M_set_leakedEv_ZNSs4_Rep15_M_set_sharableEv_ZNSs4_Rep26_M_set_length_and_sharableEm_ZNSs4_Rep10_M_refdataEv_ZNSs4_Rep9_S_createEmmRKSaIcE_ZNSs12_S_constructEmcRKSaIcE_ZNSsC2ERKSaIcE_ZNSsC1ERKSaIcE_ZNSsC2EmcRKSaIcE_ZNSsC1EmcRKSaIcE_ZNSs18_S_construct_aux_2EmcRKSaIcE_ZNSs4_Rep10_M_disposeERKSaIcE_ZNSsD2Ev_ZNSsD1Ev_ZNSs5clearEv_ZNSs9_M_mutateEmmm_ZNSs12_M_leak_hardEv_ZNSs7_M_leakEv_ZNSs5frontEv_ZNSs5beginEv_ZNSs4rendEv_ZNSsixEm_ZNSs3endEv_ZNSs6rbeginEv_ZNSs4backEv_ZNSs2atEm_ZNSs5eraseEmm_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2__ZNSs14_M_replace_auxEmmmc_ZNSs6assignEmc_ZNSsaSEc_ZNSs6insertEmmc_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc_ZNSs7replaceEmmmc_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_mc_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEmc_ZNSs15_M_replace_safeEmmPKcm_ZNSs6assignEPKcm_ZNSsaSESt16initializer_listIcE_ZNSs6assignERKSsmm_ZNSs6assignEPKc_ZNSsaSEPKc_ZNSs6assignESt16initializer_listIcE_ZNSs6insertEmPKcm_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEESt16initializer_listIcE_ZNSs6insertEmRKSsmm_ZNSs6insertEmPKc_ZNSs6insertEmRKSs_ZNSs8pop_backEv_ZNSs4_Rep10_M_refcopyEv_ZNSs4_Rep8_M_cloneERKSaIcEm_ZNSs7reserveEm_ZNSs13shrink_to_fitEv_ZNSs6appendERKSs_ZNSspLERKSs_ZNSs6appendERKSsmm_ZNSs6appendEPKcm_ZNSspLESt16initializer_listIcE_ZNSs6appendEPKc_ZNSspLEPKc_ZNSs6appendESt16initializer_listIcE_ZNSs6appendEmc_ZNSs6resizeEmc_ZNSs6resizeEm_ZNSs9push_backEc_ZNSspLEc_ZNSs4_Rep7_M_grabERKSaIcES2__ZNSsC2ERKSs_ZNSsaSERKSs_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6__ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6__ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8__ZNSs12_S_constructIN9__gnu_cxx17__normal_iteratorIPcSsEEEES2_T_S4_RKSaIcESt20forward_iterator_tag_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE_ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tag_ZNSsC2ERKSsmRKSaIcE_ZNSsC1ERKSsmRKSaIcE_ZNSsC2ERKSsmm_ZNSsC1ERKSsmm_ZNKSs6substrEmm_ZNSsC2ERKSsmmRKSaIcE_ZNSsC1ERKSsmmRKSaIcE_ZNSsC2IPcEET_S1_RKSaIcE_ZNSsC1IPcEET_S1_RKSaIcE_ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag_ZNSsC2EPKcmRKSaIcE_ZNSs7replaceEmmPKcm_ZNSs7replaceEmmRKSs_ZNSs7replaceEmmRKSsmm_ZNSs7replaceEmmPKc_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcm_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1__ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4__ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_St16initializer_listIcE_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2__ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5__ZNSsC2EPKcRKSaIcE_ZNSsC2ESt16initializer_listIcERKSaIcE_ZNSsC1ESt16initializer_listIcERKSaIcE_ZNSsC2IPKcEET_S2_RKSaIcE_ZNSsC1IPKcEET_S2_RKSaIcE_ZN9__gnu_cxxeqIPcSsEEbRKNS_17__normal_iteratorIT_T0_EES7__ZN9__gnu_cxxeqIPKcSsEEbRKNS_17__normal_iteratorIT_T0_EES8__ZNSt13random_device7_M_initERKSs_ZNSt13random_device14_M_init_pretr1ERKSs_ZNSs4_Rep11_S_terminalE_ZNSs4_Rep11_S_max_sizeE_ZNSs4nposEstrncmp__gcclibcxx_demangle_callbacklibc.so.6ld-linux-aarch64.so.1libgcc_s.so.1_edata__bss_start__bss_start____bss_end____end__libRkSwCac.soGLIBC_2.17GCC_4.2.0GCC_3.3GCC_3.0 a[ a@``' lS&y vP&y ~ aa  0 p    ؗ   0   h H ( 0 (8 @ P  X ` p  x        0       h (    X x( 0 8 pH  P hX ` h p  8 `  x    P T T T T T h  ؏  x ( 0 @  H xP X ` h p hx             X h x    0 X h x        @ P 8 H X p   8         0 @ P ` p  ( ( 8 8 @ P ` ` h0 h@ xP x` p     @ P ` p   `   h h     0 @  P  ` (p ( 8 8 H H H P X ` h P  p x( p8 @ P X h p  p              (( 00 8@ @H HX x` xp Px X ` h p x    h  h  h  h0 8 H P ` h x                ( (8 0@ 8P @X (h Hp P X ` h p  8 x       ( 0 @ H X ` p x  p            ( 0 80 P8 XH `P h` hh px  p          P h x  `   p   ( x ( 8@ X (p   h           X0 8 X  ` 0h Hp H  X HX ( pZc@ d @c ` X P P W h+W ,W ,W 8*X *X TX TX (T X  S(X (R0X pQ8X HSHX dPX UXX hY`X ^hX \pX ^xX WX 8fX iX 8oX mX jX mX gX  X ` `   h    H H p  0  ( J0 H p       8 P x     X @      `     ( @ X p   0 8 C@ 2X    0 H `   ? ? 9 `      x       (  0 8 @ P h |p *   q     %  x Ch C C C C0 Cp C C Ch CX C( _ _0 e e8 @ _P \` x     }X } X      X  ( x   } }8 H P     P ` ` ` ` y( yx y t t @   H   p` p          Q y y       0 0  H( v@  H 8 P Eh    0  8   x  - -    & O  8 P  H  ^0 H ` Px  k  :x :   ( P x           D8 [ [@  H ` 5 5h  p l { { - x  H   < < P   7 7   TX {` !h p d      p +( 8 @ ` 8h <p =           I    "h p P Z w 7X X X     * ( 0 m8 x@ [H AP X ` h p x          t      s     J ( u0  8 @ H P X ` h p ~x  T       e      } g    R   ( 0 8 @ H mP eX ` h p x     ! "  #  p  k $ Q %   &  M N ( -0 '8 @ H -P "X ` (h .p )x A * ? , o   - " . /    #  ? h 0  1 ,( 0 28 3@ H P X @` h p 4x  Q 5 6 7 8  9 :   U ; < n >  ?  @  ( 0 8 A@ H BP X C` Dh p Dx  E F G  H  {     J  q  K |    ( L0 8 M@ H P cX N` h p jx   O  4 P Q R    s S  T U  @ v \ V W( 0 8 X@ H P X K` h  p x    Y    E    :  ] )  . f [  \ ( ]0 18 ^@ rH P _X `` h p x a b   c  d  e   f B  g h    8 (  {Q {_{0G?    0@ 0@" 0 @B 0@b 0@ 0@ 0@ 0@ 0"@ 0&@" 0*@B 0.@b 02@ 06@ 0:@ 0>@ 0B@ 0F@" 0J@B 0N@b 0R@ 0V@ 0Z@ 0^@ 0b@ 0f@" 0j@B 0n@b 0r@ 0v@ 0z@ 0~@ 0@ 0@" 0@B 0@b 0@ 0@ 0@ 0@ 0@ 0@" 0@B 0@b 0@ 0@ 0@ 0@ 0@ 0@" 0@B 0@b 0@ 0@ 0@ 0@ 0@ 0@" 0@B 0@b 0@ 0@ 0@ 0@ 0A 0A" 0 AB 0Ab 0A 0A 0A 0A 0"A 0&A" 0*AB 0.Ab 02A 06A 0:A 0>A 0BA 0FA" 0JAB 0NAb 0RA 0VA 0ZA 0^A 0bA 0fA" 0jAB 0nAb 0rA 0vA 0zA 0~A 0A 0A" 0AB 0Ab 0A 0A 0A 0A 0A 0A" 0AB 0Ab 0A 0A 0A 0A 0A 0A" 0AB 0Ab 0A 0A 0A 0A 0A 0A" 0AB 0Ab 0A 0A 0A 0A 0B 0B" 0 BB 0Bb 0B 0B 0B 0B 0"B 0&B" 0*BB 0.Bb 02B 06B 0:B 0>B 0BB 0FB" 0JBB 0NBb 0RB 0VB 0ZB 0^B 0bB 0fB" 0jBB 0nBb 0rB 0vB 0zB 0~B 0B 0B" 0BB 0Bb 0B 0B 0B 0B 0B 0B" 0BB 0Bb 0B 0B 0B 0B 0B 0B" 0BB 0Bb 0B 0B 0B 0B 0B 0B" 0BB 0Bb 0B 0B 0B 0B 0C 0C" 0 CB 0Cb 0C 0C 0C 0C 0"C 0&C" 0*CB 0.Cb 02C 06C 0:C 0>C 0BC 0FC" 0JCB 0NCb 0RC 0VC 0ZC 0^C 0bC 0fC" 0jCB 0nCb 0rC 0vC 0zC 0~C 0C 0C" 0CB 0Cb 0C 0C 0C 0C 0C 0C" 0CB 0Cb 0C 0C 0C 0C 0C 0C" 0CB 0Cb 0C 0C 0C 0C 0C 0C" 0CB 0Cb 0C 0C 0C 0C 0D 0D" 0 DB 0Db 0D 0D 0D 0D 0"D! 0&D"! 0*DB! 0.Db! 02D! 06D! 0:D! 0>D! 0BD" 0FD"" 0JDB" 0NDb" 0RD" 0VD" 0ZD" 0^D" 0bD# 0fD"# 0jDB# 0nDb# 0rD# 0vD# 0zD# 0~D# 0D$ 0D"$ 0DB$ "#BGc?@  `$V `T"B@%@< 0c %"O GB@%`={0`D60`D60`D60`D6#c `RR{d0'%" e? 9B@% +0$" dB@%?*!'0$" dB@%?*!'0$" dB@%? '! ({0`D60`D60`D 60`D`6{_{0$"? dB@%!'*0$" dB@%?*!'0$" dB@%? '! (0'%" e? 9B@% +{S4:G[@"@'v#<hTT@9`B9#@a@`:G?h 8'@@ ʠSA[B@{Ũ_ҡ#@v` {0[5`D:G"@ 60`D 60`D 60`D@ 6!90`!@:`!:`!@;`!;`!<b)sc s A`T!T 3sB%b)TG0`! ):G@@ [B@ @{Ш_T0'%" e? 9B@% +0$" dB@%?*!'0$" dB@%?*!'0$" dB@%? '! (_sc A@Trs!T-"6ҡ!{5S:GC@?҆!!!!"Մz!!`!c!:BҠ#o`ҶҠ#`!!@Ҡ#O+" @ !@@#A'?h 8;X=T;t37;ca7!C>`AҶc?`!?@Ҡ?OG" @ ! @y y@?AC?h 8WSW<t4tOSWcS!›# !!``У!Ҡ ObSTw@9@y`Ҡ{yc9ҿ 9<-tacУ!`:/Ҡ ObR@ @9 Ҥc9Ҡ 9Ӏ=4(t<c!`[ҠCObbSQ@y@@ҠcByҿ 9<"tc!+~Ҡ`B!Ҷs`! s@ҠO" @ !@@9@9s@A?h 8O=tc!;"maB`"OD@C @Ҥ SN{9Ҕ<ttcУ!`)ցҠ#c;` aҶ[`!?[@ҠO " @ !@[@B?h 8L =tc!@$"sC B` O7D@Cp@Ҥ'pSK#_9Ҕ<4 t/37jc03)#ls c s9T[@@g@@s@@@@@@@@@@@@@@@@@@@@)"`B@%`:G?B@ SA@{@@@_ֹKLNIOQRTWYX"Bb ?`T=[@@:g@@7s@@4@@1@@.@@+@@(@@%@@"@@@@@@@Bb ?T Ab"?TAbB?`TAbb?TAb? TwAs?`T?Ab? T#As?`Ts cs8TtB{0`D`60`D60`D600O*bD??=b6{_{0$"?dB@%!'*0$"dB@%?*!'0$"dB@%? '! (0'%"e? 9B@% +{ 0s;Rf @{¨"B@%!{ !@# 3sB%8 @{¨ ! #7{S0s>4~~~t"$`|`SA{¨_" RD_ 4G@*_#!#?T!!FA _ #!#!!C!A!A"BGB@_{ `c9@5 F D3 R`#9 @{¨_R_R_{ #!|D R* @{¨_bR!$d*4 F@qITDRc#B'!' R/{SRa~D`#d*5~*SA{¨_ F@qT Rc $B'!% R{  @{¨_{ !Q @{¨_{R{_{cR[S‚D3B@ ~D#@?֠4`F@qHT‚D~DB@@?sF*`@U4qT*SA[B{è_֣Rc`#B'!& R`@ q T"@ @B' R!@'*SA[B{è_֣Rc`#B'!& R{BD`|DB@ @?*4 F@qITRc#B'!`) R* @{¨_{d@ 3c:GD d@+ 4 F@qT@Rc %B'!( Rns:G@`@ ʀ @{è_{@ 3c:GD d@ 4 F@qT@Rc$B'!( RFs:G@`@ ʀ @{è_{Sb$0bs#abbRsb`?֟Tc&@abR`?c@CsbTSA{¨_{ *0`$* @{¨ _{0`${{[5k:G0S R"@Gc+*b$h;uRarR`Ic$Oe |!!l!|K!;|@3|3`tbz~Ӕ}Ah<# @?C/BR`?#A/@A'F@&bR?tc$~Ӕ˔}$@cabR!`?O$j<*DAb$/:GG@@ @SA[BcCkD+@{ɨ_֡?@/#/b$;@CbR`?*@DD*@D@@"_{!8GSs@@ @[ck0A %DD"@B˿ BB _q mTBQ(ҥH" Ղ_TGFB!šfxgbx'T*@ҿ4!F!@?qTRҠ7 RD5RD4QRR9`4DksDZc~@`f:j`"@ TskssFZc~@`f:j`"@_A TskssFZc~@`f:j`"@_ Tssc~@`f:j`"@_T s~@? T_T3B4„3@ca0B! a0b`@`c @ ?`'@`7@ @w@?a@a` @ ?a@a` @ ?< } B 3as aB!Qa97z@8GҢ@!@AaSA[BcCkDsE{Ш_*Rc0B'!/ RWс!)*{;GC@/ #N)mV9FSl.cRwVO5R@T"@9q/@T @ qTB'!* RZ44SAB#@4;G*/B@A{@@@_5RS#{Sa:G"@_*d_ TEFB$҄ šbxeBbx%*@ґ*4!F!@?qTs:G*_@a@ASA@{̨_փ*Rc0B'!/ RX{ _`R94`R94`R94`R94d @*B{Ĩ_ִR~@ R`!RN59 D sNAK* @B{Ĩ_ִ6RVRvR{S*3#9SA@{è-{[ RS*6|6 a~@33`B4B aB5SA[B{è{S@@?T3~RSA@{ƨ__ַc@'˶#WB+ T`"HTT`~@V@b~R dTa@D!  BCSA{ƨ_vx0{S:G[@ks 5O? =:G@@Aʁ SA[B@kDsE{ڨ_O|@*K#=nqT+cZFҜsk T**!R )y@7@3@n*cqC@AT@x3@@ qIT@*B'!,*skLTC@H ! @OC@? =@p@PC@ag%{[S:G@/ҁ#@@V`Ava A?`Tvw9aRD!aR"`Aa A"˟#T?`T xtҔI`Aa A!˟T@tB `4/ATvbt^ T`A@:G/@@ SA[B{ƨ_T{S0DSA{¨_@B? T`BT __B`T{S@C"hTb"BT_HTbV}@c`BT T cE@e_T@a@@ SA@@{Ĩ_BTB _T0J{Sc`@[k+:CiTb@`T`@j:T"c"Tstl+@N SA[BcCkD{ƨ_!9}?Ta{Sc`@[k+:CiTb@`T`@j:Tc"Tst&+@N SA[BcCkD{ƨ_!9}?Ta{[5|@S'`0B4B?Ta'@ ! `0waRD`!aR4 RN   saB!aR@SA[B{Ũ_R#N `~@(@T џ`T҃)_kT T_?kT@?) @kkTT@_k T ?) T_ք C-T @ !?cT?)$@A@_"__klTTc@f_kTT_kTlT%_d_kT@_ab__a_&__k Tc@f__kTT(_g_k+Tk+TTa___kT@____@_##__"_g__kTK@kKkA? * T_ _ k _T ӠDѦ  _ǀ_ k,TJT  * _T7BBB T}Ӧ ˂m`* *BBBAT @Ѩ @ǀ__kT T_ k T}A?_T4?)_ւӠ D}Ӧ €__4?)_֦ 4?)_{8G+"@OҀ@@a? T /wC#'7!C 7@!Az#R%Ae˥-b_ E_kkTTA_`_?kT_?kTT_d_kjT _iTA _A_Bb_Z#@@b_MTwC'@TC ѵA5vÆ@RK4@R`_Ҁt˻K`_C'"lT @@/@8GO@@ @B+@{ʨ_ֳ @@C'@/@C '/={kSo@;G[@s 5O =Z;G@A@AASA[B@kDsE{ܨ_O|@*K[#=+=qmTй"/ Հ*@,!R *) R {qT{@ksC4S@}kj ;LTo@W@kИ Tҷ`CڵSBBMTRO`T c)@?) @kkTT@k T?)s"TH@B? TbTGqS@-TQДЗеF~֢'B/s`TaC@h3@ qThaD@ RsC@S@TOH K#=`C@@T*c@-!R v)n*c@.!R i)aТs!+UKs@n@.RSH@B?T!ˠ!C@S@bXAS@aXC@@U{OS[ c*ks|b`<C;G {d@?@<@<@<@<@<@<`a0" %O;@ DF%D;=%3@@"y*5`@5?c{uB `5Ҡ@5b8T`BqmTRC9R a3@ ! B`BkTy9ҕ@?T`BBkTZ;G?@@@ SA[BcCkDsE{Ȩ_ֶT`^`A@{ 0bD @{è_ִ*0Р%`D %bDA @{è_*Tv@%]_{Ss:Gb@BH@a@SA{Ĩ_b4{Ss:Gb@BH@@b@ ˂SA{Ĩ_E{S*/@t ` SA{è_{ t!F!@? qT#MR`Pr'd @c @!B'!0 R"` @ @{¨__.,*{e 0!?@{_@@!`B@_aT_@_{[ *:G@7ңA;ՠ#BpGD$`?6h D$?c#h " 0&!F 50D @`   @?kT@` T@ @kTҴ@TB@9@5@:G7@@Aʡ@ @[B{Ǩ_ @@R@ )/c@? ! av `V@_"Q5?qTa@!@ ?`2_"Q5?qATa@! @ ?ִ@{mL@!@ ?N>{[SҴ @@@""d"@%Rk-T a @!%Rd"@kLTa@R!5kTWSA[B@{Ĩ_@T RT@@#Ba@SA[B{Ĩ_? @@ @kয়{[S*Fc:GV"@?@ q TA;cD$`?BpGc8h D$?#h " 0&!F50D @#" @_kKT!@aTa @?kLTFR@qT:G*?@@A!SA[BcC#@{Ȩ_! @aFR4*c@6B'!5 R.*B'! 4 R&9R9c7G#{S`F@ qT@E``F@ qT@B@@?@sF`@ qT@SA{è_ւB'!9 R@SA{è_ւB'! 8 R@B@@?`F@ q T@B'!8 RB'!6 R@sF`@ qIT@B'!@7 R_{A; BpGs:G` D$?d@#h c@$D$?#h 0&!F 5@`@ @{Ĩ_%_ R?______" { @ @{¨ @{¨_{ @`@@* @{¨ @{¨_@@4*_@@'_@a @9@5_Z'{S` t.@`pG`"_"Q5?q T t"@tpG@"_"Q5?q` Tt@tpG@"_"Q5?q T`@@(` @@(SA{¨ @q aT@!@ ?ր@QB @q aT@!@ ?ր@Q& @q aT@!@ ?ր@Q @!@ ?ց2 _Q"5qT@! @ ?֫@!@ ?ց2 _Q"5qT@! @ ?֧@!@ ?ց2 _Q"5qT@! @ ?֣{S` t.@`pG"_"Q5?q T t"@tpG"_"Q5?q Tt@tpG"_"Q5?q T`@@p(` @SA{¨k( @q !T@!@ ?ր@Q5 @q !T@!@ ?ր@Q @q T@!@ ?ր@Q-SA{¨_ց@!@ ?ց2 _Q"5qT@! @ ?֪@!@ ?ց2 _Q"5qaT@! @ ?֦@!@ ?ց2 _Q"5qT@! @ ?֢@_{!pG a "_CQ#5_qT @{¨_@"qAT@!@ ?`@Qa @!@ ?ր_Q5@qTa@ @{¨! @ {7[Scks @<@:Y@9 8@8 @7 @6@4@3a@W{ @`@aTa@J{ @`@aTs@ @Tlje@ @T^\W@ @TPNI@ @TB@; @!3 @T42-@@AS @T&$@ @T|7@@ @T 7jsSA[BcCkDsE{Ǩ_{bRc[FS:G` *@'`"9`@&9bk~~2J~9Ttb qTRa u@!tpG"_"Q5?q`Tt@Tx#r+aTCҹ# #B#{@ _%?7@_cgBF@B @yE y7@Ҧ_@ch#8% o?;@ow@#@y y;@o@sh$8` @@&C@o@a B@Tr_@B@Tm`҂B{@_ ??@B_eҢg&@!@?@_@ch$8Co?C@ow@@C@o@sh$8g`@@x&C@Bo@a@T3_@B@T.O@#@+@F@ qT:G@@ SA[BcC'@{Ш_ R`9dB'!@ RmN!RI u@!tpG "_"Q5?qaT@!@ ?֡2 _Q"4B'!> RB  @q T@!@ ?֠@QqT@! @ ?t@@!@ ?֡2 _Q"4#+_@B@TO@`.@@`"@@`@@`@@%` @@%j#+#+o@B@TC@%O RC@%C {F#+#+{S`F@ qh T0&6@">"7r`TsF`@ qT@SA{è_֠@`@) ҋ**OA95sF`@ qhT@SA@{è_sF`@ q)T҂B'! R@SA{è_> 40& "&'&B@%Ga@B'! RqB'!@ RiRRsF`@ qhT@B'! RU@B'! RL@&_0" (`T@ _A;{D$@? h`{@@@ ____@@`! @9A5_"#{#@AF T`@9qT5`B @{¨_{#@AF T`@9qT5`B @{¨_@@%_{ @`@@=# @{¨w @{¨_{?D@:G#@ҳ !TS˳>T@T@99@@:Gh38@@ ʠ @@@@{Ĩ_֡@ @@ `7U{! R[SC:G@'!#@! R!@9q`TR *!dQ _8 qTA<S!@9@x4!R DQ "@8R _jATs*:G*'@@A!SA[B@{Ũ_.RV#@! R!@9"qTRR{[S:G@"@'Җ#<(TT@9B9:Gj38'@@ SA[B@{Ũ_ҡ/#@ K@#@{AqS:G#@TbC#  `! #@b " @ ! @y y@a@`?h 8 Ք:G@@AadSA{è_ց!  X`xa ֡## `!"@b $@" A !@99@a@`?h 8 A@ @y@yi9c# `!  բ@b " @ !@@a@`?h 8# `! @b " @ !@@a@`?h 8## `! @b $@"@!`@9`9@a@`?h 8# `! @b $@" A @a@`?h 8yc# p`! # e`!@b " @ !@@a@`?h 8Y# P`!`@b $@" @ !pAp@a@`?h 8Bc# 9`!s# .`!@@b " @ !@@a@`?h 8"# `!@b $@" @ !PAP@a@`?h 8 # `!@@ `@@`y9# `!# `!@b $@" A &@!(@(@a@`?h 8# `!@@b " @ @a@`?h 8# `!@b " @ !@@a@`?h 8c# `!## `!`@b " @ !@@9@9@a@`?h 8C# `!sc# u`! @b $@" @ !pAp@a@`?h 8g# ^`!0c# S`! # H`!C# =`!@b $@" A !@@y@y@a@`?h 8/# &`!C# `!## `!@{# `!C# `! # `!# `!/# `!`@b $@"@!@@a@`?h 8## `!-# `!@@b " @ !@@a@`?h 8# `!c# `!# `!`## `!C# v`!@@b $@"@!0@y0y@a@`?h 8h## _`!# T`!@&C# I`!# >`!@v# 3`!|# (`!q# `!`h# `![c# `! c# `! 6c# `!!|c# `!!q## `!"?:{[S@bB:Gk"@_sR#9\@57@C@c sB?@?`T%:G*_@!@ASA[B@kDsE{̨_VR}@Ң7@R)@5c C;O>GT T@C 0@ ѠUIT! @#<T@9?b8` T@9 9? T @99 ? T@9 9? T@99?`T@99?T@99?T@9#9 ? T#@9' 9$?$`T'@9+$9(?(T+@9/(9,?,T/@93,90?0 T3@97094?4`T7@9;498?<T;@9?<89ҤDҠhO@9C@Tqo@:ҡ;@OWf ka8h!8!T;O@9C?`TPN?@sB@TIB9_@_@_A;{D$@? h`{@@@ {SP@ TsB T`@a"@9A4sB!T@@SA{èSA{è_A{@@B?hTb_c_ 9B@aT@{Ũ_c@T_ֳS@˷#D' ˟( T"?HTT |Z@BB__ 9B@aTT#@ @9B@D_c@d`8__8_T`@ sB T`@b"@9B4%sB!T@s@SAA cCkD@{Ũ_`TB@_T`0@{C@@!8G["@Ҵ!Rң@B2kT9OҿC= @c#ң#!Rg@'2kT`@!Ra"9@@˵@uD5먁T}@R3"3X*DTdA L|jTT"@9#9_@?h48T@E9a@cb"9a 9T@` a@#9bs@T@E9A4@)5CB TT/@@r9TS@ҡ@@@_@?h48T `aUD|#ҠKT@j9E9 99@?%T@@ #9 'TabUaBUBU`!DBU!|!@!! s^8^cb"9b8b __Tb @b_b|?9b_T r`|YR[@ҡ@s@b0R@w* 5!ѠS@?@?<;@7KwT?@_TB9 ?@ TK@ UiT! @"<?cT2@9?8` T@9?9  T @9? 9 T@9? 9 T@9?9`T@9?9T@9?9T@9? 9" T"@9?$ 9&$`T&@9?($9*(T*@9?,(9.,T.@9?0,920 T2@9?40964`T6@9?<49:8T:@9><89K@GD `hTTT@B? @@UiTc @b<_T@9D8` T@9 9 T @99  T@9 9 T@99`T@99T@99T@9"9  T"@9& 9$$`T&@9*$9((T*@9.(9,,T.@92,900 T2@960944`T6@9:49<8T:@9>89<ˆDh<huwB``7/@@Tk{G :G @@_ҳ{@a /6k@|@낓`@5lTKT6s@3G Ts@_B"#@{@TaKT@6@BD/@RF@ q"T:G*_@@Aʁ( @@C{̨_s @3Ocs[DB ˷;#=> T@TfbB@db2A(U"T! @"<c T#b@9?b8` Tb@9f 9? Tb @9f9 ? Tb@9f 9? Tb@9f9?`Tb@9f9?Tb@9f9?Tb@9f"9 ? Tb"@9f& 9$?$`Tb&@9f*$9(?(Tb*@9f.(9,?,Tb.@9f2,90?0 Tb2@9f6094?4`Tb6@9f:498?<Tb:@9f><89s҅D`jHT`@T@99`@?@vh68G@sGC@3@s6@sETy}RRC@|{CAha{ a@z T@*ZxDwA7@@@7@BO@3@T6SH@Ts AT-!TC@t'3R@BD/@a@^5@{@TTC@Gb#@aB'!( R+@gҡ;@OWTwG@ҡv?@`a ?@`@z bja8h!8!?TZ6ғ:/WHT A@TC@@O@BTx7sr``7{S8G ["@GV@`7w5C>T/T7@@9a9uh58 @`"@ @#?vnB{@akBt5`,TKT6 @!R@Ra55@{@TaKT 7`"@`v@7@`TKIW8GG@@b" DSA[BC@/@{ɨ_#@T;vnBhB_Tu ?@T RwA9?@@#Ba@`ҡ/C@`aC@`@y@@?"`@@A5 {@TaKT|Sw7@u/a@7@`T``7҄{k[cS8GB B9 @cs9`4cc#@"c TЖB 9a@!gs@T"a BMo@@TT!H?@P@`B_@TK>hTT@9#9c?h48I:#@ 7 K{@ W@⒜@@5 TaKT 6Z@7@ T@낓@5{@Ta T7?? T#@G`G@;@C!@T@`4F@ q TG@@_@sB@T2O@B@T-8G@!@Aʡ SA[BcCkDsE{Ш_cc%^Z @?@wrTF@ qT RҡCyK@_gK@_@o?@dBae"R 8@B'!' R>ҙc*;o@dBaE#R`*B'!`+ R-o@BT`'to@B?`TO@B@Tz_@bB?ATo@B?`T`@@G@@c_@sB@T``7a@A{S@[kss{@a;^T@T!CZ @"3A$*Ui`T! @"<_hcTAe"@9?8` T"@9?9$  T" @9? 9$ T"@9? 9$ T"@9?9$`T"@9?9$T"@9?9$T"@9? 9$# T"#@9?$ 9$'$`T"'@9?($9$+(T"+@9?,(9$/,T"/@9?0,9$30 T"3@9?409$74`T"7@9?<49$;8T";@9$?<89#ҦD `hGT@TB@_‚A9 Ѡ*UiLT! @#<?#NTN@9?b8` T@9 9? T @99 ? T@9 9? T@99?`T@99?T@99?T@9"9 ? T"@9& 9$?$`T&@9*$9(?(T*@9.(9,?,T.@92,90?0 T2@96094?4`T6@9:498?<T:@9><89ҤD  h1T T@B_ @9 ѠU)6T! @#<?8T!9@9?b8` T@9 9? T @99?  T@9 9? T@99?`T@99?T@99?T@9"9?  T"@9& 9?$$`T&@9*$9?((T*@9.(9?,,T.@92,9?00 T2@9609?44`T6@9:49?<8T:@9><89ҤD hC@8S@@@S@0S@!@aS@'@@$@ZC@T@C@TOS@ c`(! @L A@T ѿ!T=-@_@zTV#AB?T#AB?`T @a W@A!@_T@ZC?`TprUG_gWAZC? T[@@V]@!Nep>__@{zx{SP@`Ts"A_`ThT@T@SA{è_T@SA@{è_{ @spG``"_"Q5?qT @{¨_` @qa ATa@!@ ?`@Qa a@!@ ?a2 _Q"5qTa@ @{¨! @ F9_{SAR@`&A!> `,`@A!?`@,`@A!`?` ,`@A!?`,`@A!`-`@A!@`@-`@A!`-`@A!`-`@A!@`".`@A!`&@.`@A!`*.`@A! `..`@A!``2/`@A!`6@/`@A!`:/`@A! `>/`@A!``B0`@A!`F@0`@A!`J0`@A!``N0`@A!`R1`@A!@`V@1`@A!`Z1`@A!`^1`@A!``f2`@A!`j@2`@A!`n2`@A!`~`r2`@A!x`v3`@A!r`z@3`@A!@l`~3`@A!f`3`@A!``4`@A!@ Z`@4`@A! T`4`@A! N`4`@A!` H`5`@A! B`@5`@A! <`5`@A!@ 6`5`@A! 0`6`@A! *`@6`@A! $`6`@A! `6`@A! `7`@A! `@7`@A!` `b7`@A! `7`@A! `8`@A!`@8`@A!`!R*SA{è_sF`@qTR*SA{è_ֵUеA@T' R!= R*`@q4T RA R!@>@R*SA{è_a9*SA{è_ R`9`@A!?` R`9`@A!`?` R`9`@A!?` R`9`@A!`@ R`9`@A!@` R`9`@A!` R`9`@A!` R`9`@A!@`"@ R`9`@A!y`& R`9`@A!q`* R`9`@A! i`. R`9`@A!`a`2@ R`9`@A!Y`6 R`9`@A!Q`: R`9`@A! I`> R`9`@A!`A`B@ R`9`@A!9`F R`9`@A!1`J R`9`@A!`)`N R`9`@A!!`R@ R`9`@A!@`V R`9`@A!`Z R`9`@A! `^ R`9`@A!``f@ R`9`@A!`j R`9`@A!`n R`9`@A!``r R`9`@A!`v@ R`9`@A!`z R`9`@A!@`~ R`9`@A!` R`9`@A!`@ R`9`@A!@ ` R`9`@A! ` R`9`@A! ` R`9`@A!` `@ R`9`@A! ` R`9`@A! ` R`9`@A!@ ` R`9`@A! `@ R`9`@A! y` R`9`@A! q` R`9`@A! i` R`9`@A! a`@ R`9`@A! Y` R`9`@A!` Q`b R`9`@A! I` R`9`@A! A`@ R`9`@A!9` R`9`@A!1`!Rj@RD`0$E_{u0&E4@A{è_`0`) ,E6@T4s Tr TF@ qhT @@A{è_555R]/")  д&B3@ pG` `"_"Q5?qT&E @O")@=pG`"_"Q5?qTa@!@ ?a2 _Q"5q!Ta@A @@! @{è ֳ @` @qa aTa@!@ ?`@Qaa@!@ ?a2 _Q"5qaTa@! @ ?־` @qa Ta@!@ ?`@QaA"c@A @B'@!@={è R @zE5{`0 $E`@@5 @{¨_{c0S*`$E[@3*SA[B{è`֠F@qTfRE*@R%*@(TT@9aB9th48sT@+@9;G7@ @ `SA@cCkD{Ǩ_3@`a 3@`@+@@+ `7_T A@TپZ { @@̾ AT @{¨ž @{¨_O{S=tSA{è_ֵ[`t M[BtSA{è_a@a]{[S:Gc"@'@xX#<TT@9aB9tOh48@< !Tc`@Tc:G'@@ @SA[BcC{Ũ_#@`a #@`@0a@?`TF{7[Scks @@:Y@8@x @ @@S{@a@Yt @a#@A c@aT`"@t @@`@aT "@ @@@T"@ @@@T#@ @@۽@TֽԽϽ #@3 @@ʽ @!TŽý@#@S @@@@AT|#@ @@@Ti7@ @3@@7@@T7SsSA[BcCkDsE{Ǩ_{ @Sa@t @a"@Apb@a_TigcA @{è_{S@[kss{@a3@bB*Ys@`T@vsTAcC'@/@8G?@@  @@#@+@{Ȩ_x@@{@,Ta+T|SaB7@ֿ;@;@@`@@ 5{@MT87R}c'/ @h `7K,@`T%Y{ s:Gb@ҌBH@a@` @{Ĩ___{! sF`@ qT @{¨_ִ4' R!$I`@ q)T @@{¨!% R>@{ sF`@ qT R @{¨_ִ4' R!#'`@ qiT R!@$@ R @{¨_ִ@{ @`@@ @{¨ @{¨_@d@)k*T{///o@ QQQ SR[Rc jm8!5a@?h 8@Bo@jy! ?kTjyp@|@ j`84r @RaPD)@j`8K|| qlTqMjm8RK}} qlTqjy" As@9`o@| | n| @n |@| !|@|@}@~@ ѵ~@! ѵ|!|@Dj~Qja CjxPjw,".Ejv1.".Gjuc,"..".Fj`,".,".,".1.jm8c0.'.&.bbNBdN!"N!(`n!(n!<N><N"N(`n(n<N<N! !| !!| |!|| !||!!| ?q|!Ѕ!k!P| !|!!tF?q!Ѕi-8qa@Ѕkm@P!jy!|!|@!!ia8|tFqЅi!8@Bo@jy! ?kT`@ *kJ) kTSA[BcC{Ĩ__@@)kT@/s//////"jy+R4{QQ jy@D | tn| $n |}@||@ ю|}@B|@|@ !hn7ho O8hd6hl !.B:ho9hn!hpBn8.8hd9.`@99h`n!:.:hb@9.} :.n !wNc vN!N9+`n9+n8N1?N!?N*`n*n>N>N!N*`n*n>N>N!  v!NN N8NA!NB *`n(`n*n(n>N>N<N<N@N!(`n!(n1<N <N c8N! c(`nc(np<Nb<N N!NB8N B(`nB(nA<ND<NB NA Nu.  N!u.! nH!.i-@"jy_k,T@*k T5kTkKT{_kTkT___qT"4{_q  T_ qaT@"R @{¨_ִ4@Z@ A B @@`R @{¨_֡!R_!@R__qT4{_q  T_ qaT@R @{¨_ִ4@.@ A @@`R @{¨_֡!R_!@R__qT4{_q  T_ qaT@̹R @{¨_ִ4@@ A @@`R @{¨_֡! R_!@R_{SsF`@ qTSA{è5' R!$`@ qiT R!%@SA{è@{AqS:G#@TbC# `!! #@b " @ ! @y y@a@`?h 8 Ք:G@@AadSA{è_ց! X`xa ֡## ϼ`!!"@b $@" A !@99@a@`?h 8  A@ @y@yi9c# `!!  բ@b " @ !@@a@`?h 8# `!! @b " @ !@@a@`?h 8## `!! @b $@"@!`@9`9@a@`?h 8# k`!! @b $@" A @a@`?h 8yc# V`!! # K`!!@b " @ !@@a@`?h 8Y# 6`!!`@b $@" @ !pAp@a@`?h 8Bc# `!!s# `!!@@b " @ !@@a@`?h 8"# `!!@b $@" @ !PAP@a@`?h 8 # `!!@ @ `@@`y9# һ`!!# ǻ`!!@b $@" A &@!(@(@a@`?h 8# `!!@@b " @ @a@`?h 8# `!!@b " @ !@@a@`?h 8c# `!!## {`!!`@b " @ !@@9@9@a@`?h 8C# f`!!sc# [`!! @b $@" @ !pAp@a@`?h 8g# D`!!0c# 9`!! # .`!!C# #`!!@b $@" A !@@y@y@a@`?h 8/#  `!!C# `!!## `!!@{# `!!C# `!! # պ`!!# ʺ`!!/# `!!`@b $@"@!@@a@`?h 8## `!!-# `!!@@b " @ !@@a@`?h 8# `!!c# }`!!# r`!!`## g`!!C# \`!!@@b $@"@!0@y0y@a@`?h 8h## E`!!# :`!!@&C# /`!!# $`!!@v# `!!|# `!!q# `!!`h# `!![c# `!! c# `!! 6c# ׹`!!!|c# ̹`!!!q## `!!"? ѥ{8G[@SFcks @ -q-@h:T` @!@d򀹥@&@!@ _!K@@'`@a2@Rd@ҹK"R!@b4F!@? qH3T`@a*@Rd@!@"RPc4Fc!@? q.T`@a:@"c\i@!@   n4F!@? qH)T`@"aJ@c\i@!@   W4F!@? q($T`@c2@R`@c:@!R`@cJ@AR `@cZ@aR`@c*@R`@{BҡR`@zbR`@yR`@xRaZ)U0*b@?q$  qa@c@|&c|q@@|@c|@d c wBRR<*5G@@O@G# Rh@4F!@? qT`@CR`@c:@!R`@cJ@AR`@cZ@aR`@c*@R`@ҡR`@R`@R`@R`@c!R`@AR`@aR|`@ҁRw`@ҡRraZ)*b@&?q$  q@c|@@?qc|a@|@c|@d  BRwR*5G@@"S@G RF@@4 qTK@@G@@8G*@!@Aʡ{BSC[DcEkFsG_*Bo@!vRB'!`+ Ro@B@T֮F@qhT@B'! R @#o@!nRB'!`+ Ro@BTDo@!hRB'!`+ Ro@B To@!hRB'!`+ R׵o@BTvo@!hRB'!`+ Rŵo@BTd|co@!hRB'!`+ Ro@BTQU7B'! R7@&*o@B?`T?K@@TG@@o{S[c8Gs@gҷCC9k~q( T~RcK!gabadjy9jyе&'& ;Z7R`73@kU)һGc)c9S_7S@GWH&I$" *(3@_7@c<_@cbR`?րjy k T*jy kjT ՀU8Gg@@ `SA[BcCkDsE{ͨ_2R_@bR`?y_@bR`?{/k;Gjy"@W4[#cл+C,":R 3@9kU`Ҁ )ҺCO̶C@FGG&$*" ֽO@CbR`?րjykT*jykT ճ @[BcC+@U;;GW@@ @kD/@{˨_ֳ [c+@O@bR`?O@#bR`?B<<Oc<r`TE'&R "4 Qk} k}@}@q}@ jj`2j`hjhii`c2.hj!.hihhhhc0.B1.'.!/!(`nNcNA&.aN^!e.!!^e.n!H!.i _kT*kT(n<N<Nb| _{/F?@e 4SqxS[cxrk2 + TQwtS*|SRRR **E5  @) Hi/ )!h~hqhr#.".!.(`n(n$|o <N<N 88T s kATp*Q*OXO~SvORORuORORsOвOOOO *t 4*B@Ih:^ @L( n@L+ nB`N + n!( n!`NB/@/en!/"=/sNtNen@B/ATO[rNZqNYpN wN{ouNAo cNvN9ocddN |N,xNc /c/B4cn{7cn!4cn87cnBo{o9oZgdNddNA{NoZ / /!yNd:.!xN/4cn'N `NbN(!`!T:ha89.-) h:8( $#hy8 h.81R  hm8?kh)8hh8h$8hc8h 8[ia8[i:8[iy8[i.8[im8[i)8[ih8[i$8[ic8[i 8{ia8{i:8{iy8{i.8{im8{i)8{ih8{i$8{ic8{i 8ia8ai:8:љiy8i.89.im8i)8- )ih8i$8($ ic8i 8#hz8h!8hy8h.8hm8h)8 hh8h$8hc8h 8[iz8[i!8[iy8[i.8[im8[i)8[ih8[i$8[ic8[i 8{iz8{i!8{iy8{i.8{im8{i)8{ih8{i$8{ic8{i 8iz8i!8iy8i.8im8i)8ih8i$8ic8i 8TSA[BcCkD+@{ƨ_{@@@ @ jy jyxSi JiJtSjy *)-  @JB|)}@!|J  " J!J  JJ  JJ JJ J  {C_{CSsA@8G@o[ckCbjy`jyajyU so@"~o@4:<R 4@RkvUҀK kWЂgִ[@I_J&$*" g@CbR`?`jykT*`jykT ՠ@R`UR@y8RoN=@cjyajydJcxScQa|! cjyajycQdJcxS !a|!cjyajydJcxSc Q$!a|!cjyajycQdJcxS  a|!cjyajydJcxScQ(!a|!cJajy`aڰajy`J"!&!ҰcjyaJ&# 㒣!ʰcjyaJd $ C!cjyaJ*# !cjyajydJcxScQa|!cjyajycQdJcxS !a|!cjyajydJcxSc Q$!a|!cjyajycQdJcxS  a|!cjyajydJcxScQ(!a|!cJajy`aajy`J"!&!wcjyaJ&# 㒣!ocjyaJd $ C!fcjyaJ*# !^cjyajydJcxScQa|!TcjyajycQdJcxS !a|!JcjyajydJcxSc Q$!a|!@cjyajycQdJcxS  a|!5cjyajydJcxScQ(!a|!+cJajy`a$ajy`J"!&!cjyaJ&# 㒣!cjyaJd $ C! cjyaJ*# !cjyajydJcxScQa|!cjyajycQdJcxS !a|!cjyajydJcxSc Q$!a|!cjyajycQdJcxS  a|!گcjyajydJcxScQ(!a|!ЯcJajy`aɯajy`J"!&!ajycJ&!`ᒡadjyaJ # Z!cjyaJ*# ף!=db= F OtJcf=bj=t an=cNaJN@BN! Nqcf=db=bj=`n=TdjyXybjy cjyB c! q-T`jybjy*cjy aJBc ! qL TdjyXbjycjy aJBc ˅!t Rql T @@553@9F@qTaJ'RcJRxJdRzJ9yR%RCRF@q TdJfJaJeJgJ!`"K B-"C-d f a e g IF@qT`@dRD rKB' R!@d|$f|KͰ8GRo@!@Aʡ {ASB[CcDkEsF_R`jybjy*cjy aJBc ! @ 0@cRC rKB' R!|#cfc|K!@cRC rKB' R!|#cfc|K~@cRC rKB' R!@|#cfc|K}aJtJ4g@bR`?Բg@bR`?{S:GF@"@`5:GR@@A! SA@{Ѩ_abJ`(efJdjJ?q#  cqB qc|!B|c*y!|b*y!(Ra*yb*yanE<<<<@B yapG  _CQ5_q iT4F@ q(Tҟ` @# Ba怹@ ?a‹Gc!Rg3g@*O@H@Ң!Ҝ@ ~ bN@! y bpG@ _#Q5?qVT4F@ q#Tda @b怹 B<@!Rb‹?GҠsww@1O@H@Ң!a@ C {^@! y {pG`#_"Q5?q`XTF@T4 qhT@B@@T@C@Tެ@B@T٬8GA@ `SA[BsE@'@{@@#@C_ֹ*?@e^RB'!`+ R@9C@TF@ q TB'!! R@@qA!TA@O!@ ?֢O@@ @QA W @q"T"@OB@@?֡O@ @Q" 7 @q"aT"@OB@@?֡O@ @Q" M` @qa Ta@!@ ?`@QaQ @q"T"@OB@@?֡O@ @Q" U@@qA!TA@O!@ ?֢O@@ @QA *@]RB'!`+ R@9CTF*@Х\RB'!`+ R@9CT2J*@e]RB'!`+ R@9CT*@]RB'!`+ Rk@9C`T *@^RB'!`+ RW@9C@TCӠ? C}0g@?@;C"}RU;@C@!RC@ңC!R@k@c7?! Roo@;;?@! R҃@9q<TR *!dQ _8 qTB<S"@9`x4"R eQ C@8R jAT!*{C@{@2?kITO@@?|S?|!RCK@G@?|?|!ҿm@ CCӠ?@5}w@?@;C"}R;@C@!RUC@!R@{@! R;%@?+! R҃@9q.TR*!dQ _8 qTB<S"@9`x4"R eQ C@8R jAT!*{2C@0{@2?kTO@@?|S?|!RCK@G@?|?|!ҿ@ CӠC'}MW@C@?G"}Rr?@G@!RG@ң!R@[@;C! R__@?C@! Rc@9q TR*!edQ _8 qTB<S`"@9`x4b"R eQ C@8R jAT!*G@@2?kT@O@?|S?|!RCK@?|?|!ҿ@ &¢'! R@F@)`jA)e@a qT¢'!! RcZ)e@a@ '!@ Rܫ@ q}T! Rԫ@A@O!@ ?֢O@A0 _Q#5qTA@! @ ?:"@OB@@?֡O@"0@_QC5qaT"@A @ ?fA@O!@ ?֢O@A0 _Q#5qTA@! @ ?z"@OB@@?֡O@"0@_QC5qaT"@A @ ?֎a@!@ ?a3 _Q"5qTa@! @ ?/"@OB@@?֡O@"0@_QC5qT"@A @ ?֧J?@Rr;@C@! R_@`#=?@Re;@@! R#/;@RW7@?@! Ro@#RR.RR RRCGC`G@`G@Ω @@ɩ@B@@T@C@T@B@T`^@@`V@@`N@@`F@@`>@@`6@@`.@@`&@@`@@`@@UC@ @C@ @`C@@9C?Tt4 @@k6!@}$ @@u[&!@m @@eK @@^Dyxvu:ji'|!@Eb@!e^@a_XV @@2ګ @@+ܫFECByC@`|x{S 7NSA{¨_{SF`` @ qHT`@F@ qhTu^@pG "_"Q5?q T uV@upG "_"Q5?qTuN@upG"_"Q5?qTuF@upG"_"Q5?qTu>@upG"_"Q5?qTu6@upG"_"Q5?qTu.@upG "_"Q5?q Tu&@upG"_"Q5?q T`@@`@@F``@ qTSA@{è_aB'!# R @q T@!@ ?֠@Q @q T@!@ ?֠@Qm @q T@!@ ?֠@Q @q T@!@ ?֠@Q @q T@!@ ?֠@Qy @q T@!@ ?֠@Q] @q T@!@ ?֠@Q @q T@!@ ?֠@QeaB'!`" RS`@@s'a!$ RI@ qiT@SAa{è!% R>@!@ ?֡2 _Q"5qT@! @ ? @!@ ?֡2 _Q"5qaT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qaT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qaT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qaT@! @ ?{SF`` @ qhT`@gF@ qTu^@pG@"_"Q5?qT uV@upG "_"Q5?qTuN@upG "_"Q5?q`TuF@upG "_"Q5?qTu>@upG "_"Q5?q`Tu6@upG "_"Q5?qTu.@upG "_"Q5?q` Tu&@upG "_"Q5?q T`@@&`@@#F``@ qT@SA{è٦aB'!# R/ @q T@!@ ?֠@Q @q T@!@ ?֠@Qo @q T@!@ ?֠@Q @q T@!@ ?֠@Q @q T@!@ ?֠@Q{ @q T@!@ ?֠@Q_ @q T@!@ ?֠@Q @q T@!@ ?֠@QgaB'!`" Rȧ`@ 'a!$ R@ qITa R!%@SA{èU@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?{!@$@ B@_!!T``F@ qhT`@ԺF@ qTu^@upG"_"Q5?q)TuV@upG"_"Q5?q`*TuN@u`pG"_"Q5?q"TuF@u`pG "_"Q5?q`#Tu>@u`pG "_"Q5?qTu6@u`pG"_"Q5?q`Tu.@u`pG "_"Q5?qTu&@u`pG "_"Q5?q`T`@@`@@F``@ qT @A{èG_aB'!# RaB'!`" R`@ z @q T@!@ ?֠@Qu @q T@!@ ?֠@Q @q T@!@ ?֠@Q @q T@!@ ?֠@Q @q T@!@ ?֠@Qe @q T@!@ ?֠@QI @q T@!@ ?֠@Qm @q T@!@ ?֠@Q'a!$ R+@ q)Ta R!%# @A{è¤ @{è@֡@!@ ?֡2 _Q"5qT@! @ ?3@!@ ?֡2 _Q"5qT@! @ ?/@!@ ?֡2 _Q"5qT@! @ ?+@!@ ?֡2 _Q"5qT@! @ ?'@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?@!@ ?֡2 _Q"5qT@! @ ?֣@!@ ?֡2 _Q"5qT@! @ ?֟{S@[`3@9B98G@ @y&*y @y**y @y.*y&@y2*y5@Ւ "`@99#@Ú "4/q TcARq RfJ <jJҼb B*bJkЅ<)||@@jJ`RBo{a@n@& Ң |@D|@hk8*jd8nyny) nyk RBЃ/yK f@9f4oy"8Bck!T )kATk _ klT/@RkSR!3RRaT9qPT @)A)ab@bbN R BT9 qIT@"bbA9?qbJfJjJcr@b@rbbAQbA"RB"B""V "Z c"^ b f j n r v z ~  TC9d?qbATE9? qbATG9?qbA`TbI9?qbATBK9?qbA T"M9?qbATO9? qbATP9?$qbA@TR9?(qbATT9?,qbATV9?0qbA`TbX9?4qbATBZ9?8qbA T"\9?<qbAT^9bA q9q9c 4q9d?qbATq9?qbATq9? qbA`Tq9?qbATq9?qbA Tq9?qbATq9?qbATq9? qbA@Tq9?$qbATq9?(qbATq9?,qbA`Tr9?0qbATr9?4qbA T r9?8qbATr9bA Bn9 qNn9Vn9fn9cn9c UccBcJn9!cZn9c^n9RLcRn9Pcbq9'cb qc!гc"@N@ N"RcNBN9!N9NEn$nnn`n傑<n䂒<ん<ₔ<႕<<`%T@|@!@RBXR Bd@@b 9b|@BT9*e Bg84)%@j""0@0]9,K@@*@, "@999c!<AT +4@Ra Qk`c9'b+kB,kCЁR<`F@qiTÎKq#Ta*!,* RJA@ƂҠA3@39j`8?q` TT?q"TcT?qTq9cc .!Rq9@4g@.F!Rҥq9Gq9?kjT`jJÒJATF@q TaRB'!@3 RR@SA{è_aRB'!2 R{Ss[utF6#:G7@7Ҁ@ qT!Rc 0c "560!0 0R? hQ*4sF`@qT:G*7@!@ASA[B@#@{Ǩ_da*%@RRB'!@" RHV*@4sF`@qITda*@RRB'!# R5'aR! R+@ q TaR! R"@ qTaR! R@ qTaRR!@! R @* 4sF`@qTda*ARRB'!# R`F!0$R$ @qT*` 5 0lF4@4sF`@qiTda%ERRB'!% Rٜ 4xA qRUC`jBCӠtR#0cR!|B|c!DBDAKax$!@ C@ )/`sF!0 `@ qTaRB'!& RLaRB'!$*sF`@qTdaDRRB'! % R@{Ss`F@qT405%$cc "!RsF`@qT5@SA{è_aRB'!  Rj֢'aR! R_`@qTRa R! V5@SA@{è_ֶ@{St*F@ qhTFqRsҀq TaRB'!' R6RSA{¨_aRB'!' R+{CuSF@qHTf@qITqTa@R! Q?k(Ta @WR! Q?kTfR@4RkhT5#RRf@R Q_kiT*q TRdaRMRRB'! RF@f @WR Q_kTfR@qTqT RdaREORRB'!ۛF@!R aRq) T*daPRRb'! RɛF@qTaRb'! R*@{ASB_֔qTXRdaRNRRB'! RFfR@q@hTRRdaREMRB'! R4RFCR@TRaR@?qT@*{ASB_aRB'! R~@_f @WRTR Q_kiT5qTaRb'! RkF@{StF@qT qTR@SA{Ĩ_aRB'! RO@ qIT`e@G'*aRL%! R=F@ q Td@aR!` R2@ qITd @aR! R(@ qiTe@wRR R@ q Te@$RR*F@ q) Td@'aR!@ R@ q Td@aR! R@ qTg2@'e@vւRRR RF@ qTg6@&Re@R**@ q TgJ@ve@bRRR RҚ@ qITgN@&Re"@R**ƚ@qTRa R!`R@BSA@{Ĩ_ֶB@Y{[uSF@qT=rcb@0Ac".B䇟Cb`=@:B)B@&F)7I)o:)mjl.j&)hf )TBK`bBM`rK`fM`vBL`jBN`zL`nN`~ ҁB`Bq TaRB'! RoRSA[B{è_aRB'!  Rc@B= BB;{s|A@;GsA@b@?ҿk oA!`ę`+'z@F@ qHTVXւ<=W *1T@ 4` 4A!> 4A!? @4a!4a!`4a!4a!`4a!5a! s@F@ qTo@.*h"x!`sod1T WARBC'@;G?A@Aa{@ @sE _!+K@F@ q Tk@qן`Sk!+<@F@ qTk@qן`Wk!+-@F@ qTk@RqkЁ`[kt!+@F@ qTk@RqkЁ`_kbk@AB'!? Rk@RqkЁ`[kRa! @F@ qTo@.h"x!`coAa! @F@ q To@.h"x!`go0k@AB'!< RUAB'!< RMa! Ǚ@F@ q To@.h"x!`kok@AB'!= R4|a! @F@ q(To@.h"x!`ook@aB'! Rk@RqkЁ`_ko@aB'!@ R" o@aB'!@ R"o@aB'!@ R"o@aB'!@ R"o@aB'!@ R" 'f {C[vuS:Gcd@F`@ qhT*R 0hF590F30 SE S!@?q#T?`>=RvF`@qT` /*4F@qiTdaesRRB'!/ R2C*:GA@A"{ASB[C _ַ70nF 5C?RS?L)*0JA+k@MN 0CFD\ ~ %D}R AD=}SC=E ArCDaˁEB'! )`c RaWA[AaQRB'!`0 R#@cCe>ck@'@@{[vSF@ q T70RER`jCӠt~NFD@qHT40B+"a @sAATF@q TARB'!@3 RAl 0@ RE!|RrC֮Fej#0|!tcdA|ś|K@ !D5K_ qKu TR@SA[B{Ĩ_ARB'!2 RaRB'!  Rs'aR! R@ q TaR! R@ qTARR!` R@ q)TRA R!R@SA[B{Ĩ_{[UVSF:Gc"@/k@q(&T`a|||||||a` @:q-Ta~@?qATa:q`Ta@?qTqTanA?q`#T q TaA?qTa:Xb"#a!"c:q Ta^B?qTa:Xb#a!"c:q` TaB?qTa:Xb #a!"c:q TaNC?q!Tq` TaC?q@!T qTa>D?qTa:Xb#a!"c:$q`TaD?qTa:Xbb#a!"c:(qTa.E?qTa:XbB#a!"c:,qTaE?qTa:Xb"#a!"c:0q@TaF?qTa:Xb#a!"c:4qTaF?qT8q@TaG?q@T<qT`GqT wcChE9RfK `@B` `dKg@h gfeEAff@f c@e cdAycAcAca@` F!@? qiTeRE rcK|qf T@A*B'2! 3*an95F@?qTAB'!4 R:GR/B!@Aʡ{@SA[BcCkD_a:Xbb#a!"c:'a@bdR$ 9Rr#djtCcE&Rc 9ҥ|ě!R^@Ccc@4DD^@` ?:F@? qiTaRA rcK|qfӀT@*`4AB'! 3 R@AB'!@2 Ra:XbB q#a!"c:!TPCA*c2B'!3*a:Xb #a!"c:a:Xb #a!"c:CA*!3c`4B' Rk@ta:Xb#a!"c:a:Xb#a!"c:`:Xa` b:ە{ST[F@qT50b@6R 0c@Rb c @f cAj cAn cAr c@z cA~ c A cA 9:cB"0j&BB `@gA`h@!0a@!9A:e7d@"0dBBcJ@%0 p#0cf"@C7ckJ@E&07 %0E%0 7fA`0B   *ᇟZ?j~ @TaJ=(`N=a<0< << @<΂=aR=`V=<< <@< @<҂=`@fq`A `AR `@j`A `AV `@n`A" `AZ aG9.9TAB'!1 R@RSA[B{Ĩ_AB'!@1 R@^`@F`zA `A2 `@J`~A `A6 `@N`A `A: `@R`A `A> `@V`A `AB `@Z`A `AF `@^`A `AJ `@b`A `AN {$@S Tݖb6@`>@@?**@SA{è_BA@eRB7!@565E{$@S Tb:@`>@@?**@SA{è_BA@RB7!@565{$@S Tb*@`>@@?**@SA{è_BA@RB7!@565{$@S Tkb.@`>@@?*q*@SA{è_BA@%RB7!@565{$@S TEb2@`>@@?*K*@SA{è_BA@ERB7!@565{$@T:G@/*`T_ q,T ҹ#Y C6v2* *@5b"@a`@?*`5C_!R#@ @`*A@! 96k C6N @#@:G*/@@AʁAB@{ƨ_BA@*B@6!765NA@!@86UF @#@ #ғ{` @a&@`>@@ ?@6 @R{¨_BA@6B6!9"@{RAcW";[X;S!:* @@)cABqTRk@T,qTc@)Ae @!;rR[B;ASAcC!<{ŨqlT qmTc@A!<Rc@)A!;b*OA! <NO@{ [0@c>@ 7a6@?k T?q`*@T@7!Q!@"7T @[B@{Ĩ_a:@"b: `:@@6:a>@`z@!a> uz @[B@{Ĩ_ִTз;WBc6@A! A!A!{w@G@7a6@@@dz@A@!;c>@-{[US:Gc"@'3!Rܐ2A)R =~`~a:@z `B<`2@42`2v@R cF)TAXЂ"! ;v6wB{`*@R:b*@"QvB`b{`.@@R*b.@"Acf@R`v|"b:@b"4"/:G'@@ @SA[BcC{Ũ_CAeR"c !@;@G@ 7`*@CAR"c!@;@G@`7b:@CA%R"c!@;@G@7`.@Tt*A!>{CS[Vc;*@+>@A!@?%>@@46@qTX?Re@d@cB6@kTJ@;A!.@ J@`4B@q TXR e@d@cBB@kTVM)skeTf@s ;A!4XWB#R Յ:@c~9ҤshcA@@@{if@ksŸqaT#@{ASB[CcD_{S[#4@>@*@?k,TqTQ` a@7b @_Ts!TA@;! !@G@`7SA[B#@{Ũ_`@!* a>@z@cQ>2@a@Kz6e@SAA[B@#@{Ũ! ;cW;AX!  0;76@>@?klTcCCA-Rc !@@G@7cC6@c{C#W:G0@C@G!6CEXct*@zb*@ub.@pb:@k`>@ 4`6@RqTkZsYZC9;RkT@c7@|j@!0`>@h:@!NQ;`>@7ab@BRc#cbi<bL)`jkKTjan@`6@_kT!ankT`>@kDsE`5`J@4aB@Rt.@?qmTk90sR[9;{C?k T@`7`2@ @{ @ *|j@`J@!3@Qh:@:`J@7ab@bRc#cbi<bL)`jkKTj`n@aB@_kT`n?kLT`J@kDsE5`*@`.@`:@A@@Б:GG@@ @ {A@#@_c  A?!@@;F?@c  C?Ac!@oF?@bCA@e$R;cc!@@G@6ksCA@E"R;cc!@@G@ 6/X0@D 6{kZSY[cX9;+[a@9?qT`G@7sTYXW9;[a@9?4qTi`G@7sTSA[BcCkD+@{ƨ__B{S[c#(@4@<@k"TR?qmT `@7` @TskTX;A! YR9 0;6@k)T2@7B@J@?kT'4q.@MTZYZc9=R @72@ 7 (7B@kTJ@?k (TF@.@BKC _qbU|{ku'72@C@@ 7(7ku *k5J@B@!QJ?klTF@B_kBFkmT!JkJTUе;A! V֢ 0;BB@J@?k TF.@b@  bA 2@b@(6_T` @Rb@`@ *`z@>@Kz!Q>SA[BcC'@#@{Ũ_@2@/6@Q*q(T*R%@9tqT1*!*kTq@zT@@;@}U;A! XШ0;B@J@?kTCA2Rc@>!@@G@7'B@J@L2@C@@/6`Q*qT*R%@9tqT1*!*kTq@zTE@BAB`!=@;hA@C@F2@ 7kT2@6>@AЄz@@e@! ; U;A! YJ90;6@>@kmTCA0Rc !@8@G@76@U;A! V*֢0;kB@J@?kTCA6Rc@>!@@G@7B@J@CA8Rc@>!@@G@6c@:6@CA1Rc>!@@G@6'C{C[Uc:GS0"@?ғ;ksTv2@rs{o`;@v4;Rh@0@8@9"A7;`@"`k9L)!h?kKTh; l@_kmT l{o@`5;0@<@a 7;4@?kT;?q;@(@T@7!Q!@7?T Հ;:G?@@A {ASB[CcDkEsFC_CA@c!@;;@;"8@C#8 8@@6?8;<@x@B<8 xVSB`;V;A! `;c4@OA!`;JA!`;EB`;A@G@7;4@x@A@!;;<@saR;BҡR`>;@{;{CSS[b:G0c;A@7k32@V 43(7|ӣ{3@;2;R3@h@0@8@Z"w7;BR`@#`ak:L)!h?kKTh; l@_kmT l;as:G7@`@ ʠ{ASB[CcDkE3@_֣K`{;R3@h@0@8@Z"u7;bR`@#`ak:eCA@c!@;CA@c@!@; ;B {  [U#:GC @ Sc/Gk'Hs=w= Ң{===== =CE/ ' 7 @ : D@# "R Ҕ! tZ_(TBB*_8(qTBRj989IJC#:G@@ {@SA[BcCkD _V" a CBc`B*R {  [U#:GC @ Sc/Gk'Hs=w= Ң{===== =CE/ ' 7 @ : D@# "R; Ҕ! tZ_(TBB*_8(qTBRj989IJC:G@@ {@SA[BcCkD _V" a CBc`B*Ҋ{?q T!4?q@T? qaT* 4AR!F A!jAR!G" @b" Ab" Bb!@a @{¨_ @{¨_* 4AR!F`R 4 R 5{{_p{ Sa:G*"@'ҒWR@9qT*@4@As:GR'@a@Aa @@@{Ũ_֠#@TA@@9R?qC{ST[#:GҀ@GR "RDa@!R@GA@(GB@ {@SA[B@C_aC{ST[#:GҀ@GR֊"RD-@!R@FA@GB@ {@SA[B@C_-{ @ @`@@O`"R`= @{¨_DCAE R c!@@G@`6FDCA% R c!@s@G@`68{S` @ `@@ @R" a"SA{¨_DCA Rc!@Q@G@`6DCA Rc7!@C@G@`7` @ DCA Rc!@4@G@6 @{R{_R_{ ` @`@R @{¨_DCA Rc!@@G@6ԊDCA Rc7!@@G@`7` @DCA Rc!@@G@ 6` @e@a@@f {BAB`!@@{_{@R{_BAB!@{@ST[ Rv SA[B{è_A!@`BAB!@0!G!{L{_R_{ 0FOV7@$*h6֋@KFO7A@* @{è_*A@!! !@* @A{è_A@!@! !A@!@ !SZ{SS[b:G0C@' CcGB`q TqTDCA@R !c .!@2@G@`7#@~@"RDҥ@!˄@.L#@ @L#@Js:G*'@a@A!SA[B@{Ũ_F*A!- !R͉{@ 0г FOA7` @ @R@*@{Ĩ_d"@Fe@BAB@!`$ !fd @DRFO`6*BAB@!@%@ !Y* @@@{Ĩ_0жv"@Gw@@*#RbR̉` R`TB @@Rр @AA@!$ !@ҶBK BA@B@! !T{[US:G@GVc0Є@FOk+ 7CN@)DH)ߖ*4*7FOX@;@ 75@ߖ )&* 7o@R7FOn"`7cCkD+@:G*G@@ASA[B{ɨ_X#!BA*B!@RFOn"6*BA@**B! !cCkD+@@XȈ R*#!Ar!1 @KqMTFO* 6*BA*B@!!#!S4X#!BA!`BCFON@)&DH@) 6BAR*B@!X@XC R*#!Ar!@@KqmTBA*B!@#!~A@!@ !S}XA!#!ck+f{ST[:G% @@/@0FO7Aߖ#Os*@ 7K@7@a|@aߖWC f* 7W@`" 7R FO@6d@BA@*B!# !:G*/@@Aʡ SA[B@{ƨ_@v"@EBA*B!`# !f@*BAB!"@ !e"@Aߖ@#O**6Ɖ@ R*A@r! !c@@K@C R*A@r !!Q@KqTA@! !Eԇ{ST:G@'` @0СFO7a@ۈ `"@qTƇ`"a@FOC@@5ߖ*Љ*7FO7@RBA@* !B!!FOR4BA@B!" !~@:G*'@@AASA@{Ũ_d"@f@BA@ !B!!h` @*BAB!`"@ !^ߖ**6@(@]# R*A@r !!@FOK@`6BA@B! !SE{#R0c8G!=S@d@[c*ks@+A!@. @y@ ;0FbCc |"yWxtJ!#G"`هq TqTDCA@R !c .!@t G@`7;@~@"Rҥ@!`L߅*;@@;@+TTBB,T*Xd@U@V@G@5Tb*G 5A@ !!,<@R!!8G@!@A!SA[BcCkDsE{ب_A!`+4!)R"ҁs.`s@qF*A!- !A@ !!, Rs@A@_q!+ !w{ SSs'AR* 70DO7@  0"=SBH7"=_xV)R[BcCSA{Ũ_ֹ#YA #!*!@(A#@# q TqT4*AY!) #!Cc%RR"DB #!A!*%#@AB#&@DYRRC"Dc%BYRABCDY#`&A@ !!&@*A@!( !{`@SA@A@ !!'o@ @SA{SH7R"@S ;sb;AR*@7HS7s0aHRX)7@*@SA@{Ĩ_SA@b0! :@:A@!<@:*@SA@@{Ĩ_A@*b0!;@:A@!`:@:TA@!'@:4@*A@!<@:t@{S4[:G@7Ҷ @R`:G*7@@Aʁ SA[B{Ǩ_ַcc@i#[@2@qKz!T**1TH735@#R@bR3@̅ @TcC#@!H7*IDA@:!9#@cC@<FcRBA*rB`/!@9@:#@,A@!$@:s@cCK#@ A@!8@:Sc#{S@!HTa7*"2[R7SA@{è_Ć@SAK@{è_*A@"2@:!7`@A@@:!6Y@{k9c";GHA@?S[ 75z"@cV@ )@qKzT**1TH@ 7s7[@@Uz`V@[{@qKzT*ӆ*1TH 77c@"7H 4BA@B`1!<@:9;G*?@!@ASA[BcCkD{Ȩ_H6UÅRBB:A*rB`/!@9oH*HA7 BA@B`1! :@:a5@UB:iÅRBA*rB`/!@9QH7[@4BAB0!8EH@4BAB`1!8B:;@FRBA@*rB`/!@9@:-@TB:5RBA*rB`/!@9H37c@"`4BAB/!@8"@{A@@:!Ht{7:G @'` @a@ `"@Cvi@`@@qKzT**1TH7@@:G*'@@Aa @@@{Ũ_֟@ՃFRBA*rB`/!@9@:@@SH 6BA@B1!7@:{':@;G @GH3@@+75@*`QK i !R@O );Y@qKzT**1TH 77{@S5H@* 7Uz`6@k<@qKzT**1TH77Hs@#775AB+@ Z;G*G@A@Aʁ @C'@{ɨ_H 76!*!4B:AB+@H!76!*!5@96𣅌R"!*rB`/!@9B: 6B:*"!B1!@3H3W@)@*6"!B`0!3v"!6B1B:!5@/҄@6B:CR"!*rB`/!@97H6C@6b0*!!4H{@6C@!!4/@c6CR"!*rB`/!@9B:"!6B/!@8B:#@l/@I! !2@:S6h6!!B:.{s/@5/@f_{AR[6S:G5R 'C@' Ӂ7!!=*:@c=* AR`;ā*7 R!!`>@c=y*@`4@@5:G@@ SA[B'@{٨_֟!!=@c=c:!!<@c=[ >s<#?!!@. @@#c8#9?s ?@xaT :{J"Rx|/*R5F"RR`C5!K#R5!).!Ҡ@5!!`? ?@? TA!`@c= cC#@sE!!?c#s{S0*">A6RqT0@>sSA{è_+40B>B">B>"B@% N@">yÃ__{ @҄W"[$B_T @{¨_b]%R@_qKbQ`Tc`_ @{¨_֞{ʀ@(@W#!?HT(@!7!q@T?1`T({__@{^@@A{Y!1aT@C(v{΁@{q_{Ɓ@{_{R@S3B@e:G@@ҿ)?֡+@R!?qT@ Rs:G@a@AʁSA{Ĩ_dR_!!G!@{ L @{¨{S[*@`Ta@?T`@9qT5 R SAR[B{Ĩ_֡@? T`@9q@T@ 4a@T`@ATRSA[B{Ĩ_{S@!@T@9R_q Tz5R4Rua ` *@SA{è_@%@ T{S[*@9q@T[5 RSA[B{è_RqHTc@SA[Bc@{è` R_{S[!@3C@b:G!@C@ ?rT@@@#R@?r`T@s:G@a@AʡSA[B{Ĩ_֫@q T q TiT(qTT,q@T0q!T@@qAE86@d_q T`4qT qTD@@}@d_$qTR @8@ ǚh?7qhTH76 ǚR@8@ ǚh?7D$x$@x{{ 3b:G@9C@ҟqTq`TT  qTA*s:G@@a@A @{è_5qTg.{#S @[s Rc@8`@ šB!c?7=r TSA[B{Ĩ_SAR[B{Ĩ_q TiTqT@q@TqTq~`4@qT_~{'{S[`]~@9qaT`a@99?q`TR@8a@! šBc?7@99R @8a@! šBc?7[BSA{è_*"* `a@99?qT{q 3*a:G#@ҿWaR`Ts:G*@a@AA, @B{Ш_ִҔW4TqYY4_/[]^C@7R!R}/@RACD2CC@#/?sC9q TOo~@O@qw@_TOC9ҟqT*G=@G@*C9ҟqT*G.@G@*C9ҟqT*G@G@O@*uR C@8`@ !c?7[@g@T6RR TACD/@h_@HTw@hT5/@ RACDX7T~O*O@C@#C9qTC9o_qT*[c@e k@ w@X ww7(YGIT'Ҡ7R Ղ@8@@ !b?7?qT ˀ_z Rb@8@@ !)b?7?qT  _z @TTw@qD @z@Ts@< Rcb@8@@ !Jb?7_5 ?@O,O@'ҤH7@r'ҨO@HTw7w@`5T7@9RLKR/@ACD[77ҷ7RIT@?@W@O)R'ҤHO@4ҿoC@W@A >?CD/@(-GxBA6[YWq/1~{!!8GS"@?[t]`V|a_/s^~)}@*@6@#"Y~@rT~3aGrTc|#"aGcGBFc@~E|D|~_R_R_{ ~ @{¨{@!@_TC@9Rq T{?~q{__ R_{?}~}!!F _"5_ F_{|~{?֍!!HG _"5_ HG_{r{{{A; D`$@? {_{A; D`$@? {_!!G!@}{ t~ @{¨{S Te @SA@ @{Ĩa@@@T@9q@T}B@5SAR{Ĩ_{S[k@*a@Tcs|@9qT} 5cCsE R?R!SA[BkD{ƨ_֟T @@*sESA[BkDcC@{ƨR T!Ra@TqT~}@5cCRsESA[BkD{ƨ_{S[N~rTSA[B{è_ @@SA[B@{è{ { @{¨_]{`?@{#"!cGBF!Fc@}{ `}ҁ`@W!IT~`\}X}{qhT _BQ5b5"[ 3b@? @{¨~{¨_ \ }{S9mz`{``be!,bb>SA{¨_{S|@c} R`{T}S~{ |@@B"(@W#B_ T3@J{<};~ (@K ( _!!G!@~}{ z @{¨}_!!G!@l} `_ _{ } @{¨}{ { @{¨ҿ}_{ 8} @{¨ҳ}_{ { @{¨ҧ}_z_|{S3`:G@'ҀrT pG`[ R26R_`55qaT R@[B[B@Rs:G'@a@AʁSA{Ũ_ր@95@95!R R9[{*kTkT*_qaT5TRR@ Ҫ}kT5[ҷzO|"!BG!F|{"#A8GcpG$@҃_5C7B8G@@@ {¨_9@!@A{¨"R@ x}{{#"a8GBpG$@"R_57c8G@`@ {¨_֣@!@aA{¨@ X}9!Rc{@5@@@@T@@` @_A@ @_!T @@_T_ @__ @`@_A@ @_`T  @ @_T" @__ @C@ C`@C#@ T@#@ T" @_"@_"@_@C @C`@C#@ T@# @ T"@ _"@ _" @ _?r"? TAT`@Tf@'R ?@T"@@@ 5@@@_`TD@5G?T R _A ` @Ta D@T @G@ B@@b@T@E@`TD f@ @ @5GF @@TF@@`@T@ @TE f@% @EeF@&e@_`TE@ @_`T" AdD R _b$@D d@@ `@_`T@@@_T "@ @Aa  aa nalaAe@#@T@e@Td #@T# @@aT@c% @& "b@d @Te@Tb@de@f  @%@ T@@@T @e@gf(R4#@T Մ@q TC@Tf@e @5h_EEF@f&@_`TF@ @_@TE@b C @@qA Tf@@qTC@#@aTc!Ra_E @@@5_F FG@'@_TG@@_ `T F @E@@q T @@qTC@#E@ %F @#@de @c@%[$V @&Ef@@'Rf Ff@&@`Tf@@`T G@e#RE@@C @q`T G@E@g#RC#R @CCbC@#@_@TA@# @_T% Ez% @ @'RD@$@`T@ @ TH@$R F @ @D@D DD@$@_TA@$@_T& FI@q@TC@F @%RE$R% @#@# %&&& R`@@qBaT*_{]w#"!cGBF!Gc@y{Ow#"!cGBF!Fc@y{Aw#"!cFBG!xGc@y{3w#"!cGB G!z{Sv\zy"!BF!F;ylz&z{(9GS=#='=+=/=3=7=;=@7vx/B|cgc"˦DEJx҄vzBy"!BF!Fx-zy{Smvzx"!BtG!(Gxzy{SUvyu"!BG!Fxyy{S=vyu"!BG!Fxyy{S%vyWv"!BPG!Fxyy{A; D$@? h`{__@_@_@__@_h!8_@@_ @ TBT"@xx"x{ ` =yA?`Tu_@u{?<STT@?`T*v`@@ah!8SA{è_9@`@ah!8SA{è_֡x`@a ~v__@?HT_{  x@!!?CT_{x@a? _@_T@B?_ R__TB_t @99__TB_t @99_C?TA_*v9_B_TB_ִt @99_B_TB_֪t @99_B_TB_֠t @99_B_TB_֖t @99_{@?Ta?@_{S:G@' T[A@@Tb @_Tuj58[B@:G'@@ SA@{Ũ_ֿ@aT @99v@C5 6x`@@Tt#@v` Mtv@[v{c[:GSk@7+xBa @3BT@Tb @xa@T @9 9@T @Tt `@T#Thu8 k68`@@Tet3@:Gy` 7@@ `SA[BcCkD+@{Ǩ_s`@s`@9 k58.v{S@@Bd@ T$`e_@Ts@ˀh 8SA{¨_`hd8`h!8@ˀh 8SA{¨_@|@9_@|@9_@8u@CA_ T#@#@"|?@9_$A#@"|?@9_@CA_ T#@#@"|?@9_" A "@? @9_A?`Ts_{ tu @{¨_{S@ A?T`bBT@`b @ @`  9SA{¨_ր@` @` 9SA{¨_ւ@_TB@9`9c@@bh"8@9SA{¨_Isc@@@_@_@ _@ _A@!_A@!_@_@_@_@ _A@!_@_@_@__@@_`T@__{S@?bTҕA@Tb @_`T?<@ATva@b#`TAs@u` SA@{Ĩ_֟`TB3stSA@{Ĩ_ @99a@ra@@9`B9r@@@T@@_CT_{r{_u{Ds@?9_@_@_@_@?T@_{ Dv@?T@_{ 8v@_@_@ @_@ @_{S[6@A?@Tb @ T$ta@6h58ta@?h48SA[B{è_{S[6@A?@Tb @ T$ta@6h58t`@h48SA[B{è_{ $t @{¨_{Sc@A?TabBT@ab @ @a  9SA{¨_ց@a @a 9SA{¨_ւ@_TB@9`9c@@bh"8@9SA{¨_qc@@{ @?T_@Tcbs @{¨_@ah!8 @{¨_! ! u{"S@3s@SA{¨_{S@d3_ TBos@SA{¨_?9@SA{¨_@"!_s{E @T˗aA?@Td @TDT@T#daTqa@ T*Fsa@u?h58AB @{Ĩ_7h68ua@?h58AB @{Ĩ_sa@`hb8`h48a@ ` eu@*Ҡq@DTT@ah!8_#qR+u*@Ҋq{*# @q @{¨_@?Tdtq{ !! t{*#S@3`q@SA{¨_@?T˄뢐Sq{ !! t@B!Eq{*S@3:q@SA{¨_{ +@a@˟T#6A@Tb @_ T"˵'UbT84@A TpF T`@9j;8@@'@7TD T` TpF4@A TpFbTT`BThTaT`hy8j;8@@'@˟T@A_T@@'@a@v?h68@B#@ @+@{Ǩ_rlp@@'@@kt8@k$8`@9j;8x5`T^p@@'@@kt8@k$8`@9j;8@kd8@k48@@'@7Ip7@  'Dt@#@_TcSr{! !@ s@Fr{ @T@T@s:G?h 8@`@ `SA[B{Ĩ_@9 9@n@ -j@jl@Rl{ST[a:G"@ҟ>T@T@s:G?h 8@`@ `SA[B{Ĩ_@9 9@m@ i@6l@R"@B6n{?D@:G#@ҳ !TS˳>T@T3@:G?h 8@@  @@@@{Ĩ_@9 9@қm@ i@k`7+n@R"@B$j{RSA@Bj @El@SA{è_a@`Tim@Ri{?D@:G#@ҳ !TS˳>T@T3@:G?h 8@@  @@@@{Ĩ_@9 9@5m@ Si@k`7m@$@!@_TR"!Bj{! l@$@!@_HT"RB*j{! l@$@!@_HT"RBj{!@ l@R"j{S@ ibSAR{¨i@R"i@Ri{ @?TA @?T`˄Ri @{¨_ @ xl rl@ @__@ @__{ !Gb:GC@!Ts:G@`@ ʠ @{è_!pGa@A_#QC5?qT-l@"Qj! B0GB@i{!   Vl @{¨_! BGB@i{!   Dl @{¨_{Sc0Gd:Gc@@ks:G@`@ ʀSA{è_֓jkjl{ hDG@` @{¨_{ hG@` @{¨_{ h`G@` @{¨_{ hhG@` @{¨_{ScGd:Gc@@2ks:G@`@ ʀSA{è_Ejrkl{ jdG@` @{¨_{  jG@` @{¨_{ iG@` @{¨_"@B^j!G!`_h{ s:Gd@g@`@ ʀ @{è_ih{ k @{¨_{@ !G@`c:Gd@!Ts:G@`@ ʠ @{è_!pGaB A_#QC5?qT'kA_#QCi#@BGB`"_{  k @{¨_{@Sc:GB @d@@?֢@B^i@!G@`ATs:G@a@AʡSA{Ĩ_!pGaB A_#QC5?qTjA_#QCi@!G@`aTWk@!pGAa_"Qb5?qTjA_#QC{S[4sgraTbgchVSA[B{è_(j/jgk6j4j{h`!{`G~h _ _{S[b:GC@'ҁ! fij3hijs:G'@`@ ʠSA[B{Ũ_ ijj{S#[b:GC@/! f>jhyhijs:G/@`@ SA[B@{ƨ_hqjj{g{g{ h @{¨j{g{Bh{S[b:GC@'ҁ! figibis:G'@`@ ʠSA[B{Ũ_֜hUisj{S#[b:GC@/! fig hQi3is:G/@`@ SA[B@{ƨ_lh%iCj{|g{f{ pj @{¨0j{S[b:GC@'ҁ! fiYgi\fs:G'@`@ ʠSA[B{Ũ_2hOf j{S#[b:GC@/! fdi.ggh-fs:G/@`@ SA[B@{ƨ_hfi{g{,f{ e @{¨i{S[b:GC@'ҁ! g%ifhfs:G'@`@ ʠSA[B{Ũ_gfi{S#[b:GC@/! jghf5g}hfs:G/@`@ SA[B@{ƨ_֘gfoi{f{e{ i @{¨\i{S[b:GC@'ҁ! hhfBh|es:G'@`@ ʠSA[B{Ũ_^goe5i{S#[b:GC@/! thhZffhMes:G/@`@ SA[B@{ƨ_.g?ei{>f{Xe{ i @{¨h{S[b:GC@'ҁ! gQhcgggs:G'@`@ ʠSA[B{Ũ_fygh{S#[b:GC@/! g&h8gafgWgs:G/@`@ SA[B@{ƨ_fIgh{g{d{ g @{¨h{ g{*f{S[b:GC@'ҁ! dgfhggs:G'@`@ ʠSA[B{Ũ_քfg[h{S#[b:GC@/! bdgfe9ggs:G/@`@ SA[B@{ƨ_Tfg+h{f{~d{ e @{¨h{S[b:GC@'ҁ! _dwgffgs:G'@`@ ʠSA[B{Ũ_fgg{S#[b:GC@/! 4dLg^fefugs:G/@`@ SA[B@{ƨ_eggg{Bf{d{ "d @{¨g{S[b:GC@'ҁ! ed gffes:G'@`@ ʠSA[B{Ũ_ְeeg{S#[b:GC@/! :dfeeefes:G/@`@ SA[B@{ƨ_րeeWg{e{c{ (f @{¨Dg{" 8G[5@WS!c| c tc` c9g{ƀSѧ:Gad@C|ǛcCdDhd88"sT!`b*:G@@ASA{è_e{!S[cw@x@#y@`9s@94TqT@9?q@T?qT?q @9?qT7?X}@eqTs @959`KSA[BcC#@{Ũ_ce"_q T?*x}W7?8}@ @95T`8 @85 Ie"?q-T?*X} 7* 7*_`_*_{@ b@@?b@_TR @{¨_a@ @?k{¨_#@`TR_ @k_!lG!@f{ 6e @{¨b{@SB@:Gd@/@?֡Cf@sB@Tb:G/@@AʡSA@{ƨ_[d@sB?`Tpb.f{*[A:G"@' @dv`&b#<hTT@9`B9t:Gj48'@@A[B@@ @{Ũ_ҡe#@v` av@#@`d`7Kf_!!@a{! !@a @{¨b!@!@a{!@ !@a @{¨b{ Xe @{¨a #_@#_{ Qq *T!p H`8a eb~@ @{¨_bb~@ @{¨_{!8GS"@/[*bb@*B@@?c@sB@TaclGB|G!Gc@|dege@sB?Ta@@B@B@@_ _!G!@d!\G!@d{!G !@d @{¨d{!\G !@d @{¨d{acGBG!Fc@,d{S`rG/> e5>B`@_HTT@BT3TA@ AT`@@T@?`@>%srG>e5SA@{è_@`@@e@A&ccFbTac\GBG!Gc@c?@Tdd{SrG/>d 5sB@Bs"a>!|@C@T2@bT@@`ҔrG>d@5@SA{è_/>sB@s"a>!|BB d@<)Teh!@@@C@EҶ@>`c\GBG!Gc@pca?@T[d~d{ /s>`@`c @{¨_{ sa||9|:|;|<|=|>|? @{¨_~@:d/!>"@T! @BCTb{Qa@|||||||{__d/!>"@T! @BcTb!G!@Xc{ rc @{¨ҽc!G!@__!F!@>c{ a @{¨ңc _!G!@*c{ 8a @{¨ҏc{!b@Rbc{!`@Rbc/!? _"5_/?_{/8G"9@Ң5 R ?9bS@[`@9dLqswcF!@b7@@4_FB!c@b7@4b_Т!cFS[c@ba,bwbТ!cFc@bS[a?T`b@!@ ?Fbc@ybF!@m_F@R@__aJb_a_@c@_@_{Sc:G0Gd@҂@@!G@`aTzbs:G@`@ ʠSA{è_!pGaB A_#QC5?qTbA_#QC0a{ b @{¨B_!DG!@a{ a @{¨2_!G!@a{ *_ @{¨"_!`G!@a{ _ @{¨_!hG!@a{ ^ @{¨_{Sc:GGd@҂@@!G@`aTbs:G@`@ ʠSA{è_!pGaB A_#QC5?qTbA_#QC`{ 8a @{¨^!dG!@b{ b @{¨^!G!@b{ b @{¨^!G!@b{ ` @{¨^{B0G B@V_ @{¨_ִaEb{ 8`DG@` @{¨_{ ,`G@` @{¨_{  ``G@` @{¨_{ `hG@` @{¨_{BG B@_ @{¨_ִYab{ `dG@` @{¨_{ `G@` @{¨_{ `G@` @{¨_{?D@:G#@ҳ !TS˳>T@T@9 9@@:G?h 8@@ ʀ @@@@{Ĩ_֡sa@ ]@_``7b@|@9_@" @B@"@" @B{ \_ @{¨_A?`T]_@CA T#@#@"|?@9_$A#@"|?@9_{Sc@A?TabBT@ab @ @a  9SA{¨_ց@a @a 9SA{¨_ւ@_T!]c@@bh"8@9SA{¨_րB@9`9c@@!@`{B0G B@&] @{¨_ִo`a{ _DG@` @{¨_{ ^G@` @{¨_{ ^`G@` @{¨_{ ^hG@` @{¨_{BG B@\ @{¨_ִ-``{ N_dG@` @{¨_{ B_G@` @{¨_{ 6_G@` @{¨_@__@`_@_@^_@c^CT_{ *`@!^!?CT_{t`@^a? _@T^?_ R__TB_U\ @99__TB_O\ @99_C?TA_*^9_B_TB_6\ @99_B_TB_,\ @99_B_TB_"\ @99_B_TB_\ @99_{@?Ta?@_G_!G!`_#@BGB`"_@_@^_@"^!_@_@_@^_@"^!_@_@^_@^__@__@^_@_@b^?bT`_{f_@_@ ^ _{@^ TcsT[ @{¨_֡hd89 @{¨_! ;_@b B@B6"@D ф@D6_#_{ _ @{¨_{ _ @{¨_@_@__{[@Ղ^@ [B{Ũ_iT7@9TS4ҸT# ]% 4TT*^@#@SAcC[B{Ũ_ ˹#@SAcC@SAcC#@c^/^{S>[@SA{è^{ @c^_"T!`b|^` @{¨_{@ ^HT˴]4`SA @@{è_@ @A{è_#@c^\{SZ@SA{è\@!^h`8_kTAT__C{[@S^_TsTjs8^ @SA[B{Ĩ_@SA[B{Ĩ__#@c^[{SZ@SA{è[[{@ Ă^d@ TѴ`ѳjs8] A @@{è_@ @A{è_#@c^=Z{SdZ@SA{è,Z]{@^_"T  sTjs8]  @@@@@{Ĩ_ @@@@@{Ĩ_#@c^^{S"Z@SA{è^@!d^_T B_T`hb8k`T__{@ Ă^dџt js8I]`3A @@{è_@ @A{è_#@c^[{SY@SA{è[@!^h`8_k`T__{@!@S^4^낒b$\ 5s{@*TaSA{¨_{@ ^?Tsa@s4^낒s{@*Ta@ @{¨_[@4@ @{¨_! ]{@S^?Ta@#^TcӐt낒s{@*TaSA{¨_![@4SA{¨_! \! \{[@S;Y^[ 5s{@*TaSA[B{è_{[@ ӂ^?hTssYs{@*Ta[B@@ @{Ĩ_s[4[B@@ @{Ĩ_! y\{@S^?HT볐bs{@*TaSA{¨_H[@4SA{¨_! Q\_G_@@|S_@߈qן___BGAT__`9_`_{ TdT s"`@"STs@,@ss`f\ @{¨_ !f\cGc`_{S5[`aT`9GT@SA{è_*Z`9{R ҙ\` @{¨_{ A\` @{¨_ֈ\vXBpG"@b_DQd5_qT_@CQ_qlT[BGAT_BpG"@b_DQd5_qT[@CQ{@ !G@`c:Gd@!Ts:G@`@ ʠ @{è_!pGaB A_#QC5?qTi[A_#QC Z{ `:G@@" @߈qT `уGTGb@s:G@`@  @@{Ĩ_"`G_`T???9cpGcA_#QC5*_q,T,["_CQ#Y{s[S@`;G@7ҁ_w˂^#BST ߈qT' [`@T @9@c9@3@`aG!T@'@sGbT`;G7@@ ` SA[B@#@sE{Ǩ_֣byA@T@ht8@k98@;W@6W@dT`TyT+W@ bsGT ׂ߂j78!pGaB A_#QC5?qTZA_#QCht8h98@'BY@!GD`џTA !߈?qT@__{ Xb@ @@{¨_@! !@A7|X_@C c@c7{ rXb@ @{¨__@C c@c7{ bXb@ @{¨__{@ " B@7PX@@a @{¨_{@A !@7 >Xb@ @@@{¨_@# c@7{ .Xa@ @{¨ ^ _ ^ _{@ " B@7X@@"^!a @{¨_{@ # 3^sc@7X@@  @{¨_{@b^?T a !@7W@@` @{¨_гSY{@c^ ?hTd҂X @{¨_! Y{"S@3X@ SA"{¨_BaT_{S@3W@ SA"{¨_{E@^SHTW@ @T*W@SA@{è_6h58SA@@{è_` Y@*Ң^5V{*#@ B^+V @{¨_@dÀ^?TV{! oY{*#S@3 V@ SA"{¨_@^?T˄뢐U{! KY@B!U@*!U{S[_W@  TUSA[B{è_@9 h58SA[B{è_{ _`@^T?T?T @{èX ߈qT%_HT_TPU`@@ `!G_!T @{è__TCU`@@a@99`@h$8@ 9Y{ W @{¨_%@^_T_BW{!@ X{S6USA{¨|W{S(USA{¨nWlW{@ŀ^? TH T_T_)T@@{ĨRX ѥ߈qT SˣҩV@@%iT?TTD@SA{Ĩ_֟`T$TT`a_@T@hs8h58hs8h58`hd8`h68@!@9h58T@TT@S XS! 2X@!UB@E^TB룐U{! X{ST@SA{èUC@c^U@"^A?T"%V{! W!GaT`_!pG@!@"_B"c4{S@@a@Wb@`_T`b@9b9b@GTSA{¨_abTb@GT`9SA{¨_{S@a:G"@_`T^`ѵ[c b V@!G@`T[Bs:G@`@ @SA{Ĩ_ !߈?qlT!pGaB A_#QC5?q TbWA_#QC[V@"~_CT_{jT{_V{IT{!@S4^T@`_u^ TRTc@@b^`T @9`h"8a@G"`_T@@SA{è_` ߈qTS5??h58@U{$@ ^_hTsss@V~v"TT@@C^@Thu8@h#8@G"`_TBA @{Ĩ_@ ߈qTKS6??h68Ba!' V{ @^!_T_U)TT^)TSc@a^`T@9`h!8a@G"`_TA@ @{è_ S !߈?qTSc@v5??h58A@`'VnT{SSSA{¨`T{SSSA{¨RTPT{ !Vb@U^?(T@_5TlSb@A^@aTVh!8a@G"`_TA@ @{è_@ ߈q T*jT5??h58A@`'V@?e^hT?TCT_ҢbTB!R{!VRsR{S@[6~T !߈?qTS`@^!Gh"8b@@`TSA[B{è_T_d9SA[B{è_{S@[6~T !߈?qTR`@^!Gh"8b@@`TSA[B{è_T_d9SA[B{è_@d@7G_T@`_ATpG`_`4@@@{S!@b:G `D@@b@7BGTs:G@`@ ʠSA{è_֡TpG`_`4 _ (T{S`:G@5@@?Tb@b@7DGTBG `aTs:G@a@A!SA@{Ĩ_ҡS@BpGB@"_CQ#5_qTGU_ `B`T"_CQ#pG`_`5@`!TShU{S[:Gc"@'QG!`a@!^+RRtS:G'@@ASA[BcC{Ũ_֨Sa@G ``THzU{S[:GGC@'!`@!^!Q*!Q@S:G'@@ASA[B@{Ũ_tSa@ֶG ``TFU{Sb:GC@?RSs:G@a@AʡSA@{Ĩ_MSЁ@BG ``TU?T{S3T`TSGT@SA{è_cGc`_ր@9b9P`9{ RR` @{¨_T{ 3ZT`TsGT @@@{è_ր@9b9cGc`_P`9` U{$@^ _TRT` @{¨_ ,T{S%@s:Gc@Ҡ^cTR!sT@`@ @SA{è_! TR{@^ ?hTR @{¨_ @ S{&@ ^_TR!8T` @{¨_! S{ R$T` @{¨_T{ 3S`TsGT @@@{è_ր@9b9cGc`_O`9` UT{ !RP` @{¨_{@:G@7^  Tssˢ( T?T?IT#S:G7@@A! AB @{Ǩ_"߈qT HT7'hQ@'@@A`TO?T!!7c'O'@3@R3@!G`@TQ@hw8@h68 jS! SQС3@BG ``T:lSd@^Pc@f^TcĐP{! R{S[WOSA[B{èP@B!Pd@B@^!P{S[7Oa@SA[B{èP@B˄!ˬP@B˄!˦P@B!ˡP@B˄!˜P@B˄!˖P{SOaRO@SA{è_{ !RO` @{¨_{ RxO` @{¨_@ @__@ @__{S!@"t@tO4!"oO5A!)OSA@{è_"!`"]O4" R{S:GC@!!JO!5, ‭a!xA !az aTNҔ:G` @@ `SA@{Ĩ_ֵ@R}N@94@|@@@94"QP Q8qiT_p#H`8d E)kTR@| (h$_b_d@T @ Rd@9HqEzaTHqP@@T c RP_֥c RPB{S[$`@Q8qTSA[B{è_րJ`8a s @sSA[B{è_s@b@@@qT@b@s @@b@_ {S[6@c Q9`?`@#c`uj!8u"9T@9Tccuj!8u"9TSA[B{è__ pQ?qT8Q0q Az_ R_@d@9qTQ!?$qTRcR !  d@8QQB_$q TRqK*_bd@9Q!?$qT&RR*_E)_kT{REB| #@$R `g%(dh"|@{__  @ @9|q TqT{`1T @"@9_|q!T! {_!R __  @"@9_PqT{! 7A@ E)BA?kTR@%R!|"|@`)dh!{_{__ {`xqT@* @|@cT@@ 6Ca8q T?$q E)mTE@D(TD @9 RRqFzEzTD$@98qT k TR@|#(h#${_ ?$q E)-T{_P@kBXAKP TR@(|!RB@-`h! @@9 %@?qT{   a Rl @@9?q`T % {_ %_  @@9_Lq Tb @94b @9EQ_|qIz(TR_|q T`9@kT`A@b@`A@Xa_R`@!q C!5`R _kTT@9_kaT@aE)?kTb%5@@bQ@ҟkB bQmTRb@&!|$@f)Dh!a @!@9?q T_dqT_` @@9 QqcRa  FQ*A !QB $qhTAQRk(Td @*@94e @9_|q`TEQ! @ @ Rh@ 0@&|)!_a) i&EJb%{ U@a G)?kTc@"`!b9{_{_@QdqHTt @"@9_|qT!R*_{  @9|qT`TR6*{_!R*{_!G7$qT @R@9_|qT!R R@9b R R?q$Cz$Bz"RaT*_R?qT@9xQ?<qAz⇟*_@@_qT?qT @_q!T4@!Q@_aT@__@!@@@@7!R0_{S`@qTHTqTHTqTa"@?q@TSA{¨_ֈT`4a@s @qhTqTqTqATs @S`qTqT q!Ts @3qTqT(QqT_ {S[@@!B@ T4SA[B{è_c@`TK`@h!8`@uSA[B{è_֢5TTT`@gMb@`t 5`@N~ R ` 5 @@94 @9{?qT?qTR{_R_`q @@9?|qT i`f @@9?|qAT R  {*Cc+ ";G!R#@74KK`a@c Q9`?`@!a`uj"8u"9Tjt8?T!auj"8u"9TA@;G7@@ @@@{Ǩ_ִM { @S6;G"@?b@9_k@%Tk9@-7R+7uV@wV`@90q TPq TqTqT`@9q Tm`$@qTq Tq T`@@9?|q$TQ!?$q5T !`@@9?$qTuVR$c@@`@9kT;@cc;G?@@AA1SA@@kD+@@@{Ȩ_`@9qTqTccA R uV `ER` @qT-TuV```@9PqTc Rc` E)kjTRb@R|%!|@[d*Ch acR@/|@@@Qc cRL4@qTT qTqTz! .L4@@9q#TqT@@9! RqAzaT R-`@@9?qT?q@T?qT@9q T/@uVs@@9 RqAz@TR7@L@ 5 4RzRu/@{c/c8 `@@9?$q@T!R`/@fA ?x@ TA@9?kT`@@9?|qATR``RB5ҡR:Ac ?@!@AASA@@{ȨR*/@R%,uVS|5/@/@6`R`@@@9?q@T@@9qT)!-K`4!-K4!.K 5`@@9?$q@TRR/@@9QQ!?qAzT R^naaRAR!R/@VSP`R@@9?qAT`R"//KksKqT`@9qTccKqRAzTa@9?qTqTccRRhoc@`@9 4 @a@9?0qT?PqT{?qST?qTa@9?qTa a@9?Pq!Tc R ` E)kjTRb@R|%!|@Td*Ch *a@9?qT?qTV @q@Tq@Tq T`@@9?|q &TSAR{è"QB_$q T@`@@9?$qTSA{è_ֵ[@!bR@@@cQB bRJ 4@qT T q TqaTU! .J 4@9q@$TqT@9! RqAzaT Rp`@@9?qT?q T?qT@9q T[B SA{è_{ ` SAR{è?qAT`@9q!Tccc ~`@@9?$qaT`R@!RSA{è~ _x@TR[BSA{è(aRAR|!R @q`TT`5SA{èRl@9 RqAzT@9?k`TR!-]J564RVR`@@9?|qTR`[B)ccSAA R{è:5[B@@@9?qT@9qTR!-%J4!- J4!.J 5`@@9?$qTRR@9QQ!?qAzT:Rao`R|[B`6R@9?qT`R[Gh?qR$BzTb@9_qT?qTccRCSAR{èc@`@95{[ @:G$@a@' A@9?q@TCc7R?0qTT!$Q?qTGR b@@A@9?qTB#@bv&?`qTBxV@bwVxVa@"@9_qAT!a ҵ:G'@@Aʁ@cC @[B{Ũ_B '@a@A! @[B{ŨRJHcH  @A@9!$Q!?qTB _ { @S:GC@7"@9_LqTI T_Tq`T_hqT! RL@@9?qT@9?q$T?q`!T@q@TqT/H/@41TE)k TR@R|!A?*Dh #6AR@ յ:G7@@A!#SA@{Ǩ__8qT#! "RҸ'@ RS@9 ճ4 Rq`TaQ`Q!?$qYzTqdWzdVzTz@NqS@9@TqTG)k*T@z :S@9t@@9$qTS G)?kT@"s!:SR"@9_qTE)!kTR@*|!cR!.S_h acF!RsR@@ R @9$q!TG)k*T@S :R@@9$qT@k@@9xPqT!R@S@9ZBR =!R!R2yNq@T&q`TRq`Tq@ T6qD @T@S@9TBҺ'@?C.@S@9JB@'@ҹ#@$*7@q TqT54E)kTR@*|!R!@.C_h adAR:3@3@@9q!T@'@BC3@'WG{S:Gd@@7(5@9 Q(qT Ք:G7@@AAZSA@{Ǩ_B%@X`xb@ R `@@9qaTC @3@!|Q?qTb`G)k Tc@b a:3@@@33@dRu3`G)k*Tb@U a:3@dҁR`3dART3daRH3@9Q|q! IzTQdqH#TR`@3@9?$qT`R)3'v@3@9$q@T@d?`@3@9?$q TG3@!R 3!QbE)` !|{_kjTRc@F'@B| `R@Ru f*eh"d`R9d!ҡR3o`@94`@9q@.TITq'TTq+Tq@(TqT`E)k TRbR@R|!c@!`!BuBCe*dh bR^3?dR33k3.e@9|qTQ$qiT#c @9Q$q)T`E)bkjTRd@|'f*b4h  @9|qaTeARp3d aR_33@} qTI Tq !T(TqT`E)kTRb@c*|!!.RU_h `Z@5u)aG)?k )Tb@ U!`:3@@9!$Q!?qI$TR(@3Ҫ3@`q!Te`oR3 RvV@`VvV"e@@@9qTqTqT`E)kTRbR@R|!c@!`! B u-qT`E)kJTRa@R|%5c*3"h @9Q$qᇟ"yT`bv3@3@ @`bm`@R@94a@9q3@&y cx:@wB@uR@#`y*@ a@!@9?$qTvy*x:wBuRBC3@4`E)kʽTRb@|!c*R!.XA R3`E)k*TRbR@R|!c@!`! BDue*dh bR`E)kTRbR@R|!c@!`!B uҶ} `E)k*TRbR@R|!c@!`! B$u`E)kJTRbR@R|!c@!`! B(u`E)kjTRbR@R|!c@!`!B$u@9|q` T`@@9?|q!T`cR&3PqaTuV@ R`VuVAR3`@@9A4a@9qTv/_/@3@bG)_kTf@ER"e:3@B3C}@7 vV@ Rd`VvV@BC(iD{ @"@94" "@9&@95 RЄ`cRRR`K|@  |'hbE@9kT T*?kT{¨_B@9_ kT E)k T"@|'#R@!)Ch'{¨_RS" q*@9!THQ?$qT!E)?k TR$#@!| `$)SADRdh!ߌqR@AzTJ)?qXaZ@5aRutZSA{¨_ցRnSASA{R @S:GC@' @9q@zBz@T[* RHqUzT @9q@TREa@@ @9q@zVzAT#@@[B:G'@@ASA@{Ũ_ֵ[B@"@_qT!@"@_$qT!@bR@[BAKaR[C {_qS[`RcRd@k@RR@9 RR*:Rl4`q TXq T,q T@9`4`@9q` Tx?<q TaR@<q $`RA T+{V@zV{V `@@9?qa T+@` R`SA[BcCkD{ƨ_`R@*$`Rd@ @9(5q9R?jT`TRRR lq`TdqAT"T@@hqT`R@*$`R`R@*`R`R@ҁ RD`RqTaR@!aR!`@@9?q!T R` R+@ {S @@9_(q@T4!RSA{¨``SA{¨_ @"@9_qT{"  "@9_dqaT! !Rea@"@9_qT!a @{¨_ @{¨__ { @Sa@9"QB_$qT"QB_dqHT?q@ TG@q`T`@@9?q@TSA{è_" QB_q T?0qT?Tq Ta@9?qT?q! Ta a@9?qTc @7a E)d@?kjTRb@&R!|#|@cG)Tkf*Eh!Ta@`4#`:@9 `@@9?qTSA{è\@cR@!/@c@c cRB5R`@@9?q@TR?q@TSA{è_`@9qTcc$@@"5@aR@! aRa@9? qT?qTa@9?qTT?qTBR?qTaE)ee?kTR%d@!|&e* Rh! a@9qc 5_`qTa@9?$q T?qT T?q@T?qTcURca E)?kjTR#b@!|$Tc*`c@RDh! @a@9Ba a@9?qTc `@@9?qaT`. 7a E)d@?kTRc@&R!|"bG)t_kf*eh!Ta@@4"`:@9@9`@ҵ@@9 a@9 ```@9q@THTq`TqTc URcK`&@?qT?qTcRcRjbRh"Rfq@TqTc Rcc5Rcҵ@cRccuRc~a@9ҵ@c 5Rcc uRcc Rc`@@9 { R @S*A@9?q$CzT5`@@9q@z@A T@SA{è_`@7@pQ?qT Ք@@pQ?qTqT @B@@@A5 P@aPPA@9?PqT?qTA A@94A A@9?Pq T T?q`T?HqATUVRh@SA{è_A A@94A A@9?Lq"TT?\q!TT?q T?qT?qTR4R 4R!RZ @qh Tpq Tq T!@ @Q qhTqT_qT!@ !R>?Xq`T?qT`qmTa@"@94(h!@9?|qaT Q R R@94?qa T@9LqT|qTqTaE)h@?k Te@$|+!) Qa*h$`h R?qTR qT RaR@SA{è8Q0qTCT_qT!@? qT T? q T?qT'RA@94A  A@9?qTR  R?PqT?XqTc<P!RҁR! ? k*Tia8!qd@z!T`E)kT`@$de@|+`*`@)Kh!h$dhraRRR?$qT?(qTARRnRl`b3@7`@@9?|qT`aR@!aRaR{ҁRv4RRm`4RRd/ҡR_ҡRZc(PARSR! RM @A@9?0q T{AD R  C@9|qdDz!T|q T!aRea@"@9_q!T!a @{¨_i@@?qTe@R@9qTbR@9q@TC4c4cd@9qaTdKbE)_kJTRGf@B|#@zg*Th"eda@"@9_q T @{¨_AaB@9_kaT@"@b4!@bR@AKaR_R {S:G*@Ңv2AV5@@<q T R[B`2@:G@@ SA@{Ө_֠ @@q7T[BC R`2!P(!X`xbA! ָC9#6a@c Q9`?`@!`axj"8jx"9`Tjy8?T!95a@c Q9`?`@!`axj"8Zx"9Tjy8?T!b;:a@c Q9`?`@!`awj"8w"9`T@9?T!;"a@c Q9`?`@!`axj"8?x"9 T@9?T!9:a@c Q9`?`@!`axj"8rx"9 Tjy8?T!9:a@c Q9`?`@!`axj"8vx"9Tjy8?T!b9*a@c Q9`?`@!`axj"8?x"9`T@9?T! @#c+"!R#<g<va@c Q9`?`@!`awj"8w"9Tjv8?T!a@"@9"?ATc Q9`?`@"`buj!8u"9[BC@* @* [BC@RVn@?qT@A@ @/Qv:*| _k T7 a@d Q9?`@!`a{j"8{"9T@9?T!@@qTqaTa@?ATc Q9`?`@` `R`j!8`"9*@E a@ ?ATc Q9`?b@ Bb` R`j!8`"9*[BC@*[BC9c7a@c Q9`?`@!`axj"8&x"9Tjy8?T!9c7a@c Q9`?`@!`axj"8&x"9Tjy8?T!@"7a@"@c Q9`?`@!`avj"8v"9 T@9?T!@* a@"?ATc Q9`?`@"`b`R`j!8`"9* a@"?ATc Q9`?`@"`bR`j!8`"9[BC@* @&v@iTj68c Q`?`@`7 c Q96`?`@`vyj;8_y"9T@9T&y 5@` A@?T*m `@aTc Q9`?b@!BbaRbj 8b"9"y46c Q9`?`@!`avj"8v"9T@9?T! @`R;a*{cC5 {@5*[ 7@[BC``R$KyST@@dQq(TT6R*@!@!dQ?qHT@5qh8T~{! @"  A" $k%a@` @* x@@ 5qTQ QR!{ 9ֆ"^* aTc@"*[BC<"9:a@c Q9`?`@!`axj"8x"9`T@9?T!@*֢;" a@c Q9`?`@!`axj"8?x"9T@9?T! @@?qT@@q!T@B*xU5@! .#@@`@X@< a4!`8#@*)a@?ATc Q9`?`@` `R`j!8`"9*r `*[BC@R"@_q`Ta@?ATc Q9`?`@` `R`j!8`"9*@P a@?Tc Q9`? Ra@`9`"9! Ң@`a_q`>T"qT @*8 [BCvc@(7@Bw16B*G [BC@׬7@w<a@c Q9`?`@!`avj"8v"9Tku8?T!c6A@@5R?qTd@?qT@_k`T?q#Ta@;{C`@* {@47@`6[4[BxCB1Ba@c Q9`?`@!`axj"8?x"9bT@9?T!91a@c Q9`?`@!`axj"8Jx"9 kTjy8?T!95a@c Q9`?`@!`axj"8Vx"9 dTjy8?T!94a@c Q9`?`@!`axj"8fx"9`Tjy8?T!9#4a@c Q9`?`@!`axj"8Zx"9[Tjy8?T!93a@c Q9`?`@!`axj"8Nx"9WTjy8?T!ւ3>a@c Q9`?`@!`axj"8?x"9ST@9?T!93a@c Q9`?`@!`axj"8jx"9OTjy8?T!92a@c Q9`?`@!`axj"8Fx"9`KTjy8?T!9C2a@c Q9`?`@!`axj"8Vx"9`FTjy8?T!d@Ҡa@;{C`e@k`T!@"@5"@B@CdQqTR@a@c Q9`?`@!`avj"8v"9sTku8?T!9c5a@c Q9`?`@!`axj"8Fx"9 =Tjy8?T!@* [BC@a@е9c Q9`?`@!`avj"8v"9oT@9?T!`6A 5"&Z@?qTu@*@c_ Cu[B@y@x@u6@5@qT*L `"D9q`Ta@?Tc Q9`?`@"`bR`j!8*`"9 @5 `"D9qTa@?Tc Q9`?`@"`bR`j!8`"9[ByxCx@x@#e@'R@@XZ_*E 4@6B_qAT'@d R[BC`2X@*6a@"?ATc Q9`?`@"`bR`j!8`"9 @@q`T*[BC7@wj7a@c Q9`?`@!`axj"8x"9 {Tjw8?T!b0"a@c Q9`?`@!`axj"8?x"9T@9?T!"0.a@c Q9`?`@!`axj"8?x"9@T@9?T!a@?ATc Q9`?`@` `R`j!8`"9* @w[BC @*p[BCB16a@c Q9`?`@!`axj"8?x"9@ T@9?T!90a@c Q9`?`@!`axj"8bx"9Tjy8?T!@*"/2a@c Q9`?`@!`axj"8?x"9 T@9?T!kST[BCD/@n[BCk@* [BCd@*[BC]@*"1a@c Q9`?`@!`axj"8?x"9T@9?T! @*[BC8@*[BC1 @*a@"?ATc Q9`?`@"`b R`j!8`"9[BC@*[BC@*[BC @*[BC@*[BC@*[BC@*[BC@*[BC@*[BC@*[BC @*b1xa@c Q9`?`@!`axj"8?x"9T@9?T!@*][BC@*V[BC @*Oa@"?ATc Q9`?`@"`b R`j!8`"9[BC@*7[BC@@9QdqHT"?ATc Q9`?`@"`bR`j!8`"9@@Q|@!_8?qwa@c Q9`?`@!`avj"8v"9T@9?T! @*[BCQa@b@;`@@@q cT*`@7@[BC`<@*a@"?ATc Q9`?`@"`b R`j!8`"9[BC$@c+!R"ҵ#t5Z5a@c Q9`?`@!`awj"8w"9Tjv8?T!"?ATc Q9`?`@"`bR`j!8`"9[BCc6A*@cc6B; `6Aa@Q`6c Q9`?`@!`awj"8w"9T@9?T!@c+!R"ҵ#54a@c Q9`?`@!`awj"8w"9Tjv8?T!"?ATc Q9`?`@"`bR`j!8`"9[BC@*1[BC@**[BC@*#[BC{@*[BCt*A'[BCl[BCi[BCf @u@*`@@ST[BCDZ@X4/y*c+!R"ҵ#44a@c Q9`?`@!`awj"8w"9Tjv8?T!"?ATc Q9`?`@"`bR`j!8`"9[BC@7a@c Q9`?`@!`avj"8v"9Tku8?T!6c Q9`?`@!`avj"8v"9T@9?T![BC[BC뉇T R˷@9 mT~qTa@"?ATc Q9`?`@"`bwj!8w"9T[BC@9|qT @9TqTT*|@9@T @9Q#$qTQ!?q~TQa@9c Q9`?`@!`avj"8v"9T@9?T![BC0a@c Q9`?`@!`awj"8w"9T@9?T!@c+"҄!R#33ya@c Q9`?`@!`awj"8w"9Tjv8?T![BCF[BCC[BC@[BC=@@@@@9?qA/T@9QQ!?qAzH.T*C a@?ATc Q9`?`@` `R`j!8`"9* @B@B!8L @*B@a@?ATc Q9`?`@` ` R`j!8`"9[BC@!7@5@`5? qoT?qmT!75*`c4!-5`B4*!75N4!55a@?ATc Q9`?`@` `R`j!8`"9*ca@"?ATc Q9`?`@"`b R`j!8`"9[BC`@a_Tc Q9`?`@R!b9`"`@!WTc Q9`?`@R!b9`"B*G@S*&[BC~!@6@4q)OTqT @"@5"@q@Az!T @@9q TqaT!9[BCb֢6a@c Q9`?`@!`axj"8x"9T@9?T!B/ a@c Q9`?`@!`axj"8?x"9`^T@9?T!B@*`@`7@`b"D9a@_qBTaTc Q9`?b@!BbaRbj 8*b"9@B@`"D9q<Ta@ ?ATc Q9`?b@ Bb`R`j!8`"9[BC[BCa@ ?ATc Q9`?b@ Bb`` R`j!8*`"9 @a@ ?ATc Q9`?b@ Bb` R`j!8`"9[BC[BC`@BT[BCDB*;:5@@?q JT@!-@y4 @"@5@@ qNT*@! 8@@i4B5a@?ATc Q9`?`@` `` R`j!8`"9* @B@.a@?ATc Q9`?`@` ` R`j!8`"9@@?qET[BCqbq9TqT @@q0TC{өC#c_q0TBQccZB{&@`>Af`?$i"@i"h"@5 @*@q<TUQR:c*f" @5a@ ?ATc Q9`?b@ Bb`@vj!8*v"9_T[B'@xC#@*[BC!`/R@!&bҡ!/I@#c R`j!8`"9@qTSTd Q9?a@ !a`R`j#8`"9[[BC`@*;{Cd{@7@a@!5a@?ATc Q9`?`@` `R`j!8`"9c@FRc @@qaT@ @?(qT@, G@?qFT@FR@_qT@@! c *[BC R[BC`2fZAg@qT@TQ@$P$"A TaTa^Ak,T||fZB d@h!2ajAenA?kJ+Tf@'@gj!%A@[BCu[BCr@*b!9[BCf[BCc*[BC\d@@T"@_ T_AT!@!@x@a !#R@?q@ T*@@!/15 @*B!/ia:A 7wfh[BC$a@?ATc Q9`?`@` `R`j!8`"9 ?ATc Q9`?`@` `Rbj!8b"9 @!@5q(T @*q@&TITq )Tq,Tb!8'[BC[BC[BC@D'@aRbj 8b"97[BC @*wx@4[BC6 @@c@?q T*[BCQ!?q'T\Q{ѵ[BC{DaRbj 8b"9@ҭ[BC;`O[BC @[BC[BC[BC!-Q25 @*B@ @**[BCv[/1@@?qAT @!@?q}7@`@"@_qT!@!@9?q!Ta@?ATc Q9`?`@` `R`j!8`"9@[BCG@@?q T[BC@a:A 7*@H4[BxCC@@@q`T R`2B@*q R[BC`2$ qTqTa@?ATc Q9`?`@` ` R`j!8`"9[BC a@?ATc Q9`?`@` `R`j!8`"9[BC@@9q T[BC_ N @*e@?q*(** bҡ!@8*[BC[BC*?B!8[BCa@?ATc Q9`?`@` `R`j!8`"9B!8[BC'@bDa@?ATc Q9`?`@` ` R`j!8`"9[BC[BC[BCRc *a@TT_XzATTW?ATc Q9`?`@` `wj!8w"9 m!8[BC\{ c:Gd@'C@qT@ R2s:G'@`@ ` @@{Ũ_cC@ @#@Q@0C@c Q0qIT{*S[*Xcxd#`ֶ"=c@c Q9`?`@!`awj"8w"92T@9?T!SA[BB@{Ĩ;@c Q9`?`@!`auj"8&u"9Tjv8?T!"<@c Q9`?`@!`auj"8&u"9`Tjv8?T!b<@c Q9`?`@!`auj"8u"9 T@9?T!@aTc Q9`?a@!aaRbj 8b"9E@aTc Q9`?a@!aaRbj 8b"9G@aTc Q9`?a@!aaRaj 8a"9* @SA[B{Ĩu7@aTc Q9`?a@!aaARaj 8a"9SA[B{Ĩ_@"?ATc Q9`?`@"`bR`j!8`"9SA[B{Ĩ_@B= c Q9`?`@!`auj"8u"9T@9?T!b="@c Q9`?`@!`auj"8u"9@T@9?T!=*@c Q9`?`@!`auj"8u"9T@9?T! D9q@Ta@"?ATc Q9`?`@"`bR`j!8`"9@*=a@c Q9`?`@!`auj"8u"9T@9?T!>c*@c Q9`?`@!`awj"8w"9 T@9?T!ւ<@c Q9`?`@!`auj"8Fu"9 Tjv8?T!cҘ@<c Q9`?`@!`awj"8&w"9Tjx8?T! @"#?aTc Q9`?`@#҂ @`cR`j!8`"9*a@"?ATc Q9`?`@"`b R`j!8`"9cCSA[B{Ĩ_ւ@SA[B{ĨcC {S[*c`@ 5 @@qhTqbTdqcTlqiTqT`"D9a@q T? Tc Q9`?`@R!b9`"SqTq`T!@ @`4 w@R*r`@ Tc Q9`?R`9`"9!`@@a` *a@?! Tc Q9`?`@"`b R`j!8`"9*#RH[BwSA@{Ĩ_ `Rbj!8b"9 ?Tc Q9`?`@"`bR`j!8R`"9*w@%a@?aTc Q9`?a@"R b9!aaRbj 8b"9@`"D9a@x_q Ty" `"Rbj!8b"9 {:G*@G2A5 *8R2A 5`@5b@C@5*5@q`@xTqTqT*9s@ @@C:GG@@ @B{ɨ_c@B@* @@Cc@B * @@CB@*@6@"?AT Q9`?ր@"Rj!8"9`@@`@qT+s@`@5* @@CB/@ ' Q9`?ր@!j"8"9T@9?T!'@b/6@ Q9`?ր@!j"8"9T@9?T!d@c+!R"Һ1++@ Q9`?ր@!j"8"9TXku8?T!/ Q9`?ր@!j"8_"9T@9?T!s@D`@| ,{ [*  @4@*R@a@?Tc Q9`?a@R b9!aab Rbj 8b"9@?Tc Q9`?`@"b` R`j!8`"9 @[B{Ũ_@@q!TR*@`@ATc Q9`?` R`9`"9!`@@a`*a@@"b R`j!8`"9 @[B{Ũ_b@9 c Q9`?`@"b`xj!8?x"9T@9_TBbxj!8x"9?TR*x`@Tc Q9`?`@"Rb9!@cC#@` `Rbj!8b"9a"Rbj 8b"9@cC#@i D@q@T{ @@@b@c Q9`?`@"b`uj!8u"9Tjt8_TBbuj!8u"9TA @B{Ĩ_{C@ q`AzTqT*@?"!TQ9`?`@"`bR`j!8`"9*>a@"?ATc Q9`?`@"`b R`j!8`"9A @{è_ @{è%B@B@D@9q`TR_{c@c[w@'z@ C@qaTX @Z@*v:A`:@@9HqTITqTq Ta@"?ATc Q9`?`@"`bR`j!8`"9*b>*Xb@c Q9`?`@"`buj!8u"9T@9_TBb@ДB>#c Q9`?`@"`bxj!8?x"9T@9_TB* *La@"?ATc Q9`?`@"`b R`j!8`"9@#@cC R'@v: @[B{Ũ_ִ@0qTa@#?ATc Q9`?`@` `R`j!8`"9*9*b@c Q9`?`@"`bzj!8z"9T@9_TB*  {S[`:Gck+@@9qT!>RR*`5"@9 RRqBzAzT&@9! RqAzT*@9?kT$q (xSR)|}"RA;X|!@sc!˿k)c Kq T4qT q..@9?|q@T(_q,T*?@(?j`8q @! TRs:GAa@Aʁ{@SA[BcCkD+@ _qT@9?hqaT* ?s@6 դ?@@9qAT@9Q|q! YzTQ$qHT@9_qT @9Q$qT"@9!@Q$qT "@8@Q$qT_qT Q)?k T|;C@!ˣ 4h"da R@97RhqTg?@@9q @ T#9Sr||B%R/Bq!Rdc|||/@qc$c c||c@c#X@ ]j#8?֠Aqf2@9hqT6R?K!R?4?8 BҤ?@@9@9"@8@Q_|qYziTr@9){S[a:G"@7Ҁ@T@Ҁs:G7@a@ASA[B@{Ǩ_֡#!/c4c@'@5/@5'@Tc'<*@@8ut@Ҁ+*4T@ Ҁ@'@*Ҷy)$@ T{qq{ _@_{)@(@@A6Y{_{{_rkalgo_plat_free_dmarkalgo_plat_alloc_dmarkalgo_plat_alloc_initrkalgo_plat_alloc_deinitrkalgo_plat_dmabuf_sync_endrkalgo_plat_dmabuf_sync_start%s-E: %s[%d] mpp_buffer_test mpp_allocator_put failed %s-E: %s[%d] mpp_allocator_alloc failed %s-I: [FD%d] %p RKALG%s-E: %s[%d] mpp_buffer_test mpp_allocator_get ion failed %s-E: %s[%d] sync start failed %d %s-E: %s[%d] api->free failed rb/proc/cpuinfoprocessor%s-I: %s/sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_cur_freq%d%s-D: %d, %d %s-I: %d, %d /sys/devices/system/cpu/cpufreq/stats/cpu%d/time_in_state/sys/devices/system/cpu/cpu%d/cpufreq/stats/time_in_state/sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_max_freq%d %*d%s-I: %d_cpu%d %s-E: %s[%d] syscall error %d vector::_M_default_appendsetSchedAffinity%s-I: %s, %d, cost time: %f ms St11_Mutex_baseILN9__gnu_cxx12_Lock_policyE2EESt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EESt15_Sp_counted_ptrIPN5RKALG7BackendELN9__gnu_cxx12_Lock_policyE2EE%s-I: InsertExtraBackendCreator %d /home/xhj/work/RkYuvAlgos_CAC/source/ocl/Backend.cpp%s-E: %s[%d] _ASSERT Error for %s, %d RKInsertExtraBackendCreator%s-I: BackendFactory::create S %s-I: Create Backend Failed because no creator for %d %s-I: BackendFactory::create M %s-I: Create Backend failed, the creator return nullptr, type = %d %s-I: BackendFactory::create E N5RKALG11NonCopyableEN5RKALG7BackendEN5RKALG14BackendCreatorEN5RKALG6OpenCL13OpenCLBackendEN5RKALG6OpenCL16CLBackendCreatorESt15_Sp_counted_ptrIPN5RKALG13OpenCLRuntimeELN9__gnu_cxx12_Lock_policyE2EESt15_Sp_counted_ptrIPN2cl6BufferELN9__gnu_cxx12_Lock_policyE2EE%s-I: OpenCLBackend::OpenCLBackend S mipi10_to_unpackedCvtUnpackS13ToRaw16%s-I: OpenCLBackend::OpenCLBackend E /home/xhj/work/RkYuvAlgos_CAC/source/ocl/OpenCLBackend.cpp%s-I: CLBackendCreator::onCreate S %s-I: OpenCL init error , callback ... %s-I: parsing symbols error !!! %s-I: CLBackendCreator::onCreate E0 %s-I: CLBackendCreator::onCreate E1 sh]RG2'tiTI4!ydM8"St19_Sp_make_shared_tagSt15_Sp_counted_ptrIPN2cl7ContextELN9__gnu_cxx12_Lock_policyE2EESt23_Sp_counted_ptr_inplaceIN2cl6DeviceESaIS1_ELN9__gnu_cxx12_Lock_policyE2EESt23_Sp_counted_ptr_inplaceIN2cl12CommandQueueESaIS1_ELN9__gnu_cxx12_Lock_policyE2EECL_SUCCESSCL_DEVICE_NOT_FOUNDCL_DEVICE_NOT_AVAILABLECL_COMPILER_NOT_AVAILABLECL_MEM_OBJECT_ALLOCATION_FAILURECL_OUT_OF_RESOURCESCL_OUT_OF_HOST_MEMORYCL_PROFILING_INFO_NOT_AVAILABLECL_MEM_COPY_OVERLAPCL_IMAGE_FORMAT_MISMATCHCL_IMAGE_FORMAT_NOT_SUPPORTEDCL_BUILD_PROGRAM_FAILURECL_MAP_FAILURECL_MISALIGNED_SUB_BUFFER_OFFSETCL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LISTCL_INVALID_VALUECL_INVALID_DEVICE_TYPECL_INVALID_PLATFORMCL_INVALID_DEVICECL_INVALID_CONTEXTCL_INVALID_QUEUE_PROPERTIESCL_INVALID_COMMAND_QUEUECL_INVALID_HOST_PTRCL_INVALID_MEM_OBJECTCL_INVALID_IMAGE_FORMAT_DESCRIPTORCL_INVALID_IMAGE_SIZECL_INVALID_SAMPLERCL_INVALID_BINARYCL_INVALID_BUILD_OPTIONSCL_INVALID_PROGRAMCL_INVALID_PROGRAM_EXECUTABLECL_INVALID_KERNEL_NAMECL_INVALID_KERNEL_DEFINITIONCL_INVALID_KERNELCL_INVALID_ARG_INDEXCL_INVALID_ARG_VALUECL_INVALID_ARG_SIZECL_INVALID_KERNEL_ARGSCL_INVALID_WORK_DIMENSIONCL_INVALID_WORK_GROUP_SIZECL_INVALID_WORK_ITEM_SIZECL_INVALID_GLOBAL_OFFSETCL_INVALID_EVENT_WAIT_LISTCL_INVALID_EVENTCL_INVALID_OPERATIONCL_INVALID_GL_OBJECTCL_INVALID_BUFFER_SIZECL_INVALID_MIP_LEVELCL_INVALID_GLOBAL_WORK_SIZECL_INVALID_PROPERTYCL_INVALID_IMAGE_DESCRIPTORCL_INVALID_COMPILER_OPTIONSCL_INVALID_LINKER_OPTIONSCL_INVALID_DEVICE_PARTITION_COUNTUNKNOWN ERROR CODE-DFLOAT=half -DFLOAT4=half4 -DFLOAT16=half16 -DRI_F=read_imageh -DWI_F=write_imageh -DCONVERT_FLOAT4=convert_half4 -DRK_SUPPORT_FP16-DFLOAT=float -DFLOAT4=float4 -DRI_F=read_imagef -DFLOAT16=float16 -DWI_F=write_imagef -DCONVERT_FLOAT4=convert_float4basic_string::append%s-I: programName.c_str()=s %s in %s, %d %s-I: Can't find kernel(%s) source(%d) ! %s-I: Program build log: %s %s-I: Build program failed ! /home/xhj/work/RkYuvAlgos_CAC/source/ocl/OpenCLRuntime.cpp%s-I: OpenCL error with code %s happened in file %s at line %d. Exiting. -cl-mad-enable%s-I: deviceName[version]: %s[%s] Mali-T860Mali-T880Adreno (TM) 505Adreno (TM) 506Adreno (TM) 512Adreno (TM) 530Adreno (TM) 540Adreno (TM) 615QUALCOMM Adreno(TM)Adreno (TM) 618Adreno (TM) 630Adreno (TM) 640%s-I: deviceName: %s[%s]%f %s-I: deviceVendor: %s OpenCL MaliAdvanced Micro Devices%s-I: extensions: %s %s-I: mGPUGlobalMemeryCacheSize: %d %s-I: mGPUComputeUnits: %d %s-I: mMaxFreq: %d %s-I: mLocalMemType: %d %s-I: mLocalMemSize: %d cl_arm_integer_dot_product_int8%s-I: mWorkGroupSize: %d %s-I: mWorkItemSize: {%zu, %zu, %zu} cl_arm_integer_dot_product_accumulate_int8basic_string::_M_construct null not validbuildKernelOpenCLRuntimeSt15_Sp_counted_ptrIPN5RKALG13OpenCLSymbolsELN9__gnu_cxx12_Lock_policyE2EE/usr/lib/libOpenCL.so/usr/local/lib/libOpenCL.so/usr/local/lib/libpocl.so/usr/lib64/libOpenCL.so/usr/lib32/libOpenCL.solibOpenCL.so/home/xhj/work/RkYuvAlgos_CAC/source/ocl/OpenCLWrapper.cpp%s-I: --use OpenCL lib %s %s-E: %s[%d] dlopen %s error %s-E: %s[%d] %s clGetPlatformIDsclGetPlatformInfoclBuildProgramclEnqueueNDRangeKernelclSetKernelArgclReleaseKernelclCreateProgramWithSourceclCreateBufferclImportMemoryARMclCreateImageclCreateImage2DclRetainKernelclCreateKernelclGetProgramInfoclFlushclFinishclReleaseProgramclRetainContextclGetContextInfoclCreateProgramWithBinaryclCreateCommandQueueclReleaseCommandQueueclEnqueueMapBufferclEnqueueMapImageclRetainProgramclGetProgramBuildInfoclEnqueueReadBufferclEnqueueWriteBufferclWaitForEventsclReleaseEventclCreateContextclCreateContextFromTypeclReleaseContextclRetainCommandQueueclEnqueueUnmapMemObjectclRetainMemObjectclReleaseMemObjectclGetDeviceInfoclGetDeviceIDsclRetainDeviceclReleaseDeviceclRetainEventclGetKernelWorkGroupInfoclGetEventInfoclGetEventProfilingInfoclGetImageInfoclEnqueueCopyImageclEnqueueReadImageclEnqueueWriteImageclCreateSamplerclReleaseSamplerclCreateImageclBuildProgramclCreateBufferclCreateKernelclGetDeviceIDsclReleaseEventclRetainDeviceclSetKernelArgclCreateContextclCreateImage2DclGetDeviceInfoclReleaseDeviceclReleaseKernelclRetainProgramclWaitForEventsclGetContextInfoclGetPlatformIDsclGetProgramInfoclReleaseContextclReleaseProgramclGetPlatformInfoclImportMemoryARMclReleaseMemObjectclEnqueueWriteImageclCreateCommandQueueclEnqueueWriteBufferclGetProgramBuildInfoclReleaseCommandQueueclEnqueueNDRangeKernelclCreateProgramWithSourceLoadLibraryFromPath/* * @Copyright : Copyright(c) 2021 Rockchip. All right reserved. * @Filename : pq_sr.cl * @Creacted By : vance.wu@rock-chips.com * @Creacted Date: 2021-12-07 * @Description : OpenCL kernels for PQ_SpuerResolution * @Modify Date : 2021-12-16 */ #pragma OPENCL EXTENSION cl_arm_printf : enable #define ENABLE_CHECK_MEDIAN_RESULT 0 #define PI 3.1415926f __constant sampler_t g_samplerNearest = CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_NEAREST | CLK_ADDRESS_CLAMP_TO_EDGE; __constant sampler_t g_samplerLinear = CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_LINEAR | CLK_ADDRESS_CLAMP_TO_EDGE; __constant int checkx = 1081, checky = 319; /* * default bicubic upscale coefficients. * sum to 1, so there is no need to do normalization. */ __constant float g_bicubicUpscaleCoefs[4][16] = { // top left { 4.943847656250000e-03f, -6.097412109375000e-02f, -1.593017578125000e-02f, 1.647949218750000e-03f, -6.097412109375000e-02f, 7.520141601562500e-01f, 1.964721679687500e-01f, -2.032470703125000e-02f, -1.593017578125000e-02f, 1.964721679687500e-01f, 5.133056640625000e-02f, -5.310058593750000e-03f, 1.647949218750000e-03f, -2.032470703125000e-02f, -5.310058593750000e-03f, 5.493164062500000e-04f, }, // top right { 1.647949218750000e-03f, -1.593017578125000e-02f, -6.097412109375000e-02f, 4.943847656250000e-03f, -2.032470703125000e-02f, 1.964721679687500e-01f, 7.520141601562500e-01f, -6.097412109375000e-02f, -5.310058593750000e-03f, 5.133056640625000e-02f, 1.964721679687500e-01f, -1.593017578125000e-02f, 5.493164062500000e-04f, -5.310058593750000e-03f, -2.032470703125000e-02f, 1.647949218750000e-03f, }, // bottom left { 1.647949218750000e-03f, -2.032470703125000e-02f, -5.310058593750000e-03f, 5.493164062500000e-04f, -1.593017578125000e-02f, 1.964721679687500e-01f, 5.133056640625000e-02f, -5.310058593750000e-03f, -6.097412109375000e-02f, 7.520141601562500e-01f, 1.964721679687500e-01f, -2.032470703125000e-02f, 4.943847656250000e-03f, -6.097412109375000e-02f, -1.593017578125000e-02f, 1.647949218750000e-03f, }, // bottom right { 5.493164062500000e-04f, -5.310058593750000e-03f, -2.032470703125000e-02f, 1.647949218750000e-03f, -5.310058593750000e-03f, 5.133056640625000e-02f, 1.964721679687500e-01f, -1.593017578125000e-02f, -2.032470703125000e-02f, 1.964721679687500e-01f, 7.520141601562500e-01f, -6.097412109375000e-02f, 1.647949218750000e-03f, -1.593017578125000e-02f, -6.097412109375000e-02f, 4.943847656250000e-03f, }, }; /** * direction filter coeffients */ __constant float g_directionFilterCoefs[8][25] = { // 180 degree, region = 0 { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, -0.03125f, 0.28515625f, 0.4921875f, 0.28515625f, -0.03125f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, }, // 22.5 degree, region = 1 { 0.f, 0.f, 0.f, 0.f, -0.015625f, 0.f, 0.f, 0.f, 0.140625f, 0.f, -0.015625f, 0.140625f, 0.5f, 0.140625f, -0.015625f, 0.f, 0.140625f, 0.f, 0.f, 0.f, -0.015625f, 0.f, 0.f, 0.f, 0.f, }, // 45 degree, region = 2 { 0.f, 0.f, 0.f, 0.f, -0.03125f, 0.f, 0.f, 0.f, 0.28515625f, 0.f, 0.f, 0.f, 0.4921875f, 0.f, 0.f, 0.f, 0.28515625f, 0.f, 0.f, 0.f, -0.03125f, 0.f, 0.f, 0.f, 0.f, }, // 67.5 degree, region = 3 { 0.f, 0.f, -0.015625f, 0.f, -0.015625f, 0.f, 0.f, 0.140625f, 0.140625f, 0.f, 0.f, 0.f, 0.5f, 0.f, 0.f, 0.f, 0.140625f, 0.140625f, 0.f, 0.f, -0.015625f, 0.f, -0.015625f, 0.f, 0.f, }, // 90 degree, region = 4 { 0.f, 0.f, -0.03125f, 0.f, 0.f, 0.f, 0.f, 0.28515625f, 0.f, 0.f, 0.f, 0.f, 0.4921875f, 0.f, 0.f, 0.f, 0.f, 0.28515625f, 0.f, 0.f, 0.f, 0.f, -0.03125f, 0.f, 0.f, }, // 112.5 degree, region = 5 { -0.015625f, 0.f, -0.015625f, 0.f, 0.f, 0.f, 0.140625f, 0.140625f, 0.f, 0.f, 0.f, 0.f, 0.5f, 0.f, 0.f, 0.f, 0.f, 0.140625f, 0.140625f, 0.f, 0.f, 0.f, -0.015625f, 0.f, -0.015625f, }, // 135 degree, region = 6 { -0.03125f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.28515625f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.4921875f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.28515625f, 0.f, 0.f, 0.f, 0.f, 0.f, -0.03125f, }, // 157.5 degree, region = 7 { -0.015625f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.140625f, 0.f, 0.f, 0.f, -0.015625f, 0.140625f, 0.5f, 0.140625f, -0.015625f, 0.f, 0.f, 0.f, 0.140625f, 0.f, 0.f, 0.f, 0.f, 0.f, -0.015625f, }, }; // g_dirfiltcoef_0_90deg[8][25] /** * up scale interpolation coeffients */ __constant float g_directionUpscaleCoefs[9][4][16] = { // no direction, index = 0 { { -1.757812500000000e-02f, -1.210937500000000e-01f, -7.226562500000000e-02f, -2.929687500000000e-02f, -1.210937500000000e-01f, 1.105468750000000e+00f, 2.421875000000000e-01f, -5.468750000000000e-02f, -7.226562500000000e-02f, 2.421875000000000e-01f, 8.789062500000000e-02f, -4.296875000000000e-02f, -2.929687500000000e-02f, -5.468750000000000e-02f, -4.296875000000000e-02f, -1.953125000000000e-02f, }, { -2.929687500000000e-02f, -7.226562500000000e-02f, -1.210937500000000e-01f, -1.757812500000000e-02f, -5.468750000000000e-02f, 2.421875000000000e-01f, 1.105468750000000e+00f, -1.210937500000000e-01f, -4.296875000000000e-02f, 8.789062500000000e-02f, 2.421875000000000e-01f, -7.226562500000000e-02f, -1.953125000000000e-02f, -4.296875000000000e-02f, -5.468750000000000e-02f, -2.929687500000000e-02f, }, { -2.929687500000000e-02f, -5.468750000000000e-02f, -4.296875000000000e-02f, -1.953125000000000e-02f, -7.226562500000000e-02f, 2.421875000000000e-01f, 8.789062500000000e-02f, -4.296875000000000e-02f, -1.210937500000000e-01f, 1.105468750000000e+00f, 2.421875000000000e-01f, -5.468750000000000e-02f, -1.757812500000000e-02f, -1.210937500000000e-01f, -7.226562500000000e-02f, -2.929687500000000e-02f, }, { -1.953125000000000e-02f, -4.296875000000000e-02f, -5.468750000000000e-02f, -2.929687500000000e-02f, -4.296875000000000e-02f, 8.789062500000000e-02f, 2.421875000000000e-01f, -7.226562500000000e-02f, -5.468750000000000e-02f, 2.421875000000000e-01f, 1.105468750000000e+00f, -1.210937500000000e-01f, -2.929687500000000e-02f, -7.226562500000000e-02f, -1.210937500000000e-01f, -1.757812500000000e-02f, }, }, // direction angle 0, index = 1 { { -2.285222003204438e-02f, -1.052795249931749e-01f, -5.504862596885550e-02f, -1.278570032936806e-02f, 1.517843483146211e-02f, 7.697872281456248e-01f, 2.651764756013255e-01f, 2.479595382121055e-02f, 6.928980400055448e-04f, 1.852029706742050e-01f, 6.044175138963204e-02f, 6.216873302492060e-03f, -2.154713653195689e-02f, -6.152039659796930e-02f, -3.864796350437423e-02f, -9.811017848214585e-03f, }, { -1.278570032936806e-02f, -5.504862596885550e-02f, -1.052795249931749e-01f, -2.285222003204438e-02f, 2.479595382121055e-02f, 2.651764756013255e-01f, 7.697872281456251e-01f, 1.517843483146211e-02f, 6.216873302492060e-03f, 6.044175138963204e-02f, 1.852029706742050e-01f, 6.928980400055448e-04f, -9.811017848214585e-03f, -3.864796350437423e-02f, -6.152039659796930e-02f, -2.154713653195689e-02f, }, { -2.154713653195689e-02f, -6.152039659796930e-02f, -3.864796350437423e-02f, -9.811017848214585e-03f, 6.928980400055448e-04f, 1.852029706742050e-01f, 6.044175138963204e-02f, 6.216873302492060e-03f, 1.517843483146211e-02f, 7.697872281456251e-01f, 2.651764756013255e-01f, 2.479595382121055e-02f, -2.285222003204438e-02f, -1.052795249931749e-01f, -5.504862596885550e-02f, -1.278570032936806e-02f, }, { -9.811017848214585e-03f, -3.864796350437423e-02f, -6.152039659796930e-02f, -2.154713653195689e-02f, 6.216873302492060e-03f, 6.044175138963204e-02f, 1.852029706742050e-01f, 6.928980400055448e-04f, 2.479595382121055e-02f, 2.651764756013255e-01f, 7.697872281456251e-01f, 1.517843483146211e-02f, -1.278570032936806e-02f, -5.504862596885550e-02f, -1.052795249931749e-01f, -2.285222003204438e-02f, }, }, // direction angle 22.5, index = 2 { { -3.765475527086502e-02f, -3.756639999861268e-02f, 1.117944095616831e-02f, 1.726973979282910e-02f, 9.456902782957851e-03f, 1.948088061858795e-01f, 6.531478168758187e-01f, 2.524411682896120e-02f, 2.747064496814454e-01f, 1.525986786598091e-02f, -2.624061312553345e-02f, -2.763476156078159e-02f, -3.480905580483468e-03f, -3.386906851571211e-02f, -3.462663691805250e-02f, 0.f, }, { -2.037718954898029e-02f, -4.380017769615579e-02f, -1.999284788862037e-02f, 2.584037790208659e-02f, -8.396827126546099e-03f, 1.817303802030988e-02f, 5.767774324697221e-01f, 2.530825487423710e-01f, 2.224094144125289e-01f, 1.298175279693144e-01f, -1.623237699735410e-02f, -3.576568042556955e-02f, 0.f, -1.926551131071795e-02f, -3.872401430458239e-02f, -2.354571421780631e-02f, }, { -2.354571421780631e-02f, -3.872401430458239e-02f, -1.926551131071795e-02f, 0.f, -3.576568042556955e-02f, -1.623237699735410e-02f, 1.298175279693144e-01f, 2.224094144125289e-01f, 2.530825487423710e-01f, 5.767774324697221e-01f, 1.817303802030988e-02f, -8.396827126546099e-03f, 2.584037790208659e-02f, -1.999284788862037e-02f, -4.380017769615579e-02f, -2.037718954898029e-02f, }, { 0.f, -3.462663691805250e-02f, -3.386906851571211e-02f, -3.480905580483468e-03f, -2.763476156078159e-02f, -2.624061312553345e-02f, 1.525986786598091e-02f, 2.747064496814454e-01f, 2.524411682896120e-02f, 6.531478168758187e-01f, 1.948088061858794e-01f, 9.456902782957851e-03f, 1.726973979282910e-02f, 1.117944095616831e-02f, -3.756639999861268e-02f, -3.765475527086502e-02f, }, }, // direction angle 45, index = 3 { { -3.648432468520239e-02f, -2.360550703309856e-02f, 5.246792212937912e-02f, -1.513094351944397e-02f, -2.360550703309856e-02f, 4.784449002930458e-01f, 3.213264164931402e-01f, -1.141513234986194e-02f, 5.246792212937912e-02f, 3.213264164931402e-01f, -2.864332005368535e-02f, -3.030138349719393e-02f, -1.513094351944397e-02f, -1.141513234986194e-02f, -3.030138349719393e-02f, 0.f, }, { -2.338564334191882e-02f, -4.339493628062838e-02f, 1.992121114305711e-02f, -2.448580529490240e-02f, -3.348522968086135e-02f, -5.951592523202140e-03f, 8.839562700988428e-01f, 1.992121114305712e-02f, 1.191374337353838e-02f, 3.127319298160900e-01f, -5.951592523202140e-03f, -4.339493628062838e-02f, -2.343750000000000e-02f, 1.191374337353838e-02f, -3.348522968086135e-02f, -2.338564334191882e-02f, }, { -2.338564334191882e-02f, -3.348522968086135e-02f, 1.191374337353838e-02f, -2.343750000000000e-02f, -4.339493628062838e-02f, -5.951592523202140e-03f, 3.127319298160900e-01f, 1.191374337353838e-02f, 1.992121114305712e-02f, 8.839562700988428e-01f, -5.951592523202140e-03f, -3.348522968086135e-02f, -2.448580529490240e-02f, 1.992121114305711e-02f, -4.339493628062838e-02f, -2.338564334191882e-02f, }, { 0.f, -3.030138349719393e-02f, -1.141513234986194e-02f, -1.513094351944397e-02f, -3.030138349719393e-02f, -2.864332005368535e-02f, 3.213264164931402e-01f, 5.246792212937912e-02f, -1.141513234986194e-02f, 3.213264164931402e-01f, 4.784449002930460e-01f, -2.360550703309856e-02f, -1.513094351944397e-02f, 5.246792212937912e-02f, -2.360550703309856e-02f, -3.648432468520239e-02f, }, }, // direction angle 67.5, index = 4 { { -3.765475527086502e-02f, 9.456902782957848e-03f, 2.747064496814454e-01f, -3.480905580483470e-03f, -3.756639999861267e-02f, 1.948088061858796e-01f, 1.525986786598085e-02f, -3.386906851571211e-02f, 1.117944095616831e-02f, 6.531478168758187e-01f, -2.624061312553346e-02f, -3.462663691805251e-02f, 1.726973979282910e-02f, 2.524411682896120e-02f, -2.763476156078158e-02f, 0.f, }, { -2.354571421780630e-02f, -3.576568042556952e-02f, 2.530825487423710e-01f, 2.584037790208658e-02f, -3.872401430458235e-02f, -1.623237699735412e-02f, 5.767774324697220e-01f, -1.999284788862036e-02f, -1.926551131071794e-02f, 1.298175279693143e-01f, 1.817303802030987e-02f, -4.380017769615578e-02f, 0.f, 2.224094144125289e-01f, -8.396827126546094e-03f, -2.037718954898028e-02f, }, { -2.037718954898028e-02f, -8.396827126546094e-03f, 2.224094144125289e-01f, 0.f, -4.380017769615578e-02f, 1.817303802030987e-02f, 1.298175279693143e-01f, -1.926551131071794e-02f, -1.999284788862036e-02f, 5.767774324697219e-01f, -1.623237699735412e-02f, -3.872401430458235e-02f, 2.584037790208658e-02f, 2.530825487423710e-01f, -3.576568042556952e-02f, -2.354571421780630e-02f, }, { 0.f, -2.763476156078158e-02f, 2.524411682896120e-02f, 1.726973979282910e-02f, -3.462663691805251e-02f, -2.624061312553346e-02f, 6.531478168758187e-01f, 1.117944095616831e-02f, -3.386906851571211e-02f, 1.525986786598085e-02f, 1.948088061858793e-01f, -3.756639999861267e-02f, -3.480905580483470e-03f, 2.747064496814454e-01f, 9.456902782957848e-03f, -3.765475527086502e-02f, }, }, // direction angle 90, index = 5 { { -2.285222003204438e-02f, 1.517843483146211e-02f, 6.928980400055448e-04f, -2.154713653195689e-02f, -1.052795249931749e-01f, 7.697872281456248e-01f, 1.852029706742050e-01f, -6.152039659796930e-02f, -5.504862596885550e-02f, 2.651764756013255e-01f, 6.044175138963204e-02f, -3.864796350437423e-02f, -1.278570032936806e-02f, 2.479595382121055e-02f, 6.216873302492060e-03f, -9.811017848214585e-03f, }, { -2.154713653195689e-02f, 6.928980400055448e-04f, 1.517843483146211e-02f, -2.285222003204438e-02f, -6.152039659796930e-02f, 1.852029706742050e-01f, 7.697872281456248e-01f, -1.052795249931749e-01f, -3.864796350437423e-02f, 6.044175138963204e-02f, 2.651764756013255e-01f, -5.504862596885550e-02f, -9.811017848214585e-03f, 6.216873302492060e-03f, 2.479595382121055e-02f, -1.278570032936806e-02f, }, { -1.278570032936806e-02f, 2.479595382121055e-02f, 6.216873302492060e-03f, -9.811017848214585e-03f, -5.504862596885550e-02f, 2.651764756013255e-01f, 6.044175138963204e-02f, -3.864796350437423e-02f, -1.052795249931749e-01f, 7.697872281456248e-01f, 1.852029706742050e-01f, -6.152039659796930e-02f, -2.285222003204438e-02f, 1.517843483146211e-02f, 6.928980400055448e-04f, -2.154713653195689e-02f, }, { -9.811017848214585e-03f, 6.216873302492060e-03f, 2.479595382121055e-02f, -1.278570032936806e-02f, -3.864796350437423e-02f, 6.044175138963204e-02f, 2.651764756013255e-01f, -5.504862596885550e-02f, -6.152039659796930e-02f, 1.852029706742050e-01f, 7.697872281456251e-01f, -1.052795249931749e-01f, -2.154713653195689e-02f, 6.928980400055448e-04f, 1.517843483146211e-02f, -2.285222003204438e-02f, }, }, // direction angle 112.5, index = 6 { { 2.584037790208658e-02f, 2.530825487423710e-01f, -3.576568042556952e-02f, -2.354571421780630e-02f, -1.999284788862036e-02f, 5.767774324697222e-01f, -1.623237699735412e-02f, -3.872401430458235e-02f, -4.380017769615578e-02f, 1.817303802030987e-02f, 1.298175279693143e-01f, -1.926551131071794e-02f, -2.037718954898028e-02f, -8.396827126546094e-03f, 2.224094144125289e-01f, 0.f, }, { -3.480905580483470e-03f, 2.747064496814454e-01f, 9.456902782957844e-03f, -3.765475527086501e-02f, -3.386906851571211e-02f, 1.525986786598084e-02f, 1.948088061858794e-01f, -3.756639999861267e-02f, -3.462663691805251e-02f, -2.624061312553346e-02f, 6.531478168758187e-01f, 1.117944095616831e-02f, 0.f, -2.763476156078158e-02f, 2.524411682896120e-02f, 1.726973979282910e-02f, }, { 1.726973979282910e-02f, 2.524411682896120e-02f, -2.763476156078158e-02f, 0.f, 1.117944095616831e-02f, 6.531478168758187e-01f, -2.624061312553346e-02f, -3.462663691805251e-02f, -3.756639999861267e-02f, 1.948088061858795e-01f, 1.525986786598084e-02f, -3.386906851571211e-02f, -3.765475527086501e-02f, 9.456902782957844e-03f, 2.747064496814454e-01f, -3.480905580483470e-03f, }, { 0.f, 2.224094144125289e-01f, -8.396827126546094e-03f, -2.037718954898028e-02f, -1.926551131071794e-02f, 1.298175279693143e-01f, 1.817303802030987e-02f, -4.380017769615578e-02f, -3.872401430458235e-02f, -1.623237699735412e-02f, 5.767774324697219e-01f, -1.999284788862036e-02f, -2.354571421780630e-02f, -3.576568042556952e-02f, 2.530825487423710e-01f, 2.584037790208658e-02f, }, }, // direction angle 135, index = 7 { { -2.448580529490240e-02f, 1.992121114305711e-02f, -4.339493628062838e-02f, -2.338564334191882e-02f, 1.992121114305712e-02f, 8.839562700988428e-01f, -5.951592523202140e-03f, -3.348522968086135e-02f, -4.339493628062838e-02f, -5.951592523202140e-03f, 3.127319298160900e-01f, 1.191374337353838e-02f, -2.338564334191882e-02f, -3.348522968086135e-02f, 1.191374337353838e-02f, -2.343750000000000e-02f, }, { -1.513094351944398e-02f, 5.246792212937911e-02f, -2.360550703309855e-02f, -3.648432468520238e-02f, -1.141513234986194e-02f, 3.213264164931402e-01f, 4.784449002930458e-01f, -2.360550703309855e-02f, -3.030138349719392e-02f, -2.864332005368535e-02f, 3.213264164931402e-01f, 5.246792212937911e-02f, 0.f, -3.030138349719392e-02f, -1.141513234986194e-02f, -1.513094351944397e-02f, }, { -1.513094351944397e-02f, -1.141513234986194e-02f, -3.030138349719392e-02f, 0.f, 5.246792212937911e-02f, 3.213264164931402e-01f, -2.864332005368535e-02f, -3.030138349719392e-02f, -2.360550703309855e-02f, 4.784449002930460e-01f, 3.213264164931402e-01f, -1.141513234986194e-02f, -3.648432468520238e-02f, -2.360550703309855e-02f, 5.246792212937911e-02f, -1.513094351944398e-02f, }, { -2.343750000000000e-02f, 1.191374337353838e-02f, -3.348522968086135e-02f, -2.338564334191882e-02f, 1.191374337353838e-02f, 3.127319298160900e-01f, -5.951592523202140e-03f, -4.339493628062838e-02f, -3.348522968086135e-02f, -5.951592523202140e-03f, 8.839562700988428e-01f, 1.992121114305712e-02f, -2.338564334191882e-02f, -4.339493628062838e-02f, 1.992121114305711e-02f, -2.448580529490240e-02f, }, }, // direction angle 157.5, index = 8 { { 2.584037790208659e-02f, -1.999284788862037e-02f, -4.380017769615579e-02f, -2.037718954898029e-02f, 2.530825487423710e-01f, 5.767774324697221e-01f, 1.817303802030988e-02f, -8.396827126546099e-03f, -3.576568042556955e-02f, -1.623237699735410e-02f, 1.298175279693144e-01f, 2.224094144125289e-01f, -2.354571421780631e-02f, -3.872401430458239e-02f, -1.926551131071795e-02f, 0.f, }, { 1.726973979282910e-02f, 1.117944095616832e-02f, -3.756639999861268e-02f, -3.765475527086503e-02f, 2.524411682896120e-02f, 6.531478168758188e-01f, 1.948088061858792e-01f, 9.456902782957855e-03f, -2.763476156078159e-02f, -2.624061312553346e-02f, 1.525986786598094e-02f, 2.747064496814454e-01f, 0.f, -3.462663691805251e-02f, -3.386906851571211e-02f, -3.480905580483469e-03f, }, { -3.480905580483469e-03f, -3.386906851571211e-02f, -3.462663691805251e-02f, 0.f, 2.747064496814454e-01f, 1.525986786598094e-02f, -2.624061312553346e-02f, -2.763476156078159e-02f, 9.456902782957855e-03f, 1.948088061858792e-01f, 6.531478168758188e-01f, 2.524411682896120e-02f, -3.765475527086503e-02f, -3.756639999861268e-02f, 1.117944095616832e-02f, 1.726973979282910e-02f, }, { 0.f, -1.926551131071795e-02f, -3.872401430458239e-02f, -2.354571421780631e-02f, 2.224094144125289e-01f, 1.298175279693144e-01f, -1.623237699735410e-02f, -3.576568042556955e-02f, -8.396827126546099e-03f, 1.817303802030988e-02f, 5.767774324697221e-01f, 2.530825487423710e-01f, -2.037718954898029e-02f, -4.380017769615579e-02f, -1.999284788862037e-02f, 2.584037790208659e-02f, }, }, }; // g_directionUpscaleCoefs[9][4][16] __kernel void cl_bicubic_upscale_bilinear( __read_only image2d_t srcImgY, __read_only image2d_t srcImgUV, __write_only image2d_t dstImgY, __write_only image2d_t dstImgUV) { // UV int2 coord_uv = (int2)(get_global_id(0), get_global_id(1)); float2 normCoord_uv = convert_float2(coord_uv) * 0.5f + 0.75f; float4 color_uv = read_imagef(srcImgUV, g_samplerLinear, normCoord_uv); write_imagef(dstImgUV, coord_uv, color_uv); // Y00 ~ Y11 int2 coord_y00 = coord_uv * 2; int2 coord_y01 = (int2)(coord_y00.x + 1, coord_y00.y + 0); int2 coord_y10 = (int2)(coord_y00.x + 0, coord_y00.y + 1); int2 coord_y11 = (int2)(coord_y00.x + 1, coord_y00.y + 1); float2 normCoord_y00 = convert_float2(coord_y00) * 0.5f + 0.75f; // + 1./(2*SCALE), SCALE=1 float2 normCoord_y01 = convert_float2(coord_y01) * 0.5f + 0.75f; // 0.25 & 0.75 for zero offset on the dest image float2 normCoord_y10 = convert_float2(coord_y10) * 0.5f + 0.75f; float2 normCoord_y11 = convert_float2(coord_y11) * 0.5f + 0.75f; float4 color_y00 = read_imagef(srcImgY, g_samplerLinear, normCoord_y00); float4 color_y01 = read_imagef(srcImgY, g_samplerLinear, normCoord_y01); float4 color_y10 = read_imagef(srcImgY, g_samplerLinear, normCoord_y10); float4 color_y11 = read_imagef(srcImgY, g_samplerLinear, normCoord_y11); write_imagef(dstImgY, coord_y00, color_y00); write_imagef(dstImgY, coord_y01, color_y01); write_imagef(dstImgY, coord_y10, color_y10); write_imagef(dstImgY, coord_y11, color_y11); } __kernel void cl_bicubic_upscale_bicubic( __read_only image2d_t srcImgY, __read_only image2d_t srcImgUV, __write_only image2d_t dstImgY, __write_only image2d_t dstImgUV) { // int check_x = 766/2, check_y = 520/2; // baes on dest UV // UV int2 coordDst = (int2)(get_global_id(0), get_global_id(1)); // base on UV coordinate of dest image int2 coordSrc = coordDst >> 1; float2 diffCoord = 0.5f * (convert_float2(coordDst) + 0.5f) - convert_float2(coordSrc); __constant float* pLutDirUV = NULL; if (diffCoord.x < 0.5f) // left, =0.25 { if (diffCoord.y < 0.5f) { // top, =0.25 pLutDirUV = g_bicubicUpscaleCoefs[0]; } else { // bottom, =0.75 pLutDirUV = g_bicubicUpscaleCoefs[2]; } } else // right, =0.75 { if (diffCoord.y < 0.5f) { pLutDirUV = g_bicubicUpscaleCoefs[1]; } else { pLutDirUV = g_bicubicUpscaleCoefs[3]; } } float4 dstValueUV = 0.f; // float sumWgtUV = 0; for (int i = 0; i < 4; i++) // y { for (int j = 0; j < 4; j++) // x { int idx = i * 4 + j; float4 srcValue = read_imagef(srcImgUV, g_samplerNearest, coordSrc + (int2)(j - 1, i - 1)); dstValueUV += srcValue * pLutDirUV[idx]; // sumWgtUV += pLutDirUV[idx]; } } // dstValueUV.s01 /= sumWgtUV; dstValueUV = clamp(dstValueUV, 16.f/255.f, 240.f/255.f); write_imagef(dstImgUV, coordDst, dstValueUV); /// Y coordSrc = coordDst; coordDst <<= 1; float4 dstValue00 = 0.f; float4 dstValue01 = 0.f; float4 dstValue10 = 0.f; float4 dstValue11 = 0.f; // float sumWgt00 = 0.f; // float sumWgt01 = 0.f; // float sumWgt10 = 0.f; // float sumWgt11 = 0.f; for (int i = 0; i < 4; i++) // y { for (int j = 0; j < 4; j++) // x { int idx = i * 4 + j; float4 srcValue = read_imagef(srcImgY, g_samplerNearest, coordSrc + (int2)(j - 1, i - 1)); dstValue00 += srcValue * g_bicubicUpscaleCoefs[0][idx]; dstValue01 += srcValue * g_bicubicUpscaleCoefs[1][idx]; dstValue10 += srcValue * g_bicubicUpscaleCoefs[2][idx]; dstValue11 += srcValue * g_bicubicUpscaleCoefs[3][idx]; // sumWgt00 += g_bicubicUpscaleCoefs[0][idx]; // sumWgt01 += g_bicubicUpscaleCoefs[1][idx]; // sumWgt10 += g_bicubicUpscaleCoefs[2][idx]; // sumWgt11 += g_bicubicUpscaleCoefs[3][idx]; } } // dstValue00 /= sumWgt00; // dstValue01 /= sumWgt01; // dstValue10 /= sumWgt10; // dstValue11 /= sumWgt11; dstValue00 = clamp(dstValue00, 16.f/255.f, 235.f/255.f); dstValue01 = clamp(dstValue01, 16.f/255.f, 235.f/255.f); dstValue10 = clamp(dstValue10, 16.f/255.f, 235.f/255.f); dstValue11 = clamp(dstValue11, 16.f/255.f, 235.f/255.f); write_imagef(dstImgY, coordDst + (int2)(0, 0), dstValue00); write_imagef(dstImgY, coordDst + (int2)(1, 0), dstValue01); write_imagef(dstImgY, coordDst + (int2)(0, 1), dstValue10); write_imagef(dstImgY, coordDst + (int2)(1, 1), dstValue11); } __kernel void cl_bicubic_upscale_bicubic_16( __read_only image2d_t srcImgY, __read_only image2d_t srcImgUV, __write_only image2d_t dstImgY, __write_only image2d_t dstImgUV) { /// 4 UV pixels, coordinate is base on the half UV size of dest image int2 coordDst = (int2)(get_global_id(0), get_global_id(1)) * 2; int2 coordSrc = coordDst >> 1; float4 dstValueUV00 = 0.f; float4 dstValueUV01 = 0.f; float4 dstValueUV10 = 0.f; float4 dstValueUV11 = 0.f; for (int i = 0; i < 4; i++) // y { for (int j = 0; j < 4; j++) // x { int idx = i * 4 + j; float4 srcValue = read_imagef(srcImgUV, g_samplerNearest, coordSrc + (int2)(j - 1, i - 1)); dstValueUV00 += srcValue * g_bicubicUpscaleCoefs[0][idx]; dstValueUV01 += srcValue * g_bicubicUpscaleCoefs[1][idx]; dstValueUV10 += srcValue * g_bicubicUpscaleCoefs[2][idx]; dstValueUV11 += srcValue * g_bicubicUpscaleCoefs[3][idx]; } } dstValueUV00 = clamp(dstValueUV00, 16.f/255.f, 240.f/255.f); dstValueUV01 = clamp(dstValueUV01, 16.f/255.f, 240.f/255.f); dstValueUV10 = clamp(dstValueUV10, 16.f/255.f, 240.f/255.f); dstValueUV11 = clamp(dstValueUV11, 16.f/255.f, 240.f/255.f); write_imagef(dstImgUV, coordDst + (int2)(0, 0), dstValueUV00); write_imagef(dstImgUV, coordDst + (int2)(1, 0), dstValueUV01); write_imagef(dstImgUV, coordDst + (int2)(0, 1), dstValueUV10); write_imagef(dstImgUV, coordDst + (int2)(1, 1), dstValueUV11); /// 16 Y pixels coordSrc = coordDst; coordDst <<= 1; __constant int ofsx[4] = {0, 0, 1, 1}; __constant int ofsy[4] = {0, 1, 0, 1}; for (int t = 0; t < 4; t++) { int2 ofsSrc = (int2)(ofsx[t], ofsy[t]); int2 ofsDst = ofsSrc * 2; float4 dstValueY00 = 0.f; float4 dstValueY01 = 0.f; float4 dstValueY10 = 0.f; float4 dstValueY11 = 0.f; for (int i = 0; i < 4; i++) // y { for (int j = 0; j < 4; j++) // x { int idx = i * 4 + j; float4 srcValue = read_imagef(srcImgY, g_samplerNearest, coordSrc + (int2)(j - 1, i - 1) + ofsSrc); dstValueY00 += srcValue * g_bicubicUpscaleCoefs[0][idx]; dstValueY01 += srcValue * g_bicubicUpscaleCoefs[1][idx]; dstValueY10 += srcValue * g_bicubicUpscaleCoefs[2][idx]; dstValueY11 += srcValue * g_bicubicUpscaleCoefs[3][idx]; } } dstValueY00 = clamp(dstValueY00, 16.f/255.f, 235.f/255.f); dstValueY01 = clamp(dstValueY01, 16.f/255.f, 235.f/255.f); dstValueY10 = clamp(dstValueY10, 16.f/255.f, 235.f/255.f); dstValueY11 = clamp(dstValueY11, 16.f/255.f, 235.f/255.f); write_imagef(dstImgY, coordDst + (int2)(0, 0) + ofsDst, dstValueY00); write_imagef(dstImgY, coordDst + (int2)(1, 0) + ofsDst, dstValueY01); write_imagef(dstImgY, coordDst + (int2)(0, 1) + ofsDst, dstValueY10); write_imagef(dstImgY, coordDst + (int2)(1, 1) + ofsDst, dstValueY11); } } __kernel void clkernel_SR_getPixelGradient( __read_only image2d_t srcImgY, // CL_UNORM_INT8 __write_only image2d_t edgeInfo // CL_UNORM_INT8 ) { int2 coord = (int2)(get_global_id(0), get_global_id(1)); // base on channel Y, full size float4 p00 = read_imagef(srcImgY, g_samplerNearest, coord + (int2)(-1, -1)); // [0.f, 1.f] => [0, 255] float4 p01 = read_imagef(srcImgY, g_samplerNearest, coord + (int2)( 0, -1)); float4 p02 = read_imagef(srcImgY, g_samplerNearest, coord + (int2)( 1, -1)); float4 p10 = read_imagef(srcImgY, g_samplerNearest, coord + (int2)(-1, 0)); float4 p12 = read_imagef(srcImgY, g_samplerNearest, coord + (int2)( 1, 0)); float4 p20 = read_imagef(srcImgY, g_samplerNearest, coord + (int2)(-1, 1)); float4 p21 = read_imagef(srcImgY, g_samplerNearest, coord + (int2)( 0, 1)); float4 p22 = read_imagef(srcImgY, g_samplerNearest, coord + (int2)( 1, 1)); // get edge pixel float gx = p02.x - p00.x + 2.f * (p12.x - p10.x) + p22.x - p20.x; // max: 255*4 => 4.f float gy = p20.x - p00.x + 2.f * (p21.x - p01.x) + p22.x - p02.x; // min: -255*4 => -4.f float gradient = (fabs(gx) + fabs(gy)) / 8.f; // norm to [0.f, 1.f] float4 dstValue = (float4)(gradient, 0.f, 0.f, 1.f); #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) { printf("---- check pixel (%d, %d) clkernel_SR_getPixelGradient() ----\n", checkx, checky); printf("[Gradient] gx = %.4f, gy = %.4f, gradient = %.4f\n", gx, gy, gradient); } #endif float th_minGrad = 10.f / 255.f; bool isEdgeCandidate = fabs(gx) > th_minGrad && fabs(gy) > th_minGrad; if (isEdgeCandidate) // edge candidate { // NOTE: -gy should be used here, because of the difference between image coordinate and direction coordinate. // angle, [rad], [-0.5, +0.5] => [0., 1.] ([0, 180] degree) dstValue.y = (atanpi(-gy / gx) + 0.5f) * 180.f / 255.f; #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) printf("[Gradient] gradient = %.2f, angle = %.2f deg\n", dstValue.x*255.f, dstValue.y*255.f); #endif } #if ENABLE_CHECK_MEDIAN_RESULT else if (coord.x == checkx && coord.y == checky) { printf("[Gradient] not an edge candidata!\n"); } #endif write_imagef(edgeInfo, coord, dstValue); } __kernel void clkernel_SR_getEdgePixel( __read_only image2d_t edgeInfoSrc, // CL_UNORM_INT8 __write_only image2d_t edgeInfoDst // CL_UNSIGNED_INT8 ) { int2 coord = (int2)(get_global_id(0), get_global_id(1)); /// get data (gradient, angle, 0, 1.f) from read_imagef. /// data range of gradient [0:255], angle [0, 180] (=> [-90, +90]) float4 p00 = read_imagef(edgeInfoSrc, g_samplerNearest, coord + (int2)(-1, -1)); float4 p01 = read_imagef(edgeInfoSrc, g_samplerNearest, coord + (int2)( 0, -1)); float4 p02 = read_imagef(edgeInfoSrc, g_samplerNearest, coord + (int2)( 1, -1)); float4 p10 = read_imagef(edgeInfoSrc, g_samplerNearest, coord + (int2)(-1, 0)); float4 p11 = read_imagef(edgeInfoSrc, g_samplerNearest, coord + (int2)( 0, 0)); float4 p12 = read_imagef(edgeInfoSrc, g_samplerNearest, coord + (int2)( 1, 0)); float4 p20 = read_imagef(edgeInfoSrc, g_samplerNearest, coord + (int2)(-1, 1)); float4 p21 = read_imagef(edgeInfoSrc, g_samplerNearest, coord + (int2)( 0, 1)); float4 p22 = read_imagef(edgeInfoSrc, g_samplerNearest, coord + (int2)( 1, 1)); uint4 dstValue = (uint4)(0u, convert_uint(p11.y * 255.f), 0u, 1u); // (is_an_edge, angle) #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) { printf("---- check pixel (%d, %d) on clkernel_SR_getEdgePixel() ----\n", checkx, checky); printf("[EdgePixel] src00 value (gradient, angle) = (%6.1f, %6.1f)\n", p00.x*255.f, p00.y*255.f); printf("[EdgePixel] src01 value (gradient, angle) = (%6.1f, %6.1f)\n", p01.x*255.f, p01.y*255.f); printf("[EdgePixel] src02 value (gradient, angle) = (%6.1f, %6.1f)\n", p02.x*255.f, p02.y*255.f); printf("[EdgePixel] src10 value (gradient, angle) = (%6.1f, %6.1f)\n", p10.x*255.f, p10.y*255.f); printf("[EdgePixel] src11 value (gradient, angle) = (%6.1f, %6.1f)\n", p11.x*255.f, p11.y*255.f); printf("[EdgePixel] src12 value (gradient, angle) = (%6.1f, %6.1f)\n", p12.x*255.f, p12.y*255.f); printf("[EdgePixel] src20 value (gradient, angle) = (%6.1f, %6.1f)\n", p20.x*255.f, p20.y*255.f); printf("[EdgePixel] src21 value (gradient, angle) = (%6.1f, %6.1f)\n", p21.x*255.f, p21.y*255.f); printf("[EdgePixel] src22 value (gradient, angle) = (%6.1f, %6.1f)\n", p22.x*255.f, p22.y*255.f); } #endif if (p11.y > 0.f) // edge candidate { float gradThreshold = (p00.x + p01.x + p02.x + p10.x + p11.x + p12.x + p20.x + p21.x + p22.x) / 9.f; dstValue.x = p11.x > gradThreshold; // an ture edge } write_imageui(edgeInfoDst, coord, dstValue); #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) printf("[EdgePixel] dstValue (is_an_edge, angle) = (%u, %u)\n", dstValue.x, dstValue.y); #endif } /** * Edge direction: * index angle range * 0 [ 0 : 11] + [169:180] * 1 [ 12 : 33] * 2 [ 34 : 56] * 3 [ 57 : 78] * 4 [ 79 : 101] * 5 [102 : 123] * 6 [124 : 146] * 7 [147 : 168] */ __kernel void clkernel_SR_getEdgeDirection( __read_only image2d_t edgeInfo, // CL_UNSIGNED_INT8 __write_only image2d_t regionInfo // CL_UNSIGNED_INT8 ) { int2 coord = (int2)(get_global_id(0), get_global_id(1)); // base on channel Y, full size /// get data (is_an_edge, angle, 0, 1) from read_imageui. /// data range of angle [0, 180] (=> [-90, +90]) uint4 p00 = read_imageui(edgeInfo, g_samplerNearest, coord + (int2)(-1, -1)); uint4 p01 = read_imageui(edgeInfo, g_samplerNearest, coord + (int2)( 0, -1)); uint4 p02 = read_imageui(edgeInfo, g_samplerNearest, coord + (int2)( 1, -1)); uint4 p10 = read_imageui(edgeInfo, g_samplerNearest, coord + (int2)(-1, 0)); uint4 p11 = read_imageui(edgeInfo, g_samplerNearest, coord + (int2)( 0, 0)); uint4 p12 = read_imageui(edgeInfo, g_samplerNearest, coord + (int2)( 1, 0)); uint4 p20 = read_imageui(edgeInfo, g_samplerNearest, coord + (int2)(-1, 1)); uint4 p21 = read_imageui(edgeInfo, g_samplerNearest, coord + (int2)( 0, 1)); uint4 p22 = read_imageui(edgeInfo, g_samplerNearest, coord + (int2)( 1, 1)); uint4 dstValue = (uint4)0; // (region_index, 0, 0, 1) #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) { printf("---- check pixel (%d, %d) on clkernel_SR_getEdgeDirection() ----\n", checkx, checky); printf("[EdgeDir] src00 (%d, %d) value (is_an_edge, angle) = (%d, %d)\n", coord.x - 1, coord.y - 1, p00.x, p00.y); printf("[EdgeDir] src01 (%d, %d) value (is_an_edge, angle) = (%d, %d)\n", coord.x + 0, coord.y - 1, p01.x, p01.y); printf("[EdgeDir] src02 (%d, %d) value (is_an_edge, angle) = (%d, %d)\n", coord.x + 1, coord.y - 1, p02.x, p02.y); printf("[EdgeDir] src10 (%d, %d) value (is_an_edge, angle) = (%d, %d)\n", coord.x - 1, coord.y + 0, p10.x, p10.y); printf("[EdgeDir] src11 (%d, %d) value (is_an_edge, angle) = (%d, %d)\n", coord.x + 0, coord.y + 0, p11.x, p11.y); printf("[EdgeDir] src12 (%d, %d) value (is_an_edge, angle) = (%d, %d)\n", coord.x + 1, coord.y + 0, p12.x, p12.y); printf("[EdgeDir] src20 (%d, %d) value (is_an_edge, angle) = (%d, %d)\n", coord.x - 1, coord.y + 1, p20.x, p20.y); printf("[EdgeDir] src21 (%d, %d) value (is_an_edge, angle) = (%d, %d)\n", coord.x + 0, coord.y + 1, p21.x, p21.y); printf("[EdgeDir] src22 (%d, %d) value (is_an_edge, angle) = (%d, %d)\n", coord.x + 1, coord.y + 1, p22.x, p22.y); } #endif /// check region of directions bool validFlags[9] = { (1u == p00.x), (1u == p01.x), (1u == p02.x), (1u == p10.x), (1u == p11.x), (1u == p12.x), (1u == p20.x), (1u == p21.x), (1u == p22.x), }; uint validAngles[9] = {p00.y, p01.y, p02.y, p10.y, p11.y, p12.y, p20.y, p21.y, p22.y}; int numEdgeNeighbor = 0; for (int i = 0; i < 9; i++) { if (validFlags[i]) { validAngles[numEdgeNeighbor] = validAngles[i]; numEdgeNeighbor++; } } #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) printf("[EdgeDir] numEdgeNeighbor = %d > 3 ?, have a candidate region = %d\n", numEdgeNeighbor, numEdgeNeighbor > 3); #endif if (numEdgeNeighbor > 3) { /// get the main direction int localDirHist[9] = {0}; // localDirHist[(p00.y * 91 + 1024) >> 11] += (1u == p00.x) ? 1 : 0; // [0,180] // localDirHist[(p01.y * 91 + 1024) >> 11] += (1u == p01.x) ? 1 : 0; // localDirHist[(p02.y * 91 + 1024) >> 11] += (1u == p02.x) ? 1 : 0; // localDirHist[(p10.y * 91 + 1024) >> 11] += (1u == p10.x) ? 1 : 0; // localDirHist[(p11.y * 91 + 1024) >> 11] += (1u == p11.x) ? 1 : 0; // localDirHist[(p12.y * 91 + 1024) >> 11] += (1u == p12.x) ? 1 : 0; // localDirHist[(p20.y * 91 + 1024) >> 11] += (1u == p20.x) ? 1 : 0; // localDirHist[(p21.y * 91 + 1024) >> 11] += (1u == p21.x) ? 1 : 0; // localDirHist[(p22.y * 91 + 1024) >> 11] += (1u == p22.x) ? 1 : 0; for (int i = 0; i < numEdgeNeighbor; i++) { // localDirHist[(int)round((float)validAngles[i] / 22.5f) % 8]++; // [0,180] localDirHist[(validAngles[i] * 91 + 1024) >> 11]++; // [0,180], 91/2048 => 1/22.5 #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) { printf("[EdgeDir] i=%d, angle=%d, idx=%d, hist=%d\n", i, validAngles[i], (validAngles[i] * 91 + 1024) >> 11, localDirHist[(validAngles[i] * 91 + 1024) >> 11]); } #endif } localDirHist[0] += localDirHist[8]; uint mainDirIdx = 0; int mainDirNum = 0; for (uint i = 0; i < 8u; i++) { if (localDirHist[i] > mainDirNum) { mainDirIdx = i; mainDirNum = localDirHist[i]; } } #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) { printf("[EdgeDir] max region index = %d, max num = %d\n", mainDirIdx, mainDirNum); printf("[EdgeDir] localDirHist = {%d, %d, %d, %d, %d, %d, %d, %d}\n", localDirHist[0], localDirHist[1], localDirHist[2], localDirHist[3], localDirHist[4], localDirHist[5], localDirHist[6], localDirHist[7]); } #endif /// check main direction validation if (mainDirNum > numEdgeNeighbor / 2) { float mainAngle = mainDirIdx * 22.5f; int angleThresholdLo = (int)(mainAngle - 22.5f); int angleThresholdHi = (int)round(mainAngle + 22.5f); int numAngleSameDir = 0; if (0 == mainDirIdx) { /// NOTE: region 0 = region 8, rotation cycle, [0:11] & [169:180] => threshold: [0:22] + [158:180] numAngleSameDir += validFlags[0] && ((0 <= p00.y && 22 >= p00.y) || (158 <= p00.y && 180 >= p00.y)); numAngleSameDir += validFlags[1] && ((0 <= p01.y && 22 >= p01.y) || (158 <= p01.y && 180 >= p01.y)); numAngleSameDir += validFlags[2] && ((0 <= p02.y && 22 >= p02.y) || (158 <= p02.y && 180 >= p02.y)); numAngleSameDir += validFlags[3] && ((0 <= p10.y && 22 >= p10.y) || (158 <= p10.y && 180 >= p10.y)); numAngleSameDir += validFlags[4] && ((0 <= p11.y && 22 >= p11.y) || (158 <= p11.y && 180 >= p11.y)); numAngleSameDir += validFlags[5] && ((0 <= p12.y && 22 >= p12.y) || (158 <= p12.y && 180 >= p12.y)); numAngleSameDir += validFlags[6] && ((0 <= p20.y && 22 >= p20.y) || (158 <= p20.y && 180 >= p20.y)); numAngleSameDir += validFlags[7] && ((0 <= p21.y && 22 >= p21.y) || (158 <= p21.y && 180 >= p21.y)); numAngleSameDir += validFlags[8] && ((0 <= p22.y && 22 >= p22.y) || (158 <= p22.y && 180 >= p22.y)); } else { numAngleSameDir += /* (1u == p00.x) */ validFlags[0] && angleThresholdLo < p00.y && angleThresholdHi > p00.y; numAngleSameDir += /* (1u == p01.x) */ validFlags[1] && angleThresholdLo < p01.y && angleThresholdHi > p01.y; numAngleSameDir += /* (1u == p02.x) */ validFlags[2] && angleThresholdLo < p02.y && angleThresholdHi > p02.y; numAngleSameDir += /* (1u == p10.x) */ validFlags[3] && angleThresholdLo < p10.y && angleThresholdHi > p10.y; numAngleSameDir += /* (1u == p11.x) */ validFlags[4] && angleThresholdLo < p11.y && angleThresholdHi > p11.y; numAngleSameDir += /* (1u == p12.x) */ validFlags[5] && angleThresholdLo < p12.y && angleThresholdHi > p12.y; numAngleSameDir += /* (1u == p20.x) */ validFlags[6] && angleThresholdLo < p20.y && angleThresholdHi > p20.y; numAngleSameDir += /* (1u == p21.x) */ validFlags[7] && angleThresholdLo < p21.y && angleThresholdHi > p21.y; numAngleSameDir += /* (1u == p22.x) */ validFlags[8] && angleThresholdLo < p22.y && angleThresholdHi > p22.y; } // for (int i = 0; i < numEdgeNeighbor; i++) { // slower!! // numAngleSameDir += (angleThresholdLo <= validAngles[i]) && (angleThresholdHi >= validAngles[i]); // } if (numAngleSameDir == numEdgeNeighbor) { dstValue.x = mainDirIdx + 1u; // 0 indicate no region, valid region [0:8] } #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) { printf("[EdgeDir] main angle = %.2f, threshold = (%d, %d)\n", mainAngle, angleThresholdLo, angleThresholdHi); printf("[EdgeDir] numAngleSameDir = %d == %d?, have a valid region = %u+1=>%u\n", numAngleSameDir, numEdgeNeighbor, mainDirIdx, dstValue.x); } #endif } } // if (numEdgeNeighbor > 3) write_imageui(regionInfo, coord, dstValue); } __kernel void clkernel_SR_directionFilter( __read_only image2d_t srcImgY, // CL_UNORM_INT8 __read_only image2d_t regionInfo, // CL_UNSIGNED_INT8 __write_only image2d_t filterY // CL_UNORM_INT8 ) { /// get src value & direction info int2 coord = (int2)(get_global_id(0), get_global_id(1)); float4 srcValue = read_imagef(srcImgY, g_samplerNearest, coord); uint4 regionIdx = read_imageui(regionInfo, g_samplerNearest, coord); // valid range: [0:1:8] float4 dstValue = srcValue; // bool isValidRegion = regionIdx.x > 0u && regionIdx.x <= 8u; bool isValidRegion = regionIdx.x > 0u; #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) { printf("---- check pixel (%d, %d) on clkernel_SR_directionFilter() ----\n", checkx, checky); printf("[DirFilter] regionIdx = %d, isValidRegion = %d\n", regionIdx.x, isValidRegion); } #endif if (isValidRegion) { __constant float* pLutDirFilter = g_directionFilterCoefs[regionIdx.x - 1u]; float dstY = 0.f; for (int i = 0; i < 5; i++) { int tbidx = i * 5; for (int j = 0; j < 5; j++) { srcValue = read_imagef(srcImgY, g_samplerNearest, coord + (int2)(j - 2, i - 2)); dstY += srcValue.x * pLutDirFilter[tbidx]; #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) { printf("[DirFilter] srcValue = %.2f(%3.f), pLutDirFilter[%2d] = % .6f, dstY = % 8.6f(% 8.6f)\n", srcValue.x, srcValue.x*255.f, tbidx, pLutDirFilter[tbidx], dstY, dstY*255.f); } #endif tbidx++; } } #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) { if (dstY < 16.f/255.f || dstY > 235.f/255.f) printf("pixel (%d, %d) dstY = %6.3f*255.f=%6.3f out of range [16, 235]! Force clip!\n", coord.x, coord.y, dstY, dstY*255.f); } #endif // dstValue.x = clamp(dstY, 0.f, 1.f); dstValue.x = clamp(dstY, 16.f/255.f, 235.f/255.f); #if ENABLE_CHECK_MEDIAN_RESULT if (coord.x == checkx && coord.y == checky) { printf("[DirFilter] dstValue = %.6f => %.6f\n", dstY, dstValue.x); } #endif } write_imagef(filterY, coord, dstValue); } __kernel void clkernel_SR_upscale( __read_only image2d_t srcImgY, // CL_UNORM_INT8 __read_only image2d_t srcImgUV, // CL_UNORM_INT8 __read_only image2d_t regionInfo, // CL_UNSIGNED_INT8 __write_only image2d_t dstImgY, // CL_UNORM_INT8 __write_only image2d_t dstImgUV // CL_UNORM_INT8 ) { // UV int2 coordDst = (int2)(get_global_id(0), get_global_id(1)); // base on UV coordinate of dest image int2 coordSrc = coordDst >> 1; float2 diffCoord = 0.5f * (convert_float2(coordDst) + 0.5f) - convert_float2(coordSrc); __constant float* pLutDirUV = NULL; if (diffCoord.x < 0.5f) // left, =0.25 { if (diffCoord.y < 0.5f) { // top, =0.25 pLutDirUV = g_bicubicUpscaleCoefs[0]; } else { // bottom, =0.75 pLutDirUV = g_bicubicUpscaleCoefs[2]; } } else // right, =0.75 { if (diffCoord.y < 0.5f) { pLutDirUV = g_bicubicUpscaleCoefs[1]; } else { pLutDirUV = g_bicubicUpscaleCoefs[3]; } } float4 dstValueUV = 0.f; for (int i = 0; i < 4; i++) // y { for (int j = 0; j < 4; j++) // x { int idx = i * 4 + j; float4 srcValue = read_imagef(srcImgUV, g_samplerNearest, coordSrc + (int2)(j - 1, i - 1)); dstValueUV += srcValue * pLutDirUV[idx]; } } // if (dstValueUV.x < 15.f/255.f || dstValueUV.x > 240.f/255.f || dstValueUV.y < 15.f/255.f || dstValueUV.y > 240.f/255.f) // printf("pixel (%d, %d) dstValueUV (%6.3f, %6.3f) out of range!\n", coordDst.x, coordDst.y, dstValueUV.x*255.f, dstValueUV.y*255.f); dstValueUV = clamp(dstValueUV, 16.f/255.f, 240.f/255.f); write_imagef(dstImgUV, coordDst, dstValueUV); /// Y coordSrc = coordDst; coordDst <<= 1; uint4 regionIdx = read_imageui(regionInfo, g_samplerNearest, coordSrc); __constant float (*pLutDirY)[16] = g_directionUpscaleCoefs[regionIdx.x]; float4 dstValue00 = 0.f; float4 dstValue01 = 0.f; float4 dstValue10 = 0.f; float4 dstValue11 = 0.f; for (int i = 0; i < 4; i++) // y { for (int j = 0; j < 4; j++) // x { int idx = i * 4 + j; float4 srcValue = read_imagef(srcImgY, g_samplerNearest, coordSrc + (int2)(j - 1, i - 1)); dstValue00 += srcValue * pLutDirY[0][idx]; dstValue01 += srcValue * pLutDirY[1][idx]; dstValue10 += srcValue * pLutDirY[2][idx]; dstValue11 += srcValue * pLutDirY[3][idx]; } } // if (dstValue00.x < 15.f/255.f || dstValue01.x > 235.f/255.f || dstValue10.x < 15.f/255.f || dstValue11.x > 235.f/255.f) // printf("pixel (%d, %d) dstValueY {%6.3f, %6.3f, %6.3f, %6.3f} out of range!\n", coordDst.x, coordDst.y, dstValue00.x*255.f, dstValue01.x*255.f, dstValue10.x*255.f, dstValue11.x*255.f); dstValue00 = clamp(dstValue00, 16.f/255.f, 235.f/255.f); dstValue01 = clamp(dstValue01, 16.f/255.f, 235.f/255.f); dstValue10 = clamp(dstValue10, 16.f/255.f, 235.f/255.f); dstValue11 = clamp(dstValue11, 16.f/255.f, 235.f/255.f); write_imagef(dstImgY, coordDst + (int2)(0, 0), dstValue00); write_imagef(dstImgY, coordDst + (int2)(1, 0), dstValue01); write_imagef(dstImgY, coordDst + (int2)(0, 1), dstValue10); write_imagef(dstImgY, coordDst + (int2)(1, 1), dstValue11); } __kernel void clkernel_SR_upscale_16( __read_only image2d_t srcImgY, // CL_UNORM_INT8 __read_only image2d_t srcImgUV, // CL_UNORM_INT8 __read_only image2d_t regionInfo, // CL_UNSIGNED_INT8 __write_only image2d_t dstImgY, // CL_UNORM_INT8 __write_only image2d_t dstImgUV // CL_UNORM_INT8 ) { /// 4 UV pixels, coordinate is base on the half UV size of dest image int2 coordDst = (int2)(get_global_id(0), get_global_id(1)) * 2; int2 coordSrc = coordDst >> 1; __constant float (*pLutDirUpscale)[16] = NULL; float4 dstValue00 = 0.f; float4 dstValue01 = 0.f; float4 dstValue10 = 0.f; float4 dstValue11 = 0.f; /// use bicubic LUT for channeo UV pLutDirUpscale = g_bicubicUpscaleCoefs; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { int idx = i * 4 + j; float4 srcValue = read_imagef(srcImgUV, g_samplerNearest, coordSrc + (int2)(j - 1, i - 1)); dstValue00 += srcValue * g_bicubicUpscaleCoefs[0][idx]; dstValue01 += srcValue * g_bicubicUpscaleCoefs[1][idx]; dstValue10 += srcValue * g_bicubicUpscaleCoefs[2][idx]; dstValue11 += srcValue * g_bicubicUpscaleCoefs[3][idx]; } } dstValue00 = clamp(dstValue00, 16.f/255.f, 240.f/255.f); dstValue01 = clamp(dstValue01, 16.f/255.f, 240.f/255.f); dstValue10 = clamp(dstValue10, 16.f/255.f, 240.f/255.f); dstValue11 = clamp(dstValue11, 16.f/255.f, 240.f/255.f); write_imagef(dstImgUV, coordDst + (int2)(0, 0), dstValue00); write_imagef(dstImgUV, coordDst + (int2)(1, 0), dstValue01); write_imagef(dstImgUV, coordDst + (int2)(0, 1), dstValue10); write_imagef(dstImgUV, coordDst + (int2)(1, 1), dstValue11); /// 16 Y pixels, change coordinate to channel Y coordSrc = coordDst; coordDst <<= 1; // valid range: [0:1:8] uint4 idx00 = read_imageui(regionInfo, g_samplerNearest, coordSrc + (int2)(0, 0)); uint4 idx01 = read_imageui(regionInfo, g_samplerNearest, coordSrc + (int2)(1, 0)); uint4 idx10 = read_imageui(regionInfo, g_samplerNearest, coordSrc + (int2)(0, 1)); uint4 idx11 = read_imageui(regionInfo, g_samplerNearest, coordSrc + (int2)(1, 1)); /* __constant */int ofsx[4] = {0, 1, 0, 1}; /* __constant */int ofsy[4] = {0, 0, 1, 1}; uint ofstb[4] = {idx00.x, idx01.x, idx10.x, idx11.x}; // [0:8] for (int t = 0; t < 4; t++) { pLutDirUpscale = g_directionUpscaleCoefs[ofstb[t]]; int2 ofsSrc = (int2)(ofsx[t], ofsy[t]); int2 ofsDst = ofsSrc * 2; dstValue00 = (float4)00.f; dstValue01 = (float4)00.f; dstValue10 = (float4)00.f; dstValue11 = (float4)00.f; for (int i = 0; i < 4; i++) // y { for (int j = 0; j < 4; j++) // x { int idx = i * 4 + j; float4 srcValue = read_imagef(srcImgY, g_samplerNearest, coordSrc + ofsSrc + (int2)(j - 1, i - 1)); dstValue00 += srcValue * pLutDirUpscale[0][idx]; dstValue01 += srcValue * pLutDirUpscale[1][idx]; dstValue10 += srcValue * pLutDirUpscale[2][idx]; dstValue11 += srcValue * pLutDirUpscale[3][idx]; } } dstValue00 = clamp(dstValue00, 16.f/255.f, 235.f/255.f); dstValue01 = clamp(dstValue01, 16.f/255.f, 235.f/255.f); dstValue10 = clamp(dstValue10, 16.f/255.f, 235.f/255.f); dstValue11 = clamp(dstValue11, 16.f/255.f, 235.f/255.f); write_imagef(dstImgY, coordDst + (int2)(0, 0) + ofsDst, dstValue00); write_imagef(dstImgY, coordDst + (int2)(1, 0) + ofsDst, dstValue01); write_imagef(dstImgY, coordDst + (int2)(0, 1) + ofsDst, dstValue10); write_imagef(dstImgY, coordDst + (int2)(1, 1) + ofsDst, dstValue11); } } __kernel void clkernel_SR_getPixelGradient_RGBA( __read_only image2d_t srcImgRgba, // CL_UNORM_INT8 __write_only image2d_t edgeInfo // CL_UNORM_INT8 ) { // base on channel Y, full size int2 coord = (int2)(get_global_id(0), get_global_id(1)); // pixel order: RGB, value range: [0.f, 1.f] => [0, 255] float4 p00 = read_imagef(srcImgRgba, g_samplerNearest, coord + (int2)(-1, -1)); float4 p01 = read_imagef(srcImgRgba, g_samplerNearest, coord + (int2)( 0, -1)); float4 p02 = read_imagef(srcImgRgba, g_samplerNearest, coord + (int2)( 1, -1)); float4 p10 = read_imagef(srcImgRgba, g_samplerNearest, coord + (int2)(-1, 0)); float4 p12 = read_imagef(srcImgRgba, g_samplerNearest, coord + (int2)( 1, 0)); float4 p20 = read_imagef(srcImgRgba, g_samplerNearest, coord + (int2)(-1, 1)); float4 p21 = read_imagef(srcImgRgba, g_samplerNearest, coord + (int2)( 0, 1)); float4 p22 = read_imagef(srcImgRgba, g_samplerNearest, coord + (int2)( 1, 1)); float g00 = 0.299f * p00.x + 0.587f * p00.y + 0.114f * p00.z; float g01 = 0.299f * p01.x + 0.587f * p01.y + 0.114f * p01.z; float g02 = 0.299f * p02.x + 0.587f * p02.y + 0.114f * p02.z; float g10 = 0.299f * p10.x + 0.587f * p10.y + 0.114f * p10.z; float g12 = 0.299f * p12.x + 0.587f * p12.y + 0.114f * p12.z; float g20 = 0.299f * p20.x + 0.587f * p20.y + 0.114f * p20.z; float g21 = 0.299f * p21.x + 0.587f * p21.y + 0.114f * p21.z; float g22 = 0.299f * p22.x + 0.587f * p22.y + 0.114f * p22.z; // get edge pixel float gx = g02 - g00 + 2.f * (g12 - g10) + g22 - g20; // max: 255*4 => 4.f float gy = g20 - g00 + 2.f * (g21 - g01) + g22 - g02; // min: -255*4 => -4.f float gradient = (fabs(gx) + fabs(gy)) / 8.f; // norm to [0.f, 1.f] float4 dstValue = (float4)(gradient, 0.f, 0.f, 1.f); float th_minGrad = 10.f / 255.f; bool isEdgeCandidate = fabs(gx) > th_minGrad && fabs(gy) > th_minGrad; if (isEdgeCandidate) // edge candidate { // NOTE: -gy should be used here, because of the difference between image coordinate and direction coordinate. // angle, [rad], [-0.5, +0.5] => [0., 1.] ([0, 180] degree) dstValue.y = (atanpi(-gy / gx) + 0.5f) * 180.f / 255.f; } write_imagef(edgeInfo, coord, dstValue); } __kernel void clkernel_SR_directionFilter_RGBA( __read_only image2d_t srcImgRgba, // CL_UNORM_INT8 __read_only image2d_t regionInfo, // CL_UNSIGNED_INT8 __write_only image2d_t dstImgRGB // CL_UNORM_INT8 ) { /// get src value & direction info int2 coord = (int2)(get_global_id(0), get_global_id(1)); float4 srcValue = read_imagef(srcImgRgba, g_samplerNearest, coord); uint4 regionIdx = read_imageui(regionInfo, g_samplerNearest, coord); // valid range: [0:1:8] float4 dstValue = srcValue; bool isValidRegion = regionIdx.x > 0u; if (isValidRegion) { __constant float* pLutDirFilter = g_directionFilterCoefs[regionIdx.x - 1u]; dstValue = (float4)0.f; for (int i = 0; i < 5; i++) { int tbidx = i * 5; for (int j = 0; j < 5; j++) { srcValue = read_imagef(srcImgRgba, g_samplerNearest, coord + (int2)(j - 2, i - 2)); dstValue += srcValue * pLutDirFilter[tbidx]; tbidx++; } } dstValue = clamp(dstValue, 0.f, 1.f); } write_imagef(dstImgRGB, coord, dstValue); } __kernel void clkernel_SR_upscale_RGBA( __read_only image2d_t srcImgRgba, // CL_UNORM_INT8 __read_only image2d_t regionInfo, // CL_UNSIGNED_INT8 __write_only image2d_t dstImgRGB // CL_UNORM_INT8 ) { /// 4 rgb pixels, coordinate is base on the half rgba size of source image int2 coordSrc = (int2)(get_global_id(0), get_global_id(1)); int2 coordDst = coordSrc << 1; // valid range: [0:1:8] uint4 regionIdx = read_imageui(regionInfo, g_samplerNearest, coordSrc); __constant float(*pLutDirUpscale)[16] = g_directionUpscaleCoefs[regionIdx.x]; float4 dstValue00 = 0.f; float4 dstValue01 = 0.f; float4 dstValue10 = 0.f; float4 dstValue11 = 0.f; for (int i = 0; i < 4; i++) // y { for (int j = 0; j < 4; j++) // x { int idx = i * 4 + j; float4 srcValue = read_imagef(srcImgRgba, g_samplerNearest, coordSrc + (int2)(j - 1, i - 1)); dstValue00 += srcValue * pLutDirUpscale[0][idx]; dstValue01 += srcValue * pLutDirUpscale[1][idx]; dstValue10 += srcValue * pLutDirUpscale[2][idx]; dstValue11 += srcValue * pLutDirUpscale[3][idx]; } } dstValue00 = clamp(dstValue00, 0.f, 1.f); dstValue01 = clamp(dstValue01, 0.f, 1.f); dstValue10 = clamp(dstValue10, 0.f, 1.f); dstValue11 = clamp(dstValue11, 0.f, 1.f); write_imagef(dstImgRGB, coordDst + (int2)(0, 0), dstValue00); write_imagef(dstImgRGB, coordDst + (int2)(1, 0), dstValue01); write_imagef(dstImgRGB, coordDst + (int2)(0, 1), dstValue10); write_imagef(dstImgRGB, coordDst + (int2)(1, 1), dstValue11); } #pragma OPENCL EXTENSION cl_khr_fp16 : enable __constant sampler_t SAMPLERMap = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_LINEAR; __constant sampler_t SAMPLERNearest = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; __kernel void depurple(__global const uchar *pylpf, __read_only image2d_t ud, __read_only image2d_t vd, // __write_only image2d_t ud_out, __write_only image2d_t uvd_out, __global uchar *pmap, int imgWid, // proc only if x < procWid (ref to Y) int imgStride, // [in] src pixel stride int thumbStride, // [in] src pixel stride int imgPad ) { const int wid_x = get_global_id(0) + imgPad; // thumb posX const int wid_y = get_global_id(1) + imgPad; // thumb posY const int offsetY = wid_y * thumbStride + wid_x; __global uchar *pInYLpf = ((__global uchar *)pylpf + offsetY); __global uchar *pInMap = ((__global uchar *)pmap + offsetY); uchar radius = 3; float tmp, wt; float cmap; float tmp1, tmp2; float tmpu, tmpv; int2 thumbCord; float sum_u = 0.f; float sum_v = 0.f; float weight = 0.f; float InY = (float)*pInYLpf; //* cmap = (float)*pInMap; if (cmap <= 0.01f) { thumbCord = (int2)(wid_x, wid_y); float4 tmpOutU = read_imagef(ud, SAMPLERNearest, thumbCord); float4 tmpOutV = read_imagef(vd, SAMPLERNearest, thumbCord); write_imagef(uvd_out, thumbCord, (float4)(tmpOutU.s0, tmpOutV.s0, 0, 0)); // write_imagef(vd_out, thumbCord, tmpOutV); return; } //*/ for (int ii = -radius; ii <= radius; ii++) { for (int jj = -radius; jj <= radius; jj++) { #if 1 tmp = InY - (float)*(pInYLpf + ii * thumbStride + jj ); // 26 = 0.1 * 255 tmp = fmax(fmin(5 * (tmp + 26), 255.0f), 0.f); // 1: avoid devided by zero float mapValue = (float)*(pInMap + ii * thumbStride + jj); wt = (float)(((255 - mapValue) * tmp + 128.0f)/256.0f) + 1.0f; #else wt = 255 - *(pmap + (i + ii) * thumbStd + (j + jj)); #endif thumbCord = (int2)(wid_x + jj, wid_y + ii); sum_u += wt * (read_imagef(ud, SAMPLERNearest, thumbCord).s0); sum_v += wt * (read_imagef(vd, SAMPLERNearest, thumbCord).s0); weight += wt; } } tmp1 = (sum_u) / weight; tmp2 = (sum_v) / weight; //tmp1 = round((tmp1 - 128) * (255 - *(pmap + i * thumbStd + j)) / 256.0) + 128; //tmp2 = round((tmp2 - 128) * (255 - *(pmap + i * thumbStd + j)) / 256.0) + 128; cmap = (float)*pInMap/255.f; cmap = 1 - cmap; cmap = fmax(fmin(round(pow(cmap, 6)), 1.f), 0.f); thumbCord = (int2)(wid_x, wid_y); tmpu = read_imagef(ud, SAMPLERNearest, thumbCord).s0; tmpv = read_imagef(vd, SAMPLERNearest, thumbCord).s0; // tmp1 = (tmpu * cmap + tmp1 * (1.f - cmap)); // tmp2 = (tmpv * cmap + tmp2 * (1.f - cmap)); tmp1 = mix(tmp1, tmpu, cmap); tmp2 = mix(tmp2, tmpv, cmap); if (tmp1 <= tmpu) { write_imagef(uvd_out, thumbCord, (float4)(tmp1, tmp2, 0, 0)); // write_imagef(vd_out, thumbCord, (float4)(tmp2, 0, 0, 0)); } else { write_imagef(uvd_out, thumbCord, (float4)(tmpu, tmpv, 0, 0)); // write_imagef(vd_out, thumbCord, (float4)(tmpv, 0, 0, 0)); } return; } // generateOutPointerNV12(uchar* uv, uchar* ud, uchar* ud_, uchar* vd, uchar* vd_, uchar* map) __kernel void generateOut(__global const uchar *pSrcUv, __read_only image2d_t ud, // __read_only image2d_t ud_, __read_only image2d_t vd, __read_only image2d_t uvd_, __global const uchar *pMap, int imgWid, // proc only if x < procWid (ref to Y) int imgStride, // [in] src pixel stride int thumbStride, // [in] src pixel stride int imgPad, int nPlaneOffset, float autoStrengthU, float autoStrengthV, float grayStrengthU, float grayStrengthV ) { const int wid_x = get_global_id(0); // thumb posX const int wid_y = get_global_id(1); // thumb posY const int2 mapDim = get_image_dim(ud) - imgPad*2 - 1; // compute image border const int offsetUY = (wid_y*2 - 1) * imgStride + wid_x * 4 - 2; if (wid_x < 1 || wid_x > mapDim.s0 || wid_y < 1 || wid_y > mapDim.s1) return; int iu = ((wid_y - 1))/1 + imgPad; int id = iu + 1; int jl = ((wid_x - 1))/1 + imgPad; int jr = jl + 1; int offsetULtmb = iu * thumbStride + jl; int offsetURtmb = iu * thumbStride + jr; int offsetDLtmb = id * thumbStride + jl; int offsetDRtmb = id * thumbStride + jr; float mapUL = (float)*(pMap + offsetULtmb); float mapUR = (float)*(pMap + offsetURtmb); float mapDL = (float)*(pMap + offsetDLtmb); float mapDR = (float)*(pMap + offsetDRtmb); // nPlaneOffset = 0; __global uchar *pOutUV0 = ((__global uchar *)pSrcUv + offsetUY + nPlaneOffset); __global uchar *pOutUV1 = ((__global uchar *)pSrcUv + offsetUY + imgStride + nPlaneOffset); float2 thumbCord00 = (float2)(wid_x + imgPad + 0.25f, wid_y + imgPad + 0.25f) - (float2)0.5f; float2 thumbCord01 = (float2)(wid_x + imgPad + 0.75f, wid_y + imgPad + 0.25f) - (float2)0.5f; float2 thumbCord10 = (float2)(wid_x + imgPad + 0.25f, wid_y + imgPad + 0.75f) - (float2)0.5f; float2 thumbCord11 = (float2)(wid_x + imgPad + 0.75f, wid_y + imgPad + 0.75f) - (float2)0.5f; // {s0, s1, s2, s3} = {dy, ds, dh, xx} float4 imagU00 = read_imagef(ud, SAMPLERMap, thumbCord00) * 255.f; // delta float4 imagU01 = read_imagef(ud, SAMPLERMap, thumbCord01) * 255.f; // delta float4 imagU10 = read_imagef(ud, SAMPLERMap, thumbCord10) * 255.f; // delta float4 imagU11 = read_imagef(ud, SAMPLERMap, thumbCord11) * 255.f; // delta float4 imagV00 = read_imagef(vd, SAMPLERMap, thumbCord00) * 255.f; // delta float4 imagV01 = read_imagef(vd, SAMPLERMap, thumbCord01) * 255.f; // delta float4 imagV10 = read_imagef(vd, SAMPLERMap, thumbCord10) * 255.f; // delta float4 imagV11 = read_imagef(vd, SAMPLERMap, thumbCord11) * 255.f; // delta /* float4 imagUf00 = read_imagef(ud_, SAMPLERMap, thumbCord00) * 255.f; // delta float4 imagUf01 = read_imagef(ud_, SAMPLERMap, thumbCord01) * 255.f; // delta float4 imagUf10 = read_imagef(ud_, SAMPLERMap, thumbCord10) * 255.f; // delta float4 imagUf11 = read_imagef(ud_, SAMPLERMap, thumbCord11) * 255.f; // delta */ float4 imagVf00 = read_imagef(uvd_, SAMPLERMap, thumbCord00) * 255.f; // delta float4 imagVf01 = read_imagef(uvd_, SAMPLERMap, thumbCord01) * 255.f; // delta float4 imagVf10 = read_imagef(uvd_, SAMPLERMap, thumbCord10) * 255.f; // delta float4 imagVf11 = read_imagef(uvd_, SAMPLERMap, thumbCord11) * 255.f; // delta float4 inUV0 = convert_float4(vload4(0, pOutUV0)); float4 inUV1 = convert_float4(vload4(0, pOutUV1)); float4 inU = (float4)(inUV0.s0, inUV0.s2, inUV1.s0, inUV1.s2); float4 inV = (float4)(inUV0.s1, inUV0.s3, inUV1.s1, inUV1.s3); float4 tmpU = inU - (float4)(imagU00.s0, imagU01.s0, imagU10.s0, imagU11.s0) + (float4)(imagVf00.s0, imagVf01.s0, imagVf10.s0, imagVf11.s0); float4 tmpV = inV - (float4)(imagV00.s0, imagV01.s0, imagV10.s0, imagV11.s0) + (float4)(imagVf00.s1, imagVf01.s1, imagVf10.s1, imagVf11.s1); // tmpU = clamp(tmpU, 0, 255); // tmpV = clamp(tmpV, 0, 255); tmpU = fmax(fmin(tmpU, 255.f), 0.f); tmpV = fmax(fmin(tmpV, 255.f), 0.f); #if 0 int4 less128; int4 big128; less128 = isless(tmpU, 128.f); big128 = isless(128.f, inU); less128 = less128 & big128; tmpU = select(tmpU, 128.f, less128); tmpU = select(inU, tmpU, big128); #else if (tmpU.s0 < 128.f && inU.s0 > 128.f) tmpU.s0 = 128.f; if (tmpU.s1 < 128.f && inU.s1 > 128.f) tmpU.s1 = 128.f; if (tmpU.s2 < 128.f && inU.s2 > 128.f) tmpU.s2 = 128.f; if (tmpU.s3 < 128.f && inU.s3 > 128.f) tmpU.s3 = 128.f; if (inU.s0 <= 128.f) tmpU.s0 = inU.s0; if (inU.s1 <= 128.f) tmpU.s1 = inU.s1; if (inU.s2 <= 128.f) tmpU.s2 = inU.s2; if (inU.s3 <= 128.f) tmpU.s3 = inU.s3; #endif float4 u_diff = inU - tmpU; float4 v_diff = inV - tmpV; // v_diff = clamp(v_diff, -u_diff, u_diff); v_diff = fmin(fmax(v_diff, -u_diff), u_diff); tmpV = inV - v_diff; tmpU = tmpU * autoStrengthU + (1.0f - autoStrengthU) * inU; tmpV = tmpV * autoStrengthV + (1.0f - autoStrengthV) * inV; float4 outUV0 = (float4)(tmpU.s0, tmpV.s0, tmpU.s1, tmpV.s1); float4 outUV1 = (float4)(tmpU.s2, tmpV.s2, tmpU.s3, tmpV.s3); float tmp1 = (mapUL * 3 + mapUR) / 4.0f; float tmp2 = (mapDL * 3 + mapDR) / 4.0f; float inter_ul = (tmp1 * 3 + tmp2) / 4.0f; float inter_dl = (tmp1 + tmp2 * 3) / 4.0f; tmp1 = (mapUL + mapUR * 3) / 4.0f; tmp2 = (mapDL + mapDR * 3) / 4.0f; float inter_ur = (tmp1 * 3 + tmp2) / 4.0f; float inter_dr = (tmp1 + tmp2 * 3) / 4.0f; /* outUV0.s0 = fmin((outUV0.s0 - 128.f) * (1.0f - strengthManu * inter_ul / 255.f) + 128.f, inU.s0); outUV0.s2 = fmin((outUV0.s2 - 128.f) * (1.0f - strengthManu * inter_ur / 255.f) + 128.f, inU.s1); outUV1.s0 = fmin((outUV1.s0 - 128.f) * (1.0f - strengthManu * inter_dl / 255.f) + 128.f, inU.s2); outUV1.s2 = fmin((outUV1.s2 - 128.f) * (1.0f - strengthManu * inter_dr / 255.f) + 128.f, inU.s3); //*/ float4 grayStrengthUV = (float4)(grayStrengthU, grayStrengthV, grayStrengthU, grayStrengthV); outUV0 = fmin(((outUV0 - 128.f) * (1.0f - grayStrengthUV * (float4)(inter_ul, inter_ul, inter_ur, inter_ur) / 255.f) + 128.f), outUV0); outUV1 = fmin(((outUV1 - 128.f) * (1.0f - grayStrengthUV * (float4)(inter_dl, inter_dl, inter_dr, inter_dr) / 255.f) + 128.f), outUV1); vstore4(convert_uchar4(outUV0 + 0.5f), 0, (__global uchar*)(pOutUV0)); vstore4(convert_uchar4(outUV1 + 0.5f), 0, (__global uchar*)(pOutUV1)); // float4 tmpMapU = (float4)(mapUL, mapDL, mapUR, mapDR); // vstore4(convert_uchar4(tmpMapU + 0.5f), 0, (__global uchar*)(pOutUV0)); // vstore4(convert_uchar4(tmpMapU + 0.5f), 0, (__global uchar*)(pOutUV1)); } typedef char RK_Char; // char typedef signed char RK_S8; // s8bit typedef uchar RK_U8; // u8bit typedef short RK_S16; // s16bit typedef ushort RK_U16; // u16bit typedef int RK_S32; // s32bit typedef uint RK_U32; // u32bit typedef float RK_F32; // f32bit typedef ushort U16; // u16bit typedef uint U32; // u32bit #define RKTPRFRAME_RAW_FILE_NUM 16 // Max support raw file num #define RKTPRFRAME_MV_BLK_SIZE 32 // Size of MV-Block: 32x32 #define RKTPRFRAME_PROC_BLOCK_EXTEND_Y 16 // 16 #define RKTPRFRAME_PROC_BLOCK_EXTEND_X 16 // 16 #define RKTPRFRAME_PROC_BLOCK_HGT RKTPRFRAME_MV_BLK_SIZE // 32 #define RKTPRFRAME_PROC_BLOCK_WID RKTPRFRAME_MV_BLK_SIZE // 32 #define RKTPRFRAME_LOAD_BLOCK_HGT RKTPRFRAME_PROC_BLOCK_HGT // 32 #define RKTPRFRAME_LOAD_BLOCK_WID RKTPRFRAME_PROC_BLOCK_WID // 32 #define RKTPRFRAME_LENSGAIN_BITS 4 // Padding num #define RKALGO_TMP_BUF_PAD_NUM 64 // Pad-buf: (H + 2*64) x (W + 2*64) #define RK_MAX_RAW_FILE_NUM 10 // RawSrcs data file number #define RKTPRFRAME_INPUTBIT 10 #define RKTPRFRAME_WEIGHTBIT 4 #define RKTPRFRAME_DPC_TABLE_INPUT 6 #define RKTPRFRAME_LENSGAIN_BITS 4 #define RKTPRFRAME_SAVE_SHIFT_BIT 11 #define RKTPRFRAME_BUFFER_BIT 16 #define RKTPRFRAME_MAPSTEPBIT 11 #define RKTPRFRAME_WIENERBIT 6 #define RKTPRFRAME_MAPMAXVALUE ((1 << RKTPRFRAME_MAPSTEPBIT) * ((1 << RKTPRFRAME_WIENERBIT) - 1)) #define RKTPRFRAME_MOTIONMAPBIT 4 #define RKTPRMERGE_DPC_TABLE_INPUT 6 #define ABS(a) ( (a) > 0 ? (a) : (-(a)) ) #define ABS_U16(a) (RK_U16)( (a) > 0 ? (a) : (-(a)) ) #define ABS_U32(a) (U32)( (a) > 0 ? (a) : (-(a)) ) #define MIN(a, b) ( (a) < (b) ? (a) : (b) ) #define MAX(a, b) ( (a) > (b) ? (a) : (b) ) #define ROUND_U16(a) (RK_U16)( (float) (a) + 0.5 ) #define MAX4(a, b, c, d) MAX( MAX((a), (b)), MAX((c), (d)) ) #define MIN4(a, b, c, d) MIN( MIN((a), (b)), MIN((c), (d)) ) typedef struct { unsigned short mMvMapWid; unsigned short mMvMapHgt; unsigned short mRawWid; // RawSrcs data width unsigned short mRawHgt; // RawSrcs data height unsigned short mRaw10Stride; // Raw10Srcs data Stride (Bytes, 32ByteAlign, W*10/8) unsigned short mRaw16Stride; // (W + 2*Pad) * 2 unsigned short mRaw16OriStride; // Ori u16 Stride: W * 2 unsigned short mMvMapStride; unsigned short mRawBlockStride; // block pixel stride unsigned short mStackBlockStride; // stack block pixel stride unsigned short mFilterRawStride; // pTprFilterRaw block pixel stride unsigned short mNormBlockStride; // norm block pixel stride unsigned short mTprFileNum; unsigned short mRawFrameValids[RKTPRFRAME_RAW_FILE_NUM]; // [api-in] HomographyMatrixValid unsigned short ext_row; unsigned short ext_col; RK_U16 mBlackLevel[4]; RK_U16 mRawBitSub10; RK_U16 FusionSigmaTable[1 << RKTPRFRAME_INPUTBIT]; RK_U16 mWienerTable[1 << RKTPRFRAME_WIENERBIT]; RK_U16 mTprFirstCallFlag; RK_U16 mDpcTable[1 << RKTPRFRAME_DPC_TABLE_INPUT]; RK_U16 mTotalNrFrames; RK_U16 bShortValid; RK_U16 mTprLastCallFlag; RK_U16 mReturnTprFlag; }FRAMETEMPORALDENOISE_PARAM; void CalLensThedMapGain( RK_U16 row, RK_U16 col, RK_U16 Height, RK_U16 Width, RK_U16 *pmThedLensGain) { RK_U16 TableHgt = 13; RK_U16 TableWid = 17; RK_F32 quadcoef = 0.016; RK_U16 RowMid = Height / 2; RK_U16 ColMid = Width / 2; RK_F32 frow; RK_F32 fcol; frow = (RK_F32)row / Height; fcol = (RK_F32)col / Width; frow = frow * TableHgt; fcol = fcol * TableWid; frow = frow - (RK_F32)TableHgt / 2; fcol = fcol - (RK_F32)TableWid / 2; frow = (frow * frow)*quadcoef + 1; fcol = (fcol * fcol)*quadcoef + 1; *pmThedLensGain = ROUND_U16((1 << RKTPRFRAME_LENSGAIN_BITS)/sqrt(frow * fcol)); } /* param.mWienerTable, param.mTprFirstCallFlag, param.mDpcTable, param.mTotalNrFrames, param.bShortValid, param.mTprLastCallFlag, param.mRawBitSub10, param.FusionSigmaTable, param.mReturnTprFlag*/ inline void BlockDenoiseProc( __private const int numBlocks, __private const int subHgt, __private const int subWid, __global RK_U16* pRawBlockSrcs[], __global RK_U16* pStackRawBlockSrc, __global RK_U16* pStackWgtBlockSrc, __global RK_U16* pStackRawBlockDst, __global RK_U16* pStackWgtBlockDst, __global RK_U16* pNormRawBlockDst, __private const RK_U16 mRawBlockStride, __private const RK_U16 mThedLensGain, __private const RK_U16 mStackBlockStride, __private const RK_U16 *mRawBlockValids, __private const RK_S16 *mBlockSearchMvX, __private const RK_S16 *mBlockSearchMvY, __private const RK_U16 mNormBlockStride, __private const FRAMETEMPORALDENOISE_PARAM param /* __private const RK_U16 mRawBitSub10, __private const RK_U16 *FusionSigmaTable, __private const RK_U16 *mWienerTable, __private const RK_U16 mTprFirstCallFlag, __private const RK_U16 *mDpcTable, __private const RK_U16 mTotalNrFrames, __private const RK_U16 bShortValid, __private const RK_U16 mTprLastCallFlag, __private const RK_U16 mReturnTprFlag*/ ) { __private const RK_U16 *mBlackLevel = param.mBlackLevel; __private const RK_U16 mRawBitSub10 = param.mRawBitSub10; __private const RK_U16 *FusionSigmaTable = param.FusionSigmaTable; __private const RK_U16 *mWienerTable = param.mWienerTable; __private const RK_U16 mTprFirstCallFlag = param.mTprFirstCallFlag; __private const RK_U16 *mDpcTable = param.mDpcTable; __private const RK_U16 mTotalNrFrames = param.mTotalNrFrames; __private const RK_U16 bShortValid = param.bShortValid; __private const RK_U16 mTprLastCallFlag = param.mTprLastCallFlag; __private const RK_U16 mReturnTprFlag = param.mReturnTprFlag; __private const RK_U16 mTprFileNum = param.mTprFileNum; /* printf("mBlackLevel = %d ", mBlackLevel[0]); printf("mRawBitSub10 = %d ", mRawBitSub10); printf("mTprFirstCallFlag = %d ", mTprFirstCallFlag); printf("mTotalNrFrames = %d ", mTotalNrFrames); printf("bShortValid = %d ", bShortValid); printf("mTprLastCallFlag = %d ", mTprLastCallFlag); printf("mReturnTprFlag = %d ", mReturnTprFlag); printf("mTprFileNum = %d ", mTprFileNum); */ // RK_U16 blackLevel = mBlackLevel[0] >> 2; RK_U16 dpcShift = RKTPRFRAME_INPUTBIT - RKTPRFRAME_DPC_TABLE_INPUT; // TO DO // ---C __global RK_U16* pTmpSrc = NULL; __global RK_U16* pTmpDst = NULL; RK_U16 baseValue0, baseValue1, baseValue2, baseValue3; // RawBase value RK_U16 refValue0, refValue1, refValue2, refValue3; // RawRef value RK_U16 baseFilterValue0, baseFilterValue1, baseFilterValue2, baseFilterValue3; // RawBase Filter value RK_U16 refFilterValue0, refFilterValue1, refFilterValue2, refFilterValue3; // RawRef Filter value ushort sigmaValue0, sigmaValue1, sigmaValue2, sigmaValue3; // Motion Detect Threshold RK_S32 weightTmpValue0, weightTmpValue1, weightTmpValue2, weightTmpValue3, weightTmpValue; RK_U16 weightDpcValue0, weightDpcValue1, weightDpcValue2, weightDpcValue3, weightDpcValue; RK_U16 weightValue0, weightValue1, weightValue2, weightValue3, weightValue; RK_U32 numeratorValue0, numeratorValue1, numeratorValue2, numeratorValue3; RK_U16 denominatorValue0, denominatorValue1, denominatorValue2, denominatorValue3; RK_U16 stackRaw0, stackRaw1, stackRaw2, stackRaw3; // StackRaw RK_U16 stackWgt0, stackWgt1, stackWgt2, stackWgt3; // StackWgt RK_U32 tmpDataValue0, tmpDataValue1, tmpDataValue2, tmpDataValue3; RK_U16 dpcTh0, dpcTh1, dpcTh2, dpcTh3; // SubBlock Size of Chunk RK_U16 nProcBlkHgt = MIN(RKTPRFRAME_PROC_BLOCK_HGT, subHgt); // Sub Block Hgt <=32 RK_U16 nProcBlkWid = MIN(RKTPRFRAME_PROC_BLOCK_WID, subWid); // Sub Block Wid <=64 // SubBlock Offset of Chunk RK_U16 offsetBaseY; // offset RK_U16 offsetBaseX; // offset RK_U16 offsetRefY; // offset RK_U16 offsetRefX; // offset #if 1 // temp info __global RK_U16* p_u16_srcs[RK_MAX_RAW_FILE_NUM]; RK_U16 n_u16_stride[RK_MAX_RAW_FILE_NUM]; for (int k = 0; k < mTprFileNum; k++) { p_u16_srcs[k] = pRawBlockSrcs[k]; n_u16_stride[k] = mRawBlockStride; } // fusion for (int n = 0; n < numBlocks; n++) // Block#n in Chunk { offsetBaseY = RKTPRFRAME_PROC_BLOCK_EXTEND_Y; offsetBaseX = RKTPRFRAME_PROC_BLOCK_EXTEND_X; // limit nProcBlkHgt = MIN(RKTPRFRAME_PROC_BLOCK_HGT, subHgt); nProcBlkWid = MIN(RKTPRFRAME_PROC_BLOCK_WID, subWid - n * RKTPRFRAME_PROC_BLOCK_WID); for (int r = 0; r < nProcBlkHgt; r += 2) { for (int c = 0; c < nProcBlkWid; c += 2) { // data from RawSrcs pTmpSrc = p_u16_srcs[0] + (offsetBaseY + r) * n_u16_stride[0] + (offsetBaseX + c); baseValue0 = pTmpSrc[0]; baseValue1 = pTmpSrc[1]; pTmpSrc += n_u16_stride[0]; baseValue2 = pTmpSrc[0]; baseValue3 = pTmpSrc[1]; // MFNR-10bitInput sigmaValue0 = FusionSigmaTable[baseValue0>>mRawBitSub10]; sigmaValue1 = FusionSigmaTable[baseValue1>>mRawBitSub10]; sigmaValue2 = FusionSigmaTable[baseValue2>>mRawBitSub10]; sigmaValue3 = FusionSigmaTable[baseValue3>>mRawBitSub10]; sigmaValue0 = (sigmaValue0 * mThedLensGain) >> RKTPRFRAME_LENSGAIN_BITS; sigmaValue1 = (sigmaValue1 * mThedLensGain) >> RKTPRFRAME_LENSGAIN_BITS; sigmaValue2 = (sigmaValue2 * mThedLensGain) >> RKTPRFRAME_LENSGAIN_BITS; sigmaValue3 = (sigmaValue3 * mThedLensGain) >> RKTPRFRAME_LENSGAIN_BITS; // dpcTh0 = mDpcTable[MAX((RK_S16)baseValue0 - blackLevel, 0) >> dpcShift]; dpcTh1 = mDpcTable[MAX((RK_S16)baseValue1 - blackLevel, 0) >> dpcShift]; dpcTh2 = mDpcTable[MAX((RK_S16)baseValue2 - blackLevel, 0) >> dpcShift]; dpcTh3 = mDpcTable[MAX((RK_S16)baseValue3 - blackLevel, 0) >> dpcShift]; if (0)//((r == 0) && (c == 0) && (n == 0)) { printf("baseValue0:%d %d %d %d\n", baseValue0, baseValue1, baseValue2, baseValue3); printf("sigmaValue1:%d %d %d %d\n", sigmaValue0, sigmaValue1, sigmaValue2, sigmaValue3); printf("dpcTh0:%d %d %d %d\n", dpcTh0, dpcTh1, dpcTh2, dpcTh3); } if (mTprFirstCallFlag == 0) { numeratorValue0 = baseValue0 * (1 << RKTPRFRAME_WEIGHTBIT); // <<4 numeratorValue1 = baseValue1 * (1 << RKTPRFRAME_WEIGHTBIT); numeratorValue2 = baseValue2 * (1 << RKTPRFRAME_WEIGHTBIT); numeratorValue3 = baseValue3 * (1 << RKTPRFRAME_WEIGHTBIT); denominatorValue0 = (1 << RKTPRFRAME_WEIGHTBIT); // <<4 denominatorValue1 = (1 << RKTPRFRAME_WEIGHTBIT); denominatorValue2 = (1 << RKTPRFRAME_WEIGHTBIT); denominatorValue3 = (1 << RKTPRFRAME_WEIGHTBIT); stackRaw0 = (RK_U16)(numeratorValue0 >> (RKTPRFRAME_BUFFER_BIT - RKTPRFRAME_SAVE_SHIFT_BIT)); // >>(16-11) = >>5 stackRaw1 = (RK_U16)(numeratorValue1 >> (RKTPRFRAME_BUFFER_BIT - RKTPRFRAME_SAVE_SHIFT_BIT)); stackRaw2 = (RK_U16)(numeratorValue2 >> (RKTPRFRAME_BUFFER_BIT - RKTPRFRAME_SAVE_SHIFT_BIT)); stackRaw3 = (RK_U16)(numeratorValue3 >> (RKTPRFRAME_BUFFER_BIT - RKTPRFRAME_SAVE_SHIFT_BIT)); stackWgt0 = denominatorValue0 + (RK_U16)(numeratorValue0 << RKTPRFRAME_SAVE_SHIFT_BIT); // <<11 stackWgt1 = denominatorValue1 + (RK_U16)(numeratorValue1 << RKTPRFRAME_SAVE_SHIFT_BIT); stackWgt2 = denominatorValue2 + (RK_U16)(numeratorValue2 << RKTPRFRAME_SAVE_SHIFT_BIT); stackWgt3 = denominatorValue3 + (RK_U16)(numeratorValue3 << RKTPRFRAME_SAVE_SHIFT_BIT); } else { // Read Prev StackRaw Result pTmpSrc = pStackRawBlockSrc + r * mStackBlockStride + c + n * RKTPRFRAME_PROC_BLOCK_WID; stackRaw0 = pTmpSrc[0]; stackRaw1 = pTmpSrc[1]; pTmpSrc += mStackBlockStride; stackRaw2 = pTmpSrc[0]; stackRaw3 = pTmpSrc[1]; // Read Prev StackWgt Result pTmpSrc = pStackWgtBlockSrc + r * mStackBlockStride + c + n * RKTPRFRAME_PROC_BLOCK_WID; stackWgt0 = pTmpSrc[0]; stackWgt1 = pTmpSrc[1]; pTmpSrc += mStackBlockStride; stackWgt2 = pTmpSrc[0]; stackWgt3 = pTmpSrc[1]; } numeratorValue0 = ((RK_U32)stackRaw0 << (RKTPRFRAME_BUFFER_BIT - RKTPRFRAME_SAVE_SHIFT_BIT)) + (stackWgt0 >> RKTPRFRAME_SAVE_SHIFT_BIT); numeratorValue1 = ((RK_U32)stackRaw1 << (RKTPRFRAME_BUFFER_BIT - RKTPRFRAME_SAVE_SHIFT_BIT)) + (stackWgt1 >> RKTPRFRAME_SAVE_SHIFT_BIT); numeratorValue2 = ((RK_U32)stackRaw2 << (RKTPRFRAME_BUFFER_BIT - RKTPRFRAME_SAVE_SHIFT_BIT)) + (stackWgt2 >> RKTPRFRAME_SAVE_SHIFT_BIT); numeratorValue3 = ((RK_U32)stackRaw3 << (RKTPRFRAME_BUFFER_BIT - RKTPRFRAME_SAVE_SHIFT_BIT)) + (stackWgt3 >> RKTPRFRAME_SAVE_SHIFT_BIT); denominatorValue0 = stackWgt0 & ((1 << RKTPRFRAME_SAVE_SHIFT_BIT) - 1); denominatorValue1 = denominatorValue0; denominatorValue2 = denominatorValue0; denominatorValue3 = denominatorValue0; // RawBase Filter baseFilterValue0 = 0; baseFilterValue1 = 0; baseFilterValue2 = 0; baseFilterValue3 = 0; for (int p = -4; p <= 4; p += 2) for (int q = -4; q <= 4; q += 2) { baseFilterValue0 += (*(p_u16_srcs[0] + (offsetBaseY + r + 0 + p) * n_u16_stride[0] + (offsetBaseX + c + 0 + q)))>>mRawBitSub10; baseFilterValue1 += (*(p_u16_srcs[0] + (offsetBaseY + r + 0 + p) * n_u16_stride[0] + (offsetBaseX + c + 1 + q)))>>mRawBitSub10; baseFilterValue2 += (*(p_u16_srcs[0] + (offsetBaseY + r + 1 + p) * n_u16_stride[0] + (offsetBaseX + c + 0 + q)))>>mRawBitSub10; baseFilterValue3 += (*(p_u16_srcs[0] + (offsetBaseY + r + 1 + p) * n_u16_stride[0] + (offsetBaseX + c + 1 + q)))>>mRawBitSub10; } if (0)//((r == 0) && (c == 0) && (n == 0)) { printf("baseFilterValue0:%d %d %d %d\n", baseFilterValue0, baseFilterValue1, baseFilterValue2, baseFilterValue3); } // Ref for (int k = 1; k < mTprFileNum; k++) { if (mRawBlockValids[k]) { offsetRefY = RKTPRFRAME_PROC_BLOCK_EXTEND_Y + mBlockSearchMvY[k]; offsetRefX = RKTPRFRAME_PROC_BLOCK_EXTEND_X + mBlockSearchMvX[k]; // RawRef pTmpSrc = p_u16_srcs[k] + (offsetRefY + r) * n_u16_stride[k] + (offsetRefX + c); refValue0 = pTmpSrc[0]; refValue1 = pTmpSrc[1]; pTmpSrc += n_u16_stride[k]; refValue2 = pTmpSrc[0]; refValue3 = pTmpSrc[1]; refFilterValue0 = 0; refFilterValue1 = 0; refFilterValue2 = 0; refFilterValue3 = 0; for (int p = -4; p <= 4; p += 2) for (int q = -4; q <= 4; q += 2) { refFilterValue0 += (*(p_u16_srcs[k] + (offsetRefY + r + 0 + p) * n_u16_stride[k] + (offsetRefX + c + 0 + q)))>>mRawBitSub10; refFilterValue1 += (*(p_u16_srcs[k] + (offsetRefY + r + 0 + p) * n_u16_stride[k] + (offsetRefX + c + 1 + q)))>>mRawBitSub10; refFilterValue2 += (*(p_u16_srcs[k] + (offsetRefY + r + 1 + p) * n_u16_stride[k] + (offsetRefX + c + 0 + q)))>>mRawBitSub10; refFilterValue3 += (*(p_u16_srcs[k] + (offsetRefY + r + 1 + p) * n_u16_stride[k] + (offsetRefX + c + 1 + q)))>>mRawBitSub10; } if (0)//((r == 0) && (c == 0) && (n == 0)) { printf("----------k = %d\n", k); printf("refFilterValue0:%d %d %d %d\n", refFilterValue0, refFilterValue1, refFilterValue2, refFilterValue3); } weightDpcValue0 = ABS_U16((RK_S16)baseValue0 - (RK_S16)refValue0) < dpcTh0; weightDpcValue1 = ABS_U16((RK_S16)baseValue1 - (RK_S16)refValue1) < dpcTh1; weightDpcValue2 = ABS_U16((RK_S16)baseValue2 - (RK_S16)refValue2) < dpcTh2; weightDpcValue3 = ABS_U16((RK_S16)baseValue3 - (RK_S16)refValue3) < dpcTh3; weightDpcValue = MIN4(weightDpcValue0, weightDpcValue1, weightDpcValue2, weightDpcValue3); weightTmpValue0 = ABS_U32((RK_S32)baseFilterValue0 - (RK_S32)refFilterValue0) * (RK_S32)sigmaValue0; weightTmpValue1 = ABS_U32((RK_S32)baseFilterValue1 - (RK_S32)refFilterValue1) * (RK_S32)sigmaValue1; weightTmpValue2 = ABS_U32((RK_S32)baseFilterValue2 - (RK_S32)refFilterValue2) * (RK_S32)sigmaValue2; weightTmpValue3 = ABS_U32((RK_S32)baseFilterValue3 - (RK_S32)refFilterValue3) * (RK_S32)sigmaValue3; weightTmpValue = MAX4(weightTmpValue0, weightTmpValue1, weightTmpValue2, weightTmpValue3); weightTmpValue = MIN(weightTmpValue, RKTPRFRAME_MAPMAXVALUE); weightTmpValue = weightTmpValue >> RKTPRFRAME_MAPSTEPBIT; weightValue = mWienerTable[weightTmpValue] * weightDpcValue; denominatorValue0 += weightValue; denominatorValue1 += weightValue; denominatorValue2 += weightValue; denominatorValue3 += weightValue; numeratorValue0 += (RK_U32)refValue0 * weightValue; numeratorValue1 += (RK_U32)refValue1 * weightValue; numeratorValue2 += (RK_U32)refValue2 * weightValue; numeratorValue3 += (RK_U32)refValue3 * weightValue; } // if k if (0)//(r == 0 && c == 0) { printf("weightTmpValue0:%d %d %d %d\n", weightTmpValue0, weightTmpValue1, weightTmpValue2, weightTmpValue3); printf("----------k = %d, weightTmpValue(%d), weightDpcValue(%d)\n", k, weightTmpValue, weightDpcValue); printf("numeratorValue:%d %d %d %d\n", numeratorValue0, numeratorValue1, numeratorValue2, numeratorValue3); printf("denominatorValue:%d %d %d %d\n", denominatorValue0, denominatorValue1, denominatorValue2, denominatorValue3); } } // for k if (mTprLastCallFlag) { int scale = 1; if (bShortValid) { // bShortValid = 1 scale = mTotalNrFrames; } else { // bShortValid = 0 scale = 16; } if (mReturnTprFlag) { scale = 16; } denominatorValue0 <<= mRawBitSub10; denominatorValue1 <<= mRawBitSub10; denominatorValue2 <<= mRawBitSub10; denominatorValue3 <<= mRawBitSub10; stackRaw0 = (numeratorValue0 * scale + denominatorValue0 / 2) / denominatorValue0; stackRaw1 = (numeratorValue1 * scale + denominatorValue1 / 2) / denominatorValue1; stackRaw2 = (numeratorValue2 * scale + denominatorValue2 / 2) / denominatorValue2; stackRaw3 = (numeratorValue3 * scale + denominatorValue3 / 2) / denominatorValue3; stackWgt0 = denominatorValue0 >> (RKTPRFRAME_WEIGHTBIT - RKTPRFRAME_MOTIONMAPBIT + mRawBitSub10); stackWgt1 = denominatorValue1 >> (RKTPRFRAME_WEIGHTBIT - RKTPRFRAME_MOTIONMAPBIT + mRawBitSub10); stackWgt2 = denominatorValue2 >> (RKTPRFRAME_WEIGHTBIT - RKTPRFRAME_MOTIONMAPBIT + mRawBitSub10); stackWgt3 = denominatorValue3 >> (RKTPRFRAME_WEIGHTBIT - RKTPRFRAME_MOTIONMAPBIT + mRawBitSub10); } else { stackRaw0 = (RK_U16)(numeratorValue0 >> (RKTPRFRAME_BUFFER_BIT-RKTPRFRAME_SAVE_SHIFT_BIT)); stackRaw1 = (RK_U16)(numeratorValue1 >> (RKTPRFRAME_BUFFER_BIT-RKTPRFRAME_SAVE_SHIFT_BIT)); stackRaw2 = (RK_U16)(numeratorValue2 >> (RKTPRFRAME_BUFFER_BIT-RKTPRFRAME_SAVE_SHIFT_BIT)); stackRaw3 = (RK_U16)(numeratorValue3 >> (RKTPRFRAME_BUFFER_BIT-RKTPRFRAME_SAVE_SHIFT_BIT)); stackWgt0 = denominatorValue0 + (RK_U16)(numeratorValue0 << RKTPRFRAME_SAVE_SHIFT_BIT); stackWgt1 = denominatorValue1 + (RK_U16)(numeratorValue1 << RKTPRFRAME_SAVE_SHIFT_BIT); stackWgt2 = denominatorValue2 + (RK_U16)(numeratorValue2 << RKTPRFRAME_SAVE_SHIFT_BIT); stackWgt3 = denominatorValue3 + (RK_U16)(numeratorValue3 << RKTPRFRAME_SAVE_SHIFT_BIT); // store pNormRawBlockDst pTmpDst = pNormRawBlockDst + r * mNormBlockStride + c + n * RKTPRFRAME_PROC_BLOCK_WID; pTmpDst[0] = ROUND_U16(MIN(numeratorValue0 * 16 / denominatorValue0, 0xFFFF)); pTmpDst[1] = ROUND_U16(MIN(numeratorValue1 * 16 / denominatorValue1, 0xFFFF)); pTmpDst += mNormBlockStride; pTmpDst[0] = ROUND_U16(MIN(numeratorValue2 * 16 / denominatorValue2, 0xFFFF)); pTmpDst[1] = ROUND_U16(MIN(numeratorValue3 * 16 / denominatorValue3, 0xFFFF)); if (0)//(1)//(r == 0 && c == 0) { printf("pNormRawBlockDst:%d %d\n", pTmpDst[0], pTmpDst[0]); } } //* if (0)//(r == 0 && c == 0) { printf("numeratorValue:%d %d %d %d\n", numeratorValue0, numeratorValue1, numeratorValue2, numeratorValue3); printf("denominatorValue:%d %d %d %d\n", denominatorValue0, denominatorValue1, denominatorValue2, denominatorValue3); printf("stackRaw0:%d %d %d %d\n", stackRaw0, stackRaw1, stackRaw2, stackRaw3); printf("stackWgt0:%d %d %d %d\n", stackWgt0, stackWgt1, stackWgt2, stackWgt3); } // store StackRaw pTmpDst = pStackRawBlockDst + r * mStackBlockStride + c + n * RKTPRFRAME_PROC_BLOCK_WID; pTmpDst[0] = ROUND_U16(MIN(stackRaw0, 0xFFFF)); pTmpDst[1] = ROUND_U16(MIN(stackRaw1, 0xFFFF)); pTmpDst += mStackBlockStride; pTmpDst[0] = ROUND_U16(MIN(stackRaw2, 0xFFFF)); pTmpDst[1] = ROUND_U16(MIN(stackRaw3, 0xFFFF)); //*/ //* // store StackWgt pTmpDst = pStackWgtBlockDst + r * mStackBlockStride + c + n * RKTPRFRAME_PROC_BLOCK_WID; pTmpDst[0] = stackWgt0; pTmpDst[1] = stackWgt1; pTmpDst += mStackBlockStride; pTmpDst[0] = stackWgt2; pTmpDst[1] = stackWgt3; //*/ } // for c } // for r } // for n #endif } /** Sorting network to sort 8 disks of diameter 5 and return their median. * * @param[in] pTprInStackRaw // [api-in] In numerator * @param[in] pTprInStackWgt // [api-in] In denominator * @param[in] pTprOutStackRaw // [api-out] store Out numerator * @param[in] pTprOutStackWgt // [api-out] store Out denominator * @param[in] pTprNormRawDst // [api-out] NormRawDst = StackRaw / StackWgt * @param[in] pTprFilterRaw // [api-in] store AveFiler/MaxFilter result * * @return Median values for 8 elements. */ __kernel void frametemporaldenoise(__private const FRAMETEMPORALDENOISE_PARAM param, __global const int *pTprMvResult, __global const int *pInRaw0, __global const int *pInRaw1, __global const int *pInRaw2, __global const int *pInRaw3, __global const int *pInRaw4, __global const int *pInRaw5, __global const int *pInRaw6, __global const int *pInRaw7, __global int *pTprInStackRaw0, __global int *pTprInStackWgt0, __global int *pTprOutStackRaw0, __global int *pTprOutStackWgt0, __global int *pTprNormRawDst0, __global int *pTprFilterRaw0) { const int wid_x = get_global_id(0); int n = wid_x; int tmpOffset = RKALGO_TMP_BUF_PAD_NUM * param.mRaw16Stride + RKALGO_TMP_BUF_PAD_NUM * 2; __global char * pTprRawSrcs[8]; pTprRawSrcs[0] = (__global char *)pInRaw0 + tmpOffset; pTprRawSrcs[1] = (__global char *)pInRaw1 + tmpOffset; pTprRawSrcs[2] = (__global char *)pInRaw2 + tmpOffset; pTprRawSrcs[3] = (__global char *)pInRaw3 + tmpOffset; pTprRawSrcs[4] = (__global char *)pInRaw4 + tmpOffset; pTprRawSrcs[5] = (__global char *)pInRaw5 + tmpOffset; pTprRawSrcs[6] = (__global char *)pInRaw6 + tmpOffset; pTprRawSrcs[7] = (__global char *)pInRaw7 + tmpOffset; __global RK_U16 *pTprInStackRaw; __global RK_U16 *pTprInStackWgt; __global RK_U16 *pTprOutStackRaw; __global RK_U16 *pTprOutStackWgt; __global RK_U16 *pTprNormRawDst; __global RK_U16 *pTprFilterRaw; pTprInStackRaw = (__global RK_U16 *)((__global char *)pTprInStackRaw0 + tmpOffset); pTprInStackWgt = (__global RK_U16 *)((__global char *)pTprInStackWgt0 + tmpOffset); pTprOutStackRaw = (__global RK_U16 *)((__global char *)pTprOutStackRaw0 + tmpOffset); pTprOutStackWgt = (__global RK_U16 *)((__global char *)pTprOutStackWgt0 + tmpOffset); pTprNormRawDst = (__global RK_U16 *)((__global char *)pTprNormRawDst0); pTprFilterRaw = (__global RK_U16 *)((__global char *)pTprFilterRaw0 + tmpOffset); __global RK_U16 * pStackRawBlockSrc; __global RK_U16 * pStackWgtBlockSrc; __global RK_U16 * pStackRawBlockDst; __global RK_U16 * pStackWgtBlockDst; __global RK_U16 * pNormRawBlockDst; __global RK_U16 * pFilterRawBlock; __global RK_U16* pRawBlockSrcs[RKTPRFRAME_RAW_FILE_NUM]; // point to blocks of each frame __global RK_S8* pTprMvMapsY[RKTPRFRAME_RAW_FILE_NUM]; // MV Map Result Y: MvHgt x MvWid, stride=4800/64=75 __global RK_S8* pTprMvMapsX[RKTPRFRAME_RAW_FILE_NUM]; // MV Map Result X: MvHgt x MvWid, stride=4800/64=75 int mv_row = 0; int mv_col = 0; RK_U16 mRawBlockStride = param.mRaw16Stride >> 1; // block pixel stride RK_U16 mStackBlockStride = param.mRaw16Stride >> 1; // stack block pixel stride RK_U16 mFilterRawStride = param.mRaw16Stride >> 1; // pTprFilterRaw block pixel stride RK_U16 mNormBlockStride = param.mRawWid; // norm block pixel stride RK_S16 mBlockSearchMvY[RKTPRFRAME_RAW_FILE_NUM]; // store BlockPyrMvSearch() result RK_S16 mBlockSearchMvX[RKTPRFRAME_RAW_FILE_NUM]; // store BlockPyrMvSearch() result for (int i = 0; i < param.mTprFileNum; i++) { mBlockSearchMvY[i] = 0; mBlockSearchMvX[i] = 0; } int mMvMapSize = param.mMvMapHgt * param.mMvMapStride; for (int k = 0; k < param.mTprFileNum; k++) { pTprMvMapsY[k] = (__global RK_S8*)(pTprMvResult + (2 * k + 0) * mMvMapSize); pTprMvMapsX[k] = (__global RK_S8*)(pTprMvResult + (2 * k + 1) * mMvMapSize); } // Proc-Blocks int i_mv = 0; int j_mv = 0; int i_blk = 0; int j_blk = 0; // Block int nProcBlkRow = 0; int nProcBlkCol = 0; int nProcBlkHgt = 0; int nProcBlkWid = 0; // Block with border int nLoadBlkRow_border = 0; int nLoadBlkCol_border = 0; int nLoadBlkHgt_border = 0; int nLoadBlkWid_border = 0; // Block with border & image valid pixel int nLoadBlkRow_valid = 0; int nLoadBlkCol_valid = 0; int nLoadBlkHgt_valid = 0; int nLoadBlkWid_valid = 0; // Proc block setting int nBlockHgt = RKTPRFRAME_LOAD_BLOCK_HGT; // 32 int nBlockWid = RKTPRFRAME_LOAD_BLOCK_WID; // 32 int nExtendRow0 = RKTPRFRAME_PROC_BLOCK_EXTEND_Y; // 16 int nExtendRow1 = RKTPRFRAME_PROC_BLOCK_EXTEND_Y; // 16 int nExtendCol0 = RKTPRFRAME_PROC_BLOCK_EXTEND_X; // 16 int nExtendCol1 = RKTPRFRAME_PROC_BLOCK_EXTEND_X; // 16 RK_U16 mRawBlockValids[RKTPRFRAME_RAW_FILE_NUM]; // temp store : 1-Valid, 0-NonValid // RawSrc: 32x32 i_mv = (n / param.mMvMapWid); j_mv = (n % param.mMvMapWid); i_blk = i_mv * nBlockHgt; j_blk = j_mv * nBlockWid; // Block nProcBlkRow = i_blk + param.ext_row; nProcBlkCol = j_blk + param.ext_col; nProcBlkHgt = MIN(nBlockHgt, param.mRawHgt - nProcBlkRow); nProcBlkWid = MIN(nBlockWid, param.mRawWid - nProcBlkCol); // Block with border nLoadBlkRow_border = nProcBlkRow - nExtendRow0; nLoadBlkCol_border = nProcBlkCol - nExtendCol0; nLoadBlkHgt_border = nExtendRow0 + nBlockHgt + nExtendRow1; nLoadBlkWid_border = nExtendCol0 + nBlockWid + nExtendCol1; // Block with border & image valid pixel nLoadBlkRow_valid = MAX(nLoadBlkRow_border, 0); // Block with border & image valid pixel nLoadBlkCol_valid = MAX(nLoadBlkCol_border, 0); nLoadBlkHgt_valid = MIN(nLoadBlkHgt_border - (nLoadBlkRow_valid - nLoadBlkRow_border), param.mRawHgt - nLoadBlkRow_valid); nLoadBlkWid_valid = MIN(nLoadBlkWid_border - (nLoadBlkCol_valid - nLoadBlkCol_border), param.mRawWid - nLoadBlkCol_valid); // blocks of all frame pRawBlockSrcs[0] = ((__global RK_U16*)pTprRawSrcs[0]) + nLoadBlkRow_border * mRawBlockStride + nLoadBlkCol_border; for (int k = 1; k < param.mTprFileNum; k++) { // init Block Valid mRawBlockValids[k] = param.mRawFrameValids[k]; // update Block Valid with MV mv_row = *(pTprMvMapsY[k] + i_mv * param.mMvMapStride + j_mv); mv_col = *(pTprMvMapsX[k] + i_mv * param.mMvMapStride + j_mv); if ( nLoadBlkRow_border + mv_row < - RKALGO_TMP_BUF_PAD_NUM || nLoadBlkCol_border + mv_col < - RKALGO_TMP_BUF_PAD_NUM || nLoadBlkRow_border + mv_row + nLoadBlkHgt_border >= param.mRawHgt + RKALGO_TMP_BUF_PAD_NUM || nLoadBlkCol_border + mv_col + nLoadBlkWid_border >= param.mRawWid + RKALGO_TMP_BUF_PAD_NUM) { mRawBlockValids[k] = 0; // set to invalid //continue; } // point to blocks of each frame pRawBlockSrcs[k] = ((__global RK_U16*)pTprRawSrcs[k]) + (nLoadBlkRow_border + mv_row) * mRawBlockStride + (nLoadBlkCol_border + mv_col); } // block of stack pStackRawBlockSrc = ((__global RK_U16*)pTprInStackRaw ) + nProcBlkRow * mStackBlockStride + nProcBlkCol; pStackWgtBlockSrc = ((__global RK_U16*)pTprInStackWgt ) + nProcBlkRow * mStackBlockStride + nProcBlkCol; pStackRawBlockDst = ((__global RK_U16*)pTprOutStackRaw) + nProcBlkRow * mStackBlockStride + nProcBlkCol; pStackWgtBlockDst = ((__global RK_U16*)pTprOutStackWgt) + nProcBlkRow * mStackBlockStride + nProcBlkCol; // block of NormRawDst pNormRawBlockDst = ((__global RK_U16*)pTprNormRawDst ) + nProcBlkRow * mNormBlockStride + nProcBlkCol; // block of FilterRaw pFilterRawBlock = ((__global RK_U16*)pTprFilterRaw ) + nProcBlkRow * mFilterRawStride + nProcBlkCol; //* RK_U16 mThedLensGain; CalLensThedMapGain(nProcBlkRow + RKTPRFRAME_PROC_BLOCK_EXTEND_Y, nProcBlkCol + RKTPRFRAME_PROC_BLOCK_EXTEND_X, param.mRawHgt, param.mRawWid, &mThedLensGain);//*/ //* // if (wid_x == 0) BlockDenoiseProc( 1, nProcBlkHgt, nProcBlkWid, pRawBlockSrcs, pStackRawBlockSrc, pStackWgtBlockSrc, pStackRawBlockDst, pStackWgtBlockDst, pNormRawBlockDst, mRawBlockStride, mThedLensGain, mStackBlockStride, mRawBlockValids, mBlockSearchMvX, mBlockSearchMvY, mNormBlockStride, param /* param.mWienerTable, param.mTprFirstCallFlag, param.mDpcTable, param.mTotalNrFrames, param.bShortValid, param.mTprLastCallFlag, param.mRawBitSub10, param.FusionSigmaTable, param.mReturnTprFlag*/ ); if (wid_x == 0) { printf("nProcBlkRow[%d][%d][%d][%d]", nProcBlkRow, mNormBlockStride, nProcBlkCol); printf("pTprNormRawDst[%d][%d][%d][%d]", pTprNormRawDst[0], pTprNormRawDst[1], pTprNormRawDst[2], pTprNormRawDst[3]); printf("pNormRawBlockDst[%d][%d][%d][%d]", pNormRawBlockDst[0], pNormRawBlockDst[1], pNormRawBlockDst[2], pNormRawBlockDst[3]); } //*/ // if (wid_x %10 == 0) { // printf("wid_x(%d), mMvMapWid(%d), ext_row(%d)", wid_x, param.mMvMapWid, param.ext_row); } } #ifdef cl_arm_printf #pragma OPENCL EXTENSION cl_arm_printf : enable #endif __constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_NONE | CLK_FILTER_NEAREST; /* __kernel void mipi10_to_unpacked(__read_only image2d_t packed_image, __write_only image2d_t unpacked_image) { printf("mipi10_to_unpacked"); const int wid_x = get_global_id(0); const int wid_y = get_global_id(1); const int2 coord = (int2)(4 * wid_x, wid_y); const float4 pixels[] = { read_imagef(packed_image, sampler, coord + (int2)(0, 0)), read_imagef(packed_image, sampler, coord + (int2)(1, 0)), read_imagef(packed_image, sampler, coord + (int2)(2, 0)), read_imagef(packed_image, sampler, coord + (int2)(3, 0)), }; write_imagef(unpacked_image, coord + (int2)(0, 0), pixels[0]); write_imagef(unpacked_image, coord + (int2)(1, 0), pixels[1]); write_imagef(unpacked_image, coord + (int2)(2, 0), pixels[2]); write_imagef(unpacked_image, coord + (int2)(3, 0), pixels[3]); } */ #if 1 /* #define IMG_W (4608) #define IMG_STRIDE_I_B (IMG_W*5/4) #define IMG_STRIDE_O_B (IMG_W*2) */ typedef short RK_S16; typedef unsigned short RK_U16; typedef char RK_S8; typedef unsigned char RK_U8; #define MAX(a, b) ( (a) > (b) ? (a) : (b) ) #define MIN(a, b) ( (a) < (b) ? (a) : (b) ) #endif // #define USE16 __kernel void mipi10_to_unpacked(__global const int *in2, int srcWid, int srcStride, // [in] src Byte stride int outStride, // [in] dst pixel stride __global int *out ) { #ifdef USE16 const int wid_x = get_global_id(0) * 16; #else const int wid_x = get_global_id(0) * 8; #endif const int wid_y = get_global_id(1); int nSrcWid = srcWid; __global uchar *pSrcRawU8 = (__global uchar *)in2 + wid_y * srcStride + (wid_x*5 >> 2); __global ushort *pDstRawS16 = (__global ushort *)out + wid_y * outStride + wid_x; int x = 0; // for (int x = 0; x < nSrcWid; x += 4) { //int idx = 5 * x / 4; __private uchar16 a = vload16(0, pSrcRawU8);//*pSrcRawU8;// __private ushort8 b; b.s0 = ((ushort)a.s0 << 2) + ((a.s4 >> 0) & 3); b.s1 = ((ushort)a.s1 << 2) + ((a.s4 >> 2) & 3); b.s2 = ((ushort)a.s2 << 2) + ((a.s4 >> 4) & 3); b.s3 = ((ushort)a.s3 << 2) + ((a.s4 >> 6) & 3); b.s4 = ((ushort)a.s5 << 2) + ((a.s9 >> 0) & 3); b.s5 = ((ushort)a.s6 << 2) + ((a.s9 >> 2) & 3); b.s6 = ((ushort)a.s7 << 2) + ((a.s9 >> 4) & 3); b.s7 = ((ushort)a.s8 << 2) + ((a.s9 >> 6) & 3); vstore8(convert_ushort8(b), 0, (__global ushort*)pDstRawS16); #ifdef USE16 ushort8 b1; uchar4 a1 = vload4(0, (pSrcRawU8+16));//*pSrcRawU8;// b1.s0 = ((ushort)a.sa << 2) + ((a.se >> 0) & 3); b1.s1 = ((ushort)a.sb << 2) + ((a.se >> 2) & 3); b1.s2 = ((ushort)a.sc << 2) + ((a.se >> 4) & 3); b1.s3 = ((ushort)a.sd << 2) + ((a.se >> 6) & 3); b1.s4 = ((ushort)a.sf << 2) + ((a1.s3 >> 0) & 3); b1.s5 = ((ushort)a1.s0 << 2) + ((a1.s3 >> 2) & 3); b1.s6 = ((ushort)a1.s1 << 2) + ((a1.s3 >> 4) & 3); b1.s7 = ((ushort)a1.s2 << 2) + ((a1.s3 >> 6) & 3); vstore8(convert_ushort8(b1), 0, (__global ushort*)(pDstRawS16+8)); #endif } } //#define RI_F read_imagei //#define WI_F write_imagei __constant sampler_t SAMPLER = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_LINEAR; __constant sampler_t SAMPLERMap = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_LINEAR; __kernel void remapImag(__read_only image2d_t input0, __read_only image2d_t mapyx, __write_only image2d_t output) { const int2 pos = (int2)(get_global_id(0)*4, get_global_id(1)); const int2 imageDim = get_image_dim(input0); const int2 mapDim = get_image_dim(mapyx); //* int2 pos1 = (int2)(pos.x + 1, pos.y); int2 pos2 = (int2)(pos.x + 2, pos.y); int2 pos3 = (int2)(pos.x + 3, pos.y); //*/ /* float ratioX = (float)mapDim.x / imageDim.x; float ratioY = (float)mapDim.y / imageDim.y; float posY = (pos.y*ratioY); float posX = (pos.x*ratioX); float2 mapCord = (float2)(posX, posY); float2 mapCord1 = (float2)((posX+ratioX), posY); float2 mapCord2 = (float2)((posX+ratioX*2), posY); float2 mapCord3 = (float2)((posX+ratioX*3), posY); float4 imagCore = read_imagef(mapyx, SAMPLERMap, (float2)(posX, posY)); float4 imagCore1 = read_imagef(mapyx, SAMPLERMap, (float2)((posX+ratioX*1.0), posY)); float4 imagCore2 = read_imagef(mapyx, SAMPLERMap, (float2)((posX+ratioX*2.0), posY)); float4 imagCore3 = read_imagef(mapyx, SAMPLERMap, (float2)((posX+ratioX*3.0), posY)); float4 imagout = read_imagef(input0, SAMPLERMap, imagCore.xy); float4 imagout1 = read_imagef(input0, SAMPLERMap, imagCore1.xy); float4 imagout2 = read_imagef(input0, SAMPLERMap, imagCore2.xy); float4 imagout3 = read_imagef(input0, SAMPLERMap, imagCore3.xy); write_imagef(output, pos, imagout); write_imagef(output, pos1, imagout1); write_imagef(output, pos2, imagout2); write_imagef(output, pos3, imagout3); //*/ #if 1 float posX = (float)pos.x / imageDim.x * mapDim.x; float posY = (float)pos.y / imageDim.y * mapDim.y; float deltX = (float)mapDim.x / imageDim.x; /* float posX = native_divide((float)pos.x * mapDim.x, (float)imageDim.x); float posY = native_divide((float)pos.y * mapDim.y, (float)imageDim.y); float deltX = native_divide((float)mapDim.x, (float)imageDim.x); //*/ //* float2 mapCord = (float2)(posX, posY); float2 mapCord1 = (float2)(posX+deltX, posY); float2 mapCord2 = (float2)(posX+deltX*2, posY); float2 mapCord3 = (float2)(posX+deltX*3, posY); //*/ float4 imagCore = read_imagef(mapyx, SAMPLERMap, mapCord+(float)(0.5)); float4 imagCore1 = read_imagef(mapyx, SAMPLERMap, mapCord1+(float)(0.5)); float4 imagCore2 = read_imagef(mapyx, SAMPLERMap, mapCord2+(float)(0.5)); float4 imagCore3 = read_imagef(mapyx, SAMPLERMap, mapCord3+(float)(0.5)); float4 imagout = read_imagef(input0, SAMPLERMap, imagCore.xy+(float)(0.5)); float4 imagout1 = read_imagef(input0, SAMPLERMap, imagCore1.xy+(float)(0.5)); float4 imagout2 = read_imagef(input0, SAMPLERMap, imagCore2.xy+(float)(0.5)); float4 imagout3 = read_imagef(input0, SAMPLERMap, imagCore3.xy+(float)(0.5)); /* imagout = (imagout.x, imagout1.x, imagout2.x, imagout3.x); imagout.y = imagout1.x; imagout.z = imagout2.x; imagout.w = imagout3.x; //*/ write_imagef(output, pos, imagout); write_imagef(output, pos1, imagout1); write_imagef(output, pos2, imagout2); write_imagef(output, pos3, imagout3); #endif #if 0 for (int i = 0; i < 4; i++) { pos.x += 1; int2 outpos = pos; float2 mapCord = (float2)(((float)(pos.x)/imageDim.x) * mapDim.x, ((float)(pos.y)/imageDim.y) * mapDim.y); float4 imagCore = read_imagef(mapyx, SAMPLERMap, mapCord); float4 imagout = read_imagef(input0, SAMPLERMap, imagCore.xy); write_imagef(output, outpos, imagout); } #endif #if 0 if (pos.x==0 && pos.y==0) { float2 map00 = {0.5, 0.5}; float2 map01 = {0.5, 1.5}; float2 map10 = {1.5, 0.5}; float2 map11 = {1.5, 1.5}; float4 imagCore00 = read_imagef(mapyx, SAMPLERMap, map00); float4 imagCore01 = read_imagef(mapyx, SAMPLERMap, map01); float4 imagCore10 = read_imagef(mapyx, SAMPLERMap, map10); float4 imagCore11 = read_imagef(mapyx, SAMPLERMap, map11); printf("[%d, %d][%d, %d]\n", imageDim.x, imageDim.y, mapDim.x, mapDim.y); printf("mapCord = %4.4f, %4.4f\n", mapCord.x, mapCord.y); printf("imagCore = %4.4f, %4.4f\n", imagCore.x, imagCore.y); printf("imagCore00 = %4.4f, %4.4f\n", imagCore00.x, imagCore00.y); printf("imagCore01 = %4.4f, %4.4f\n", imagCore01.x, imagCore01.y); printf("imagCore10 = %4.4f, %4.4f\n", imagCore10.x, imagCore10.y); printf("imagCore11 = %4.4f, %4.4f\n", imagCore11.x, imagCore11.y); //printf("--%d-%d-%d-%d-%d-%d-%d-%d-------------------\n", pos1.x, pos1.y, out1.x, out1.y, out.x, out.y, imageDim.x, imageDim.y); } #endif //*/ // if (pos.x==0 && pos.y==0) // printf("--%d-%d-%d-%d-%d-%d-%d-%d-------------------\n", pos1.x, pos1.y, out1.x, out1.y, out.x, out.y, imageDim.x, imageDim.y); // if (pos.x >= imageDim.x || pos.y >= imageDim.y) { // return; // } // FLOAT4 in0 = RI_F(input0, SAMPLER, pos); // FLOAT4 in1 = RI_F(input1, SAMPLER, pos); // FLOAT4 out0 = select(in1, (FLOAT4)0, in0 < (FLOAT4)0); } __kernel void remapImagUV(__read_only image2d_t input0, __read_only image2d_t mapyx, __write_only image2d_t output) { const int2 pos = (int2)(get_global_id(0), get_global_id(1)); const int2 imageDim = get_image_dim(input0); const int2 mapDim = get_image_dim(mapyx); uint4 out0, out1; uint4 out; int2 pos0, pos1; int2 outpos = pos; float2 mapCord = (float2)(((float)(pos.x)/imageDim.x) * mapDim.x, ((float)(pos.y)/imageDim.y) * mapDim.y); float4 imagCore = read_imagef(mapyx, SAMPLERMap, mapCord+(float)(0.5)); float4 imagout = read_imagef(input0, SAMPLERMap, imagCore.xy/2+(float)(0.5)); write_imagef(output, outpos, imagout); /* out0 += out1; out.x = (out0.x + out0.y + out0.z + out0.w)/64; write_imageui(output, outpos, out); */ #if 0 if (pos.x==11 && pos.y==11) { float2 map00 = {10, 10}; float2 map01 = {10, 11}; float2 map10 = {11, 10}; float2 map11 = {11, 11}; float4 imagCore00 = read_imagef(mapyx, SAMPLERMap, map00); float4 imagCore01 = read_imagef(mapyx, SAMPLERMap, map01); float4 imagCore10 = read_imagef(mapyx, SAMPLERMap, map10); float4 imagCore11 = read_imagef(mapyx, SAMPLERMap, map11); printf("[%d, %d][%d, %d]\n", imageDim.x, imageDim.y, mapDim.x, mapDim.y); printf("mapCord = %4.4f, %4.4f\n", mapCord.x, mapCord.y); printf("imagCore = %4.4f, %4.4f\n", imagCore.x, imagCore.y); printf("imagCore00 = %4.4f, %4.4f\n", imagCore00.x, imagCore00.y); printf("imagCore01 = %4.4f, %4.4f\n", imagCore01.x, imagCore01.y); printf("imagCore10 = %4.4f, %4.4f\n", imagCore10.x, imagCore10.y); printf("imagCore11 = %4.4f, %4.4f\n", imagCore11.x, imagCore11.y); //printf("--%d-%d-%d-%d-%d-%d-%d-%d-------------------\n", pos1.x, pos1.y, out1.x, out1.y, out.x, out.y, imageDim.x, imageDim.y); } #endif //*/ // if (pos.x==0 && pos.y==0) // printf("--%d-%d-%d-%d-%d-%d-%d-%d-------------------\n", pos1.x, pos1.y, out1.x, out1.y, out.x, out.y, imageDim.x, imageDim.y); // if (pos.x >= imageDim.x || pos.y >= imageDim.y) { // return; // } // FLOAT4 in0 = RI_F(input0, SAMPLER, pos); // FLOAT4 in1 = RI_F(input1, SAMPLER, pos); // FLOAT4 out0 = select(in1, (FLOAT4)0, in0 < (FLOAT4)0); } #pragma OPENCL EXTENSION cl_khr_fp16 : enable #define PI 3.1415926f #define CONVERT_FULL_TO_LIMITED_RANGE_CL (0) // set to 1 if full range input #define ENABLE_CHECK_MEDIAN_RESULT (0) // set to 1 if you want to print the median result __constant sampler_t SAMPLERMap = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_LINEAR; __kernel void acm_buf(__global const int *pSrcInY, int srcWid, int srcStride, // [in] src pixel stride int nPlaneOffset, __global int *pDstOutY ) { const int wid_x = get_global_id(0); const int wid_y = get_global_id(1); int offsetY = wid_y * srcStride + wid_x; int offsetU = wid_y * srcStride + wid_x + nPlaneOffset; int offsetV = wid_y * srcStride + wid_x + nPlaneOffset * 2; __global uchar *pInY = ((__global uchar *)pSrcInY + offsetY); __global uchar *pInU = ((__global uchar *)pSrcInY + offsetU); __global uchar *pInV = ((__global uchar *)pSrcInY + offsetV); __global uchar *pOutY = ((__global uchar *)pDstOutY + offsetY); __global uchar *pOutU = ((__global uchar *)pDstOutY + offsetU); __global uchar *pOutV = ((__global uchar *)pDstOutY + offsetV); uchar Iny = *(pInY); uchar InU = *(pInU); uchar InV = *(pInV); #if 1 // YCbCr to YHS int cb = (int)InU - 128; int cr = (int)InV - 128; int cbm = ~(cb >> 31) + 1; // if cb < 0 then 1, otherwise 0 float h = atan((float)cr / ((float)cb + 1e-10f)); float s = sqrt((float)(cb * cb + cr * cr)); int sign = +1 | ((int)h >> 31); // if h < 0 then -1, otherwise +1 h -= sign * cbm * PI; // +-180 only when (cb < 0 && h < 0) // YHS to YCbCr // cb = round(s * cos(h)); // cr = round(s * sin(h)); cb = (int)(s * cos(h) + 0.5f); cr = (int)(s * sin(h) + 0.5f); *(pOutY) = Iny; *(pOutU) = (uchar)(cb + 128); *(pOutV) = (uchar)(cr + 128); #else float cb = (float)abs(InU - 128) + 0.0001f; float cr = (float)abs(InV - 128); float h = 0; float s = 0; float cbMask = ((InU - 128) > 0); float cbMaskH = 2*cbMask - 1; float cbMaskPi = (1 - cbMask) * PI; float crMask = ((InV - 128) > 0); float crMaskH = 2*crMask - 1; h = atan(cr / cb); s = sqrt(cb * cb + cr * cr); h = cbMaskPi + h * cbMaskH; h = h * crMaskH; // to YCbCr float lowLimitFix = -PI / 2; float higLimitFix = PI / 2; float H_flag = ((h >= lowLimitFix) & (h <= higLimitFix)) * 2 - 1; float H_cordicPiFlag = (h > higLimitFix) - (h < lowLimitFix); float H_cordicIn = PI * H_cordicPiFlag + H_flag * h; float uOut = (float)(s * cos(H_cordicIn)); float vOut = (float)(s * sin(H_cordicIn)); *(pOutY) = Iny; *(pOutU) = (uchar)(H_flag * uOut + 128.5f); *(pOutV) = (uchar)(vOut + 128.5f); #endif } __kernel void acm_buf4(__global const int *pSrcInY, int srcWid, int srcStride, // [in] src pixel stride int nPlaneOffset, __global int *pDstOutY ) { const int wid_x = get_global_id(0)*4; const int wid_y = get_global_id(1); int offsetY = wid_y * srcStride + wid_x; int offsetU = wid_y * srcStride + wid_x + nPlaneOffset; int offsetV = wid_y * srcStride + wid_x + nPlaneOffset * 2; __global uchar *pInY = ((__global uchar *)pSrcInY + offsetY); __global uchar *pInU = ((__global uchar *)pSrcInY + offsetU); __global uchar *pInV = ((__global uchar *)pSrcInY + offsetV); __global uchar *pOutY = ((__global uchar *)pDstOutY + offsetY); __global uchar *pOutU = ((__global uchar *)pDstOutY + offsetU); __global uchar *pOutV = ((__global uchar *)pDstOutY + offsetV); uchar4 Iny = (vload4(0, pInY)); uchar4 InU = (vload4(0, pInU)); uchar4 InV = (vload4(0, pInV)); #if 1 // TODO float4 cb = convert_float4(convert_int4(InU) - 128) + 1e-10f; float4 cr = convert_float4(convert_int4(InV) - 128); float4 h = atan(cr / cb); float4 s = sqrt(cb * cb + cr * cr); int4 cbm = ~(convert_int4(cb) >> 31) + 1; // if cb < 0 then 1, otherwise 0 int4 sign = +1 | (convert_int4(h) >> 31); // if h < 0 then -1, otherwise +1 h -= convert_float4(sign * cbm) * PI; // +-180 only when (cb < 0 && h < 0) float4 uOut = s * cos(h) + 0.5f; float4 vOut = s * sin(h) + 0.5f; #else float4 cb = convert_float4(abs(convert_short4(InU) - (short4)128)) + 0.0001f; float4 cr = convert_float4(abs(convert_short4(InV) - (short4)128)); /* if (wid_x == 2304 && wid_y == 9) { printf("cbcr::%f_%f_%f_%f \n", cb.s0, cb.s1, cr.s0, cr.s1); } */ short4 cbMask = convert_short4((convert_short4(InU) - (short4)128) > (short4)0)&(short4)1; short4 cbMaskH = (short4)2*cbMask - (short4)1; float4 cbMaskPi = convert_float4((short4)1 - cbMask) * PI; short4 crMask = convert_short4((convert_short4(InV) - (short4)128) > (short4)0)&(short4)1; /* short4 tmpCr = (convert_short4(InV) - (short4)128); short4 tmp0 = (short4)0; short4 tmpCrCMP = (tmpCr > tmp0)&(short4)1;*/ short4 crMaskH = (short4)2*crMask - (short4)1; /* if (wid_x == 2304 && wid_y == 9) { printf("tmpCr_crMask::%d %d %d %d\n", tmpCr.s0, tmp0.s0, tmpCrCMP.s0, crMaskH.s0); } */ float4 h = atan(cr / cb); float4 s = sqrt(cb * cb + cr * cr); /* if (wid_x == 2304 && wid_y == 9) { printf("atanH_cbMaskH_crMaskH_cbMaskPi::%f_%d_%d_%f\n", h.s0, cbMaskH.s0, crMaskH.s0, cbMaskPi.s0); } */ h = cbMaskPi + h * convert_float4(cbMaskH); h = h * convert_float4(crMaskH); /* if (wid_x == 2304 && wid_y == 9) { printf("HS::%f_%f_%f_%f\n", h.s0, h.s1, s.s0, s.s1); } */ // to YCbCr float4 lowLimitFix = -PI / 2; float4 higLimitFix = PI / 2; float4 H_flag = convert_float4((convert_short4(h >= lowLimitFix) & convert_short4(h <= higLimitFix))&(short4)1) * 2 - (float4)1; float4 H_cordicPiFlag = convert_float4(((h > higLimitFix)&(int4)1) - ((h < lowLimitFix)&(int4)1)); float4 H_cordicIn = PI * H_cordicPiFlag + H_flag * h; /* if (wid_x == 2304 && wid_y == 9) { printf("H_cordicIn_H_flag::%f_%f_%f_%f\n", H_cordicIn.s0, H_cordicIn.s1, H_flag.s0, H_flag.s1); }*/ float4 uOut = (s * cos(H_cordicIn)); float4 vOut = (s * sin(H_cordicIn)); uOut = H_flag * uOut; #endif // *(pOutY) = Iny; // *(pOutU) = (uchar)(H_flag * uOut + 128.5f); // *(pOutV) = (uchar)(vOut + 128.5f); vstore4(convert_uchar4(Iny), 0, (__global uchar*)(pOutY)); vstore4(convert_uchar4(uOut + 128.0f), 0, (__global uchar*)(pOutU)); vstore4(convert_uchar4(vOut + 128.0f), 0, (__global uchar*)(pOutV)); /* if (((int)InU.s0 - (int)(uOut.s0 + 128.0f) > 1) || ((int)InU.s1 - (int)(uOut.s1 + 128.0f) > 1) || ((int)InV.s0 - (int)(vOut.s0 + 128.0f) > 1) || ((int)InV.s1 - (int)(vOut.s1 + 128.0f) > 1)) */ /* if (wid_x == 2304 && wid_y == 9) { printf("OUTUV::%f_%f_%f_%f\n", uOut.s0, uOut.s1, vOut.s0+128, vOut.s1+128); printf("OUTUV::%d_%d_%d_%d\n", convert_uchar4(uOut).s0, convert_uchar4(uOut).s1, convert_uchar4(vOut + 128.0f).s0, convert_uchar4(vOut + 128.0f).s1); } */ } __kernel void acm_buf_img(__global const int *pSrcInY, __read_only image2d_t tabDeltaYSH_H_Imag, __read_only image2d_t tabGainYSH_HY_Imag, __read_only image2d_t tabGainYSH_HS_Imag, int srcWid, int srcStride, // [in] src pixel stride int nPlaneOffset, __global int *pDstOutY ) { const int wid_x = get_global_id(0); const int wid_y = get_global_id(1); int offsetY = wid_y * srcStride + wid_x; int offsetU = wid_y * srcStride + wid_x + nPlaneOffset; int offsetV = wid_y * srcStride + wid_x + nPlaneOffset * 2; __global uchar *pInY = ((__global uchar *)pSrcInY + offsetY); __global uchar *pInU = ((__global uchar *)pSrcInY + offsetU); __global uchar *pInV = ((__global uchar *)pSrcInY + offsetV); __global uchar *pOutY = ((__global uchar *)pDstOutY + offsetY); __global uchar *pOutU = ((__global uchar *)pDstOutY + offsetU); __global uchar *pOutV = ((__global uchar *)pDstOutY + offsetV); uchar Iny = *(pInY); uchar InU = *(pInU); uchar InV = *(pInV); #if 1 // YCbCr to YHS int cb = (int)InU - 128; int cr = (int)InV - 128; int cbm = ~(cb >> 31) + 1; // if cb < 0 then 1, otherwise 0 float h = atan((float)cr / ((float)cb + 1e-10f)) / PI * 180; // rad2deg float s = sqrt((float)(cb * cb + cr * cr)); // TODO. sign(); int sign = (int)+1 | ((int)h >> 31); // if h < 0 then -1, otherwise +1. Error if -1 < h < 0 ! h -= sign * cbm * 180; // +-180 only when (cb < 0 && h < 0) s = round(s); h = round(h); // rad2deg float hp = h + 180; float idx_y = (float)Iny / 32.f; float idx_s = s / 15.f; float idx_h = hp / 5.625f; float2 mapCord0 = (float2)(idx_h, 0.f) + (float2)0.5f; float2 mapCord1 = (float2)(idx_y, idx_h) + (float2)0.5f; float2 mapCord2 = (float2)(idx_s, idx_h) + (float2)0.5f; // {s0, s1, s2, s3} = {dy, ds, dh, xx} float4 imagCore0 = read_imagef(tabDeltaYSH_H_Imag, SAMPLERMap, mapCord0) * 255.f; // delta float4 imagCore1 = read_imagef(tabGainYSH_HY_Imag, SAMPLERMap, mapCord1) * 255.f; // gain0 float4 imagCore2 = read_imagef(tabGainYSH_HS_Imag, SAMPLERMap, mapCord2) * 255.f; // gain1 imagCore0.s2 -= 128.f; imagCore0 = imagCore0 * imagCore1 * imagCore2 / (128.f * 128.f); imagCore0.s0 = round(round(imagCore0.s0) * 32.f / 256.f); // dy limit imagCore0.s1 = round(round(imagCore0.s1) * 64.f / 256.f); // ds limit imagCore0.s2 = round(round(imagCore0.s2) * 30.f / 64.f); // dh limit Iny = (uchar)((float)Iny + imagCore0.s0 + 0.5f); s += round(imagCore0.s1); h += round(imagCore0.s2); // YHS to YCbCr h = h * PI / 180.f; cb = (int)round(s * cos(h)); cr = (int)round(s * sin(h)); *(pOutY) = (uchar)Iny; *(pOutU) = (uchar)(cb + 128); *(pOutV) = (uchar)(cr + 128); #else float cb = (float)abs(InU - 128) + 0.0001f; float cr = (float)abs(InV - 128); float h = 0; float s = 0; float cbMask = ((InU - 128) > 0); float cbMaskH = 2*cbMask - 1; float cbMaskPi = (1 - cbMask) * PI; float crMask = ((InV - 128) > 0); float crMaskH = 2*crMask - 1; h = atan(cr / cb); s = sqrt(cb * cb + cr * cr); h = cbMaskPi + h * cbMaskH; h = h * crMaskH; // to YCbCr float lowLimitFix = -PI / 2; float higLimitFix = PI / 2; float H_flag = ((h >= lowLimitFix) & (h <= higLimitFix)) * 2 - 1; float H_cordicPiFlag = (h > higLimitFix) - (h < lowLimitFix); float H_cordicIn = PI * H_cordicPiFlag + H_flag * h; float uOut = (float)(s * cos(H_cordicIn)); float vOut = (float)(s * sin(H_cordicIn)); *(pOutY) = Iny; *(pOutU) = (uchar)(H_flag * uOut + 128.5f); *(pOutV) = (uchar)(vOut + 128.5f); #endif } __kernel void acm_buf_imgNV12(__global const uchar *pSrcInY, __global uchar *pDstOutY, __read_only image2d_t tabDci_Ylut_Imag, __read_only image2d_t tabDeltaYSH_H_Imag, __read_only image2d_t tabGainYSH_HY_Imag, __read_only image2d_t tabGainYSH_HS_Imag, uchar bEnableDCI, uchar bEnableACM, int procWid, // proc only if x < procWid (ref to Y) int srcStride, // [in] src pixel stride int nPlaneOffset) { const int wid_x = get_global_id(0); const int wid_y = get_global_id(1); const int offsetY = (wid_y*2) * srcStride + wid_x * 2; const int offsetU = wid_y * srcStride + wid_x * 2 + nPlaneOffset; __global uchar *pInY0 = ((__global uchar *)pSrcInY + offsetY); __global uchar *pInY1 = ((__global uchar *)pSrcInY + offsetY + srcStride); __global uchar *pInUV = ((__global uchar *)pSrcInY + offsetU); __global uchar *pOutY0 = ((__global uchar *)pDstOutY + offsetY); __global uchar *pOutY1 = ((__global uchar *)pDstOutY + offsetY + srcStride); __global uchar *pOutUV = ((__global uchar *)pDstOutY + offsetU); uchar2 vIny0 = vload2(0, pInY0); uchar2 vIny1 = vload2(0, pInY1); uchar2 vInUV = vload2(0, pInUV); uchar4 vIny = (uchar4)(vIny0.s0, vIny0.s1, vIny1.s0, vIny1.s1); #if ENABLE_CHECK_MEDIAN_RESULT const int check_x = 3483/2; const int check_y = 184/2; if (wid_x == check_x && wid_y == check_y) { printf("========== check the data on pixel (%d, %d) ==========\n", check_x*2, check_y*2); printf("src Y0~4: %d, %d, %d, %d\n", vIny.s0, vIny.s1, vIny.s2, vIny.s3); printf("src UV : %d, %d\n", vInUV.s0, vInUV.s1); } #endif #if CONVERT_FULL_TO_LIMITED_RANGE_CL // full range to limited range, Y/UV valid range: 16-235/16-128-240 vIny = convert_uchar4(convert_float4(vIny) * 219.f / 255.f + 16.f); vInUV = convert_uchar2((convert_float2(vInUV) - 128.f) * 224.f / 255.f + 128.f); #if ENABLE_CHECK_MEDIAN_RESULT if (wid_x == check_x && wid_y == check_y) { printf("limited src Y0~4: %d, %d, %d, %d\n", vIny.s0, vIny.s1, vIny.s2, vIny.s3); printf("limited src UV : %d, %d\n", vInUV.s0, vInUV.s1); } #endif #endif if (wid_x < procWid / 2) { if (bEnableDCI) { vIny = (uchar4)clamp(vIny, 16, 235); // avoid overflow // const float step = 7.96875f; // full range, 255/32 // const int offset = 0.f; // full range, [0, 255] const float step = 6.84375f; // lmited range, 219/32 const int offset = 16; // lmited range, [16, 235] float idx_dci_y00 = (float)((int)vIny.s0 - offset) / step; float2 mapCord_dci_y00 = (float2)(idx_dci_y00, 0.f) + (float2)(0.5f); float4 imagCore_dci_y00 = read_imagef(tabDci_Ylut_Imag, SAMPLERMap, mapCord_dci_y00) * 255.f; float idx_dci_y01 = (float)((int)vIny.s1 - offset) / step; float2 mapCord_dci_y01 = (float2)(idx_dci_y01, 0.f) + (float2)(0.5f); float4 imagCore_dci_y01 = read_imagef(tabDci_Ylut_Imag, SAMPLERMap, mapCord_dci_y01) * 255.f; float idx_dci_y10 = (float)((int)vIny.s2 - offset) / step; float2 mapCord_dci_y10 = (float2)(idx_dci_y10, 0.f) + (float2)(0.5f); float4 imagCore_dci_y10 = read_imagef(tabDci_Ylut_Imag, SAMPLERMap, mapCord_dci_y10) * 255.f; float idx_dci_y11 = (float)((int)vIny.s3 - offset) / step; float2 mapCord_dci_y11 = (float2)(idx_dci_y11, 0.f) + (float2)(0.5f); float4 imagCore_dci_y11 = read_imagef(tabDci_Ylut_Imag, SAMPLERMap, mapCord_dci_y11) * 255.f; vIny = (uchar4)(imagCore_dci_y00.s0, imagCore_dci_y01.s0, imagCore_dci_y10.s0, imagCore_dci_y11.s0); vIny = (uchar4)clamp(vIny, 16, 235); // limited range #if ENABLE_CHECK_MEDIAN_RESULT if (wid_x == check_x && wid_y == check_y) { printf("DCI Idx Y0~4: %.1f, %.1f, %.1f, %.1f\n", idx_dci_y00, idx_dci_y01, idx_dci_y10, idx_dci_y11); printf("after DCI Y0~4: %d, %d, %d, %d\n", vIny.s0, vIny.s1, vIny.s2, vIny.s3); } #endif } // bEnableDCI if (bEnableACM) { uchar Iny = (vIny.s0 + vIny.s1 + vIny.s2 + vIny.s3 + 2) / 4; uchar InU = vInUV.s0; uchar InV = vInUV.s1; /// YUV to YHS int cb = (int)InU - 128; int cr = (int)InV - 128; int cbm = ~(cb >> 31) + 1; // if cb < 0 then 1, otherwise 0 #if ENABLE_CHECK_MEDIAN_RESULT if (wid_x == check_x && wid_y == check_y) printf("convert CbCr, cbm: %d, %d, %d\n", cb, cr, cbm); #endif float h = atan((float)cr / ((float)cb + 1e-10f)); // rad float s = sqrt((float)(cb * cb + cr * cr)); float flag = 2.f * (h >= 0.f) - 1.f; // if h < 0 then -1, otherwise +1 #if ENABLE_CHECK_MEDIAN_RESULT if (wid_x == check_x && wid_y == check_y) printf("convert YSH, flag: %.2f, %.2f, %.2f, %d\n", (float)Iny, s, h, flag); #endif h -= ((float)cbm) * flag * PI; float hp = h + PI; #if ENABLE_CHECK_MEDIAN_RESULT if (wid_x == check_x && wid_y == check_y) printf("convert final SH, HP: %.2f, %.2f, %.2f\n", s, h, hp); #endif /// ACM float idx_y = (float)Iny / 27.482353f; // limited range, step=32*219/255 float idx_s = s / 13.17647059f; // limited range, step=15*224/255 // float idx_y = (float)Iny / 32.f; // full range // float idx_s = s / 15.f; // full range float idx_h = hp / 0.09817477042468103f; // deg2rad(5.625) float2 mapCord0 = (float2)(idx_h, 0.f) + (float2)0.5f; float2 mapCord1 = (float2)(idx_y, idx_h) + (float2)0.5f; float2 mapCord2 = (float2)(idx_s, idx_h) + (float2)0.5f; #if ENABLE_CHECK_MEDIAN_RESULT if (wid_x == check_x && wid_y == check_y) printf("LUT index YSH: %.2f, %.2f, %.2f\n", idx_y, idx_s, idx_h); #endif // {s0, s1, s2, s3} = {dy, ds, dh, xx} float4 imagCore0 = read_imagef(tabDeltaYSH_H_Imag, SAMPLERMap, mapCord0) * 255.f; // delta float4 imagCore1 = read_imagef(tabGainYSH_HY_Imag, SAMPLERMap, mapCord1); // gain0, should x2 when using float4 imagCore2 = read_imagef(tabGainYSH_HS_Imag, SAMPLERMap, mapCord2); // gain1, should x2 when using imagCore0.s2 -= 128.f; // for negtive value of delta_H imagCore0 = imagCore0 * imagCore1 * imagCore2 * 4.f; imagCore0.s0 = imagCore0.s0 * 32.f / 256.f; // dy limit imagCore0.s1 = imagCore0.s1 * 64.f / 256.f; // ds limit imagCore0.s2 = imagCore0.s2 * 30.f / 64.f; // dh limit #if ENABLE_CHECK_MEDIAN_RESULT if (wid_x == check_x && wid_y == check_y) printf("final delta YSH: %.2f, %.2f, %.2f\n", imagCore0.s0, imagCore0.s1, imagCore0.s2); #endif /// YHS to YUV s += imagCore0.s1; h += radians(imagCore0.s2); // deg2rad vIny = (uchar4)clamp(vIny + (uchar4)round(imagCore0.s0), 16, 235); // limited range cb = clamp((int)round(s * cos(h)), -112, 112); // limited range cr = clamp((int)round(s * sin(h)), -112, 112); // limited range // vIny = add_sat(vIny, (uchar4)round(imagCore0.s0)); // full range // cb = clamp((int)round(s * cos(h)), -128, 127); // full range // cr = clamp((int)round(s * sin(h)), -128, 127); // full range vInUV = (uchar2)(cb, cr) + (uchar2)128; #if ENABLE_CHECK_MEDIAN_RESULT if (wid_x == check_x && wid_y == check_y) printf("final value SH/CbCr: %.2f, %.2f, %d, %d\n", s, h, cb, cr); #endif } // bEnableACM } // if (wid_x < procWid / 2) #if ENABLE_CHECK_MEDIAN_RESULT if (wid_x == check_x && wid_y == check_y) { printf("dst Y0~4: %d, %d, %d, %d\n", vIny.s0, vIny.s1, vIny.s2, vIny.s3); printf("dst UV : %d, %d\n", vInUV.s0, vInUV.s1); } #endif vstore2(vIny.s01, 0, (__global uchar*)(pOutY0)); vstore2(vIny.s23, 0, (__global uchar*)(pOutY1)); vstore2(vInUV, 0, (__global uchar*)(pOutUV)); } __kernel void dci_histogram_cnt(__global const int *pSrcInY, __global uint *histogram) { const int wid_x = get_global_id(0); const uint local_index = get_local_id(0); const uint local_x_size = get_local_size(0); __local uint histogram_local[256]; for(int i = local_index; i < 256; i += local_x_size) { histogram_local[i] = 0; } __global uchar *pInY0 = ((__global uchar *)pSrcInY + wid_x * 16); uchar16 vIny0 = vload16(0, pInY0); ushort16 vIny_tmp = ((convert_ushort16(vIny0) - (ushort)16) * (ushort)298 + (ushort)128); ushort shiftBit = 8; vIny_tmp = vIny_tmp >> shiftBit; barrier(CLK_LOCAL_MEM_FENCE); atomic_inc(histogram_local + vIny_tmp.s0); atomic_inc(histogram_local + vIny_tmp.s1); atomic_inc(histogram_local + vIny_tmp.s2); atomic_inc(histogram_local + vIny_tmp.s3); atomic_inc(histogram_local + vIny_tmp.s4); atomic_inc(histogram_local + vIny_tmp.s5); atomic_inc(histogram_local + vIny_tmp.s6); atomic_inc(histogram_local + vIny_tmp.s7); atomic_inc(histogram_local + vIny_tmp.s8); atomic_inc(histogram_local + vIny_tmp.s9); atomic_inc(histogram_local + vIny_tmp.sa); atomic_inc(histogram_local + vIny_tmp.sb); atomic_inc(histogram_local + vIny_tmp.sc); atomic_inc(histogram_local + vIny_tmp.sd); atomic_inc(histogram_local + vIny_tmp.se); atomic_inc(histogram_local + vIny_tmp.sf); barrier(CLK_LOCAL_MEM_FENCE); for(int i = local_index; i < 256; i += local_x_size) { atomic_add(histogram + i, histogram_local[i]); } } /* * Copyright (c) 2016, 2017 Arm Limited. * * SPDX-License-Identifier: MIT * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ // #include "helpers.h" //typedef unsigned int uint; #define VATOMIC_INC16(histogram, win_pos) \ { \ atomic_inc(histogram + win_pos.s0); \ atomic_inc(histogram + win_pos.s1); \ atomic_inc(histogram + win_pos.s2); \ atomic_inc(histogram + win_pos.s3); \ atomic_inc(histogram + win_pos.s4); \ atomic_inc(histogram + win_pos.s5); \ atomic_inc(histogram + win_pos.s6); \ atomic_inc(histogram + win_pos.s7); \ atomic_inc(histogram + win_pos.s8); \ atomic_inc(histogram + win_pos.s9); \ atomic_inc(histogram + win_pos.sa); \ atomic_inc(histogram + win_pos.sb); \ atomic_inc(histogram + win_pos.sc); \ atomic_inc(histogram + win_pos.sd); \ atomic_inc(histogram + win_pos.se); \ atomic_inc(histogram + win_pos.sf); \ } /** Calculate the histogram of an 8 bit grayscale image. * * Each thread will process 16 pixels and use one local atomic operation per pixel. * When all work items in a work group are done the resulting local histograms are * added to the global histogram using global atomics. * * @note The input image is represented as a two-dimensional array of type uchar. * The output is represented as a one-dimensional uint array of length of num_bins * * @param[in] input_ptr Pointer to the first source image. Supported data types: U8 * @param[in] input_stride_x Stride of the first source image in X dimension (in bytes) * @param[in] input_step_x input_stride_x * number of elements along X processed per workitem(in bytes) * @param[in] input_stride_y Stride of the first source image in Y dimension (in bytes) * @param[in] input_step_y input_stride_y * number of elements along Y processed per workitem(in bytes) * @param[in] input_offset_first_element_in_bytes The offset of the first element in the first source image * @param[in] histogram_local The local buffer to hold histogram result in per workgroup. Supported data types: U32 * @param[out] histogram The output buffer to hold histogram final result. Supported data types: U32 * @param[out] num_bins The number of bins * @param[out] offset The start of values to use (inclusive) * @param[out] range The range of a bin * @param[out] offrange The maximum value (exclusive) */ __kernel void hist_local_kernel(__global uint *input, __local uint *histogram_local, __global uint *restrict histogram, uint num_bins, uint offset, uint range, uint offrange) { uint local_id_x = get_local_id(0); uint local_x_size = get_local_size(0); if(num_bins > local_x_size) { for(int i = local_id_x; i < num_bins; i += local_x_size) { histogram_local[i] = 0; } } else { if(local_id_x <= num_bins) { histogram_local[local_id_x] = 0; } } uint16 vals = convert_uint16(vload16(0, input)); uint16 win_pos = select(num_bins, ((vals - offset) * num_bins) / range, (vals >= offset && vals < offrange)); barrier(CLK_LOCAL_MEM_FENCE); VATOMIC_INC16(histogram_local, win_pos); barrier(CLK_LOCAL_MEM_FENCE); if(num_bins > local_x_size) { for(int i = local_id_x; i < num_bins; i += local_x_size) { atomic_add(histogram + i, histogram_local[i]); } } else { if(local_id_x <= num_bins) { atomic_add(histogram + local_id_x, histogram_local[local_id_x]); } } } /** Calculate the histogram of an 8 bit grayscale image's border. * * Each thread will process one pixel using global atomic. * When all work items in a work group are done the resulting local histograms are * added to the global histogram using global atomics. * * @note The input image is represented as a two-dimensional array of type uchar. * The output is represented as a one-dimensional uint array of length of num_bins * * @param[in] input_ptr Pointer to the first source image. Supported data types: U8 * @param[in] input_stride_x Stride of the first source image in X dimension (in bytes) * @param[in] input_step_x input_stride_x * number of elements along X processed per workitem(in bytes) * @param[in] input_stride_y Stride of the first source image in Y dimension (in bytes) * @param[in] input_step_y input_stride_y * number of elements along Y processed per workitem(in bytes) * @param[in] input_offset_first_element_in_bytes The offset of the first element in the first source image * @param[out] histogram The output buffer to hold histogram final result. Supported data types: U32 * @param[out] num_bins The number of bins * @param[out] offset The start of values to use (inclusive) * @param[out] range The range of a bin * @param[out] offrange The maximum value (exclusive) */ __kernel void hist_border_kernel(//IMAGE_DECLARATION(input), __global uint *input, __global uint *restrict histogram, uint num_bins, uint offset, uint range, uint offrange) { // Image input_buffer = CONVERT_TO_IMAGE_STRUCT(input); uint val = (uint)(*input); uint win_pos = (val >= offset) ? (((val - offset) * num_bins) / range) : 0; if(val >= offset && (val < offrange)) { atomic_inc(histogram + win_pos); } } /** Calculate the histogram of an 8 bit grayscale image with bin size of 256 and window size of 1. * * Each thread will process 16 pixels and use one local atomic operation per pixel. * When all work items in a work group are done the resulting local histograms are * added to the global histogram using global atomics. * * @note The input image is represented as a two-dimensional array of type uchar. * The output is represented as a one-dimensional uint array of 256 elements * * @param[in] input_ptr Pointer to the first source image. Supported data types: U8 * @param[in] input_stride_x Stride of the first source image in X dimension (in bytes) * @param[in] input_step_x input_stride_x * number of elements along X processed per workitem(in bytes) * @param[in] input_stride_y Stride of the first source image in Y dimension (in bytes) * @param[in] input_step_y input_stride_y * number of elements along Y processed per workitem(in bytes) * @param[in] input_offset_first_element_in_bytes The offset of the first element in the first source image * @param[in] histogram_local The local buffer to hold histogram result in per workgroup. Supported data types: U32 * @param[out] histogram The output buffer to hold histogram final result. Supported data types: U32 */ __kernel void hist_local_kernel_fixed(//IMAGE_DECLARATION(input), const __global uchar *input, // __local uint *histogram_local, __global uint *restrict histogram) { // Image input_buffer = CONVERT_TO_IMAGE_STRUCT(input); __local uint histogram_local[256]; const uint local_index = get_local_id(0); const uint local_x_size = get_local_size(0); const int wid_x = get_global_id(0); // const int group_x = get_group_id(0); // if (local_index == 0 && (wid_x < 128)) { // printf("[%d %d %d %d]", group_x, wid_x, local_index, local_x_size); } for(int i = local_index; i < 256; i += local_x_size) { histogram_local[i] = 0; } // uint16 vals = convert_uint16(vload16((wid_x*16+local_index*16), input)); input += (wid_x*16); uchar16 vals = vload16(0, input); barrier(CLK_LOCAL_MEM_FENCE); // printf("[%d_%d] %d ", wid_x, local_index, vals.s0); atomic_inc(histogram_local + vals.s0); atomic_inc(histogram_local + vals.s1); atomic_inc(histogram_local + vals.s2); atomic_inc(histogram_local + vals.s3); atomic_inc(histogram_local + vals.s4); atomic_inc(histogram_local + vals.s5); atomic_inc(histogram_local + vals.s6); atomic_inc(histogram_local + vals.s7); atomic_inc(histogram_local + vals.s8); atomic_inc(histogram_local + vals.s9); atomic_inc(histogram_local + vals.sa); atomic_inc(histogram_local + vals.sb); atomic_inc(histogram_local + vals.sc); atomic_inc(histogram_local + vals.sd); atomic_inc(histogram_local + vals.se); atomic_inc(histogram_local + vals.sf); barrier(CLK_LOCAL_MEM_FENCE); for(int i = local_index; i < 256; i += local_x_size) { atomic_add(histogram + i, histogram_local[i]); } } /** Calculate the histogram of an 8 bit grayscale image with bin size as 256 and window size as 1. * * Each thread will process one pixel using global atomic. * When all work items in a work group are done the resulting local histograms are * added to the global histogram using global atomics. * * @note The input image is represented as a two-dimensional array of type uchar. * The output is represented as a one-dimensional uint array of 256 * * @param[in] input_ptr Pointer to the first source image. Supported data types: U8 * @param[in] input_stride_x Stride of the first source image in X dimension (in bytes) * @param[in] input_step_x input_stride_x * number of elements along X processed per workitem(in bytes) * @param[in] input_stride_y Stride of the first source image in Y dimension (in bytes) * @param[in] input_step_y input_stride_y * number of elements along Y processed per workitem(in bytes) * @param[in] input_offset_first_element_in_bytes The offset of the first element in the first source image * @param[out] histogram The output buffer to hold histogram final result. Supported data types: U32 */ __kernel void hist_border_kernel_fixed(// IMAGE_DECLARATION(input), __global uint *input, __global uint *restrict histogram) { // Image input_buffer = CONVERT_TO_IMAGE_STRUCT(input); atomic_inc(histogram + *input); } //#define RI_F read_imagei //#define WI_F write_imagei __constant sampler_t SAMPLER = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; __kernel void downscale8(__read_only image2d_t input0, __write_only image2d_t output) { const int2 pos = (int2)(get_global_id(0)*2, get_global_id(1)*8); const int2 imageDim = get_image_dim(output); uint4 out0, out1; uint4 out; int2 pos0, pos1; int2 outpos; pos0 = pos; pos1 = pos; outpos = (int2)(pos.x / 2, pos.y / 8); // pos.x[0-W/4] pos.y[0-H] pos1.x = pos1.x + 1; //* out0 = 0; out1 = 0; for (int j = 0; j < 8; j++) { pos0.y = pos.y + j; pos1.y = pos.y + j; out0 += read_imageui(input0, SAMPLER, pos0); out1 += read_imageui(input0, SAMPLER, pos1); } out0 += out1; out.x = (out0.x + out0.y + out0.z + out0.w)/64; write_imageui(output, outpos, out); //if (pos.x==0 && pos.y==0) //printf("--%d-%d-%d-%d-%d-%d-%d-%d-------------------\n", pos1.x, pos1.y, out1.x, out1.y, out.x, out.y, imageDim.x, imageDim.y); //*/ // if (pos.x==0 && pos.y==0) // printf("--%d-%d-%d-%d-%d-%d-%d-%d-------------------\n", pos1.x, pos1.y, out1.x, out1.y, out.x, out.y, imageDim.x, imageDim.y); // if (pos.x >= imageDim.x || pos.y >= imageDim.y) { // return; // } // FLOAT4 in0 = RI_F(input0, SAMPLER, pos); // FLOAT4 in1 = RI_F(input1, SAMPLER, pos); // FLOAT4 out0 = select(in1, (FLOAT4)0, in0 < (FLOAT4)0); } __kernel void downscale8_fimage(__read_only image2d_t input0, __write_only image2d_t output) { const int2 pos = (int2)(get_global_id(0)*2, get_global_id(1)*8); const int2 imageDim = get_image_dim(output); float4 out0, out1; float4 out; int2 pos0, pos1; int2 outpos; pos0 = pos; pos1 = pos; outpos = (int2)(pos.x/2, pos.y/8); // pos.x[0-W/4] pos.y[0-H] pos1.x = pos1.x + 1; //* out0 = 0; out1 = 0; for (int j = 0; j < 8; j++) { pos0.y = pos.y + j; pos1.y = pos.y + j; out0 += read_imagef(input0, SAMPLER, pos0); out1 += read_imagef(input0, SAMPLER, pos1); } out0 += out1; out.x = (out0.x + out0.y + out0.z + out0.w)/64; write_imagef(output, outpos, out); //if (pos.x==0 && pos.y==0) //printf("--%d-%d-%d-%d-%d-%d-%d-%d-------------------\n", pos1.x, pos1.y, out1.x, out1.y, out.x, out.y, imageDim.x, imageDim.y); //*/ // if (pos.x==0 && pos.y==0) // printf("--%d-%d-%d-%d-%d-%d-%d-%d-------------------\n", pos1.x, pos1.y, out1.x, out1.y, out.x, out.y, imageDim.x, imageDim.y); // if (pos.x >= imageDim.x || pos.y >= imageDim.y) { // return; // } // FLOAT4 in0 = RI_F(input0, SAMPLER, pos); // FLOAT4 in1 = RI_F(input1, SAMPLER, pos); // FLOAT4 out0 = select(in1, (FLOAT4)0, in0 < (FLOAT4)0); } // #define IMG_W (4608) // #define IMG_STRIDE_I_P (IMG_W) // #define IMG_STRIDE_O_P (IMG_W/8) #define MIN(a, b) ( (a) < (b) ? (a) : (b) ) __kernel void downscale8_buffer(__global const int *pIn, int srcWid, int srcStride, // [in] src pixel stride int outStride, // [in] dst pixel stride __global int *pOut) { const int wid_x = get_global_id(0); const int wid_y = get_global_id(1); __global ushort *pSrcRawU16 = (__global ushort *)pIn + wid_y * 8 * srcStride + wid_x*8; __global ushort *pDstRawS16 = (__global ushort *)pOut + wid_y * outStride + wid_x; ushort out; __private ushort8 a = 0; for (int j = 0; j < 8; j++) { a += vload8(0, pSrcRawU16 + j * srcStride); //*pSrcRawU8;// } out = min(a.s0 + a.s1 + a.s2 + a.s3 + a.s4 + a.s5 + a.s6 + a.s7, 0xffff); // if (wid_x==0 && wid_y==0) // printf("--%d--------------------------------------------------------\n", out); *pDstRawS16 = out; } #define MAX(a, b) ( (a) > (b) ? (a) : (b) ) #define MIN(a, b) ( (a) < (b) ? (a) : (b) ) #define MAX4(a, b, c, d) MAX( MAX((a), (b)), MAX((c), (d)) ) #define MIN4(a, b, c, d) MIN( MIN((a), (b)), MIN((c), (d)) ) __kernel void rawdpc(__global const int *in, int srcWid, int srcHgt, int srcStride, // [in] src pixel stride int outStride, // [in] dst pixel stride __global int *out ) { const int wid_x = get_global_id(0); const int wid_y = get_global_id(1); int nSrcWid = srcWid; __global ushort *pSrcRawU16 = (__global ushort *)in + wid_y * srcStride + wid_x; __global ushort *pDstRawU16 = (__global ushort *)out + wid_y * outStride + wid_x; if ((wid_y < 4) || (wid_y >= srcHgt - 4)) { *pDstRawU16 = *pSrcRawU16; return; } /* int x = 0; // for (int x = 0; x < nSrcWid; x += 4) { //int idx = 5 * x / 4; __private uchar16 a = vload16(0, pSrcRawU8);//*pSrcRawU8;// __private ushort8 b; b.s0 = ((ushort)a.s0 << 2) + ((a.s4 >> 0) & 3); b.s1 = ((ushort)a.s1 << 2) + ((a.s4 >> 2) & 3); b.s2 = ((ushort)a.s2 << 2) + ((a.s4 >> 4) & 3); b.s3 = ((ushort)a.s3 << 2) + ((a.s4 >> 6) & 3); b.s4 = ((ushort)a.s5 << 2) + ((a.s9 >> 0) & 3); b.s5 = ((ushort)a.s6 << 2) + ((a.s9 >> 2) & 3); b.s6 = ((ushort)a.s7 << 2) + ((a.s9 >> 4) & 3); b.s7 = ((ushort)a.s8 << 2) + ((a.s9 >> 6) & 3); vstore8(convert_ushort8(b), 0, (__global ushort*)pDstRawS16); } */ ushort value, value0, value1, value2, value3; ushort value4, value5, value6, value7; ushort valueMax0, valueMax1, valueMin0, valueMin1; ushort valueMax, valueMin, valueDiff; short valueUp, valueDown; int r0 = - 2; int r1 = 0; int r2 = 2; int c0 = - 2; int c1 = 0; int c2 = 2; // c0 c1 c2 // r0 F A G // r1 B C D // r2 H E I value = *(pSrcRawU16 + r1 * srcStride + c1); // C value0 = *(pSrcRawU16 + r0 * srcStride + c1); // A value1 = *(pSrcRawU16 + r1 * srcStride + c0); // B value2 = *(pSrcRawU16 + r1 * srcStride + c2); // D value3 = *(pSrcRawU16 + r2 * srcStride + c1); // E value4 = *(pSrcRawU16 + r0 * srcStride + c0); // F value5 = *(pSrcRawU16 + r0 * srcStride + c2); // G value6 = *(pSrcRawU16 + r2 * srcStride + c0); // H value7 = *(pSrcRawU16 + r2 * srcStride + c2); // I valueMax0 = MAX4(value0, value1, value2, value3); valueMax1 = MAX4(value4, value5, value6, value7); valueMin0 = MIN4(value0, value1, value2, value3); valueMin1 = MIN4(value4, value5, value6, value7); valueMax = MAX(valueMax0, valueMax1); valueMin = MIN(valueMin0, valueMin1); valueDiff = valueMax - valueMin; valueDiff >>= 1; valueUp = (short)valueMax + (short)valueDiff; valueDown = (short)valueMin - (short)valueDiff; value = MIN(value, valueUp); value = MAX(value, valueDown); *(pDstRawU16) = value; }//#include // #pragma OPENCL EXTENSION cl_arm_printf : enable #ifdef cl_arm_printf // #pragma OPENCL EXTENSION cl_arm_printf : enable #endif #if 1 #define IMG_STRIDE_I_B (7488) #define IMG_STRIDE_O_B (9216) #define IMG_W (4608) typedef short RK_S16; typedef unsigned short RK_U16; typedef char RK_S8; typedef unsigned char RK_U8; #define MAX(a, b) ( (a) > (b) ? (a) : (b) ) #define MIN(a, b) ( (a) < (b) ? (a) : (b) ) #endif __kernel void CvtUnpackS13ToRaw16(__global int *out, __global const int *in2) { int j = get_global_id(0); int nSrcWid = IMG_W; __global char *pSrcRawU8 = (__global char *)in2 + j * 7488; __global short *pDstRawS16 = (__global short *)out + j * 4608; #if 1 RK_U16 sign_bit = 0; RK_U8 Bytes[13] = { 0 }; RK_U16 u16Pixels[8] = { 0 }; RK_S16 s16Pixels[8] = { 0 }; for (int x = 0; x < nSrcWid; x += 8) { //---- 13 Byte for (int b = 0; b < 13; b++) { Bytes[b] = pSrcRawU8[13 * x / 8 + b]; } // for b // Pixel P7 P6 P5 P4 P3 P2 P1 P0 // ---- ------- ---- ------- ------- ---- ------- ---- // Bits [8 5,3 8 2,6 7,1 8 4,4 8 1,7 6,2 8 3,5 8] // Byte B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 u16Pixels[0] = ((Bytes[ 1] & 0x1F) << 8) + ((Bytes[ 0] & 0xFF) >> 0); // P0= 5 8 u16Pixels[1] = ((Bytes[ 3] & 0x03) << 11) + ((Bytes[ 2] & 0xFF) << 3) + ((Bytes[ 1] & 0xE0) >> 5); // P1=2 8 3 u16Pixels[2] = ((Bytes[ 4] & 0x7F) << 6) + ((Bytes[ 3] & 0xFC) >> 2); // P2= 7 6 u16Pixels[3] = ((Bytes[ 6] & 0x0F) << 9) + ((Bytes[ 5] & 0xFF) << 1) + ((Bytes[ 4] & 0x80) >> 7); // P3=4 8 1 u16Pixels[4] = ((Bytes[ 8] & 0x01) << 12) + ((Bytes[ 7] & 0xFF) << 4) + ((Bytes[ 6] & 0xF0) >> 4); // P4=1 8 4 u16Pixels[5] = ((Bytes[ 9] & 0x3F) << 7) + ((Bytes[ 8] & 0xFE) >> 1); // P5= 6 7 u16Pixels[6] = ((Bytes[11] & 0x07) << 10) + ((Bytes[10] & 0xFF) << 2) + ((Bytes[ 9] & 0xC0) >> 6); // P1=3 8 2 u16Pixels[7] = ((Bytes[12] & 0xFF) << 5) + ((Bytes[11] & 0xF8) >> 3); // P6= 8 5 //---- 8 Pixels for (int p = 0; p < 8; p++) { sign_bit = (u16Pixels[p] & 0x1000) >> 12; if (sign_bit) { s16Pixels[p] = (u16Pixels[p] & 0x0FFF) + 0xF000; } else { s16Pixels[p] = u16Pixels[p]; } pDstRawS16[x + p] = MIN(1023, MAX(0, (s16Pixels[p] >>2) + (256 >>2))); } // for p } #endif #if 0 int dim = get_work_dim() - 1; int i; int global_id = get_global_id(0); int global_size = get_global_size(0); int group_id = get_group_id(0); int num_groups = get_num_groups(0); int local_id = get_local_id(0); int local_size = get_local_size(0); if (i < 2 && j < 1) { dim = get_work_dim(); global_id = get_global_id(0); global_size = get_global_size(0); group_id = get_group_id(0); num_groups = get_num_groups(0); local_id = get_local_id(0); local_size = get_local_size(0); int global_id1 = get_global_id(1); int global_size1 = get_global_size(1); int group_id1 = get_group_id(1); int num_groups1 = get_num_groups(1); int local_id1 = get_local_id(1); int local_size1 = get_local_size(1); printf("dim%d, global_id(%d) - global_size(%d) - group_id(%d) - num_groups(%d) - local_id(%d) - local_size(%d)-----", dim, global_id, global_size, group_id, num_groups, local_id, local_size); printf("dim%d, global_id1(%d) - global_size(%d) - group_id1(%d) - num_groups1(%d) - local_id1(%d) - local_size1(%d)\n", dim, global_id1, global_size1, group_id1, num_groups1, local_id1, local_size1); } #endif } __kernel void Shp1_LapFilter_CL_0(__global unsigned char *pSrc, __global short *pLapDst) { int i = get_global_id(0); int j = get_global_id(1); const int nSrcStride = 832; /*int sum = 0; // init sum += -1 * pSrc[(i-1)*nSrcStride+j]; sum += -1 * pSrc[i*nSrcStride+j-1] + 4 * pSrc[i*nSrcStride+j] - 1 * pSrc[i*nSrcStride+j+1]; sum += -1 * pSrc[(i+1)*nSrcStride+j]; pLapDst[nSrcStride * i + j] = sum; // s11bit: [-255*4, +255*4] = [-1020, +1020]*/ int ind = i*nSrcStride+j; pLapDst[ind] = 4 * pSrc[ind] - pSrc[ind-nSrcStride] - pSrc[ind-1] - pSrc[ind+1] - pSrc[ind+nSrcStride]; } __kernel void Shp1_LapFilter_CL_1(__global unsigned char *pSrc, __global short *pLapDetail, __global unsigned short *pLapExpLUT) { int i = get_global_id(0); int j = get_global_id(1); const int nSrcStride = 832; int ind = i*nSrcStride+j; int u8StrengthK_fix3b = 4; // pLapDetail int lapVal = pLapDetail[ind]; // pSrcImg - nMeanImg int imgVal = pSrc[ind]; int imgDist = (imgVal - 128) >> 4; // LUT int expIdx = min((int)(abs(lapVal * imgDist)) >> 4, 1023); int expVal = pLapExpLUT[expIdx]; // detail int detail = u8StrengthK_fix3b * u8StrengthK_fix3b * lapVal * expVal; pLapDetail[ind] = (short)((detail + 8192) >> 14); } __kernel void Shp1_LapFilter_CL_2(__global unsigned char *pSrc, __global short *pLapDetail, __global unsigned short *pLapExpLUT) { int i = get_global_id(0); int j = get_global_id(1); const int nSrcStride = 832; int ind = i*nSrcStride+j; short s16LapDst = 4 * pSrc[ind] - pSrc[ind-nSrcStride] - pSrc[ind-1] - pSrc[ind+1] - pSrc[ind+nSrcStride]; int u8StrengthK_fix3b = 4; // pLapDetail int lapVal = s16LapDst;//pLapDetail[ind]; // pSrcImg - nMeanImg int imgVal = pSrc[ind]; int imgDist = (imgVal - 128) >> 4; // LUT int expIdx = min((int)(abs(lapVal * imgDist)) >> 4, 1023); int expVal = pLapExpLUT[expIdx]; // detail int detail = u8StrengthK_fix3b * u8StrengthK_fix3b * lapVal * expVal; pLapDetail[ind] = (short)((detail + 8192) >> 14); } __constant sampler_t rkSAMPLER_LAP = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; __kernel void Shp1_LapFilter_CL_Image(__read_only image2d_t pSrc, __read_only image2d_t pLapExpLUT, __write_only image2d_t pLapDetail) { const int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord0 = pos; int2 cord_u = (int2)(pos.x, pos.y - 1); int2 cord_d = (int2)(pos.x, pos.y + 1); int2 cord_r = (int2)(pos.x + 1, pos.y); int2 cord_l = (int2)(pos.x - 1, pos.y); uint4 src0 = read_imageui(pSrc, cord0); uint4 srcu = read_imageui(pSrc, cord_u); uint4 srcd = read_imageui(pSrc, cord_d); uint4 srcr = read_imageui(pSrc, cord_r); uint4 srcl = read_imageui(pSrc, cord_l); int lapVal = 4 * src0.s0 - srcu.s0 - srcd.s0 - srcr.s0 - srcl.s0; int imgDist = (src0.s0 - 128) >> 4; int expIdx = min((int)(abs(lapVal * imgDist)) >> 4, 1023); uint4 expVal = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)(expIdx, 1)); int u8StrengthK_fix3b = 4; uint4 out; int detail = u8StrengthK_fix3b * u8StrengthK_fix3b * lapVal * expVal.s0; out.s0 = (short)((detail + 8192) >> 14); write_imageui(pLapDetail, pos, out); #if 0 int ind = i*nSrcStride+j; short s16LapDst = 4 * pSrc[ind] - pSrc[ind-nSrcStride] - pSrc[ind-1] - pSrc[ind+1] - pSrc[ind+nSrcStride]; int u8StrengthK_fix3b = 4; // pLapDetail int lapVal = s16LapDst;//pLapDetail[ind]; // pSrcImg - nMeanImg int imgVal = pSrc[ind]; int imgDist = (imgVal - 128) >> 4; // LUT int expIdx = min((int)(abs(lapVal * imgDist)) >> 4, 1023); int expVal = pLapExpLUT[expIdx]; // detail int detail = u8StrengthK_fix3b * u8StrengthK_fix3b * lapVal * expVal; pLapDetail[ind] = (short)((detail + 8192) >> 14); #endif } __kernel void Shp1_LapFilter_CL_Image_4C(__read_only image2d_t pSrc, __read_only image2d_t pLapExpLUT, __write_only image2d_t pLapDetail) { const int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord0 = pos; int2 cord_u = (int2)(pos.x, pos.y - 1); int2 cord_d = (int2)(pos.x, pos.y + 1); int2 cord_r = (int2)(pos.x + 1, pos.y); int2 cord_l = (int2)(pos.x - 1, pos.y); uint4 src0 = read_imageui(pSrc, rkSAMPLER_LAP, cord0); // cur uint4 srcu = read_imageui(pSrc, rkSAMPLER_LAP, cord_u); // up uint4 srcd = read_imageui(pSrc, rkSAMPLER_LAP, cord_d); // dowm uint4 srcr = read_imageui(pSrc, rkSAMPLER_LAP, cord_r); // right uint4 srcl = read_imageui(pSrc, rkSAMPLER_LAP, cord_l); // left #if 0 if (pos.x==0 && pos.y==0) { printf("x=%d,y=%d,src0=[%d %d %d %d]\n", pos.x,pos.y, src0.s0, src0.s1, src0.s2, src0.s3); printf("x=%d,y=%d,srcu=[%d %d %d %d]\n", pos.x,pos.y, srcu.s0, srcu.s1, srcu.s2, srcu.s3); printf("x=%d,y=%d,srcl=[%d %d %d %d]\n", pos.x,pos.y, srcl.s0, srcl.s1, srcl.s2, srcl.s3); } #endif // int u8StrengthK_fix3b = 4; int lapVal ; int imgDist; int expIdx ; uint4 expVal ; int detail ; uint4 out ; int cur = 0; int top = 0; int lft = 0; int bot = 0; int rgt = 0; // out.s0 top = srcu.s0; lft = srcl.s3; cur = src0.s0; rgt = src0.s1; bot = srcd.s0; lapVal = 4 * cur - top - lft - rgt - bot; imgDist = (cur - 128) >> 4; expIdx = min((int)(abs(lapVal * imgDist)) >> 4, 1023); expVal = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)(expIdx, 1)); detail = u8StrengthK_fix3b * u8StrengthK_fix3b * lapVal * expVal.s0; out.s0 = (short)((detail + 8192) >> 14); // out.s1 top = srcu.s1; lft = src0.s0; cur = src0.s1; rgt = src0.s2; bot = srcd.s1; lapVal = 4 * cur - top - lft - rgt - bot; imgDist = (cur - 128) >> 4; expIdx = min((int)(abs(lapVal * imgDist)) >> 4, 1023); expVal = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)(expIdx, 1)); detail = u8StrengthK_fix3b * u8StrengthK_fix3b * lapVal * expVal.s0; out.s1 = (short)((detail + 8192) >> 14); // out.s2 top = srcu.s2; lft = src0.s1; cur = src0.s2; rgt = src0.s3; bot = srcd.s2; lapVal = 4 * cur - top - lft - rgt - bot; imgDist = (cur - 128) >> 4; expIdx = min((int)(abs(lapVal * imgDist)) >> 4, 1023); expVal = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)(expIdx, 1)); detail = u8StrengthK_fix3b * u8StrengthK_fix3b * lapVal * expVal.s0; out.s2 = (short)((detail + 8192) >> 14); // out.s3 top = srcu.s3; lft = src0.s2; cur = src0.s3; rgt = srcr.s0; bot = srcd.s3; lapVal = 4 * cur - top - lft - rgt - bot; imgDist = (cur - 128) >> 4; expIdx = min((int)(abs(lapVal * imgDist)) >> 4, 1023); expVal = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)(expIdx, 1)); detail = u8StrengthK_fix3b * u8StrengthK_fix3b * lapVal * expVal.s0; out.s3 = (short)((detail + 8192) >> 14); // write write_imageui(pLapDetail, pos, out); } __kernel void Shp1_LapFilter_CL_Image_4C_new(__read_only image2d_t pSrc, __read_only image2d_t pLapExpLUT, __write_only image2d_t pLapDetail) { const int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord0 = pos; int2 cord_u = (int2)(pos.x, pos.y - 1); int2 cord_d = (int2)(pos.x, pos.y + 1); int2 cord_r = (int2)(pos.x + 1, pos.y); int2 cord_l = (int2)(pos.x - 1, pos.y); uint4 src0 = read_imageui(pSrc, rkSAMPLER_LAP, cord0); // cur uint4 srcu = read_imageui(pSrc, rkSAMPLER_LAP, cord_u); // up uint4 srcd = read_imageui(pSrc, rkSAMPLER_LAP, cord_d); // dowm uint4 srcr = read_imageui(pSrc, rkSAMPLER_LAP, cord_r); // right uint4 srcl = read_imageui(pSrc, rkSAMPLER_LAP, cord_l); // left // int u8StrengthK_fix3b = 4; uint4 out ; uint4 v_l = (uint4)(srcl.s3, src0.s0, src0.s1, src0.s2); uint4 v_r = (uint4)(src0.s1, src0.s2, src0.s3, srcr.s0); int4 v_lapVal = as_int4(4 * src0 - srcu - v_l - v_r - srcd); int4 v_imgDist = as_int4(src0 - 128) >> 4; uint4 v_expIdx = (as_uint4(abs(v_lapVal * v_imgDist)) >> 4); int4 v_expVal; v_expVal.s0 = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s0, 1)).s0; v_expVal.s1 = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s1, 1)).s0; v_expVal.s2 = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s2, 1)).s0; v_expVal.s3 = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s3, 1)).s0; /* uint4 v_expVals0 = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s0, 1)); uint4 v_expVals1 = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s1, 1)); uint4 v_expVals2 = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s2, 1)); uint4 v_expVals3 = read_imageui(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s3, 1)); int4 v_expVal = (int4)(v_expVals0.s0, v_expVals1.s0, v_expVals2.s0, v_expVals3.s0); */ int4 v_detail = u8StrengthK_fix3b * u8StrengthK_fix3b * v_lapVal * v_expVal; out = as_uint4((v_detail + 8192) >> 14); // write write_imageui(pLapDetail, pos, out); } __kernel void Shp1_LapFilter_CL_Image_4C_new_float(__read_only image2d_t pSrc, __read_only image2d_t pLapExpLUT, __write_only image2d_t pLapDetail) { const int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord0 = pos; int2 cord_u = (int2)(pos.x, pos.y - 1); int2 cord_d = (int2)(pos.x, pos.y + 1); int2 cord_r = (int2)(pos.x + 1, pos.y); int2 cord_l = (int2)(pos.x - 1, pos.y); float4 src0 = read_imagef(pSrc, rkSAMPLER_LAP, cord0); // cur float4 srcu = read_imagef(pSrc, rkSAMPLER_LAP, cord_u); // up float4 srcd = read_imagef(pSrc, rkSAMPLER_LAP, cord_d); // dowm float4 srcr = read_imagef(pSrc, rkSAMPLER_LAP, cord_r); // right float4 srcl = read_imagef(pSrc, rkSAMPLER_LAP, cord_l); // left // float u8StrengthK_fix3b = 0.5; float4 v_l = (float4)(srcl.s3, src0.s0, src0.s1, src0.s2); float4 v_r = (float4)(src0.s1, src0.s2, src0.s3, srcr.s0); float4 v_lapVal = (4 * src0 - srcu - v_l - v_r - srcd); float4 v_imgDist = (src0 - (float)0.5); int4 v_expIdx = convert_int4(fabs(v_lapVal * v_imgDist * 1024)); float4 v_expVal; v_expVal.s0 = read_imagef(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s0, 1)).s0; v_expVal.s1 = read_imagef(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s1, 1)).s0; v_expVal.s2 = read_imagef(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s2, 1)).s0; v_expVal.s3 = read_imagef(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s3, 1)).s0; float4 out = u8StrengthK_fix3b * u8StrengthK_fix3b * v_lapVal * v_expVal; // write write_imagef(pLapDetail, pos, out); } __kernel void Shp1_LapFilter_CL_Image_4C_new_float_exp(__read_only image2d_t pSrc, __write_only image2d_t pLapDetail) { const int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord0 = pos; int2 cord_u = (int2)(pos.x, pos.y - 1); int2 cord_d = (int2)(pos.x, pos.y + 1); int2 cord_r = (int2)(pos.x + 1, pos.y); int2 cord_l = (int2)(pos.x - 1, pos.y); float4 src0 = read_imagef(pSrc, rkSAMPLER_LAP, cord0); // cur float4 srcu = read_imagef(pSrc, rkSAMPLER_LAP, cord_u); // up float4 srcd = read_imagef(pSrc, rkSAMPLER_LAP, cord_d); // dowm float4 srcr = read_imagef(pSrc, rkSAMPLER_LAP, cord_r); // right float4 srcl = read_imagef(pSrc, rkSAMPLER_LAP, cord_l); // left // float u8StrengthK_fix3b = 0.5; float4 v_l = (float4)(srcl.s3, src0.s0, src0.s1, src0.s2); float4 v_r = (float4)(src0.s1, src0.s2, src0.s3, srcr.s0); float4 v_lapVal = (4 * src0 - srcu - v_l - v_r - srcd); float4 v_imgDist = (src0 - (float)0.5); float4 v_expVal = exp(fabs(v_lapVal * v_imgDist)); float4 out = u8StrengthK_fix3b * u8StrengthK_fix3b * v_lapVal * v_expVal; // write write_imagef(pLapDetail, pos, out); } #ifdef RK_SUPPORT_FP16 #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif ////////////////////////////////////////////////////////////////////////// // for first build in rkalgo_sharproc_ocl() __kernel void Shp0_FirstBuild() { } ////////////////////////////////////////////////////////////////////////// // for Shp1_LapFilter0_OclProcess() OnlyLap __kernel void Shp1_LapFilter0_OclProcess(__read_only image2d_t pSrc, __read_only image2d_t pLapExpLUT, __write_only image2d_t pDstImg) { const int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord0 = pos; int2 cord_u = (int2)(pos.x, pos.y - 1); int2 cord_d = (int2)(pos.x, pos.y + 1); int2 cord_r = (int2)(pos.x + 1, pos.y); int2 cord_l = (int2)(pos.x - 1, pos.y); FLOAT4 src0 = RI_F(pSrc, rkSAMPLER_LAP, cord0); // cur FLOAT4 srcu = RI_F(pSrc, rkSAMPLER_LAP, cord_u); // up FLOAT4 srcd = RI_F(pSrc, rkSAMPLER_LAP, cord_d); // dowm FLOAT4 srcr = RI_F(pSrc, rkSAMPLER_LAP, cord_r); // right FLOAT4 srcl = RI_F(pSrc, rkSAMPLER_LAP, cord_l); // left #if 0 if (pos.x==0 && pos.y==0) { printf("x=%d,y=%d,nBlendFlag=[%d %d %d %d]\n", pos.x,pos.y, nBlendFlag); } #endif // float u8StrengthK_fix3b = 0.5; FLOAT4 v_l = (FLOAT4)(srcl.s3, src0.s0, src0.s1, src0.s2); FLOAT4 v_r = (FLOAT4)(src0.s1, src0.s2, src0.s3, srcr.s0); FLOAT4 v_lapVal = (4 * src0 - srcu - v_l - v_r - srcd); FLOAT4 v_imgDist = (src0 - (float)0.5); int4 v_expIdx = convert_int4(fabs(v_lapVal * v_imgDist * 1024)); FLOAT4 v_expVal; v_expVal.s0 = RI_F(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s0, 1)).s0; v_expVal.s1 = RI_F(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s1, 1)).s0; v_expVal.s2 = RI_F(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s2, 1)).s0; v_expVal.s3 = RI_F(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s3, 1)).s0; FLOAT4 outLap = u8StrengthK_fix3b * u8StrengthK_fix3b * v_lapVal * v_expVal; // float4 outImg = min(max(src0 + outLap, (float4)0), (float4)1); // Src+Lap FLOAT4 outImg = src0 + outLap; // Src+Lap WI_F(pDstImg, pos, outImg); } ////////////////////////////////////////////////////////////////////////// // for Shp1_LapFilter1_OclProcess() Lap+Lep __kernel void Shp1_LapFilter1_OclProcess(__read_only image2d_t pSrc, __read_only image2d_t pLapExpLUT, __write_only image2d_t pLapDetail) { const int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord0 = pos; int2 cord_u = (int2)(pos.x, pos.y - 1); int2 cord_d = (int2)(pos.x, pos.y + 1); int2 cord_r = (int2)(pos.x + 1, pos.y); int2 cord_l = (int2)(pos.x - 1, pos.y); FLOAT4 src0 = RI_F(pSrc, rkSAMPLER_LAP, cord0); // cur FLOAT4 srcu = RI_F(pSrc, rkSAMPLER_LAP, cord_u); // up FLOAT4 srcd = RI_F(pSrc, rkSAMPLER_LAP, cord_d); // dowm FLOAT4 srcr = RI_F(pSrc, rkSAMPLER_LAP, cord_r); // right FLOAT4 srcl = RI_F(pSrc, rkSAMPLER_LAP, cord_l); // left #if 0 if (pos.x==0 && pos.y==0) { printf("x=%d,y=%d,nBlendFlag=[%d %d %d %d]\n", pos.x,pos.y, nBlendFlag); } #endif // float u8StrengthK_fix3b = 0.5; FLOAT4 v_l = (FLOAT4)(srcl.s3, src0.s0, src0.s1, src0.s2); FLOAT4 v_r = (FLOAT4)(src0.s1, src0.s2, src0.s3, srcr.s0); FLOAT4 v_lapVal = (4 * src0 - srcu - v_l - v_r - srcd); FLOAT4 v_imgDist = (src0 - (float)0.5); int4 v_expIdx = convert_int4(fabs(v_lapVal * v_imgDist * 1024)); FLOAT4 v_expVal; v_expVal.s0 = read_imagef(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s0, 1)).s0; v_expVal.s1 = read_imagef(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s1, 1)).s0; v_expVal.s2 = read_imagef(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s2, 1)).s0; v_expVal.s3 = read_imagef(pLapExpLUT, rkSAMPLER_LAP, (int2)((int)v_expIdx.s3, 1)).s0; FLOAT4 outLap = u8StrengthK_fix3b * u8StrengthK_fix3b * v_lapVal * v_expVal; WI_F(pLapDetail, pos, outLap); // write Lap for Src+Lap+Lep } ////////////////////////////////////////////////////////////////////////// // for Shp2_LepFilter_OclProcess(): DnscaleNearest __kernel void Shp2_Dnscale2Nearest_OclProcess(__read_only image2d_t pSrc, int nScale, __write_only image2d_t pDst) { int centerOffset = nScale / 2; int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord_src = (int2)(pos.x * nScale + centerOffset , pos.y * nScale + centerOffset); uint4 val_src = read_imageui(pSrc, rkSAMPLER_LAP, cord_src); #if 0 if (pos.x==0 && pos.y==0) { printf("x=%d,y=%d,val_src=%d\n", cord_src.x, cord_src.y, val_src.s0); } #endif write_imageui(pDst, pos, val_src); } ////////////////////////////////////////////////////////////////////////// // for Shp2_LepFilter_OclProcess(): BoxFilterSum2 #if 0 __kernel void Shp2_BoxFilterSum2_OclProcess(__read_only image2d_t pSrc, int nWinRadius, __write_only image2d_t pLocalMean, __write_only image2d_t pLocalVari) { nWinRadius = 2; // RKSHARPROC_LEP_WIN_RADIUS = 2 int boxSize = 2 * nWinRadius + 1; int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord; int mean1 = 0; int mean2 = 0; uint4 val_src; uint4 val_mean; uint4 val_vari; for (int r = 0; r < boxSize; r++) { for (int c = 0; c < boxSize; c++) { cord = (int2)(pos.x + c, pos.y + r); val_src = read_imageui(pSrc, rkSAMPLER_LAP, cord); mean1 += val_src.s0; mean2 += (val_src.s0 * val_src.s0); } } mean1 = (mean1 * 5) >> 7; // 1/25 mean2 = (mean2 * 5) >> 7; val_mean.s0 = mean1; val_vari.s0 = mean2 - mean1 * mean1; #if 0 if (pos.x==0 && pos.y==0) { printf("x=%d,y=%d,val_mean=%d\n", pos.x, pos.y, val_mean.s0); printf("x=%d,y=%d,val_vari=%d\n", pos.x, pos.y, val_vari.s0); } #endif write_imageui(pLocalMean, pos, val_mean); write_imageui(pLocalVari, pos, val_vari); } #else __kernel void Shp2_BoxFilterSum2_OclProcess(__read_only image2d_t pSrc, int nWinRadius, __write_only image2d_t pLocalMean, __write_only image2d_t pLocalVari) { nWinRadius = 2; // RKSHARPROC_LEP_WIN_RADIUS = 2 int boxSize = 2 * nWinRadius + 1; int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord; int srcVal = 0; int mean1 = 0; int mean2 = 0; uint4 val_src; uint4 val_mean; uint4 val_vari; for (int r = -nWinRadius; r <= nWinRadius; r++) { for (int c = -nWinRadius; c <= nWinRadius; c++) { cord = (int2)(pos.x + c, pos.y + r); srcVal = read_imageui(pSrc, rkSAMPLER_LAP, cord).s0; mean1 += srcVal; mean2 += (srcVal * srcVal); } } mean1 = (mean1 * 5) >> 7; // 1/25 mean2 = (mean2 * 5) >> 7; val_mean.s0 = mean1; val_vari.s0 = mean2 - mean1 * mean1; #if 0 if (pos.x==0 && pos.y==0) { printf("x=%d,y=%d,val_mean=%d\n", pos.x, pos.y, val_mean.s0); printf("x=%d,y=%d,val_vari=%d\n", pos.x, pos.y, val_vari.s0); } #endif write_imageui(pLocalMean, pos, val_mean); write_imageui(pLocalVari, pos, val_vari); } #endif ////////////////////////////////////////////////////////////////////////// // for Shp2_LepFilter_OclProcess(): BilinearUpScale // // CLK_NORMALIZED_COORDS_TRUEָʹùһ // CLK_ADDRESS_CLAMP ָͼΧɫΪɫ // CLK_FILTER_LINEARָʹ˫Բֵ __constant sampler_t sampler_BilinearUpScale = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_LINEAR; __kernel void Shp2_BilinearUpScale_OclProcess(__read_only image2d_t pLocalMeanSrc, __read_only image2d_t pLocalVariSrc, __write_only image2d_t pLocalMeanDst, __write_only image2d_t pLocalVariDst, const float widNormalizationFactor, const float hgtNormalizationFactor) { // glob_idлȡĿ int2 coordinate = (int2)(get_global_id(0), get_global_id(1)); const int2 imageDim = get_image_dim(pLocalMeanSrc); // һ float2 normalizedCoordinate = convert_float2(coordinate * imageDim) * (float2)(widNormalizationFactor, hgtNormalizationFactor) + (float)0.5; // ݹһԭͼжȡ float4 mean = read_imagef(pLocalMeanSrc, sampler_BilinearUpScale, normalizedCoordinate); float4 vari = read_imagef(pLocalVariSrc, sampler_BilinearUpScale, normalizedCoordinate); uint4 mean_ui = convert_uint4(mean * 65535); uint4 vari_ui = convert_uint4(vari * 65535); #if 0 if (coordinate.x < 8 && coordinate.y==0) { printf("x=%d,y=%d, [%f %f] = [%d %d]\n",coordinate.x, coordinate.x, mean.s0, vari.s0, mean_ui.s0, vari_ui.s0); } #endif // дĿͼ write_imageui(pLocalMeanDst, coordinate, mean_ui); write_imageui(pLocalVariDst, coordinate, vari_ui); } ////////////////////////////////////////////////////////////////////////// // for Shp2_LepFilter_OclProcess(): FastConv2D __kernel void Shp2_FastConv2D_OclProcess(__read_only image2d_t pSrc, __write_only image2d_t pDst) { int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord_0 = (int2)(pos.x - 1, pos.y - 1); int2 cord_1 = (int2)(pos.x + 0, pos.y - 1); int2 cord_2 = (int2)(pos.x + 1, pos.y - 1); int2 cord_3 = (int2)(pos.x - 1, pos.y + 0); int2 cord_4 = (int2)(pos.x + 0, pos.y + 0); int2 cord_5 = (int2)(pos.x + 1, pos.y + 0); int2 cord_6 = (int2)(pos.x - 1, pos.y + 1); int2 cord_7 = (int2)(pos.x + 0, pos.y + 1); int2 cord_8 = (int2)(pos.x + 1, pos.y + 1); uint4 src_0 = read_imageui(pSrc, rkSAMPLER_LAP, cord_0); uint4 src_1 = read_imageui(pSrc, rkSAMPLER_LAP, cord_1); uint4 src_2 = read_imageui(pSrc, rkSAMPLER_LAP, cord_2); uint4 src_3 = read_imageui(pSrc, rkSAMPLER_LAP, cord_3); uint4 src_4 = read_imageui(pSrc, rkSAMPLER_LAP, cord_4); uint4 src_5 = read_imageui(pSrc, rkSAMPLER_LAP, cord_5); uint4 src_6 = read_imageui(pSrc, rkSAMPLER_LAP, cord_6); uint4 src_7 = read_imageui(pSrc, rkSAMPLER_LAP, cord_7); uint4 src_8 = read_imageui(pSrc, rkSAMPLER_LAP, cord_8); uint4 dst; // kernel = [1 2 1; 2 4 2; 1 2 1] dst.s0 = src_0.s0 * 1 + src_1.s0 * 2 + src_2.s0 * 1 + src_3.s0 * 2 + src_4.s0 * 4 + src_5.s0 * 2 + src_6.s0 * 1 + src_7.s0 * 2 + src_8.s0 * 1; // dst.s0 = (dst.s0 + 8) >> 4; dst.s0 = dst.s0 >> 4; write_imageui(pDst, pos, dst); } __kernel void Shp2_FastConv2DVer_OclProcess(__read_only image2d_t pSrc, __write_only image2d_t pDst) { int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord_0 = (int2)(pos.x - 1, pos.y); int2 cord_1 = (int2)(pos.x + 0, pos.y); int2 cord_2 = (int2)(pos.x + 1, pos.y); uint4 src_0 = read_imageui(pSrc, rkSAMPLER_LAP, cord_0); uint4 src_1 = read_imageui(pSrc, rkSAMPLER_LAP, cord_1); uint4 src_2 = read_imageui(pSrc, rkSAMPLER_LAP, cord_2); uint4 dst; // kernel = [1 2 1] dst.s0 = (src_0.s0 + src_1.s0 * 2 + src_2.s0) >> 2; write_imageui(pDst, pos, dst); } __kernel void Shp2_FastConv2DHor_OclProcess(__read_only image2d_t pSrc, __write_only image2d_t pDst) { int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord_0 = (int2)(pos.x, pos.y - 1); int2 cord_1 = (int2)(pos.x, pos.y + 0); int2 cord_2 = (int2)(pos.x, pos.y + 1); uint4 src_0 = read_imageui(pSrc, rkSAMPLER_LAP, cord_0); uint4 src_1 = read_imageui(pSrc, rkSAMPLER_LAP, cord_1); uint4 src_2 = read_imageui(pSrc, rkSAMPLER_LAP, cord_2); uint4 dst; // kernel = [1 2 1] dst.s0 = (src_0.s0 + src_1.s0 * 2 + src_2.s0) >> 2; write_imageui(pDst, pos, dst); } ////////////////////////////////////////////////////////////////////////// // for Shp2_LepFilter_OclProcess(): ComputeGrad __kernel void Shp2_ComputeGrad_OclProcess(__read_only image2d_t pSrc, __write_only image2d_t pDst) { int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord_0 = (int2)(pos.x - 1, pos.y); int2 cord_1 = (int2)(pos.x + 1, pos.y); int2 cord_2 = (int2)(pos.x, pos.y - 1); int2 cord_3 = (int2)(pos.x, pos.y + 1); uint4 src_0 = read_imageui(pSrc, rkSAMPLER_LAP, cord_0); uint4 src_1 = read_imageui(pSrc, rkSAMPLER_LAP, cord_1); uint4 src_2 = read_imageui(pSrc, rkSAMPLER_LAP, cord_2); uint4 src_3 = read_imageui(pSrc, rkSAMPLER_LAP, cord_3); uint4 grad_X; uint4 grad_Y; grad_X.s0 = abs((int)src_0.s0 - (int)src_1.s0); grad_Y.s0 = abs((int)src_2.s0 - (int)src_3.s0); uint4 grad = (grad_X + grad_Y) >> 1; #if 0 if (coordinate.x < 8 && coordinate.y==0) { printf("x=%d,y=%d, [%f %f] = [%d %d]\n",coordinate.x, coordinate.x, src_0.s0, src_1.s0, src_2.s0, src_3.s0, grad_X.s0, grad_Y.s0, grad.s0 } #endif write_imageui(pDst, pos, grad); } // for Shp2_LepFilter_OclProcess(): ComputeGrad + BoxFilter __kernel void Shp2_ComputeGradBoxFilter_OclProcess(__read_only image2d_t pSrc, __write_only image2d_t pDst) { int nWinRadius = 2; // RKSHARPROC_LEP_WIN_RADIUS = 2 int mWinSrc = nWinRadius + 1; // =3 int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord; __local uint srcs[7][7]; for (int r = -mWinSrc; r <= mWinSrc; r++) { for (int c = -mWinSrc; c <= mWinSrc; c++) { cord = (int2)(pos.x + c, pos.y + r); srcs[r+mWinSrc][c+mWinSrc] = read_imageui(pSrc, rkSAMPLER_LAP, cord).s0; } } uint4 sumGrad = (uint4)(0,0,0,0); for (int r = 1; r < 2*mWinSrc; r++) { for (int c = 1; c < 2*mWinSrc; c++) { sumGrad.s0 += ( abs((int)srcs[r-1][c] - (int)srcs[r+1][c]) + abs((int)srcs[r][c-1] - (int)srcs[r][c+1]) ) >> 1; } } sumGrad.s0 = (sumGrad.s0 * 5) >> 7; // 1/25 write_imageui(pDst, pos, sumGrad); } ////////////////////////////////////////////////////////////////////////// // for Shp2_LepFilter_OclProcess(): BoxFilterSum1 __kernel void Shp2_BoxFilterSum1_OclProcess(__read_only image2d_t pSrc, int nWinRadius, __write_only image2d_t pDst) { nWinRadius = 2; // RKSHARPROC_LEP_WIN_RADIUS = 2 int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord; int mean = 0; uint4 val_dst; for (int r = -nWinRadius; r <= nWinRadius; r++) { for (int c = -nWinRadius; c <= nWinRadius; c++) { cord = (int2)(pos.x + c, pos.y + r); mean += read_imageui(pSrc, rkSAMPLER_LAP, cord).s0; } } val_dst.s0 = (mean * 5) >> 7; // 1/25 write_imageui(pDst, pos, val_dst); } ////////////////////////////////////////////////////////////////////////// // for Shp2_LepFilter_OclProcess(): ComputeAwBw __kernel void Shp2_ComputeAwBw_OclProcess(__read_only image2d_t pLocalMean, __read_only image2d_t pLocalVari, __read_only image2d_t pLocalGrad, const float fAlpha, const float fBeta, __write_only image2d_t pDstAw, __write_only image2d_t pDstBw) { uint nAlpha = (uint)(fAlpha * 8); // RKSHARPROC_ALPHA_PREC_BITS=3 // fBeta = 1.0; uint alphaNorm = (1<<3); // RKSHARPROC_ALPHA_PREC_BITS=3 uint awbwNorm = (1<<8); // RKSHARPROC_AWBW_PREC_BITS=8 uint u32_mean = 0; uint u32_vari = 0; uint u32_grad = 0; int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord = pos; // src u32_mean = read_imageui(pLocalMean, rkSAMPLER_LAP, cord).s0; u32_vari = read_imageui(pLocalVari, rkSAMPLER_LAP, cord).s0; u32_grad = read_imageui(pLocalGrad, rkSAMPLER_LAP, cord).s0; u32_vari = u32_vari * alphaNorm; uint eps = (u32_vari + u32_grad) == 0; uint tmp = (u32_vari + nAlpha * u32_grad + eps); uint u32_aw = (u32_vari * awbwNorm) / tmp; // 8bit-prec uint u32_bw = u32_mean * (awbwNorm - u32_aw); // 8b+8b uint4 val_dst_aw; uint4 val_dst_bw; val_dst_aw.s0 = u32_aw; val_dst_bw.s0 = u32_bw; write_imageui(pDstAw, pos, val_dst_aw); write_imageui(pDstBw, pos, val_dst_bw); } ////////////////////////////////////////////////////////////////////////// // for Shp2_LepFilter_OclProcess(): GetLepBlend __kernel void Shp2_GetLepBlend_OclProcess(__read_only image2d_t pSrcImg, __read_only image2d_t pAwFilt, __read_only image2d_t pBwFilt, __read_only image2d_t pLapDst, __read_only image2d_t pLepExpLUT, const float fStrengthK, const int nScale, __write_only image2d_t pDstImg) { int2 pos = (int2)(get_global_id(0), get_global_id(1)); int2 cord = pos; int u8StrengthK_fix3b = (int)(fStrengthK * 8 + 0.5); int awbwNorm = (1 << 8); // RKSHARPROC_AWBW_PREC_BITS=8 int nMeanImg = 128; int nMaxScale = 8; int u8SrcVal = read_imageui(pSrcImg, rkSAMPLER_LAP, cord).s0; // 8b int u8AwVal = read_imageui(pAwFilt, rkSAMPLER_LAP, cord).s0; // 8b int u16BwVal = read_imageui(pBwFilt, rkSAMPLER_LAP, cord).s0; // 16b int s17ABwVal = (u8SrcVal * awbwNorm - u8AwVal * u8SrcVal - u16BwVal); // u16 - u16 = s17 int nDetail = (8 + u8StrengthK_fix3b * nScale / nMaxScale) * s17ABwVal / awbwNorm ; // s18 * [1,2] - 8bit = s11 int imgDist = (u8SrcVal - nMeanImg); // 8bit // LUT int expIdx = abs((nDetail * imgDist) >> 9); // 8+3 +8 -9=10bit int expVal = read_imageui(pLepExpLUT, rkSAMPLER_LAP, (int2)((int)expIdx, 1)).s0; // Lap & Lep int lapVal = read_imagei(pLapDst, rkSAMPLER_LAP, cord).s0; int lepVal = ((nDetail * expVal) >> 11); int dstVal = u8SrcVal + lapVal + lepVal; #if 1 if (cord.x < 8 && cord.y==0) { printf("x=%d,y=%d, u8SrcVal=%d,u8AwVal=%d,u16BwVal=%d,s17ABwVal=%d,nDetail=%d,imgDist=%d,expIdx=%d,expVal=%d,lapVal=%d,lepVal=%d,dstVal=%d\n",cord.x, cord.x, u8SrcVal,u8AwVal,u16BwVal,s17ABwVal,nDetail,imgDist,expIdx,expVal,lapVal,lepVal,dstVal); } #endif uint4 dst; dst.s0 = min(dstVal, 255); write_imageui(pDstImg, pos, dstVal); }pq_srswcacframetemporaldenoiseremapacmhistogramdownscale8downscale8_bufferrawdpcrkalgo_sharprocsh]RG2'tiTI4!ydM8"@9RkAlgoOcl16rkalgo_swcac_oclSt15_Sp_counted_ptrIPN2cl7Image2DELN9__gnu_cxx12_Lock_policyE2EE@@%s-E: %s[%d] swcac Getchannel error %s-D: ---- downScale_NV12_Map_DarkCh = %d[ms] %s-D: ---- calMeanFilterYBuf = %d[ms] %s-D: after detectPurpleFringingBuf %d %s-D: after generateOutPointerNV12 %d %s-D: --s-- GenerateOut_Processor() /home/xhj/work/RkYuvAlgos_CAC/source/src/lib_rkalgo/rkalgo_swcac.cpp%s-D: --e-- GenerateOut_Processor() %s-I: ----s-----RkAlgoOcl::RkAlgoOcl %s-I: ----e-----RkAlgoOcl::RkAlgoOcl %s-I: --s-- rkalgo_swcac_ocl() %s-I: rkalgo_swcac_ocl %dx%dx%d generateOut%s-I: --e-- rkalgo_swcac_ocl() %s-I: --s-- ~rkalgo_swcac_ocl() %s-I: --e-- ~rkalgo_swcac_ocl() %s-I: ----s-----RkAlgoOcl::Process %s-I: ----e-----RkAlgoOcl::Process %s-I: ----s-----RkAlgoOcl::~RkAlgoOcl %s-I: ----e-----RkAlgoOcl::~RkAlgoOcl *ZN12rkalgo_swcac12avgFilterBufEPhS0_hS0_hhEUlvE_*ZN12rkalgo_swcac15avgFilterBuf7x7EPhS0_S0_hS0_hhhEUlvE_*ZN12rkalgo_swcac17SwCacProcessorBufEP19RkSwCacAlg_Params_t22tag_CacEffectAlgoParamEUlvE_SwCac_SystemInit(%s%s%d-D: mImgWidxmImgHgt=%dx%d nPerLog=%.2f, nDnScale=%d, nVerStartCol=%d %s-D: mImgWidxmImgHgt=%dx%d nPerLog=%.2f, nDnScale=%d, nVerStartCol=%d %s%d-T: Wtl: i=%d/%d %s-T: Wtl: i=%d/%d %s=%4d%s=%9.4f%s=%s%d%s=0x%08x%s=%d%s+%dMbP?%s%d-D: --s-- rk_swcac_alloc() %s%d-E: %s[%d]Fail to get ion buffer: pTempBufs[%d] %s%d-D: ion_drv_handle=%d, SzTempBufs[%d]=%d, FdTempBufs[%d]=%04d, pTempBufs[%d]=%p %s%d-D: --e-- rk_swcac_alloc() success %s%d-E: %s[%d]--e-- rk_swcac_alloc() failure ret = %d %s%d-D: --s-- rk_swcac_free() %s%d-D: --e-- rk_swcac_free() %s%d-I: --s-- rk_swcac_dump_dst() %s/%dx%d_%03d_%d_%d_%d_%d_%1.2f_%1.2f_%1.2f_%1.2f_%1.2f_out_NV12.yuv%s%d-I: --e-- rk_swcac_dump_dst() %s%d-I: --s-- rk_swcac_dump_src() %s/%dx%d_%03d_%d_%d_%d_%d_%1.2f_%1.2f_%1.2f_%1.2f_%1.2f_NV12.yuvwb%s%d-I: adb pull %s . %s%d-I: --e-- rk_swcac_dump_src() %s%d-I: --s-- rk_swcac_dump_init() /data/%Y%m%d%H%M%S%s%s%s%d-I: adb pull %s %s %s%d-W: Warning: mkdir fail %s! %s%d-I: --e-- rk_swcac_dump_init() : %s-I: Use params file %s nSwcacEnable%s-I: Get nSwcacEnable = %d nAutoHighLightDetect%s-I: Get nAutoHighLightDetect = %d nAutoHighLightOffset%s-I: Get nAutoHighLightOffset = %d nFixHighLightBase%s-I: Get nFixHighLightBase = %d fYCompensate%f%s-I: Get fYCompensate = %f fAutoStrengthU%s-I: Get fAutoStrengthU = %f fAutoStrengthV%s-I: Get fAutoStrengthV = %f fGrayStrengthU%s-I: Get fGrayStrengthU = %f fGrayStrengthV%s-I: Get fGrayStrengthV = %f %s%d-D: --s-- rk_swcac_init_check() %s%d-E: %s[%d]Illegal param: nImgFormat=%d, but only support [%d, %d] ! %s%d-E: %s[%d]Illegal param: nImgWid=%d, but only support [%d, %d] ! %s%d-E: %s[%d]Illegal param: nImgHgt=%d, but only support [%d, %d] ! %s%d-E: %s[%d] Check result: %d errors ! %s%d-I: Check result: success !!! %s%d-D: --e-- rk_swcac_init_check() %s%d-D: --s-- rk_swcac_print_param() %s%d-I: nImgFormat: %d (%s) %s%d-I: nImgWid: %d %s%d-I: nImgHgt: %d %s%d-I: nImgStride[%d]: %d %s%d-I: nImgDepth: %d %s%d-I: nImgFileNum: %d %s%d-I: pImgSrcs[%d]: %p FdImgSrcs[%d]: %d %s%d-I: pImgDst[%d]: %p FdImgDst[%d]: %d %s%d-D: --e-- rk_swcac_print_param() %s%d-D: --s-- rk_swcac_params_check() %s%d-E: %s[%d]Illegal param: nSwcacEnable=%d, but only support [%d, %d] ! %s%d-D: Check result: success !!! %s%d-D: --e-- rk_swcac_params_check() RK_SWCAC_LOG_LEVELRK_SWCAC_WATERMARK_ONRK_SWCAC_DUMP_ONRK_SWCAC_BYPASS%s-D: get warkmak_on_str %s-(%d) %s-D: get bypass_str %s-(%d) /tmp/swcac.dump.cfgw%s%d-D: --s-- rk_swcac_cpy_para_api2func() %s%d-D: --e-- rk_swcac_cpy_para_api2func() rk_swcac_initrk_swcac_procrk_swcac_allocrk_swcac_init_checkrk_swcac_params_check%s%d-I: --s-- rk_swcac_deinit() %s%d-I: --e-- rk_swcac_deinit() %s%d-I: Version: RKSwCac_%s.%s (CPU-%dbit) %s%d-D: --s-- rk_swcac_getversion() %s%d-D: VerInfo: %s %s%d-D: --e-- rk_swcac_getversion() %s%d-I: %s%d-I: -------------------------------- %s%d-I: --s-- rk_swcac_init() %s%d-I: Version: RKSwCac_%s.%s (CPU-%dbit) %s.%s%s%d-E: %s[%d]fail to rkalgo_plat_init(%d) %s%d-E: %s[%d]fail to rkalgo_plat_alloc_init(%d) %s%d-E: %s[%d]fail to init RkSwCac(%d) %s%d-D: get ion driver handle (%d) %s%d-E: %s[%d]rk_swcac_alloc() failure %s%d-E: %s[%d]rk_swcac_dump_init() failure %s%d-I: --e-- rk_swcac_init() %s%d-I: --s-- rk_swcac_loglevl_set() %s%d-I: --e-- rk_swcac_loglevl_set() %s%d-I: --s-- rk_swcac_proc(wxh=%dx%d) #%d ---- %s.%s %s-D: dotTime = %f %s-D: nSwcacEnable = %d %s-D: nAutoHighLightDetect = %d %s-D: nAutoHighLightOffset = %d %s-D: nFixHighLightBase = %d %s-D: fYCompensate = %f %s-D: fAutoStrengthU = %f %s-D: fAutoStrengthV = %f %s-D: fGrayStrengthU = %f %s-D: fGrayStrengthV = %f /data/swcac.para.txt%s%d-E: %s[%d]--e-- rk_swcac_send()return failure ! %s%d-I: --e-- rk_swcac_proc() #%d ---- wxh=%dx%d: %dms %s-D: --s-- SWCAC_Init() %s-D: --e-- SWCAC_Init() %s-D: --s-- SWCAC_Process() RK_SWCAC_Processor%s%d-I: ---- %s: %10dus = %7dms %s-I: ---- %s: %10dus = %7dms %s %2dRkWtlogger_Processor%s-D: --e-- SWCAC_Process() invalid input: allocator %p info %p id %d mpp_allocatormpp_allocator_getmpp_allocator_putmpp_allocator_api_wrapperinvalid input: allocator %p api %p type %d mpp_allocator_get failed to malloc allocator context mpp_allocator_get type %d failed invalid input: allocator %p dumping buf %p size %d start mpp_mem%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x end with size %d dumping buf %p size %d end found memory %p size %d caller %s overwrite from %d to %d i < nodes_maxfrees_cnt <= frees_maxmpp_mem enter status dumping from %s: mpp_mem node count %d: mpp_memory index %d caller %-32s size %-8u ptr %p mpp_mem free count %d: mpp_freed index %d caller %-32s size %-8u ptr %p mpp_mem enter log dumping: idx %-8d op: %-7s from %-32s ptr %10p %10p size %7d %7d %-7s ptr %010p %010p size %8u %8u at %s %s checking ptr %p head room found error! %s checking ptr %p tail room found error! mem cnt: %5d total %8d inc size %8d at %s ****************************************************** * Reach max limit of mpp_mem counter %5d * * Increase limit by setup env mpp_mem_node_max or * * recompile mpp with larger macro MEM_NODE_MAX value * mem cnt: %5d total %8d dec size %8d at %s %s fail to find node with ptr %p found mpp_mem assert failed, start dumping: nodes_cnt <= nodes_max%s can NOT found node with ptr %p mpp_mem_debugmpp_mem_node_maxmpp_mem_debug enabled %x max node %d nodesAssertion %s failed at %s:%d freeslogsnodes_cnt == 0found idx %8d mem %10p size %d leaked freefrees_cnt == 0delayedchk_poisondelay_del_nodedel_nodeMppMemService~MppMemServicemallocwarning: realloc %p to zero size mpp_realloc ptr %p to size %d failed reallocmpp_log%s log message is long os_allocator_get Linux MPP_BUFFER_TYPE_V4L2 do not implement yet %s: %sallocator_std_openallocator_std_allocallocator_std_importallocator_std_releaseallocator_std_mmapallocator_std_closefound NULL context input do not accept NULL input failed to allocate context info->ptrinfo->sizeion_allocion_freefind_dir_in_pathallocator_ion_openallocator_ion_allocallocator_ion_importallocator_ion_mmapallocator_ion_freeallocator_ion_closeenter: ctx %p size %d enter: fd %d len %d align %d heap_mask %x flags %xion_ioctl %x failed with code %d: %s ion_alloc failed ret %d map ioctl returned negative fd ion_map_fd failed ret %d leave: ret %d handle %d fd %d os_allocator_close Android do not accept NULL input mpp_ionenter: ctx leave: ret %d enter: ctx %p fd %d ptr %p size %d enter: fd %d leave enter: ctx %p dev %d fd %d size %d fd %d import failed for %s leave: ret %d handle %d enter: ctx %p fd %d size %d mmap failed: %s leave: ret %d ptr %p ION_HEAP_TYPE_DMAION_HEAP_TYPE_SYSTEMION_HEAP_TYPE_CARVEOUTos_allocator_open Android do not accept NULL input /dev/ionopen %s failed! open ion dev fd %d os_allocator_open Android failed to allocate context invalid detect result %d using ion heap %s system-heapvmallocion_debug/proc/device-treeiommu_enabled%s iommu_enabled %d /sys/kernel/debug/ion/heaps%s found can not find any hint from all possible devices scan %s for %s return %d n == 1/%svpu_servicehevc_servicerkvdecrkvencvpu_combodrm_ioctldrm_handle_to_fddrm_fd_to_handledrm_allocos_allocator_drm_openos_allocator_drm_allocos_allocator_drm_importos_allocator_drm_freeos_allocator_drm_closeos_allocator_alloc does not accept NULL input alignment %d size %dlen %ld aligned %ld fd %d aligned %d size %lld get handle %d size %dos_allocator_drm_alloc drm_alloc failed ret %d handle %dos_allocator_drm_alloc handle_to_fd failed ret %d os_allocator_close doesn't accept NULL input close fd %dinvalid ctxget handle %dget fd %dos_allocator_close do not accept NULL input drm_ioctl %x with code %d: %smap_dumb failed: %s entermpp_drmos_allocator_open does not accept NULL input drm_debug/dev/dri/card0open drm dev fd %d os_allocator_open failed to allocate context leaveNOT found ion allocator mpp_rtfound ion allocator NOT found drm allocator found drm allocator /proc/device-tree/allocatorfound ion allocator in dts found drm allocator in dts Can NOT found allocator in dts, enable both ion and drm @10108000@20020000@30000000@ff9a0000@ff350000@ff650000vpu-servicevpuN10__cxxabiv117__class_type_infoESt9type_infoN10__cxxabiv120__si_class_type_infoESt9bad_allocstd::bad_allocSt9exceptionSt13bad_exceptionN10__cxxabiv115__forced_unwindEN10__cxxabiv119__foreign_exceptionEstd::bad_exceptionstd::exceptionbasic_string::at: __n (which is %zu) >= this->size() (which is %zu)basic_string::copybasic_string::substrbasic_string::compare%s: __pos (which is %zu) > this->size() (which is %zu)basic_string::_M_replacebasic_string::_M_replace_auxbasic_string::erasebasic_string::assignbasic_string::insertbasic_string::replacebasic_string::_M_createbasic_string::basic_stringstring::string0123456789not enough space for format expansion (Please submit full bug report at https://gcc.gnu.org/bugs/): NSt3_V214error_categoryESt12system_errorsystemgeneric*N12_GLOBAL__N_121system_error_categoryE*N12_GLOBAL__N_122generic_error_categoryEN9__gnu_cxx24__concurrence_lock_errorEN9__gnu_cxx26__concurrence_unlock_errorE__gnu_cxx::__concurrence_lock_error__gnu_cxx::__concurrence_unlock_errorN9__gnu_cxx20recursive_init_errorESt8bad_caststd::bad_castSt10bad_typeidstd::bad_typeiddeleted virtual method called pure virtual method called terminate called recursively terminate called after throwing an instance of '' terminate called without an active exception what(): St11logic_errorSt12domain_errorSt16invalid_argumentSt12length_errorSt12out_of_rangeSt13runtime_errorSt11range_errorSt14overflow_errorSt15underflow_error?basic_string::_S_construct null not validbasic_string::_S_createbasic_string::resizemt19937/dev/urandomdefault/dev/randomrandom_device::random_device(const std::string&) 8<HT`'p2: v\B(eXcMMg`-##jP6T :T :Tn 'Yt(anonymous namespace)sPcldtptqustring literalstdautodecltype(auto)li[abi:::{default arg#}::JArray[]auto:vtable for VTT for construction vtable for -in-typeinfo for typeinfo name for typeinfo fn for non-virtual thunk to virtual thunk to covariant return thunk to java Class for guard variable for TLS init function for TLS wrapper function for reference temporary #hidden alias for transaction clone for non-transaction clone for _Sat _Accum_Fract, operatoroperator adsZgs>(ix : new ulllullfalsetruejava resource decltype (...this{parm#global constructors keyed to global destructors keyed to {lambda()#{unnamed type# [clone restrict volatile const transaction_safe noexcept throw&&complex imaginary ::* __vector((......)_GLOBAL_std::allocatorstd::basic_stringbasic_stringstd::stringstd::basic_string, std::allocator >std::istreamstd::basic_istream >basic_istreamstd::ostreamstd::basic_ostream >basic_ostreamstd::iostreamstd::basic_iostream >basic_iostreamaN&=aS=aa&anatalignof azccconst_cast()cm,co~dV/=dadelete[] dcdynamic_castde*dldelete ds.*dv/eO^=eo^eq==fLfRflfr>=gtlS<<=le<=operator"" ls<<lt<mI-=mL*=mi-mlmm--nanew[]ne!=nt!nwnewoR|=oo|||pL+=pl+pm->*++ps->?rM%=rS>>=rcreinterpret_castrm%rs>>sizeof...scstatic_castsizeof sztrthrowtwthrow signed charboolbooleancharbytedoublelong doublefloat__float128unsigned charintunsigned intunsignedlongunsigned long__int128unsigned __int128shortunsigned shortvoidwchar_tlong longunsigned long longdecimal32decimal64decimal128halfchar16_tchar32_tdecltype(nullptr);llЀX$@*X4P|5(>@xPAFRВp |X`hp(PؕtpL(xhp0DpP,ء`x Ф !8t>0u?uL?(w?8z?z@`|p@hAA A(AAH4BPHBX\BBBxB( CЈTCxCCHCxHDpDD EHTExEEE@`FFGHG8GpHHxH@I(TI0II(JxXJhJpJKPK KH K0XLL(0MX |M#Mp$M%N%HN8&xN&N(O)0OP*lO+O.Oh0AD A B D Bq A DLA0A AF A AJ C A CEC\,(dA@B AS A Е( ĕhA@B AT A (< @A0A ABJ (x A A AZ  ` T H < 0 $4AB I  8,0 TPH<7Ap A A B dM DA EG C A C mCB AAA @ 48A@A ABBe A V A L (AA A B D g\ A A PHGB<, pA0A AB\ A J A l Л( ěA@C Ab A  H <  8 ,  $ 8 L ` t ؛ ̛, 8A A AG A B 0 ț<ׂA A AH A B @ ԛX ̛p ě, ̛(kA A Ar A 8 ĝ,?A A Ap A f A  0 A B BK A LIF H 0Ap A C C AAAAAAAA  $sA B ABCVcBAN A  CPA\E AA BAJAIFFI AA CAp, ,KA0A ADV A BPC A 0O A CLPL A G A H A `lVAB U A  0BE B ȩ  4Ht\hp\P$XTA B CL A $TA B CL A ,n0D<ZA A AH A B 48A@C ABFAU AC A 8l~AP D ABFz A 4AP A ABB\ A (X, A0D Ad A XP\Lf~AB ACO f A E A TASBlPD8 ,0BE B 8 8x}A0A ADOD A B dHt}BP A BP A D A P ADBABB| ADAB A ;}A43A D+*/C1Z2B0B-.A, AAAC A EE20.-,)dH)JJ)[F)P A KB)s B Z B c B A)CF)jE)MC)BA2E0A-.A,HA0A-.A,A)U A WG)GCAA8PT@A AECBl AA A L |Ap A C C AAAAAAAA D|A0A AC A Y A H$pAp A C C AAAAAAAA ,pA0A ADYB D44A@A BJ A ABCh AAB A `($ {AA A C CJ PPZ A JMHCAK{AA ABFFBBB bAAAP A   AAAA MJ lAAAA |4XzAA A CH P B AL DAA A `E A AbA A AQC H$zA A ACJB A dA` A A DCB^R A V A R (AP A AFBAe BCAB A p DA HBBBA A P CBQAD A P BEB AA A BBB A CAT,'wyA CA AJBx A ,DMAB L A A J tH<0$4 A0A ABR A G 4MAP A ACC\ A ,HA A AN A [ x` A0A A< A I A AYD A 0D A AL% DH%xA0A AG A CASAB A 0KUA^AB A 0AAL\EBB B 0AA$L'8A B AI 8\'A0B ACK A X 8'A@B ACBO A 8@D(A@B ACBO A 8|(A@B ACBO A 0,)A B AH A U 0)A B AH A U < )AP B ACDBO A 0`d*A B AH A U 8*A@B ACBO A 84+A@B ACBO A 8 +A@B ACBO A <H,AP B ACDBO A 0,A B AH A U 0,A B AH A U <T-AP B ACDBO A 80-A0B ACK A X 0lH.A B AH A U 4.A@B ACDK A 8/A@B ACBO A < /AP B ACDBO A <T 0AP B ACDBO A 0 0A B AH A U 0 0A B AH A U @ @1Ap B A C DDS A D@!1Ap B A C DDU A @!2Ap B A C DDS A 4! 3A0B ADH A W 0"3A B AH A U <8"3A` B A CDBQ A 4x"|4A@B ACDK A p 4cqBp A ABC D TC UAK A p  OG AEA ADd!EXqA B AGj_ B A CmAA,l#6DA A AJ A B @! 6pB0A AH A AK C A < "l6dpAP A ACCr A H $7 Ap A C C AAAAAAAA ,l$X:A0A ACXB d$:A` A A DCB^R A V A R D#;TooAA A BDO A AA^AAAK A  pA A AAX#E oA DA BBH[ D A \EE A HD% P$%H>\A@A AR A $&>8&t><$h>nA C AH A AM B C A8&>A A AH A AP C A A& ?&?00%><FnA A AH A B 4$'?E@D K  \'AQA  0'DD B AI A AKE 0'ED B AI A AIE 0'tED B AI A AIE @\&EmA0A AL A AP C A A(`(DF, A0D Ad A L&HS,lAB A BFDB] A H'([lAA AFFY A `h'\lAA A BB IBC EgAAAK A AAAA )^D) _$A` A D BBBBAAAAA  )bA@AA k LL(c kAAA ACJW A ,\*8nA"!A A BQ A d(ockABBAA B>=B@?N87<:~;H9| AD A )j;9@B;A9,4)؅H{lA A AI A ,$+J AB R A A J @)$+lA0A AC A  C @)0kA0A AC A  A l*XkB0C BEA B 0A A 0B A 0L,x|A&%A A$#B"!XC ʙHAAJ A $#"!&% A F 4IBnE[A AAAH AA -@@-0A AA ABD| A @`-AAA ABIN A @-(AAA ABIV A 0-̭A@C ABQ A P.APAA @ACCS A V A t A Hp.AA A pAB E  A ,.A0A AB_ A D.Ap A A B DCk A `gzB@4/A0A AEU A IT C A A(x/A A AW A </A@AA 0ABj A r A L/A@A ACJ A ME AC A AA0400lA0A ABC A h0lACPOA AFEKNHGBLMCJKAHIZBAAI A NMLKJIHGFEPOCLMAJKAHIAG0ACjiA AfeDhgPbclJ A hgfecbjiAdjABdZAcbCdBaWBVdK AA FAcdAabBAAdA@1LA@A AEL A } H10AAA ACI A 82|A@A AE A ,L2A0C ABQ A ,|2A0C ABQ A ,2A0C ABQ A ,2PA0C ABQ A , 3A0C ABQ A T<3 A` C A BCI B^CC KAL A L HAB A,3x|A A BNB A 83LAP D ADBg A L4A@A ABCY A S A ABaAL<2,;cAP A ABDj A <4A`E A PABBJYE X4$AP A ABCd A V C ARANCl3xLobAAA A BHB A ` BwAI BzAJAAK A  dO AA OAA A A AX54C` A AD CGw B `  P468AP A ABBHei B A g_nqoUL48aAAA A B C FBX A H5\`AA A pA B DGC A $$7?<A A AG L7@d7ABNMA CJINLKHGCFEO A @7\ABNMA CJINLKHGCFEO A 7`8|A21B A.-B0/K)h A R'(J+,B*C AAA EA+,A*A'(46Y_A0A AM A CL A 808 A A AQ A P A 48xAA T A C A D A 9 AA C  @9AA C (d9A@B B\ A 9490$94(A A AE 894A@B ABU A X (:lA0A ADS 8H:E0A ABN A K 0:pA@A ABe A :DOA $: A0A A\ A 8: A@B ACX A D 8; `VA 0T;@!A0A ABl A 9"C\A B ABS A ACBJRBAAAH\ AAAA JCAAA AAAA ^ DAAA JAAAA,:P'[AB B F |<((<(<($<((A A AE  <(LIB D D;0(ZAA $=((8=4(L=0(AA h=$(AA =(=$(= (AA =( =((AG A  >((AG A ,>($@> ((A A AE 0h> (A@B AJ A P >X(LA` A A BDFBIAM A `  LDB A `  FIBE 8@?)hA0A ABI A J $|?0)hA B AF A ?p)DA A A?)8?)dA B IFA A  A A B$@)XA A AR  @@)`A0A ACd@ *pA A A@p* @l*$@p*(A A AE @p*@d*@h* Ad* $$A`*(A A AE $LA`*(A A AE tA`*$AT*(A A AE AT*$AH*(A A AE AH*B<*B0*(B$*PA B AN A F A $XM>8A B AI 0M>`A A AM A F K>JDM>8A@C ACAi AB A F AB A N?(N?8A@A ABCZ A 4|X Ou>A0A ABV A 0tZxOA@A ACY A ZP0ZPA@A ACY A ZP4[PA@C ABFAT AC A <[HQ0YTQ|n=A0D ABN A [Q4[QA@C ABFAT AC A [LRLLD [R\PD \R\PD $\S$8\ SHA B AM `\,St\0S$\,SA A AU A \S\S$\SA0B AO A D[T;(\[T,;A B AF [T;([T,z;A B AF ,[TtR;A0B AR A $]`T0A A AH $]hT0A A AH $ ^pT0A A AH $4^xT0A A AH ,\Tt:A0B AR A $^T0A A AH $^T0A A AH $^T0A A AH _T_T,_T$@_THA0A AM A ]T9(]T$z9A A AE $_TA0B BP A _XU((^dU$9A A AE ,T^`U48A@A B\ A 4^hV8A0A ABZ A |`V`V `V$AA E `V`V40_VK8AP A AC] A 8h_ W%8A` A A DF\ A daWAA B $aW$A A AE  aWAA B 4`xW7AP A AC] A 8L`We7A` A A DF\ A HblXAA B $lb`X$A A AE 4``X6AP A AC] A 8 aX6A` A A DF\ A cTYAA B $,cHY$A A AE 4aHYS6AP A AC] A 8aY-6A` A A DF\ A cLCLCNELENEOFMHHIIJJKKKNO%d<-"ddX Dt X-#H\    Y         H+,,,+$,+*,)),**,0+ , , 0, , , 0, *,+,),-,-,),),)T),,-L-,+&T) + @+!$$)%+%-%(%)&(()****+++,,,,  4D  t | X   DHpx ,HD,HD,HD,HD,HD,HD,HD,HD,HD 4@ @X 4(p 8D\x8`p8`p0D!0@d<L@P(<L@P(<L@P(<L@P(<L@P(<L@P(<L@P(<L@P(<L@P(8DP\ 5%lT0$} 0D 0D 0D 0D  , \  T  4@pL0pؗ0hH (   0  h( Xxp h8 `x P TTTTTh ؏x  xhXhxta b s F i@ P1 o 1 d 28      ( ( 88@ P``h h xx  `hh       ((88HHHPX`hPpxp p   (08@HxxPX`hpxhhhh  (08@(HPX`hp8xp (08PX`hhp p  ` p  (x8(h  X 0HH[S t  ` o(x(  Yoo `? ooo6oy X HX pZcd@c` X tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttP YUV444YUV420PNV12NV21RKDGANvRKMHDRvRKAECFvRKNISTvRKEHCRvRKLHDRvRKSPNSvCamerIDImgFrmtFileNumInitFrmBestFrm ImgWid ImgHgt ImgSrdReBrt#0ReBrt#1ReBrt#2ReBrt#3ReBrt#4ReBrt#5HmValidSendFrmEnDgainEnFrsltEnHstprEnDnsclEnSltbsEnRgstrEnTprmgEnMmrtsEnWtlgrNumFusnScnTypeCapMode IsoVal202202181417RKCAC0.3.1.10590h+,,8**TT(T S(RpQHSdUhY^\^W8fi8omjmg ` GCC: (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 7.5.0.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.gcc_except_table.tbss.init_array.fini_array.data.rel.ro.dynamic.got.got.plt.data.bss.comment $o((( ((\0xx8o66EoT`?^BYYhttcttpn00|Qtz-``l!!ȰȰ    `   0P P ` P PoX X ('X0X 0Y