All Downloads are FREE. Search and download functionalities are using the official Maven repository.

macos-arm64.libggml.dylib Maven / Gradle / Ivy

Go to download

A JNI wrapper for [whisper.cpp](https://github.com/ggerganov/whisper.cpp), allows to transcribe speech to text in Java

The newest version!
??????h__TEXT?
?

__text__TEXTb??b?__stubs__TEXT)	?)	?__stub_helper__TEXT?.	??.	?__objc_stubs__TEXT?4	 ?4	?__const__TEXT?:	-??:	__cstring__TEXT?
Tj?
__gcc_except_tab__TEXTTq
?Tq
__objc_classname__TEXT?E??F	?G
?J?k????T? TI?*??%@|@?@E?)???T?_?_?T_??bT??H?{?	?*???? ~?!h!h! n!	?Bh!!h!An"
@?ch!Bh!bn#A??h!ch!?n@??B
??)?k????T? TI?*??E@??#@%|)???T?_?_?KT_???T???T(??iT??I?*??%@xk=SKE?)???T?_?H?{?	??*??? ?"
¬8a.8an%8a.!8anF8a.B8ang8a.c8anD>?E??F	?G
?J?k????T? ??T???_?T_ ??T??)T(???T??I?*?R
?r???R?(??E@??y?}S?AS???}S?2?
k?1?
%x)???T?_?(?R?r
NH?}?!O??O??????C???0o?!N???Ntog0o?!Np??Nto4?n4?nƄ?N??N0o?0oOO?engncDNc?<)!?A??T????T???_?T_ ??T??)T(???T??I?*?R
?r???R?(??E@??y?}S?AS???}S?2?
k?1?
%x)???T?_?(?R?r
NH?}?!O??O??????C???0o?!N???Ntog0o?!Np??Nto4?n4?nƄ?N??N0o?0oOO?engncDNc?<)!?A??T????T???$@?*,@?
?)?	?????_??_?????{??C?????R?0?}?R?+@?k???????K???kc??J}K?K?R?j?J? )??{A?????_?????{??C?????R?0?H?R??r?+@?????kj??t????J}K?K?G?j?J? )??{A?????_֌0}?R?_֪0????{??C??qBT	?)??
?R	$?? B?? ?=?=*9@?
9? @?? A???{A?????_???] ?????????B ?a??R!???(?J?(4?9@?@???? ?!?R"?R?0?_?(?J?q????_?????{?????=@?	@???????????o???????|?`T????R8.????c????-?`5?@???!?0?@?R>?????	?R?~@?I]	?j@?kB@9 !??A?0????T??????T???`T???? T????T????T???`T???? T?
???T????T?
??`T???? T????T????T???`T???? T????T????T???`T???? T????T????T???`T?? ?? T?"???T??#??T?%??`T??&??!T??R~??|(?RzH?Rxh?Rv??Rt??Rr??Rp??Rn?Rl(?RjH?Rhh?Rf??Rd??Rb??R`??R^?R\(?RZH?RXh?RV??RT??RR??RP??RN?RL(?RJH?RHh?RF??RD??RB??R@??R>?R<(?R:H?R8h?R6??R4??R2??R0??R.?R,(?R*H?R(h?R&??R$??R"??R ??R?R(?RH?Rh?R??R??R??R??R?R(?R
H?Rh?R??R??R??R	?R})???)???i(8hB@9h4`@??+?????{B??OA??Wè?_?@???	!@?	??_????_???	@???@? ?=)@?		??=?_??? ?=)@?		??=?_?D@9?_?D9?_?@??_?@??_?@???@??@??4?	@????????_???H?i?R	?r
?R?k???@???@?.%͚7?-
??@??	@??@??}??	͚?-
??
@??	@??я@??5???A??ѐ?C??5????5??@??я%@??5?
?????_????@????4?	@??????_?@???	@?
@??4	@????????_?@? ??_?(_???	@?
@??4	@????????_?@? ??_??????C??{?????q?THQqbT???x@????|@?%???j@????	?R+ ??i
@?,}
?j@??	ʚ?*_q?Tm ?nѯ?@??}?????T??????@?n?R?r?%͚?7?R?!?@??@??@??}
??	Ț$?D@9?4?????R?!?
@??@??ю@??!???A??я?C??!??Ѩ!??@??ю$@??!???T?҈?@?
?????@???
9@??
?
?Ҏ}???|????@?.???(T@??
??A?Ё?}?@?aT`?A??????@??
?
???p???@????????????1"?A??T????T???
@?M??B????	T????)?7?????!?6?@?R????????{D??C??_??҂???ү??~????4?????????B ?!??R???????4?????????B ?A??R????????E?????!?@?R??????8?????????B ????R????????????????B ?!??R??????A5?????????B ????R????????{??C????#?"?R?????????{A?????_?????{?????5@?@???????#?B?R??????????_?	?)5@?)@???T?{B?????_??)?????{?????5@?@??????????b?R??????????_?	?)5@?)@???T?{B?????_ַ)????{?????5@?@?????????#???R???Ҳ?????_?	?)5@?)@???T?{C????_֟)?????O??{????????D@9H9D9??<?=@?(??(?R???#?A?R"?R???Ғ????J@9?F9??=??????w????O??{????????5@?@???!@?????	?R* 	?I
@?h
@?J@?
?Tk@?	?T

ʚJ}	?i@???Tk@?
?T*}
?k@??Tl"@??
??Tj}
?l@???Tm&@??
??T(}?}?}?i|?	?AT???#?B?R????H???h"?????!?1?????(?RP?P??@???)5@?)@????T?{C??OB????_ֈ??0?????????B ???R??????I2?????????B ???R??????C??O??{???????5@?@????!@?????	?R* 	?I
@?h
@?J@?
?Tk@?	??T

ʚJ}	?i@???Tk@?
??T*}
?k@??Tl"@??
?Tj}
?l@???Tm&@??
?!T(}?}?}?i|?)}?	?aT?????C?b?R????????h"?????!?1?t???(?RP?P???^???)5@?)@????T?{D??OC??C??_ֈ??0?????????B ?!?R???????2?????????B ?A?R???????C??O??{???????5@?@????!@?????	?R* 	?I
@?h
@?J@?
?Tk@?	?T

ʚJ}	?i@???Tk@?
?T*}
?k@??Tl"@??
?!Tj}
?l@???Tm&@??
?AT(}?}?}?i|?)}?)}?	?aT?????#???R???҉???h"?????!?1????(?RP?P???^???)5@?)@????T?{D??OC??C??_ֈ??0?????????B ???R+?????A3?????????B ???R"???[????O??{??????????!@??C?"?R??X???h"?????!)?????@??@?@?H?RP?P??{C??OB????_֨??;?????????B ?a?R????????W??O??{??C?????????5@?@???????!@??c?B?R??-????"?????!)????????@?@?H?RP?P?h~???$??@???)5@?)@????T?{E??OD??WC?????_֨??;?????????B ?a?R?????????W??O??{??C???????????5@?@?????????!@??C?b?R?????????"?????!)???????@?@?H?RP?P???h~?$??@???)5@?)@????T?{E??OD??WC?????_֨??;?????????B ?a?R??????????W??O??{???????????@???)5@?)@??????????!@??c???R?????????"?????!)?F??????@??@?	@?I?R	P?P???$???]???)5@?)@????T?{F??OE??WD?????_֨??;?????????B ?a?RV????????_??W??O??{??????5@?@???_q?T??qBT???q
T???q?
T??_k?T?k`T?k@T?k T?kT?k?T??!@??B???R????o????"?????!)??????@???@???"@? ??&@?$?????!|7??????~~????.A?*i(??~~?+i*??~~??6B?,i+?l~~?-i,??c??:C?-i(?.i*??*D?(i+?*i,???Bm? !? ????Am? !? ??h?RP?P??W)?O)???<@??????????B ?A?R????! ?
T??Rh4????????"?????!)??????@???@???"@? ??&@?$??#-?????????#-?	??@?@?H?RP?L
??@???)5@?)@????T?{D??OC??#Bm?C??_ֈ??0?????????B ?a?R????????=?????????B ???R????h"@??Th@?? T?}?i&@???T??)??????????B ???Rw???h&@????T??>?????????B ??Rk?????Y>?????????B ?!?Rb??????;?????????B ?a?RY???????????????B ???RP???.?/??#?R(???R&???O???{??C?????!@??B???R???ҁ???h?RP?L
??{A??O¨?_?????O??{????????!@??B???R????o????"?????!)??????@???@???"@? ??&@?$?h?RP?L
??{B??OA?????_??????R?èr'.?/.?/?/???R?R????3m?+m?#m?_??W??O	??{
??????5@?@????7??H@??AT?@???
T?@??
T?@?iqaT??(@??
@?	??T?????????@ ?@ j@ K@ ,@ 
@ #?h@??
5h
@?q	??)}?)?T??aA???RG4????????"?????!)??????@???@???"@? ??&@?$??????????)??)???3-?+-?#-???????????????'?R8??????3m?+m?#m?_??W??O	??{
??????5@?@???H@??T??H@??T?@??!T?@?iq?T??(@??
@?	?aT?????????@ ?@ j@ K@ ,@ 
@ ??aA???R????U?????)??)???3-?+-?#-??????????????B ??X?R???9????_??W??O??{????????????????5@?@???(@??""? a"?"8!".(!8??? ???????????B ?!n?R?????C??W??O??{???????????5@?@???H)@?}@????#??RB?R???Ү????
)(?RP?P??@???)5@?)@????T?{D??OC??WB??C??_֕	??O???{??C?????#@?A?R??R???ғ???H?RL
)P??{A??O¨?_????W??O??{??????5@?@??????hA?V|@??T????A?R??R????x?????(??@?(?P???<@????????????B ??u?R???????;?????????B ?a?R????/	??C??+m?#m?W??O??{?????5@?@???H@?)@?	?!T????)@?J@?+
ʚj?
?J??@??@?L
˚????
?H@ )@ 
@ ????d?k@??????
?Rm1
??
@?l
@??@??
?Tn@???T?
͚?}?l@???Tm@???
T?}?m@???!	Tm@???!T?@?m}???{??
?T???????????B ??y?R????(! ?T?@??????c??R??R?????????-?????@?@??@?\???RP??	??
?\??@???)5@?)@???AT?{H??OG??WF??#Em?+Dm?C??_ֈ??>?????????B ??x?R}??????;?????????B ?a?Rt?????h"@??Th@??T?}?i&@????T?????????????B ?!y?R`???h&@??AT?????????????B ?Ay?RT?????)??????????B ?y?RK???????????????B ?!z?RB???????{??C?P@??q?T`??{A?????_ֈ???????????B ?A}?R/????{??????????B0?A?R'????C??O??{?????5@?@????(@??AT??H@??Th@??AT??h@?)@????Ti
@??
@?I	??	?mT?@?)??'????C??Rb?R????D?????RP?L
???^???)5@?)@???!T?{D??OC??C??_ֈ?!?????????B ???R????????????????B ?ሃR??????i?????????B ?!??R????????????????B ?A??R????	??C??_??W??O??{???????????????(@???k??	?R
-	?I
@?(@?J@?
?T@??	?aT

ʚL}	?	@???T
@?_?aT,}?
@?_?T
#@???TL}?@??T
'@???T?@?
?R?-
??
@??
@??@???T?@???aT?
Κ?}??@???T?@???aT?}??@???T?"@???T?}??@???T?&@???T?@??R".?A@??
@?B@???T?@??aT"šB|??@???T?@??aT"|??@??T?"@???Tb|??@???T?&@???Tb@??RF,??@?b
@??@?_?Tg@???TFƚ?|?d@???Tg@???T?|?g@????Tg@????T?@???T??T?@??@??R?,??@??!T?@??@??R?,?k
@??aT??AT??T???T??T?
@??
@??!T?@??@??T?@??@???!T?@????T_?T?	?aT_?AT?	?!T?T??T?
??T?}	?k}
?}	?}
?h!????#??R"?R????C?????RP?\
?L?P??{D??OC??WB??_A??C??_ֈ???????????B ?!??R????????????????B ?ጃR??????9?????????B ???R????????????????B ?!??R????h"@??Th@?? T?|?i&@???T????????????B ?A??R????h&@????T??E?????????B ?a??R????????????????B ????R????????????????B ????R????????????????B ????R????????????????B ?ፃR???????????????B ???R????????`?????b?B ?!??R|?????=	?`?????b?B ?A??Rs??????	?`?????b?B ?a??Rj??????	?`?????b?B ????Ra?????-
?`?????b?B ????RX?????}
?`?????b?B ????RO??????
?`?????b?B ?ᏃRF???????W??O??{??????5@?@????(@???T??(@??5??H|@?j&A?+
Ț?	?k1??l
Ț???l@??
Ț?˭9?

??
Ț͵?i	?5
Ț????6
Ț?~)}@????c??R??R????\?????)??????@?@??@?\??RP?P???]???)5@?)@???!T?{F??OE??WD?????_?h??;?`?????b?B ????R??????-?`?????b?B ?ᒃR???????;?`?????b?B ?a?R????"??C??O??{?????5@?@????(@??5????(@?I|@???h|@?)?R???#??Rb?R?????????(?RP
)P???^???)5@?)@????T?{D??OC??C??_ֈ?-?`?????b?B ????R???????;?`?????b?B ?a?R???????C??O??{?????5@?@????_k?T??HxSQ)@???(?ATh
@?I|@???(?R???#?!?Rb?R????????H?RP?P???^???)5@?)@????T?{D??OC??C??_ֈ???`?????b?B ?A??R~???????`?????b?B ?a??Ru??????R???W??O??{????H@?i@?	?T????I@?j@??
?AT?@?k@?_??T?@?l@??AT????!@??R????.<??
@???lA??@???T?@?
?aT?
Κ?}
??@???T?@???aT?}??@???T?"@???T?}??@???T?&@???
T?@??R>?Q@?B@??T?@???
T
šQ|???T?@?_?T1}?_?T?"@?_??TQ}??T?&@?_?!Tq@??R">?O@?B@??Td@???T
šO|???Tb@?_?!
T/}?_?Tb"@?_?a	TO}??Tb&@?_?T?	5?
5?T}??ATH}	?
?
T??RV4????/????"???a?!)??????@???@???"@? ??&@?$????????h?RX
)P
?X??{C??OB??WA????_ֈ???`?????b?B ????R????h??0?`?????b?B ?ᛃR??????1?`?????b?B ???R????????`?????b?B ?!??R????????`?????b?B ?A??R??????Q?`?????b?B ?a??R????????`?????b?B ????R???????`?????b?B ????R????????`?????b?B ????R????$?R???C??o??g??_??W??O??{?????????????????5@?@???(@??????	?R
1	?I
@?(@?J@?
?T@?	?T

ʚM}	?@??T	@??
?Tm}
?	@???T
#@?_
?T-}
?
@?_?T'@??
??T?@??R?1??
@??
@??@???T?@??T?
Ϛ?}??@???T?@???T?}??@???T?"@??T?}??@??T?&@????T?@??R"2?A@??
@?B@???T?@??T"šD|??@???T?@?_?T$|??@?_?T?"@??TD|??@??T?&@????T?@??R?0??@??
@??@???T?@???T?ƚ?|??@???T?@???T?|??@???T?"@???T?|??@???T?&@????T?@??R?0??@??
@??@???T?@???T?ƚ?|??@???T?@???T?|??@???T?"@???T?|??@???T?&@?_??Ty@??R:3?Y@?l
@?Z@???T{@??T?
ښ\?y@???Tz@?_?T<?z@?_?T{"@??T\?{@??T~&@????
T?T??T??AT?	?T
??T??T??aT_	?!T
??T???T??T?	?AT?
?T+?k}?k}?)}?,}??}??!T(+???(?R
N?????????N@?????c???x???N?8O@??T??N@?A@?CC?????R???Ҳ?????U#???a?!)??)?}?+
?l
??
???}??
?_q?)J?????J
?@?~?i6?k"?`2?B?}??C??~???????{C??OB????_?h???@?????B?B ?!??RY??????h?E???a?!?@?Rn???  ??R?R???IK%)	?)|}?
,A?J	?i	?????
%??o?	@@?	A??_??O???{??C???!??h@????j????????????????{A??O¨?_?????g??_??W??O??{??C?@?????@?q
T??5?R?Rw?R?r?R??9????h????jTh
@?yt?@O@???HSB9?7-???HS@?Aqa??T2@???H@??	5H@??TH@??TH@??ATH@???T??@??&Ț	7e?@?	@?
@?I}	?(	Țe?
@?	@?)?
@?(!
?	?A?)??C?(!?I?(!?	@?)?
$@?#!
??3???t??HS@?Aq!??TUW?@[@?????@_@?????????{E??OD??WC??_B??gA?????_?H???@?????B?B ??O?R????H???@?????B?B ?AO?R????H??@?????B?B ?aO?R????H?u?@?????B?B ?AN?R?????)	?B?)}?)?C?!?~?????@??_?????{??C?@???7k?TH?A?@?????B?B ??S?R????+?T@?Ya??{A?????_?H???@?????B?B ?aS?R}???@??_?@??_?????{??C?	 @)}@??k
T	@?!y(???{A?????_?H???@?????B?B ??U?Rb??????W??O??{?????????@?A?1??h"?)?R	??h&???t???????*???
qkT????Ѡ@?????q?T?????!??T????????`?@???????{C??OB??WA??????{C??OB??WA????_?H?
 ?@?????B?B ?!??R(????O???{??C??????h&?	???7)?R	??`???????{A??O¨???O???{??C??????h&?	???6??`???????{A??O¨?????W??O??{?????q?T?o??
@?,?R_q T?ҍ?????????@?/|@????6??R??????R)?R???4????k????!?J??T?@??@????@????@?g??@?'??P@??Dq?#T??xgxs
???`?'?R???k)???P@??Q?Bqh??TU??ztx?
??֥P@??@??%ƚ?7????@??%Ӛ?7?P@?s@?zq@Tq??T?T@??????@??xq@T????|@??|???LJ??@?f@???|@???~??????f@??xq?T?q@T&??5?|@??|???|Ӷ???@????@??|@??P@??@??|???????J??@????P@??@??k???T?LA?g~??B??|??|????@??|??@??Ś????P@??@??%ƚ??6?T@??@??|@??|?\?@????@??|@??|?????J??@????P@??@??kT???@?7?P@??@??|@??|???F?P@?f@???T?T@??@???T?@???aTfVA?v@??PA?s@?34zqdAza
T?@?%
5?~??|??????b???J??LA??B??XA??@?g~??|??|??~??????V???PA??~??B??~??~?s?t@??|?s@??Ӛ?@?g???}????|`??|@??t???|???B???T@??????@??q`??T;???@??5?~??|?????~?5???\@??k??1'?F???P@???A??~??@?g~???'??>???T@??4qHT?!??j???T??6????*dSj?*???AA??o??
@?,?R_qJ??T)?R
??
??k)??	?
}??{C??OB??WA????_ց?R?o??
@?,?R_q???T???@???B?B<%????R???H?? ?@?????B?B ???Rڽ??H?=!?@?????B?B ?!??Rѽ??H??!?@?????B?B ?A??RȽ??@???B?B<%?a??R½??@???B?B<%?x?R??????s:@?`@?h?????a?!???????R@?`@?AqT??)?(yh???a?!(???a?!8???@???B?B<%?Ay?R????@???B?B<%??g?R????????@???y?o?????????	?
???
????_???? ?@?	? ?y?o?????????	?
???
????_??{????B?)B?	kaTB?)B?	k?TB?)B?	kaT0H9)0H9	k?T@?R???q???{???_??R?{???_????????o??g??_??W??O??{??????????????RG?????c?(?R????!5?@?vV?h????h????h????h????h"????6H9i&?(??h*????????h?ir?(????? @?`??*?	?6?{?(4????R"?????c?????? 5?@?????M???B?q?T1a?!?0?@?R"?????????A???B?q?TqbT	??
?R??	u~??Bӌ???yӭ??	?NO	??P
?)??9????9??Y?k"?J?y???!??T??@T
D?R*U
?Ja?S??I?)?J??	?a??Tu?????ҫ??`??ҙ???B?q?T?R9?RD?R;?R6??b?wW??"??2H9?4?R?o??
???
?	?????????	Q?
+_?qj??J}@??jj8?5q???T??@?R>??????????l??@4lh*8X????????c???5{?????+??T?"??2H9(4?o??
???
?	?????????@?R?	Q?q)??)}@??ji8
5q??T?R?"??2H9(??5??@?R??h&????6-(?Rh)8h&???7v"A??q(T??!9??
iv8)	
? ??R4?R4???c???4???5
?RH?R????R)???c???)???4????9@?@?D???????a?!h?????????{G??OF??WE??_D??gC??oB????_?h?I?@?????B?B ??щR)???H?
2?I?)?2?XqJ?Jq2???0q(????????I?)?3???0q?TXq?TH?q2?H??2?H?
2??c?	???!g?aI?)?3??#???A?! 3?`?R???@???B?B<%?A4?R?????_???W??O??{?????	?????5@?@????a?T@??q-T??H@?h?H@???V@????
???????*??????*??A??k?T?#?A?!8#?@?R???tA??????t?h?)?R?h&???(	6w"A??qT??19??
iw8)	
? ??R*?#?????? ?@???[y?o?????????????????	??
??????
??????????_?????A??k,??T???4?R?????????5
?RH?R?#???Rt??????t???4????9@?@?????????a?!h??????h&???`?C????\??`?@?.?t*A?v????????\???)5@?)@???AT???	??{C??OB??WA??_Ĩ?_?H?"?@?????B?B ??ԉRd???H?"?@?????B?B ??ԉR[??????H?q"?@?????B?B ??ԉRQ????;?m?3m?+m?#m?o??g??_??W??O??{	??C?? ш?5@?@???	A?*-G?B????(A????h@??????h@?????????H@?q+T??	???C?A??7????;??@?)??@?H????jT?@?)???H6?`H	@???yi??S@???
4?@???I?
??@?????
??@??k???
??@??s?)?
?QAqȆ
T??kq?	jy??)
??O?ǀ=??? ??C??????)T?S@??@?Hi5??E???
5??A?(}??@?}	?q˃
T???CE??W@?}@??@?ȃ@??@?!!???@??@?"!??@??@?#!????????B????A??T	T??E???E??J??[@??CE??CF?????T?S@?h@?H25?W@?s@??@??Tu@??@???Tj@??@?_?Th@??@?	?Ti@???0T?[@?????_@?????V}?w?C?y'@?}??E???E?
	JQI
???4}?	?k:???CE??{?ʃK-?g?=?g@??s?=?k@??k?=	"?!A Z??@ ?s?=!A V???k?=?s?=?g?=??B??kj?T?+?T.?8(A!?8 ?o@?h?@???@???B?J?@??B?k?@??84?85C??~@?M@?n?~?O?"??'?q?_?b1O??'??_?1O??'?*.?_?"1O??'?*?1Q??'??*?%"1Q??'??*?"1A??'??*n?~??N?N?NpN*?B??????
??~T?
֚ ??՚!~?|?o6??'~?cˣ2??~?'?D?%?f?????h?5	@????>T?@????T?kB???+X
T?Ӆ???B??S??
??B?(?A??sB?(?A?W
T
??1A???B??kB??|?ԃ@???B???~??SB?1?/	??Q?AB??}??C??C??ׅ??}????%@??sB???~???ӡ}	?&?|??3??N??Q??Q??Q??@???B?)}?i
	?????Q	??K??~?|?	|?????}????}??;?i???)???????}???J??{B??KB??	??cB??	???B?Z	???B?9	??[B??	??CB??B?1	???B??;B????????B??	?????B??	????kB?_	??L
T?????[????????????c??{??SB??sB???BT?3B?)
???B?.}
??B??B??B??B???B???B??SB?U??B??	??	?Z	?1	?	???B?B	???B??	???B??	????T??????????????{?????s?????)???B?
?@??T_렰L???`?K?JT???	??sB??j!?9??!?????T?/??
??T
?@??ix??sB???????sB??j!?j!??h!??i!?!??A??T????????T??!????T????B?	???B??	??	???B?s	??	??	???B?{	??
??T	??????B?1~
???B???B? { ?)??	? ??T_?`?L? ?K?jT?T?@??xi??z)??sB?? ??T?z)??sB????T?z)??sB????T 	??/????/?z)??sB????T?/
?T?@??xi??z)??sB?????T	??/?+??T?@?!? xi?????S@?h@???5?@??!?T?Ӆ?i?A?I}	?j@?)}
???M6
T?B?M??5
Tn@??@??ׅ?σ@?p?@????W@?`4?q?B??hT1?|??=????}
??!??c?
?	?
3
T??B??C?bT??`??=?????O??NO??N?O??N??????O??N?@???T????Tx$???????T??}???}?????
?s???????`??T????*??T????????`??T?x???xw?????xx? !??T?x'???????W@???	q?T?S@??@???B??sB?5?W@?? A??@???i?slv?}@???ˆ????I???`?@???T?@??T?[@??@??AT?@??T?
@???T?_@??	@??aT?
@??B?	?T?@???T?@?
?T?#@?	??T???'@????T?@??+??@????? @??O??$@??'??dB?נC??#??$@????	@??@????!@???????%@????@??C??@?????!@??K??%@????Ӆ???E??;??3??K?X 4??B?	A?*q?!T?@?i?R	?r)%ȚI7?_)*JQJ
?K}j
_	kL???+A?*
??kH?Az?B?(?A??B??
T?$A??}	??8B?)}
?)}??4A??}
???@???k}????????????+?@?b?????@@?????B???a??T?????+?@?c??????????@?????????a??TB???c?_?a??T???*?@?J????B??B????
????kB????????@?????????a??TB?c???_?a??T??J?1???L??Tr???S@??@???
5?	@??B?	???B??sB?a?
T?
@?	??
T?@??kB?	끰
T?@?
?!?
T?@??A?
T?W@?! 
?
T_?	T?kB??	T?Ӆ???B??[?	?
	T?ׅ?ϳC??'@??B?(}@????)b???????S???MT????C??[B??}?????}
?}?}
?3?|??%@?4?????????????;?????3B????A??+B??
??B?9
??B??#B??
??B??
?	?	T?ҩ}??B????	??K??3?H}???A?(??C????#????+??B?B??;B??cB????{B?9??SB???B?????B????kB?_???T?҉}??KB??	?	?????(~??CB?(??????????{??c??[B?(???B?	??"? i@b) ?!.  ??????!?R??$?R4??????9???????B?????B?????B??sB??B????Tȁ@??B??A???B???B??T
???/,	??/??!	?#¬%xaN?^!xa'^PxaN^BxaR^sxaNt^cxau^?xaN?^?xa?^(a(g(e(f(b(r(p(q(c(u(s(t(d(x(v(wJA???T???B???@T?B?)
?*
?

?AE@?!?"(a)???Ti@bɃ@??/??B??A?CT?B?
+??B?K/?J	?k?J?_?"T?Ҫ?l?~ӫ?+??iy?B8 bE?B"B?"!(b?J???T???N*???/??c?e¬cԢN?ԢN?ԢN?ԢNC??E??c?#n??$n??%n??&ngxaN?^cxaq^?xaNS^?xa?^?xaN?^?xa?^?xaN^?xa?^!(c!(q!(g!(p!(d!(t!(r!(s!(e!(w!(u!(v!(f!(z!(x!(y?A?a??T???? ??T????S@?h@???
5h	@??B?	???B??sB???
Th
@?	?!?
Th@??kB?	롂
Th@?
?A?
Th@??!?
T????W@?! ??
T_???T?kB???T?Ӆ???B???	???T?ׅ???B??C?%@?أC??{??'@????B?
?~?}@?	b????????#????
?T??	?|????B??~	????~
?
@?????z????CB????#B??3B????+B????;B????	???T?}?????B??C??}??B?A??;??3??+??T
????[}??????B??{B???T}???B??@?	???B?)
?A'???/?B???B?E@?!!!?"(a)?a??Ti
@bȃ@???S#??????)*?!.  ????????!?R??$?R??????B?????B?Z???B?_????T?B?J??B???B????kB?_??sB????T??????cB????B??SB????[B????kB?????B? ??T?}????[??S???B??{B??c??}?????B?i
@bH?@??B?	??S#???S??)*?!.  ????????!?R??$?R???????????B?Z???B?_??sB????Th?@??B?		???B?)
?A'?	??/?B???!	?#¬!?!nB?"nc?#n??$n%xaN?^!xa'^PxaN^BxaR^sxaNt^cxau^?xaN?^?xa?^(a(g(e(f(b(r(p(q(c(u(s(t(d(x(v(wJA?!??T?B????B???B????T??B?E@?!!!?"(a)?a??T????S@?h@???
5h@??B?	???B??sB??]
Th@?
?a]
Th@??kB?	??\
Th@??\
T?W@??	@??B????[
T?
@?_?[
T?@??kB???[
T?@??Z
T??h@???
T?+?T?kB????T?Ӆ???B????	?-?Th?C?m'@??B?!?C?/%@???C??'@??W@??B?I}@?????ׅ???A?~?I"?_q?{?????????????????????+?T??C}@?i?~Ӥ	???~?8|?		??{???)|???}?}???H?|??K?H
@?????+?h??S?
???????????w??[?????A?B??A??A?J??A??A?k
???A????A??
??A???A????A?9?_	???A???T??1~??????}??wA?(????A??c???????}??{A???	??????????????????????B?????A???A?J???A???A?s???A????A?????A???A????A?9??kB??????T?҉??A?	??C??A??!??;??A???	??#????}??A???	??3??????????????????????
???A?"@)) ?!.  ????????!?R??$?R??B????Z??B????B???B??	???	??[B???B??9??B?????B?????B??sB???
??Th?@??B?;?@??B????T?A?T
???/?/\?/?/ji?

??/?KB??/E?C	¬&???&n??'n?xaN?xa(f?^(f^(p?xa(f^(p(f&A¬f?&n?xaN(g?^(g?xa(g?^(gG?0n?xaN(f?^(f?xa(f?^(f??%n?xaN(f?^(f?xa!(f?^!(f??$n?xaN!(e?^!(e?xa!(e?^!(ec?#n?xaN!(d?^!(ddxa!(d?^!(dB?"ncxaN!(cc^!(cCxa!(cc^!(cBxaN!(bB^!(bkA?a??T?KB????B???@T?B?)
?K?~?
?j
????bE@?C"c?"!(cCE@?B#B?"(b)????T~?փ@???B??A???????cT?B??;B?))??CB?J?J?)?I	???"T
????B?)
?K?~?*??
??it?BE??)???T*@b?B????cB?	??B??"	?)	@b@!!????????!?R??$?R??B??????B?A?CT?B??3B?%?h???T?B?h??B?	??B??"	??#B?)??	?	?"T	???{B???B?	?*?~??
?j
?@ix?!iy?(! i9?)?J??!??T????B???i??SB? ?"
¬?@??$N!?%NB?&Nc?'N??
??JA???T?SB??{B??+B??????????

??SB?B
?D¬"
??$??kA?a??T?SB??+B?????????S@?@??B??롘
T?W@?h@???B????sB??
Th@??kB??롙
Th@???a?
T	@?@?o???
?R(>??
@???a?
Tk@?i@??R,=??
@?롚
T?@??a?
T?@??
?)?
T????#@???Ȝ
T???'@??h?
T
@?????@????w
@?k@??{??Ӆ???E????k}@???Q@?j=
????
-@????
1@????
5@????
9@????????k??T??
5??K?T??)@??@?IE???kB?_?k?Tj"@???j&@??3???A?y@???B??+?j
@?J}?k@?T	˚?~??kB???j}
??#???A?j}?_	????(?T?(??
??j??J%˚J7.j?~??	?
????m?T??????A?/!@?	@??A??~??{B??;?*}
?1}?:}?	?????????S??K?	???B?)??3B?J?k??
??T?[??c?????#B???(}??+B?(??C????
??B?)??B???B????B?J????kB???????B??sB???B???B??cB??SB??[B??KB? ??Th@??????Th@??Th@?	?+T?B??B?(}??CB?(?????;B???h?@???????B?!???R????B???B?????????+??T????B????B?????A????T?????B?????A????T?B??B?(}??CB?5??{B?}??B?8?h?@???????? ??????????T????S@?h@?h8
5h
@????B??Ti@???
T?~?i@???Tj@?_?
T,}?j@?_?Tk"@???
TL}?k@??Tm&@????
T?@?
?Rn?΁??9
??
@??@??B??
?T?@???a
T?B??
͚?}???T?@???a
T?}??kB????T?#@???
T?kB??}
??sB???T?'@???
T?B???sB?!}
T???|
T?kB?_?|
T?A|
T?Ӆ???E??kB?J}J}K	kQi
?})?		?
k)??	k?mT?W@?t@??@??B?V}~?U}@?8K?~??~????????!?R??$?R??R??9?Z?q??B??jTȃ@?i?@?	???T?!????????h?@?????S@?@?w
5@??B?	???B??sB???	T@??!?	T@??kB?	??	T@?
?A?	T?W@??@?	?Rw????
]	?I
@?J@??B?
?T?@?	??	T?B?k
ʚk}	???T?@????	Tk}??kB????T?#@?????	T?kB?k}??sB???T?'@?????	T?B?l?T@???	T?B?o?~???T
@???!?	T?}??kB????T#@???A?	T?kB??}??sB???T'@??A?	Tz?R?r??Ji??Ki?g@?#5??E?O 5H'ȚH6?8?@??B?}	?	ʚ?8?S@?h@??4q!?
T??E??[5?W@??@??Ri?)??H%?	
@?@??B????B??T?@?	???
T?B?
˚
}	???T?@??
???
T?}??kB????T?#@??
??
T?kB??}??sB???T?'@??
??
Tm?R
?r?%ʚJ6?.?@??B?)}
?)	˚?.?S@?@?H?4q?
T?C????Rؖ??B?W@?5qT??)??
+y??J??O?O@??S@?@?h5??E??R5?A?(}?	@?
}	??q?QT	
@??q?QT??)}@?ʃ@??@??@??}@?.
@?/m|?@?Q????????
??A?T}?}???c
?c??bT??#˅?~?D?%??D@?? ?D?c???T?1??B?!?
????TdB??????`?b¬??N!??NB??Nc??N???????@????T??.???????S@?h@??

5?W@?@???B??

5h@??
T@??a
Th
@?	
@?	??	Ti@?
@??
?!?	Tj@?@?_??	Tl@?@???!?	T?B??!
T???

T?kB??

T?sB??!

T?@?
5?ׅ???B??~?n??}???CS
TI}	?*}??Ӆ???B???I?)???)
Ϛ??;}?i	??
???4????/?,T?B??B??	??B?	}?W		?}@?q?(T}@???~?k)???~???k?????
@?????????H		???????????/??????????h?@?i@?9!??@?@??R????????!?R?????F?	?/???? G@?8*?F????"))`??!??T Ab>???C??T	????????B?N?B???B?????
?@?BԡNcԡN?ԡN?ԡN
????)A????T??B???B???B?(??	???B?I		?!@?!8 !E????T?C??T?~?	??B?

?H????B?"1H??T?b????B???B? ?"
@??¬?$n!?%nB?&nc?'n ??"
??JA???T??B???B?h?	?҈	?*?~??*?		???B?j
?@@?!E@?!@E??a??T????????!?R??q????E?) {????B????T?(?C??????zA?S@??@??q??
T?W@???)?!?
+y??J???????@֩
@?J@??
???B?!?	T?@?K@?_롼	T?@?L@??!?	T?@?M@??
???B? M?@N??kB?`I??sB??I???	T?@?	?Rk?k??-	??
@?_
?|
TJ@?_??|
T??C?_?}
T?#@???H~
T?'@????
??~
T??????????%ȚH7?S????H@??sB??
5?kB?}????}?Ӆ???E???Q?
??}
?k?#?k?$T?@????"@????&@??{?N@??[?N#@??S?N'@??K??@??@??s??-	???B??B??A??}
?v	??}@?-??m??m??%Κ?c?J}??;?}@???~?)@??3?	?~??+?		?i	??#??
@??????		???h??C??????kB??K????????;B?\????B???B?s??#E?k??B??T?B?{Țy@?(????B?
ɚ@???	??@?}@??{B?(??B??#
??B??"
? ?W?@?Ճ@?????B????sB???_qK	T?SB????KB?)	???B?_A?cT?[B??~
?	?k
???J	?J??+B????
??
??#B?b1J??T??D?J}JK??B?jM
J}@??%
?J??
?J???B??B?@?B
¬d?f@??$N!?%NB?&Nc?'N`??b
???A???T?B??B?j?????B?J?l?~??CB?k??K??D??5??B??M
?}@??[B??}
??	?(????E@?a@?(!`E?J?a??T??B?(??B??#	??B??"	????cB?H?7?????3B??։???S@??@??q?
T?W@???)??
+y??J????@??	@??B??
???B??sB??	T?
@??롨	T?@??kB??
?!?	T?@??
???	Ti
@???	Ti@???!?	Ti@?????	Ti@???a?	T?@?	?Rk?k??	-	?+
@?_?c
T?/C????_?c
T?#@??hd
T?'@?
?(e
T??????????J%ȚJ7,S?@?_kAf
T???h@?g
5?Ӆ???E??kB?y}??}?
kQj
?K}j
_kL??kJT??B?M@????M)D????????B??B??A??}?V	?-?B?????|}@??}@??qm?Ti?@? @??}@??
@??s?i	????G?=N?7?=H	??{????c?
??B?h??"??"
?A????B??֜?????B???T?ٚ}@?h????B?	
ʚ7}@??
??B?)?@?}@??B?h??B??"
???B??"
? ?ڃ@????B??B???B??T	???B???B??G?=?B??cB???B??7?= ?"
@??? N??!N??"N??#N ??"
??A????T?B??B??G?=?sB?????h	??{B?i		? @? (  E????T????S@?h@??	5h
@??B?	???B??sB???	Th@??a?	Th@??kB?	??	Th@?
끐	T?W@??@?	?Rf?ƀ?
	?I
@?J@??B?
?T?@?	??	T?B?k
ʚk}	???T?@????	Tk}??kB????T?#@???!?	T?kB?k}??sB???T?'@???!?	T?B?l?Tk@??a?	T?B?o?~???Tm@??끃	T?}??kB????Tn"@??롂	T?kB??}??sB???Tp&@?롁	Tu?R?r??Ji??Ki?g@?/?5??E?o?5???&ȚH66?@??B?}	?	ʚ6?S@??@?(?	5?@??	T?@??A?	T??E???E??W@??A?d}??)@??|?C??%@??QA??iB??mC?????1D?????@?????#@?????'@????L
?Q?
?L}	?
?
k-???eT?	@??
k
֚???A?K?T?}@??}@??c????[???~?????????????????{??s??k???(Ě	}?)	?*
ӚI??
ښk??L
՚???-
Ԛ???̓@???B?N}??@???B??@???B?kA?P}??-?5-???B?	9	??
??[B?j)?jf
???B?i%
??	???A???? 
?????B?b?D???!?R#?R%?R????????????T9??cB?????B??B????B????B???B???B???B??{B??sB??kB???T?>?W@?@???	5?S@??@???B??sB?H?	5
@?V??@???
@????	@?????	@?
֚????g	??
@??
˚????sB?g	??@?l
ʚ??
??f	??@?K
ɚi?	?i??/K?S@?@?(?	5??E?H?5?A?(}?	@?
}	??q??T	
@??q+?T??)}@?ʃ@??@??@??}@?.
@?/m|?@?Q????????
??A?T}?}???c
?c??bT??#˅?~?D?%??D@??!?D?c???T?1??B?!?
????T?>??????`?b¬??n!??nB??nc??n???????@????T??.???????S@?	@???	5??E???5		@??B??
???B??sB?!z	T	
@??
??y	T	@??kB???Ay	T	@????x	T?@???!J
T	@???U
T?kB?)}
?)}??q+?T?B?_q??T??ԃ@??@??@?@??B?}@?9}@?@?????????????s?Z????@?T?bT??h~?i~???B?)
???B?
?	?!?bT????B???????@??o?=^???????o?=????s?= n???{???T??B??B?h?????~?@k{?{???j;????A??T????S@?	@?i?	5??E???5		@??B??
???B??sB?Ao	T	
@??
??n	T	@??kB???an	T	@???n	T?@???A?
T	@???@
T?kB?)}
?)}??q+?T?B?_q˽T??ԃ@??@??@?@??B?}@?9}@?@?????????????s?Z????@?T?bT??h~?i~???B?)
???B?
?	?!?bT????B???????@??o?=^???????o?=????s?= n???{???T??B??B?h?????~?@k{?????j;????A??T????S@?h@?(?	5??E???5h@?????Th?A??????????A?K?T???????{?C????h&@???ԣC?????'@???h
@?}@?"?ȃ@???????????????B??h?@??!?R??s???B??@?iy?(i9???9?Z?A??T???B??	???B??	???B?	????T??B?J???B??B??	???B??B??	??B????_	???Ti=?S@??@?(x	5??E???5?
@???+?T?@??	@?ʃ@??q??T???@??}@?΁@????R?R '?yp? !?! !????!??Tp}?Oi0?k???	????TE=?S@?h@?iqA?	T?W@??@?iq??B?a?	Tg
@??
@????<	Tc@??@??A<	Tl@??@????;	Tm@??@???A;	T?B??!?	T???	T?kB??	T?sB??!?	T?@?mq?	T?}?(~
??Ӆ??ׅ?	?)?)
˚0}?		???!??????????T???T??`VC?jD??ZC??&D????i?@??????@?????A????????A????Ә????????S????T	њ.}
??NÚ?}?9}??}
???B?>}??}?s6??2?
??????
?????????b?C????
???B?b?5????V???B?c???B?G@?Oh`?k@?vhd??k???k???B?c??
???T????B????????????
????
???????B????B??SE???T?ˉ$?)?K??&???B??	?l????>???B???K@?/@?k??)?B???!??T????S@??@?yq(,
T)?R(!?I?R	@?r	j?5T??E???5?
@?h<	??@?)<	??@?????;	??@??K?j;	??B?j
ȚK???:	???B??
ɚl?	?l:	??kB???B??
Κ????9	??sB??KB??
Ϛ͵?-9	??@??	?%
T?@??	??%
T?q+?T?KB???ˍT?q??T??B???+?Tq?T??T_qk?T?+?T??;C????&@??+?пC??'@?????@??}@?????}@???k}@????F}@??KB??S?J}??????B????J}???4}?ʂ@??{??????#?J???????????B?J???A??B??????B?????????A?_? ?T??T???#B??B???B??+B?
???????????????????????????????&@x;'xZ???T????????T????s
??	????T??1???B??????TB???B???c???B?_????TJ??B???B?_???Tk??SB??
????KB?
???T??????B???A???A??-
????#B??k??B???A??c??B??B??+B???B??SB??B??CB???SB??3B????+B??cB?J??c??;B?B??kB?J??k??KB?
???T???}??B??
??[??C??}??#B?J????;??3??B????B??sB????{B?B??B??
? ??T?????[B?**????kB?????{????cB??s???B????B???B????B?c??B?????B?J??????B?
???T???}??B??
????j}??B?g
??????????????B??
? ??T?ғj???B????????J?
?9??
?	???T??~?{??}??????
?B?????_???T1|?q?1???bT??
?????? ?"¬??????ւ?a??T??? ??T?????????&@x?&x1???T????S@?h@?Ȃ	5h	@??B?	???B??sB??	Th
@?	?A	Th@??kB?	???Th@?
?a?T?{?h@???	T?Ӆ??W????_kjgT?sB??gT??B??fT?C??ׅ??{B??C?%@?????C??'@????kB??B?	Q

??B???B?}	????6}@?????}@??
?}
???}
????}
?}
?????c??}????}
???3?|????;?4
@?(?~??z??[@????3?ȁ??+?????#?????K?????CB???C??B??KB?)??K??B??;B?J	??;??3B?J	??3??#B?J	??#??+B?)??+??B???A?J??B?_?
]T????A?J}???A?
?kB?	k??}@???(
?m??T??A?(}?	b??B???)T????CB???A??B?I%??[??KB?????+B????#B?????3B??;B???A??B?H%??S??{B??@??B??A?????bT??B?		??/??B?????B??cB????	??/???B??E@?B?"!(b????T(ak??????TJ?)?_????Ti@b΃@??B??A?T??B??	???B?
??/???????	??/???
??B??E@?c8 ?E?c#c?"B(c?!??T!(bk?????????TJ?)??_????T i@b) ?!.* ??B?????B?ȃ@????????!?R??$?R??c????B??????T{???B??????T??B?)??B??B????B?k???B?J?????B??B?J?????B?J?????sB????????B?!??TJ??	?
??/??B?????B??cB?k?)?J????T???
??	?(a????????@??T?/?????
??¬FxaN?^BxaP^qxaN2^cxas^?xaN?^?xa?^?xaN?^?xa?^!(b!(p!(f!(g!(c!(s!(q!(r!(d!(v!(t!(u!(e!(y!(w!(xB???T?B??? ??T?
????E@?B?"!(b???T???	???B???B??[B?J-??B??SB?k5?J?k?N?B?????B?

???B?????B???/??	??)??????????
??T?ґ+	??????
???/	?	?c?!(cB?!??? ??T?F??˿?T???/7?/?????????¬?ԢN?ԢN?ԢN?ԢN????????$n??%n??&n??'n?xaN^?xa?^?xaNt^?xa?^?xaN?^?xa?^?xaN:^?xa?^c(dc(rc(pc(qc(ec(uc(sc(tc(fc(xc(vc(wc(gc({c(yc(z?@?a??T???B???`??T?B?????~?&???D@??8 ?D??$??"c(d??!??T???	???/i@b) ?!.) ?KB?????????B?????B?ȃ@????????!?R??$?R??i????B??????T????B?{?????T??B?)??B???B?{??sB???A??T^???S@?H@??E	5?W@?ʯJ-?Ӆ???E?X[A?W@??c???q)?R(!??#?`A!	#){??@ <`	 )v??	@ ???????~I+@?	}	?	Q

?H}

_	kI???????u???@??q???S???S@??@??q?%T(R???E?h%5?@??A?	T?@???	T??A?(}??@?}	??q?#T?	@?q?#T??	????J-?ׅ?k}@??@??@?̃@???@??}@??}
?~
?q
@?`m|?"NN???????
???A??T6??1??˿??T??e???~ӆ?g??D@?? !?L!?  ?? ?D???!??T?!?B???c?)
?????T?8?????????¬P?nQ?nR?nS?nD?nE?nF?nG?n??n??n??n??nd?ne?nf?n???d?N?cn????@?A??T?????????S@??@?q!4	T?W@?H@??4	5?@??5	5?@?	?6	TH@??A7	T?NB???=@?=???=H@??S??#@??c???E???E?6f?h~??;?=)<N???}	?	}?(}@??K?M?5???c??s??"D???H@??+???H!@??#???B???B??????B???A?kT(?R
N?;?=4?N(?&	<(*H7?'?SB????B??+B??#B??T???=	<N??T???=
f?_?T???B???(??B?
?@?N?{?H}???p?ӱ??KB??Ӏ???a?z?C?E?( ???B@???
k??	???1??	?c???T_}?hT???
????????
??D@??#?}????a??T???????	?a??T????aT?????????????????????	???T??????~?!h!h! n?Bh!!h!An@?ch!Bh!bnA??h!ch!?n????????9??a??T_????T???????F@??#?}???a??T??????
????????
??D@??#?}????a??T???????	?a??T????c@??!	5?'K)	kA"	T??E?i5?S@?I@?k?R?rk%ɚ?7?RLЌ??+1?k@?L	@?M@??}??	˚&??E?(?5?@?h?R?r
%ɚ
7H???
?R(!
?@??@??B??}
?H	Ț??S@??@??	5??E???5??A?(}??@?}	??q??T?	@??q??T???W@?)}@?ʃ@??@???@??@??}@?/
@?0m|?NQ????????
??A?T}?}
???c
?c???T??#˅?~?D?%??D@??/Dh#Bx#?D?c?!??T?1?
?B?!
????T?7??????b?d¬?oG?&Np?&N??&N??&NBĦNcĦN?ĦN?ĦNG?!Np?!N??!N?@????!N?H???@????T???????????E???5?CE??J??????ֆ7?S@?@?H?5ڣJ??@?
?RK?k??*-
?I
@?J@??B??
???B??sB??T?@??	끐T?B??
ʚI}	??T?@?_	끏T)}??kB?_??T?#@?_	롎T?kB?)}
???T?'@?_	???T	@???T
@?_?!?T.?~?
@?_?T@???A?TN}?@???T
#@???a?T?}?
@???T'@??끋TN@??R?-?@?N@?@???TQ@???A?T?
К~?O@???TP@??A?T?}?P@??TQ#@???a?T~?Q@???TA'@??끈T@??R,?+@?	@?!@??T@?_?A?T??|?
@??T@???A?T|?@??T!@???a?T|?@??T%@?끅T??a?T_?!?T???T?롅T?B???A?T_??T?kB??	롄T?sB??	?A?T?Ӆ??ׅ??kB?)}??sB?)}?,??ы
˚u}
???_	?J???????
??T?@?@?!"?!?B?}@?}@?)?~???
@???(??????????????!?R??$?R?????????B?????B????Tۃ@??@??@?@?wR?H?@????H@?????R????????!?R???????E??B??qk
T	?ҀN?o?	?/???=FؠnGdO?'N?gODŽ?N???n
h?RF
NB?n??'n??$N??'n??!N??n??n?	Th@????>	Th@??kB???a?	Th@?_?!@	T_??T?kB??T??B??+?T???????h
@?x?C????i&@???ۧC?????'@???}@?	?????????????????B?h?@??ڃ@???????!?R???????B???F?@k6???????A??T??B?)???B?9???B????kB?????T??B?)???B??B?9???B??B????sB?????????T?5?S@??@??{5??E?h?5?
@??B?

ɚ???H?	???B??sB??Y??@?	
̚???(???X??@??kB?
ɚ???h?	?(X??@?	
ʚ???(?
??W??@??a7	T?@??!8	T??C????&@????ٻC??'@??@?	?RJ?J??	)	?*@??B?
??kB???????Tiq@Th5(
@?i
ʚ(}???T??T(???T???T?}
??sB?????T?뀣T?sB??k?T??+?T??B??ˣT?B?qk?T???B??@??B?}~?????????B?????3??s??a??T{??B????kB??a??T????A?Z??sB???a??T?$?S@?	@???5?Ӆ???E?@?!@??})@?k}L?Q?
?3}*?i
?k)??	k??T
	@?_q+?T??U}@??W@?˃@??@??@?@?H?@?J@?)}@???v/??3????W!??@????v~????????????????????bT??=??B??B?%??B??'??B?j+?I	?H??A?)P?bT??/??B???????`????	?
??J????T?OA??????T
??A??B??	?)	
??A???j
?@%@|@? E????T????S@?	@?i85?W@?1A?*-A????J}?+5B?P}?
~
??}?-B?
??)???B??kB??}??sB?k}
???B?k}
?_?6T
@?_?A7T*@?_?8T?[@?j@?_?8T?_@??@?_?A9T?c@??@?_??9T?g@?Q@???:T@??
?!?T!@??????T/%@??	??T??E??ׅ??!?!??~??0?Œ?kT??A???T,K?S??q?T|~?,@????,!@???̃@??
T??|@?1~??@????(?@????h?@????h@????h!@?????@??@?)}?	?́@???C?B?@????{???k??w?k??C???k??s?(???h?|??#?h~`??K?K?C?L??????????????????????o??A?!??oA??A??
??A??A????A?B
???A?????A???@?T???A?}??sA?)??+??A??%?????A?I%?????A?)?????A?)|	??wA?\??A?	???????A??A?( 
?????{A?	????????c????[??????????B???A??B??????A??B?????[B???[??cB???c???A????T?????????A? ??;???A?h!??3???A?~???A?)??{???A???A?	*	??s???A?(??k??????A????sB?yy??&?  ?T?@ ??????@ ?{B?yy?? ?o?=?/B??s?=Ti~??CB?(
	kH?`??@? T???B?3?	?~??[B?T	??cB?U	?}`???^??jx?`kx?? ????s?=?F@??o?=A! ?F@? ?k8?(????s???T?kB?y9?9??KB??B?)????B?Z??SB???A??T?????)}~??+B?J	??;B?K??C??T?3B?K?????T?B?k	?K??#??T)?I	?????T?/?B??B??#B???B???^????=?K?=?=?O?=	?=?S?=
?=?W?=h?@?
A???O?g?= ??O?c?=@??O?[?=`??O?_?=?^`??????g?=]???k?= n?k?=?g?=^W???k?=n?k?=?g?=^Q???k?=n?k?=?c?=^K??????c?=H???g?= n?g?=?c?=^B???g?=n?g?=?c?=^	???????B??kB?s??????`??Tw̚?????~@????b
?R?|????bT??
x??????¬ ??"??ZC?a??T???@??Tx?Y??	??
????F@? G????T?????E?H+5?CE??S@?????U)??E?h*5?CE??J?????N)?S@?h@?yqAzA?T?kB????B??A??B??A?K(T??	??j	@?k?@?̃@??B?m????B??}?O?Ӥ??-???`?{??????c|?D}?????)?!?B???
??????kB???`$T??B?߃?BT????????B????????&@x?&x????T???
?s?????T??????}	?s??A	?????????	??
??????
???B???@??T9R??M?Y???bT??
?????? ?"¬@??B??{??a??T???????T??z???{?{?|'@x\'x9???T?????E???E??S@??CE??CF??????(?S@????@??T5ȧJ)???q?#??Az?kB??A???B??A??B??A?+T????????????B?eA?@????_???B???B?}	??~??~??~	??kB???B}	??#B?C|
???#?d?~????|????~ӄ??|????;?h|????????~?????C?|	????}
????R?R???????A????A???A??	??A???A?????A??A?
??A??A?s
??A??	???A?{??A???`T?#B?}?#??B??}????B?A???????????????????
???	T???{B?J??B??cB???B??sB?{??#B?_????T???#D?
}@??kB?(}?????B??{?Z}??s??c?ȃ@??i????B?s??B???B???B?{??kB???B?`??T??B?h?}??B?h??B?	????J??T????
?V?Ƀ@? ???M????B?????{???B??????T???J??T??B??@?Ƀ@??)??B?E@? E?J???T????A?}?????A?}??????A?J??B???A????B???A?????A???A????A???A?s??#B?_???T????A?H 
??3???A?? 
??+??#D?
}@??kB?(}??K??????????????B????V}?ȃ@??????B??{B?k??B??SB????B??[B????;B??cB???CB??sB?s??kB???B????T?KB?h?}??B?h??B?	??{??s??c??[??S????T???B??3B?%?????B??+B?%????ȃ@?I?	????????B?{???????B???B?s???B????T?~?h????T??B??#???B?	?@?ȃ@???B??
?J?k	?J?_?bT??*???B?@?B
¬`??b
???A?a??T?B????B?_????T?B?J?l?)	?k?	? E@?E?J???T?????B?	A?*q?T	A??+?R?븟
k?T?????
A?_	k!T? ?????	@????
@????@?i??@?i|??B?	?|T?
@??{T?@??kB?	?!{T?@?
??zT?@??A'T?@??(T?Ӆ??ׅ??kB?}??C??}??%@??A??B??C?	&@?????@?????#@?????'@?????~T???B?
֚???A???T?kB????k???~??????????????{??s??c??[??S????Ě	????B?*
њI??
ٚk??L
՚???-
Ӛ???̓@???B?N}??@??@???B?kA?P}??-?5-???B?	9	??
??kB?j)?*^
???B?i%
??	???A???? 
?????B???d???!?R#?R%?R???????Z????T?B????B?????B??B??B??B????B????{B??sB??cB??[B??SB???T?&?	@????
@????@?i??@??l??B?	?alT?
@??lT?@??kB?	?kT?@?
?!kT?@???T?@??T?Ӆ??ׅ??kB?}??C??}??%@??A??B??C?	&@?????@?????#@?????'@??????tT???B?
֚???A?+?T?kB????k???~??????????????{??s??c??[??S????Ě	????B?*
њI??
ؚk??L
՚???-
Ԛ???̓@???B?N}??@??@???B?kA?P}??-?5-???B?	9	??
??kB?j)?*^
???B?i%
??	???A???? 
?????B?????!?R??#?R%?R??z??s?Z????T?B????B?????B??B??B??B????B????{B??sB??cB??[B??SB???Tp&??!?B?????TA??T?????????/?????D@?B?"!(bs???T(a???
??	???Tc???
????T?????????c?????
?@??T??????(a??s
??
??	?@??T?/???????¬FxaN?^BxaP^qxaN2^cxas^?xaN?^?xa?^?xaN?^?xa?^!(b!(p!(f!(g!(c!(s!(q!(r!(d!(v!(t!(u!(e!(y!(w!(x?B???Tq????????F@?B?"!(b????T???????S@??@????@?
?R,&
??
@?????T_??T?@?_?T?@?
?IT?#@??T?'@?????
?T?[@??A?V9A???N!@?X?C?????Ӆ??ׅ??;??%@??Q@?I%
????1@????5@?????	@?????}`???B??K?
k?[???????#????C??c?????S?aATZt?????d????B??B?i?4Hy)???B?	A?*q?T	A??+?R?븟
k?T???븾%
A?_	k!?T? ?????C???"?R?|??%??E?H?5?W@??@??R)?)??H%?	
@?@??B????B??T?@?	?=T?B?
˚
}	???T?@??
?<T?}??kB????T?#@??
?;T?kB??}??sB???T?'@??
?:Tm?R
?r?%ʚJ=7?@??B?)}
?)	˚??C????R?|?~%?W@??@???B?($5?@?%5h@???%T?@??&TskA?v@??bA??@??????E???E??~?	}?(}@????-c5???S??s?y?C??@???B???B?r????B??????H?A?kaT?+aT	??`?@?k?~?h?|???~Ӯ}?
????B?0????z????)?!??J?????^T>?HT?????????????E@????
?????TB???c?_???T?????AT????B??	??~	???B????????
?B?????????_???Tl
?;????˟?bT????????`?b¬????????A?A??T?????T~??~?,?????`G@????
?????T????????????????E@????
?????TB???c?_???T????W@?	@???B??5?S@?i
@?
?A?
?B??C??o@??q??????J?????)?????	%@??kB?A??)??
????!T?Ӆ??????(?A??A???$?L???Tl	@???B??????A??T???	@???JiˏKiؓLi?ׅ?̓@???B??B??}?)}@???I}@??@?,~??~???B??}?????s???~??B????M5?????3???~Ӎ}??}??}?????}??+??}????J}??k??})?l?~???????J	?
????????}?????;??~??#????|)??c????}??????????{??????A?)???A??A?
?????A???A?J?????A?????뀏T????A?}?????A???A??B??B?????A??B?????A??B?????A?????T???B?????A??	???A????%
???A?(}??C???A??????[B????+B??KB????#B??SB????;B?{???B???@??T
???3B??[??CB??%??B?}	????S??K??B??B?J??kB???B????cB???B????B??B???{B??J??T?????B???H!??sB?}	??B?	??~????????~????B? ???4????????B?????B??? ??T?~??$??T??B?	????T?????B? E??J???T?/k?D??T?
??T?zh?????
kJ?T?B????TɃ@??@??}@??}@?????B?΁@??Ҁ
Ě|???Ӛ0??ښ!??"՚B??Ԛp????B?#~???B?!8?A?"~????B????qE?c2???B?1?1????@??B??
֚!??!|???~?hb?ja?8! j"???????T???
???T?#??5?A??
@?}?	}?)}??B?*}
??@?J	ɚJ?J?}?J
????Zu????	T?K	T?
	T???+??3???????A?Z@?	ɚ????}??k?)|??;B?7|??s??????kB?}?H??????	??B?????}??B?(?????????[B??B???@??(???B?!???@????B????;B?9?????T??B????cB??B?k??B????#B?!??T?B?k??{B??B?)??B???sB???T?[B??B???B??3B??+B??B??f4??B?	A?*q??T	A??+?R?븟
k?T?????
A?_	k?T? ??????
kT?B???jTɃ@??@??kB????@?
???Ě????B??
š??ٚ1???
՚???
Ӛ.????B??}???B?12?D??}??E???B????o=?A\???B??E?/???@?P??B??
֚1??1~???~?j`??iq?!?i ????
????T??????T"#??
dT?B???cTɃ@??@??kB????@?
???Ě????B??
š??ؚ1???
՚???
Ԛ.????B??}???B?12?D??}??E???B????o=?A\???B??E?/???@?P??B??
֚1??1~???~?j`??iq?!?i ????
????T??????T?")?R	??r	j@?T??E??\5?
@????@????@????J??@??K??
??B?j
ɚK?	?k
???B??
Țl???	??kB???B??
Κ???L	??sB??KB??
Ϛ̱????@?????T?@????T?qXT?KB???WT?qkWT??B???WTq?VT?VT_qKVT?qVT??̾C????&@??+???C??'@? ?~?!}@?ƒ@??}@?????}@???k}@????F}@??KB??S?J}??????B????J}???}?5
@?ɂ@?1?J?????#?)???????????B?)???A??B?k
????B?k
???????A??
??OT?@?T
???#B??B???B??+B?	?????????????
??????????????????F@?@G?{???T?9?????T????s??????T?????B?????TB???B???c???B?_????T)??B??
??B??
???TJ??SB??	?k??KB?_	???T??????B???A???A?i)	????#B??k??B???A??c??B??B??+B???B??SB??B??CB?B??SB??3B????+B??cB?)
??c??;B????kB?)
??k??KB?_	???T???}??B??	??[??C?I}??#B?)
????;??3??B????B??sB????{B????B??	? ??T?????[B?	&????kB?????{??cB??s?????B?????B??B??
??B?)??B??
???B?J??????B??
???T?Ҫ}???B??
????j}??B?d
?????{???????B?
? ??T?Ҏ???B????	???s?k?9?B??????T
???}??
??}???????J???Z?_???T|
???????bT???????????¬?????B?a??T??U???<???~?W???G@??F?????T????S??E?	k?B?
4T??B?
@????JA?J}?6	
?@?}@?h?~?)	
??{?(??s?@???h??????(????nl@b????????!?R??$?R??B?x?????E?k?B?`/T.h! ??B??Ț??B?MT?B?hɚ?	?#E??k?T#A 	K)?R	y3!# A ????B?H?@???I@?y?@?t@?w??@???B?k??k}?S?Z	??s?=q?T?????s?=q?TC??T*}???B?k?j
?_?T??j?l?~???B?k?)1?	?E@?`E?J???T?f?????????!?R??$?R??B?+???s?=???SE??6q?TC??T
??Lq?TC?T?{B?H????T?sB?_?T	??h	?*?~???B?)
?J
?@E@?!@?  E??a??T??R????????!?R??B??????/??E???k+Ty??*!?J???B??B?@?B
¬`??b
???A?a??T?B??B?*?????? NhB??B??B?	m?l!x!Bx!cx!?x!%?'A@?%? NF? Ng? N?? N%??'A??JA?!??T?B??B???h
???B?)	
?j
?@%@|@?!@?  E??A??T?R????????!?R??B??????E?q?
T	??`N?/??????FؠnGdO?'N?gODŽ?N???nh?Rf
NB?n??'n??$N??'n??!N??n??nA?S?'!("s?a??T(!???
??	?a??Tc???
???T?????????c?????
? ??T??????(!??s
??
??	?@??T?/??????D8a.B8an?^!($!(%?^!(%e8a.?^!($D^!("!($D^B^!("?^!($?^!(%!($!("?¬c8an?^!(%e^!(#!(%e^!(%E8a.c^!(#?^!(%!(#?^!(#B8an?^!(#C^!("!(#C^!(#?8a.B^!("b^!(#!("b^!("?8anc^!(#C^!("!(#C^!(#B^!("?????Tq????????&@x?>S?'!("??a??T?????E???5@??/???T	?A?_?(?A?K?T@?q??T??
?C?&@??@?q@?`i{???b??B???/??!?B?????T???T?????????/?????$@|B@?!("s???T(!???
??	???Tc???
????T?????????c?????
?@??T??????(!??s
??
??	?@??T?/??????Dx!NBx!E^!("!(%E^!(%?^B^!("?^!($?^!($dx!!("?^!(%?^!($!(%!("?¬cx!N?^!($d^!(#!($d^c^!(#Cx!!($d^!(#!($d^!($Bx!Nc^!(#C^!("!(#C^B^!("?x!!(#C^!("!(#C^!(#?x!NB^!("b^!(#!("b^!("b^!("?????Tq????????&@|B@?!("????T???h?4??B???`*A?@?T???)?R(!Ț?Sp?????	???T?*?;??E?h?5?{C???{??C???;??????A?q+?T???
???B??#B?+}????????SB?k}???}@?(}???(????B??????B??}????|??+??[B??B???A?J???A??A?	??????A???A?)??????A?_??T??A????yj?????A?h?@??@??KB??
k?7@??A?I??)@?????A?I
@?)}?J@?k@?)	ʚ????mT?B????;B?*ş?+՟??#B?,
ʚ??
???A??
??
ʚm???O}	??
˚???
??뷱??o}????k????????B???B????T?B????T?B???A??}?????C?6?B?k????

???A?I-	?	?????SB??	??B???
??T?A??S???A?????A??{??B??3??{B?A??{??+B??B?)??????3B?*??T???C??눳???s?	??~??k????B????
?
!@iI
К??)??	&???B???B?:)???@?????B?(}???????B??{B???????????????'?R`?????T(???s???????T??B??B?}	??B?(??B?(??sB?		?????kB?8?????SB????B???B???B????T?B??????T????A?)@??	?k??T?A??	???T?;B??A?)
ʚ?A?j
ʚ??A?+
͚k?
?,
????4??I
͚)?
?K
?k	???I???덴T????T??A???A?h!
??"?:K??A?
*	???B?J}??B???B??
?j?@???B?h}???B?h!	?H?	????B???%?R????A??ֵ"?s???B????T??i

КJ????C???7?@??KB?k??T?cB?k}	??CB?J-?????B?k????

???A?I-	?	?????SB??	??B???*??T?A??S???A?????A??{??B??3??{B?A??{??+B??B?)??????3B?*??T???B??먲???s?	??~??k????B????
?
!@iI
К??)???[B?J@??KB?_k
&???B?J}??cB?k}??CB?)-
?I????B?Z	???@?????B?(}???????B??{B???????????????'?R`?????T(???s???????T??B??B?}	??B?(??B?(??sB?		?????kB??????SB????B???B???B????T?B?????T????;??@?i?R	?r)%ȚI6
???+?;??kB??~???}
?	?)?)
Ԛ.}??	???(?????????B??A???A???T?B?}???B?*	?????nX@??~@??@?j???J?J??{???
???J??s??~??kB??
???*???~??k??K??c?)???H???????[B????B??뀘T?B??
ɚ
?	???B?I
̚*???KB?}??SB?<-
??3B?}??;B?+-
??CB?S-
??+B?*}
??#B?}?_q?[?+T??j
??B?h}?	ˈ9??B?7)?????B?????T??@???B??~	?)?	?9?@??B??~??ۃ@???B?????B????? ku?i?)???B?A?<"
?"?O"?????B??'A??(?A??A??dT??E??qHT??+}???@??q?#@?h?Az?4c7?~?"?K?	??
??
?bT?????	???T???}??	??K?|@????!?@??T??!|@?!zp?! "?#C&B?_?`??TD????T?|@??@???
??T?@??T???????~ӂhg?"("?h'???????T?????|@??@???-??T?@?y??4??әhgx9?h'x????R????+1?k
@?L	@???M@??-
?L?A???V?C??-??ы-?L@???M%@??-
????B?h?A?XT?W@?	q?TW?@???ԃ@?"
q+bT?34q@hT?4??
??????UT	??
???B?)??????T??z)?J}@?`'??J?kq???T?zj|!@? !E??T?z)? @ ?????B??T??B??KT	???@???B????{?+A???B???B?????
???z?O???)??	???J???
Tl6?????
??? ~?!h!h! n!
?Bh!!h!An"@?ch!Bh!bn#A??h!ch!?n????1?!??a??T????B???`??T??B?1?? ??A	? D@??#}?1?a??T?????B??	T??k	T	???B?}`??@???B??y???B??|?+A?????B??	????z?P???~??
?)???????`Ta		??	?B
?!????'??*a6???????? ?"¬@??B?B?c@?A??T??????T???"?	??`D@?@?B?!???T???@?@?H@?i?R	?r*%ȚI@?
?7
?J???R)?@?J@?I}	?(	Ț???@??@?i?R	?r*%Ț?@???7
?J???R)?@??@?I}	?(	Ț?
?J???R)?
@?)?J@?H!	?I?A?)?K?C?(!?I?(!?I@?)?J'@?!!
?????B??sD??cD???B?	A?*q T	A??+?R?븟
k?T????
A?_	kaT? ?????;??kB?HQ	
?(}
		?
k)??	k?7T*?R@
N?;?=4?N???=4?N?N(a?p.
&*67?W???????B?˃@??[??SB?k}`???kjl}@?m~@?}@?(}@??S?p
@???(?????=f????<N?s?H???KB?)??	????~??????B??|??K??}????g?ӈ?
ˈ??	?O?????H???H???H	????kB?!??KB??B?)????B?)????B?)????SB????-T
???cB??[B??k?<$??{B?J??sB?_????T????B?H}??????B??{?O}???B?????B??????T????B????B?(}??`???B?????}	????B?"??B?7??B?*??B??B???B???Z?)????B??? ??T?ң??B?c|?u????	???
@b????~Ӂkt?(!?k4?!???c?9?????Tq?T???o?????o?o?od???DN?ENd¬¬?DN?EN????????TaAN@@N @N?ox!@nx! ? N? n?0~?k???T?"?"?bT?? ??????a?<"x!N!x!?  a@?!`????B?	}`????kB??	˚`?;???ٚ}@?is???B?)
ʚ*}@???B?k?@??~??	??B??i	?)?`??B?}???B?L1
???B?,1
?`?˃@???B?}?H!???B?(!
?s?????B????B??????????B?????B???(??Z??????TS?;?Q???B?(|??~Ӗ-?W}-???????B?????Y??s???K??T???B?????A??T;???/i@b) ?!.( ?[B??}??}
???????B???B????[B???B?ȃ@????????!?R??$?R??????B??9???k??T???SB????kB???A??T{??B????sB????T????/i@b) ?!.( ?B??
??~??~
??K?	??????????????????B???B???B???B??KB??@??ȃ@??????\??????????!?R??$?R??ޱ???B???Z???B?????k??T??B?)??{B???B????B???B?Z??kB?????T?B?)??B???B????#B???B?Z??sB?????!??T??K??/))!	!?!.J!d+ I?|????	~??S?)|??C?)???;?9|?	}??3?)???+?}??KB?J??A???A????A??;B?	??;??A??+B?k??+??CB?k	??C??3B?)??3??sB??K?_???T?B??????mT???KB?}?????3B??CB??+B??;B??B?k???A??[B??
???A??cB??	???B??
???B??	????A????T??h}???????????c??[?????A?-!@b"))"	B?!.l"??@???B?	???B?	??"?@b@!!????????!?R??$?R??B???P??????????!?R??$?R??H???B??????????B?????B????kB????Th?@??B?)?@??A??B??T???/?/??B?Y*???/??B??/??B?e?c	¬F???&n??'n?xaN?xa(f?^(f^(p?xa(f^(p(fFA¬f?&n?xaN(g?^(g?xa(g?^(gG?0n?xaN(f?^(f?xa(f?^(f??%n?xaN(f?^(f?xa!(f?^!(f??$n?xaN!(e?^!(e?xa!(e?^!(ec?#n?xaN!(d?^!(ddxa!(d?^!(dB?"ncxaN!(cc^!(cCxa!(cc^!(cBxaN!(bB^!(b?A?a??T??B??
??
?@??T??k?~???)????E@?C"c?"!(c#E@?B#B?"(bJ????Ta??	????????????A???B???B???B??SB?H?@??????????!?R??$?R?????????????!?R??$?R????????B?????K??T??B?)???B????kB????{B?a??T????B?1?|??=????}
??!??c?
?	?j?T??B??C?bT??`??=?????O??NO??N?O??N??????O??N?@???T????Tx$???????T??}???}?????
?s???????`??T????*??T????????`??T?x???xw?????xx? !
??T?x'??????-?|??=?ρ??}
?????
?	???T?B?@?bT??`??=???
??O??NO??N?O??N????O??N1B???T?
?
???T?y0?????T???
?R	?Rȃ@?J???RI	))}S	y1??mT
???{B?<}??A?8}????#B???H}??+B?(????????B?????}???B?6??????B???A?h?@??h????? ?֜?{?????T??B????B???B????kB?????B????T?B?J??3B???B????sB?_
???B???B????T??B?{5??A?	?	A?+q?A??1???B? T	A??*?R?긟k?T????
A?_	kaT? ?????;??kB?}?}
???B??*@???A????A?	?R
?RJ????K	?k
ʚL??
ʚL}??	?,??J???Az엟???ş??՟??q??????@??T@??LT@?	??T??A?k}?
?bTi@?h???A??k?7@???
?R,E
??
@?k
@??@??Tm@??
??Tk
̚j}
?k@??Tl@??
??Tj}
?k@??Tl"@??
?Tj}
?k@???Tk&@?
?`T?k?T??A?I
@?)}?J@?)	ʚ?{??B?i}?)
ϚjJ}@?j}
?J
Ϛ??A?+
͚k?
?,
????4??I
͚)?
?K
?k	???S???m?T@???B????Tȃ@?	??B??@???A??"	??vfK?B??B?????A?????B???@??@?(E?ڨK}@???-?T??A??~	?xK?{B?3]??B?(}?	?ȃ@???B??@???B??B???%?R????A?????B??{B?s??B????????T=0|
??M?T)	?"
??H???ן)}|????	?~????
ʚ?????????????i??(??
}???J??B?_?J??????)}??	?)???)???????W@?i)A????j@??[?j@?e?C?l%@???????k@??RmE??
@??@??
?T??A??@????T-
͚?}???A???T??T??A??|??[B???T??!T?[B??|?_???A??L?????????A???B??
?*T??A????T???S@??	@?????5B???C??C??%@??;??@??@??+??@?????#@??#??'@????K??@??R?E??%@??Q@??[B??
̚??J
͚????A?J?k?7@?J??J@????
?R???
F
?K
@?i}	?J@?+	ʚ???????D?_q???i???3?
|?????????:????A?		???I|?(}?????|??????B???????cB??
???A?_	?T?@??c??A????A??{???A????{B?A??{??A??B?)?????B???A?
??T???s?{C??h???	??~??k???A??Ț?[B?
}	??3B???K??i
̚-???D????7??A?k@???A?kT??A?
}
??A?*)???A??)?J	???A?J5???A?J}??B?+
˚?KB???@??CB?k}
??B?

͚?;B??}???A??
??B?}
??#B?(!
????B???Ƀ@?????	?????{B???B?????B????????????????*T??s???B??	???B??	??????T??+B???B??sB??kB??T???B?(}??B?(??B?<??????B??
֚??????????s???B????????T??B??B????cB?????B??B???A?J??T??A???K??T~???A??1???A??A??A??A??A??-?T??B??)?R)?}@??,??T?B?J??@?i%
???@?ʯC?H%?h!??'@?!!?
???B?i
@?(}@??	@?_?(?Tj@?_	?AT?.A?j}
??2B?J}?N}??q?|T?q?|T	?Ҋ?@?k?@?l@??@??}@??@?@?i{???a??)?!?k???`zTBy???}???bT??#????????¬x!Nx!%x!N!x!Fx!NBx!gx!Ncx!q@~?sH?uP@?wXA? ? N?$Na?!NE?%N??"N??&N??#N??'N`>?a??b?c?c??????T???????B???d??$@|@?A@? ( @D?c?A??T????B?J??@?i%
???@?ʯC?H%?h!??'@?!!??????B?i
@?(}@??	@?_?(?Tj@?_?AT?.A?j}
??2B?J}?N}??q?pT?qKpT	?Ҋ?@???@??@?m?@??}@??~?p?
@?`@?m|????c???
?)?B??????mTEy???}?A?T&}????????t????0S?cTf????????@????¬?$N!?%NB?&Nc?'N??????sB???T??q?????????~Ӈ???e??@??D@?(!?D???a??T???
?J???R)?
@?)?J@?(!
???B?I?A?)?K?C?(!?I?(!?I@?)?J$@?!!
?B????B??SE??CE???B?	A?*q T	A??+?R?븟
k?T????
A?_	kaT? ?????;ըQ	
?(}
		?k)??	k?aT??B?_?kaT?+aT?W???????B?ʃ@????jK}@??~@?}@?(}@???`?????
@???(??h????B?)??	????M|?????}?
?h??h??	?f???u?n?x	?
??B????B????????B???[T????B??B?????$?????B??????T????B?}??`???B??~	?	??<	??	?		??????
?
@bE???~?!ke?(! k%?Z???c???_?`??T_q?T???o?????o?o?o?????DN?EN?¬?¬?DN?EN????
????TaAN@@N @N?ox!@nx! ? N? n?0~k???T?"?"?bT?? ????????<"x!N!x!????'@|?$@|!@?B@?!"!?"(a????T???
?J???R)?
@?)ъ@?(!
???B???A?)ы?C?(!?I?(!??@?)ъ$@?!!
?e????B??sE??SE???B?	A?*q T	A??+?R?븟
k?T????
A?_	kaT? ?????;ըQ
?}
?k???k*FT???ET?ET?W????B?ރ@??nH}@??~@?_qK^T?}@?k}@????
`?_k?Tn??@??????B?a?~????~?+~??????b}???d??~?G???????`?~???~?B?B˥??˦????????
??B???B???k??????????B????B?`>T??B???B?x??A??T????(|
?5|	??^???????????o?????o?o?oD????$N??%ND¬¬??$N??%NA?
????Ta?!N@? N ? N? n?0~??????E@?D@? B???Th??~??jh?(!?j(?c?{?Z????T!?????T???????????T?Ҩ~
??~	??^????B???????????B?~??jb?(!?j"??!????????T???o?????o?o?od?f???$N??%Nd¬f¬??$N??%NB@?_
????Ta?!N@? N ? N? n?0~??????a?c¬e?g@¬!?%n%^1^2^B?&nF^S^T^c?'ng^u^v^??0n?^?^?^(!(2(1(%("(4(3(&(#(6(5('($(8(7(0B@?a??T??????????AD@?bD@? {???T???	????B??}????????{??
?????n}??}?p?ӥ?@???????b?z??C???????????)??B????B??B????B?c???B??	????B??T?~??????????hT?????????
??????????%@xfyc?????T???!???B??a??T?1????a??T????aT?	??B?}	??CB??????D??
6???
?????c?????????B????B???B????T
??qs??~???B??????????	????Z?!????B?????Tl}
?7??????????
?????????T'@x,y9?????T??????¬??????????A??T????????????
??????????%@xfyc?????T???!???B??a??T?1????a??Tv??????????????zs??~???B???
???l}?C???l˟?bT???????
?`?b¬????
??????A??T?
???d?c~?#?????$@xeyc?????T??!?9???B????T??1??????????T=???;??B?)}@??	q?T?%qbT+?R,э?}??@??o?oNH???
??o?o?¬???N???N„?N??N?!?!??T??N@??N`??N??^f??
??T)?J
?K?@?h?)???T?@?(?M???)*H}~???kB?}@???B?}@???????????R??s?Z?a??T????B?9?????T5??? *(}~????????A???A?????=??s???a??T???A?????a??T ??)A??=T???	?}?}??sB?}	?q?T?B? ?@?}~?%????B?q?B??T?sB???KT??B??q?T?kB???T??B??q+T??B?????T??B??qk?T?B??q?T????B???~ӊ}@??@???B?}@?????B?}@??;???B?}@??????B?}@?H?~?????sB???A?}
????kB??B?}
??C???B?}?????
@???@?A?h????h?????????A???A???A????????A??????????A???T_A?T????A?????B??kB??????????
????????????????????
??D@?A@?(!@G?{?a??T??	?????Ts????????T????B?????B?????T???B????B????a??T??CB?1??;B??A??T???A?????A????sB????T???????A??A??}???A??????????A?????A??A????B???A??B???A??CB???B???A????A??B??????A???A??
??B??????A??
??sB?????T??~???A??S???K?????}???A???????A????????????3B????CB??#B????+B????;B?????T???3?(~??B????c??B????[??+??B????#??B????B?s??B??B?????B??{B????B?????B????kB?????T???}??SB????KB??????}??cB??????[B????????{?
???B???B?????B?????B?????T?Ҍ|??B????B?????????B??????B?	???????????B????T??.???|??n??~????????{??	??	????T1}?d?d?Q?q???"2N?cT?????????¬$?&@??$N!?%NB?&Nc?'N ??"???@???T??b??????Qˆ?~Ӥ????D@??@?(!?D?1?a??T?????~?i??*???B??
?l?~????i3?i)?i*?k???A??T????T??B?)?}???B?	
?????)???T????B?(|??~Ӗ-???B?}-???????B????????s???K??T???B?????A??T??S@?@?h5??E???5?A?(}?	@?
}	??q+?T	
@??q??T??)}@?ʃ@??@??@??}@?.
@?/m|?@?Q????????
??A?T}?}???c
?c??T??#˅?~?D?%??D@?  ?/> L . ? ?D?c????T?1??B?!?
?A??TQ?????????=`?b¬ȠN%ȠNFȠNgȠN?N!?NB?Nc?N?O N!N"N#N ?n!?n"?n?????N cn????@?!??T??????????S@?@??t5??E???5?A?(}?	@?
}	??q??T	
@??q??T??)}@?ʃ@??@??@??}@?.
@?/m|?@?Q????????
??A?T}?}???c
?c??bT??#˅?~?D?%??D@?@!?D?c???T?1??B?!?
????T?
??????`?b¬??n!??nB??nc??n???????@????T??.???????S@?@??l5??E??5?A?(}?	@?
}	??q+?T	
@??q˻T??)}@?ʃ@??@??@??}@?.
@?/m|?@?Q????????
??A?T}?}???c
?c???T??#˅?~?D?%??D@?  ?/. ? ?D?c?!??T?1??B?!?
???T?
?????????=`?b¬ȠN!ȠNBȠNcȠN? N?!N?"N?#N???????@?a??T??.???????S@?	@??c5??E?)?5	?A?I}	?
@?)}
??qk?T
	@?_q?T??T}@?Ճ@??@??@?8}@?@???????@G@?j??`G?????Ts????????T{
?S@?	@?I`5??E?ɮ5	?A?I}	?
@?)}
??q?T
	@?_q??T??T}@?Ճ@??@??@?8}@?@?s???????T??????`G?Z?????T@@?  L??T???????S@?@?\5??E?ȩ5?A?(}?	@?
}	??q?T	
@??q??T??)}@?ʃ@??@??@??}@?.
@?/m|?@?Q????????
??A?T}?}???c
?c??T??#˅?~?D?%??D@??/h!?D?c?a??T?1??B?!?
????T
??????`?b¬?o?$N!?$NB?$Nc?$N???????@????T??????????S@?	@??S5??E?ɠ5	?A?I}	?
@?)}
??q?T
	@?_q??T??T}@?Ճ@??@??@?8}@?@??@????v~????????????bT??.h~?i~???B?)
???B?
?	?A?bT??#??B???????<??n?s?=^??????s?=???o?= n?o?=?s?=^???o?=n?o?=?s?=^????o?=n???=@?!N ? n??<{???T??B??B?????~?@k{?@!???.(!  ?j;????????Ts?Z??????T??S@?h@??H5?Ӆ???E?j@?l!@??}
l)@?J},
?Q?
?})?		?
k,??kj?Ti	@??q?T)}@?̓@??@?n?@?k@??}@?M5?n9???
????@?T???
??	??#&<@??!?(? x`|@?F???1???T?@??/?4 "	??T?$ !???T@ ????S@?h@?B5?Ӆ???E?j@?l!@??}
l)@?J},
?Q?
?})?		?
k,??kʋTi	@??qk?T)}@?̓@??@?n?@?k@??}@?M5?n9????
??	??E@??#&<@??!?(? x`|@?F?1????T??
???????T??S@??@??<5?Ӆ???E??@??!@?j}
????)@?J}+
kQi
?})??	
k???kj?T??B?)	@?3}@??qK?T???}@?????R?h???u~?i@?h?????	??????B?????B?`?T????ۃ@??@????B?B??"A??&C??.D?@??R^?@? Q|@??????Q!|@?????bQB|@??????Q?|@???????@?G'ƚ?@?7?R?\??@??@??|??ƚ?R?\??@????@???!d?A??????A??“C??!? ??@?!??'@? ??hT??ATl|??}?Q??}.???kϱ??k*2T?q?1T.~@?Ѓ@??}@??1@???@??????K???
̚?|@????7Ț?~@??|5??~4??|??~
??A??T??:@?y~9?Z	??9?Z?Z?9?9?9???T????g|?K5?|@?gb'?X?~??????'Y???????D@??D?9???T????a??TV	y|9K5:@?yb9?9?Y?:Y?Z?????@?B¬ ??"??{C?a??T?????????@?%???@?a?@?ɫC?(!?H!
??'@?"!??????B?????B?	A?*q T	A??+?R?븟
k?T????
A?_	kaT? ?????;??Ӆ???E??2B??nA??rC??D?p@??R??
@?1??????`???????????џ?????@??&Ě?@????7?R???@??@??|?cĚ?R???@?c??@???ėA???ƟC???d? ?@???????@?!??'@? ???BcT?&К?7?@?o
@?p@?~??	Κo
@???p@??9?o?A???`?C??9???9?o@???p&@??9???baT??AbT??
}?????}m?Q?
?\}+??_kJ???
k???????????????T????????)}@???T}@?????B?:}`??	??`???B??Ț}@??r???B?)
ʚ*}@???B?k?@?k?-9?l~??	?I_	?)?`?K-8? -;???B?k?@???B?-??B?K-??B?"-?˃@?k?-9?H!8?$!;?!?R#?R%?R?B?~????B???(????????T??B??
k??TqTiu	?	?Jq???T	k?T(Kq???Tx?Ӆ??ׅ??W@?A??|?6B??}	??}
?m??ѫ
˚m}@?J}-?K??+?n??_k?T2C?
"@??}@???B?%?e??f
?g?s??????T??????T%˓????T?)?sL?s
?S?4????????&@|@?`F?????T????Ӆ??ׅ??W@?A?i|?6B??}	??}
?m??ѫ
˚m}@?J}-?K??+?o??_kj2T??B?,A?6C?"@??}@??@???T@????D??????? ?~????ėC? ???? ?{??????'@?J?_???B?/TV
ɚê	?wȚ???@??
??~?ch??#??7??T??B??@???B?|???B??~???B??~?܃@??~??~????T??????|?????f?????B???!?g????B??B???b2A?T?ˀ?)??????????B????¬8a.8an%8a.!8anF8a.B8ang8a.c8and>?e??f
?g?s?????T?B?????`??T??&?`??ˁ?)??????`?????$@x<S`D?????T????4q?"T	??
?R??B?K}~??z)?J?/???jk?!("?z)?k??qa??T! ?z)?)??
?!??T?

?????C??T??

?????bT	??
?R??B?)??
????TK}~???z)?J?'??k??q???T?jk?   m??T?z)? @ ????
@????@????@?i??@?????B?	?!?T?@????T?@??kB?	?A?T?@?
??T?@????T?@???T??E???E??kB?}??}?@?????"@?????&@???H@???HsB???H/C???K#@???K'@????@??{??#@??s??'@??c??
kQj
?K}	i
?k,???a@Tk?B?
֚???A??Tt}@??}@??[??kB????k???~??҈Ӛ	????B?*
њI??
ܚk???B?L
͚??
??B?-
Κ???̓@??sB?N}???@?P?@???B?kA???B?P}???B??-??B?5-??cB?	9	??
??kB?j)?*R
??{B?i%
??	??B?A	???B?(!
?????B? ?d?!?R??#?R%?R??U???Z????T???[B?????B???B???B????T[?q?T?/  ?B???|?Nɂ???~???B?K}??
@?M?z??
?)??????
??T?B?<??T??????B?????F?1????T???
?????T??????B??ҡT?	?????????1B???T???
??????T????
??	?????????1B???T???? F?????T??
??
???!??T???@bȃ@??	&ȃ@?+y*}S,?R?rk:?TI2	y?#ȃ@?}?@?hB?4?Rh4h
A?	A?*q?t?T	A??k??
k?T????????
A?_	ks?T? ?????@?@??????@? @?????4?@?()???4)????l?|?N??B?}
??????)?~?o@?p?~??z????J???B??????_?`??T>??T???
?????@?("D?!???T?1	?????T????T?????????@?"?"N#?#N$?$N%?%N????!@????T?1	??!??T?????????????"?$@?"?"N#?#N$?$N%?%N"??$??B@????T????"@?(""D?B???T?	?1	??!??T??????B?(|??~Ӗ-???B?}-???????B????????s???K??T???B?????A??Ts??I?*m{?+??kmz???
Kk?????
????T?q?T
???R?B??}??/???jo|B@?!("?	?qa??T?! ?z-?????A??T???
???R?B??! ?z-???????T?}?o??/?
???@?Dx!NBx!E^!("!(%E^!(%?^B^!("?^!($?^!($dx!!("?^!(%?^!($!(%!("A?cx!N?^!($d^!(#!($d^c^!(#Cx!!($d^!(#!($d^!($Bx!Nc^!(#C^!("!(#C^B^!("?x!!(#C^!("!(#C^!(#?x!NB^!("b^!(#!("b^!("b^!("?1??a??T?
????T???%@|B@?!("q???T????
@?I@?	롈T?@?J@??
?!?T?@?K@?_롇T?@?L@???B?L? M??kB?@H??sB?`H?A?T??E???E??"C??"@?????&@????B/C?I#@???I'@????;C??CD??@?xq?T?5??T?
@?I@?	??sB?!?T?@?J@??
롃T?@?K@?_?!?T?@?L@???B?L? D??kB?@H?`M??T??E???E??"C??*D?B/C?L7D??;C??CD??@??qT??5??T?k*??T?B??????TɃ@???@?k}@??}@??kB??
?N?@???`
Ӛ????B?Ě0??ܚ!???B?"ÚB???B?Śp???sB?#~??B?!8??B?A???B?"~??B???cB???˱E??,??{B?1?1??B????B? ?@??B??
֚!??!|???~?hb?ja?(! j"???????Tk????Tb???B??~?A?!?	?????ϗ??B??
????????TU???	@??B?	롆T?
@??A?T?@??kB?	???T?@??a?Th
@??!?Th@????Th@??a?Th@???T?@?q?T?@?	???T?@?	?T?Ӆ???E??kB?}??}l
?Q?
?)}*?*
_k@???k???T?B?_?+??Tj?@?@@???B?*?C?,&@?ͻC??'@?Ѓ@?1?@?|@??B?!?{?N???kB??K$??)?????T3
Țe~@??????B??ښ?~@??|??|??|??|???B?????T???~@??~
??~
?????????????????T??6?s|sKS's~@??U???Ӈ????F?????%??$@|B@?("B?#?$|??A??T???v|?KV'?~@??U???V?W??????????¬Fx!NBx!gx!Ncx!?x!N?x!?x!N?x!"?"N&?&N#?#N'?'N$?$N0?0N%?%N?h!Bh!?n?h!ch!?nj!?h!?n&?1N?h!?h!?n???????????T??????T????	@??B?	?sT?
@??!sT?@??kB?	?rT?@??ArTh
@??sTh@??rTh@??ArTh@???qT?@?yq?T?@?	???T?@?	?T?Ӆ???E??kB?}??}l
?Q?
?)}*?*
_kP???k?B?H?A???Tj?@?@@???B???C??%@?ͻC??'@?~@??B?1?}?N?kB??K)??????T$
Ț?|@??????B??ؚ?|@???@??|?c~???B???@??|?s~???B??"??T???~@??~
??~
??????????????˟B?T????B???|?K'?|@?DM???ӄ??????
?b?B?!??$@xB<SB'("B&CxE|SF@S???RBB?R?2B|Sk???"$x?????T???|?K'?~@??
???4?UM???????????_@??1??G@??7????{@????/A????;A?????B?JgT??A?Ձ@???A?΁@??}??7A?????%
?????A??}??3A??????A???????Y?.?%????gA??????A????????+A?.??'A?%????cA??????A?????????@?.??A?%????_A??????A????????#A?.??A?%????[A??????A?????????@?.??A?%????WA??????A????#??'???@?.??A?%????SA??????A????+??/??A?.??A?%????A??????A????3??7??A?.??A?%????OA??????A????;?????@?.???@?%?????KA???????A????C??G??@?.???@?%?????GA???????A????K??O???@?.???@?%?????A???????A????S??W??@?.???@?%?????CA???????wA????[??_???@?.???@?%?????sA???????oA????c??g???@?.???@?%?????A???????kA????k??{??o??[?.?1?????A???????{A????s?????w?у@???A??qET???A??hn??k?=?gA??hn??g?=?A??hn??c?=?cA??hn???=?A??hn???=?_A??hn??A??hn?????[A??hn??A??hn?????WA??hn??A??hn?????SA??hn??W?=?A??hn??S?=?A??hn??O?=?A??hn??K?=?OA??hn??G?=?A??hn??C?=?KA??hn????=?A??hn??;?=?GA??hn??7?=?A??hn??3?=?A??hn??/?=?A??hn??+?=?CA??hn??'?=?wA??hn??#?=?sA??hn???=?oA??hn??o?=?A??hn???=?kA??hn???=?A??hn???=?@???=?{A??hn???=.?ǁ?????=????= ?O?
?????=?k?= ?O??=?g?= ?O??????=?c?= ?O??=??= ?O???
???=??= ?O??=??_? ?O?
?????= ?O??=??^? ?O???
???= ?O??=??]? ?O?
??
???= ?O??=?W?= ?O?
??
???=?S?= ?O??=?O?= ?O?
?????=?K?= ?O??=?G?= ?O???
???=?C?= ?O??=???= ?O?
??
???=?;?= ?O??=?7?= ?O?
??
???=?3?= ?O??=?/?= ?O?
??
???=?+?= ?O??=?'?= ?O?
??
???=?#?= ?O??=??= ?O?
??
???=?o?= ?O??=??= ?O?
??
???=??= ?O??=???= ?O?
?????=??= ?O????	??????
?_	??)?b0L??'?)???B1M??T?7?|)K??B?I	)}@??M	?J??
?
]	?J??
?iq	?)?%	??B???<8an8a.???`? NA?!N"0o#OD#N$??Nto0o?#N??Nto)?R	?r&
N?4?n?4?n??O???Nc??Nc0o?0oOO?bn`enAN`?ˉ|)K??B?I	)}@?jq	?J?J	?#
?
]	?l??J?J??
??M	?)?)??	??$@x)=S 'aD@? ( 	&*y,}S-AS???R)
)
?R?2)}S_
k????$x????Tb???T?
?a?T?kB?1~??sB?c|d?Q??$|?k??_??T?q?&T?kj??T?B????T??@???@??|@?c|@??B???{?E?@???????kB??K$??????????B?_렰?TYњ&@?Ĉ???B??ۚ?|??@?~~??|
?v~	??|
?z~??B?߀??T???|@??|??|??????????????˟??T???B????|?K??B?&?|@??y?{???????xi???
???Y?????5??&@|aF@?@? ( ?#?$|??!??T????|?Kd?|@??y?????B?{?Y?????B?f?di?????B?s??????¬x!Nx!%x!N!x!Fx!NBx!gx!Ncx!qB~?sJ?uR@?wZA? ? N?$Na?!NE?%N??"N??&N??#N??'N?h!h!?n?h!!h!?n?h!Bh!?n?h!ch!?n`??b??s????A??T???B?????T????k???T?B???+??T??@???@??|@??|@??B?$?~?
????E?@?-	??????,?{?	????kB??	K)????????B?_???T^њ?@?Ĉ???B??ʚ?|??~@?w~???B??|	???B?y~	??B??|	??B?t~	??B????bT??W??Ē
????|@??|????????|??	?)?)???B?I	??	?)?)??|?)?s?s?????????B????0S??'????0J??T?7?~)K??B?I		)}@??]	?J??B??
?
e	?J??B??
?iQ	?)??B?F	??????¬8an8a.%8an!8a.F8anB8a.g8anc8a.?@~??H??P@??XA? ? N?$Na?!NE?%N??"N??&N??#N??'N`>?a??b?c?{???s??a??T?????B???`??T?B?$˩~)K??B?I		)}@??]	?g?~?J?J?
?jQ	?J?J??
?	e	?)?)?4	??&@x)=S 'aF@? ( ?D???!??Tv???kʌ?T?B??k??T??@???@??|@?c|@??B???{?E?@??????kB??K$??????????B?_???TYњ&@?Ĉ???B??ޚ?|?s@?|~??|
?v~	??|
?z~??B?߀??Td??|@??|??|??????????????˟??T???B????|?K??B?f
?|@??q???~??????xi??????Y?????5??&@|@?aF@? ( ?D???A??T????|?K??|@??q?????B?~?Y?????B?f?di?????B?s??????¬x!Nx!%x!N!x!Fx!NBx!gx!Ncx!qB~?sJ?uR@?wZA? ? N?$Na?!NE?%N??"N??&N??#N??'N?>??????????s????a??T???B???@??T????????A
ɚ(?BȚ#~?c?)?c@?B
?!|?Ah?????7??TJ??
?!??T?????`??A
ɚ(?BȚ#~?c?)?c@?B
?!|?Ah?????7?m?TJ??
?!??T????V???)5@?)@???T? ??{I??OH??WG??_F??gE??oD??#Cm?+Bm?3Am?;?l?_ָ????????B<%?A?RxZ?????4?????????B ???RoZ????m/?????????B ???RfZ??????????????B ??R]Z??????????????B ?A?RTZ??????????????B ?ᕄRKZ?????#?????????B ?AޅRBZ?????#?????????B ??p?R9Z????%?????????B ??p?R0Z????%?????????B ??؄R'Z?????,?????????B ??K?RZ?????#?????????B ?a??RZ??????????????B ??]?RZ?????#?????????B ?aՅRZ?????,?????????B ?!H?R?Y?????#?????????B ??؄R?Y?????#?????????B ?A??R?Y????Y$?????????B ?a??R?Y?????2?????????B ??ӆR?Y????	7?????????B ??ӆR?Y????Y3?????????B ??ӆR?Y????Y3?????????B ??S?R?Y?????2?????????B ??S?R?Y????	7?????????B ?T?R?Y????I?????????B ?!T?R?Y??????????????B ?AT?R?Y?????2?????????B ?i?R?Y????Y3?????????B ?!i?R?Y????.?????????B ??Z?R|Y?????.?????????B ?!d?RsY?????#?????????B ?A"?RjY?????#?????????B ??RaY?????#?????????B ???RXY????.?????????B ?aU?ROY?????4?????????B ?a??RFY????????B<%?ᔈR@Y????????B<%?ag?R:Y????A?????????B ??^?R1Y????????B<%????R+Y????????B<%????R%Y??????????????B ?!??RY????
#?????????B ??ÇRY????9#?????????B ??ÇR
Y????????B<%??†RY????????B<%?A?R?X????????B<%??܅R?X????E+?????????B ??ՅR?X????A/?????????B ??օR?X????????B<%????R?X????E+?????????B ???R?X????????B<%??n?R?X????????B<%??Q?R?X????Y ?????????B ??G?R?X????1?????????B ??G?R?X??????????????B ?H?R?X????]-?????????B ?AH?R?X?????2?????????B ?aH?R?X????????B<%???R?X????????B<%???R?X??????????????B ???R?X????A?????????B ???R?X????????B<%???RzX????????B<%?AI?RtX????????B<%??k?RnX????????B<%?᷆RhX????????B<%???RbX?????9?????????B ?a??RYX????
:?????????B ????RPX????1:?????????B ?ᢇRGX?????:?????????B ???R>X????1;?????????B ?!??R5X?????;?????????B ????R,X?????;?????????B ????R#X??????????????B ?a??RX?????"?????????B ????RX?????>?????????B ???RX????Y?????????B ?!?R?W????-?????????B ?a?R?W????????B<%????R?W????????B<%???R?W????!>?????????B ???R?W?????=?????????B ?ŇR?W?????3?????????B ??u?R?W?????"?????????B ??u?R?W????????B<%?A\?R?W????E+?????????B ???R?W????????B<%??	?R?W????????B<%??9?R?W????????B<%????R?W????E+?????????B ?A??R?W?????*?????????B ?a??R?W????1?????????B ????R?W????????B<%??R?W?????????????B ?!?RtU??????????????B ?A?RkU??????????????B ?a?RbU????q?????????B ???RYU??????????????B ???RPU????????B<%??"?RJU????????B<%?.?RDU????????B<%?A??R>U????E+?????????B ?A??R5U????e>?????????B ??R,U?????>?????????B ?!?R#U????????B<%??3?RU????????B<%?ᐇRU?????*?????????B ?A??RU????u9?????????B ????RU????????B<%?!?R?T??????????????B ?!?R?T????A?????????B ?A?R?T??????????????B ?a??R?T????A?????????B ????R?T????"?????????B ?1?R?T????51?????????B ?!1?R?T??????????????B ??1?R?T?????"?????????B ??1?R?T????
#?????????B ??1?R?T????9#?????????B ??1?R?T????
%?????????B ??݄R?T????e'?????????B ??݄R?T?????"?????????B ??݄R?T?????1???????b?B ??X?R?T?????1?`?????b?B ??X?RxT?????0?`?????b?B ??X?RoT????1?`?????b?B ??X?RfT????"?`?????b?B ?AY?R]T??????`?????b?B ??Y?RTT????)2?`?????b?B ?AZ?RKT????Y2?`?????b?B ?aZ?RBT????"?`?????b?B ????R9T?????"?`?????b?B ?ᗄR0T?????"?`?????b?B ?A??R'T????
#?`?????b?B ?a??RT????9#?`?????b?B ????RT????e#?`?????b?B ????RT????Y ?`?????b?B ?ᘄRT????"?`?????b?B ????R?S?????"?`?????b?B ?ὄR?S????
#?`?????b?B ???R?S????9#?`?????b?B ?!??R?S????e#?`?????b?B ?a??R?S?????$?`?????b?B ????R?S????Y ?`?????b?B ????R?S?????4?`?????b?B ?!??R?S?????4?`?????b?B ?A??R?S??`???b?B<%???R?S??`???b?B<%??s?R?S????Y ?`?????b?B ?a?R?S??`???b?B<%?!??R?S??`???b?B<%???R?S??`???b?B<%??.?R?S????Y ?`?????b?B ?a?R?S?????2?`?????b?B ???RyS??????`?????b?B ???RpS?????"?`?????b?B ???RgS??`???b?B<%?D?RaS??????`?????b?B ?:?RXS????Y ?`?????b?B ?!:?ROS????Y ?`?????b?B ?!5?RFS??????`?????b?B ??=?R=S?????"?`?????b?B ?>?R4S??`???b?B<%???R.S????Y ?`?????b?B ?a"?R%S?????2?`?????b?B ??"?RS????A?`?????b?B ??#?RS?????"?`?????b?B ??#?R
S????Y ?`?????b?B ??0?RS?????"?`?????b?B ?A4?R?R?????*?`?????b?B ??"?R?R????E+?`?????b?B ?#?R?R????Y3?`?????b?B ?!??R?R?????*?`?????b?B ???R?R?????*?`?????b?B ?A?R?R????E+?`?????b?B ?a?R?R????E+?`?????b?B ??7?R?R?????*?`?????b?B ??7?R?R?????+?`?????b?B ?A8?R?R?????+?`?????b?B ?a8?R?R????
,?`?????b?B ??8?R?R????=,?`?????b?B ??8?R?R????Y3?`?????b?B ?A??R?R????E+?`?????b?B ???RzR??????`?????b?B ??e?RqR????A?`?????b?B ??e?RhR?????5?`?????b?B ???R_R????!6?`?????b?B ?!??RVR????Q6?`?????b?B ?A??RMR????y6?`?????b?B ?a??RDR?????6?`?????b?B ????R;R????A?`?????b?B ????R2R??????`?????b?B ?᳆R)R??`???b?B<%??5?R#R????}?`?????b?B ?A\?RR??????`?????b?B ?a\?RR??`???b?B<%?b?RR??????`?????b?B ???RR????A?`?????b?B ??R?Q????!5?`?????b?B ?A??R?Q????e5?`?????b?B ?a??R?Q????!5?`?????b?B ?a??R?Q????E+?`?????b?B ????R?Q??????`?????b?B ??l?R?Q??????`?????b?B ??V?R?Q????A?`?????b?B ??V?R?Q??`???b?B<%?`?R?Q?????#?`?????b?B ???R?Q????Y$?`?????b?B ?!??R?Q??`???b?B<%?aj?R?Q????]9?`?????b?B ?a|?R?Q??????`?????b?B ?a??R?Q??????`?????b?B ?ሄR?Q??????`?????b?B ???RxQ??????`?????b?B ?!v?RoQ??`???b?B<%???RiQ??`???b?B<%?Ay?RcQ??`???b?B<%??~?R]Q??`???b?B<%?A??RWQ??`???b?B<%????RQQ??`???b?B<%?A??RKQ??`???b?B<%????REQ??`???b?B<%?A??R?Q??`???b?B<%????R9Q??`???b?B<%?!??R3Q??`???b?B<%????R-Q??`???b?B<%?ᵅR'Q??`???b?B<%?!ɅR!Q??`???b?B<%?a΅RQ??`???b?B<%??ӅRQ?????#?`?????b?B ?A??RQ????Y$?`?????b?B ?a??RQ?????#?`?????b?B ?aɄR?P????Y$?`?????b?B ??ɄR?P?????#?`?????b?B ?A??R?P????Y$?`?????b?B ?a??R?P?????#?`?????b?B ?aÄR?P????Y$?`?????b?B ??ÄR?P???!T`???b?B<%?Af?R?P?????2?`?????b?B ?AI?R?P????Y ?`?????b?B ??I?R?P????)2?`?????b?B ?!J?R?P????Y2?`?????b?B ?AJ?R?P????
,?`?????b?B ?aJ?R?P?????1?`?????b?B ??J?R?P????1?`?????b?B ??J?R?P?????1?`?????b?B ??J?R}P????A?`?????b?B ?!K?RtP??????`?????b?B ??K?RkP??`???b?B<%?ag?ReP??`???b?B<%?A??R_P??`???b?B<%??քRYP??`???b?B<%????RSP??`???b?B<%?A??RMP????? ?`?????b?B ????RDP????9!?`?????b?B ???R;P?????!?`?????b?B ?!??R2P??`???b?B<%????R,P??`???b?B<%?A??R&P??`???b?B<%????R P?????`?????b?B ?A??RP????}?`?????b?B ????RP??????`?????b?B ????RP??`???b?B<%???R?O??????`?????b?B ?A??R?O????A?`?????b?B ?a??R?O??`???b?B<%?!фR?O?????`?????b?B ?!??R?O????}?`?????b?B ?a??R?O??????`?????b?B ????R?O??`???b?B<%??҄R?O????? ?`?????b?B ?A˄R?O????9!?`?????b?B ??˄R?O?????!?`?????b?B ??˄R?O??????`?????b?B ??m?R?O????A?`?????b?B ?n?R?O????? ?`?????b?B ????R?O??????`?????b?B ?!??R?O?????`?????b?B ?!x?R~O??????`?????b?B ??w?RuO?????`?????b?B ?!??RlO????}?`?????b?B ?a??RcO??????`?????b?B ????RZO????? ?`?????b?B ?AńRQO????9!?`?????b?B ??ńRHO?????!?`?????b?B ??ńR?O????9!?`?????b?B ????R6O?????!?`?????b?B ???R-O??`???b?B<%????R'O????}?`?????b?B ?Ax?RO??????`?????b?B ??x?RO??`???b?B<%?!~?RO???J?J?N?QtSlU?x '?UW?X8(?)dyZ,[?[L^?z8*?|?-d2?6tc?=@?Л?A?C?P?P?P?Px?8E?~??tTk?Fl????$?m?p??q8????	HqH?X ???l?????`?Ȗ?C@?@??8??9??G?@??т?R?????O??#???a?!)?[W??`??G@?@?H?RP?P???$?%?C@?@?@?C???R???ҺO??#???a?!)?EW??@??@??#@? ?'@?$???a?!?7?9W??@??@??@??@????RP?P???@??3????	 ?@?
A?"
? ?`@?bA?@?<@?<@?<@?<X?8??#F? 
??/@?
 ??D?
 ??C?
 
??@?l??
@?y7??w@?H7
@?h?R?r%ʚ??9@?@??6%??
@?h?R?r%ʚK7?????RH!?@?@?,??	Ț	?????RH!?
@?@??ш!??A??ш!??ш!?@??ш!?????9@?@?k?6??k???RJ-?J
@?@?k?j)??????9@?@?h??+???a?!?+?kz??ҨZ???)5@?)@???AT???{S??OR??WQ??_P??gO??oN????_?'z?h??;?`?????b?B ?a?R?G?????g??_??W??O??{??????a?!?.? ?R?G??h@???a?!,/? ?R?G??h@?????qKT??w??0?x?0?y?90?t??f/?
-A?@?Q@??zh??'??3??+? ?R???G????h????JTh
@?yv?
QB9????7	M@???)?????h
@???a?!0? ?R?G??h
@?q?T??t??V0?h@?yv?	)A?Q@??zk?!??????? ?R???G????h
????+??Ta?!?0? ?R?{G??OF??WE??_D??gC????G?????o??g	??_
??W??O??{
??C?????????5@?@????a?!?1????y?O????#?`??1???R"?R???y?`??1?A?R"?R???y?`?2??R"?R???y??@???)??q???+?T??w???2?x?c#??????{#?|??s4??	?
Q@?h{h?????a?!?4??y?9??+@?H????*TI	@?3yy?q+T?**@?JM@?_?`??T)!??A??ThRB9H7hN@???V??@?q?T?
@?*@?_?`T+?R???T,yj?K???A??T_??
T?
?R??y?L?R???r??R??r??(??R???r??R??y??R(??r?k??k?????vy?i"D9h@?)4???q?T	?R}	??jh?h"??'???a?!?3?gy?h@??T???q?T	?R}	??jh?????a?!?3?Xy?h@??Ti@???Th&A?jR@?j{j??+??#???a?!4?Iy?hN@????i*A?kR@?k{k???????????=y?hN@?????`? 5???R"?R??Jy??????R??yh??2?@??7?????	?I	@??q?T??.?R?m?r8?Rz?Z?6?{?{?6?s?R?r|???6? ?R??y?.?R?m?r`? 5???R"?R??&y????+@?I	???	?
TH@?yv??k???9???#???a?!L5?y??"D9?@??4i?)a#??q?T	?R}	??jh??"??'???a?!?3?i?)a#??q?T	?R}	??jh?????a?!?3??x??&A???????a?!\6??x??&A?(}??*B?}	?}
??L??T?@????`??6???R"?R???x??&A?(}??*B?}	?}
?????T??9??-??T?@?yq?T#?	r?Tj@T?????S???"???????x??????Q?????????x?`?R???x??&A?(}??*B?}	?}
?	???M??T??A?R"?R???x??&A??.B?(}?}
?}????H@?qK
T	??z?Z0???{?
?????
?????
???9?
???ֆ	??D?)?H?????T??H	@??'?yi?
???ҟ???k?k0?i??_?
??k?????-???c??????????????fx????*???T?hR@?h??????c??Rb?B?6??x?hR@??+@?I@??q???TK	@????	??@?NM@???T?!???A??T
??l@??M@??????Tk!?)?A??T???I	@??q+T??v???6?5?R?c??R[?R<?R????
?s??+@?H	???*TH@?ys?(S@??????c??R???x?(S@?i?)0?????????????x?(W@??????c??R???x?(W@?i?)0?????????????
x?([@??????c??R???x?([@?i?)0??????????????w?(_@??h?R???c??R???x?(_@?i?)0??????????????w?(c@????R???c??R??qx?(c@?i?)0??????????????w?(g@????R???c??R??`x?(g@?i?)0??????????????w?(k@????R???c??R??Ox?(k@?i?)0??????????????w?(o@????R???c??R??>x?(o@?i?)0??????????????w?(s@??????c??R??.x?(s@?i?)0??????????????w?(w@?h??????c??R??x?(w@?i?)0??????????????w?T??`?7?A?R"?R???w???vw??#@??'?h??7??'?a?!7? ?R&E????Z???)5@?)@???AT?{M??OL??WK??_J??gI??oH?????_?h??1?`?????b?B ?'?R?D??+w?qT?5?	?R	?	? ?@?	??????????	
?) ?R	Ay	? ?@?A?	? ?@???I?R	5?	? ??=??<	? ?@?%??o??9??_??oA?<??<??<)?R	?
?R
?
?@?@?	????R??r

?* ?R
Ay	%?	? ?@?A???R	]?	? ??=?=??ҩ??)??	9??_??C??W??O??{???????????5@?@??? ?6 ?@@?BA?#??<"??@????:H-?2I-?*@??C?=?Z@??#??@??q+
T?R?Ҫ
@??
?l?9?9?=A??}??1B??}??A?J!?)?TL@??QB9m?6? qK??Th?=?@?????B?B ?!??R?B???ZC)?"@??BB??c?=?.@???K)?7??f@??{??*M-?>N-?~@???)Q?z@??q?Tx?R.`! ?BT`!*iBT?@?_qkT?R	?R?
@??
?k!?J?Tm@??QB9n?6? qjNT??4???@??@?~?!@??}?)@??%
????R?	???R???F@???T?r?!@???@?T?~@????b:T????/?A??N@?.pJ???#???@?u??????R?M??k) sq???T?	+?@?@??@???@???H?@???@?	
?(???(?@?@??@?@??@??HAB9h4_??_A9?7A?q?T???
?R???@	-?[??@??@??#A??"?s?.
8.?{?=+&???)?|??g?ɂ??_??
???	8)?k?????S??K??A??A?8?R? ????? ??yr??????Ryr???@?J8?R?7A?_k??@???TH?)?@?(???????Rjr?fr?! .M	T?@?_??T_A??T	???/2?/8?/?g@??_@?!	?#¬!?!nB?"nc?#n??$n%xaN?^!xa'^PxaN^BxaR^sxaNt^cxau^?xaN?^?xa?^(a(g(e(f(b(r(p(q(c(u(s(t(d(x(v(wA?!??T?g@???_? TH	??
	?!E@?!!!?"(a?a??T?a?s@? a.?T?s@? `@b?c???A??@??@??!^?A aA ?r?	@ ??A?aA ?r??A?qKT??????@?!(.b8)!"`8 ` ??????9???`	T?zy?H'A?(}?J/B?}
?}???(?RՈ_?i?R(????R(?????T????A??A?	k?[A??/A?!  .(8 ????~??@?8??@?4????kA??SA??KA??cA?????M??h?~ӡjh??	!?jh?C	!B	?j(?kh?!!a	!Ak(??jh???A?a!!?!?)!B@!??A?b"A!?????M??{??A??T??????\??
?????@?Q@??J???R
?/ @???@?J) Z?A?_k`T?????????@????????G9h?5?N@?.OI???#???@?T????A?q?T????s???T?zs??&A?(}??*B?}	?}
?????T???
??N@????L??h?~?!kh? k(?{?????T???????@??@?	?R??J??)	?i
@??
@?k@?_?T?@??	?aTJ
˚I}	??@?_?T?@?	?aTI}	??@?_?T?"@?	?TI}	??@?_?T?&@?_	?Tyq??T?*??kI:??jyhx)	
? ֨?@?@????yqH?T??@??*???Q9?????yhxJ	?@? @}@???? @?	(@y @= @}??@?@??!^?????@?@}@??????@?@y=S'|????@?@=???!^v????@?@}??!^q???	*?@????@?ԡ~! ?C?=  "$T?kA??#A??@?
???@???@?h
??	}@??kTAyh?!8 ! !? ??@?  "?T@y(???@?q?@?+??T!?@?   ???T(?@?(????@?
k??T?R?@?	??j	?J???@??	?k!?a	-c?,!!B"c#?$(!("(#($J????T	?????@?H	?E@? )???T?q+T??I???o?o?o?o%???%N??&N%¬??%N??&NA????T??"Na?!NA?!N!?!n!?0~?!?kT'?o!?!n!?0~?!?k*T?~@????bT???@?	??j	?J?K?k!?b
-d?,B"c#?$?%!("!(#!($!(%J????T????H?E@?A)???T!?!.H"   )??T?BB9?	4?@?H???"??q+T????@?)???o?o?o?o$???$N??%N$¬??$N??%NA????Ta?!N@? N ? N? n?0~?k?T(?o? n?0~?kjT?~@????bT???@?	??j	?J???@??	?k!?a	-c?,!!B"c#?$(!("(#($J????T	?????@?H	?E@? )???T?!.  ?&?????=???=?B9????@????~@?Q`A!?;??c?=&???{A?qşQ????Cq?'??@???@??????'??o|?????_??'??@???+?k????
???'???@??˟??'?		*??	
*?{?	*?O?*?k?????;?Ɂ????H???
???????????~~?	???	???J	????	???????J??+??U?O??`??C	?d	?h??#?.?c????
??	???!????????@?!?R??$?R???p??H??I??J??@??c@???@?????R?&??q+T?@?h6	???o@??;@??@??
¬ ??"
??JA?a??T?@??
??@?_?T?@?	?*?~??@?)
???@?j
?@E@? E????T?{@?h6	???s@??3@??@??
¬ ??"
??JA?a??T?@??
??@?_?@T?@?	?*?~ө
?J
?@E@? E????T?&A?  ?T?q?T???o???s@??o?o?oE?'A???%N?&NE¬'A¬??%N?&NA?????T??"Na?!NA?!N!?!n!?0~?kkTBl???G9?4??o!?!n!?0~?k*T?@?bT??+?@??V?
?¬&?0E¬B?&nF^R^S^c?'ng^t^u^??0n?^?^?^??1n?^?^?^!("!(3!(2!(&!(#!(5!(4!('!($!(7!(6!(0!(%!(9!(8!(1JA?a??T?W?h??	?*?~???@?)
?J
?BE@?#E@?A???T(  ?
T????G9h?5????7???qT???o?o@??o?o?o$???$N??%N$¬??$N??%NA????Ta?!N@? N ? N? n?0~?k?T?o? n?0~?k?T?/@???E@? )???T?qT???o?s@??o?o?o%???%N??&N%¬??%N??&NA????T??"Na?!NA?!N!?!n!?0~?k?T?o!?!n!?0~?k?T?+@???E@?A)???T?!!?!H(   )ɄT?@????.A?(
??}@??	k?@??T yh?8//?  -?T/y(??@?q+T?"A??! ?)T?"??6?R?#??RH	!m	!?;@?!"?'??q?T?O@?h6	???;@??o@??@??
¬ ??"
??JA?a??T?@??
??@?_?T?@?	?*?~???@?)
??@?j
?@E@? E????T?&A??q?T???o@???A?<"
?"?O"?j????8??7_wqT(?R!?i	?R	j?T??????ҟ??h@?}?	ۚ_?qHT??*??JA;??Lii8k	?`??~Ө?~????@?!????i?h???`T"_KqT_Wqa??T@?R3?????h@?}?	ۚ?#A?	??_???????
 ?R&?????h@?}?	ۚ?#A?	??_??????????h???! T???{G??OF??WE??_D??gC??oB????_??KT??T	????#A?	?a_?????9??????#A?	?a_?????e??????#A?	?a_????????????#A?	?a_???????????#A?	?a_?????Y??????#A?	?a_??????Y?????#A?	?a_?????ch?????#A?	?a_?????t?????#A?	?a_?????΅?????#A?	?a_???????????#A?	?a_?????*??????#A?	?a_????????????#A?	?a_??????
?????#A?	?a_???????????#A?	?a_???????????#A?	?a_???????~???#A?	?a_??????w???TA?cT?@??	???	??		??"T?	?_	??T	??
	?+?~?k	??@???)??)??	?,?R?r???RnE@??y?}S?AS??
?}S2?k?1?.%xJ???TO?#A?	?a_??????[?H???#A?	?a_?????o\?A???#A?	?a_??????\?:???#A?	?a_???????3???#A?	?a_?????!??,??	?{???J???@?k	?k??	?`~?!h!h! na	?Bh!!h!Anb
@?ch!Bh!bncA??h!ch!?n@??B
??k??????T	??T
	?+??k???)?~?)	??@??	? E@??#`%|J???T??h??? ??TH??;?@?????B?B ?a??R?5??	?}?,?R?r?
N!O??O?	?C???0o?!N???Ntog0o?!Np??Nto4?n4?nƄ?N??N0o?0oOO?engncDNc??ng???cg??????Ҩ?Z???)5@?)@???a1T???{M??OL??WK??_J??gI??oH?????_?A?!??@?R5???`@????R'g?X???`??R??z@??R?k?c?????!?	??Rvg??#???????4C???!?R??R??Ag??'@???'??T?@?q?'??R?'@?	@?	4???@?Z
???!?R?R??+g?9? ???	@???Z#??	??Th?7?R??Z#??	?c??T?'??6??!?R??R??g?7??'??aT?!?R?R??
g???'? ????R@?q?ET	;@???qHFT4?@?)@??C?q`T	@?	C?	q?T	@??B?
q`T@?B?
?A??	Ț?
??DT	@??	ɚH}??iET
@??	ʚ(}?_??ET????IR	*?7@?h@?!?9?R?@???]g??4???'?
?b?9???7?6??h@??@?)a?????c??T?Ry?h
@?q?T??}@?h@?!?X????Ra@????g?4??{??_?!??Th?9@?@?H??2??H??? ?????"?B ??ȊR52????Ҽ?? ???B?B?????R-2??H?U
? ?????"?B ??ƊR$2?????ҫ??@c????g?aH?????????? ???B?B?????R2?????W???O??{??????@???h
@???????h@??????h
@??????#??T`@?vd?`@?`?h@?????R???b???Ti@? iu?@???gd?h@?????_?`@?bd????{B??OA??Wè]d?C??_??W??O??{??????????|???!?R?R??Kd?h@??h??@???T????!?Rd??????"?AT!?R????9d?h@??h?????{D??OC??WB??_A??C??_?h?9@?@???I?)
??#?A?!??d??R?{D??OC??WB??_A??C??_????I?)???#?A?!0?`?R?1?? ???"?B<%??8?R?1???W???O??{????@?q?T????}@?@?!??@????d??4s??????!??T????{B??OA??Wè?_?????{??C???7@?kmT@?	?R( ??	@??q?T@??{A?????_?H??? ?????"?B ?!
?Re1??H??? ?????"?B ?A
?R\1???W???O??{??????@?@??c?h@?!q?T`@? ??c?h@?%q?T`@?`?h@?!q?Th@?h????R???B???bTi@? iu?@????c?h@?????{B??OA??Wè?_?`@??{B??OA??Wè?c???Y`??_?@??_?@??_?@??_? @??_?@??_?????{??C?a?7@?k
T@?	?R( ??@??{A?????_?H??? ?????"?B ???R	1??????{??C?a?7@?k
T@?	?R( ??@??{A?????_?H??? ?????"?B ?A?R?0??????{??C???7@?kmT@?	?R( ??	@??%q?T@??{A?????_?H??? ?????"?B ???R?0??H??? ?????"?B ??R?0??????{??C???7@?kmT@?	?R( ??	@??%q?T@??{A?????_?H??? ?????"?B ???R?0??H??? ?????"?B ???R?0??????{??C??7@?k?T@?	?R( ??	@??%qT@??"?@??{A?????_?H??? ?????"?B ?a?R?0??H??? ?????"?B ???R?0??????{??C???7@?kmT@?	?R( ??	@??%q?T!@??{A?????_?H??? ?????"?B ?a	?Rm0??H??? ?????"?B ??	?Rd0??????{??C???7@?kMT@?	?R( ??	@??5a@9?{A?????_?H??? ?????"?B ?!
?RK0??H?5? ?????"?B ?A
?RB0??????{??C???7@?kmT@?	?R( ??	@??q?Ta?9?{A?????_?H??? ?????"?B ??
?R(0??H??? ?????"?B ??R0??????{??C???7@?kmT@?	?R( ??	@??	q?T1@y?{A?????_?H??? ?????"?B ???R0??H?q? ?????"?B ???R?/??????{??C???7@?kmT@?	?R( ??	@??
q?T1?y?{A?????_?H??? ?????"?B ?a?R?/??H?? ?????"?B ???R?/??????{??C???7@?kmT@?	?R( ??	@??q?T@??{A?????_?H??? ?????"?B ??
?R?/??H?Y	? ?????"?B ??R?/??????{??C???7@?kmT@?	?R( ??	@??q?T@??{A?????_?H??? ?????"?B ???R?/??H??	? ?????"?B ???R?/??????{??C???7@?kmT@?	?R( ??	@??)q?T
@??{A?????_?H??? ?????"?B ?a?Ry/??H??
? ?????"?B ???Rp/??????{??C???7@?kmT@?	?R( ??	@??-q?T
@??{A?????_?H??? ?????"?B ?!?RV/??H?E? ?????"?B ?A?RM/??????{??C???7@?kmT@?	?R( ??	@??1q?T
@??{A?????_?H??? ?????"?B ???R3/??H??? ?????"?B ??R*/??????{??C???7@?kmT@?	?R( ??	@??q?Ta@9?{A?????_?H??? ?????"?B ???R/??H??? ?????"?B ???R/??????{??C???7@?kmT@?	?R( ??	@??!q?T@??{A?????_?H??? ?????"?B ?a?R?.??H?)
? ?????"?B ???R?.??????{??C??7@?k?T@?	?R( ??	@??!qT?%q?Ta??{A?????_?H??? ?????"?B ?!?R?.??H?m? ?????"?B ?a?R?.??H??
? ?????"?B ?A?R?.??@??_??W???O??{????@?q?T????}@?@?!??@????a??4s??b???!??T????{B??OA??Wè?_?@?	?R( )?@??_?@?	?R( )?!@??_?@?	?R( )?9@??_??g???_??W??O??{???@?q?T??????}@?@??"?!@???va?`4??9???!??T?{D??OC??WB??_A??gŨ?_?V??7?~@??R]?????k?T???~@?)?6?)?|?j@?J	?@?A?@?@?=@	?=)??q??T`@??~4?Ha?h
@??h??{D??OC??WB??_A??gŨ?_??g???_??W??O??{?????????PA?}@?q?T???R?jy???9a??4?9????!??Tx?7@???R}9???a???????0a??~@??R9?????%a????
@???
??RS(??a9?{D??OC??WB??_A??gŨ?_??g???_??W??O??{?????????PA?}@?q?T???R?jy???a??4?9????!??Tx?7@???R}9????`????????`??~@??R9??????`????
@???
??RS(?)?R	?a9?{D??OC??WB??_A??gŨ?_??g???_??W??O??{?????????PA?}@?q?T???R?jy????`??4?9????!??Tx?7@???R}9????`????????`??~@??R9??????`????
@???
??RS(?I?R	?1y?{D??OC??WB??_A??gŨ?_??g???_??W??O??{?????????PA?}@?q?T???R?jy????`??4?9????!??Tx?7@???R}9???x`????????`??~@??R9?????~`????
@???
??RS(?i?R	?1y?{D??OC??WB??_A??gŨ?_??g???_??W??O??{?????????PA?}@?q?T???R?jy???Z`??4?9????!??Tx?7@???R}9???@`???????Q`??~@??R9?????F`????
@???
??RS(???R	???{D??OC??WB??_A??gŨ?_??g???_??W??O??{?????????PA?}@?q?T???R?jy???"`??4?9????!??Tx?7@???R}9???`???????`??~@??R9?????`????
@???
??RS(???R	???{D??OC??WB??_A??gŨ?_??#?m?_??W??O??{???@ ????LA?}@?q?T???Rajx????_??4??????!??Tw?7?~@???R}8????_????????_??~@??N8??????_????
@???
??R?N(???R	???{D??OC??WB??_A??#?l?_??g???_??W??O??{?????????PA?}@?q?T???R?jy????_??4?9????!??Tx?7@???R}9????_????????_??~@??R9??????_????
@???
??RS(?I?R	?
??{D??OC??WB??_A??gŨ?_??g???_??W??O??{?????????PA?}@?q?T???R?jy???z_??4?9????!??Tx?7@???R}9???`_???????q_??~@??R9?????f_????
@???
??RS(?i?R	?
??{D??OC??WB??_A??gŨ?_??#?m?_??W??O??{???@`????LA?}@?q?T???Rajx???B_??4??????!??Tw?7?~@???R}8???(_???????9_??~@??N8?????._????
@???
??R?N(???R	?
??{D??OC??WB??_A??#?l?_??g???_??W??O??{?????????PA?}@?q?T???R?jy???
_??4?9????!??Tx?7@???R}9????^???????_??~@??R9??????^????
@???
??RS(???R	?a9?{D??OC??WB??_A??gŨ?_??g???_??W??O??{?????????TA?}@?q?T???R?jy????^??4?9????!??Tx?7@???R}9????^???`????^??~@??V9??????^???h
@??h
???|ӵ??R?????^??????^?h@????{D??OC??WB??_A??gŨ?_?????o??g??_??W??O??{??????????????\A?}@?q?T???R?j{????^??4Z?{????!??Tz?7Z@?(?R};???t^????????^?:@?9_;? ???z^? ??
@???
?H??|???)?R	???~@??@????6qBT??a?Yv??&qT?4?????]??c????g?aH???????A?!0?`?Rq+?? ???"?B<%??8?RN+??A?!??@?Rg+???҈@????@??@?????{F??OE??WD??_C??gB??oA?????]H?U
? ?????"?B ??ƊR0+??????g??_??W??O??{??C?????????XA?}@?q?T???R?jz???^??49?Z???!??Ty?79@??R}:????]???????^?@?[:????^???
@???
?(??|???)?R	?	?R	??~@??@???U4?R6]????@????q+T?҈@???~|??@??t?@????]?????]???B?????TA?!??@?R?*???@????{E??OD??WC??_B??gA?????_????I?)???#?A?!0?`?R?*?? ???"?B<%??8?R?*??????o??g??_??W??O??{????(@?h?????????9U????&???h7?"???
7v
A??A?iB??k?Th2H9?5???&A?)?o?j
A?K!?k??k7K%?k??7J?@?k
B?_kTj2H9_q??qI??Tk
A?kA?lB??k맟k29j
?qI?bT? ??j2H9*??4??yU??????6??rU??&?????6????]U????h2H9?4?;?h2H9H5?????cU?h2H9(4??bU?h2H9???429??1g???????i
A?)A?jB?h
?_	k觟h29???T????=U?h2H9H??5h
A?	!?)????7	%?)??i?7?@?i
B?	k!??Th2H9???4??????{E??OD??WC??_B?????_ֈ4<?C??o??g??_??W??O??{???.P@??@?3@?_k?;8?AT'LA?h~?;B?}?	}??!A?}??1B????k}
??#?k}????T?=C??!@??;??%@???4C?#DD?K?k???RJ-?N
@?K@??DN?aT
˚J}??
??T?
?T?}???@????T?;@???T?3G??}??#@???T?@???T??N?AT?˚?}????T??aT?|??T
??Tm|???
T?
?@
T???	(@))}@?
?Q?
?*},?I?k)????S?????!T_?N??T?#@??˾T??@??k?T_	k*?T?Ҕ~?(}@?
˨??}
??|
???w???X???????O?????????Z??@??Ȃ@????lT??S@????Y?{?s???T??;@???9???@??a??T??Y?k??@???V????W??O@?9??#@????T?

+4_yqDT_q??T*,A?h}
?,4B?}?}
??EA??aB??~?I|?)}?	??T?eC??!@?????%@??O?)8C?/@D?@)c|@?%?Q???|??k???D?????Re??@??@?_?$F?!TG
Ě?|??T??aT?}???T???T?}???@?T??Tq?ST?5?k?T??+?T?kȺA?˯T?????????@??~?????@?1?1~???6???X? ?@??X?'?@???4?	??V???O@???X??????뀬T?Ҵ????y????? ??T??W?Z?_
??+Ts?[?<??
???????????<???B??c??!??Z
?_
?*??T???Y?????@	?`?@?%|??@}@?h%?@?e?D?1??
????????????1??????????U??1??
?c?????B??!????s?a??T??{?????T?W?Z?_
???Ts?[?<??
???????????<???B??c??!??Z
?_
?*??T?????N????G????aT?˚k}??T??T?|???T??W????T??W?k}?????T?뀒T?#@??+?T??@??˝T_	k?A?k?T??????????J}@?
?)}@??C?	?}????/??}
?????#C????@????#@??뀚T???
???F?J??3@?????@?_???T?+@?z?_??7?+T????
?_????????????
?????5????Z?_?*??T?3??/@??_	?????X??@????w??@?H#??"??#	??? ??Z?????4S?????????v??Y?H??????????_??????????????J??????????:?????????Y???9????T?_I?)??S@????cH?????T?'@?K??k??T????
?_????????????
?????5????k??*??T???*,A?h}
?,4B?}?}
??EA??=B????"}?I|??K?)}?	끏T?aC??!@????%@??G?)8C?/@D?@)c|@?$?Q??w| ??k??@????R`?@?@?_?$D???!TE
Ú?|??T??aT?}???T???T?}????T???T???H4qYTzq??T?K@??+?T??Y??˄T?k?Z??A?K?T?C???????????|@??Z?|?&@?1?1~??	??????R???R?kx?	?GH????@????K@??C????T????????w???Y?????Y?????T?S@????
렃?+Td?G?4??
????????????4????B?????!???
??
?*??T??????V????Z?Y?@??@??	?`?@?%|?9k|?7{1S12;CS999S?k1??h%x??`?E?7??
????????????7?????????Y??7???
?c????B??!??????!??T????????A??T?O@????
????Td?G?4??
????????????4????B?????!???
??
?*??T???*,A?h}
?,4B?}?}
??EA??aB??~?I|?)}?	?wT?eC??%D??C?)8C?/@D?@)c|@?%?Q???|?;?$?k??????DЄ???Re??@??@?_?$F????!TG
Ě?|??T??aT?}???T???T?}???@hT?hTzq?PTq?Tst5?klT??+lT?G??k??A??kT????????????;@?|@??~??????@?|@?1?1~?????X? ?@??X?'?@???3?	??V???C@???X?s?????hT?ҳ????y??s?? ??T??W?Z?_
??+Tv?[?<??
???????????<????B??c??!??Z
?_
?*??T???Y?????T	?tP?TP?%|??@y?<S?j%?D?e?T?1??
????????????1??????????@??1???
?c?????B??!??????a??T??{?????T?W?Z?_
???Tv?[?<??
???????????<????B??c??!??Z
?_
?*??T?????\T??\T?kȺA?+\T?K??????????@??~?????@??? ?|??S??? ???X??I????G@????K??? YT???G????y?????W???????T??V?Z?_
??+Tt?[?<??
???????????<????B??c??!??Z
?_
?*??T??????W????????X? ?@?@	?`?@?%|?d?@??h~xh%x@?d?E?'??????????????'??????????U??'???c?????B??!??????A??T????{??Z?????T?S@?Z?_
????Tt?[?<??
???????????<????B??c??!??Z
?_
?*??T?????LT??LT?G??k??A?+LT????????????;@?|@??~??????@?|@?1?1~?????X? ?@??X?'?@???3?	??V???C@???X?s?????HT?ҳ????y??s?? ??T??W?Z?_
??+Tt?[?<??
???????????<????B??c??!??Z
?_
?*??T???Y?????@	?`?@?%|??@y?<S?'?#h%|@?d?E?1??
????????????1??????????V??1??
?c?????B??!??????!??T??{???a??T?W?Z?_
?k??Tt?[?<??
???????????<????B??c??!??Z
?_
?*??T????K@???<T??Y??<T?k?Z??A?<T???????????~@??Z?|????&@?1?1~???6?????X?
??V????G@??S@????K@???????8T???S???W?{?
?Ts??Y?????Y??`??T??W?{?
?+Tt?W?9??
????????????9????B?????!??{
?
?*??T???????Z???X??@?yg	?yd?Yd?>|???@?ht? k>?`?y?^?'??
????????????'??????????E??'??
?c??;??B??!??????A??TZ?????_?A??T?W?{?
?K??Tt?W?9??
????????????9????B?????!??{
?
?*??T????K@??,T??Y??+,T?k?Z??A??+T?????????҄|@??Z?|????&@?1?1~???6???X??@??X??@???O??Z?
??V????G@???X?{??K@???????'T?һ????W????
?T???Y?{???Y???`??T??W????
?+Tt?W?9??
????????????9????B?????!???
˟
?*??T?????????	?yd?Yd? |??@??# k |??y?S?%??
???????????%???????s??D??%??
?c??<??B??!??????a??TZ???_???T?W????
???Tt?W?9??
????????????9????B?????!???
??
?*??T????+T???T?G??k??A?kT?O??????????;@?|@??~??????@?|@??? ?|??S??? ???X??I????C@????O??? T???K????y?????W???????T??V?Z?_
??+Ts?[?<??
???????????<???B??c??!??Z
?_
?*??T??????W????????X? ?@?@	?`?@?%|???@??h~xh%x@?d?E?'??????????????'??????????V??'???c?????B??!????s?A??T????{??Z?????T?S@?Z?_
????Ts?[?<??
???????????<???B??c??!??Z
?_
?*??T???4?@??}?_??!T?#@??KT??@???
T_	k?
T??J}@??~
???9?)}@?	?}?5
??}
???X??ҹ??Z?|?????Ȃ@???????N????S@?{?????T??Z??;@?9???@?_???T?'y?)??@?9??#@??????A??T+	?#T??4q??Tzq??T?KT??T????Ҵ?өX?5?@??+G?)}@?J}@?+	?k
?K|??~	???,
ˌ}???k???S?J	?)	??+7???X??	?a&TSb4q?s??pT?+T????T???????өX?5?@??@??@?+	?k
?K|??~	???,
ˌ}???k???S?J	?)	??+7???X??S@?	???v?J??O@?k	???6?_??sE???T?k???T
?ҺW????Y?	?????W?h?@??????bN???{?????T?X?????y?J?Z	?_???T?????S??;T???sQ4(??h??h??%Ӛ7?K@???T??Y???T
????@???y?J
Ú[}	??X??e??f
?g?s?Z????T????T????`&@|@? y5???Z?a??T???(??h??h??%Ӛ?7??T??ˎT
???Ҫ@???
@??B?k}?U	??Ě?}	??X?)?@????@??~??K??@?)ˉ~	??G?)???)ˌ~??}	?????{?????K?c?I	???E????:?S??.??@???6?)
??S?J
?
?@?	??7D????O@??OC?s	?J	?Z	????sE??T?k?7??O?*??T???T߂?BT
???C??K@?	?????@??ҩ?x?)?@?)? yh|@??z(????a??TA??????Z?????{?s????X??a??T?#H?h?J???Y?Z	?_????T???	???C??K@?	??c@??Z??Y?a??????????Z?{q!??T?#H?H?)??????T??????
?
?#H?h?????Y???F?s	?Z	???@??T?C??K@?	??????@??Y???????Z?????{???s?Z??X?????T??X??@?	??/w? ?"
¬x!x!N%x!!x!NFx!Bx!Ngx!cx!ND>?E??F	?G
?J?k????T??W??	?`??T??S@???V?%@|@? E?J???T????wT??KwT	???ҪX?J?@??7G?k}@??~??}@?.
??}?/??
?O|?0??)??C@????tT?GG??k
??T?????T?ҡ?X?!?@?!???????????@yFy x?????a??Tc?B?
???T?1?!?????T????pT??kpT	???ҪX?J?@??7G?k}@??~??}@?.
??}?/??
?O|?0??)??C@?????mT?GG??k
??T?????T?ҡ?X?!?@?!???????????@y?<S?'?#@y |???????Tc?B?
?A??T?1?!???A??T????K@???KiT??Y????hT?k?hT	???ҪX?J?@????~@??Z??}?-@?.
??}?/??
?O|???R???R?Z???X?c?)??G@???K@???@eT????T????c?????????3?@?sjf?tzv~S?2wBSsss~S?kӂ?Sy#xc?????!??T?????
?a??Tc?!??Y?B???Y???!??T????K@???K`T??Y????_T????ҩX?*?@????~@??Z?t}?-@?)
?<}?)?)
?I|	??;?b?~?	????~??,	??O?#	?D?e@?i?B?}	?+
??C?'?}ө˺?7???6??;@??	???@????G@?1	???I?k	??O?c	?!	??C@?k	????K@??	?YT?k???T?Z??X?M??T&?@??T	??v?)??Y?????Y?????T?????X?k?????@??T?iq??#@y+|???T?ia??#O??}
?aTk	?????ic??#?	}k
?????T?
T?????O@??	????????	???????????)??????jt??it??ht??jt??#!?#B?#c?#??|??|?}?}???#???!??TZ???????????_
???T??v?6?k??Y??	?	?s	?{	???Y?	뺃W?a??T???	??????????????@??#@y,|?????A??T?????
???T??)??Y?k???Y???A??Ts???????O@??	??????C@????????????	??????Қ??????it??jt??kt?cit??#!?#B?#c?#@?|A?|B}C}??Z#??!??T????@??#@y7|?????A??T????k????????
???T??v??????Y???)?s?{?????Y??뺃W???T1???+AT???@T???ҨX?	?@??;@?}@??~???@?}@?*?M}?*?J?.	?(????6?J|
??????{?!???????W????Z????C@??Y?1??X????<T?#G?_k??????
??T?????T??X??@????T
?ҏ????????????$@x?<S&y1?1???a??TB??_???T<
?J???_???T??????C@?
}??W?
???V?
??????
?????Y?B???????T??j??
??
?????????J?s?????_?`??T1?`???Q?????~???>???"2H?cT??????/????¬8a.8an%8a.!8anF8a.B8ang8a.c8an?>?????	??
???????T?????????T?????˞????'@x=S(y/????a??T?????-T??-T?????/G?)}@??~	?k}@?,ˌ}?-	???M|
?.	??X??@???{?????????
???C@??!??@*T?G?k???T????T??X?E?@????BT?ң??
????	??????$@x?>S?'?#?y$|??s?!??T??????a??T??B?c?_?a??T??????C@?c8?c???????B???Y?????_?`??T??t??
??????	?Z???s???_???T?E??F	?G
?J?k????T?K@??	??	???T?ҩ??
?k??%@xk=SKE?)???T????{T??OS??WR??_Q??gP??oO??C??_??u?????????B ?!V?R?????????B<%?k?R????u?????????B ?!?R????u?????????B ?/?R????u?????????B ?!?R?????????B<%???R?????????B<%??T?R?????????B<%??-?R????%?????????B ??ރR?????????B<%??7?R?????????B<%?A?R?????????B<%???R?????????B<%?a??R?????????B<%??R?????????B<%?!?R???????#m?_??W??O??{??C?5T????7@ ????8P@?\@i?@?`?@???T?4?@?	A?*q?Tnh>A??}?dFB?)}?)}?CA?
~?7B?J}?J}
??
?Tk@?	?R#?c??i
	?*
@?,@??Ti@??
?aT	
̚%}
???Tf@???T?|???Tf"@????T?|?1?Td&@???T@??R???@??@?_?T@????TBĚB|??T@???TB|???T#@??!TB|???T
'@???aTm?R
?r?%˚?7j@?H}?	̚?k@?)?j?C?H!	?h!?i&@?"!??E??@?	A?*q T	A??+?R?븟
k?T????
A?_	kaT? ?????;?h@??!T@???T#@?+A?}
	+@?}	
?q??Jz??KzT?{E??OD??WC??_B??#Am????_?	??J}@?k}@?)???`??T?????
?*??T?????????T?
???To?@?q?C??}?0E????y.??????6?????????B ?a??R?????*?????????B ?A??R????E+?????????B ?a??R????%?????????B ?A??R????u?????????B ?!??R????;?m?3m?+m?#m?o??g??_??W??O??{	??C???
?(@?	?TT6X??7@???KUTVV7??($J????3X@?<\@?4d@?*,M- 4N-??)O-?C?mC?	!@???????%@???)?A?+@?5?C??????($@??? @)9@???3???I}	??)}*JQH
?
}?C?H	k??????"0,@A E?@ ?" ))h??R(	?r	')? ?D???@A ?D?( ?CV?( )? ?D?,.?$?Q" !)? ??h@?HN5h
@??qɦ?)}?)??@??NTh?@????????@?q>.? ?B??GT??U??@??w??+?D??qȦ??@????ET???ҿC?
?ҡR?!,!.!@%?/#H"???R???r!'?M?RiP?r"'}A??B?)}?<?	 ?T?J	@?J		???.?Aӣ? 9#??(??????????????k??~??o????g?Y??)?0?Q?~? ?A????H????H??J#?H"???	?C?R.D?R?????????????????I?????C???H??)?????G?!??D??????J????B?k??E??????F?c?J?B????@? :T??s~
??@???S??~
?
??c??@?????@??s?????
????@???
??{??;????????????????????
??????????????????'	????4?gA??C??Q?J???@???@?)??????@?)??????@?)??????@?)?????A?)????A?)????A?)????A?)?????@??A?k	????A?k	????A?k????A?k	????P?k???P?	??#0??@???_? ??T??	T?w@??Q?yi?	?!^?U?  ?T?Ҵ?T? ?@?  ??U?	?a	 qh??}"?T?B8#B/?/BH#BX,?9"?U?b"?9"@  ?C??	!?	 @	 ?-		)s
????T??T????.?????T?4??ҀF@?  ??U?	?`	 nC??	!?	 @	 ?-		)s
??k??T?Ҩ?U?	?`	)`C??	!?	 @	 ?-		)s
????T??S?????T????@??Q?+}
??@?)??????@?,}
??@?)?????CV?*?g??@?J?????@????J????@?J????{@????J????p??A??A??A??A??A??A??A??_??^???@???@???A???????J?????????????c?B?!???CV???T+?C??CU??kK??T??R??kJ??T?7?q
T	?ҋ?@??S???@?k?????Q? ?-b?_|B@?c@}c@?d@!$$D??#??|#@)	??#?}1"?k???????T$?qKT??@??S?1?@??^q??	?ҢT+?A?K???q???-?1?s
	?`?-bif|B@?cig|c@?d@!$$D??#$j)|#@?#?i)|)	?k?s"??????T?볃S?M??T??@??S?k?@?)?k???1?_xq?x1@yqEx?	?)???+??T???_?a??T???s??GR????@?k
?k?m???#T??@???

????
???A??G]?#??T	?Ҹ~???????s@?????@????????@?4????
??????@???8??????@?1??R???8
??@?3???q
????@???@?3??????@?b1T??'??S???@??1T??'??7???@?????@???@??????
?b1T??'????
???@??1T??'???@???b2T??T?7A??G]???A??SA???7??7??7??7)?+??o@???U??R??c@????L???
????if|"J@
?R@
[@
Bx!???????ig|#J@
?R@
[@
cx!d??n$?$n?"N?h!$???#n#?"N`h!`????s???T?L??o@?
??G]???A??_@?A??Tk???G]?O???G]???A?L????
??{I??OH??WG??_F??gE??oD??#Cm?+Bm?3Am?;?l?_??}?????????B ?a?R?????7?????????B ?A?R????!8?????????B ?a?R????a8?????????B ??R?????8?????????B ?!?R????C??;m?3m?+m?#m?o??g??_??W??O??{???)P@?(@??-T??7X??8@??.T/7????H?J????H_@???Ug@?J/M-@s@??C?@?N-?C?N@?(@??;?(!@??O??C?(%@???I?A?K?B?T?C???H'@??? @)s~@??S?I}	??)}*JQH
?
}H	k???+
)?"0,@A ;B?@ ?" ))h??R(	?r	')? B????@A B?
( ?).)? B?,-?$?Q" !/? ???@?('5?
@??q馗)}?)?'TȂ@????????q>.? ?@??+ T??T??@??3??+?A??q覗?S@????T?????R
????@?!,!-!@%?/)H"???R???r!'8?CU?. ?9)?M?RiP?r!'H!}A?	C?)}?j@?S		??~?v???ӈ?҉#???~?
?.?k??'??3C????@??	??#@?k??@?I	??@?J??@???T??????'??
??????[?????T?J??G@??/K?	??[??O@?k??_??c@?k	??c????S@????_?@??T?W??k	T?3@???T?yi?
?!^?CV?  ?T?Ҷ?U??@?? z
?a	 ?q???}"B8)B/?/BH#BX,?9"?CV?b"?9"@  A??	!?	 @	 A-
	-?
?????T??U?H???.?????U?6????F@?? z
?`	 ?@??CU?A!@ @	 A-
	-?
???k??T??v
?`	-?@??CU?A!@ @	 ?-
	-?
?????T?K@???-T	??(??J????K??kE??C@??@??;@??M)?'@?)?????k?J?????T??9?k???T?k???T?7?q?T??P?@?O?@????
???
@?"@!#?@?Ana?!.!?a? ?i-??	?????k??T?q?T??O?@?P?@????
??? ?-?il??iq?d@!D$$j-?# j ??	????! ???+??T?m??TO?@?N?@????
?????_??????@???
????+??T????W@?F???{X??OW??WV??_U??gT??oS??#Rm?+Qm?3Pm?;Om?C??_??A?????????B ???R?????7?????????B ????R6???!8?????????B ????R-???a8?????????B ?a??R$????8?????????B ????R???O???{??C?????)@?
?@?)?)!??
?iT c?oay?a?`@? ??@?`?h
@?`?!??@?	?h
??{A??O¨?_?`@?h
@??????@?	h(?i@?j
@?H!?h
?)???(
?!??@??@?h
@??@?	?h
??{A??O¨?_?!??@?	?h
??{A??O¨?_??W???O??{????????d?????w??V??
????%??		??(???"??{B??OA??Wè?_??C??W??O??{???????@?m?h&A?
?J???U??	?`@?B????T`@?@?h@???h?`@????{D??OC??WB??C??(?9@???@??"?`@?,?h@???#?????S??!h???@?????BT???R?
??????o??g??_??W??O??{???????? ?R?R????	???x~@????R??????	??????R????? 
??????R????
??
???qkT??????@??*[h?{;?{{?(?{???Th?}Ӏjh??j(??j(??????҉zh?	? ??T??a??T????????R????????R???(?RH?S?_?{;?{????T?@??????{F??OE??WD??_C??gB??oA?????_???????????B ?A/?R3
???
????????B ??/?R*
???e????????B ?0?R!
????????????B ?a0?R
??????{??C????#?!?R}????{A?????_ր??O???{??C???@?qkT??@?{????h????jTh@???T?	??yt?
yi?_??T)??	?a??T@?i?h
@?????T???	??yt?
yi?_????T)??	?a??T???`??}@??`@?Y??`@?W??`@?U??`
@?S??`"@?Q??`*@?O?????{A??O¨K??_?????o??g??_??W??O??{	??C?????????(?@i(?	H????B??bT??W@???????????????@?q?T??v??@?yt??zt???n??????????T
?@?yt????Rd??????????T?@?q???1T??7?R???????jT?@?yv?({@??)S@??4	?D?j.B?,	ʚ??
???-?E?nym??"??j`Tm@??yi???`T)?-	ʚ??
???a??T??*jy-?j@?Hy)?h@?	?	@?)	?(SB9(6u??zv??R?@?yv???(???9???zv???"??+????T!{x?????(?D?i*B?	ɚk?	????E?Myl??"??
j`Tl@??yh???`T?	ɚ??	??a??T\?
*Iy,?i@?!y(?i@??{?*ih?J*i(?(PB9??65????R???q+%T??9?R?????J$T???zx??@?yx??R@??????????V@??????????Z@??????????^@??????????b@??????????f@??????????j@??????????n@??????????r@??????????v@???????????????????????R?@?yx??R@????????	?RiS)????4??"+???b1????4 ??+?l? ? =????????B?I1???Y1?????? ? +?N1????0??W???O??{??????????????????????@?????2??4??????????T?????{B??OA??Wè?_??????{B??OA??Wè?_??W???O??{??????v???`???????????@???k?T??k????????T?????{B??OA??Wè?_??????{B??OA??Wè?_??W???O??{????????V???????????????@??????1?@4??J???????T???{B??OA??Wè?_??@??????{B??OA??Wè@??W???O??{????????5?????????c?????@???k@T??*????????T???{B??OA??Wè?_??@??????{B??OA??Wè@??O???{??C??????????F?????@???q?T??
????????T
?????????8?????@???q T???????????T???{A??O¨?_?b@??????{A??O¨@??O???{??C?(?+???8?6 ??,??{A??O¨?_?3?s+????0????4(??,?	?)?#?
?J?#?	)?	?)?&?
?J?&?	}?)? ???@?????`?	????0? ??,??{A??O¨?_??? ?+?t0???0???=??_????W??O??{??????3?????0??????RP0???"?A???=?=@??T?0?h??{C??OB??WA????_??9@?@????=??O???!=??0????{C??OB??WA????_??R?_? ?R?_? ????_??O???{??C??R%0?????R??o??<??<??R0????!?B???<	C???<??<@???<
A???<??<??<)?)A?	?A@?D???< A?(@????րN	????{A??O¨?_??????/????/???@?!?!@?o???_?????O??{??????????@?!?!@?c????6?N@???{B??OA?????_???-???( ?????B ?|?R????????O??{????`?????@?!?!@?H????6?N@??@??S?@T?>?????{B??OA?????_???-???( ?????B ??|?R???????W??O??{???????????@?!?!@?&???6?N@?M??{C??OB??WA????_???-???( ?????B ?a~?R???????W??O??{????@?aT????(?+???86?֢,??6?R?/??A ?A???=?=@??P?0?h??{C??OB??WA????_????-???( ?????B ?a?R^???5??+????/? ??4??#?	?)?#??&???&?	?)?&??~??&? ???@????֠?	???q/?????? ?+?f/???/???=??_? ?R?_?????O??{???????(?A+???8?6(?a+???8(6 ??-??{B??OA?????_???i>???( ?????B ?!??R???4??B+???A/? ??4 ??+?s? ???B?????B?(/???8/????4??b+???0/????4?$?B?????=?>?=	9@?@????A?????N??"??????"/? ??-??{B??OA?????_??? ?@+?/????.????W??O??{?????????Rv/??????}?r/?`?????????	?}ӊji?k@?ji)??ji?)1@?6???????T?҈@?)@??R?.???!?A???=?=@??L?0?h??{C??OB??WA????_????.???( ?????B ???R????,@?@?@?@? ????o??g??_??W??O??{????_q?!T??_Dq?"T???QXh?????????@?!?!@? ????6 ?R??R?.?????T1?/????h?9t??q??R?y???#???~/?????<`F?=?@?h??{?@?`?~?
/?`???*h?}??}?/?`????R?????R?.?`??????R?.?`??????R?.?`??????R?.?`??H?R???RX;???`??.?`??R?R?R?.?`??x????xB?y"?	????"??"???9#?Z? T?@?(??@?!?	I@?
??+A???J????H@??֠6???4?@?I@???0@?h????????4?@?I@???0@?????????4?@?I@???0@?h????????4?@?I@? ???0@??????????????u??4?????????4???????u??4???w"?xB?????"??"???Z??T?@???@????????@?	I@?
??+A???J????H@????	4u?6?@?I@???0@???????u??4?@?I@???0@?????u??4?@?I@???0@???????u??4?@?I@?????0@?????????????????4?????????4?????????4???`"???/???`??h@9H5`B?S/??`?@?h?@??~???RV.?`?@?h?@?i??j???}	?}
??}??-?(?Rh99???{G??OF??WE??_D??gC??oB????_????1???( ?????B ???R???????0???( ?????B ??R???????/???( ?????B ???R??????0???( ?????B ???R?????O???{??C???@9?49?{A??O¨?_?`B?
/??`?@?h?@??~???R
.?`?@?h?@?i??j???}	?}
??}Ө-?(?Rh99?{A??O¨?_? ??W???O??{??????	@??qKTh?A?q?T??u??i@????????)??Tqk??T??????(???T?zv????? @?4@???h?A????`?@?1???`
B?v??`B??.??`?@??-?`?@??-?`?@??-?`?@??-?`?@??-?`?@??-?`?@??-?`B??-?`?@??-?`?@??-????{B??OA??Wè?-?_????W??O??{????A?)?@)I	?kLT??9?`?@?ab?b?S?@??????4h@9H5`B??.??`?@?h?@??~???R?-?`?@?h?@?i??j???}	?}
??}?=-?(?Rh99h@?q?T??v"?????(??T?zu?	@?i??? ??h@???????{C??OB??WA????_???}2???( ?????B ?a?R?????C??o??g??_??W??O??{??????????9B?B?B????W9?(?R?8???????
???H@?qKT??5?Rs?H???jTH@?ys???@?*?Dӈ&Q?K	Țj???
???E?,yk??"??j`T??@?kyw??`T??l	Ț????
?a??T??*(y+???@?y7??zw?1???T??D??z7????H@?q?;?KbT?Җ??5?Rs?I??	?jTH@?ys???@?*?Dӈ&Q?K	Țj???
??E?,yk??"??j`T?@?kyx??`T?l	Ț???
?a??T??*(y+??@?y8??zx?1???T????z8?????	??q?\T?ҕ"??7?R
?@?)Q	k?Z?;@?s?I??	?*TH@?ys?(P@??Qq???T??@?*?Dӈ&Q?K	Țj???
?K?E?,yk??"??j`T?@?kyz??`TK?l	Ț???_
?a??TX?*(y+??@?y:?({z?1???T1??T??x?	I@?
??+!???J????H@??????48{:?????	??q?TT3}@??"??7?R	?@?)Q	k?Z?;@????MTy?H@?Yy?(P@??Qq???T??@?*?Dӈ&Q?K	Țj???
?k?E?,yk??"??j`T?@?ky{??`Tk?l	Ț???
?a??T?*(y+??@?y;?H{{?1???T1??T??x?	I@?
??+!???J????H@??????4X{;????H@?qkLT?ҕ"??7?R??s??;@?I????	?jTH@?ys?(P@??Qq???T??@?*?Dӈ&Q?K	Țj???
?K?E?,yk??"??j`T?@?kyz??`TK?l	Ț???_
?a??T??*(y+??@?y:?({z?1!??T1?T??x?	I@?
??+!???J????H@??ր??48{:?????????	??qKDT3}@??"??7?R????????;@??Tx?H@?Yx?(P@??Qq???T??@?*?Dӈ&Q?K	Țj???
?k?E?,yk??"??j`T?@?ky{??`Tk?l	Ț???
?a??T??*(y+??@?y;?H{{?1!??T?1?T??y?	I@?
??+!???J????H@??ր??4Y{;????????H@?q+<T
?҈"??C?9?R	??@?y;??3@?J??;@?I??_	?J)TH@??3?yj??R@??Qq???T??@??????Dӈ&Q?K	Țj???
?k?E?,yk?-#??j`T?@?ky{??`Tk?l	Ț???
?a??TS?*(y+??@?y;???@?y{?1?Tq???T?ҷ??s???@?y?????T??	G@???(?E@??????T@?	I@?
??+!???J????H@?????`??4??Z?_+???T?zz?????(y@??(??@???
E???????@?+?Dӈ2Q?m	Ț????
?n?Eӏyn?0#?j`T?@??yk??	?`Tk?n	Ț˭?
?a??T
*?y.??@??y+?Jyk?_1?T)y@???????@?+?D?l	Ț?????@??
?n?Eӏyn?0#?j`T?@??yk??	?`Tk?n	Ț˭?
?a??T?*?y.??@?	y+?Jyk?_1@??T?C@??*?@?????@?	I@?
??+A???J????H@??ր??5????@?q??T?Ҽ????k?s????????T??H@?	I@?
??+!???J????H@????? ??4???R?+?T?{x???????@?*?Dӈ6Q?L	Ț????
???Eӯyn?0#?j`T?@??yl??	?`T???	Ț̱??
?a??T?*?y.??@??y,?kyl?1?T??@?,y@???DӮ	Țϵ???@?????E??yp? #?j`T?@?zm??`T???	Ț
????a??T?*?y0??@??y-?kym?1`??T+y@??+??k@???hA?@????????@???@??
???Eӯyn?0#?j`T?@??yl??	?`T???	Ț̱??
?a??Td
*?y.??@?Iy,?jyl?_1 T?C@??*?@?????H@?	I@?
??+A???J????H@???????)y@???????@?+?D?l	Ț?????@??
?n?Eӏyn?0#?j`T?@??yk??	?`Tk?n	Ț˭?
?a??T6*?y.??@?	y+?Jyk?_1a??Tr???k@??k???T??@?y;??k?X???	??qT	?Ҋ?@?+?R)?H????*?TH@?
yi???@???Dӎ	ʚϱ
???@?????E??yp?`!?j`T?@?zl?
?`T???	ʚ?
???a??T*?y0??@??y,?	??y@???@??1?T??@???D??	ʚ?
???@?????E?z`?b!?_j`T?@?xo??`T???	ʚ?
???a??T?Q*z ??@?z/??yo???ҭ???*"x#??@?0x ?1
?0@??y/????)???T?yl???????@??D??	ʚ ?
???@?????E?"za?c!?j`T?@?!xo???`T???	ʚ/?
???a??T?`* z!??@?0z/??yo??1??Tz@???p?????@??D?ʚ"?
???@????E?$xc?e!??j`??T?@?cx`??`??T?ʚ`?
??a??T?	?R?????@?????a??k?7?
:T?3????|@??	*;?R?;@?H@??#@?1?km8TI@?3yq?iR@?)?Q?q??T??@?i?Dӊ.Q?,	ʚ??
????7@?-?E?nym?o#??j`T??@??yi???`T)?-	ʚ??
???a??Tl?*jy-???@?Sy)?yi??k?#?ATb@?q+T??u??8?R?'?(??'???)?`
T?zy?!???(@??i@?q?T??@?)?Dӊ.Q?,	ʚ??
???-?E?nym?o#??j`T??@??yi???`T)?-	ʚ??
???a??T;?*jy-???@?Ay)?yi?kTb@?)q???T*?Dӈ&Q?K	Țj???
???E?,yk?m#??j`T??@?kyv??`T??l	Ț????
?a??T?*(y+???@?y6???@?yv??????
?_k?7@????T??@?????~	?????)}
?I%???( ?????BP??ƀR??????A???( ?????B ??R??????????( ?????B ?!?R?????W???O??{????@?q?T???? ?????(??T?zt?	@?i??? ??h@?????{B??OA??Wè?_????W??O??{????A?)?@)I	?kT??????h^A?q?Ti?@?j?@?J?)??T+??L??k ??Tk?kE@?l??E@??`??Ttb?tb?hbA?qkTi?@?j?@?J?)??T+??L??k ??Tk?kE@?l??E@??`??T`?@???????7h@?q?T??v"?????(??T?zu?	@?i??? ??h@????`?@?b?S???V???`?@???????6 ?R`9?{C??OB??WA????_???9@?@?????????!H?$??R?{C??OB??WA????_????3???( ?????B ?A?R????W???O??{?????????h@?q?T??v"?????(??T?zu?	@?i??? ??h@???????{B??OA??Wè?_??C??o??g??_	??W
??O??{???????	@9@9?4?5????c???5?5`B?g%??`?@?h?@??~???Rj$?`?@?h?@?i??j???}	?}
??}?$?(?Rhy????L??? 4h?A?q?T	??h?@???A???;?R?????@?)?h??????T???R8}??@???????h?@??c@?q?T???@?z?
?? @?8@?H???????????9??c?????
T?@?	
?+ix?j?@?l?D?h6Q??	Țα?????EӰyo?q#??j`To?@??yl???`T???	Ț????a??T?.*?y/?m?@??y,?Jy??_1?Tj
?W@???5ix?i?@???D?K	Țl??k?@???M?E?nym?o#??j`Tm?@??yj???`TJ?M	Ț???_?a??T??*hy-?h?@?y*?h??H}?j???}
??@?H!+?j???
?6yh?H
??@??RB9h?7???F@????????@?h????ֈ@????????????? ?7?@?h?????h???H??@??? @?8@?H???z?@???????֍??hB????H??o@?q?T?R?o@????k?T??@??w?hB?bB?8?R??!?R??7?o@?Q?kjT?~@??????@?yy?hB?bB???!?R???? 5?o??	?(??	?K??T?R??9?????????0???2@????????5?@?h????֘??4hB?bB????R????7?2@????????5?c@?q???Th????@?i	?(
??@?!????B@???????Y*???( ?????B ??5?R?????Rh?A?i?A?

?H?	h?? ??{L??OK??WJ??_I??gH??oG??C??_???$???B<%???R???????*???( ?????B ??6?R???????+???( ?????B ?A7?R???????_??A??_??A??_?@??_?????{??C?!?7@?k?TL!?@??{A?????_????4???( ?????B ??"?R????????{??C?	@??qKT????
 ?Kya??T!???a??T??%5???( ?????B ?A#?Ri??????7?k???T?@??{A????[??????{??C?	@??q+T??
?J@?_?T???A??T??%5???( ?????B ?!$?RK??????7?k???T	?@?,?D?
,Q??	ʚ??
?.?R?
???E?pyo??!??jT?@??yl???T???	ʚ?
??
?a??T??$???B<%???R-???**jy/?
?@?Ay,?(y,?9?{A?????_??{?????@?+?D?	(Q?l	ɚ??	?-?R??n?E?Oyn??!?jT?@??yk???Tk?n	ɚ˭	??a??T??$???B<%???R???	*Iy.?	?@?!y+?y??1?T?@??{???_????{???_?????{??C?@?????x@?H?@? ??@?? ?)|@?	?(??@????{A????@??{A?????_???6???( ?????B ?A&?R??????a6???( ?????B ?a&?R???????6???( ?????B ??&?R??????I7???( ?????B ??&?R???????W??O??{????(@?????(?@?H?hz@?(	?????@??ր??h	T?*@?@?????????
@?????????2@?		?	?Tt?u???@???????{C??OB??WA???@??????????
@?????@??????!???( ?????B ?!?R?????{C??OB??WA????_???6???( ?????B ??'?Rr??????7???( ?????B ??'?Ri?????8???( ?????B ??'?R`?????}8???( ?????B ?(?RW?????19???( ?????B ?A(?RN???????g??_??W??O	??{
?????????? @??#??"???'@????R?!???7?R??!?R{!???b??????'@????R-.??Z????9???g??????????9?c?b??????	??	?@?q+T??@?yz??????#??????Ҡ??5?@????R]?h^?9??H?6a@????>??#????ґ????{B??OA?????_???h^?9h?6`@?????;??O???{??C???\?9??7???{A??O¨?_?`@?w????{A??O¨?_???=??_?@@?\?9H?7?_?@??_???_??_?@?R?_???=?(?@@?	]?9I?6@?I?R) ??Hy??9?|?(??_??O???{??C??RX?????R??o??<??<??RO?????!?B???<	C???<??<@???<
A???<??<??<	?)A?	?A@?D???< A?(@????րN	????{A??O¨?_?????)??????O???{??C??+???8?6??,??{A??O¨?_??s+???2????4??,?????)?#?????J?#?	)?????)?&?????J?&?	}?)????@?????`?	??????,??{A??O¨?_????+??????????_??????O??{	??C?(P@? ?RiQ]qhT??I?)Q??+ih8J	?@?hV@?@??4hR@?@??#??????[@??k???{I??OH?????_?hR@?@? 4g????5?{I??OH?????_?h@?)?Rj?J%?Jyq@1??{I??OH?????_?hZ@?h??R?{I??OH?????_?hR@?@??4?R?{I??OH?????_?hV@?@?q???{I??OH?????_? ?R?{I??OH?????_?hrA9r???{I??OH?????_?"@?b???@??R?_??W???O??{????,@?h@?(???????h@?????"Ti@?4yu?t????@????????????`@??????{B??OA??Wè??W???O??{????,@??@??????҈@?yu? @????ֵ??@?????T?{B??OA??Wè?_??_???W??O??{????????5@?U??@?q?T?җ"????????
T?zv??*@?	I@?
??+A???J????H@???@??4?zv?	I@?
??+!???J????H@???????6???1?T???{C??OB??WA??_Ĩ?_?hz@???@????@?q+T?җ"????????JT?zv??*@?	I@?
??+A???J????H@???@??4?zv?	I@?
??+!???J????H@???????6???1???Th@??hz@?h?@???hRB9(7hR@???	@???)i@??qThV@???	@???)i@??q ThZ@???	@???)i@??q@Th^@???	@???)i@??q`Thb@???	@???)i@??q?Thf@???	@???)i@??q?Thj@???	@???)i@??q?Thn@???	@???)i@??q?Thr@???	@???)i@??qThv@??	@???)i@??qaT@?7??@?q?T?Җ"?????????T?zu??*@?	I@?
??+A???J????H@???@??4?zu?	I@?
??+!???J????H@???????6?@?Qk??T?q???T???@?Q???{C??OB??WA??_Ĩ?_?????{C??OB??WA??_Ĩ?_?	-@????? ???7??????T?zt?	I@?
??+!???J????H@?????`??4?zt?H@?h???<@?????????`?6?????{C??OB??WA??_Ĩ?_???( ???B???RO????{????(x@??(??@???
E???P	?@?+?D?(Q?l	Ț???-?R??n?E?Oyn??!?jT?@??yk???Tk?n	Ț˭??a??T??$???B<%???R*???*Ly.?
?@?Ay+?)yk??1?T?)??H?a??"?@?	I@?
??+A???J????B@??{??@?)x@???
?@?+?D?l	Ț????@?.?R?
???E?pyo??!??j`T?@??yl??	?`T???	Ț???
?a??T???(*hy/??@?	y,?Iyl??1???T?R?{???_?????H|?_?????E?q?T}@?)?
??/8.#?O??OEAx-?  ?? ?L ??'?L Q?\???'? ? 'N%?L&'? ? '%N%?L&G?y-?? ? 1?L%&N&? ? 'N%?L&G?z-?? ? 1?L%&N&? ? 'N%P?{-?L&? ? 'N%?L&'? ? '%N%?L&G?|-?? ? 1?L%&N&? ? 'N%?L&G?}-?? ? 1?L%&N&? ? 'N%P?~-?L&? ? 'N%?L&'? ? '%N%?L&G?_??? ? 0?L%N&G@??? ? 0?L%N&G?@-?? ? 1?L%&N&? ? 'N%P?A-?L&? ? 'N%?L&'? ? '%N%?L&G?B-?? ? 1?L%&N&? ? 'N%?L&G?C-?? ? 1?L%&N&? ? 'N%P?D-?L&? ? 'N%?L&'? ? '%N%?L&G?E-?? ? 1?L%&N&? ? 'N%?L&G?F-?? ? 1?L%&N&? ? '?L&G=@??? N%? 1?L%?!F%?  ? GA~?QI?R??O1??O??OSQ@?UYA?理O֒?O???O???Of??O??#??#N?#N1?#NR?#NR??N1??NR*a1*a??N*a縡NQn?(a??#N??#N??#Nn??#N??N*as??Ns*a?NnP??N*aƸ?N?l$N?(an?N?l$N%?|?TO??N%%?}@?(%A?)??O??O???Oړ?O9? N{? N?? N?? N???N?+a???N{??N?+a{+a9??N9+aZ? N?n?? N? N?? N???Nyn?+a޻?N?+a???N~n?+aZ??NZ+azn9N9o'NZNZo'N;o{0N|N}N~N{N{G?n?G?n?G?n_o?0N?N?N?N?G?n?N?G?nJE?n)E?nE?n??N??N??N{?N{?N??NYWo??N[CnZ?K?9`???o????)?(??)-?*?+1?,A?-5?.??/9?"?? =?)?JQ?????T?#Dm?+Cm?3Bm?;Am?C??_??3?m?+m?#mH|?_?????E?qKT)? ??=}@?)?!??=)?*?B??=O*?D?=*?E?=*?F	?=*?G??=*?P??=*?Q??=?O?o*?T??=@}?B?
?V?@M?F?n?F?n?F?n:W$O?V$O{#NZ#N#N?#N?F?n?F?n?F?n9#N?#N?#N?#N`????!N??!N??!N9?!N9??O??O???O8]?Ւ?O9U??X??!??T?#Bm?+Am?3?l?_??3?m?+m?#mH|?_?????E?q?T)? ??=}@?)?!??=	?*?+?b??=O+?d	?=+?e?=+?f?=+?g??=+?p??=+?q??=?O+?s??=4?_|?B??N5?_|?	?v??M?B??F?n?F?n?V$O?F?n[W$O{#N?#N9#N#N?F?n?F?n?F?n?#N?#N?#NZ#N~?=?N?N?N?N?2N+2N2N?2N??N??Nw?N[?N????!N??!N??!NY?!N??N:?O??N??N??O??O[Q??OZe??)a?????T?#Bm?+Am?3?l?_?H|?_?????E?qKT}@?	H?*? ?^|@?!_?!?!?!?!N!??OA?nn?^?*=?^?*>?*=?^?*=?^?^?*>?+ ?*=?^?*=?^?*=?^?*4?*=?^?*=?^?*=?^?*??*=?^?*=?^?*=}^?*3?*=}^?*=?*;uC!}5?u! ???T??/n?^?+ =)=?^?+)	!??!n?^?+<?^?+4?+=?^?+=??%n?^?+4?^?*=?*<?^?*<s?'n?^?*<|^?*3?*<|^?*<s^?*3?@?t4?Q?(u
5?W
?(s>?" |?4?Z ?D=??!~?O?l@-?ֵ~?@????D=??!~?O?ֻ~?@?tS??D=??!~?O?tA-?ֻ~?O@?tS??D=??!~?O?ֽ~?K@?tS??D=??!~?O?tB-?ֻ~?G@?tS??D=??!~?O?ֽ~?C@?tS??D=??!~?O?@??ֻ~?;@?tS??D=??!~?O?_@??ֻ~??@?tS??D=??!~?O?[@??ֻ~?7@?tS??D=??!~?O?W@??ֻ~?3@?tS??D=??!~?O?S@??ֻ~?/@?tS??D=??!~?O??E-?ֻ~?+@?tS??D=??!~?O?ֽ~?'@?tS??D=??!~?O??F-?ֻ~?#@?tS??D=??!~?O?ֽ~tQ??D=??!~?O?<@??ֻ~?Q?"2???T?K?=??=?C ?B vB ???H" MT?%!2}
??C??D???O琁O???O???O?
N!?$N??$N??$N?$N?GN?AN!N!h?"]s?M@9!$?!?"^s?Q@9!$?!("_s?U@9!$?!)"Hs?Y@9!$?!*"Is	Js
?]@9!$?!+"Ks?a@9!$?!,"Ls?e@9!$?!-"Ms
?i@9!$?!."Ns?m@9!$?!/"Os?q@9!$?!@  "Ds?u@9!$?! @ !"As?y@9!$?!""Bs?}@9!$?!#"Cs?@?:??@?:??@?:
??@?:?&?'?0?1?2"?3&?4*?5.?62?86?7:?9>?;B?=F?>J??N?(R?)V?*Z?+^?,b?-f?.j?/n?$r?!v?@ !??	?"z?#~????!qa??T?R?????M?7?kQ?	???T?#Dm?+Cm?3Bm?;Am?C??_????;?m?3m?+m?#m?o??g??_??W??O??{	??C???
?????????????5@?@???@?R??f????????4???6T??q?4T?ҩ~H????C??	??/
h?Rn?R?r?̌R??r???R???r1??C??C???R?r????????
??@??@??
??@????@???2T?_????????#?)?T?T
O?S??N?U?BTO?N?V?BTO?N!T
O!?N?TO!?N?TO!?N`???X?T
O?W??N?Y?BTO?N?Z?BTO?N!T
O!?N?TO!?N?TO!?N`??Z???9S??@???@??T???o?
??/??Akh? ????T??p?R'!?@??'?)?N??=?~??/??=`C!h>???= h>?{?C?@KTh?zӉ?S?t?=??=`?N??4N??n!	@?9? n`?=a?N? N ??nZ? n??
?`
?=a?N? N ??n!	A?7? n`?=a?N? N ??nX? n???~?~?`i~? + !^??? ( !^?? ( !^?? ( @+ A^?? ( C^`( A^?? ( ?* ?^?( ?^* ?^ * + ^?+ ^?+ ^?+ `i>?h?@-!4M4?4 !  M  !!!?!j?A-@! @M @!!A?!l?B-`! `M `!!a?!?! ?M ?!!??!n?C-?! ?M ?!!??!?! ?M ?!!??!d?D-?! ?M ?!!??!?  ?L ? !??!?@ d.@??  ?L ? "??"?  ?L ? "?o???"dVF-?  ?L ? "??"?" ?N ?""??"vJG-?" ?N ?""??"@" @N @""\?"BB ??X&?#;?
N?
N???I??T?R?-??-?7-zA???-???-A i"@??;;!??" `N.="????A n@ #ՠNՠN?נN?נN1??O??O琂Ob??OB?3N??3N?3N0?3N??O!N?!Nc!NB!NBl?Ncl?N?l?Nn?NDOf?N?d?Ncd?NBd?N??oQ??Nr??N?N?PN??NBCNBN??=?!Nc?!NG?!N0?!N?N?O?N??O?Ng?O??=@?O?ԿN֨N'֩N??'nc?#nB?"nRA ??J?C?#n??'n?^?(&0*0?^*1q^?^*'p^?(#?(0?(1pA ?A ?K???"nc^?(#G^c("c('G^c('?+?=??9nԾN? n`? nB^b("^B( B(#^B(##?0~??@?4?_?A?c('?-??_?A?c('T?_c(:??-?_?A?c('4?_??c(.??@?4?_?A?c(!????_c(7??@?4?_??@?c(!?@?4?_??@?c(!??_??@?c(!?o@???_c(8??_??@?c(!??_??@?c(!??_??@?m(!?@?4?_^O( ?B!????ߖq???T?"?''!(!?;;"bN?עN?עNբN"բNB??O??O琀O`??O?K?=?!N??!N?!NB?!N??OB!N?!Nc!N!N?G?=l?Ncl?N?l?NBl?NDOPd?N?d?Nrd?Nd?N??o`??NB??N#??N'??=bN??N痀=?!Nq?!NR?!N?!N`?3n??'nb?'nG^P(&*'P^?(0P?1n?1nB^?("'^B(1B(''^G('??2nR?2n1^?(1Q^?(2?(1Q^?(1^?3nR^?(2r^?(3?(2r^?(2r^s^?(3s(&r*2s^R*3s^R*3^R*0R*3^R*3^R*3S^R*"R*3S^R*3S^R*3^R* R*3^R*3R*1QB!S
1?Mh" 
??Tc?)na^?/f(&?(!f^!(&?(nc^!(#?^!(&!(#?^!(#B??n?^?/!(#C^!("!(#C^!(#?>nB^!("^!( !("^!("^ ( ?@?A
!?!31?B3'H  ?!@X&?CI=!?!~a?+?=!8"!!!?GI=B?!~b??@?B8'B"??@???KI=B?!~b?@?B8'B"?A???OI=B?!~b?@?B8'B"?A???SI=B?!~b?@?B8'B"A?WI=B?!~b?@?B8'B"?A???[I=B?!~b??@?B8'B"?@???_I=B?!~b?@?B8'B"?A???cI=B?!~b??@?B8'B"??gI=B?!~b?@?B8'B"??@???kI=B?!~bB8%B"??@???oI=B?!~bB8.B"??@???sI=B?!~bB8$B"?wI=B?!~bB85B"??@???{I=B?!~bB86B"??@???I=B?!~b?@?B8'B"??@??@ /E??T??=??=a@ ??=O@ @ ????/??A???A??H2 $?$??A???A? %?% #?#??A???A? ;?; :?:??A???A? 9?9 8?8??A???A? 7?7 6?6??A???A? 5?5 4?4?B??B? 3?3 0?0?B??B? '?' !?!H  @N?7?=?TT?%??"&?'1*"(&$1*"(&%1*"(&#1*"(&;1*"(&:1*"(&
91*"(&	81*"(&71*"(&61*"(&51*"(&41*"3&{31*"3&|0*"&t'?("?&v>? ?#?A??A????&?H?#??'
$??#???R???r?A??A??-?%??#?#??#??A???A??A??A??-?$?D#%
$?$#??A???A?V?A??A??-?$?#Z%
$?#???A???A?f??A???A?e$??#j?$?#??A???A?v??A??A??$?d#z	$??#?B??B?&??A???A?e	$??#*?	$?#??B??B?6??A???A??	$?!!("?;9(&	??9!#:b
!A??A???A?t???A???A???qT???4?"?'?%J?A?1>40
"?'1*7(&Yk??PQ"?
?A?R
1?/Qb
#R*7H&Yk??PQ"??A?2G
$R*7H&Yk??PQ"??A?2G
%R*7H&Yk??PQ"???@?2G
&R*7H&Yk??PQ"???@?2G
'R*7H&Yk??PQ"???@?2G
5R*7H&Yk??PQ"?V??@?2G
6R*7H&Yk??PQ"?Z??@?2G
9R*7H&Yk??PQ"?fx2G
:R*7H&Yk??PQ"?j?2G
=R*7H&Yk??PQ"?v?2G
>R*7H&Yk??PQ"?z	2G
)R*7H&Yk??PQ"?&x	2G
*R*7H&Yk??PQ"?*?	2G
-R*7H&Yk??PQ"?6?	2G
.R*7H&Yk??PQ"?:t
2?F "!!N!N 7?????R?N????O#??O?K?=c?PQR??_D"h>PQ?%PB"h>8NjPQ瘁_?E"j&JPQ'
%?@P"l?N?> ??_?A??A?JPQ%0??2?G"!??_ ?A??A?PQ???_?"1$%?>)PQ!??_ !"?&)PQ
!?%"??_??A???A?PQ1%$"!??_ 
1!??_???A???A??'?>PQ???_?"?'???_!dUNbBNBN?S?=n?R?r???B?@T??~?bih?#hh?hhv8#F@!d&??  ???T?%??  
??Tf%?$?'?('?&)Y?k)??*PQ_k???TC#F"cB&Bd#$%!?"? %M??Tih68?a@ @@ ???t4???R???B?@T??~?bih?#hh?hht8#F@!d&??  ???T?%??  
??Tf%?$?'?('?&)Y?k)??*PQ_k???TC#F"cB&Bd#$%!?"? %M??Tih48sa@ @@ ???s4???R???B??T??~?bih?#hh?hht8#F@!d&??  ???T?%??  
??Tf%?$?'?('?&)Y?k)??*PQ_k???TC#F"cB&Bd#$%!?"? %M??Tih48sa@ @@ ??????/?K?=k?4???R???B?@T??~?bih?#hh?hht8#F@!d&??  ???T?%??  
??Tf%?$?'?('?&)Y?k)??*PQ_k???TC#F"cB&Bd#$%!?"? %M??Tih48sa@ @@ ????4???R"@ @ s?`@ A@ B??Th?~?cih?"hh?hhs8#f@!D&??  
??T?%??  ???TF%?$?'?('?&)Y?k)??*PQ_k ??Tb"F"Bc&cD"$%!?#? %???Tih38?s?`@ A@ B????T"@ @ B#?B??B??/?H2 $?$?B??B? %?% #?#?#B??'B? ;?; :?:?+B??/B? 9?9 8?8?3B??7B? 7?7 6?6?;B???B? 5?5 4?4?CB??GB? 3?3 0?0?KB??OB? '?' !?!(" `UT????%??1&?'1*"(&$1*"(&%1*"(&#1*"(&;1*"(&:1*"(&
91*"(&	81*"(&71*"(&61*"(&51*"(&41*"3&{31*"3&|0*"&t'?("?&v>? ?#?A??A????&?H?#??'
$??#???R???r?A??A??-?%??#?#??#?#B??'B??A??A??-?$?D#%
$?$#?+B??/B?Z?A??A??-?$?#^%
$?#??3B??7B?j??A???A??$??#n?$?#?;B???B?z?A??A?	$?d#~%	$??#?CB??GB?*??A???A??	$??#.?	$?#??KB??OB?:??A???A??
$?!!("??9(&	??9!#>b
!A?B??B?t??B??B???qT???4?"?'?%J?A?1>50
"?'1*8(&Yk??PQ"?
?A?R
1?/Qf
#R*8H&Yk??PQ"??A?921G
$R*8H&Yk??PQ"??A?921G
%R*8H&Yk??PQ"???@?921G
&R*8H&Yk??PQ"???@?921G
'R*8H&Yk??PQ"???@?921G
6R*8H&Yk??PQ"?Z??@?921G
7R*8H&Yk??PQ"?^??@?921G
:R*8H&Yk??PQ"?j?21G
;R*8H&Yk??PQ"?n?21G
>R*8H&Yk??PQ"?z	21G
?R*8H&Yk??PQ"?~9	21G
*R*8H&Yk??PQ"?*?	21G
+R*8H&Yk??PQ"?.?	21G
.R*8H&Yk??PQ"?:?
21G
/R*8H&Yk??PQ"?>u
2?F "!!N!N 7?????R?A??A??A??A???P??Q?C??O$??O???O???O?K?=??>JPQPQ瘔_?"?'1JR"h<j<n<?PQƘ?_?"n&?PQ??"
&?Dq
4'?>??_?A??A?JPQq??_ Q"?&JPQ?1gS"PQƘ?_?"
&'?>??_??A??A?PQ?3?2"???_??A??A??PQƐ?_?"?&G?>)PQ???_?%"?&)PQ&
%?'""??_@??A???A?PQQ'&"B??_@?1B???_???A???A??0??>PQ???_?"?'???_!?UN?CNbN?O?=n?R?r?G?=???B?@T??~?bih?hh??hv8#F@!d&??  ???T?%??  
??Tf%?$?'?('?&)Y?k)??*PQ_k???TC#F"cB&Bd#$%!?"? %M??T?h68?a@ @@ ???44???R???B?@T??~?bih?hh??ht8#F@!d&??  ???T?%??  
??Tf%?$?'?('?&)Y?k)??*PQ_k???TC#F"cB&Bd#$%!?"? %M??T?h48sa@ @@ ????/?4???R?/???B?T??~?bih?hh??ht8#F@!d&??  m??T?%??  ???Tf%?$?'?('?&)Y?k)??*PQ_k???TC#F"cB&Bd#$%!?"? %-??T?h48sa@ @@ ??????o?/?/?G?=t?
4???R?/???B??T??~?bih?hh??ht8#F@!d&??  m??T?%??  ???Tf%?$?'?('?&)Y?k)??*PQ_k???TC#F"cB&Bd#$%!?"? %-??T?h48sa@ @@ ???"@ @ ?/<34???R	"@ @ ?/s?`@ A@ B?Th?~?cih?hh??hs8#f@!D&??  ???T?%??  m??TF%?$?'?('?&)Y?k)??*PQ_k??Tb"F"Bc&cD"$%!?#? %???T?h38??/s?`@ A@ B???T"@ @ ?O?=@#??@???B?#?D??
?R?X	?b?}?#c?}@@?!TO?S?=!?Na?=a@??A?`??T)kh8*
B""H  ??T)}S#"##I?%@?'A?cNg?'Nf?&Ne?%Nc?$NBNc?"n??"n??"n?/??"nB???B?@???@???=BB?!$"?KA??@?a@ ??_!?!!`)/()-^(-%^(%0^(0(*T^(4U^(5W^(7(,?? ?# "L/!?"?O/??"?^?? ` !a?!??"?^?? ` !a?!??"?^? ` !a?!?"?? ` !a?!??"?^?? ` !a?!????"?^?? ` !a?!????"?^?? ` !a?!????"c? ` !a?!b?"f^?? ` !a?!????"f^?? ` !a?!????"f^?? ` !a?!?{???"C? ` !a?!B?"_^?? ` !a?!??"Y^#? ` !a?!"?"V^?? ` !a?!??"?'  "?^(!?^("?^(:(.?^(;($?y:????	?sPQ}"?po	=??>sPQ}"?q?
=?>?sPQ}"?qO=??&sPQ}"/
=??=sPQo"\s?s?/??=sPQ}"sPQu"?x	5??>sPQu"?x_	5?>?sPQu"?x?	5??&sPQu"	5???sPQ"u{?W?
????sPQ~"?T?	>???sPQ"?U??
?# ?>?	?D?5-??TaAN!(!?#?"?]N!(!!?"?m???c??!]????Dm?m?/?c@???v?h38v?~S{~A?{s?"?{@?[?|?A9?*v?9s?B?@T;js8"????Tv"QV?܂A9?*܂9??????#@?}@?{?C??T#?T?h{8ss#QS?s?A9s~Sv@?V?֢A9|AӜs?&??3s?Qa"!(   ??T3?bA?d@?!N??!n??!nc?!nA?!n!?1Nb?1N??1N??1N??O?%Nc%NB%N!%N!l?NBl?Ncl?N?l?N?d?Ncd?NBd?N!d?N!BNbDNAN??O!?"N?y?c?%c( ?:7?Nl$?/??????/
?/C@?QA?"ԥN3֥N?ԥN`ԥN??O??Os??OB??OB?=Ns?=N?=N?=N&N&Ns&NB&NBl?Nsn?Nn?Nl?Nd?Nf?Nzf?N[d?N`??NB??N0??N???=cN??N?h?<3g@??!N?!Ns?8n9?0n$?$nc?#nz^?)#z+:{^Z+;?^c^C+#?^c($c(:c(;:oA?B?!NZ?"nQ?1n?^c($$^c(1c($$^c($?!Nd? nx?8n??!n1^c(11^c(!c(1^?)8q+1^1*;0?0n^1*8^1*01*88^c(8^1*8B?"n^0*0Q^*"*1Q^*1?? nB^*"^B( B(0^B(0p^?)30*0q^*1q^*11^*9*1!^o(!!^*!#^!(#!(:C^!(#C^!(#C^!(#?^!($!(#?^!(#^N( ?^-( C?Z?9?????T?A!?	%??! ???T?	(?,?	%?!,?.(  L? ?/%X#??E=?!~??
@-8! ?@? ??E=!?!~?!8"!!?@?@??E=!?!~??A-!8"!!?@?@??E=!?!~?!8#!!?@?@??E=!?!~??B-!8"!!?@?@??E=!?!~?!8#!!?@?@??E=!?!~??C-!8"!!?@?@??E=!?!~?!8#!!?@?@??E=!?!~??D-!8"!!?@?@??E=!?!~?!8#!!?@?@??E=!?!~??E-!8"!!?@?@??E=!?!~?!8#!!?@?@??E=!?!~??F-!8"!!?@?@??E=!?!~?!8#!!?{@?@??E=!?!~??G-!8"!!?w@?@??E=!?!~?!8#!!?s@?@?F=!?!~??H-!8"!!?o@?@?F=!?!~?!8#!!?k@?@?F=!?!~??I-!8"!!?g@?@?F=!?!~?!8#!!?c@?@?F=!?!~??J-!8"!!?_@?@?F=!?!~?!8#!!?[@?@?F=!?!~??K-!8"!!?W@?@?F=!?!~?!8#!!?S@?@?#F=!?!~??L-!8"!!?O@?@?'F=!?!~?!8#!!?K@?@?+F=!?!~??M-!8"!!?G@?@?/F=!?!~?!8#!!??@?@?3F=!?!~??N-!8"!!??7F=!?!~?!8#!!?C@?@?;F=!?!~??O-!8"!! ??F=!?!~?!8#!!M?!+e??T??K????A ?A ?@ ]???Ҁ?N`nȠ"@? .!??E???O??F???O`N?? Nc? N0?oc0N?0N?O?l?ncl?ncEN?c(!B??O???O!? NB? NB0N!0N!l?nBl?nDAN?(!?T
??%?????N?"T$oA(a!(!a?!'?!B?#b}a!#?#c}A@?b@?????????ւ??"?q?Ty???HT8?_89@99#c!h  T???:@9?Q?Jx8SX39?_89S99Z*#c!h  @??TcN$#D$?N?~??F???3N??1N??0N??%N??#n?#n1?#ns?#ns? N1? N? N?? N?&N&N1&Ns&N?Nsn?N1n?Nn?N?l?N?d?Nf?N1f?Nsf?NqQNEN?N????@9B|SB#=?@9B|SB#<?!@9B|SB#;?%@9B|SB#:?)@9B|S?-@9c|SB#c#89?1@9B|SB#7?5@9B|SB#6?9@9B|SB#5?=@9B|SB#4?A@9B|S?E@9c|SB#c#23?I@9B|SB#1?M@9B|SB#0?Q@9B|SB#'?U@9B|SB#&?Y@9B|S?]@9c|SB#c#$%?a@9B|SL#,?e@9B|SM#-
?i@9B|SN#.?m@9B|SO#/?q@9B|S?u@9c|SB#c#"#?y@9B|SK#+?}@9B|SJ# 
?@?!??@?!??@?!??@?!??@?!??{@?!??w@?!??s@?!??o@?! ??k@?!$??g@?!(??c@?!,??_@?!0??[@?!4??W@?!8??S@?!<??O@?!@??K@?!D??G@?!H??C@?!L???@?!P??;@?!T??7@?!X??3@?!\??/@?!`??+@?!d??'@?!h??#@?!l??@?!p??@?!t??@?!x??@?!|??@?!???@?!??)??(??>?????=??? n ?=??N? N ??nH? n ?=??N? N ??n?	C?)? n ?=??N? N ??nF? n?(??^??(!?^("?^??(!(3w^(7x^(8y^(9(4?^(:?^(;?^(+(5?^(,?^??(!?^??(!(>?^(*?^(??^??(!((^??(!^??(!^??(!()!^??(!!^??(!!^??(!(&?^???(!?^??(!?^???(!?x(??O??W??#????!?@-  0 L0???=??!?0 "  N  "!???!?!0
@?" N "!????!0EB-" N "!????! "  N  "!???!?!0EC-" N "!????! "  N  "!???!?!0ED-" N "!????! "  N  "!???!?!0qE-" N "!????!?# ?O ?#!??!=AF-?# ?O ?#!??!" N "!????!0EG-" N "!????! "  N  "!???!?!0IH-" N "!????!@" @N @"!A?!1AI- "  N  "!???!?!" N "!???!0EJ-" N "!???! "  N  "!??!?!1AK- "  N  "!??!?!" N "!???!0EL-" N "!???! "  N  "!??!?!0YM-" N "!???!?" ?N ?"!??!.N-?!-?M-?!0????0 1L1 0?0-=O-?!1?M1?!0??0?!1?M1?!0??0?/0Z!?N?!00N?N???T?R????N??????????w?j?N?/?7?NᏀ=?97?_??%??????????N43.?[?=&4?N9aA?7Y@???N?ֳN?ֳN;׳N?s??{??C ?????N׳Nޓ?O{??OZ??O???O??0NZ?0N{?0N??0N?#N{#NZ#N?#N?n?NZo?N{o?N?o?N?g?N{g?NZg?N?f?N???N?[??W??C ?NH??NMB 2?Ni??N{^Nއ?N?ZN?N??!N;?!N?!N??!Nh?N??O?N??O~?N~?O{?N[?Ox׸N?׹N;iC?)yB??׶NշN??7n??6n9?9n?8n?#V??8n??9n?#U??6n??7n?^?/?* )??^?+(^?^?+7?^?*6?*??^?*?^?^?*67^?*9?*77^?*7^9^?*9?*8?*7?*??*(7ճN?׳Ny׳N_׳N???O9??O??O???O??0N?0N8?0N??0N9#N#N?#N?#N?n?N?n?No?N9o?N9g?Ng?N?f?N?f?NYN?WNN?}????N???N??N??!N??!N??!Nx?N??Ot?N??Ou?N??O7??N??!N?+?=??OsֺN?ֻN?־NשNs?3n???=?3n???=??4n??5n?5n???=?4n???=??7n?7n?^?*7?*8?^?*8?^?*7?^?*4?*7?^?*7?^?*4?^?*5?*6?^?*6??=??"n?^?*5u^?*3?*5u^?*5U?0~??@???_??A??* ??A??_?B??* ?	???A??_?**??A?y?_??A??* ??A?y?_??A??* ??A?Y?_??A??* ??A?9?_?*'??A???_??A??* ??A???_??A??* ??A?Y?_?A??* ????_?*!??-??_?{A??* ??A?Y?_?B??* ??A??_?B??* ??A??_?*<??A??_?wA??* ??_?sA??* ??A??_?S-?*'????A???_?*=?A??_?*(?A??_?R-?*&?A??_?*!?[?=??A???_?*2?A?Y?_?B??*"?A?Y?_?Q-?*"??A???_?*<?;?=?_A???_?* ?A???_??A??*2?[A?Y?_?@??*2?WA???_??A??*6?+??????_s^?*3?'??3?= C!??=@ T@ ?B ??=?C ??=s?q???T?A 	??s"5'V'sV?%s* ?/B?8!Ꮐ=5Ni6
?/?
????/?/?e@??]A??ֵN{յN,׵N
׵N???O???O{??OZ??OZ?0N{?0N??0N??0N?#N?#N{#NZ#NZo?N{o?N?m?N?m?N?e?N?e?Nag?NBg?NL??N-??N??N{??=?cN???N?h?!!?A?@?L=!?!~?&??A?!86!!?A?@?L=!?!~?&??A?!87!!?B?@?L=!?!~?&??A?!88!!?O?=@?L=!?!~?&??A?!89!!?A?@?L=!?!~?&??A?!8:!!?A?@?L=!?!~?&??A?!8;!!?A?@?L=!?!~?&??A?!8>!!?K?=@?L=!?!~?&??A?!8?!!?A?@?L=!?!~?&??A?!8*!!?A?@?L=!?!~?&??@?!8+!!?A?@?L=!?!~?&??@?!8"!!?G?=@?L=!?!~?&??A?!8"!!?{A?@?L=!?!~?&??A?!8"!!?B?@?L=!?!~?&??A?!8"!!?B?@??L=!?!~?&??A?!8"!!?C?=@??L=!?!~?&??@?!8"!!?wA?@??L=!?!~?&??A?!8"!!?sA?@??L=!?!~?&?A?!8,!!???L=!?!~?&?A?!8"!!???=@??L=!?!~?&?A?!8"!!??L=!?!~?&?A?!8"!!???L=!?!~?&??A?!8-!!???L=!?!~?&?A?!8"!!?;?=@??L=!?!~?&?A?!8"!!?B?@??L=!?!~?&?A?!8"!!???L=!?!~?&?_A?!8"!!???L=!?!~?&?A?!8.!!?[?=@??L=!?!~?&?[A?!8"!!??A?@??L=!?!~?&?WA?!8"!!@??L=!?!~?&??@?!8"!!??A?S?'B?`" ??=??T?Y????B ?+?=?'?!A I???/?CB??GB??J7 !?!?KB??OB??  ?? ? "??"?SB??WB?@"&R?&@"'R?'?[B??_B?@"3R?3@"4V?4?" ?S?@STR'R6X
57'+7&X
!+7	&)X
 +7&kX
"+7&?X
&+7
&?X
'+7&?X
3+7&?>?2#W?B??B?	9Y:#;	:ygz#?B??B?[	:yg?#{	:yg?#?B??B??	:yg?#?	:yg?#O?B??B??	:ygZ
4W+7?&#S?	7gh?q?T???4"Y'?'g6?85:'{+:i&)Y?k)??)PQ;";W	;?!?+:?&)Y?k)??)PQ<"<=	<?o ?+:?&)Y?k)??)PQ<"<]	<?o"?+:?&)Y?k)??)PQ<"<}	<?o&?+:?&)Y?k)??)PQ<"<?	<?o'?+:?&)Y?k)??)PQ<"<?	<?o3?+:?&)Y?k)??)PQ<"6'?*6?&Yk???PQ"W
!?*6?&Yk???PQ"X
 +6&Yk??PQx"Y
"9+6+&kYkl???PQy"Z
&Z+6K&kYkk??mPQ?"[
'{+6m&?Y?k???mPQ?"\
3?+6?&?Y?k???mPQ?"R
4R*6M&?Y?k????PQ?"?(????~	5?=)????[=	7?W*????ZW	8?VW+????Zw	9?V?,????Z?	:?V?-????Z?	;?Vw
.????Z?	<?V?
/????Z?	2?A ?V?'?A!?A ?+??3??5??5A!?/?>5??_A!???iA!J)???A!?+???A!?-????B!v
5???WB!?
7|C NC m*4-?q?
??)T
?R??#?q(# MT?3B?[
:z;H# ?T?+B?[
:{92'r+2M&?Y?k????PQ?6k?T?"??A?yg?'B?{2zk29?	2?<{:@";mT-?R???/?R?R?R?R?R?R?R?R?/>?cB??gB?`J7 "?"?kB??oB??  ?? ? !??!?sB??wB?@"&R?&@"'R?'?{B??B?@"4R?4@"5V?5?" @ST???R'R6W
38'?*8?&)W
"?*8?&?W
 ?*8?&?W
!?*8?&W
&?*8?&W
'?*8?&?W
4?*8?&?27#:O??B??B??
:z?#;<	;?k?#;?B??B?\	;?k#;|	;?k#;?B??B??	;?k?#;?	;?k?#;S?B??B??	;?k[
5x+8	&)8#8W?	88ki?)?q?T???49"Z'?'9k969;3:'{+:m&?Y?k????PQ?"?O?
;?="?+:?&?Y?k????PQ?"?>	=?o= ?+:?&?Y?k????PQ?"?^	=?o=!?+:?&?Y?k????PQ?"?~	=?o=&?+:?&?Y?k????PQ?"??	=?o='?+:?&?Y?k????PQ?"??	=?o=4?+:?&?Y?k????PQ?"?S?	=?o=5?+:M&?Y?k????PQ?"?W?	:?o@#8XO82O2????R?cB?V
>3'?*3?&)Y?k ??	PQ6"W
"?*3?&)Y?k7???PQ7"X
 +3	&)Y?k.???PQ8"Y
!9+3)&)Y?k5???PQ9"Z
&Z+3I&)Y?k9?#}??#}@?!@??#@??3@????
??
???R?r??	??O?R???R???rU?@9?Q?k@9k}Sk?
3?@9?}S??M*b#"H   TBN?#&&?N2~?4M???4N??3N??2N??'N??"nR?"ns?"n??"n??0Ns?0NR?0N??0N?#NR#Ns#N?#N?n?Nsn?NRn?N?l?N?d?NRf?Nsf?N?f?N?SNGGN?N?<2@?4MA???4N??3N??2N??'N??"nG?"nr?"n??"nB?0NR?0N??0N??0N?#N?#NR#NB#NBl?NRn?N?l?N?l?N?d?N?d?NRf?NBd?NBRN?FN?N?=??)????#? ??TL???B??T?@9k?@9?b#"H  !??T????~?????.????bT??h?~???)????T?Th?????T?V???)5@?)@????T?@?}??C??{I??OH??WG??_F??gE??oD??#Cm?+Bm?3Am?;?l?_?????;?m?3m?+m?#m?o??g??_??W??O??{	??C??ш?5@?@????H??_?
???_??T??????J?H???+ ????A????/???/0@???"????$@?????????ODOh?R??R?r??o???R???r????s??k?????????B??????@?
려T?????/?/?o???/?B!J?~??h*??h*??OA??#4??4`" L3Z??_#??/?T?O?|??@-?T?O@- ?SA- ?A-?? ?WB- ?B-?? ?cC- ?C-?? ?D-@?D-@?kE-@?E-?-@?sF-@?F-@?G-@?G-@?H-??@?H-@?I-@?I-@?CJ-?s?B?'J-
?_K-?B?+K-?Z?3L-?Z?_L-?Z?;M-?Z?_M-?Z?CN-?Z?_N-?Z?{@??Z?_O-?Z?g?
!??!?C?q?
????T
?҃"?'<c?'c( ?:7?Nl$?/?????/
?/c@?qA?"ԥN3֥N?ԥN`ԥN??O??Os??OB??OB?=Ns?=N?=N?=N&N&Ns&NB&NBl?Nsn?Nn?Nl?Nd?Nf?Nzf?N[d?N`??NB??N0??N??=cN??N3k?? n??=??N? N ??nH? n??=??N? N ??n?	C?)? n??=??N? N ??nF? n?(??^???(!?^("?^?o?(!(3w^(7x^(8y^(9(4?^(:?^(;?^(+(5?^(,?^?k?(!?^?g?(!(>?^(*?^(??^???(!((^???(!^???(!^???(!()!^?c?(!!^???(!!^???(!(&?^?_?(!?^???(!?^?[?(!@x(??O??W??#???/???@-  0 L0?=???!?0 "  N  "!?W?!?!?
@?" N "!?S??!?EB-" N "!?O??! "  N  "!?K?!?!?EC-" N "!?G??! "  N  "!?C?!?!?ED-" N "!????! "  N  "!?;?!?!?qE-" N "!?7??!?# ?O ?#!??!?AF-?# ?O ?#!??!" N "!?3??!?EG-" N "!?/??! "  N  "!?+?!?!?IH-" N "!?'??!@" @N @"!A?!?AI- "  N  "!?#?!?!" N "!???!?EJ-" N "!???! "  N  "!??!?!?AK- "  N  "!??!?!" N "!???!?EL-" N "!???! "  N  "!??!?!?YM-" N "!???!?" ?N ?"!??!?N-?!-?M-?!0?????0 1L1 0?0?=O-?!1?M1?!0??0?!1?M1?!0??0?/0Z!?N?!0?NqN???T?R?????N????????????j?N??7?Nᧀ=?97????'???????????N43.?s?=&4?N?aA??Y@???N?ֳN?ֳN;׳N???????C ?????N׳Nޓ?O{??OZ??O???O??0NZ?0N{?0N??0N?#N{#NZ#N?#N?n?NZo?N{o?N?o?N?g?N{g?NZg?N?f?N???N??????C ?NH??NMB 2?Ni??N{^Nއ?N?ZN?N??!N;?!N?!N??!Nh?N??O?N??O~?N~?O{?N[?Ox׸N?׹N?iC??yB??׶NշN??7n??6n9?9n?8n?#V??8n??9n?#U??6n??7n?^?/?* )??^?+(^?^?+7?^?*6?*??^?*?^?^?*67^?*9?*77^?*7^9^?*9?*8?*7?*??*(7ճN?׳Ny׳N_׳N???O9??O??O???O??0N?0N8?0N??0N9#N#N?#N?#N?n?N?n?No?N9o?N9g?Ng?N?f?N?f?NYN?WNN?}????N???N??N??!N??!N??!Nx?N??Ot?N??Ou?N??O7??N??!N?C?=??OsֺN?ֻN?־NשNs?3n???=?3n???=??4n??5n?5n???=?4n???=??7n?7n?^?*7?*8?^?*8?^?*7?^?*4?*7?^?*7?^?*4?^?*5?*6?^?*6??=??"n?^?*5u^?*3?*5u^?*5U?0~??@???_??A??* ?WB??_?oB??* ???SB??_?**?OB?y?_??A??* ?KB?y?_??A??* ?GB?Y?_??A??* ?CB?9?_?*'??B???_??A??* ?;B???_??A??* ?7B?Y?_??A??* ????_?*!?;???_??A??* ?3B?Y?_?kB??* ?/B??_?gB??* ?+B??_?*<?'B??_??A??* ?7???_??A??* ?#B??_?_-?*'??
??B???_?*=?B??_?*(?B??_?^-?*&?B??_?*!?s?=?B???_?*2?B?Y?_?cB??*"?B?Y?_?]-?*"?B???_?*<?S?=??A???_?* ??A???_?_B??*2?A?Y?_??@??*2??A???_?[B??*6????3???_s^?*3????K?= C!??=@ T@ ?B ??=?C ??=?q???T?A 
??"U'v'sV?'s* ??B?8!ᧀ=5Ni6
?/?
????/?/d@?\A??ֵN{յN,׵N
׵N???O???O{??OZ??OZ?0N{?0N??0N??0N?#N?#N{#NZ#NZo?N{o?N?m?N?m?N?e?N?e?Nag?NBg?NL??N-??N??N???=?cN???N?k?!!??A?@?+N=!?!~?&?WB?!86!!??A?@?/N=!?!~?&?SB?!87!!?oB?@?3N=!?!~?&?OB?!88!!?g?=@?7N=!?!~?&?KB?!89!!??A?@?;N=!?!~?&?GB?!8:!!??A?@??N=!?!~?&?CB?!8;!!??A?@?CN=!?!~?&??B?!8>!!?c?=@?GN=!?!~?&?;B?!8?!!??A?@?KN=!?!~?&?7B?!8*!!??A?@?ON=!?!~?&??A?!8+!!??A?@?SN=!?!~?&?;A?!8"!!?_?=@?WN=!?!~?&?3B?!8"!!??A?@?[N=!?!~?&?/B?!8"!!?kB?@?_N=!?!~?&?+B?!8"!!?gB?@?cN=!?!~?&?'B?!8"!!?[?=@?gN=!?!~?&?7A?!8"!!??A?@?kN=!?!~?&?#B?!8"!!??A?@?oN=!?!~?&?B?!8,!!??sN=!?!~?&?B?!8"!!?W?=@?wN=!?!~?&?B?!8"!!?{N=!?!~?&?B?!8"!!??N=!?!~?&?B?!8-!!??N=!?!~?&?B?!8"!!?S?=@?N=!?!~?&?B?!8"!!?cB?@?N=!?!~?&?B?!8"!!??N=!?!~?&?A?!8"!!??N=!?!~?&??A?!8.!!?s?=@?N=!?!~?&?A?!8"!!?_B?@?N=!?!~?&?A?!8"!!@?N=!?!~?&?3A?!8"!!?[B?S??B?`" ??=??T @????B ?C?=??!A I???/?KC??OC??J7 !?!?SC??WC??  ?? ? "??"?[C??_C?@"&R?&@"'R?'?cC??gC?@"3R?3@"4V?4?" ?W
?@ST?'R6X
5?'+7&X
!+7&kX
 +7&?X
"+7
&?X
&+7&?X
'+7&?X
3+7&>?2#W?+C??/C?	9Yz#;	:yg?#?3C??7C?[	:yg?#{	:yg?#?;C???C??	:yg?#?	:yg#O?CC??GC??	:ygZ
4W+7?&#S?	7gh?q?T???4"?':'g6?85?'{+:k&kYkk??kPQ{";W	;?!?+:?&kYkk??kPQ|"<=	<?o ?+:?&kYkk??kPQ|"<]	<?o"?+:?&kYkk??kPQ|"<}	<?o&?+:?&kYkk??kPQ|"<?	<?o'?+:?&kYkk??kPQ|"<?	<?o3?+:?&kYkk??kPQ|"?'?*6?&Yk???PQ"W
!?*6?&Yk???PQ"X
 +6&Yk??hPQ"Y
"9+6(&Yk??PQ?"Z
&Z+6L&?Y?k????PQ?"[
'{+6l&?Y?k???PQ?"\
3?+6?&?Y?k????PQ?"R
4R*6N&?Y?kϱ??PQ?"?(?W??~	5?=)?S??[=	7?W*?O??ZW	8?VW+?K??Zw	9?V?,?G??Z?	:?V?-?C??Z?	;?Vw
.????Z?	<?V?
/?;??Z?	2?A ?V??A!?A ???????5?s?5A!???>5?o?_A!??k?iA!J)?g??A!?+?c??A!?-?_??B!v
5?[?WB!?
7|C NC n*4??q???)T?R?:#?q(# MT?B?[
:z;H# ?T?B?[
:{9?'r+2N&?Y?k???PQ?7k?T?"?WB?yg??B?{2zk29?	2?<{:@";mT.?R???/?R?R?R?R?R?R?R?R?/>?kC??oC?`J7 "?"?sC??wC??  ?? ? !??!?{C??C?@"&R?&@"'R?'?C???C?@"4R?4@"5V?5?" ?[??O?@ST?7??'R6W
3?'?*8?&?W
"?*8?&?W
 ?*8?&1W
!?*8?&W
&?*8?&!W
'?*8?&BW
4?*8?&c2?#:O?+C??/C??
:z?#;<	;?k;#;?3C??7C?\	;?k#;|	;?k;#;?;C???C??	;?k[#;?	;?k{#;S?CC??GC??	;?k[
5x+8
&??#8W?	88km???q?T???4?"?';'9k969;3?'{+:n&?Y?kα??PQ?"?O?
;?="?+:?&?Y?kα??PQ?"?>	=?o= ?+:?&?Y?kα??PQ?"?^	=?o=!?+:?&?Y?kα??PQ?"?~	=?o=&?+:?&?Y?kα??PQ?"??	=?o='?+:?&?Y?kα??PQ?"??	=?o=4?+:?&?Y?kα??PQ?"?S?	=?o=5?+:N&?Y?kα??PQ?"?W?	:?o@#8XO82O2????R?kC?V
>?'?*3?&?Y?k???-PQ?"W
"?*3?&?Y?k???-PQ?"X
 +3
&?Y?k???mPQ?"Y
!9+3-&?Y?k????PQ?"Z
&Z+3M&?Y?k????PQ?"[
'{+3m&?Y?k???
PQ?"\
4?+3?&?Y?k????PQ?"R
5R*3M&?Y?k????PQ2"?+C??(?W?s~	6?])?S??O=	7?[*?O??NW	8?Z7+?K??Nw	9?Z?,?G??N?	:?Z?-?C??N?	;?Z?
.????N?	<?Z?
/?;??N?	2?A nZ?[?A!?A ??????2??2A!??^2?s?_A!??o?iA!*)?k??A!?+?g??A!?-?c??B!?
<?_?vB!?
6[C .C c*4Q_q???)T?R19#?m# MT?B?z
9Y;(# ?T?B?z
9Z8?'S+3q&1Z?k&???PQ!k?Ts"?WB?Xc?[B?Z3Yg8?	3z;Z9`":mT#?R??C .C 19#?o# T+?R19#?o# ?T?B?s
9y:(# 
TS9s8?'s*:q&1Z?k&???PQ?9k?T3"?SB?Xc??B?Z3Zg8?	3y;9:`"9-Tc??q;#a(# ,T+xC ?A q;#a(# ?T?;{jh# 
T;s9?'s*.q&1Z?k&???PQ?3k?T3"?OB??e?sB??	3?m39S38?	;`".-Tc???:#Xe# ,T+C [C ?:#Xe# ?T3	:znH# 
T3:s8?'s*.q&1Z?k&???PQ?%k?T3"?KB??a?oB??	3?i8s3.9?	:`".-Tc???;#?a(# ,T+8C zC ?;#?a(# ?Ts	;{jh# 
T?;s9?'s*.q&1Z?k&???PQ?$k?T3"?GB??e?kB??	3?m39S38?	;`".-Tc??:#?g# ,T+C [C :#?g# ?T?	:znH# 
T?:s8?'s*.q&1Z?k&???PQ? k?T3"?CB??a?gB??	3?i8s3:9Z.`":-Tc???:#Yb(# ,T+8C nC ?:#Yb(# ?T?:{:h# 
T?
;s9?'s*:q&1Z?k&???PQ?.k?T3"??B?Zg?cB?939oS:?	38{9`";-Tc???;#?j# ,T???C ?A ?;#?j# M??T?
;nf?! ???T?
.s8?'s*;q&1Z?k&???PQ?-k`??T3"?;B?{c?_B?3;s;33X:.`"8???Tc?????5w.?/?7B?	
?R?R?R?R?R?R?R?R?????q??R12?!??q!0???qf0?#?qu0?k?qw1?k?qs1??q1???q1???q1???q1??tS*?K@??R?[@?([?9?tS11*!9?319??q12??q2?vS*9 vS*%90359???q?1????q?1??uS*9?uS*)9?399???q?1????q?1??uS??*9?uS??*-9?3
=9?#}??#}@?!@??/G??3L????F??
??#
??O?R???R???r?WJ??O@?U?@9MQ

??@9?}S??
3?@9?}S??O*?#"H   TBN?#&&?N?~??M???4N??3N??2N??'N??"nR?"ns?"n??"n??0Ns?0NR?0N??0N?#NR#Ns#N?#N?n?Nsn?NRn?N?l?N?d?NRf?Nsf?N?f?N?SNGGN?Ng?Nއ%N??=??nJ?!N??*n??*n??*nJ?:n??)nk?!N??+n)?+n)?+nk?;n{?+nZ?*n?!N??!NZ??n{?(nk?(nJ??n_??nh?(n
^) j)*^J)+^H)(?^)?)*?^)*?^)?(^?+)?+((^?+((^?+(?^?+>?+(?^?+(h^?^?+>+ ?+(h^?+({^?+;_^{+:{+?_^{+?Z^z+:?^Z+=Z+;?^Z+;?^Z+;?^Z+<Z+;?^Z+;?^Z+;?# [>{ \;???(q???T???4?"}'ZG=Z6?|@-H>?')=&sZks??ks‚tPQ?>?(?"?		)	I?))=4&?Z?k????k?‚?PQ???"?)?{
?	*?#
?$A-J(J)=T&?Z?k????k?‚?PQ
	(?"	*yH	+}H))=&?Z?k????k?‚?PQ(	))	(?">y
	*}
?$B-J(J)=T&?Z?k????k?‚?PQ
	(	*?"yH	+}H))=&?Z?k????k?‚?PQ(	))	(?">y
	*}
?$C-J(J)=T&?Z?k????k?‚?PQ
	(	*?"yH	+}H))=&?Z?k????k?‚?PQ(	)?")	(>y
	*}
?$D-J(J)=T&?Z?k????k?‚?PQ
	(?"	*yH	+}H))=&?Z?k????k?‚?PQ(	))	(?">y
	*}
?$E-J(J)=T&?Z?k????k?‚?PQ
	(	*?"yH	+}H))=&?Z?k????k?‚?PQ(	))	(?">y
	*}
?$F-J(J)=T&?Z?k????k?‚?PQ
	(	*?"yH	+}H))=&?Z?k????k?‚?PQ(	)?")	(>y
	*}
?$G-J(J)=T&?Z?k????k?‚?PQ
	(?"	*yH	+}H))=?&?Z?k????k?‚?PQ(	)=	(?"?{		)?	?# ?=?>??(m??T?@??;?????'?"6%T???y????????????????????=??y??JI?	?A??TJ??T4u4??#??}?[@??cA?9??O??O???O֒?O?
N??4N??4N?4N9?4N9$N$N?$N?$NN?n?N?n?No?N9o?N8XN?VN?N?0?=?B????@???TVie<֦֦??!^?
6?" ???T??`A??h@??NZ?6n9?6n?6n??6n??4N?4N8?4NY?4N9$N$N?$N?$N:N?n?N?n?No?N9o?NZN9g?Ng?N?f?N?f?N?WNYN?Nֆ%Nvy??(=?(<?(4?(;?(:?(91"????T??T?@q"T
???/?/
m|??/h?R?
N??O??o???=?
????????/6VA?3R@????Ox??Oْ?O???OZ?'N9?'N?'N??'N?0N0N90NZ0NZ??N9??N??N???NWl?NXl?NYl?NZl?NZg?N9g?Ng?N?f?N???N??N=??N^??N{cN??(=?(<?(4?(;?(:?(9"????T??@Tn
?
?h?RM
??E@?''*1&1Z1PQ_kQ???	k1‰%?8?'?01"?
1?????T?%?  ?/%? %"
m|?q}????P????????R???rh?R??O??o`1t
 ??(q??T???4?"?'1!?N@q??BT???/?/yT???/?/?/?????
??/wb?vV@????O??Oے?O9?2NZ?2N{?2N9&NZ&N{&N9??NZ??N{??NYl?NZl?N[l?N9g?NZg?N{g?N?v????)q??T???4"?'?,&? 'CP-?'?'1*&)&)Y?k)???k)??*PQQKP-?1S"? 1
31"?0s*&j&JY_kJ??_kJ??JPQS"
2P
3F1KQ-?1s*&j&JY_kJ??_kJ??JPQSSQ-1
3U"'q
50B?21*&*&JY_kJ??_kJ??JPQQ
4R"'?
20B1KR-?1s*&j&JY_kJ??_kJ??JPQSSR-1
3U"'q
50B?21*&*&JY_kJ??_kJ??JPQQ
4R"'?
20B1KS-?1s*&j&JY_kJ??_kJ??JPQSSS-1
3U"'q
50B?21*&*&JY_kJ??_kJ??JPQQ"R
4G?
1PB1KT-?1s*&j&JY_kJ??_kJ??JPQSST-1
3U"'q
50B?21*&*&JY_kJ??_kJ??JPQQ
4R"'?
20B1KU-?1s*&j&JY_kJ??_kJ??JPQSSU-1
3U"'q
50B?21*&*&JY_kJ??_kJ??JPQQ
4R"'?
20B1KV-?1s*&j&JY_kJ??_kJ??JPQSSV-1
3U"'q
50B?21*&*&JY_kJ??_kJ??JPQQ"R
4G?
1PB1KW-?1s*&j&JY_kJ??_kJ??JPQSSW-1
3U"'q
50B?2&*&?&JY_kJ??_kJ??JPQF
4Q"??
1?@?  ?&?'?1m??T%C?<0C?<??O???O??!N?!N???e 0G?&F?ѐ?O???O??O吅O%ԥN3ԳN2ԲN1ԱN1n2?>nZ?=nZ?=nR?>n^wX???>n?=ns?!N{?!N?;n??3n??3n??;n??;n??3n}^~*(?+=~^?+>s^?+3}^s*;s*=}^s*={^s*;[^s*2s*;[^s*;R^r*2S^R*:R*3S^R*3?^Z^R*:?((S+3?^s*:?^g*'^?( ?(3^?(3^?( ^(0('^('^('?^(%('?^('?^(%H" 2?(:	?)?)q'?T???4 "?','&0C?0?'R*'J&JY_kJ??_kJ??KPQRC?
2s""R
3R"3C?3{+'k&kYkk??kk??kPQ[C?}"s
;pBs=rJ3C?3{+'k&kYkk??kk??kPQ[C?s
;}"pBs=rJ3C?3{+'k&kYkk??kk??kPQ[C?s
;}"pBs=rJ3C?3{+'k&kYkk??kk??kPQ[C?s
;}"pBs=rJ3C?3{+'k&kYkk??kk??kPQ[C?s
;}"pBs=rJ3C?3{+'k&kYkk??kk??kPQ[C?s
;}"pBs=rJ3C?3{+'k&kYkk??kk??kPQ[C?}"s
;pBs=rJ3#C?3{+'k&kYkk??kk??kPQ[#C?s
;}"pBs=rJ3'C?3{+'k&kYkk??kk??kPQ['C?s
;}"pBs=rJ3+C?3{+'k&kYkk??kk??kPQ[+C?s
;}"pBs=rJ3/C?3{+'k&kYkk??kk??kPQ[/C?s
;}"pBs=rJ33C?3{+'k&kYkk??kk??kPQ[3C?s
;}"pBs=rJ37C?3{+'k&kYkk??kk??kPQ[7C?}"s
;pBs=rJ3;C?3{+'k&kYkk??kk??kPQ[;C?s
;}"pBs=rJ3?C?3g+'?&kYkk??kk??kPQ[?C?g
;s"?@p3J" ?'?0D?3m??TJ??C
9IP?R??O???O??!NR?!NRԾN3ԳNsn??!NJ?!N??*nP?-n??-n??*n??*nR?-nM+Z???-n?*ns?!N)?!N?)n??3n??3nJ?)nI?)n??3nj^m*(?)*m^J)-s^S)3*^s*)s***^s**)^s*)I^s*2s*)I^s*)R^r*2?^R*>R*3?^R*3?^?^R*>?((?+3?^s*>?^g*'^?( ?(3^?(3^?( ^(0('^('^('?^(%('?^('?^(%H" 2?(>	?)?)q@??T???4 "?','&0CC?0?'R*'J&JY_kJ??_kJ??KPQRCC?
2s""R
3R"3GC?	3))'+&kYkk??kk??kPQIGC?j"s
)pB
3	*rJ
3KC?	3))'+&kYkk??kk??kPQIKC?s
)j"pB
3	*rJ
3OC?	3))'+&kYkk??kk??kPQIOC?s
)j"pB
3	*rJ
3SC?	3))'+&kYkk??kk??kPQISC?s
)j"pB
3	*rJ
3WC?	3))'+&kYkk??kk??kPQIWC?s
)j"pB
3	*rJ
3[C?	3))'+&kYkk??kk??kPQI[C?s
)j"pB
3	*rJ
3_C?	3))'+&kYkk??kk??kPQI_C?j"s
)pB
3	*rJ
3cC?	3))'+&kYkk??kk??kPQIcC?s
)j"pB
3	*rJ
3gC?	3))'+&kYkk??kk??kPQIgC?s
)j"pB
3	*rJ
3kC?	3))'+&kYkk??kk??kPQIkC?s
)j"pB
3	*rJ
3oC?	3))'+&kYkk??kk??kPQIoC?s
)j"pB
3	*rJ
3sC?	3))'+&kYkk??kk??kPQIsC?s
)j"pB
3	*rJ
3wC?	3))'+&kYkk??kk??kPQIwC?j"s
)pB
3	*rJ
3{C?	3))'+&kYkk??kk??kPQI{C?s
)j"pB
3	*rJ
3C?	3')'?&kYkk??kk??kPQIC?g
)s"?@0	3J" ?'?0D?3m??TJ??
9IR?R??O???O??!NR?!NR???e&2C]?'\??O	??OJ??O??O%ԥN*ԪN)ԩN3ԳNs???@?R??'}???AT?~???	????=T???>T?Ҁ"?)?E??/???R
ҤrK?R$h?R??O??R
?r?K2??oo??O?????R???r???
?????=T???/?zb??B?????T??? ?N???o?S??/?o??#DT??}?VO??N? ??^?*>?^?*=?^?*<?*=?^?*=?^?*<|^?*;?*<|^?*<{^?*;[^?*:?*;[^?*;Z^?*:?^?*6?*:?^?*:?^?*6?^?*7?*6?^?*6?^?*66^?*9?*66^?*66^?*6^?*8?*6^?*6^?*6?@?????????T?4?" v!?
6??S@???(q`T???4?ҵ"7'?
7?'?/?/zh?<[??O{?0N{#N{o?N{g?N{??N?*=?@???a??T?" ?
75D?;m??T?PA??`@???O֒?O???Os??Os?0N??0N??0N?0N#N?#N?#Ns#Nsn?N?n?N?n?No?Ng?N?f?N?f?Nsf?NsTN?XN?Ns?%N?XC??hB?Z??O??O֒?O???O??0N??0N?0NY?0N9#N#N?#N?#N?n?N?n?No?N9o?N9g?Ng?N?f?N?f?N?VNYN?N??%N?5?
6????S?H???~?????ď??@?R??5{????T???T??h?~???)????T??Th?????T
h?~???)????T?Th?????T??Z?	?)5@?)@???AT|??{P??OO??WN??_M??#Lm?+Km?C??_־??????;m?3m?+m?#m?_??W??O??{?????????????5@?@????d????`?R???z????T?~???	???-?T?~?i?T?Ҁ"???)?E??/
h?R??O??R?rDO?̌R??r??o???R???rn?????R?
?????@?T???/?zq? 1?????T???@?!N??=???F??/??#"V?B}?#B}TO?N@@?<1?!??	???T#?y?????@?=??=?N? N!??nb@?^?!nA?=?N"?!NA??na?!n??A?=?N"?!NA??nbA?A?!nB?=?NG?"N???nb?"n??A?=?N"?!NA??nbB?A?!nB?=?NG?"N???nb?"n?	?A?=?N"?!NA??nbC?A?!nB?=?NG?"N???n?"n?
?B?@-@  AL ?-B? ` !aL!` "b?"C@?` !aL!` "??b?"CB-` !aL!` "?-b?"? !?L!? "??"CC-` !aL!` "?-b?"? !?L!? "??"GD-? !?L!? "????"` !aL!` "b?"WE-?"!?N!?""??"? !?L!? "?s???"Y`F- #!!O! #""?"#!O!#"?"I(G- !!!M! !""?"@!!AM!@!"B?"K0H-`!!aM!`!"b?"?!!?M!?!"??"M8I-?!!?M!?!"??"?!!?M!?!"??"OLJ-?!!?M!?!"??"`"!gN!`""p?"AK-  ''L'  00?0@ 'QL'@ 0P?0GhL-? 1?L1? 0??0@#1QO1@#0P?0[pM-`#1qO1`#0p?0?#1?O1?#0??0]PN-?#1?O1?#0??0?"1?N1?"0??0UXO-?"1?N1?"0??0?"1?N1?"0??0PZ( "0?^T?R?>n?#\-?????@?I?+(??N??\-?????@?R*(?#]-?????@?R*(??]-?????@?R*(?#^-?????@?R*(??^-?????@?R*(?#_-?????@?R*(??_-????@?R*(?A??A??C*??A??A??#-@c(2?A??A??s@?@c(2?A??A??-@c(2?A??A?@c(2?A??A??g
-@	c(2?A??A?@
c(2?#A??A??c-@c(2?'A??#A?@c(2?+A??'A??c-@
c(2?/A??+A?@c(2?3A??/A??c
-@c(2?7A??3A?Sc(2?;A??7A??_	-ANr(2??A??;A?aB*3?CA???A??-AG(2?GA??CA?A?(2?KA??GA??-wR*3?OA??KA?w^S*3?SA??OA??/?_x*8?WA??SA?7_+9?[A??WA??-"_+9??_?^?*67:0N?%7]pA??׺N???O?׺N??OH|@??׺N	??OպN
??OX
NJ?8N)?8N9?8N??8N?$N+$N)$Ny
NJ$NJm?N)m?Nkm?N?n?N?f?Nke?N)e?NWe?NjLN?IN?
N???N??!N.;N?N??O)??N)?!NM?N-?Oi??N)?!NK?N+?O???N)?!NL?N,?O?ռN}սN?տN?ըN??k),?^k),?^?^~)>?^?+5?++?+,?0A?B?!Nm?"n??.n?^?+5~^?*+?*>~^?*>?!N?? nr?2n??/nk^?*+?^?*,?*+K^J)2J)+K^J)+??#nR^R)2j^R*#R**?^?**j^R**??"nc^C*#R^c("c(2R^c(2?? nB^b("^B( B(#^B(#c^2)3C*#r^c(2r^c(2?^c(4c(2?^?*2?^c(2?^c(2c(-?^c(2?^c(2?^c(2?^c(>c(2?^c(2^J( ?^i( ?@??????????T?A! 	??
! ???T 	:?(b	?B	B(c*H  h? ?/_X2??B=?!~}B@-8" ?@?@H?B=B?!~}B8#B"?@?`?B=B?!~}CHA-B8#B"?@?`?B=B?!~}B82B"?@?`?B=B?!~}CHB-B8#B"?@?`?B=B?!~}B82B"?@?`?B=B?!~}CHC-B8#B"?@?`?B=B?!~}B82B"?@?`?B=B?!~}CHD-B8#B"?@?`?B=B?!~}B82B"?{@?`?B=B?!~}CHE-B8#B"?w@?`?B=B?!~}B82B"?s@?`?B=B?!~}CHF-B8#B"?o@?`?B=B?!~}B82B"?k@?`?B=B?!~}CHG-B8#B"?g@?`?B=B?!~}B82B"?c@?`??B=B?!~}CHH-B8#B"?_@?`??B=B?!~}B82B"?[@?`??B=B?!~}CHI-B8#B"?W@?`??B=B?!~}B82B"?S@?`??B=B?!~}CHJ-B8#B"?O@?`??B=B?!~}B82B"?K@?`??B=B?!~}CHK-B8#B"?G@?`??B=B?!~}B82B"?C@?`??B=B?!~}CHL-B8#B"??@?`??B=B?!~}B82B"?;@?`??B=B?!~}CHM-B8#B"?7@?`??B=B?!~}B82B"?/@?`??B=B?!~}CHN-B8#B" ??B=B?!~}B82B"?3@?`??B=B?!~}CHO-B8#B"`??B=B?!~}B82B"? !=???T?E???A =A ?C ^???o???/?o3???~?????W???`?R???v????T???T??h?~???)????T??Th?????T
h?~???)????T?Th?????T??X???)5@?)@???T|??{^??O]??W\??_[??#Zm?+Ym?3Xm?;Wm????_?t?????;m?3
m?+m?#m?_??W??O??{??????????????5@?@?????F?????R???v???JT?~???	????FT????FT?Ҁ"???)?E????R
Ҥr??R??OL????=L????=L????=L????=L???=L???=L???=&L????=h?R??O??R
?r?G2??oO??O?C????R???r????
?????`DT???/?zb?8cB?????T???@?"N??3?o????/??#DT??}?@?DobTo?`??^B(>?^B(%?^B($B(%?^B(%?^B($d^B(#B($d^B($c^^(#^?+(b("^B(#^B(##^B()B(##^B(##^B(#c^B(+B(#c^B(#c^B(#C^B(*B(#C^B(#C^_(#?@?????????T?>?# ?/^#?>???@???(q`T???4?Ң"#'BL#K9?/?/bh?????????O?N??N??N?N0?NQ?N??N???~???????????R??ot????T???T??h?~???)????T??Th?????T
h?~???)????T?Th?????T??X???)5@?)@???T|??{S??OR??WQ??_P??#Om?+Nm?3Mm?;Lm???_?????;?m?3m?+m?#m?_??W??O??{??????
???????????5@?@????D??????R??*t????T?~???
???
?T???C?T?ҩ?р"???J?E?h?R??O??R?rDO??o?̌R??r???R???rO??C?Q? ??=?#?=Q? ??=??=Q? ??=??=Q? ??=??=Q? ??=??=Q? ??=??=Q? ??=??=Q? ??=??=?R?
????? ?T???/?za? !?????T?????@?!?????o????/?3?=?3?=?##T?`}@?#`}??O?o To`??<1?O@1N?oC?/?/?/B?o?o?#?=D?n??=BD?n??=?D?n?CB?cD?n!o!1N0?o?/!?/2?/?o!?o!D?n??=F?n??=RF?n??=1F?nc?N??NB?N?N?N??N ?N@n?<&?*d?!?B??
? ??T#?y??????@-??????@?d?!a@-  ??`d?!@ ???A-????d?!aA-  ???`d?!@ ????B-?????d?!aB-  ???`d?!@ ????C-????{?d?!aC-  ??`d?!@ ?w??D-?s??k?d?!aD-  ?o?`d?!@ ?g??E-?c??[?d?!aE-  ?_?`d?!@ ?O??F-?K??W?d?!aF-  ?S?`d?!G ?(G-?e?!aG-  ?-@e
?!G ?H-??@g?!aH-  ?-`d?!G ?XI-?f?!aI-  ?G??f?!@ ?C??J-???@f?!aJ-) `d?!@ ?;??|K-?/?d?!aK-# ?g?!O ?4L-?e?!aL-  ?7??e
?!] ?lM-?g?!aM-5 `g?!K ?DN-?3?d?!aN-4  f?!\ ? O-`f?!aO-0 e?A OB ?!B ?A??A??!-?A???A??"-?A???A??#-?A??wA??$-?oA??gA??%-?_A??OA??&-?SA??@??'-??V-?(-?@??)-?'??GA????;A??CA???*-?#??B ??+-???A????sA??7A???,-????--????-??.-??-??/-\@ ?KA??C??A???A??"!?N!??!??A??" ?N ?"!??!?@???A??" ?N ?"!??!?A???A??# ?O ?#!??!?{A?`  `L ` !a?!?  ?L ? !??!" N "!?!?" ?N ?"!??!?kA??  ?L ? !??!?cA?`  `L ` !a?!?[A?`  `L ` !a?!@  @L @ !A?!?WA?`  `L ` !a?!?! ?M ?!!?-??!?/A??3A?@! @M @!!A?!@# @O @#!?+?A?!??A? !  M  !!!?!?" ?N ?"!??-??!?" ?N ?"!??!?! ?M ?!!??!@  @L @ !A?!?! ?M ?!!??!?# ?O ?#!????!?! ?M ?!!??!?! ?M ?!!??!?# ?O ?#!????!`# `O `#!??a?!`  `L ` !a?! "  N  "!!?!`" `N `"!a?!! M !!?!?/X"  2I??T?A ?R?? 82??-?'?s?=2 ?3-?7A???_-????C ?GA??CA?????s?=N.2?A??L@??A??֧N?A?c֧N0ԧNԧN1??O??Oc??OB??O?OA??#A?o
NB?/Nc?/N?/N1?/N1$N$Nc$N?
NB$NBl?Ncl?Nn?N1n?N1f?Nf?Ncd?NBd?NT??N?wA??A w??N??NQN1??NBCNPN"?!N??!N??!N??!N??N??O??N4?O??Nq?O??NC?O`ԠN!֡N?C??DB??ֳN?ֶN??4ns?3n!?!n? n?????S-?B(;cB(:??@?C?;A?B(7??A???A?B(7?
?A?B(7?A??B(??_]-??A?B(7?B(+?A?c
B(,?A??
B(-?3A??
??@?B(7??@????@?B(7??@??H(=??@??^ ( ????-@@!???B ?@ ;B zB ?B ?B ?B ???s?=c?q???T??`"?'?'?'(!?A?!82?s?=VN!?/??????/?/?@??4A??նNֶN#ԶN4ֶN???Oc??OB??O??O?/NB?/Nc?/N??/N?$Nc$NB$N$Nl?NBl?Ncl?N?n?N?f?Nsd?NTd?Nd?N???N???Nc??N???=HbNR??Nj?!!@?G=!?!~?^!8;!!`?G=!?!~?^?+A?!8"!! ?G=!?!~?^!8.!!?'A?@?G=!?!~?^!8'!!?GA?@?G=!?!~?^!8*!!?CA?@?G=!?!~?^??@?!8"!!?#A?@?G=!?!~?^??A?!8"!!?;A?@?G=!?!~?^?/A?!8"!!?A?@?G=!?!~?^?A?!8"!!?A?@?G=!?!~?^??@?!8"!!?7A?@?G=!?!~?^??@?!8"!!?A?@?G=!?!~?^?A?!8"!!?A?@?G=!?!~?^?A?!8"!!?A?@?G=!?!~?^?3A?!8"!!??@?@?G=!?!~?^??@?!8"!!??@?@?G=!?!~?^??@?!8"!!??@?@?G=!?!~?^??@?!8"!!??@?@?A? !?s?=???T?N????B ?3?=???B M???~???????????R??.o????T???T??h?~???)????T??Th?????T
h?~???)????T?Th?????T??X???)5@?)@???T|???
??{G??OF??WE??_D??#Cm?+Bm?3Am?;?l?_ֵ???_???W??O??{?????????????R???n????b~?????q????~??{C??OB??WA??_Ĩ?_?H??_?	???_?kT??)?H?
?.??R?/L>?Rm??R`?RO?R?????/hq?B? ` "c?"1???A??T#h  B!c?#?#j}?? ?R??P?C#e$??X?C#f$????@?C#f$?????@?C#f$????A?C#d$????!?8?|
?|S?K?D?|SD8c?????T???
?cP?C#d$?cT?C#e$????cX?C#e$???c\?C#e$???cD@?C#e$???!?8?|
?|S?K?D?|S???9B?_@????T?C?C#b$??C?C#c$?BBB?C?C#c$?BB?C?C#c$?BB<C8c|
c|SBKbBB|S"?9?C?C#b$??C?C#c$?BBB?C?C#c$?BB?C?C#c$?BB<C8c|
c|SBKbBB|S"?9?C?C#b$??C?C#c$?BBB?C?C#c$?BB?C?C#c$?BB<C8c|
c|SBKbBB|S"?9?C?C#b$??C?C#c$?BBB?C?C#c$?BB?C?B#C$?BB<C8c|
c|SBKbBB|S"?9????J?	?A??T?_?H??_?	???_?KT??)?H?
?.?/K?R??
???/hm?B? ` "c?"????A??T#h  B!c?#
???}???R??X?C#p$??@?C#q$?1vS113?@?C#p$?nSB0*?A?C#o$??e3?8??????T
???
??@?C#o$?Á@?C#p$??vS?3?A?C#o$??mS?A?*ÁA?C#p$?f3??
??9?????????T???	?J?	????T?_????????_???W??O??{????????????@?R???m????b~??????????~??{C??OB??WA??_Ĩ?_??_???W??O??{????????????`?R???m????b~?????x????~??{C??OB??WA??_Ĩ?_?H??_?	???_?bT??)?H???R ?Oa?Ob?c?O$?OK?k	?l?R-
?Re?O??
??i@}?@9~SQ"?@9~SQ"?@??'?0'@-?	@9~SQ"?
@9~SQ"?'?0'@-?@9~SQ"?@9~SQ"?'?0'@-?@9~SQ"?@9~SQ"?'?0'@-?!@9~SQ"?%@9~SQ"?'?0'@-?)@9~SQ"?-@9~SQ"?'?0'@-?1@9~SQ"?5@9~SQ"?'?0'@-?9@9~SQ"?=@9~SQ"?'?0'@-?A@9~SQ"???'?E@9~SQ"?0'@-?I@9~SQ"?'?M@9~SQ"?0'@	-?Q@9~SQ"?'?U@9~SQ"?0?Y@9~SQ"'@
-?1?]@9~SQ"?0'@-?a@9~SQ"?'?e@9~SQ"?0'@-?i@9~SQ"?'?m@9~SQ"?0?q@9~SQ"'@
-?1?u@9~SQ"?0'@-?y@9~SQ"?'?}@9~SQ"?0#?0?'@-?B	T??	T?????ib8cd?#c|ScQg"?'F?B?_????T"???1B??
T?A@?? N?/?o??an??b.3?an1?b.??o48o??oq8o??o?8o??oG8o??!Nr?!N1?!N??!Ns??O1??OR??O理O?F?? N?/?o??an??b.?an?b.??o8o??oP8o??o?8o??o'8o??!NQ?!N?!Nr?!NR??O??O1??O理O?B??E?A@??%N?/?o??an??b.3?an1?b.??o48o??oq8o??o?8o??oG8o??!Nr?!N1?!N??!Ns??O1??OR??O理O2?3D??%N?/?o??an??b.?an?b.??o8o??oP8o??o?8o??o'8o??!NQ?!N?!Nr?!NR??O1??O理O1???O2?"???1B????T???ib8cd?#c|ScQg"?'F?B?_????T"???1B??T?A@??#N?/?o??an??b.3?an1?b.??o48o??oq8o??o?8o??oG8o??!Nr?!N1?!N??!Ns??O1??OR??O理O?F??#N?/?o??an??b.?an?b.??o8o??oP8o??o?8o??o'8o??!NQ?!N?!Nr?!NR??O??O1??O理O?B?????ib8c|d?#c|ScQg"?'F?B?_????T!
???1A??T?A@??$N?/?o??an??b.3?an1?b.??o48o??oq8o??o?8o??oG8o??!Nr?!N1?!N??!Ns??O1??OR??O理O?F??$N?/?o??an??b.?an?b.??o8o??oP8o??o?8o??o'8o??!NQ?!N?!Nr?!NR??O??O1??O理O?B?????iq8!|
"A!!|S!Q'"?'F?1??????T??bia8?@9Q|#q11~S1Q'"???'??@9P|p0~SQ"?0'B-??@9P|p0~SQ"?'??@9P|p0~SQ"?0'B-?@9P|p0~SQ"?'?@9P|p0~SQ"?0?@9P|p0~SQ"'B-?1?@9P|p0~SQ"?0'B-?@9P|p0~SQ"?'?@9P|p0~SQ"?0'B-?@9P|p0~SQ"?'?@9P|p0~SQ"?0?@9P|p0~SQ"'B-?1?@9P|p0~SQ"?0'B-?@9P|p0~SQ"?'?@9P|P0~SQ"?00?'B-!???a??T??@9!!|S!Q'"??@9!!|S!Q0"?'?0B-??@9!!|S!Q'"?'??@9!!|S!Q0"?0B-??@9!"A!!|S!Q'"??@9!"A!!|S!Q0"?'?0B-??@9!"A!!|S!Q'"?'??@9!"A!!|S!Q0"?0B-??@9!"A!!|S!Q'"?'??@9!"A!!|S!Q0"?0B-??@9!"A!!|S!Q'"??@9!"A!!|S!Q0"?'?0B-??@9!|"A!!|S!Q'"?'??@9!|"A!!|S!Q0"?0B-??@9!|"A!!|S!Q'"?'??@9?}?//?}S?Q?"?0!?-????	끟?T?_?H??_?	???_?T??)?H?J?R??
?`?@}@?/?R????o???qil81&?11Q!"!??@91&?11Q!"!??	@91&?11Q!"!
??
@91&?11Q!"!??@91&?11Q!"!??@91&?11Q!"!??@91&?11Q!"!??@91&?11Q!"!??!@91&?11Q!"!"??%@91&?11Q!"!&??)@91&?11Q!"!*??-@91&?11Q!"!.??1@91&?11Q!"!2??5@91&?11Q!"!6??9@91&?11Q!"!:??=@91&?11Q!"!>??A@91&?11Q!"!B??E@91&?11Q!"!F??I@91&?11Q!"!J??M@91&?11Q!"!N??Q@91&?11Q!"!R??U@91&?11Q!"!V??Y@91&?11Q!"!Z??]@91&?11Q!"!^??a@91&?11Q!"!b??e@91&?11Q!"!f??i@91&?11Q!"!j??m@91&?11Q!"!n??q@91&?11Q!"!r??u@91&?11Q!"!v??y@91&?11Q!"!?}@91&?11Qz?!"!??	?~????!???T?R?R??7?	???T?_?H??_?	???_?T??)?H?,*J?J!?K?b??=K?k!9?L???B?L?RM???B?M???B???}?hn|?@?N?R?in???H???P???X???|?G#E
/??`?di?8?@??( N?!n?#?&?`??R@
???!R@
B>?NG&RN?5??Os??%1???@=?N??!~?4?4??@=???n??!~?7??7C
#??gӳxnfi?8u@??N??!n?>4???O??#֚`?q֦???nd??@
?nd??@
D???9G&?N?N3?=?s%s??w@=5?=??!~?5??5??RN?>5w@=??!~?74X-?7?q??n?bi?8??8Q
1?6@??N??!n?N֒?OW?#5P-??`?????n?un$?R?@
$??@
V?>?&?NR?!.4?=?N?N??!.?V7@=??!~??!.?7??7??7P
0??2.??u?ci?8@?N?4.?!n??Oy9#?5.9?`9???nX?n?Y??.?@
??@
???.D?E&?NQy.?%?N?N?{.R??T??!.?4.???.?t.t?%?????.??.4@=??!~?4?4_q1???57D-8?=@=3?1?!~?1?1??q>12(?@=R?!~?2?2q08??31-!??!??	????T??	?	????T?_?????{??C???5@?@???H??_?	???_?+'T??)?H?
??L	?R ?/??g?M??!;?N??!9???}?hp|?@???Qio8%&'? ?!???@??@???!~?%q@=?rň%f@=1?!~?1?1?@?%?@??r??!~s@=4
&G'&?&?r?&q?!~%-e@=
1?1?r?@??0?@???!~2
%s@=%?%?rE%q?!~
1?1&-?rf@=??!~?@??@?P0?&?&g@=??!~3
'_q@yb?I??ib8'?'Ƽ2?qb<q @??
?%@-e@=???!~?@??@??3
%?%?rp@=?!~E%r@=3
00?0?r&-F?!~?@??@??&?&g0?rF&p@=?!~%-%
0'?0?rp@=?!~?'?@??@??0?0?rG'p@=?!~2
00?0&-?re@=??!~?@??@?P0?%ň%_qf@=??!~??22
&&?&@y?<? @??q?
???I??iq8'@-?g@=??!~?@??@?Ƽ2
'?'?rp@=?!~G'2
00?0?rq@=%-%?!~?@??@??%ň%F0?re%p@=?!~'-&
0'?0?rp@=?!~?'?@??@??0?0?rG'p@=?!~2
00?0%	-?re@=??!~?@??@?P0?%ň%_qf@=??!~??22
&&?&
@y?<? @??q?
???I??iq8'@
-g@=??!~?@??@?
'Ƽ2?'?rg'p@=%-?!~&
%%?%?rp@=?%?!~?@??@?
&?&?rF&p@=?!~2
0'-%?0?rg@=??!~?@?E%?@?
'?'?rp@=G'?!~2
00?0?r&
-e@=??!~?@??@??%P0ň%_qf@=??!~2
&??3&?&1?qƼ2'@-%-!???"??!???T?J)?k)?	????T?@???)5@?)@???T?{A?????_???H??_?	???_??"T??)?H?
???L
?R,*M??!;???}?ho|B@????
??!@9Q##1?c( B|S?]8?@9c"e\S?x????
??@=c!??!~e$?_8d?$?r?$?@=??!~f%e?%?r?%?@=??!~g&f?&?r?&?@=??!~p'g?'?r'?@=?!~q0p?0?r00?@=1?!~r1q?1?rQ1?r?$-&-?@=??!~e$d?$?@=?$??!~f%e?%?q0F-?]8cdScx?c??
???&f@=??!~g&?_8f?&?r?&g@=??!~p'$-d?'?re@=??!~g%$e?%?r?%g@=&-??!~f$?_8d?$?r?$f@=??!~g&f?&p@=?r?!~q0p?0r@=R?!~?&g2r?2s@=s?!~%-d3e?3C#?r00c( c"c!?r??8?2_q?]8?@9clS&B-cx?b??
?F@=??!~??$e&?_8f?&rP@=?&?!~p&f?&r'-&F@=??!~g&f?&r?&G@=??!~p'%-d?'rE@=??!~g%$e?%r?%G@=&	-??!~f$d?$rG@=?$??!~g&f?&rP@=?&?!~p'??8g?'^8_q?@8BtSBx?B?%
-?
?D@=??!~e$@9?0d?$r?$E@=&-??!~f%e?%rG@=?%??!~g&f?&rP@=?&?!~p'g?'r$-'E@=??!~g%e?%r?%G@=??!~p'&
-d?'rF@=??!~g&$f?&rP@=?!~q0?&c?0?9_qc?1%-&-?????!??T!??JI?kI?	???T?_??O??H??_?	???_?T??)?H?
?K?R,,???B?,???B?,??!9?-???=-??B?MЭ!;?????%@|?@??
?F@?Q|\?&#E@??i?81??@9?	??@
?( ??r@
C>?%? G&rN?N?@9??"?N???@=1?!~?yg??1?qsNs?!n?ш1?$??`???@=??!~w??O?6ֈ6F4GӅi?8???n?
@9?	??@
???>1s@
s>t&?qsN?N?	@9?yn?1"1???@=־8??!~?7׈7?qrN?yd?9N9?!n9??O5?=??$??`sN??:??n5zn?@=9?!~?7?9و9FPNӃi?85
?=?@9?	??@
???q?@
?>4Z-4?8?&?N7R-V?N?Nt?@9r?@=s?!~??3ӈ3?q?ye???!.?>3N??!nx??!.???O$?`????n??!.7?n7?=ElUӂi?8??6.?@9?@9?	??yg???4.?N??!n???OX??5.$?`????n7?n???.?@
???@
???.'?3&?N?x.R"yN?N?z.R??4??!.??4.???.?t.T?"??????.??.?@=??!~?4Ԉ4q0
???53B-?@=?!~1??0Ј0?q0>07?=2*??@=1?!~?1ƈ1_q':?Ƽ20-?!???????T!??J??	?a??T?O???_??g???_??W??O?H??_?	???_??T??)?H?
???,?
8??
?RO??!???}??C?@?D|@??
???????SP?sjq84?Rt3?"!s~Ss2b"??R????_8w@9v?"֚?x????	??&@8?"Ӛ?x????	??@=c?!~$#Whg8#?#?r?#?@=??!~%$Whg8$?$?r?$?@=??!~&%Whg8%?%?r?%#-?@=c?!~%#Whg8#?#?r?#$-?
@=c?!~$#Whg8#?#?r?#?
@=??!~%$Whg8$?$?r?$?@=??!~&%Vhg8%?%?r?%#-?@=c?!~%#Uh?8#?#?qc?%??$-s
Q!??????T??"??R????6???_8y@9x8#ؚx???	??&@89#Ӛ9x?7??	?@=B?!~#"?@9"?"?rb"?@=c?!~$#?@9#?#?r?#@=??!~%$?@9$?$?r?$?-?@=B?!~$"?@9"?"?r?"?
-@=B?!~#"?@9"?"?rb"?
@=c?!~$#?@9#?#?r?#@=??!~%$?@9$?$r?$?-?@=B?!~$"??8"?"?qB?$?
-s
Q??????T!?c?B ?
??@??@?? ???????T?k????????	???T?OC??WB??_A??gĨ?_?H??_?	???_??
T??)?H?J?R8(??L??!+?
}
?hm|B@?M?RN?Ro
?qinx">0~S#~Scc2c#C#_q$? ?@9#^Scx?b??
?E@???????!N?N??%N???O%?=E@???????!N??%N???O%?=?@9#jScx?b??
?E@???????!N??%N???O%?=E@???????!N??%N???O%?=?	@91vS1
x?1??
?%@???????!N??%N???O%?=%@???????!N??%N???O%?=?
@9
x???
??@???????!N??%N???O%?=?@???????!N??%N???O#?=!??	????????T?k??	???T?_??O??H??_?	???_??T??)?H?
?R8(K?k!+??R

??
??
Cx??@92O*?i@y~S?*?m@yN?*?'B@?????y?Ipx?1&?#?RC3c"D#1&?1?R
3%"?@9?@9dp|Sb3?@9
3?	@9?@9??|S?3?
@9p
3r& ?q'? ?r0 ?q#? bM"?Q@?1?1?1?!N?N??1N1??O1?=Q@?1?1?1?!N??1NƐ?O&?=bM%?F@?ƤƤ??!N?N??&NƐ?O&?=F@?ƤƤ??!N??&NĐ?O$?=D%qM1?%@???????!NN??%N???O%?=%@???????!N??%N???O%?=pM0?@???????!NcNe?%N???O%?=@???????!Nc?%Nc??O#?=!????	???!q???T?	?A??T?O???_?H|?_????_??kT?E?	 ?j?J!+? ?_|@?+?_8l
@?Ail@9B@?bib@9B?D?cib<"<?b?B?B?!^!"!|?!?B????	?!q???T?	?A??T?_?H??_?	???_?K;T??)?H??_?Rh?R`
N??O??R?rb
N?$?R.?o?E'?&A?琅OƐ?O@@?1??O??O? N1? N?? N?? N?!N?!N1!N!Nn?N1n?N?l?N?l?N?FN'PN?NC???O琅O??A?<B?1??OƐ?O?? N1? N?? N? N!N?!N1!N?!N?l?N1n?N?l?Nn?NGN&FN?N?A?<D?@E?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<F?@G?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<H?@I?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<J?@K?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<L?@M?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<N?@O?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<P?@Q?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<R?@S?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<T?@U?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<V?@W?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<X?@Y?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<Z?@[?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<\?@]?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A?<^?@_?1??O??O琅OƐ?O?? N?? N? N1? N1!N!N?!N?!N?l?N?l?Nn?N1n?N0PN?FN?N?A???|q??}qKT	}@?jP?????o-?R??O?O?o?
?D??A?<ߧ??N??OާOȧO??ާ֞?N>A?<ɧ*?OާO˧O9??N(?ާ???N???N??NV??Nֆ?N|??N???N???N???N???N?&U?_|?B?6@}w"?B?X?_|C?9@}9C??
69?Z(5)??Ja?????T ??#Bm?+Am?3?l?_?|q??}q+T	}@?j??????o-?R?o?
?B
?D!?n?o_??N???N?QB?o???N???ND&?&<S??
?|?|?o???N\S??
Z??N?|?oܗ?N???N
G&|7eN8fN?o?!N?yo9!N?oZ"NW?7n?&?o?"Nֆ8n?
o?'n??
o?o???N???N?&?"?QB?oՖ?N$>S??9n??
?|?o???NǺ?N&^S??
?|?o???N???N1
?@L???&"?L?1~"@L??o?of[ n?T
O?!Nֺ?N?X n?W
O?!N?T	O?!N?&?W	O?!N?"N?n?o?"Nއ?n?o@?"N?'n?o???N???NP@?&??Q?oܖ?N???N?&?=S??
?|0B?o֗?N?]S11
ֺ?N1~?o???N???N?
?&?}6{N%eN?o?!NP@?o?!N?o"N?6n?&?o?"N?%n?
o?&n@?
o?7n?oԖ?N???NO@?&сQ1?o???N???N?&?=SBB
B|>?oŔ?N???N?&?]S<11
1~?o唓N>???N?&?
?}>c$?"`k??????A??T ??OA??#?l?_??O???/q?T????2??2|Sk@??$?R?}???/??O?????Q???????????????????EN?c[|c@?d![|??=??=?@?n?v)g?[?SG
4	O
s*??fN???'?

fN'	N
?*g??@L?}S?uSG@!?@Lp???$!N4!N?o6?@L???N???N?o0o?o???N?N??N'??N?@LƤ/?5S?@L!N?o@&???N2!NV??NR?@L?&Ǻ?No0o?o???N|??N????L??ft?@L?&?US'??NP|?&G!N?o?Ng!N??fN?N%??N??@L?&nD?Eoqo?o???NP@2??NE??N?&?@L??N?5SР@L?!N?o?8S??N?!NS??Np??N&P@?US??@L?o?o?&?oF??N???NŸ?N?&.:@B#?"???"@kA???????T ??O???_??C??;m?3m?+m?#m?/q?T????2??2|S??
?R?}???/
?O??Oa?S???o??@}?@}?}???!?L?@???u?=??=?@)?
@?QN
 	M
??*?

 	P
?'????A?*`?F?@L??@L?}S @L4NvS?A?b??TO?TO?-N?-N?TO?-N?TO-NU?uNi.N?.Nzo_?N?o\?N?o?o???N?@L=?N???B @L???Nb??T
O?-N?T
O?-N^?N?T	O-N?T	O)-Nj.N\?N?.N_?NjoH?N?o???N]?N	?o
?o?@L???N
??N?-N?-N?o?-Nڗ?Nv.N??N?.N??Nxo闃N?N@ ^ @L???N??/C??N?o?o?-N`&??N?oĖ?N??bt??N?&6SB|4??N?&VST??N?A?䖟N???N?&?&??o??Nd??NP???N?5S?@L?o??bN!-N?oB-N?
o?-N?@?
o?-Ng.N??N?.N&??NboB?N?oc?N?<?o$??N??N???N&>?US?o@??N`??N??N.>&?9
?@}@????N?"-&?"?@??@!` ?@??#!` + ??k??????T ??#Dm?+Cm?3Bm?;Am?C??_??+?m?#m?W??O??/qkT??
|S??K?RJ}???/?O??Ok?l?-?c?A}.?ť@L??@Lv1?=???!?Lצ?!@LǦO??wVO?!N=VO?!N??wNV
O?!N>V
O?!N_"N??N"N??N?"N?.??N?"N?.?.??Np???&?o???N?o???N ?1ֺ?N?&?o???N?oח?N!N9!NoĀg0oQo1?Nxo?o???N?o @L?&O|S!N!N?Ns?Nպ?NP?N?o2??NQ??Nb?9???N?o???NT??Nd?9?oĀgNr??NE??Ne?9?o??N?&Ƹ?Ng?9<?@L0&?!@L?	??&9"?L?&?<

4
6?5?VO?&?!NWO?!N?V
O?!N?&W
O?!N"N??N5"N?1??NU"N??Nu"N??N?1?o???N???Nm!?9?o?&???No%?9?o???N?o???Nǔ?N9"@L???Np)?9渱Nq-?9?!N!N?&?o?!No?!No?&??N'o??NUo??N?&fo??N?o???N??N?&f1?9?o唚N???Ng5?9?&?o???N???Nt9?9?o?&ǔ?N帱Nk=?9?1
0?&L0?0?0l2?2?1c@????N?&$?W?kK?#d"`)??I?_????T ??OC??WB??#Am?+?l?_??#?m?W??O??/qKT??	|S?/J?R?$?R??!?,m??a+?
??%@|??E@?0??/?/?!?L?@9?@9?	@9?
@9?@??!@9?%@9?)@9?-@9?y`??yb??yd??yf??yg??ys??yt??
@??yu?"@??yb?"6Gӻyb?"RNӼyb?"nUӽyb?@??yb?4Gӿyb?PNӨyb?lUөyb?F?&g?'?n??4??5?nԟ6??7?8?n5?9?n?oՔ?N???N?o???NƖ?N???N1~\??&'#Ƹ?N?&F"0"|\?1#?(!?&*!
?A?qC??TB@?b"?($@?	???T*! ??OB??WA??#?l?_?????#m?W??O??/q?T??	|Sj??/K	?R?$?R??"?O
?!;???o??a+???
?#@}%"D??$F@??!?/?8?x?n?T	O??N??/??oǤ/Ƥo????/??o???o@?0"?L@yD @??yd?@y? @??yf?@y? @??yg?@y? @??ys?@yt"@??yt?@y?"@??yu?@y?"@??yv?@y @??yv?B|I??Yb??|I??Yb??|I??Yb??|I??Yb?b~I??Yb??~I??Yb??~I??Yb?|I??Y`?F?&g?'?n??4??5?nԟ6??7?n?86?9?n?o֔?N?o攑N?o???N?o???Nƾ?N缴NƼ?N?i?<唦NB??a??Tc@??#???N?&"`?J)?	?a??T(! ??OF??WE??#Dm????_??O???/q?T??i?)a;? ?@L	|S?/J
?R?$?R,??!;?
?A?=???R?R}
?dhn|??E@?@?RQ?R???!?L?@9??G@9?\Ssx??@9f??dSsx?s??@9?yf??lS?x????@9?ys??tS?x????@9?yf?F@9?\S?x????yg??@9?dS?x????ys??@9?lS?x????yg??ys??@9?tS?n?x????yf??n?????@M?n?N?#N?N?#N?n?? N?? N׸ n?? n?????n??@M?N?#N?N4?n?#N? N?? N׺ n? n?wnyn?o֔?N?o?o???N???N?o???Nк?ND @9&'?R?3Ƹ?N?&?|S?@?2溱N?&B$@9'?Ro>G3渱N?&B|SB2?@?<1"???_???T?@??$?"???I?	???T(@  ??O???_??W???O??/qKT??	|S?/J?R?$?R,Ќ!;?,m??a+?
??	??%D|?F@?1??/?/"?L??(?@9?@9?	??	@9?
@9?	??	??yf??@9?@9?	??@9?	??@9?	??@
?yf??!@9?%@9g?@
?	??yf??)@9??@M?	???@
?1@9??@M?yg??5@9?	?Ԁ@M?9@9?	???@
Հ@M?-@9G@??yg???@M?	?F4Gӷyf?ǒ@M?=@9GPNӸyg???@M?	?FlUӹyf???@M@??yd??n4Gӷyd?8nPNӹyd?lU??n?yd??nƞ&N?'NT?4N5?5N?o֔?N?o???N???N???NB|\?G#к?N&?(!Ƹ?N?&F"?"|\?#?&*!1
?A??qc??TB@?b"?($@?	???T,! ??OA??W¨?_??C??_??W??O??{?????5@?@????/q?T??i?)?;? ?@L??2??2|S?/?
?R?$?R??E?=$?O??A?=????0?"??????R?R
??@}ƠF?'
F
?
*&
?
*?)
??D@?? ?L??? ?s"@??>?"@?
??>
?"@?
??>?"@?
?zs???@
??@MԒ@M?>s"@??>?"@??>
??"@?
??>?"@?zs???@
??@M
?u?@M?A9?N֦o?Fcn?$N??N?>?	?? @??>?"@?
??>
?"@?
??>?"@?
?zg???@
??@Mג@M?>t*?? @??>?"@?
??>?"@?
??>?"@?
?zg???@
ւ@M??@M??@MN9%NN%N? N9? N?? nT?n?? ng:???@M?nXN%NYN9%N9? N? N?? nW?nٺ n6?n?o???N???N?o???NԖ?N??N&??t@9?D???N&s@9???B???????T?@??&1'"?????!??T"??@???)5@?)@????T?{D??OC??WB??_A??C??_?B???g???_??W??O??/qkT??	|S?(?k???/?$?RM?R(.??!+??R?R?R??

?B?$?????
?U@9??_x?>?~S?^S?
x????yu?U@9?jS?
x????yu?bnU@9?vS?
x????yu?U@9?
x????yu??nV@9?D@x?>?~S?^S9x?6??yv?V@9?jS9x?6??yv??nV@9?vS9x?6??yv?V@9x???yv??n ?L?oF??Nf??N?o???N???N?~S?
?2?~S?
?2ø?Nw&?BB??NW&?F???x???x?~q???Z???x??y??~?q???Zo???? ?B ???c??T}?}
??h`?chb|c@?B#"?"?@?J??k??	?!??T ??OC??WB??_A??gĨ?_??C??O? ?O?I?=???M?=??o???/qkT??	|S?/?$?R?RЁ??=Ђ??=ЃQ?=?$O,Ќ!+??????B??O(????
??
??`@y??@9?h@yB|SB?l@y?L?R?R?o?o?if?RNSz?N?io?R:?N?N?NRF?nsF?ns$NR$NR?Ns?Ns*aR*aS>?ys?S>?ys?S>
T>?ys??yt?s>?ys?s>t>
?ys??yt?s>?ys?:"?L?n?nnyn?o?o???N?o?o?if?t?C?U??N???s?F?s????t???N?Y??'?N???N?&?
N?Ns??N?????'??U?R?????=??=?O?????? T?zw????6L7*Mw*Nw*Hw*I'w*J/w*K7w*Ow*?G@?p4???@??'@?!??8?!|"??8?A"??8?A"?9?A"?9A"
?9"A"?9BA"?9bA??)? ?1"??a??Tz?
N?
N?
N?
N
N%
NF
N?@???????=??Ng
N=??
?t@
?	@
%??N9??	??@
?@
?	@
t@
)??@
3?Nu@
5??

?v@
??/-??	@
?@
??/v@
֦/1?їV8O
?t@
?	@
?V8O1??@
t@
?V8OU?N??/t?N-?
?9W8O
?z@
?	@
?(O5??@
z@
(OW?/?V8O??N)?	??(O
?v@
?	@
4(O9??@
v@
?(O֦/?V8O??N%??P??N
?r@
?	@
p??N=??@
r@
???N?(OR?/RV8O??N!ѐ??N!?t@
	@
??NA??@
t@
?NS(O??/RV8O??NT(Op??N???N0??L1??N??J???T??????R?c???~??O?ҫ@?)?R???J!????TL@??kM??T?k??T)??????}?P~??????R??@?	?H2?;??>????????U?R?????=??=?O???z)x????`T?z|????6<*
|*|*|*	'|*
/|*7|*|*?G@?p4???@??'@?!??8?!|"??8?A"??8?A"?9?A"?9A"
?9"A"?9BA"?9bA??)? ?1"??a??Tz?
N?
N?
N?
N
N%
NF
N?@???????=??Ng
N=??
?t@
?	@
%??N9??	??@
?@
?	@
t@
)??@
3?Nu@
5??

?v@
??/-??	@
?@
??/v@
֦/1?їV8O
?t@
?	@
?V8O1??@
t@
?V8OU?N??/t?N-?
?9W8O
?z@
?	@
?(O5??@
z@
(OW?/?V8O??N)?	??(O
?v@
?	@
4(O9??@
v@
?(O֦/?V8O??N%??P??N
?r@
?	@
p??N=??@
r@
???N?(OR?/RV8O??N!ѐ??N!?t@
	@
??NA??@
t@
?NS(O??/RV8O??NT(Op??N???N0??L1??N??J???T?????R?c???}??O???;*?z#+h?R'c(!h&Y??R?rk??Pq?R???A??A?(q*B+B(!I&)Y?k)???Pq)??Iq	*?????h-B+B(!H&Yk??Pq????A???A?(q*B+B(!I&)Y?k)???Pq)??Iq	*???????i-B+B(!H&Yk??Pq????A???A?(q*B+B(!I&)Y?k)???Pq)??Iq	*???????j-B+B(!H&Yk??Pq????A???A?(q*+(!	&)Y?k)???Pq)??Iq	*????????M??N??'@?L?R?;@?h?!?<!?<!?<!?^ >?>=^ =?= 5?5?^ ;?;?^ :?:?^ 9?9 0?0^ &???&^ &???&^ &?#??& '?'?^ &?c??&?^ &?s??&?^ &???&???RҤr' &D??T?'?=?/`J  $?$ 2?2 #?# %?% !?! "?" ,?, <?< -?- +?+ *?* 1?1 .?. /?/ ??? )?) (?( >?> =?= 5?5 ;?; :?: 9?9 0?0?A? &?&?A? &?&?#A? &?& '?'?cA? &?&?sA? &?&?A? &?&?  
h?R?
N?S?=?RT"??&???O??8Nv??O??8N?TN?#?=?(!?>>? #?N?3C??N?7C?w
7???/?f?>#??8?N?>#?J?;C???C?S
3?>d#?r7C?>	#??CC??GC??%?>#??$2??>
#?
?KC??OC?C#a?>#?2C$b???O!?&N#??Oc?&N!CN#(!h<#?r?SC??WC??%h<?#?6?2?h<#?.?[C??_C??%h<#??*?2?h<	#?F?cC??gC??%?h<#?:?1?h<
#?>?kC??%?$??O???O??&N??&Nh<#?EN?~?(!?KF?q??_?<"
#?&q??_"
?<#?"q??_"
?<#?zq??_"
?<#?vq??_?<	#"
?V?;?=q??_"
?<#?nq??_"
?#?=aN?<
#?jq??_"
㐀O??O1?&Nc?&N#CN?N??a(!?<#?@??d??_(<?#?B???=d??_?(<#?A??d??_?(<#?A??d??_?(<#?#A??d??_(<	#???'?=d??_?(<#?cA??d??_(<
?#?sA??d??_?(<#?A??
t??_?F??J??@G??HK???TH??\L??dI?h??lM???R?r??o??C
?q?T?
N???4"???R???r='"?{?A??&>?<>??O?S?=??&N??O?.N?o?Nއ?N??!N??N??O???n???n_??O??&N?.N?o?N???N??!N_?N?O萜O?&N.Nm?N??N	?!N??N(?O	??O)?&N).N)m?N)??N*?!N	?NI?O???OJ?&NJ.NJm?NJ??NK?!N??Nj?O???Ok?&Nk.Nkm?Nk??Nk?!N??Nl?O??Ok?&Nk.Nkm?Nk??Nk?!N
?Nm?O+??Ok?&Nk.Nkm?Nk??Nk?!N.?Nn?O?^?/?++})=?^?++?^?+>???n???n?^?+>?+??^?+??^?+>>?(n??(n?^?+>?+??^?+??^?+>^?)n??)n?^?+>?+??^?+??^?+>??*n??*n?^?+>?+??^?+??^?+>??,n??,n?^?+>?+??^?+??^?+>^?-n??-n?^?+>?+??^?+??^?+>~?.n??.n?^?+>?+??^?+??^?+>?#3?O3?O c?????/?C
??/??O?S?=??D@?EA??O???OҐ?O???Os?8NR?8N1?8N?8N7N17NR7Ns7Nsn?NTn?N5n?Nn?NІ?N???Nr??=rbN2??+h?R'(!&Yk??Pq?R??@@??# ?C!???{???G-hJJJJJJ맟?a2???kT?B?((??A?((9( #8?W?8O8??A?Y9Y9 #88O8?@???A?y9y9 #88O8hB??B??9?9 #88O8?B???A??9?9 #88O8??RhA???A??9?9 #88O8??RhA???A??9?9 #8??RhA?}~??	??ik?C!?i+?+?Rh!??J?,?!?
8????,??!?
7???v,??!?
6???U,??!?
5???4,??!s
4???,s?!R
3????,R?!1
2???,1?!
1????  觟?@!?%?  맟?@!
2?$???J??????h  맟p@!?2?#ͱ?JH  맟P@!?2?"ͱ?J?????(  맟0@!?2?!ͱ?J  맟@!?2? ͱ?J???????  맟?@!?2?'ͱ?J?  맟?@!?a2?&̱?????kT??A??0?0??A??0?0? %?W??L%??A?e%c%` $cL$?@???A?D$B$@ #BL#hB???A?##!#  "!L"?B???A?"" !L!??RhA??B??!?!    L ??RhA???A??!?!   ??RhA??	?kI(?`!@?@!`!?+?Rh!??J??B???B??B???B???B???B??B??B??S??^?##??#?^ $?$?^ 1?1 !?!7^ 7?78^ 8?89^ 9?9 ;?; :?: 3?3 6?6 5?5 4?4 2?2 0?0???RҤr'?  ??TfB GC ???B?
?!????A???!??A??!??-??A???!?B??!??-??A???!??A?@?!??-??A?B?!??A??!??-??A??!??A??!??-??A??!??A??!??-??A??!?B??!??-???)??3)?C!??k@!?@!.B!/@!?o?=?B!C!3C!bC!????A???!???A ?@!?#??A??w?	$hC ?{??1???7??C	8??C9???5?R'?R?@!?B!?B!?B!JB!B!?W?=?B?9=?o??B??o?=9:?s???A?9;?????A?9'?????A?9&?????A?96?????A?95?????A?94????B?92????0?A?????/???+A??O??"?9????C-?S-????-????1?*q`CT9":'?"9o;??O??N?W?=Y?O??N?o?=??O?gOZ?@=??????!^?s]3?=@=?????s??!^];@=ާާ?=??!^^?H
>	@=)??s=???!^]?
=	@=q>?	?/ާ??!^^?
>?s@=??????!^]Oq?
=?s?#9B??O9?!??T???7?R?[k???o?9<o9|N9+!?C^-?S]-??@??A??_-?A?>|{,???'?+=?&Yk??Pq??|{???+=?&kYkk??Pqs??|{???+=?&kYkk??Pqw??|{???+=?&kYkk??Pqf??|{???+=?&kYkk??Pqk??|{???+=?&?Y?kα??Pq???|{???+=?&?Y?kα??Pq???{{{?{+=n&?Y?kα??Pq???oS?*?S?*?S?*?!*?)*?1*?9*?=@?Py??p?70?R(?@y???n????'?KX-?W-?V-?SU-??@??%@x?O0?@=??????!^\W]
<@=ާާ??!^^7?']>@=??????!^?s]?=@=?????s??!^]_@=ާާ?=??!^^c?>	@=)??s=???!^]
=	@=q>?	?/ާ??!^^+?
>?s@=??????!^]Gq?
=?s?#;B??O;?!??T?z?7?R?O+??9kQnk=N?9?Q??=O	?9?Q??=@
?9Q?A?,"$?'B(!H&Yk??Pq???c	9B$B(!K&kYkk??Pqp???g	9B$B(!K&kYkk??Pqk??lmS?k	9B$B(!M&?Y?k????Pq????o	9B$B(!M&?Y?k????Pq????	*?*?!*?*?s	9B$B(!M&?Y?k????Pq????w	9B$B(!O&?Y?kﱚ?Pq????MS?{	9$(!&?Y?kﱚ?Pq???
(
*?9*?*?	9?=@?@y????7G?Rs?R??R?C?9-?R?y3?"?oA?!$?B?B @$?G?9-?R?y3?"?wA?a??A?c"`?K?9-?R?y3?"?{A?a??A?c"`?O?9-?R?y3?"?A?a??A?c"`?S?9,?Rx3?"?sA?a?B?c"`?W?9,?R?x3?"?A?a??A?c"`?[?9,?R?x3?"?A?a??A?c"`?_?9,?R?x3?"?A?a??A?c"`,?Ry3?"?A?a??A?c"`,?Ry3?"?A?a??A?c"`h+?Ry3b"?A?a??A?c"`(+?Ry3b"?A?a??A?c"`?+?Ry3b"?A?a??A?c"`?w?9+?Ry3b"?A?a??A?c"`?{?9+?Ry3b"?A?a?B?c"`??9+?Ry3b"?A?a??A?c"`!   (?(???A!! ?#O)Q?ZL(?C?9?G?9?	*?K?9?*?O?9?*?!*k)*k1*k9*l=@?Nyl??%?7+??! ?3N)?Q?Z?%*?C??y+x?c?9?g?9?	
*?k?9?*?o?9?*?sI9?!*?wI9?)*?{I9?1*?I9?9*?=@?Nyn??"?7?%*??hy  ?(T???y!?@! J? !??@?A,!"?'!("+&kYkk??Pqk??}A?,???6?	A9?*????o?CE?!?<!?<!?<!???9P>?	?9p>???)???!????????T9?????R?c??zk?OO???@?)?R???J!??????TL@??kM??T?k`??T)?????(}?
k??????R?@?	??Z???C??r}???????????=??=????????=??=O??????=??=????=??=O?Z???{)x9??@?T?zy????6h9*i
y*jy*
N!
NB
Nk"y*c
N?Aq?T
?Ҧ
N?B???N??N?

??
??@??
????tNt???N???N4?5tN4t???N???NT?UtTtN???N???Np?qp&??N??Ɖ?LppN??NĉL焼N???N???!????T??Y??
???	T\??Z??????B???N??N??@??NS?N??L????OyNyxNx??Nf??N0??NR??N????O:yN9y;xN8xR??N0??Nf??N??NئO٦ZyYyN[xXxND??N&??Np??N??N????OutNttvxĖ?N?
?䉟LvxNƖ?N?L???N????L???N????L???N焽N1??Ns??N???A?A??T??Z??? T??Z???4?7???@??	????8?}??90>??9P>?	?9p>???)???!????????T?????R?c???j?OO???;*?z9?i@?n?@??}@??C@?{+?R???.???@??y(x??????T??_??k-??Tk?Tk?????[??Z?F?????{N??OM??WL??_K??gJ??oI????jh??
?`????B?B ?a??R?7??@?)@?	kjT??_?mT ?R?_?@?)@?
?	k?ן@???_????W??O??{????q`TqTq????B1??RuR???@?`??i????RsR(?`@??i??`
@??i?
??{C??OB??WA????_?h??
?`????B?B ?AՆRP7??????g??_??W??O??{??C?@?T????h???????H?I?R}	?_??T??????????????????
???9???T??{E??OD??WC??_B??gA?????_?h??
?`????B?B ?!?R7???;?m?3m?+m?#m?o??g??_??W??O??{	??C?????/?????5@?@??????JA1?H@?H??I@?)??J	@?
??_@??TK??_?k???_??T??k?H?????k??#?-?B	??@??q?????u?R??R??R??R??R9?R?#?.?gO??ODO?%???R?ɧr???/??R?r?C???>,D??5?" @?T?'? L3?R,?r?'!!?#?@?!}@ ?N??y??O!?#n!?9N!$N??R?r?
N!l?N!d?N!Tn??=??>n?{?????
???{Q????n???n?{????=???n?C?=9??.??.?cmx??.Y??.?gm??!???A?<9??n???B?2{?:޳?1Jn-??}-(# ᧟;C!?2{?9???1J?# ᧟?C!?2??<Գ?1Jv-??~-h# ᧟}C!?2??;Գ?1J?# ᧟?C!?2??>Գ?1J~-??_??# ᧟?C!?2?=Գ?1J?@??# ᧟?C!?b2)??ﱔ&-0J0?6??&@-	8((	:Z(@#8?W?XO8"A-Z99: #88O8A?R1@?	<?9 #88O8?B?jB-9;y9 #88O8qB?Y>?9 #88O8?B?jC-9=?9 #88O8?B?Y??9 #8C???1?~??hq?C!?h1?0#??J?????A???A?#9?9??A???A?#9?9#:?:??A???A?#9?9#:?:??A???A?#9?9#:?:??A???A?#9?9#:?:??A???A?#9?9#:?:??A???A?#9?9#:?:??A???A?#9?9#:?:??A???A?#9?9#:?:??A???A?#9?9#:?:??A???A?#9?9#:?:??A???A?#9?9#:?:?B??B?#9?9#:?:?B??B?#9?9#:?:?B??B?#9?9#:?:?B??B?#9?9#:?:쎙RlE?r?'`#8?Oh?R?
N??T?/???o@?z&{Cq?T
??}"?'??;]>?NI1??91Q!1>A1~S?9?91Q!1>A1~S?9
?91Q!1>A1~S?	9?9Q>Q~S?
9???!?`
T??~??
???+?=?N?>N??#n??9N?$N?N?o?N?g?N?+a)!????9??!S0*??!S*??&*>@?!y??h-8A??6h-8P?@y?I?t	??"@-,?@-.@??*A-kA!?A!?A!?A!^???/'?'@xI!??@=!?!?!?!^?/?@=??!??!^?3	0?
@=??!?!?!^?74	!`?@=???!^?;?A	0  /1@?L/????T???6%
???/??????/?A??A¬?i??=?!
??T?=?K????k@??:???o???@?{?/ ?{ .??`ӌR?wC9?R{?qo&??
?{C9?R?,?C9?R?
+?/TH# ???mT??[:|!	??9@90Q>A~11Q!1>A1~S	??	?9!Q4!A~1@9y?????/???/???A??}@???<?O??O}?s?O3O=O4O??!N??!Ns?!N???uA?(?(n?=n??3n?)n!?)n?3n?3n!?)n?M@???3ns?4n??4n??4n?0O?!N??)n??0n??0n??0n^{+0{+>^{+>^p+0?^*4*;?^*;?^*44^*!*44^*4!^*!^!( !(0^!(0^;( ?^?+? ( ?^(!?^(!a^(3(!a^(!a^(!^(((!^(!^(!?^(=(!?^(!?^(!????!??T?;h# ?:H# ?T?#C9??R?,
?#9?'C9?,
?'9?+C9?,
?+9?/C9?,
?/9ZC!??9??9?

*??9?
*?F9?%
*?=@?-ym???7??}?mk,8??9??9?
*??9?*?F9?%*?=@?/yo??7l??9?#?9?'?9?
*?+?9?*?/F9?%*?=@?/yo?/?7?	9?3?9?7?9?
*?;?9?*??F9?%*?=@?/yo??7?
9?C?9?G?9?
*?K?9?*?OF9?%*?=@?/yo??
?7?9?S?9?W?9?
*?[?9?*?_F9?%*?=@?/yo???7?9?c?9?g?9?
*?k?9?*?oF9?%*?=@?/yo???7?9?s?9?w?9?
*?{?9?*?F9?%*?=@?/yo??
?7?9?#C9?'C9?
*?+C9?9
*?/C9?U
*?#@??y	?<	??'?))??S?( 	p?R!'!?O@?)	?????#?=N??=?/?#??y-?.??@????!?@?T?K@?,
??O@????????{???@?+	???=@?N?	@? ?!N??na@? ? nA?NA?"N!??n??!n?? ?@?N?	A? ?!N??naA? ? nA?NA?"N!??n??!n ?`?=??=B?N"?!NA??n?!n A?=`Q@??Q@??#?=!D!?!!?s?`AE??AE?BB`"?!A??.?!.`?E???E?BB`"?!A??.?!.??Nn?@???>???????#:??:@#;Z?;??????@#7W?7?"9??9???????"5??5?"4??4???????"8??8?"6??6?????"2??2@"3R?3????@"0P?0"1?1????"!?!????  '!?'  "=?"?# ?O?N ??T????c??R?R?R?R?o	?/???>}A?
?%?-.c(q?T??`"?'4=? N???!?T3z?< ?N`?+N?#n?:N$N?Nl?Nd?N(a<@n&??B?@D?.b?B?"??~?kS!k*<&z*? (!`?A*Y???j,8???6?j,8??!@y?\??
?`@-bA-pB!q^1B!r^RB!s^sB!Z????'N'@x	K.?5@=??????!^UA6@=֦5֦??!^VE86,	@=???????!^WIL7W6
@=֦֦??!^VM?U?6?V?"4?A??N4!????TX?7	K;?.?9?Q??=A?}Sn9.?9?Q??=A?}Sn9.	?9?Q??=A?}Sn	9)
?9)Q.)=N)}Si
9??????/????
?/0A?!D¬j?<?O?@?OS?B?O"O3O O?!Ns?!NU?!NbA??"n?? n?5nB?3n?3n??5n??5n?3nuM¬3?3ns?4n1?4n1?4nR?2OR?!N4?5n??2n!?2n!?2n2^u)!?*25^R*5!^A*!2^!(1!(22^!(21^!(1^!(0!(1^!(1^!(0?^!('!(0?^!(0?^+('?^G)4?(!?^!('?^!('g^!(3!('g^!('g^!('G^!("!('G^!('B^!("^!( !("^!("^*( ?A????a??Th! @	*!	+?!???T[+??>}@??cC9?gC9?M??/?{C9?C9I	;????>}?IR?R ? .?q&?i	)R)+?R?++?6Th# ??>	,?g??D??????c@??4T???;?	?+?9kQnk=Nk}SL??9+?9kQnk=Nk}S?9+	?9kQnk=Nk}S?	9)
?9)Q+)=K)}S?
9? ? T?~?)?0E@-?#)?'(!&kYkk??Pqk???#)(!&?Y?kα??Pq???k
*3@??`?>?*.??!?+l?d?D?.	<&k*i	*)=Yi?k??6??+?"@yB8?i}@?A??
?`@-bA-B!1B!rB!s^sB!C	??	?4'i$@xK)??@=??????!^uC?@=֦5֦??!^vG86?	@=???????!^wK_7W?
@=֦֦??!^vO?W?6?V?"4+A??N4B????Tk3?7	K+?.?9?Q??=B?}S.9.?9?Q??=B?}S.9.	?9?Q??=B?}S.9)
?9)Q.)=N)}S)9l?????/???/??@?i?3IA?"A@?a?<1?O4???O5?1?O1O5O!O6?!N??!N7?!N)?1A?q?1nA?!n!?7n1?5ns?5nR?7nR?7ns?5n7U@??5n??6n?6n?6n??4O??!NV?7n??4nB?4nB?4nT^("(4T^(4B^("^(0("^("^("b^(3("b^("b^("B^(2("B^("B^("?^?(6?("?^B('?^B('?^B(5B('?^B('?^B(''^B(1B(''^B(''^B(''^B(!B(''^B('!^G(!????!??T?   ;?;h# ?T??@??)*?????@??)*?????@??)*?????@??)*???{C!??9??9?
	*??9)*?F9+%*i=@?yi? !?7?9?km8)!@*?k-8??9??9i
	*??9)*?F9,%*?=@?yi???7?9	|S?km8)i	*?k-8?#?9?'?9i
	*?+?9)*?/F9,%*?=@?yi?`?7?9	|S?km8)i	*?k-8?3?9?7?9i
	*?;?9)*??F9,%*?=@?yi???7?9	|S?km8)i	*?k-8?C?9?G?9i
	*?K?9)*?OF9,%*?=@?yi? ?7?9	|S?km8)
i	*?k-8?S?9?W?9i
	*?[?9)*?_F9,%*?=@?yi???7?9	|S?km8)	i	*?k-8?c?9?g?9i
	*?k?9)*?oF9,%*?=@?yi???7?9	|S?km8)i	*?k-8?s?9?w?9i
	*?{?9)*?F9,%*?=@?yi?@?7?9	|S?km8)i	*?k-8?S@???@?+9??@?+9??@?+	9??@?+
9h# ?T?#?)??S??#?;y-?#;?;???!?al?T??@?h# E??T\?????c@???@?h# ???Tc??#  d?T?' 	+?R??r!'!!?#?#@?!}? ??S???H??#??!??1??A??Q?!?@
??@M?a?!?@M'?N'?O??#n!?:N!$N??R	?r'
N!l?N?q?b?@
??@M"?@M!d?NY?O ?#n?:N$Nl?Nd?NT$O?N(a(!?'@? ??????
?R}	????1?	@?????)9F???	@??_?bT??H?~???)????T?TH?????T??U?i?)5@?)@???!T`}?????{I??OH??WG??_F??gE??oD??#Cm?+Bm?3Am?;?l?_???}?H?E?@????"?B ??ֆR?,????}?H???@????"?B ??؆R{,???ғ??s????Rs?Rs??Rs?R	s??Rs?Rs??R??=@???@???_?h@???S?s
???_??????9????_??
?9????
_???9????_?@?R._?@??"?B<%??	?R@,??H??@????"?B ??
?R7,??H??
?@????"?B ??
?R.,??g^????1?	@?I?H???@????"?B ?A??R ,????)9F?I?H???@????"?B ?a??R,??	@?H?H?q?@????"?B ????R	,??H?Q?@????"?B ????R,????"?R???????"?R??????;?m?3m?+m?#m?o??g??_??W??O??{	??C?????#???h?5@?@????@?Th??????
?H?_?T?#@???H?RH}????+?T	????
??c???????W?????	??
?!??K?A?a??/??c?Q??????[????r??/@?A??'????0?k?~??????R?q?r???
P.:?R
?=P>(	8?-?s??c	???
??????{??A??#E?
	??#B?)??+??@?)??'@???'?????0? ?T@????@???k????	@?(??????	?R??)?)a?)@????)?)??)@????	?R??	??w????F?1?k??@??
?@??T????i}H?)?v??'@?[	??/E?i	?L?R,*??y?o?!??7??????@??'C?
	??@?)??'??@?)??@???`?Th??0?
@?????@?ި???	@????????	?R??)?)a?)@????)?)??)@????	?R??	??/??@?	???;????c?%???????$?   ? ?̌R??r'!?#&?W@?i@y)1*iy	]S)
j@yI	*iy	mS)
j	@yI	*i	y
i
@y(*h
y?/I???k?1????U?R@??T?_???i}H?)?vӊ	??3??@?\	???z?-
??@?)
??o ??}??7??
??W??]SMI)??/?kh? ????T??( p?R'!?	??	??;?=N?7?=
?/?K?????g??x;?????#??g@?{?C? jT???h?|??S@?(	??7?=??N?@?"?!NB??n@?b?"n??N? Nc??n??#n?
?	?=??=??ND?"N???nc?$n?s?=@??@?e?#???.??%.????G-?;?=?D??!AG-?&????D??!
&?@?"?!n? n?
???=C?"n?s?=?@?d?#.????G-?$????%7^6^5^^^^Q^P^G^f^???8? ?? #9?9?? #9?9?? #9?9? #9?9?? #9?9y? #9?9Y? #9?9Y? #9?99? #9?9? #9?9?? #9?9y? #9?9?? #9?9?? #9?9?? #9?9X'!8???T?????????4?R???#??'??+?h?R?/??3???R?7??;???R????C???R?G??K???R?O??S??R?W??[?(?R?_??c?H?R?g??k?h?R?o??s???R?w??{???R??????R??????R???C??R?R#?c?#?X?
??????R'???	?J??!?k?_E??T
???????
???????!?F? ??Tj??/???/?
??/?/?/?/?/?/!|@?!?~?ka?2
+?ka?GE1
,#"
PBF$!1"??T!@?? q???T!?~?ka?2
+?ka?GC1
,%"
PBD&!1"?????T_?T2?/?/?/?/?/?/?/?/_?T???
?!|@?!?~?ka?2
-?ka?GE1
.#"
PB
F
$!1"??T!@?? q???T!?~?ka?2
-?ka?GC1
.%"
PB
D
&!1"?????T>?HT????!|@?!?~?ka?2
/?ka?GE1
)#"
PBF$	!	?1"?<?T!@?? q???T!?~?ka?2
/?ka?GC1
)%"
PBD&	!	?1"?<???T" ?'0$?2LT?  ?%? ??0?T?  ?Te#? ? &
Th$`(S?R?
????R?0?(?
????  ?%? ??0m??T?&?(3?R?
????  ???T(  m??TC"$ ` $???TH!@(s?R?
???9???c@?)g?7g?7?f?7?4?	*?qbT??Ku~????#@????????????	??_k.8_k/8_k08_k18????????T
??TJ?+?l???_k,8J???T?k?T*}@?}@?l
˟?	Ti
?JyS+۪?Tk+8J	)???T=qT?**?RJ?_??
T(?)yS*۩?Uk*8
?)	Aq?
?A??T?CF9! ?[?eT?K?C9?C? @?A? ? . ??gF9?	K?g9?kF9?	K?k9?oF9?	K?o9?sF9?	K?s9?wF9?	K?w9?{F9?	K?{9?F9?	KA!?9s	4q?
TS?RH?GF9?KF9?OF9?SF9?WF9r?[F9?#?????_F9
qK
TR?*?-yS??)?	k??T??_???????~?*
??	?/?-?????	????????Tk08Tk18Tk 8Tk/8?!????T?	???T????R??+?kKk???TySySk??T??_?????H?~?		???-?+?????	????????Uk.8Uk/8Uk08Uk-8k!????T_???T???s?Rr?#????	<
<<<
<	<<


q???#?5??	<
<<<
<	<<
???)		*I	*i	*?!	*?)	*1*9*=@??{h?????6?~@??/@? ????C??@???A ????c@????c?9?g?9		*?k?9	*?o?9	*?sF9!	*?wF9)	*?{F91	*?F99	*=@??{????7=@???6
?'E? ??@??[@?A ???'@???<@??>?@??M)?*?9JQKJ=KJ}??j??A??A?! ?@-?/# *?9JQKJ=KJ}??j?B!C@*	?9JQKJ=KJ}??j??A??A?B!?A-C@*
?9JQKJ=KJ}??j??!C@*?9JQKJ=KJ}??j??A??A?B!?B-C@*?9JQKJ=KJ}??j??!C@*?9JQKJ=KJ}??j??A??A?B!?C-C@)?9)Q*)=J)}??i??!C@?
?*?9JQKJ=KJ}??j???A???A?B!?D-C@*?9JQKJ=KJ}??j??!C@*	?9JQKJ=KJ}??j???A???A?B!?E-C@*
?9JQKJ=KJ}??j??!C@*?9JQKJ=KJ}??j???A???A?B!?F-C@*?9JQKJ=KJ}??j??!C@*?9JQKJ=KJ}??j???A???A?B!?G-C@)?9)Q*)=J)}??i??!C@  d?'` ?(U?R?/I??g@???G??>@?J?T9H9}D?
!I*?;@?)??G@?(i*8! ???k0T???x;????j;8@!(J?(?7@???R?z?r{?C?!??TH! ?@?h?R??R?r?R?s???'	2?#??_@????T??	??
???%@ .! ?/?/>,??3@??	?b@??7?=#?NC?"Nb??n?@?b?"n#?N??'Nc??n??#n?C
??	?=c	?=&?Nf?#N???nB?#n?s?=?@?c@?&B`f?#???.B?#.???b
G-?;?=BHB?!?EG-?"cHc?!#
#??A???A?yY@-??A??A?tEA-x@?^??"?	q𲖚/??@9?@?n??	S?M1?.?9?Q??=@?}?n?{&Z;ED.?9?Q??=@?}?n?9&?
9??.
?9?Q??=@?}?n??
&?
6??.?9?Q??=@?}?n??
&R
4E.?9?Q??=@?}?n?D1
&
1.?9?Q??=@?}?n?
&q
0%?_$.?9?Q??=@?}?n??&?A??A?
'?	??MC-1?91Q 1>@1~?q??&0
'?r????@9o??_@??mS?	?M-???9?Q??=P?}??o??&??A???A?
'r!@???9kQok=Ok}??k??&0
'??D-?	?9kQok=Ok}??k??&??A???A?
'?
?9kQok=Ok}??k?G
&0
'??E-??9kQok=Ok}??k??&??A???A?
'??9kQok=Ok}??k??&0
'??F-??9kQok=Ok}??k??&P'??9kQmk=Mk}??k??&g&?=@???J?)?	???@j?T?xj?"pB=c'B(#K&kYkk??Pqn??Kk?!?L}Bӌ???W@??ilx?*?i,x?j?8kjl8/
??@9?*?9?	?D???yY@-:9?
6??????tEA-?
42
1?????g?@???'nB?"n??
?b@?B?".???b
G-B"c#^?@ ??
???h?F???h?F?H?h?F?	?_?T??	?@?
H?~???)????T?TH?????T??U?I?)5@?)@???T?@?}???	??{I??OH??WG??_F??gE??oD??#Cm?+Bm?3Am?;?l?_?H??@?????B ?L?R? ??H??@?????B ?AQ?R? ??H???@?????B ?:?R? ??H???@?????B ?!:?R? ??H?i?@?????B ?A:?R? ??H??
?@?????B ?AW?R? ??S??C??o??g??_??W??O??{???H?5@?@???@?aT??h|??????E?_?-TH?????????T??????????R?????????????????????????????#??R????*?K?9?Z????T?
??B???{???@????TH??????Z?I?)5@?)@???T?@?}??{T??OS??WR??_Q??gP??oO??C??_?(?u? ?????B ?i?Rx ???R??#?m?o??g??_??W??O??{????????????????????q?T?*?q?T	???/?/	u~??"??/?	?@-B
?, !!B"c#) (!("(#k???T???T?
	?	?@E@? ???T?#@??@??~S???R??~S??q?OT?Ҁ"?@?   (?K?q?W?Zq	???/???RҤr?_?R.Q\?R??J!+??/?/	?z+??? ? $??$??!k?	??>Ta?{Ӡ????	?E@?@-???!?&E?E@????!?&E?E@?A-???!?&E?E@????!?&E?E@?B-???!?&E?E@????!?&E?E@?C-???!?&E?E@????!?&E?E @?D-???!?&E#?E$@????!?&E'?E(@?E-???!?&E+?E,@????!?&E/?E0@?F-???!?&E3?E4@????!?&E7?E8@??F-???!?'E;?E<@?@G-?!?0E??E@@??G-11?!?1EC?QD@?HH-RR?!1
2QG?QH@?LI-RR?!1
2QK?QL@?rR?!1
2QO?QP@?LJ-RR?!1
2QS?QT@?rR?!1
2QW?QX@?LK-RR?!1
2Q[?Q\@?rR?!1
2Q_?Q`@?LL-RR?!1
2Qc?Qd@?rR?!1
2Qg?Qh@?LM-RR?!1
2Qk?Ql@?rR?!1
2Qo?Qp@?LN-RR?!1
2Qs?Qt@?rR?!1
2Qw?Qx@?LO-RR?!1
2Q{?Q|@?rR?!1
2Q?@???%n??&nE?@A???%n?0nE?B???%n??&nG?C???&n??'n^Q?^^H@-3? (" 4N"1?4tN"s?4T? ?"3Q?1??3PA-u? ?"2q?1??2?? `"2??1r?2PB-u? ?"2q?1??2?? `"2??1r?2PC-u? ?"2q?1??2?? `"2??1r?2PD-u? ?"2q?1??2?? `"2??1r?2PE-u? ?"2q?1??2?? `"2??1r?20@?t? ?"2q?1??2?? `"2??1q?2?? @"1??&G?1?  "'?&'?'?? "'??&?'?H-??  "&??%&?&? ? &?%??&?I-??  "&??%&?&? ? &?%??&?J-??  "&??%&?&? ? &?%??&?K-??  "&??%&?&? ? &?%??&?L-??  "&??%&?&? ? &?%??&?M-??  "&??%&?&? ? &?%??&?N-??  "&??%&?&? ? &?%??&|@??? "&??%?&?'? '?T?z+?k?	????T???a??@!?q??%'?'f&?/?/?R#h"8R?c,h?R?R???R???rW?R?r?/?/??@??@?	????@??'@?)??'??@?)??@????T??	????	?+@????#@?)??@???????T?????	??'@?L
?R?%???y???}H??@??)	??o ?? ?? ?=?y?+??]S?I-??/!ih? ????T??( p?R'!?
?????D?I
?R?!	??#??/?w?z!?!??@??T???
?)?|???@??		?@- B?!#@-b"??" B?!?"???
A-D ??!%A-?$??d ??!?$???B-? ??!'AB-?&??? ??!
&??C-? ?!1IC-0
0??? ?!P
0???ED-"R?!3QD-r
2??2"R?!?
2?C?ME-T"??!5YE-?
4???t"??!?
4???UF-?"??!7aF-?
6????"??!6???]G-?"?!9iG-88????"?!X89@- *	??"!	???
A-D"??d#???B-?$???%??C-?&A???'A???ED-
0I??2
1I?C?ME-T
2Q???t
3Q???UF-?
4Y????
5Y???]G-?
6a????
7a???  觟@!?  @!	2(  
?!(??@@!	2H  	?"(??`@!	2h  ?#(???@!	2?  ?$(???@!	2?  ?%(???@!	2?  ?&(???@!	a2?  ?',??" 觟B!?0 B!	2(" ?1(??@B!	2H" ?2(??`B!	2h" 
?3(???B!	2?" ?4(???B!	2?" ?5(???B!	2?" ?6(???B!	a2?" ?7(?? #* ?* )?) 8?8 +?+ #?# !?! %?% &?& /?/ .?. -?- ,?, 4?4 3?3 0?0?'@  ??T?)????K??????A??!?;???A???!????A???!????A???!????A?@?!???P???!????A???!????P?r@ #?!????A???!???CP???`?!?????A?&?!?-??A???!????A??!?????A? A )?!????A???BA *?!????C ??A??8?O??"?S???A??W???A??'?[?e	:?_?D
$?c??A??7?g??;A??
!?k??A?6?o??A?$?!????	#?s??	9??A??w??	&?{??	(?A????
1??c
)?A???
!???)?R(?R?')!C!???C@!?C?@!?C ?C!?G?kA!?K?DB!?@ ?@!?B!C C!?A!??-?A!?A!??-?A!?A??B!??-?A?bB!B!??-?A??/????"?A?V6?+-?B ??-??-?-?7????c(q??A?@PTv"'?"?b??A??7.?7?n<?'+9&Yk??Pq????A??n<+9&Yk??Pq	???CA??n<+9&Yk??Pq????A??n<+9&Yk??Pq???GA??n<+9&Yk??Pq???KA??n<+9&Yk??Pq????A??n<+9&Yk??Pq???n<+9&Yk??Pq??-S?SS(X3
***-OS?)*?9*?*=@?My??m?7&?R??@?
?@y(???A ?A ?A ?B tB B ?C ?@?-
?	???'?A??%@xpM/?@=9?9?9?!^??
9@={?{?{?!^?Yw;
@=??????!^Yg?[
:@=????yg??!^?F@={?{??:{?!^?.	;@=ާ?gڧZ?!^?<	:@=?gۧ{?{?!^?]	;?g@=Z?Z?Z?!^??g?/[:yg #8?A?8O8?!??T???7?RhM)?	?9)Q-)=M
?9?Q??=O	?9?Q??=P
?9Q>Q?9Q>A?9Q>B?9Q>D?9Q=P0}?}?}8~!|Z|?|}>,?;A?B pB ?B ?A ?A ?A ?A ?7A??n<?'+9&Yk??Pq???n<+9&Yk??Pq???n<+9&Yk??Pq???n
<+9&Yk??Pq???n<+9&Yk??Pq???n<+9&Yk??Pq???n<+9
&?Y?k????Pq????n?
<?*9?&BX_kB??_PqV??b?S?SlS?X3B*B*L*?MSB(*B8*L*?=@?By??b?7"?R??@??@y???@???
???'??_-?^-?]-?\-??[-??Z-?Y-??X-D$@xeM$??@=???!^?J?8?@=Z?Z?Z?!^?N8w?:?@={?{?{?!^8c?R	9?@={?{?Xcy?!^?V?@=Z?Z?;	9Z?!^?>\	:?@=??xc??9?!^?
?	9?@=?c???/Z?Z?!^??	:xc?@=9?9?9?!^?B?c?	9Xc#7?@?O7?!??T?;A?M??7?RhM-??9?Q??=M
?9?Q??=D	?9?Q??,??W-??V-?U-?7A??A???T-?A??A??A??A??A?.?R?y3?"?OA??v??A?6,.?R?y3?"w?SA?_??A?9[?.?R?y3?"?WA?7_??A?986[.?R?y3?"??A?986[,.?R?y3?"?[A?W_?_A?_??A?9[L.?R?y3?"?cA?7_?P?986[,.?R?y3?"??A?986[,.?R?y3?"?gA?W_?kA?_??P?9[l.?R?y3?"?oA?7_??A?986[?.?R?y3?"?CP?986[?.?R?y3?"?sA?W_?wA?_??A?9[l.?R?y3?"?{A?7_??A?986[?.?R?y3?"??A?986[.?R?y3?"?A?W_??A?_??A?9[?.?R?y3?"??A?7_??A?988[?.?R?y3?"??A??^??A??
9?b?" ?
6??P?97?9M??T?8?8?#8?38?C8?S8?c8?s8?7??8??8??8??8??8??8??8??8????
7????)|???GS)?R)R	+??@? T?" ?
T.?7?5Wo?
<?'+7&Yk??Pq???8??A?Xo<+7	&)Y?k)???Pq)???8?CA?Xo<+7&?Y?k????Pq????mS?#8??A?Xo<+7&?Y?k????Pq????38?GA?Xo<+7&?Y?kα??Pq????		*)*)!*(*?C8?KA?Xo<+7	&)Y?k)???Pq)???S8??A?Xo<+7&?Y?k????Pq????MS?c8Xo<+7?&??@??Y?k????Pq????)	*)9*(*?s8=@?Iy????7?4??Q8??Q8??Q8??Q8??Q8g?CQ8?SQ8?cQ8?sQ8??@?	?@y?R?????@??	?	???'?A??%@xpM/?@=???!^??
8@=Z?Z?Z?!^?8w:
@={?{?{?!^8c?Z
9@={?{?Xcy?!^?F@=Z?Z??9Z?!^?.	:@=??xc??9?!^?;	9@=?c???/Z?Z?!^?\	:xc@=9?9?9?!^??cZ9Xc#6?A?O6?!??T?J?7hM)?	?9)Q,)=L)}S?8	?9)Q,)=L)}S?8		?9)Q,)=L)}S?#8	
?9)Q,)=L)}S?38	?9)Q,)=L)}S?C8	?9)Q,)=L)}S?S8	?9)Q,)=L)}S?c8?9Q	=I}S?s8>,??@???P????5@o<?'!( (&Yk??Pq	????8Ao!<!( (&Yk??Pq????8Ao!<!( (&Yk??Pq??mS??8Ao
!<!( -&?Y?k????Pq?????8Ao!<!( .&?Y?kα??Pq????	*?
*?!*?	*??8Ao!<!( .&?Y?kα??Pq?????8Ao!<!( 1&1Z?k1???Pq1• NS??8Ao!< ( &1Z?k1???Pq1•(*?9*?*??8?=@?Qy??q?6?@??@y?6??@?-?	???'?_-??^-??]-??\-??[-??Z-?Y-?X-?%@xpM/?@=!?!?!?!^?b?!@=c?c?c?!^?fAt
#
@=??????!^A?j#
"@=????a??!^?~@=c?c?D
"c?!^?"e
#@=Ƥ?¤B?!^?&?
"@=?äc?c?!^?*?
#?@=B?B?B?!^?.??
"a   ?A? L ?A??TI.?7lM)???9Q	=I	}??8??9Q
=M}??8?	?9Q
=M}??8?
?9?Q??=N?}??8??9?Q??=P?}??8??9?Q??=Q?}S??8??9?Q??=Q?}S??8??9?Q??=N?}S??8??8.?R?y3?"?OA?!t?A?B @t??8.?R?y3?"?SA?a??A?c"`?#?8.?R?y3?"?WA?a?A?c"`?3?8.?R?y3?"?[A?a??A?c"`?C?8,?R,z3?"?_A?a?A?c"`?S?8,?Rx3?"?cA?a?P?c"`?c?8,?R,x3?"?gA?a?A?c"`?s?8,?RLx3?"?kA?a??P?c"`),?R,y3?"?oA?a?A?c"`?,?R,y3?"?sA?a?CP?c"`)?R	y3""?wA?a?A?c"`?)?R	y3""?{A?a??A?c"`)?R	y3""?A?a?A?c"`???8)?R	y3""?A?a??A?c"`???8)?R	y3""?A?a?A?c"`???8)?R	y3""?A?a?A?c"`!   7?7)
/P?K@???@??w@??B!?" ?S?ZL7??8??8,
*?#?8?*?3?8?*?!	*))
*)1*)9*,=@?Oyl?O?7-???@?,J?7@?	
?/	9?}S/S?!?/xA???	A9*?	9,?9???8???8
*???8?*???8?*??Q8?!*??Q8?)*??Q8?1*??Q8?9*,>@?@yl???7?@??J?yS 
9
|S?2??!??	A9?*?	9(?9  ?T???z!??# ?? ?E?RoE?r???R???r!??@?A%?T?# ??T???'? ???R??r!'!!?#?@?!}.  ?D?L
?R?%??)9?A? ?Tzh?l!<?'!(",&?Y??R
?r?
k????Pq???}A?,???6?)A9?
*???H
?R(}???_?T??	?@?
H?~???)????T?TH?????T?V?)?)5@?)@???A
T?@?}??	??{I??OH??WG??_F??gE??oD??#Cm?+Bm?3Am?;?l?_?(?E? ??????B ????R6??(??? ??????B ?a??R-?????R??3(=@??? ????F?h@???3?s
????F???????9?????F??
?9?????F???9?????F???9?????F???9?????F???9?????F???9?????F?@?R?F? ????B<%????R???(?? ??????B ????R???(??
? ??????B ?a??R???F?(??? ??????B ?As?R???(??? ??????B ?as?R???(?i? ??????B ??s?R?????"?R???????"?R????????3m?+m?#m?W??O??{???????qCT(?9@?@?(?Y??W?!?!??????????
????H?(?9@?@???8???????????(?Y??S?!?!????F??R?{G??OF??WE??#Dm?+Cm?3Bm???_????????q(T?*??)???+yhxJ	??
??@? ?R????"???T?q??DZ?h???q??~ț	?F???*???n@y?9??Rk?XT??-?R+?k??4?R!?!???.jaT?%΁5n@y?9?k ?T?.jaT?%΀5n
@y?9?k ?T?.jaT?%?5n@y?9?k ?T?.jaT?%N?5_
?`??T?	??'?n?Dx?9????ka??T??!?!??????T	??????j
?!?!????R+?k??)?J??	????TM?_x?9?k?MT?-
?%?q?	@z?1TM@y?9?k?LT?-j???T?%???4??h??T	??????!?!???R*?J??`@?? b'  " JT  ?IT)?s??	????T??????T	??????!?!????R*?J??l@y?9?k?GTm,
?%?q?	@z?FT)?s??	???To?????T	??????j??!?!????R+?k??M?_xN?_8?
?1M*N?_x?}S?
?*N@y?
?*?9?k CT?-
?%?q?	@zA'T)?J??	?A??TL???H??T?	??????"RT?R?R
??????T	??????j?!?!????R+?k??M@y?9?k?>T?-
?%?q?	@z?"T)?J	?	???T)????CT	??
?R@
N??a?=" NB??nB(aJf??G?*?kA?,??
?????T!??CT	?Ҁ?O??a?=" NB?`nB(!Jf??I?*!?kA?,=??
?????T?H??T	??????!?!????R*?J??l@y?9?k 7Tm,
?%?q?	@za6T)?sJ?	???T????H??T	??????j
?!?!????R+?k??)?JQ?	???TM?_x?9?k`3T?-
?%?q?	@z?TM@y?9?k@2T?-j???T?%???4?(?9@?@???????T	??????!?!????R*?J??l@y?9?k`/Tm,
?%?q?	@z?.T)?sZ?	???T??????T	??????j
?!?!????R+?k??)?Ja?	????TM?_x?9?k?+T?-
?%?q?	@z?TM@y?9?k?*T?-j???T?%???4u?H??T	??????!?!????R*?J??l@y?9?k (Tm,
?%?q?	@za'T)?s??	???Tt???H??T	??????jJ?!?!????R+?k??)?JQ?	???TM?_x?9?k`$T?-
?%?q?	@z?TM@y?9?k@#T?-j???T?%???4;???T	??????j??!?!????R+?k??M@y?9?k? T?-
?%?q?	@z?T)?J??	???T9??????T	??????j
?!?!????R+?k??)?JA?	? ??TM?_x?9?kT?-
?%?q?	@z!TM@y?9?k?T?-j???T?%???4??????T	??????jB?!?!????R+?k??M@y?9?k@T?-
?%?q?	@za??T)?JI?	???T????h??T	??????!?!????R*?J??l@y?9?k@Tm,
?%?q?	@z?T)?s
?	???T????h??T	??????!?!????R*?J??l@y?9?k@Tm,
?%?q?	@z?T)?s*?	???T????h??T	??????!?!????R*?J??l@y?9?k@Tm,
?%?q?	@z?T)?s??	???T????h??T	??????!?!????R*?J??l@y?9?k@
Tm,
?%?q?	@z?T)?sJ?	???T????h??T	??????!?!????R*?J??l@y?9?k@
Tm,
?%?q?	@z?	T)?s??	???T????h??T	??????!?!????R*?J??l@y?9?k@Tm,
?%?q?	@z?T)?sJ?	???Tm???h??T	??????!?!????R*?J??l@y?9?k@Tm,
?%?q?	@z?T)?s"?	???TU???h??T	??????!?!???R*?J??`zi?@b? b'  "T  ?T)?	????T????
?(?9@?@???#???B???T?q??DZ?h???q??~ț
?G?_?K???n@y?9??Rk?T(?9@?@???!?!??
???(??T	??????j??!?!????R+?k??M@y?9?k???T?-
?%?q?	@z??T)?J??	???T
??
??_???T?!???R	?)??`zj?? b'  "?"T  f"TJ?
????T???
??_낞?T?!????R	?)??lzjx?9?k? Tm,
?%?q?	@z?TJ?
???T??? ? ?R' "?T  !-T*@?h
	?@?? ?Rb'  "@!T  ?#T*?	@?? ?Rb'  "  T  f"T)@?
@?? ?R'  " T  G??TK(<9
??R
k?T?!??y???o
??RP
N1O*?{??ok???o?
??o?o?o?o?o?o?o?o?o?o?o?o?ozm??o?o|u¬?o?o^7pnߧ/?1Nާo?1Nh7pn	?/)1N?o1N?7pnK?/k1NJ?oJ1N?7pn??/?1N??o?1N!??N??N???Nc??N焪NB??NƄ?N???NZ?pn^?/?1NZ?oZ1N{?pn?/?1N{?o{1N??pn??/1N??o?1N??pn??/)1N??o?1Ns??NR??Nֆ?N???N9??N???N??N???N???!??T???Nц?N1??N???N???N??N??N??N&`??N???NᄡN@??N???N???N??N??N&?
?`T)
?j
?
??RN%@x?9?
k???k?)?A??T?4)?)9@? @????Y????!?
?!????-?R	?)??4?R?!???.jaT?%?5n@y?9?k
T?.jaT?%?5n
@y?9?kT?.jaT?%?
5n@y?9?kT?.jaT?%?	5n@y?9?k
T?.jaT?%?5n@y?9?k	T?.jaT?%?5n@y?9?kT?.jaT?%?5n@y?9?kT?.jaT?%.5
?@~?T?
??'?nIx?9????ka??T'???	?(?9@?@??????K|?4)?)9@? @????Y????!8??????J(
%_q	@z?T*@?h	?@ym9??R?k!T?!???
?????	????!??)?)9@? @????A??t7????+j?Tk%?4?!???
?u??*?	@ym9??R?k`??T?+jaTk%k??5*@?
@ym9??R?k ??T?+jaTk%+??5*~?@ym9??R?k???T?+jaTk%???5??R*
?@ym9??R?k???T?+jaTk%???5*?@ym9??R?k@??T?+jaTk%K??5)	@?@y9
??R
k ??T?R_(jAl?T%l?4?!??4??????#m?{????@yh?E@-a@-QHA-cA-SPB-?@!?@!g@B-1B!RB!sB!UXC-?B!?B!?B!	?
?W'??/yhC-*%@x+L*?{@={?{?{?!^<;}@=??????!^?c\=~	@=ާާ??!^?oD}<~
@=ާާ?o??!^H}@=?????<??!^L?=h@=??o???!^P
<h@=?o?????!^T?=?o|@=??????!^X?o]<?o`#7@A?wO7?A??T??7(L ?	?9)Q*)=J)}S?9	?9)Q*)=J)}S?9		?9)Q*)=J)}S?9	
?9)Q*)=J)}S?9	?9)Q*)=J)}S?9	?9)Q*)=J)}S?9	?9)Q*)=J)}S?9?9Q	=I}S?9?{B??#Am????_??E???????B ????RW???????????B ?a??RN??@?!@? !?ןQ?Z?_?????;m?3m?+m?#m?o??g	??_
??W??O??{
??C?@y?/4????????????bA-ADA-dB-RLB-F@-?@!?@!0@!1B!RB!sB!ATC-4@!?B!v\@-??	?!'?/??yhC-
%@x?N*?l?9?Q??=M?}??l?l?9?Q??
;?=M?}??l??
=l	?9?Q??=M?}?c??l?@l
?9?Q_<??=M?}??l??oDl?9?Q??=M~=?}??l?H?(?ol?9?Q??=M?}?o??l?Ll?9?Q?<??=M?}??l?;mP?>k?9kQl?ok=Lk}??k?T?o]<?o`#!TA?aO!)?A??TT?6??"A-$B-&C-????/2G@-?zh?*??8JQKJ=KJ}??j??4U
4?B*??8JQKJ=KJ}??j??56
5*??8JQKJ=KJ}??j??R?7V5?R*?9JQKJ=KJ}??j??5v5?R*?9JQKJ=KJ}??j??5?5*	?9JQKJ=KJ}??j??R?7?5?R*
?9JQKJ=KJ}??j??5?5?R*?9JQKJ=KJ}??j??5?3?R`"!A?aN!?)!? ?!??T4?6?\?]@?????,@???!A-?-!B-?-!C-?- @-?-_qY???&A-???.B-?6@-??/?"C-??b?{{x??	?9)Q*)=J)}??i??#@?!	?9)Q"8*)=J)}??i? 8?'@?a!"
		?9)Q* )=J)}??i???@?##?@?b	
?9)Q*)=J)}`??i??;@?##	?9)Q`*)=J)}??i?b	?7@?##b
	?9)Q*`)=J)}??i??3@?##b	?9)Q*)=J)}`??i??/@?##?9Q`	=I}??h?b?+@?##b`A?"?"{????m?????????T	?7?N4?	?9)Q*)=J)}Si9	?9)Q*)=J)}Si9		?9)Q*)=J)}Si
9	
?9)Q*)=J)}Si9	?9)Q*)=J)}Si9	?9)Q*)=J)}Si9	?9)Q*)=J)}Si9?9Q	=I}Sh9???{M??OL??WK??_J??gI??oH??#Gm?+Fm?3Em?;Dm????_??E???????B ?!?R????????????B ?! ?R???@? ??_??$??_?????g??_??W??O	??{
???????? ?RÀR?>?????R????
????	??????X?GF???P>???G?Y?(?L?(????(?E@?@?:?R?C???#?R??? 4?i ????!??`?R???Z?zB9z????c????g?aa?=??????!??`?R??????>?(?L?q(??T??"?@?bZ?zB9z?????b???????????ҰA?`?????(??%?A?????=??=@????C??????????GF??>???G??{J??OI??WH??_G??gF?????_??R?_??W???O??{????T??FF?`??=??F?U???L????eA?????L?q????T???{B??OA??Wè?_րFF??>??F????{B??OA??Wè?_? ?R?_??C??+	m?#
m?o??g??_
??W??O??{????????? ?RÀRE>???P???R
?????
??}?????
????	??????S?uFF????=???`F?H?	?L?)	????&A???
T??"A?????A?T??????R??????	ښ?(?Zs???3????)????????br????????????%A?`????c????g?h	h???@?c?h
h??_A?c?hh?m??!???????R?!? ???????@?????NA???	T??!???@?R?!@"????Y???bT ?R?!@????{?@??sb????7????6????????????@? ?`??c????g?h	h??_@?c?h
h??"A?c?hh?m?s?!??????!? ???R?????L@?????A????T???!@"?@?R???(?Rh?@?(?(??%?A?????=??=@???@? ????????????c??c????g?aa????????!??`?R]?????{P??OO??WN??_M??gL??oK??#Jm?+Im?C??_?????O??{????=??????R?=???(?!'?B???<	C???<??<@???<
A???<??<??<@? ???A@?????q????#??!?)? ?Rn	??fy???o`v?=`z?=`~?=`??=`??=`@??>?c?????%??g?a?????!|*? ?RY	????`b???Rx;?"?B.????>???`@??c????>?`????;??@?`(?"?B?.????>???`@??c????>?`????;??@??&?"?B/????>???`@??c????>?`????;??@??$?"?B?/????>???`@??c???|>?`????;??@? #?"?B0???{>???`@??c???n>?`????;??@?`!?"?B?0???m>???`@??c???`>?`"????;??@???"?B1???_>???`@??c???R>?`&????;??@???"?B?1???Q>???`@??c???D>?`*???;??@? ?"?B2???C>???`@??c???6>?`.???q;??@?`?"?B?2???5>???`@??c???(>?`2???c;??@???"?B3???'>???`@??c???>?`6???U;??@???"?B?3???>???`@??c???>?`:???G;??@? ?"?B4???>???`@??c????=?`>???9;??@?`?"?B?4????=???`@??c????=?`B???+;??@???"?B5????=???`@??c????=?`F???;??@???"?B?5????=???`@??c????=?`J???;??@? ?"?B6????=???`@??c????=?`N???;??@?`?"?B?6????=???`@??c????=?`R????:??@??
?"?B7????=???`@??c????=?`V????:??@???"?B?7????=???`@??c????=?`Z????:??@? ?"?B8????=???`@??c????=?`^????:??@?`?"?B?8????=???`@??c????=?`b????:??@???"?B9???=???`@??c???r=?`f????:??@???"?B?9???q=???`@??c???d=?`j????:??@? ??<??<????!`+?`?R??????:??Ҩ?[?)?)5@?)@???A?T???{S??OR??WQ??_P??oO????_?v???@94"?B:???H=???`@??c???;=?`n???v:??@?????-1??#??!|1?@?R????@94"?B?:???0=???`@??c???#=?`r???^:??@?????
2??#??!|1?@?R????@94"?B;???=???`@??c???=?`v???F:??@?????e2??#??!|1?@?R????@94"?B?;???=???`@??c????<?`z???.:??@??????2??#??!|1?@?R???"?B????<???`@??c????<?`?????9??@?@???"?B?>????<???`@??c????<?`?????9??@?????"?B?????<???`@??c????<?`?????9??@?????"?B??????<???`@??c???{<?`?????9??@????"?B???z<???`@??c???m<?`?????9??@?@???"?B????l<???`@??c???_<?`?????9??@?????"?B???^<???`@??c???Q<?`?????9??@?????"?B????P<???`@??c???C<?`????~9??@????"?B???B<???`@??c???5<?`????p9??@?@???"?B????4<???`@??c???'<?`????b9??@?????"?B???&<???`@??c???<?`????T9??@?????"?B????<???`@??c???<?`????F9??@????"?B???
<???`@??c????;?`????89??@?@???"?B?????;???`@??c????;?`????*9??@?????"?B????;???`@??c????;?`????9??@?????"?B?????;???`@??c????;?`????9??@????"?B????;???`@??c????;?`????9??@?@???"?B?????;???`@??c????;?`?????8??@?????"?B????;???`@??c????;?`?????8??@?????"?B?????;???`@??c????;?`?????8??@?????@94"?B????;???`@??c????;?`?????8??@?????);??#??!|1?@?R$???@94"?B?????;???`@??c???s;?`?????8??@?????i;??#??!|1?@?R??"?B	???j;???`@??c???];?`?????8??@?@???"?B?	???\;???`@??c???O;?`?????8??@?????"?B
???N;???`@??c???A;?`????|8??@??????@94"?B?
???>;???`@??c???1;?`????l8??@?????????#??!|1?@?RR???@94"?B?
????:???`@??c????:?`
????7??@???????>??#??!|1?@?R:???@94"?B????:???`@??c????:?`????7??@?????????#??!|1?@?R"???@94"?B????~:???`@??c???q:?`????7??@??????m???#??!|1?@?R
???@94"?B???f:???`@??c???Y:?`????7??@??????????#??!|1?@?R????@94"?B????N:???`@??c???A:?`???|7??@??????%??#??!|1?@?R????@94"?B???6:???`@??c???):?`???d7??@?????????#??!|1?@?R????@94"?B????:???`@??c???:?`"???L7??@?????????#??!|1?@?R????@94"?B???:???`@??c????9?`&???47??@??????9??#??!|1?@?R????@94"?B?????9???`@??c????9?`*???7??@?????????#??!|1?@?Rz???@94"?B????9???`@??c????9?`.???7??@?????????#??!|1?@?Rb???@94"?B?????9???`@??c????9?`2????6??@??????Y??#??!|1?@?RJ???@94"?B????9???`@??c????9?`6????6??@?????????#??!|1?@?R2???@94"?B?????9???`@??c????9?`:????6??@??????%??#??!|1?@?R???@94"?B???v9???`@??c???i9?`>????6??@?????????#??!|1?@?R???@94"?B????^9???`@??c???Q9?`B????6??@??}??????#??!|1?@?R????@94"?B???F9???`@??c???99?`F???t6??@??z???E??#??!|1?@?R????@94"?B????.9???`@??c???!9?`J???\6??@??w??????#??!|1?@?R????@94"?B???9???`@??c???	9?`N???D6??@??t???	??#??!|1?@?R????@94"?B?????8???`@??c????8?`R???,6??@??q???m??#??!|1?@?R????@94"?B????8???`@??c????8?`V???6??@??n??????#??!|1?@?Rr???@94"?B?????8???`@??c????8?`Z????5??@??k???5??#??!|1?@?RZ???@94"?B????8???`@??c????8?`^????5??@??h??????#??!|1?@?RB???@94"?B?????8???`@??c????8?`b????5??@??e?????#??!|1?@?R*???@94"?B????8???`@??c???y8?`f????5??@??b???m??#??!|1?@?R???@94"?B????n8???`@??c???a8?`j????5??@??_??????#??!|1?@?R????@94"?B???V8???`@??c???I8?`n????5??@??\???=??#??!|1?@?R????@94"?B????>8???`@??c???18?`r???l5??@??Y??????#??!|1?@?R????@94"?B???&8???`@??c???8?`v???T5??@??V???
	??#??!|1?@?R????@94"?B????8???`@??c???8?`z???<5??@??S???u	??#??!|1?@?R????@94"?B????7???`@??c????7?`~???$5??@??P????	??#??!|1?@?R????@94"?B?????7???`@??c????7?`????5??@??M???E
??#??!|1?@?Rj???@94"?B????7???`@??c????7?`?????4??@??J????
??#??!|1?@?RR???@94"?B?????7???`@??c????7?`?????4??@??G???)??#??!|1?@?R:???@94"?B????7???`@??c????7?`?????4??@??D??????#??!|1?@?R"???@9(4"?B????~7???`@??c???q7?`?????4??@????A???	??#??!|1?@?R	???@9(4"?B???e7???`@??c???X7?`?????4??@????>???u??#??!|1?@?R????@9(4"?B????L7???`@??c????7?`????z4??@???h;??????#??!|1?@?R????@9(4"?B ???37???`@??c???&7?`????a4??@???H8???M
??#??!|1?@?R????@9(4"?B? ???7???`@??c???
7?`????H4??@???(5????
??#??!|1?@?R???w???@9(4"?B!???7???`@??c????6?`????.4??@????1???-??#??!|1?@?R????@9(4"?B?!????6???`@??c????6?`????4??@????.??????#??!|1?@?Rr???@9(4"?B"????6???`@??c????6?`?????3??@????+??????#??!|1?@?RY???@9(4"?B?"????6???`@??c????6?`?????3??@????(???9??#??!|1?@?R@???@9(4"?B#????6???`@??c????6?`?????3??@???h%??????#??!|1?@?R'???@9(4"?B?#????6???`@??c???v6?`?????3??@???H"??????#??!|1?@?R???@9(4"?B$???j6???`@??c???]6?`?????3??@???(???M??#??!|1?@?R????@9(4"?B?$???Q6???`@??c???D6?`????3??@?????????#??!|1?@?R????@9(4"?B%???86???`@??c???+6?`????f3??@?????????#??!|1?@?R????@9(4"?B?%???6???`@??c???6?`????M3??@???????a??#??!|1?@?R????@9(4"?B&???6???`@??c????5?`????43??@??????????#???!|1?@?R????@9(4"?B?&????5???`@??c????5?`????3??@?????????#???!|1?@?Rx???@9(4"?B'????5???`@??c????5?`????3??@???h???u??#???!|1?@?R_???@9(4"?B?'????5???`@??c????5?`?????2??@???H	??????#???!|1?@?RF???@9(4"?B(????5???`@??c????5?`?????2??@???(???A??#???!|1?@?R-???@9(4"?B?(????5???`@??c???|5?`?????2??@?????????#???!|1?@?R???@9(4"?B)???p5???`@??c???c5?`?????2??@????????	??#???!|1?@?R?????@9(4"?B?)???W5???`@??c???J5?`?????2??@????????i??#???!|1?@?R?????@9(4"?B*???>5???`@??c???15?`????l2??@???????????#???!|1?@?R?????@9(4"?B?*???%5???`@??c???5?`????S2??@????????)??#???!|1?@?R?????@9(4"?B+???5???`@??c????4?`????:2??@???h???????#???!|1?@?R?????@9(4"?B?+????4???`@??c????4?`????!2??@???H???????#???!|1?@?R~????@9(4"?B,????4???`@??c????4?`????2??@???(????U??#???!|1?@?Re????@9(4"?B?,????4???`@??c????4?`????1??@??????????#???!|1?@?RL????@9(4"?B-????4???`@??c????4?`????1??@????????!??#???!|1?@?R3????@9(4"?B?-????4???`@??c????4?`
????1??@???????????#???!|1?@?R????@9(4"?B.???v4???`@??c???i4?`????1??@???????????#???!|1?@?R????@9(4"?B?.???]4???`@??c???P4?`????1??@????????Y??#???!|1?@?R?????@9(4"?B/???D4???`@??c???74?`???r1??@???h???????#???!|1?@?R?????@9(4"?B?/???+4???`@??c???4?`???Y1??@???H????)??#???!|1?@?R?????@9(4"?B0???4???`@??c???4?`???@1??@???(???????#???!|1?@?R?????@9(4"?B?0????3???`@??c????3?`"???'1??@??????????#???!|1?@?R?????@9(4"?B1????3???`@??c????3?`&???1??@????????a??#???!|1?@?Rk????@9(4"?B?1????3???`@??c????3?`*????0??@???????????#???!|1?@?RR????@9(4"?B2????3???`@??c????3?`.????0??@????????=??#???!|1?@?R9????@9(4"?B?2????3???`@??c????3?`2????0??@???????????#???!|1?@?R ????@9(4"?B3???|3???`@??c???o3?`6????0??@???h????!??#???!|1?@?R????@9(4"?B?3???c3???`@??c???V3?`:????0??@???H???????#???!|1?@?R?????@9(4"?B4???J3???`@??c???=3?`>???x0??@???(???????#???!|1?@?R?????@9(4"?B?4???13???`@??c???$3?`B???_0??@???????e??#???!|1?@?R?????@9(4"?B5???3???`@??c???3?`F???F0??@??????????#???!|1?@?R?????@9(4"?B?5????2???`@??c????2?`J???-0??@???ȱ???A??#???!|1?@?R????"?B6????2???`@??c????2?`N???0??@????"?B?6????2???`@??c????2?`R???0??@???(???"?B7????2???`@??c????2?`V????/??@???H???"?B?7????2???`@??c????2?`Z????/??@???h???"?B8????2???`@??c????2?`^????/??@???????"?B?8????2???`@??c????2?`b????/??@???????"?B9????2???`@??c????2?`f????/??@???ȣ??"?B?9????2???`@??c???s2?`j????/??@??????"?B:???q2???`@??c???d2?`r????/??@??????"?B?:???b2???`@??c???U2?`n????/??@???(???"?B;???S2???`@??c???F2?`v????/??@???H???"?B?;???D2???`@??c???72?`z???r/??@???h???"?B????1???`@??c????1?`????/??@????????u$??#???!|1?@?Rd????@9(4?B?>????1???`@??c????1?`?????.??@?????????$??#???!|1?@?RK????@9(4?B?????1???`@??c????1?`?????.??@???Ȇ????m%??#???!|1?@?R2????B??????1???`@??c????1?`?????.??@????"?B????1???`@??c???u1?`?????.??@???(???"?B????s1???`@??c???f1?`?????.??@???H???"?B???d1???`@??c???W1?`?????.??@???h~??"?B????U1???`@??c???H1?`?????.??@????|??"?B???F1???`@??c???91?`????t.??@????z??"?B????71???`@??c???*1?`????e.??@????x??"?B???(1???`@??c???1?`????V.??@????v??"?B????1???`@??c???1?`????G.??@???u??"?B???
1???`@??c????0?`????8.??@???(s??"?B?????0???`@??c????0?`????).??@???Hq??"?B????0???`@??c????0?`????.??@???ho??"?B?????0???`@??c????0?`????.??@????m??"?B????0???`@??c????0?`?????-??@????k??"?B?????0???`@??c????0?`?????-??@????i??"?B????0???`@??c????0?`?????-??@?h?????-???[?	?)5@?)@???i?TX-???@?!?! ?????_????W??O??{???? ???????@?!?! ????? 6?N@????{C??OB??WA????_???????D?????B ???R????????O??{?????????@?!?! ?{??? 6?N@?@?h~@????{B??OA????1??????D?????B ?!??R????????O??{????????@?!?! ?_???6hN@?)?R	?9?{B??OA?????_???????D?????B ?!??R????????O??{?????????????RL-????!'?B???<	C???<??<@???<
A???<??<??< ? ???A@????,???????R??R9,???????R?R4,???????R$?R/,??c3????RD?R*,??C3????Rd?R%,??#3????R??R ,??.????R??R,??# ????R??R,?? ????R??R,???????R?R,???????R$?R,??????RD?R,??????Rd?R?+??c????R??R?+???C???C??????????`N??=???????????S@??R5?@??S5??a????WM?@T6??]???U6?@????+????L????+?3?R???J?$?R?+???????D?R?+???????Rd?R?+??????R??R?+??#????R??R?+??c????R??R?+???????R??R?+???????R?R?+???????R$?R?+??????RD?R?+??c????Rd?R?+???????R??R?+???2????R??R?+???2????R??R?+??2????R??R?+??c2????R?R?+??C2????R$?R?+??#2????RD?R?+???w??[F???????`N??=??? ??C ???a?#+???}???Qq?T??)???+yhxJ	?@?K@??o@???t+????L???X+?3?R???k@???$?RR+????????g?`N???<ூ=?c??#+???*???<?S@??C5?@??D5?G@?hE5???????WM?F6???????k6h?Ji?'??#?h?Ki??????hg@??c@??5?B?????E+??????g@???(+???????$?R#+???????RD?R&+??????Rd?R!+??#????R??R+??C????R??R+??c????R??R+???????R??R
+???????R?R+???????R$?R+???2????RD?R?*???2????Rd?R?*??2????R??R?*??2????R??R?*??c2????R??R?*??C2????R??R?*??#2????R?R?*??2????R$?R?*???q*?????X??(?mT??k*???w??W??????????|@???(?R
N?#+????|?????N???w??W??????R?O?(?R?????C????C?????????#????c???? ?R?@?????????g@?????5?R???k@???$?R????????RD?R????????Rd?R???#1?????R??R?????R?????[??????N?C???R-?????	7???D?????B ?!??R$?????Q5???D?????B ????R?????????1.????????!L?`?R/?????D???B<%??p?R?????D???B<%?!??R?????D???B?3?m?R?????!6???D?????B ???R???????0???D?????B ???R???????9???D?????B ?U?R??????U:???D?????B ?AU?R??????D???B<%?aO?R??????D???B<%??;?R?????_@?????!????D?????B ?Ah?R??????a>???D?????B ?e?R??????D???B<%?ቀR??????D???B<%?a1?R??????D???B<%?!2?R??????D???B<%?၀R??????D???B?3?l?R????`S@?7????????1.?????!0?@?R??????D???B<%?ᩀR?????_@?????!?NG?N>N#??F?N?>N?O?F?N?>N?z!?z!??O?5nz?O?OZ?O??O:?O??OZ??{N*?{I??NU??!?&???}??}N??{N?{?&??N?&~"?W)??!????	3??N??{N*?{I?O???O???O???O??O???O??O??O??O$?O!?O ?O>?O???O??O??O??Od??Oa?O`?O~?O??O??O??O??O??O??O??O??O??
N_
N?'?9j?Y?<)?-')?	-N,?I?=)=.')=	.N)??
N*=N
N-N??9)=.NImS,??/?U8O?(OΥ/???N?U8O?(Ol??N?
NmmSJ??N
??N
NHm???N??N

Nߗ?N?
N(?ȗ?N'(?)?N?+?9*=N'*=NN*?>
N)=.
N^N??9*=NN*mާ/?W8O?(OΥ/?U8OZ??N?(Oz??N[
N
m???N???N]
NJlLlSmSblSk??N???N

NH"????N

N???N]'(?
N(?"?
N(='(=
?N(=]N
N(=N?#?9mS)mS)??/?W8O?(O֞?NΥ/?U8O?(O???NU
N???N??N8
N)???Nx??N?
NJ,?{??N]
N???N*?"?5'?N)=U
N*=,=UN"=9'YNZ?#?={??N{?-?l?-?d-?H-?#??????? ?!??TZ?!?s"??#?_????T(????@@??(?(?@???@?(?(??@??(?(??@?????@?????T?A?J??@?)?????_?A??T!?????Ɂ?J?}???M???~?΁??o?@??????????????
???!	@?!
?
??	@?!
?
??	@???!
?????T?!??A??T?V???)5@?)@???T?	??{I??OH??WG??_F??gE??oD??#Cm?+Bm?3Am?;?l?_֖???}E?@?f???_???}E?@?a???_???}E?@?\???_???}E?@?W???_???@?`??P?_???@????@????
@????@????@????@????@????@????"@????&@????*@????.@????2@????6@????:@????>@????B@????F@????J@????N@????R@????V@????Z@????^@????b@?ְ?@?ְ?"@?ְ?&@?ְ?*@????f@????j@????n@????r@????v@????z@????~@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@?????@????A????A????
A????A????A????A????A????A????"A????&A????*A????.A????2A????6A????:A????>A????BA????FA????JA????NA????RA????VA????ZA????^A????bA????fA????jA????nA????rA????vA????zA????~A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A?????A????1???G????N@??P???P???P???=P???SP???sP????P????P???P???0P???VP???|P????P????P???$P???TP???}P????P????P????P???P???GP???gP????P????P????P????P???P???P???/P???GP???dP???~P????P????P????P????P????P???P???!P???/P???=P~??LP{??pPx??~Pu???Pr???Po???Pl???Pi???Pf???Pc??
P`??P]??(PZ??7PW??RPT??bPQ??pPN??~PK???PH???PE???PB???P????P$>,>,$$,>$>,>,,>>,>$>$$$$>,$>$,>$,>,,,,,4$44>$>4>$>4>$>$,>4$44$,$,$,$,4$,>,,4>$>4$,4>4>>>$,,$>$>,$,$,>,$,$>,>>4>,$>,,4>$$4$,,>$>$$>$,4,,,,,$44444>4>$$>$,$>$,$>,$$>$$>$$$4$44$>$,$$$$$,$$$4$$,,$$,$>,$,>$>$>$>$,$,>,,4,4,,,,$,,>,,,,$,$,>$,>$,,,,,,4,$>,$>,$4$$44$4$44444>4$44444$$$4,,4,,444>4>4>,>>>>>,>4>$>>,$>,>>,>>4>$>$$>,>,>$,>4>	
				

				


				
		
														
			








	
			
	


		
			
			
									
					
	

		

	
	
	
			
							

												







					
		

							
				
		
			


	
																																	
																											
	
		
	

												

	
		
					
		
	
	









	


	
	





	

	
	
		

	


	




	



	
		
				
						

???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
&5EYq????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
 "(*ADPXad????@??"?!$@BH`???? Fi??	@??(ADPR?	@	

!@`??? PZ?$E %I?b@??Q  
 D a ? ? )!H!""$$$@$V$%A%d%?&( (?(D*@@@@!@$@@@H@V@`@?@?@?@A AaA?A?ABBHBVBhBDD D?D?DE$EFHHH@HEHIXIaI?IEJ?JPPPP P?P?PQBQ?Q?R?T?T
UVTVXXXdX@YZ``@`h`aUab`bddee?eBh??
?A?????@??????@?`??F???	?@?`??????$?@??????E??"?D?Q??? ??P???	???P??
 "%(ADFIPRUXad????????	!$@BEHQT`h??? ADPU??	!$@BEHQTV`??? ADPa?&@B?
 %ADPX???			@	?	?	
 
(
?
?
	!$@BEHQT`j??? ADP???@` ADIPd?@I@T?fQ?    
     A D P ? ? !!!@!H!e!"""?"?"$$$)$@$%A%R%?%&&?&((
( (U(?(?(h)?)* *?*?*?*@@@	@@@@@!@$@@@B@E@H@J@Q@T@`@e@?@?@?@AAAAAA AAADAPA?A?A?ABBBB)B@BDDDDDDD DADDDPD?D?DEEE$E@E?EF
FDFPFHHH@HEHTHbHIIDIPIiIJPPPPPP P(PAPDPPP?PQQQQ@QBQRDR?RTTT!T@T`T?T?TUU?U?U!VhV?VXXAXPX?XY@YBY?Z```@`T`b`?`?`a$bJb?bdde@eEe?ehjh%ijTjbj?????? ?*?A?D?P?????????????@?Q?Y?? ??????????????@?`????D????j???%?Z????????"????????????@?V????"?d?V?????D?P?X?)?????A?Q???I??`????
? ?*???Q?Y??????*?????@???e???
? ?"?(??????????(?*?????
 "(*EQTVe?????????%AFIRUZadfh?????
 "(*EQYdi???????????%AIUZde???)@EJPQTUVY`behj??????????ADPRUX`afi????
 "(*EQVe?????????				$	%	A	P	Q	U	a	d	i	?	?	?	?	?	





 
"
(
*
E
Q
Y
a
e
?
?
?
?
?
?
?
?
?
?
$%ADPUXadei?????	!$)EJPQRTUVY`e?????%@FIRUXZdf?????	!&AEFHJQTUVYbeh????????????
 "%(*ADEFQRTUVYZadefi????????????????!&@BDEHJQUVXYadehij??????%ADFIPUXZ`adfi????!%BDEHQTUVYZ`ej????????	$&DFIPRUXafi????   
    " % ( * E Q Y a e ? ? ? ? ? ? ? ? ? ? !!!!%!B!D!I!U!X!Z!a!d!e!f!?!?!?!?!?!""
""" """("*"E"Q"V"Y"e"?"?"?"?"?"?"?"?"?"$$$$%$D$E$F$I$R$U$X$Z$f$?$?$?$?$?$?$	%%!%)%@%E%H%Q%T%U%Y%b%e%h%?%?%?%?%?%?%?%?%?%?%&&&&%&A&I&U&`&a&i&?&?&?&?&(((
(( ("(((*(E(Q(T(e(?(?(?(?(?(?(?(?(	))))%)F)I)R)U)a)d)f)i)?)?)?)?)?)?)***
* *"*(***E*Q*V*Y*e*?*?*?*?*?*?*?*?*?*@@@%@I@R@U@X@Z@a@d@f@?@?@?@?@AAAA	AAAAAA!A&A)AEAHAJAQATAUAVAYAZAeAhAjA?A?A?A?A?A?A?A?A?ABBBB%BABRBUBZBdBiB?B?B?BDDD)DEDHDJDQDTDUDVDaDbDeDhDjD?D?D?D?D?D?D?D?D?DEEE
EEEEEE E%E*EAEDEEEFEIEPEQETEUEVEXEYEaEdEeEfEiE?E?E?E?E?E?E?E?E?E?E?E?E?EFF	FFFFF!F$F)F@FBFEFHFPFQFRFUFVFYFbFeFhF?F?F?F?F?F?F?F?FHHHH%HBHIHPHUHXHaHdHfHiH?H?H?H?H?H?HIII
IIIII!I$I&I@IEIJIQIRITIUIVIYI`IbIeIfIjI?I?I?I?I?I?I?I?I?I?IJDJFJIJUJXJZJdJiJ?J?JPPPP	PPPP!P$P)P@PEPHPQPTPUPVPYPePhP?P?P?P?P?P?P?P?PQQ	Q
QQQQQQQ Q%Q&Q(Q*QAQDQEQFQIQPQQQRQTQUQVQXQYQZQaQdQeQfQiQ?Q?Q?Q?Q?Q?Q?Q?Q?Q?QRRRRR!R$RBRERJRQRTRURVRYRbReR?R?R?R?R?R?R?RTTTTTTTT!T%T(T*TATDTETFTITJTPTQTTTUTVTXTYTZTaTbTdTeTfTiT?T?T?T?T?T?T?T?T?T?T?T?TUUUUU	UUUUUUUUU!U$U%U&U)U@UAUBUDUEUFUHUIUPUQURUTUUUVUXUYUZU`UaUdUeUfUhUiUjU?U?U?U?U?U?U?U?U?U?U?U?U?U?U?U?U?UVVVVVV	VVVVVV V!V"V$V%V&V(V)VAVEVFVHVIVJVPVQVRVTVUVVVXVYVZVaVdVeViV?V?V?V?V?V?V?V?V?V?V?V?V?V?VXXX	XXXX!X*XEXHXJXQXTXUXVXXXYX`XbXdXeX?X?X?X?X?X?X?X?XYYY
YYYYYY%YAYDYEYFYIYPYQYRYTYUYVYXYYYZYaYdYeYfYiY?Y?Y?Y?Y?Y?Y?Y?Y?Y?YZZZZ Z%Z&Z)ZEZHZIZQZUZVZXZYZbZeZhZjZ?Z?Z?Z?Z?Z?Z?Z?Z````%`D`P`U`V`X`Z`a`d`f`i`?`?`?`aaa	aaa!a"a&a)aEaIaQaUaVaYaeafaja?a?a?a?a?a?a?abbb@bAbFbUbVbXb`b?b?b?b?bddddd!d&d)d@dBdEdHdJdQdTdUdVdYdZd`dbded?d?d?d?d?d?d?d?d?d?d?d?d?dee
eeeeeDeEeFeIePeQeTeUeVeYeaedeeefeie?e?e?e?e?e?e?e?e?e?e?e?ef	ff f&f(f)f@fEfHfJfQfTfUfVfXfZf`fefhf?f?f?f?f?f?f?f?f?f?f?f?fhh%hAhRhUhZhahih?h?h?h?hiiii!i$i&i)i@iAiEiFiHiQiTiUiViYi`ieiji?i?i?i?i?i?i?i?ijjjAjDjIjPjUjXjZjdjejij?j?j?j?j?j???
? ?"?(?*?E?P?Q?T?V?Y?e????????????????????????%?A?D?I?P?R?U?V?X?Y?d?f?i????????????????
?? ?"?(?*?Q?T?Y?e?????????????????????A?D?Q?U?Z?a?d?i??????	????&?)?@?A?E?H?Q?T?U?V?Y?Z?e?f?h?j??????????????????????%?A?D?I?J?P?U?Y?Z?a?f?j????????????
?? ?"?(?*?A?E?Q?T?Y?e?i????????????????????????%?A?D?F?I?P?R?U?Z?a?d????????????
?? ?"?(?*?E?Q?T?V????????????????????????%?A?F?I?U?X?Z?i?j????????????????	?????!?$?&?)?@?E?P?Q?T?U?V?Y?b?e???????????????????????%?D?F?I?P?R?U?X?f?i???????????????&?@?J?Q?T?U?V?X?Y?`?a?b?e????????????????????
???????!?%?)?*?A?D?E?F?I?P?Q?R?T?U?V?X?Y?Z?a?d?e?f?i???????????????????????????????????? ?&?)?E?H?I?Q?R?U?V?Y?e?h????????????????????????%?A?F?P?R?U?V?Z?d?e?????????????	?????? ?!?$?&?@?B?E?H?J?Q?T?U?V?Y?b?e?f?j???????????????????%?D?F?I?P?U?X?a??????????????
?? ?"?(?*?E?Q?T?V?Y????????????????????	??????F?I?Q?U?X?Z?a?d?????????????
???"?(?*?E?Q?V?Y?e????????????????????%?A?D?P?T?U?X?Z?a?e?f?h?i????	?????&?)?B?E?Q?T?U?V?Y?e?j?????????????????????!?%?D?F?J?R?U?V?X?`?b????????????????????
? ?"?(?*?Q?T?V?Y??????????????????????!?%?A?P?U?Z?a?f?i????????
? ?"?(?*?Q?T?V???????????????????
 "%(ADFIPRUXadfi?????????	!$@BEHQTVY`eh??????? *ADFIPU?????	!$&)@BEHJQTVY`be?????????
 %(ADFIPRUXad???????	@EHQT`??? %*ADFIPRUXad????						!	@	E	H	Q	T	`	?	?	


"
(
*
P
?
	!$&@BEHQTVY`beh????????
 "%(ADFIPRUXad??????	!$@EQT??? %(ADFIPRUXad???????	!$@BEHQT`??? ADP??	!@BEHQT`?? ADPi?@V          % * A D P R U d ? ? ? ? !!!!!!!@!B!E!Q!T!`!?!?!?!"
"""("*"D"P"?"?"?"$$$	$$$$!$$$@$B$E$H$Q$T$`$?$?$?$%%%%% %A%D%P%f%?%&&&@&Y&((((A(D(P(?(?()))?)
*"*d*?*?*@@@	@@@@@@!@$@&@@@B@E@H@J@Q@T@V@Y@`@b@e@?@?@?@?@?@?@?@AAAAAAAA A"A%AAADAFAIAPARAUAXAaAdA?A?A?A?A?A?A?ABBBBBB$B@BEBHBQBTB`B?B?BDDDD
DDDDD D"D%D(DADDDFDIDPDRDUDXDaDdD?D?D?D?D?D?D?DEEE	EEEEE!E$E@EBEEEHEQETE`EjE?E?E?EFFFFFF FAFDFPF?F?FHH	HHHHH!H$H@HBHEHHHQHTH`H?H?HIIIIII IAIDIPI?I?IJJJ@JPPPPPPPP P"P%P(PAPDPFPIPPPRPUPXPaPdP?P?P?P?P?P?PQQQ	QQQQQ!Q$Q@QBQEQHQQQTQ`Q?Q?Q?QRRRRR RARDRPRiR?RTTT	TTTTT!T$T@TBTETHTQTTT`T?T?T?TUUUUUU UAUDUPU?UVVV&V@VXXXXXX XAXDXPXZX?XYYY@YZZ?Z?Z```````!`$`@`E`H`Q`T```?`?`aaaaaa aAaDaPa?a?abb@bVb?bddddd dAdDdPd?deee@eJehe?ef?fhhheh?hi*iBj?j??????? ?%?A?D?P?R?U?X?a???????????	?????!?$?@?B?E?H?Q?T???????????
???A?D?P????	?????!?@?B?E?H?Q?T?`????????????? ?A?D?P????????)?@?????A?D?P?????@?e?"?X?Z???????	?????$?@?B?E?H?Q?T?`???????????A?D?P?Z????@????????? ?A?D?P????????@??????F?d????&?@????I?R?????
??"?*?A?D?P?????@?e??
?"?(?*????????????@???????Q?
?(???T????
? ?"?(?????	";=ACHJQUXZalx??????????????????$/;=AGZj???????
'(@BIPR?????????????(PTfy???	"ACEHJQXswx??????????????+CWa|????
(5:@BPYdf????????':@FRm?????+/|???????	)	4	U	c	x	?	?	?	?	

!
8
@
F
V
m
?
?
?
?
?
:BY???$&4Qq????$
E
j
?
?
?
*V`???????!@BT?	
 "%')+029<?@ABDHIMPSWY]dquz???????????????????????????????? #)8BDPRV[aegv{???????????????	
,.1:@ACFHLQX[ahjx~????????????????????????
"&(,AHKQXZi??????????????
!#%(*78;=@BHKORUY\bi???????????????????????!:=DIR_`kx????????????	
"$')39ACELQS`pz~??????????????????	*04AHJUZdn{???????
!(8BGIKRX]cim?????????????????				 	9	E	G	Q	r	?	?	?	?	?	?	?	?	



 
$
'
*
6
<
A
C
E
J
Q
Z
z
?
?
?
?
?
?
?
?
?
?
?
?
?
?
&JVik????	
0@PWt??????????
#
2
@
C
\
p
?
?
?
?
 ,2BITce???????????(Rb???`?>?????`???? ?-z???z.zzzz?zAz?z?E?zKz--zzzzzz-z?zkzhzzzzzz???5i"xz`?zzzzz?????????????????????<8>:?	?	?	?	?	?	?	?	?	?	?	?	?	?	?	?	?	?	?	?	?	-13a
a
579a
=?AEGa
KMOQSU[Wa
a
a
a
a
Y????????"?"c
j
l
lln
p
r
lt
v
x
z
|
l~
?
?
?
?
?
?
?
lllll?
?f
f

f
f
 "$&f
f
f
f
f
(?????????????????????????????FZn??????!}?????)))))))))))))))))))))))??EE????????&&..4:I??????????????????????????^????NSt3__119__async_assoc_stateIvNS_12__async_funcIZL25ggml_backend_blas_mul_matP25ggml_backend_blas_contextP11ggml_tensorE3$_0JEEEEE%s:%d: GGML status: error (failed to allocate memory)GGML status: error (operation failed)GGML status: successGGML status: warning (operation aborted)GGML status: unknown/Users/runner/work/whisper-jni/whisper-jni/build/w/src/whisper-cpp/ggml/src/ggml.cGGML_ASSERT(%s) failedtype < GGML_TYPE_COUNTggml_numa_init: NUMA already initialized
 - ggml_object: type = %d, offset = %zu, size = %zu, next = %p
%s: objects in context %p:
ggml_print_objects%s: --- end ---
NONEwtype != GGML_TYPE_COUNTctx->mem_buffer != NULL((uintptr_t) (ctx->mem_buffer))%GGML_MEM_ALIGN == 0tensor->datafatal errortensor->nb[0] == sizeof(int8_t)tensor->nb[0] == sizeof(int16_t)tensor->nb[0] == sizeof(int32_t)tensor->nb[0] == sizeof(ggml_fp16_t)tensor->nb[0] == sizeof(ggml_bf16_t)tensor->nb[0] == sizeof(float)tensor->op == GGML_OP_UNARY%s (view)ggml_is_matrix(a)ggml_are_same_shape(a, b)ggml_can_repeat(a, b)ggml_can_repeat(b, a)dim >= 0 && dim < GGML_MAX_DIMSa->ne[d] == b->ne[d]ggml_can_mul_mat(a, b)!ggml_is_transposed(a)a->op == GGML_OP_MUL_MAT!ggml_is_transposed(as)ids->type == GGML_TYPE_I32as->ne[3] == 1b->ne[3] == 1ids->ne[2] == 1 && ids->ne[3] == 1ids->ne[1] == b->ne[2]as->ne[0] == b->ne[0]ids->ne[0] % b->ne[1] == 0ggml_can_out_prod(a, b)%s (copy)ggml_nelements(a) == (ne0*ne1*ne2*ne3)%s (cont)ggml_is_contiguous(a)ggml_nelements(a) == ggml_nelements(b)%s (reshaped)ggml_nelements(a) == ne0ggml_nelements(a) == ne0*ne1ggml_nelements(a) == ne0*ne1*ne2ggml_nelements(a) == ne0*ne1*ne2*ne3axis0 >= 0 && axis0 < GGML_MAX_DIMSaxis1 >= 0 && axis1 < GGML_MAX_DIMSaxis2 >= 0 && axis2 < GGML_MAX_DIMSaxis3 >= 0 && axis3 < GGML_MAX_DIMSaxis0 != axis1axis0 != axis2axis0 != axis3axis1 != axis2axis1 != axis3axis2 != axis3%s (permuted)%s (transposed)a->ne[2] == b->ne[1]b->type == GGML_TYPE_I32ggml_is_matrix(a) && ggml_is_vector(b) && b->type == GGML_TYPE_I32ggml_is_matrix(c) && (a->ne[0] == c->ne[0])a->ne[1] == 1ggml_is_vector(b)a->ne[2] == b->ne[0]ggml_is_matrix(b)a->ne[3] == 1p0 == 0d0 == 1a->ne[2] == b->ne[2]a->ne[1] == b->ne[1](!is_2D || OH > 0) && "b too small compared to a"(OW > 0) && "b too small compared to a"a->ne[3] == b->ne[2]stop > starta->ne[0] >= kggml_can_mul_mat(k, q)ggml_is_contiguous(mask)mask->ne[2] == 1mask->ne[3] == 1mask->ne[1] >= GGML_PAD(q->ne[1], GGML_KQ_MASK_PAD) && "the Flash-Attention kernel requires the mask to be padded to GGML_KQ_MASK_PAD and at least n_queries big"maska->op == GGML_OP_FLASH_ATTN_EXTTODO: adapt to ggml_flash_attn_ext() changesggml_is_3d(sx)ggml_is_matrix(c)sx->ne[1] == d_innern_t >= 0ggml_is_contiguous(s)ggml_is_contiguous(x)ggml_is_contiguous(dt)ggml_is_contiguous(A)ggml_is_matrix(A)ggml_is_3d(B)ggml_is_3d(s)B->nb[0] == ggml_type_size(B->type)C->nb[0] == ggml_type_size(C->type)ggml_are_same_shape(x, dt)ggml_are_same_shape(B, C)s->ne[2] == n_seqsx->ne[0] == d_innerA->ne[0] == d_stateA->ne[1] == d_innerB->ne[0] == d_stateB->ne[1] == n_seq_tokensB->ne[2] == n_seqsa->type == GGML_TYPE_F32qh == kh2*MAX(qh, kh) - 1 == a->ne[1]ggml_is_contiguous(k)ggml_is_contiguous(v)ggml_is_contiguous(r)ggml_is_contiguous(tf)ggml_is_contiguous(td)ggml_is_contiguous(state)k->ne[1] == 1v->ne[0] == 1 && v->ne[1] == S && v->ne[2] == H && v->ne[3] == n_tokensr->ne[0] == 1 && r->ne[1] == S && r->ne[2] == H && r->ne[3] == n_tokenstd->ne[0] == 1 && td->ne[1] == S && td->ne[2] == H && td->ne[3] == n_tokensggml_nelements(state) == S * S * H * n_seqsggml_is_scalar(c)a->flags & GGML_TENSOR_FLAG_PARAMggml_are_same_shape(a, grad)alpha > 0.0fbeta1 >= 0.0f && beta1 <= 1.0fbeta2 >= 0.0f && beta2 <= 1.0feps >= 0.0fwd >= 0.0f && wd <= 1.0fk != GGML_HASHSET_FULLreplacements->set.keys[k] == NULLgf->n_nodes > 0gf->gradsnode->src[j]->type == GGML_TYPE_F32 || node->src[j]->type == GGML_TYPE_F16!node->view_src || node->op == GGML_OP_CPY || node->op == GGML_OP_VIEW || node->op == GGML_OP_RESHAPE || node->op == GGML_OP_PERMUTE || node->op == GGML_OP_TRANSPOSEinsert_result != GGML_HASHSET_ALREADY_EXISTSdst->size >= src->n_leafsdst->size >= src->n_nodesdst->visited_hash_set.size >= src->visited_hash_set.sizedst->grads != NULLcgraph->grads != NULLnode->grad->buffernode->type == GGML_TYPE_F32ggml_is_scalar(node)cgraph->n_nodes + i >= 0i < cgraph->n_nodescgraph->size > cgraph->n_nodesrc == GGML_EXIT_SUCCESS || rc == GGML_EXIT_ABORTEDnode->src[0]->ne[3] == 1node->src[1]->ne[2] == 1node->src[1]->ne[3] == 1cplancplan->n_threads > 0cplan->work_size == 0 || cplan->work_data != NULLcplan requested more threads (%d) than available (%d)
%-16s %8x
magic%-16s %8d
versionleafsnodes%-16s %llu
eval%-6s %-12s %8s %8s %8s %8s %8s %16s %16s %16s %16s %16s %16s
TYPEOPNDIMSNE0NE1NE2NE3NB0NB1NB2NB3DATANAMEcgraph->leafs[i]->op == GGML_OP_NONEcgraph->leafs[i]->src[0] == NULLcgraph->leafs[i]->src[1] == NULL%-6s %-6s %-12s %8s %8s %8s %8s %8s %16s %16s %16s %16s %8s %16s %16s
ARGNTASKSDSTSRCwb%s: failed to open %s: %s
ggml_graph_export%s: failed to find tensor, arg = %d, node = %d
rbggml_graph_import%s: failed to create ggml context
%s: failed to read %s
%s: invalid magic number, got %08x
%s: invalid version number
%s: loaded leaf %u: '%16s', %9zu bytes
%s: loaded node %u: '%16s', %9zu bytes
=== GRAPH ===
n_nodes = %d
 - %3d: [ %5lld, %5lld, %5lld] %16s %s
xg n_leafs = %d
 - %3d: [ %5lld, %5lld] %8s %16s
========================================
wfpdigraph G {
  newrank = true;
  rankdir = TB;
yellowgreenlightbluewhite  "%p" [ style = filled; fillcolor = %s; shape = record; label="%s (%s)|(%s)|%d [%lld, %lld] | %s%d [%lld, %lld, %lld] | %s | %s"; ]
"; ]
pink  "%p" [ style = filled; fillcolor = %s; shape = record; label="CONST %d [%lld, %lld] | (%d%.1e, src %d}
%s: dot -Tpng %s -o %s.png && open %s.png
ggml_graph_dump_dotf->grad && "ggml_set_param must be called for at least one ancestor"opt-forward.dotopt-backward.dotggml_is_scalar(tensor)tensor->type == GGML_TYPE_F32imatrix != NULLstart % type_traits[type].blck_size == 0start % n_per_row == 0result == nrows * row_size%s: failed to open '%s': '%s'
gguf_init_from_file%s: invalid magic characters '%c%c%c%c'
%s: GGUFv1 is no longer supported. please use a more up-to-date version
%s: failed to read header
%s: array size is too large (%llu)
invalid type%s: failed to read key-value pairs
%s: duplicated tensor name %s
%s: failed to read tensor info
general.alignment%s: tensor '%s' of type %d (%s) number of elements (%lld) is not a multiple of block size (%lld)
%s: failed to initialize context
%s: failed to read tensor data
%s: failed to read the tensor data
key_id >= 0 && key_id < gguf_get_n_kv(ctx)ctx->kv[key_id].type == GGUF_TYPE_ARRAYctx->kv[key_id].type == GGUF_TYPE_UINT8ctx->kv[key_id].type == GGUF_TYPE_INT8ctx->kv[key_id].type == GGUF_TYPE_UINT16ctx->kv[key_id].type == GGUF_TYPE_INT16ctx->kv[key_id].type == GGUF_TYPE_UINT32ctx->kv[key_id].type == GGUF_TYPE_INT32ctx->kv[key_id].type == GGUF_TYPE_FLOAT32ctx->kv[key_id].type == GGUF_TYPE_UINT64ctx->kv[key_id].type == GGUF_TYPE_INT64ctx->kv[key_id].type == GGUF_TYPE_FLOAT64ctx->kv[key_id].type == GGUF_TYPE_BOOLctx->kv[key_id].type == GGUF_TYPE_STRINGctx->kv[key_id].type != GGUF_TYPE_ARRAYctx->kv[key_id].type != GGUF_TYPE_STRINGnested arrays not supportedtensorduplicated tensor nametensor not foundfailed to open file for writingf32f16q4_0q4_1DEPRECATEDq5_0q5_1q8_0q8_1q2_Kq3_Kq4_Kq5_Kq6_Kq8_Kiq2_xxsiq2_xsiq3_xxsiq1_siq4_nliq3_siq2_siq4_xsi8i16i32i64f64iq1_mbf16q4_0_4x4q4_0_4x8q4_0_8x8tq1_0tq2_0DUPADDADD1ACCSUBMULDIVSQRSQRTLOGSINCOSSUMSUM_ROWSMEANARGMAXCOUNT_EQUALREPEATREPEAT_BACKCONCATSILU_BACKNORMRMS_NORMRMS_NORM_BACKGROUP_NORMMUL_MATMUL_MAT_IDOUT_PRODSCALESETCPYCONTRESHAPEVIEWPERMUTETRANSPOSEGET_ROWSGET_ROWS_BACKDIAGDIAG_MASK_INFDIAG_MASK_ZEROSOFT_MAXSOFT_MAX_BACKROPEROPE_BACKCLAMPCONV_TRANSPOSE_1DIM2COLIM2COL_BACKCONV_TRANSPOSE_2DPOOL_1DPOOL_2DPOOL_2D_BACKUPSCALEPADARANGETIMESTEP_EMBEDDINGARGSORTLEAKY_RELUFLASH_ATTN_EXTFLASH_ATTN_BACKSSM_CONVSSM_SCANWIN_PARTWIN_UNPARTGET_REL_POSADD_REL_POSRWKV_WKVUNARYMAP_UNARYMAP_BINARYMAP_CUSTOM1_F32MAP_CUSTOM2_F32MAP_CUSTOM3_F32MAP_CUSTOM1MAP_CUSTOM2MAP_CUSTOM3CROSS_ENTROPY_LOSSCROSS_ENTROPY_LOSS_BACKOPT_STEP_ADAMWnonex+yview(x,nb,offset)+=y->xx-yx*yx/yx^2√xlog(x)sin(x)cos(x)ΣxΣx_kΣx/nargmax(x)count_equal(x)repeat(x)repeat_back(x)concat(x, y)silu_back(x)norm(x)rms_norm(x)rms_norm_back(x)group_norm(x)X*YX[i]*Yx*vy-\>view(x)x-\>ycont(x)reshape(x)view(x)permute(x)transpose(x)get_rows(x)get_rows_back(x)diag(x)diag_mask_inf(x)diag_mask_zero(x)soft_max(x)soft_max_back(x)rope(x)rope_back(x)clamp(x)conv_transpose_1d(x)im2col(x)im2col_back(x)conv_transpose_2d(x)pool_1d(x)pool_2d(x)pool_2d_back(x)upscale(x)pad(x)arange(start, stop, step)timestep_embedding(timesteps, dim, max_period)argsort(x)leaky_relu(x)flash_attn_ext(x)flash_attn_back(x)ssm_conv(x)ssm_scan(x)win_part(x)win_unpart(x)get_rel_pos(x)add_rel_pos(x)rwkv_wkv(k, v, r, tf, td, s)unary(x)f(x)f(x,y)custom_f32(x)custom_f32(x,y)custom_f32(x,y,z)custom(x)custom(x,y)custom(x,y,z)cross_entropy_loss(x,y)cross_entropy_loss_back(x,y)adamw(x)ABSSGNNEGSTEPTANHELURELUSIGMOIDGELUGELU_QUICKSILUHARDSWISHHARDSIGMOIDEXPhw.optional.AdvSIMDhw.optional.arm.FEAT_I8MMBehavior may be unexpected when allocating 0 bytes for ggml_aligned_malloc!
unknown allocation errorinvalid alignment valueinsufficient memory%s: %s (attempted to allocate %6.2f MB)
ggml_aligned_malloctype >= 0 && type < GGML_TYPE_COUNTn_dims >= 1 && n_dims <= GGML_MAX_DIMSview_src == NULL || data_size == 0 || data_size + view_offs <= ggml_nbytes(view_src)%s: not enough space in the scratch memory pool (needed %zu, available %zu)
ggml_new_tensor_implobj_newggml_can_repeat_rows(b, a)ggml_is_quantized(a->type) || a->type == GGML_TYPE_F16 || a->type == GGML_TYPE_BF16ggml_is_scalar(b)ggml_is_padded_1d(a)ggml_nelements(b) <= ggml_nelements(a)b->type == GGML_TYPE_F32tensor != NULLggml_nelements(a) >= ggml_nelements(b)offset < (size_t)(1 << 30)%s (copy of %s)mask->type == GGML_TYPE_F16 || mask->type == GGML_TYPE_F32ggml_is_matrix(mask)mask->ne[0] == a->ne[0]mask->ne[1] >= a->ne[1](mode & 1) == 0 && "mode & 1 == 1 is no longer supported"c->type == GGML_TYPE_F32c->ne[0] >= n_dims / 2a->ne[0] <= ne0a->ne[1] <= ne1a->ne[2] <= ne2a->ne[3] <= ne3ggml_are_same_shape(pw, ph)ggml_is_contiguous(pw)ggml_is_contiguous(ph)ph->type == GGML_TYPE_F32pw->type == GGML_TYPE_F32pw->ne[3] == a->ne[2]pw->ne[0]*pw->ne[0] == a->ne[0]pw->ne[1]*pw->ne[2] == a->ne[1]ggml_is_contiguous_1(a)n_tasks == GGML_N_TASKS_MAX || n_tasks > 0Behavior may be unexpected when allocating 0 bytes for ggml_malloc!
%s: failed to allocate %6.2f MB
ggml_mallocBehavior may be unexpected when allocating 0 bytes for ggml_calloc!
ggml_calloci != GGML_HASHSET_FULLreplacements->set.keys[i] == NULL%s (clone)cgraph->nodes[cgraph->n_nodes - 1] == tensorcgraph->n_leafs < cgraph->sizeleaf_%dcgraph->n_nodes < cgraph->sizenode_%d/Users/runner/work/whisper-jni/whisper-jni/build/w/src/whisper-cpp/ggml/src/./ggml-impl.hsrc0->type == tensor->typetensor->grad->type == tensor->type!src1->grad || src1->grad->type == tensor->grad->typeggml_is_contiguous(src0->grad)ggml_is_contiguous(tensor->grad)offset % n0 == 0nb1 % n0 == 0nb2 % n0 == 0nb3 % n0 == 0(!src1 || !src1->grad) && "backward pass for softmax mask not implemented"(!src2 || !src2->grad) && "gradients for freq factors not implemented"FA backward pass not adapted after rework!src1->grad && "backward pass for labels not implemented"ggml_are_same_shape(tensor->src[i], tensor->src[i]->grad)%s: not enough space in the context's memory pool (needed %zu, available %zu)
ggml_new_object((uintptr_t) (mem_buffer + obj_new->offs))%GGML_MEM_ALIGN == 0%s: op not implemented: ggml_get_n_tasks%s
%d
rc == 0warn: failed to set thread priority %d : %s (%d)
t == 0 || t == 1ggml_nelements(dst) == ggml_nelements(src0)ggml_is_contiguous(dst) && ggml_is_contiguous(src0)ggml_can_repeat(src1, src0) && ggml_are_same_shape(src0, dst)nb0 == sizeof(float)nb00 == sizeof(float)ggml_are_same_shape(src0, src1) && ggml_are_same_shape(src0, dst)src0->type == GGML_TYPE_F16dst->type == GGML_TYPE_F16nb0 == sizeof(ggml_fp16_t)nb00 == sizeof(ggml_fp16_t)src1->type == GGML_TYPE_F32dst->type == GGML_TYPE_BF16nb0 == sizeof(ggml_bf16_t)nb00 == sizeof(ggml_bf16_t)nb00 == ggml_type_size(type)nb10 == sizeof(float)nb0 <= nb1nb1 <= nb2nb2 <= nb3ggml_is_quantized(src0->type)ggml_are_same_shape(src0, dst)ggml_is_scalar(src1)dst->type == src0->typeoffset + (ne10 == 0 ? 0 : ne10-1)*nb0 + (ne11 == 0 ? 0 : ne11-1)*nb1 + (ne12 == 0 ? 0 : ne12-1)*nb2 + (ne13 == 0 ? 0 : ne13-1)*nb3 < ggml_nbytes(dst)offset + (ne10 == 0 ? 0 : ne10-1)*nb00 + (ne11 == 0 ? 0 : ne11-1)*nb01 + (ne12 == 0 ? 0 : ne12-1)*nb02 + (ne13 == 0 ? 0 : ne13-1)*nb03 < ggml_nbytes(src0)src1->type == GGML_TYPE_F32 && "only f32 src1 supported for now"dst->nb[0] == sizeof(float)src0->nb[0] == sizeof(float)ne0 == 1ne1 == ne01ne2 == ne02ne3 == ne03src1->type == GGML_TYPE_I32ggml_are_same_shape(src0, src1)ggml_is_scalar(dst)dst->type == GGML_TYPE_I64ggml_can_repeat(src0, dst)ggml_can_repeat(dst, src0)dim >= 0 && dim < 4eps > 0.0fggml_are_same_shape(src0, dst) && ggml_are_same_shape(src0, src1)ne0 == ne01ne1 == ne11ne2 == ne12ne3 == ne13nb10 == ggml_type_size(src1->type)ne02 == ne12ne03 == ne13ne0 == ne00ne1 == ne10dst->type == GGML_TYPE_F32ggml_is_contiguous(src0)ggml_is_contiguous(dst)offset + im0*nb0 + im1*nb1 + im2*nb2 + im3*nb3 <= ggml_nbytes(dst)i01 >= 0 && i01 < ne01dst->ne[0] == ncsrc0->nb[0] == sizeof(ggml_fp16_t)ne00 == ne0ne00 == ne1ne01 == 1ne02 == ne2ne03 == ne3n_past >= 0ggml_is_contiguous(src1)ggml_are_same_shape(src1, dst)n_dims <= ne0n_dims % 2 == 0src2->type == GGML_TYPE_F32src2->ne[0] >= n_dims / 2k0 == s0falseggml_nelements(dst) == stepsne0 == Dne2 == Nnbq0 == ggml_type_size(q->type)nbk0 == ggml_type_size(k->type)nbv0 == ggml_type_size(v->type)nek0 == Dnev0 == DP >= 0nbq0 == sizeof(float)nbk0 == sizeof(float)nbv0 == sizeof(float)nev1 == Dned0 == Dned1 == Nggml_blck_size(result_type) == 1dst->ne[0] == nrsrc1->nb[0] == sizeof(float)src0->nb[1] == src0->ne[0]*sizeof(float)ggml_nelements(src1) + ggml_nelements(src0) == ggml_nelements(dst)src2->nb[0] == sizeof(float)src3->nb[0] == sizeof(float)src4->nb[0] == sizeof(float)src5->nb[0] == sizeof(float)src0->nb[2] == src0->ne[0]*src0->ne[1]*sizeof(float)src1->nb[3] == src1->ne[0]*src1->ne[1]*src1->ne[2]*sizeof(float)src0->nb[0] == ggml_type_size(src0->type)src1->nb[0] == ggml_type_size(src1->type)params->wsize >= sizeof(float) * (nth + nth * nc)ggml_is_contiguous(opt0)ggml_are_same_shape(src0, src0_grad)%-6s %-12s %8d %lld %lld %lld %lld %16zu %16zu %16zu %16zu %16p %32s
%-6s %-6s %-12s %8d %lld %lld %lld %lld %16zu %16zu %16zu %16zu %16p %32s
  "%p":%s -> "%p":%s [ arrowhead = %s; style = %s; label = "%s"; ]
emptyveedashedsolid  "%p":%s -> "%p":%s [ label = "%s"; ]
ggml_is_scalar(f)f->type == GGML_TYPE_F32np < GGML_MAX_PARAMS%s: invalid string length (%llu)
gguf_fread_str0 <= type && type < GGUF_TYPE_COUNTinfo->n_dims <= GGML_MAX_DIMS0 <= info->type && info->type < GGML_TYPE_COUNTinfo->ne[i] > 0INT64_MAX/info->ne[1] > info->ne[0]INT64_MAX/info->ne[2] > info->ne[0]*info->ne[1]INT64_MAX/info->ne[3] > info->ne[0]*info->ne[1]*info->ne[2]u8u16u32boolstrarru64offset == info->offset%s: not enough space in the buffer to allocate %s (needed %zu, available %zu)
ggml_tallocr_alloc/Users/runner/work/whisper-jni/whisper-jni/build/w/src/whisper-cpp/ggml/src/ggml-alloc.cnot enough space in the buffergalloc != NULLgalloc->bufts != NULLgalloc->buffers != NULLgalloc->buf_tallocs != NULLgalloc->hash_set.keys != NULLgalloc->hash_values != NULLgalloc->node_allocs != NULLgalloc->leaf_allocs != NULL%s: failed to allocate %s buffer of size %zu
ggml_gallocr_reserve_nbuffer_id >= 0 && buffer_id < galloc->n_buffersggml_get_no_alloc(ctx) == true%s: tensor %s is too large to fit in a %s buffer (tensor size: %zu, max buffer size: %zu)
ggml_backend_alloc_ctx_tensors_from_buft%s: not enough space in the buffer to allocate %zu bytes, largest block available %zu bytes
ggml_dyn_tallocr_allocalloc->n_free_blocks < MAX_FREE_BLOCKS && "out of free blocks"/Users/runner/work/whisper-jni/whisper-jni/build/w/src/whisper-cpp/ggml/src/ggml-backend.cppbase != NULL && "backend buffer base cannot be NULL"NULLtensor->data != NULL && "tensor not allocated"offset + size <= ggml_nbytes(tensor) && "tensor write out of bounds"offset + size <= ggml_nbytes(tensor) && "tensor read out of bounds"buf != NULL && "tensor buffer not set"buf->iface.memset_tensor != NULL && "memset not supported by backend buffer"backend->iface.graph_plan_create != NULLbackend->iface.graph_plan_free != NULLbackend->iface.graph_plan_compute != NULLggml_are_same_layout(src, dst) && "cannot copy tensors with different layouts"backend->iface.event_record != NULLevent->device->iface.event_synchronizebackend->iface.event_wait != NULLindex < ggml_backend_reg_count()index < ggml_backend_dev_count()ggml_backend_is_cpu(backend_cpu)(uintptr_t)ptr % TENSOR_ALIGNMENT == 0 && "buffer pointer must be aligned"ctx->buffers != NULLggml_backend_buffer_is_multi_buffer(buffer)n_backends > 0n_backends <= GGML_SCHED_MAX_BACKENDSggml_backend_is_cpu(backends[n_backends - 1])GGML_SCHED_DEBUGggml_backend_supports_buft(backends[b], sched->bufts[b])(int)sched->hash_set.size >= measure_graph->n_nodes + measure_graph->n_leafs(int)sched->hash_set.size >= graph->n_nodes + graph->n_leafsi >= 0 && i < sched->n_backendsbackend_index >= 0 && backend_index < sched->n_backendstensor->buffer == NULLtensor->view_src != NULLtensor->view_src->buffer != NULLtensor->view_src->data != NULLtensor->data == NULLtensor->view_src == NULLaddr >= ggml_backend_buffer_get_base(buffer)(char *)addr + ggml_backend_buffer_get_alloc_size(buffer, tensor) <= (char *)ggml_backend_buffer_get_base(buffer) + ggml_backend_buffer_get_size(buffer)failed to allocate context for graph copy
failed to allocate buffer for graph copy
vectorCPU%s: failed to allocate buffer of size %zu
ggml_backend_cpu_buffer_type_alloc_bufferindex == 0machdep.cpu.brand_stringggml_backend_sched_split_graphsched->splits != NULL%s#%s#%dn_graph_inputs < GGML_SCHED_MAX_SPLIT_INPUTSn_inputs < GGML_SCHED_MAX_SPLIT_INPUTSsched->graph.nodes != NULLsched->graph.leafs != NULLpre-allocated tensor in a backend that cannot run the operation
## SPLIT #%d: %s # %d inputs: [%s (%5.5s)] node #%3d (%10.10s): %20.20s (%5.5s) [%5.5s %8.8s]: %20.20s (%5.5s) [%5.5s %8.8s]%zuM%zuK%s: failed to allocate graph
ggml_backend_sched_alloc_splitssrc != NULLsrc->data && "graph must be allocated"/Users/runner/work/whisper-jni/whisper-jni/build/w/src/whisper-cpp/ggml/src/ggml-quants.ctype == GGML_TYPE_IQ2_XXS || type == GGML_TYPE_IQ2_XS || type == GGML_TYPE_IQ1_S || type == GGML_TYPE_IQ1_M || type == GGML_TYPE_IQ2_Sn_per_row%QK_K == 0grid_size == 256 || grid_size == 512n_per_row%QK4_NL == 0k%QK4_NL == 0%s: invalid type %d
ggml_validate_row_data%s: invalid size %zu for type %s (type size = %zu)
%s: found %d NaNs in row of %zu BF16 values
%s: found %d infinities in row of %zu BF16 values
quant_weights && "missing quantization weights"kgrid_q2xs && "forgot to call ggml_quantize_init()?"kmap_q2xs && "forgot to call ggml_quantize_init()?"kneighbors_q2xs && "forgot to call ggml_quantize_init()?"n%QK_K == 0Oops: found point %u not on grid: %dscale >= 0num_neighbors > 0grid_index >= 0kgrid_q3xs && "forgot to call ggml_quantize_init()?"kmap_q3xs && "forgot to call ggml_quantize_init()?"kneighbors_q3xs && "forgot to call ggml_quantize_init()?"besti1 >= 0 && besti2 >= 0 && best_shift != 0Have %d neighbours
    neighbour %d: sumqx = %g sumq2 = %g
besti1 >= 0 && besti2 >= 0 && best_k >= 0ggml_validate_row_data: found inf value at block %zu
ggml_validate_row_data: found nan value at block %zu
Oops, did not find grid point%s: error: failed to allocate buffer, size = %8.2f MiB
ggml_backend_metal_buffer_from_ptr
%s: error: failed to allocate context
ggml_backend_metal_init/Users/runner/work/whisper-jni/whisper-jni/build/w/src/whisper-cpp/ggml/src/ggml-metal.mggml_backend_is_metal(backend)Metalggml_backend_metal_buffer_type_alloc_buffer%s: error: vm_allocate failed
ggml_metal_host_malloc%s: allocated buffer, size = %8.2f MiB, (%8.2f / %8.2f)
ggml_backend_metal_log_allocated_size%s: warning: current allocated size is greater than the recommended max working set size
%s: allocating
ggml_metal_init%s: found device: %s
%s: picking default device: %s
ggml-metaldefaultmetallib%s: using embedded metal library
%s: error: %s
%s: GPU name:   %s
%s: GPU family: MTLGPUFamilyApple%d  (%d)
%s: GPU family: MTLGPUFamilyCommon%d (%d)
%s: GPU family: MTLGPUFamilyMetal%d  (%d)
%s: simdgroup reduction support   = %s
true%s: simdgroup matrix mul. support = %s
%s: hasUnifiedMemory              = %s
%s: recommendedMaxWorkingSetSize  = %8.2f MB
kernel_add%s: error: load pipeline error: %s
kernel_add_rowkernel_subkernel_sub_rowkernel_mulkernel_mul_rowkernel_divkernel_div_rowkernel_repeat_f32kernel_repeat_f16kernel_repeat_i32kernel_repeat_i16kernel_scalekernel_scale_4kernel_clampkernel_tanhkernel_relukernel_sigmoidkernel_gelukernel_gelu_4kernel_gelu_quickkernel_gelu_quick_4kernel_silukernel_silu_4kernel_soft_max_f16%s: skipping %-40s (not supported)
kernel_soft_max_f16_4kernel_soft_max_f32kernel_soft_max_f32_4kernel_diag_mask_infkernel_diag_mask_inf_8kernel_get_rows_f32kernel_get_rows_f16kernel_get_rows_q4_0kernel_get_rows_q4_1kernel_get_rows_q5_0kernel_get_rows_q5_1kernel_get_rows_q8_0kernel_get_rows_q2_Kkernel_get_rows_q3_Kkernel_get_rows_q4_Kkernel_get_rows_q5_Kkernel_get_rows_q6_Kkernel_get_rows_iq2_xxskernel_get_rows_iq2_xskernel_get_rows_iq3_xxskernel_get_rows_iq3_skernel_get_rows_iq2_skernel_get_rows_iq1_skernel_get_rows_iq1_mkernel_get_rows_iq4_nlkernel_get_rows_iq4_xskernel_get_rows_i32kernel_rms_normkernel_group_normkernel_normkernel_ssm_conv_f32kernel_ssm_scan_f32kernel_mul_mv_f32_f32kernel_mul_mv_f16_f16kernel_mul_mv_f16_f32kernel_mul_mv_f16_f32_1rowkernel_mul_mv_f16_f32_l4kernel_mul_mv_q4_0_f32kernel_mul_mv_q4_1_f32kernel_mul_mv_q5_0_f32kernel_mul_mv_q5_1_f32kernel_mul_mv_q8_0_f32kernel_mul_mv_q2_K_f32kernel_mul_mv_q3_K_f32kernel_mul_mv_q4_K_f32kernel_mul_mv_q5_K_f32kernel_mul_mv_q6_K_f32kernel_mul_mv_iq2_xxs_f32kernel_mul_mv_iq2_xs_f32kernel_mul_mv_iq3_xxs_f32kernel_mul_mv_iq3_s_f32kernel_mul_mv_iq2_s_f32kernel_mul_mv_iq1_s_f32kernel_mul_mv_iq1_m_f32kernel_mul_mv_iq4_nl_f32kernel_mul_mv_iq4_xs_f32kernel_mul_mv_id_f32_f32kernel_mul_mv_id_f16_f32kernel_mul_mv_id_q4_0_f32kernel_mul_mv_id_q4_1_f32kernel_mul_mv_id_q5_0_f32kernel_mul_mv_id_q5_1_f32kernel_mul_mv_id_q8_0_f32kernel_mul_mv_id_q2_K_f32kernel_mul_mv_id_q3_K_f32kernel_mul_mv_id_q4_K_f32kernel_mul_mv_id_q5_K_f32kernel_mul_mv_id_q6_K_f32kernel_mul_mv_id_iq2_xxs_f32kernel_mul_mv_id_iq2_xs_f32kernel_mul_mv_id_iq3_xxs_f32kernel_mul_mv_id_iq3_s_f32kernel_mul_mv_id_iq2_s_f32kernel_mul_mv_id_iq1_s_f32kernel_mul_mv_id_iq1_m_f32kernel_mul_mv_id_iq4_nl_f32kernel_mul_mv_id_iq4_xs_f32kernel_mul_mm_f32_f32kernel_mul_mm_f16_f32kernel_mul_mm_q4_0_f32kernel_mul_mm_q4_1_f32kernel_mul_mm_q5_0_f32kernel_mul_mm_q5_1_f32kernel_mul_mm_q8_0_f32kernel_mul_mm_q2_K_f32kernel_mul_mm_q3_K_f32kernel_mul_mm_q4_K_f32kernel_mul_mm_q5_K_f32kernel_mul_mm_q6_K_f32kernel_mul_mm_iq2_xxs_f32kernel_mul_mm_iq2_xs_f32kernel_mul_mm_iq3_xxs_f32kernel_mul_mm_iq3_s_f32kernel_mul_mm_iq2_s_f32kernel_mul_mm_iq1_s_f32kernel_mul_mm_iq1_m_f32kernel_mul_mm_iq4_nl_f32kernel_mul_mm_iq4_xs_f32kernel_mul_mm_id_f32_f32kernel_mul_mm_id_f16_f32kernel_mul_mm_id_q4_0_f32kernel_mul_mm_id_q4_1_f32kernel_mul_mm_id_q5_0_f32kernel_mul_mm_id_q5_1_f32kernel_mul_mm_id_q8_0_f32kernel_mul_mm_id_q2_K_f32kernel_mul_mm_id_q3_K_f32kernel_mul_mm_id_q4_K_f32kernel_mul_mm_id_q5_K_f32kernel_mul_mm_id_q6_K_f32kernel_mul_mm_id_iq2_xxs_f32kernel_mul_mm_id_iq2_xs_f32kernel_mul_mm_id_iq3_xxs_f32kernel_mul_mm_id_iq3_s_f32kernel_mul_mm_id_iq2_s_f32kernel_mul_mm_id_iq1_s_f32kernel_mul_mm_id_iq1_m_f32kernel_mul_mm_id_iq4_nl_f32kernel_mul_mm_id_iq4_xs_f32kernel_rope_norm_f32kernel_rope_norm_f16kernel_rope_neox_f32kernel_rope_neox_f16kernel_im2col_f16kernel_im2col_f32kernel_upscale_f32kernel_pad_f32kernel_timestep_embedding_f32kernel_arange_f32kernel_argsort_f32_i32_asckernel_argsort_f32_i32_desckernel_leaky_relu_f32kernel_flash_attn_ext_f16_h64kernel_flash_attn_ext_f16_h80kernel_flash_attn_ext_f16_h96kernel_flash_attn_ext_f16_h112kernel_flash_attn_ext_f16_h128kernel_flash_attn_ext_vec_f16_h128kernel_cpy_f32_f16kernel_cpy_f32_f32kernel_cpy_f16_f16kernel_cpy_f16_f32kernel_cpy_f32_q8_0kernel_cpy_f32_q4_0kernel_cpy_f32_q4_1kernel_cpy_f32_q5_0kernel_cpy_f32_q5_1kernel_cpy_f32_iq4_nlkernel_concatkernel_sqrkernel_sqrtkernel_sinkernel_coskernel_sum_rows%s: deallocating
ggml_metal_free/tmp/perf-metal.gputrace%s: error: unable to start capture '%s'
ggml_metal_graph_computev16@?0Q8%s: command buffer %d failed with status %lu
error: %s
%s: command buffer %d aborted%s: error: unsupported op '%s'
ggml_metal_encode_nodeunsupported opsrc0t == GGML_TYPE_F32src1t == GGML_TYPE_F32ne11 == 1dstt == GGML_TYPE_F32%s: node %3d, op = %8s not implemented
!src1 || src1->type == GGML_TYPE_F16 || src1->type == GGML_TYPE_F32src3src4src5ne00 == ne10ne12 % ne02 == 0ne13 % ne03 == 0nb01 % 16 == 0nb01 % 8 == 0MUL MAT-MAT not implementedAsserting on type %d
not implementedsrc2t == GGML_TYPE_I32!ggml_is_transposed(src0)!ggml_is_transposed(src1)dst_rows <= dst_rows_maxMUL_MAT_ID not implementedne00 >= nth0*nth1ne00 % 4 == 0ggml_is_contiguous_1(src0)ne10 == ne02dst->type == GGML_TYPE_F16 || dst->type == GGML_TYPE_F32src0->type == GGML_TYPE_F32dst->type == GGML_TYPE_I32ne11 % 32 == 0ggml_are_same_shape (src1, src2)!src3 || src3->type == GGML_TYPE_F16!src3 || src3->ne[1] >= GGML_PAD(src0->ne[1], 8) && "the Flash-Attention Metal kernel requires the mask to be padded to 8 and at least n_queries big"unsupported size: %lld
add template specialization for this size
add template specialization for this sizesmem <= ctx->device.maxThreadgroupMemoryLengthne00 % ggml_blck_size(src0->type) == 0ne0 % ggml_blck_size(dst->type) == 0%s: error: node %3d, op = %8s not implemented
%s: error: tensor '%s' buffer is nil
ggml_metal_get_buffer/Users/runner/work/whisper-jni/whisper-jni/build/w/src/whisper-cpp/ggml/src/ggml-blas.cppggml_backend_is_blas(backend_blas)BLAS%s: unsupported op %s
ggml_backend_blas_graph_computethread constructor failed??
dd?pl??
dd?pl??	d?tt??????<??	d?pX??????<?????8??????(??????(?????????8(4??<$,?????8??
,X??0??????(?????8??md????????????	??	??	??
??
??????????????<$,??
$??)!8hLdT t??(?????0xHDGGMLMetalClassbundleForClass:beginScopemaxBufferLengthcommitpushDebugGroup:countByEnumeratingWithState:objects:count:supportsFamily:UTF8StringenqueuecommandBufferWithUnretainedReferencesnewCommandQueuecomputeCommandEncodersetDestination:currentAllocatedSizedescriptiondictionarydispatchThreadgroups:threadsPerThreadgroup:endEncodingendScopeerrorfileURLWithPath:hasUnifiedMemoryinitWithBytes:length:encoding:localizedDescriptionmaxThreadgroupMemoryLengthmaxTotalThreadsPerThreadgroupnamenewBufferWithBytesNoCopy:length:options:deallocator:newCaptureScopeWithDevice:newComputePipelineStateWithFunction:error:newFunctionWithName:newLibraryWithSource:options:error:pathForResource:ofType:popDebugGrouprecommendedMaxWorkingSetSizesetBuffer:offset:atIndex:setBytes:length:atIndex:setCaptureObject:setComputePipelineState:setOutputURL:setPreprocessorMacros:setThreadgroupMemoryLength:atIndex:sharedCaptureManagerstartCaptureWithDescriptor:error:statusstopCapturestringWithCString:encoding:stringWithFormat:waitUntilCompletedx|T_#7@O`?
b@?)	@?]Tq
?_hq
?a|q
?b?q
?c?q
?d?q
 h?q
?i?q
?k?q
0m?q
?r
?? r
|?0r
??@r
?Pr
??dr
?tr
???r
??s
??0s
??tx?X????XP???Tp"?"l'
?'l,?,.d.;L;<x<4=<=?>?>???? A0A?C?CEETFdF?G?G?OlQ?S?S?U?U?V?VXXYY(Z0Z<[D[]](^0^<_D_P`X`?c?c%
E%
Q%
X%
d%
k%
u%
z%
?%
?%
?%
?%
?%
?%
?%
?%
?%
?%
?%
?%
?%
?%
?%
&
&
&
#&
,&
:&
?&
I&
O&
a&
h&
t&
?&
?&
?&
?&
?&
?&
?&
?&
?&
?&
?&
?&
'

'
'
!'
-'
9'
B'
H'
R'
]'
m'
}'
?'
?'
?'
?'
?'
?'
?'

?'
?'
?'
(
(
(
(
(
!(
((
/(
6(
:(
@(
F(
P(
_(
i(
x(
?(
?(
?(
?(
?(
?(
?(
?(
?(
?(
?(
?(
?(
?(
)
)
)
%)
6)
>)
O)
a)
m)
~)
?)
?)
?)
?)
?)
?)
?)
?)
?)
*
*
*
1*
`*
k*
y*
?*
?*
?*
?*
?*
?*
?*
?*
+
+
+
 +
.+
>+
P+
Z+
f+
t+
?+
?+
?+
?+
?+
?+
?+
?+
?+
?+
?+
?+
?+
?+
?+
,
gD
?$
jD
?$
nD
?$
/$
rD
wD
{D
D
?$
?$

4
Z
o
8?D?|?@?Բ??L?`?x???????,?Xo?d?L?X?`?x???????,??????????????t???Էx$x?x?x?x?xTy`yly?yz?}?}1k
Ks
x???????(?
0?|?????z
?KY
?SY
??Z

??Z
?[

?[
?%[

?0[
??[

?J[
?Y[
?k[
?}[
??[
??[
??[
??[
??[
??[
??[
??[
??[

?\
?\
?1\
?=\

?K\
??\
??\
??\
??\
??\
??\
?]
?]
?,]
?A]
?V]
?k]
??]
??]
??]
??]
??]
??]
?^
?^
?0^
?F^
?\^
?r^
??^
??^
??^
??^
??^
??^
??^
?_
? _
?6_
?L_
?b_
?}_
??_
??_
??_
??_
??_
?	`
? `
?7`
?N`
?e`
?|`
??`
??`
??`
??`
??`
?a
?)a
?Ba
?[a
?ta
??a
??a
??a
??a
??a
?b
?)b
?Cb
?]b
?wb
??b
??b
??b
??b
?c
?c
?8c
?Sc
?oc
??c
??c
??c
??c
??c
??c
?d
?*d
?Ad
?Xd
?od
??d
??d
??d
??d
??d
?e
?e
?2e
?Je
?ce
?|e
??e
??e
??e
??e
??e
?f
?0f
?Jf
?df
?~f
??f
??f
??f
??f
?g
?#g
?>g
?Yg
?tg
??g
??g
??g
??g
??g
?h
?h
?$h
?7h
?Fh
?dh
?vh
??h
??h
??h
??h
??h
?i
?

typedef uint16_t ggml_half;
typedef uint32_t ggml_half2;

#define GGML_COMMON_AGGR

#define GGML_COMMON_DECL
#elif defined(GGML_COMMON_DECL_METAL)
#include 

typedef half  ggml_half;
typedef half2 ggml_half2;

#define GGML_COMMON_AGGR

#define GGML_COMMON_DECL
#elif defined(GGML_COMMON_DECL_CUDA)
#if defined(GGML_COMMON_DECL_MUSA)
#include 
#else
#include 
#endif
#include 

typedef half  ggml_half;
typedef half2 ggml_half2;

#define GGML_COMMON_AGGR data

#define GGML_COMMON_DECL
#elif defined(GGML_COMMON_DECL_HIP)
#include 
#include 

typedef half  ggml_half;
typedef half2 ggml_half2;

#define GGML_COMMON_AGGR data

#define GGML_COMMON_DECL
#elif defined(GGML_COMMON_DECL_SYCL)
#include 
#include 

typedef sycl::half  ggml_half;
typedef sycl::half2 ggml_half2;

#define GGML_COMMON_AGGR data

#define GGML_COMMON_DECL
#endif

#if defined(GGML_COMMON_DECL)

#ifndef __cplusplus
#ifndef static_assert
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201100L)
#define static_assert(cond, msg) _Static_assert(cond, msg)
#else
#define static_assert(cond, msg) struct global_scope_noop_trick
#endif
#endif
#endif // __cplusplus

// QK = number of values after dequantization
// QK_K = super-block size

#define QK_K 256
#define K_SCALE_SIZE 12

#if defined(GGML_COMMON_DECL_CUDA) || defined(GGML_COMMON_DECL_HIP) || defined(GGML_COMMON_DECL_SYCL)
// QR = QK / number of values before dequantization
// QI = number of 32 bit integers before dequantization

#define QI4_0 (QK4_0 / (4 * QR4_0))
#define QR4_0 2

#define QI4_1 (QK4_1 / (4 * QR4_1))
#define QR4_1 2

#define QI5_0 (QK5_0 / (4 * QR5_0))
#define QR5_0 2

#define QI5_1 (QK5_1 / (4 * QR5_1))
#define QR5_1 2

#define QI8_0 (QK8_0 / (4 * QR8_0))
#define QR8_0 1

#define QI8_1 (QK8_1 / (4 * QR8_1))
#define QR8_1 1

#define QI2_K (QK_K / (4*QR2_K))
#define QR2_K 4

#define QI3_K (QK_K / (4*QR3_K))
#define QR3_K 4

#define QI4_K (QK_K / (4*QR4_K))
#define QR4_K 2

#define QI5_K (QK_K / (4*QR5_K))
#define QR5_K 2

#define QI6_K (QK_K / (4*QR6_K))
#define QR6_K 2

#define QI2_XXS (QK_K / (4*QR2_XXS))
#define QR2_XXS 4

#define QI2_XS (QK_K / (4*QR2_XS))
#define QR2_XS 4

#define QI2_S (QK_K / (4*QR2_S))
#define QR2_S 4

#define QI3_XXS (QK_K / (4*QR3_XXS))
#define QR3_XXS 4

#define QI3_XS (QK_K / (4*QR3_XS))
#define QR3_XS 4

#define QI1_S (QK_K / (4*QR1_S))
#define QR1_S 8

#define QI1_M (QK_K / (4*QR1_M))
#define QR1_M 8

#define QI4_NL (QK4_NL / (4*QR4_NL))
#define QR4_NL 2

#define QI4_XS (QK_K / (4*QR4_XS))
#define QR4_XS 2

#define QI3_S (QK_K / (4*QR3_S))
#define QR3_S 4

#endif // GGML_COMMON_DECL_CUDA || GGML_COMMON_DECL_HIP

#define QK4_0 32
typedef struct {
    ggml_half d;           // delta
    uint8_t qs[QK4_0 / 2]; // nibbles / quants
} block_q4_0;
static_assert(sizeof(block_q4_0) == sizeof(ggml_half) + QK4_0 / 2, "wrong q4_0 block size/padding");

#define QK4_1 32
typedef struct {
    union {
        struct {
            ggml_half d; // delta
            ggml_half m; // min
        } GGML_COMMON_AGGR;
        ggml_half2 dm;
    };
    uint8_t qs[QK4_1 / 2]; // nibbles / quants
} block_q4_1;
static_assert(sizeof(block_q4_1) == 2 * sizeof(ggml_half) + QK4_1 / 2, "wrong q4_1 block size/padding");

#define QK5_0 32
typedef struct {
    ggml_half d;           // delta
    uint8_t qh[4];         // 5-th bit of quants
    uint8_t qs[QK5_0 / 2]; // nibbles / quants
} block_q5_0;
static_assert(sizeof(block_q5_0) == sizeof(ggml_half) + sizeof(uint32_t) + QK5_0 / 2, "wrong q5_0 block size/padding");

#define QK5_1 32
typedef struct {
    union {
        struct {
            ggml_half d; // delta
            ggml_half m; // min
        } GGML_COMMON_AGGR;
        ggml_half2 dm;
    };
    uint8_t qh[4];         // 5-th bit of quants
    uint8_t qs[QK5_1 / 2]; // nibbles / quants
} block_q5_1;
static_assert(sizeof(block_q5_1) == 2 * sizeof(ggml_half) + sizeof(uint32_t) + QK5_1 / 2, "wrong q5_1 block size/padding");

#define QK8_0 32
typedef struct {
    ggml_half d;       // delta
    int8_t  qs[QK8_0]; // quants
} block_q8_0;
static_assert(sizeof(block_q8_0) == sizeof(ggml_half) + QK8_0, "wrong q8_0 block size/padding");

#define QK8_1 32
typedef struct {
    union {
        struct {
            ggml_half d; // delta
            ggml_half s; // d * sum(qs[i])
        } GGML_COMMON_AGGR;
        ggml_half2 ds;
    };
    int8_t qs[QK8_1]; // quants
} block_q8_1;
static_assert(sizeof(block_q8_1) == 2*sizeof(ggml_half) + QK8_1, "wrong q8_1 block size/padding");

typedef struct {
    ggml_half d[4];        // deltas for 4 q4_0 blocks
    uint8_t qs[QK4_0 * 2]; // nibbles / quants for 4 q4_0 blocks
} block_q4_0x4;
static_assert(sizeof(block_q4_0x4) == 4 * sizeof(ggml_half) + QK4_0 * 2, "wrong q4_0x4 block size/padding");

typedef struct {
    ggml_half d[8];        // deltas for 8 q4_0 blocks
    uint8_t qs[QK4_0 * 4]; // nibbles / quants for 8 q4_0 blocks
} block_q4_0x8;
static_assert(sizeof(block_q4_0x8) == 8 * sizeof(ggml_half) + QK4_0 * 4, "wrong q4_0x8 block size/padding");

typedef struct {
    ggml_half d[4];        // deltas for 4 q8_0 blocks
    int8_t qs[QK8_0 * 4];  // quants for 4 q8_0 blocks
} block_q8_0x4;
static_assert(sizeof(block_q8_0x4) == 4 * sizeof(ggml_half) + QK8_0 * 4, "wrong q8_0x4 block size/padding");

typedef struct {
    ggml_half d[8];        // deltas for 8 q8_0 blocks
    int8_t qs[QK8_0 * 8];  // quants for 8 q8_0 blocks
} block_q8_0x8;
static_assert(sizeof(block_q8_0x8) == 8 * sizeof(ggml_half) + QK8_0 * 8, "wrong q8_0x8 block size/padding");

//
// Ternary quantization
//

// 1.6875 bpw
typedef struct {
    uint8_t qs[(QK_K - 4 * QK_K / 64) / 5]; // 5 elements per byte (3^5 = 243 < 256)
    uint8_t qh[QK_K/64]; // 4 elements per byte
    ggml_half d;
} block_tq1_0;
static_assert(sizeof(block_tq1_0) == sizeof(ggml_half) + QK_K / 64 + (QK_K - 4 * QK_K / 64) / 5, "wrong tq1_0 block size/padding");

// 2.0625 bpw
typedef struct {
    uint8_t qs[QK_K/4]; // 2 bits per element
    ggml_half d;
} block_tq2_0;
static_assert(sizeof(block_tq2_0) == sizeof(ggml_half) + QK_K / 4, "wrong tq2_0 block size/padding");

//
// Super-block quantization structures
//

// 2-bit quantization
// weight is represented as x = a * q + b
// 16 blocks of 16 elements each
// Effectively 2.625 bits per weight
typedef struct {
    uint8_t scales[QK_K/16]; // scales and mins, quantized with 4 bits
    uint8_t qs[QK_K/4];      // quants
    union {
        struct {
            ggml_half d;    // super-block scale for quantized scales
            ggml_half dmin; // super-block scale for quantized mins
        } GGML_COMMON_AGGR;
        ggml_half2 dm;
    };
} block_q2_K;
static_assert(sizeof(block_q2_K) == 2*sizeof(ggml_half) + QK_K/16 + QK_K/4, "wrong q2_K block size/padding");

// 3-bit quantization
// weight is represented as x = a * q
// 16 blocks of 16 elements each
// Effectively 3.4375 bits per weight
typedef struct {
    uint8_t hmask[QK_K/8]; // quants - high bit
    uint8_t qs[QK_K/4];    // quants - low 2 bits
    uint8_t scales[12];    // scales, quantized with 6 bits
    ggml_half d;           // super-block scale
} block_q3_K;
static_assert(sizeof(block_q3_K) == sizeof(ggml_half) + QK_K / 4 + QK_K / 8 + 12, "wrong q3_K block size/padding");

// 4-bit quantization
// 8 blocks of 32 elements each
// weight is represented as x = a * q + b
// Effectively 4.5 bits per weight
typedef struct {
    union {
        struct {
            ggml_half d;    // super-block scale for quantized scales
            ggml_half dmin; // super-block scale for quantized mins
        } GGML_COMMON_AGGR;
        ggml_half2 dm;
    };
    uint8_t scales[K_SCALE_SIZE]; // scales and mins, quantized with 6 bits
    uint8_t qs[QK_K/2];           // 4--bit quants
} block_q4_K;
static_assert(sizeof(block_q4_K) == 2*sizeof(ggml_half) + K_SCALE_SIZE + QK_K/2, "wrong q4_K block size/padding");

// 5-bit quantization
// 8 blocks of 32 elements each
// weight is represented as x = a * q + b
// Effectively 5.5 bits per weight
typedef struct {
    union {
        struct {
            ggml_half d;    // super-block scale for quantized scales
            ggml_half dmin; // super-block scale for quantized mins
        } GGML_COMMON_AGGR;
        ggml_half2 dm;
    };
    uint8_t scales[K_SCALE_SIZE]; // scales and mins, quantized with 6 bits
    uint8_t qh[QK_K/8];           // quants, high bit
    uint8_t qs[QK_K/2];           // quants, low 4 bits
} block_q5_K;
static_assert(sizeof(block_q5_K) == 2*sizeof(ggml_half) + K_SCALE_SIZE + QK_K/2 + QK_K/8, "wrong q5_K block size/padding");

// 6-bit quantization
// weight is represented as x = a * q
// 16 blocks of 16 elements each
// Effectively 6.5625 bits per weight
typedef struct {
    uint8_t ql[QK_K/2];      // quants, lower 4 bits
    uint8_t qh[QK_K/4];      // quants, upper 2 bits
    int8_t  scales[QK_K/16]; // scales, quantized with 8 bits
    ggml_half d;             // super-block scale
} block_q6_K;
static_assert(sizeof(block_q6_K) == sizeof(ggml_half) + QK_K / 16 + 3*QK_K/4, "wrong q6_K block size/padding");

// This is only used for intermediate quantization and dot products
typedef struct {
    float   d;              // delta
    int8_t  qs[QK_K];       // quants
    int16_t bsums[QK_K/16]; // sum of quants in groups of 16
} block_q8_K;
static_assert(sizeof(block_q8_K) == sizeof(float) + QK_K + QK_K/16*sizeof(int16_t), "wrong q8_K block size/padding");

// (Almost) "true" 2-bit quantization.
// Due to the need to use blocks as per ggml design, it ends up using
// 2.0625 bpw because of the 16-bit scale for each block of 256.
typedef struct {
    ggml_half d;
    uint16_t qs[QK_K/8];
} block_iq2_xxs;
static_assert(sizeof(block_iq2_xxs) == sizeof(ggml_half) + QK_K/8*sizeof(uint16_t), "wrong iq2_xxs block size/padding");

// 2.3125 bpw quants
typedef struct {
    ggml_half d;
    uint16_t qs[QK_K/8];
    uint8_t  scales[QK_K/32];
} block_iq2_xs;
static_assert(sizeof(block_iq2_xs) == sizeof(ggml_half) + QK_K/8*sizeof(uint16_t) + QK_K/32, "wrong iq2_xs block size/padding");

// 2.5625 bpw quants
typedef struct {
    ggml_half d;
    uint8_t qs[QK_K/4];
    uint8_t qh[QK_K/32];
    uint8_t scales[QK_K/32];
} block_iq2_s;
static_assert(sizeof(block_iq2_s) == sizeof(ggml_half) + QK_K/4 + QK_K/16, "wrong iq2_s block size/padding");

// (Almost) "true" 3-bit quantization.
// Due to the need to use blocks as per ggml design, it ends up using
// 3.0625 bpw because of the 16-bit scale for each block of 256.
typedef struct {
    ggml_half d;
    uint8_t qs[3*QK_K/8];
} block_iq3_xxs;
static_assert(sizeof(block_iq3_xxs) == sizeof(ggml_half) + 3*(QK_K/8), "wrong iq3_xxs block size/padding");

// 3.4375 bpw
#define IQ3S_N_SCALE QK_K/64
typedef struct {
    ggml_half d;
    uint8_t qs[QK_K/4];
    uint8_t qh[QK_K/32];
    uint8_t signs[QK_K/8];
    uint8_t scales[IQ3S_N_SCALE];
} block_iq3_s;
static_assert(sizeof(block_iq3_s) == sizeof(ggml_half) + 13*(QK_K/32) + IQ3S_N_SCALE, "wrong iq3_s block size/padding");

// 1.5625 bpw
typedef struct {
    ggml_half d;
    uint8_t  qs[QK_K/8];
    uint16_t qh[QK_K/32];
} block_iq1_s;
static_assert(sizeof(block_iq1_s) == sizeof(ggml_half) + QK_K/8 + QK_K/16, "wrong iq1_s block size/padding");

// 1.75 bpw
typedef struct {
    uint8_t  qs[QK_K/8];      // grid index, low 8 bits
    uint8_t  qh[QK_K/16];     // grid index, high 3 bits + grid shift bit (for two groups of 8)
    uint8_t  scales[QK_K/32]; // 3-bit block scales (4-bit if QK_K == 64)
} block_iq1_m;
static_assert(sizeof(block_iq1_m) == QK_K/8 + QK_K/16 + QK_K/32, "wrong iq1_m block size/padding");

// Used by IQ1_M quants
typedef union {
    ggml_half f16;
    uint16_t  u16;
} iq1m_scale_t;

// Non-linear quants
#define QK4_NL 32
typedef struct {
    ggml_half d;
    uint8_t qs[QK4_NL/2];
} block_iq4_nl;
static_assert(sizeof(block_iq4_nl) == sizeof(ggml_half) + QK4_NL/2, "wrong iq4_nl block size/padding");

typedef struct {
    ggml_half d;
    uint16_t scales_h;
    uint8_t  scales_l[QK_K/64];
    uint8_t  qs[QK_K/2];
} block_iq4_xs;
static_assert(sizeof(block_iq4_xs) == sizeof(ggml_half) + sizeof(uint16_t) + QK_K/64 + QK_K/2, "wrong iq4_xs block size/padding");

#endif // GGML_COMMON_DECL
#endif // GGML_COMMON_DECL

////////////////////////////////////////////////////////////////////////////////

#ifndef GGML_COMMON_IMPL

#if defined(GGML_COMMON_IMPL_C)
#include 

#define GGML_TABLE_BEGIN(type, name, size) static const type name[size] = {
#define GGML_TABLE_END() };

#define GGML_COMMON_IMPL
#elif defined(GGML_COMMON_IMPL_METAL)
#include 

#define GGML_TABLE_BEGIN(type, name, size) static const constant type name[size] = {
#define GGML_TABLE_END() };

#define GGML_COMMON_IMPL
#elif defined(GGML_COMMON_IMPL_CUDA) || defined(GGML_COMMON_IMPL_HIP) || defined(GGML_COMMON_IMPL_MUSA)
#include 

#define GGML_TABLE_BEGIN(type, name, size) static const __device__ type name[size] = {
#define GGML_TABLE_END() };

#define GGML_COMMON_IMPL
#elif defined(GGML_COMMON_IMPL_SYCL)

#include 

#define GGML_TABLE_BEGIN(type, name, size) static const type name[size] = {
#define GGML_TABLE_END() };

#define GGML_COMMON_IMPL
#endif

#if defined(GGML_COMMON_IMPL)

GGML_TABLE_BEGIN(uint8_t, kmask_iq2xs, 8)
    1, 2, 4, 8, 16, 32, 64, 128
GGML_TABLE_END()

GGML_TABLE_BEGIN(uint8_t, ksigns_iq2xs, 128)
      0, 129, 130,   3, 132,   5,   6, 135, 136,   9,  10, 139,  12, 141, 142,  15,
    144,  17,  18, 147,  20, 149, 150,  23,  24, 153, 154,  27, 156,  29,  30, 159,
    160,  33,  34, 163,  36, 165, 166,  39,  40, 169, 170,  43, 172,  45,  46, 175,
     48, 177, 178,  51, 180,  53,  54, 183, 184,  57,  58, 187,  60, 189, 190,  63,
    192,  65,  66, 195,  68, 197, 198,  71,  72, 201, 202,  75, 204,  77,  78, 207,
     80, 209, 210,  83, 212,  85,  86, 215, 216,  89,  90, 219,  92, 221, 222,  95,
     96, 225, 226,  99, 228, 101, 102, 231, 232, 105, 106, 235, 108, 237, 238, 111,
    240, 113, 114, 243, 116, 245, 246, 119, 120, 249, 250, 123, 252, 125, 126, 255,
GGML_TABLE_END()

//#if __CUDA_ARCH__ >= MIN_CC_DP4A // lowest compute capability for integer intrinsics
GGML_TABLE_BEGIN(uint64_t, ksigns64, 128)
    0x0000000000000000, 0xff000000000000ff, 0xff0000000000ff00, 0x000000000000ffff,
    0xff00000000ff0000, 0x0000000000ff00ff, 0x0000000000ffff00, 0xff00000000ffffff,
    0xff000000ff000000, 0x00000000ff0000ff, 0x00000000ff00ff00, 0xff000000ff00ffff,
    0x00000000ffff0000, 0xff000000ffff00ff, 0xff000000ffffff00, 0x00000000ffffffff,
    0xff0000ff00000000, 0x000000ff000000ff, 0x000000ff0000ff00, 0xff0000ff0000ffff,
    0x000000ff00ff0000, 0xff0000ff00ff00ff, 0xff0000ff00ffff00, 0x000000ff00ffffff,
    0x000000ffff000000, 0xff0000ffff0000ff, 0xff0000ffff00ff00, 0x000000ffff00ffff,
    0xff0000ffffff0000, 0x000000ffffff00ff, 0x000000ffffffff00, 0xff0000ffffffffff,
    0xff00ff0000000000, 0x0000ff00000000ff, 0x0000ff000000ff00, 0xff00ff000000ffff,
    0x0000ff0000ff0000, 0xff00ff0000ff00ff, 0xff00ff0000ffff00, 0x0000ff0000ffffff,
    0x0000ff00ff000000, 0xff00ff00ff0000ff, 0xff00ff00ff00ff00, 0x0000ff00ff00ffff,
    0xff00ff00ffff0000, 0x0000ff00ffff00ff, 0x0000ff00ffffff00, 0xff00ff00ffffffff,
    0x0000ffff00000000, 0xff00ffff000000ff, 0xff00ffff0000ff00, 0x0000ffff0000ffff,
    0xff00ffff00ff0000, 0x0000ffff00ff00ff, 0x0000ffff00ffff00, 0xff00ffff00ffffff,
    0xff00ffffff000000, 0x0000ffffff0000ff, 0x0000ffffff00ff00, 0xff00ffffff00ffff,
    0x0000ffffffff0000, 0xff00ffffffff00ff, 0xff00ffffffffff00, 0x0000ffffffffffff,
    0xffff000000000000, 0x00ff0000000000ff, 0x00ff00000000ff00, 0xffff00000000ffff,
    0x00ff000000ff0000, 0xffff000000ff00ff, 0xffff000000ffff00, 0x00ff000000ffffff,
    0x00ff0000ff000000, 0xffff0000ff0000ff, 0xffff0000ff00ff00, 0x00ff0000ff00ffff,
    0xffff0000ffff0000, 0x00ff0000ffff00ff, 0x00ff0000ffffff00, 0xffff0000ffffffff,
    0x00ff00ff00000000, 0xffff00ff000000ff, 0xffff00ff0000ff00, 0x00ff00ff0000ffff,
    0xffff00ff00ff0000, 0x00ff00ff00ff00ff, 0x00ff00ff00ffff00, 0xffff00ff00ffffff,
    0xffff00ffff000000, 0x00ff00ffff0000ff, 0x00ff00ffff00ff00, 0xffff00ffff00ffff,
    0x00ff00ffffff0000, 0xffff00ffffff00ff, 0xffff00ffffffff00, 0x00ff00ffffffffff,
    0x00ffff0000000000, 0xffffff00000000ff, 0xffffff000000ff00, 0x00ffff000000ffff,
    0xffffff0000ff0000, 0x00ffff0000ff00ff, 0x00ffff0000ffff00, 0xffffff0000ffffff,
    0xffffff00ff000000, 0x00ffff00ff0000ff, 0x00ffff00ff00ff00, 0xffffff00ff00ffff,
    0x00ffff00ffff0000, 0xffffff00ffff00ff, 0xffffff00ffffff00, 0x00ffff00ffffffff,
    0xffffffff00000000, 0x00ffffff000000ff, 0x00ffffff0000ff00, 0xffffffff0000ffff,
    0x00ffffff00ff0000, 0xffffffff00ff00ff, 0xffffffff00ffff00, 0x00ffffff00ffffff,
    0x00ffffffff000000, 0xffffffffff0000ff, 0xffffffffff00ff00, 0x00ffffffff00ffff,
    0xffffffffffff0000, 0x00ffffffffff00ff, 0x00ffffffffffff00, 0xffffffffffffffff,
GGML_TABLE_END()
//#endif


GGML_TABLE_BEGIN(uint64_t, iq2xxs_grid, 256)
    0x0808080808080808, 0x080808080808082b, 0x0808080808081919, 0x0808080808082b08,
    0x0808080808082b2b, 0x0808080808190819, 0x0808080808191908, 0x08080808082b0808,
    0x08080808082b082b, 0x08080808082b2b08, 0x08080808082b2b2b, 0x0808080819080819,
    0x0808080819081908, 0x0808080819190808, 0x0808080819192b08, 0x08080808192b0819,
    0x08080808192b1908, 0x080808082b080808, 0x080808082b08082b, 0x080808082b082b2b,
    0x080808082b2b082b, 0x0808081908080819, 0x0808081908081908, 0x0808081908190808,
    0x0808081908191919, 0x0808081919080808, 0x080808192b081908, 0x080808192b192b08,
    0x0808082b08080808, 0x0808082b0808082b, 0x0808082b082b082b, 0x0808082b2b08082b,
    0x0808190808080819, 0x0808190808081908, 0x0808190808190808, 0x08081908082b0819,
    0x08081908082b1908, 0x0808190819080808, 0x080819081908082b, 0x0808190819082b08,
    0x08081908192b0808, 0x080819082b080819, 0x080819082b081908, 0x080819082b190808,
    0x080819082b2b1908, 0x0808191908080808, 0x080819190808082b, 0x0808191908082b08,
    0x08081919082b0808, 0x080819191908192b, 0x08081919192b2b19, 0x080819192b080808,
    0x080819192b190819, 0x0808192b08082b19, 0x0808192b08190808, 0x0808192b19080808,
    0x0808192b2b081908, 0x0808192b2b2b1908, 0x08082b0808080808, 0x08082b0808081919,
    0x08082b0808082b08, 0x08082b0808191908, 0x08082b08082b2b08, 0x08082b0819080819,
    0x08082b0819081908, 0x08082b0819190808, 0x08082b081919082b, 0x08082b082b082b08,
    0x08082b1908081908, 0x08082b1919080808, 0x08082b2b0808082b, 0x08082b2b08191908,
    0x0819080808080819, 0x0819080808081908, 0x0819080808190808, 0x08190808082b0819,
    0x0819080819080808, 0x08190808192b0808, 0x081908082b081908, 0x081908082b190808,
    0x081908082b191919, 0x0819081908080808, 0x0819081908082b08, 0x08190819082b0808,
    0x0819081919190808, 0x0819081919192b2b, 0x081908192b080808, 0x0819082b082b1908,
    0x0819082b19081919, 0x0819190808080808, 0x0819190808082b08, 0x08191908082b0808,
    0x08191908082b1919, 0x0819190819082b19, 0x081919082b080808, 0x0819191908192b08,
    0x08191919192b082b, 0x0819192b08080808, 0x0819192b0819192b, 0x08192b0808080819,
    0x08192b0808081908, 0x08192b0808190808, 0x08192b0819080808, 0x08192b082b080819,
    0x08192b1908080808, 0x08192b1908081919, 0x08192b192b2b0808, 0x08192b2b19190819,
    0x082b080808080808, 0x082b08080808082b, 0x082b080808082b2b, 0x082b080819081908,
    0x082b0808192b0819, 0x082b08082b080808, 0x082b08082b08082b, 0x082b0819082b2b19,
    0x082b081919082b08, 0x082b082b08080808, 0x082b082b0808082b, 0x082b190808080819,
    0x082b190808081908, 0x082b190808190808, 0x082b190819080808, 0x082b19081919192b,
    0x082b191908080808, 0x082b191919080819, 0x082b1919192b1908, 0x082b192b2b190808,
    0x082b2b0808082b08, 0x082b2b08082b0808, 0x082b2b082b191908, 0x082b2b2b19081908,
    0x1908080808080819, 0x1908080808081908, 0x1908080808190808, 0x1908080808192b08,
    0x19080808082b0819, 0x19080808082b1908, 0x1908080819080808, 0x1908080819082b08,
    0x190808081919192b, 0x19080808192b0808, 0x190808082b080819, 0x190808082b081908,
    0x190808082b190808, 0x1908081908080808, 0x19080819082b0808, 0x19080819192b0819,
    0x190808192b080808, 0x190808192b081919, 0x1908082b08080819, 0x1908082b08190808,
    0x1908082b19082b08, 0x1908082b1919192b, 0x1908082b192b2b08, 0x1908190808080808,
    0x1908190808082b08, 0x19081908082b0808, 0x190819082b080808, 0x190819082b192b19,
    0x190819190819082b, 0x19081919082b1908, 0x1908192b08080808, 0x19082b0808080819,
    0x19082b0808081908, 0x19082b0808190808, 0x19082b0819080808, 0x19082b0819081919,
    0x19082b1908080808, 0x19082b1919192b08, 0x19082b19192b0819, 0x19082b192b08082b,
    0x19082b2b19081919, 0x19082b2b2b190808, 0x1919080808080808, 0x1919080808082b08,
    0x1919080808190819, 0x1919080808192b19, 0x19190808082b0808, 0x191908082b080808,
    0x191908082b082b08, 0x1919081908081908, 0x191908191908082b, 0x191908192b2b1908,
    0x1919082b2b190819, 0x191919082b190808, 0x191919082b19082b, 0x1919191908082b2b,
    0x1919192b08080819, 0x1919192b19191908, 0x19192b0808080808, 0x19192b0808190819,
    0x19192b0808192b19, 0x19192b08192b1908, 0x19192b1919080808, 0x19192b2b08082b08,
    0x192b080808081908, 0x192b080808190808, 0x192b080819080808, 0x192b0808192b2b08,
    0x192b081908080808, 0x192b081919191919, 0x192b082b08192b08, 0x192b082b192b0808,
    0x192b190808080808, 0x192b190808081919, 0x192b191908190808, 0x192b19190819082b,
    0x192b19192b081908, 0x192b2b081908082b, 0x2b08080808080808, 0x2b0808080808082b,
    0x2b08080808082b2b, 0x2b08080819080819, 0x2b0808082b08082b, 0x2b08081908081908,
    0x2b08081908192b08, 0x2b08081919080808, 0x2b08082b08190819, 0x2b08190808080819,
    0x2b08190808081908, 0x2b08190808190808, 0x2b08190808191919, 0x2b08190819080808,
    0x2b081908192b0808, 0x2b08191908080808, 0x2b0819191908192b, 0x2b0819192b191908,
    0x2b08192b08082b19, 0x2b08192b19080808, 0x2b08192b192b0808, 0x2b082b080808082b,
    0x2b082b1908081908, 0x2b082b2b08190819, 0x2b19080808081908, 0x2b19080808190808,
    0x2b190808082b1908, 0x2b19080819080808, 0x2b1908082b2b0819, 0x2b1908190819192b,
    0x2b1908192b080808, 0x2b19082b19081919, 0x2b19190808080808, 0x2b191908082b082b,
    0x2b19190819081908, 0x2b19191919190819, 0x2b192b082b080819, 0x2b192b19082b0808,
    0x2b2b08080808082b, 0x2b2b080819190808, 0x2b2b08082b081919, 0x2b2b081908082b19,
    0x2b2b082b08080808, 0x2b2b190808192b08, 0x2b2b2b0819190808, 0x2b2b2b1908081908,
GGML_TABLE_END()

GGML_TABLE_BEGIN(uint64_t, iq2xs_grid, 512)
    0x0808080808080808, 0x080808080808082b, 0x0808080808081919, 0x0808080808082b08,
    0x0808080808082b2b, 0x0808080808190819, 0x0808080808191908, 0x080808080819192b,
    0x0808080808192b19, 0x08080808082b0808, 0x08080808082b082b, 0x08080808082b1919,
    0x08080808082b2b08, 0x0808080819080819, 0x0808080819081908, 0x080808081908192b,
    0x0808080819082b19, 0x0808080819190808, 0x080808081919082b, 0x0808080819191919,
    0x0808080819192b08, 0x08080808192b0819, 0x08080808192b1908, 0x080808082b080808,
    0x080808082b08082b, 0x080808082b081919, 0x080808082b082b08, 0x080808082b190819,
    0x080808082b191908, 0x080808082b192b19, 0x080808082b2b0808, 0x0808081908080819,
    0x0808081908081908, 0x080808190808192b, 0x0808081908082b19, 0x0808081908190808,
    0x080808190819082b, 0x0808081908191919, 0x0808081908192b08, 0x0808081908192b2b,
    0x08080819082b0819, 0x08080819082b1908, 0x0808081919080808, 0x080808191908082b,
    0x0808081919081919, 0x0808081919082b08, 0x0808081919190819, 0x0808081919191908,
    0x08080819192b0808, 0x08080819192b2b08, 0x080808192b080819, 0x080808192b081908,
    0x080808192b190808, 0x0808082b08080808, 0x0808082b0808082b, 0x0808082b08081919,
    0x0808082b08082b08, 0x0808082b08190819, 0x0808082b08191908, 0x0808082b082b0808,
    0x0808082b19080819, 0x0808082b19081908, 0x0808082b19190808, 0x0808082b19191919,
    0x0808082b2b080808, 0x0808082b2b082b2b, 0x0808190808080819, 0x0808190808081908,
    0x080819080808192b, 0x0808190808082b19, 0x0808190808190808, 0x080819080819082b,
    0x0808190808191919, 0x0808190808192b08, 0x08081908082b0819, 0x08081908082b1908,
    0x0808190819080808, 0x080819081908082b, 0x0808190819081919, 0x0808190819082b08,
    0x0808190819190819, 0x0808190819191908, 0x080819081919192b, 0x08081908192b0808,
    0x080819082b080819, 0x080819082b081908, 0x080819082b190808, 0x0808191908080808,
    0x080819190808082b, 0x0808191908081919, 0x0808191908082b08, 0x0808191908190819,
    0x0808191908191908, 0x08081919082b0808, 0x0808191919080819, 0x0808191919081908,
    0x0808191919190808, 0x08081919192b0819, 0x080819192b080808, 0x0808192b08080819,
    0x0808192b08081908, 0x0808192b08190808, 0x0808192b082b192b, 0x0808192b19080808,
    0x0808192b1908082b, 0x0808192b2b081908, 0x08082b0808080808, 0x08082b080808082b,
    0x08082b0808081919, 0x08082b0808082b08, 0x08082b0808082b2b, 0x08082b0808190819,
    0x08082b0808191908, 0x08082b08082b0808, 0x08082b08082b1919, 0x08082b0819080819,
    0x08082b0819081908, 0x08082b0819190808, 0x08082b0819192b08, 0x08082b082b080808,
    0x08082b082b2b0808, 0x08082b082b2b2b2b, 0x08082b1908080819, 0x08082b1908081908,
    0x08082b1908190808, 0x08082b1919080808, 0x08082b192b080819, 0x08082b192b082b19,
    0x08082b2b08080808, 0x08082b2b082b0808, 0x08082b2b082b2b08, 0x08082b2b2b19192b,
    0x08082b2b2b2b0808, 0x0819080808080819, 0x0819080808081908, 0x081908080808192b,
    0x0819080808082b19, 0x0819080808190808, 0x081908080819082b, 0x0819080808191919,
    0x0819080808192b08, 0x08190808082b0819, 0x08190808082b1908, 0x0819080819080808,
    0x081908081908082b, 0x0819080819081919, 0x0819080819082b08, 0x0819080819190819,
    0x0819080819191908, 0x08190808192b0808, 0x08190808192b2b2b, 0x081908082b080819,
    0x081908082b081908, 0x081908082b190808, 0x0819081908080808, 0x081908190808082b,
    0x0819081908081919, 0x0819081908082b08, 0x0819081908190819, 0x0819081908191908,
    0x08190819082b0808, 0x0819081919080819, 0x0819081919081908, 0x0819081919190808,
    0x081908192b080808, 0x081908192b191908, 0x081908192b19192b, 0x0819082b08080819,
    0x0819082b08081908, 0x0819082b0808192b, 0x0819082b08190808, 0x0819082b19080808,
    0x0819082b192b0808, 0x0819190808080808, 0x081919080808082b, 0x0819190808081919,
    0x0819190808082b08, 0x0819190808190819, 0x0819190808191908, 0x08191908082b0808,
    0x0819190819080819, 0x0819190819081908, 0x0819190819082b19, 0x0819190819190808,
    0x08191908192b1908, 0x081919082b080808, 0x0819191908080819, 0x0819191908081908,
    0x0819191908190808, 0x0819191919080808, 0x0819192b08080808, 0x0819192b08191908,
    0x0819192b19082b19, 0x08192b0808080819, 0x08192b0808081908, 0x08192b0808190808,
    0x08192b080819082b, 0x08192b0819080808, 0x08192b0819191908, 0x08192b082b08192b,
    0x08192b1908080808, 0x08192b1908081919, 0x08192b19192b192b, 0x08192b2b19190819,
    0x08192b2b2b2b2b19, 0x082b080808080808, 0x082b08080808082b, 0x082b080808081919,
    0x082b080808082b08, 0x082b080808082b2b, 0x082b080808190819, 0x082b080808191908,
    0x082b0808082b0808, 0x082b080819080819, 0x082b080819081908, 0x082b080819190808,
    0x082b08082b080808, 0x082b08082b2b0808, 0x082b081908080819, 0x082b081908081908,
    0x082b081908190808, 0x082b081919080808, 0x082b081919082b08, 0x082b0819192b1919,
    0x082b082b08080808, 0x082b082b082b082b, 0x082b082b2b080808, 0x082b082b2b2b2b08,
    0x082b190808080819, 0x082b190808081908, 0x082b190808190808, 0x082b1908082b2b19,
    0x082b190819080808, 0x082b191908080808, 0x082b191919080819, 0x082b19191919082b,
    0x082b19192b192b19, 0x082b192b08080819, 0x082b192b08192b2b, 0x082b192b2b2b192b,
    0x082b2b0808080808, 0x082b2b0808082b08, 0x082b2b0808082b2b, 0x082b2b08082b0808,
    0x082b2b0819191919, 0x082b2b082b082b08, 0x082b2b082b2b082b, 0x082b2b19192b2b08,
    0x082b2b192b190808, 0x082b2b2b08082b08, 0x082b2b2b082b0808, 0x082b2b2b2b08082b,
    0x082b2b2b2b082b08, 0x082b2b2b2b082b2b, 0x1908080808080819, 0x1908080808081908,
    0x190808080808192b, 0x1908080808082b19, 0x1908080808190808, 0x190808080819082b,
    0x1908080808191919, 0x1908080808192b08, 0x19080808082b0819, 0x19080808082b1908,
    0x1908080819080808, 0x190808081908082b, 0x1908080819081919, 0x1908080819082b08,
    0x1908080819082b2b, 0x1908080819190819, 0x1908080819191908, 0x19080808192b0808,
    0x19080808192b1919, 0x190808082b080819, 0x190808082b081908, 0x190808082b190808,
    0x1908081908080808, 0x190808190808082b, 0x1908081908081919, 0x1908081908082b08,
    0x1908081908190819, 0x1908081908191908, 0x19080819082b0808, 0x1908081919080819,
    0x1908081919081908, 0x1908081919190808, 0x190808192b080808, 0x190808192b081919,
    0x190808192b2b082b, 0x1908082b08080819, 0x1908082b08081908, 0x1908082b08190808,
    0x1908082b0819082b, 0x1908082b082b2b19, 0x1908082b19080808, 0x1908190808080808,
    0x190819080808082b, 0x1908190808081919, 0x1908190808082b08, 0x1908190808190819,
    0x1908190808191908, 0x1908190808192b19, 0x19081908082b0808, 0x1908190819080819,
    0x1908190819081908, 0x1908190819190808, 0x190819082b080808, 0x190819082b191908,
    0x1908191908080819, 0x1908191908081908, 0x1908191908190808, 0x19081919082b1908,
    0x1908191919080808, 0x190819192b192b2b, 0x1908192b08080808, 0x1908192b08082b2b,
    0x1908192b19081908, 0x1908192b19190808, 0x19082b0808080819, 0x19082b0808081908,
    0x19082b0808190808, 0x19082b0819080808, 0x19082b0819081919, 0x19082b0819191908,
    0x19082b08192b082b, 0x19082b1908080808, 0x19082b1908190819, 0x19082b1919081908,
    0x19082b1919190808, 0x19082b19192b2b19, 0x19082b2b08081908, 0x1919080808080808,
    0x191908080808082b, 0x1919080808081919, 0x1919080808082b08, 0x1919080808190819,
    0x1919080808191908, 0x19190808082b0808, 0x19190808082b2b08, 0x1919080819080819,
    0x1919080819081908, 0x1919080819190808, 0x191908082b080808, 0x1919081908080819,
    0x1919081908081908, 0x1919081908190808, 0x1919081908191919, 0x1919081919080808,
    0x191908191908082b, 0x1919082b08080808, 0x1919082b19081908, 0x1919082b2b2b2b2b,
    0x1919190808080819, 0x1919190808081908, 0x1919190808190808, 0x19191908082b0819,
    0x1919190819080808, 0x19191908192b0808, 0x191919082b080819, 0x191919082b2b0819,
    0x1919191908080808, 0x1919191908082b08, 0x191919192b080808, 0x191919192b082b08,
    0x1919192b082b0819, 0x1919192b192b2b08, 0x1919192b2b2b0819, 0x19192b0808080808,
    0x19192b0808191908, 0x19192b0819080819, 0x19192b0819190808, 0x19192b082b192b19,
    0x19192b1908192b2b, 0x19192b1919080808, 0x19192b191908082b, 0x19192b2b2b081919,
    0x192b080808080819, 0x192b080808081908, 0x192b080808190808, 0x192b080819080808,
    0x192b080819191908, 0x192b0808192b082b, 0x192b08082b08192b, 0x192b08082b2b2b19,
    0x192b081908080808, 0x192b082b082b1908, 0x192b082b19082b2b, 0x192b082b2b19082b,
    0x192b190808080808, 0x192b19080819192b, 0x192b191908190808, 0x192b191919080808,
    0x192b191919081919, 0x192b19192b2b1908, 0x192b2b0808080819, 0x192b2b08192b2b2b,
    0x192b2b19082b1919, 0x192b2b2b0808192b, 0x192b2b2b19191908, 0x192b2b2b192b082b,
    0x2b08080808080808, 0x2b0808080808082b, 0x2b08080808081919, 0x2b08080808082b08,
    0x2b08080808190819, 0x2b08080808191908, 0x2b080808082b0808, 0x2b080808082b2b2b,
    0x2b08080819080819, 0x2b08080819081908, 0x2b08080819190808, 0x2b0808082b080808,
    0x2b0808082b08082b, 0x2b0808082b2b2b08, 0x2b0808082b2b2b2b, 0x2b08081908080819,
    0x2b08081908081908, 0x2b0808190808192b, 0x2b08081908190808, 0x2b08081919080808,
    0x2b08081919190819, 0x2b08081919192b19, 0x2b08082b08080808, 0x2b08082b082b0808,
    0x2b08082b2b080808, 0x2b08082b2b08082b, 0x2b08082b2b2b0808, 0x2b08082b2b2b2b08,
    0x2b08190808080819, 0x2b08190808081908, 0x2b08190808190808, 0x2b0819080819082b,
    0x2b08190808191919, 0x2b08190819080808, 0x2b081908192b0808, 0x2b0819082b082b19,
    0x2b08191908080808, 0x2b08191919081908, 0x2b0819192b2b1919, 0x2b08192b08192b08,
    0x2b08192b192b2b2b, 0x2b082b0808080808, 0x2b082b0808082b08, 0x2b082b08082b1919,
    0x2b082b0819192b2b, 0x2b082b082b080808, 0x2b082b082b08082b, 0x2b082b082b2b2b08,
    0x2b082b190808192b, 0x2b082b2b082b082b, 0x2b082b2b2b080808, 0x2b082b2b2b082b08,
    0x2b082b2b2b19192b, 0x2b082b2b2b2b2b08, 0x2b19080808080819, 0x2b19080808081908,
    0x2b19080808190808, 0x2b19080819080808, 0x2b1908081919192b, 0x2b1908082b081908,
    0x2b19081908080808, 0x2b190819082b082b, 0x2b190819192b1908, 0x2b19082b1919192b,
    0x2b19082b2b082b19, 0x2b19190808080808, 0x2b19190808081919, 0x2b19190819081908,
    0x2b19190819190808, 0x2b19190819192b08, 0x2b191919082b2b19, 0x2b1919192b190808,
    0x2b1919192b19082b, 0x2b19192b19080819, 0x2b192b0819190819, 0x2b192b082b2b192b,
    0x2b192b1919082b19, 0x2b192b2b08191919, 0x2b192b2b192b0808, 0x2b2b080808080808,
    0x2b2b08080808082b, 0x2b2b080808082b08, 0x2b2b080808082b2b, 0x2b2b0808082b0808,
    0x2b2b0808082b2b2b, 0x2b2b08082b2b0808, 0x2b2b081919190819, 0x2b2b081919192b19,
    0x2b2b08192b2b192b, 0x2b2b082b08080808, 0x2b2b082b0808082b, 0x2b2b082b08082b08,
    0x2b2b082b082b2b2b, 0x2b2b082b2b080808, 0x2b2b082b2b2b0808, 0x2b2b190819080808,
    0x2b2b19082b191919, 0x2b2b192b192b1919, 0x2b2b192b2b192b08, 0x2b2b2b0808082b2b,
    0x2b2b2b08082b0808, 0x2b2b2b08082b082b, 0x2b2b2b08082b2b08, 0x2b2b2b082b2b0808,
    0x2b2b2b082b2b2b08, 0x2b2b2b1908081908, 0x2b2b2b192b081908, 0x2b2b2b192b08192b,
    0x2b2b2b2b082b2b08, 0x2b2b2b2b082b2b2b, 0x2b2b2b2b2b190819, 0x2b2b2b2b2b2b2b2b,
GGML_TABLE_END()

GGML_TABLE_BEGIN(uint64_t, iq2s_grid, 1024)
    0x0808080808080808, 0x080808080808082b, 0x0808080808081919, 0x0808080808082b08,
    0x0808080808082b2b, 0x0808080808190819, 0x0808080808191908, 0x080808080819192b,
    0x0808080808192b19, 0x08080808082b0808, 0x08080808082b082b, 0x08080808082b1919,
    0x08080808082b2b08, 0x0808080819080819, 0x0808080819081908, 0x080808081908192b,
    0x0808080819082b19, 0x0808080819190808, 0x080808081919082b, 0x0808080819191919,
    0x0808080819192b08, 0x08080808192b0819, 0x08080808192b1908, 0x08080808192b192b,
    0x08080808192b2b19, 0x080808082b080808, 0x080808082b08082b, 0x080808082b081919,
    0x080808082b082b08, 0x080808082b190819, 0x080808082b191908, 0x080808082b2b0808,
    0x080808082b2b1919, 0x080808082b2b2b2b, 0x0808081908080819, 0x0808081908081908,
    0x080808190808192b, 0x0808081908082b19, 0x0808081908190808, 0x080808190819082b,
    0x0808081908191919, 0x0808081908192b08, 0x08080819082b0819, 0x08080819082b1908,
    0x0808081919080808, 0x080808191908082b, 0x0808081919081919, 0x0808081919082b08,
    0x0808081919190819, 0x0808081919191908, 0x080808191919192b, 0x0808081919192b19,
    0x08080819192b0808, 0x08080819192b1919, 0x08080819192b2b08, 0x080808192b080819,
    0x080808192b081908, 0x080808192b190808, 0x080808192b19082b, 0x080808192b191919,
    0x080808192b2b0819, 0x080808192b2b1908, 0x0808082b08080808, 0x0808082b0808082b,
    0x0808082b08081919, 0x0808082b08082b08, 0x0808082b08190819, 0x0808082b08191908,
    0x0808082b082b0808, 0x0808082b082b2b2b, 0x0808082b19080819, 0x0808082b19081908,
    0x0808082b1908192b, 0x0808082b19082b19, 0x0808082b19190808, 0x0808082b19191919,
    0x0808082b2b080808, 0x0808082b2b081919, 0x0808082b2b082b2b, 0x0808082b2b191908,
    0x0808082b2b2b082b, 0x0808190808080819, 0x0808190808081908, 0x080819080808192b,
    0x0808190808082b19, 0x0808190808190808, 0x080819080819082b, 0x0808190808191919,
    0x0808190808192b08, 0x08081908082b0819, 0x08081908082b1908, 0x08081908082b192b,
    0x08081908082b2b19, 0x0808190819080808, 0x080819081908082b, 0x0808190819081919,
    0x0808190819082b08, 0x0808190819082b2b, 0x0808190819190819, 0x0808190819191908,
    0x080819081919192b, 0x0808190819192b19, 0x08081908192b0808, 0x08081908192b082b,
    0x08081908192b1919, 0x080819082b080819, 0x080819082b081908, 0x080819082b08192b,
    0x080819082b082b19, 0x080819082b190808, 0x080819082b191919, 0x080819082b192b08,
    0x080819082b2b0819, 0x080819082b2b1908, 0x0808191908080808, 0x080819190808082b,
    0x0808191908081919, 0x0808191908082b08, 0x0808191908082b2b, 0x0808191908190819,
    0x0808191908191908, 0x080819190819192b, 0x0808191908192b19, 0x08081919082b0808,
    0x08081919082b1919, 0x08081919082b2b08, 0x0808191919080819, 0x0808191919081908,
    0x080819191908192b, 0x0808191919082b19, 0x0808191919190808, 0x080819191919082b,
    0x0808191919191919, 0x0808191919192b08, 0x08081919192b0819, 0x08081919192b1908,
    0x080819192b080808, 0x080819192b08082b, 0x080819192b081919, 0x080819192b082b08,
    0x080819192b190819, 0x080819192b191908, 0x080819192b2b0808, 0x0808192b08080819,
    0x0808192b08081908, 0x0808192b0808192b, 0x0808192b08082b19, 0x0808192b08190808,
    0x0808192b08191919, 0x0808192b19080808, 0x0808192b19081919, 0x0808192b19082b08,
    0x0808192b19190819, 0x0808192b19191908, 0x0808192b192b0808, 0x0808192b2b080819,
    0x0808192b2b081908, 0x0808192b2b190808, 0x08082b0808080808, 0x08082b080808082b,
    0x08082b0808081919, 0x08082b0808082b08, 0x08082b0808190819, 0x08082b0808191908,
    0x08082b080819192b, 0x08082b0808192b19, 0x08082b08082b0808, 0x08082b08082b1919,
    0x08082b08082b2b2b, 0x08082b0819080819, 0x08082b0819081908, 0x08082b081908192b,
    0x08082b0819082b19, 0x08082b0819190808, 0x08082b081919082b, 0x08082b0819191919,
    0x08082b0819192b08, 0x08082b08192b0819, 0x08082b08192b1908, 0x08082b082b080808,
    0x08082b082b081919, 0x08082b082b191908, 0x08082b082b2b2b2b, 0x08082b1908080819,
    0x08082b1908081908, 0x08082b1908190808, 0x08082b190819082b, 0x08082b1908191919,
    0x08082b1908192b08, 0x08082b19082b0819, 0x08082b1919080808, 0x08082b1919081919,
    0x08082b1919082b08, 0x08082b1919190819, 0x08082b1919191908, 0x08082b19192b0808,
    0x08082b192b080819, 0x08082b192b190808, 0x08082b2b08080808, 0x08082b2b08190819,
    0x08082b2b08191908, 0x08082b2b082b082b, 0x08082b2b082b2b08, 0x08082b2b082b2b2b,
    0x08082b2b19190808, 0x08082b2b2b192b19, 0x0819080808080819, 0x0819080808081908,
    0x081908080808192b, 0x0819080808082b19, 0x0819080808190808, 0x081908080819082b,
    0x0819080808191919, 0x0819080808192b08, 0x08190808082b0819, 0x08190808082b1908,
    0x08190808082b192b, 0x0819080819080808, 0x081908081908082b, 0x0819080819081919,
    0x0819080819082b08, 0x0819080819190819, 0x0819080819191908, 0x081908081919192b,
    0x0819080819192b19, 0x08190808192b0808, 0x08190808192b082b, 0x08190808192b1919,
    0x08190808192b2b08, 0x081908082b080819, 0x081908082b081908, 0x081908082b08192b,
    0x081908082b190808, 0x081908082b191919, 0x081908082b192b08, 0x081908082b2b0819,
    0x081908082b2b1908, 0x0819081908080808, 0x081908190808082b, 0x0819081908081919,
    0x0819081908082b08, 0x0819081908082b2b, 0x0819081908190819, 0x0819081908191908,
    0x081908190819192b, 0x0819081908192b19, 0x08190819082b0808, 0x08190819082b082b,
    0x08190819082b1919, 0x08190819082b2b08, 0x0819081919080819, 0x0819081919081908,
    0x081908191908192b, 0x0819081919082b19, 0x0819081919190808, 0x081908191919082b,
    0x0819081919191919, 0x0819081919192b08, 0x08190819192b0819, 0x08190819192b1908,
    0x081908192b080808, 0x081908192b08082b, 0x081908192b081919, 0x081908192b082b08,
    0x081908192b190819, 0x081908192b191908, 0x0819082b08080819, 0x0819082b08081908,
    0x0819082b08082b19, 0x0819082b08190808, 0x0819082b08191919, 0x0819082b082b0819,
    0x0819082b082b1908, 0x0819082b19080808, 0x0819082b19081919, 0x0819082b19190819,
    0x0819082b19191908, 0x0819082b2b080819, 0x0819082b2b081908, 0x0819082b2b190808,
    0x0819190808080808, 0x081919080808082b, 0x0819190808081919, 0x0819190808082b08,
    0x0819190808190819, 0x0819190808191908, 0x081919080819192b, 0x0819190808192b19,
    0x08191908082b0808, 0x08191908082b1919, 0x08191908082b2b08, 0x0819190819080819,
    0x0819190819081908, 0x081919081908192b, 0x0819190819082b19, 0x0819190819190808,
    0x081919081919082b, 0x0819190819191919, 0x0819190819192b08, 0x08191908192b0819,
    0x08191908192b1908, 0x081919082b080808, 0x081919082b08082b, 0x081919082b081919,
    0x081919082b082b08, 0x081919082b190819, 0x081919082b191908, 0x081919082b2b0808,
    0x0819191908080819, 0x0819191908081908, 0x081919190808192b, 0x0819191908082b19,
    0x0819191908190808, 0x081919190819082b, 0x0819191908191919, 0x0819191908192b08,
    0x08191919082b0819, 0x08191919082b1908, 0x0819191919080808, 0x081919191908082b,
    0x0819191919081919, 0x0819191919082b08, 0x0819191919190819, 0x0819191919191908,
    0x08191919192b0808, 0x081919192b080819, 0x081919192b081908, 0x081919192b190808,
    0x0819192b08080808, 0x0819192b08081919, 0x0819192b08082b08, 0x0819192b08190819,
    0x0819192b08191908, 0x0819192b082b0808, 0x0819192b19080819, 0x0819192b19081908,
    0x0819192b19190808, 0x0819192b2b080808, 0x0819192b2b2b2b2b, 0x08192b0808080819,
    0x08192b0808081908, 0x08192b080808192b, 0x08192b0808082b19, 0x08192b0808190808,
    0x08192b0808191919, 0x08192b0808192b08, 0x08192b08082b0819, 0x08192b0819080808,
    0x08192b081908082b, 0x08192b0819081919, 0x08192b0819082b08, 0x08192b0819190819,
    0x08192b0819191908, 0x08192b08192b0808, 0x08192b082b080819, 0x08192b082b081908,
    0x08192b1908080808, 0x08192b190808082b, 0x08192b1908081919, 0x08192b1908082b08,
    0x08192b1908190819, 0x08192b1908191908, 0x08192b19082b0808, 0x08192b1919080819,
    0x08192b1919081908, 0x08192b1919190808, 0x08192b19192b2b19, 0x08192b192b2b082b,
    0x08192b2b08081908, 0x08192b2b08190808, 0x08192b2b19080808, 0x08192b2b1919192b,
    0x082b080808080808, 0x082b08080808082b, 0x082b080808081919, 0x082b080808082b08,
    0x082b080808190819, 0x082b080808191908, 0x082b08080819192b, 0x082b080808192b19,
    0x082b0808082b0808, 0x082b0808082b1919, 0x082b0808082b2b2b, 0x082b080819080819,
    0x082b080819081908, 0x082b080819190808, 0x082b08081919082b, 0x082b080819191919,
    0x082b0808192b1908, 0x082b08082b080808, 0x082b08082b082b2b, 0x082b08082b191908,
    0x082b08082b2b2b2b, 0x082b081908080819, 0x082b081908081908, 0x082b081908190808,
    0x082b08190819082b, 0x082b081908191919, 0x082b0819082b0819, 0x082b081919080808,
    0x082b08191908082b, 0x082b081919081919, 0x082b081919190819, 0x082b081919191908,
    0x082b0819192b0808, 0x082b08192b080819, 0x082b08192b081908, 0x082b08192b190808,
    0x082b082b08080808, 0x082b082b08082b2b, 0x082b082b082b082b, 0x082b082b082b2b08,
    0x082b082b082b2b2b, 0x082b082b19081908, 0x082b082b19190808, 0x082b082b2b082b08,
    0x082b082b2b082b2b, 0x082b082b2b2b2b08, 0x082b190808080819, 0x082b190808081908,
    0x082b19080808192b, 0x082b190808082b19, 0x082b190808190808, 0x082b190808191919,
    0x082b190808192b08, 0x082b1908082b0819, 0x082b1908082b1908, 0x082b190819080808,
    0x082b19081908082b, 0x082b190819081919, 0x082b190819082b08, 0x082b190819190819,
    0x082b190819191908, 0x082b1908192b0808, 0x082b19082b080819, 0x082b19082b081908,
    0x082b19082b190808, 0x082b191908080808, 0x082b191908081919, 0x082b191908082b08,
    0x082b191908190819, 0x082b191908191908, 0x082b1919082b0808, 0x082b191919080819,
    0x082b191919081908, 0x082b191919190808, 0x082b1919192b192b, 0x082b19192b080808,
    0x082b192b08080819, 0x082b192b08081908, 0x082b192b08190808, 0x082b192b19080808,
    0x082b192b19192b19, 0x082b2b0808080808, 0x082b2b0808081919, 0x082b2b0808190819,
    0x082b2b0808191908, 0x082b2b0819080819, 0x082b2b0819081908, 0x082b2b0819190808,
    0x082b2b082b082b2b, 0x082b2b082b2b2b2b, 0x082b2b1908080819, 0x082b2b1908081908,
    0x082b2b1908190808, 0x082b2b192b191919, 0x082b2b2b08082b2b, 0x082b2b2b082b082b,
    0x082b2b2b192b1908, 0x082b2b2b2b082b08, 0x082b2b2b2b082b2b, 0x1908080808080819,
    0x1908080808081908, 0x190808080808192b, 0x1908080808082b19, 0x1908080808190808,
    0x190808080819082b, 0x1908080808191919, 0x1908080808192b08, 0x1908080808192b2b,
    0x19080808082b0819, 0x19080808082b1908, 0x19080808082b192b, 0x1908080819080808,
    0x190808081908082b, 0x1908080819081919, 0x1908080819082b08, 0x1908080819082b2b,
    0x1908080819190819, 0x1908080819191908, 0x190808081919192b, 0x1908080819192b19,
    0x19080808192b0808, 0x19080808192b082b, 0x19080808192b1919, 0x190808082b080819,
    0x190808082b081908, 0x190808082b190808, 0x190808082b191919, 0x190808082b192b08,
    0x190808082b2b0819, 0x190808082b2b1908, 0x1908081908080808, 0x190808190808082b,
    0x1908081908081919, 0x1908081908082b08, 0x1908081908190819, 0x1908081908191908,
    0x190808190819192b, 0x1908081908192b19, 0x19080819082b0808, 0x19080819082b082b,
    0x19080819082b1919, 0x1908081919080819, 0x1908081919081908, 0x190808191908192b,
    0x1908081919082b19, 0x1908081919190808, 0x190808191919082b, 0x1908081919191919,
    0x1908081919192b08, 0x19080819192b0819, 0x19080819192b1908, 0x190808192b080808,
    0x190808192b08082b, 0x190808192b081919, 0x190808192b082b08, 0x190808192b190819,
    0x190808192b191908, 0x190808192b2b0808, 0x1908082b08080819, 0x1908082b08081908,
    0x1908082b08190808, 0x1908082b0819082b, 0x1908082b08191919, 0x1908082b08192b08,
    0x1908082b082b1908, 0x1908082b19080808, 0x1908082b19081919, 0x1908082b19082b08,
    0x1908082b19190819, 0x1908082b19191908, 0x1908082b192b0808, 0x1908082b2b080819,
    0x1908082b2b081908, 0x1908190808080808, 0x190819080808082b, 0x1908190808081919,
    0x1908190808082b08, 0x1908190808082b2b, 0x1908190808190819, 0x1908190808191908,
    0x190819080819192b, 0x1908190808192b19, 0x19081908082b0808, 0x19081908082b082b,
    0x19081908082b1919, 0x19081908082b2b08, 0x1908190819080819, 0x1908190819081908,
    0x190819081908192b, 0x1908190819082b19, 0x1908190819190808, 0x190819081919082b,
    0x1908190819191919, 0x1908190819192b08, 0x19081908192b0819, 0x19081908192b1908,
    0x190819082b080808, 0x190819082b08082b, 0x190819082b081919, 0x190819082b082b08,
    0x190819082b190819, 0x190819082b191908, 0x190819082b2b0808, 0x1908191908080819,
    0x1908191908081908, 0x190819190808192b, 0x1908191908082b19, 0x1908191908190808,
    0x190819190819082b, 0x1908191908191919, 0x1908191908192b08, 0x19081919082b0819,
    0x19081919082b1908, 0x1908191919080808, 0x190819191908082b, 0x1908191919081919,
    0x1908191919082b08, 0x1908191919190819, 0x1908191919191908, 0x19081919192b0808,
    0x19081919192b2b2b, 0x190819192b080819, 0x190819192b081908, 0x190819192b190808,
    0x1908192b08080808, 0x1908192b0808082b, 0x1908192b08081919, 0x1908192b08082b08,
    0x1908192b08190819, 0x1908192b08191908, 0x1908192b082b0808, 0x1908192b19080819,
    0x1908192b19081908, 0x1908192b19190808, 0x1908192b2b080808, 0x1908192b2b2b1919,
    0x19082b0808080819, 0x19082b0808081908, 0x19082b0808082b19, 0x19082b0808190808,
    0x19082b080819082b, 0x19082b0808191919, 0x19082b0808192b08, 0x19082b08082b0819,
    0x19082b08082b1908, 0x19082b0819080808, 0x19082b081908082b, 0x19082b0819081919,
    0x19082b0819082b08, 0x19082b0819190819, 0x19082b0819191908, 0x19082b08192b0808,
    0x19082b082b081908, 0x19082b082b190808, 0x19082b1908080808, 0x19082b190808082b,
    0x19082b1908081919, 0x19082b1908082b08, 0x19082b1908190819, 0x19082b1908191908,
    0x19082b19082b0808, 0x19082b1919080819, 0x19082b1919081908, 0x19082b1919190808,
    0x19082b192b080808, 0x19082b192b19192b, 0x19082b2b08080819, 0x19082b2b08081908,
    0x19082b2b08190808, 0x19082b2b19080808, 0x1919080808080808, 0x191908080808082b,
    0x1919080808081919, 0x1919080808082b08, 0x1919080808190819, 0x1919080808191908,
    0x191908080819192b, 0x1919080808192b19, 0x19190808082b0808, 0x19190808082b082b,
    0x19190808082b1919, 0x19190808082b2b08, 0x1919080819080819, 0x1919080819081908,
    0x191908081908192b, 0x1919080819082b19, 0x1919080819190808, 0x191908081919082b,
    0x1919080819191919, 0x1919080819192b08, 0x19190808192b0819, 0x19190808192b1908,
    0x191908082b080808, 0x191908082b08082b, 0x191908082b081919, 0x191908082b082b08,
    0x191908082b190819, 0x191908082b191908, 0x1919081908080819, 0x1919081908081908,
    0x191908190808192b, 0x1919081908082b19, 0x1919081908190808, 0x191908190819082b,
    0x1919081908191919, 0x1919081908192b08, 0x19190819082b0819, 0x19190819082b1908,
    0x1919081919080808, 0x191908191908082b, 0x1919081919081919, 0x1919081919082b08,
    0x1919081919190819, 0x1919081919191908, 0x19190819192b0808, 0x191908192b080819,
    0x191908192b081908, 0x191908192b190808, 0x1919082b08080808, 0x1919082b08081919,
    0x1919082b08082b08, 0x1919082b08190819, 0x1919082b08191908, 0x1919082b082b0808,
    0x1919082b19080819, 0x1919082b19081908, 0x1919082b19190808, 0x1919082b192b2b19,
    0x1919082b2b080808, 0x1919190808080819, 0x1919190808081908, 0x191919080808192b,
    0x1919190808082b19, 0x1919190808190808, 0x191919080819082b, 0x1919190808191919,
    0x1919190808192b08, 0x19191908082b0819, 0x19191908082b1908, 0x1919190819080808,
    0x191919081908082b, 0x1919190819081919, 0x1919190819082b08, 0x1919190819190819,
    0x1919190819191908, 0x19191908192b0808, 0x191919082b080819, 0x191919082b081908,
    0x191919082b190808, 0x1919191908080808, 0x191919190808082b, 0x1919191908081919,
    0x1919191908082b08, 0x1919191908190819, 0x1919191908191908, 0x19191919082b0808,
    0x1919191919080819, 0x1919191919081908, 0x1919191919190808, 0x191919192b080808,
    0x1919192b08080819, 0x1919192b08081908, 0x1919192b08190808, 0x1919192b082b192b,
    0x1919192b19080808, 0x19192b0808080808, 0x19192b080808082b, 0x19192b0808081919,
    0x19192b0808082b08, 0x19192b0808190819, 0x19192b0808191908, 0x19192b08082b0808,
    0x19192b0819080819, 0x19192b0819081908, 0x19192b0819190808, 0x19192b0819192b2b,
    0x19192b082b080808, 0x19192b1908080819, 0x19192b1908081908, 0x19192b1908190808,
    0x19192b1919080808, 0x19192b2b08080808, 0x19192b2b08192b19, 0x19192b2b2b081919,
    0x19192b2b2b2b2b08, 0x192b080808080819, 0x192b080808081908, 0x192b08080808192b,
    0x192b080808190808, 0x192b08080819082b, 0x192b080808191919, 0x192b080808192b08,
    0x192b0808082b0819, 0x192b0808082b1908, 0x192b080819080808, 0x192b080819081919,
    0x192b080819082b08, 0x192b080819190819, 0x192b080819191908, 0x192b0808192b0808,
    0x192b08082b081908, 0x192b08082b190808, 0x192b081908080808, 0x192b08190808082b,
    0x192b081908081919, 0x192b081908082b08, 0x192b081908190819, 0x192b081908191908,
    0x192b0819082b0808, 0x192b081919080819, 0x192b081919081908, 0x192b081919190808,
    0x192b08192b080808, 0x192b08192b192b19, 0x192b082b08081908, 0x192b082b08190808,
    0x192b082b19080808, 0x192b082b1919192b, 0x192b082b2b2b0819, 0x192b190808080808,
    0x192b190808081919, 0x192b190808082b08, 0x192b190808190819, 0x192b190808191908,
    0x192b1908082b0808, 0x192b190819080819, 0x192b190819081908, 0x192b190819190808,
    0x192b19082b080808, 0x192b191908080819, 0x192b191908081908, 0x192b191908190808,
    0x192b191919080808, 0x192b191919082b2b, 0x192b1919192b2b08, 0x192b19192b19082b,
    0x192b192b08080808, 0x192b192b2b191908, 0x192b2b0808080819, 0x192b2b0808081908,
    0x192b2b0808190808, 0x192b2b08192b1919, 0x192b2b082b192b08, 0x192b2b1908080808,
    0x192b2b19082b2b2b, 0x192b2b2b1908082b, 0x192b2b2b2b2b0819, 0x2b08080808080808,
    0x2b0808080808082b, 0x2b08080808081919, 0x2b08080808082b08, 0x2b08080808190819,
    0x2b08080808191908, 0x2b08080808192b19, 0x2b080808082b0808, 0x2b080808082b1919,
    0x2b08080819080819, 0x2b08080819081908, 0x2b08080819190808, 0x2b0808081919082b,
    0x2b08080819191919, 0x2b08080819192b08, 0x2b080808192b0819, 0x2b0808082b080808,
    0x2b0808082b081919, 0x2b0808082b190819, 0x2b0808082b191908, 0x2b08081908080819,
    0x2b08081908081908, 0x2b08081908082b19, 0x2b08081908190808, 0x2b0808190819082b,
    0x2b08081908191919, 0x2b08081908192b08, 0x2b080819082b0819, 0x2b080819082b1908,
    0x2b08081919080808, 0x2b0808191908082b, 0x2b08081919081919, 0x2b08081919082b08,
    0x2b08081919190819, 0x2b08081919191908, 0x2b0808192b080819, 0x2b0808192b081908,
    0x2b0808192b190808, 0x2b0808192b2b2b19, 0x2b08082b08080808, 0x2b08082b08081919,
    0x2b08082b08082b2b, 0x2b08082b08190819, 0x2b08082b08191908, 0x2b08082b19080819,
    0x2b08082b19081908, 0x2b08082b19190808, 0x2b08190808080819, 0x2b08190808081908,
    0x2b0819080808192b, 0x2b08190808082b19, 0x2b08190808190808, 0x2b0819080819082b,
    0x2b08190808191919, 0x2b08190808192b08, 0x2b081908082b0819, 0x2b08190819080808,
    0x2b0819081908082b, 0x2b08190819081919, 0x2b08190819082b08, 0x2b08190819190819,
    0x2b08190819191908, 0x2b081908192b0808, 0x2b0819082b080819, 0x2b0819082b081908,
    0x2b0819082b190808, 0x2b08191908080808, 0x2b0819190808082b, 0x2b08191908081919,
    0x2b08191908082b08, 0x2b08191908190819, 0x2b08191908191908, 0x2b081919082b0808,
    0x2b08191919080819, 0x2b08191919081908, 0x2b08191919190808, 0x2b0819192b080808,
    0x2b0819192b082b2b, 0x2b08192b08080819, 0x2b08192b08081908, 0x2b08192b08190808,
    0x2b08192b082b2b19, 0x2b08192b19080808, 0x2b082b0808080808, 0x2b082b0808081919,
    0x2b082b0808190819, 0x2b082b0808191908, 0x2b082b0819080819, 0x2b082b0819081908,
    0x2b082b0819190808, 0x2b082b082b2b082b, 0x2b082b1908080819, 0x2b082b1908081908,
    0x2b082b1919080808, 0x2b082b19192b1919, 0x2b082b2b082b082b, 0x2b082b2b19192b08,
    0x2b082b2b19192b2b, 0x2b082b2b2b08082b, 0x2b082b2b2b2b082b, 0x2b19080808080819,
    0x2b19080808081908, 0x2b19080808082b19, 0x2b19080808190808, 0x2b1908080819082b,
    0x2b19080808191919, 0x2b19080808192b08, 0x2b190808082b1908, 0x2b19080819080808,
    0x2b1908081908082b, 0x2b19080819081919, 0x2b19080819082b08, 0x2b19080819190819,
    0x2b19080819191908, 0x2b190808192b0808, 0x2b1908082b080819, 0x2b1908082b081908,
    0x2b1908082b190808, 0x2b19081908080808, 0x2b19081908081919, 0x2b19081908190819,
    0x2b19081908191908, 0x2b19081919080819, 0x2b19081919081908, 0x2b19081919190808,
    0x2b19081919192b2b, 0x2b19082b08080819, 0x2b19082b08081908, 0x2b19082b08190808,
    0x2b19082b19080808, 0x2b19082b2b2b192b, 0x2b19190808080808, 0x2b1919080808082b,
    0x2b19190808081919, 0x2b19190808082b08, 0x2b19190808190819, 0x2b19190808191908,
    0x2b191908082b0808, 0x2b19190819080819, 0x2b19190819081908, 0x2b19190819190808,
    0x2b1919082b080808, 0x2b1919082b19192b, 0x2b19191908080819, 0x2b19191908081908,
    0x2b19191908190808, 0x2b19191919080808, 0x2b1919192b192b08, 0x2b1919192b2b0819,
    0x2b19192b08080808, 0x2b19192b1908192b, 0x2b19192b192b1908, 0x2b192b0808080819,
    0x2b192b0808081908, 0x2b192b0808190808, 0x2b192b08082b192b, 0x2b192b0819080808,
    0x2b192b082b2b2b19, 0x2b192b1908080808, 0x2b192b1919082b19, 0x2b192b191919082b,
    0x2b192b2b2b190808, 0x2b2b080808080808, 0x2b2b080808081919, 0x2b2b080808082b2b,
    0x2b2b080808191908, 0x2b2b0808082b082b, 0x2b2b0808082b2b2b, 0x2b2b080819080819,
    0x2b2b080819081908, 0x2b2b080819190808, 0x2b2b08082b2b082b, 0x2b2b08082b2b2b2b,
    0x2b2b081919080808, 0x2b2b0819192b1919, 0x2b2b082b0808082b, 0x2b2b082b08082b2b,
    0x2b2b082b082b082b, 0x2b2b082b082b2b08, 0x2b2b082b082b2b2b, 0x2b2b082b2b08082b,
    0x2b2b082b2b082b08, 0x2b2b082b2b082b2b, 0x2b2b082b2b2b2b08, 0x2b2b190808080819,
    0x2b2b190808081908, 0x2b2b190808190808, 0x2b2b190819080808, 0x2b2b19082b082b19,
    0x2b2b19082b2b1908, 0x2b2b191908080808, 0x2b2b191908192b19, 0x2b2b192b19190819,
    0x2b2b2b0808082b2b, 0x2b2b2b08082b2b08, 0x2b2b2b082b2b082b, 0x2b2b2b1919191908,
    0x2b2b2b192b08192b, 0x2b2b2b2b08082b08, 0x2b2b2b2b08082b2b, 0x2b2b2b2b082b0808,
    0x2b2b2b2b082b082b, 0x2b2b2b2b082b2b08, 0x2b2b2b2b2b082b08, 0x2b2b2b2b2b2b2b2b,
GGML_TABLE_END()

GGML_TABLE_BEGIN(uint32_t, iq3xxs_grid, 256)
    0x04040404, 0x04040414, 0x04040424, 0x04040c0c, 0x04040c1c, 0x04040c3e, 0x04041404, 0x04041414,
    0x04041c0c, 0x04042414, 0x04043e1c, 0x04043e2c, 0x040c040c, 0x040c041c, 0x040c0c04, 0x040c0c14,
    0x040c140c, 0x040c142c, 0x040c1c04, 0x040c1c14, 0x040c240c, 0x040c2c24, 0x040c3e04, 0x04140404,
    0x04140414, 0x04140424, 0x04140c0c, 0x04141404, 0x04141414, 0x04141c0c, 0x04141c1c, 0x04141c3e,
    0x04142c0c, 0x04142c3e, 0x04143e2c, 0x041c040c, 0x041c043e, 0x041c0c04, 0x041c0c14, 0x041c142c,
    0x041c3e04, 0x04240c1c, 0x04241c3e, 0x04242424, 0x04242c3e, 0x04243e1c, 0x04243e2c, 0x042c040c,
    0x042c043e, 0x042c1c14, 0x042c2c14, 0x04341c2c, 0x04343424, 0x043e0c04, 0x043e0c24, 0x043e0c34,
    0x043e241c, 0x043e340c, 0x0c04040c, 0x0c04041c, 0x0c040c04, 0x0c040c14, 0x0c04140c, 0x0c04141c,
    0x0c041c04, 0x0c041c14, 0x0c041c24, 0x0c04243e, 0x0c042c04, 0x0c0c0404, 0x0c0c0414, 0x0c0c0c0c,
    0x0c0c1404, 0x0c0c1414, 0x0c14040c, 0x0c14041c, 0x0c140c04, 0x0c140c14, 0x0c14140c, 0x0c141c04,
    0x0c143e14, 0x0c1c0404, 0x0c1c0414, 0x0c1c1404, 0x0c1c1c0c, 0x0c1c2434, 0x0c1c3434, 0x0c24040c,
    0x0c24042c, 0x0c242c04, 0x0c2c1404, 0x0c2c1424, 0x0c2c2434, 0x0c2c3e0c, 0x0c34042c, 0x0c3e1414,
    0x0c3e2404, 0x14040404, 0x14040414, 0x14040c0c, 0x14040c1c, 0x14041404, 0x14041414, 0x14041434,
    0x14041c0c, 0x14042414, 0x140c040c, 0x140c041c, 0x140c042c, 0x140c0c04, 0x140c0c14, 0x140c140c,
    0x140c1c04, 0x140c341c, 0x140c343e, 0x140c3e04, 0x14140404, 0x14140414, 0x14140c0c, 0x14140c3e,
    0x14141404, 0x14141414, 0x14141c3e, 0x14142404, 0x14142c2c, 0x141c040c, 0x141c0c04, 0x141c0c24,
    0x141c3e04, 0x141c3e24, 0x14241c2c, 0x14242c1c, 0x142c041c, 0x142c143e, 0x142c240c, 0x142c3e24,
    0x143e040c, 0x143e041c, 0x143e0c34, 0x143e242c, 0x1c04040c, 0x1c040c04, 0x1c040c14, 0x1c04140c,
    0x1c04141c, 0x1c042c04, 0x1c04342c, 0x1c043e14, 0x1c0c0404, 0x1c0c0414, 0x1c0c1404, 0x1c0c1c0c,
    0x1c0c2424, 0x1c0c2434, 0x1c14040c, 0x1c14041c, 0x1c140c04, 0x1c14142c, 0x1c142c14, 0x1c143e14,
    0x1c1c0c0c, 0x1c1c1c1c, 0x1c241c04, 0x1c24243e, 0x1c243e14, 0x1c2c0404, 0x1c2c0434, 0x1c2c1414,
    0x1c2c2c2c, 0x1c340c24, 0x1c341c34, 0x1c34341c, 0x1c3e1c1c, 0x1c3e3404, 0x24040424, 0x24040c3e,
    0x24041c2c, 0x24041c3e, 0x24042c1c, 0x24042c3e, 0x240c3e24, 0x24141404, 0x24141c3e, 0x24142404,
    0x24143404, 0x24143434, 0x241c043e, 0x241c242c, 0x24240424, 0x24242c0c, 0x24243424, 0x242c142c,
    0x242c241c, 0x242c3e04, 0x243e042c, 0x243e0c04, 0x243e0c14, 0x243e1c04, 0x2c040c14, 0x2c04240c,
    0x2c043e04, 0x2c0c0404, 0x2c0c0434, 0x2c0c1434, 0x2c0c2c2c, 0x2c140c24, 0x2c141c14, 0x2c143e14,
    0x2c1c0414, 0x2c1c2c1c, 0x2c240c04, 0x2c24141c, 0x2c24143e, 0x2c243e14, 0x2c2c0414, 0x2c2c1c0c,
    0x2c342c04, 0x2c3e1424, 0x2c3e2414, 0x34041424, 0x34042424, 0x34042434, 0x34043424, 0x340c140c,
    0x340c340c, 0x34140c3e, 0x34143424, 0x341c1c04, 0x341c1c34, 0x34242424, 0x342c042c, 0x342c2c14,
    0x34341c1c, 0x343e041c, 0x343e140c, 0x3e04041c, 0x3e04042c, 0x3e04043e, 0x3e040c04, 0x3e041c14,
    0x3e042c14, 0x3e0c1434, 0x3e0c2404, 0x3e140c14, 0x3e14242c, 0x3e142c14, 0x3e1c0404, 0x3e1c0c2c,
    0x3e1c1c1c, 0x3e1c3404, 0x3e24140c, 0x3e24240c, 0x3e2c0404, 0x3e2c0414, 0x3e2c1424, 0x3e341c04,
GGML_TABLE_END()

GGML_TABLE_BEGIN(uint32_t, iq3s_grid, 512)
    0x01010101, 0x01010103, 0x01010105, 0x0101010b, 0x0101010f, 0x01010301, 0x01010303, 0x01010305,
    0x01010309, 0x0101030d, 0x01010501, 0x01010503, 0x0101050b, 0x01010707, 0x01010901, 0x01010905,
    0x0101090b, 0x0101090f, 0x01010b03, 0x01010b07, 0x01010d01, 0x01010d05, 0x01010f03, 0x01010f09,
    0x01010f0f, 0x01030101, 0x01030103, 0x01030105, 0x01030109, 0x01030301, 0x01030303, 0x0103030b,
    0x01030501, 0x01030507, 0x0103050f, 0x01030703, 0x0103070b, 0x01030909, 0x01030d03, 0x01030d0b,
    0x01030f05, 0x01050101, 0x01050103, 0x0105010b, 0x0105010f, 0x01050301, 0x01050307, 0x0105030d,
    0x01050503, 0x0105050b, 0x01050701, 0x01050709, 0x01050905, 0x0105090b, 0x0105090f, 0x01050b03,
    0x01050b07, 0x01050f01, 0x01050f07, 0x01070107, 0x01070303, 0x0107030b, 0x01070501, 0x01070505,
    0x01070703, 0x01070707, 0x0107070d, 0x01070909, 0x01070b01, 0x01070b05, 0x01070d0f, 0x01070f03,
    0x01070f0b, 0x01090101, 0x01090307, 0x0109030f, 0x01090503, 0x01090509, 0x01090705, 0x01090901,
    0x01090907, 0x01090b03, 0x01090f01, 0x010b0105, 0x010b0109, 0x010b0501, 0x010b0505, 0x010b050d,
    0x010b0707, 0x010b0903, 0x010b090b, 0x010b090f, 0x010b0d0d, 0x010b0f07, 0x010d010d, 0x010d0303,
    0x010d0307, 0x010d0703, 0x010d0b05, 0x010d0f03, 0x010f0101, 0x010f0105, 0x010f0109, 0x010f0501,
    0x010f0505, 0x010f050d, 0x010f0707, 0x010f0b01, 0x010f0b09, 0x03010101, 0x03010103, 0x03010105,
    0x03010109, 0x03010301, 0x03010303, 0x03010307, 0x0301030b, 0x0301030f, 0x03010501, 0x03010505,
    0x03010703, 0x03010709, 0x0301070d, 0x03010b09, 0x03010b0d, 0x03010d03, 0x03010f05, 0x03030101,
    0x03030103, 0x03030107, 0x0303010d, 0x03030301, 0x03030309, 0x03030503, 0x03030701, 0x03030707,
    0x03030903, 0x03030b01, 0x03030b05, 0x03030f01, 0x03030f0d, 0x03050101, 0x03050305, 0x0305030b,
    0x0305030f, 0x03050501, 0x03050509, 0x03050705, 0x03050901, 0x03050907, 0x03050b0b, 0x03050d01,
    0x03050f05, 0x03070103, 0x03070109, 0x0307010f, 0x03070301, 0x03070307, 0x03070503, 0x0307050f,
    0x03070701, 0x03070709, 0x03070903, 0x03070d05, 0x03070f01, 0x03090107, 0x0309010b, 0x03090305,
    0x03090309, 0x03090703, 0x03090707, 0x03090905, 0x0309090d, 0x03090b01, 0x03090b09, 0x030b0103,
    0x030b0301, 0x030b0307, 0x030b0503, 0x030b0701, 0x030b0705, 0x030b0b03, 0x030d0501, 0x030d0509,
    0x030d050f, 0x030d0909, 0x030d090d, 0x030f0103, 0x030f0107, 0x030f0301, 0x030f0305, 0x030f0503,
    0x030f070b, 0x030f0903, 0x030f0d05, 0x030f0f01, 0x05010101, 0x05010103, 0x05010107, 0x0501010b,
    0x0501010f, 0x05010301, 0x05010305, 0x05010309, 0x0501030d, 0x05010503, 0x05010507, 0x0501050f,
    0x05010701, 0x05010705, 0x05010903, 0x05010907, 0x0501090b, 0x05010b01, 0x05010b05, 0x05010d0f,
    0x05010f01, 0x05010f07, 0x05010f0b, 0x05030101, 0x05030105, 0x05030301, 0x05030307, 0x0503030f,
    0x05030505, 0x0503050b, 0x05030703, 0x05030709, 0x05030905, 0x05030b03, 0x05050103, 0x05050109,
    0x0505010f, 0x05050503, 0x05050507, 0x05050701, 0x0505070f, 0x05050903, 0x05050b07, 0x05050b0f,
    0x05050f03, 0x05050f09, 0x05070101, 0x05070105, 0x0507010b, 0x05070303, 0x05070505, 0x05070509,
    0x05070703, 0x05070707, 0x05070905, 0x05070b01, 0x05070d0d, 0x05090103, 0x0509010f, 0x05090501,
    0x05090507, 0x05090705, 0x0509070b, 0x05090903, 0x05090f05, 0x05090f0b, 0x050b0109, 0x050b0303,
    0x050b0505, 0x050b070f, 0x050b0901, 0x050b0b07, 0x050b0f01, 0x050d0101, 0x050d0105, 0x050d010f,
    0x050d0503, 0x050d0b0b, 0x050d0d03, 0x050f010b, 0x050f0303, 0x050f050d, 0x050f0701, 0x050f0907,
    0x050f0b01, 0x07010105, 0x07010303, 0x07010307, 0x0701030b, 0x0701030f, 0x07010505, 0x07010703,
    0x07010707, 0x0701070b, 0x07010905, 0x07010909, 0x0701090f, 0x07010b03, 0x07010d07, 0x07010f03,
    0x07030103, 0x07030107, 0x0703010b, 0x07030309, 0x07030503, 0x07030507, 0x07030901, 0x07030d01,
    0x07030f05, 0x07030f0d, 0x07050101, 0x07050305, 0x07050501, 0x07050705, 0x07050709, 0x07050b01,
    0x07070103, 0x07070301, 0x07070309, 0x07070503, 0x07070507, 0x0707050f, 0x07070701, 0x07070903,
    0x07070907, 0x0707090f, 0x07070b0b, 0x07070f07, 0x07090107, 0x07090303, 0x0709030d, 0x07090505,
    0x07090703, 0x07090b05, 0x07090d01, 0x07090d09, 0x070b0103, 0x070b0301, 0x070b0305, 0x070b050b,
    0x070b0705, 0x070b0909, 0x070b0b0d, 0x070b0f07, 0x070d030d, 0x070d0903, 0x070f0103, 0x070f0107,
    0x070f0501, 0x070f0505, 0x070f070b, 0x09010101, 0x09010109, 0x09010305, 0x09010501, 0x09010509,
    0x0901050f, 0x09010705, 0x09010903, 0x09010b01, 0x09010f01, 0x09030105, 0x0903010f, 0x09030303,
    0x09030307, 0x09030505, 0x09030701, 0x0903070b, 0x09030907, 0x09030b03, 0x09030b0b, 0x09050103,
    0x09050107, 0x09050301, 0x0905030b, 0x09050503, 0x09050707, 0x09050901, 0x09050b0f, 0x09050d05,
    0x09050f01, 0x09070109, 0x09070303, 0x09070307, 0x09070501, 0x09070505, 0x09070703, 0x0907070b,
    0x09090101, 0x09090105, 0x09090509, 0x0909070f, 0x09090901, 0x09090f03, 0x090b010b, 0x090b010f,
    0x090b0503, 0x090b0d05, 0x090d0307, 0x090d0709, 0x090d0d01, 0x090f0301, 0x090f030b, 0x090f0701,
    0x090f0907, 0x090f0b03, 0x0b010105, 0x0b010301, 0x0b010309, 0x0b010505, 0x0b010901, 0x0b010909,
    0x0b01090f, 0x0b010b05, 0x0b010d0d, 0x0b010f09, 0x0b030103, 0x0b030107, 0x0b03010b, 0x0b030305,
    0x0b030503, 0x0b030705, 0x0b030f05, 0x0b050101, 0x0b050303, 0x0b050507, 0x0b050701, 0x0b05070d,
    0x0b050b07, 0x0b070105, 0x0b07010f, 0x0b070301, 0x0b07050f, 0x0b070909, 0x0b070b03, 0x0b070d0b,
    0x0b070f07, 0x0b090103, 0x0b090109, 0x0b090501, 0x0b090705, 0x0b09090d, 0x0b0b0305, 0x0b0b050d,
    0x0b0b0b03, 0x0b0b0b07, 0x0b0d0905, 0x0b0f0105, 0x0b0f0109, 0x0b0f0505, 0x0d010303, 0x0d010307,
    0x0d01030b, 0x0d010703, 0x0d010707, 0x0d010d01, 0x0d030101, 0x0d030501, 0x0d03050f, 0x0d030d09,
    0x0d050305, 0x0d050709, 0x0d050905, 0x0d050b0b, 0x0d050d05, 0x0d050f01, 0x0d070101, 0x0d070309,
    0x0d070503, 0x0d070901, 0x0d09050b, 0x0d090907, 0x0d090d05, 0x0d0b0101, 0x0d0b0107, 0x0d0b0709,
    0x0d0b0d01, 0x0d0d010b, 0x0d0d0901, 0x0d0f0303, 0x0d0f0307, 0x0f010101, 0x0f010109, 0x0f01010f,
    0x0f010501, 0x0f010505, 0x0f01070d, 0x0f010901, 0x0f010b09, 0x0f010d05, 0x0f030105, 0x0f030303,
    0x0f030509, 0x0f030907, 0x0f03090b, 0x0f050103, 0x0f050109, 0x0f050301, 0x0f05030d, 0x0f050503,
    0x0f050701, 0x0f050b03, 0x0f070105, 0x0f070705, 0x0f07070b, 0x0f070b07, 0x0f090103, 0x0f09010b,
    0x0f090307, 0x0f090501, 0x0f090b01, 0x0f0b0505, 0x0f0b0905, 0x0f0d0105, 0x0f0d0703, 0x0f0f0101,
GGML_TABLE_END()

#define NGRID_IQ1S 2048
#define IQ1S_DELTA 0.125f
#define IQ1M_DELTA 0.125f
#if defined(GGML_COMMON_IMPL_C)
GGML_TABLE_BEGIN(uint64_t, iq1s_grid, NGRID_IQ1S)
    0xffffffffffffffff, 0xffffffffffffff01, 0xffffffffffff0000, 0xffffffffffff01ff,
    0xffffffffffff0101, 0xffffffffff00ff00, 0xffffffffff000000, 0xffffffffff01ffff,
    0xffffffffff01ff01, 0xffffffffff0101ff, 0xffffffffff010101, 0xffffffff00ff0000,
    0xffffffff0000ff00, 0xffffffff000000ff, 0xffffffff00000001, 0xffffffff00010000,
    0xffffffff01ffffff, 0xffffffff01ffff01, 0xffffffff01ff01ff, 0xffffffff01ff0101,
    0xffffffff01000000, 0xffffffff0101ffff, 0xffffffff0101ff01, 0xffffffff010101ff,
    0xffffffff01010101, 0xffffff00ffff00ff, 0xffffff00ffff0000, 0xffffff00ff00ff00,
    0xffffff00ff0000ff, 0xffffff00ff000001, 0xffffff00ff000100, 0xffffff00ff000101,
    0xffffff00ff010000, 0xffffff0000ffff00, 0xffffff0000ff0001, 0xffffff0000ff0100,
    0xffffff000000ff01, 0xffffff0000000000, 0xffffff0000000101, 0xffffff000001ff00,
    0xffffff00000100ff, 0xffffff0000010001, 0xffffff00000101ff, 0xffffff0001ff0000,
    0xffffff000100ff00, 0xffffff00010000ff, 0xffffff0001000001, 0xffffff0001010000,
    0xffffff01ffffffff, 0xffffff01ffffff01, 0xffffff01ffff01ff, 0xffffff01ffff0101,
    0xffffff01ff000000, 0xffffff01ff01ffff, 0xffffff01ff01ff01, 0xffffff01ff0101ff,
    0xffffff01ff010101, 0xffffff0100ff0000, 0xffffff010000ff00, 0xffffff0100000100,
    0xffffff01000100ff, 0xffffff0100010100, 0xffffff0101ffffff, 0xffffff0101ffff01,
    0xffffff0101ff01ff, 0xffffff0101ff0101, 0xffffff010100ff00, 0xffffff0101000000,
    0xffffff0101000100, 0xffffff010101ffff, 0xffffff010101ff01, 0xffffff01010101ff,
    0xffffff0101010101, 0xffff00ffff00ff00, 0xffff00ffff0000ff, 0xffff00ffff000001,
    0xffff00ffff010000, 0xffff00ff00ffff00, 0xffff00ff00ff0100, 0xffff00ff00000000,
    0xffff00ff00000101, 0xffff00ff000100ff, 0xffff00ff00010000, 0xffff00ff0100ff00,
    0xffff00ff01000100, 0xffff00ff01010000, 0xffff0000ffffff00, 0xffff0000ffff00ff,
    0xffff0000ffff0000, 0xffff0000ffff0001, 0xffff0000ff000000, 0xffff0000ff0001ff,
    0xffff0000ff000101, 0xffff0000ff010100, 0xffff000000ffffff, 0xffff000000ff0000,
    0xffff000000ff0101, 0xffff00000000ffff, 0xffff00000000ff00, 0xffff0000000000ff,
    0xffff000000000000, 0xffff000000000001, 0xffff000000000100, 0xffff00000001ffff,
    0xffff00000001ff01, 0xffff000000010000, 0xffff0000000101ff, 0xffff000000010101,
    0xffff000001ffff00, 0xffff00000100ff00, 0xffff000001000000, 0xffff0000010001ff,
    0xffff000001000101, 0xffff00000101ff00, 0xffff0000010100ff, 0xffff000001010000,
    0xffff000001010001, 0xffff000001010100, 0xffff0001ff0000ff, 0xffff0001ff000100,
    0xffff000100ffff00, 0xffff000100ff00ff, 0xffff00010000ffff, 0xffff00010000ff01,
    0xffff000100000000, 0xffff0001000001ff, 0xffff00010001ffff, 0xffff00010001ff00,
    0xffff000100010001, 0xffff000100010100, 0xffff000101ff0000, 0xffff00010100ff00,
    0xffff0001010000ff, 0xffff000101000100, 0xffff01ffffffffff, 0xffff01ffffffff01,
    0xffff01ffffff01ff, 0xffff01ffffff0101, 0xffff01ffff000000, 0xffff01ffff01ffff,
    0xffff01ffff01ff01, 0xffff01ffff0101ff, 0xffff01ffff010101, 0xffff01ff00ff0000,
    0xffff01ff0000ff00, 0xffff01ff00000001, 0xffff01ff00010000, 0xffff01ff01ffffff,
    0xffff01ff01ffff01, 0xffff01ff01ff01ff, 0xffff01ff01ff0101, 0xffff01ff01000000,
    0xffff01ff0101ffff, 0xffff01ff0101ff01, 0xffff01ff010101ff, 0xffff01ff01010101,
    0xffff0100ffff0000, 0xffff0100ff00ff00, 0xffff0100ff0000ff, 0xffff0100ff000100,
    0xffff0100ff0100ff, 0xffff0100ff010000, 0xffff010000ffff00, 0xffff01000000ffff,
    0xffff01000000ff00, 0xffff010000000000, 0xffff01000001ff00, 0xffff0100000100ff,
    0xffff010000010100, 0xffff01000100ff00, 0xffff0100010000ff, 0xffff010001000001,
    0xffff010001000100, 0xffff010001010000, 0xffff0101ffffffff, 0xffff0101ffffff01,
    0xffff0101ffff01ff, 0xffff0101ffff0101, 0xffff0101ff000000, 0xffff0101ff01ffff,
    0xffff0101ff01ff01, 0xffff0101ff0101ff, 0xffff0101ff010101, 0xffff010100ff0000,
    0xffff01010000ff00, 0xffff010100000100, 0xffff01010001ff00, 0xffff010100010000,
    0xffff010101ffffff, 0xffff010101ffff01, 0xffff010101ff0000, 0xffff010101ff01ff,
    0xffff010101ff0101, 0xffff010101000000, 0xffff01010101ffff, 0xffff01010101ff01,
    0xffff0101010101ff, 0xffff010101010101, 0xff00ffffff00ffff, 0xff00ffffff00ff00,
    0xff00ffffff0000ff, 0xff00ffffff000100, 0xff00ffffff0100ff, 0xff00ffffff010000,
    0xff00ffff00ffff00, 0xff00ffff00ff00ff, 0xff00ffff0000ffff, 0xff00ffff00000000,
    0xff00ffff000001ff, 0xff00ffff0001ff00, 0xff00ffff000100ff, 0xff00ffff00010000,
    0xff00ffff00010100, 0xff00ffff0100ff00, 0xff00ffff010000ff, 0xff00ffff01000001,
    0xff00ffff0101ff00, 0xff00ffff01010000, 0xff00ff00ffffff00, 0xff00ff00ffff00ff,
    0xff00ff00ffff0001, 0xff00ff00ffff0100, 0xff00ff00ff00ffff, 0xff00ff00ff00ff01,
    0xff00ff00ff000000, 0xff00ff00ff0001ff, 0xff00ff00ff01ff00, 0xff00ff00ff0100ff,
    0xff00ff00ff010100, 0xff00ff0000ff0000, 0xff00ff0000ff0101, 0xff00ff000000ffff,
    0xff00ff000000ff00, 0xff00ff000000ff01, 0xff00ff00000000ff, 0xff00ff0000000000,
    0xff00ff0000000001, 0xff00ff0000000100, 0xff00ff000001ffff, 0xff00ff0000010000,
    0xff00ff0001ff00ff, 0xff00ff000100ff01, 0xff00ff0001000000, 0xff00ff000101ff00,
    0xff00ff00010100ff, 0xff00ff01ff00ff00, 0xff00ff01ff0000ff, 0xff00ff01ff000001,
    0xff00ff01ff010000, 0xff00ff0100ffffff, 0xff00ff0100ff0001, 0xff00ff0100ff0100,
    0xff00ff010000ff01, 0xff00ff0100000000, 0xff00ff01000001ff, 0xff00ff0100000101,
    0xff00ff01000100ff, 0xff00ff0100010001, 0xff00ff0101ff0000, 0xff00ff010100ff00,
    0xff00ff01010000ff, 0xff00ff0101000001, 0xff00ff0101010000, 0xff0000ffffffff00,
    0xff0000ffffff0001, 0xff0000ffffff0100, 0xff0000ffff0000ff, 0xff0000ffff000000,
    0xff0000ffff0001ff, 0xff0000ffff000100, 0xff0000ffff01ff00, 0xff0000ffff010001,
    0xff0000ff00ffff00, 0xff0000ff00ff0000, 0xff0000ff00ff0001, 0xff0000ff00ff01ff,
    0xff0000ff00ff0101, 0xff0000ff0000ff00, 0xff0000ff000000ff, 0xff0000ff00000000,
    0xff0000ff00000001, 0xff0000ff00000100, 0xff0000ff0001ff01, 0xff0000ff00010000,
    0xff0000ff000101ff, 0xff0000ff01ff00ff, 0xff0000ff01ff0100, 0xff0000ff0100ffff,
    0xff0000ff010000ff, 0xff0000ff01000000, 0xff0000ff010001ff, 0xff0000ff01000100,
    0xff0000ff01000101, 0xff0000ff0101ff00, 0xff0000ff010100ff, 0xff0000ff01010000,
    0xff0000ff01010100, 0xff000000ffffff01, 0xff000000ffff0000, 0xff000000ffff0101,
    0xff000000ff00ff00, 0xff000000ff0000ff, 0xff000000ff000000, 0xff000000ff000001,
    0xff000000ff000100, 0xff000000ff01ffff, 0xff000000ff01ff01, 0xff000000ff010000,
    0xff000000ff0101ff, 0xff000000ff010101, 0xff00000000ffff00, 0xff00000000ff00ff,
    0xff00000000ff0000, 0xff00000000ff0001, 0xff0000000000ff00, 0xff0000000000ff01,
    0xff000000000000ff, 0xff00000000000000, 0xff00000000000001, 0xff00000000000100,
    0xff00000000000101, 0xff0000000001ff00, 0xff000000000100ff, 0xff00000000010000,
    0xff00000000010001, 0xff00000000010100, 0xff00000001ffffff, 0xff00000001ffff01,
    0xff00000001ff00ff, 0xff00000001ff0000, 0xff00000001ff01ff, 0xff00000001ff0101,
    0xff0000000100ffff, 0xff0000000100ff00, 0xff000000010000ff, 0xff00000001000000,
    0xff00000001000001, 0xff00000001000100, 0xff00000001000101, 0xff0000000101ffff,
    0xff0000000101ff01, 0xff00000001010000, 0xff000001ffffff00, 0xff000001ffff00ff,
    0xff000001ffff0000, 0xff000001ffff0001, 0xff000001ff000000, 0xff000001ff000001,
    0xff000001ff0001ff, 0xff000001ff000101, 0xff000001ff01ff00, 0xff000001ff010001,
    0xff00000100ffffff, 0xff00000100ffff01, 0xff00000100ff00ff, 0xff00000100ff0000,
    0xff00000100ff01ff, 0xff00000100ff0101, 0xff0000010000ff00, 0xff00000100000000,
    0xff00000100000001, 0xff000001000001ff, 0xff00000100000100, 0xff0000010001ff00,
    0xff000001000100ff, 0xff00000100010000, 0xff000001000101ff, 0xff00000100010100,
    0xff00000100010101, 0xff00000101ff0001, 0xff00000101ff0101, 0xff0000010100ff01,
    0xff00000101000000, 0xff000001010100ff, 0xff00000101010100, 0xff0001ffff00ff00,
    0xff0001ffff000001, 0xff0001ffff010000, 0xff0001ff00ffff00, 0xff0001ff00ff00ff,
    0xff0001ff00ff0001, 0xff0001ff00ff0100, 0xff0001ff0000ffff, 0xff0001ff00000000,
    0xff0001ff000001ff, 0xff0001ff00000101, 0xff0001ff0001ffff, 0xff0001ff0001ff00,
    0xff0001ff000100ff, 0xff0001ff00010001, 0xff0001ff00010100, 0xff0001ff01ff0000,
    0xff0001ff0100ff00, 0xff0001ff010000ff, 0xff0001ff01010000, 0xff000100ff00ffff,
    0xff000100ff00ff01, 0xff000100ff000000, 0xff000100ff000101, 0xff000100ff01ff00,
    0xff000100ff010000, 0xff00010000ffff01, 0xff00010000ff00ff, 0xff00010000ff0000,
    0xff00010000ff01ff, 0xff0001000000ff00, 0xff000100000000ff, 0xff00010000000000,
    0xff00010000000001, 0xff00010000000100, 0xff00010000000101, 0xff0001000001ffff,
    0xff00010000010000, 0xff00010000010101, 0xff00010001ff0100, 0xff0001000100ff00,
    0xff0001000100ff01, 0xff00010001000000, 0xff000100010001ff, 0xff0001000101ff00,
    0xff00010001010001, 0xff00010001010100, 0xff000101ffff0100, 0xff000101ff000001,
    0xff000101ff0100ff, 0xff000101ff010001, 0xff00010100ff00ff, 0xff00010100ff0001,
    0xff00010100ff0100, 0xff0001010000ffff, 0xff0001010000ff01, 0xff00010100000000,
    0xff000101000001ff, 0xff0001010001ff00, 0xff00010100010001, 0xff00010100010100,
    0xff00010101ff0000, 0xff0001010100ff00, 0xff00010101000001, 0xff00010101000101,
    0xff01ffffffffffff, 0xff01ffffffffff01, 0xff01ffffffff01ff, 0xff01ffffffff0101,
    0xff01ffffff000000, 0xff01ffffff01ffff, 0xff01ffffff01ff01, 0xff01ffffff010000,
    0xff01ffffff0101ff, 0xff01ffffff010101, 0xff01ffff00ff0000, 0xff01ffff0000ff00,
    0xff01ffff00000100, 0xff01ffff0001ff00, 0xff01ffff00010000, 0xff01ffff01ffffff,
    0xff01ffff01ffff01, 0xff01ffff01ff01ff, 0xff01ffff01ff0101, 0xff01ffff01000000,
    0xff01ffff0101ffff, 0xff01ffff0101ff01, 0xff01ffff01010000, 0xff01ffff010101ff,
    0xff01ffff01010101, 0xff01ff00ffff0000, 0xff01ff00ff00ff00, 0xff01ff00ff0000ff,
    0xff01ff00ff000100, 0xff01ff00ff010000, 0xff01ff0000ffff01, 0xff01ff0000ff00ff,
    0xff01ff0000ff0100, 0xff01ff0000000000, 0xff01ff00000001ff, 0xff01ff0000000101,
    0xff01ff000001ff00, 0xff01ff00000100ff, 0xff01ff0000010000, 0xff01ff0000010001,
    0xff01ff0001ff0000, 0xff01ff000100ffff, 0xff01ff0001000001, 0xff01ff0001000100,
    0xff01ff0001010000, 0xff01ff01ffffff00, 0xff01ff01ffff01ff, 0xff01ff01ffff0101,
    0xff01ff01ff00ff00, 0xff01ff01ff000000, 0xff01ff01ff01ffff, 0xff01ff01ff01ff01,
    0xff01ff01ff0101ff, 0xff01ff01ff010101, 0xff01ff0100ff0000, 0xff01ff010000ff00,
    0xff01ff0100000001, 0xff01ff0100000100, 0xff01ff0100010000, 0xff01ff0101ffff00,
    0xff01ff0101ff01ff, 0xff01ff0101ff0101, 0xff01ff010100ff00, 0xff01ff0101000000,
    0xff01ff010101ffff, 0xff01ff010101ff01, 0xff01ff01010101ff, 0xff01ff0101010101,
    0xff0100ffffff0000, 0xff0100ffff0000ff, 0xff0100ffff000001, 0xff0100ffff000100,
    0xff0100ffff010000, 0xff0100ff00ff00ff, 0xff0100ff00ff0000, 0xff0100ff00ff0001,
    0xff0100ff00ff0100, 0xff0100ff0000ff01, 0xff0100ff00000000, 0xff0100ff000001ff,
    0xff0100ff00000101, 0xff0100ff00010001, 0xff0100ff01ff0000, 0xff0100ff0100ff00,
    0xff0100ff010000ff, 0xff0100ff01000100, 0xff0100ff0101ff00, 0xff0100ff01010000,
    0xff010000ffff0100, 0xff010000ff000000, 0xff010000ff01ff00, 0xff010000ff010100,
    0xff01000000ffffff, 0xff01000000ff0000, 0xff01000000ff01ff, 0xff0100000000ff00,
    0xff010000000000ff, 0xff01000000000000, 0xff01000000000100, 0xff0100000001ff01,
    0xff01000000010000, 0xff010000000101ff, 0xff01000001ff0100, 0xff0100000100ffff,
    0xff010000010000ff, 0xff01000001000000, 0xff010000010001ff, 0xff01000001000101,
    0xff0100000101ff00, 0xff010000010100ff, 0xff01000001010001, 0xff01000001010100,
    0xff010001ffff0000, 0xff010001ff00ffff, 0xff010001ff00ff01, 0xff010001ff000100,
    0xff010001ff010000, 0xff01000100ffff00, 0xff01000100ff0100, 0xff01000100000000,
    0xff0100010001ffff, 0xff0100010001ff00, 0xff01000100010100, 0xff01000101ff00ff,
    0xff01000101ff0001, 0xff0100010100ffff, 0xff01000101000101, 0xff0101ffffffffff,
    0xff0101ffffffff01, 0xff0101ffffff01ff, 0xff0101ffffff0101, 0xff0101ffff000000,
    0xff0101ffff01ffff, 0xff0101ffff01ff01, 0xff0101ffff0101ff, 0xff0101ffff010101,
    0xff0101ff00ff0000, 0xff0101ff0000ff00, 0xff0101ff000000ff, 0xff0101ff00010000,
    0xff0101ff01ffffff, 0xff0101ff01ffff01, 0xff0101ff01ff01ff, 0xff0101ff01ff0101,
    0xff0101ff0101ffff, 0xff0101ff0101ff01, 0xff0101ff010101ff, 0xff0101ff01010101,
    0xff010100ffff0100, 0xff010100ff00ff00, 0xff010100ff0000ff, 0xff010100ff000100,
    0xff010100ff010000, 0xff01010000ff0001, 0xff01010000ff0100, 0xff0101000000ff01,
    0xff01010000000000, 0xff0101000001ff00, 0xff010100000100ff, 0xff01010000010001,
    0xff01010000010100, 0xff01010001ff0000, 0xff0101000100ffff, 0xff01010001000001,
    0xff01010001000100, 0xff010100010100ff, 0xff01010001010000, 0xff010101ffffffff,
    0xff010101ffffff01, 0xff010101ffff01ff, 0xff010101ffff0101, 0xff010101ff01ffff,
    0xff010101ff01ff01, 0xff010101ff0101ff, 0xff010101ff010101, 0xff01010100ff0000,
    0xff0101010000ff00, 0xff01010100000001, 0xff01010100000100, 0xff01010100010000,
    0xff01010101ffffff, 0xff01010101ffff01, 0xff01010101ff01ff, 0xff01010101ff0101,
    0xff01010101000000, 0xff0101010101ffff, 0xff0101010101ff01, 0xff010101010101ff,
    0xff01010101010101, 0x00ffffffffff0000, 0x00ffffffff00ff00, 0x00ffffffff000001,
    0x00ffffffff010000, 0x00ffffff00ff0100, 0x00ffffff0000ff01, 0x00ffffff00000000,
    0x00ffffff000001ff, 0x00ffffff00000101, 0x00ffffff0001ff00, 0x00ffffff000100ff,
    0x00ffffff00010001, 0x00ffffff010000ff, 0x00ffffff01000100, 0x00ffffff0101ff00,
    0x00ffffff01010001, 0x00ffff00ffffffff, 0x00ffff00ffffff00, 0x00ffff00ffff00ff,
    0x00ffff00ffff0001, 0x00ffff00ffff0100, 0x00ffff00ff00ff01, 0x00ffff00ff000000,
    0x00ffff00ff000001, 0x00ffff00ff0001ff, 0x00ffff00ff000101, 0x00ffff00ff01ff00,
    0x00ffff00ff010001, 0x00ffff00ff010100, 0x00ffff0000ff0000, 0x00ffff0000ff01ff,
    0x00ffff0000ff0101, 0x00ffff000000ff00, 0x00ffff00000000ff, 0x00ffff0000000000,
    0x00ffff0000000001, 0x00ffff0000000100, 0x00ffff0000000101, 0x00ffff0000010000,
    0x00ffff00000101ff, 0x00ffff0000010101, 0x00ffff0001ffff00, 0x00ffff0001ff00ff,
    0x00ffff0001ff0001, 0x00ffff000100ffff, 0x00ffff000100ff01, 0x00ffff0001000000,
    0x00ffff000101ffff, 0x00ffff000101ff00, 0x00ffff000101ff01, 0x00ffff01ffff0000,
    0x00ffff01ff00ff00, 0x00ffff01ff0000ff, 0x00ffff01ff000001, 0x00ffff01ff010000,
    0x00ffff0100ffff00, 0x00ffff010000ff01, 0x00ffff0100000000, 0x00ffff0100000101,
    0x00ffff01000100ff, 0x00ffff0100010100, 0x00ffff0101ff0100, 0x00ffff01010000ff,
    0x00ffff0101010000, 0x00ff00ffffffff00, 0x00ff00ffff000000, 0x00ff00ffff000100,
    0x00ff00ffff010100, 0x00ff00ff00ff0000, 0x00ff00ff00ff01ff, 0x00ff00ff00ff0101,
    0x00ff00ff0000ff00, 0x00ff00ff000000ff, 0x00ff00ff00000000, 0x00ff00ff00000001,
    0x00ff00ff0001ff00, 0x00ff00ff0001ff01, 0x00ff00ff00010000, 0x00ff00ff000101ff,
    0x00ff00ff00010101, 0x00ff00ff01ffff00, 0x00ff00ff01ff0001, 0x00ff00ff01ff0100,
    0x00ff00ff0100ffff, 0x00ff00ff0100ff01, 0x00ff00ff01000000, 0x00ff00ff0101ffff,
    0x00ff00ff0101ff00, 0x00ff00ff01010100, 0x00ff0000ffffff00, 0x00ff0000ffffff01,
    0x00ff0000ffff0000, 0x00ff0000ffff0101, 0x00ff0000ff00ff00, 0x00ff0000ff0000ff,
    0x00ff0000ff000000, 0x00ff0000ff000001, 0x00ff0000ff000100, 0x00ff0000ff01ffff,
    0x00ff0000ff010000, 0x00ff0000ff010101, 0x00ff000000ffff00, 0x00ff000000ff00ff,
    0x00ff000000ff0000, 0x00ff000000ff0001, 0x00ff000000ff0100, 0x00ff00000000ffff,
    0x00ff00000000ff00, 0x00ff0000000000ff, 0x00ff000000000000, 0x00ff000000000001,
    0x00ff0000000001ff, 0x00ff000000000100, 0x00ff00000001ff00, 0x00ff0000000100ff,
    0x00ff000000010000, 0x00ff000000010001, 0x00ff000000010100, 0x00ff000001ffff01,
    0x00ff000001ff00ff, 0x00ff000001ff0000, 0x00ff000001ff01ff, 0x00ff00000100ff00,
    0x00ff0000010000ff, 0x00ff000001000000, 0x00ff000001000001, 0x00ff000001000100,
    0x00ff000001000101, 0x00ff000001010000, 0x00ff0000010101ff, 0x00ff000001010101,
    0x00ff0001ffffff00, 0x00ff0001ffff0000, 0x00ff0001ffff0100, 0x00ff0001ff0000ff,
    0x00ff0001ff000000, 0x00ff0001ff0001ff, 0x00ff0001ff000101, 0x00ff0001ff01ff00,
    0x00ff0001ff0100ff, 0x00ff0001ff010100, 0x00ff000100ffffff, 0x00ff000100ffff01,
    0x00ff000100ff0000, 0x00ff000100ff01ff, 0x00ff00010000ffff, 0x00ff00010000ff00,
    0x00ff00010000ff01, 0x00ff000100000000, 0x00ff000100000001, 0x00ff000100000100,
    0x00ff00010001ff01, 0x00ff000100010000, 0x00ff0001000101ff, 0x00ff000101ffff00,
    0x00ff000101ff0000, 0x00ff000101ff0101, 0x00ff0001010000ff, 0x00ff000101000000,
    0x00ff00010101ff00, 0x00ff0001010100ff, 0x00ff000101010001, 0x00ff01ffffff0000,
    0x00ff01ffff00ff00, 0x00ff01ffff000000, 0x00ff01ffff000101, 0x00ff01ffff010000,
    0x00ff01ff00ffff01, 0x00ff01ff00ff0100, 0x00ff01ff0000ffff, 0x00ff01ff00000000,
    0x00ff01ff000001ff, 0x00ff01ff0001ff00, 0x00ff01ff000100ff, 0x00ff01ff00010001,
    0x00ff01ff00010100, 0x00ff01ff01ff0000, 0x00ff01ff0100ff00, 0x00ff01ff010000ff,
    0x00ff01ff01000001, 0x00ff01ff01000100, 0x00ff01ff01010000, 0x00ff0100ffffff00,
    0x00ff0100ffff0000, 0x00ff0100ffff0001, 0x00ff0100ffff0101, 0x00ff0100ff00ffff,
    0x00ff0100ff0000ff, 0x00ff0100ff000000, 0x00ff0100ff0001ff, 0x00ff0100ff01ff00,
    0x00ff0100ff0100ff, 0x00ff0100ff010001, 0x00ff010000ffffff, 0x00ff010000ff0000,
    0x00ff010000ff0101, 0x00ff01000000ff00, 0x00ff01000000ff01, 0x00ff0100000000ff,
    0x00ff010000000000, 0x00ff010000000001, 0x00ff010000000100, 0x00ff01000001ffff,
    0x00ff01000001ff01, 0x00ff010000010000, 0x00ff010000010001, 0x00ff010000010101,
    0x00ff010001ff0001, 0x00ff010001ff0100, 0x00ff01000100ff01, 0x00ff010001000000,
    0x00ff010001000001, 0x00ff0100010001ff, 0x00ff01000101ff00, 0x00ff0100010100ff,
    0x00ff010001010001, 0x00ff010001010100, 0x00ff0101ff000001, 0x00ff010100ff00ff,
    0x00ff010100ff0001, 0x00ff010100ff0100, 0x00ff010100000000, 0x00ff0101000001ff,
    0x00ff010100000101, 0x00ff0101000100ff, 0x00ff010100010100, 0x00ff0101010000ff,
    0x00ff010101010000, 0x0000ffffffffff00, 0x0000ffffffff00ff, 0x0000ffffffff0000,
    0x0000ffffffff0001, 0x0000ffffffff0100, 0x0000ffffff00ff01, 0x0000ffffff000000,
    0x0000ffffff000101, 0x0000ffffff01ff00, 0x0000ffffff0100ff, 0x0000ffffff010100,
    0x0000ffff00ffffff, 0x0000ffff00ff0000, 0x0000ffff00ff01ff, 0x0000ffff0000ff00,
    0x0000ffff000000ff, 0x0000ffff00000000, 0x0000ffff00000001, 0x0000ffff00000100,
    0x0000ffff00010000, 0x0000ffff000101ff, 0x0000ffff01ff0001, 0x0000ffff01ff0100,
    0x0000ffff01000000, 0x0000ffff010001ff, 0x0000ffff0101ffff, 0x0000ffff0101ff00,
    0x0000ffff01010001, 0x0000ffff01010100, 0x0000ff00ffff0000, 0x0000ff00ffff01ff,
    0x0000ff00ffff0100, 0x0000ff00ffff0101, 0x0000ff00ff00ff00, 0x0000ff00ff0000ff,
    0x0000ff00ff000000, 0x0000ff00ff000001, 0x0000ff00ff0001ff, 0x0000ff00ff000100,
    0x0000ff00ff01ffff, 0x0000ff00ff010000, 0x0000ff00ff010001, 0x0000ff00ff0101ff,
    0x0000ff00ff010101, 0x0000ff0000ffff00, 0x0000ff0000ff00ff, 0x0000ff0000ff0000,
    0x0000ff0000ff0001, 0x0000ff0000ff0100, 0x0000ff000000ffff, 0x0000ff000000ff00,
    0x0000ff000000ff01, 0x0000ff00000000ff, 0x0000ff0000000000, 0x0000ff0000000001,
    0x0000ff00000001ff, 0x0000ff0000000100, 0x0000ff0000000101, 0x0000ff000001ff00,
    0x0000ff00000100ff, 0x0000ff0000010000, 0x0000ff0000010001, 0x0000ff0000010100,
    0x0000ff0001ffff01, 0x0000ff0001ff0000, 0x0000ff000100ff00, 0x0000ff00010000ff,
    0x0000ff0001000000, 0x0000ff0001000001, 0x0000ff0001000100, 0x0000ff000101ffff,
    0x0000ff0001010000, 0x0000ff0001010101, 0x0000ff01ffffff00, 0x0000ff01ffff0001,
    0x0000ff01ff00ff01, 0x0000ff01ff000000, 0x0000ff01ff000101, 0x0000ff01ff01ff00,
    0x0000ff01ff0100ff, 0x0000ff0100ffff01, 0x0000ff0100ff0000, 0x0000ff0100ff0101,
    0x0000ff010000ff00, 0x0000ff01000000ff, 0x0000ff0100000000, 0x0000ff0100000001,
    0x0000ff0100000100, 0x0000ff010001ff01, 0x0000ff0100010000, 0x0000ff0101ff0000,
    0x0000ff010100ffff, 0x0000ff010100ff01, 0x0000ff0101000000, 0x0000ff0101000100,
    0x0000ff0101000101, 0x0000ff01010100ff, 0x000000ffffff00ff, 0x000000ffffff0000,
    0x000000ffff00ff00, 0x000000ffff0000ff, 0x000000ffff000000, 0x000000ffff000001,
    0x000000ffff0001ff, 0x000000ffff000100, 0x000000ffff01ff00, 0x000000ffff010000,
    0x000000ffff0101ff, 0x000000ffff010101, 0x000000ff00ffff00, 0x000000ff00ff00ff,
    0x000000ff00ff0000, 0x000000ff00ff0001, 0x000000ff00ff0100, 0x000000ff00ff0101,
    0x000000ff0000ffff, 0x000000ff0000ff00, 0x000000ff000000ff, 0x000000ff00000000,
    0x000000ff00000001, 0x000000ff000001ff, 0x000000ff00000100, 0x000000ff00000101,
    0x000000ff0001ff00, 0x000000ff0001ff01, 0x000000ff000100ff, 0x000000ff00010000,
    0x000000ff00010001, 0x000000ff00010100, 0x000000ff01ffffff, 0x000000ff01ff01ff,
    0x000000ff01ff0101, 0x000000ff0100ff00, 0x000000ff010000ff, 0x000000ff01000000,
    0x000000ff01000001, 0x000000ff01000100, 0x000000ff0101ff00, 0x000000ff010100ff,
    0x000000ff01010000, 0x000000ff01010101, 0x00000000ffffff00, 0x00000000ffffff01,
    0x00000000ffff00ff, 0x00000000ffff0000, 0x00000000ffff0001, 0x00000000ffff0100,
    0x00000000ff00ffff, 0x00000000ff00ff00, 0x00000000ff00ff01, 0x00000000ff0000ff,
    0x00000000ff000000, 0x00000000ff000001, 0x00000000ff000100, 0x00000000ff000101,
    0x00000000ff01ff00, 0x00000000ff0100ff, 0x00000000ff010000, 0x00000000ff010001,
    0x00000000ff010100, 0x0000000000ffffff, 0x0000000000ffff00, 0x0000000000ffff01,
    0x0000000000ff00ff, 0x0000000000ff0000, 0x0000000000ff0001, 0x0000000000ff01ff,
    0x0000000000ff0100, 0x000000000000ffff, 0x000000000000ff00, 0x000000000000ff01,
    0x00000000000000ff, 0x0000000000000000, 0x0000000000000001, 0x00000000000001ff,
    0x0000000000000100, 0x0000000000000101, 0x000000000001ffff, 0x000000000001ff00,
    0x00000000000100ff, 0x0000000000010000, 0x0000000000010001, 0x00000000000101ff,
    0x0000000000010100, 0x0000000000010101, 0x0000000001ffff00, 0x0000000001ff00ff,
    0x0000000001ff0000, 0x0000000001ff0100, 0x0000000001ff0101, 0x000000000100ffff,
    0x000000000100ff00, 0x00000000010000ff, 0x0000000001000000, 0x0000000001000001,
    0x00000000010001ff, 0x0000000001000100, 0x000000000101ff00, 0x00000000010100ff,
    0x0000000001010000, 0x0000000001010001, 0x0000000001010100, 0x00000001ffffffff,
    0x00000001ffffff00, 0x00000001ffffff01, 0x00000001ffff00ff, 0x00000001ffff0001,
    0x00000001ffff01ff, 0x00000001ffff0100, 0x00000001ff00ff00, 0x00000001ff0000ff,
    0x00000001ff000000, 0x00000001ff0001ff, 0x00000001ff000100, 0x00000001ff01ffff,
    0x00000001ff01ff00, 0x00000001ff01ff01, 0x00000001ff0100ff, 0x00000001ff010000,
    0x00000001ff010001, 0x00000001ff0101ff, 0x00000001ff010100, 0x0000000100ffff00,
    0x0000000100ff0000, 0x0000000100ff0001, 0x0000000100ff01ff, 0x0000000100ff0100,
    0x0000000100ff0101, 0x000000010000ffff, 0x000000010000ff00, 0x000000010000ff01,
    0x00000001000000ff, 0x0000000100000000, 0x0000000100000001, 0x00000001000001ff,
    0x0000000100000100, 0x0000000100000101, 0x000000010001ff00, 0x00000001000100ff,
    0x0000000100010000, 0x0000000100010100, 0x0000000101ffff01, 0x0000000101ff0000,
    0x0000000101ff0001, 0x0000000101ff01ff, 0x0000000101ff0100, 0x0000000101ff0101,
    0x000000010100ff00, 0x0000000101000000, 0x0000000101000101, 0x000000010101ff01,
    0x0000000101010000, 0x0000000101010001, 0x00000001010101ff, 0x0000000101010100,
    0x000001ffffff00ff, 0x000001ffffff0000, 0x000001ffffff0001, 0x000001ffffff0100,
    0x000001ffff00ffff, 0x000001ffff000000, 0x000001ffff0001ff, 0x000001ffff01ff00,
    0x000001ffff010101, 0x000001ff00ff0000, 0x000001ff00ff01ff, 0x000001ff00ff0101,
    0x000001ff0000ff00, 0x000001ff000000ff, 0x000001ff00000000, 0x000001ff00000001,
    0x000001ff000001ff, 0x000001ff00000100, 0x000001ff0001ffff, 0x000001ff0001ff01,
    0x000001ff000100ff, 0x000001ff00010000, 0x000001ff01ffff01, 0x000001ff01ff0100,
    0x000001ff0100ffff, 0x000001ff0100ff01, 0x000001ff01000000, 0x000001ff010001ff,
    0x000001ff0101ff00, 0x000001ff01010100, 0x00000100ffffff00, 0x00000100ffffff01,
    0x00000100ffff0000, 0x00000100ffff0101, 0x00000100ff00ff00, 0x00000100ff0000ff,
    0x00000100ff000000, 0x00000100ff000001, 0x00000100ff000100, 0x00000100ff010000,
    0x0000010000ffff00, 0x0000010000ff00ff, 0x0000010000ff0000, 0x0000010000ff0001,
    0x0000010000ff0100, 0x000001000000ffff, 0x000001000000ff00, 0x000001000000ff01,
    0x00000100000000ff, 0x0000010000000000, 0x0000010000000001, 0x00000100000001ff,
    0x0000010000000100, 0x0000010000000101, 0x000001000001ff00, 0x00000100000100ff,
    0x0000010000010000, 0x0000010000010001, 0x0000010000010100, 0x0000010001ffff00,
    0x0000010001ff0000, 0x0000010001ff0100, 0x000001000100ff00, 0x00000100010000ff,
    0x0000010001000000, 0x0000010001000001, 0x00000100010001ff, 0x0000010001000100,
    0x0000010001010000, 0x00000101ffff00ff, 0x00000101ffff01ff, 0x00000101ff000000,
    0x00000101ff000101, 0x00000101ff01ffff, 0x00000101ff010000, 0x00000101ff010001,
    0x00000101ff010100, 0x0000010100ff0000, 0x0000010100ff01ff, 0x0000010100ff0100,
    0x000001010000ff00, 0x0000010100000000, 0x0000010100000001, 0x00000101000001ff,
    0x0000010100000100, 0x000001010001ff01, 0x0000010100010000, 0x00000101000101ff,
    0x0000010100010101, 0x0000010101ffff00, 0x0000010101ff0101, 0x000001010100ff01,
    0x0000010101000000, 0x0000010101000001, 0x00000101010001ff, 0x0000010101000101,
    0x000001010101ff00, 0x0001ffffffff0000, 0x0001ffffff0000ff, 0x0001ffffff000001,
    0x0001ffffff000100, 0x0001ffffff010000, 0x0001ffff00ff00ff, 0x0001ffff0000ffff,
    0x0001ffff00000000, 0x0001ffff00000001, 0x0001ffff000001ff, 0x0001ffff00000101,
    0x0001ffff0001ff00, 0x0001ffff000100ff, 0x0001ffff00010001, 0x0001ffff00010100,
    0x0001ffff01ffff00, 0x0001ffff01000001, 0x0001ffff01010000, 0x0001ff00ffffff00,
    0x0001ff00ffff00ff, 0x0001ff00ffff0001, 0x0001ff00ffff0100, 0x0001ff00ff00ff01,
    0x0001ff00ff000000, 0x0001ff00ff01ff00, 0x0001ff00ff01ff01, 0x0001ff00ff010001,
    0x0001ff00ff010100, 0x0001ff0000ff0000, 0x0001ff0000ff0100, 0x0001ff000000ff00,
    0x0001ff0000000000, 0x0001ff0000000001, 0x0001ff0000000100, 0x0001ff0000010000,
    0x0001ff0000010001, 0x0001ff0000010101, 0x0001ff0001ff00ff, 0x0001ff0001ff0101,
    0x0001ff000100ff01, 0x0001ff0001000000, 0x0001ff000101ff00, 0x0001ff0001010001,
    0x0001ff0001010100, 0x0001ff01ff00ff00, 0x0001ff01ff000001, 0x0001ff01ff000100,
    0x0001ff0100ffffff, 0x0001ff0100ffff00, 0x0001ff0100ff0001, 0x0001ff0100000000,
    0x0001ff0100000001, 0x0001ff01000001ff, 0x0001ff010001ffff, 0x0001ff0101ff0000,
    0x0001ff010100ff00, 0x0001ff0101000001, 0x0001ff0101010000, 0x000100ffff00ff00,
    0x000100ffff00ff01, 0x000100ffff000000, 0x000100ffff000001, 0x000100ffff000101,
    0x000100ffff01ff00, 0x000100ffff010001, 0x000100ffff010100, 0x000100ff00ffffff,
    0x000100ff00ffff01, 0x000100ff00ff0000, 0x000100ff00ff01ff, 0x000100ff00ff0101,
    0x000100ff0000ff00, 0x000100ff000000ff, 0x000100ff00000000, 0x000100ff00000001,
    0x000100ff00000100, 0x000100ff00000101, 0x000100ff0001ffff, 0x000100ff0001ff01,
    0x000100ff00010000, 0x000100ff01ff00ff, 0x000100ff01ff0000, 0x000100ff01ff0100,
    0x000100ff0100ffff, 0x000100ff0100ff01, 0x000100ff010000ff, 0x000100ff01000000,
    0x000100ff01000001, 0x000100ff010001ff, 0x000100ff01000101, 0x000100ff0101ff00,
    0x000100ff010100ff, 0x000100ff01010100, 0x00010000ffff0000, 0x00010000ffff01ff,
    0x00010000ffff0101, 0x00010000ff00ff00, 0x00010000ff000000, 0x00010000ff000001,
    0x00010000ff000100, 0x0001000000ff00ff, 0x0001000000ff0000, 0x0001000000ff0001,
    0x0001000000ff0100, 0x000100000000ffff, 0x000100000000ff00, 0x00010000000000ff,
    0x0001000000000000, 0x0001000000000001, 0x0001000000000100, 0x000100000001ff00,
    0x00010000000100ff, 0x0001000000010000, 0x0001000000010001, 0x0001000000010100,
    0x0001000001ff0001, 0x0001000001ff0100, 0x0001000001ff0101, 0x000100000100ff00,
    0x0001000001000000, 0x0001000001000001, 0x0001000001000100, 0x0001000001000101,
    0x000100000101ff01, 0x0001000001010000, 0x0001000001010001, 0x00010000010101ff,
    0x00010001ffffff01, 0x00010001ffff0100, 0x00010001ff000000, 0x00010001ff01ffff,
    0x00010001ff010001, 0x00010001ff0101ff, 0x00010001ff010100, 0x0001000100ffffff,
    0x0001000100ff0000, 0x0001000100ff01ff, 0x0001000100ff0101, 0x000100010000ff00,
    0x00010001000000ff, 0x0001000100000000, 0x0001000100000001, 0x00010001000001ff,
    0x0001000100000101, 0x000100010001ffff, 0x0001000100010000, 0x00010001000101ff,
    0x0001000101ffffff, 0x0001000101ffff01, 0x0001000101ff0000, 0x0001000101ff0101,
    0x00010001010000ff, 0x0001000101000001, 0x00010001010001ff, 0x0001000101000100,
    0x000100010101ffff, 0x00010001010100ff, 0x0001000101010001, 0x0001000101010101,
    0x000101ffff000001, 0x000101ffff000100, 0x000101ffff010000, 0x000101ff00ffff00,
    0x000101ff0000ff01, 0x000101ff00000000, 0x000101ff00000101, 0x000101ff0001ff00,
    0x000101ff00010100, 0x000101ff01ff0000, 0x000101ff0100ff00, 0x000101ff010001ff,
    0x000101ff01010001, 0x00010100ffffff00, 0x00010100ffff00ff, 0x00010100ff00ffff,
    0x00010100ff000000, 0x00010100ff01ff00, 0x00010100ff0100ff, 0x00010100ff010001,
    0x00010100ff010100, 0x0001010000ffffff, 0x0001010000ffff00, 0x0001010000ff0000,
    0x0001010000ff0001, 0x0001010000ff01ff, 0x000101000000ff00, 0x00010100000000ff,
    0x0001010000000000, 0x0001010000000001, 0x0001010000000100, 0x000101000001ffff,
    0x0001010000010000, 0x0001010000010101, 0x0001010001ffff01, 0x0001010001ff00ff,
    0x0001010001ff0101, 0x0001010001000000, 0x000101000101ff00, 0x00010100010100ff,
    0x0001010001010000, 0x0001010001010100, 0x00010101ff00ff00, 0x00010101ff000001,
    0x00010101ff0001ff, 0x0001010100ffff00, 0x0001010100ff00ff, 0x0001010100ff0100,
    0x000101010000ffff, 0x0001010100000000, 0x00010101000001ff, 0x0001010100000101,
    0x00010101000100ff, 0x0001010100010000, 0x0001010100010100, 0x0001010101ff0001,
    0x00010101010000ff, 0x00010101010001ff, 0x0001010101000101, 0x0001010101010001,
    0x01ffffffffffffff, 0x01ffffffffffff01, 0x01ffffffffff01ff, 0x01ffffffffff0101,
    0x01ffffffff01ffff, 0x01ffffffff01ff01, 0x01ffffffff0101ff, 0x01ffffffff010101,
    0x01ffffff00ff0000, 0x01ffffff0000ffff, 0x01ffffff0000ff00, 0x01ffffff000000ff,
    0x01ffffff00000001, 0x01ffffff00000100, 0x01ffffff00010000, 0x01ffffff01ffffff,
    0x01ffffff01ffff01, 0x01ffffff01ff01ff, 0x01ffffff01ff0101, 0x01ffffff01000000,
    0x01ffffff0101ffff, 0x01ffffff0101ff01, 0x01ffffff010101ff, 0x01ffffff01010101,
    0x01ffff00ffff0000, 0x01ffff00ff00ff00, 0x01ffff00ff0000ff, 0x01ffff00ff000001,
    0x01ffff00ff000100, 0x01ffff00ff010000, 0x01ffff0000ffff00, 0x01ffff0000ff00ff,
    0x01ffff0000ff0100, 0x01ffff000000ffff, 0x01ffff000000ff01, 0x01ffff0000000000,
    0x01ffff0000000001, 0x01ffff00000001ff, 0x01ffff0000000100, 0x01ffff00000100ff,
    0x01ffff0000010001, 0x01ffff0000010100, 0x01ffff0001ff0000, 0x01ffff0001ff0100,
    0x01ffff00010000ff, 0x01ffff0001000001, 0x01ffff0001000100, 0x01ffff0001010000,
    0x01ffff01ffffffff, 0x01ffff01ffffff01, 0x01ffff01ffff01ff, 0x01ffff01ffff0101,
    0x01ffff01ff000000, 0x01ffff01ff01ffff, 0x01ffff01ff01ff01, 0x01ffff01ff0101ff,
    0x01ffff01ff010101, 0x01ffff010000ff00, 0x01ffff01000000ff, 0x01ffff0100000100,
    0x01ffff0100010000, 0x01ffff0101ffffff, 0x01ffff0101ffff01, 0x01ffff0101ff01ff,
    0x01ffff0101ff0101, 0x01ffff0101000000, 0x01ffff010101ffff, 0x01ffff010101ff01,
    0x01ffff01010101ff, 0x01ffff0101010101, 0x01ff00ffff0000ff, 0x01ff00ffff000100,
    0x01ff00ff00ffff00, 0x01ff00ff00ff00ff, 0x01ff00ff0000ff00, 0x01ff00ff00000000,
    0x01ff00ff00000101, 0x01ff00ff0001ff00, 0x01ff00ff000100ff, 0x01ff00ff00010100,
    0x01ff00ff010000ff, 0x01ff00ff01000100, 0x01ff0000ffffff00, 0x01ff0000ffff0100,
    0x01ff0000ff00ff01, 0x01ff0000ff000000, 0x01ff0000ff000101, 0x01ff0000ff010001,
    0x01ff0000ff010100, 0x01ff000000ffffff, 0x01ff000000ffff00, 0x01ff000000ff0000,
    0x01ff000000ff01ff, 0x01ff00000000ff00, 0x01ff0000000000ff, 0x01ff000000000000,
    0x01ff000000000001, 0x01ff000000000100, 0x01ff000000000101, 0x01ff000000010000,
    0x01ff000000010001, 0x01ff0000000101ff, 0x01ff000000010101, 0x01ff000001ffff00,
    0x01ff000001ff00ff, 0x01ff000001ff0001, 0x01ff000001ff0100, 0x01ff00000100ffff,
    0x01ff00000100ff01, 0x01ff000001000000, 0x01ff0000010001ff, 0x01ff000001010001,
    0x01ff0001ff00ff00, 0x01ff0001ff000001, 0x01ff0001ff000100, 0x01ff0001ff010000,
    0x01ff000100ffff00, 0x01ff000100ff00ff, 0x01ff000100ff0100, 0x01ff000100ff0101,
    0x01ff00010000ffff, 0x01ff000100000000, 0x01ff000100000100, 0x01ff000100000101,
    0x01ff00010001ff00, 0x01ff000100010001, 0x01ff000100010101, 0x01ff000101ff0000,
    0x01ff00010100ff00, 0x01ff000101000101, 0x01ff0001010100ff, 0x01ff01ffffffffff,
    0x01ff01ffffffff01, 0x01ff01ffffff01ff, 0x01ff01ffffff0101, 0x01ff01ffff000000,
    0x01ff01ffff01ffff, 0x01ff01ffff01ff01, 0x01ff01ffff0101ff, 0x01ff01ffff010101,
    0x01ff01ff00ffff00, 0x01ff01ff00ff0000, 0x01ff01ff0000ff00, 0x01ff01ff000000ff,
    0x01ff01ff00000100, 0x01ff01ff00010000, 0x01ff01ff00010100, 0x01ff01ff01ffffff,
    0x01ff01ff01ffff01, 0x01ff01ff01ff01ff, 0x01ff01ff01ff0101, 0x01ff01ff01000000,
    0x01ff01ff0101ffff, 0x01ff01ff0101ff01, 0x01ff01ff010101ff, 0x01ff01ff01010101,
    0x01ff0100ffff0000, 0x01ff0100ffff0001, 0x01ff0100ff00ff00, 0x01ff0100ff0000ff,
    0x01ff0100ff000001, 0x01ff0100ff010000, 0x01ff010000ffff00, 0x01ff010000ff00ff,
    0x01ff010000ff0001, 0x01ff010000ff0100, 0x01ff01000000ffff, 0x01ff01000000ff01,
    0x01ff010000000000, 0x01ff010000000101, 0x01ff01000001ff00, 0x01ff0100000100ff,
    0x01ff010001ff0000, 0x01ff010001000001, 0x01ff010001000100, 0x01ff010001010000,
    0x01ff0101ffffffff, 0x01ff0101ffffff01, 0x01ff0101ffff01ff, 0x01ff0101ffff0101,
    0x01ff0101ff000000, 0x01ff0101ff01ffff, 0x01ff0101ff01ff01, 0x01ff0101ff0101ff,
    0x01ff0101ff010101, 0x01ff010100ff0000, 0x01ff01010000ff00, 0x01ff0101000000ff,
    0x01ff010100000001, 0x01ff010101ffffff, 0x01ff010101ffff01, 0x01ff010101ff01ff,
    0x01ff010101ff0101, 0x01ff010101000000, 0x01ff01010101ffff, 0x01ff01010101ff01,
    0x01ff0101010101ff, 0x01ff010101010101, 0x0100ffffffff0000, 0x0100ffffff00ff00,
    0x0100ffffff000001, 0x0100ffffff0001ff, 0x0100ffffff000100, 0x0100ffffff010000,
    0x0100ffff00ffff00, 0x0100ffff00ff0001, 0x0100ffff00ff0100, 0x0100ffff00000000,
    0x0100ffff000001ff, 0x0100ffff00000101, 0x0100ffff00010100, 0x0100ffff00010101,
    0x0100ffff01ff0000, 0x0100ffff0100ff00, 0x0100ffff010000ff, 0x0100ffff01000001,
    0x0100ffff01000100, 0x0100ffff01010000, 0x0100ff00ffffff00, 0x0100ff00ffff00ff,
    0x0100ff00ffff0001, 0x0100ff00ffff0100, 0x0100ff00ff00ffff, 0x0100ff00ff000000,
    0x0100ff00ff0001ff, 0x0100ff00ff000101, 0x0100ff00ff01ff00, 0x0100ff00ff0100ff,
    0x0100ff00ff010001, 0x0100ff00ff010100, 0x0100ff0000ffffff, 0x0100ff0000ff0000,
    0x0100ff000000ffff, 0x0100ff000000ff00, 0x0100ff00000000ff, 0x0100ff0000000000,
    0x0100ff0000000001, 0x0100ff0000000100, 0x0100ff000001ff01, 0x0100ff0000010000,
    0x0100ff0001ff00ff, 0x0100ff0001ff0001, 0x0100ff000100ff01, 0x0100ff0001000000,
    0x0100ff00010001ff, 0x0100ff000101ff00, 0x0100ff00010100ff, 0x0100ff0001010001,
    0x0100ff0001010100, 0x0100ff01ffff0000, 0x0100ff01ff00ff00, 0x0100ff01ff0000ff,
    0x0100ff01ff000100, 0x0100ff01ff010000, 0x0100ff0100ff00ff, 0x0100ff0100ff0001,
    0x0100ff0100ff0100, 0x0100ff010000ffff, 0x0100ff010000ff01, 0x0100ff0100000000,
    0x0100ff01000001ff, 0x0100ff0100010001, 0x0100ff0100010100, 0x0100ff0101ff0000,
    0x0100ff01010000ff, 0x0100ff0101000001, 0x0100ff0101010100, 0x010000ffffffff00,
    0x010000ffffff00ff, 0x010000ffffff0001, 0x010000ffff00ffff, 0x010000ffff000000,
    0x010000ffff0001ff, 0x010000ffff010001, 0x010000ff00ffffff, 0x010000ff00ff0101,
    0x010000ff0000ff00, 0x010000ff000000ff, 0x010000ff00000000, 0x010000ff00000001,
    0x010000ff000001ff, 0x010000ff00000100, 0x010000ff0001ffff, 0x010000ff0001ff00,
    0x010000ff0001ff01, 0x010000ff00010000, 0x010000ff01ff00ff, 0x010000ff01ff0001,
    0x010000ff0100ff01, 0x010000ff010000ff, 0x010000ff01000000, 0x010000ff010001ff,
    0x010000ff0101ff00, 0x010000ff01010100, 0x01000000ffffffff, 0x01000000ffff0000,
    0x01000000ffff01ff, 0x01000000ffff0101, 0x01000000ff00ffff, 0x01000000ff00ff00,
    0x01000000ff0000ff, 0x01000000ff000000, 0x01000000ff000001, 0x01000000ff000100,
    0x01000000ff01ff00, 0x01000000ff010000, 0x01000000ff010100, 0x01000000ff010101,
    0x0100000000ffff00, 0x0100000000ff00ff, 0x0100000000ff0000, 0x0100000000ff0001,
    0x0100000000ff0100, 0x010000000000ffff, 0x010000000000ff00, 0x010000000000ff01,
    0x01000000000000ff, 0x0100000000000000, 0x0100000000000001, 0x01000000000001ff,
    0x0100000000000100, 0x0100000000000101, 0x010000000001ff00, 0x01000000000100ff,
    0x0100000000010000, 0x0100000000010001, 0x0100000000010100, 0x0100000001ffff00,
    0x0100000001ff0000, 0x0100000001ff01ff, 0x010000000100ff00, 0x010000000100ff01,
    0x01000000010000ff, 0x0100000001000000, 0x0100000001000001, 0x0100000001000100,
    0x0100000001000101, 0x010000000101ffff, 0x010000000101ff01, 0x0100000001010000,
    0x01000000010101ff, 0x0100000001010101, 0x01000001ffffff00, 0x01000001ffff00ff,
    0x01000001ff00ffff, 0x01000001ff000000, 0x01000001ff000100, 0x01000001ff01ffff,
    0x01000001ff010001, 0x01000001ff010100, 0x0100000100ff0000, 0x0100000100ff01ff,
    0x0100000100ff0100, 0x010000010000ff00, 0x010000010000ff01, 0x0100000100000000,
    0x0100000100000001, 0x0100000100000100, 0x0100000100010000, 0x01000001000101ff,
    0x0100000101ffff01, 0x0100000101ff00ff, 0x0100000101ff0100, 0x0100000101ff0101,
    0x010000010100ff01, 0x01000001010000ff, 0x0100000101000000, 0x01000001010100ff,
    0x0100000101010001, 0x0100000101010100, 0x010001ffffff0000, 0x010001ffff000001,
    0x010001ffff000100, 0x010001ffff010000, 0x010001ff00ffff00, 0x010001ff00ff0001,
    0x010001ff0000ffff, 0x010001ff0000ff01, 0x010001ff00000000, 0x010001ff00000001,
    0x010001ff00000101, 0x010001ff000100ff, 0x010001ff00010000, 0x010001ff01ff0000,
    0x010001ff0100ff00, 0x010001ff01000001, 0x010001ff01000100, 0x010001ff01010000,
    0x01000100ffff00ff, 0x01000100ffff0001, 0x01000100ffff0100, 0x01000100ff00ffff,
    0x01000100ff00ff01, 0x01000100ff000000, 0x01000100ff0001ff, 0x01000100ff000101,
    0x01000100ff01ffff, 0x01000100ff01ff00, 0x01000100ff0100ff, 0x01000100ff010001,
    0x0100010000ffffff, 0x0100010000ffff01, 0x0100010000ff0000, 0x0100010000ff01ff,
    0x0100010000ff0101, 0x010001000000ff00, 0x01000100000000ff, 0x0100010000000000,
    0x0100010000000001, 0x0100010000000100, 0x010001000001ff01, 0x0100010000010000,
    0x0100010000010001, 0x0100010000010101, 0x0100010001ffff00, 0x0100010001ff00ff,
    0x010001000100ffff, 0x010001000100ff01, 0x0100010001000000, 0x0100010001000101,
    0x010001000101ff00, 0x0100010001010001, 0x01000101ffff0000, 0x01000101ff000000,
    0x01000101ff010000, 0x0100010100ff00ff, 0x0100010100ff0001, 0x0100010100ff0100,
    0x010001010000ffff, 0x0100010100000000, 0x01000101000001ff, 0x010001010001ff00,
    0x0100010101ff0000, 0x010001010100ff00, 0x01000101010000ff, 0x0100010101000000,
    0x0100010101000001, 0x0101ffffffffffff, 0x0101ffffffffff01, 0x0101ffffffff01ff,
    0x0101ffffffff0101, 0x0101ffffff000000, 0x0101ffffff01ffff, 0x0101ffffff01ff01,
    0x0101ffffff0101ff, 0x0101ffffff010101, 0x0101ffff00ff0000, 0x0101ffff0000ff00,
    0x0101ffff000000ff, 0x0101ffff00000001, 0x0101ffff00000100, 0x0101ffff01ffffff,
    0x0101ffff01ffff01, 0x0101ffff01ff01ff, 0x0101ffff01ff0101, 0x0101ffff01000000,
    0x0101ffff0101ffff, 0x0101ffff0101ff01, 0x0101ffff010101ff, 0x0101ffff01010101,
    0x0101ff00ffff0000, 0x0101ff00ffff0100, 0x0101ff00ff00ff00, 0x0101ff00ff0000ff,
    0x0101ff00ff000001, 0x0101ff00ff000100, 0x0101ff00ff000101, 0x0101ff0000ff0001,
    0x0101ff0000ff0100, 0x0101ff000000ff00, 0x0101ff0000000000, 0x0101ff00000001ff,
    0x0101ff0000000101, 0x0101ff000001ff00, 0x0101ff00000100ff, 0x0101ff0001ff0000,
    0x0101ff000100ffff, 0x0101ff000100ff01, 0x0101ff0001000001, 0x0101ff0001000100,
    0x0101ff01ffffff01, 0x0101ff01ffff01ff, 0x0101ff01ffff0101, 0x0101ff01ff00ffff,
    0x0101ff01ff000100, 0x0101ff01ff01ff01, 0x0101ff01ff0101ff, 0x0101ff01ff010101,
    0x0101ff0100ff0000, 0x0101ff010000ff00, 0x0101ff0100000001, 0x0101ff0100000100,
    0x0101ff0100010000, 0x0101ff0101ffffff, 0x0101ff0101ffff01, 0x0101ff0101ff01ff,
    0x0101ff0101ff0101, 0x0101ff0101000000, 0x0101ff010101ffff, 0x0101ff010101ff01,
    0x0101ff01010101ff, 0x0101ff0101010101, 0x010100ffff000100, 0x010100ffff010000,
    0x010100ff00ffff00, 0x010100ff00ff00ff, 0x010100ff0000ffff, 0x010100ff000000ff,
    0x010100ff00000000, 0x010100ff000001ff, 0x010100ff00000101, 0x010100ff0001ff00,
    0x010100ff00010000, 0x010100ff00010001, 0x010100ff000101ff, 0x010100ff00010100,
    0x010100ff01ff0000, 0x01010000ffff0001, 0x01010000ffff0100, 0x01010000ff00ffff,
    0x01010000ff00ff01, 0x01010000ff000000, 0x01010000ff0001ff, 0x01010000ff010001,
    0x01010000ff010100, 0x0101000000ffff01, 0x0101000000ff0000, 0x010100000000ff00,
    0x01010000000000ff, 0x0101000000000000, 0x0101000000000001, 0x0101000000000100,
    0x0101000000010000, 0x0101000000010101, 0x0101000001ffff00, 0x0101000001ff00ff,
    0x0101000001ff0000, 0x0101000001ff0001, 0x0101000001ff0100, 0x010100000100ff01,
    0x0101000001000000, 0x01010000010001ff, 0x01010001ffff0000, 0x01010001ff00ff00,
    0x01010001ff000001, 0x01010001ff000101, 0x01010001ff01ff00, 0x01010001ff010000,
    0x0101000100ff00ff, 0x0101000100ff0001, 0x0101000100ff0101, 0x010100010000ff01,
    0x0101000100000000, 0x0101000100000001, 0x01010001000001ff, 0x010100010001ffff,
    0x010100010001ff01, 0x0101000101ff0001, 0x010100010100ffff, 0x0101000101000000,
    0x0101000101000001, 0x0101000101000100, 0x010100010101ff00, 0x01010001010100ff,
    0x0101000101010001, 0x010101ffffffffff, 0x010101ffffffff01, 0x010101ffffff01ff,
    0x010101ffffff0101, 0x010101ffff01ffff, 0x010101ffff01ff01, 0x010101ffff0101ff,
    0x010101ffff010101, 0x010101ff0000ff00, 0x010101ff000000ff, 0x010101ff00000001,
    0x010101ff00000100, 0x010101ff01ffffff, 0x010101ff01ffff01, 0x010101ff01ff01ff,
    0x010101ff01ff0101, 0x010101ff01000000, 0x010101ff0101ffff, 0x010101ff0101ff01,
    0x010101ff010101ff, 0x010101ff01010101, 0x01010100ffff0000, 0x01010100ff0000ff,
    0x01010100ff000100, 0x01010100ff01ff00, 0x01010100ff010000, 0x0101010000ffff00,
    0x010101000000ffff, 0x0101010000000000, 0x0101010000000101, 0x010101000001ff00,
    0x0101010000010001, 0x0101010000010100, 0x010101000100ffff, 0x0101010001000001,
    0x01010101ffffffff, 0x01010101ffffff01, 0x01010101ffff01ff, 0x01010101ffff0101,
    0x01010101ff01ffff, 0x01010101ff01ff01, 0x01010101ff0101ff, 0x01010101ff010101,
    0x010101010000ff00, 0x01010101000000ff, 0x0101010100000001, 0x0101010101ffffff,
    0x0101010101ffff01, 0x0101010101ff01ff, 0x0101010101ff0101, 0x0101010101000000,
    0x010101010101ffff, 0x010101010101ff01, 0x01010101010101ff, 0x0101010101010101,
GGML_TABLE_END()
#else
GGML_TABLE_BEGIN(uint32_t, iq1s_grid_gpu, NGRID_IQ1S)
    0x00000000, 0x00000002, 0x00000101, 0x00000200, 0x00000202, 0x00010001, 0x00010101, 0x00020000,
    0x00020002, 0x00020200, 0x00020202, 0x01000101, 0x01010001, 0x01010100, 0x01010102, 0x01020101,
    0x02000000, 0x02000002, 0x02000200, 0x02000202, 0x02010101, 0x02020000, 0x02020002, 0x02020200,
    0x02020202, 0x00000110, 0x00000111, 0x00010011, 0x00010110, 0x00010112, 0x00010211, 0x00010212,
    0x00020111, 0x01000011, 0x01000112, 0x01000211, 0x01010012, 0x01010111, 0x01010212, 0x01020011,
    0x01020110, 0x01020112, 0x01020210, 0x02000111, 0x02010011, 0x02010110, 0x02010112, 0x02020111,
    0x00000020, 0x00000022, 0x00000220, 0x00000222, 0x00010121, 0x00020020, 0x00020022, 0x00020220,
    0x00020222, 0x01000121, 0x01010021, 0x01010221, 0x01020120, 0x01020221, 0x02000020, 0x02000022,
    0x02000220, 0x02000222, 0x02010021, 0x02010121, 0x02010221, 0x02020020, 0x02020022, 0x02020220,
    0x02020222, 0x00011001, 0x00011100, 0x00011102, 0x00021101, 0x01001001, 0x01001201, 0x01011101,
    0x01011202, 0x01021100, 0x01021101, 0x02011001, 0x02011201, 0x02021101, 0x00001011, 0x00001110,
    0x00001111, 0x00001112, 0x00011111, 0x00011210, 0x00011212, 0x00021211, 0x01001010, 0x01001111,
    0x01001212, 0x01011010, 0x01011011, 0x01011110, 0x01011111, 0x01011112, 0x01011211, 0x01021010,
    0x01021012, 0x01021111, 0x01021210, 0x01021212, 0x02001011, 0x02011011, 0x02011111, 0x02011210,
    0x02011212, 0x02021011, 0x02021110, 0x02021111, 0x02021112, 0x02021211, 0x00011120, 0x00011221,
    0x01001021, 0x01001120, 0x01011020, 0x01011022, 0x01011121, 0x01011220, 0x01021020, 0x01021021,
    0x01021122, 0x01021221, 0x02001121, 0x02011021, 0x02011120, 0x02011221, 0x00002000, 0x00002002,
    0x00002200, 0x00002202, 0x00012101, 0x00022000, 0x00022002, 0x00022200, 0x00022202, 0x01002101,
    0x01012001, 0x01012102, 0x01022101, 0x02002000, 0x02002002, 0x02002200, 0x02002202, 0x02012101,
    0x02022000, 0x02022002, 0x02022200, 0x02022202, 0x00002111, 0x00012011, 0x00012110, 0x00012211,
    0x00022110, 0x00022111, 0x01002011, 0x01012010, 0x01012011, 0x01012111, 0x01022011, 0x01022110,
    0x01022211, 0x02012011, 0x02012110, 0x02012112, 0x02012211, 0x02022111, 0x00002020, 0x00002022,
    0x00002220, 0x00002222, 0x00012121, 0x00022020, 0x00022022, 0x00022220, 0x00022222, 0x01002121,
    0x01012021, 0x01012221, 0x01022021, 0x01022121, 0x02002020, 0x02002022, 0x02002121, 0x02002220,
    0x02002222, 0x02012121, 0x02022020, 0x02022022, 0x02022220, 0x02022222, 0x00110000, 0x00110001,
    0x00110100, 0x00110201, 0x00120100, 0x00120101, 0x01100001, 0x01100100, 0x01110000, 0x01110101,
    0x01110200, 0x01120001, 0x01120100, 0x01120101, 0x01120201, 0x02110001, 0x02110100, 0x02110102,
    0x02120001, 0x02120101, 0x00100011, 0x00100110, 0x00100112, 0x00100211, 0x00110010, 0x00110012,
    0x00110111, 0x00110210, 0x00120011, 0x00120110, 0x00120211, 0x01100111, 0x01100212, 0x01110010,
    0x01110011, 0x01110012, 0x01110110, 0x01110111, 0x01110112, 0x01110211, 0x01120010, 0x01120111,
    0x02100110, 0x02110012, 0x02110111, 0x02120011, 0x02120110, 0x00110021, 0x00110120, 0x00110122,
    0x00120121, 0x01100020, 0x01100122, 0x01100221, 0x01110022, 0x01110121, 0x01110220, 0x01110222,
    0x01120120, 0x01120122, 0x02100121, 0x02110021, 0x02110120, 0x02110122, 0x02120121, 0x00101001,
    0x00101102, 0x00101201, 0x00111100, 0x00111101, 0x00111200, 0x00111201, 0x00121001, 0x00121102,
    0x01101001, 0x01101101, 0x01101102, 0x01101200, 0x01101202, 0x01111001, 0x01111100, 0x01111101,
    0x01111102, 0x01111201, 0x01121002, 0x01121101, 0x01121200, 0x02101100, 0x02101201, 0x02111000,
    0x02111100, 0x02111101, 0x02111200, 0x02111201, 0x02111202, 0x02121001, 0x02121100, 0x02121101,
    0x02121201, 0x00101012, 0x00101111, 0x00101212, 0x00111011, 0x00111110, 0x00111111, 0x00111112,
    0x00111211, 0x00121010, 0x00121012, 0x00121111, 0x00121210, 0x00121212, 0x01101011, 0x01101110,
    0x01101111, 0x01101112, 0x01111011, 0x01111012, 0x01111110, 0x01111111, 0x01111112, 0x01111211,
    0x01111212, 0x01121011, 0x01121110, 0x01121111, 0x01121112, 0x01121211, 0x02101010, 0x02101012,
    0x02101110, 0x02101111, 0x02101210, 0x02101212, 0x02111010, 0x02111011, 0x02111110, 0x02111111,
    0x02111112, 0x02111211, 0x02111212, 0x02121010, 0x02121012, 0x02121111, 0x00101021, 0x00101120,
    0x00101121, 0x00101122, 0x00111121, 0x00111122, 0x00111220, 0x00111222, 0x00121021, 0x00121122,
    0x01101020, 0x01101022, 0x01101120, 0x01101121, 0x01101220, 0x01101222, 0x01111021, 0x01111121,
    0x01111122, 0x01111220, 0x01111221, 0x01121021, 0x01121120, 0x01121121, 0x01121220, 0x01121221,
    0x01121222, 0x02101122, 0x02101222, 0x02111022, 0x02111121, 0x02121120, 0x02121221, 0x00112001,
    0x00112102, 0x00122101, 0x01102001, 0x01102100, 0x01102102, 0x01102201, 0x01112000, 0x01112101,
    0x01112200, 0x01112202, 0x01122000, 0x01122001, 0x01122100, 0x01122102, 0x01122201, 0x02102101,
    0x02112001, 0x02112100, 0x02122101, 0x00112010, 0x00112012, 0x00112111, 0x00112212, 0x00122011,
    0x00122111, 0x01102012, 0x01102110, 0x01102111, 0x01102210, 0x01112011, 0x01112110, 0x01112111,
    0x01112112, 0x01112211, 0x01112212, 0x01122010, 0x01122111, 0x01122212, 0x02102211, 0x02112011,
    0x02112012, 0x02112111, 0x02112210, 0x02122011, 0x02122112, 0x02122211, 0x00102221, 0x00112122,
    0x00122120, 0x00122122, 0x01102120, 0x01102122, 0x01102221, 0x01112020, 0x01112022, 0x01112121,
    0x01112220, 0x01122021, 0x01122122, 0x01122221, 0x02102121, 0x02112021, 0x02112122, 0x02112222,
    0x00200000, 0x00200002, 0x00200200, 0x00200202, 0x00210101, 0x00220000, 0x00220002, 0x00220101,
    0x00220200, 0x00220202, 0x01200101, 0x01210001, 0x01210201, 0x01220001, 0x01220101, 0x02200000,
    0x02200002, 0x02200200, 0x02200202, 0x02210101, 0x02220000, 0x02220002, 0x02220101, 0x02220200,
    0x02220202, 0x00200111, 0x00210011, 0x00210110, 0x00210211, 0x00220111, 0x01200012, 0x01200110,
    0x01200211, 0x01210111, 0x01210210, 0x01210212, 0x01220011, 0x01220110, 0x01220111, 0x01220112,
    0x02200111, 0x02210010, 0x02210112, 0x02210211, 0x02220111, 0x00200021, 0x00200220, 0x00200222,
    0x00210021, 0x00210121, 0x00220020, 0x00220022, 0x00220220, 0x00220222, 0x01200121, 0x01210021,
    0x01210122, 0x01210221, 0x01220121, 0x02200021, 0x02200220, 0x02200222, 0x02210021, 0x02210121,
    0x02220020, 0x02220022, 0x02220220, 0x02220222, 0x00201101, 0x00211100, 0x00211102, 0x00211201,
    0x00221101, 0x01201100, 0x01201101, 0x01201102, 0x01201201, 0x01211002, 0x01211101, 0x01211200,
    0x01211202, 0x01221102, 0x02201101, 0x02211001, 0x02211100, 0x02211201, 0x02221001, 0x02221101,
    0x00201211, 0x00211111, 0x00221011, 0x00221211, 0x01201010, 0x01201111, 0x01201210, 0x01211011,
    0x01211110, 0x01211111, 0x01211211, 0x01221012, 0x01221111, 0x01221210, 0x02201211, 0x02211010,
    0x02211110, 0x02211111, 0x02211210, 0x02211212, 0x02221011, 0x02221110, 0x02221112, 0x02221211,
    0x00201121, 0x00211020, 0x00211022, 0x00211221, 0x00221121, 0x01201021, 0x01201221, 0x01211121,
    0x01221020, 0x01221021, 0x01221221, 0x02201120, 0x02201122, 0x02211020, 0x02211222, 0x00202000,
    0x00202002, 0x00202200, 0x00202202, 0x00212101, 0x00222000, 0x00222002, 0x00222200, 0x00222202,
    0x01202101, 0x01212001, 0x01212100, 0x01222101, 0x02202000, 0x02202002, 0x02202200, 0x02202202,
    0x02222000, 0x02222002, 0x02222200, 0x02222202, 0x00202211, 0x00212011, 0x00212110, 0x00212211,
    0x00222111, 0x01202112, 0x01202211, 0x01212012, 0x01212111, 0x01222011, 0x01222110, 0x01222112,
    0x01222211, 0x02202111, 0x02212010, 0x02212112, 0x02212211, 0x02222110, 0x02222111, 0x00202020,
    0x00202022, 0x00202220, 0x00202222, 0x00222020, 0x00222022, 0x00222220, 0x00222222, 0x01202121,
    0x01212021, 0x01212122, 0x01212221, 0x01222121, 0x02202020, 0x02202022, 0x02202220, 0x02202222,
    0x02212121, 0x02222020, 0x02222022, 0x02222220, 0x02222222, 0x10000101, 0x10010001, 0x10010102,
    0x10020101, 0x11000201, 0x11010002, 0x11010101, 0x11010200, 0x11010202, 0x11020001, 0x11020100,
    0x11020102, 0x12010100, 0x12010201, 0x12020001, 0x12020102, 0x10000010, 0x10000011, 0x10000110,
    0x10000112, 0x10000211, 0x10010012, 0x10010111, 0x10010112, 0x10010210, 0x10010212, 0x10020011,
    0x10020112, 0x10020211, 0x11000111, 0x11000210, 0x11000212, 0x11010011, 0x11010110, 0x11010111,
    0x11010112, 0x11010211, 0x11010212, 0x11020111, 0x11020210, 0x11020212, 0x12000011, 0x12000110,
    0x12000112, 0x12010010, 0x12010012, 0x12010111, 0x12020010, 0x12020011, 0x12020012, 0x10000121,
    0x10010021, 0x10010120, 0x10010122, 0x10020121, 0x11000021, 0x11010022, 0x11010121, 0x11010222,
    0x11020120, 0x11020221, 0x12000221, 0x12010120, 0x12020121, 0x10001001, 0x10011101, 0x10011201,
    0x10021201, 0x11001101, 0x11001200, 0x11001202, 0x11011001, 0x11011100, 0x11011101, 0x11011102,
    0x11021001, 0x11021002, 0x11021101, 0x11021200, 0x11021202, 0x12001001, 0x12001102, 0x12001201,
    0x12011000, 0x12011002, 0x12011101, 0x12021000, 0x12021001, 0x12021201, 0x10001011, 0x10001012,
    0x10001111, 0x10001212, 0x10011011, 0x10011110, 0x10011111, 0x10011112, 0x10011211, 0x10021010,
    0x10021111, 0x10021212, 0x11001011, 0x11001110, 0x11001111, 0x11001112, 0x11001211, 0x11011010,
    0x11011011, 0x11011110, 0x11011111, 0x11011112, 0x11011210, 0x11011211, 0x11021011, 0x11021110,
    0x11021111, 0x11021112, 0x11021211, 0x12001012, 0x12001110, 0x12001111, 0x12001210, 0x12011011,
    0x12011110, 0x12011111, 0x12011112, 0x12011211, 0x12011212, 0x12021111, 0x12021210, 0x12021212,
    0x10001021, 0x10001121, 0x10001221, 0x10011120, 0x10011121, 0x10011220, 0x10011222, 0x10021021,
    0x10021120, 0x10021221, 0x11001020, 0x11001022, 0x11001121, 0x11001220, 0x11011020, 0x11011021,
    0x11011022, 0x11011121, 0x11011122, 0x11011221, 0x11021022, 0x11021121, 0x11021220, 0x12001021,
    0x12001121, 0x12001222, 0x12011120, 0x12011121, 0x12021021, 0x12021120, 0x12021122, 0x10002101,
    0x10012001, 0x10012101, 0x10012202, 0x10022101, 0x11002002, 0x11002201, 0x11012000, 0x11012101,
    0x11012200, 0x11022001, 0x11022100, 0x11022102, 0x11022201, 0x12002101, 0x12012001, 0x12012100,
    0x12012102, 0x12012201, 0x12022101, 0x10002011, 0x10002111, 0x10002112, 0x10002212, 0x10012010,
    0x10012110, 0x10012111, 0x10012210, 0x10022011, 0x10022110, 0x10022112, 0x11002010, 0x11002111,
    0x11002212, 0x11012011, 0x11012012, 0x11012110, 0x11012111, 0x11012112, 0x11012211, 0x11022010,
    0x11022012, 0x11022111, 0x11022112, 0x11022212, 0x12002112, 0x12002211, 0x12012012, 0x12012111,
    0x12012112, 0x12012210, 0x12022011, 0x12022110, 0x12022112, 0x12022211, 0x10012122, 0x11002120,
    0x11002122, 0x11002221, 0x11012121, 0x11012220, 0x11012222, 0x11022120, 0x11022221, 0x12012120,
    0x12022121, 0x10100001, 0x10100100, 0x10100101, 0x10100102, 0x10100201, 0x10110002, 0x10110101,
    0x10110202, 0x10120001, 0x10120100, 0x10120201, 0x11100000, 0x11100101, 0x11100200, 0x11110001,
    0x11110100, 0x11110101, 0x11110102, 0x11110201, 0x11120101, 0x11120200, 0x12100102, 0x12100201,
    0x12110101, 0x12110200, 0x12120000, 0x12120001, 0x12120102, 0x12120201, 0x10100111, 0x10100210,
    0x10100211, 0x10100212, 0x10110011, 0x10110110, 0x10110111, 0x10110112, 0x10110210, 0x10110211,
    0x10120010, 0x10120111, 0x10120112, 0x10120210, 0x10120212, 0x11100011, 0x11100110, 0x11100111,
    0x11100112, 0x11100211, 0x11110010, 0x11110011, 0x11110012, 0x11110110, 0x11110111, 0x11110112,
    0x11110210, 0x11110211, 0x11110212, 0x11120011, 0x11120110, 0x11120111, 0x11120112, 0x11120211,
    0x12100012, 0x12100111, 0x12110011, 0x12110110, 0x12110111, 0x12110112, 0x12110211, 0x12120010,
    0x12120111, 0x12120212, 0x10100021, 0x10100122, 0x10110022, 0x10110121, 0x10110222, 0x10120021,
    0x10120120, 0x11100022, 0x11100121, 0x11100222, 0x11110021, 0x11110120, 0x11110121, 0x11110122,
    0x11110221, 0x11120022, 0x11120121, 0x12100121, 0x12110020, 0x12110022, 0x12110121, 0x12110221,
    0x12110222, 0x12120120, 0x10101100, 0x10101101, 0x10111001, 0x10111100, 0x10111101, 0x10111102,
    0x10111200, 0x10111201, 0x10121001, 0x10121101, 0x10121200, 0x10121202, 0x11101001, 0x11101100,
    0x11101101, 0x11101102, 0x11101201, 0x11101202, 0x11111000, 0x11111001, 0x11111100, 0x11111101,
    0x11111102, 0x11111200, 0x11111201, 0x11111202, 0x11121001, 0x11121002, 0x11121100, 0x11121101,
    0x11121102, 0x11121201, 0x12101000, 0x12101200, 0x12101202, 0x12111001, 0x12111100, 0x12111101,
    0x12111102, 0x12111201, 0x12121001, 0x12121100, 0x12121101, 0x12121202, 0x10101011, 0x10101012,
    0x10101110, 0x10101111, 0x10101112, 0x10101211, 0x10111010, 0x10111011, 0x10111012, 0x10111110,
    0x10111111, 0x10111112, 0x10111211, 0x10111212, 0x10121011, 0x10121110, 0x10121111, 0x10121112,
    0x10121211, 0x11101010, 0x11101011, 0x11101012, 0x11101110, 0x11101111, 0x11101112, 0x11101210,
    0x11101211, 0x11111010, 0x11111011, 0x11111012, 0x11111110, 0x11111111, 0x11111112, 0x11111210,
    0x11111211, 0x11111212, 0x11121010, 0x11121011, 0x11121110, 0x11121111, 0x11121112, 0x11121210,
    0x11121211, 0x11121212, 0x12101011, 0x12101110, 0x12101111, 0x12101211, 0x12101212, 0x12111010,
    0x12111011, 0x12111110, 0x12111111, 0x12111112, 0x12111210, 0x12111211, 0x12121011, 0x12121110,
    0x12121111, 0x12121112, 0x12121211, 0x10101020, 0x10101021, 0x10101022, 0x10101120, 0x10101122,
    0x10101220, 0x10101221, 0x10111021, 0x10111120, 0x10111121, 0x10111220, 0x10111221, 0x10121020,
    0x10121021, 0x10121022, 0x10121120, 0x10121121, 0x10121122, 0x10121220, 0x10121221, 0x11101021,
    0x11101121, 0x11101122, 0x11101220, 0x11101221, 0x11101222, 0x11111020, 0x11111021, 0x11111022,
    0x11111120, 0x11111121, 0x11111122, 0x11111220, 0x11111221, 0x11111222, 0x11121021, 0x11121120,
    0x11121121, 0x11121221, 0x12101022, 0x12101121, 0x12101122, 0x12101220, 0x12101221, 0x12101222,
    0x12111021, 0x12111121, 0x12111222, 0x12121022, 0x12121121, 0x12121122, 0x12121220, 0x12121221,
    0x10102100, 0x10102101, 0x10102102, 0x10102201, 0x10112000, 0x10112101, 0x10112200, 0x10122001,
    0x10122202, 0x11102101, 0x11102200, 0x11102202, 0x11112001, 0x11112100, 0x11112101, 0x11112102,
    0x11112200, 0x11112201, 0x11122000, 0x11122002, 0x11122100, 0x11122101, 0x12102002, 0x12102201,
    0x12112000, 0x12112002, 0x12112101, 0x12112200, 0x12122001, 0x12122201, 0x10102011, 0x10102012,
    0x10102111, 0x10102212, 0x10112011, 0x10112110, 0x10112111, 0x10112112, 0x10112211, 0x10122111,
    0x11102011, 0x11102110, 0x11102111, 0x11102112, 0x11102211, 0x11112010, 0x11112011, 0x11112012,
    0x11112110, 0x11112111, 0x11112112, 0x11112210, 0x11112211, 0x11112212, 0x11122011, 0x11122110,
    0x11122111, 0x11122112, 0x11122211, 0x12102011, 0x12102111, 0x12102211, 0x12112011, 0x12112110,
    0x12112111, 0x12112112, 0x12112210, 0x12112211, 0x12122111, 0x10102120, 0x10102220, 0x10112121,
    0x10112222, 0x10122020, 0x10122121, 0x10122122, 0x10122221, 0x11102121, 0x11102220, 0x11102221,
    0x11112021, 0x11112121, 0x11112122, 0x11112220, 0x11112221, 0x11122022, 0x11122121, 0x11122220,
    0x11122222, 0x12102021, 0x12102222, 0x12112022, 0x12112121, 0x12112122, 0x12112220, 0x12112222,
    0x12122021, 0x10200101, 0x10210100, 0x10210102, 0x10210201, 0x10220101, 0x11200100, 0x11210000,
    0x11210101, 0x11210102, 0x11210200, 0x11210202, 0x11220001, 0x11220100, 0x11220102, 0x11220201,
    0x12200001, 0x12210102, 0x12220101, 0x10200011, 0x10200110, 0x10200112, 0x10200211, 0x10210012,
    0x10210111, 0x10220011, 0x10220012, 0x10220112, 0x10220211, 0x11200111, 0x11200211, 0x11210011,
    0x11210111, 0x11210112, 0x11210211, 0x11220111, 0x11220112, 0x11220212, 0x12200110, 0x12200212,
    0x12210012, 0x12210111, 0x12220011, 0x12220112, 0x12220211, 0x10210021, 0x10210122, 0x10210221,
    0x11200020, 0x11200021, 0x11200122, 0x11210121, 0x11210122, 0x11210220, 0x11220020, 0x12200121,
    0x12210021, 0x12210122, 0x12220121, 0x10211001, 0x10211002, 0x10211101, 0x10211102, 0x10211202,
    0x10221001, 0x10221102, 0x10221201, 0x11201000, 0x11201002, 0x11201101, 0x11201200, 0x11201202,
    0x11211001, 0x11211100, 0x11211101, 0x11211102, 0x11211201, 0x11211202, 0x11221000, 0x11221002,
    0x11221101, 0x12201100, 0x12201101, 0x12201201, 0x12211000, 0x12211002, 0x12211100, 0x12211101,
    0x12211102, 0x12211200, 0x12211202, 0x12221001, 0x12221100, 0x12221201, 0x10201111, 0x10201210,
    0x10201212, 0x10211011, 0x10211111, 0x10211112, 0x10211211, 0x11201110, 0x11201111, 0x11201112,
    0x11201211, 0x11211010, 0x11211011, 0x11211110, 0x11211111, 0x11211112, 0x11211211, 0x11221011,
    0x11221110, 0x11221111, 0x11221112, 0x11221211, 0x12201112, 0x12201211, 0x12201212, 0x12211011,
    0x12211111, 0x12211112, 0x12211211, 0x12211212, 0x12221012, 0x12221111, 0x12221112, 0x12221210,
    0x10201022, 0x10201221, 0x10211121, 0x10221020, 0x10221122, 0x10221220, 0x10221221, 0x11201020,
    0x11201121, 0x11201220, 0x11201222, 0x11211021, 0x11211120, 0x11211121, 0x11211122, 0x11211220,
    0x11211222, 0x11221020, 0x11221121, 0x11221220, 0x12201020, 0x12201022, 0x12201121, 0x12201222,
    0x12211120, 0x12211122, 0x12211220, 0x12211221, 0x12221020, 0x12221120, 0x12221122, 0x12221222,
    0x10212102, 0x10212201, 0x10222101, 0x11202001, 0x11212002, 0x11212101, 0x11212202, 0x11222001,
    0x11222201, 0x12202101, 0x12212001, 0x12212200, 0x12222102, 0x10202011, 0x10202110, 0x10212010,
    0x10212111, 0x10222011, 0x10222110, 0x10222112, 0x10222211, 0x11202010, 0x11202011, 0x11202111,
    0x11202112, 0x11202210, 0x11212011, 0x11212110, 0x11212111, 0x11212112, 0x11212211, 0x11222010,
    0x11222111, 0x11222212, 0x12202012, 0x12202110, 0x12202212, 0x12212111, 0x12222011, 0x12222110,
    0x12222111, 0x12222211, 0x10212021, 0x10212122, 0x10212220, 0x11202021, 0x11202120, 0x11202221,
    0x11212020, 0x11212121, 0x11212220, 0x11212222, 0x11222120, 0x11222121, 0x11222221, 0x12202122,
    0x12212120, 0x12212220, 0x12212222, 0x12222122, 0x20000000, 0x20000002, 0x20000200, 0x20000202,
    0x20020000, 0x20020002, 0x20020200, 0x20020202, 0x21000101, 0x21010000, 0x21010001, 0x21010100,
    0x21010102, 0x21010201, 0x21020101, 0x22000000, 0x22000002, 0x22000200, 0x22000202, 0x22010101,
    0x22020000, 0x22020002, 0x22020200, 0x22020202, 0x20000111, 0x20010011, 0x20010110, 0x20010112,
    0x20010211, 0x20020111, 0x21000011, 0x21000110, 0x21000211, 0x21010010, 0x21010012, 0x21010111,
    0x21010112, 0x21010210, 0x21010211, 0x21020110, 0x21020112, 0x21020211, 0x22000111, 0x22000211,
    0x22010110, 0x22010112, 0x22010211, 0x22020111, 0x20000020, 0x20000022, 0x20000220, 0x20000222,
    0x20010121, 0x20020020, 0x20020022, 0x20020220, 0x20020222, 0x21010021, 0x21010120, 0x21010221,
    0x21020121, 0x22000020, 0x22000022, 0x22000220, 0x22000222, 0x22010121, 0x22020020, 0x22020022,
    0x22020220, 0x22020222, 0x20011100, 0x20011201, 0x21001001, 0x21001100, 0x21011001, 0x21011101,
    0x21011202, 0x21021001, 0x21021100, 0x21021201, 0x22011100, 0x22011201, 0x20001011, 0x20001211,
    0x20011012, 0x20011111, 0x20011212, 0x20021112, 0x20021211, 0x21001010, 0x21001011, 0x21001111,
    0x21001210, 0x21011011, 0x21011110, 0x21011111, 0x21011112, 0x21011211, 0x21011212, 0x21021111,
    0x21021112, 0x21021210, 0x21021212, 0x22001011, 0x22001110, 0x22001112, 0x22001211, 0x22011010,
    0x22011012, 0x22011111, 0x22011210, 0x22021112, 0x20011021, 0x20011122, 0x20011221, 0x20021121,
    0x21001021, 0x21001120, 0x21001221, 0x21001222, 0x21011020, 0x21011121, 0x21011221, 0x21011222,
    0x21021021, 0x21021122, 0x21021222, 0x22001121, 0x22011021, 0x22011222, 0x22021120, 0x20002000,
    0x20002002, 0x20002200, 0x20002202, 0x20012101, 0x20022000, 0x20022002, 0x20022200, 0x20022202,
    0x21002001, 0x21002101, 0x21012001, 0x21012100, 0x21012201, 0x21022101, 0x21022201, 0x22002000,
    0x22002002, 0x22002200, 0x22002202, 0x22012101, 0x22022000, 0x22022002, 0x22022200, 0x22022202,
    0x20002111, 0x20002112, 0x20012011, 0x20012110, 0x20012112, 0x20022111, 0x21002011, 0x21002110,
    0x21002112, 0x21002211, 0x21012010, 0x21012012, 0x21012111, 0x21012212, 0x21022011, 0x21022110,
    0x22002111, 0x22012112, 0x22012211, 0x22022111, 0x20002020, 0x20002022, 0x20002220, 0x20002222,
    0x20012121, 0x20022020, 0x20022022, 0x20022220, 0x20022222, 0x21002121, 0x21012021, 0x21012120,
    0x21012122, 0x22002020, 0x22002022, 0x22002220, 0x22002222, 0x22012121, 0x22022020, 0x22022022,
    0x22022220, 0x22022222, 0x20100101, 0x20110001, 0x20110102, 0x20110200, 0x20110201, 0x20120101,
    0x21100001, 0x21100102, 0x21100201, 0x21110101, 0x21110200, 0x21110202, 0x21120201, 0x21120202,
    0x22100101, 0x22110001, 0x22110100, 0x22110102, 0x22110201, 0x22120101, 0x20100011, 0x20100110,
    0x20100112, 0x20100211, 0x20110010, 0x20110111, 0x20110210, 0x20110212, 0x20120011, 0x20120110,
    0x20120112, 0x20120211, 0x21100010, 0x21100111, 0x21110010, 0x21110011, 0x21110110, 0x21110111,
    0x21110112, 0x21110211, 0x21120012, 0x21120111, 0x22100110, 0x22100112, 0x22110012, 0x22110111,
    0x22110210, 0x22120011, 0x22120110, 0x22120112, 0x22120211, 0x20100121, 0x20110021, 0x20110120,
    0x20110221, 0x20120121, 0x21100120, 0x21100122, 0x21100221, 0x21110020, 0x21110022, 0x21110121,
    0x21110220, 0x21120122, 0x21120221, 0x22100121, 0x22110120, 0x22110122, 0x22120221, 0x20101001,
    0x20101100, 0x20101102, 0x20111000, 0x20111101, 0x20111200, 0x20121102, 0x21101000, 0x21101202,
    0x21111001, 0x21111100, 0x21111101, 0x21111102, 0x21111200, 0x21111201, 0x21121000, 0x21121001,
    0x21121002, 0x21121101, 0x22101100, 0x22101102, 0x22111002, 0x22111100, 0x22111101, 0x22111200,
    0x22121001, 0x22121201, 0x20101010, 0x20101111, 0x20101210, 0x20101212, 0x20111010, 0x20111011,
    0x20111110, 0x20111111, 0x20111112, 0x20111211, 0x20121011, 0x20121111, 0x20121211, 0x20121212,
    0x21101011, 0x21101110, 0x21101111, 0x21101112, 0x21101211, 0x21111010, 0x21111011, 0x21111012,
    0x21111110, 0x21111111, 0x21111112, 0x21111210, 0x21111211, 0x21111212, 0x21121011, 0x21121110,
    0x21121111, 0x21121112, 0x21121211, 0x22101011, 0x22101111, 0x22101210, 0x22111011, 0x22111012,
    0x22111110, 0x22111111, 0x22111112, 0x22111211, 0x22111212, 0x22121010, 0x22121012, 0x22121111,
    0x22121210, 0x22121212, 0x20101021, 0x20101120, 0x20111020, 0x20111121, 0x20111221, 0x20121020,
    0x20121122, 0x20121221, 0x21101121, 0x21101220, 0x21101221, 0x21111021, 0x21111022, 0x21111121,
    0x21111122, 0x21111221, 0x21121121, 0x21121220, 0x22101022, 0x22101120, 0x22101221, 0x22101222,
    0x22111022, 0x22111120, 0x22111121, 0x22121120, 0x22121122, 0x22121221, 0x20102101, 0x20112102,
    0x20112201, 0x20122101, 0x21102001, 0x21102102, 0x21112000, 0x21112002, 0x21112101, 0x21112102,
    0x21112202, 0x21122100, 0x21122101, 0x22102101, 0x22112001, 0x22112102, 0x22112201, 0x22122101,
    0x20102110, 0x20102112, 0x20102211, 0x20112010, 0x20112012, 0x20112111, 0x20112210, 0x20112212,
    0x20122010, 0x20122011, 0x20122110, 0x20122112, 0x21102010, 0x21102012, 0x21102111, 0x21102210,
    0x21102212, 0x21112011, 0x21112110, 0x21112111, 0x21112112, 0x21112211, 0x21122012, 0x21122111,
    0x21122112, 0x21122212, 0x22102011, 0x22102110, 0x22112010, 0x22112012, 0x22112111, 0x22112212,
    0x22122011, 0x22122112, 0x20102121, 0x20112121, 0x20122121, 0x21102120, 0x21102122, 0x21102221,
    0x21112020, 0x21112121, 0x21112220, 0x21122021, 0x22102121, 0x22112021, 0x22112120, 0x22112121,
    0x22112122, 0x20200000, 0x20200002, 0x20200200, 0x20200202, 0x20210101, 0x20220000, 0x20220002,
    0x20220200, 0x20220202, 0x21200101, 0x21210001, 0x21210100, 0x21210102, 0x21210201, 0x22200000,
    0x22200002, 0x22200200, 0x22200202, 0x22210101, 0x22220000, 0x22220002, 0x22220200, 0x22220202,
    0x20200111, 0x20200211, 0x20210011, 0x20210110, 0x20210112, 0x20210211, 0x20210212, 0x21200112,
    0x21200211, 0x21210011, 0x21210111, 0x21210210, 0x21210212, 0x21220011, 0x21220110, 0x22200111,
    0x22210010, 0x22210012, 0x22210112, 0x22210211, 0x20200022, 0x20200220, 0x20200222, 0x20210020,
    0x20210221, 0x20220022, 0x20220220, 0x20220222, 0x21200121, 0x21210021, 0x21210122, 0x21210221,
    0x21220121, 0x22200020, 0x22200022, 0x22200220, 0x22200222, 0x22210121, 0x22220020, 0x22220022,
    0x22220220, 0x22220222, 0x20211201, 0x20221101, 0x21201001, 0x21201100, 0x21211000, 0x21211100,
    0x21211101, 0x21211200, 0x21211202, 0x21221001, 0x21221101, 0x21221102, 0x21221200, 0x21221201,
    0x22201101, 0x20201112, 0x20201211, 0x20211010, 0x20211012, 0x20211111, 0x20211210, 0x20221112,
    0x20221211, 0x21201012, 0x21201111, 0x21211011, 0x21211110, 0x21211111, 0x21211112, 0x21211211,
    0x21221111, 0x21221212, 0x22201011, 0x22201110, 0x22201111, 0x22201112, 0x22201211, 0x22211012,
    0x22211111, 0x22211210, 0x20201121, 0x20211021, 0x20211122, 0x20211222, 0x20221021, 0x20221121,
    0x21201120, 0x21201122, 0x21201222, 0x21211022, 0x21211121, 0x21211122, 0x21211220, 0x21221020,
    0x21221022, 0x22201122, 0x22211020, 0x22211121, 0x22211122, 0x22211221, 0x22221021, 0x22221120,
    0x22221122, 0x20202000, 0x20202002, 0x20202200, 0x20202202, 0x20222000, 0x20222002, 0x20222200,
    0x20222202, 0x21212001, 0x21212100, 0x21212102, 0x21212201, 0x22202000, 0x22202002, 0x22202200,
    0x22202202, 0x22212101, 0x22222000, 0x22222002, 0x22222200, 0x22222202, 0x20202111, 0x20212110,
    0x20212211, 0x20222011, 0x20222111, 0x21202011, 0x21212010, 0x21212111, 0x21212212, 0x21222011,
    0x21222112, 0x21222211, 0x22212010, 0x22212112, 0x20202020, 0x20202022, 0x20202220, 0x20202222,
    0x20222020, 0x20222022, 0x20222220, 0x20222222, 0x21212021, 0x21212120, 0x21212122, 0x22202020,
    0x22202022, 0x22202220, 0x22202222, 0x22212121, 0x22222020, 0x22222022, 0x22222220, 0x22222222,
GGML_TABLE_END()
#endif

#endif // GGML_COMMON_IMPL
#endif // GGML_COMMON_IMPL

#include 

using namespace metal;

#define MAX(x, y) ((x) > (y) ? (x) : (y))
#define MIN(x, y) ((x) < (y) ? (x) : (y))
#define SWAP(x, y) { auto tmp = (x); (x) = (y); (y) = tmp; }

#define N_SIMDWIDTH 32 // assuming SIMD group size is 32

enum ggml_sort_order {
    GGML_SORT_ORDER_ASC,
    GGML_SORT_ORDER_DESC,
};

// general-purpose kernel for addition, subtraction, multiplication and division of two tensors
// pros: works for non-contiguous tensors, supports broadcast across all dims
// cons: not very efficient
kernel void kernel_add(
        device const char * src0,
        device const char * src1,
        device       char * dst,
        constant  int64_t & ne00,
        constant  int64_t & ne01,
        constant  int64_t & ne02,
        constant  int64_t & ne03,
        constant uint64_t & nb00,
        constant uint64_t & nb01,
        constant uint64_t & nb02,
        constant uint64_t & nb03,
        constant  int64_t & ne10,
        constant  int64_t & ne11,
        constant  int64_t & ne12,
        constant  int64_t & ne13,
        constant uint64_t & nb10,
        constant uint64_t & nb11,
        constant uint64_t & nb12,
        constant uint64_t & nb13,
        constant  int64_t & ne0,
        constant  int64_t & ne1,
        constant  int64_t & ne2,
        constant  int64_t & ne3,
        constant uint64_t & nb0,
        constant uint64_t & nb1,
        constant uint64_t & nb2,
        constant uint64_t & nb3,
        constant  int64_t & offs,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig.z;
    const int64_t i02 = tgpig.y;
    const int64_t i01 = tgpig.x;

    const int64_t i13 = i03 % ne13;
    const int64_t i12 = i02 % ne12;
    const int64_t i11 = i01 % ne11;

    device const char * src0_ptr = src0 + i03*nb03 + i02*nb02 + i01*nb01 + offs;
    device const char * src1_ptr = src1 + i13*nb13 + i12*nb12 + i11*nb11;
    device       char * dst_ptr  = dst  + i03*nb3  + i02*nb2  + i01*nb1  + offs;

    for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) {
        const int i10 = i0 % ne10;
        *((device float *)(dst_ptr + i0*nb0)) = *((device float *)(src0_ptr + i0*nb00)) + *((device float *)(src1_ptr + i10*nb10));
    }
}

kernel void kernel_sub(
        device const char * src0,
        device const char * src1,
        device       char * dst,
        constant  int64_t & ne00,
        constant  int64_t & ne01,
        constant  int64_t & ne02,
        constant  int64_t & ne03,
        constant uint64_t & nb00,
        constant uint64_t & nb01,
        constant uint64_t & nb02,
        constant uint64_t & nb03,
        constant  int64_t & ne10,
        constant  int64_t & ne11,
        constant  int64_t & ne12,
        constant  int64_t & ne13,
        constant uint64_t & nb10,
        constant uint64_t & nb11,
        constant uint64_t & nb12,
        constant uint64_t & nb13,
        constant  int64_t & ne0,
        constant  int64_t & ne1,
        constant  int64_t & ne2,
        constant  int64_t & ne3,
        constant uint64_t & nb0,
        constant uint64_t & nb1,
        constant uint64_t & nb2,
        constant uint64_t & nb3,
        constant  int64_t & offs,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig.z;
    const int64_t i02 = tgpig.y;
    const int64_t i01 = tgpig.x;

    const int64_t i13 = i03 % ne13;
    const int64_t i12 = i02 % ne12;
    const int64_t i11 = i01 % ne11;

    device const char * src0_ptr = src0 + i03*nb03 + i02*nb02 + i01*nb01 + offs;
    device const char * src1_ptr = src1 + i13*nb13 + i12*nb12 + i11*nb11;
    device       char * dst_ptr  = dst  + i03*nb3  + i02*nb2  + i01*nb1  + offs;

    for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) {
        const int i10 = i0 % ne10;
        *((device float *)(dst_ptr + i0*nb0)) = *((device float *)(src0_ptr + i0*nb00)) - *((device float *)(src1_ptr + i10*nb10));
    }
}

kernel void kernel_mul(
        device const char * src0,
        device const char * src1,
        device       char * dst,
        constant  int64_t & ne00,
        constant  int64_t & ne01,
        constant  int64_t & ne02,
        constant  int64_t & ne03,
        constant uint64_t & nb00,
        constant uint64_t & nb01,
        constant uint64_t & nb02,
        constant uint64_t & nb03,
        constant  int64_t & ne10,
        constant  int64_t & ne11,
        constant  int64_t & ne12,
        constant  int64_t & ne13,
        constant uint64_t & nb10,
        constant uint64_t & nb11,
        constant uint64_t & nb12,
        constant uint64_t & nb13,
        constant  int64_t & ne0,
        constant  int64_t & ne1,
        constant  int64_t & ne2,
        constant  int64_t & ne3,
        constant uint64_t & nb0,
        constant uint64_t & nb1,
        constant uint64_t & nb2,
        constant uint64_t & nb3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig.z;
    const int64_t i02 = tgpig.y;
    const int64_t i01 = tgpig.x;

    const int64_t i13 = i03 % ne13;
    const int64_t i12 = i02 % ne12;
    const int64_t i11 = i01 % ne11;

    device const char * src0_ptr = src0 + i03*nb03 + i02*nb02 + i01*nb01;
    device const char * src1_ptr = src1 + i13*nb13 + i12*nb12 + i11*nb11;
    device       char * dst_ptr  = dst  + i03*nb3  + i02*nb2  + i01*nb1;

    for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) {
        const int i10 = i0 % ne10;
        *((device float *)(dst_ptr + i0*nb0)) = *((device float *)(src0_ptr + i0*nb00)) * *((device float *)(src1_ptr + i10*nb10));
    }
}

kernel void kernel_div(
        device const char * src0,
        device const char * src1,
        device       char * dst,
        constant  int64_t & ne00,
        constant  int64_t & ne01,
        constant  int64_t & ne02,
        constant  int64_t & ne03,
        constant uint64_t & nb00,
        constant uint64_t & nb01,
        constant uint64_t & nb02,
        constant uint64_t & nb03,
        constant  int64_t & ne10,
        constant  int64_t & ne11,
        constant  int64_t & ne12,
        constant  int64_t & ne13,
        constant uint64_t & nb10,
        constant uint64_t & nb11,
        constant uint64_t & nb12,
        constant uint64_t & nb13,
        constant  int64_t & ne0,
        constant  int64_t & ne1,
        constant  int64_t & ne2,
        constant  int64_t & ne3,
        constant uint64_t & nb0,
        constant uint64_t & nb1,
        constant uint64_t & nb2,
        constant uint64_t & nb3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig.z;
    const int64_t i02 = tgpig.y;
    const int64_t i01 = tgpig.x;

    const int64_t i13 = i03 % ne13;
    const int64_t i12 = i02 % ne12;
    const int64_t i11 = i01 % ne11;

    device const char * src0_ptr = src0 + i03*nb03 + i02*nb02 + i01*nb01;
    device const char * src1_ptr = src1 + i13*nb13 + i12*nb12 + i11*nb11;
    device       char * dst_ptr  = dst  + i03*nb3  + i02*nb2  + i01*nb1;

    for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) {
        const int i10 = i0 % ne10;
        *((device float *)(dst_ptr + i0*nb0)) = *((device float *)(src0_ptr + i0*nb00)) / *((device float *)(src1_ptr + i10*nb10));
    }
}

template
kernel void kernel_repeat(
        device const char * src0,
        device       char * dst,
        constant  int64_t & ne00,
        constant  int64_t & ne01,
        constant  int64_t & ne02,
        constant  int64_t & ne03,
        constant uint64_t & nb00,
        constant uint64_t & nb01,
        constant uint64_t & nb02,
        constant uint64_t & nb03,
        constant  int64_t & ne0,
        constant  int64_t & ne1,
        constant  int64_t & ne2,
        constant  int64_t & ne3,
        constant uint64_t & nb0,
        constant uint64_t & nb1,
        constant uint64_t & nb2,
        constant uint64_t & nb3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i3 = tgpig.z;
    const int64_t i2 = tgpig.y;
    const int64_t i1 = tgpig.x;

    const int64_t i03 = i3 % ne03;
    const int64_t i02 = i2 % ne02;
    const int64_t i01 = i1 % ne01;

    device const char * src0_ptr = src0 + i03*nb03 + i02*nb02 + i01*nb01;
    device       char * dst_ptr  = dst  +  i3*nb3  +  i2*nb2  +  i1*nb1 ;

    for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) {
        const int i00 = i0 % ne00;
        *((device T *)(dst_ptr + i0*nb0)) = *((device T *)(src0_ptr + i00*nb00));
    }
}

typedef decltype(kernel_repeat) kernel_repeat_t;

template [[host_name("kernel_repeat_f32")]] kernel kernel_repeat_t kernel_repeat;
template [[host_name("kernel_repeat_f16")]] kernel kernel_repeat_t kernel_repeat;
template [[host_name("kernel_repeat_i32")]] kernel kernel_repeat_t kernel_repeat;
template [[host_name("kernel_repeat_i16")]] kernel kernel_repeat_t kernel_repeat;

// assumption: src1 is a row
// broadcast src1 into src0
kernel void kernel_add_row(
        device const float4 * src0,
        device const float4 * src1,
        device       float4 * dst,
        constant   uint64_t & nb [[buffer(28)]],
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = src0[tpig] + src1[tpig % nb];
}

kernel void kernel_sub_row(
        device const float4 * src0,
        device const float4 * src1,
        device       float4 * dst,
        constant   uint64_t & nb [[buffer(28)]],
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = src0[tpig] - src1[tpig % nb];
}

kernel void kernel_mul_row(
        device const float4 * src0,
        device const float4 * src1,
        device       float4 * dst,
        constant   uint64_t & nb  [[buffer(28)]],
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = src0[tpig] * src1[tpig % nb];
}

kernel void kernel_div_row(
        device const float4 * src0,
        device const float4 * src1,
        device       float4 * dst,
        constant   uint64_t & nb  [[buffer(28)]],
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = src0[tpig] / src1[tpig % nb];
}

kernel void kernel_scale(
        device const float * src0,
        device       float * dst,
        constant     float & scale,
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = src0[tpig] * scale;
}

kernel void kernel_scale_4(
        device const float4 * src0,
        device       float4 * dst,
        constant     float  & scale,
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = src0[tpig] * scale;
}

kernel void kernel_clamp(
        device const float * src0,
        device       float * dst,
        constant     float & min,
        constant     float & max,
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = src0[tpig] < min ? min : (src0[tpig] > max ? max : src0[tpig]);
}

kernel void kernel_relu(
        device const float * src0,
        device       float * dst,
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = max(0.0f, src0[tpig]);
}

kernel void kernel_sigmoid(
        device const float * src0,
        device       float * dst,
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = 1.0f / (1.0f + exp(-src0[tpig]));
}

kernel void kernel_tanh(
        device const float * src0,
        device       float * dst,
        uint tpig[[thread_position_in_grid]]) {
    device const float & x = src0[tpig];
    dst[tpig] = precise::tanh(x);
}

constant float GELU_COEF_A     = 0.044715f;
constant float GELU_QUICK_COEF = -1.702f;
constant float SQRT_2_OVER_PI  = 0.79788456080286535587989211986876f;

kernel void kernel_gelu(
    device const float * src0,
    device       float * dst,
    uint tpig[[thread_position_in_grid]]) {
    device const float & x = src0[tpig];

    dst[tpig] = 0.5f*x*(1.0f + precise::tanh(SQRT_2_OVER_PI*x*(1.0f + GELU_COEF_A*x*x)));
}

kernel void kernel_gelu_4(
    device const float4 * src0,
    device       float4 * dst,
    uint tpig[[thread_position_in_grid]]) {
    device const float4 & x = src0[tpig];

    // BEWARE !!!
    // Simply using "tanh" instead of "precise::tanh" will sometimes results in NaNs!
    // This was observed with Falcon 7B and 40B models
    //
    dst[tpig] = 0.5f*x*(1.0f + precise::tanh(SQRT_2_OVER_PI*x*(1.0f + GELU_COEF_A*x*x)));
}

kernel void kernel_gelu_quick(
    device const float * src0,
    device       float * dst,
    uint tpig[[thread_position_in_grid]]) {
    device const float & x = src0[tpig];

    dst[tpig] = x*(1.0f/(1.0f+exp(GELU_QUICK_COEF*x)));
}

kernel void kernel_gelu_quick_4(
    device const float4 * src0,
    device       float4 * dst,
    uint tpig[[thread_position_in_grid]]) {
    device const float4 & x = src0[tpig];

    dst[tpig] = x*(1.0f/(1.0f+exp(GELU_QUICK_COEF*x)));
}

kernel void kernel_silu(
        device const float * src0,
        device       float * dst,
        uint tpig[[thread_position_in_grid]]) {
    device const float & x = src0[tpig];
    dst[tpig] = x / (1.0f + exp(-x));
}

kernel void kernel_silu_4(
        device const float4 * src0,
        device       float4 * dst,
        uint tpig[[thread_position_in_grid]]) {
    device const float4 & x = src0[tpig];
    dst[tpig] = x / (1.0f + exp(-x));
}

kernel void kernel_sqr(
        device const float * src0,
        device       float * dst,
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = src0[tpig] * src0[tpig];
}

kernel void kernel_sqrt(
        device const float * src0,
        device       float * dst,
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = sqrt(src0[tpig]);
}

kernel void kernel_sin(
        device const float * src0,
        device       float * dst,
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = sin(src0[tpig]);
}

kernel void kernel_cos(
        device const float * src0,
        device       float * dst,
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = cos(src0[tpig]);
}

kernel void kernel_sum_rows(
        device const float * src0,
        device       float * dst,
        constant  int64_t & ne00,
        constant  int64_t & ne01,
        constant  int64_t & ne02,
        constant  int64_t & ne03,
        constant uint64_t & nb00,
        constant uint64_t & nb01,
        constant uint64_t & nb02,
        constant uint64_t & nb03,
        constant  int64_t & ne10,
        constant  int64_t & ne11,
        constant  int64_t & ne12,
        constant  int64_t & ne13,
        constant uint64_t & nb10,
        constant uint64_t & nb11,
        constant uint64_t & nb12,
        constant uint64_t & nb13,
        constant  int64_t & ne0,
        constant  int64_t & ne1,
        constant  int64_t & ne2,
        constant  int64_t & ne3,
        constant uint64_t & nb0,
        constant uint64_t & nb1,
        constant uint64_t & nb2,
        constant uint64_t & nb3,
        uint3 tpig[[thread_position_in_grid]]) {
    int64_t i3 = tpig.z;
    int64_t i2 = tpig.y;
    int64_t i1 = tpig.x;

    if (i3 >= ne03 || i2 >= ne02 || i1 >= ne01) {
        return;
    }

    device const float * src_row = (device const float *) ((device const char *) src0 + i1*nb01 + i2*nb02 + i3*nb03);
    device       float * dst_row = (device       float *) ((device       char *) dst  + i1*nb1  + i2*nb2  + i3*nb3);

    float row_sum = 0;

    for (int64_t i0 = 0; i0 < ne00; i0++) {
        row_sum += src_row[i0];
    }

    dst_row[0] = row_sum;
}

template
kernel void kernel_soft_max(
        device const  char * src0,
        device const  char * src1,
        device        char * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant     float & scale,
        constant     float & max_bias,
        constant     float & m0,
        constant     float & m1,
        constant  uint32_t & n_head_log2,
        threadgroup  float * buf [[threadgroup(0)]],
        uint  tgpig[[threadgroup_position_in_grid]],
        uint  tpitg[[thread_position_in_threadgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint    ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = (tgpig) / (ne02*ne01);
    const int64_t i02 = (tgpig - i03*ne02*ne01) / ne01;
    const int64_t i01 = (tgpig - i03*ne02*ne01 - i02*ne01);

    device const float * psrc0 = (device const float *) src0 + (i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00);
    device const     T * pmask = src1 != src0 ? (device const    T *) src1         + i01*ne00 : nullptr;
    device       float * pdst  = (device       float *) dst  + (i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00);

    float slope = 1.0f;

    // ALiBi
    if (max_bias > 0.0f) {
        const int64_t h = i02;

        const float base = h < n_head_log2 ? m0 : m1;
        const int   exp  = h < n_head_log2 ? h + 1 : 2*(h - n_head_log2) + 1;

        slope = pow(base, exp);
    }

    // parallel max
    float lmax = -INFINITY;

    for (int i00 = tpitg; i00 < ne00; i00 += ntg) {
        lmax = MAX(lmax, psrc0[i00]*scale + (pmask ? slope*pmask[i00] : 0.0f));
    }

    // find the max value in the block
    float max_val = simd_max(lmax);
    if (ntg > N_SIMDWIDTH) {
        if (sgitg == 0) {
            buf[tiisg] = -INFINITY;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        if (tiisg == 0) {
            buf[sgitg] = max_val;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        max_val = buf[tiisg];
        max_val = simd_max(max_val);
    }

    // parallel sum
    float lsum = 0.0f;
    for (int i00 = tpitg; i00 < ne00; i00 += ntg) {
        const float exp_psrc0 = exp((psrc0[i00]*scale + (pmask ? slope*pmask[i00] : 0.0f)) - max_val);
        lsum += exp_psrc0;
        pdst[i00] = exp_psrc0;
    }

    // This barrier fixes a failing test
    // ref: https://github.com/ggerganov/ggml/pull/621#discussion_r1425156335
    threadgroup_barrier(mem_flags::mem_none);

    float sum = simd_sum(lsum);

    if (ntg > N_SIMDWIDTH) {
        if (sgitg == 0) {
            buf[tiisg] = 0.0f;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        if (tiisg == 0) {
            buf[sgitg] = sum;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        sum = buf[tiisg];
        sum = simd_sum(sum);
    }

    const float inv_sum = 1.0f/sum;

    for (int i00 = tpitg; i00 < ne00; i00 += ntg) {
        pdst[i00] *= inv_sum;
    }
}

template
kernel void kernel_soft_max_4(
        device const  char * src0,
        device const  char * src1,
        device        char * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant     float & scale,
        constant     float & max_bias,
        constant     float & m0,
        constant     float & m1,
        constant  uint32_t & n_head_log2,
        threadgroup  float * buf [[threadgroup(0)]],
        uint  tgpig[[threadgroup_position_in_grid]],
        uint  tpitg[[thread_position_in_threadgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint    ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = (tgpig) / (ne02*ne01);
    const int64_t i02 = (tgpig - i03*ne02*ne01) / ne01;
    const int64_t i01 = (tgpig - i03*ne02*ne01 - i02*ne01);

    device const float4 * psrc4 = (device const float4 *) src0 + (i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00)/4;
    device const      T * pmask = src1 != src0 ? (device const     T *) src1         + i01*ne00/4 : nullptr;
    device       float4 * pdst4 = (device       float4 *) dst  + (i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00)/4;

    float slope = 1.0f;

    if (max_bias > 0.0f) {
        const int64_t h = i02;

        const float base = h < n_head_log2 ? m0 : m1;
        const int   exp  = h < n_head_log2 ? h + 1 : 2*(h - n_head_log2) + 1;

        slope = pow(base, exp);
    }

    // parallel max
    float4 lmax4 = -INFINITY;

    for (int i00 = tpitg; i00 < ne00/4; i00 += ntg) {
        lmax4 = fmax(lmax4, psrc4[i00]*scale + (float4)((pmask ? slope*pmask[i00] : 0.0f)));
    }

    const float lmax = MAX(MAX(lmax4[0], lmax4[1]), MAX(lmax4[2], lmax4[3]));

    float max_val = simd_max(lmax);
    if (ntg > N_SIMDWIDTH) {
        if (sgitg == 0) {
            buf[tiisg] = -INFINITY;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        if (tiisg == 0) {
            buf[sgitg] = max_val;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        max_val = buf[tiisg];
        max_val = simd_max(max_val);
    }

    // parallel sum
    float4 lsum4 = 0.0f;
    for (int i00 = tpitg; i00 < ne00/4; i00 += ntg) {
        const float4 exp_psrc4 = exp((psrc4[i00]*scale + (float4)((pmask ? slope*pmask[i00] : 0.0f))) - max_val);
        lsum4 += exp_psrc4;
        pdst4[i00] = exp_psrc4;
    }

    const float lsum = lsum4[0] + lsum4[1] + lsum4[2] + lsum4[3];

    // This barrier fixes a failing test
    // ref: https://github.com/ggerganov/ggml/pull/621#discussion_r1425156335
    threadgroup_barrier(mem_flags::mem_none);

    float sum = simd_sum(lsum);

    if (ntg > N_SIMDWIDTH) {
        if (sgitg == 0) {
            buf[tiisg] = 0.0f;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        if (tiisg == 0) {
            buf[sgitg] = sum;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        sum = buf[tiisg];
        sum = simd_sum(sum);
    }

    const float inv_sum = 1.0f/sum;

    for (int i00 = tpitg; i00 < ne00/4; i00 += ntg) {
        pdst4[i00] *= inv_sum;
    }
}

typedef decltype(kernel_soft_max)    kernel_soft_max_t;
typedef decltype(kernel_soft_max_4) kernel_soft_max_4_t;

template [[host_name("kernel_soft_max_f16")]]   kernel kernel_soft_max_t   kernel_soft_max;
template [[host_name("kernel_soft_max_f32")]]   kernel kernel_soft_max_t   kernel_soft_max;
template [[host_name("kernel_soft_max_f16_4")]] kernel kernel_soft_max_4_t kernel_soft_max_4;
template [[host_name("kernel_soft_max_f32_4")]] kernel kernel_soft_max_4_t kernel_soft_max_4;

kernel void kernel_diag_mask_inf(
        device const float * src0,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant       int & n_past,
        uint3 tpig[[thread_position_in_grid]]) {
    const int64_t i02 = tpig[2];
    const int64_t i01 = tpig[1];
    const int64_t i00 = tpig[0];

    if (i00 > n_past + i01) {
        dst[i02*ne01*ne00 + i01*ne00 + i00] = -INFINITY;
    } else {
        dst[i02*ne01*ne00 + i01*ne00 + i00] = src0[i02*ne01*ne00 + i01*ne00 + i00];
    }
}

kernel void kernel_diag_mask_inf_8(
        device const float4 * src0,
        device       float4 * dst,
        constant    int64_t & ne00,
        constant    int64_t & ne01,
        constant        int & n_past,
        uint3 tpig[[thread_position_in_grid]]) {

    const int64_t i = 2*tpig[0];

    dst[i+0] = src0[i+0];
    dst[i+1] = src0[i+1];
    int64_t i4 = 4*i;
    const int64_t i02 = i4/(ne00*ne01); i4 -= i02*ne00*ne01;
    const int64_t i01 = i4/(ne00);      i4 -= i01*ne00;
    const int64_t i00 = i4;
    for (int k = 3; k >= 0; --k) {
        if (i00 + 4 + k <= n_past + i01) {
            break;
        }
        dst[i+1][k] = -INFINITY;
        if (i00 + k > n_past + i01) {
            dst[i][k] = -INFINITY;
        }
    }
}

// ref: ggml.c:ggml_compute_forward_ssm_conv_f32
// TODO: optimize
kernel void kernel_ssm_conv_f32(
        device const  void * src0,
        device const  void * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant  uint64_t & nb0,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t ir = tgpig.x;
    const int64_t i2 = tgpig.y;
    const int64_t i3 = tgpig.z;

    const int64_t nc  = ne10;
    const int64_t ncs = ne00;
    const int64_t nr  = ne01;
    const int64_t n_t = ne1;
    const int64_t n_s = ne2;

    device const float * s = (device const float *) ((device const char *) src0 + ir*nb01 + i2*nb00 + i3*nb02);
    device const float * c = (device const float *) ((device const char *) src1 + ir*nb11);
    device       float * x = (device       float *) ((device       char *) dst  + ir*nb0  + i2*nb1  + i3*nb2);

    float sumf = 0.0f;

    for (int64_t i0 = 0; i0 < nc; ++i0) {
        sumf += s[i0] * c[i0];
    }

    x[0] = sumf;
}

// ref: ggml.c:ggml_compute_forward_ssm_scan_f32
// TODO: optimize
kernel void kernel_ssm_scan_f32(
        device const void * src0,
        device const void * src1,
        device const void * src2,
        device const void * src3,
        device const void * src4,
        device const void * src5,
        device      float * dst,
        constant  int64_t & d_state,
        constant  int64_t & d_inner,
        constant  int64_t & n_seq_tokens,
        constant  int64_t & n_seqs,
        constant uint64_t & nb00,
        constant uint64_t & nb01,
        constant uint64_t & nb02,
        constant uint64_t & nb10,
        constant uint64_t & nb11,
        constant uint64_t & nb12,
        constant uint64_t & nb13,
        constant uint64_t & nb20,
        constant uint64_t & nb21,
        constant uint64_t & nb22,
        constant uint64_t & nb30,
        constant uint64_t & nb31,
        constant uint64_t & nb40,
        constant uint64_t & nb41,
        constant uint64_t & nb42,
        constant uint64_t & nb50,
        constant uint64_t & nb51,
        constant uint64_t & nb52,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t ir = tgpig.x;
    const int64_t i3 = tgpig.y;

    const int64_t nc  = d_state;
    const int64_t nr  = d_inner;
    const int64_t n_t = n_seq_tokens;
    const int64_t n_s = n_seqs;

    for (int64_t i2 = 0; i2 < n_t; ++i2) {
        device const float * s0 = (device const float *) ((device const char *) src0 + ir*nb01 + i3*nb02);
        device const float * x  = (device const float *) ((device const char *) src1 + ir*nb10 + i2*nb11 + i3*nb12);
        device const float * dt = (device const float *) ((device const char *) src2 + ir*nb20 + i2*nb21 + i3*nb22);
        device const float * A  = (device const float *) ((device const char *) src3 + ir*nb31);
        device const float * B  = (device const float *) ((device const char *) src4 + i2*nb41 + i3*nb42);
        device const float * C  = (device const float *) ((device const char *) src5 + i2*nb51 + i3*nb52);
        device       float * y  = (device       float *) ((device       char *) dst  + ir*nb10 + i2*nb11 + i3*nb12); // TODO: do not use src1 strides
        device       float * s  = (device       float *) ((device       char *) dst  + ir*nb01 + i3*nb02 +    nb13);

        if (i2 > 0) {
            s0 = s;
        }

        // i1 == 0
        float dt_soft_plus = dt[0] <= 20.0f ? log(1.0f + exp(dt[0])) : dt[0];
        float x_dt = x[0] * dt_soft_plus;
        float sumf = 0.0f;

        for (int64_t i0 = 0; i0 < nc; ++i0) {
            int64_t i = i0;
            float state = (s0[i] * exp(dt_soft_plus * A[i])) + (B[i0] * x_dt);
            sumf += state * C[i0];
            s[i] = state;
        }

        y[0] = sumf;
    }
}

kernel void kernel_norm(
        device const  void * src0,
        device       float * dst,
        constant   int64_t & ne00,
        constant  uint64_t & nb01,
        constant     float & eps,
        threadgroup float  * sum [[threadgroup(0)]],
        uint tgpig[[threadgroup_position_in_grid]],
        uint tpitg[[thread_position_in_threadgroup]],
        uint   ntg[[threads_per_threadgroup]]) {
    device const float * x = (device const float *) ((device const char *) src0 + tgpig*nb01);
    // MEAN
    // parallel sum
    sum[tpitg] = 0.0f;
    for (int i00 = tpitg; i00 < ne00; i00 += ntg) {
        sum[tpitg] += x[i00];
    }
    // reduce
    threadgroup_barrier(mem_flags::mem_threadgroup);
    for (uint i = ntg/2; i > 0; i /= 2) {
        if (tpitg < i) {
            sum[tpitg] += sum[tpitg + i];
        }
        threadgroup_barrier(mem_flags::mem_threadgroup);
    }
    const float mean  = sum[0] / ne00;

    // recenter and VARIANCE
    threadgroup_barrier(mem_flags::mem_threadgroup);
    device float * y = dst + tgpig*ne00;
    sum[tpitg] = 0.0f;
    for (int i00 = tpitg; i00 < ne00; i00 += ntg) {
        y[i00] = x[i00] - mean;
        sum[tpitg] += y[i00] * y[i00];
    }

    // reduce
    threadgroup_barrier(mem_flags::mem_threadgroup);
    for (uint i = ntg/2; i > 0; i /= 2) {
        if (tpitg < i) {
            sum[tpitg] += sum[tpitg + i];
        }
        threadgroup_barrier(mem_flags::mem_threadgroup);
    }
    const float variance = sum[0] / ne00;

    const float scale = 1.0f/sqrt(variance + eps);
    for (int i00 = tpitg; i00 < ne00; i00 += ntg) {
        y[i00] = y[i00] * scale;
    }
}

kernel void kernel_rms_norm(
        device const  void * src0,
        device       float * dst,
        constant   int64_t & ne00,
        constant  uint64_t & nb01,
        constant     float & eps,
        threadgroup float  * buf [[threadgroup(0)]],
        uint tgpig[[threadgroup_position_in_grid]],
        uint tpitg[[thread_position_in_threadgroup]],
        uint sgitg[[simdgroup_index_in_threadgroup]],
        uint tiisg[[thread_index_in_simdgroup]],
        uint   ntg[[threads_per_threadgroup]]) {
    device const float4 * x = (device const float4 *) ((device const char *) src0 + tgpig*nb01);

    float4 sumf = 0;
    float all_sum = 0;

    // parallel sum
    for (int i00 = tpitg; i00 < ne00/4; i00 += ntg) {
        sumf += x[i00] * x[i00];
    }
    all_sum = sumf[0] + sumf[1] + sumf[2] + sumf[3];
    all_sum = simd_sum(all_sum);
    if (ntg > N_SIMDWIDTH) {
        if (sgitg == 0) {
            buf[tiisg] = 0.0f;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        if (tiisg == 0) {
            buf[sgitg] = all_sum;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        all_sum = buf[tiisg];
        all_sum = simd_sum(all_sum);
    }

    const float mean  = all_sum/ne00;
    const float scale = 1.0f/sqrt(mean + eps);

    device float4 * y = (device float4 *) (dst + tgpig*ne00);
    for (int i00 = tpitg; i00 < ne00/4; i00 += ntg) {
        y[i00] = x[i00] * scale;
    }
}

kernel void kernel_group_norm(
        device const float * src0,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int32_t & n_groups,
        constant     float & eps,
        threadgroup float  * buf [[threadgroup(0)]],
        uint tgpig[[threadgroup_position_in_grid]],
        uint tpitg[[thread_position_in_threadgroup]],
        uint sgitg[[simdgroup_index_in_threadgroup]],
        uint tiisg[[thread_index_in_simdgroup]],
        uint   ntg[[threads_per_threadgroup]]) {
    const int64_t ne = ne00*ne01*ne02;
    const int64_t gs = ne00*ne01*((ne02 + n_groups - 1) / n_groups);

    int start = tgpig * gs;
    int end   = start + gs;

    start += tpitg;

    if (end >= ne) {
        end = ne;
    }

    float tmp = 0.0f; // partial sum for thread in warp

    for (int j = start; j < end; j += ntg) {
        tmp += src0[j];
    }

    threadgroup_barrier(mem_flags::mem_threadgroup);
    tmp = simd_sum(tmp);
    if (ntg > N_SIMDWIDTH) {
        if (sgitg == 0) {
            buf[tiisg] = 0.0f;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        if (tiisg == 0) {
            buf[sgitg] = tmp;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        tmp = buf[tiisg];
        tmp = simd_sum(tmp);
    }

    const float mean = tmp / gs;
    tmp = 0.0f;

    for (int j = start; j < end; j += ntg) {
        float xi = src0[j] - mean;
        dst[j] = xi;
        tmp += xi * xi;
    }

    tmp = simd_sum(tmp);
    if (ntg > N_SIMDWIDTH) {
        if (sgitg == 0) {
            buf[tiisg] = 0.0f;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        if (tiisg == 0) {
            buf[sgitg] = tmp;
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        tmp = buf[tiisg];
        tmp = simd_sum(tmp);
    }

    const float variance = tmp / gs;
    const float scale = 1.0f/sqrt(variance + eps);
    for (int j = start; j < end; j += ntg) {
        dst[j] *= scale;
    }
}

// function for calculate inner product between half a q4_0 block and 16 floats (yl), sumy is SUM(yl[i])
// il indicates where the q4 quants begin (0 or QK4_0/4)
// we assume that the yl's have been multiplied with the appropriate scale factor
// that corresponds to the missing bit shifts (1, 1/16, 1/256, 1/4096)
inline float block_q_n_dot_y(device const block_q4_0 * qb_curr, float sumy, thread float * yl, int il) {
    float d = qb_curr->d;

    float2 acc = 0.f;

    device const uint16_t * qs = ((device const uint16_t *)qb_curr + 1 + il/2);

    for (int i = 0; i < 8; i+=2) {
        acc[0] += yl[i + 0] * (qs[i / 2] & 0x000F)
                + yl[i + 1] * (qs[i / 2] & 0x0F00);
        acc[1] += yl[i + 8] * (qs[i / 2] & 0x00F0)
                + yl[i + 9] * (qs[i / 2] & 0xF000);
    }
    return d * (sumy * -8.f + acc[0] + acc[1]);
}

// function for calculate inner product between half a q4_1 block and 16 floats (yl), sumy is SUM(yl[i])
// il indicates where the q4 quants begin (0 or QK4_0/4)
// we assume that the yl's have been multiplied with the appropriate scale factor
// that corresponds to the missing bit shifts (1, 1/16, 1/256, 1/4096)
inline float block_q_n_dot_y(device const block_q4_1 * qb_curr, float sumy, thread float * yl, int il) {
    float d = qb_curr->d;
    float m = qb_curr->m;

    float2 acc = 0.f;

    device const uint16_t * qs = ((device const uint16_t *)qb_curr + 2 + il/2);

    for (int i = 0; i < 8; i+=2) {
        acc[0] += yl[i + 0] * (qs[i / 2] & 0x000F)
                + yl[i + 1] * (qs[i / 2] & 0x0F00);
        acc[1] += yl[i + 8] * (qs[i / 2] & 0x00F0)
                + yl[i + 9] * (qs[i / 2] & 0xF000);
    }
    return d * (acc[0] + acc[1]) + sumy * m;
}

// function for calculate inner product between half a q5_0 block and 16 floats (yl), sumy is SUM(yl[i])
// il indicates where the q5 quants begin (0 or QK5_0/4)
// we assume that the yl's have been multiplied with the appropriate scale factor
// that corresponds to the missing bit shifts (1, 1/16, 1/256, 1/4096)
inline float block_q_n_dot_y(device const block_q5_0 * qb_curr, float sumy, thread float * yl, int il) {
    float d = qb_curr->d;

    float2 acc = 0.f;

    device const uint16_t * qs =  ((device const uint16_t *)qb_curr + 3 + il/2);
           const uint32_t   qh = *((device const uint32_t *)qb_curr->qh);

    for (int i = 0; i < 8; i+=2) {
        acc[0] += yl[i + 0] * ((qs[i / 2] & 0x000F) | ((qh >> (i+0+il        ) << 4 ) & 0x00010))
                + yl[i + 1] * ((qs[i / 2] & 0x0F00) | ((qh >> (i+1+il        ) << 12) & 0x01000));
        acc[1] += yl[i + 8] * ((qs[i / 2] & 0x00F0) | ((qh >> (i+0+il+QK5_0/2) << 8 ) & 0x00100))
                + yl[i + 9] * ((qs[i / 2] & 0xF000) | ((qh >> (i+1+il+QK5_0/2) << 16) & 0x10000));
    }
    return d * (sumy * -16.f + acc[0] + acc[1]);
}

// function for calculate inner product between half a q5_1 block and 16 floats (yl), sumy is SUM(yl[i])
// il indicates where the q5 quants begin (0 or QK5_1/4)
// we assume that the yl's have been multiplied with the appropriate scale factor
// that corresponds to the missing bit shifts (1, 1/16, 1/256, 1/4096)
inline float block_q_n_dot_y(device const block_q5_1 * qb_curr, float sumy, thread float * yl, int il) {
    float d = qb_curr->d;
    float m = qb_curr->m;

    float2 acc = 0.f;

    device const uint16_t * qs =  ((device const uint16_t *)qb_curr + 4 + il/2);
           const uint32_t   qh = *((device const uint32_t *)qb_curr->qh);

    for (int i = 0; i < 8; i+=2) {
        acc[0] += yl[i + 0] * ((qs[i / 2] & 0x000F) | ((qh >> (i+0+il        ) << 4 ) & 0x00010))
                + yl[i + 1] * ((qs[i / 2] & 0x0F00) | ((qh >> (i+1+il        ) << 12) & 0x01000));
        acc[1] += yl[i + 8] * ((qs[i / 2] & 0x00F0) | ((qh >> (i+0+il+QK5_0/2) << 8 ) & 0x00100))
                + yl[i + 9] * ((qs[i / 2] & 0xF000) | ((qh >> (i+1+il+QK5_0/2) << 16) & 0x10000));
    }
    return d * (acc[0] + acc[1]) + sumy * m;
}

// putting them in the kernel cause a significant performance penalty
#define N_DST 4        // each SIMD group works on 4 rows
#define N_SIMDGROUP 2  // number of SIMD groups in a thread group
//Note: This is a template, but strictly speaking it only applies to
//      quantizations where the block size is 32. It also does not
//      guard against the number of rows not being divisible by
//      N_DST, so this is another explicit assumption of the implementation.
template
void mul_vec_q_n_f32_impl(
        device const void  * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3 tgpig, uint tiisg, uint sgitg) {
    const int nb = ne00/QK4_0;

    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * nsg + sgitg) * nr;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_q_type * x = (device const block_q_type *) src0 + offset0;
    device const float        * y = (device const float        *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[16]; // src1 vector cache
    float sumf[nr] = {0.f};

    const int ix = (tiisg/2);
    const int il = (tiisg%2)*8;

    device const float * yb = y + ix * QK4_0 + il;

    // each thread in a SIMD group deals with half a block.
    for (int ib = ix; ib < nb; ib += nw/2) {
        float sumy = 0;
        for (int i = 0; i < 8; i += 2) {
            sumy += yb[i] + yb[i+1];
            yl[i+0] = yb[i+ 0];
            yl[i+1] = yb[i+ 1]/256.f;

            sumy += yb[i+16] + yb[i+17];
            yl[i+8] = yb[i+16]/16.f;
            yl[i+9] = yb[i+17]/4096.f;
        }

        for (int row = 0; row < nr; row++) {
            sumf[row] += block_q_n_dot_y(x+ib+row*nb, sumy, yl, il);
        }

        yb += QK4_0 * 16;
    }

    for (int row = 0; row < nr; ++row) {
        const float tot = simd_sum(sumf[row]);
        if (tiisg == 0 && first_row + row < ne01) {
            dst[im*ne0*ne1 + r1*ne0 + first_row + row] = tot;
        }
    }
}

kernel void kernel_mul_mv_q4_0_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {
    mul_vec_q_n_f32_impl(src0,src1,dst,ne00,ne01,ne02,ne10,ne12,ne0,ne1,r2,r3,nullptr,tgpig,tiisg,sgitg);
}

kernel void kernel_mul_mv_q4_1_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint tiisg[[thread_index_in_simdgroup]],
        uint sgitg[[simdgroup_index_in_threadgroup]]) {
     mul_vec_q_n_f32_impl(src0,src1,dst,ne00,ne01,ne02,ne10,ne12,ne0,ne1,r2,r3,nullptr,tgpig,tiisg,sgitg);
}

kernel void kernel_mul_mv_q5_0_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {
    mul_vec_q_n_f32_impl(src0,src1,dst,ne00,ne01,ne02,ne10,ne12,ne0,ne1,r2,r3,nullptr,tgpig,tiisg,sgitg);
}

kernel void kernel_mul_mv_q5_1_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {
    mul_vec_q_n_f32_impl(src0,src1,dst,ne00,ne01,ne02,ne10,ne12,ne0,ne1,r2,r3,nullptr,tgpig,tiisg,sgitg);
}


#define NB_Q8_0 8

void kernel_mul_mv_q8_0_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {
    const int nr  = N_DST;
    const int nsg = N_SIMDGROUP;
    const int nw  = N_SIMDWIDTH;

    const int nb = ne00/QK8_0;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * nsg + sgitg) * nr;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_q8_0 * x = (device const block_q8_0 *) src0 + offset0;
    device const float      * y = (device const float      *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[NB_Q8_0];
    float sumf[nr]={0.f};

    const int ix = tiisg/4;
    const int il = tiisg%4;

    device const float * yb = y + ix * QK8_0 + NB_Q8_0*il;

    // each thread in a SIMD group deals with NB_Q8_0 quants at a time
    for (int ib = ix; ib < nb; ib += nw/4) {
        for (int i = 0; i < NB_Q8_0; ++i) {
            yl[i] = yb[i];
        }

        for (int row = 0; row < nr; row++) {
            device const int8_t * qs = x[ib+row*nb].qs + NB_Q8_0*il;
            float sumq = 0.f;
            for (int iq = 0; iq < NB_Q8_0; ++iq) {
                sumq += qs[iq] * yl[iq];
            }
            sumf[row] += sumq*x[ib+row*nb].d;
        }

        yb += NB_Q8_0 * nw;
    }

    for (int row = 0; row < nr; ++row) {
        const float tot = simd_sum(sumf[row]);
        if (tiisg == 0 && first_row + row < ne01) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = tot;
        }
    }
}

[[host_name("kernel_mul_mv_q8_0_f32")]]
kernel void kernel_mul_mv_q8_0_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {
    kernel_mul_mv_q8_0_f32_impl(src0,src1,dst,ne00,ne01,ne02,ne10,ne12,ne0,ne1,r2,r3,nullptr,tgpig,tiisg,sgitg);
}

#define N_MV_T_T 4

template
void kernel_mul_mv_impl(
        device const  char * src0,
        device const  char * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                  uint64_t   nb00,
                  uint64_t   nb01,
                  uint64_t   nb02,
                   int64_t   ne10,
                   int64_t   ne11,
                   int64_t   ne12,
                  uint64_t   nb10,
                  uint64_t   nb11,
                  uint64_t   nb12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
                   uint3     tgpig,
                   uint      tiisg) {
    const int64_t r0 = tgpig.x;
    const int64_t rb = tgpig.y*N_MV_T_T;
    const int64_t im = tgpig.z;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = r0*nb01 + (i12/r2)*nb02 + (i13/r3)*nb02*ne02;

    device const T0 * x = (device const T0 *) (src0 + offset0);

    if (ne00 < 128) {
        for (int row = 0; row < N_MV_T_T; ++row) {
            int r1 = rb + row;
            if (r1 >= ne11) {
                break;
            }

            device const T1 * y = (device const T1 *) (src1 + r1*nb11 + im*nb12);

            float sumf = 0;
            for (int i = tiisg; i < ne00; i += 32) {
                sumf += (T0) x[i] * (T1) y[i];
            }

            float all_sum = simd_sum(sumf);
            if (tiisg == 0) {
                dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum;
            }
        }
    } else {
        device const T04 * x4 = (device const T04 *) x;
        for (int row = 0; row < N_MV_T_T; ++row) {
            int r1 = rb + row;
            if (r1 >= ne11) {
                break;
            }

            device const T1  * y  = (device const T1  *) (src1 + r1*nb11 + im*nb12);
            device const T14 * y4 = (device const T14 *) y;

            float sumf = 0;
            for (int i = tiisg; i < ne00/4; i += 32) {
                for (int k = 0; k < 4; ++k) sumf += (float) (x4[i][k] * y4[i][k]);
            }

            float all_sum = simd_sum(sumf);
            if (tiisg == 0) {
                for (int i = 4*(ne00/4); i < ne00; ++i) all_sum += (float) (x[i] * y[i]);
                dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum;
            }
        }
    }
}

template
kernel void kernel_mul_mv(
        device const  char * src0,
        device const  char * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]]) {
    kernel_mul_mv_impl(
        src0,
        src1,
        dst,
        ne00,
        ne01,
        ne02,
        nb00,
        nb01,
        nb02,
        ne10,
        ne11,
        ne12,
        nb10,
        nb11,
        nb12,
        ne0,
        ne1,
        r2,
        r3,
        tgpig,
        tiisg);
}

typedef decltype(kernel_mul_mv) mul_mv_t;

template [[host_name("kernel_mul_mv_f32_f32")]]   kernel mul_mv_t kernel_mul_mv;
template [[host_name("kernel_mul_mv_f16_f32")]]   kernel mul_mv_t kernel_mul_mv;
template [[host_name("kernel_mul_mv_f16_f16")]]   kernel mul_mv_t kernel_mul_mv;

template
kernel void kernel_mul_mv_1row(
        device const  char * src0,
        device const  char * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]]) {

    const int64_t r0 = tgpig.x;
    const int64_t r1 = tgpig.y;
    const int64_t im = tgpig.z;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = r0*nb01 + (i12/r2)*nb02 + (i13/r3)*nb02*ne02;

    device const T     * x = (device const T     *) (src0 + offset0);
    device const float * y = (device const float *) (src1 + r1*nb11 + im*nb12);

    float sumf = 0;
    if (ne00 < 128) {
        for (int i = tiisg; i < ne00; i += 32) {
            sumf += (float) x[i] * (float) y[i];
        }
        float all_sum = simd_sum(sumf);
        if (tiisg == 0) {
            dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum;
        }
    } else {
        device const T4     * x4 = (device const T4     *) x;
        device const float4 * y4 = (device const float4 *) y;

        for (int i = tiisg; i < ne00/4; i += 32) {
            for (int k = 0; k < 4; ++k) sumf += (float) (x4[i][k] * y4[i][k]);
        }

        float all_sum = simd_sum(sumf);

        if (tiisg == 0) {
            for (int i = 4*(ne00/4); i < ne00; ++i) all_sum += (float) (x[i] * y[i]);
            dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum;
        }
    }
}

typedef decltype(kernel_mul_mv_1row) mul_mv_1row_t;

template [[host_name("kernel_mul_mv_f16_f32_1row")]]  kernel mul_mv_1row_t kernel_mul_mv_1row;

// Assumes row size (ne00) is a multiple of 4
template
kernel void kernel_mul_mv_l4(
        device const  char * src0,
        device const  char * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint tiisg[[thread_index_in_simdgroup]]) {

    const int nrows = ne11;
    const int64_t r0 = tgpig.x;
    const int64_t im = tgpig.z;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = r0*nb01 + (i12/r2)*nb02 + (i13/r3)*nb02*ne02;

    device const T4 * x4 = (device const T4 *) (src0 + offset0);

    for (int r1 = 0; r1 < nrows; ++r1) {
        device const float4 * y4 = (device const float4 *) (src1 + r1*nb11 + im*nb12);

        float sumf = 0;
        for (int i = tiisg; i < ne00/4; i += 32) {
            for (int k = 0; k < 4; ++k) sumf += (float) (x4[i][k] * y4[i][k]);
        }

        float all_sum = simd_sum(sumf);
        if (tiisg == 0) {
            dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum;
        }
    }
}

typedef decltype(kernel_mul_mv_l4) mul_mv_l4_t;

template [[host_name("kernel_mul_mv_f16_f32_l4")]]  kernel mul_mv_l4_t kernel_mul_mv_l4;

static float rope_yarn_ramp(const float low, const float high, const int i0) {
    const float y = (i0 / 2 - low) / max(0.001f, high - low);
    return 1.0f - min(1.0f, max(0.0f, y));
}

// YaRN algorithm based on LlamaYaRNScaledRotaryEmbedding.py from https://github.com/jquesnelle/yarn
// MIT licensed. Copyright (c) 2023 Jeffrey Quesnelle and Bowen Peng.
static void rope_yarn(
    float theta_extrap, float freq_scale, float corr_dims[2], int64_t i0, float ext_factor, float mscale,
    thread float * cos_theta, thread float * sin_theta) {
    // Get n-d rotational scaling corrected for extrapolation
    float theta_interp = freq_scale * theta_extrap;
    float theta = theta_interp;
    if (ext_factor != 0.0f) {
        float ramp_mix = rope_yarn_ramp(corr_dims[0], corr_dims[1], i0) * ext_factor;
        theta = theta_interp * (1 - ramp_mix) + theta_extrap * ramp_mix;

        // Get n-d magnitude scaling corrected for interpolation
        mscale *= 1.0f + 0.1f * log(1.0f / freq_scale);
    }
    *cos_theta = cos(theta) * mscale;
    *sin_theta = sin(theta) * mscale;
}

// Apparently solving `n_rot = 2pi * x * base^((2 * max_pos_emb) / n_dims)` for x, we get
// `corr_fac(n_rot) = n_dims * log(max_pos_emb / (n_rot * 2pi)) / (2 * log(base))`
static float rope_yarn_corr_factor(int n_dims, int n_ctx_orig, float n_rot, float base) {
    return n_dims * log(n_ctx_orig / (n_rot * 2 * M_PI_F)) / (2 * log(base));
}

static void rope_yarn_corr_dims(
    int n_dims, int n_ctx_orig, float freq_base, float beta_fast, float beta_slow, float dims[2]
) {
    // start and end correction dims
    dims[0] = max(0.0f,         floor(rope_yarn_corr_factor(n_dims, n_ctx_orig, beta_fast, freq_base)));
    dims[1] = min(n_dims - 1.0f, ceil(rope_yarn_corr_factor(n_dims, n_ctx_orig, beta_slow, freq_base)));
}

template
kernel void kernel_rope_norm(
        device const    void * src0,
        device const int32_t * src1,
        device const   float * src2,
        device         float * dst,
        constant     int64_t & ne00,
        constant     int64_t & ne01,
        constant     int64_t & ne02,
        constant     int64_t & ne03,
        constant    uint64_t & nb00,
        constant    uint64_t & nb01,
        constant    uint64_t & nb02,
        constant    uint64_t & nb03,
        constant     int64_t & ne0,
        constant     int64_t & ne1,
        constant     int64_t & ne2,
        constant     int64_t & ne3,
        constant    uint64_t & nb0,
        constant    uint64_t & nb1,
        constant    uint64_t & nb2,
        constant    uint64_t & nb3,
        constant         int & n_past,
        constant         int & n_dims,
        constant         int & n_ctx_orig,
        constant       float & freq_base,
        constant       float & freq_scale,
        constant       float & ext_factor,
        constant       float & attn_factor,
        constant       float & beta_fast,
        constant       float & beta_slow,
        uint  tiitg[[thread_index_in_threadgroup]],
        uint3 tptg[[threads_per_threadgroup]],
        uint3 tgpig[[threadgroup_position_in_grid]]) {
    const int64_t i3 = tgpig[2];
    const int64_t i2 = tgpig[1];
    const int64_t i1 = tgpig[0];

    float corr_dims[2];
    rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow, corr_dims);

    device const int32_t * pos = src1;

    const float theta_base = (float) pos[i2];
    const float inv_ndims = -1.f/n_dims;

    float cos_theta;
    float sin_theta;

    for (int64_t i0 = 2*tiitg; i0 < ne0; i0 += 2*tptg.x) {
        if (i0 < n_dims) {
            const int64_t ic = i0/2;

            const float theta = theta_base * pow(freq_base, inv_ndims*i0);

            const float freq_factor = src2 != src0 ? src2[ic] : 1.0f;

            rope_yarn(theta/freq_factor, freq_scale, corr_dims, i0, ext_factor, attn_factor, &cos_theta, &sin_theta);

            device const T * const src = (device T *)((device char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00);
            device       T * dst_data  = (device T *)((device char *)  dst + i3*nb3  + i2*nb2  + i1*nb1  + i0*nb0);

            const float x0 = src[0];
            const float x1 = src[1];

            dst_data[0] = x0*cos_theta - x1*sin_theta;
            dst_data[1] = x0*sin_theta + x1*cos_theta;
        } else {
            device const T * const src = (device T *)((device char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00);
            device       T * dst_data  = (device T *)((device char *)  dst + i3*nb3  + i2*nb2  + i1*nb1  + i0*nb0);

            dst_data[0] = src[0];
            dst_data[1] = src[1];
        }
    }
}

template
kernel void kernel_rope_neox(
        device const    void * src0,
        device const int32_t * src1,
        device const   float * src2,
        device         float * dst,
        constant     int64_t & ne00,
        constant     int64_t & ne01,
        constant     int64_t & ne02,
        constant     int64_t & ne03,
        constant    uint64_t & nb00,
        constant    uint64_t & nb01,
        constant    uint64_t & nb02,
        constant    uint64_t & nb03,
        constant     int64_t & ne0,
        constant     int64_t & ne1,
        constant     int64_t & ne2,
        constant     int64_t & ne3,
        constant    uint64_t & nb0,
        constant    uint64_t & nb1,
        constant    uint64_t & nb2,
        constant    uint64_t & nb3,
        constant         int & n_past,
        constant         int & n_dims,
        constant         int & n_ctx_orig,
        constant       float & freq_base,
        constant       float & freq_scale,
        constant       float & ext_factor,
        constant       float & attn_factor,
        constant       float & beta_fast,
        constant       float & beta_slow,
        uint  tiitg[[thread_index_in_threadgroup]],
        uint3 tptg[[threads_per_threadgroup]],
        uint3 tgpig[[threadgroup_position_in_grid]]) {
    const int64_t i3 = tgpig[2];
    const int64_t i2 = tgpig[1];
    const int64_t i1 = tgpig[0];

    float corr_dims[2];
    rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow, corr_dims);

    device const int32_t * pos = src1;

    const float theta_base = (float) pos[i2];
    const float inv_ndims = -1.f/n_dims;

    float cos_theta;
    float sin_theta;

    for (int64_t i0 = 2*tiitg; i0 < ne0; i0 += 2*tptg.x) {
        if (i0 < n_dims) {
            const int64_t ic = i0/2;

            const float theta = theta_base * pow(freq_base, inv_ndims*i0);

            const float freq_factor = src2 != src0 ? src2[ic] : 1.0f;

            rope_yarn(theta/freq_factor, freq_scale, corr_dims, i0, ext_factor, attn_factor, &cos_theta, &sin_theta);

            device const T * const src = (device T *)((device char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00);
            device       T * dst_data  = (device T *)((device char *)  dst + i3*nb3  + i2*nb2  + i1*nb1  + ic*nb0);

            const float x0 = src[0];
            const float x1 = src[n_dims/2];

            dst_data[0]        = x0*cos_theta - x1*sin_theta;
            dst_data[n_dims/2] = x0*sin_theta + x1*cos_theta;
        } else {
            device const T * const src = (device T *)((device char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00);
            device       T * dst_data  = (device T *)((device char *)  dst + i3*nb3  + i2*nb2  + i1*nb1  + i0*nb0);

            dst_data[0] = src[0];
            dst_data[1] = src[1];
        }
    }
}

typedef decltype(kernel_rope_norm) kernel_rope_norm_t;
typedef decltype(kernel_rope_neox) kernel_rope_neox_t;

template [[host_name("kernel_rope_norm_f32")]] kernel kernel_rope_norm_t kernel_rope_norm;
template [[host_name("kernel_rope_norm_f16")]] kernel kernel_rope_norm_t kernel_rope_norm;

template [[host_name("kernel_rope_neox_f32")]] kernel kernel_rope_neox_t kernel_rope_neox;
template [[host_name("kernel_rope_neox_f16")]] kernel kernel_rope_neox_t kernel_rope_neox;

typedef void (im2col_t)(
        device const float * x,
        device        char * dst,
        constant   int32_t & ofs0,
        constant   int32_t & ofs1,
        constant   int32_t & IW,
        constant   int32_t & IH,
        constant   int32_t & CHW,
        constant   int32_t & s0,
        constant   int32_t & s1,
        constant   int32_t & p0,
        constant   int32_t & p1,
        constant   int32_t & d0,
        constant   int32_t & d1,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3  tgpg[[threadgroups_per_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]);

template 
kernel void kernel_im2col(
        device const float * x,
        device        char * dst,
        constant   int32_t & ofs0,
        constant   int32_t & ofs1,
        constant   int32_t & IW,
        constant   int32_t & IH,
        constant   int32_t & CHW,
        constant   int32_t & s0,
        constant   int32_t & s1,
        constant   int32_t & p0,
        constant   int32_t & p1,
        constant   int32_t & d0,
        constant   int32_t & d1,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3  tgpg[[threadgroups_per_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int32_t iiw = tgpig[2] * s0 + tpitg[2] * d0 - p0;
    const int32_t iih = tgpig[1] * s1 + tpitg[1] * d1 - p1;

    const int32_t offset_dst =
        (tpitg[0] * tgpg[1] * tgpg[2] + tgpig[1] * tgpg[2] + tgpig[2]) * CHW +
        (tgpig[0] * (ntg[1] * ntg[2]) + tpitg[1] * ntg[2] + tpitg[2]);

    device T * pdst = (device T *) (dst);

    if (iih < 0 || iih >= IH || iiw < 0 || iiw >= IW) {
        pdst[offset_dst] = 0.0f;
    } else {
        const int32_t offset_src = tpitg[0] * ofs0 + tgpig[0] * ofs1;
        pdst[offset_dst] = x[offset_src + iih * IW + iiw];
    }
}

template [[host_name("kernel_im2col_f32")]] kernel im2col_t kernel_im2col;
template [[host_name("kernel_im2col_f16")]] kernel im2col_t kernel_im2col;

kernel void kernel_upscale_f32(
    device  const char * src0,
    device        char * dst,
    constant   int64_t & ne00,
    constant   int64_t & ne01,
    constant   int64_t & ne02,
    constant   int64_t & ne03,
    constant  uint64_t & nb00,
    constant  uint64_t & nb01,
    constant  uint64_t & nb02,
    constant  uint64_t & nb03,
    constant   int64_t & ne0,
    constant   int64_t & ne1,
    constant   int64_t & ne2,
    constant   int64_t & ne3,
    constant  uint64_t & nb0,
    constant  uint64_t & nb1,
    constant  uint64_t & nb2,
    constant  uint64_t & nb3,
    constant     float & sf0,
    constant     float & sf1,
    constant     float & sf2,
    constant     float & sf3,
    uint3 tgpig[[threadgroup_position_in_grid]],
    uint3 tpitg[[thread_position_in_threadgroup]],
    uint3   ntg[[threads_per_threadgroup]]) {

    const int64_t i3 = tgpig.z;
    const int64_t i2 = tgpig.y;
    const int64_t i1 = tgpig.x;

    const int64_t i03 = i3/sf3;
    const int64_t i02 = i2/sf2;
    const int64_t i01 = i1/sf1;

    for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) {
        const int64_t i00 = i0/sf0;

        device const float * src0_ptr = (device const float *) (src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00);
        device       float * dst_ptr  = (device       float *) (dst  +  i3*nb3  +  i2*nb2  +  i1*nb1  +  i0*nb0);

        dst_ptr[0] = src0_ptr[0];
    }
}

kernel void kernel_pad_f32(
    device  const char * src0,
    device        char * dst,
    constant   int64_t & ne00,
    constant   int64_t & ne01,
    constant   int64_t & ne02,
    constant   int64_t & ne03,
    constant  uint64_t & nb00,
    constant  uint64_t & nb01,
    constant  uint64_t & nb02,
    constant  uint64_t & nb03,
    constant   int64_t & ne0,
    constant   int64_t & ne1,
    constant   int64_t & ne2,
    constant   int64_t & ne3,
    constant  uint64_t & nb0,
    constant  uint64_t & nb1,
    constant  uint64_t & nb2,
    constant  uint64_t & nb3,
    uint3 tgpig[[threadgroup_position_in_grid]],
    uint3 tpitg[[thread_position_in_threadgroup]],
    uint3   ntg[[threads_per_threadgroup]]) {

    const int64_t i3 = tgpig.z;
    const int64_t i2 = tgpig.y;
    const int64_t i1 = tgpig.x;

    const int64_t i03 = i3;
    const int64_t i02 = i2;
    const int64_t i01 = i1;

    device const float * src0_ptr = (device const float *) (src0 + i03*nb03 + i02*nb02 + i01*nb01);
    device       float * dst_ptr  = (device       float *) (dst  +  i3*nb3  +  i2*nb2  +  i1*nb1);

    if (i1 < ne01 && i2 < ne02 && i3 < ne03) {
        for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) {
            if (i0 < ne00) {
                dst_ptr[i0] = src0_ptr[i0];
            } else {
                dst_ptr[i0] = 0.0f;
            }
        }

        return;
    }

    for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) {
        dst_ptr[i0] = 0.0f;
    }
}

kernel void kernel_arange_f32(
    device        char * dst,
    constant   int64_t & ne0,
    constant   float   & start,
    constant   float   & step,
    uint3 tgpig[[threadgroup_position_in_grid]],
    uint3 tpitg[[thread_position_in_threadgroup]],
    uint3   ntg[[threads_per_threadgroup]]) {

    device float * dst_ptr = (device float *) dst;

    for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) {
        dst_ptr[i0] = start + step * i0;
    }
}

kernel void kernel_timestep_embedding_f32(
    device  const char * src0,
    device        char * dst,
    constant  uint64_t & nb1,
    constant  int      & dim,
    constant  int      & max_period,
    uint3 tgpig[[threadgroup_position_in_grid]],
    uint3 tpitg[[thread_position_in_threadgroup]],
    uint3   ntg[[threads_per_threadgroup]]) {

    int i = tgpig.x;
    device float * embed_data = (device float *)(dst +  i*nb1);

    int half_ = dim / 2;
    for (int j = tpitg.x; j < half_; j += ntg.x) {
        float timestep = ((device float *)src0)[i];
        float freq = (float)exp(-log((float)max_period) * j / half_);
        float arg = timestep * freq;
        embed_data[j        ] = cos(arg);
        embed_data[j + half_] = sin(arg);
    }

    if (dim % 2 != 0 && tpitg.x == 0) {
        embed_data[dim] = 0.f;
    }
}

// bitonic sort implementation following the CUDA kernels as reference
typedef void (argsort_t)(
        device const float  * x,
        device     int32_t  * dst,
        constant   int64_t  & ncols,
        constant   int64_t  & ncols_pad,
        threadgroup int32_t * shared_values [[threadgroup(0)]],
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]]);

template
kernel void kernel_argsort_f32_i32(
        device const float   * x,
        device       int32_t * dst,
        constant     int64_t & ncols,
        constant     int64_t & ncols_pad,
        threadgroup int32_t  * shared_values [[threadgroup(0)]],
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]]) {
    // bitonic sort
    int col = tpitg[0];
    int row = tgpig[1];

    if (col >= ncols_pad) return;

    device const float   * x_row   = x + row * ncols;
    threadgroup int32_t  * dst_row = shared_values;

    // initialize indices
    dst_row[col] = col;

    threadgroup_barrier(mem_flags::mem_threadgroup);

    for (int k = 2; k <= ncols_pad; k *= 2) {
        for (int j = k / 2; j > 0; j /= 2) {
            int ixj = col ^ j;
            if (ixj > col) {
                if ((col & k) == 0) {
                    if (dst_row[col] >= ncols ||
                        (dst_row[ixj] < ncols && (order == GGML_SORT_ORDER_ASC ?
                            x_row[dst_row[col]] > x_row[dst_row[ixj]] :
                            x_row[dst_row[col]] < x_row[dst_row[ixj]]))
                    ) {
                        SWAP(dst_row[col], dst_row[ixj]);
                    }
                } else {
                    if (dst_row[ixj] >= ncols ||
                        (dst_row[col] < ncols && (order == GGML_SORT_ORDER_ASC ?
                            x_row[dst_row[col]] < x_row[dst_row[ixj]] :
                            x_row[dst_row[col]] > x_row[dst_row[ixj]]))
                    ) {
                        SWAP(dst_row[col], dst_row[ixj]);
                    }
                }
            }
            threadgroup_barrier(mem_flags::mem_threadgroup);
        }
    }

    // copy the result to dst without the padding
    if (col < ncols) {
        dst[row * ncols + col] = dst_row[col];
    }
}

template [[host_name("kernel_argsort_f32_i32_asc")]]  kernel argsort_t kernel_argsort_f32_i32;
template [[host_name("kernel_argsort_f32_i32_desc")]] kernel argsort_t kernel_argsort_f32_i32;

kernel void kernel_leaky_relu_f32(
        device const float * src0,
        device       float * dst,
        constant     float & slope,
        uint tpig[[thread_position_in_grid]]) {
    dst[tpig] = src0[tpig] > 0.0f ? src0[tpig] : src0[tpig] * slope;
}

typedef void (flash_attn_ext_f16_t)(
        device const  char * q,
        device const  char * k,
        device const  char * v,
        device const  char * mask,
        device       float * dst,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant   int64_t & ne03,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant  uint64_t & nb03,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant   int64_t & ne13,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant  uint64_t & nb13,
        constant  uint64_t & nb21,
        constant  uint64_t & nb22,
        constant  uint64_t & nb23,
        constant  uint64_t & nb31,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant     float & scale,
        constant     float & max_bias,
        constant     float & m0,
        constant     float & m1,
        constant  uint32_t & n_head_log2,
        constant     float & logit_softcap,
        threadgroup   half * shared,
        uint3  tgpig[[threadgroup_position_in_grid]],
        uint3  tpitg[[thread_position_in_threadgroup]],
        uint3    ntg[[threads_per_threadgroup]],
        ushort tiisg[[thread_index_in_simdgroup]],
        ushort sgitg[[simdgroup_index_in_threadgroup]]);

// ref: https://arxiv.org/pdf/2307.08691.pdf
template // head size, queries per threadgroup, cache items per threadgroup
kernel void kernel_flash_attn_ext_f16(
        device const  char * q,
        device const  char * k,
        device const  char * v,
        device const  char * mask,
        device       float * dst,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant   int64_t & ne03,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant  uint64_t & nb03,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant   int64_t & ne13,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant  uint64_t & nb13,
        constant  uint64_t & nb21,
        constant  uint64_t & nb22,
        constant  uint64_t & nb23,
        constant  uint64_t & nb31,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant     float & scale,
        constant     float & max_bias,
        constant     float & m0,
        constant     float & m1,
        constant  uint32_t & n_head_log2,
        constant     float & logit_softcap,
        threadgroup   half * shared [[threadgroup(0)]],
        uint3  tgpig[[threadgroup_position_in_grid]],
        uint3  tpitg[[thread_position_in_threadgroup]],
        uint3    ntg[[threads_per_threadgroup]],
        ushort tiisg[[thread_index_in_simdgroup]],
        ushort sgitg[[simdgroup_index_in_threadgroup]]) {
    const short nsg = ntg.y; // number of simdgroups

    const short iq3 = tgpig[2];
    const short iq2 = tgpig[1];
    const short iq1 = tgpig[0]*Q;

    const short D4 = D/4;
    const short D8 = D/8;
  //const short Q8 = Q/8;
    const short NW = N_SIMDWIDTH;
    const short SH = (C + Q); // shared memory per simdgroup in (half)

    const short T  = D + 2*nsg*SH; // shared memory size per query in (half)
    const short TF = T/2;        // shared memory size per query in (float)
    const short T4 = T/4;        // shared memory size per query in (half4)

    threadgroup half  * sq  = (threadgroup half  *) (shared +              0*D); // holds the query data
    threadgroup half4 * sq4 = (threadgroup half4 *) (shared +              0*D); // same as above but in half4
    threadgroup float * ss  = (threadgroup float *) (shared + 2*sgitg*SH + 1*D); // scratch buffer for attention and diagonal matrix

    // store the result for all queries in local memory in 8x8 matrices (the O matrix from the paper)
    simdgroup_half8x8 lo[D8];

    // load heads from Q to shared memory
    for (short j = sgitg; j < Q; j += nsg) {
        device const float4 * q4 = (device const float4 *) ((device const char *) q + ((iq1 + j)*nb01 + iq2*nb02 + iq3*nb03));

        for (short i = tiisg; i < D4; i += NW) {
            if (iq1 + j < ne01) {
                sq4[j*T4 + i] = (half4) q4[i];
            } else {
                sq4[j*T4 + i] = 0.0h;
            }
        }
    }

    // zero out lo
    for (short i = 0; i < D8; ++i) {
        lo[i] = make_filled_simdgroup_matrix(0.0h);
    }

    // zero out shared memory SH
    for (short j = 0; j < Q; ++j) {
        for (short i = tiisg; i < SH; i += NW) {
            ss[j*TF + i] = 0.0f;
        }
    }

    threadgroup_barrier(mem_flags::mem_threadgroup);

    {
        float S[Q] = { [0 ... Q-1] = 0.0h };
        float M[Q] = { [0 ... Q-1] = -FLT_MAX/2 };

        // assume K and V are same shape
        const short ne22 = ne12;
        const short ne23 = ne13;

        // broadcast
        const short rk2 = ne02/ne12;
        const short rk3 = ne03/ne13;

        const short rv2 = ne02/ne22;
        const short rv3 = ne03/ne23;

        // k indices
        const short ik2 = iq2/rk2;
        const short ik3 = iq3/rk3;

        // v indices
        const short iv2 = iq2/rv2;
        const short iv3 = iq3/rv3;

        // load the queries from shared memory into local memory
        simdgroup_half8x8 mq[D8];

        for (short i = 0; i < D8; ++i) {
            simdgroup_load(mq[i], sq + i*8, T);
        }

        // pointer to the mask
        device const half * mp = (device const half *) (mask + iq1*nb31);

        float slope = 1.0f;

        // ALiBi
        if (max_bias > 0.0f) {
            const uint32_t h = iq2;

            const float base = h < n_head_log2 ? m0 : m1;
            const int   exph = h < n_head_log2 ? h + 1 : 2*(h - n_head_log2) + 1;

            slope = pow(base, exph);
        }

        // loop over the KV cache
        // each simdgroup handles blocks of Q rows and C columns
        for (int ic0 = 0; ic0 < ne11; ic0 += C*nsg) {
            const int ic = ic0 + C*sgitg;
            if (ic >= ne11) {
                break;
            }

            // Q*K^T
            {
                for (short cc = 0; cc < C/8; ++cc) {
                    simdgroup_float8x8 mqk = make_filled_simdgroup_matrix(0.h);

                    device const half * pk = (device const half *) ((device const char *) k + ((ic + 8*cc)*nb11 + ik2*nb12 + ik3*nb13));

                    for (short i = 0; i < D8; ++i) {
                        simdgroup_half8x8 mk;
                        simdgroup_load(mk, pk + i*8, nb11/sizeof(half), 0, true); // transpose

                        simdgroup_multiply_accumulate(mqk, mq[i], mk, mqk);
                    }

                    simdgroup_store(mqk, ss + 8*cc, TF, 0, false);
                }
            }

            // used to detect blocks full of -INF
            float smax = -INFINITY;

            // online softmax
            {
                float ms[Q];

                for (short j = 0; j < Q; ++j) {
                    const float m = M[j];

                    // scale and apply the logitcap / mask
                    float s = ss[j*TF + tiisg]*scale;

                    if (logit_softcap != 0.0f) {
                        s = logit_softcap*precise::tanh(s);
                    }

                    if (mask != q) {
                        // mqk = mqk + mask*slope
                        s += slope*mp[ic + j*nb31/sizeof(half) + tiisg];
                    }

                    smax = simd_max(max(smax, s));
                    M[j] = simd_max(max(M[j], s));

                                ms[j] = exp(m - M[j]);
                    const float vs    = exp(s - M[j]);

                    S[j] = S[j]*ms[j] + simd_sum(vs);

                    // the P matrix from the paper (Q rows, C columns)
                    ss[j*TF + tiisg] = vs;
                }

                // create a QxQ diagonal matrix for rescaling the output
                if (tiisg < Q) {
                    ss[tiisg*TF + C + tiisg] = ms[tiisg];
                }
            }

            // skip -INF blocks
            if (smax == -INFINITY) {
                continue;
            }

            // O = diag(ms)*O
            {
                simdgroup_float8x8 mm;
                simdgroup_load(mm, ss + C, TF, 0, false);

                for (short i = 0; i < D8; ++i) {
                    simdgroup_multiply(lo[i], mm, lo[i]);
                }
            }

            // O = O + (Q*K^T)*V
            {
                for (short cc = 0; cc < C/8; ++cc) {
                    device const half * pv = (device const half *) ((device const char *) v + ((ic + 8*cc)*nb21 + iv2*nb22 + iv3*nb23));

                    for (short i = 0; i < D8; ++i) {
                        simdgroup_half8x8 mk;
                        simdgroup_load(mk, pv + i*8, nb21/sizeof(half), 0, false);

                        simdgroup_float8x8 mv;
                        simdgroup_load(mv, ss + 8*cc, TF, 0, false);

                        simdgroup_multiply_accumulate(lo[i], mv, mk, lo[i]);
                    }
                }
            }
        }

        // these are needed for reducing the results from the simdgroups (reuse the ss buffer)
        for (short j = 0; j < Q; ++j) {
            if (tiisg == 0) {
                ss[j*TF + 0] = S[j];
                ss[j*TF + 1] = M[j];
            }
        }
    }

    // reduce the warps sequentially
    for (short sg = 1; sg < nsg; ++sg) {
        float S = { 0.0h };
        float M = { -FLT_MAX/2 };

        threadgroup_barrier(mem_flags::mem_threadgroup);

        // each simdgroup stores its output to shared memory, reusing sq
        if (sgitg == sg) {
            for (short i = 0; i < D8; ++i) {
                simdgroup_store(lo[i], sq + i*8, T, 0, false);
            }
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        // the first simdgroup accumulates the results from the other simdgroups
        if (sgitg == 0) {
            for (short j = 0; j < Q; ++j) {
                const float S0 = ss[j*TF +         0];
                const float S1 = ss[j*TF + sg*SH + 0];

                const float M0 = ss[j*TF +         1];
                const float M1 = ss[j*TF + sg*SH + 1];

                M = max(M0, M1);

                const float ms0 = exp(M0 - M);
                const float ms1 = exp(M1 - M);

                S = S0*ms0 + S1*ms1;

                if (tiisg == 0) {
                    ss[j*TF + 0] = S;
                    ss[j*TF + 1] = M;

                    ss[j*TF + C + j        ] = ms0;
                    ss[j*TF + C + j + sg*SH] = ms1;
                }
            }

            // O_0 = diag(ms0)*O_0 + diag(ms1)*O_1
            {
                simdgroup_half8x8 t;
                simdgroup_float8x8 ms0;
                simdgroup_float8x8 ms1;

                simdgroup_load(ms0, ss + C,         TF, 0, false);
                simdgroup_load(ms1, ss + C + sg*SH, TF, 0, false);

                for (short i = 0; i < D8; ++i) {
                    simdgroup_load    (t, sq + i*8, T, 0, false);
                    simdgroup_multiply(t, ms1, t);

                    simdgroup_multiply_accumulate(lo[i], ms0, lo[i], t);
                }
            }
        }
    }

    // store result to shared memory (reuse sq)
    if (sgitg == 0) {
        for (short i = 0; i < D8; ++i) {
            simdgroup_store(lo[i], sq + i*8, T, 0, false);
        }
    }

    device float4 * dst4 = (device float4 *) dst;

    // final rescale with 1/S and store to global memory
    if (sgitg == 0) {
        for (short j = 0; j < Q && iq1 + j < ne01; ++j) {
            const float S = ss[j*TF + 0];

            for (short i = tiisg; i < D4; i += NW) {
                dst4[(iq3*ne2*ne1 + iq2 + (iq1 + j)*ne1)*D4 + i] = (float4) sq4[j*T4 + i]/S;
            }
        }
    }
}

template [[host_name("kernel_flash_attn_ext_f16_h64" )]] kernel flash_attn_ext_f16_t kernel_flash_attn_ext_f16<64>;
template [[host_name("kernel_flash_attn_ext_f16_h80" )]] kernel flash_attn_ext_f16_t kernel_flash_attn_ext_f16<80>;
template [[host_name("kernel_flash_attn_ext_f16_h96" )]] kernel flash_attn_ext_f16_t kernel_flash_attn_ext_f16<96>;
template [[host_name("kernel_flash_attn_ext_f16_h112")]] kernel flash_attn_ext_f16_t kernel_flash_attn_ext_f16<112>;
template [[host_name("kernel_flash_attn_ext_f16_h128")]] kernel flash_attn_ext_f16_t kernel_flash_attn_ext_f16<128>;
//template [[host_name("kernel_flash_attn_ext_f16_h256")]] kernel flash_attn_ext_f16_t kernel_flash_attn_ext_f16<256>;

template // head size, queries per threadgroup, cache items per threadgroup
kernel void kernel_flash_attn_ext_vec_f16(
        device const  char * q,
        device const  char * k,
        device const  char * v,
        device const  char * mask,
        device       float * dst,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant   int64_t & ne03,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant  uint64_t & nb03,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant   int64_t & ne13,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant  uint64_t & nb13,
        constant  uint64_t & nb21,
        constant  uint64_t & nb22,
        constant  uint64_t & nb23,
        constant  uint64_t & nb31,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant     float & scale,
        constant     float & max_bias,
        constant     float & m0,
        constant     float & m1,
        constant  uint32_t & n_head_log2,
        constant     float & logit_softcap,
        threadgroup   half * shared [[threadgroup(0)]],
        uint3  tgpig[[threadgroup_position_in_grid]],
        uint3  tpitg[[thread_position_in_threadgroup]],
        uint3    ntg[[threads_per_threadgroup]],
        ushort tiisg[[thread_index_in_simdgroup]],
        ushort sgitg[[simdgroup_index_in_threadgroup]]) {
    const short nsg = ntg.y; // number of simdgroups

    const short iq3 = tgpig[2];
    const short iq2 = tgpig[1];
    const short iq1 = tgpig[0];

    const short D4 = D/4;
    const short NW = N_SIMDWIDTH;
    const short SH = (C + Q); // shared memory per simdgroup in (half)

    const short T  = D + 2*nsg*SH; // shared memory size per query in (half)

    float slope = 1.0f;

    // ALiBi
    if (max_bias > 0.0f) {
        const uint32_t h = iq2;

        const float base = h < n_head_log2 ? m0 : m1;
        const int   exp  = h < n_head_log2 ? h + 1 : 2*(h - n_head_log2) + 1;

        slope = pow(base, exp);
    }

  //threadgroup half   * sq  = (threadgroup half   *) (shared +              0*D); // holds the query data
    threadgroup half4  * sq4 = (threadgroup half4  *) (shared +              0*D); // same as above but in half4
    threadgroup float  * ss  = (threadgroup float  *) (shared + 2*sgitg*SH + 1*D); // scratch buffer for attention and diagonal matrix
    threadgroup float4 * ss4 = (threadgroup float4 *) (shared + 2*sgitg*SH + 1*D); // same as above but in half4
    threadgroup half4  * sr4 = (threadgroup half4  *) (shared +   sgitg*D  + 1*T); // scratch buffer for the results

    // store the result for all queries in local memory in 8x8 matrices (the O matrix from the paper)
    half4 lo[D4/NW];

    // load heads from Q to shared memory
    device const float4 * q4 = (device const float4 *) ((device const char *) q + (iq1*nb01 + iq2*nb02 + iq3*nb03));

    for (short i = tiisg; i < D4; i += NW) {
        if (iq1 < ne01) {
            sq4[i] = (half4) q4[i];
        } else {
            sq4[i] = 0.0h;
        }
    }

    // zero out lo
    for (short i = tiisg; i < D4; i += NW) {
        lo[i/NW] = 0.0h;
    }

    // zero out shared memory SH
    for (short i = tiisg; i < SH/4; i += NW) {
        ss4[i] = 0.0h;
    }

    threadgroup_barrier(mem_flags::mem_threadgroup);

    {
        float S = { 0.0h };
        float M = { -FLT_MAX/2 };

        // assume K and V are same shape
        const short ne22 = ne12;
        const short ne23 = ne13;

        // broadcast
        const short rk2 = ne02/ne12;
        const short rk3 = ne03/ne13;

        const short rv2 = ne02/ne22;
        const short rv3 = ne03/ne23;

        // k indices
        const short ik2 = iq2 / rk2;
        const short ik3 = iq3 / rk3;

        // v indices
        const short iv2 = iq2 / rv2;
        const short iv3 = iq3 / rv3;

        // load the queries from shared memory into local memory
        float4 mq[D4];

        for (short ii = 0; ii < D4; ii += NW) {
            short i = ii + tiisg;
            mq[i] = (float4) sq4[i];
        }

        // pointer to the mask
        device const half4 * mp4 = (device const half4 *) (mask + iq1*nb31);

        // loop over the KV cache
        // each simdgroup handles blocks of Q rows and C columns
        for (int ic0 = 0; ic0 < ne11; ic0 += C*nsg) {
            const int ic = ic0 + C*sgitg;
            if (ic >= ne11) {
                break;
            }

            // Q*K^T
            {
#pragma unroll
                for (short cc = 0; cc < C/4; ++cc) {
                    float4 mqk = { 0.0h };

                    device const half4 * pk4 = (device const half4 *) ((device const char *) k + ((ic + 4*cc)*nb11 + ik2*nb12 + ik3*nb13));

#pragma unroll
                    for (short ii = 0; ii < D4; ii += NW) {
                        const short i = ii + tiisg;

                        float4x4 mk;
                        mk[0] = (float4) pk4[i + 0*(nb11/8)];
                        mk[1] = (float4) pk4[i + 1*(nb11/8)];
                        mk[2] = (float4) pk4[i + 2*(nb11/8)];
                        mk[3] = (float4) pk4[i + 3*(nb11/8)];

                        mqk += (float4) (mq[i] * mk);
                    }

                    // reduce the results from the threads in the simdgroup
                    mqk += simd_shuffle_down(mqk, 16);
                    mqk += simd_shuffle_down(mqk,  8);
                    mqk += simd_shuffle_down(mqk,  4);
                    mqk += simd_shuffle_down(mqk,  2);
                    mqk += simd_shuffle_down(mqk,  1);

                    // mqk = mqk*scale + mask*slope
                    if (tiisg == 0) {
                        mqk *= scale;

                        if (logit_softcap != 0.0f) {
                            mqk = logit_softcap*precise::tanh(mqk);
                        }

                        mqk += (mask != q) ? ((float4) mp4[ic/4 + cc])*slope : (float4) 0.0f;

                        ss4[cc] = mqk;
                    }
                }
            }

            // online softmax
            {
                const short p = tiisg;

                const float m = M;
                const float s = ss[p];

                M = simd_max(max(M, s));

                const float ms = exp(m - M);
                const float vs = exp(s - M);

                S = S*ms + simd_sum(vs);

                // the P matrix from the paper (Q rows, C columns)
                ss[p] = vs;

                // O = diag(ms)*O
#pragma unroll
                for (short ii = 0; ii < D4; ii += NW) {
                    const short i = ii + tiisg;
                    lo[i/NW] *= ms;
                }
            }

            // O = O + (Q*K^T)*V
            {
#pragma unroll
                for (short cc = 0; cc < C/4; ++cc) {
                    device const half4 * pv4 = (device const half4 *) ((device const char *) v + ((ic + 4*cc)*nb21 + iv2*nb22 + iv3*nb23));

#pragma unroll
                    for (short ii = 0; ii < D4; ii += NW) {
                        const short i = ii + tiisg;

                        lo[i/NW] += pv4[i + 0*(nb21/8)] * ss[4*cc + 0];
                        lo[i/NW] += pv4[i + 1*(nb21/8)] * ss[4*cc + 1];
                        lo[i/NW] += pv4[i + 2*(nb21/8)] * ss[4*cc + 2];
                        lo[i/NW] += pv4[i + 3*(nb21/8)] * ss[4*cc + 3];
                    }
                }
            }

        }

        // these are needed for reducing the results from the simdgroups (reuse the ss buffer)
        if (tiisg == 0) {
            ss[0] = S;
            ss[1] = M;
        }
    }

    // store results to shared memory
    for (short ii = 0; ii < D4; ii += NW) {
        short i = ii + tiisg;
        sr4[i] = lo[ii/NW];
    }

    threadgroup_barrier(mem_flags::mem_threadgroup);

    // parallel reduce
    for (short r = nsg/2; r > 0; r >>= 1) {
        if (sgitg < r) {
            const float S0 = ss[       0];
            const float S1 = ss[r*SH + 0];

            const float M0 = ss[       1];
            const float M1 = ss[r*SH + 1];

            const float M = max(M0, M1);

            const float ms0 = exp(M0 - M);
            const float ms1 = exp(M1 - M);

            const float S = S0*ms0 + S1*ms1;

            if (tiisg == 0) {
                ss[0] = S;
                ss[1] = M;
            }

            // O_0 = diag(ms0)*O_0 + diag(ms1)*O_1
            for (short ii = 0; ii < D4; ii += NW) {
                short i = ii + tiisg;
                sr4[i] = sr4[i]*ms0 + sr4[i + r*D4]*ms1;
            }
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);
    }

    device float4 * dst4 = (device float4 *) dst;

    // final rescale with 1/S and store to global memory
    if (sgitg == 0) {
        const float S = ss[0];

        for (short ii = 0; ii < D4; ii += NW) {
            short i = ii + tiisg;
            dst4[(iq3*ne2*ne1 + iq2 + (iq1)*ne1)*D4 + i] = (float4) sr4[i]/S;
        }
    }
}

template [[host_name("kernel_flash_attn_ext_vec_f16_h128")]] kernel flash_attn_ext_f16_t kernel_flash_attn_ext_vec_f16<128>;
//template [[host_name("kernel_flash_attn_ext_vec_f16_h256")]] kernel flash_attn_ext_f16_t kernel_flash_attn_ext_vec_f16<256>;

template
kernel void kernel_cpy(
        device  const void * src0,
        device        void * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant   int64_t & ne03,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant  uint64_t & nb03,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant   int64_t & ne3,
        constant  uint64_t & nb0,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        constant  uint64_t & nb3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig[2];
    const int64_t i02 = tgpig[1];
    const int64_t i01 = tgpig[0];

    const int64_t n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00;

    const int64_t i3 = n / (ne2*ne1*ne0);
    const int64_t i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0);
    const int64_t i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0;
    const int64_t i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0);

    device T1 * dst_data = (device T1 *) ((device char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);

    for (int64_t i00 = tpitg.x; i00 < ne00; i00 += ntg.x) {
        device const T0 * src = (device T0 *)((device char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00);
        dst_data[i00] = (T1) src[0];
    }
}

typedef decltype(kernel_cpy) kernel_cpy_t;

template [[host_name("kernel_cpy_f32_f32")]]  kernel kernel_cpy_t kernel_cpy;
template [[host_name("kernel_cpy_f32_f16")]]  kernel kernel_cpy_t kernel_cpy;
template [[host_name("kernel_cpy_f16_f16")]]  kernel kernel_cpy_t kernel_cpy;
template [[host_name("kernel_cpy_f16_f32")]]  kernel kernel_cpy_t kernel_cpy;

kernel void kernel_cpy_f32_q8_0(
        device const float * src0,
        device        void * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant   int64_t & ne03,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant  uint64_t & nb03,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant   int64_t & ne3,
        constant  uint64_t & nb0,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        constant  uint64_t & nb3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig[2];
    const int64_t i02 = tgpig[1];
    const int64_t i01 = tgpig[0];

    const int64_t n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00;

    const int64_t i3 = n / (ne2*ne1*ne0);
    const int64_t i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0);
    const int64_t i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0;
    const int64_t i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0)/QK8_0;

    device block_q8_0 * dst_data = (device block_q8_0 *) ((device char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);

    for (int64_t i00 = tpitg.x*QK8_0; i00 < ne00; i00 += ntg.x*QK8_0) {
        device const float * src = (device float *)((device char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00);

        float amax = 0.0f; // absolute max

        for (int j = 0; j < QK8_0; j++) {
            const float v = src[j];
            amax = MAX(amax, fabs(v));
        }

        const float d = amax / ((1 << 7) - 1);
        const float id = d ? 1.0f/d : 0.0f;

        dst_data[i00/QK8_0].d = d;

        for (int j = 0; j < QK8_0; ++j) {
            const float x0 = src[j]*id;

            dst_data[i00/QK8_0].qs[j] = round(x0);
        }
    }
}

kernel void kernel_cpy_f32_q4_0(
        device const float * src0,
        device        void * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant   int64_t & ne03,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant  uint64_t & nb03,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant   int64_t & ne3,
        constant  uint64_t & nb0,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        constant  uint64_t & nb3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig[2];
    const int64_t i02 = tgpig[1];
    const int64_t i01 = tgpig[0];

    const int64_t n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00;

    const int64_t i3 = n / (ne2*ne1*ne0);
    const int64_t i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0);
    const int64_t i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0;
    const int64_t i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0)/QK4_0;

    device block_q4_0 * dst_data = (device block_q4_0 *) ((device char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);

    for (int64_t i00 = tpitg.x*QK4_0; i00 < ne00; i00 += ntg.x*QK4_0) {
        device const float * src = (device float *)((device char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00);

        float amax = 0.0f; // absolute max
        float max  = 0.0f;

        for (int j = 0; j < QK4_0; j++) {
            const float v = src[j];
            if (amax < fabs(v)) {
                amax = fabs(v);
                max  = v;
            }
        }

        const float d = max / -8;
        const float id = d ? 1.0f/d : 0.0f;

        dst_data[i00/QK4_0].d = d;

        for (int j = 0; j < QK4_0/2; ++j) {
            const float x0 = src[0       + j]*id;
            const float x1 = src[QK4_0/2 + j]*id;

            const uint8_t xi0 = MIN(15, (int8_t)(x0 + 8.5f));
            const uint8_t xi1 = MIN(15, (int8_t)(x1 + 8.5f));

            dst_data[i00/QK4_0].qs[j]  = xi0;
            dst_data[i00/QK4_0].qs[j] |= xi1 << 4;
        }
    }
}

kernel void kernel_cpy_f32_q4_1(
        device const float * src0,
        device        void * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant   int64_t & ne03,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant  uint64_t & nb03,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant   int64_t & ne3,
        constant  uint64_t & nb0,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        constant  uint64_t & nb3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig[2];
    const int64_t i02 = tgpig[1];
    const int64_t i01 = tgpig[0];

    const int64_t n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00;

    const int64_t i3 = n / (ne2*ne1*ne0);
    const int64_t i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0);
    const int64_t i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0;
    const int64_t i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0)/QK4_1;

    device block_q4_1 * dst_data = (device block_q4_1 *) ((device char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);

    for (int64_t i00 = tpitg.x*QK4_1; i00 < ne00; i00 += ntg.x*QK4_1) {
        device const float * src = (device float *)((device char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00);

        float min = FLT_MAX;
        float max = -FLT_MAX;

        for (int j = 0; j < QK4_1; j++) {
            const float v = src[j];
            if (min > v) min = v;
            if (max < v) max = v;
        }

        const float d = (max - min) / ((1 << 4) - 1);
        const float id = d ? 1.0f/d : 0.0f;

        dst_data[i00/QK4_1].d = d;
        dst_data[i00/QK4_1].m = min;

        for (int j = 0; j < QK4_1/2; ++j) {
            const float x0 = (src[0       + j] - min)*id;
            const float x1 = (src[QK4_1/2 + j] - min)*id;

            const uint8_t xi0 = MIN(15, (int8_t)(x0 + 0.5f));
            const uint8_t xi1 = MIN(15, (int8_t)(x1 + 0.5f));

            dst_data[i00/QK4_1].qs[j]  = xi0;
            dst_data[i00/QK4_1].qs[j] |= xi1 << 4;
        }
    }
}

kernel void kernel_cpy_f32_q5_0(
        device const float * src0,
        device        void * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant   int64_t & ne03,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant  uint64_t & nb03,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant   int64_t & ne3,
        constant  uint64_t & nb0,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        constant  uint64_t & nb3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig[2];
    const int64_t i02 = tgpig[1];
    const int64_t i01 = tgpig[0];

    const int64_t n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00;

    const int64_t i3 = n / (ne2*ne1*ne0);
    const int64_t i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0);
    const int64_t i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0;
    const int64_t i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0)/QK5_0;

    device block_q5_0 * dst_data = (device block_q5_0 *) ((device char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);

    for (int64_t i00 = tpitg.x*QK5_0; i00 < ne00; i00 += ntg.x*QK5_0) {
        device const float * src = (device float *)((device char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00);

        float amax = 0.0f; // absolute max
        float max  = 0.0f;

        for (int j = 0; j < QK5_0; j++) {
            const float v = src[j];
            if (amax < fabs(v)) {
                amax = fabs(v);
                max  = v;
            }
        }

        const float d = max / -16;
        const float id = d ? 1.0f/d : 0.0f;

        dst_data[i00/QK5_0].d = d;

        uint32_t qh = 0;
        for (int j = 0; j < QK5_0/2; ++j) {
            const float x0 = src[0       + j]*id;
            const float x1 = src[QK5_0/2 + j]*id;

            const uint8_t xi0 = MIN(31, (int8_t)(x0 + 16.5f));
            const uint8_t xi1 = MIN(31, (int8_t)(x1 + 16.5f));

            dst_data[i00/QK5_0].qs[j] = (xi0 & 0xf) | ((xi1 & 0xf) << 4);
            qh |= ((xi0 & 0x10u) >> 4) << (j + 0);
            qh |= ((xi1 & 0x10u) >> 4) << (j + QK5_0/2);
        }
        thread const uint8_t * qh8 = (thread const uint8_t *)&qh;
        for (int j = 0; j < 4; ++j) {
            dst_data[i00/QK5_0].qh[j] = qh8[j];
        }
    }
}

kernel void kernel_cpy_f32_q5_1(
        device const float * src0,
        device        void * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant   int64_t & ne03,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant  uint64_t & nb03,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant   int64_t & ne3,
        constant  uint64_t & nb0,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        constant  uint64_t & nb3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig[2];
    const int64_t i02 = tgpig[1];
    const int64_t i01 = tgpig[0];

    const int64_t n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00;

    const int64_t i3 = n / (ne2*ne1*ne0);
    const int64_t i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0);
    const int64_t i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0;
    const int64_t i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0)/QK5_1;

    device block_q5_1 * dst_data = (device block_q5_1 *) ((device char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);

    for (int64_t i00 = tpitg.x*QK5_1; i00 < ne00; i00 += ntg.x*QK5_1) {
        device const float * src = (device float *)((device char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00);

        float max = src[0];
        float min = src[0];

        for (int j = 1; j < QK5_1; j++) {
            const float v = src[j];
            min = v < min ? v : min;
            max = v > max ? v : max;
        }

        const float d = (max - min) / 31;
        const float id = d ? 1.0f/d : 0.0f;

        dst_data[i00/QK5_1].d = d;
        dst_data[i00/QK5_1].m = min;

        uint32_t qh = 0;
        for (int j = 0; j < QK5_1/2; ++j) {
            const float x0 = (src[0       + j] - min)*id;
            const float x1 = (src[QK5_1/2 + j] - min)*id;

            const uint8_t xi0 = (uint8_t)(x0 + 0.5f);
            const uint8_t xi1 = (uint8_t)(x1 + 0.5f);

            dst_data[i00/QK5_1].qs[j] = (xi0 & 0xf) | ((xi1 & 0xf) << 4);
            qh |= ((xi0 & 0x10u) >> 4) << (j + 0);
            qh |= ((xi1 & 0x10u) >> 4) << (j + QK5_1/2);
        }
        thread const uint8_t * qh8 = (thread const uint8_t *)&qh;
        for (int j = 0; j < 4; ++j) {
            dst_data[i00/QK5_1].qh[j] = qh8[j];
        }
    }
}

static inline int best_index_int8(int n, constant float * val, float x) {
    if (x <= val[0]) return 0;
    if (x >= val[n-1]) return n-1;
    int ml = 0, mu = n-1;
    while (mu-ml > 1) {
        int mav = (ml+mu)/2;
        if (x < val[mav]) mu = mav; else ml = mav;
    }
    return x - val[mu-1] < val[mu] - x ? mu-1 : mu;
}

constexpr constant static float kvalues_iq4nl_f[16] = {
    -127.f, -104.f, -83.f, -65.f, -49.f, -35.f, -22.f, -10.f, 1.f, 13.f, 25.f, 38.f, 53.f, 69.f, 89.f, 113.f
};

kernel void kernel_cpy_f32_iq4_nl(
        device const float * src0,
        device        void * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant   int64_t & ne03,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant  uint64_t & nb03,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   int64_t & ne2,
        constant   int64_t & ne3,
        constant  uint64_t & nb0,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        constant  uint64_t & nb3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint3 tpitg[[thread_position_in_threadgroup]],
        uint3   ntg[[threads_per_threadgroup]]) {
    const int64_t i03 = tgpig[2];
    const int64_t i02 = tgpig[1];
    const int64_t i01 = tgpig[0];

    const int64_t n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00;

    const int64_t i3 = n / (ne2*ne1*ne0);
    const int64_t i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0);
    const int64_t i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0;
    const int64_t i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0)/QK4_NL;

    device block_iq4_nl * dst_data = (device block_iq4_nl *) ((device char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);

    for (int64_t i00 = tpitg.x*QK4_NL; i00 < ne00; i00 += ntg.x*QK4_NL) {
        device const float * src = (device float *)((device char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00);

        float amax = 0.0f; // absolute max
        float max  = 0.0f;

        for (int j = 0; j < QK4_0; j++) {
            const float v = src[j];
            if (amax < fabs(v)) {
                amax = fabs(v);
                max  = v;
            }
        }

        const float d = max / kvalues_iq4nl_f[0];
        const float id = d ? 1.0f/d : 0.0f;

        float sumqx = 0, sumq2 = 0;
        for (int j = 0; j < QK4_NL/2; ++j) {
            const float x0 = src[0        + j]*id;
            const float x1 = src[QK4_NL/2 + j]*id;

            const uint8_t xi0 = best_index_int8(16, kvalues_iq4nl_f, x0);
            const uint8_t xi1 = best_index_int8(16, kvalues_iq4nl_f, x1);

            dst_data[i00/QK4_NL].qs[j] = xi0 | (xi1 << 4);

            const float v0 = kvalues_iq4nl_f[xi0];
            const float v1 = kvalues_iq4nl_f[xi1];
            const float w0 = src[0        + j]*src[0        + j];
            const float w1 = src[QK4_NL/2 + j]*src[QK4_NL/2 + j];
            sumqx += w0*v0*src[j] + w1*v1*src[QK4_NL/2 + j];
            sumq2 += w0*v0*v0 + w1*v1*v1;

        }

        dst_data[i00/QK4_NL].d = sumq2 > 0 ? sumqx/sumq2 : d;

    }
}

kernel void kernel_concat(
    device  const char * src0,
    device  const char * src1,
    device        char * dst,
    constant   int64_t & ne00,
    constant   int64_t & ne01,
    constant   int64_t & ne02,
    constant   int64_t & ne03,
    constant  uint64_t & nb00,
    constant  uint64_t & nb01,
    constant  uint64_t & nb02,
    constant  uint64_t & nb03,
    constant   int64_t & ne10,
    constant   int64_t & ne11,
    constant   int64_t & ne12,
    constant   int64_t & ne13,
    constant  uint64_t & nb10,
    constant  uint64_t & nb11,
    constant  uint64_t & nb12,
    constant  uint64_t & nb13,
    constant   int64_t & ne0,
    constant   int64_t & ne1,
    constant   int64_t & ne2,
    constant   int64_t & ne3,
    constant  uint64_t & nb0,
    constant  uint64_t & nb1,
    constant  uint64_t & nb2,
    constant  uint64_t & nb3,
    constant   int32_t & dim,
    uint3 tgpig[[threadgroup_position_in_grid]],
    uint3 tpitg[[thread_position_in_threadgroup]],
    uint3   ntg[[threads_per_threadgroup]]) {

    const int64_t i3 = tgpig.z;
    const int64_t i2 = tgpig.y;
    const int64_t i1 = tgpig.x;

    int64_t o[4] = {0, 0, 0, 0};
    o[dim] = dim == 0 ? ne00 : (dim == 1 ? ne01 : (dim == 2 ? ne02 : ne03));

    device const float * x;

    for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) {
        if (i0 < ne00 && i1 < ne01 && i2 < ne02 && i3 < ne03) {
            x = (device const float *)(src0 + (i3       )*nb03 + (i2       )*nb02 + (i1       )*nb01 + (i0       )*nb00);
        } else {
            x = (device const float *)(src1 + (i3 - o[3])*nb13 + (i2 - o[2])*nb12 + (i1 - o[1])*nb11 + (i0 - o[0])*nb10);
        }

        device float * y = (device float *)(dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);

        *y = *x;
    }
}

void kernel_mul_mv_q2_K_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const int nb = ne00/QK_K;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * N_SIMDGROUP + sgitg) * N_DST;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_q2_K * x = (device const block_q2_K *) src0 + ib_row + offset0;
    device const float      * y = (device const float      *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[32];
    float sumf[N_DST]={0.f}, all_sum;

    const int step = sizeof(block_q2_K) * nb;

    const int ix = tiisg/8;  // 0...3
    const int it = tiisg%8;  // 0...7
    const int iq = it/4;     // 0 or 1
    const int ir = it%4;     // 0...3
    const int is = (8*ir)/16;// 0 or 1

    device const float * y4 = y + ix * QK_K + 128 * iq + 8 * ir;

    for (int ib = ix; ib < nb; ib += 4) {

        float4 sumy = {0.f, 0.f, 0.f, 0.f};
        for (int i = 0; i < 8; ++i) {
            yl[i+ 0] = y4[i+ 0]; sumy[0] += yl[i+ 0];
            yl[i+ 8] = y4[i+32]; sumy[1] += yl[i+ 8];
            yl[i+16] = y4[i+64]; sumy[2] += yl[i+16];
            yl[i+24] = y4[i+96]; sumy[3] += yl[i+24];
        }

        device const uint8_t  * sc = (device const uint8_t  *)x[ib].scales + 8*iq + is;
        device const uint16_t * qs = (device const uint16_t *)x[ib].qs + 16 * iq + 4 * ir;
        device const half     * dh = &x[ib].d;

        for (int row = 0; row < N_DST; row++) {

            float4 acc1 = {0.f, 0.f, 0.f, 0.f};
            float4 acc2 = {0.f, 0.f, 0.f, 0.f};
            for (int i = 0; i < 8; i += 2) {
                acc1[0] += yl[i+ 0] * (qs[i/2] & 0x0003);
                acc2[0] += yl[i+ 1] * (qs[i/2] & 0x0300);
                acc1[1] += yl[i+ 8] * (qs[i/2] & 0x000c);
                acc2[1] += yl[i+ 9] * (qs[i/2] & 0x0c00);
                acc1[2] += yl[i+16] * (qs[i/2] & 0x0030);
                acc2[2] += yl[i+17] * (qs[i/2] & 0x3000);
                acc1[3] += yl[i+24] * (qs[i/2] & 0x00c0);
                acc2[3] += yl[i+25] * (qs[i/2] & 0xc000);
            }
            float dall = dh[0];
            float dmin = dh[1] * 1.f/16.f;
            sumf[row] += dall * ((acc1[0] + 1.f/256.f * acc2[0]) * (sc[0] & 0xF) * 1.f/ 1.f +
                                 (acc1[1] + 1.f/256.f * acc2[1]) * (sc[2] & 0xF) * 1.f/ 4.f +
                                 (acc1[2] + 1.f/256.f * acc2[2]) * (sc[4] & 0xF) * 1.f/16.f +
                                 (acc1[3] + 1.f/256.f * acc2[3]) * (sc[6] & 0xF) * 1.f/64.f) -
                         dmin * (sumy[0] * (sc[0] & 0xF0) + sumy[1] * (sc[2] & 0xF0) + sumy[2] * (sc[4] & 0xF0) + sumy[3] * (sc[6] & 0xF0));

            qs += step/2;
            sc += step;
            dh += step/2;
        }

        y4 += 4 * QK_K;
    }

    for (int row = 0; row < N_DST; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum;
        }
    }
}

[[host_name("kernel_mul_mv_q2_K_f32")]]
kernel void kernel_mul_mv_q2_K_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_q2_K_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, nullptr, tgpig, tiisg, sgitg);
}

void kernel_mul_mv_q3_K_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const int nb = ne00/QK_K;

    const int64_t r0 = tgpig.x;
    const int64_t r1 = tgpig.y;
    const int64_t im = tgpig.z;

    const int first_row = (r0 * N_SIMDGROUP + sgitg) * 2;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_q3_K * x = (device const block_q3_K *) src0 + first_row*nb + offset0;
    device const float     * yy = (device const float      *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[32];

    //const uint16_t kmask1 = 0x3030;
    //const uint16_t kmask2 = 0x0f0f;

    const int tid = tiisg/4;
    const int ix  = tiisg%4;
    const int ip  = tid/4;          // 0 or 1
    const int il  = 2*((tid%4)/2);  // 0 or 2
    const int ir  = tid%2;
    const int n   = 8;
    const int l0  = n*ir;

    // One would think that the Metal compiler would figure out that ip and il can only have
    // 4 possible states, and optimize accordingly. Well, no. It needs help, and we do it
    // with these two tales.
    //
    // Possible masks for the high bit
    const ushort4 mm[4] = {{0x0001, 0x0100, 0x0002, 0x0200},  // ip = 0, il = 0
                           {0x0004, 0x0400, 0x0008, 0x0800},  // ip = 0, il = 2
                           {0x0010, 0x1000, 0x0020, 0x2000},  // ip = 1, il = 0
                           {0x0040, 0x4000, 0x0080, 0x8000}}; // ip = 1, il = 2

    // Possible masks for the low 2 bits
    const int4 qm[2] = {{0x0003, 0x0300, 0x000c, 0x0c00}, {0x0030, 0x3000, 0x00c0, 0xc000}};

    const ushort4 hm = mm[2*ip + il/2];

    const int shift = 2*il;
    const float    v1 = il == 0 ? 4.f : 64.f;
    const float    v2 = 4.f * v1;

    const uint16_t s_shift1 = 4*ip;
    const uint16_t s_shift2 = s_shift1 + il;

    const int q_offset = 32*ip + l0;
    const int y_offset = 128*ip + 32*il + l0;

    const int step = sizeof(block_q3_K) * nb / 2;

    device const float * y1 = yy + ix*QK_K + y_offset;

    uint32_t scales32, aux32;
    thread uint16_t * scales16 = (thread uint16_t *)&scales32;
    thread const int8_t * scales = (thread const int8_t *)&scales32;

    float sumf1[2] = {0.f};
    float sumf2[2] = {0.f};
    for (int i = ix; i < nb; i += 4) {

        for (int l = 0; l < 8; ++l) {
            yl[l+ 0] = y1[l+ 0];
            yl[l+ 8] = y1[l+16];
            yl[l+16] = y1[l+32];
            yl[l+24] = y1[l+48];
        }

        device const uint16_t * q = (device const uint16_t *)(x[i].qs + q_offset);
        device const uint16_t * h = (device const uint16_t *)(x[i].hmask + l0);
        device const uint16_t * a = (device const uint16_t *)(x[i].scales);
        device const half * dh = &x[i].d;

        for (int row = 0; row < 2; ++row) {

            const float d_all = (float)dh[0];

            scales16[0] = a[4];
            scales16[1] = a[5];
            aux32 = ((scales32 >> s_shift2) << 4) & 0x30303030;
            scales16[0] = a[il+0];
            scales16[1] = a[il+1];
            scales32 = ((scales32 >> s_shift1) & 0x0f0f0f0f) | aux32;

            float s1 = 0, s2 = 0, s3 = 0, s4 = 0, s5 = 0, s6 = 0;
            for (int l = 0; l < n; l += 2) {
                const int32_t qs = q[l/2];
                s1 += yl[l+0] * (qs & qm[il/2][0]);
                s2 += yl[l+1] * (qs & qm[il/2][1]);
                s3 += ((h[l/2] & hm[0]) ? 0.f : yl[l+0]) + ((h[l/2] & hm[1]) ? 0.f : yl[l+1]);
                s4 += yl[l+16] * (qs & qm[il/2][2]);
                s5 += yl[l+17] * (qs & qm[il/2][3]);
                s6 += ((h[l/2] & hm[2]) ? 0.f : yl[l+16]) + ((h[l/2] & hm[3]) ? 0.f : yl[l+17]);
            }
            float d1 = d_all * (s1 + 1.f/256.f * s2 - s3*v1);
            float d2 = d_all * (s4 + 1.f/256.f * s5 - s6*v2);
            sumf1[row] += d1 * (scales[0] - 32);
            sumf2[row] += d2 * (scales[2] - 32);

            s1 = s2 = s3 = s4 = s5 = s6 = 0;
            for (int l = 0; l < n; l += 2) {
                const int32_t qs = q[l/2+8];
                s1 += yl[l+8] * (qs & qm[il/2][0]);
                s2 += yl[l+9] * (qs & qm[il/2][1]);
                s3 += ((h[l/2+8] & hm[0]) ? 0.f : yl[l+8]) + ((h[l/2+8] & hm[1]) ? 0.f : yl[l+9]);
                s4 += yl[l+24] * (qs & qm[il/2][2]);
                s5 += yl[l+25] * (qs & qm[il/2][3]);
                s6 += ((h[l/2+8] & hm[2]) ? 0.f : yl[l+24]) + ((h[l/2+8] & hm[3]) ? 0.f : yl[l+25]);
            }
            d1 = d_all * (s1 + 1.f/256.f * s2 - s3*v1);
            d2 = d_all * (s4 + 1.f/256.f * s5 - s6*v2);
            sumf1[row] += d1 * (scales[1] - 32);
            sumf2[row] += d2 * (scales[3] - 32);

            q  += step;
            h  += step;
            a  += step;
            dh += step;

        }

        y1 += 4 * QK_K;

    }

    for (int row = 0; row < 2; ++row) {
        const float sumf = (sumf1[row] + 0.25f * sumf2[row]) / (1 << shift);
        sumf1[row] = simd_sum(sumf);
    }
    if (tiisg == 0) {
        for (int row = 0; row < 2; ++row) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = sumf1[row];
        }
    }
}

[[host_name("kernel_mul_mv_q3_K_f32")]]
kernel void kernel_mul_mv_q3_K_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_q3_K_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, nullptr, tgpig, tiisg, sgitg);
}

void kernel_mul_mv_q4_K_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const uint16_t kmask1 = 0x3f3f;
    const uint16_t kmask2 = 0x0f0f;
    const uint16_t kmask3 = 0xc0c0;

    const int ix = tiisg/8;  // 0...3
    const int it = tiisg%8;  // 0...7
    const int iq = it/4;     // 0 or 1
    const int ir = it%4;     // 0...3

    const int nb = ne00/QK_K;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;
    //const int first_row = (r0 * N_SIMDGROUP + sgitg) * N_DST;
    const int first_row = r0 * N_DST;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_q4_K * x = (device const block_q4_K *) src0 + ib_row + offset0;
    device const float      * y = (device const float      *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[16];
    float yh[16];
    float sumf[N_DST]={0.f}, all_sum;

    const int step = sizeof(block_q4_K) * nb / 2;

    device const float * y4 = y + ix * QK_K + 64 * iq + 8 * ir;

    uint16_t sc16[4];
    thread const uint8_t * sc8 = (thread const uint8_t *)sc16;

    for (int ib = ix; ib < nb; ib += 4) {

        float4 sumy = {0.f, 0.f, 0.f, 0.f};
        for (int i = 0; i < 8; ++i) {
            yl[i+0] = y4[i+  0]; sumy[0] += yl[i+0];
            yl[i+8] = y4[i+ 32]; sumy[1] += yl[i+8];
            yh[i+0] = y4[i+128]; sumy[2] += yh[i+0];
            yh[i+8] = y4[i+160]; sumy[3] += yh[i+8];
        }

        device const uint16_t * sc = (device const uint16_t *)x[ib].scales + iq;
        device const uint16_t * q1 = (device const uint16_t *)x[ib].qs + 16 * iq + 4 * ir;
        device const half     * dh = &x[ib].d;

        for (int row = 0; row < N_DST; row++) {

            sc16[0] = sc[0] & kmask1;
            sc16[1] = sc[2] & kmask1;
            sc16[2] = ((sc[4] >> 0) & kmask2) | ((sc[0] & kmask3) >> 2);
            sc16[3] = ((sc[4] >> 4) & kmask2) | ((sc[2] & kmask3) >> 2);

            device const uint16_t * q2 = q1 + 32;

            float4 acc1 = {0.f, 0.f, 0.f, 0.f};
            float4 acc2 = {0.f, 0.f, 0.f, 0.f};
            for (int i = 0; i < 8; i += 2) {
                acc1[0] += yl[i+0] * (q1[i/2] & 0x000F);
                acc1[1] += yl[i+1] * (q1[i/2] & 0x0F00);
                acc1[2] += yl[i+8] * (q1[i/2] & 0x00F0);
                acc1[3] += yl[i+9] * (q1[i/2] & 0xF000);
                acc2[0] += yh[i+0] * (q2[i/2] & 0x000F);
                acc2[1] += yh[i+1] * (q2[i/2] & 0x0F00);
                acc2[2] += yh[i+8] * (q2[i/2] & 0x00F0);
                acc2[3] += yh[i+9] * (q2[i/2] & 0xF000);
            }

            float dall = dh[0];
            float dmin = dh[1];
            sumf[row] += dall * ((acc1[0] + 1.f/256.f * acc1[1]) * sc8[0] +
                                 (acc1[2] + 1.f/256.f * acc1[3]) * sc8[1] * 1.f/16.f +
                                 (acc2[0] + 1.f/256.f * acc2[1]) * sc8[4] +
                                 (acc2[2] + 1.f/256.f * acc2[3]) * sc8[5] * 1.f/16.f) -
                         dmin * (sumy[0] * sc8[2] + sumy[1] * sc8[3] + sumy[2] * sc8[6] + sumy[3] * sc8[7]);

            q1 += step;
            sc += step;
            dh += step;
        }

        y4 += 4 * QK_K;
    }

    for (int row = 0; row < N_DST; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum;
        }
    }
}

[[host_name("kernel_mul_mv_q4_K_f32")]]
kernel void kernel_mul_mv_q4_K_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint tiisg[[thread_index_in_simdgroup]],
        uint sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_q4_K_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, nullptr, tgpig, tiisg, sgitg);
}

void kernel_mul_mv_q5_K_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const int nb = ne00/QK_K;

    const int64_t r0 = tgpig.x;
    const int64_t r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * N_SIMDGROUP + sgitg) * 2;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_q5_K * x = (device const block_q5_K *) src0 + first_row*nb + offset0;
    device const float     * yy = (device const float      *) src1 + r1*ne10 + im*ne00*ne1;

    float sumf[2]={0.f};

    const int step = sizeof(block_q5_K) * nb;

    float yl[16], yh[16];

    const uint16_t kmask1 = 0x3f3f;
    const uint16_t kmask2 = 0x0f0f;
    const uint16_t kmask3 = 0xc0c0;

    const int tid = tiisg/4;
    const int ix  = tiisg%4;
    const int iq  = tid/4;
    const int ir  = tid%4;
    const int n   = 8;

    const int l0 = n*ir;
    const int q_offset = 32*iq + l0;
    const int y_offset = 64*iq + l0;

    const uint8_t hm1 = 1u << (2*iq);
    const uint8_t hm2 = hm1 << 1;
    const uint8_t hm3 = hm1 << 4;
    const uint8_t hm4 = hm2 << 4;

    uint16_t sc16[4];
    thread const uint8_t * sc8 = (thread const uint8_t *)sc16;

    device const float * y1 = yy + ix*QK_K + y_offset;

    for (int i = ix; i < nb; i += 4) {

        device const uint8_t * q1 = x[i].qs + q_offset;
        device const uint8_t * qh = x[i].qh + l0;
        device const half * dh = &x[i].d;
        device const uint16_t * a = (device const uint16_t *)x[i].scales + iq;

        device const float * y2 = y1 + 128;
        float4 sumy = {0.f, 0.f, 0.f, 0.f};
        for (int l = 0; l < 8; ++l) {
            yl[l+0] = y1[l+ 0]; sumy[0] += yl[l+0];
            yl[l+8] = y1[l+32]; sumy[1] += yl[l+8];
            yh[l+0] = y2[l+ 0]; sumy[2] += yh[l+0];
            yh[l+8] = y2[l+32]; sumy[3] += yh[l+8];
        }

        for (int row = 0; row < 2; ++row) {

            device const uint8_t * q2 = q1 + 64;

            sc16[0] = a[0] & kmask1;
            sc16[1] = a[2] & kmask1;
            sc16[2] = ((a[4] >> 0) & kmask2) | ((a[0] & kmask3) >> 2);
            sc16[3] = ((a[4] >> 4) & kmask2) | ((a[2] & kmask3) >> 2);

            float4 acc1 = {0.f};
            float4 acc2 = {0.f};
            for (int l = 0; l < n; ++l) {
                uint8_t h = qh[l];
                acc1[0] += yl[l+0] * (q1[l] & 0x0F);
                acc1[1] += yl[l+8] * (q1[l] & 0xF0);
                acc1[2] += yh[l+0] * (q2[l] & 0x0F);
                acc1[3] += yh[l+8] * (q2[l] & 0xF0);
                acc2[0] += h & hm1 ? yl[l+0] : 0.f;
                acc2[1] += h & hm2 ? yl[l+8] : 0.f;
                acc2[2] += h & hm3 ? yh[l+0] : 0.f;
                acc2[3] += h & hm4 ? yh[l+8] : 0.f;
            }
            const float dall = dh[0];
            const float dmin = dh[1];
            sumf[row] += dall * (sc8[0] * (acc1[0] +  16.f*acc2[0]) +
                                 sc8[1] * (acc1[1]/16.f + 16.f*acc2[1]) +
                                 sc8[4] * (acc1[2] +  16.f*acc2[2]) +
                                 sc8[5] * (acc1[3]/16.f + 16.f*acc2[3])) -
                         dmin * (sumy[0] * sc8[2] + sumy[1] * sc8[3] + sumy[2] * sc8[6] + sumy[3] * sc8[7]);

            q1 += step;
            qh += step;
            dh += step/2;
            a  += step/2;

        }

        y1 += 4 * QK_K;

    }

    for (int row = 0; row < 2; ++row) {
        const float tot = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = tot;
        }
    }
}

[[host_name("kernel_mul_mv_q5_K_f32")]]
kernel void kernel_mul_mv_q5_K_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_q5_K_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, nullptr, tgpig, tiisg, sgitg);
}

void kernel_mul_mv_q6_K_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const uint8_t kmask1 = 0x03;
    const uint8_t kmask2 = 0x0C;
    const uint8_t kmask3 = 0x30;
    const uint8_t kmask4 = 0xC0;

    const int nb = ne00/QK_K;

    const int64_t r0 = tgpig.x;
    const int64_t r1 = tgpig.y;
    const int     im = tgpig.z;

    const int row = 2 * r0 + sgitg;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_q6_K * x = (device const block_q6_K *) src0 + row * nb + offset0;
    device const float     * yy = (device const float      *) src1 + r1*ne10 + im*ne00*ne1;

    float sumf = 0;

    const int tid  = tiisg/2;
    const int ix   = tiisg%2;
    const int ip   = tid/8;         // 0 or 1
    const int il   = tid%8;
    const int n    = 4;
    const int l0   = n*il;
    const int is   = 8*ip + l0/16;

    const int y_offset = 128*ip + l0;
    const int q_offset_l = 64*ip + l0;
    const int q_offset_h = 32*ip + l0;

    for (int i = ix; i < nb; i += 2) {

        device const uint8_t * q1 = x[i].ql + q_offset_l;
        device const uint8_t * q2 = q1 + 32;
        device const uint8_t * qh = x[i].qh + q_offset_h;
        device const int8_t  * sc = x[i].scales + is;

        device const float * y = yy + i * QK_K + y_offset;

        const float dall = x[i].d;

        float4 sums = {0.f, 0.f, 0.f, 0.f};
        for (int l = 0; l < n; ++l) {
            sums[0] += y[l+ 0] * ((int8_t)((q1[l] & 0xF) | ((qh[l] & kmask1) << 4)) - 32);
            sums[1] += y[l+32] * ((int8_t)((q2[l] & 0xF) | ((qh[l] & kmask2) << 2)) - 32);
            sums[2] += y[l+64] * ((int8_t)((q1[l]  >> 4) | ((qh[l] & kmask3) << 0)) - 32);
            sums[3] += y[l+96] * ((int8_t)((q2[l]  >> 4) | ((qh[l] & kmask4) >> 2)) - 32);
        }

        sumf += dall * (sums[0] * sc[0] + sums[1] * sc[2] + sums[2] * sc[4] + sums[3] * sc[6]);

    }

    const float tot = simd_sum(sumf);
    if (tiisg == 0) {
        dst[r1*ne0 + im*ne0*ne1 + row] = tot;
    }
}

[[host_name("kernel_mul_mv_q6_K_f32")]]
kernel void kernel_mul_mv_q6_K_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_q6_K_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, nullptr, tgpig, tiisg, sgitg);
}

// ======================= "True" 2-bit

void kernel_mul_mv_iq2_xxs_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const int nb = ne00/QK_K;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * N_SIMDGROUP + sgitg) * N_DST;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_iq2_xxs * x = (device const block_iq2_xxs *) src0 + ib_row + offset0;
    device const float         * y = (device const float         *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[32];
    float sumf[N_DST]={0.f}, all_sum;

    const int nb32 = nb * (QK_K / 32);

    threadgroup uint64_t * values = (threadgroup uint64_t *)shared_values;
    threadgroup uint8_t  * shared_signs = (threadgroup uint8_t *)(values + 256);
    {
        int nval = 4;
        int pos  = (32*sgitg + tiisg)*nval;
        for (int i = 0; i < nval; ++i) values[pos + i] = iq2xxs_grid[pos + i];
        nval = 2;
        pos  = (32*sgitg + tiisg)*nval;
        for (int i = 0; i < nval; ++i) shared_signs[pos+i] = ksigns_iq2xs[pos+i];
        threadgroup_barrier(mem_flags::mem_threadgroup);
    }

    const int ix = tiisg;

    device const float * y4 = y + 32 * ix;

    for (int ib32 = ix; ib32 < nb32; ib32 += 32) {

        for (int i = 0; i < 32; ++i) {
            yl[i] = y4[i];
        }

        const int ibl = ib32 / (QK_K / 32);
        const int ib  = ib32 % (QK_K / 32);

        device const block_iq2_xxs * xr = x + ibl;
        device const uint16_t * q2 = xr->qs + 4 * ib;
        device const half * dh = &xr->d;

        for (int row = 0; row < N_DST; row++) {

            const float db = dh[0];
            device const uint8_t * aux8 = (device const uint8_t *)q2;
            const uint32_t aux32 = q2[2] | (q2[3] << 16);
            const float d = db * (0.5f + (aux32 >> 28));

            float sum = 0;
            for (int l = 0; l < 4; ++l) {
                const threadgroup uint8_t * grid = (const threadgroup uint8_t *)(values + aux8[l]);
                const uint8_t signs = shared_signs[(aux32 >> 7*l) & 127];
                for (int j = 0; j < 8; ++j) {
                    sum += yl[8*l + j] * grid[j] * (signs & kmask_iq2xs[j] ? -1.f : 1.f);
                }
            }
            sumf[row] += d * sum;

            dh += nb*sizeof(block_iq2_xxs)/2;
            q2 += nb*sizeof(block_iq2_xxs)/2;
        }

        y4 += 32 * 32;
    }

    for (int row = 0; row < N_DST; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum * 0.25f;
        }
    }
}

[[host_name("kernel_mul_mv_iq2_xxs_f32")]]
kernel void kernel_mul_mv_iq2_xxs_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        threadgroup int8_t * shared_values [[threadgroup(0)]],
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_iq2_xxs_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, shared_values, tgpig, tiisg, sgitg);
}

void kernel_mul_mv_iq2_xs_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const int nb = ne00/QK_K;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * N_SIMDGROUP + sgitg) * N_DST;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_iq2_xs * x = (device const block_iq2_xs *) src0 + ib_row + offset0;
    device const float        * y = (device const float        *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[32];
    float sumf[N_DST]={0.f}, all_sum;

    const int nb32 = nb * (QK_K / 32);

    threadgroup uint64_t * values = (threadgroup uint64_t *)shared_values;
    threadgroup uint8_t  * shared_signs = (threadgroup uint8_t *)(values + 512);
    {
        int nval = 8;
        int pos  = (32*sgitg + tiisg)*nval;
        for (int i = 0; i < nval; ++i) values[pos + i] = iq2xs_grid[pos + i];
        nval = 2;
        pos  = (32*sgitg + tiisg)*nval;
        for (int i = 0; i < nval; ++i) shared_signs[pos+i] = ksigns_iq2xs[pos+i];
        threadgroup_barrier(mem_flags::mem_threadgroup);
    }

    const int ix = tiisg;

    device const float * y4 = y + 32 * ix;

    for (int ib32 = ix; ib32 < nb32; ib32 += 32) {

        for (int i = 0; i < 32; ++i) {
            yl[i] = y4[i];
        }

        const int ibl = ib32 / (QK_K / 32);
        const int ib  = ib32 % (QK_K / 32);

        device const block_iq2_xs * xr = x + ibl;
        device const uint16_t * q2 = xr->qs + 4 * ib;
        device const uint8_t  * sc = xr->scales + ib;
        device const half * dh = &xr->d;

        for (int row = 0; row < N_DST; row++) {

            const float db = dh[0];
            const uint8_t ls1 = sc[0] & 0xf;
            const uint8_t ls2 = sc[0] >>  4;
            const float d1 = db * (0.5f + ls1);
            const float d2 = db * (0.5f + ls2);

            float sum1 = 0, sum2 = 0;
            for (int l = 0; l < 2; ++l) {
                const threadgroup uint8_t * grid = (const threadgroup uint8_t *)(values + (q2[l] & 511));
                const uint8_t signs = shared_signs[(q2[l] >> 9)];
                for (int j = 0; j < 8; ++j) {
                    sum1 += yl[8*l + j] * grid[j] * (signs & kmask_iq2xs[j] ? -1.f : 1.f);
                }
            }
            for (int l = 2; l < 4; ++l) {
                const threadgroup uint8_t * grid = (const threadgroup uint8_t *)(values + (q2[l] & 511));
                const uint8_t signs = shared_signs[(q2[l] >> 9)];
                for (int j = 0; j < 8; ++j) {
                    sum2 += yl[8*l + j] * grid[j] * (signs & kmask_iq2xs[j] ? -1.f : 1.f);
                }
            }
            sumf[row] += d1 * sum1 + d2 * sum2;

            dh += nb*sizeof(block_iq2_xs)/2;
            q2 += nb*sizeof(block_iq2_xs)/2;
            sc += nb*sizeof(block_iq2_xs);
        }

        y4 += 32 * 32;
    }

    for (int row = 0; row < N_DST; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum * 0.25f;
        }
    }
}

[[host_name("kernel_mul_mv_iq2_xs_f32")]]
kernel void kernel_mul_mv_iq2_xs_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        threadgroup int8_t * shared_values [[threadgroup(0)]],
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_iq2_xs_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, shared_values, tgpig, tiisg, sgitg);
}

void kernel_mul_mv_iq3_xxs_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const int nb = ne00/QK_K;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * N_SIMDGROUP + sgitg) * N_DST;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_iq3_xxs * x = (device const block_iq3_xxs *) src0 + ib_row + offset0;
    device const float         * y = (device const float         *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[32];
    float sumf[N_DST]={0.f}, all_sum;

    const int nb32 = nb * (QK_K / 32);

    threadgroup uint32_t * values = (threadgroup uint32_t *)shared_values;
    threadgroup uint8_t  * shared_signs = (threadgroup uint8_t *)(values + 256);
    {
        int nval = 4;
        int pos  = (32*sgitg + tiisg)*nval;
        for (int i = 0; i < nval; ++i) values[pos + i] = iq3xxs_grid[pos + i];
        nval = 2;
        pos  = (32*sgitg + tiisg)*nval;
        for (int i = 0; i < nval; ++i) shared_signs[pos+i] = ksigns_iq2xs[pos+i];
        threadgroup_barrier(mem_flags::mem_threadgroup);
    }

    const int ix = tiisg;

    device const float * y4 = y + 32 * ix;

    for (int ib32 = ix; ib32 < nb32; ib32 += 32) {

        for (int i = 0; i < 32; ++i) {
            yl[i] = y4[i];
        }

        const int ibl = ib32 / (QK_K / 32);
        const int ib  = ib32 % (QK_K / 32);

        device const block_iq3_xxs * xr = x + ibl;
        device const uint8_t  * q3 = xr->qs + 8 * ib;
        device const uint16_t * gas = (device const uint16_t *)(xr->qs + QK_K/4) + 2 * ib;
        device const half * dh = &xr->d;

        for (int row = 0; row < N_DST; row++) {

            const float db = dh[0];
            const uint32_t aux32 = gas[0] | (gas[1] << 16);
            const float d = db * (0.5f + (aux32 >> 28));

            float2 sum = {0};
            for (int l = 0; l < 4; ++l) {
                const threadgroup uint8_t * grid1 = (const threadgroup uint8_t *)(values + q3[2*l+0]);
                const threadgroup uint8_t * grid2 = (const threadgroup uint8_t *)(values + q3[2*l+1]);
                const uint8_t signs = shared_signs[(aux32 >> 7*l) & 127];
                for (int j = 0; j < 4; ++j) {
                    sum[0] += yl[8*l + j + 0] * grid1[j] * (signs & kmask_iq2xs[j+0] ? -1.f : 1.f);
                    sum[1] += yl[8*l + j + 4] * grid2[j] * (signs & kmask_iq2xs[j+4] ? -1.f : 1.f);
                }
            }
            sumf[row] += d * (sum[0] + sum[1]);

            dh  += nb*sizeof(block_iq3_xxs)/2;
            q3  += nb*sizeof(block_iq3_xxs);
            gas += nb*sizeof(block_iq3_xxs)/2;
        }

        y4 += 32 * 32;
    }

    for (int row = 0; row < N_DST; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum * 0.5f;
        }
    }
}

[[host_name("kernel_mul_mv_iq3_xxs_f32")]]
kernel void kernel_mul_mv_iq3_xxs_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        threadgroup int8_t * shared_values [[threadgroup(0)]],
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_iq3_xxs_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, shared_values, tgpig, tiisg, sgitg);
}

void kernel_mul_mv_iq3_s_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const int nb = ne00/QK_K;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * N_SIMDGROUP + sgitg) * N_DST;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_iq3_s * x = (device const block_iq3_s *) src0 + ib_row + offset0;
    device const float       * y = (device const float       *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[32];
    float sumf[N_DST]={0.f}, all_sum;

    const int nb32 = nb * (QK_K / 32);

    threadgroup uint32_t * values = (threadgroup uint32_t *)shared_values;
    {
        int nval = 8;
        int pos  = (32*sgitg + tiisg)*nval;
        for (int i = 0; i < nval; ++i) values[pos + i] = iq3s_grid[pos + i];
        threadgroup_barrier(mem_flags::mem_threadgroup);
    }

    const int ix = tiisg;

    device const float * y4 = y + 32 * ix;

    for (int ib32 = ix; ib32 < nb32; ib32 += 32) {

        for (int i = 0; i < 32; ++i) {
            yl[i] = y4[i];
        }

        const int ibl = ib32 / (QK_K / 32);
        const int ib  = ib32 % (QK_K / 32);

        device const block_iq3_s * xr = x + ibl;
        device const uint8_t * qs = xr->qs + 8 * ib;
        device const uint8_t * qh = xr->qh + ib;
        device const uint8_t * sc = xr->scales + (ib/2);
        device const uint8_t * signs = xr->signs + 4 * ib;
        device const half * dh = &xr->d;

        for (int row = 0; row < N_DST; row++) {

            const float db = dh[0];
            const float d = db * (1 + 2*((sc[0] >> 4*(ib%2)) & 0xf));

            float2 sum = {0};
            for (int l = 0; l < 4; ++l) {
                const threadgroup uint32_t * table1 = qh[0] & kmask_iq2xs[2*l+0] ? values + 256 : values;
                const threadgroup uint32_t * table2 = qh[0] & kmask_iq2xs[2*l+1] ? values + 256 : values;
                const threadgroup uint8_t * grid1 = (const threadgroup uint8_t *)(table1 + qs[2*l+0]);
                const threadgroup uint8_t * grid2 = (const threadgroup uint8_t *)(table2 + qs[2*l+1]);
                for (int j = 0; j < 4; ++j) {
                    sum[0] += yl[8*l + j + 0] * grid1[j] * select(1, -1, signs[l] & kmask_iq2xs[j+0]);
                    sum[1] += yl[8*l + j + 4] * grid2[j] * select(1, -1, signs[l] & kmask_iq2xs[j+4]);
                }
            }
            sumf[row] += d * (sum[0] + sum[1]);

            dh  += nb*sizeof(block_iq3_s)/2;
            qs  += nb*sizeof(block_iq3_s);
            qh  += nb*sizeof(block_iq3_s);
            sc  += nb*sizeof(block_iq3_s);
            signs += nb*sizeof(block_iq3_s);
        }

        y4 += 32 * 32;
    }

    for (int row = 0; row < N_DST; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum;
        }
    }
}

[[host_name("kernel_mul_mv_iq3_s_f32")]]
kernel void kernel_mul_mv_iq3_s_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        threadgroup int8_t * shared_values [[threadgroup(0)]],
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_iq3_s_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, shared_values, tgpig, tiisg, sgitg);
}

void kernel_mul_mv_iq2_s_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const int nb = ne00/QK_K;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * N_SIMDGROUP + sgitg) * N_DST;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);

    device const block_iq2_s * x = (device const block_iq2_s *) src0 + ib_row + offset0;
    device const float       * y = (device const float       *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[32];
    float sumf[N_DST]={0.f}, all_sum;

    const int nb32 = nb * (QK_K / 32);

    //threadgroup uint64_t * values = (threadgroup uint64_t *)shared_values;
    //{
    //    int nval = 32;
    //    int pos  = (32*sgitg + tiisg)*nval;
    //    for (int i = 0; i < nval; ++i) values[pos + i] = iq2s_grid[pos + i];
    //    threadgroup_barrier(mem_flags::mem_threadgroup);
    //}

    const int ix = tiisg;

    device const float * y4 = y + 32 * ix;

    for (int ib32 = ix; ib32 < nb32; ib32 += 32) {

        for (int i = 0; i < 32; ++i) {
            yl[i] = y4[i];
        }

        const int ibl = ib32 / (QK_K / 32);
        const int ib  = ib32 % (QK_K / 32);

        device const block_iq2_s * xr = x + ibl;
        device const uint8_t * qs = xr->qs + 4 * ib;
        device const uint8_t * qh = xr->qh + ib;
        device const uint8_t * sc = xr->scales + ib;
        device const uint8_t * signs = qs + QK_K/8;
        device const half * dh = &xr->d;

        for (int row = 0; row < N_DST; row++) {

            const float db = dh[0];
            const float d1 = db * (0.5f + (sc[0] & 0xf));
            const float d2 = db * (0.5f + (sc[0] >>  4));

            float2 sum = {0};
            for (int l = 0; l < 2; ++l) {
                //const threadgroup uint8_t * grid1 = (const threadgroup uint8_t *)(values + (qs[l+0] | ((qh[0] << (8-2*l)) & 0x300)));
                //const threadgroup uint8_t * grid2 = (const threadgroup uint8_t *)(values + (qs[l+2] | ((qh[0] << (4-2*l)) & 0x300)));
                constant uint8_t * grid1 = (constant uint8_t *)(iq2s_grid + (qs[l+0] | ((qh[0] << (8-2*l)) & 0x300)));
                constant uint8_t * grid2 = (constant uint8_t *)(iq2s_grid + (qs[l+2] | ((qh[0] << (4-2*l)) & 0x300)));
                for (int j = 0; j < 8; ++j) {
                    sum[0] += yl[8*l + j +  0] * grid1[j] * select(1, -1, signs[l+0] & kmask_iq2xs[j]);
                    sum[1] += yl[8*l + j + 16] * grid2[j] * select(1, -1, signs[l+2] & kmask_iq2xs[j]);
                }
            }
            sumf[row] += d1 * sum[0] + d2 * sum[1];

            dh  += nb*sizeof(block_iq2_s)/2;
            qs  += nb*sizeof(block_iq2_s);
            qh  += nb*sizeof(block_iq2_s);
            sc  += nb*sizeof(block_iq2_s);
            signs += nb*sizeof(block_iq2_s);
        }

        y4 += 32 * 32;
    }

    for (int row = 0; row < N_DST; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum * 0.25f;
        }
    }
}

[[host_name("kernel_mul_mv_iq2_s_f32")]]
kernel void kernel_mul_mv_iq2_s_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        threadgroup int8_t * shared_values [[threadgroup(0)]],
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_iq2_s_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, shared_values, tgpig, tiisg, sgitg);
}

void kernel_mul_mv_iq1_s_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_value,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const int nb = ne00/QK_K;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * N_SIMDGROUP + sgitg) * N_DST;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);
    device const block_iq1_s * x = (device const block_iq1_s *) src0 + ib_row + offset0;
    device const float       * y = (device const float       *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[32];
    float sumf[N_DST]={0.f}, all_sum;

    const int nb32 = nb * (QK_K / 32);

    const int ix = tiisg;

    device const float * y4 = y + 32 * ix;

    for (int ib32 = ix; ib32 < nb32; ib32 += 32) {

        float sumy = 0;
        for (int i = 0; i < 32; ++i) {
            yl[i] = y4[i];
            sumy += yl[i];
        }

        const int ibl = ib32 / (QK_K / 32);
        const int ib  = ib32 % (QK_K / 32);

        device const block_iq1_s * xr = x + ibl;
        device const uint8_t  * qs = xr->qs + 4 * ib;
        device const uint16_t * qh = xr->qh + ib;
        device const half     * dh = &xr->d;

        for (int row = 0; row < N_DST; row++) {

            constant uint8_t * grid1 = (constant uint8_t *)(iq1s_grid_gpu + (qs[0] | ((qh[0] << 8) & 0x700)));
            constant uint8_t * grid2 = (constant uint8_t *)(iq1s_grid_gpu + (qs[1] | ((qh[0] << 5) & 0x700)));
            constant uint8_t * grid3 = (constant uint8_t *)(iq1s_grid_gpu + (qs[2] | ((qh[0] << 2) & 0x700)));
            constant uint8_t * grid4 = (constant uint8_t *)(iq1s_grid_gpu + (qs[3] | ((qh[0] >> 1) & 0x700)));

            float sum = 0;
            for (int j = 0; j < 4; ++j) {
                sum += yl[j+ 0] * (grid1[j] & 0xf) + yl[j+ 4] * (grid1[j] >> 4)
                     + yl[j+ 8] * (grid2[j] & 0xf) + yl[j+12] * (grid2[j] >> 4)
                     + yl[j+16] * (grid3[j] & 0xf) + yl[j+20] * (grid3[j] >> 4)
                     + yl[j+24] * (grid4[j] & 0xf) + yl[j+28] * (grid4[j] >> 4);
            }
            sumf[row] += (float)dh[0] * (sum + sumy * (qh[0] & 0x8000 ? -1 - IQ1S_DELTA : -1 + IQ1S_DELTA)) * (2*((qh[0] >> 12) & 7) + 1);

            dh += nb*sizeof(block_iq1_s)/2;
            qs += nb*sizeof(block_iq1_s);
            qh += nb*sizeof(block_iq1_s)/2;
        }

        y4 += 32 * 32;
    }

    for (int row = 0; row < N_DST; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum;
        }
    }
}

void kernel_mul_mv_iq1_m_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_value,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    const int nb = ne00/QK_K;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;

    const int first_row = (r0 * N_SIMDGROUP + sgitg) * N_DST;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);
    device const block_iq1_m * x = (device const block_iq1_m *) src0 + ib_row + offset0;
    device const float       * y = (device const float       *) src1 + r1*ne10 + im*ne00*ne1;

    float yl[32];
    float sumf[N_DST]={0.f}, all_sum;

    const int nb32 = nb * (QK_K / 32);

    const int ix = tiisg;

    device const float * y4 = y + 32 * ix;

    iq1m_scale_t scale;

    for (int ib32 = ix; ib32 < nb32; ib32 += 32) {

        float4 sumy = {0.f};
        for (int i = 0; i < 8; ++i) {
            yl[i+ 0] = y4[i+ 0]; sumy[0] += yl[i+ 0];
            yl[i+ 8] = y4[i+ 8]; sumy[1] += yl[i+ 8];
            yl[i+16] = y4[i+16]; sumy[2] += yl[i+16];
            yl[i+24] = y4[i+24]; sumy[3] += yl[i+24];
        }

        const int ibl = ib32 / (QK_K / 32);
        const int ib  = ib32 % (QK_K / 32);

        device const block_iq1_m * xr = x + ibl;
        device const uint8_t  * qs = xr->qs + 4 * ib;
        device const uint8_t  * qh = xr->qh + 2 * ib;
        device const uint16_t * sc = (device const uint16_t *)xr->scales;

        for (int row = 0; row < N_DST; row++) {
            scale.u16 = (sc[0] >> 12) | ((sc[1] >> 8) & 0x00f0) | ((sc[2] >> 4) & 0x0f00) | (sc[3] & 0xf000);

            constant uint8_t * grid1 = (constant uint8_t *)(iq1s_grid_gpu + (qs[0] | ((qh[0] << 8) & 0x700)));
            constant uint8_t * grid2 = (constant uint8_t *)(iq1s_grid_gpu + (qs[1] | ((qh[0] << 4) & 0x700)));
            constant uint8_t * grid3 = (constant uint8_t *)(iq1s_grid_gpu + (qs[2] | ((qh[1] << 8) & 0x700)));
            constant uint8_t * grid4 = (constant uint8_t *)(iq1s_grid_gpu + (qs[3] | ((qh[1] << 4) & 0x700)));

            float2 sum = {0.f};
            for (int j = 0; j < 4; ++j) {
                sum[0] += yl[j+ 0] * (grid1[j] & 0xf) + yl[j+ 4] * (grid1[j] >> 4)
                        + yl[j+ 8] * (grid2[j] & 0xf) + yl[j+12] * (grid2[j] >> 4);
                sum[1] += yl[j+16] * (grid3[j] & 0xf) + yl[j+20] * (grid3[j] >> 4)
                        + yl[j+24] * (grid4[j] & 0xf) + yl[j+28] * (grid4[j] >> 4);
            }
            const float delta1 = sumy[0] * (qh[0] & 0x08 ? -1 - IQ1M_DELTA : -1 + IQ1M_DELTA) + sumy[1] * (qh[0] & 0x80 ? -1 - IQ1M_DELTA : -1 + IQ1M_DELTA);
            const float delta2 = sumy[2] * (qh[1] & 0x08 ? -1 - IQ1M_DELTA : -1 + IQ1M_DELTA) + sumy[3] * (qh[1] & 0x80 ? -1 - IQ1M_DELTA : -1 + IQ1M_DELTA);

            sumf[row] += (float)scale.f16 * ((sum[0] + delta1) * (2*((sc[ib/2] >> (6*(ib%2)+0)) & 7) + 1) +
                                             (sum[1] + delta2) * (2*((sc[ib/2] >> (6*(ib%2)+3)) & 7) + 1));

            sc += nb*sizeof(block_iq1_m)/2;
            qs += nb*sizeof(block_iq1_m);
            qh += nb*sizeof(block_iq1_m);
        }

        y4 += 32 * 32;
    }

    for (int row = 0; row < N_DST; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum;
        }
    }
}

void kernel_mul_mv_iq4_nl_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values_i8,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    threadgroup float * shared_values = (threadgroup float *)shared_values_i8;
    const int nb = ne00/QK4_NL;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;
    const int first_row = (r0 * 2 + sgitg) * 2;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);
    device const block_iq4_nl * x = (device const block_iq4_nl *) src0 + ib_row + offset0;
    device const float        * y = (device const float        *) src1 + r1*ne10 + im*ne00*ne1;

    const int ix = tiisg/2;  // 0...15
    const int it = tiisg%2;  // 0 or 1

    shared_values[tiisg] = kvalues_iq4nl_f[tiisg%16];
    threadgroup_barrier(mem_flags::mem_threadgroup);

    float4 yl[4];
    float sumf[2]={0.f}, all_sum;

    device const float * yb = y + ix * QK4_NL + it * 8;

    uint32_t aux32[2];
    thread const uint8_t * q8 = (thread const uint8_t *)aux32;

    float4 qf1, qf2;

    for (int ib = ix; ib < nb; ib += 16) {

        device const float4 * y4 = (device const float4 *)yb;
        yl[0] = y4[0]; yl[1] = y4[4]; yl[2] = y4[1]; yl[3] = y4[5];

        for (int row = 0; row < 2 && first_row + row < ne01; ++row) {

            device const block_iq4_nl & xb = x[row*nb + ib];
            device const uint16_t * q4 = (device const uint16_t *)(xb.qs + 8*it);

            float4 acc1 = {0.f}, acc2 = {0.f};

            aux32[0] = q4[0] | (q4[1] << 16);
            aux32[1] = (aux32[0] >> 4) & 0x0f0f0f0f;
            aux32[0] &= 0x0f0f0f0f;
            qf1 = {shared_values[q8[0]], shared_values[q8[1]], shared_values[q8[2]], shared_values[q8[3]]};
            qf2 = {shared_values[q8[4]], shared_values[q8[5]], shared_values[q8[6]], shared_values[q8[7]]};
            acc1 += yl[0] * qf1;
            acc2 += yl[1] * qf2;

            aux32[0] = q4[2] | (q4[3] << 16);
            aux32[1] = (aux32[0] >> 4) & 0x0f0f0f0f;
            aux32[0] &= 0x0f0f0f0f;
            qf1 = {shared_values[q8[0]], shared_values[q8[1]], shared_values[q8[2]], shared_values[q8[3]]};
            qf2 = {shared_values[q8[4]], shared_values[q8[5]], shared_values[q8[6]], shared_values[q8[7]]};
            acc1 += yl[2] * qf1;
            acc2 += yl[3] * qf2;

            acc1 += acc2;

            sumf[row] += (float)xb.d * (acc1[0] + acc1[1] + acc1[2] + acc1[3]);

        }

        yb += 16 * QK4_NL;
    }

    for (int row = 0; row < 2 && first_row + row < ne01; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum;
        }
    }
}

void kernel_mul_mv_iq4_xs_f32_impl(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values_i8,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg) {

    threadgroup float * shared_values = (threadgroup float *)shared_values_i8;
    const int nb = ne00/QK_K;
    const int r0 = tgpig.x;
    const int r1 = tgpig.y;
    const int im = tgpig.z;
    const int first_row = (r0 * 2 + sgitg) * 2;
    const int ib_row = first_row * nb;

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    const uint offset0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02);
    device const block_iq4_xs * x = (device const block_iq4_xs *) src0 + ib_row + offset0;
    device const float        * y = (device const float        *) src1 + r1*ne10 + im*ne00*ne1;

    const int ix = tiisg/16;  // 0 or 1
    const int it = tiisg%16;  // 0...15
    const int ib = it/2;
    const int il = it%2;

    shared_values[tiisg] = kvalues_iq4nl_f[tiisg%16];
    threadgroup_barrier(mem_flags::mem_threadgroup);

    float4 yl[4];
    float sumf[2]={0.f}, all_sum;

    device const float * yb = y + ix * QK_K + ib * 32 + il * 8;

    uint32_t aux32[2];
    thread const uint8_t * q8 = (thread const uint8_t *)aux32;

    float4 qf1, qf2;

    for (int ibl = ix; ibl < nb; ibl += 2) {

        device const float4 * y4 = (device const float4 *)yb;
        yl[0] = y4[0]; yl[1] = y4[4]; yl[2] = y4[1]; yl[3] = y4[5];

        for (int row = 0; row < 2; ++row) {

            device const block_iq4_xs & xb = x[row*nb + ibl];
            device const uint32_t * q4 = (device const uint32_t *)(xb.qs + 16*ib + 8*il);

            float4 acc1 = {0.f}, acc2 = {0.f};

            aux32[0] = q4[0] & 0x0f0f0f0f;
            aux32[1] = (q4[0] >> 4) & 0x0f0f0f0f;
            qf1 = {shared_values[q8[0]], shared_values[q8[1]], shared_values[q8[2]], shared_values[q8[3]]};
            qf2 = {shared_values[q8[4]], shared_values[q8[5]], shared_values[q8[6]], shared_values[q8[7]]};
            acc1 += yl[0] * qf1;
            acc2 += yl[1] * qf2;

            aux32[0] = q4[1] & 0x0f0f0f0f;
            aux32[1] = (q4[1] >> 4) & 0x0f0f0f0f;
            qf1 = {shared_values[q8[0]], shared_values[q8[1]], shared_values[q8[2]], shared_values[q8[3]]};
            qf2 = {shared_values[q8[4]], shared_values[q8[5]], shared_values[q8[6]], shared_values[q8[7]]};
            acc1 += yl[2] * qf1;
            acc2 += yl[3] * qf2;

            acc1 += acc2;

            const int ls = (((xb.scales_l[ib/2] >> 4*(ib%2)) & 0xf) | (((xb.scales_h >> 2*ib) & 3) << 4)) - 32;
            sumf[row] += (float)xb.d * ls * (acc1[0] + acc1[1] + acc1[2] + acc1[3]);

        }

        yb += 2 * QK_K;
    }

    for (int row = 0; row < 2; ++row) {
        all_sum = simd_sum(sumf[row]);
        if (tiisg == 0) {
            dst[r1*ne0 + im*ne0*ne1 + first_row + row] = all_sum;
        }
    }
}

[[host_name("kernel_mul_mv_iq1_s_f32")]]
kernel void kernel_mul_mv_iq1_s_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_iq1_s_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, nullptr, tgpig, tiisg, sgitg);
}

[[host_name("kernel_mul_mv_iq1_m_f32")]]
kernel void kernel_mul_mv_iq1_m_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint  tiisg[[thread_index_in_simdgroup]],
        uint  sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_iq1_m_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, nullptr, tgpig, tiisg, sgitg);
}

[[host_name("kernel_mul_mv_iq4_nl_f32")]]
kernel void kernel_mul_mv_iq4_nl_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        threadgroup int8_t * shared_values [[threadgroup(0)]],
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint tiisg[[thread_index_in_simdgroup]],
        uint sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_iq4_nl_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, shared_values, tgpig, tiisg, sgitg);
}

[[host_name("kernel_mul_mv_iq4_xs_f32")]]
kernel void kernel_mul_mv_iq4_xs_f32(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant   int64_t & ne01,
        constant   int64_t & ne02,
        constant  uint64_t & nb00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant   int64_t & ne11,
        constant   int64_t & ne12,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb12,
        constant   int64_t & ne0,
        constant   int64_t & ne1,
        constant   uint    & r2,
        constant   uint    & r3,
        threadgroup int8_t * shared_values [[threadgroup(0)]],
        uint3 tgpig[[threadgroup_position_in_grid]],
        uint tiisg[[thread_index_in_simdgroup]],
        uint sgitg[[simdgroup_index_in_threadgroup]]) {

    kernel_mul_mv_iq4_xs_f32_impl(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3, shared_values, tgpig, tiisg, sgitg);
}

//============================= templates and their specializations =============================

// NOTE: this is not dequantizing - we are simply fitting the template
template 
void dequantize_f32(device const float4x4 * src, short il, thread type4x4 & reg) {
    float4x4 temp = *(((device float4x4 *)src));
    for (int i = 0; i < 16; i++){
        reg[i/4][i%4] = temp[i/4][i%4];
    }
}

template 
void dequantize_f16(device const half4x4 * src, short il, thread type4x4 & reg) {
    half4x4 temp = *(((device half4x4 *)src));
    for (int i = 0; i < 16; i++){
        reg[i/4][i%4] = temp[i/4][i%4];
    }
}

template 
void dequantize_q4_0(device const block_q4_0 *xb, short il, thread type4x4 & reg) {
    device const uint16_t * qs = ((device const uint16_t *)xb + 1);
    const float d1 = il ? (xb->d / 16.h) : xb->d;
    const float d2 = d1 / 256.f;
    const float md = -8.h * xb->d;
    const ushort mask0 = il ? 0x00F0 : 0x000F;
    const ushort mask1 = mask0 << 8;

    for (int i=0;i<8;i++) {
        reg[i/2][2*(i%2)+0] = d1 * (qs[i] & mask0) + md;
        reg[i/2][2*(i%2)+1] = d2 * (qs[i] & mask1) + md;
    }
}

template 
void dequantize_q4_1(device const block_q4_1 *xb, short il, thread type4x4 & reg) {
    device const uint16_t * qs = ((device const uint16_t *)xb + 2);
    const float d1 = il ? (xb->d / 16.h) : xb->d;
    const float d2 = d1 / 256.f;
    const float  m = xb->m;
    const ushort mask0 = il ? 0x00F0 : 0x000F;
    const ushort mask1 = mask0 << 8;

    for (int i=0;i<8;i++) {
        reg[i/2][2*(i%2)+0] = ((qs[i] & mask0) * d1) + m;
        reg[i/2][2*(i%2)+1] = ((qs[i] & mask1) * d2) + m;
    }
}

template 
void dequantize_q5_0(device const block_q5_0 *xb, short il, thread type4x4 & reg) {
    device const uint16_t * qs = ((device const uint16_t *)xb + 3);
    const float d = xb->d;
    const float md = -16.h * xb->d;
    const ushort mask = il ? 0x00F0 : 0x000F;

    const uint32_t qh = *((device const uint32_t *)xb->qh);

    const int x_mv = il ? 4 : 0;

    const int gh_mv = il ? 12 : 0;
    const int gh_bk = il ?  0 : 4;

    for (int i = 0; i < 8; i++) {
        // extract the 5-th bits for x0 and x1
        const uint8_t xh_0 = ((qh >> (gh_mv + 2*i  )) << gh_bk) & 0x10;
        const uint8_t xh_1 = ((qh >> (gh_mv + 2*i+1)) << gh_bk) & 0x10;

        // combine the 4-bits from qs with the 5th bit
        const int32_t x0 = ((((qs[i]     ) & mask) >> x_mv) | xh_0);
        const int32_t x1 = ((((qs[i] >> 8) & mask) >> x_mv) | xh_1);

        reg[i/2][2*(i%2)+0] = d * x0 + md;
        reg[i/2][2*(i%2)+1] = d * x1 + md;
    }
}

template 
void dequantize_q5_1(device const block_q5_1 *xb, short il, thread type4x4 & reg) {
    device const uint16_t * qs = ((device const uint16_t *)xb + 4);
    const float d = xb->d;
    const float m = xb->m;
    const ushort mask = il ? 0x00F0 : 0x000F;

    const uint32_t qh = *((device const uint32_t *)xb->qh);

    const int x_mv = il ? 4 : 0;

    const int gh_mv = il ? 12 : 0;
    const int gh_bk = il ?  0 : 4;

    for (int i = 0; i < 8; i++) {
        // extract the 5-th bits for x0 and x1
        const uint8_t xh_0 = ((qh >> (gh_mv + 2*i  )) << gh_bk) & 0x10;
        const uint8_t xh_1 = ((qh >> (gh_mv + 2*i+1)) << gh_bk) & 0x10;

        // combine the 4-bits from qs with the 5th bit
        const int32_t x0 = ((((qs[i]     ) & mask) >> x_mv) | xh_0);
        const int32_t x1 = ((((qs[i] >> 8) & mask) >> x_mv) | xh_1);

        reg[i/2][2*(i%2)+0] = d * x0 + m;
        reg[i/2][2*(i%2)+1] = d * x1 + m;
    }
}

template 
void dequantize_q8_0(device const block_q8_0 *xb, short il, thread type4x4 & reg) {
    device const int8_t * qs = ((device const int8_t *)xb->qs);
    const half d = xb->d;

    for (int i = 0; i < 16; i++) {
        reg[i/4][i%4] = (qs[i + 16*il] * d);
    }
}

template 
void dequantize_q2_K(device const block_q2_K *xb, short il, thread type4x4 & reg) {
    const float d = xb->d;
    const float min = xb->dmin;
    device const uint8_t * q = (device const uint8_t *)xb->qs;
    float dl, ml;
    uint8_t sc = xb->scales[il];

    q = q + 32*(il/8) + 16*(il&1);
    il = (il/2)%4;

    half  coef = il>1 ? (il>2 ? 1/64.h : 1/16.h) : (il>0 ? 1/4.h : 1.h);
    uchar mask = il>1 ? (il>2 ? 192    : 48)     : (il>0 ? 12    : 3);
    dl = d * (sc & 0xF) * coef, ml = min * (sc >> 4);
    for (int i = 0; i < 16; ++i) {
        reg[i/4][i%4] = dl * (q[i] & mask) - ml;
    }
}

template 
void dequantize_q3_K(device const block_q3_K *xb, short il, thread type4x4 & reg) {
    const half d_all = xb->d;
    device const uint8_t * q = (device const uint8_t *)xb->qs;
    device const uint8_t * h = (device const uint8_t *)xb->hmask;
    device const int8_t * scales = (device const int8_t *)xb->scales;

    q = q + 32 * (il/8) + 16 * (il&1);
    h = h + 16 * (il&1);
    uint8_t m = 1 << (il/2);
    uint16_t kmask1 = (il/4)>1 ? ((il/4)>2 ? 192 : 48) : \
                                 ((il/4)>0 ? 12  : 3);
    uint16_t kmask2 = il/8 ? 0xF0 : 0x0F;
    uint16_t scale_2 = scales[il%8], scale_1 = scales[8 + il%4];
    int16_t  dl_int = (il/4)&1 ? (scale_2&kmask2) | ((scale_1&kmask1) << 2)
                               : (scale_2&kmask2) | ((scale_1&kmask1) << 4);
    float dl = il<8 ? d_all * (dl_int - 32.f) : d_all * (dl_int / 16.f - 32.f);
    const float ml = 4.f * dl;

    il = (il/2) & 3;
    const half    coef = il>1 ? (il>2 ? 1/64.h : 1/16.h) : (il>0 ? 1/4.h : 1.h);
    const uint8_t mask = il>1 ? (il>2 ? 192    : 48)     : (il>0 ? 12    : 3);
    dl *= coef;

    for (int i = 0; i < 16; ++i) {
        reg[i/4][i%4] = dl * (q[i] & mask) - (h[i] & m ? 0 : ml);
    }
}

static inline uchar2 get_scale_min_k4_just2(int j, int k, device const uchar * q) {
    return j < 4 ? uchar2{uchar(q[j+0+k] & 63), uchar(q[j+4+k] & 63)}
                 : uchar2{uchar((q[j+4+k] & 0xF) | ((q[j-4+k] & 0xc0) >> 2)), uchar((q[j+4+k] >> 4) | ((q[j-0+k] & 0xc0) >> 2))};
}

template 
void dequantize_q4_K(device const block_q4_K *xb, short il, thread type4x4 & reg) {
    device const uchar * q = xb->qs;

    short is = (il/4) * 2;
    q = q + (il/4) * 32 + 16 * (il&1);
    il = il & 3;
    const uchar2 sc = get_scale_min_k4_just2(is, il/2, xb->scales);
    const float d   = il < 2 ? xb->d : xb->d / 16.h;
    const float min = xb->dmin;
    const float dl = d * sc[0];
    const float ml = min * sc[1];

    const ushort mask = il<2 ? 0x0F : 0xF0;
    for (int i = 0; i < 16; ++i) {
        reg[i/4][i%4] = dl * (q[i] & mask) - ml;
    }
}

template 
void dequantize_q5_K(device const block_q5_K *xb, short il, thread type4x4 & reg) {
    device const uint8_t * q  = xb->qs;
    device const uint8_t * qh = xb->qh;

    short is = (il/4) * 2;
    q  = q + 32 * (il/4) + 16 * (il&1);
    qh = qh + 16 * (il&1);
    uint8_t ul = 1 << (il/2);
    il = il & 3;
    const uchar2 sc = get_scale_min_k4_just2(is, il/2, xb->scales);
    const float d = il < 2 ? xb->d : xb->d / 16.f;
    const float min = xb->dmin;
    const float dl = d * sc[0];
    const float ml = min * sc[1];

    const ushort mask  = il<2 ? 0x0F : 0xF0;
    const float qh_val = il<2 ? 16.f : 256.f;
    for (int i = 0; i < 16; ++i) {
        reg[i/4][i%4] = dl * ((q[i] & mask) + (qh[i] & ul ? qh_val : 0)) - ml;
    }
}

template 
void dequantize_q6_K(device const block_q6_K *xb, short il, thread type4x4 & reg) {
    const half d_all = xb->d;
    device const uint8_t * ql = (device const uint8_t *)xb->ql;
    device const uint8_t * qh = (device const uint8_t *)xb->qh;
    device const int8_t * scales = (device const int8_t *)xb->scales;

    ql = ql + 64*(il/8) + 32*((il/2)&1) + 16*(il&1);
    qh = qh + 32*(il/8) + 16*(il&1);
    float sc = scales[(il%2) + 2 * ((il/2))];
    il = (il/2) & 3;

    const uint16_t  kmask1 = il>1 ? (il>2 ? 192 : 48) : (il>0 ? 12 : 3);
    const uint16_t  kmask2 = il>1 ? 0xF0              : 0x0F;
    const float       coef = il>1 ? 1.f/16.f          : 1.f;
    const float ml = d_all * sc * 32.f;
    const float dl = d_all * sc * coef;
    for (int i = 0; i < 16; ++i) {
        const half q = il&1 ? ((ql[i] & kmask2) | ((qh[i] & kmask1) << 2))
                            : ((ql[i] & kmask2) | ((qh[i] & kmask1) << 4));
        reg[i/4][i%4] = dl * q - ml;
    }
}

template 
void dequantize_iq2_xxs(device const block_iq2_xxs * xb, short il, thread type4x4 & reg) {
    // il is 0...15 for QK_K = 256 => index of block of 32 is il/2
    const float d = xb->d;
    const int ib32 = il/2;
    il = il%2;
    // il = 0 or 1. il = 0 processes the first 16 quants in a block of 32, il = 1 the second 16
    // each block of 32 needs 2 uint32_t's for the quants & scale, so 4 uint16_t's.
    device const uint16_t * q2 = xb->qs + 4*ib32;
    const uint32_t aux32_g = q2[0] | (q2[1] << 16);
    const uint32_t aux32_s = q2[2] | (q2[3] << 16);
    thread const uint8_t * aux8 = (thread const uint8_t *)&aux32_g;
    const float dl = d * (0.5f + (aux32_s >> 28)) * 0.25f;
    constant uint8_t * grid = (constant uint8_t *)(iq2xxs_grid + aux8[2*il+0]);
    uint8_t signs = ksigns_iq2xs[(aux32_s >> 14*il) & 127];
    for (int i = 0; i < 8; ++i) {
        reg[i/4][i%4] = dl * grid[i] * (signs & kmask_iq2xs[i] ? -1.f : 1.f);
    }
    grid = (constant uint8_t *)(iq2xxs_grid + aux8[2*il+1]);
    signs = ksigns_iq2xs[(aux32_s >> (14*il+7)) & 127];
    for (int i = 0; i < 8; ++i) {
        reg[2+i/4][i%4] = dl * grid[i] * (signs & kmask_iq2xs[i] ? -1.f : 1.f);
    }
}

template 
void dequantize_iq2_xs(device const block_iq2_xs * xb, short il, thread type4x4 & reg) {
    // il is 0...15 for QK_K = 256 => index of block of 32 is il/2
    const float d = xb->d;
    const int ib32 = il/2;
    il = il%2;
    // il = 0 or 1. il = 0 processes the first 16 quants in a block of 32, il = 1 the second 16
    device const uint16_t * q2 = xb->qs + 4*ib32;
    const float dl = d * (0.5f + ((xb->scales[ib32] >> 4*il) & 0xf)) * 0.25f;
    constant uint8_t * grid = (constant uint8_t *)(iq2xs_grid + (q2[2*il+0] & 511));
    uint8_t signs = ksigns_iq2xs[q2[2*il+0] >> 9];
    for (int i = 0; i < 8; ++i) {
        reg[i/4][i%4] = dl * grid[i] * (signs & kmask_iq2xs[i] ? -1.f : 1.f);
    }
    grid = (constant uint8_t *)(iq2xs_grid + (q2[2*il+1] & 511));
    signs = ksigns_iq2xs[q2[2*il+1] >> 9];
    for (int i = 0; i < 8; ++i) {
        reg[2+i/4][i%4] = dl * grid[i] * (signs & kmask_iq2xs[i] ? -1.f : 1.f);
    }
}

template 
void dequantize_iq3_xxs(device const block_iq3_xxs * xb, short il, thread type4x4 & reg) {
    // il is 0...15 for QK_K = 256 => index of block of 32 is il/2
    const float d = xb->d;
    const int ib32 = il/2;
    il = il%2;
    // il = 0 or 1. il = 0 processes the first 16 quants in a block of 32, il = 1 the second 16
    device const uint8_t * q3 = xb->qs + 8*ib32;
    device const uint16_t * gas = (device const uint16_t *)(xb->qs + QK_K/4) + 2*ib32;
    const uint32_t aux32 = gas[0] | (gas[1] << 16);
    const float dl = d * (0.5f + (aux32 >> 28)) * 0.5f;
    constant uint8_t * grid1 = (constant uint8_t *)(iq3xxs_grid + q3[4*il+0]);
    constant uint8_t * grid2 = (constant uint8_t *)(iq3xxs_grid + q3[4*il+1]);
    uint8_t signs = ksigns_iq2xs[(aux32 >> 14*il) & 127];
    for (int i = 0; i < 4; ++i) {
        reg[0][i] = dl * grid1[i] * (signs & kmask_iq2xs[i+0] ? -1.f : 1.f);
        reg[1][i] = dl * grid2[i] * (signs & kmask_iq2xs[i+4] ? -1.f : 1.f);
    }
    grid1 = (constant uint8_t *)(iq3xxs_grid + q3[4*il+2]);
    grid2 = (constant uint8_t *)(iq3xxs_grid + q3[4*il+3]);
    signs = ksigns_iq2xs[(aux32 >> (14*il+7)) & 127];
    for (int i = 0; i < 4; ++i) {
        reg[2][i] = dl * grid1[i] * (signs & kmask_iq2xs[i+0] ? -1.f : 1.f);
        reg[3][i] = dl * grid2[i] * (signs & kmask_iq2xs[i+4] ? -1.f : 1.f);
    }
}

template 
void dequantize_iq3_s(device const block_iq3_s * xb, short il, thread type4x4 & reg) {
    // il is 0...15 for QK_K = 256 => index of block of 32 is il/2
    const float d = xb->d;
    const int ib32 = il/2;
    il = il%2;
    // il = 0 or 1. il = 0 processes the first 16 quants in a block of 32, il = 1 the second 16
    device const uint8_t * qs = xb->qs + 8*ib32;
    device const uint8_t * signs = xb->signs + 4*ib32 + 2*il;
    const uint8_t qh = xb->qh[ib32] >> 4*il;
    const float dl = d * (1 + 2*((xb->scales[ib32/2] >> 4*(ib32%2)) & 0xf));
    constant uint8_t * grid1 = (constant uint8_t *)(iq3s_grid + (qs[4*il+0] | ((qh << 8) & 256)));
    constant uint8_t * grid2 = (constant uint8_t *)(iq3s_grid + (qs[4*il+1] | ((qh << 7) & 256)));
    for (int i = 0; i < 4; ++i) {
        reg[0][i] = dl * grid1[i] * select(1, -1, signs[0] & kmask_iq2xs[i+0]);
        reg[1][i] = dl * grid2[i] * select(1, -1, signs[0] & kmask_iq2xs[i+4]);
    }
    grid1 = (constant uint8_t *)(iq3s_grid + (qs[4*il+2] | ((qh << 6) & 256)));
    grid2 = (constant uint8_t *)(iq3s_grid + (qs[4*il+3] | ((qh << 5) & 256)));
    for (int i = 0; i < 4; ++i) {
        reg[2][i] = dl * grid1[i] * select(1, -1, signs[1] & kmask_iq2xs[i+0]);
        reg[3][i] = dl * grid2[i] * select(1, -1, signs[1] & kmask_iq2xs[i+4]);
    }
}

template 
void dequantize_iq2_s(device const block_iq2_s * xb, short il, thread type4x4 & reg) {
    // il is 0...15 for QK_K = 256 => index of block of 32 is il/2
    const float d = xb->d;
    const int ib32 = il/2;
    il = il%2;
    // il = 0 or 1. il = 0 processes the first 16 quants in a block of 32, il = 1 the second 16
    device const uint8_t * qs = xb->qs + 4*ib32 + 2*il;
    device const uint8_t * signs = qs + QK_K/8;
    const uint8_t qh = xb->qh[ib32] >> 4*il;
    const float dl = d * (0.5f + ((xb->scales[ib32] >> 4*il) & 0xf)) * 0.25f;
    constant uint8_t * grid1 = (constant uint8_t *)(iq2s_grid + (qs[0] | ((qh << 8) & 0x300)));
    constant uint8_t * grid2 = (constant uint8_t *)(iq2s_grid + (qs[1] | ((qh << 6) & 0x300)));
    for (int i = 0; i < 8; ++i) {
        reg[i/4+0][i%4] = dl * grid1[i] * select(1, -1, signs[0] & kmask_iq2xs[i]);
        reg[i/4+2][i%4] = dl * grid2[i] * select(1, -1, signs[1] & kmask_iq2xs[i]);
    }
}

template 
void dequantize_iq1_s(device const block_iq1_s * xb, short il, thread type4x4 & reg) {
    // il is 0...15 for QK_K = 256 => index of block of 32 is il/2
    const int ib32 = il/2;
    il = il%2;
    const float d = xb->d;
    device const uint8_t  * qs = xb->qs + 4*ib32 + 2*il;
    device const uint16_t * qh = xb->qh;
    const float dl = d * (2*((qh[ib32] >> 12) & 7) + 1);
    const float ml = dl * (qh[ib32] & 0x8000 ? -1 - IQ1S_DELTA : -1 + IQ1S_DELTA);
    const uint16_t h = qh[ib32] >> 6*il;
    constant uint8_t * grid1 = (constant uint8_t *)(iq1s_grid_gpu + (qs[0] | ((h << 8) & 0x700)));
    constant uint8_t * grid2 = (constant uint8_t *)(iq1s_grid_gpu + (qs[1] | ((h << 5) & 0x700)));
    for (int i = 0; i < 4; ++i) {
        reg[0][i] = dl * (grid1[i] & 0xf) + ml;
        reg[1][i] = dl * (grid1[i] >>  4) + ml;
        reg[2][i] = dl * (grid2[i] & 0xf) + ml;
        reg[3][i] = dl * (grid2[i] >>  4) + ml;
    }
}

template 
void dequantize_iq1_m(device const block_iq1_m * xb, short il, thread type4x4 & reg) {
    // il is 0...15 for QK_K = 256 => index of block of 32 is il/2
    const int ib32 = il/2;
    il = il%2;
    device const uint16_t * sc = (device const uint16_t *)xb->scales;

    iq1m_scale_t scale;
    scale.u16 = (sc[0] >> 12) | ((sc[1] >> 8) & 0x00f0) | ((sc[2] >> 4) & 0x0f00) | (sc[3] & 0xf000);
    const float d = scale.f16;

    device const uint8_t * qs = xb->qs + 4*ib32 + 2*il;
    device const uint8_t * qh = xb->qh + 2*ib32 + il;

    const float dl  = d * (2*((sc[ib32/2] >> (6*(ib32%2)+3*il)) & 7) + 1);
    const float ml1 = dl * (qh[0] & 0x08 ? -1 - IQ1M_DELTA : -1 + IQ1M_DELTA);
    const float ml2 = dl * (qh[0] & 0x80 ? -1 - IQ1M_DELTA : -1 + IQ1M_DELTA);
    constant uint8_t * grid1 = (constant uint8_t *)(iq1s_grid_gpu + (qs[0] | ((qh[0] << 8) & 0x700)));
    constant uint8_t * grid2 = (constant uint8_t *)(iq1s_grid_gpu + (qs[1] | ((qh[0] << 4) & 0x700)));
    for (int i = 0; i < 4; ++i) {
        reg[0][i] = dl * (grid1[i] & 0xf) + ml1;
        reg[1][i] = dl * (grid1[i] >>  4) + ml1;
        reg[2][i] = dl * (grid2[i] & 0xf) + ml2;
        reg[3][i] = dl * (grid2[i] >>  4) + ml2;
    }
}

template 
void dequantize_iq4_nl(device const block_iq4_nl * xb, short il, thread type4x4 & reg) {
    device const uint16_t * q4 = (device const uint16_t *)xb->qs;
    const float d = xb->d;
    uint32_t aux32;
    thread const uint8_t * q8 = (thread const uint8_t *)&aux32;
    for (int i = 0; i < 4; ++i) {
        aux32 = ((q4[2*i] | (q4[2*i+1] << 16)) >> 4*il) & 0x0f0f0f0f;
        reg[i][0] = d * kvalues_iq4nl_f[q8[0]];
        reg[i][1] = d * kvalues_iq4nl_f[q8[1]];
        reg[i][2] = d * kvalues_iq4nl_f[q8[2]];
        reg[i][3] = d * kvalues_iq4nl_f[q8[3]];
    }
}

template 
void dequantize_iq4_xs(device const block_iq4_xs * xb, short il, thread type4x4 & reg) {
    // il is 0...15 for QK_K = 256 => index of block of 32 is il/2
    const int ib32 = il/2;
    il = il%2;
    // il = 0 or 1. il = 0 processes the first 16 quants in a block of 32, il = 1 the second 16
    device const uint32_t * q4 = (device const uint32_t *)xb->qs + 4*ib32;
    const int ls = ((xb->scales_l[ib32/2] >> 4*(ib32%2)) & 0xf) | (((xb->scales_h >> 2*ib32) & 3) << 4);
    const float d = (float)xb->d * (ls - 32);
    uint32_t aux32;
    thread const uint8_t * q8 = (thread const uint8_t *)&aux32;
    for (int i = 0; i < 4; ++i) {
        aux32 = (q4[i] >> 4*il) & 0x0f0f0f0f;
        reg[i][0] = d * kvalues_iq4nl_f[q8[0]];
        reg[i][1] = d * kvalues_iq4nl_f[q8[1]];
        reg[i][2] = d * kvalues_iq4nl_f[q8[2]];
        reg[i][3] = d * kvalues_iq4nl_f[q8[3]];
    }
}

template
kernel void kernel_get_rows_q(
        device const  void * src0,
        device const  void * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        uint3                tgpig[[threadgroup_position_in_grid]],
        uint                 tiitg[[thread_index_in_threadgroup]],
        uint3                tptg [[threads_per_threadgroup]]) {
    const int64_t i10 = tgpig.x;
    const int64_t i11 = tgpig.y;

    const int64_t r = ((const device int32_t *) ((const device char *) src1 + i11*nb11 + i10*nb10))[0];

    const int64_t i02 = i11;

    for (int64_t ind = tiitg; ind < ne00/16; ind += tptg.x) {
        float4x4 temp;
        dequantize_func(((device const block_q *) ((const device char *) src0 + r*nb01 + i02*nb02)) + ind/nl, ind%nl, temp);
        *(((device float4x4 *) ((device char *) dst + i11*nb2 + i10*nb1)) + ind) = temp;
    }
}

template
kernel void kernel_get_rows_f(
        device const  void * src0,
        device const  void * src1,
        device       float * dst,
        constant   int64_t & ne00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        uint3                tgpig[[threadgroup_position_in_grid]],
        uint                 tiitg[[thread_index_in_threadgroup]],
        uint3                tptg [[threads_per_threadgroup]]) {
    const int64_t i10 = tgpig.x;
    const int64_t i11 = tgpig.y;

    const int64_t r = ((const device int32_t *) ((const device char *) src1 + i11*nb11 + i10*nb10))[0];

    const int64_t i02 = i11;

    for (int ind = tiitg; ind < ne00; ind += tptg.x) {
        ((      device float *) ((      device char *)  dst + i11*nb2  + i10*nb1))[ind] =
        ((const device T     *) ((const device char *) src0 + i02*nb02 +  r*nb01))[ind];
    }
}

kernel void kernel_get_rows_i32(
        device const  void * src0,
        device const  void * src1,
        device     int32_t * dst,
        constant   int64_t & ne00,
        constant  uint64_t & nb01,
        constant  uint64_t & nb02,
        constant   int64_t & ne10,
        constant  uint64_t & nb10,
        constant  uint64_t & nb11,
        constant  uint64_t & nb1,
        constant  uint64_t & nb2,
        uint3                tgpig[[threadgroup_position_in_grid]],
        uint                 tiitg[[thread_index_in_threadgroup]],
        uint3                tptg [[threads_per_threadgroup]]) {
    const int64_t i10 = tgpig.x;
    const int64_t i11 = tgpig.y;

    const int64_t r = ((const device int32_t *) ((const device char *) src1 + i11*nb11 + i10*nb10))[0];

    const int64_t i02 = i11;

    for (int ind = tiitg; ind < ne00; ind += tptg.x) {
        ((      device int32_t *) ((      device char *) dst  + i11*nb2 + i10*nb1))[ind] =
        ((const device int32_t *) ((const device char *) src0 + i02*nb02 + r*nb01))[ind];
    }
}


#define BLOCK_SIZE_M 64 // 8 simdgroup matrices from matrix A
#define BLOCK_SIZE_N 32 // 4 simdgroup matrices from matrix B
#define BLOCK_SIZE_K 32
#define THREAD_MAT_M 4 // each thread take 4 simdgroup matrices from matrix A
#define THREAD_MAT_N 2 // each thread take 2 simdgroup matrices from matrix B
#define THREAD_PER_BLOCK 128
#define THREAD_PER_ROW 2 // 2 thread for each row in matrix A to load numbers
#define THREAD_PER_COL 4 // 4 thread for each row in matrix B to load numbers
#define SG_MAT_SIZE 64 // simdgroup matrix is of shape 8x8
#define SG_MAT_ROW 8

// each block_q contains 16*nl weights
template
kernel void kernel_mul_mm(device const  uchar * src0,
                          device const  uchar * src1,
                          device        float * dst,
                          constant    int64_t & ne00,
                          constant    int64_t & ne02,
                          constant   uint64_t & nb01,
                          constant   uint64_t & nb02,
                          constant    int64_t & ne12,
                          constant   uint64_t & nb10,
                          constant   uint64_t & nb11,
                          constant   uint64_t & nb12,
                          constant    int64_t & ne0,
                          constant    int64_t & ne1,
                          constant       uint & r2,
                          constant       uint & r3,
                          threadgroup   uchar * shared_memory [[threadgroup(0)]],
                          uint3                 tgpig[[threadgroup_position_in_grid]],
                          uint                  tiitg[[thread_index_in_threadgroup]],
                          uint                  sgitg[[simdgroup_index_in_threadgroup]]) {

    threadgroup T     * sa = (threadgroup T     *)(shared_memory);
    threadgroup float * sb = (threadgroup float *)(shared_memory + 4096);

    const uint r0 = tgpig.y;
    const uint r1 = tgpig.x;
    const uint im = tgpig.z;

    // if this block is of 64x32 shape or smaller
    short n_rows = (ne0 - r0 * BLOCK_SIZE_M < BLOCK_SIZE_M) ? (ne0 - r0 * BLOCK_SIZE_M) : BLOCK_SIZE_M;
    short n_cols = (ne1 - r1 * BLOCK_SIZE_N < BLOCK_SIZE_N) ? (ne1 - r1 * BLOCK_SIZE_N) : BLOCK_SIZE_N;

    // a thread shouldn't load data outside of the matrix
    short thread_row = ((short)tiitg/THREAD_PER_ROW) < n_rows ? ((short)tiitg/THREAD_PER_ROW) : n_rows - 1;
    short thread_col = ((short)tiitg/THREAD_PER_COL) < n_cols ? ((short)tiitg/THREAD_PER_COL) : n_cols - 1;

    simdgroup_T8x8     ma[4];
    simdgroup_float8x8 mb[2];
    simdgroup_float8x8 c_res[8];
    for (int i = 0; i < 8; i++){
        c_res[i] = make_filled_simdgroup_matrix(0.f);
    }

    short il = (tiitg % THREAD_PER_ROW);

    const uint i12 = im%ne12;
    const uint i13 = im/ne12;

    uint   offset0 = (i12/r2)*nb02 + (i13/r3)*(nb02*ne02);
    ushort offset1 = il/nl;

    device const block_q * x = (device const block_q *)(src0 + (r0 * BLOCK_SIZE_M + thread_row) * nb01 + offset0) + offset1;
    device const float   * y = (device const float   *)(src1
        + nb12 * im
        + nb11 * (r1 * BLOCK_SIZE_N + thread_col)
        + nb10 * (BLOCK_SIZE_K / THREAD_PER_COL * (tiitg % THREAD_PER_COL)));

    for (int loop_k = 0; loop_k < ne00; loop_k += BLOCK_SIZE_K) {
        // load data and store to threadgroup memory
        T4x4 temp_a;
        dequantize_func(x, il, temp_a);
        threadgroup_barrier(mem_flags::mem_threadgroup);

        #pragma unroll(16)
        for (int i = 0; i < 16; i++) {
            *(sa + SG_MAT_SIZE * ((tiitg / THREAD_PER_ROW / 8) \
            +                     (tiitg % THREAD_PER_ROW) * 16 + (i / 8) * 8) \
            +                     (tiitg / THREAD_PER_ROW) % 8  + (i & 7) * 8) = temp_a[i/4][i%4];
        }

        *(threadgroup float2x4 *)(sb + (tiitg % THREAD_PER_COL) * 8 * 32 + 8 * (tiitg / THREAD_PER_COL)) = *((device float2x4 *)y);

        il = (il + 2 < nl) ? il + 2 : il % 2;
        x  = (il < 2) ? x + (2+nl-1)/nl : x;
        y += BLOCK_SIZE_K;

        threadgroup_barrier(mem_flags::mem_threadgroup);

        // load matrices from threadgroup memory and conduct outer products
        threadgroup T     * lsma = (sa + THREAD_MAT_M * SG_MAT_SIZE * (sgitg % 2));
        threadgroup float * lsmb = (sb + THREAD_MAT_N * SG_MAT_SIZE * (sgitg / 2));

        #pragma unroll(4)
        for (int ik = 0; ik < BLOCK_SIZE_K / 8; ik++) {
            #pragma unroll(4)
            for (int i = 0; i < 4; i++) {
                simdgroup_load(ma[i],lsma + SG_MAT_SIZE * i);
            }
            simdgroup_barrier(mem_flags::mem_none);
            #pragma unroll(2)
            for (int i = 0; i < 2; i++) {
                simdgroup_load(mb[i],lsmb + SG_MAT_SIZE * i);
            }

            lsma += BLOCK_SIZE_M / SG_MAT_ROW * SG_MAT_SIZE;
            lsmb += BLOCK_SIZE_N / SG_MAT_ROW * SG_MAT_SIZE;

            #pragma unroll(8)
            for (int i = 0; i < 8; i++){
                simdgroup_multiply_accumulate(c_res[i], mb[i/4], ma[i%4], c_res[i]);
            }
        }
    }

    if ((r0 + 1) * BLOCK_SIZE_M <= ne0 && (r1 + 1) * BLOCK_SIZE_N <= ne1) {
        device float * C = dst + (BLOCK_SIZE_M * r0 + 32 * (sgitg &  1)) \
                               + (BLOCK_SIZE_N * r1 + 16 * (sgitg >> 1)) * ne0 + im*ne1*ne0;
        for (int i = 0; i < 8; i++) {
            simdgroup_store(c_res[i], C + 8 * (i%4) + 8 * ne0 * (i/4), ne0);
        }
    } else {
        // block is smaller than 64x32, we should avoid writing data outside of the matrix
        threadgroup_barrier(mem_flags::mem_threadgroup);
        threadgroup float * temp_str = ((threadgroup float *)shared_memory) \
                                      + 32 * (sgitg&1) + (16 * (sgitg>>1)) * BLOCK_SIZE_M;
        for (int i = 0; i < 8; i++) {
            simdgroup_store(c_res[i], temp_str + 8 * (i%4) + 8 * BLOCK_SIZE_M * (i/4), BLOCK_SIZE_M);
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        device float * C = dst + (BLOCK_SIZE_M * r0) + (BLOCK_SIZE_N * r1) * ne0 + im*ne1*ne0;
        if (sgitg == 0) {
            for (int i = 0; i < n_rows; i++) {
                for (int j = tiitg; j < n_cols; j += BLOCK_SIZE_N) {
                    *(C + i + j * ne0) = *(temp_str + i + j * BLOCK_SIZE_M);
                }
            }
        }
    }
}

// same as kernel_mul_mm_impl, but src1 and dst are accessed via indices stored in rowids
template
void kernel_mul_mm_id_impl(
        device const  uchar * src0,
        device const  uchar * src1,
        threadgroup ushort2 * rowids,
        device        float * dst,
        constant    int64_t & ne00,
        constant    int64_t & ne02,
        constant   uint64_t & nb01,
        constant   uint64_t & nb02,
        constant    int64_t & ne11,
        constant    int64_t & ne12,
        constant   uint64_t & nb10,
        constant   uint64_t & nb11,
        constant   uint64_t & nb12,
        constant    int64_t & ne0,
                    int64_t   ne1,
                    int64_t   ne0ne1,
        threadgroup   uchar * shared_memory,
        uint3                 tgpig[[threadgroup_position_in_grid]],
        uint                  tiitg[[thread_index_in_threadgroup]],
        uint                  sgitg[[simdgroup_index_in_threadgroup]]) {

    threadgroup half  * sa = (threadgroup half  *)(shared_memory);
    threadgroup float * sb = (threadgroup float *)(shared_memory + 4096);

    const uint r0 = tgpig.y;
    const uint r1 = tgpig.x;

    if (r1 * BLOCK_SIZE_N >= ne1) return;

    // if this block is of 64x32 shape or smaller
    short n_rows = (ne0 - r0 * BLOCK_SIZE_M < BLOCK_SIZE_M) ? (ne0 - r0 * BLOCK_SIZE_M) : BLOCK_SIZE_M;
    short n_cols = (ne1 - r1 * BLOCK_SIZE_N < BLOCK_SIZE_N) ? (ne1 - r1 * BLOCK_SIZE_N) : BLOCK_SIZE_N;

    // a thread shouldn't load data outside of the matrix
    short thread_row = ((short)tiitg/THREAD_PER_ROW) < n_rows ? ((short)tiitg/THREAD_PER_ROW) : n_rows - 1;
    short thread_col = ((short)tiitg/THREAD_PER_COL) < n_cols ? ((short)tiitg/THREAD_PER_COL) : n_cols - 1;

    simdgroup_half8x8  ma[4];
    simdgroup_float8x8 mb[2];
    simdgroup_float8x8 c_res[8];
    for (int i = 0; i < 8; i++){
        c_res[i] = make_filled_simdgroup_matrix(0.f);
    }
    short il = (tiitg % THREAD_PER_ROW);

    ushort offset1 = il/nl;

    threadgroup const auto & id = rowids[r1 * BLOCK_SIZE_N + thread_col];

    device const block_q * x = (device const block_q *)(src0 + (r0 * BLOCK_SIZE_M + thread_row) * nb01) + offset1;
    device const float   * y = (device const float   *)(src1
        + nb12 * id[1]
        + nb11 * (id[0] % ne11)
        + nb10 * (BLOCK_SIZE_K / THREAD_PER_COL * (tiitg % THREAD_PER_COL)));

    for (int loop_k = 0; loop_k < ne00; loop_k += BLOCK_SIZE_K) {
        // load data and store to threadgroup memory
        half4x4 temp_a;
        dequantize_func(x, il, temp_a);
        threadgroup_barrier(mem_flags::mem_threadgroup);

        for (int i = 0; i < 16; i++) {
            *(sa + SG_MAT_SIZE * ((tiitg / THREAD_PER_ROW / 8) \
            +                     (tiitg % THREAD_PER_ROW) * 16 + (i / 8) * 8) \
            +                     (tiitg / THREAD_PER_ROW) % 8  + (i & 7) * 8) = temp_a[i/4][i%4];
        }

        *(threadgroup float2x4 *)(sb + (tiitg % THREAD_PER_COL) * 8 * 32 + 8 * (tiitg / THREAD_PER_COL)) = *((device float2x4 *)y);

        il = (il + 2 < nl) ? il + 2 : il % 2;
        x  = (il < 2) ? x + (2+nl-1)/nl : x;
        y += BLOCK_SIZE_K;

        threadgroup_barrier(mem_flags::mem_threadgroup);

        // load matrices from threadgroup memory and conduct outer products
        threadgroup half  * lsma = (sa + THREAD_MAT_M * SG_MAT_SIZE * (sgitg % 2));
        threadgroup float * lsmb = (sb + THREAD_MAT_N * SG_MAT_SIZE * (sgitg / 2));

        for (int ik = 0; ik < BLOCK_SIZE_K / 8; ik++) {
            for (int i = 0; i < 4; i++) {
                simdgroup_load(ma[i], lsma + SG_MAT_SIZE * i);
            }
            simdgroup_barrier(mem_flags::mem_none);
            for (int i = 0; i < 2; i++) {
                simdgroup_load(mb[i], lsmb + SG_MAT_SIZE * i);
            }

            lsma += BLOCK_SIZE_M / SG_MAT_ROW * SG_MAT_SIZE;
            lsmb += BLOCK_SIZE_N / SG_MAT_ROW * SG_MAT_SIZE;

            for (int i = 0; i < 8; i++){
                simdgroup_multiply_accumulate(c_res[i], mb[i/4], ma[i%4], c_res[i]);
            }
        }
    }

    {
        threadgroup_barrier(mem_flags::mem_threadgroup);
        threadgroup float * temp_str = ((threadgroup float *)shared_memory) \
                                      + 32 * (sgitg&1) + (16 * (sgitg>>1)) * BLOCK_SIZE_M;
        for (int i = 0; i < 8; i++) {
            simdgroup_store(c_res[i], temp_str + 8 * (i%4) + 8 * BLOCK_SIZE_M * (i/4), BLOCK_SIZE_M);
        }

        threadgroup_barrier(mem_flags::mem_threadgroup);

        device float * C = dst + (BLOCK_SIZE_M * r0);
        if (sgitg == 0) {
            for (int j = tiitg; j < n_cols; j += BLOCK_SIZE_N) {
                threadgroup const auto & jid = rowids[r1 * BLOCK_SIZE_N + j];
                int joff =  jid[0] * ne0 + jid[1] * ne0ne1;
                for (int i = 0; i < n_rows; i++) {
                    *(C + i + joff) = *(temp_str + i + j * BLOCK_SIZE_M);
                }
            }
        }
    }
}

template
kernel void kernel_mul_mm_id(
        device const   uchar * src0s,
        device const   uchar * src1,
        device         float * dst,
        device const   uchar * ids,
        constant     int64_t & nei0,
        constant     int64_t & nei1,
        constant    uint64_t & nbi1,
        constant     int64_t & ne00,
        constant     int64_t & ne02,
        constant    uint64_t & nb01,
        constant    uint64_t & nb02,
        constant     int64_t & ne11,
        constant     int64_t & ne12,
        constant     int64_t & ne13,
        constant    uint64_t & nb10,
        constant    uint64_t & nb11,
        constant    uint64_t & nb12,
        constant     int64_t & ne0,
        constant     int64_t & ne1,
        constant    uint64_t & nb1,
        threadgroup    uchar * shared_memory [[threadgroup(0)]],
        uint3                  tgpig[[threadgroup_position_in_grid]],
        uint                   tiitg[[thread_index_in_threadgroup]],
        uint                   sgitg[[simdgroup_index_in_threadgroup]]) {

    const int32_t i02 = tgpig.z;
    tgpig.z = 0;

    device const uchar * src0 = src0s + i02*nb02;

    // row indices
    threadgroup ushort2 * rowids = (threadgroup ushort2 *)(shared_memory + 8192);

    // TODO: parallelize this loop
    int64_t _ne1 = 0;
    for (ushort ii1 = 0; ii1 < nei1; ii1++) {
        for (ushort ii0 = 0; ii0 < nei0; ii0++) {
            int32_t id = ((device int32_t *) (ids + ii1*nbi1))[ii0];
            if (id == i02) {
                //if (tiitg == 0) {
                    rowids[_ne1] = ushort2(ii0, ii1);
                //}
                _ne1++;
            }
        }
    }

    threadgroup_barrier(mem_flags::mem_threadgroup);

    kernel_mul_mm_id_impl(
        src0,
        src1,
        rowids,
        dst,
        ne00,
        ne02,
        nb01,
        nb02,
        ne11,
        ne12,
        nb10,
        nb11,
        nb12,
        ne0,
        _ne1,
        ne0*ne1,
        shared_memory,
        tgpig,
        tiitg,
        sgitg);
}

#define QK_NL 16

//
// get rows
//

typedef decltype(kernel_get_rows_f) get_rows_f_t;

template [[host_name("kernel_get_rows_f32")]]  kernel get_rows_f_t kernel_get_rows_f;
template [[host_name("kernel_get_rows_f16")]]  kernel get_rows_f_t kernel_get_rows_f;

typedef decltype(kernel_get_rows_q) get_rows_q_t;

template [[host_name("kernel_get_rows_q4_0")]]    kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_q4_1")]]    kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_q5_0")]]    kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_q5_1")]]    kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_q8_0")]]    kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_q2_K")]]    kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_q3_K")]]    kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_q4_K")]]    kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_q5_K")]]    kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_q6_K")]]    kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_iq2_xxs")]] kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_iq2_xs")]]  kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_iq3_xxs")]] kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_iq3_s")]]   kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_iq2_s")]]   kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_iq1_s")]]   kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_iq1_m")]]   kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_iq4_nl")]]  kernel get_rows_q_t kernel_get_rows_q;
template [[host_name("kernel_get_rows_iq4_xs")]]  kernel get_rows_q_t kernel_get_rows_q;

//
// matrix-matrix multiplication
//

typedef decltype(kernel_mul_mm) mat_mm_t;

template [[host_name("kernel_mul_mm_f32_f32")]]     kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_f16_f32")]]     kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_q4_0_f32")]]    kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_q4_1_f32")]]    kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_q5_0_f32")]]    kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_q5_1_f32")]]    kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_q8_0_f32")]]    kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_q2_K_f32")]]    kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_q3_K_f32")]]    kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_q4_K_f32")]]    kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_q5_K_f32")]]    kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_q6_K_f32")]]    kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_iq2_xxs_f32")]] kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_iq2_xs_f32")]]  kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_iq3_xxs_f32")]] kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_iq3_s_f32")]]   kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_iq2_s_f32")]]   kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_iq1_s_f32")]]   kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_iq1_m_f32")]]   kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_iq4_nl_f32")]]  kernel mat_mm_t kernel_mul_mm;
template [[host_name("kernel_mul_mm_iq4_xs_f32")]]  kernel mat_mm_t kernel_mul_mm;

//
// indirect matrix-matrix multiplication
//

typedef decltype(kernel_mul_mm_id) mat_mm_id_t;

template [[host_name("kernel_mul_mm_id_f32_f32")]]     kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_f16_f32")]]     kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_q4_0_f32")]]    kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_q4_1_f32")]]    kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_q5_0_f32")]]    kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_q5_1_f32")]]    kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_q8_0_f32")]]    kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_q2_K_f32")]]    kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_q3_K_f32")]]    kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_q4_K_f32")]]    kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_q5_K_f32")]]    kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_q6_K_f32")]]    kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_iq2_xxs_f32")]] kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_iq2_xs_f32")]]  kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_iq3_xxs_f32")]] kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_iq3_s_f32")]]   kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_iq2_s_f32")]]   kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_iq1_s_f32")]]   kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_iq1_m_f32")]]   kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_iq4_nl_f32")]]  kernel mat_mm_id_t kernel_mul_mm_id;
template [[host_name("kernel_mul_mm_id_iq4_xs_f32")]]  kernel mat_mm_id_t kernel_mul_mm_id;

//
// matrix-vector multiplication
//

typedef void (kernel_mul_mv_impl_t)(
        device const  char * src0,
        device const  char * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                  uint64_t   nb00,
                  uint64_t   nb01,
                  uint64_t   nb02,
                   int64_t   ne10,
                   int64_t   ne11,
                   int64_t   ne12,
                  uint64_t   nb10,
                  uint64_t   nb11,
                  uint64_t   nb12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
                   uint3     tgpig,
                   uint      tiisg);

typedef void (kernel_mul_mv2_impl_t)(
        device const  void * src0,
        device const float * src1,
        device       float * dst,
                   int64_t   ne00,
                   int64_t   ne01,
                   int64_t   ne02,
                   int64_t   ne10,
                   int64_t   ne12,
                   int64_t   ne0,
                   int64_t   ne1,
                   uint      r2,
                   uint      r3,
        threadgroup int8_t * shared_values,
                   uint3     tgpig,
                   uint      tiisg,
                   uint      sgitg);

template
void mmv_fn(
        device const    char * src0,
        device const    char * src1,
        device         float * dst,
                     int64_t   ne00,
                     int64_t   ne01,
                     int64_t   ne02,
                    uint64_t   nb00,
                    uint64_t   nb01,
                    uint64_t   nb02,
                     int64_t   ne10,
                     int64_t   ne11,
                     int64_t   ne12,
                     int64_t   ne13,
                    uint64_t   nb10,
                    uint64_t   nb11,
                    uint64_t   nb12,
                     int64_t   ne0,
                     int64_t   ne1,
                    uint64_t   nb1,
                        uint   r2,
                        uint   r3,
        threadgroup int8_t   * shared_values,
        uint3                  tgpig,
        uint                   tiitg,
        uint                   tiisg,
        uint                   sgitg) {
    impl_fn(src0,src1,dst,ne00,ne01,ne02,nb00,nb01,nb02,ne10,ne11,ne12,nb10,nb11,nb12,ne0,ne1,r2,r3,tgpig,tiisg);
}

template
void mmv_fn(
        device const    char * src0,
        device const    char * src1,
        device         float * dst,
                     int64_t   ne00,
                     int64_t   ne01,
                     int64_t   ne02,
                    uint64_t   nb00,
                    uint64_t   nb01,
                    uint64_t   nb02,
                     int64_t   ne10,
                     int64_t   ne11,
                     int64_t   ne12,
                     int64_t   ne13,
                    uint64_t   nb10,
                    uint64_t   nb11,
                    uint64_t   nb12,
                     int64_t   ne0,
                     int64_t   ne1,
                    uint64_t   nb1,
                        uint   r2,
                        uint   r3,
        threadgroup int8_t   * shared_values,
        uint3                  tgpig,
        uint                   tiitg,
        uint                   tiisg,
        uint                   sgitg) {
    impl_fn(src0,(const device float *)src1,dst,ne00,ne01,ne02,ne10,ne12,ne0,ne1,r2,r3,shared_values,tgpig,tiisg,sgitg);
}

typedef decltype(mmv_fn>) mul_mv_impl_fn_t;

template
kernel void kernel_mul_mv_id(
        device const    char * src0s,
        device const    char * src1,
        device         float * dst,
        device const    char * ids,
        constant     int64_t & nei0,
        constant     int64_t & nei1,
        constant    uint64_t & nbi1,
        constant     int64_t & ne00,
        constant     int64_t & ne01,
        constant     int64_t & ne02,
        constant    uint64_t & nb00,
        constant    uint64_t & nb01,
        constant    uint64_t & nb02,
        constant     int64_t & ne10,
        constant     int64_t & ne11,
        constant     int64_t & ne12,
        constant     int64_t & ne13,
        constant    uint64_t & nb10,
        constant    uint64_t & nb11,
        constant    uint64_t & nb12,
        constant     int64_t & ne0,
        constant     int64_t & ne1,
        constant    uint64_t & nb1,
        threadgroup int8_t   * shared_values [[threadgroup(0)]],
        uint3                  tgpig[[threadgroup_position_in_grid]],
        uint                   tiitg[[thread_index_in_threadgroup]],
        uint                   tiisg[[thread_index_in_simdgroup]],
        uint                   sgitg[[simdgroup_index_in_threadgroup]]) {
    const int iid1 = tgpig.z/nei0;
    const int idx = tgpig.z%nei0;

    tgpig.z = 0;

    const int32_t i02 = ((device const int32_t *) (ids + iid1*nbi1))[idx];

    const int64_t i11 = idx % ne11;
    const int64_t i12 = iid1;

    const int64_t i1 = idx;
    const int64_t i2 = i12;

    device const char * src0_cur = src0s + i02*nb02;
    device const char * src1_cur = src1 + i11*nb11 + i12*nb12;
    device      float * dst_cur  = dst + i1*ne0 + i2*ne1*ne0;

    impl_fn(
        /* src0 */ src0_cur,
        /* src1 */ src1_cur,
        /* dst  */ dst_cur,
        /* ne00 */ ne00,
        /* ne01 */ ne01,
        /* ne02 */ 1,//ne02,
        /* nb00 */ nb00,
        /* nb01 */ nb01,
        /* nb02 */ nb02,
        /* ne10 */ ne10,
        /* ne11 */ 1,//ne11,
        /* ne12 */ 1,//ne12,
        /* ne13 */ 1,//ne13,
        /* nb10 */ nb10,
        /* nb11 */ nb11,
        /* nb12 */ nb12,
        /* ne0  */ ne0,
        /* ne1  */ 1,//ne1,
        /* nb1  */ nb1,
        /* r2   */ 1,
        /* r3   */ 1,
        shared_values,
        tgpig,
        tiitg,
        tiisg,
        sgitg);
}

typedef decltype(kernel_mul_mv_id>>) kernel_mul_mv_id_t;

template [[host_name("kernel_mul_mv_id_f32_f32")]]     kernel kernel_mul_mv_id_t kernel_mul_mv_id>>;
template [[host_name("kernel_mul_mv_id_f16_f32")]]     kernel kernel_mul_mv_id_t kernel_mul_mv_id>>;
template [[host_name("kernel_mul_mv_id_q8_0_f32")]]    kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_q4_0_f32")]]    kernel kernel_mul_mv_id_t kernel_mul_mv_id>>;
template [[host_name("kernel_mul_mv_id_q4_1_f32")]]    kernel kernel_mul_mv_id_t kernel_mul_mv_id>>;
template [[host_name("kernel_mul_mv_id_q5_0_f32")]]    kernel kernel_mul_mv_id_t kernel_mul_mv_id>>;
template [[host_name("kernel_mul_mv_id_q5_1_f32")]]    kernel kernel_mul_mv_id_t kernel_mul_mv_id>>;
template [[host_name("kernel_mul_mv_id_q2_K_f32")]]    kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_q3_K_f32")]]    kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_q4_K_f32")]]    kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_q5_K_f32")]]    kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_q6_K_f32")]]    kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_iq1_s_f32")]]   kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_iq1_m_f32")]]   kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_iq2_xxs_f32")]] kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_iq2_xs_f32")]]  kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_iq3_xxs_f32")]] kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_iq3_s_f32")]]   kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_iq2_s_f32")]]   kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_iq4_nl_f32")]]  kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
template [[host_name("kernel_mul_mv_id_iq4_xs_f32")]]  kernel kernel_mul_mv_id_t kernel_mul_mv_id>;
!?p@p(p SAp(p SAp(p SAp(ppppp SAp(p SAp(p UEp(RGp SAp(p SAp(p SAp(p SAp(p SAp(p(p@p pp(p pp(p SAp(p pp(p SAp(p SAp(p SAp(p SAp(?pp pp(p SAp(p`SLSLSDSAp(p SAp(`?DRAREppUARFpSAUAWASDSBTASHSEUHSDUA??pQ"`yCp@p(`1ApPRCppSBTAQ@_OBJC_CLASS_$_NSBundleQr??@_OBJC_CLASS_$_NSString??@_OBJC_CLASS_$_MTLCaptureDescriptor??@_OBJC_CLASS_$_MTLCaptureManager???????????@_OBJC_CLASS_$_MTLCompileOptions???????????@__NSConcreteStackBlockq?@___chkstk_darwin?P?@___stack_chk_guard??@___stderrp?@___stdoutp?@__dispatch_queue_attr_concurrent?@_mach_task_self_?@dyld_stub_binder??@__ZNSt12length_errorD1Ev???????????@__ZNSt20bad_array_new_lengthD1Ev?@__ZTINSt3__117__assoc_sub_stateE??6?@__ZTISt12length_error???????????@__ZTISt20bad_array_new_length?@__ZTVN10__cxxabiv120__si_class_type_infoE??6`?@__ZTVNSt3__117__assoc_sub_stateE??????????`?@__ZTVSt12length_error?@__ZdaPv?@__ZdlPv?@__Znam?@__Znwm?@___gxx_personality_v0??@_OBJC_CLASS_$_NSMutableDictionaryr??@_OBJC_CLASS_$_NSURL??@___CFConstantStringClassReferenceq?6???@_OBJC_CLASS_$_NSObjectr??@_OBJC_METACLASS_$_NSObject????????????@__objc_empty_cache??@_objc_msgSendq??@__ZTISt12length_errorQq?@__ZdaPv??@__ZdlPv?@__Znam?@__Znwm?r@_MTLCopyAllDevices?r@_MTLCreateSystemDefaultDevice?r@__Unwind_Resume?r@__ZNSt11logic_errorC2EPKc?r @__ZNSt13exception_ptrD1Ev?r(@__ZNSt20bad_array_new_lengthC1Ev?r0@__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc?r8@__ZNSt3__114__shared_countD2Ev?r@@__ZNSt3__115__thread_structC1Ev?rH@__ZNSt3__115__thread_structD1Ev?rP@__ZNSt3__117__assoc_sub_state13set_exceptionESt13exception_ptr?rX@__ZNSt3__117__assoc_sub_state16__on_zero_sharedEv?r`@__ZNSt3__117__assoc_sub_state4waitEv?rh@__ZNSt3__117__assoc_sub_state9set_valueEv?rp@__ZNSt3__118condition_variableD1Ev?rx@__ZNSt3__119__thread_local_dataEv?r?@__ZNSt3__120__throw_system_errorEiPKc?r?@__ZNSt3__15mutexD1Ev?r?@__ZNSt3__16futureIvE3getEv?r?@__ZNSt3__16futureIvEC1EPNS_17__assoc_sub_stateE?r?@__ZNSt3__16futureIvED1Ev?r?@__ZNSt3__16thread6detachEv?r?@__ZNSt3__16threadD1Ev?r?@__ZSt17current_exceptionv?r?@__ZSt9terminatev?r?@___cxa_allocate_exception?r?@___cxa_atexit?r?@___cxa_begin_catch?r?@___cxa_end_catch?r?@___cxa_free_exception?r?@___cxa_guard_abort?r?@___cxa_guard_acquire?r?@___cxa_guard_release?r?@___cxa_rethrow?r?@___cxa_throw?r?@___error?r?@___sincosf_stret?r?@___stack_chk_fail?r?@_abort?r?@_bzero?r?@_calloc?r?A_cblas_sgemm$NEWLAPACK$ILP64?r?@_clock?r?@_clock_gettime?r?@_cosf?r?@_dispatch_apply?r?@_dispatch_queue_create?r?@_dispatch_release?r?@_exp2f?r?@_expf?r?@_expm1f?r?@_fclose?r?@_fflush?r?@_fopen$DARWIN_EXTSN?r?@_fprintf?r?@_fputc?r?@_fputs?r?@_fread?r?@_free?r?@_fseek?r?@_ftell?r?@_fwrite?r?@_getenv?r?@_log1pf?r?@_log2?r?@_log2f?r?@_logf?r?@_malloc?r?@_memcmp?r?@_memcpy?r?@_memset?r?@_memset_pattern16?r?@_objc_alloc?r?@_objc_autoreleasePoolPop?r?@_objc_autoreleasePoolPush?r?@_objc_enumerationMutation?r?@_objc_opt_class?r?@_objc_opt_new?r?@_objc_release?r?@_posix_memalign?r?@_powf?r?@_printf?r?@_pthread_cond_broadcast?r?@_pthread_cond_destroy?r?@_pthread_cond_init?r?@_pthread_cond_wait?r?@_pthread_create?r?@_pthread_join?r?@_pthread_mutex_destroy?r?@_pthread_mutex_init?r?@_pthread_mutex_lock?r?@_pthread_mutex_unlock?r?@_pthread_self?r?@_pthread_setschedparam?r?@_pthread_setspecific?r?@_putchar?r?@_puts?r?@_qsort?r?@_realloc?r?@_sched_yield?r?@_sinf?r?@_snprintf?r?@_strcmp?r?@_strdup?r?@_strerror?r?@_strlen?r?@_strncpy?r?@_sysconf?r?@_sysctlbyname?r?@_tanhf?r?@_vDSP_maxv?r?@_vDSP_sve?r?@_vDSP_vadd?r?@_vDSP_vdiv?r?@_vDSP_vmul?r?@_vDSP_vsmul?r?@_vDSP_vsub?r?@_vfprintf?r?@_vm_allocate?r?@_vm_deallocate?r?@_vsnprintf?_?XȌ+??+CLASS_$_GGMLMetalClass	METACLASS_$_GGMLMetalClass????mKsQ??????sexsks_xqĮ??s?xxs?????nl?xs?1_W2_z3_?4_????????Ġ0?1?K??????0?1?K???????0?K?2_K?3_K?4_?5_?6_K?8_?????1_0?2_0?iq?q?tq???????_inplace?ort?s?????_inplace?????_inplace???????Ȩ_inplace?cast?inplace?rel_pos?Ⱦ1?_???????hape?tride?????max?sort???+ange?e_same_s?g?m_arch_features?b?cc?dd?r?????؋_from_buft?buffer?ctx_tensors???#??#init?set_n_threads?ԙ??lear?opy_tensor???????ignment?loc_size???????????al?base?max_size?size?type?usage?????_tensor?ܙ??host?multi_buffer?nit?s_??????c?free?get_?i?name?reset?set_usage???Ȗ?ignment?loc_size???Жal?device?max_size?????alloc_buffer?get_?is_host?name?fer_?t_?las_?uf?	??????from_ptr?	type?	??????????abort_callback?	n_threads?	threadpool?
buffer_?	init?	reg?	set_?
ompare_graph_backend?	pu_?
̺?ܺfrom_host_ptr?
type?
????name?type?ackend_reg?
uffer_?y_?????ĺ??_props??Ժ?????????buft?op???b?count?description?get?host_buffer_type?init?memory?name?offload_op?supports_?type???_?ice_register?
????ĸ???free?
new?
record?
synchronize?
wait?
???????fault_buffer_type?vice?ԝalignment?de?max_size????_async?????_free?mpute?py???ompute?reate???c?free?co?plan_?Мet_?raph_?uid???????name?type?est?y_???#????!blas?cpu?metal?nit_b?s_??? ?? from_ptr?type???!?? ??!??!et_abort_callback?upports_family?buffer_?capture_next_compute?init?s?????alloc_buffer?set_usage?etal_?ulti_buffer_?ܜ??????????count?get?????_proc_address???!??by_name?count?dev_?get?metal_init?name???_?ister?İ??????ackend?uffer_size???????backends?copies?splits???b?n_?tensor_backend?????_async?et_?raph_compute???????rve?t?????eval_callback?tensor_backend??et_?ynchronize?alloc_graph?free?g?new?rese?s????buft?op?Ъched_?upports_?ynchronize???ĵ??_async?????_async???????_async?alloc?copy?get?memset?set???alloc_?b?	c?
dev?
event_?
free?g?i?m?name?offload_op?reg?s?tensor_?view_init?????_row???????expand?gradient_checkpointing????backward_?forward_expand?opt_adamw?ackend_?f16_to_fp32?lck_size?uild_?????n_repeat?st??????????ȧ1d?2d?3d?4d???_?????_ph?????1_ph?k_p0???_s???????1d?2d_p0?1d?2d?depthwise_2d?transpose_?cat?t?v_?????_inplace???n?s?unt_equal?ē?????????bmi?nni?bf16?v??_?ؑБ2?512?_vnni?rm_fma?vx?ؒ????ann?uda?????Ȓ16c?ma?p16_va??????????atmul_int8?etal???????iscv_v?pc?????e3?se3?????s?ve?ycl????sx?ulkan?В
a?blas?c?f?gpublas?kompute?llamafile?m?neon?r?s?v?wasm_simd?get_sve_cnt?has_???u_?y?????_back?????_per_ms? a?lamp?o?p?ross_entropy_loss?ycles? ????_inplace? ????_inplace? inf? zero? ??_mask_?!????_inplace?!ag?!v?!̽??inplace?!tensor?!??_?!i?!up?!??????_inplace?!ement_size?!u?"ԋȉ_inplace?"l?"xp?"ܒ??Č_set_prec?"back?"ext?"???pen?"rmat_name?"????_row?#????_ref?#??_row?#????_row?#bf16?#fp16?#16_to_fp32?#32_to_?#????lash_attn_?"o?#p?#ree?$type_to_ggml_type?$??????????_n?$????_n?$alloc_graph?$free?$get_buffer_size?$new?$reserve?$??ЂĀ_inplace?%inplace?%quick?%??_?%?$??$4_q8_0?%8_q8_0?%??$4x?%8x8_q8_0?&??#܆$4_q8_0?&8_q8_0?&??$4x?&8x8_q8_0?&m_q4_0_?&v_q4_0_?&????_f32?&????1d?'nd?'??32_?'irst_tensor?'????1d?'nd?'??????buffer?'size?'ax_tensor_size?'em_?'??????ame?(ext_tensor?(o_alloc?(ܦ????_back?(el_pos?(ows?(????data?&f?'i32_?'m?'n?(r?(tensor?(unary_op?(lu?%m?&t_?(????????_with_ctx?)??lear?)ompute?)py?)??
??mp_dot?)p?)????????????s?*_nodes?*ode?*????_custom?*????
lan?*rint?*??????add_node?)c?)du?*export?*get_tensor?*import?*n?*overhead?*p?*reset?*size?+view?+??А_inplace?+aph_?+oup_norm?+??allocr_?$e?)r?,uid_matches?,????igmoid?,wish?,??????free?,new?,reset?,??et_?,ize?-rds?,sh_s?-????_back?-????it?-ternal_get_type_traits?-????????0?-1?-2?-??_?.????????????????
3d?-contiguous?.empty?.matrix?.numa?.permuted?.quantized?.scalar?.transposed?.vector?.m2col?-n?-s_?.????????place?/ternal?/Гcallback_default?/in?/set?/??_?/eaky_relu?/og?0????f32?0inplace_f32?0??????_f32?0f32?0inplace?0??_?0??????_f32?1f32?1inplace?1??_?1??????_f32?1f32?1inplace?1??_?11?02?13?1????f32?1inplace_f32?2binary_?0custom?1unary_?2????A??+end?2start?2an?2tallib_?2????Ȕid?2set_prec?2??_?3inplace?2mat?3??_?3ap_?2e?2ul?3??????_pad?3????_inplace?3???????_custom?4?????ć??1d?42d?43d?44d?4??_?4f32?3graph?4i32?4tensor?4g?3lements?3w_?4Ԍ܋_inplace?5????_dims?3bytes?3e?4orm?5rows?5uma_init?5??????desc?5name?5symbol?5Ԝ
О
?
??
_g?6??default_params?6init?6resume?6step_adamw?6Ц
_?6_?5t?6șp?6ut_prod?6?????????_back?71d?72d?7????s?7ad?7ermute?7ool_?7rint_object?7܈???Ȉchunk?7free?7init?7requires_imatrix?7????_inplace?8????_back?8????????1d?82d?83d?84d?8ܬ_?8lu?8peat?8shape?9ԏЎback?9inplace?9؍_?9??????_inplace?9????_inplace?9????back?9custom?9ext?9inplace?:yarn_corr_dims?:??_?:??pe?:w_size?:??e?9ms_norm?9o?:wkv_wkv?:??ܛ_inplace?;???_inplace?;????_inplace?;ܴ??1d?;nd?;??_?;??1d?;nd?;??_?;ء?lace?gmoid?=lu?>n?>????_inplace?>????back?>ext?>inplace?>??_?>??????_inplace????_inplace??t????ܕconv??scan????????_inplace??atus_to_string??ep??????_inplace?@????_rows?@b?@m?@	cale?;et?=gn?=i?>oft_max?>qr??sm_??t??u?@??R????alloc?@new?A????_inplace?Able_f32_f16?@llocr_?Anh?A????????????default?Ainit?Amatch?A??rams_?Ause?B??free?Anew?Apa?Bresume?B??????init?Bms?Bus?B??_?Bstep_embedding?B??????????f?Cname?Csize?Ca?Aensor_overhead?Ahreadpool_?Bime?Bop_k?Cranspose?Cype_?C????inplace?Cop_name?D??_?D??ary?Dravel_index?D???_ext?D??n?Dpscale?Dsed_mem?D?? ????m_q8_K?Ds_q8_K?E??????s_q8_K?Exs_q8_K?Es_q8_K?Ex?E????s_q8_K?Exxs_q8_K?E????nl_q8_0?Exs_q8_K?E1_?E2_?E3_?E4_?E??????????0_q8_0?F1_q8_1?FK_q8_K?F?????0_q8_0?F1_q8_1?FK_q8_K?F????2_K_q8_K?F3_K_q8_K?F4_?F5_?F6_K_q8_K?G8_0_q8_0?Gԇ؋1_0_q8_K?G2_0_q8_K?Giq?Fq?Gtq?G?????????1d?H2d?H3d?H4d?Htensor?Halidate_row_data?Dec_dot_?Giew_?H????part?Hunpart?Ha?b?c? d?!e?"f?$g?,ha?-i?/l?0m?3n?5o?6p?7quantize_?8r?:s?@t?Cu?Dv?Hwin_?H??????key?Itensor?I̳ind_?Jree?J??ܽ???мdata?Jn?Jstr?Jtype?Jlignment?Jrr_?J????_offset?J????ey?Kv_type?K????data?Ksize?K????kv?Ktensors?K??????name?Koffset?Ktype?K????????32?L64?L????????16?L32?L64?L8?L??????????16?L32?L64?L8?Lbool?Ldata?Lf?Li?Lstr?Lu?L?al_?Mersion?Ma?Jdata?Jk?Kmeta_?Kn_?Ktensor_?Kv?M????empty?Mfrom_file?M??????data?Nstr?N??????data?Ntype?N??????32?N64?N????????16?N32?N64?O8?O??????????16?O32?O64?O8?Obool?Nf?Ni?Ostr?Ou?Oarr_?Nkv?Ntensor_?Nval_?O???add_tensor?If?Jget_?Minit_?Mremove_key?Nset_?Otype_name?Pwrite_to_file?Pml_?Iuf_?P????free_impl?Pinit_impl?Q????free_impl?Qinit_impl?Q2xs_?Q3xs_?Q????m?Qs?Q??????s?Qxs?Qs?Qx?Q??؉s?Rxxs?RԽ??nl?Rxs?R1_?Q2_?R3_?R4_?R??#??????#??#4?R8?R??#4x?R8x8?S??_?S????0?S1?SK?S?????0?S1?SK?S????#??#4?S8?S??_4x?S2_K?R3_K?R4_?S5_?S6_K?S8_0?S?? ?? _ref?T????_ref?T????_ref?Ts?Txxs?T????_ref?T????_ref?Tnl?Txs?U2_s?T3_?T4_?U????_ref?UЫ??_ref?U????_ref?Uă؊_ref?U????_ref?U0?U1?UK?U܊??_ref?Vē??_ref?V܇?_ref?V0?V1?VK?V????_ref?V????_ref?V????_ref?W????_ref?W0?V1?WK?W2_K?U3_K?U4_?V5_?V6_K?V8_?W????_ref?W????_ref?W1_0?W2_0?Wiq?Uq?Wtq?X????1_0?X2_0?Xiq?Rmat_q8_0?Rq?Trow_?Xtq?XOBJC_dequantize_row_?gg?Piq?Qquantize_?X??t?0,8????? LP|0@???$(,8L<0$<`????80LL???<?00?0\``?????L????????,Dpx@|???????@|@|@|@|@|P?????????????????????D???x?x?|T??L?????\\??????????????????t?t??D?8?8?????????8L???? ????D??L ???????|??|????????????????H?(???D?|??d?C\?QC??eC?vC???C??C???C??C?	D#(D?)9D<PD?DdDF?D?|^?D??`E?hME?h?E?i?E?i+FmbF(m?F0m?FXoG?vbGl??Gl??G??H?H?2H????H????H???H??I?8?rIL??IX??I`?,Jx?J???J??#K??uK,??K8??KD?
L|?HL@??LԲ?L?M?DM???nM?@??M???M??N??]N???N???N?-O??qOt??O??PԷeP??Pd??P??4Qܼ?QL??Q???Q?6?Q??Q???QW0??W|?PX???X??zY??|Z8?w[?(	?[?(	?[?(	?[?(	?[?(	\?4	8\?4	Q\?4	o\5	?\05	?\P5	?\p5	]?5	8]?5	R]?5	k]?5	?]6	?]06	?]P6	?]p6	^?6	^?6	>^?6	k^?6	?^7	?^07	?^P7	_p7	_?7	W_?7	?_?7	?_?7	?_8	?_08	,`P8	R`p8	n`?8	?`?8	?`?8	?`?8	a9	&a09	MaP9	kap9	?a?9	?a?9	?a?9	b?9	1b:	Fb0:	`bP:	?bp:	?b?:	?b?:	?b ?	cX@	cHF	cHN	+c?N	7c?^	Bc?~	OcȂ	ZcȊ	ec??	tc??	?c??	?c??	?c??	?c??	?c?	d?	"d?	Cd?	dd?	d?	?dz
"eTq
5ehq
He|q
[e?q
ne?q
?e?q
?e?q
?e?q
?e?q
?e?q
?er
?e r
f0r
f@r
0fPr
Dfdr
Xftr
jf?r
}f?r
?fs
?f0s
?f??
?f??
?f?
?f??
?f?
g??
g?
Gg`?
ig??
?g?
?gx?
?gș
?g?P?
hp?
h??
?h(?
%i??
Ji?
kip?
zi??
?i??
?i??
?i?
?i?
j?a'j0?x?M??a?r m?4d??c?,r?)?t4?D a?*% *<`7O,dc?ct$d??^?^??e??B?da??c??`P???8HhK??]??m?0?.?h0?|/?T?????s?in?n"xo8pN?pd?qs?m??i?`q??l??m??n??m?X??&?O&??a&d?q&???&4??&?}?&t??&???&?}?&???&??&?'?'(?$'X?/'l??'d?R'??\'8?n't?}'???'8??'???'???'ĩ?'??'???'??(|	 (?
/(?cF(?Q(?d(ȥn(??(p??(???(???(?*?(?*?(??((??(?n)?d)?l2)lR)?ko)|l?)xe?)?e?)hh?)lh?)?h?)*?
*??*tl-*|k=*LlN*??Z*??n*?l?*,??*t?*??*h}?*?*$?*?!+?(+?B+?]+v+??+?&?+H*?+?+
?+h?
,??%,=,??U,?m,d?,??,??,??,??,???,$?-??-??-??1-@-xQ-йb-??q-H??-̙?-x??-ܞ?-???-h??-P??-???-??.??.??/. ?C.??W.??f.@?z.???.ħ?.ا?.p??.???.@??.?/(?/??,/X?>/?O/??a/??s/??/̣?/???/p??/??/???/??/|?0X?0?#0??90?O0??b0?t0???0|??0	>>>->6>=>D>K>Q>X>_>g>o>w>}>?>?>?>?>?>?>?>?>?>?>?&?4?D?R?`?p?v?~?????????????@@/@E@S@j@@?@?@?@?@?@?@?@?@?@?@?@?@?@?@AAA$A/A:AFAQA[AhAwA?A??????????????????????????????????????????????????????????????????????	

 !"#$%&'()*+,-./012345678?????????????????9??????????????????????????????????????????????????????????????????	

 !"#$%&'()*+,-./012345678 _OBJC_CLASS_$_GGMLMetalClass_OBJC_METACLASS_$_GGMLMetalClass_dequantize_row_iq1_m_dequantize_row_iq1_s_dequantize_row_iq2_s_dequantize_row_iq2_xs_dequantize_row_iq2_xxs_dequantize_row_iq3_s_dequantize_row_iq3_xxs_dequantize_row_iq4_nl_dequantize_row_iq4_xs_dequantize_row_q2_K_dequantize_row_q3_K_dequantize_row_q4_0_dequantize_row_q4_1_dequantize_row_q4_K_dequantize_row_q5_0_dequantize_row_q5_1_dequantize_row_q5_K_dequantize_row_q6_K_dequantize_row_q8_0_dequantize_row_q8_K_dequantize_row_tq1_0_dequantize_row_tq2_0_ggml_abort_ggml_abs_ggml_abs_inplace_ggml_acc_ggml_acc_inplace_ggml_add_ggml_add1_ggml_add1_inplace_ggml_add_cast_ggml_add_inplace_ggml_add_rel_pos_ggml_add_rel_pos_inplace_ggml_arange_ggml_are_same_shape_ggml_are_same_stride_ggml_argmax_ggml_argsort_ggml_arm_arch_features_ggml_backend_alloc_buffer_ggml_backend_alloc_ctx_tensors_ggml_backend_alloc_ctx_tensors_from_buft_ggml_backend_blas_init_ggml_backend_blas_set_n_threads_ggml_backend_buffer_clear_ggml_backend_buffer_copy_tensor_ggml_backend_buffer_free_ggml_backend_buffer_get_alignment_ggml_backend_buffer_get_alloc_size_ggml_backend_buffer_get_base_ggml_backend_buffer_get_max_size_ggml_backend_buffer_get_size_ggml_backend_buffer_get_type_ggml_backend_buffer_get_usage_ggml_backend_buffer_init_ggml_backend_buffer_init_tensor_ggml_backend_buffer_is_host_ggml_backend_buffer_is_multi_buffer_ggml_backend_buffer_name_ggml_backend_buffer_reset_ggml_backend_buffer_set_usage_ggml_backend_buft_alloc_buffer_ggml_backend_buft_get_alignment_ggml_backend_buft_get_alloc_size_ggml_backend_buft_get_device_ggml_backend_buft_get_max_size_ggml_backend_buft_is_host_ggml_backend_buft_name_ggml_backend_compare_graph_backend_ggml_backend_cpu_buffer_from_ptr_ggml_backend_cpu_buffer_type_ggml_backend_cpu_init_ggml_backend_cpu_reg_ggml_backend_cpu_set_abort_callback_ggml_backend_cpu_set_n_threads_ggml_backend_cpu_set_threadpool_ggml_backend_dev_backend_reg_ggml_backend_dev_buffer_from_host_ptr_ggml_backend_dev_buffer_type_ggml_backend_dev_by_name_ggml_backend_dev_by_type_ggml_backend_dev_count_ggml_backend_dev_description_ggml_backend_dev_get_ggml_backend_dev_get_props_ggml_backend_dev_host_buffer_type_ggml_backend_dev_init_ggml_backend_dev_memory_ggml_backend_dev_name_ggml_backend_dev_offload_op_ggml_backend_dev_supports_buft_ggml_backend_dev_supports_op_ggml_backend_dev_type_ggml_backend_device_register_ggml_backend_event_free_ggml_backend_event_new_ggml_backend_event_record_ggml_backend_event_synchronize_ggml_backend_event_wait_ggml_backend_free_ggml_backend_get_alignment_ggml_backend_get_default_buffer_type_ggml_backend_get_device_ggml_backend_get_max_size_ggml_backend_graph_compute_ggml_backend_graph_compute_async_ggml_backend_graph_copy_ggml_backend_graph_copy_free_ggml_backend_graph_plan_compute_ggml_backend_graph_plan_create_ggml_backend_graph_plan_free_ggml_backend_guid_ggml_backend_init_best_ggml_backend_init_by_name_ggml_backend_init_by_type_ggml_backend_is_blas_ggml_backend_is_cpu_ggml_backend_is_metal_ggml_backend_metal_buffer_from_ptr_ggml_backend_metal_buffer_type_ggml_backend_metal_capture_next_compute_ggml_backend_metal_init_ggml_backend_metal_set_abort_callback_ggml_backend_metal_supports_family_ggml_backend_multi_buffer_alloc_buffer_ggml_backend_multi_buffer_set_usage_ggml_backend_name_ggml_backend_offload_op_ggml_backend_reg_by_name_ggml_backend_reg_count_ggml_backend_reg_dev_count_ggml_backend_reg_dev_get_ggml_backend_reg_get_ggml_backend_reg_get_proc_address_ggml_backend_reg_metal_init_ggml_backend_reg_name_ggml_backend_register_ggml_backend_sched_alloc_graph_ggml_backend_sched_free_ggml_backend_sched_get_backend_ggml_backend_sched_get_buffer_size_ggml_backend_sched_get_n_backends_ggml_backend_sched_get_n_copies_ggml_backend_sched_get_n_splits_ggml_backend_sched_get_tensor_backend_ggml_backend_sched_graph_compute_ggml_backend_sched_graph_compute_async_ggml_backend_sched_new_ggml_backend_sched_reserve_ggml_backend_sched_reset_ggml_backend_sched_set_eval_callback_ggml_backend_sched_set_tensor_backend_ggml_backend_sched_synchronize_ggml_backend_supports_buft_ggml_backend_supports_op_ggml_backend_synchronize_ggml_backend_tensor_alloc_ggml_backend_tensor_copy_ggml_backend_tensor_copy_async_ggml_backend_tensor_get_ggml_backend_tensor_get_async_ggml_backend_tensor_memset_ggml_backend_tensor_set_ggml_backend_tensor_set_async_ggml_backend_view_init_ggml_bf16_to_fp32_ggml_bf16_to_fp32_row_ggml_blck_size_ggml_build_backward_expand_ggml_build_backward_gradient_checkpointing_ggml_build_forward_expand_ggml_build_opt_adamw_ggml_can_repeat_ggml_cast_ggml_clamp_ggml_concat_ggml_cont_ggml_cont_1d_ggml_cont_2d_ggml_cont_3d_ggml_cont_4d_ggml_conv_1d_ggml_conv_1d_ph_ggml_conv_2d_ggml_conv_2d_s1_ph_ggml_conv_2d_sk_p0_ggml_conv_depthwise_2d_ggml_conv_transpose_1d_ggml_conv_transpose_2d_p0_ggml_cos_ggml_cos_inplace_ggml_count_equal_ggml_cpu_get_sve_cnt_ggml_cpu_has_arm_fma_ggml_cpu_has_avx_ggml_cpu_has_avx2_ggml_cpu_has_avx512_ggml_cpu_has_avx512_bf16_ggml_cpu_has_avx512_vbmi_ggml_cpu_has_avx512_vnni_ggml_cpu_has_avx_vnni_ggml_cpu_has_blas_ggml_cpu_has_cann_ggml_cpu_has_cuda_ggml_cpu_has_f16c_ggml_cpu_has_fma_ggml_cpu_has_fp16_va_ggml_cpu_has_gpublas_ggml_cpu_has_kompute_ggml_cpu_has_llamafile_ggml_cpu_has_matmul_int8_ggml_cpu_has_metal_ggml_cpu_has_neon_ggml_cpu_has_riscv_v_ggml_cpu_has_rpc_ggml_cpu_has_sse3_ggml_cpu_has_ssse3_ggml_cpu_has_sve_ggml_cpu_has_sycl_ggml_cpu_has_vsx_ggml_cpu_has_vulkan_ggml_cpu_has_wasm_simd_ggml_cpy_ggml_cross_entropy_loss_ggml_cross_entropy_loss_back_ggml_cycles_ggml_cycles_per_ms_ggml_diag_ggml_diag_mask_inf_ggml_diag_mask_inf_inplace_ggml_diag_mask_zero_ggml_diag_mask_zero_inplace_ggml_div_ggml_div_inplace_ggml_dup_ggml_dup_inplace_ggml_dup_tensor_ggml_element_size_ggml_elu_ggml_elu_inplace_ggml_exp_ggml_exp_inplace_ggml_flash_attn_back_ggml_flash_attn_ext_ggml_flash_attn_ext_set_prec_ggml_fopen_ggml_format_name_ggml_fp16_to_fp32_ggml_fp16_to_fp32_row_ggml_fp32_to_bf16_ggml_fp32_to_bf16_row_ggml_fp32_to_bf16_row_ref_ggml_fp32_to_fp16_ggml_fp32_to_fp16_row_ggml_free_ggml_ftype_to_ggml_type_ggml_gallocr_alloc_graph_ggml_gallocr_free_ggml_gallocr_get_buffer_size_ggml_gallocr_new_ggml_gallocr_new_n_ggml_gallocr_reserve_ggml_gallocr_reserve_n_ggml_gelu_ggml_gelu_inplace_ggml_gelu_quick_ggml_gelu_quick_inplace_ggml_gemm_q4_0_4x4_q8_0_ggml_gemm_q4_0_4x8_q8_0_ggml_gemm_q4_0_8x8_q8_0_ggml_gemv_q4_0_4x4_q8_0_ggml_gemv_q4_0_4x8_q8_0_ggml_gemv_q4_0_8x8_q8_0_ggml_get_data_ggml_get_data_f32_ggml_get_f32_1d_ggml_get_f32_nd_ggml_get_first_tensor_ggml_get_i32_1d_ggml_get_i32_nd_ggml_get_max_tensor_size_ggml_get_mem_buffer_ggml_get_mem_size_ggml_get_name_ggml_get_next_tensor_ggml_get_no_alloc_ggml_get_rel_pos_ggml_get_rows_ggml_get_rows_back_ggml_get_tensor_ggml_get_unary_op_ggml_graph_add_node_ggml_graph_clear_ggml_graph_compute_ggml_graph_compute_with_ctx_ggml_graph_cpy_ggml_graph_dump_dot_ggml_graph_dup_ggml_graph_export_ggml_graph_get_tensor_ggml_graph_import_ggml_graph_n_nodes_ggml_graph_node_ggml_graph_nodes_ggml_graph_overhead_ggml_graph_overhead_custom_ggml_graph_plan_ggml_graph_print_ggml_graph_reset_ggml_graph_size_ggml_graph_view_ggml_group_norm_ggml_group_norm_inplace_ggml_guid_matches_ggml_hardsigmoid_ggml_hardswish_ggml_hash_set_free_ggml_hash_set_new_ggml_hash_set_reset_ggml_hash_size_ggml_im2col_ggml_im2col_back_ggml_init_ggml_internal_get_type_traits_ggml_is_3d_ggml_is_contiguous_ggml_is_contiguous_0_ggml_is_contiguous_1_ggml_is_contiguous_2_ggml_is_empty_ggml_is_matrix_ggml_is_numa_ggml_is_permuted_ggml_is_quantized_ggml_is_scalar_ggml_is_transposed_ggml_is_vector_ggml_leaky_relu_ggml_log_ggml_log_callback_default_ggml_log_inplace_ggml_log_internal_ggml_log_set_ggml_map_binary_f32_ggml_map_binary_inplace_f32_ggml_map_custom1_ggml_map_custom1_f32_ggml_map_custom1_inplace_ggml_map_custom1_inplace_f32_ggml_map_custom2_ggml_map_custom2_f32_ggml_map_custom2_inplace_ggml_map_custom2_inplace_f32_ggml_map_custom3_ggml_map_custom3_f32_ggml_map_custom3_inplace_ggml_map_custom3_inplace_f32_ggml_map_unary_f32_ggml_map_unary_inplace_f32_ggml_mean_ggml_metallib_end_ggml_metallib_start_ggml_mul_ggml_mul_inplace_ggml_mul_mat_ggml_mul_mat_id_ggml_mul_mat_set_prec_ggml_n_dims_ggml_nbytes_ggml_nbytes_pad_ggml_neg_ggml_neg_inplace_ggml_nelements_ggml_new_f32_ggml_new_graph_ggml_new_graph_custom_ggml_new_i32_ggml_new_tensor_ggml_new_tensor_1d_ggml_new_tensor_2d_ggml_new_tensor_3d_ggml_new_tensor_4d_ggml_norm_ggml_norm_inplace_ggml_nrows_ggml_numa_init_ggml_op_desc_ggml_op_name_ggml_op_symbol_ggml_opt_ggml_opt_default_params_ggml_opt_init_ggml_opt_resume_ggml_opt_resume_g_ggml_opt_step_adamw_ggml_out_prod_ggml_pad_ggml_permute_ggml_pool_1d_ggml_pool_2d_ggml_pool_2d_back_ggml_print_object_ggml_print_objects_ggml_quantize_chunk_ggml_quantize_free_ggml_quantize_init_ggml_quantize_requires_imatrix_ggml_relu_ggml_relu_inplace_ggml_repeat_ggml_repeat_back_ggml_reshape_ggml_reshape_1d_ggml_reshape_2d_ggml_reshape_3d_ggml_reshape_4d_ggml_rms_norm_ggml_rms_norm_back_ggml_rms_norm_inplace_ggml_rope_ggml_rope_back_ggml_rope_custom_ggml_rope_custom_inplace_ggml_rope_ext_ggml_rope_ext_inplace_ggml_rope_inplace_ggml_rope_yarn_corr_dims_ggml_row_size_ggml_rwkv_wkv_ggml_scale_ggml_scale_inplace_ggml_set_ggml_set_1d_ggml_set_1d_inplace_ggml_set_2d_ggml_set_2d_inplace_ggml_set_f32_ggml_set_f32_1d_ggml_set_f32_nd_ggml_set_i32_ggml_set_i32_1d_ggml_set_i32_nd_ggml_set_inplace_ggml_set_input_ggml_set_loss_ggml_set_name_ggml_set_no_alloc_ggml_set_output_ggml_set_param_ggml_set_scratch_ggml_set_zero_ggml_sgn_ggml_sgn_inplace_ggml_sigmoid_ggml_sigmoid_inplace_ggml_silu_ggml_silu_back_ggml_silu_inplace_ggml_sin_ggml_sin_inplace_ggml_soft_max_ggml_soft_max_back_ggml_soft_max_back_inplace_ggml_soft_max_ext_ggml_soft_max_inplace_ggml_sqr_ggml_sqr_inplace_ggml_sqrt_ggml_sqrt_inplace_ggml_ssm_conv_ggml_ssm_scan_ggml_status_to_string_ggml_step_ggml_step_inplace_ggml_sub_ggml_sub_inplace_ggml_sum_ggml_sum_rows_ggml_table_f32_f16_ggml_tallocr_alloc_ggml_tallocr_new_ggml_tanh_ggml_tanh_inplace_ggml_tensor_overhead_ggml_threadpool_free_ggml_threadpool_new_ggml_threadpool_params_default_ggml_threadpool_params_init_ggml_threadpool_params_match_ggml_threadpool_pause_ggml_threadpool_resume_ggml_time_init_ggml_time_ms_ggml_time_us_ggml_timestep_embedding_ggml_top_k_ggml_transpose_ggml_type_name_ggml_type_size_ggml_type_sizef_ggml_unary_ggml_unary_inplace_ggml_unary_op_name_ggml_unravel_index_ggml_upscale_ggml_upscale_ext_ggml_used_mem_ggml_validate_row_data_ggml_vec_dot_iq1_m_q8_K_ggml_vec_dot_iq1_s_q8_K_ggml_vec_dot_iq2_s_q8_K_ggml_vec_dot_iq2_xs_q8_K_ggml_vec_dot_iq2_xxs_q8_K_ggml_vec_dot_iq3_s_q8_K_ggml_vec_dot_iq3_xxs_q8_K_ggml_vec_dot_iq4_nl_q8_0_ggml_vec_dot_iq4_xs_q8_K_ggml_vec_dot_q2_K_q8_K_ggml_vec_dot_q3_K_q8_K_ggml_vec_dot_q4_0_q8_0_ggml_vec_dot_q4_1_q8_1_ggml_vec_dot_q4_K_q8_K_ggml_vec_dot_q5_0_q8_0_ggml_vec_dot_q5_1_q8_1_ggml_vec_dot_q5_K_q8_K_ggml_vec_dot_q6_K_q8_K_ggml_vec_dot_q8_0_q8_0_ggml_vec_dot_tq1_0_q8_K_ggml_vec_dot_tq2_0_q8_K_ggml_view_1d_ggml_view_2d_ggml_view_3d_ggml_view_4d_ggml_view_tensor_ggml_win_part_ggml_win_unpart_gguf_add_tensor_gguf_find_key_gguf_find_tensor_gguf_free_gguf_get_alignment_gguf_get_arr_data_gguf_get_arr_n_gguf_get_arr_str_gguf_get_arr_type_gguf_get_data_gguf_get_data_offset_gguf_get_key_gguf_get_kv_type_gguf_get_meta_data_gguf_get_meta_size_gguf_get_n_kv_gguf_get_n_tensors_gguf_get_tensor_name_gguf_get_tensor_offset_gguf_get_tensor_type_gguf_get_val_bool_gguf_get_val_data_gguf_get_val_f32_gguf_get_val_f64_gguf_get_val_i16_gguf_get_val_i32_gguf_get_val_i64_gguf_get_val_i8_gguf_get_val_str_gguf_get_val_u16_gguf_get_val_u32_gguf_get_val_u64_gguf_get_val_u8_gguf_get_version_gguf_init_empty_gguf_init_from_file_gguf_remove_key_gguf_set_arr_data_gguf_set_arr_str_gguf_set_kv_gguf_set_tensor_data_gguf_set_tensor_type_gguf_set_val_bool_gguf_set_val_f32_gguf_set_val_f64_gguf_set_val_i16_gguf_set_val_i32_gguf_set_val_i64_gguf_set_val_i8_gguf_set_val_str_gguf_set_val_u16_gguf_set_val_u32_gguf_set_val_u64_gguf_set_val_u8_gguf_type_name_gguf_write_to_file_iq2xs_free_impl_iq2xs_init_impl_iq3xs_free_impl_iq3xs_init_impl_quantize_iq1_m_quantize_iq1_s_quantize_iq2_s_quantize_iq2_xs_quantize_iq2_xxs_quantize_iq3_s_quantize_iq3_xxs_quantize_iq4_nl_quantize_iq4_xs_quantize_mat_q8_0_quantize_q2_K_quantize_q3_K_quantize_q4_0_quantize_q4_0_4x4_quantize_q4_0_4x8_quantize_q4_0_8x8_quantize_q4_1_quantize_q4_K_quantize_q5_0_quantize_q5_1_quantize_q5_K_quantize_q6_K_quantize_q8_0_quantize_q8_0_4x4_quantize_q8_0_4x8_quantize_row_iq2_s_quantize_row_iq2_s_ref_quantize_row_iq3_s_quantize_row_iq3_s_ref_quantize_row_iq3_xxs_quantize_row_iq3_xxs_ref_quantize_row_iq4_nl_quantize_row_iq4_nl_ref_quantize_row_iq4_xs_quantize_row_iq4_xs_ref_quantize_row_q2_K_quantize_row_q2_K_ref_quantize_row_q3_K_quantize_row_q3_K_ref_quantize_row_q4_0_quantize_row_q4_0_ref_quantize_row_q4_1_quantize_row_q4_1_ref_quantize_row_q4_K_quantize_row_q4_K_ref_quantize_row_q5_0_quantize_row_q5_0_ref_quantize_row_q5_1_quantize_row_q5_1_ref_quantize_row_q5_K_quantize_row_q5_K_ref_quantize_row_q6_K_quantize_row_q6_K_ref_quantize_row_q8_0_quantize_row_q8_0_ref_quantize_row_q8_1_quantize_row_q8_1_ref_quantize_row_q8_K_quantize_row_q8_K_ref_quantize_row_tq1_0_quantize_row_tq1_0_ref_quantize_row_tq2_0_quantize_row_tq2_0_ref_quantize_tq1_0_quantize_tq2_0_MTLCopyAllDevices_MTLCreateSystemDefaultDevice_OBJC_CLASS_$_MTLCaptureDescriptor_OBJC_CLASS_$_MTLCaptureManager_OBJC_CLASS_$_MTLCompileOptions_OBJC_CLASS_$_NSBundle_OBJC_CLASS_$_NSMutableDictionary_OBJC_CLASS_$_NSObject_OBJC_CLASS_$_NSString_OBJC_CLASS_$_NSURL_OBJC_METACLASS_$_NSObject__NSConcreteStackBlock__Unwind_Resume__ZNSt11logic_errorC2EPKc__ZNSt12length_errorD1Ev__ZNSt13exception_ptrD1Ev__ZNSt20bad_array_new_lengthC1Ev__ZNSt20bad_array_new_lengthD1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__114__shared_countD2Ev__ZNSt3__115__thread_structC1Ev__ZNSt3__115__thread_structD1Ev__ZNSt3__117__assoc_sub_state13set_exceptionESt13exception_ptr__ZNSt3__117__assoc_sub_state16__on_zero_sharedEv__ZNSt3__117__assoc_sub_state4waitEv__ZNSt3__117__assoc_sub_state9set_valueEv__ZNSt3__118condition_variableD1Ev__ZNSt3__119__thread_local_dataEv__ZNSt3__120__throw_system_errorEiPKc__ZNSt3__15mutexD1Ev__ZNSt3__16futureIvE3getEv__ZNSt3__16futureIvEC1EPNS_17__assoc_sub_stateE__ZNSt3__16futureIvED1Ev__ZNSt3__16thread6detachEv__ZNSt3__16threadD1Ev__ZSt17current_exceptionv__ZSt9terminatev__ZTINSt3__117__assoc_sub_stateE__ZTISt12length_error__ZTISt20bad_array_new_length__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVNSt3__117__assoc_sub_stateE__ZTVSt12length_error__ZdaPv__ZdlPv__Znam__Znwm___CFConstantStringClassReference___chkstk_darwin___cxa_allocate_exception___cxa_atexit___cxa_begin_catch___cxa_end_catch___cxa_free_exception___cxa_guard_abort___cxa_guard_acquire___cxa_guard_release___cxa_rethrow___cxa_throw___error___gxx_personality_v0___sincosf_stret___stack_chk_fail___stack_chk_guard___stderrp___stdoutp__dispatch_queue_attr_concurrent__objc_empty_cache_abort_bzero_calloc_cblas_sgemm$NEWLAPACK$ILP64_clock_clock_gettime_cosf_dispatch_apply_dispatch_queue_create_dispatch_release_exp2f_expf_expm1f_fclose_fflush_fopen$DARWIN_EXTSN_fprintf_fputc_fputs_fread_free_fseek_ftell_fwrite_getenv_log1pf_log2_log2f_logf_mach_task_self__malloc_memcmp_memcpy_memset_memset_pattern16_objc_alloc_objc_autoreleasePoolPop_objc_autoreleasePoolPush_objc_enumerationMutation_objc_msgSend_objc_opt_class_objc_opt_new_objc_release_posix_memalign_powf_printf_pthread_cond_broadcast_pthread_cond_destroy_pthread_cond_init_pthread_cond_wait_pthread_create_pthread_join_pthread_mutex_destroy_pthread_mutex_init_pthread_mutex_lock_pthread_mutex_unlock_pthread_self_pthread_setschedparam_pthread_setspecific_putchar_puts_qsort_realloc_sched_yield_sinf_snprintf_strcmp_strdup_strerror_strlen_strncpy_sysconf_sysctlbyname_tanhf_vDSP_maxv_vDSP_sve_vDSP_vadd_vDSP_vdiv_vDSP_vmul_vDSP_vsmul_vDSP_vsub_vfprintf_vm_allocate_vm_deallocate_vsnprintfdyld_stub_binder_ggml_new_tensor_impl_ggml_add_impl_ggml_add1_impl_ggml_acc_impl_ggml_sub_impl_ggml_mul_impl_ggml_div_impl_ggml_scale_impl_ggml_set_impl_ggml_soft_max_impl_ggml_rope_impl_ggml_upscale_impl_ggml_add_rel_pos_impl_ggml_map_binary_impl_f32_ggml_calloc_ggml_recompute_graph_node_ggml_threadpool_new_impl_ggml_graph_compute_thread_gguf_fread_str_gguf_free_kv_gguf_write_to_buf_ggml_vec_dot_f32_ggml_vec_dot_f16_ggml_vec_dot_bf16_ggml_visit_parents_ggml_add_or_set_ggml_sub_or_set_ggml_graph_compute_secondary_thread_ggml_compute_forward_dup_ggml_compute_forward_diag_mask_f32_ggml_compute_forward_rope_f16_ggml_compute_forward_rope_f32_gguf_bwrite_str_ggml_gallocr_hash_get_alloc_tensor_range_ggml_gallocr_allocate_node__ZN21ggml_backend_registry16register_backendEP16ggml_backend_reg__ZN21ggml_backend_registry15register_deviceEP19ggml_backend_device__ZL37ggml_backend_cpu_buffer_type_get_nameP24ggml_backend_buffer_type__ZL41ggml_backend_cpu_buffer_type_alloc_bufferP24ggml_backend_buffer_typem__ZL42ggml_backend_cpu_buffer_type_get_alignmentP24ggml_backend_buffer_type__ZL36ggml_backend_cpu_buffer_type_is_hostP24ggml_backend_buffer_type__ZL29ggml_backend_cpu_reg_get_nameP16ggml_backend_reg__ZL37ggml_backend_cpu_reg_get_device_countP16ggml_backend_reg__ZL31ggml_backend_cpu_reg_get_deviceP16ggml_backend_regm__ZL34ggml_backend_multi_buffer_get_nameP19ggml_backend_buffer__ZL30ggml_backend_sched_split_graphP18ggml_backend_schedP11ggml_cgraph__ZL21graph_copy_dup_tensor13ggml_hash_setPP11ggml_tensorP12ggml_contextS4_S1___ZL22graph_copy_init_tensorP13ggml_hash_setPP11ggml_tensorPbS2___ZN21ggml_backend_registryC1Ev__ZN21ggml_backend_registryD1Ev__ZNKSt3__16vectorIP16ggml_backend_regNS_9allocatorIS2_EEE20__throw_length_errorB8ue170006Ev__ZNSt3__120__throw_length_errorB8ue170006EPKc__ZNSt12length_errorC1B8ue170006EPKc__ZSt28__throw_bad_array_new_lengthB8ue170006v__ZNKSt3__16vectorIP19ggml_backend_deviceNS_9allocatorIS2_EEE20__throw_length_errorB8ue170006Ev__ZL32ggml_backend_cpu_buffer_get_nameP19ggml_backend_buffer__ZL35ggml_backend_cpu_buffer_free_bufferP19ggml_backend_buffer__ZL32ggml_backend_cpu_buffer_get_baseP19ggml_backend_buffer__ZL37ggml_backend_cpu_buffer_memset_tensorP19ggml_backend_bufferP11ggml_tensorhmm__ZL34ggml_backend_cpu_buffer_set_tensorP19ggml_backend_bufferP11ggml_tensorPKvmm__ZL34ggml_backend_cpu_buffer_get_tensorP19ggml_backend_bufferPK11ggml_tensorPvmm__ZL34ggml_backend_cpu_buffer_cpy_tensorP19ggml_backend_bufferPK11ggml_tensorPS1___ZL29ggml_backend_cpu_buffer_clearP19ggml_backend_bufferh__ZL25ggml_backend_cpu_get_nameP12ggml_backend__ZL21ggml_backend_cpu_freeP12ggml_backend__ZL40ggml_backend_cpu_get_default_buffer_typeP12ggml_backend__ZL34ggml_backend_cpu_graph_plan_createP12ggml_backendPK11ggml_cgraph__ZL32ggml_backend_cpu_graph_plan_freeP12ggml_backendPv__ZL35ggml_backend_cpu_graph_plan_computeP12ggml_backendPv__ZL30ggml_backend_cpu_graph_computeP12ggml_backendP11ggml_cgraph__ZN31ggml_backend_cpu_device_contextC1Ev__ZN31ggml_backend_cpu_device_contextD1Ev__ZL32ggml_backend_cpu_device_get_nameP19ggml_backend_device__ZL39ggml_backend_cpu_device_get_descriptionP19ggml_backend_device__ZL34ggml_backend_cpu_device_get_memoryP19ggml_backend_devicePmS1___ZL32ggml_backend_cpu_device_get_typeP19ggml_backend_device__ZL33ggml_backend_cpu_device_get_propsP19ggml_backend_deviceP22ggml_backend_dev_props__ZL28ggml_backend_cpu_device_initP19ggml_backend_devicePKc__ZL39ggml_backend_cpu_device_get_buffer_typeP19ggml_backend_device__ZL39ggml_backend_cpu_device_buffer_from_ptrP19ggml_backend_devicePvmm__ZL35ggml_backend_cpu_device_supports_opP19ggml_backend_devicePK11ggml_tensor__ZL37ggml_backend_cpu_device_supports_buftP19ggml_backend_deviceP24ggml_backend_buffer_type__ZL37ggml_backend_multi_buffer_free_bufferP19ggml_backend_buffer__ZL31ggml_backend_multi_buffer_clearP19ggml_backend_bufferh__ZL38ggml_backend_sched_backend_id_from_curP18ggml_backend_schedP11ggml_tensor__ZL35ggml_backend_sched_buffer_supportedP18ggml_backend_schedP11ggml_tensori_OUTLINED_FUNCTION_0_make_qx_quants_iq2_compare_func_iq3_compare_func_quantize_row_iq3_xxs_impl_quantize_row_iq4_nl_impl_iq2_find_best_neighbour_iq1_sort_helper_iq1_find_best_neighbour2_ggml_backend_metal_buffer_type_get_name_ggml_backend_metal_buffer_type_alloc_buffer_ggml_backend_metal_buffer_type_get_alignment_ggml_backend_metal_buffer_type_get_max_size_ggml_backend_metal_buffer_type_is_host_ggml_metal_init_ggml_backend_metal_buffer_get_name_ggml_backend_metal_buffer_free_buffer_ggml_backend_metal_buffer_get_base_ggml_backend_metal_buffer_set_tensor_ggml_backend_metal_buffer_get_tensor_ggml_backend_metal_buffer_cpy_tensor_ggml_backend_metal_buffer_clear_ggml_backend_metal_name_ggml_backend_metal_free_ggml_backend_metal_get_default_buffer_type_ggml_backend_metal_graph_compute_ggml_backend_metal_supports_op_ggml_backend_metal_supports_buft___ggml_metal_graph_compute_block_invoke_ggml_metal_encode_node_ggml_metal_supports_op_ggml_metal_get_buffer___clang_call_terminate__ZL22ggml_backend_blas_nameP12ggml_backend__ZL22ggml_backend_blas_freeP12ggml_backend__ZL41ggml_backend_blas_get_default_buffer_typeP12ggml_backend__ZL31ggml_backend_blas_graph_computeP12ggml_backendP11ggml_cgraph__ZL29ggml_backend_blas_supports_opP12ggml_backendPK11ggml_tensor__ZL31ggml_backend_blas_supports_buftP12ggml_backendP24ggml_backend_buffer_type__ZNKSt3__16vectorINS_6futureIvEENS_9allocatorIS2_EEE20__throw_length_errorB8ue170006Ev__ZNSt3__119__async_assoc_stateIvNS_12__async_funcIZL25ggml_backend_blas_mul_matP25ggml_backend_blas_contextP11ggml_tensorE3$_0JEEEED1Ev__ZNSt3__119__async_assoc_stateIvNS_12__async_funcIZL25ggml_backend_blas_mul_matP25ggml_backend_blas_contextP11ggml_tensorE3$_0JEEEED0Ev__ZNSt3__119__async_assoc_stateIvNS_12__async_funcIZL25ggml_backend_blas_mul_matP25ggml_backend_blas_contextP11ggml_tensorE3$_0JEEEE16__on_zero_sharedEv__ZNSt3__119__async_assoc_stateIvNS_12__async_funcIZL25ggml_backend_blas_mul_matP25ggml_backend_blas_contextP11ggml_tensorE3$_0JEEEE9__executeEv__ZNSt3__114__thread_proxyB8ue170006INS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMNS_19__async_assoc_stateIvNS_12__async_funcIZL25ggml_backend_blas_mul_matP25ggml_backend_blas_contextP11ggml_tensorE3$_0JEEEEEFvvEPSF_EEEEEPvSK___ZNSt3__110unique_ptrINS_5tupleIJNS0_INS_15__thread_structENS_14default_deleteIS2_EEEEMNS_19__async_assoc_stateIvNS_12__async_funcIZL25ggml_backend_blas_mul_matP25ggml_backend_blas_contextP11ggml_tensorE3$_0JEEEEEFvvEPSE_EEENS3_ISI_EEED1B8ue170006Ev_ggml_backend_register.cold.1_ggml_backend_device_register.cold.1_ggml_backend_reg_count.cold.1_ggml_backend_dev_count.cold.1__ZN21ggml_backend_registryC1Ev.cold.1_objc_msgSend$UTF8String_objc_msgSend$beginScope_objc_msgSend$bundleForClass:_objc_msgSend$commandBufferWithUnretainedReferences_objc_msgSend$commit_objc_msgSend$computeCommandEncoder_objc_msgSend$countByEnumeratingWithState:objects:count:_objc_msgSend$currentAllocatedSize_objc_msgSend$description_objc_msgSend$dictionary_objc_msgSend$dispatchThreadgroups:threadsPerThreadgroup:_objc_msgSend$endEncoding_objc_msgSend$endScope_objc_msgSend$enqueue_objc_msgSend$error_objc_msgSend$fileURLWithPath:_objc_msgSend$hasUnifiedMemory_objc_msgSend$initWithBytes:length:encoding:_objc_msgSend$localizedDescription_objc_msgSend$maxBufferLength_objc_msgSend$maxThreadgroupMemoryLength_objc_msgSend$maxTotalThreadsPerThreadgroup_objc_msgSend$name_objc_msgSend$newBufferWithBytesNoCopy:length:options:deallocator:_objc_msgSend$newCaptureScopeWithDevice:_objc_msgSend$newCommandQueue_objc_msgSend$newComputePipelineStateWithFunction:error:_objc_msgSend$newFunctionWithName:_objc_msgSend$newLibraryWithSource:options:error:_objc_msgSend$pathForResource:ofType:_objc_msgSend$popDebugGroup_objc_msgSend$pushDebugGroup:_objc_msgSend$recommendedMaxWorkingSetSize_objc_msgSend$setBuffer:offset:atIndex:_objc_msgSend$setBytes:length:atIndex:_objc_msgSend$setCaptureObject:_objc_msgSend$setComputePipelineState:_objc_msgSend$setDestination:_objc_msgSend$setOutputURL:_objc_msgSend$setPreprocessorMacros:_objc_msgSend$setThreadgroupMemoryLength:atIndex:_objc_msgSend$sharedCaptureManager_objc_msgSend$startCaptureWithDescriptor:error:_objc_msgSend$status_objc_msgSend$stopCapture_objc_msgSend$stringWithCString:encoding:_objc_msgSend$stringWithFormat:_objc_msgSend$supportsFamily:_objc_msgSend$waitUntilCompleted_ggml_hash_size.primes_GGUF_TYPE_SIZE_iq2xxs_grid_ksigns_iq2xs_iq2xs_grid_iq2s_grid_iq3xxs_grid_iq3s_grid_iq1s_grid_kvalues_iq4nl_table_b2b_1_table_b2b_0_keven_signs_q2xs_ggml_vec_dot_iq2_s_q8_K.k_mask1_ggml_vec_dot_iq3_s_q8_K.k_mask1_iq2xs_init_impl.kgrid_2bit_256_iq2xs_init_impl.kgrid_2bit_512_iq2xs_init_impl.kgrid_1bit_2048_iq2xs_init_impl.kgrid_2bit_1024_iq3xs_init_impl.kgrid_256_iq3xs_init_impl.kgrid_512__ZTSNSt3__119__async_assoc_stateIvNS_12__async_funcIZL25ggml_backend_blas_mul_matP25ggml_backend_blas_contextP11ggml_tensorE3$_0JEEEEEGCC_except_table71GCC_except_table73GCC_except_table75GCC_except_table76GCC_except_table78GCC_except_table79GCC_except_table85GCC_except_table91GCC_except_table96GCC_except_table99GCC_except_table126GCC_except_table129GCC_except_table143GCC_except_table148GCC_except_table155GCC_except_table156GCC_except_table7GCC_except_table11GCC_except_table16GCC_except_table17GCC_except_table18_type_traits_GGML_OP_NAME_GGML_OP_SYMBOL_GGML_UNARY_OP_NAME_GGUF_TYPE_NAME__ZL18ggml_backend_cpu_i__ZL34ggml_backend_cpu_buffer_from_ptr_i__ZL27ggml_backend_multi_buffer_i__ZL25ggml_backend_cpu_buffer_i__ZL25ggml_backend_cpu_device_i_ggml_backend_metal_buffer_i_ggml_backend_metal_i___block_descriptor_49_e8_v16?0Q8l__ZL14blas_backend_i__ZTVNSt3__119__async_assoc_stateIvNS_12__async_funcIZL25ggml_backend_blas_mul_matP25ggml_backend_blas_contextP11ggml_tensorE3$_0JEEEEE__ZTINSt3__119__async_assoc_stateIvNS_12__async_funcIZL25ggml_backend_blas_mul_matP25ggml_backend_blas_contextP11ggml_tensorE3$_0JEEEEE__OBJC_METACLASS_RO_$_GGMLMetalClass__OBJC_CLASS_RO_$_GGMLMetalClass__dyld_private_g_logger_state.0__MergedGlobals_ggml_backend_metal_buffer_type.ggml_backend_buffer_type_metal_ggml_backend_metal_guid.guid__ZZL22ggml_backend_blas_guidvE4guid_g_state_ggml_table_gelu_f16_ggml_table_gelu_quick_f16_g_logger_state.1__MergedGlobals__ZZL8fmt_sizemE6buffer__MergedGlobals.69_iq2_data_iq3_data__MergedGlobals???#z??#ffXt0 
?libggml.dylibL-W?RM??y?5???	????HeW?&u٣???Xo??f????kOX?|?|z?ڽ?H?,????Xo??f????kOX?|?|z?ڽ?H?,????Xo??f????kOX?|?|z?ڽ?H?,????Xo??f????kOX?|?|z?ڽ?H?,????Xo??f????kOX?|?|z?ڽ?H?,??Xk?:l???8??wRY?]oVC?I??Z??s_?P??&???'?????F??ո?
???5?l?~???S??ƚ*Ƙ?&th?????*?}[?P@48??}`Z??nT???4٤]L߷
Ї??S?ӂoe?w??H?H?d?u?p??SB̑???Iz??????"??'G?k?6?
?m?^??2@??t??x?[z	Co??j?O??j?(?B?t?yc?,?fL?5{I!z????^???+gs1???Œ4???@?'??c???w?=mx?d????V?!?^;?????y?;?E2Ͻ?5X>???rVU?Z2?C?O?/???UϏ???g??OO?a??m?ܰ??	?[?>ɩ:Ÿ??+??&NC?	K=?rV$7s?-??xn2???'???H??eG?/?K9v??A.d5?ǎe?n????HY?פ?| ??K?\?????r6?S?kE?v?Z?????k??j??HG
????m7cI???*?$'????y7CFA?./&wA~RT?h???K??;y=?/h??O4͌?O????r??A?<@1??)??c??*????4`????WU?????TQ?F7V???'???h??ٙ?Ol?)?OP?\>?abH̉?e??́???SDe?mI??5?a|?i?=/?P???+N???e?h?GC4???U??w-?CJвqʠo?\Tب??{0D6?????C???Zg3?)>YJ?h??"?6eS?3????1?r>?M<<??V??:????a???OJ+Æ?&??겢?j?%O?^????D?W?z$??m?@0XϦ?2?/??؃?cQ????H?Y1s?w	?Be???CfWZ?o?f*&?K?ƛМ.V??}Nc?+??xB߃?"?4??UjHvY?D?T?h68?u??*YK?[;\Rw;??.??&?????>7?d'Թ?8!Q?g=ٿL	??????w?_m"
.!ά?"j?Q??u?0`d?H???:X?eEn?_?+ִx?T???/?cBy6?2l????x?ԑY?????(av]?LIٻJ?d??Ck)??$w?W???-??N??o_B?W?|2]d??Ԛ?J$?"??1?w??t?\w#??{b^8??0{\?g?憽??V4?v??W??*z?}?
Ҳ{?c-?!l+?"xKJV??[??l?T?ƒs0?rU??7??'????.0???݉?)?\?Y????Tԙd?s??/??(8*?AR????T????u=.f?t"?LiP?mm??(#?RuE?g?i??|?F]?%???C??㷫??xIYK?v;??/?5??G???ҹ1???x??EOl??Þ4???Uڢx?E]??}h??u?[~Ηj?*n3?!?S?3n	??=?H???}??'?;?z?ۏKzٟ7ǵ`?季c|?m1?,??TL??v^?3?/?)uo?????-Ӷ?ҜM9e~OjY???*W?D?&?)1?LKA?+??R|.?,`z?k?dkV{??V?????*??UԨ?$??Yl??O?ѫ6??E??????sk????N??9?[???????X????m?|???־?>Ҏ???1???+o?[?w??S?J{b{:?u?~0?]PQ??.dL֭-?/t,|?l6??D???J?ؤ?15????"??;v?l??ά??5??????*??
 i?NY???"????0?C-????P???ʑ????[??	Po??O?Wgg?}????? ?G?	9`?/??${=;??Y	?``?U?)?v,5??????
???i??j?{B??z1?f?-?d&:Ɍ????6??q??U?DR?S?*???pZpн?7j?ӵ?>|*O??Ƣ•k?ǽ#?Թ?&?N?Z?Uh?????!ڦ@?~bz??\?????T?L???d?J?o?)??W8:׷wi??v??!+?Q?-?Hf?8p?Yt^?q?b??<`??ɂ??w??OVR'?GjzJ#F?8???\c*#r²Z[1W{?O???Jޛ?+Y???^????K????n0??a???w%R?]?g???*?M?5?c???v44ѤVzˑ???-?!?p?&3j?i#G??d?????0[??쵝??
?`?^^	3ĵY??e??????K??0e?kp? ,S1???\6??Mr?smȔ?&:e?6?~w:???=?*Hu*???????X????|ϕc-???Vey??F??I*HO??dp????fu?ë[?Ϯ????????m??,????[M?E??6~?9???]=???tw?Z?6??vA
y/??*?x;??v]???^!pH?2????/?|am?wX?O???pt}???5~r)???'r?_J???{??_????,'?????X#2?|RN8?Ձ?)???>J?????????3?4!???[?
ïj	[???????&??D>?p3J?ky?I?K?7?u?U0?]?n?VZ???Ú?&??D$@?W??z&T?bP?B?R}??W?k?F	!??,|*#?6r????4,w????[?:8/??uY1F???B'??v?'Z>)?9>i	?3?????6E啞Ϝ?춐(???O?5K(???k?>?????Za???v?{?24?( q????o??sN??ĮE{?#%?	?Sp1g?켐I? ??jK\k?????t??t???:?h??QH????;??
??????֘?7?j??rm?h??t??Ty???g??H??S?,̥????C??@Ui??. ???b??>?"???=?i?67V2?N?1?i۫?YK???5v<*4?𞂋?z ??1) ??h??L?Rm*??(???~R͹\???wG?_??#????p@?5s=?`n?
j??_??bRv?z??B7?>ѡ?9?-P??]T\?J??N?slb??e?s????^???}??Tܥf?=?BB?qq&;??0?U?\?ff{???KE?D?2&??L?9?z?S?I???f\???\[??????=?????O0w??A}?uJ???_??ʇ?????K??}?3??rᛙNkl????? ??ԂӀC?v????!E????~?*?긓S<?+?@R??.??7?R?Â??????A?N???s????U??2??s}r?ǘe&??=м?R???$?6?R????"??m?t???=?_BU???P?*p??+?%c*5?n????re?E"??k??R??&`?8???YY???n~n??P???R??_\C?
ܽ?=??{?a?8#??;'???4??????????9?5??@2?<A?⟚?ii???6????4?.?Rn??N\??lGV	?΄f޻?''?b???3??"xcܝ,C??????:?;I??}??o
GBB
??̲?
'"C??93???g?͎?_h???H?|M??ʵ??z?2cc??HnP??????B?/-??_???(??O?????L???? ??P	?"՚?u\?n??o?
ףIO?b???¨??B??Gt??%
t?5M???N[&?*⮳?Q@?ʅ&
?1? ?i?k,U????[?來?^݉??<??]?'???GrK?e?L!]?v?b֔0Q?6?4?p??xy?!? ??????`??N???ʿ?=&????ᕜ??????0??Pi?XY?k?{MNn?r!?N?9?u??Z
????^ y??A.9C?:???I#B??착+?zf??^N?|???ޯC®R??➗i@?+?
??l{Z@?\x?}????a??ϻ???|It??6~mمp??G?????s?ϐ}???%
?ꋾ9T3!?Z<8s'.C?!?[N/@7^Tb???v?w鱹???~????拥??}?9???=;??ύ?A???C???{7n?˂/sa?.?
HD?u??j?n??P??&A???ɊU???+??~?n?tZK?k??!??T??9?A$?T3?Oˣ?p??>????!?b.I???K??????V???!?4(	?ɛ????;???!?U?up?f ??ǀ????h?)? ??xE?%8Q?[t ??1???^??&KB???G?9
??	??u=????R?#???W
?4???	?(?Q0O?U_gK?,?Al???e?6u???@M??f-???r~?!Ry?z??,????<ԻWfRUӮj?)%??F??.????-U?????K;3Ps?7ʀK̙O?k??hm?{?KdX>?JH?^]???͹A????:?ܸ??=6?io?F=Th4n??ŠqŘcC&b?S?????]??;6o??T???
????X?I]?ŗ?M.?}J2?S?H >??F?K)??aDB+O?'? WA/?#?/*"4?/?M!?$Ė??S????2ޭǷ???W????7h?}???ޏ?ݪ4J???ԢQ?Q!T?*>'?A?'f?fTgnoV?+??9?F??B^uS?#??2????jPՐ=?ɻ?)+??O?o?[#?W??CA-?6??}?d@?R??gY3?-5~;?|???K7’?*??q?Ο?\:A??}??C?'??b`??@M{?ׇ?