xref: /xnu-10002.41.9/iokit/Tests/Tests.cpp (revision 699cd48037512bf4380799317ca44ca453c82f57)
1 /*
2  * Copyright (c) 1998-2021 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  *
30  */
31 
32 #define TEST_HEADERS    0
33 #define IOKIT_ENABLE_SHARED_PTR
34 
35 #if TEST_HEADERS
36 
37 #include <libkern/OSByteOrder.h>
38 #include <libkern/c++/OSArray.h>
39 #include <libkern/c++/OSAllocation.h>
40 #include <libkern/c++/OSBoolean.h>
41 #include <libkern/c++/OSBoundedArray.h>
42 #include <libkern/c++/OSBoundedArrayRef.h>
43 #include <libkern/c++/OSBoundedPtr.h>
44 #include <libkern/c++/OSCollection.h>
45 #include <libkern/c++/OSCollectionIterator.h>
46 #include <libkern/c++/OSContainers.h>
47 #include <libkern/c++/OSCPPDebug.h>
48 #include <libkern/c++/OSData.h>
49 #include <libkern/c++/OSDictionary.h>
50 #include <libkern/c++/OSEndianTypes.h>
51 #include <libkern/c++/OSIterator.h>
52 #include <libkern/c++/OSKext.h>
53 #include <libkern/c++/OSLib.h>
54 #include <libkern/c++/OSMetaClass.h>
55 #include <libkern/c++/OSNumber.h>
56 #include <libkern/c++/OSObject.h>
57 #include <libkern/c++/OSOrderedSet.h>
58 #include <libkern/c++/OSSerialize.h>
59 #include <libkern/c++/OSSet.h>
60 #include <libkern/c++/OSSharedPtr.h>
61 #include <libkern/c++/OSString.h>
62 #include <libkern/c++/OSSymbol.h>
63 #include <libkern/c++/OSUnserialize.h>
64 #include <libkern/c++/OSValueObject.h>
65 #include <libkern/crypto/aes.h>
66 #include <libkern/crypto/aesxts.h>
67 #include <libkern/crypto/crypto_internal.h>
68 #include <libkern/crypto/des.h>
69 #include <libkern/crypto/md5.h>
70 #include <libkern/crypto/register_crypto.h>
71 #include <libkern/crypto/sha1.h>
72 #include <libkern/crypto/sha2.h>
73 #include <libkern/kernel_mach_header.h>
74 #include <libkern/kext_request_keys.h>
75 #include <libkern/kxld.h>
76 #include <libkern/kxld_types.h>
77 #include <libkern/locks.h>
78 #include <libkern/mkext.h>
79 #include <libkern/OSAtomic.h>
80 #include <libkern/OSBase.h>
81 #include <libkern/OSDebug.h>
82 #include <libkern/OSKextLib.h>
83 #include <libkern/OSKextLibPrivate.h>
84 #include <libkern/OSReturn.h>
85 #include <libkern/OSSerializeBinary.h>
86 #include <libkern/OSTypes.h>
87 #include <libkern/prelink.h>
88 #include <libkern/stack_protector.h>
89 #include <libkern/sysctl.h>
90 #include <libkern/tree.h>
91 #include <libkern/zconf.h>
92 #include <libkern/zlib.h>
93 
94 #include <IOKit/AppleKeyStoreInterface.h>
95 #include <IOKit/assert.h>
96 #include <IOKit/IOBSD.h>
97 #include <IOKit/IOBufferMemoryDescriptor.h>
98 #include <IOKit/IOCatalogue.h>
99 #include <IOKit/IOCommand.h>
100 #include <IOKit/IOCommandGate.h>
101 #include <IOKit/IOCommandPool.h>
102 #include <IOKit/IOCommandQueue.h>
103 #include <IOKit/IOConditionLock.h>
104 #include <IOKit/IOCPU.h>
105 //#include <IOKit/IODataQueue.h>
106 #include <IOKit/IODataQueueShared.h>
107 #include <IOKit/IODeviceMemory.h>
108 #include <IOKit/IODeviceTreeSupport.h>
109 #include <IOKit/IODMACommand.h>
110 #include <IOKit/IODMAController.h>
111 #include <IOKit/IODMAEventSource.h>
112 #include <IOKit/IOEventSource.h>
113 #include <IOKit/IOFilterInterruptEventSource.h>
114 #include <IOKit/IOHibernatePrivate.h>
115 #include <IOKit/IOInterleavedMemoryDescriptor.h>
116 #include <IOKit/IOInterruptAccounting.h>
117 #include <IOKit/IOInterruptAccountingPrivate.h>
118 #include <IOKit/IOInterruptController.h>
119 #include <IOKit/IOInterruptEventSource.h>
120 #include <IOKit/IOInterrupts.h>
121 #include <IOKit/IOKernelReporters.h>
122 #include <IOKit/IOKernelReportStructs.h>
123 #include <IOKit/IOKitDebug.h>
124 #include <IOKit/IOKitDiagnosticsUserClient.h>
125 #include <IOKit/IOKitKeys.h>
126 #include <IOKit/IOKitKeysPrivate.h>
127 #include <IOKit/IOKitServer.h>
128 #include <IOKit/IOLib.h>
129 #include <IOKit/IOLocks.h>
130 #include <IOKit/IOLocksPrivate.h>
131 #include <IOKit/IOMapper.h>
132 #include <IOKit/IOMemoryCursor.h>
133 #include <IOKit/IOMemoryDescriptor.h>
134 #include <IOKit/IOMessage.h>
135 #include <IOKit/IOMultiMemoryDescriptor.h>
136 #include <IOKit/IONotifier.h>
137 #include <IOKit/IONVRAM.h>
138 #include <IOKit/IOPlatformExpert.h>
139 #include <IOKit/IOPolledInterface.h>
140 #include <IOKit/IORangeAllocator.h>
141 #include <IOKit/IORegistryEntry.h>
142 #include <IOKit/IOReportMacros.h>
143 #include <IOKit/IOReportTypes.h>
144 #include <IOKit/IOReturn.h>
145 #include <IOKit/IOService.h>
146 #include <IOKit/IOServicePM.h>
147 #include <IOKit/IOSharedDataQueue.h>
148 #include <IOKit/IOSharedLock.h>
149 #include <IOKit/IOStatistics.h>
150 #include <IOKit/IOStatisticsPrivate.h>
151 #include <IOKit/IOSubMemoryDescriptor.h>
152 #include <IOKit/IOSyncer.h>
153 #include <IOKit/IOTimerEventSource.h>
154 #include <IOKit/IOTimeStamp.h>
155 #include <IOKit/IOTypes.h>
156 #include <IOKit/IOUserClient.h>
157 #include <IOKit/IOWorkLoop.h>
158 #include <IOKit/nvram/IONVRAMController.h>
159 #include <IOKit/OSMessageNotification.h>
160 #include <IOKit/platform/AppleMacIO.h>
161 #include <IOKit/platform/AppleMacIODevice.h>
162 #include <IOKit/platform/AppleNMI.h>
163 #include <IOKit/platform/ApplePlatformExpert.h>
164 #include <IOKit/power/IOPwrController.h>
165 #include <IOKit/pwr_mgt/IOPM.h>
166 #include <IOKit/pwr_mgt/IOPMinformee.h>
167 #include <IOKit/pwr_mgt/IOPMinformeeList.h>
168 #include <IOKit/pwr_mgt/IOPMLibDefs.h>
169 #include <IOKit/pwr_mgt/IOPMlog.h>
170 #include <IOKit/pwr_mgt/IOPMPowerSource.h>
171 #include <IOKit/pwr_mgt/IOPMPowerSourceList.h>
172 #include <IOKit/pwr_mgt/IOPMpowerState.h>
173 #include <IOKit/pwr_mgt/IOPMPrivate.h>
174 #include <IOKit/pwr_mgt/IOPowerConnection.h>
175 #include <IOKit/pwr_mgt/RootDomain.h>
176 #include <IOKit/rtc/IORTCController.h>
177 #include <IOKit/system.h>
178 #include <IOKit/system_management/IOWatchDogTimer.h>
179 #include <math.h>
180 
181 #endif /* TEST_HEADERS */
182 
183 #include <sys/sysctl.h>
184 #include <libkern/c++/OSData.h>
185 #include <IOKit/IOService.h>
186 #include <IOKit/IOUserClient.h>
187 #include "Tests.h"
188 
189 
190 #if DEVELOPMENT || DEBUG
191 
192 #include <IOKit/IOWorkLoop.h>
193 #include <IOKit/IOTimerEventSource.h>
194 #include <IOKit/IOInterruptEventSource.h>
195 #include <IOKit/IOCommandGate.h>
196 #include <IOKit/IOPlatformExpert.h>
197 #include <IOKit/IOSharedDataQueue.h>
198 #include <IOKit/IODataQueueShared.h>
199 #include <IOKit/IOServiceStateNotificationEventSource.h>
200 #include <IOKit/IOKitKeysPrivate.h>
201 #include <IOKit/IOKitServer.h>
202 #include <IOKit/IOBSD.h>
203 #include <IOKit/IODeviceTreeSupport.h>
204 #include <kern/ipc_kobject.h>
205 #include <libkern/Block.h>
206 #include <libkern/Block_private.h>
207 #include <libkern/c++/OSAllocation.h>
208 #include <libkern/c++/OSBoundedArray.h>
209 #include <libkern/c++/OSBoundedArrayRef.h>
210 #include <libkern/c++/OSBoundedPtr.h>
211 #include <libkern/c++/OSSharedPtr.h>
212 #include <os/cpp_util.h>
213 #include <DriverKit/IODataQueueDispatchSource.h>
214 #include <libkern/zlib.h>
215 
216 static uint64_t gIOWorkLoopTestDeadline;
217 
218 #if TEST_ZLIB
219 
220 static void *
TestZLib_alloc(void * __unused opaque,u_int items,u_int size)221 TestZLib_alloc(void * __unused opaque, u_int items, u_int size)
222 {
223 	kern_return_t kr;
224 	vm_offset_t result;
225 
226 	kr = kmem_alloc(kernel_map, &result,
227 	    round_page(items * size) + ptoa(2),
228 	    (kma_flags_t)
229 	    (KMA_NOFAIL | KMA_KSTACK | KMA_KOBJECT |
230 	    KMA_GUARD_FIRST | KMA_GUARD_LAST),
231 	    VM_KERN_MEMORY_DIAG);
232 
233 	assert(KERN_SUCCESS == kr);
234 
235 	return (void *)(uintptr_t) (result + ptoa(1));
236 }
237 
238 static void
TestZLib_free(void * __unused ref,void * ptr)239 TestZLib_free(void * __unused ref, void * ptr)
240 {
241 }
242 
243 static int
TestZLib(int newValue)244 TestZLib(int newValue)
245 {
246 	static const char reproData[] =
247 	    "AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATAAUAAVA"
248 	    "AWAAXAAYAAZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQABRABS"
249 	    "ABTABUABVABWABXABYABZACBACCACDACEACFACGACHACIACJACKACLACMACNACOAC"
250 	    "PACQACRACSACTACUACVACWACXACYACZADBADCADDADEADFADGADHADIADJADKADLA"
251 	    "DMADNADOADPADQADRADSADTADUADVADWADXADYADZAEBAECAEDAEEAEFAEGAEHAEI"
252 	    "AEJAEKAELAEMAENAEOAEPAEQAERAESAETAEUAEVAEWAEXAEYAEZAFBAFCAFDAFEAF"
253 	    "FAFGAFHAFIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAFXAFYAFZAGBA"
254 	    "GCAGDAGEAGFAGGAGHAGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWAGX"
255 	    "AGYAGZAHBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRAHSAHTAH"
256 	    "UAHVAHWAHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOAIPAIQA"
257 	    "IRAISAITAIUAIVAIWAIXAIYAIZAJBAJCAJDAJEAJFAJGAJHAJIAJJAJKAJLAJMAJN"
258 	    "AJOAJPAJQAJRAJSAJTAJUAJVAJWAJXAJYAJZAKBAKCAKDAKEAKFAKGAKHAKIAKJAK"
259 	    "KAKLAKMAKNAKOAKPAKQAKRAKSAKTAKUAKVAKWAKXAKYAKZALBALCALDALEALFALGA"
260 	    "LHALIALJALKALLALMALNALOALPALQALRALSALTALUALVALWALXALYALZAMBAMCAMD"
261 	    "AMEAMFAMGAMHAMIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUAMVAMWAM"
262 	    "XAMYAM"
263 	    "ZANBANCANDANEANFANGANHANIANJANKANLANMANNANOANPANQANRANSANTANUANVA"
264 	    "NWANXANYANZAOBAOCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOPAOQAORAOS"
265 	    "AOTAOUAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAPNAPOAP"
266 	    "PAPQAPRAPSAPTAPUAPVAPWAPXAPYAPZAQBAQCAQDAQEAQFAQGAQHAQIAQJAQKAQLA"
267 	    "QMAQNAQOAQPAQQAQRAQSAQTAQUAQVAQWAQXAQYAQZARBARCARDAREARFARGARHARI"
268 	    "ARJARKARLARMARNAROARPARQARRARSARTARUARVARWARXARYARZASBASCASDASEAS"
269 	    "FASGASHASIASJASKASLASMASNASOASPASQASRASSASTASUASVASWASXASYASZATBA"
270 	    "TCATDATEATFATGATHATIATJATKATLATMATNATOATPATQATRATSATTATUATVATWATX"
271 	    "ATYATZAUBAUCAUDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAUSAUTAU"
272 	    "UAUVAUWAUXAUYAUZAVBAVCAVDAVEAVFAVGAVHAVIAVJAVKAVLAVMAVNAVOAVPAVQA"
273 	    "VRAVSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWLAWMAWN"
274 	    "AWOAWPAWQAWRAWSAWTAWUAWVAWWAWXAWYAWZAXBAXCAXDAXEAXFAXGAXHAXIAXJAX"
275 	    "KAXLAXMAXNAXOAXPAXQAXRAXSAXTAXUAXVAXWAXXAXYAXZAYBAYCAYDAYEAYFAYGA"
276 	    "YHAYIAYJAYKAYLAYMAYNAYOAYPAYQAYRAYSAYTAYUAYVAYWAYXAYYAYZAZBAZCAZD"
277 	    "AZEAZFAZGAZHAZIAZJAZKAZLAZMAZNAZOAZPAZQAZRAZSAZTAZUAZVAZWAZXAZYAZ"
278 	    "ZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBBLBBMBBNBBOBBPBBQBBRBBSBBTBBUBBVBBW"
279 	    "BBXBBYBBZBCCBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCRBCSBCTBC"
280 	    "UBCVBCWBCXBCYBCZBDCBDDBDEBDFBDGBDHBDIBDJBDKBDLBDMBDNBDOBDPBDQBDRB"
281 	    "DSBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBENBEOBEP"
282 	    "BEQBERBESBETBEUBEVBEWBEXBEYBEZBFCBFDBFEBFFBFGBFHBFIBFJBFKBFLBFMBF"
283 	    "NBFOBFPBFQBFRBFSBFTBFUBFVBFWBFXBFYBFZBGCBGDBGEBGFBGGBGHBGIBGJBGKB"
284 	    "GLBGMBGNBGOBGPBGQBGRBGSBGTBGUBGVBGWBGXBGYBGZBHCBHDBHEBHFBHGBHHBHI"
285 	    "BHJBHKBHLBHMBHNBHOBHPBHQBHRBHSBHTBHUBHVBHWBHXBHYBHZBICBIDBIEBIFBI"
286 	    "GBIHBIIBIJBIKBILBIMBINBIOBIPBIQBIRBISBITBIUBIVBIWBIXBIYBIZBJCBJDB"
287 	    "JEBJFBJGBJHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJWBJXBJYBJZ"
288 	    "BKCBKDBKEBKFBKGBKHBKIBKJBKKBKLBKMBKNBKOBKPBKQBKRBKSBKTBKUBKVBKWBK"
289 	    "XBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSBLTBLUB"
290 	    "LVBLWBLXBLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBMLBMMBMNBMOBMPBMQBMRBMS"
291 	    "BMTBMUBMVBMWBMXBMYBMZBNCBNDBNEBNFBNGBNHBNIBNJBNKBNLBNMBNNBNOBNPBN"
292 	    "QBNRBNSBNTBNUBNVBNWBNXBNYBNZBOCBODBOEBOFBOGBOHBOIBOJBOKBOLBOMBONB"
293 	    "OOBOPBOQBORBOSBOTBOUBOVBOWBOXBOYBOZBPCBPDBPEBPFBPGBPHBPIBPJBPKBPL"
294 	    "BPMBPNBPOBPPBPQBPRBPSBPTBPUBPVBPWBPXBPYBPZBQCBQDBQEBQFBQGBQHBQIBQ"
295 	    "JBQKBQLBQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCBRDBREBRFBRGB"
296 	    "RHBRIBRJBRKBRLBRMBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBRXBRYBRZBSCBSDBSE"
297 	    "BSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSXBSYBSZBT"
298 	    "CBTDBTEBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBTTBTUBTVBTWBTXB"
299 	    "TYBTZBUCBUDBUEBUFBUGBUHBUIBUJBUKBULBUMBUNBUOBUPBUQBURBUSBUTBUUBUV"
300 	    "BUWBUXBUYBUZBVCBVDBVEBVFBVGBVHBVIBVJBVKBVLBVMBVNBVOBVPBVQBVRBVSBV"
301 	    "TBVUBVVBVWBVXBVYBVZBWCBWDBWEBWFBWGBWHBWIBWJBWKBWLBWMBWNBWOBWPBWQB"
302 	    "WRBWSBWTBWUBWVBWWBWXBWYBWZBXCBXDBXEBXFBXGBXHBXIBXJBXKBXLBXMBXNBXO"
303 	    "BXPBXQBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYHBYIBYJBYKBYLBY"
304 	    "MBYNBYOBYPBYQBYRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBZHBZIBZJB"
305 	    "ZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCECCFCCGCCHCC"
306 	    "ICCJCCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDECDFCDGC"
307 	    "DHCDICDJCDKCDLCDMCDNCDOCDPCDQCDRCDSCDTCDUCDVCDWCDXCDYCDZCEDCEECEF"
308 	    "CEGCEHCEICEJCEKCELCEMCENCEOCEPCEQCERCESCETCEUCEVCEWCEXCEYCEZCFDCF"
309 	    "ECFFCFGCFHCFICFJCFKCFLCFMCFNCFOCFPCFQCFRCFSCFTCFUCFVCFWCFXCFYCFZC"
310 	    "GDCGECGFCGGCGHCGICGJCGKCGLCGMCGNCGOCGPCGQCGRCGSCGTCGUCGVCGWCGXCGY"
311 	    "CGZCHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRCHSCHTCHUCHVCHWCH"
312 	    "XCHYCHZCIDCIECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCITCIUCIVC"
313 	    "IWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQCJRCJSCJTCJU"
314 	    "CJVCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCKRCKSCK"
315 	    "TCKUCKVCKWCKXCKYCKZCLDCLECLFCLGCLHCLICLJCLKCLLCLMCLNCLOCLPCLQCLRC"
316 	    "LSCLTCLUCLVCLWCLXCLYCLZCMDCMECMFCMGCMHCMICMJCMKCMLCMMCMNCMOCMPCMQ"
317 	    "CMRCMSCMTCMUCMVCMWCMXCMYCMZCNDCNECNFCNGCNHCNICNJCNKCNLCNMCNNCNOCN"
318 	    "PCNQCNRCNSCNTCNUCNVCNWCNXCNYCNZCODCOECOFCOGCOHCOICOJCOKCOLCOMCONC"
319 	    "OOCOPCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPGCPHCPICPJCPKCPLCPM"
320 	    "CPNCPOCPPCPQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQICQJCQKCQ"
321 	    "LCQMCQNCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECRFCRGCRHCRICRJC"
322 	    "RKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSGCSHCSI"
323 	    "CSJCSKCSLCSMCSNCSOCSPCSQCSRCSSCSTCSUCSVCSWCSXCSYCSZCTDCTECTFCTGCT"
324 	    "HCTICTJCTKCTLCTMCTNCTOCTPCTQCTRCTSCTTCTUCTVCTWCTXCTYCTZCUDCUECUFC"
325 	    "UGCUHCUICUJCUKCULCUMCUNCUOCUPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZCVDCVE"
326 	    "CVFCVGCVHCVICVJCVKCVLCVMCVNCVOCVPCVQCVRCVSCVTCVUCVVCVWCVXCVYCVZCW"
327 	    "DCWECWFCWGCWHCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCWSCWTCWUCWVCWWCWXCWYC"
328 	    "WZCXDCXECXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTCXUCXVCXWCXX"
329 	    "CXYCXZCYDCYECYFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQCYRCYSCYTCYUCYVCY"
330 	    "WCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZSCZTCZUC"
331 	    "ZVCZWCZXCZYCZZDDDEDDFDDGDDHDDIDDJDDKDDLDDMDDNDDODDPDDQDDRDDSDDTDD"
332 	    "UDDVDDWDDXDDYDDZDEEDEFDEGDEHDEIDEJDEKDELDEMDENDEODEPDEQDERDESDETD"
333 	    "EUDEVDEWDEXDEYDEZDFEDFFDFGDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFRDFSDFT"
334 	    "DFUDFVDFWDFXDFYDFZDGEDGFDGGDGHDGIDGJDGKDGLDGMDGNDGODGPDGQDGRDGSDG"
335 	    "TDGUDGVDGWDGXDGYDGZDHEDHFDHGDHHDHIDHJDHKDHLDHMDHNDHODHPDHQDHRDHSD"
336 	    "HTDHUDHVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDIODIPDIQDIRDIS"
337 	    "DITDIUDIVDIWDIXDIYDIZDJEDJFDJGDJHDJIDJJDJKDJLDJMDJNDJODJPDJQDJRDJ"
338 	    "SDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKODKPDKQDKRD"
339 	    "KSDKTDKUDKVDKWDKXDKYDKZDLEDLFDLGDLHDLIDLJDLKDLLDLMDLNDLODLPDLQDLR"
340 	    "DLSDLTDLUDLVDLWDLXDLYDLZDMEDMFDMGDMHDMIDMJDMKDMLDMMDMNDMODMPDMQDM"
341 	    "RDMSDMTDMUDMVDMWDMXDMYDMZDNEDNFDNGDNHDNIDNJDNKDNLDNMDNNDNODNPDNQD"
342 	    "NRDNSDNTDNUDNVDNWDNXDNYDNZDOEDOFDOGDOHDOIDOJDOKDOLDOMDONDOODOPDOQ"
343 	    "DORDOSDOTDOUDOVDOWDOXDOYDOZDPEDPFDPGDPHDPIDPJDPKDPLDPMDPNDPODPPDP"
344 	    "QDPRDPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKDQLDQMDQNDQODQPD"
345 	    "QQDQRDQSDQTDQUDQVDQWDQXDQYDQZDREDRFDRGDRHDRIDRJDRKDRLDRMDRNDRODRP"
346 	    "DRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSLDSMDSNDSODS"
347 	    "PDSQDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDTFDTGDTHDTIDTJDTKDTLDTMDTNDTOD"
348 	    "TPDTQDTRDTSDTTDTUDTVDTWDTXDTYDTZDUEDUFDUGDUHDUIDUJDUKDULDUMDUNDUO"
349 	    "DUPDUQDURDUSDUTDUUDUVDUWDUXDUYDUZDVEDVFDVGDVHDVIDVJDVKDVLDVMDVNDV"
350 	    "ODVPDVQDVRDVSDVTDVUDVVDVWDVXDVYDVZDWEDWFDWGDWHDWIDWJDWKDWLDWMDWND"
351 	    "WODWPDWQDWRDWSDWTDWUDWVDWWDWXDWYDWZDXEDXFDXGDXHDXIDXJDXKDXLDXMDXN"
352 	    "DXODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYHDYIDYJDYKDYLDYMDY"
353 	    "NDYODYPDYQDYRDYSDYTDYUDYVDYWDYXDYYDYZDZEDZFDZGDZHDZIDZJDZKDZLDZMD"
354 	    "ZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIEEJEEKEELEEMEE"
355 	    "NEEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEFGEFHEFIEFJEFKEFLEFMEFNE"
356 	    "FOEFPEFQEFREFSEFTEFUEFVEFWEFXEFYEFZEGFEGGEGHEGIEGJEGKEGLEGMEGNEGO"
357 	    "EGPEGQEGREGSEGTEGUEGVEGWEGXEGYEGZEHFEHGEHHEHIEHJEHKEHLEHMEHNEHOEH"
358 	    "PEHQEHREHSEHTEHUEHVEHWEHXEHYEHZEIFEIGEIHEIIEIJEIKEILEIMEINEIOEIPE"
359 	    "IQEIREISEITEIUEIVEIWEIXEIYEIZEJFEJGEJHEJIEJJEJKEJLEJMEJNEJOEJPEJQ"
360 	    "EJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKEKLEKMEKNEKOEKPEKQEK"
361 	    "REKSEKTEKUEKVEKWEKXEKYEKZELFELGELHELIELJELKELLELMELNELOELPELQELRE"
362 	    "LSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMNEMOEMPEMQEMREMS"
363 	    "EMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNENOENPENQENRENSEN"
364 	    "TENUENVENWENXENYENZEOFEOGEOHEOIEOJEOKEOLEOMEONEOOEOPEOQEOREOSEOTE"
365 	    "OUEOVEOWEOXEOYEOZEPFEPGEPHEPIEPJEPKEPLEPMEPNEPOEPPEPQEPREPSEPTEPU"
366 	    "EPVEPWEPXEPYEPZEQFEQGEQHEQIEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQTEQUEQ"
367 	    "VEQWEQXEQYEQZERFERGERHERIERJERKERLERMERNEROERPERQERRERSERTERUERVE"
368 	    "RWERXERYERZESFESGESHESIESJESKESLESMESNESOESPESQESRESSESTESUESVESW"
369 	    "ESXESYESZETFETGETHETIETJETKETLETMETNETOETPETQETRETSETTETUETVETWET"
370 	    "XETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREUSEUTEUUEUVEUWEUXE"
371 	    "UYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVEVWEVXEVY"
372 	    "EVZEWFEWGEWHEWIEWJEWKEWLEWMEWNEWOEWPEWQEWREWSEWTEWUEWVEWWEWXEWYEW"
373 	    "ZEXFEXGEXHEXIEXJEXKEXLEXMEXNEXOEXPEXQEXREXSEXTEXUEXVEXWEXXEXYEXZE"
374 	    "YFEYGEYHEYIEYJEYKEYLEYMEYNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYYEYZEZF"
375 	    "EZGEZHEZIEZJEZKEZLEZMEZNEZOEZPEZQEZREZSEZTEZUEZVEZWEZXEZYEZZFFFGF"
376 	    "FHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUFFVFFWFFXFFYFFZFGGFGHFGI"
377 	    "FGJFGKFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZFHGFHHFHIFHJFH"
378 	    "KFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZFIGFIHFIIFIJFIKFILF"
379 	    "IMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJKFJLFJMFJN"
380 	    "FJOFJPFJQFJRFJSFJTFJUFJVFJWFJXFJYFJZFKGFKHFKIFKJFKKFKLFKMFKNFKOFK"
381 	    "PFKQFKRFKSFKTFKUFKVFKWFKXFKYFKZFLGFLHFLIFLJFLKFLLFLMFLNFLOFLPFLQF"
382 	    "LRFLSFLTFLUFLVFLWFLXFLYFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQFMRFMS"
383 	    "FMTFMUFMVFMWFMXFMYFMZFNGFNHFNIFNJFNKFNLFNMFNNFNOFNPFNQFNRFNSFNTFN"
384 	    "UFNVFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFONFOOFOPFOQFORFOSFOTFOUFOVF"
385 	    "OWFOXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFPSFPTFPUFPVFPWFPX"
386 	    "FPYFPZFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQSFQTFQUFQVFQWFQXFQYFQ"
387 	    "ZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWFRXFRYFRZFSGF"
388 	    "SHFSIFSJFSKFSLFSMFSNFSOFSPFSQFSRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHFTI"
389 	    "FTJFTKFTLFTMFTNFTOFTPFTQFTRFTSFTTFTUFTVFTWFTXFTYFTZFUGFUHFUIFUJFU"
390 	    "KFULFUMFUNFUOFUPFUQFURFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJFVKFVLF"
391 	    "VMFVNFVOFVPFVQFVRFVSFVTFVUFVVFVWFVXFVYFVZFWGFWHFWIFWJFWKFWLFWMFWN"
392 	    "FWOFWPFWQFWRFWSFWTFWUFWVFWWFWXFWYFWZFXGFXHFXIFXJFXKFXLFXMFXNFXOFX"
393 	    "PFXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKFYLFYMFYNFYOFYPFYQF"
394 	    "YRFYSFYTFYUFYVFYWFYXFYYFYZFZGFZHFZIFZJFZKFZLFZMFZNFZOFZPFZQFZRFZS"
395 	    "FZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGGQGGRGGSGGTGGUG"
396 	    "GVGGWGGXGGYGGZGHHGHIGHJGHKGHLGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWGHX"
397 	    "GHYGHZGIHGIIGIJGIKGILGIMGINGIOGIPGIQGIRGISGITGIUGIVGIWGIXGIYGIZGJ"
398 	    "HGJIGJJGJKGJLGJMGJNGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHGKIGKJG"
399 	    "KKGKLGKMGKNGKOGKPGKQGKRGKSGKTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLKGLLGLM"
400 	    "GLNGLOGLPGLQGLRGLSGLTGLUGLVGLWGLXGLYGLZGMHGMIGMJGMKGMLGMMGMNGMOGM"
401 	    "PGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGNLGNMGNNGNOGNPGNQGNRG"
402 	    "NSGNTGNUGNVGNWGNXGNYGNZGOHGOIGOJGOKGOLGOMGONGOOGOPGOQGORGOSGOTGOU"
403 	    "GOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRGPSGPTGPUGPVGPWGP"
404 	    "XGPYGPZGQHGQIGQJGQKGQLGQMGQNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQZG"
405 	    "RHGRIGRJGRKGRLGRMGRNGROGRPGRQGRRGRSGRTGRUGRVGRWGRXGRYGRZGSHGSIGSJ"
406 	    "GSKGSLGSMGSNGSOGSPGSQGSRGSSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGTKGTLGT"
407 	    "MGTNGTOGTPGTQGTRGTSGTTGTUGTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMGUNGUOG"
408 	    "UPGUQGURGUSGUTGUUGUVGUWGUXGUYGUZGVHGVIGVJGVKGVLGVMGVNGVOGVPGVQGVR"
409 	    "GVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMGWNGWOGWPGWQGWRGWSGWTGW"
410 	    "UGWVGWWGWXGWYGWZGXHGXIGXJGXKGXLGXMGXNGXOGXPGXQGXRGXSGXTGXUGXVGXWG"
411 	    "XXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYTGYUGYVGYWGYXGYYGYZ"
412 	    "GZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZRGZSGZTGZUGZVGZWGZXGZYGZZHHHIHHJH"
413 	    "HKHHLHHMHHNHHOHHPHHQHHRHHSHHTHHUHHVHHWHHXHHYHHZHIIHIJHIKHILHIMHIN"
414 	    "HIOHIPHIQHIRHISHITHIUHIVHIWHIXHIYHIZHJIHJJHJKHJLHJMHJNHJOHJPHJQHJ"
415 	    "RHJSHJTHJUHJVHJWHJXHJYHJZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSHKTHKUH"
416 	    "KVHKWHKXHKYHKZHLIHLJHLKHLLHLMHLNHLOHLPHLQHLRHLSHLTHLUHLVHLWHLXHLY"
417 	    "HLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHMUHMVHMWHMXHMYHMZHNIHNJHN"
418 	    "KHNLHNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHNXHNYHNZHOIHOJHOKHOLHOMHONH"
419 	    "OOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKHPLHPMHPNHPOHPPHPQHPR"
420 	    "HPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHQNHQOHQPHQQHQRHQSHQTHQUHQ"
421 	    "VHQWHQXHQYHQZHRIHRJHRKHRLHRMHRNHROHRPHRQHRRHRSHRTHRUHRVHRWHRXHRYH"
422 	    "RZHSIHSJHSKHSLHSMHSNHSOHSPHSQHSRHSSHSTHSUHSVHSWHSXHSYHSZHTIHTJHTK"
423 	    "HTLHTMHTNHTOHTPHTQHTRHTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHUMHUNHU"
424 	    "OHUPHUQHURHUSHUTHUUHUVHUWHUXHUYHUZHVIHVJHVKHVLHVMHVNHVOHVPHVQHVRH"
425 	    "VSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMHWNHWOHWPHWQHWRHWSHWTHWUHWV"
426 	    "HWWHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHXTHXUHXVHXWHXXHXYHX"
427 	    "ZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYVHYWHYXHYYHYZHZIHZJHZKH"
428 	    "ZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJIIKIILIIMIINIIOII"
429 	    "PIIQIIRIISIITIIUIIVIIWIIXIIYIIZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJTI"
430 	    "JUIJVIJWIJXIJYIJZIKJIKKIKLIKMIKNIKOIKPIKQIKRIKSIKTIKUIKVIKWIKXIKY"
431 	    "IKZILJILKILLILMILNILOILPILQILRILSILTILUILVILWILXILYILZIMJIMKIMLIM"
432 	    "MIMNIMOIMPIMQIMRIMSIMTIMUIMVIMWIMXIMYIMZINJINKINLINMINNINOINPINQI"
433 	    "NRINSINTINUINVINWINXINYINZIOJIOKIOLIOMIONIOOIOPIOQIORIOSIOTIOUIOV"
434 	    "IOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTIPUIPVIPWIPXIPYIPZIQ"
435 	    "JIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWIQXIQYIQZIRJIRKIRLIRMIRNI"
436 	    "ROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISNISOISPISQISRISS"
437 	    "ISTISUISVISWISXISYISZITJITKITLITMITNITOITPITQITRITSITTITUITVITWIT"
438 	    "XITYITZIUJIUKIULIUMIUNIUOIUPIUQIURIUSIUTIUUIUVIUWIUXIUYIUZIVJIVKI"
439 	    "VLIVMIVNIVOIVPIVQIVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWNIWOIWP"
440 	    "IWQIWRIWSIWTIWUIWVIWWIWXIWYIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIXSIXTIX"
441 	    "UIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOIYPIYQIYRIYSIYTIYUIYVIYWIYXIYYI"
442 	    "YZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZWIZXIZYIZZJJJKJJLJJMJJ"
443 	    "NJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJKKJKLJKMJKNJKOJKPJKQJKRJKSJ"
444 	    "KTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJLTJLUJLVJLWJLXJLY"
445 	    "JLZJMKJMLJMMJMNJMOJMPJMQJMRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNNJN"
446 	    "OJNPJNQJNRJNSJNTJNUJNVJNWJNXJNYJNZJOKJOLJOMJONJOOJOPJOQJORJOSJOTJ"
447 	    "OUJOVJOWJOXJOYJOZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPXJPYJPZ"
448 	    "JQKJQLJQMJQNJQOJQPJQQJQRJQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJRNJROJR"
449 	    "PJRQJRRJRSJRTJRUJRVJRWJRXJRYJRZJSKJSLJSMJSNJSOJSPJSQJSRJSSJSTJSUJ"
450 	    "SVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJTTJTUJTVJTWJTXJTYJTZJUK"
451 	    "JULJUMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJUXJUYJUZJVKJVLJVMJVNJVOJVPJV"
452 	    "QJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWPJWQJWRJWSJWTJWUJWVJ"
453 	    "WWJWXJWYJWZJXKJXLJXMJXNJXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJYL"
454 	    "JYMJYNJYOJYPJYQJYRJYSJYTJYUJYVJYWJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQJZ"
455 	    "RJZSJZTJZUJZVJZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKVKKWKKX"
456 	    "KKYKKZKLLKLMKLNKLOKLPKLQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKMNKMOKM"
457 	    "PKMQKMRKMSKMTKMUKMVKMWKMXKMYKMZKNLKNMKNNKNOKNPKNQKNRKNSKNTKNUKNVK"
458 	    "NWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKOUKOVKOWKOXKOYKOZKPLKPMKPN"
459 	    "KPOKPPKPQKPRKPSKPTKPUKPVKPWKPXKPYKPZKQLKQMKQNKQOKQPKQQKQRKQSKQTKQ"
460 	    "UKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTKRUKRVKRWKRXKRYKRZKSLK"
461 	    "SMKSNKSOKSPKSQKSRKSSKSTKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRKTS"
462 	    "KTTKTUKTVKTWKTXKTYKTZKULKUMKUNKUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUYKU"
463 	    "ZKVLKVMKVNKVOKVPKVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOKWPKWQK"
464 	    "WRKWSKWTKWUKWVKWWKWXKWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXVKXWKXX"
465 	    "KXYKXZKYLKYMKYNKYOKYPKYQKYRKYSKYTKYUKYVKYWKYXKYYKYZKZLKZMKZNKZOKZ"
466 	    "PKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLNLLOLLPLLQLLRLLSLLTLLULLVLLW"
467 	    "LLXLLYLLZLMMLMNLMOLMPLMQLMRLMSLMTLMULMVLMWLMXLMYLMZLNMLNNLNOLNPLN"
468 	    "QLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLOQLORLOSLOTLOULOVLOWLOXL"
469 	    "OYLOZLPMLPNLPOLPPLPQLPRLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQLQR"
470 	    "LQSLQTLQULQVLQWLQXLQYLQZLRMLRNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRYLR"
471 	    "ZLSMLSNLSOLSPLSQLSRLSSLSTLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQLTRLTSL"
472 	    "TTLTULTVLTWLTXLTYLTZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUYLUZLVM"
473 	    "LVNLVOLVPLVQLVRLVSLVTLVULVVLVWLVXLVYLVZLWMLWNLWOLWPLWQLWRLWSLWTLW"
474 	    "ULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLXSLXTLXULXVLXWLXXLXYLXZLYMLYNL"
475 	    "YOLYPLYQLYRLYSLYTLYULYVLYWLYXLYYLYZLZMLZNLZOLZPLZQLZRLZSLZTLZULZV"
476 	    "LZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMVMMWMMXMMYMMZMNNMNOMNPMNQM"
477 	    "NRMNSMNTMNUMNVMNWMNXMNYMNZMONMOOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYMOZ"
478 	    "MPNMPOMPPMPQMPRMPSMPTMPUMPVMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQUMQ"
479 	    "VMQWMQXMQYMQZMRNMROMRPMRQMRRMRSMRTMRUMRVMRWMRXMRYMRZMSNMSOMSPMSQM"
480 	    "SRMSSMSTMSUMSVMSWMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTX"
481 	    "MTYMTZ"
482 	    "MUNMUOMUPMUQMURMUSMUTMUUMUVMUWMUXMUYMUZMVNMVOMVPMVQMVRMVSMVTMVUMV"
483 	    "VMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWTMWUMWVMWWMWXMWYMWZMXNMXOMXPMXQM"
484 	    "XRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYQMYRMYSMYTMYUMYVMYWMYXMYYMYZ"
485 	    "MZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZZNNNONNPNNQNNRNNSNNTNNUNNVN"
486 	    "NWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNOXNOYNOZNPONPPNPQNPRNPSNPT"
487 	    "NPUNPVNPWNPXNPYNPZNQONQPNQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQNR"
488 	    "RNRSNRTNRUNRVNRWNRXNRYNRZNSONSPNSQNSRNSSNSTNSUNSVNSWNSXNSYNSZNTON"
489 	    "TPNTQNTRNTSNTTNTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUWNUXNUY"
490 	    "NUZNVONVPNVQNVRNVSNVTNVUNVVNVWNVXNVYNVZNWONWPNWQNWRNWSNWTNWUNWVNW"
491 	    "WNWXNWYNWZNXONXPNXQNXRNXSNXTNXUNXVNXWNXXNXYNXZNYONYPNYQNYRNYSNYTN"
492 	    "YUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZVNZWNZXNZYNZZOOOPOOQOOROO"
493 	    "SOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOPTOPUOPVOPWOPXOPYOPZOQPOQQOQRO"
494 	    "QSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVORWORXORYORZOSPOSQOSR"
495 	    "OSSOSTOSUOSVOSWOSXOSYOSZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQOU"
496 	    "ROUSOUTOUUOUVOUWOUXOUYOUZOVPOVQOVROVSOVTOVUOVVOVWOVXOVYOVZOWPOWQO"
497 	    "WROWSOWTOWUOWVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZOYPOYQ"
498 	    "OYROYSOYTOYUOYVOYWOYXOYYOYZOZPOZQOZROZSOZTOZUOZVOZWOZXOZYOZZPPPQP"
499 	    "PRPPSPPTPPUPPVPPWPPXPPYPPZPQQPQRPQSPQTPQUPQVPQWPQXPQYPQZPRQPRRPRS"
500 	    "PRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSVPSWPSXPSYPSZPTQPTRPTSPTTPT"
501 	    "UPTVTABUABVABWABXABYABZACBACCACDACEACFACGACHACIACJACKACLACMACNACO"
502 	    "ACPACQACRACSACTACUACVACWACXACYACZADBADCADDADEADFADGADHADIADJADKAD"
503 	    "LADMADAAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATA"
504 	    "AUAAVAAWAAXAAYAAZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQ"
505 	    "ABRABSABHAFIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAFXAFYAFZAG"
506 	    "BAGCAGDAGEAGFAGGAGHAGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWA"
507 	    "GXAGYAGZAHNADOADPADQADRADSADTADUADVADWADXADYADZAEBAECAEDAEEAEFAEG"
508 	    "AEHAEIAEJAEKAELAEMAENAEOAEPAEQAERAESAETAEUAEVAEWAEXAEYAEZAFBAFCAF"
509 	    "DAFEAFFAFGAFUAIVAIWAIXAIYAIZAJBAJCAJDAJEAJFAJGAJHAJIAJJAJKAJLAJMA"
510 	    "JNAJOAJPAJQAJRAJSAJTAJUAJVAJWAJXAJYAJZAKBAKCAKDAKEAKFAKGAKHAKIAKJ"
511 	    "AKKAKLAKMAKNAKBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRAH"
512 	    "SAHTAHUAHVAHWAHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOA"
513 	    "IPAIQAIRAISAITAIIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUAMVAMWAM"
514 	    "XAMY"
515 	    "AMZANBANCANDANEANFANGANHANIANJANKANLANMANNANOANPANQANRANSANTANUAN"
516 	    "VANWANXANYANZAOBAOOAKPAKQAKRAKSAKTAKUAKVAKWAKXAKYAKZALBALCALDALEA"
517 	    "LFALGALHALIALJALKALLALMALNALOALPALQALRALSALTALUALVALWALXALYALZAMB"
518 	    "AMCAMDAMEAMFAMGAMHAMVAPWAPXAPYAPZAQBAQCAQDAQEAQFAQGAQHAQIAQJAQKAQ"
519 	    "LAQMAQNAQOAQPAQQAQRAQSAQTAQUAQVAQWAQXAQYAQZARBARCARDAREARFARGARHA"
520 	    "RIARJARKARLARMARNAROARCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOPAOQ"
521 	    "AORAOSAOTAOUAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAP"
522 	    "NAPOAPPAPQAPRAPSAPTAPUAPJATKATLATMATNATOATPATQATRATSATTATUATVATWA"
523 	    "TXATYATZAUBAUCAUDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAUSAUT"
524 	    "AUUAUVAUWAUXAUYAUZAVBAVCAVPARQARRARSARTARUARVARWARXARYARZASBASCAS"
525 	    "DASEASFASGASHASIASJASKASLASMASNASOASPASQASRASSASTASUASVASWASXASYA"
526 	    "SZATBATCATDATEATFATGATHATIATWAWXAWYAWZAXBAXCAXDAXEAXFAXGAXHAXIAXJ"
527 	    "AXKAXLAXMAXNAXOAXPAXQAXRAXSAXTAXUAXVAXWAXXAXYAXZAYBAYCAYDAYEAYFAY"
528 	    "GAYHAYIAYJAYKAYLAYMAYNAYOAYPAYDAVEAVFAVGAVHAVIAVJAVKAVLAVMAVNAVOA"
529 	    "VPAVQAVRAVSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWL"
530 	    "AWMAWNAWOAWPAWQAWRAWSAWTAWUAWVAWBLBBMBBNBBOBBPBBQBBRBBSBBTBBUBBVB"
531 	    "BWBBXBBYBBZBCCBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCRBCSBCT"
532 	    "BCUBCVBCWBCXBCYBCZBDCBDDBDEBDFBDGBQAYRAYSAYTAYUAYVAYWAYXAYYAYZAZB"
533 	    "AZCAZDAZEAZFAZGAZHAZIAZJAZKAZLAZMAZNAZOAZPAZQAZRAZSAZTAZUAZVAZWAZ"
534 	    "XAZYAZZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBFDBFEBFFBFGBFHBFIBFJBFKBFLBFM"
535 	    "BFNBFOBFPBFQBFRBFSBFTBFUBFVBFWBFXBFYBFZBGCBGDBGEBGFBGGBGHBGIBGJBG"
536 	    "KBGLBGMBGNBGOBGPBGQBGRBGSBGTBGUBGVBGWBDHBDIBDJBDKBDLBDMBDNBDOBDPB"
537 	    "DQBDRBDSBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBEN"
538 	    "BEOBEPBEQBERBESBETBEUBEVBEWBEXBEYBEZBFCBITBIUBIVBIWBIXBIYBIZBJCBJ"
539 	    "DBJEBJFBJGBJHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJWBJXBJYB"
540 	    "JZBKCBKDBKEBKFBKGBKHBKIBKJBKKBKLBKMBKNBKOBGXBGYBGZBHCBHDBHEBHFBHG"
541 	    "BHHBHIBHJBHKBHLBHMBHNBHOBHPBHQBHRBHSBHTBHUBHVBHWBHXBHYBHZBICBIDBI"
542 	    "EBIFBIGBIHBIIBIJBIKBILBIMBINBIOBIPBIQBIRBISBMLBMMBMNBMOBMPBMQBMRB"
543 	    "MSBMTBMUBMVBMWBMXBMYBMZBNCBNDBNEBNFBNGBNHBNIBNJBNKBNLBNMBNNBNOBNP"
544 	    "BNQBNRBNSBNTBNUBNVBNWBNXBNYBNZBOCBODBOEBOFBOGBKPBKQBKRBKSBKTBKUBK"
545 	    "VBKWBKXBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSB"
546 	    "LTBLUBLVBLWBLXBLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBQDBQEBQFBQGBQHBQI"
547 	    "BQJBQKBQLBQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCBRDBREBRFBR"
548 	    "GBRHBRIBRJBRKBRLBRMBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBOHBOIBOJBOKBOLB"
549 	    "OMBONBOOBOPBOQBORBOSBOTBOUBOVBOWBOXBOYBOZBPCBPDBPEBPFBPGBPHBPIBPJ"
550 	    "BPKBPLBPMBPNBPOBPPBPQBPRBPSBPTBPUBPVBPWBPXBPYBPZBQCBTTBTUBTVBTWBT"
551 	    "XBTYBTZBUCBUDBUEBUFBUGBUHBUIBUJBUKBULBUMBUNBUOBUPBUQBURBUSBUTBUUB"
552 	    "UVBUWBUXBUYBUZBVCBVDBVEBVFBVGBVHBVIBVJBVKBVLBVMBVNBVOBRXBRYBRZBSC"
553 	    "BSDBSEBSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSXBS"
554 	    "YBSZBTCBTDBTEBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBXLBXMBXNB"
555 	    "XOBXPBXQBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYHBYIBYJBYKBYL"
556 	    "BYMBYNBYOBYPBYQBYRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBVPBVQBV"
557 	    "RBVSBVTBVUBVVBVWBVXBVYBVZBWCBWDBWEBWFBWGBWHBWIBWJBWKBWLBWMBWNBWOB"
558 	    "WPBWQBWRBWSBWTBWUBWVBWWBWXBWYBWZBXCBXDBXEBXFBXGBXHBXIBXJBXKBCDFCD"
559 	    "GCDHCDICDJCDKCDLCDMCDNCDOCDPCDQCDRCDSCDTCDUCDVCDWCDXCDYCDZCEDCEEC"
560 	    "EFCEGCEHCEICEJCEKCELCEMCENCEOCEPCEQCERCESCETCEUCEVCEWCEXCEYCEZZHB"
561 	    "ZIBZJBZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCECCFCC"
562 	    "GCCHCCICCJCCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDEC"
563 	    "GYCGZCHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRCHSCHTCHUCHVCHW"
564 	    "CHXCHYCHZCIDCIECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCITCIUCI"
565 	    "VCFDCFECFFCFGCFHCFICFJCFKCFLCFMCFNCFOCFPCFQCFRCFSCFTCFUCFVCFWCFXC"
566 	    "FYCFZCGDCGECGFCGGCGHCGICGJCGKCGLCGMCGNCGOCGPCGQCGRCGSCGTCGUCGVCGW"
567 	    "CGXCKUCKVCKWCKXCKYCKZCLDCLECLFCLGCLHCLICLJCLKCLLCLMCLNCLOCLPCLQCL"
568 	    "RCLSCLTCLUCLVCLWCLXCLYCLZCMDCMECMFCMGCMHCMICMJCMKCMLCMMCMNCMOCMPC"
569 	    "MQCMRCIWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQCJRCJS"
570 	    "CJTCJUCJVCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCK"
571 	    "RCKSCKTCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPGCPHCPICPJCPKCPLC"
572 	    "PMCPNCPOCPPCPQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQICQJCQK"
573 	    "CQLCQMCQNCMSCMTCMUCMVCMWCMXCMYCMZCNDCNECNFCNGCNHCNICNJCNKCNLCNMCN"
574 	    "NCNOCNPCNQCNRCNSCNTCNUCNVCNWCNXCNYCNZCODCOECOFCOGCOHCOICOJCOKCOLC"
575 	    "OMCONCOOCOPCSMCSNCSOCSPCSQCSRCSSCSTCSUCSVCSWCSXCSYCSZCTDCTECTFCTG"
576 	    "CTHCTICTJCTKCTLCTMCTNCTOCTPCTQCTRCTSCTTCTUCTVCTWCTXCTYCTZCUDCUECU"
577 	    "FCUGCUHCUICUJCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECRFCRGCRHC"
578 	    "RICRJCRKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSG"
579 	    "CSHCSICSJCSKCSLCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCWSCWTCWUCWVCWWCWXCW"
580 	    "YCWZCXDCXECXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTCXUCXVCXWC"
581 	    "XXCXYCXZCYDCYECYFCUKCULCUMCUNCUOCUPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZ"
582 	    "CVDCVECVFCVGCVHCVICVJCVKCVLCVMCVNCVOCVPCVQCVRCVSCVTCVUCVVCVWCVXCV"
583 	    "YCVZCWDCWECWFCWGCWHEDDFDDGDDHDDIDDJDDKDDLDDMDDNDDODDPDDQDDRDDSDDT"
584 	    "DDUDDVDDWDDXDDYDDZDEEDEFDEGDEHDEIDEJDEKDELDEMDENDEODEPDEQDERDESDE"
585 	    "TDEUDEVDEWDEXDEYDEZDFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQCYRCYSCYTCY"
586 	    "UCYVCYWCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZSC"
587 	    "ZTCZUCZVCZWCZXCZYCZZDDDEDHFDHGDHHDHIDHJDHKDHLDHMDHNDHODHPDHQDHRDH"
588 	    "SDHTDHUDHVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDIODIPDIQDIRD"
589 	    "ISDITDIUDIVDIWDIXDIYDIZDJEDFFDFGDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFR"
590 	    "DFSDFTDFUDFVDFWDFXDFYDFZDGEDGFDGGDGHDGIDGJDGKDGLDGMDGNDGODGPDGQDG"
591 	    "RDGSDGTDGUDGVDGWDGXDGYDGZDHEDLFDLGDLHDLIDLJDLKDLLDLMDLNDLODLPDLQD"
592 	    "LRDLSDLTDLUDLVDLWDLXDLYDLZDMEDMFDMGDMHDMIDMJDMKDMLDMMDMNDMODMPDMQ"
593 	    "DMRDMSDMTDMUDMVDMWDMXDMYDMZDNEDJFDJGDJHDJIDJJDJKDJLDJMDJNDJODJPDJ"
594 	    "QDJRDJSDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKODKPD"
595 	    "KQDKRDKSDKTDKUDKVDKWDKXDKYDKZDLEDPFDPGDPHDPIDPJDPKDPLDPMDPNDPODPP"
596 	    "DPQDPRDPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKDQLDQMDQNDQODQ"
597 	    "PDQQDQRDQSDQTDQUDQVDQWDQXDQYDQZDREDNFDNGDNHDNIDNJDNKDNLDNMDNNDNOD"
598 	    "NPDNQDNRDNSDNTDNUDNVDNWDNXDNYDNZDOEDOFDOGDOHDOIDOJDOKDOLDOMDONDOO"
599 	    "DOPDOQDORDOSDOTDOUDOVDOWDOXDOYDOZDPEDTFDTGDTHDTIDTJDTKDTLDTMDTNDT"
600 	    "ODTPDTQDTRDTSDTTDTUDTVDTWDTXDTYDTZDUEDUFDUGDUHDUIDUJDUKDULDUMDUND"
601 	    "UODUPDUQDURDUSDUTDUUDUVDUWDUXDUYDUZDVEDRFDRGDRHDRIDRJDRKDRLDRMDRN"
602 	    "DRODRPDRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSLDSMDS"
603 	    "NDSODSPDSQDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDXFDXGDXHDXIDXJDXKDXLDXMD"
604 	    "XNDXODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYHDYIDYJDYKDYLDYM"
605 	    "DYNDYODYPDYQDYRDYSDYTDYUDYVDYWDYXDYYDYZDZEDVFDVGDVHDVIDVJDVKDVLDV"
606 	    "MDVNDVODVPDVQDVRDVSDVTDVUDVVDVWDVXDVYDVZDWEDWFDWGDWHDWIDWJDWKDWLD"
607 	    "WMDWNDWODWPDWQDWRDWSDWTDWUDWVDWWDWXDWYDWZDXFGEFHEFIEFJEFKEFLEFMEF"
608 	    "NEFOEFPEFQEFREFSEFTEFUEFVEFWEFXEFYEFZEGFEGGEGHEGIEGJEGKEGLEGMEGNE"
609 	    "GOEGPEGQEGREGSEGTEGUEGVEGWEGXEGYEGZEHFEHGEHHEEDZFDZGDZHDZIDZJDZKD"
610 	    "ZLDZMDZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIEEJEEKEE"
611 	    "LEEMEENEEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEJKEJLEJMEJNEJOEJPE"
612 	    "JQEJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKEKLEKMEKNEKOEKPEKQ"
613 	    "EKREKSEKTEKUEKVEKWEKXEKYEKZELFELGELHELIELJELKELLEHIEHJEHKEHLEHMEH"
614 	    "NEHOEHPEHQEHREHSEHTEHUEHVEHWEHXEHYEHZEIFEIGEIHEIIEIJEIKEILEIMEINE"
615 	    "IOEIPEIQEIREISEITEIUEIVEIWEIXEIYEIZEJFEJGEJHEJIEJJENOENPENQENRENS"
616 	    "ENTENUENVENWENXENYENZEOFEOGEOHEOIEOJEOKEOLEOMEONEOOEOPEOQEOREOSEO"
617 	    "TEOUEOVEOWEOXEOYEOZEPFEPGEPHEPIEPJEPKEPLEPMEPNEPOEPPELMELNELOELPE"
618 	    "LQELRELSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMNEMOEMPEMQ"
619 	    "EMREMSEMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNERSERTERUER"
620 	    "VERWERXERYERZESFESGESHESIESJESKESLESMESNESOESPESQESRESSESTESUESVE"
621 	    "SWESXESYESZETFETGETHETIETJETKETLETMETNETOETPETQETRETSETTEPQEPREPS"
622 	    "EPTEPUEPVEPWEPXEPYEPZEQFEQGEQHEQIEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQ"
623 	    "TEQUEQVEQWEQXEQYEQZERFERGERHERIERJERKERLERMERNEROERPERQERREVWEVXE"
624 	    "VYEVZEWFEWGEWHEWIEWJEWKEWLEWMEWNEWOEWPEWQEWREWSEWTEWUEWVEWWEWXEWY"
625 	    "EWZEXFEXGEXHEXIEXJEXKEXLEXMEXNEXOEXPEXQEXREXSEXTEXUEXVEXWEXXETUET"
626 	    "VETWETXETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREUSEUTEUUEUVE"
627 	    "UWEUXEUYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVEFF"
628 	    "GFFHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUFFVFFWFFXFFYFFZFGGFGHF"
629 	    "GIFGJFGKFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZFHGFHHFHIFHJ"
630 	    "XYEXZEYFEYGEYHEYIEYJEYKEYLEYMEYNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYY"
631 	    "EYZEZFEZGEZHEZIEZJEZKEZLEZMEZNEZOEZPEZQEZREZSEZTEZUEZVEZWEZXEZYEZ"
632 	    "ZFFJOFJPFJQFJRFJSFJTFJUFJVFJWFJXFJYFJZFKGFKHFKIFKJFKKFKLFKMFKNFKO"
633 	    "FKPFKQFKRFKSFKTFKUFKVFKWFKXFKYFKZFLGFLHFLIFLJFLKFLLFLMFLNFLOFLPFL"
634 	    "QFLRFHKFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZFIGFIHFIIFIJF"
635 	    "IKFILFIMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJKFJL"
636 	    "FJMFJNFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFONFOOFOPFOQFORFOSFOTFOUFO"
637 	    "VFOWFOXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFPSFPTFPUFPVFPWF"
638 	    "PXFPYFPZFLSFLTFLUFLVFLWFLXFLYFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQ"
639 	    "FMRFMSFMTFMUFMVFMWFMXFMYFMZFNGFNHFNIFNJFNKFNLFNMFNNFNOFNPFNQFNRFN"
640 	    "SFNTFNUFNVFSKFSLFSMFSNFSOFSPFSQFSRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHF"
641 	    "TIFTJFTKFTLFTMFTNFTOFTPFTQFTRFTSFTTFTUFTVFTWFTXFTYFTZFUGFUHFUIFUJ"
642 	    "FUKFULFUMFUNFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQSFQTFQUFQVFQWFQ"
643 	    "XFQYFQZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWFRXFRYF"
644 	    "RZFSGFSHFSIFSJFWSFWTFWUFWVFWWFWXFWYFWZFXGFXHFXIFXJFXKFXLFXMFXNFXO"
645 	    "FXPFXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKFYLFYMFYNFYOFYPFY"
646 	    "QFYRFYSFYTFYUFYVFUOFUPFUQFURFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJF"
647 	    "VKFVLFVMFVNFVOFVPFVQFVRFVSFVTFVUFVVFVWFVXFVYFVZFWGFWHFWIFWJFWKFWL"
648 	    "FWMFWNFWOFWPFWQFWRHGHIGHJGHKGHLGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWG"
649 	    "HXGHYGHZGIHGIIGIJGIKGILGIMGINGIOGIPGIQGIRGISGITGIUGIVGIWGIXGIYGIZ"
650 	    "GJHGJIGJJGJKGJLGJMGJFYWFYXFYYFYZFZGFZHFZIFZJFZKFZLFZMFZNFZOFZPFZQ"
651 	    "FZRFZSFZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGGQGGRGGSG"
652 	    "GTGGUGGVGGWGGXGGYGGZGHTGLUGLVGLWGLXGLYGLZGMHGMIGMJGMKGMLGMMGMNGMO"
653 	    "GMPGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGNLGNMGNNGNOGNPGNQGN"
654 	    "RGNSGNTGNUGNVGNWGNXGNYGNNGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHG"
655 	    "KIGKJGKKGKLGKMGKNGKOGKPGKQGKRGKSGKTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLK"
656 	    "GLLGLMGLNGLOGLPGLQGLRGLSGLMGQNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQ"
657 	    "ZGRHGRIGRJGRKGRLGRMGRNGROGRPGRQGRRGRSGRTGRUGRVGRWGRXGRYGRZGSHGSIG"
658 	    "SJGSKGSLGSMGSNGSOGSPGSQGSRGSZGOHGOIGOJGOKGOLGOMGONGOOGOPGOQGORGOS"
659 	    "GOTGOUGOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRGPSGPTGPUGP"
660 	    "VGPWGPXGPYGPZGQHGQIGQJGQKGQLGQYGUZGVHGVIGVJGVKGVLGVMGVNGVOGVPGVQG"
661 	    "VRGVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMGWNGWOGWPGWQGWRGWSGWT"
662 	    "GWUGWVGWWGWXGWYGWZGXHGXIGXJGXKGXSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGT"
663 	    "KGTLGTMGTNGTOGTPGTQGTRGTSGTTGTUGTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMG"
664 	    "UNGUOGUPGUQGURGUSGUTGUUGUVGUWGUXGURGZSGZTGZUGZVGZWGZXGZYGZZHHHIHH"
665 	    "JHHKHHLHHMHHNHHOHHPHHQHHRHHSHHTHHUHHVHHWHHXHHYHHZHIIHIJHIKHILHIMH"
666 	    "INHIOHIPHIQHIRHISHITHIUHIVHIWHIXHIYHLGXMGXNGXOGXPGXQGXRGXSGXTGXUG"
667 	    "XVGXWGXXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYTGYUGYVGYWGYX"
668 	    "GYYGYZGZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZLPHLQHLRHLSHLTHLUHLVHLWHLXH"
669 	    "LYHLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHMUHMVHMWHMXHMYHMZHNIHNJ"
670 	    "HNKHNLHNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHIZHJIHJJHJKHJLHJMHJNHJOHJ"
671 	    "PHJQHJRHJSHJTHJUHJVHJWHJXHJYHJZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSH"
672 	    "KTHKUHKVHKWHKXHKYHKZHLIHLJHLKHLLHLMHLNHLOHQNHQOHQPHQQHQRHQSHQTHQU"
673 	    "HQVHQWHQXHQYHQZHRIHRJHRKHRLHRMHRNHROHRPHRQHRRHRSHRTHRUHRVHRWHRXHR"
674 	    "YHRZHSIHSJHSKHSLHSMHSNHSOHSPHSQHSRHSSHSTHSUHNXHNYHNZHOIHOJHOKHOLH"
675 	    "OMHONHOOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKHPLHPMHPNHPOHPP"
676 	    "HPQHPRHPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHVLHVMHVNHVOHVPHVQHV"
677 	    "RHVSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMHWNHWOHWPHWQHWRHWSHWTHWUH"
678 	    "WVHWWHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHSVHSWHSXHSYHSZHTI"
679 	    "HTJHTKHTLHTMHTNHTOHTPHTQHTRHTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHU"
680 	    "MHUNHUOHUPHUQHURHUSHUTHUUHUVHUWHUXHUYHUZHVIHVJHVKHIIKIILIIMIINIIO"
681 	    "IIPIIQIIRIISIITIIUIIVIIWIIXIIYIIZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJ"
682 	    "TIJUIJVIJWIJXIJYIJZIKJIKKIKLIKMIKNIKOIKPIKQIKRIKSIKTXTHXUHXVHXWHX"
683 	    "XHXYHXZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYVHYWHYXHYYHYZHZIH"
684 	    "ZJHZKHZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJINNINOINPIN"
685 	    "QINRINSINTINUINVINWINXINYINZIOJIOKIOLIOMIONIOOIOPIOQIORIOSIOTIOUI"
686 	    "OVIOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTIPUIPVIPWIKUIKVIKW"
687 	    "IKXIKYIKZILJILKILLILMILNILOILPILQILRILSILTILUILVILWILXILYILZIMJIM"
688 	    "KIMLIMMIMNIMOIMPIMQIMRIMSIMTIMUIMVIMWIMXIMYIMZINJINKINLINMISQISRI"
689 	    "SSISTISUISVISWISXISYISZITJITKITLITMITNITOITPITQITRITSITTITUITVITW"
690 	    "ITXITYITZIUJIUKIULIUMIUNIUOIUPIUQIURIUSIUTIUUIUVIUWIUXIUYIUZIPXIP"
691 	    "YIPZIQJIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWIQXIQYIQZIRJIRKIRLI"
692 	    "RMIRNIROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISNISOISPIXT"
693 	    "IXUIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOIYPIYQIYRIYSIYTIYUIYVIYWIYXIY"
694 	    "YIYZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZWIZXIZYIZZJJJKJJLJJI"
695 	    "VJIVKIVLIVMIVNIVOIVPIVQIVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWN"
696 	    "IWOIWPIWQIWRIWSIWTIWUIWVIWWIWXIWYIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIX"
697 	    "SYJLZJMKJMLJMMJMNJMOJMPJMQJMRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNN"
698 	    "JNOJNPJNQJNRJNSJNTJNUJNVJNWJNXJNYJNZJOKJOLJOMJONJOOJOPJOQJORJOSJO"
699 	    "TJOMJJNJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJKKJKLJKMJKNJKOJKPJKQJ"
700 	    "KRJKSJKTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJLTJLUJLVJLW"
701 	    "JLXJLQJRRJRSJRTJRUJRVJRWJRXJRYJRZJSKJSLJSMJSNJSOJSPJSQJSRJSSJSTJS"
702 	    "UJSVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJTTJTUJTVJTWJTXJTYJTZJ"
703 	    "UKJULJUUJOVJOWJOXJOYJOZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPX"
704 	    "JPYJPZJQKJQLJQMJQNJQOJQPJQQJQRJQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJR"
705 	    "NJROJRPJRYJWZJXKJXLJXMJXNJXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJ"
706 	    "YLJYMJYNJYOJYPJYQJYRJYSJYTJYUJYVJYWJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQ"
707 	    "JZRJZSJZTJZMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJUXJUYJUZJVKJVLJVMJVNJV"
708 	    "OJVPJVQJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWPJWQJWRJWSJWTJ"
709 	    "WUJWVJWWJWXJWMTKMUKMVKMWKMXKMYKMZKNLKNMKNNKNOKNPKNQKNRKNSKNTKNUKN"
710 	    "VKNWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKOUKOVKOWKOXKOYKOZKPLKPMK"
711 	    "PNKPOKPPKPQKPRKUJZVJZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKV"
712 	    "KKWKKXKKYKKZKLLKLMKLNKLOKLPKLQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKM"
713 	    "NKMOKMPKMQKMRKMSKSRKSSKSTKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRK"
714 	    "TSKTTKTUKTVKTWKTXKTYKTZKULKUMKUNKUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUY"
715 	    "KUZKVLKVMKVNKVOKVPKPSKPTKPUKPVKPWKPXKPYKPZKQLKQMKQNKQOKQPKQQKQRKQ"
716 	    "SKQTKQUKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTKRUKRVKRWKRXKRYK"
717 	    "RZKSLKSMKSNKSOKSPKSQKYPKYQKYRKYSKYTKYUKYVKYWKYXKYYKYZKZLKZMKZNKZO"
718 	    "KZPKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLNLLOLLPLLQLLRLLSLLTLLULLVL"
719 	    "LWLLXLLYLLZLMMLMNLMOLMPVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOK"
720 	    "WPKWQKWRKWSKWTKWUKWVKWWKWXKWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXV"
721 	    "KXWKXXKXYKXZKYLKYMKYNKYOKLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQL"
722 	    "QRLQSLQTLQULQVLQWLQXLQYLQZLRMLRNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRY"
723 	    "LRZLSMLSNLSOLSPLSQLSRLSSLSTLMQLMRLMSLMTLMULMVLMWLMXLMYLMZLNMLNNLN"
724 	    "OLNPLNQLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLOQLORLOSLOTLOULOVL"
725 	    "OWLOXLOYLOZLPMLPNLPOLPPLPQLPRLVWLVXLVYLVZLWMLWNLWOLWPLWQLWRLWSLWT"
726 	    "LWULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLXSLXTLXULXVLXWLXXLXYLXZLYMLY"
727 	    "NLYOLYPLYQLYRLYSLYTLYULYVLYWLYXLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQL"
728 	    "TRLTSLTTLTULTVLTWLTXLTYLTZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUY"
729 	    "LUZLVMLVNLVOLVPLVQLVRLVSLVTLVULVVOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYM"
730 	    "OZMPNMPOMPPMPQMPRMPSMPTMPUMPVMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQU"
731 	    "MQVMQWMQXMQYMQZMRNMROMRPMRQMRRMRSMRLYYLYZLZMLZNLZOLZPLZQLZRLZSLZT"
732 	    "LZULZVLZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMVMMWMMXMMYMMZMNNMNOM"
733 	    "NPMNQMNRMNSMNTMNUMNVMNWMNXMNYMNZMONMOYMUZMVNMVOMVPMVQMVRMVSMVTMVU"
734 	    "MVVMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWTMWUMWVMWWMWXMWYMWZMXNMXOMXPMX"
735 	    "QMXRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYTMRUMRVMRWMRXMRYMRZMSNMSOM"
736 	    "SPMSQMSRMSSMSTMSUMSVMSWMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTX"
737 	    "MTYMTZMUNMUOMUPMUQMURMUSMUTMUUMUVMUWMUXMUOXNOYNOZNPONPPNPQNPRNPSN"
738 	    "PTNPUNPVNPWNPXNPYNPZNQONQPNQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQ"
739 	    "NRRNRSNRTNRUNRVNRWNRXNRYNRZNSONSPNSQNSRNSSNQMYRMYSMYTMYUMYVMYWMYX"
740 	    "MYYMYZMZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZZNNNONNPNNQNNRNNSNNTN"
741 	    "NUNNVNNWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNWPNWQNWRNWSNWTNWUNWV"
742 	    "NWWNWXNWYNWZNXONXPNXQNXRNXSNXTNXUNXVNXWNXXNXYNXZNYONYPNYQNYRNYSNY"
743 	    "TNYUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZVNZWNSTNSUNSVNSWNSXNSYN"
744 	    "SZNTONTPNTQNTRNTSNTTNTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUW"
745 	    "NUXNUYNUZNVONVPNVQNVRNVSNVTNVUNVVNVWNVXNVYNVZNWONORXORYORZOSPOSQO"
746 	    "SROSSOSTOSUOSVOSWOSXOSYOSZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQ"
747 	    "OUROUSOUTOUUOUVOUWOUXOUYOUZOVPOVQOVROVSOVTOVUOVVOVWZXNZYNZZOOOPOO"
748 	    "QOOROOSOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOPTOPUOPVOPWOPXOPYOPZOQPO"
749 	    "QQOQROQSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVORWOZXOZYOZZPPP"
750 	    "QPPRPPSPPTPPUPPVPPWPPXPPYPPZPQQPQRPQSPQTPQUPQVPQWPQXPQYPQZPRQPRRP"
751 	    "RSPRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSVPSWPSXPSYPSZPTOVXOVYOVZO"
752 	    "WPOWQOWROWSOWTOWUOWVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZ"
753 	    "OYPOYQOYROYSOYTOYUOYVOYWOYXOYYOYZOZPOZQOZROZSOZTOZUOZVOZWQPTRPTSP"
754 	    "TTPTUPTV";
755 
756 	z_stream strm = {};
757 	uint8_t *buf;
758 	size_t count;
759 	uLong bound;
760 
761 	strm.zalloc = &TestZLib_alloc;
762 	strm.zfree  = &TestZLib_free;
763 	deflateInit2(&strm,
764 	    Z_DEFAULT_COMPRESSION,
765 	    Z_DEFLATED,
766 	    15,
767 	    1,
768 	    Z_FIXED);
769 
770 	count = strlen(reproData);
771 	bound = deflateBound(&strm, count);
772 	buf   = IONew(uint8_t, bound);
773 
774 	strm.avail_out  = (uInt) bound;
775 	strm.next_out   = buf;
776 	strm.next_in    = (Bytef *) &reproData[0];
777 	strm.avail_in   = (uInt) count;
778 
779 	deflate(&strm, Z_FINISH);
780 	deflateEnd(&strm);
781 	IODelete(buf, uint8_t, bound);
782 
783 	return 0;
784 }
785 #endif /* TEST_ZLIB */
786 
787 
788 static void
TESAction(OSObject * owner,IOTimerEventSource * tes)789 TESAction(OSObject * owner, IOTimerEventSource * tes)
790 {
791 	if (mach_absolute_time() < gIOWorkLoopTestDeadline) {
792 		tes->setTimeout(1, kMicrosecondScale);
793 	}
794 }
795 
796 static int
IOWorkLoopTest(int newValue)797 IOWorkLoopTest(int newValue)
798 {
799 	IOReturn err;
800 	uint32_t idx;
801 	OSSharedPtr<IOWorkLoop> wl;
802 	OSSharedPtr<IOTimerEventSource> tes;
803 	OSSharedPtr<IOInterruptEventSource> ies;
804 
805 	wl = IOWorkLoop::workLoop();
806 	assert(wl);
807 	tes = IOTimerEventSource::timerEventSource(kIOTimerEventSourceOptionsPriorityWorkLoop, wl.get(), &TESAction);
808 	assert(tes);
809 	err = wl->addEventSource(tes.get());
810 	assert(kIOReturnSuccess == err);
811 	clock_interval_to_deadline(100, kMillisecondScale, &gIOWorkLoopTestDeadline);
812 	for (idx = 0; mach_absolute_time() < gIOWorkLoopTestDeadline; idx++) {
813 		tes->setTimeout(idx & 1023, kNanosecondScale);
814 	}
815 	tes->cancelTimeout();
816 	wl->removeEventSource(tes.get());
817 
818 	int value = 3;
819 
820 	tes = IOTimerEventSource::timerEventSource(kIOTimerEventSourceOptionsDefault, wl.get(), ^(IOTimerEventSource * tes){
821 		kprintf("wl %p, value %d\n", wl.get(), value);
822 	});
823 	err = wl->addEventSource(tes.get());
824 	assert(kIOReturnSuccess == err);
825 
826 	value = 2;
827 	tes->setTimeout(1, kNanosecondScale);
828 	IOSleep(1);
829 	wl->removeEventSource(tes.get());
830 
831 	ies = IOInterruptEventSource::interruptEventSource(wl.get(), NULL, 0, ^void (IOInterruptEventSource *sender, int count){
832 		kprintf("ies block %p, %d\n", sender, count);
833 	});
834 
835 	assert(ies);
836 	kprintf("ies %p\n", ies.get());
837 	err = wl->addEventSource(ies.get());
838 	assert(kIOReturnSuccess == err);
839 	ies->interruptOccurred(NULL, NULL, 0);
840 	IOSleep(1);
841 	ies->interruptOccurred(NULL, NULL, 0);
842 	IOSleep(1);
843 	wl->removeEventSource(ies.get());
844 
845 	return 0;
846 }
847 
848 static int
OSCollectionTest(int newValue)849 OSCollectionTest(int newValue)
850 {
851 	OSSharedPtr<OSArray> array = OSArray::withCapacity(8);
852 	array->setObject(kOSBooleanTrue);
853 	array->setObject(kOSBooleanFalse);
854 	array->setObject(kOSBooleanFalse);
855 	array->setObject(kOSBooleanTrue);
856 	array->setObject(kOSBooleanFalse);
857 	array->setObject(kOSBooleanTrue);
858 
859 	__block unsigned int index;
860 	index = 0;
861 	array->iterateObjects(^bool (OSObject * obj) {
862 		kprintf("%d:%d ", index, (obj == kOSBooleanTrue) ? 1 : (obj == kOSBooleanFalse) ? 0 : 2);
863 		index++;
864 		return false;
865 	});
866 	kprintf("\n");
867 
868 	OSSharedPtr<OSDictionary> dict = IOService::resourceMatching("hello");
869 	assert(dict);
870 	index = 0;
871 	dict->iterateObjects(^bool (const OSSymbol * sym, OSObject * obj) {
872 		OSString * str = OSDynamicCast(OSString, obj);
873 		assert(str);
874 		kprintf("%d:%s=%s\n", index, sym->getCStringNoCopy(), str->getCStringNoCopy());
875 		index++;
876 		return false;
877 	});
878 
879 	OSSharedPtr<OSSerializer> serializer = OSSerializer::withBlock(^bool (OSSerialize * s){
880 		return gIOBSDUnitKey->serialize(s);
881 	});
882 	assert(serializer);
883 	IOService::getPlatform()->setProperty("OSSerializer_withBlock", serializer.get());
884 
885 	OSSharedPtr<OSString> ab = OSString::withCString("abcdef", 2);
886 	assert(strcmp(ab->getCStringNoCopy(), "ab") == 0);
887 	OSSharedPtr<OSString> defgh = OSString::withCString("defgh", 10);
888 	assert(strcmp(defgh->getCStringNoCopy(), "defgh") == 0);
889 	OSSharedPtr<OSString> zyxwvut = OSString::withCString("zyxwvut", 7);
890 	assert(strcmp(zyxwvut->getCStringNoCopy(), "zyxwvut") == 0);
891 
892 
893 	dict = OSDictionary::withCapacity(4);
894 	OSSharedPtr<OSNumber> num = OSNumber::withDouble(1234.5678);
895 	dict->setObject("test", num);
896 
897 	OSSharedPtr<OSSerialize> s = OSSerialize::binaryWithCapacity(4096);
898 	dict->serialize(s.get());
899 
900 	OSSharedPtr<OSObject> o = OSUnserializeXML((const char *) s->text(), s->getLength());
901 	assert(dict->isEqualTo(o.get()));
902 
903 	dict = OSDynamicPtrCast<OSDictionary>(o);
904 	OSNumber * nnum = OSDynamicCast(OSNumber, dict->getObject("test"));
905 	assert(12345678 == (int)(10000 * nnum->doubleValue()));
906 
907 	return 0;
908 }
909 
910 static int
OSAllocationTests(int)911 OSAllocationTests(int)
912 {
913 	OSDataAllocation<int> ints(100, OSAllocateMemory);
914 	assert(ints);
915 
916 	{
917 		int counter = 0;
918 		for (int& i : ints) {
919 			i = counter++;
920 		}
921 	}
922 
923 	{
924 		int counter = 0;
925 		for (int& i : ints) {
926 			assert(i == counter);
927 			++counter;
928 		}
929 	}
930 
931 	OSDataAllocation<int> arrayZero(100, OSAllocateMemoryZero);
932 	assert(arrayZero);
933 	for (const auto& i : arrayZero) {
934 		assert(i == 0);
935 	}
936 
937 #if XNU_PLATFORM_MacOSX
938 	// Make sure we can have two-level OSAllocations
939 	{
940 		OSAllocation<OSDataAllocation<int> > testArray(10, OSAllocateMemory);
941 		for (int i = 0; i < 10; i++) {
942 			testArray[i] = OSDataAllocation<int>(10, OSAllocateMemory);
943 			for (int j = 0; j < 10; ++j) {
944 				testArray[i][j] = i + j;
945 			}
946 		}
947 
948 		for (int i = 0; i < 10; i++) {
949 			for (int j = 0; j < 10; ++j) {
950 				assert(testArray[i][j] == i + j);
951 			}
952 		}
953 	}
954 #endif /* XNU_PLATFORM_MacOSX */
955 
956 	return 0;
957 }
958 
959 static int
OSDataAllocationTests(int)960 OSDataAllocationTests(int)
961 {
962 	OSDataAllocation<int> ints(100, OSAllocateMemory);
963 	assert(ints);
964 
965 	{
966 		int counter = 0;
967 		for (int& i : ints) {
968 			i = counter++;
969 		}
970 	}
971 
972 	{
973 		int counter = 0;
974 		for (const int& i : ints) {
975 			assert(i == counter);
976 			++counter;
977 		}
978 	}
979 
980 	OSDataAllocation<int> arrayZero(100, OSAllocateMemoryZero);
981 	assert(arrayZero);
982 	for (const auto& i : arrayZero) {
983 		assert(i == 0);
984 	}
985 
986 	return 0;
987 }
988 
989 static int
OSBoundedArrayTests(int)990 OSBoundedArrayTests(int)
991 {
992 	OSBoundedArray<int, 5> ints = {0, 1, 2, 3, 4};
993 	assert(ints.size() == 5);
994 
995 	{
996 		int counter = 0;
997 		for (int& i : ints) {
998 			i = counter++;
999 		}
1000 	}
1001 
1002 	{
1003 		int counter = 0;
1004 		for (int& i : ints) {
1005 			assert(i == counter);
1006 			++counter;
1007 		}
1008 	}
1009 
1010 	return 0;
1011 }
1012 
1013 static int
OSBoundedArrayRefTests(int)1014 OSBoundedArrayRefTests(int)
1015 {
1016 	OSBoundedArray<int, 5> storage = {0, 1, 2, 3, 4};
1017 	OSBoundedArrayRef<int> ints(storage);
1018 	assert(ints);
1019 
1020 	{
1021 		int counter = 0;
1022 		for (int& i : ints) {
1023 			i = counter++;
1024 		}
1025 	}
1026 
1027 	{
1028 		int counter = 0;
1029 		for (int& i : ints) {
1030 			assert(i == counter);
1031 			++counter;
1032 		}
1033 	}
1034 
1035 	assert(ints.length() == 5);
1036 	ints = OSBoundedArrayRef<int>();
1037 	assert(ints.length() == 0);
1038 	return 0;
1039 }
1040 
1041 class OSArraySubclass : public OSArray {
1042 	OSDeclareDefaultStructors(OSArraySubclass);
1043 public:
1044 	static OSSharedPtr<OSArraySubclass> withCapacity(unsigned int inCapacity);
1045 	virtual unsigned int iteratorSize() const APPLE_KEXT_OVERRIDE;
1046 };
1047 
1048 OSDefineMetaClassAndStructors(OSArraySubclass, OSArray);
1049 
1050 OSSharedPtr<OSArraySubclass>
withCapacity(unsigned int inCapacity)1051 OSArraySubclass::withCapacity(unsigned int inCapacity)
1052 {
1053 	OSSharedPtr<OSArraySubclass> me = OSMakeShared<OSArraySubclass>();
1054 
1055 	if (me && !me->initWithCapacity(inCapacity)) {
1056 		return nullptr;
1057 	}
1058 
1059 	return me;
1060 }
1061 
1062 unsigned int
iteratorSize() const1063 OSArraySubclass::iteratorSize() const
1064 {
1065 	unsigned int result = 64;
1066 	// Has to be larger than the OSArray iterator size to prevent out-of-bounds writes
1067 	assert(result >= OSArray::iteratorSize());
1068 	return result;
1069 }
1070 
1071 class OSCISubclass : public OSCollectionIterator {
1072 	OSDeclareDefaultStructors(OSCISubclass);
1073 public:
1074 	static OSSharedPtr<OSCISubclass> withCollection(const OSCollection * inColl);
1075 };
1076 
1077 OSDefineMetaClassAndStructors(OSCISubclass, OSCollectionIterator);
1078 
1079 OSSharedPtr<OSCISubclass>
withCollection(const OSCollection * inColl)1080 OSCISubclass::withCollection(const OSCollection * inColl)
1081 {
1082 	OSSharedPtr<OSCISubclass> me = OSMakeShared<OSCISubclass>();
1083 
1084 	if (me && !me->initWithCollection(inColl)) {
1085 		return nullptr;
1086 	}
1087 
1088 	return me;
1089 }
1090 
1091 static int
OSCollectionIteratorTests(int)1092 OSCollectionIteratorTests(int)
1093 {
1094 	OSSharedPtr<OSArray> array = OSArray::withCapacity(0);
1095 	OSSharedPtr<OSString> firstObj = OSString::withCString("test object");
1096 	OSSharedPtr<OSString> secondObj = OSString::withCString("test object 2");
1097 	OSObject * current = NULL;
1098 	OSSharedPtr<OSCollectionIterator> osci = NULL;
1099 	OSSharedPtr<OSCISubclass> osciSubclass = NULL;
1100 	size_t index = 0;
1101 	array->setObject(firstObj);
1102 	array->setObject(secondObj);
1103 
1104 	// Test iteration over a normal OSArray
1105 	osci = OSCollectionIterator::withCollection(array.get());
1106 	assert(osci != NULL);
1107 
1108 	index = 0;
1109 	while ((current = osci->getNextObject()) != NULL) {
1110 		if (index == 0) {
1111 			assert(current == firstObj);
1112 		} else if (index == 1) {
1113 			assert(current == secondObj);
1114 		} else {
1115 			panic("index out of range");
1116 		}
1117 		index++;
1118 	}
1119 
1120 	// Test iteration with a OSCollectionIterator subclass over a normal OSArray
1121 	osciSubclass = OSCISubclass::withCollection(array.get());
1122 	assert(osciSubclass != NULL);
1123 
1124 	index = 0;
1125 	while ((current = osciSubclass->getNextObject()) != NULL) {
1126 		if (index == 0) {
1127 			assert(current == firstObj);
1128 		} else if (index == 1) {
1129 			assert(current == secondObj);
1130 		} else {
1131 			panic("index out of range");
1132 		}
1133 		index++;
1134 	}
1135 
1136 	// Create the OSArray subclass
1137 	OSSharedPtr<OSArraySubclass> arraySubclass = OSArraySubclass::withCapacity(0);
1138 	arraySubclass->setObject(firstObj);
1139 	arraySubclass->setObject(secondObj);
1140 	// Test iteration over a subclassed OSArray, with a large iterator size
1141 	osci = OSCollectionIterator::withCollection(arraySubclass.get());
1142 	assert(osci != NULL);
1143 
1144 	index = 0;
1145 	while ((current = osci->getNextObject()) != NULL) {
1146 		if (index == 0) {
1147 			assert(current == firstObj);
1148 		} else if (index == 1) {
1149 			assert(current == secondObj);
1150 		} else {
1151 			panic("index out of range");
1152 		}
1153 		index++;
1154 	}
1155 
1156 	// Test iteration with a OSCollectionIterator subclass over a subclassed OSArray,
1157 	// with a large iterator size.
1158 	osciSubclass = OSCISubclass::withCollection(arraySubclass.get());
1159 	assert(osciSubclass != NULL);
1160 
1161 	index = 0;
1162 	while ((current = osciSubclass->getNextObject()) != NULL) {
1163 		if (index == 0) {
1164 			assert(current == firstObj);
1165 		} else if (index == 1) {
1166 			assert(current == secondObj);
1167 		} else {
1168 			panic("index out of range");
1169 		}
1170 		index++;
1171 	}
1172 
1173 	return 0;
1174 }
1175 
1176 static int
OSBoundedPtrTests(int)1177 OSBoundedPtrTests(int)
1178 {
1179 	int array[5] = {55, 66, 77, 88, 99};
1180 	OSBoundedPtr<int> begin(&array[0], &array[0], &array[5]);
1181 	OSBoundedPtr<int> end(&array[5], &array[0], &array[5]);
1182 
1183 	{
1184 		int counter = 0;
1185 		for (OSBoundedPtr<int> b = begin; b != end; ++b) {
1186 			*b = counter++;
1187 		}
1188 	}
1189 
1190 	{
1191 		int counter = 0;
1192 		for (OSBoundedPtr<int> b = begin; b != end; ++b) {
1193 			assert(*b == counter);
1194 			++counter;
1195 		}
1196 	}
1197 
1198 	return 0;
1199 }
1200 
1201 static int
IODataQueueDispatchSourceTests(int)1202 IODataQueueDispatchSourceTests(int)
1203 {
1204 	constexpr uint32_t NUM_ELEMENTS = 10;
1205 	constexpr uint32_t ELEMENT_SIZE = 16;
1206 	size_t entryHeaderSize;
1207 	IODataQueueDispatchSource * dqds;
1208 	kern_return_t kr;
1209 	IODataQueueClientEnqueueEntryBlock enqueueBlock = ^(void *data, size_t dataSize) {};
1210 	IODataQueueClientDequeueEntryBlock dequeueBlock = ^(const void *data, size_t dataSize) {};
1211 	uint32_t enqueued = 0;
1212 	uint32_t tail = 0;
1213 	uint32_t head = 0;
1214 
1215 	entryHeaderSize = IODataQueueDispatchSource::GetDataQueueEntryHeaderSize();
1216 
1217 	kr = IODataQueueDispatchSource::Create(NUM_ELEMENTS * (ELEMENT_SIZE + entryHeaderSize), NULL, &dqds);
1218 	assert(kr == kIOReturnSuccess);
1219 	assert(dqds != NULL);
1220 
1221 	// empty queue, should be able to enqueue NUM_ELEMENTS
1222 	kr = dqds->CanEnqueueData(ELEMENT_SIZE, NUM_ELEMENTS);
1223 	assert(kr == kIOReturnSuccess);
1224 
1225 	kr = dqds->CanEnqueueData(ELEMENT_SIZE, NUM_ELEMENTS + 1);
1226 	assert(kr == kIOReturnOverrun);
1227 
1228 	for (uint32_t i = 0; i < NUM_ELEMENTS * 10000; i++) {
1229 		// Randomly dequeue and enqueue elements
1230 
1231 		if (enqueued > 0) {
1232 			if (enqueued < NUM_ELEMENTS - 1 && (random() % 2) == 0) {
1233 				kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1234 				assert(kr == kIOReturnSuccess);
1235 				enqueued++;
1236 				tail++;
1237 			} else {
1238 				kr = dqds->Dequeue(dequeueBlock);
1239 				assert(kr == kIOReturnSuccess);
1240 				enqueued--;
1241 				head++;
1242 			}
1243 		} else {
1244 			kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1245 			assert(kr == kIOReturnSuccess);
1246 			enqueued++;
1247 			tail++;
1248 		}
1249 		if (tail > NUM_ELEMENTS) {
1250 			tail = 1;
1251 		}
1252 		if (head > NUM_ELEMENTS) {
1253 			head = 1;
1254 		}
1255 
1256 		for (uint32_t j = 0; j <= NUM_ELEMENTS; j++) {
1257 			// Can we enqueue `j` elements
1258 			kr = dqds->CanEnqueueData(ELEMENT_SIZE, j);
1259 
1260 			if (j < NUM_ELEMENTS - enqueued || (head <= tail && tail == enqueued && j == NUM_ELEMENTS - enqueued)) {
1261 				if (kr != kIOReturnSuccess) {
1262 					panic("i=%u j=%u enqueued=%u head=%u tail=%u kr=%d expected kIOReturnSuccess\n", i, j, enqueued, head, tail, kr);
1263 				}
1264 			} else {
1265 				if (kr != kIOReturnOverrun) {
1266 					panic("i=%u j=%u enqueued=%u head=%u tail=%u kr=%d expected kIOReturnOverrun\n", i, j, enqueued, head, tail, kr);
1267 				}
1268 			}
1269 
1270 			if ((random() % 16) == 1) {
1271 				// Verify result of CanEnqueueData
1272 
1273 				if (kr == kIOReturnSuccess) {
1274 					// There is space for `j` elements
1275 
1276 					for (uint32_t k = 0; k < j; k++) {
1277 						kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1278 						assert(kr == kIOReturnSuccess);
1279 						enqueued++;
1280 						tail++;
1281 						if (tail > NUM_ELEMENTS) {
1282 							tail = 1;
1283 						}
1284 					}
1285 				} else if (j == 1) {
1286 					// if we are checking to see if we can enqueue one element and CanEnqueueData says there's no space,
1287 					// ensure we can't Enqueue that element
1288 					kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1289 					assert(kr == kIOReturnOverrun);
1290 				}
1291 			}
1292 		}
1293 	}
1294 
1295 	OSSafeReleaseNULL(dqds);
1296 
1297 	return kIOReturnSuccess;
1298 }
1299 
1300 struct TrivialAggregateTestType {
1301 	int a;
1302 	bool b;
1303 	float c;
1304 };
1305 OSDefineValueObjectForDependentType(int)
OSDefineValueObjectForDependentType(TrivialAggregateTestType)1306 OSDefineValueObjectForDependentType(TrivialAggregateTestType)
1307 
1308 static int
1309 OSValueObjectTests(int)
1310 {
1311 	// test simple built-in type
1312 	{
1313 		using T = int;
1314 		OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1315 		assert(test);
1316 		if (test) {
1317 			assert(test->getRef() == 0);
1318 			assert(test->isEqualTo(0));
1319 			assert(test->getBytesNoCopy());
1320 			assert(test->getBytesNoCopy() == test->getMutableBytesNoCopy());
1321 			assert(test->getLength() == sizeof(T));
1322 		}
1323 	}
1324 
1325 	// test trivial aggregate type
1326 	{
1327 		using T = TrivialAggregateTestType;
1328 		OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1329 		assert(test);
1330 		if (test) {
1331 			const auto *const bytes = reinterpret_cast<const uint8_t*>(test->getBytesNoCopy());
1332 			bool bytesAreZero = true;
1333 			for (size_t byteIndex = 0; byteIndex < test->getLength(); byteIndex++) {
1334 				bytesAreZero &= bytes[byteIndex] == 0;
1335 			}
1336 			assert(bytesAreZero);
1337 		}
1338 	}
1339 
1340 	return KERN_SUCCESS;
1341 }
1342 
1343 
1344 static int
IOSharedDataQueue_44636964(__unused int newValue)1345 IOSharedDataQueue_44636964(__unused int newValue)
1346 {
1347 	OSSharedPtr<IOSharedDataQueue> sd = IOSharedDataQueue::withCapacity(DATA_QUEUE_ENTRY_HEADER_SIZE + sizeof(UInt64));
1348 	UInt64 data = 0x11223344aa55aa55;
1349 	UInt32 data2 = 0x44332211;
1350 	UInt32 size = sizeof(UInt32);
1351 	/* enqueue moves tail to end */
1352 	sd->enqueue(&data, sizeof(UInt64));
1353 	/* dequeue moves head to end */
1354 	sd->dequeue(&data, &size);
1355 	/* Tail wraps around, head is still at end */
1356 	sd->enqueue(&data2, sizeof(UInt32));
1357 	/* something in the queue so peek() should return non-null */
1358 	assert(sd->peek() != NULL);
1359 	return KERN_SUCCESS;
1360 }
1361 
1362 #if 0
1363 #include <IOKit/IOUserClient.h>
1364 class TestUserClient : public IOUserClient
1365 {
1366 	OSDeclareDefaultStructors(TestUserClient);
1367 	virtual void stop( IOService *provider) APPLE_KEXT_OVERRIDE;
1368 	virtual bool finalize(IOOptionBits options) APPLE_KEXT_OVERRIDE;
1369 	virtual IOReturn externalMethod( uint32_t selector,
1370 	    IOExternalMethodArguments * arguments,
1371 	    IOExternalMethodDispatch * dispatch,
1372 	    OSObject * target,
1373 	    void * reference ) APPLE_KEXT_OVERRIDE;
1374 };
1375 
1376 void
1377 TestUserClient::stop( IOService *provider)
1378 {
1379 	kprintf("TestUserClient::stop\n");
1380 }
1381 bool
1382 TestUserClient::finalize(IOOptionBits options)
1383 {
1384 	kprintf("TestUserClient::finalize\n");
1385 	return true;
1386 }
1387 IOReturn
1388 TestUserClient::externalMethod( uint32_t selector,
1389     IOExternalMethodArguments * arguments,
1390     IOExternalMethodDispatch * dispatch,
1391     OSObject * target,
1392     void * reference )
1393 {
1394 	getProvider()->terminate();
1395 	IOSleep(500);
1396 	return 0;
1397 }
1398 OSDefineMetaClassAndStructors(TestUserClient, IOUserClient);
1399 #endif
1400 
1401 static int
IOServiceTest(int newValue)1402 IOServiceTest(int newValue)
1403 {
1404 	OSSharedPtr<OSDictionary> matching;
1405 	IONotifier        * note;
1406 	__block IOService * found;
1407 
1408 #if 0
1409 	found = new IOService;
1410 	found->init();
1411 	found->setName("IOTestUserClientProvider");
1412 	found->attach(IOService::getPlatform());
1413 	found->setProperty("IOUserClientClass", "TestUserClient");
1414 	found->registerService();
1415 #endif
1416 
1417 	matching = IOService::serviceMatching("IOPlatformExpert");
1418 	assert(matching);
1419 	found = nullptr;
1420 	note = IOService::addMatchingNotification(gIOMatchedNotification, matching.get(), 0,
1421 	    ^bool (IOService * newService, IONotifier * notifier) {
1422 		kprintf("found %s, %d\n", newService->getName(), newService->getRetainCount());
1423 		found = newService;
1424 		found->retain();
1425 		return true;
1426 	}
1427 	    );
1428 	assert(note);
1429 	assert(found);
1430 	note->remove();
1431 
1432 	note = found->registerInterest(gIOBusyInterest,
1433 	    ^IOReturn (uint32_t messageType, IOService * provider,
1434 	    void   * messageArgument, size_t argSize) {
1435 		kprintf("%p messageType 0x%08x %p\n", provider, messageType, messageArgument);
1436 		return kIOReturnSuccess;
1437 	}).detach();
1438 	assert(note);
1439 	IOSleep(1 * 1000);
1440 	note->remove();
1441 	found->release();
1442 
1443 	return 0;
1444 }
1445 
1446 static void
OSStaticPtrCastTests()1447 OSStaticPtrCastTests()
1448 {
1449 	// const& overload
1450 	{
1451 		OSSharedPtr<OSDictionary> const dict = OSMakeShared<OSDictionary>();
1452 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(dict);
1453 		assert(collection == dict);
1454 	}
1455 	{
1456 		OSSharedPtr<OSDictionary> const dict = nullptr;
1457 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(dict);
1458 		assert(collection == nullptr);
1459 	}
1460 	// && overload
1461 	{
1462 		OSSharedPtr<OSDictionary> dict = OSMakeShared<OSDictionary>();
1463 		OSDictionary* oldDict = dict.get();
1464 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(os::move(dict));
1465 		assert(collection.get() == oldDict);
1466 		assert(dict == nullptr);
1467 	}
1468 	{
1469 		OSSharedPtr<OSDictionary> dict = nullptr;
1470 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(os::move(dict));
1471 		assert(collection == nullptr);
1472 		assert(dict == nullptr);
1473 	}
1474 }
1475 
1476 static void
OSConstPtrCastTests()1477 OSConstPtrCastTests()
1478 {
1479 	// const& overload
1480 	{
1481 		OSSharedPtr<OSDictionary const> const dict = OSMakeShared<OSDictionary>();
1482 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(dict);
1483 		assert(dict2 == dict);
1484 	}
1485 	{
1486 		OSSharedPtr<OSDictionary const> const dict = OSMakeShared<OSDictionary>();
1487 		OSSharedPtr<OSDictionary const> dict2 = OSConstPtrCast<OSDictionary const>(dict);
1488 		assert(dict2 == dict);
1489 	}
1490 	{
1491 		OSSharedPtr<OSDictionary const> const dict = nullptr;
1492 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(dict);
1493 		assert(dict2 == nullptr);
1494 	}
1495 	{
1496 		OSSharedPtr<OSDictionary const> const dict = nullptr;
1497 		OSSharedPtr<OSDictionary const> dict2 = OSConstPtrCast<OSDictionary const>(dict);
1498 		assert(dict2 == nullptr);
1499 	}
1500 
1501 	// && overload
1502 	{
1503 		OSSharedPtr<OSDictionary const> dict = OSMakeShared<OSDictionary>();
1504 		OSDictionary const* oldDict = dict.get();
1505 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(os::move(dict));
1506 		assert(dict == nullptr);
1507 		assert(dict2 == oldDict);
1508 	}
1509 	{
1510 		OSSharedPtr<OSDictionary const> dict = nullptr;
1511 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(os::move(dict));
1512 		assert(dict == nullptr);
1513 		assert(dict2 == nullptr);
1514 	}
1515 }
1516 
1517 static void
OSDynamicPtrCastTests()1518 OSDynamicPtrCastTests()
1519 {
1520 	OSSharedPtr<OSDictionary> const dict = OSMakeShared<OSDictionary>();
1521 	{
1522 		OSSharedPtr<OSCollection> collection = OSDynamicPtrCast<OSCollection>(dict);
1523 		assert(collection != nullptr);
1524 	}
1525 	{
1526 		OSSharedPtr<OSArray> array = OSDynamicPtrCast<OSArray>(dict);
1527 		assert(array == nullptr);
1528 		assert(dict != nullptr);
1529 	}
1530 	{
1531 		OSTaggedSharedPtr<OSCollection, OSCollection> taggedDict(dict.get(), OSRetain);
1532 		OSTaggedSharedPtr<OSCollection, OSCollection> collection = OSDynamicPtrCast<OSCollection>(taggedDict);
1533 		assert(collection != nullptr);
1534 	}
1535 	{
1536 		OSTaggedSharedPtr<OSCollection, OSCollection> taggedDict(dict.get(), OSRetain);
1537 		OSTaggedSharedPtr<OSArray, OSCollection> array = OSDynamicPtrCast<OSArray>(taggedDict);
1538 		assert(array == nullptr);
1539 		assert(dict != nullptr);
1540 	}
1541 	{
1542 		OSSharedPtr<OSCollection> collection = OSDynamicPtrCast<OSCollection>(dict);
1543 		assert(collection.get() == OSDynamicCast(OSDictionary, dict.get()));
1544 		OSSharedPtr<OSDictionary> newDict = OSDynamicPtrCast<OSDictionary>(os::move(collection));
1545 		assert(collection == nullptr);
1546 		assert(newDict != nullptr);
1547 		assert(newDict.get() == dict.get());
1548 	}
1549 }
1550 
1551 
1552 class IOTestUserNotification : public IOUserNotification
1553 {
1554 	OSDeclareDefaultStructors(IOTestUserNotification);
1555 };
1556 
1557 OSDefineMetaClassAndStructors(IOTestUserNotification, IOUserNotification)
1558 
1559 struct IOUserNotificationTestThreadArgs {
1560 	IOTestUserNotification * userNotify;
1561 	IOLock * lock;
1562 	size_t * completed;
1563 	size_t iterations;
1564 };
1565 
1566 static bool
IOUserNotificationMatchingHandler(void * target __unused,void * ref __unused,IOService * newService __unused,IONotifier * notifier __unused)1567 IOUserNotificationMatchingHandler( void * target __unused,
1568     void * ref __unused, IOService * newService __unused, IONotifier * notifier __unused )
1569 {
1570 	return true;
1571 }
1572 
1573 static void
IOUserNotificationTestThread(void * arg,wait_result_t result __unused)1574 IOUserNotificationTestThread(void * arg, wait_result_t result __unused)
1575 {
1576 	IOUserNotificationTestThreadArgs * threadArgs = (IOUserNotificationTestThreadArgs *)arg;
1577 
1578 	OSSharedPtr<OSDictionary> dict = OSDictionary::withCapacity(0);
1579 	OSSharedPtr<OSString> rootPath = OSString::withCStringNoCopy(":/");
1580 	dict->setObject(gIOPathMatchKey, rootPath);
1581 
1582 	for (size_t i = 0; i < threadArgs->iterations; i++) {
1583 		if (i % 2 == 0) {
1584 			IONotifier * notify = IOService::addMatchingNotification( gIOWillTerminateNotification, dict.get(),
1585 			    &IOUserNotificationMatchingHandler, NULL );
1586 			threadArgs->userNotify->setNotification(notify);
1587 		} else {
1588 			threadArgs->userNotify->setNotification(NULL);
1589 		}
1590 	}
1591 
1592 	threadArgs->userNotify->setNotification(NULL);
1593 
1594 	IOLockLock(threadArgs->lock);
1595 	*threadArgs->completed = *threadArgs->completed + 1;
1596 	IOLockWakeup(threadArgs->lock, (event_t)threadArgs->completed, true);
1597 	IOLockUnlock(threadArgs->lock);
1598 }
1599 
1600 static int
IOUserNotificationTests(__unused int newValue)1601 IOUserNotificationTests(__unused int newValue)
1602 {
1603 	constexpr size_t numThreads = 10;
1604 	constexpr size_t numIterations = 500000;
1605 	OSSharedPtr<IOTestUserNotification> userNotify = OSMakeShared<IOTestUserNotification>();
1606 	IOLock * lock = IOLockAlloc();
1607 	size_t threadsCompleted;
1608 	size_t i = 0;
1609 	thread_t threads[numThreads];
1610 	kern_return_t kr;
1611 	bool result;
1612 
1613 	struct IOUserNotificationTestThreadArgs threadArgs = {
1614 		.userNotify = userNotify.get(),
1615 		.lock = lock,
1616 		.completed = &threadsCompleted,
1617 		.iterations = numIterations,
1618 	};
1619 
1620 	result = userNotify->init();
1621 	assert(result);
1622 
1623 	for (i = 0; i < numThreads; i++) {
1624 		kr = kernel_thread_start(&IOUserNotificationTestThread, (void *)&threadArgs, &threads[i]);
1625 		assert(kr == KERN_SUCCESS);
1626 	}
1627 
1628 	IOLockLock(lock);
1629 	while (threadsCompleted < numThreads) {
1630 		IOLockSleep(lock, &threadsCompleted, THREAD_UNINT);
1631 		IOLog("%s: Threads completed: %zu/%zu\n", __func__, threadsCompleted, numThreads);
1632 	}
1633 	IOLockUnlock(lock);
1634 
1635 	for (i = 0; i < numThreads; i++) {
1636 		thread_deallocate(threads[i]);
1637 	}
1638 
1639 	userNotify->setNotification(NULL);
1640 
1641 	IOLockFree(lock);
1642 
1643 	return KERN_SUCCESS;
1644 }
1645 
1646 static void
IOServiceMatchingSharedPtrTests()1647 IOServiceMatchingSharedPtrTests()
1648 {
1649 	OSSharedPtr<const OSSymbol> name = OSSymbol::withCString("name");
1650 	OSSharedPtr<const OSSymbol> value = OSSymbol::withCString("value");
1651 
1652 	{
1653 		OSSharedPtr<OSDictionary> table;
1654 		OSSharedPtr<OSDictionary> result = IOService::serviceMatching("name", table);
1655 		assert(result);
1656 		assert(result->getRetainCount() == 1);
1657 
1658 		table = result;
1659 		assert(table->getRetainCount() == 2);
1660 		OSSharedPtr<OSDictionary> result2 = IOService::serviceMatching("name", table);
1661 		assert(result2);
1662 		assert(result2 == table);
1663 		assert(result2->getRetainCount() == 3);
1664 	}
1665 
1666 	{
1667 		OSSharedPtr<OSDictionary> table;
1668 		OSSharedPtr<OSDictionary> result = IOService::serviceMatching(name.get(), table);
1669 		assert(result);
1670 		assert(result->getRetainCount() == 1);
1671 
1672 		table = result;
1673 		assert(table->getRetainCount() == 2);
1674 		OSSharedPtr<OSDictionary> result2 = IOService::serviceMatching(name.get(), table);
1675 		assert(result2);
1676 		assert(result2 == table);
1677 		assert(result2->getRetainCount() == 3);
1678 	}
1679 
1680 	{
1681 		OSSharedPtr<OSDictionary> table;
1682 		OSSharedPtr<OSDictionary> result = IOService::nameMatching("name", table);
1683 		assert(result);
1684 		assert(result->getRetainCount() == 1);
1685 
1686 		table = result;
1687 		assert(table->getRetainCount() == 2);
1688 		OSSharedPtr<OSDictionary> result2 = IOService::nameMatching("name", table);
1689 		assert(result2);
1690 		assert(result2 == table);
1691 		assert(result2->getRetainCount() == 3);
1692 	}
1693 
1694 	{
1695 		OSSharedPtr<OSDictionary> table;
1696 		OSSharedPtr<OSDictionary> result = IOService::nameMatching(name.get(), table);
1697 		assert(result);
1698 		assert(result->getRetainCount() == 1);
1699 
1700 		table = result;
1701 		assert(table->getRetainCount() == 2);
1702 		OSSharedPtr<OSDictionary> result2 = IOService::nameMatching(name.get(), table);
1703 		assert(result2);
1704 		assert(result2 == table);
1705 		assert(result2->getRetainCount() == 3);
1706 	}
1707 
1708 	{
1709 		OSSharedPtr<OSDictionary> table;
1710 		OSSharedPtr<OSDictionary> result = IOService::resourceMatching("name", table);
1711 		assert(result);
1712 		assert(result->getRetainCount() == 1);
1713 
1714 		table = result;
1715 		assert(table->getRetainCount() == 2);
1716 		OSSharedPtr<OSDictionary> result2 = IOService::resourceMatching("name", table);
1717 		assert(result2);
1718 		assert(result2 == table);
1719 		assert(result2->getRetainCount() == 3);
1720 	}
1721 
1722 	{
1723 		OSSharedPtr<OSDictionary> table;
1724 		OSSharedPtr<OSDictionary> result = IOService::resourceMatching(name.get(), table);
1725 		assert(result);
1726 		assert(result->getRetainCount() == 1);
1727 
1728 		table = result;
1729 		assert(table->getRetainCount() == 2);
1730 		OSSharedPtr<OSDictionary> result2 = IOService::resourceMatching(name.get(), table);
1731 		assert(result2);
1732 		assert(result2 == table);
1733 		assert(result2->getRetainCount() == 3);
1734 	}
1735 
1736 	{
1737 		OSSharedPtr<OSDictionary> table;
1738 		OSSharedPtr<OSDictionary> result = IOService::propertyMatching(name.get(), value.get(), table);
1739 		assert(result);
1740 		assert(result->getRetainCount() == 1);
1741 
1742 		table = result;
1743 		assert(table->getRetainCount() == 2);
1744 		OSSharedPtr<OSDictionary> result2 = IOService::propertyMatching(name.get(), value.get(), table);
1745 		assert(result2);
1746 		assert(result2 == table);
1747 		assert(result2->getRetainCount() == 3);
1748 	}
1749 
1750 	{
1751 		OSSharedPtr<OSDictionary> table;
1752 		OSSharedPtr<OSDictionary> result = IOService::registryEntryIDMatching(12, table);
1753 		assert(result);
1754 		assert(result->getRetainCount() == 1);
1755 
1756 		table = result;
1757 		assert(table->getRetainCount() == 2);
1758 		OSSharedPtr<OSDictionary> result2 = IOService::registryEntryIDMatching(12, table);
1759 		assert(result2);
1760 		assert(result2 == table);
1761 		assert(result2->getRetainCount() == 3);
1762 	}
1763 }
1764 
1765 static int
OSSharedPtrTests(int)1766 OSSharedPtrTests(int)
1767 {
1768 	OSDynamicPtrCastTests();
1769 	OSConstPtrCastTests();
1770 	OSStaticPtrCastTests();
1771 	IOServiceMatchingSharedPtrTests();
1772 	return 0;
1773 }
1774 
1775 static int
IOServiceStateNotificationTests(int)1776 IOServiceStateNotificationTests(int)
1777 {
1778 	IOService * service = IOService::getSystemStateNotificationService();
1779 	OSSharedPtr<OSString> str = OSString::withCString(kIOSystemStateClamshellKey);
1780 	kern_return_t kr = service->StateNotificationItemCreate(str.get(), NULL);
1781 	assert(kIOReturnSuccess == kr);
1782 
1783 	void (^sendClam)(OSBoolean * state) = ^void (OSBoolean * state) {
1784 		OSSharedPtr<OSDictionary> value;
1785 		kern_return_t kr;
1786 
1787 		value = OSDictionary::withCapacity(4);
1788 		value->setObject("value", state);
1789 		kr = IOService::getSystemStateNotificationService()->StateNotificationItemSet(str.get(), value.get());
1790 		assert(kIOReturnSuccess == kr);
1791 	};
1792 	sendClam(kOSBooleanTrue);
1793 	IOSleep(100);
1794 	sendClam(kOSBooleanFalse);
1795 
1796 	str = OSString::withCString("test");
1797 	OSSharedPtr<OSArray> array = OSArray::withCapacity(4);
1798 	array->setObject(str.get());
1799 	IOStateNotificationListenerRef listenerRef;
1800 	kr = service->stateNotificationListenerAdd(array.get(), &listenerRef, ^kern_return_t () {
1801 		IOLog("test handler\n");
1802 		kern_return_t kr;
1803 		OSDictionary * dict;
1804 		kr = service->StateNotificationItemCopy(str.get(), &dict);
1805 		if (kIOReturnSuccess == kr) {
1806 		        OSSharedPtr<OSSerialize> s = OSSerialize::withCapacity(4096);
1807 		        dict->serialize(s.get());
1808 		        IOLog("test handler %s\n", s->text());
1809 		}
1810 		return kIOReturnSuccess;
1811 	});
1812 	assert(kIOReturnSuccess == kr);
1813 
1814 	OSSharedPtr<IOEventSource> es =
1815 	    IOServiceStateNotificationEventSource::serviceStateNotificationEventSource(
1816 		service, array.get(),
1817 		^void () {
1818 		IOLog("test es handler\n");
1819 		kern_return_t kr;
1820 		OSDictionary * dict;
1821 		kr = service->StateNotificationItemCopy(str.get(), &dict);
1822 		if (kIOReturnSuccess == kr) {
1823 		        OSSharedPtr<OSSerialize> s = OSSerialize::withCapacity(4096);
1824 		        dict->serialize(s.get());
1825 		        IOLog("test es handler %s\n", s->text());
1826 		}
1827 	});
1828 	assert(es);
1829 	IOService::getPlatform()->getWorkLoop()->addEventSource(es.get());
1830 	es->enable();
1831 	IOSleep(30 * 1000);
1832 	IOService::getPlatform()->getWorkLoop()->removeEventSource(es.get());
1833 
1834 	return kIOReturnSuccess;
1835 }
1836 
1837 static int
IOMallocPageableTests(int)1838 IOMallocPageableTests(int)
1839 {
1840 	vm_size_t size = 0;
1841 	vm_size_t alignment = 0;
1842 
1843 	for (size = 0; size <= 4 * page_size; size += 64) {
1844 		for (alignment = 1; alignment <= page_size; alignment <<= 1) {
1845 			uintptr_t alignMask = alignment - 1;
1846 			void * addr = IOMallocPageable(size, alignment);
1847 			if (addr == NULL) {
1848 				IOLog("IOMallocPageable(size=%u, alignment=%u) failed\n", (uint32_t)size, (uint32_t)alignment);
1849 				return kIOReturnError;
1850 			}
1851 			if (((uintptr_t)addr & alignMask) != 0) {
1852 				IOLog("IOMallocPageable(size=%u, alignment=%u) returned unaligned pointer %p\n", (uint32_t)size, (uint32_t)alignment, addr);
1853 				return kIOReturnError;
1854 			}
1855 			IOFreePageable(addr, size);
1856 
1857 			addr = IOMallocPageableZero(size, alignment);
1858 			if (addr == NULL) {
1859 				IOLog("IOMallocPageableZero(size=%u, alignment=%u) failed\n", (uint32_t)size, (uint32_t)alignment);
1860 				return kIOReturnError;
1861 			}
1862 			if (((uintptr_t)addr & alignMask) != 0) {
1863 				IOLog("IOMallocPageableZero(size=%u, alignment=%u) returned unaligned pointer %p\n", (uint32_t)size, (uint32_t)alignment, addr);
1864 				return kIOReturnError;
1865 			}
1866 			for (char * ptr = (char *)addr; ptr < (char *)addr + size; ptr++) {
1867 				if (*ptr != 0) {
1868 					IOLog("IOMallocPageableZero(size=%u, alignment=%u) -> %p, byte at %p is nonzero\n", (uint32_t)size, (uint32_t)alignment, addr, ptr);
1869 				}
1870 			}
1871 			IOFreePageable(addr, size);
1872 		}
1873 	}
1874 
1875 	return kIOReturnSuccess;
1876 }
1877 
1878 static int
Test100367284(int)1879 Test100367284(int)
1880 {
1881 	OSSharedPtr<IOService> entry;
1882 	OSSharedPtr<IOService> replace;
1883 	OSSharedPtr<IOService> root;
1884 
1885 	root = OSDynamicPtrCast<IOService>(IORegistryEntry::fromPath("/", gIODTPlane));
1886 	entry = OSMakeShared<IOService>();
1887 	entry->init();
1888 	entry->attachToParent(root.get(), gIODTPlane);
1889 	entry->attachToParent(root.get(), gIOServicePlane);
1890 
1891 	replace = OSMakeShared<IOService>();
1892 	replace->init(entry.get(), gIODTPlane);
1893 	replace->detachFromParent(root.get(), gIODTPlane);
1894 
1895 	return kIOReturnSuccess;
1896 }
1897 
1898 // Test the lockForArbitration(not-required) path
1899 
1900 struct LockForArbitrationTestThreadArgs {
1901 	OSSharedPtr<IOService> a;
1902 	OSSharedPtr<IOService> b;
1903 	IOLock lock;
1904 	int state;
1905 };
1906 
1907 static void
TestLockForArbitrationThread(void * arg,wait_result_t result __unused)1908 TestLockForArbitrationThread(void * arg, wait_result_t result __unused)
1909 {
1910 	LockForArbitrationTestThreadArgs * threadArgs = (LockForArbitrationTestThreadArgs *)arg;
1911 	bool ok;
1912 
1913 	ok = threadArgs->b->lockForArbitration();
1914 	assert(ok);
1915 
1916 	IOLockLock(&threadArgs->lock);
1917 	threadArgs->state = 1;
1918 	thread_wakeup(&threadArgs->state);
1919 	IOLockUnlock(&threadArgs->lock);
1920 
1921 	ok = threadArgs->a->lockForArbitration(false);
1922 	assert(!ok);            // fails
1923 	threadArgs->b->unlockForArbitration();
1924 
1925 	IOLockLock(&threadArgs->lock);
1926 	threadArgs->state = 2;
1927 	thread_wakeup(&threadArgs->state);
1928 	IOLockUnlock(&threadArgs->lock);
1929 }
1930 
1931 static int
TestLockForArbitration(int)1932 TestLockForArbitration(int)
1933 {
1934 	struct LockForArbitrationTestThreadArgs threadArgs;
1935 	thread_t thread;
1936 	kern_return_t kr;
1937 	bool ok;
1938 
1939 	threadArgs.a = OSMakeShared<IOService>();
1940 	threadArgs.a->init();
1941 	threadArgs.b = OSMakeShared<IOService>();
1942 	threadArgs.b->init();
1943 	IOLockInlineInit(&threadArgs.lock);
1944 	threadArgs.state = 0;
1945 
1946 	ok = threadArgs.a->lockForArbitration();
1947 	assert(ok);
1948 
1949 	IOLockLock(&threadArgs.lock);
1950 	kr = kernel_thread_start(&TestLockForArbitrationThread, (void *)&threadArgs, &thread);
1951 	assert(kr == KERN_SUCCESS);
1952 	while (1 != threadArgs.state) {
1953 		IOLockSleep(&threadArgs.lock, &threadArgs.state, THREAD_UNINT);
1954 	}
1955 	IOLockUnlock(&threadArgs.lock);
1956 
1957 	ok = threadArgs.b->lockForArbitration();
1958 	assert(ok);
1959 	threadArgs.b->unlockForArbitration();
1960 	threadArgs.a->unlockForArbitration();
1961 
1962 	IOLockLock(&threadArgs.lock);
1963 	while (2 != threadArgs.state) {
1964 		IOLockSleep(&threadArgs.lock, &threadArgs.state, THREAD_UNINT);
1965 	}
1966 	IOLockUnlock(&threadArgs.lock);
1967 	IOLockInlineDestroy(&threadArgs.lock);
1968 
1969 	return kIOReturnSuccess;
1970 }
1971 
1972 // --
1973 
1974 #endif  /* DEVELOPMENT || DEBUG */
1975 
1976 #ifndef __clang_analyzer__
1977 // All the scary things that this function is doing, such as the intentional
1978 // overrelease of an OSData, are hidden from the static analyzer.
1979 static int
sysctl_iokittest(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)1980 sysctl_iokittest(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
1981 {
1982 	int error;
1983 	int newValue, changed;
1984 
1985 	error = sysctl_io_number(req, 0, sizeof(int), &newValue, &changed);
1986 	if (error) {
1987 		return error;
1988 	}
1989 
1990 #if DEVELOPMENT || DEBUG
1991 	if (changed && (66 == newValue)) {
1992 		IOReturn ret;
1993 		OSSharedPtr<IOWorkLoop> wl = IOWorkLoop::workLoop();
1994 		OSSharedPtr<IOCommandGate> cg = IOCommandGate::commandGate(wl.get());
1995 		ret = wl->addEventSource(cg.get());
1996 
1997 		struct x {
1998 			uint64_t h;
1999 			uint64_t l;
2000 		};
2001 		struct x y;
2002 
2003 		y.h = 0x1111111122222222;
2004 		y.l = 0x3333333344444444;
2005 
2006 		kprintf("ret1 %d\n", ret);
2007 		ret = cg->runActionBlock(^(){
2008 			printf("hello %d 0x%qx\n", wl->inGate(), y.h);
2009 			return 99;
2010 		});
2011 		kprintf("ret %d\n", ret);
2012 	}
2013 
2014 	if (changed && (999 == newValue)) {
2015 		OSSharedPtr<OSData> data = OSData::withCapacity(16);
2016 		data->release();
2017 	}
2018 
2019 	if (changed && (newValue >= 6666) && (newValue <= 6669)) {
2020 		OSSharedPtr<OSIterator> iter;
2021 		IOService  * service;
2022 
2023 		service = NULL;
2024 		OSSharedPtr<OSDictionary> matchingDict = IOService::nameMatching("XHC1");
2025 		iter = IOService::getMatchingServices(matchingDict.get());
2026 		if (iter && (service = (IOService *) iter->getNextObject())) {
2027 			if (newValue == 6666) {
2028 				IOLog("terminating 0x%qx\n", service->getRegistryEntryID());
2029 				service->terminate();
2030 			} else if (newValue == 6667) {
2031 				IOLog("register 0x%qx\n", service->getRegistryEntryID());
2032 				service->registerService();
2033 			}
2034 		}
2035 		if (service) {
2036 			return 0;
2037 		}
2038 	}
2039 
2040 
2041 	if (changed && (555 == newValue)) {
2042 		IOServiceStateNotificationTests(newValue);
2043 	}
2044 #if TEST_ZLIB
2045 	if (changed && (122 == newValue)) {
2046 		error = TestZLib(newValue);
2047 		assert(KERN_SUCCESS == error);
2048 	}
2049 #endif /* TEST_ZLIB */
2050 	if (changed && newValue) {
2051 		error = TestLockForArbitration(newValue);
2052 		assert(KERN_SUCCESS == error);
2053 		error = Test100367284(newValue);
2054 		assert(KERN_SUCCESS == error);
2055 		error = IOWorkLoopTest(newValue);
2056 		assert(KERN_SUCCESS == error);
2057 		error = IOServiceTest(newValue);
2058 		assert(KERN_SUCCESS == error);
2059 		error = OSCollectionTest(newValue);
2060 		assert(KERN_SUCCESS == error);
2061 		error = OSCollectionIteratorTests(newValue);
2062 		assert(KERN_SUCCESS == error);
2063 		error = OSAllocationTests(newValue);
2064 		assert(KERN_SUCCESS == error);
2065 		error = OSDataAllocationTests(newValue);
2066 		assert(KERN_SUCCESS == error);
2067 		error = OSBoundedArrayTests(newValue);
2068 		assert(KERN_SUCCESS == error);
2069 		error = OSBoundedArrayRefTests(newValue);
2070 		assert(KERN_SUCCESS == error);
2071 		error = OSBoundedPtrTests(newValue);
2072 		assert(KERN_SUCCESS == error);
2073 		error = OSValueObjectTests(newValue);
2074 		assert(KERN_SUCCESS == error);
2075 		error = IOMemoryDescriptorTest(newValue);
2076 		assert(KERN_SUCCESS == error);
2077 		error = OSSharedPtrTests(newValue);
2078 		assert(KERN_SUCCESS == error);
2079 		error = IOSharedDataQueue_44636964(newValue);
2080 		assert(KERN_SUCCESS == error);
2081 		error = IOUserNotificationTests(newValue);
2082 		assert(KERN_SUCCESS == error);
2083 		error = IOMallocPageableTests(newValue);
2084 		assert(KERN_SUCCESS == error);
2085 		error = IODataQueueDispatchSourceTests(newValue);
2086 		assert(KERN_SUCCESS == error);
2087 	}
2088 #endif  /* DEVELOPMENT || DEBUG */
2089 
2090 	return error;
2091 }
2092 
2093 
2094 SYSCTL_PROC(_kern, OID_AUTO, iokittest,
2095     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_KERN | CTLFLAG_LOCKED,
2096     NULL, 0, sysctl_iokittest, "I", "");
2097 #endif // __clang_analyzer__
2098 
2099 #if DEVELOPMENT || DEBUG
2100 
2101 /*
2102  * A simple wrapper around an IOService. This terminates the IOService in free().
2103  */
2104 class TestIOServiceHandle : public OSObject
2105 {
2106 	OSDeclareDefaultStructors(TestIOServiceHandle);
2107 public:
2108 	static TestIOServiceHandle * withService(IOService * service);
2109 
2110 private:
2111 	bool initWithService(IOService * service);
2112 	virtual void free() APPLE_KEXT_OVERRIDE;
2113 
2114 	IOService * fService;
2115 };
2116 
2117 OSDefineMetaClassAndStructors(TestIOServiceHandle, OSObject);
2118 
2119 TestIOServiceHandle *
withService(IOService * service)2120 TestIOServiceHandle::withService(IOService * service)
2121 {
2122 	TestIOServiceHandle * handle = new TestIOServiceHandle;
2123 	if (handle && !handle->initWithService(service)) {
2124 		return NULL;
2125 	}
2126 	return handle;
2127 }
2128 
2129 bool
initWithService(IOService * service)2130 TestIOServiceHandle::initWithService(IOService * service)
2131 {
2132 	fService = service;
2133 	fService->retain();
2134 	return true;
2135 }
2136 
2137 void
free()2138 TestIOServiceHandle::free()
2139 {
2140 	if (fService) {
2141 		fService->terminate();
2142 		OSSafeReleaseNULL(fService);
2143 	}
2144 }
2145 
2146 /*
2147  * Set up test IOServices. See the available services in xnu/iokit/Tests/TestServices.
2148  *
2149  * xnu darwintests use this sysctl to make these test services available. A send right is pushed
2150  * to the task that called the sysctl, which when deallocated removes the service. This ensures
2151  * that the registry isn't polluted by misbehaving tests.
2152  *
2153  * Since this sysctl allows callers to instantiate arbitrary classes based on their class name,
2154  * this can be a security concern. Tests that call this sysctl need the
2155  * kIOServiceTestServiceManagementEntitlementKey entitlement.
2156  */
2157 static int
sysctl_iokit_test_service_setup(struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)2158 sysctl_iokit_test_service_setup(struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
2159 {
2160 	char classname[128] = {0};
2161 	IOService * service; // must not release
2162 	OSObject * obj = NULL; // must release
2163 	IOService * provider = NULL; // must not release
2164 	TestIOServiceHandle * handle = NULL; // must release
2165 	mach_port_name_t name __unused;
2166 	int error;
2167 
2168 	if (!IOTaskHasEntitlement(current_task(), kIOServiceTestServiceManagementEntitlementKey)) {
2169 		error = EPERM;
2170 		goto finish;
2171 	}
2172 
2173 	error = sysctl_handle_string(oidp, classname, sizeof(classname), req);
2174 	if (error != 0) {
2175 		goto finish;
2176 	}
2177 
2178 	/*
2179 	 * All test services currently attach to IOResources.
2180 	 */
2181 	provider = IOService::getResourceService();
2182 	if (!provider) {
2183 		IOLog("Failed to find IOResources\n");
2184 		error = ENOENT;
2185 		goto finish;
2186 	}
2187 
2188 	obj = OSMetaClass::allocClassWithName(classname);
2189 	if (!obj) {
2190 		IOLog("Failed to alloc class %s\n", classname);
2191 		error = ENOENT;
2192 		goto finish;
2193 	}
2194 
2195 	service = OSDynamicCast(IOService, obj);
2196 
2197 	if (!service) {
2198 		IOLog("Instance of class %s is not an IOService\n", classname);
2199 		error = EINVAL;
2200 		goto finish;
2201 	}
2202 
2203 	if (!service->init()) {
2204 		IOLog("Failed to initialize %s\n", classname);
2205 		error = EINVAL;
2206 		goto finish;
2207 	}
2208 
2209 	if (!service->attach(provider)) {
2210 		IOLog("Failed to attach %s\n", classname);
2211 		error = EINVAL;
2212 		goto finish;
2213 	}
2214 
2215 	if (!service->start(provider)) {
2216 		IOLog("Failed to start %s\n", classname);
2217 		error = EINVAL;
2218 		goto finish;
2219 	}
2220 
2221 	handle = TestIOServiceHandle::withService(service);
2222 	if (!handle) {
2223 		IOLog("Failed to create service handle\n");
2224 		error = ENOMEM;
2225 		goto finish;
2226 	}
2227 	name = iokit_make_send_right(current_task(), handle, IKOT_IOKIT_OBJECT);
2228 
2229 	error = 0;
2230 
2231 finish:
2232 
2233 	OSSafeReleaseNULL(obj);
2234 	OSSafeReleaseNULL(handle);
2235 	return error;
2236 }
2237 
2238 
2239 SYSCTL_PROC(_kern, OID_AUTO, iokit_test_service_setup,
2240     CTLTYPE_STRING | CTLFLAG_WR | CTLFLAG_KERN | CTLFLAG_LOCKED,
2241     NULL, 0, sysctl_iokit_test_service_setup, "-", "");
2242 
2243 #endif /* DEVELOPMENT || DEBUG */
2244 
2245 
2246 static __unused void
CastCompileTest(OSObject * obj)2247 CastCompileTest(OSObject *obj)
2248 {
2249 	IOService * service1 = OSDynamicCast(IOService, obj);
2250 	if (service1) {
2251 		service1->terminate();
2252 	}
2253 	IOService *service2 = OSRequiredCast(IOService, obj);
2254 	if (service2) {
2255 		service2->terminate();
2256 	}
2257 }
2258