From 83cee687bd07c448234a73a13ca813c2df8893e1 Mon Sep 17 00:00:00 2001 From: Claudio Valerio Date: Thu, 28 Apr 2011 17:12:37 +0200 Subject: [PATCH] restore old code --- .../google-breakpad/r318/bin/macx/dump_syms | Bin 0 -> 430400 bytes .../r318/bin/win32/dump_syms.exe | Bin 0 -> 23040 bytes thirdparty/google-breakpad/r318/breakpad.pro | 315 + .../client/mac/handler/breakpad_exc_server.h | 258 + .../client/mac/handler/breakpad_nlist_64.h | 43 + .../client/mac/handler/dynamic_images.h | 297 + .../client/mac/handler/exception_handler.h | 212 + .../client/mac/handler/minidump_generator.h | 157 + .../mac/handler/protected_memory_allocator.h | 85 + .../client/minidump_file_writer-inl.h | 94 + .../client/minidump_file_writer.h | 250 + .../windows/common/auto_critical_section.h | 63 + .../client/windows/common/ipc_protocol.h | 179 + .../windows/crash_generation/client_info.h | 170 + .../crash_generation_client.h | 159 + .../crash_generation_server.h | 269 + .../crash_generation/minidump_generator.h | 121 + .../windows/handler/exception_handler.h | 415 + .../windows/sender/crash_report_sender.h | 125 + .../google_breakpad/common/convert_UTF.h | 143 + .../r318/include/google_breakpad/common/md5.h | 31 + .../common/string_conversion.h | 66 + .../common/windows/guid_string.h | 58 + .../common/windows/http_upload.h | 125 + .../common/windows/pdb_source_line_writer.h | 163 + .../common/windows/string_utils-inl.h | 139 + .../google_breakpad/common/breakpad_types.h | 83 + .../common/minidump_cpu_amd64.h | 231 + .../google_breakpad/common/minidump_cpu_ppc.h | 163 + .../common/minidump_cpu_ppc64.h | 129 + .../common/minidump_cpu_sparc.h | 158 + .../google_breakpad/common/minidump_cpu_x86.h | 172 + .../common/minidump_exception_linux.h | 85 + .../common/minidump_exception_mac.h | 193 + .../common/minidump_exception_solaris.h | 94 + .../common/minidump_exception_win32.h | 102 + .../google_breakpad/common/minidump_format.h | 721 + .../google_breakpad/common/minidump_size.h | 107 + .../processor/basic_source_line_resolver.h | 114 + .../google_breakpad/processor/call_stack.h | 77 + .../google_breakpad/processor/code_module.h | 94 + .../google_breakpad/processor/code_modules.h | 98 + .../google_breakpad/processor/memory_region.h | 76 + .../google_breakpad/processor/minidump.h | 904 + .../processor/minidump_processor.h | 94 + .../google_breakpad/processor/process_state.h | 115 + .../source_line_resolver_interface.h | 82 + .../google_breakpad/processor/stack_frame.h | 84 + .../processor/stack_frame_cpu.h | 153 + .../google_breakpad/processor/stackwalker.h | 140 + .../processor/symbol_supplier.h | 82 + .../google_breakpad/processor/system_info.h | 97 + .../processor/address_map-inl.h | 92 + .../google_breakpad/processor/address_map.h | 80 + .../processor/basic_code_module.h | 95 + .../processor/basic_code_modules.h | 85 + .../processor/contained_range_map-inl.h | 197 + .../processor/contained_range_map.h | 145 + .../google_breakpad/processor/linked_ptr.h | 193 + .../google_breakpad/processor/logging.h | 153 + .../processor/pathname_stripper.h | 53 + .../processor/postfix_evaluator-inl.h | 282 + .../processor/postfix_evaluator.h | 158 + .../google_breakpad/processor/range_map-inl.h | 210 + .../google_breakpad/processor/range_map.h | 126 + .../google_breakpad/processor/scoped_ptr.h | 335 + .../processor/simple_symbol_supplier.h | 125 + .../processor/stack_frame_info.h | 126 + .../processor/stackwalker_amd64.h | 80 + .../processor/stackwalker_ppc.h | 81 + .../processor/stackwalker_sparc.h | 86 + .../processor/stackwalker_x86.h | 82 + .../r318/lib/macx/libbreakpad.a | Bin 0 -> 3008416 bytes .../r318/lib/win32/breakpad.lib | Bin 0 -> 10305410 bytes .../r318/lib/win32/dbreakpad.lib | Bin 0 -> 1915770 bytes thirdparty/google-breakpad/r318/readme.txt | 9 + .../google-breakpad/r318/release.vc9.bat | 17 + .../r318/src/client/linux/handler/Makefile | 55 + .../client/linux/handler/exception_handler.cc | 304 + .../client/linux/handler/exception_handler.h | 226 + .../linux/handler/exception_handler_test.cc | 124 + .../src/client/linux/handler/linux_thread.cc | 411 + .../src/client/linux/handler/linux_thread.h | 204 + .../client/linux/handler/linux_thread_test.cc | 224 + .../linux/handler/minidump_generator.cc | 815 + .../client/linux/handler/minidump_generator.h | 73 + .../src/client/linux/handler/minidump_test.cc | 86 + .../client/mac/handler/breakpad_exc_server.c | 1750 ++ .../client/mac/handler/breakpad_exc_server.h | 258 + .../client/mac/handler/breakpad_nlist_64.cc | 381 + .../client/mac/handler/breakpad_nlist_64.h | 43 + .../src/client/mac/handler/dynamic_images.cc | 456 + .../src/client/mac/handler/dynamic_images.h | 297 + .../client/mac/handler/exception_handler.cc | 722 + .../client/mac/handler/exception_handler.h | 212 + .../mac/handler/exception_handler_test.cc | 107 + .../client/mac/handler/minidump_generator.cc | 989 ++ .../client/mac/handler/minidump_generator.h | 157 + .../mac/handler/minidump_generator_test.cc | 82 + .../mac/handler/minidump_tests32-Info.plist | 20 + .../mac/handler/minidump_tests64-Info.plist | 22 + .../mac/handler/obj-cTestCases-Info.plist | 20 + .../mac/handler/protected_memory_allocator.cc | 92 + .../mac/handler/protected_memory_allocator.h | 85 + .../handler/testcases/DynamicImagesTests.cc | 85 + .../handler/testcases/DynamicImagesTests.h | 52 + .../handler/testcases/breakpad_nlist_test.cc | 106 + .../handler/testcases/breakpad_nlist_test.h | 62 + .../client/mac/handler/testcases/dwarftests.h | 46 + .../mac/handler/testcases/dwarftests.mm | 60 + .../testcases/testdata/dump_syms_dwarf_data | Bin 0 -> 702795 bytes .../testdata/dump_syms_i386_breakpad.sym | 5300 ++++++ .../src/client/minidump_file_writer-inl.h | 94 + .../r318/src/client/minidump_file_writer.cc | 251 + .../r318/src/client/minidump_file_writer.h | 250 + .../client/minidump_file_writer_unittest.cc | 174 + .../r318/src/client/solaris/handler/Makefile | 78 + .../solaris/handler/exception_handler.cc | 258 + .../solaris/handler/exception_handler.h | 201 + .../solaris/handler/exception_handler_test.cc | 119 + .../solaris/handler/minidump_generator.cc | 786 + .../solaris/handler/minidump_generator.h | 70 + .../client/solaris/handler/minidump_test.cc | 75 + .../src/client/solaris/handler/solaris_lwp.cc | 436 + .../src/client/solaris/handler/solaris_lwp.h | 160 + .../windows/common/auto_critical_section.h | 63 + .../src/client/windows/common/ipc_protocol.h | 179 + .../windows/crash_generation/ReadMe.txt | 58 + .../windows/crash_generation/client_info.cc | 210 + .../windows/crash_generation/client_info.h | 170 + .../crash_generation_client.cc | 337 + .../crash_generation_client.h | 159 + .../crash_generation_server.cc | 852 + .../crash_generation_server.h | 269 + .../crash_generation/minidump_generator.cc | 289 + .../crash_generation/minidump_generator.h | 121 + .../windows/handler/exception_handler.cc | 746 + .../windows/handler/exception_handler.h | 415 + .../windows/sender/crash_report_sender.cc | 143 + .../windows/sender/crash_report_sender.h | 125 + .../crash_generation_app/abstract_class.cc | 53 + .../crash_generation_app/abstract_class.h | 57 + .../crash_generation_app.cc | 510 + .../crash_generation_app.h | 35 + .../crash_generation_app.ico | Bin 0 -> 23558 bytes .../crash_generation_app.rc | 144 + .../tests/crash_generation_app/precompile.cc | 37 + .../tests/crash_generation_app/precompile.h | 90 + .../tests/crash_generation_app/resource.h | 73 + .../tests/crash_generation_app/small.ico | Bin 0 -> 23558 bytes .../r318/src/common/convert_UTF.c | 533 + .../r318/src/common/convert_UTF.h | 143 + .../r318/src/common/linux/dump_symbols.cc | 781 + .../r318/src/common/linux/dump_symbols.h | 48 + .../r318/src/common/linux/file_id.cc | 145 + .../r318/src/common/linux/file_id.h | 66 + .../r318/src/common/linux/guid_creator.cc | 82 + .../r318/src/common/linux/guid_creator.h | 48 + .../r318/src/common/linux/http_upload.cc | 185 + .../r318/src/common/linux/http_upload.h | 83 + .../r318/src/common/mac/HTTPMultipartUpload.h | 61 + .../r318/src/common/mac/HTTPMultipartUpload.m | 205 + .../r318/src/common/mac/dump_syms.h | 79 + .../r318/src/common/mac/dump_syms.mm | 1224 ++ .../src/common/mac/dwarf/bytereader-inl.h | 141 + .../r318/src/common/mac/dwarf/bytereader.cc | 62 + .../r318/src/common/mac/dwarf/bytereader.h | 132 + .../r318/src/common/mac/dwarf/dwarf2enums.h | 490 + .../r318/src/common/mac/dwarf/dwarf2reader.cc | 830 + .../r318/src/common/mac/dwarf/dwarf2reader.h | 393 + .../r318/src/common/mac/dwarf/functioninfo.cc | 240 + .../r318/src/common/mac/dwarf/functioninfo.h | 178 + .../src/common/mac/dwarf/line_state_machine.h | 61 + .../r318/src/common/mac/dwarf/types.h | 46 + .../AppKit/GTMCarbonEvent.h | 380 + .../AppKit/GTMCarbonEvent.m | 710 + .../AppKit/GTMCarbonEventTest.m | 367 + .../AppKit/GTMDelegatingTableColumn.h | 35 + .../AppKit/GTMDelegatingTableColumn.m | 42 + .../AppKit/GTMGetURLHandler.m | 310 + .../AppKit/GTMGetURLHandlerTest.m | 84 + .../AppKit/GTMHotKeyTextField.h | 127 + .../AppKit/GTMHotKeyTextField.m | 1024 ++ .../AppKit/GTMHotKeyTextFieldTest.m | 204 + .../AppKit/GTMLargeTypeWindow.h | 60 + .../AppKit/GTMLargeTypeWindow.m | 366 + .../AppKit/GTMLargeTypeWindowTest.m | 198 + .../AppKit/GTMLinearRGBShading.h | 76 + .../AppKit/GTMLinearRGBShading.m | 204 + .../AppKit/GTMLinearRGBShadingTest.m | 132 + .../AppKit/GTMLoginItems.h | 88 + .../AppKit/GTMLoginItems.m | 193 + .../AppKit/GTMLoginItemsTest.m | 137 + .../AppKit/GTMNSBezierPath+CGPath.h | 33 + .../AppKit/GTMNSBezierPath+CGPath.m | 70 + .../AppKit/GTMNSBezierPath+CGPathTest.m | 75 + .../AppKit/GTMNSBezierPath+RoundRect.h | 48 + .../AppKit/GTMNSBezierPath+RoundRect.m | 68 + .../AppKit/GTMNSBezierPath+RoundRectTest.m | 102 + .../AppKit/GTMNSBezierPath+Shading.h | 121 + .../AppKit/GTMNSBezierPath+Shading.m | 216 + .../AppKit/GTMNSBezierPath+ShadingTest.m | 177 + .../AppKit/GTMNSColor+Luminance.h | 65 + .../AppKit/GTMNSColor+Luminance.m | 153 + .../AppKit/GTMNSColor+LuminanceTest.m | 72 + .../AppKit/GTMNSImage+Scaling.h | 51 + .../AppKit/GTMNSImage+Scaling.m | 183 + .../AppKit/GTMNSImage+ScalingTest.m | 64 + .../AppKit/GTMNSWorkspace+Running.h | 92 + .../AppKit/GTMNSWorkspace+Running.m | 173 + .../AppKit/GTMNSWorkspace+RunningTest.m | 78 + .../AppKit/GTMShading.h | 41 + .../google-toolbox-for-mac/AppKit/GTMTheme.h | 78 + .../google-toolbox-for-mac/AppKit/GTMTheme.m | 390 + .../AppKit/GTMThemeTest.m | 67 + .../BuildScripts/BuildAllSDKs.sh | 116 + .../BuildingAndUsing.txt | 18 + .../externals/google-toolbox-for-mac/COPYING | 202 + .../DebugUtils/GTMDebugSelectorValidation.h | 100 + .../DebugUtils/GTMDebugThreadValidation.h | 55 + .../DebugUtils/GTMDebugThreadValidation.m | 38 + .../DebugUtils/GTMDebugThreadValidationTest.m | 110 + .../DebugUtils/GTMMethodCheck.h | 88 + .../DebugUtils/GTMMethodCheck.m | 163 + .../DebugUtils/GTMMethodCheckTest.m | 53 + .../Foundation/GTMAbstractDOListener.h | 222 + .../Foundation/GTMAbstractDOListener.m | 438 + .../Foundation/GTMAbstractDOListenerTest.m | 61 + .../Foundation/GTMBase64.h | 183 + .../Foundation/GTMBase64.m | 694 + .../Foundation/GTMBase64Test.m | 437 + .../Foundation/GTMCalculatedRange.h | 102 + .../Foundation/GTMCalculatedRange.m | 148 + .../Foundation/GTMCalculatedRangeTest.m | 101 + .../Foundation/GTMExceptionalInlines.h | 53 + .../Foundation/GTMExceptionalInlines.m | 56 + .../Foundation/GTMExceptionalInlinesTest.m | 71 + .../Foundation/GTMFileSystemKQueue.h | 78 + .../Foundation/GTMFileSystemKQueue.m | 259 + .../Foundation/GTMFileSystemKQueueTest.m | 394 + .../Foundation/GTMFourCharCode.h | 51 + .../Foundation/GTMFourCharCode.m | 98 + .../Foundation/GTMFourCharCodeTest.m | 82 + .../Foundation/GTMGarbageCollection.h | 72 + .../Foundation/GTMGeometryUtils.h | 452 + .../Foundation/GTMGeometryUtils.m | 108 + .../Foundation/GTMGeometryUtilsTest.m | 331 + .../Foundation/GTMHTTPFetcher.h | 22 + .../Foundation/GTMHTTPServer.h | 137 + .../Foundation/GTMHTTPServer.m | 595 + .../Foundation/GTMHTTPServerTest.m | 574 + .../Foundation/GTMLightweightProxy.h | 46 + .../Foundation/GTMLightweightProxy.m | 114 + .../Foundation/GTMLightweightProxyTest.m | 85 + .../Foundation/GTMLogger+ASL.h | 87 + .../Foundation/GTMLogger+ASL.m | 126 + .../Foundation/GTMLogger+ASLTest.m | 90 + .../Foundation/GTMLogger.h | 458 + .../Foundation/GTMLogger.m | 445 + .../Foundation/GTMLoggerRingBufferWriter.h | 97 + .../Foundation/GTMLoggerRingBufferWriter.m | 248 + .../GTMLoggerRingBufferWriterTest.m | 363 + .../Foundation/GTMLoggerTest.m | 451 + .../GTMNSAppleEvent+HandlerTest.applescript | 60 + .../GTMNSAppleEventDescriptor+Foundation.h | 100 + .../GTMNSAppleEventDescriptor+Foundation.m | 536 + ...GTMNSAppleEventDescriptor+FoundationTest.m | 643 + .../GTMNSAppleEventDescriptor+Handler.h | 40 + .../GTMNSAppleEventDescriptor+Handler.m | 130 + .../GTMNSAppleEventDescriptor+HandlerTest.m | 70 + .../Foundation/GTMNSAppleScript+Handler.h | 126 + .../Foundation/GTMNSAppleScript+Handler.m | 518 + .../Foundation/GTMNSAppleScript+HandlerTest.m | 506 + .../Foundation/GTMNSArray+Merge.h | 47 + .../Foundation/GTMNSArray+Merge.m | 111 + .../Foundation/GTMNSArray+MergeTest.m | 219 + .../Foundation/GTMNSData+zlib.h | 84 + .../Foundation/GTMNSData+zlib.m | 267 + .../Foundation/GTMNSData+zlibTest.m | 360 + .../Foundation/GTMNSDictionary+URLArguments.h | 30 + .../Foundation/GTMNSDictionary+URLArguments.m | 40 + .../GTMNSDictionary+URLArgumentsTest.m | 54 + .../Foundation/GTMNSEnumerator+Filter.h | 53 + .../Foundation/GTMNSEnumerator+Filter.m | 179 + .../Foundation/GTMNSEnumerator+FilterTest.m | 133 + .../Foundation/GTMNSFileManager+Carbon.h | 60 + .../Foundation/GTMNSFileManager+Carbon.m | 99 + .../Foundation/GTMNSFileManager+CarbonTest.m | 69 + .../Foundation/GTMNSFileManager+Path.h | 75 + .../Foundation/GTMNSFileManager+Path.m | 101 + .../Foundation/GTMNSFileManager+PathTest.m | 249 + .../GTMNSObject+KeyValueObserving.h | 70 + .../GTMNSObject+KeyValueObserving.m | 350 + .../GTMNSObject+KeyValueObservingTest.m | 106 + .../Foundation/GTMNSString+FindFolder.h | 55 + .../Foundation/GTMNSString+FindFolder.m | 78 + .../Foundation/GTMNSString+FindFolderTest.m | 77 + .../Foundation/GTMNSString+HTML.h | 66 + .../Foundation/GTMNSString+HTML.m | 522 + .../Foundation/GTMNSString+HTMLTest.m | 242 + .../Foundation/GTMNSString+Replace.h | 45 + .../Foundation/GTMNSString+Replace.m | 53 + .../Foundation/GTMNSString+ReplaceTest.m | 59 + .../Foundation/GTMNSString+URLArguments.h | 41 + .../Foundation/GTMNSString+URLArguments.m | 45 + .../Foundation/GTMNSString+URLArgumentsTest.m | 94 + .../Foundation/GTMNSString+XML.h | 51 + .../Foundation/GTMNSString+XML.m | 182 + .../Foundation/GTMNSString+XMLTest.m | 93 + .../Foundation/GTMObjC2Runtime.h | 106 + .../Foundation/GTMObjC2Runtime.m | 156 + .../Foundation/GTMObjC2RuntimeTest.m | 424 + .../Foundation/GTMObjectSingleton.h | 71 + .../Foundation/GTMPath.h | 132 + .../Foundation/GTMPath.m | 156 + .../Foundation/GTMPathTest.m | 236 + .../GTMProgressMonitorInputStream.h | 22 + .../Foundation/GTMRegex.h | 379 + .../Foundation/GTMRegex.m | 817 + .../Foundation/GTMRegexTest.m | 1245 ++ .../Foundation/GTMSQLite.h | 713 + .../Foundation/GTMSQLite.m | 2012 +++ .../Foundation/GTMSQLiteTest.m | 1813 ++ .../Foundation/GTMScriptRunner.h | 134 + .../Foundation/GTMScriptRunner.m | 254 + .../Foundation/GTMScriptRunnerTest.m | 423 + .../Foundation/GTMSignalHandler.h | 73 + .../Foundation/GTMSignalHandler.m | 210 + .../Foundation/GTMSignalHandlerTest.m | 143 + .../Foundation/GTMStackTrace.h | 105 + .../Foundation/GTMStackTrace.m | 358 + .../Foundation/GTMStackTraceTest.m | 163 + .../Foundation/GTMSystemVersion.h | 86 + .../Foundation/GTMSystemVersion.m | 232 + .../Foundation/GTMSystemVersionTest.m | 93 + .../Foundation/GTMTransientRootPortProxy.h | 50 + .../Foundation/GTMTransientRootPortProxy.m | 80 + .../GTMTransientRootPortProxyTest.m | 182 + .../Foundation/GTMTransientRootProxy.h | 113 + .../Foundation/GTMTransientRootProxy.m | 229 + .../Foundation/GTMTransientRootProxyTest.m | 228 + .../Foundation/GTMValidatingContainers.h | 196 + .../Foundation/GTMValidatingContainers.m | 490 + .../Foundation/GTMValidatingContainersTest.m | 378 + .../google-toolbox-for-mac/GTM-Info.plist | 20 + .../google-toolbox-for-mac/GTMDefines.h | 241 + .../google-toolbox-for-mac/GTM_Prefix.pch | 37 + .../GTMiPhone-Info.plist | 24 + .../google-toolbox-for-mac/ReleaseNotes.txt | 399 + .../English.lproj/InfoPlist.strings | Bin 0 -> 452 bytes .../AppleScript/GetMetadataForFile.m | 121 + .../SpotlightPlugins/AppleScript/Info.plist | 74 + .../SpotlightPlugins/AppleScript/PluginID.h | 19 + .../SpotlightPlugins/AppleScript/ReadMe.rtf | 38 + .../SpotlightPlugins/AppleScript/schema.xml | 38 + .../SpotlightPlugins/Common/main.c | 204 + .../Installer/ApplescriptInstallerPost.sh | 17 + .../ApplescriptInstallerPreflight.sh | 19 + .../InterfaceBuilderInstallerPost.sh | 17 + .../SpotlightPlugins/Installer/License.rtf | 13 + .../SpotlightPlugins/Installer/Welcome.rtf | 11 + .../Installer/XcodeProjectInstallerPost.sh | 17 + .../English.lproj/InfoPlist.strings | Bin 0 -> 480 bytes .../InterfaceBuilder/GetMetadataForFile.m | 208 + .../InterfaceBuilder/Info.plist | 51 + .../InterfaceBuilder/PluginID.h | 19 + .../InterfaceBuilder/ReadMe.rtf | 34 + .../TestData/XibCarbonTest.xib | 3106 ++++ .../TestData/XibCocoaTest.xib | 3075 ++++ .../English.lproj/InfoPlist.strings | Bin 0 -> 472 bytes .../XcodeProject/GetMetadataForFile.m | 85 + .../SpotlightPlugins/XcodeProject/Info.plist | 49 + .../SpotlightPlugins/XcodeProject/PluginID.h | 19 + .../SpotlightPlugins/XcodeProject/ReadMe.rtf | 31 + .../SpotlightPlugins/XcodeProject/schema.xml | 31 + .../TigerGcov/libgcov_readme.html | 11 + .../UnitTest-Info.plist | 20 + .../UnitTesting/GTMAppKit+UnitTesting.h | 144 + .../UnitTesting/GTMAppKit+UnitTesting.m | 341 + .../UnitTesting/GTMCALayer+UnitTesting.h | 46 + .../UnitTesting/GTMCALayer+UnitTesting.m | 90 + .../UnitTesting/GTMDevLogUnitTestingBridge.m | 44 + .../UnitTesting/GTMIPhoneUnitTestDelegate.h | 38 + .../UnitTesting/GTMIPhoneUnitTestDelegate.m | 206 + .../UnitTesting/GTMIPhoneUnitTestMain.m | 33 + .../GTMNSObject+BindingUnitTesting.h | 120 + .../GTMNSObject+BindingUnitTesting.m | 568 + .../UnitTesting/GTMNSObject+UnitTesting.h | 417 + .../UnitTesting/GTMNSObject+UnitTesting.m | 982 ++ .../UnitTesting/GTMSenTestCase.h | 1004 ++ .../UnitTesting/GTMSenTestCase.m | 362 + .../UnitTesting/GTMTestHTTPServer.h | 39 + .../UnitTesting/GTMTestHTTPServer.m | 166 + .../UnitTesting/GTMTestTimer.h | 125 + .../UnitTesting/GTMTestTimerTest.m | 56 + .../UnitTesting/GTMUIKit+UnitTesting.h | 128 + .../UnitTesting/GTMUIKit+UnitTesting.m | 122 + .../UnitTesting/GTMUIKit+UnitTestingTest.m | 65 + .../GTMUIUnitTestingHarness/Info.plist | 71 + .../GTMUIUnitTestingHarness/main.m | 27 + .../UnitTesting/GTMUIViewUnitTestingTest.png | Bin 0 -> 3214 bytes .../UnitTesting/GTMUnitTestDevLog.h | 76 + .../UnitTesting/GTMUnitTestDevLog.m | 279 + .../UnitTesting/GTMUnitTestingBindingTest.m | 116 + .../UnitTesting/GTMUnitTestingTest.h | 29 + .../UnitTesting/GTMUnitTestingTest.m | 252 + .../UnitTesting/GTMUnitTestingUtilities.h | 91 + .../UnitTesting/GTMUnitTestingUtilities.m | 310 + .../UnitTesting/RunIPhoneUnitTest.sh | 108 + .../UnitTesting/RunMacOSUnitTests.sh | 213 + .../GTMUIViewUnitTestingTest.gtmUTState | 33 + .../TestData/GTMUIViewUnitTestingTest.png | Bin 0 -> 3214 bytes .../TestData/GTMUnitTestingImage.10.6.0.tiff | Bin 0 -> 21014 bytes .../TestData/GTMUnitTestingImage.gtmUTState | 30 + .../TestData/GTMUnitTestingImage.tiff | Bin 0 -> 67190 bytes .../TestData/GTMUnitTestingTestApp.gtmUTState | 1591 ++ .../TestData/GTMUnitTestingView.tiff | Bin 0 -> 161670 bytes .../TestData/GTMUnitTestingWindow.10.5.6.tiff | Bin 0 -> 21176 bytes .../TestData/GTMUnitTestingWindow.10.6.0.tiff | Bin 0 -> 21380 bytes .../TestData/GTMUnitTestingWindow.gtmUTState | 291 + .../TestData/GTMUnitTestingWindow.tiff | Bin 0 -> 21226 bytes .../Project/DebugLeopardOrLater.xcconfig | 37 + .../Project/DebugSnowLeopardOrLater.xcconfig | 37 + .../Project/DebugTigerOrLater.xcconfig | 37 + .../XcodeConfig/Project/DebugiPhone.xcconfig | 26 + .../Project/DebugiPhone20.xcconfig | 37 + .../Project/DebugiPhone21.xcconfig | 37 + .../Project/ReleaseLeopardOrLater.xcconfig | 37 + .../ReleaseSnowLeopardOrLater.xcconfig | 37 + .../Project/ReleaseTigerOrLater.xcconfig | 37 + .../Project/ReleaseiPhone.xcconfig | 26 + .../Project/ReleaseiPhone20.xcconfig | 37 + .../Project/ReleaseiPhone21.xcconfig | 37 + .../XcodeConfig/Target/DebugUnittest.xcconfig | 29 + .../Target/LoadableBundle.xcconfig | 30 + .../Target/LoadableBundleGCSupported.xcconfig | 30 + .../Target/ReleaseUnittest.xcconfig | 37 + .../XcodeConfig/Target/SharedLibrary.xcconfig | 29 + .../Target/SharedLibraryGCSupported.xcconfig | 30 + .../XcodeConfig/Target/StaticLibrary.xcconfig | 30 + .../Target/StaticLibraryGCSupported.xcconfig | 30 + .../subconfig/CodeCoverage.xcconfig | 25 + .../subconfig/CodeCoverageStatic.xcconfig | 24 + .../XcodeConfig/subconfig/Debug.xcconfig | 47 + .../subconfig/GCSupported.xcconfig | 23 + .../XcodeConfig/subconfig/GTMMerge.xcconfig | 42 + .../XcodeConfig/subconfig/General.xcconfig | 172 + .../subconfig/LeopardOrLater.xcconfig | 25 + .../XcodeConfig/subconfig/Release.xcconfig | 45 + .../subconfig/SnowLeopardOrLater.xcconfig | 26 + .../subconfig/TigerOrLater.xcconfig | 25 + .../XcodeConfig/subconfig/Unittest.xcconfig | 33 + .../XcodeConfig/subconfig/iPhone20.xcconfig | 24 + .../XcodeConfig/subconfig/iPhone21.xcconfig | 24 + .../XcodeConfig/xcconfigs-readme.txt | 53 + .../iPhone/GTMABAddressBook.h | 328 + .../iPhone/GTMABAddressBook.m | 903 + .../iPhone/GTMABAddressBook.strings | Bin 0 -> 1428 bytes .../iPhone/GTMABAddressBookTest.m | 608 + .../iPhone/GTMUIFont+LineHeight.h | 24 + .../iPhone/GTMUIFont+LineHeight.m | 25 + .../iPhone/GTMUIFont+LineHeightTest.m | 40 + .../r318/src/common/mac/file_id.cc | 101 + .../r318/src/common/mac/file_id.h | 78 + .../r318/src/common/mac/macho_id.cc | 366 + .../r318/src/common/mac/macho_id.h | 124 + .../r318/src/common/mac/macho_utilities.cc | 89 + .../r318/src/common/mac/macho_utilities.h | 90 + .../r318/src/common/mac/macho_walker.cc | 243 + .../r318/src/common/mac/macho_walker.h | 106 + .../r318/src/common/mac/string_utilities.cc | 84 + .../r318/src/common/mac/string_utilities.h | 52 + .../google-breakpad/r318/src/common/md5.c | 246 + .../google-breakpad/r318/src/common/md5.h | 31 + .../r318/src/common/solaris/dump_symbols.cc | 681 + .../r318/src/common/solaris/dump_symbols.h | 49 + .../r318/src/common/solaris/file_id.cc | 197 + .../r318/src/common/solaris/file_id.h | 66 + .../r318/src/common/solaris/guid_creator.cc | 84 + .../r318/src/common/solaris/guid_creator.h | 50 + .../r318/src/common/solaris/message_output.h | 54 + .../r318/src/common/string_conversion.cc | 155 + .../r318/src/common/string_conversion.h | 66 + .../r318/src/common/windows/guid_string.cc | 76 + .../r318/src/common/windows/guid_string.h | 58 + .../r318/src/common/windows/http_upload.cc | 393 + .../r318/src/common/windows/http_upload.h | 125 + .../common/windows/pdb_source_line_writer.cc | 800 + .../common/windows/pdb_source_line_writer.h | 163 + .../src/common/windows/string_utils-inl.h | 139 + .../r318/src/common/windows/string_utils.cc | 92 + thirdparty/google-breakpad/r318/src/config.h | 56 + .../google-breakpad/r318/src/config.h.in | 55 + .../google_breakpad/common/breakpad_types.h | 83 + .../common/minidump_cpu_amd64.h | 231 + .../google_breakpad/common/minidump_cpu_ppc.h | 163 + .../common/minidump_cpu_ppc64.h | 129 + .../common/minidump_cpu_sparc.h | 158 + .../google_breakpad/common/minidump_cpu_x86.h | 172 + .../common/minidump_exception_linux.h | 85 + .../common/minidump_exception_mac.h | 193 + .../common/minidump_exception_solaris.h | 94 + .../common/minidump_exception_win32.h | 102 + .../google_breakpad/common/minidump_format.h | 721 + .../google_breakpad/common/minidump_size.h | 107 + .../processor/basic_source_line_resolver.h | 114 + .../google_breakpad/processor/call_stack.h | 77 + .../google_breakpad/processor/code_module.h | 94 + .../google_breakpad/processor/code_modules.h | 98 + .../google_breakpad/processor/memory_region.h | 76 + .../src/google_breakpad/processor/minidump.h | 904 + .../processor/minidump_processor.h | 94 + .../google_breakpad/processor/process_state.h | 115 + .../source_line_resolver_interface.h | 82 + .../google_breakpad/processor/stack_frame.h | 84 + .../processor/stack_frame_cpu.h | 153 + .../google_breakpad/processor/stackwalker.h | 140 + .../processor/symbol_supplier.h | 82 + .../google_breakpad/processor/system_info.h | 97 + .../r318/src/processor/.deps/.dirstamp | 0 .../processor/.deps/address_map_unittest.Po | 1 + .../processor/.deps/basic_code_modules.Plo | 385 + .../.deps/basic_source_line_resolver.Plo | 436 + .../basic_source_line_resolver_unittest.Po | 1 + .../r318/src/processor/.deps/call_stack.Plo | 301 + .../.deps/contained_range_map_unittest.Po | 1 + .../r318/src/processor/.deps/logging.Plo | 365 + .../r318/src/processor/.deps/minidump.Plo | 438 + .../r318/src/processor/.deps/minidump_dump.Po | 420 + .../processor/.deps/minidump_processor.Plo | 441 + .../.deps/minidump_processor_unittest.Po | 1 + .../src/processor/.deps/minidump_stackwalk.Po | 469 + .../src/processor/.deps/pathname_stripper.Plo | 280 + .../.deps/pathname_stripper_unittest.Po | 1 + .../.deps/postfix_evaluator_unittest.Po | 1 + .../src/processor/.deps/process_state.Plo | 308 + .../src/processor/.deps/range_map_unittest.Po | 1 + .../.deps/simple_symbol_supplier.Plo | 395 + .../r318/src/processor/.deps/stackwalker.Plo | 454 + .../src/processor/.deps/stackwalker_amd64.Plo | 414 + .../src/processor/.deps/stackwalker_ppc.Plo | 414 + .../processor/.deps/stackwalker_selftest.Po | 1 + .../src/processor/.deps/stackwalker_sparc.Plo | 415 + .../src/processor/.deps/stackwalker_x86.Plo | 446 + .../r318/src/processor/.dirstamp | 0 .../r318/src/processor/address_map-inl.h | 92 + .../r318/src/processor/address_map.h | 80 + .../src/processor/address_map_unittest.cc | 196 + .../r318/src/processor/basic_code_module.h | 95 + .../r318/src/processor/basic_code_modules.cc | 122 + .../r318/src/processor/basic_code_modules.h | 85 + .../processor/basic_source_line_resolver.cc | 714 + .../basic_source_line_resolver_unittest.cc | 212 + .../r318/src/processor/call_stack.cc | 53 + .../src/processor/contained_range_map-inl.h | 197 + .../r318/src/processor/contained_range_map.h | 145 + .../processor/contained_range_map_unittest.cc | 263 + .../r318/src/processor/linked_ptr.h | 193 + .../r318/src/processor/logging.cc | 104 + .../r318/src/processor/logging.h | 153 + .../r318/src/processor/minidump.cc | 3679 ++++ .../r318/src/processor/minidump_dump | Bin 0 -> 246444 bytes .../r318/src/processor/minidump_dump.cc | 130 + .../r318/src/processor/minidump_dump_test | 36 + .../r318/src/processor/minidump_processor.cc | 992 ++ .../processor/minidump_processor_unittest.cc | 239 + .../r318/src/processor/minidump_stackwalk | Bin 0 -> 458288 bytes .../r318/src/processor/minidump_stackwalk.cc | 508 + .../minidump_stackwalk_machine_readable_test | 37 + .../src/processor/minidump_stackwalk_test | 37 + .../r318/src/processor/pathname_stripper.cc | 56 + .../r318/src/processor/pathname_stripper.h | 53 + .../processor/pathname_stripper_unittest.cc | 85 + .../src/processor/postfix_evaluator-inl.h | 282 + .../r318/src/processor/postfix_evaluator.h | 158 + .../processor/postfix_evaluator_unittest.cc | 303 + .../r318/src/processor/process_state.cc | 63 + .../r318/src/processor/range_map-inl.h | 210 + .../r318/src/processor/range_map.h | 126 + .../r318/src/processor/range_map_unittest.cc | 494 + .../r318/src/processor/scoped_ptr.h | 335 + .../src/processor/simple_symbol_supplier.cc | 157 + .../src/processor/simple_symbol_supplier.h | 125 + .../r318/src/processor/stack_frame_info.h | 126 + .../r318/src/processor/stackwalker.cc | 193 + .../r318/src/processor/stackwalker_amd64.cc | 131 + .../r318/src/processor/stackwalker_amd64.h | 80 + .../r318/src/processor/stackwalker_ppc.cc | 146 + .../r318/src/processor/stackwalker_ppc.h | 81 + .../src/processor/stackwalker_selftest.cc | 425 + .../src/processor/stackwalker_selftest_sol.s | 111 + .../r318/src/processor/stackwalker_sparc.cc | 139 + .../r318/src/processor/stackwalker_sparc.h | 86 + .../r318/src/processor/stackwalker_x86.cc | 432 + .../r318/src/processor/stackwalker_x86.h | 82 + .../r318/src/processor/testdata/minidump2.dmp | Bin 0 -> 11317 bytes .../src/processor/testdata/minidump2.dump.out | 705 + .../minidump2.stackwalk.machine_readable.out | 21 + .../testdata/minidump2.stackwalk.out | 35 + .../r318/src/processor/testdata/module1.out | 19 + .../r318/src/processor/testdata/module2.out | 17 + .../src/processor/testdata/module3_bad.out | 3 + .../src/processor/testdata/module4_bad.out | 5 + .../r318/src/processor/testdata/test_app.cc | 69 + thirdparty/google-breakpad/r318/src/stamp-h1 | 1 + .../r318/src/tools/linux/dump_syms/Makefile | 30 + .../src/tools/linux/dump_syms/dump_syms.cc | 52 + .../r318/src/tools/linux/symupload/Makefile | 24 + .../tools/linux/symupload/minidump_upload.cc | 144 + .../src/tools/linux/symupload/sym_upload.cc | 216 + .../tools/mac/crash_report/crash_report.mm | 362 + .../crash_report/on_demand_symbol_supplier.h | 97 + .../crash_report/on_demand_symbol_supplier.mm | 267 + .../src/tools/mac/dump_syms/dump_syms_tool.m | 142 + .../src/tools/mac/dump_syms/dump_syms_tool.mm | 142 + .../src/tools/mac/symupload/minidump_upload.m | 135 + .../r318/src/tools/mac/symupload/symupload.m | 190 + .../r318/src/tools/solaris/dump_syms/Makefile | 64 + .../src/tools/solaris/dump_syms/dump_syms.cc | 54 + .../tools/solaris/dump_syms/run_regtest.sh | 51 + .../dump_syms/testdata/dump_syms_regtest.cc | 64 + .../testdata/dump_syms_regtest.stabs | 129 + .../dump_syms/testdata/dump_syms_regtest.sym | 33 + .../converter/ms_symbol_server_converter.cc | 522 + .../converter/ms_symbol_server_converter.h | 201 + .../src/tools/windows/dump_syms/dump_syms.cc | 61 + .../tools/windows/dump_syms/run_regtest.sh | 53 + .../dump_syms/testdata/dump_syms_regtest.cc | 65 + .../dump_syms/testdata/dump_syms_regtest.sym | 14097 ++++++++++++++++ .../src/tools/windows/symupload/symupload.cc | 202 + 630 files changed, 142443 insertions(+) create mode 100644 thirdparty/google-breakpad/r318/bin/macx/dump_syms create mode 100644 thirdparty/google-breakpad/r318/bin/win32/dump_syms.exe create mode 100644 thirdparty/google-breakpad/r318/breakpad.pro create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/breakpad_exc_server.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/breakpad_nlist_64.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/dynamic_images.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/exception_handler.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/minidump_generator.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/protected_memory_allocator.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/minidump_file_writer-inl.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/minidump_file_writer.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/common/auto_critical_section.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/common/ipc_protocol.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/client_info.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/crash_generation_client.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/crash_generation_server.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/minidump_generator.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/handler/exception_handler.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/sender/crash_report_sender.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/common/convert_UTF.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/common/md5.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/common/string_conversion.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/guid_string.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/http_upload.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/pdb_source_line_writer.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/string_utils-inl.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/breakpad_types.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_amd64.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_ppc.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_ppc64.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_sparc.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_x86.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_linux.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_mac.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_solaris.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_win32.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_format.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_size.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/basic_source_line_resolver.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/call_stack.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/code_module.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/code_modules.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/memory_region.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/minidump.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/minidump_processor.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/process_state.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/source_line_resolver_interface.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stack_frame.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stack_frame_cpu.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stackwalker.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/symbol_supplier.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/system_info.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/address_map-inl.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/address_map.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/basic_code_module.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/basic_code_modules.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/contained_range_map-inl.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/contained_range_map.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/linked_ptr.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/logging.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/pathname_stripper.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/postfix_evaluator-inl.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/postfix_evaluator.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/range_map-inl.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/range_map.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/scoped_ptr.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/simple_symbol_supplier.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/stack_frame_info.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_amd64.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_ppc.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_sparc.h create mode 100644 thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_x86.h create mode 100644 thirdparty/google-breakpad/r318/lib/macx/libbreakpad.a create mode 100644 thirdparty/google-breakpad/r318/lib/win32/breakpad.lib create mode 100644 thirdparty/google-breakpad/r318/lib/win32/dbreakpad.lib create mode 100644 thirdparty/google-breakpad/r318/readme.txt create mode 100644 thirdparty/google-breakpad/r318/release.vc9.bat create mode 100644 thirdparty/google-breakpad/r318/src/client/linux/handler/Makefile create mode 100644 thirdparty/google-breakpad/r318/src/client/linux/handler/exception_handler.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/linux/handler/exception_handler.h create mode 100644 thirdparty/google-breakpad/r318/src/client/linux/handler/exception_handler_test.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread.h create mode 100644 thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread_test.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_generator.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_generator.h create mode 100644 thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_test.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_exc_server.c create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_exc_server.h create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_nlist_64.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_nlist_64.h create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/dynamic_images.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/dynamic_images.h create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler.h create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler_test.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator.h create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator_test.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_tests32-Info.plist create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_tests64-Info.plist create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/obj-cTestCases-Info.plist create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/protected_memory_allocator.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/protected_memory_allocator.h create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/DynamicImagesTests.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/DynamicImagesTests.h create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/breakpad_nlist_test.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/breakpad_nlist_test.h create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/dwarftests.h create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/dwarftests.mm create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data create mode 100644 thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym create mode 100644 thirdparty/google-breakpad/r318/src/client/minidump_file_writer-inl.h create mode 100644 thirdparty/google-breakpad/r318/src/client/minidump_file_writer.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/minidump_file_writer.h create mode 100644 thirdparty/google-breakpad/r318/src/client/minidump_file_writer_unittest.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/solaris/handler/Makefile create mode 100644 thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler.h create mode 100644 thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler_test.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_generator.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_generator.h create mode 100644 thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_test.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/solaris/handler/solaris_lwp.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/solaris/handler/solaris_lwp.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/common/auto_critical_section.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/common/ipc_protocol.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/crash_generation/ReadMe.txt create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/crash_generation/client_info.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/crash_generation/client_info.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_client.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_client.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_server.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_server.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/crash_generation/minidump_generator.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/crash_generation/minidump_generator.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/handler/exception_handler.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/handler/exception_handler.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/sender/crash_report_sender.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/sender/crash_report_sender.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/abstract_class.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/abstract_class.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.ico create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.rc create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/precompile.cc create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/precompile.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/resource.h create mode 100644 thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/small.ico create mode 100644 thirdparty/google-breakpad/r318/src/common/convert_UTF.c create mode 100644 thirdparty/google-breakpad/r318/src/common/convert_UTF.h create mode 100644 thirdparty/google-breakpad/r318/src/common/linux/dump_symbols.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/linux/dump_symbols.h create mode 100644 thirdparty/google-breakpad/r318/src/common/linux/file_id.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/linux/file_id.h create mode 100644 thirdparty/google-breakpad/r318/src/common/linux/guid_creator.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/linux/guid_creator.h create mode 100644 thirdparty/google-breakpad/r318/src/common/linux/http_upload.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/linux/http_upload.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/HTTPMultipartUpload.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/HTTPMultipartUpload.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dump_syms.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dump_syms.mm create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader-inl.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2enums.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2reader.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2reader.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dwarf/functioninfo.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dwarf/functioninfo.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dwarf/line_state_machine.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/dwarf/types.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEvent.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEvent.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEventTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMDelegatingTableColumn.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMDelegatingTableColumn.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMGetURLHandler.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMGetURLHandlerTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextField.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextField.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextFieldTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindow.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindow.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindowTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShading.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShading.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShadingTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItems.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItems.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItemsTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPath.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPath.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPathTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRect.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRect.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRectTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+Shading.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+Shading.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+ShadingTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+Luminance.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+Luminance.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+LuminanceTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+Scaling.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+Scaling.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+ScalingTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+Running.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+Running.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+RunningTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMShading.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMTheme.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMTheme.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMThemeTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/BuildScripts/BuildAllSDKs.sh create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/BuildingAndUsing.txt create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/COPYING create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugSelectorValidation.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidation.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidation.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidationTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheck.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheck.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheckTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListener.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListener.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListenerTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64Test.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRange.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRange.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRangeTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlines.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlines.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlinesTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueue.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueue.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueueTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCode.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCode.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCodeTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGarbageCollection.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtils.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtils.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtilsTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPFetcher.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServer.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServer.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServerTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxy.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxy.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxyTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASL.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASL.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASLTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriter.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriter.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriterTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEvent+HandlerTest.applescript create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Foundation.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Foundation.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+FoundationTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Handler.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Handler.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+HandlerTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+Handler.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+Handler.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+HandlerTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+Merge.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+Merge.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+MergeTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlib.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlib.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlibTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArguments.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArguments.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArgumentsTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+Filter.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+Filter.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+FilterTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Carbon.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Carbon.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+CarbonTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Path.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Path.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+PathTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObserving.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObserving.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObservingTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolder.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolder.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolderTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTML.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTML.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTMLTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+Replace.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+Replace.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+ReplaceTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArgumentsTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XML.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XML.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XMLTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2Runtime.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2Runtime.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2RuntimeTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjectSingleton.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPath.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPath.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPathTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMProgressMonitorInputStream.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegex.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegex.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegexTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLite.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLite.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLiteTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunner.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunner.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunnerTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandler.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandler.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandlerTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTrace.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTrace.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTraceTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersion.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersion.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersionTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxy.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxy.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxyTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxy.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxy.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxyTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainers.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainers.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainersTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTM-Info.plist create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTMDefines.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTM_Prefix.pch create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTMiPhone-Info.plist create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/ReleaseNotes.txt create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/English.lproj/InfoPlist.strings create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/GetMetadataForFile.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/Info.plist create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/PluginID.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/ReadMe.rtf create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/schema.xml create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Common/main.c create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/ApplescriptInstallerPost.sh create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/ApplescriptInstallerPreflight.sh create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/InterfaceBuilderInstallerPost.sh create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/License.rtf create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/Welcome.rtf create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/XcodeProjectInstallerPost.sh create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/English.lproj/InfoPlist.strings create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/GetMetadataForFile.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/Info.plist create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/PluginID.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/ReadMe.rtf create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/TestData/XibCarbonTest.xib create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/TestData/XibCocoaTest.xib create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/English.lproj/InfoPlist.strings create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/GetMetadataForFile.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/Info.plist create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/PluginID.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/ReadMe.rtf create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/schema.xml create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/TigerGcov/libgcov_readme.html create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTest-Info.plist create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMAppKit+UnitTesting.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMAppKit+UnitTesting.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMCALayer+UnitTesting.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMCALayer+UnitTesting.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMDevLogUnitTestingBridge.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestMain.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+BindingUnitTesting.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+BindingUnitTesting.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+UnitTesting.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+UnitTesting.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMSenTestCase.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMSenTestCase.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestHTTPServer.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestHTTPServer.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestTimer.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestTimerTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTesting.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTesting.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTestingTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIUnitTestingHarness/Info.plist create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIUnitTestingHarness/main.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIViewUnitTestingTest.png create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestDevLog.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestDevLog.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingBindingTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingTest.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingUtilities.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingUtilities.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/RunIPhoneUnitTest.sh create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/RunMacOSUnitTests.sh create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUIViewUnitTestingTest.gtmUTState create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUIViewUnitTestingTest.png create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingImage.10.6.0.tiff create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingImage.gtmUTState create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingImage.tiff create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingTestApp.gtmUTState create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingView.tiff create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.10.5.6.tiff create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.10.6.0.tiff create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.gtmUTState create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.tiff create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugLeopardOrLater.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugSnowLeopardOrLater.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugTigerOrLater.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone20.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone21.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseLeopardOrLater.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseSnowLeopardOrLater.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseTigerOrLater.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone20.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone21.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/DebugUnittest.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/LoadableBundle.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/LoadableBundleGCSupported.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/ReleaseUnittest.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/SharedLibrary.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/SharedLibraryGCSupported.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/StaticLibrary.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/StaticLibraryGCSupported.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/CodeCoverage.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/CodeCoverageStatic.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Debug.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/GCSupported.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/GTMMerge.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/General.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/LeopardOrLater.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Release.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/SnowLeopardOrLater.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/TigerOrLater.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Unittest.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/iPhone20.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/iPhone21.xcconfig create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/xcconfigs-readme.txt create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.strings create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBookTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMUIFont+LineHeight.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMUIFont+LineHeight.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMUIFont+LineHeightTest.m create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/file_id.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/file_id.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/macho_id.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/macho_id.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/macho_utilities.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/macho_utilities.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/macho_walker.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/macho_walker.h create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/string_utilities.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/mac/string_utilities.h create mode 100644 thirdparty/google-breakpad/r318/src/common/md5.c create mode 100644 thirdparty/google-breakpad/r318/src/common/md5.h create mode 100644 thirdparty/google-breakpad/r318/src/common/solaris/dump_symbols.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/solaris/dump_symbols.h create mode 100644 thirdparty/google-breakpad/r318/src/common/solaris/file_id.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/solaris/file_id.h create mode 100644 thirdparty/google-breakpad/r318/src/common/solaris/guid_creator.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/solaris/guid_creator.h create mode 100644 thirdparty/google-breakpad/r318/src/common/solaris/message_output.h create mode 100644 thirdparty/google-breakpad/r318/src/common/string_conversion.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/string_conversion.h create mode 100644 thirdparty/google-breakpad/r318/src/common/windows/guid_string.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/windows/guid_string.h create mode 100644 thirdparty/google-breakpad/r318/src/common/windows/http_upload.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/windows/http_upload.h create mode 100644 thirdparty/google-breakpad/r318/src/common/windows/pdb_source_line_writer.cc create mode 100644 thirdparty/google-breakpad/r318/src/common/windows/pdb_source_line_writer.h create mode 100644 thirdparty/google-breakpad/r318/src/common/windows/string_utils-inl.h create mode 100644 thirdparty/google-breakpad/r318/src/common/windows/string_utils.cc create mode 100644 thirdparty/google-breakpad/r318/src/config.h create mode 100644 thirdparty/google-breakpad/r318/src/config.h.in create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/breakpad_types.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_amd64.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_ppc.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_ppc64.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_sparc.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_x86.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_linux.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_mac.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_solaris.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_win32.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_format.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_size.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/basic_source_line_resolver.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/call_stack.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/code_module.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/code_modules.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/memory_region.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/minidump.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/minidump_processor.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/process_state.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/source_line_resolver_interface.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/stack_frame.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/stack_frame_cpu.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/stackwalker.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/symbol_supplier.h create mode 100644 thirdparty/google-breakpad/r318/src/google_breakpad/processor/system_info.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/.dirstamp create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/address_map_unittest.Po create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/basic_code_modules.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/basic_source_line_resolver.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/basic_source_line_resolver_unittest.Po create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/call_stack.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/contained_range_map_unittest.Po create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/logging.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/minidump.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/minidump_dump.Po create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/minidump_processor.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/minidump_processor_unittest.Po create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/minidump_stackwalk.Po create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/pathname_stripper.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/pathname_stripper_unittest.Po create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/postfix_evaluator_unittest.Po create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/process_state.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/range_map_unittest.Po create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/simple_symbol_supplier.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_amd64.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_ppc.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_selftest.Po create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_sparc.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_x86.Plo create mode 100644 thirdparty/google-breakpad/r318/src/processor/.dirstamp create mode 100644 thirdparty/google-breakpad/r318/src/processor/address_map-inl.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/address_map.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/address_map_unittest.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/basic_code_module.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/basic_code_modules.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/basic_code_modules.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/basic_source_line_resolver.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/basic_source_line_resolver_unittest.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/call_stack.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/contained_range_map-inl.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/contained_range_map.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/contained_range_map_unittest.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/linked_ptr.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/logging.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/logging.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/minidump.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/minidump_dump create mode 100644 thirdparty/google-breakpad/r318/src/processor/minidump_dump.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/minidump_dump_test create mode 100644 thirdparty/google-breakpad/r318/src/processor/minidump_processor.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/minidump_processor_unittest.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk create mode 100644 thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk_machine_readable_test create mode 100644 thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk_test create mode 100644 thirdparty/google-breakpad/r318/src/processor/pathname_stripper.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/pathname_stripper.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/pathname_stripper_unittest.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/postfix_evaluator-inl.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/postfix_evaluator.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/postfix_evaluator_unittest.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/process_state.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/range_map-inl.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/range_map.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/range_map_unittest.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/scoped_ptr.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/simple_symbol_supplier.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/simple_symbol_supplier.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/stack_frame_info.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker_amd64.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker_amd64.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker_ppc.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker_ppc.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker_selftest.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker_selftest_sol.s create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker_sparc.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker_sparc.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker_x86.cc create mode 100644 thirdparty/google-breakpad/r318/src/processor/stackwalker_x86.h create mode 100644 thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.dmp create mode 100644 thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.dump.out create mode 100644 thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.stackwalk.machine_readable.out create mode 100644 thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.stackwalk.out create mode 100644 thirdparty/google-breakpad/r318/src/processor/testdata/module1.out create mode 100644 thirdparty/google-breakpad/r318/src/processor/testdata/module2.out create mode 100644 thirdparty/google-breakpad/r318/src/processor/testdata/module3_bad.out create mode 100644 thirdparty/google-breakpad/r318/src/processor/testdata/module4_bad.out create mode 100644 thirdparty/google-breakpad/r318/src/processor/testdata/test_app.cc create mode 100644 thirdparty/google-breakpad/r318/src/stamp-h1 create mode 100644 thirdparty/google-breakpad/r318/src/tools/linux/dump_syms/Makefile create mode 100644 thirdparty/google-breakpad/r318/src/tools/linux/dump_syms/dump_syms.cc create mode 100644 thirdparty/google-breakpad/r318/src/tools/linux/symupload/Makefile create mode 100644 thirdparty/google-breakpad/r318/src/tools/linux/symupload/minidump_upload.cc create mode 100644 thirdparty/google-breakpad/r318/src/tools/linux/symupload/sym_upload.cc create mode 100644 thirdparty/google-breakpad/r318/src/tools/mac/crash_report/crash_report.mm create mode 100644 thirdparty/google-breakpad/r318/src/tools/mac/crash_report/on_demand_symbol_supplier.h create mode 100644 thirdparty/google-breakpad/r318/src/tools/mac/crash_report/on_demand_symbol_supplier.mm create mode 100644 thirdparty/google-breakpad/r318/src/tools/mac/dump_syms/dump_syms_tool.m create mode 100644 thirdparty/google-breakpad/r318/src/tools/mac/dump_syms/dump_syms_tool.mm create mode 100644 thirdparty/google-breakpad/r318/src/tools/mac/symupload/minidump_upload.m create mode 100644 thirdparty/google-breakpad/r318/src/tools/mac/symupload/symupload.m create mode 100644 thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/Makefile create mode 100644 thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/dump_syms.cc create mode 100644 thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/run_regtest.sh create mode 100644 thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc create mode 100644 thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs create mode 100644 thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym create mode 100644 thirdparty/google-breakpad/r318/src/tools/windows/converter/ms_symbol_server_converter.cc create mode 100644 thirdparty/google-breakpad/r318/src/tools/windows/converter/ms_symbol_server_converter.h create mode 100644 thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/dump_syms.cc create mode 100644 thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/run_regtest.sh create mode 100644 thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc create mode 100644 thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym create mode 100644 thirdparty/google-breakpad/r318/src/tools/windows/symupload/symupload.cc diff --git a/thirdparty/google-breakpad/r318/bin/macx/dump_syms b/thirdparty/google-breakpad/r318/bin/macx/dump_syms new file mode 100644 index 0000000000000000000000000000000000000000..bc6676978557e0cc02d518e1c2f908ed74cdfeb5 GIT binary patch literal 430400 zcmeFa4R}@6nKryn5;RO>8(QqdDbhf(#VJ<&2HO(}nF9v9nZ!1Z@q6Rj2;r|2rlCfS z)8o7+a1P*H&?~-gQn6obAq_2dv{T=~j(#7uNU_CMIy%J}s91jnE1hEfsm@?43OV0> zKWnYM*WPFElM_H|-wUoQoc*)bv!3<*uV?-2pNxEWr{g$f_R-i+r7{3RDHYMJ}V`Tu?XUw+!|8S(`2|4=WnchREO z`E9LsA?6mk)dTg*{K7c=oxz8T7WFJo_wY*nE37}c)hYYJVaItlp)zM7|FTYnxdeHrk128Hzkm^N?mfp~F{ff{3m3~kN<15D; zr@qfA`yzgQ81^+_T>JSOdhq|^E`lk9@%VZ?Ugwnkn7>|MSl0a0FwAWPj04Qktar*D z=5Gv)<(-Q@d;Q{-%N3YHJPvGhoWJh^4E*{qIvnR+s)qazewH0vw5V}z>s;$;c@{Ud zny2_R`637qZx$_Dwzy|8uhhTj`cA!;i5UDp4_+#kcK2Klm<2eHkAxB6C!SHJn%Oe& zxT$LyuhhQ?7|eH70tSC$@aS4R3LaU={7k^WZvX~m{4@9i9!o!K3sxZ>xoxQ0;gny8 z-vA6&mw$zF6{g2JD4Emml=twrT-B2QJ$^1)^jAxlE?S;my1ct*QP1Kfg?OwRcAN=c z0u1~X#X|t|zd{&aPU7))r~L2uYvaM<@{fI4x$@f2`}g6#eEAi;V}1U!`I1nN*zS@W zZZJ3aEyUyhnU2TQ5B`gUf#-l%wrSC#PtW^{OQoFpuY4H4AY*yI`t{{|JPRyZv~u|k zH!S|E<%_Og{#hUqT|Y5h)ep2yn@tzYvUh)vDl(Q1dMjn zgW{P?9kC8v|nnO&$Ps3eZ9rU!Me0yH5F+@LLSV;?FN# zzUXfjUw=acJ-$Ir?sLj-ncly&&v<^`W>n%}s9o{#^^x8c9{ zrX7({{3_Y>^aA&USEJrLH#+5aWzp2@ct$(WfEqAz`injUwr*d7hXp9{Do_;|J)51UUuz`pNG?2aqZ_nCQh4A zFZ{okUw;Fh+;HKg)_Vajc5Rk{@0?j7QefkCL(j6MAN}aZJ|4o!uR{*t&#pu7aKpzg zvZ{pIX)FJua2?g9kIl0xvG0C6&lR?F?UKJ<`mwoI4P~ckJcM3}?kSG*<)ZYu^xEr} z7pK|W3xj0<{Pe%m6gW+Rw~hjtOWu`EPRSo@o#M=*(d>tP**GP?EBm)FqF-?;W-oOT z|LuQNUy|AS^NB7D>FR?{Wu~(1oAoKD;`>wbhvw8e6`4&RN@s5RKsxiikET(-67{qF zOR`n{8?u!w*Z=iwMGju`!VQkoJGCjD8gi1TS6+AiSB?Q@eP%`ZH#1!yNPj9@F~xPt z+AhpG7tS4Ws*>{dXSP*Ze+dk7e+_G48!vcGC)7raFuE3A+FWBCTZ3 zsZTEbD)1;h7y&A9Jzoy1Xn z--7#%xPLx7*GZ|qBxazkq{1mti)&Y3PsDYzzOKY|i^lty>HD7#JLR(vI?n6|zPg=s z&#d}D8Z_KTc&nd#Gi~FK=QXGw;7M|clgKRjKmkwYpl@}xj#Kx!uWnoaF7T@i{8DtU z&5W=4-*uluJ@9aKwi-NiI_l1M5>5I10pcER_rkS8>w5NO_0|{C$zjNvMOXcP68mRA zpHU9^SabZ_v-3`3_19iW&E1rrp=sC%8tz7a?#M278g>0j*QvgSJf{4wUiVyj_3|gv zkcrgl%l<9B`a}Pm?g!u9#Q&J$mVM#rIa#M{ao_Fjy&KBE3A)wdKC!rO(0iTX*%b4C3k z==l=p`w-skbkdYrjoXw=#|P3{ZmL;6>E!dKJp!}Pqw%b4CWJq6WTj5YoTy*>0 zN!WzsPA3`HzO+5raltzm^)ks-!LoQJdH|WKje2jjodgbq;bzLq)1=)feaYH1Oip&1 zfpb}M$rrX|D$3JM`H`#ftVKWDt)I=uvsV4=DgEpsJZsa>j_7CS;#s?TmY%4ejR$U8 zcb!?dHo7|<*R7f#lW^VU@dhw>jlNgwes;o6)DTXXp6Gj{E<;*AMfllOphbx9D3`+X zl;E}|-R_p%_@I#ov@=LtV(O8v^@aF2>+!q|b?P-trO$=!CQ;7t(&~@!tR3|WWCXaP zzs_{gi8APf<}dCWVP~lSlMGz|yR#VIsVlwf%f2}W8AHl{>%F7iA6sU> zkJG(mhx2Z??1nj{q0koe)ij!kcN3GaBQfs{4ZyF&M)WBKKUm)CoYA1_Cpwh;{LM7L zs0NI4bQ?Aw+F1`YNDQKGQ~tQof@;E>JCvAY?g1CJ;mlN6HZ}1LR}_EWJxcrC>+Je*@=jkPHot>1+5MX4 znJtr(G(FRJf3ddj&7kw9Tm$&E(8)k1o!k-!@tITEKi;VrSb^UK4rM2ecNO@p7k|Y2 z$#Pxc!@TxcBPWpK^6b3-HjFxznX>ZqFzU8C6%8NFI_0U&kpDt^Lw;8opM&=pvUsg|dF^5QeVCSphNi#3!LyBsK@Sjb(uuJY?jOcAeY(T)po>L|&+nIa zq~k*6`_T7sb2mHPvHQfCnH{weym)f`;kI9vFYH&EYN~>x{T#`O*+G#l<^w0sQ|osEvv96 zD=)_LMn2c}kG`xCv?MS2yfREn(3`yBJICgOg~LRJU)P=p{A$396l_^Ne8Gl@_hJLr z19#%=Su;WK zqOGYPcyH0B-;PybKi0zr_ci5zXJoVm@*(jg`j5B*@jPNOj5$;2Qw!zQA76`n@tKJ= zNV7?hn-<8;`lkFF<1}qppK|Jzg>89HYIB12U_Ip1$TVY@7Ti~&O;^iQi(B^Bbs7%i zYS`(&oWwE_c6t(UH*v9rdtx2i$xRhqVS9`jToW&3cRGC>>uY*S+@t!OXx8{tx0ISL^TanXnJlzQL z+-c4=h@TZ)EkEnP&sM#pSzmX3Tr7AHUmJ z{QZ%lF^ci4{X3m3aF_8gbsu~ntun$7_$u@{3mdS7bS$xdMt_aG)s{LQr%z$~9M=lp z*L;d?pEvfl-#lh$L%YCSp3WJx!4|X&uMh*_w>?uEwZR#K5laa?x zfEMBhjsJt5_a{3l9Jg$l@#l!gDyVObxdx|Sa)0x-)X-)dztJ?3FDLFOBk>-7lgQOH zCK*4kf}I$0QkikE?U%g|gcXfd=QGZg)lq56Nen{sND5 z_8BK*;li}_@4 zGos_$q*cGtrU!Do2~!U=XL|{@hj^F%Dyq$v65GUhPQkL^R9LuolmaI;RPjhm{q7R$ z_r=uDmRP?Tv1g-+)8PAMo&$0=GsIuV>RW#lY|1wHR-T-9K*rh_XLDTA3_IH5<2ZZ_ z&mG8qmh#v;4S5*w7P5kvckwk@Jco>|L%mkiYr{R`>Neaj!+j_2CC{LJWnY+h7X0|W}#PF4_&L=5yXI6kF$)y zg|5BJ02_AB;H$?|hEIbQp9TSUP{SpUO#6okH@DE}ZV-0w{43L$GZcJH_iBqK2X#LS z=pNF6F0}Ws?(b6ucjgOW*Y+CRLCYj?G%+)6P#8yTv$LKrVE+R+PImTS?f5lpE1$*E!>1UB`Q$ z8cOtq;h+vTldk@{V@{?X?3ZrNwfg^V?8xwQ4G zmh>avqGTl0MjG;9U>uI`+ZOTXq!s#DnVaWS8M{E9_g;3Tr^A+P2p*=-0oeeY;WFn8 z#*pZLo2K)mj8DrWXoohDw5*JxCF-@J|E;F~D5veqn&ILyJ1p{L%2@i_!v0w@wG1-z zh=Q-nJF0%BY@|DrDoba|FdrU>x5`O3wmFe)z(=*|{>&mAUmk{EiG=IL zuEUW&im;)N6HObIj2tFBJQqJ> z+4dXqQlDGp`LyjhMMqD!HLb+nid# zSj@Wt-xeL8wT%@A#$d&9aCX}`v^r;UuK3-+Bfx+743oRvsAYA!$f~bZlv8`|0iesa9h%{G(Z3GSDL;BgMP3~%@*%$HXe1>E&w>ANEDGn*!dB#(TbQcav^c-l09xZ4-WJ z8##|BF)Db z*K58|t}D>T^?^AI? zHwHQ>+w{{DuuZ?dU-$VWZPTx>({PH~CM`d-8;sAwcB7B<1D!{)8^1Pr&l9v8&p)Jb zJwdzi{LQ+4X?8=|hhp}E{@By^ZpV39$xxy-q?fdxmK`~4?4NH(V22^ECu&Eg5&p0q ze<__fe75c@Z3ts+?>+bwXFp~No=f!DSLbY8CG$D*J~LRsA~?)&0*T;HMJR%BLkJYM(}Xw2m=dOuU;# zyIG44v`g&2j;jtW57}43Vq9h7vJCpR&Wd-_A$W{;u|EIMxt5(3Uk^GCqpe}U>d7@E zDmCqUY`TE zP7ReE4B^NAcB0K1Wh0-vQR8Xsa3|WTvFtG8`7pg$U*@Ho^3PqY>(jCL!hBl@@z_1p2wwc2N5JTQqg!#j!1lJnN={T&<$SQ z>1*c2)|Ga_r*>lty&TL6ul`KJ|I%V7`K7r|{lFBg2Ttg)`EL zHjS^N9@#N*7xhTT#9i8cq|t7-j)}YZ-inF4@s4Xpu|ED-S288>3gf=Munqez?3Rg( zEgR-&8&(4wHVHPY7B*}eY*?+fVbe4Y%<1=0-s+vmxS0K3AF^TePuhn4yR5$fjdp0A zA}rdl9l&)5p05*})tJ2&_gT=CW1|f0&Fdl9v}flu<^TP1P0Q_oNqcq<%5Mjr+X0s} z%MxGGOWUXxTxU^+G$TDjHmdOs!c#V?d|If@nXH5Pi%Ec4W7cy3hjCU6whd#jd#U>@ zo15y?Ab&q;puyRO80=m=+lDdTy}+##1E(g1N>Sa{xf%2@b5%Djt30jkzT_@YjyBSUPa8{qXgPd(zowmu*~t&eq46nV<650Ej{BnQ-7wl3PA*;Z z3ff}aUNff_Yr7kqVc4VLy1!WK04L*H+F|^G&C=XROPY`Ec7J~IJg|PhGufS4xQCN3?$WdRYtz@zCLIcU+KYo?A4~&DR7p()?Mmv%-1g?GP zKYe;JoYsvICvCHS_MpZoTLMm`R~C5CW~~EG6{Fyk86!?QC;zh*8mDv#I5AhB1|DhP zlmSkaqu|86j4dal@lMY(>^HFk#)6~rj`I(USs8Qn0H>-^aAI6E7Myf^xqq&vQ)dY{ zG4AXH9vrK70jKI>I8kO>oy!_9$7$A}wdWd~1KOr{=9UzfN7S!0`4Pk`&1T(>#uqv4 zk#6W*8}M$k;4V8=aM4FUmk+(ceZ3wpOh=o{J$QBwwzJ;Gfql1Pt>)w|e{CLcwsB8d z^*9zUsUGV1KF+E`9|yd!_D|+#B_<8~`RMiFzZq73zB=8%vpU=VO!d0{k?QpWldJm% z8mf^Ct=`x_RGmpq#yjRI7h=x_xPR3+jw2@e zag}-oyfID~w-x&KI^wKjG5CmYjK;@#1vGp`$AQ4dc}4f97(Ro*hcStbk30iDgTQAK z@Hq^8Uet8uc@$&NYlP z_O&fsPSf6A*V`H{BW?Nl_~zVHlRFx2k+KnM2EmJ`G;DkAD&r>4mYJB{%Gs9+`v7Rc z9ML{aUx91UL+DL@7<)^eC3gka(L)#Z_D>$yuV4(P823Z}`go7u^^ooL$)#(nA^(yW z$Fp^Kwhqr~@oXLRXRofiyP#jRXAa;o22{CD#DWR>M&vwIUK`_h>@`BZdtssqaQm}E zHu(J45e|xd-TW1qoFn0Ian`wNOq{eLRLwmAsfWi>D;E2i+eAe>BYD`U3tyKTu}3 z<`Hs@3HTVX|KQ2EjOObREfZ-AR?>!r7^KglZ3a9HtPMvS>){vscy1Hqrw4FEmasP= z(uP_5sRe&}B)-YNzLGjvoHu_ojCLMI8{HcB!y5N4b+6Y-`+9sJ2R#x`#-n|euGzQG53T~-$Gvl@P+T@TYTH8j2kuuYvo8@BNGiyum7kpD(sUq`O) zSY~NUb!OfI#=dFvNAfA;F<@*$jFL)i!W_^lA6HH5b^(HgY66FA?gaUQf~OxoA+ z0m{6NoZzv{U)SKwt_f@(@q)v6VTO4J91jD>7lGqM;K*^Mlp!6-8!hLy%|F8SP%mrS zOC#67tsAh7T-mYDM1yB|4it5|V(NHuA5llf5#$YW28@BD+MHCR%}z_sIzX3YS&U1x z9jnK+@q=>qS%Ga_=u?qOuCCVxe4A-AybdWfbVe$sekzLB5%ryz`Yol^AGa%}en*M*smoFQ z?=G=^T>m3wy|Dk|;`-lTTKg3-{a;gJ`xSBhA1<-|xc+Y|vA&aqpVT^Z82V6w`)#ll zX|eg6aXy}ZPraob<@}7AN82oOIIOds{s7On<9fHYk!f5TA05`C?M9|iuZ{JzK5Wl5 zn6>)x<0zB~+ez^|*t^R-r`T|mISgBB+ezb_qU=s>l-(gc=$nCKJNnY4=u~Feoy0Ue zm$S%ljudI5^W(rh9G`h(K&J(^t5w+`XApHdfb%kc&#BXyYj8S%JJkqZ^gY@d$`%DL_a3-JzzD%Ur75XWAv`309TGL{8(~3 z{IBelMJ(Bp18mwptO>qv^tdH)80`!yx+ON|8f4CED{u+-D}{bF;yGiSW!g`g_^bo< zqIfnfif6D2F-O zacvg8_FD8xfnJRmqqXN2j%#bmznqJqnI2Ct4u^h~&YMG~t<0I^$;(q>;9GIN$R6Xj zLC{-b7F@4Gn_PRdNyU1P|J^Fm7TlS%Itmm8I zM>iJaZji4r^Xb++(>6WN)QNefF0|bVe&Rd^FTc=g_$%k2fk*6H0qp2CtU9-a_-zRJ z-JP=D*TjDnQE)*6$>k%4O6D58Jv0&nDLGhk(8!CoW&-$xeac)t*F!iMchpD2TDz-6 zSd(l)|IpE+BH0D%so6kEEiT^JX>SSB4Hp0Q)zI847pkS#mT5X zOJuK>dl#}vTh9E3%wceCc66>bUre40^Kg($;KJCz$ovkwZ^%D+XAW5UX36^6>L{AV z$vSlhGRd=&QpxNY$ZsY7U$< z7V=RcvIhG~S&@1%>+p-nhs?X#@=>I0v@H31oU>Z~1|ff&U>m7h9K*a-dnE_a?}9XoKK&%7<6a@tsC*&#oh~Eu7n?ZEUb!OaU ze1cmxN!C%UUW@aLadvXZ_j5kN)VY!K5xJ>O1=a*r4j|SVK&(}lavc12@{BOhL+>ZT z8JM`wH8{&w<1BB)R*a>pP&UD`=z|$E>anNJ!+2|Vwp4TfvfuVckJ@dU^>N{Kh?GgR zY2uH<@uiL>VJqp!+cT;6r8ACMk0oPTu3KmajCP(u&hfV4v6YWK44#YqWLwNz(6-UH znKKp0Gw?>}M&7_~IN;qieD3q||9S#+ATK#TL|&%&PVw^3ZZq*nYG`C;VDE{&XV8~T zPfrcavO`YVb!Hz$8!p;_ohhR%)w2!P`O}+7PxM1%-YxqR*;hr|kG-_W?R({}U^(&v z@>5|wuM5?`hWM&n{nyml*mppdkVkdP&KQ;z>xBQ(K5L_2{(L#p zCs_WRSFN_HNPDz#fmLU-;D$EPzp5g(W`4?yX?*_KR#~;C&yqJ2?|?VW)D7lnAbZW=mpQwx&4)F8kAVeVRD%~5FQ?ya-sPsM z^?(}x8abmJe4t$Re)3AtY0@|!=0~r>waBQFl}l(_C@Va_NczCDwq0j>!k5M4yJBTA zkw2*B7V{n2PHu;t+yOhe3-CI%-0yOo)Xiw86YaF(IrXH~m;32;SZ}n0&y}2hMDgE~ zm724CT+Uz)c{_QmE_g zgV*8Q5?KSEQte~|xY=jESas~a)EM~+=XN!Z=*u;Z)1EbQ1p6qli(7WKj7@1Djg5p~ z(z#fN>toDXHs)Wu33Kj{v%55!OuMeIy@^{WM=^BaxNN)T;M-7f>Pjnsqb1j%QttA$x4#m*g(5=g&TNiNEIVvZ+c9oB7 zcu$12w)j9$wmx*ejbjw;eErP|j%GiAeU?g0pCWT?#tw#b;oC*=_tq{WzJk5+X*|{Q zf9O{Y{L3Wk-Q`~2w9o6k^l)|W)Mu;t&5P9)KP=o2;^iW;g8LZy>Wvqp_!sKy`n5YP zUac{609#b->+Nkp>^sly>y%#8A3p|}AnR`oo}Ml6_jU+ghOaiyd^$~|Z?*i~B^N=i z=;xa8yaj%)+4pl(u3$YpYw@4e%DxR{6OPKaI=pin;aj~t(A@lC?Pm+dBL)}v^I_My zZ4+JJU8QqL$-ZmTtGUixTJQa$WYK8nR+K; zkJ>GJ)DFJs+_;ljyUN4oa0&KE*l*85`cfHxjv9u<0#hAi1@zzSqbm$CC|ab;}%iYsHs zmT_h5^(t{??7VVx8SD?jxJB}JI`)`|oRjN1OZUrf*;)61){INFJZ4<&|AaXx_BrI2BF=hCTvab;y?t$lTXxn(Ipj`s40VM4R@X6S z@_4><_}ey(%s2&fY)5Vn^I+4|rqNb4%bAVNMLcj*6Zlk>##+j57rBpdFN_zuZ9gzpEK|cnL|hUBY-1wU%ZBGI|5k9MRT2! z>`%4p!Y&Ff6&ja|m0fgRv2ei}SG67-^~Ju2_GK_X*U^eStFZg_-uxHQ_KVn?{|f5A z2zWKLg}heJ*D|*!*Z5_u#~clPhYjN}${yDH`wv?%%=3e&E7yd9zHpo~iT(#RyG_~N zQQ)b#U-%W?Uvu=S`^MBv|tY#=OeqQ7vO6r_haA;iUYXr!h6O> z*k>;?oy0x&0fyufWy+kHN-l?=(0CkDa*22IoSESHA;39=`YGKmbNV_brN_MfI@S!v zYR;Tmr=srswR?e^%Xk{Ujk3wr-14wT!4a=UX4ShK@!^6;T*g7$@JxIN+G=G^*meHy zF4GoZYzGYPH5mqst%Sk)uJgXRq#bxpdU1WwGF*#I#C5&Ct_PfY+^5vqmE+sdPxuYz z7-Zm>59__J-HLm}AjjM?XL$t8y1*lCQ-{p?FMBo3s1vk-^WrcNb{WjdB^l>hgJCJ%{apcG8aj{7=ub>dHC!sJjex+x;@tj0XsB znf2@f%CgoYe#2-Y`cInHX*br@wOF9rGDrsTW#cHl7#9Jb~fYLjHz(2o=;GCNQ{|MW#4mMsH}N@wN+N|brU03h02=eb97nQ zT*-}Q6zo5~U*~};NH_3230y=b0Bbzz7@acmpx+&TiSU#>9G`&S?E%@g*L`{8-F!j5 z4|EztyDi%H_fZdV-&)sTo`u$7B=Qewo)5Ba{M=~8ZVj^;Fm1cfSk5ti)A$X`FU+vt zgZIOxOhjBTgE(kEI~}s_7@1)m?cv*8=qkQJ_#sL(je{wphHsm)E5 zxwS#mjXOhuab2_4k4=QfvR1!1o-XJ&Xw7*DSK~IRNSS6`Mr@F}UVG5c5p;5syU_oj zFJ_Er=JDD`YsbQMqKyY(8#;w~fbS^UZPaVLUg4P5O}ueF+VuGo>c7vQGU{rWUWaTP z*gjx2Y8sTl!*veZ&f;61#6{-#6Gv|syOnq|r)9VUdeh-LTaQZnh^HX~(=42;!#Efl z7|Pdh{++g@6Z+dJFcWVahko+9(@h*@9^I!ytej#zrRZSi%p`6yd^UW*ckdDkhu@j~ z-iO`9>w9#+QfM!wWl{Vy`a!)Ge;qL%sgD?sv;&uRJsxRC|7u8k*irpl#v^i#XRyx> z<)9vI+T)Qnz-ZIskv0p4dCu{OToZ;xqbggMA%98s8}++EUqi<#&Ywllt2K&emTV{O z_gq(FXllokd`5ggvt{@dKNzsDdaN6{7EI^(S>CKEj4W69ewU6t+O%%epwC=aU&A#b ztxokNy|wS=xOblaVXd%7UE zU0BmE`{PVKZ!XEsrTY15uRi4j`)i30#|xd%DTn=0@`!cYq7%P+IzZ1;19QVEfN9nc z89XnJf*Hk6tW#;R>8s0lJOy3bQKqB+8Ju@J;?xY_8+8K>PVK-#XIezPy_z2`>eZm$ zB-Cp~y*AWqFIHaDzeCgCCH?L4aeNQei{aaE&m*ic%7Vcq2IgyzodTF4zP;8P1v7#t zLfgy_{w$q&VK%>GRtug?<9GfB5&zx}Ssg^|PWd%@P(-H#d@54MmI+gbGSO+;xA_%^ zvzDV1t<&{Z$exka2>d;Hw%?5+iyU)$HUu_I=Ej@yZ*C~GC;t`uyx7&YYHS&QQHE!-aD6eayKyae;#!>_qn>k(dbKXYvuv3JnYxWP ziB}$EoWbvh$~ZWG^nTtO{Rrc$<=5jsXwO`io0}^BTgC^ywPlfOx(&=Yog*CjbDbNL z9I-85;kLcfa*wAo!53b75jf%%u;r~8q7K!UZ@KDJ=X;V>*=25tF zO}B}m!#objpQp3X8_|C^@$#!B$gNio?RT**c;x3t5-;Dvd)){6CFw(0c1yrz`B-qV z`f$OR>cJ+6oHKWkczH4P4fqpp$G|)Zc(OjC6nHUmUm51%370F3i9Nf){uw(k8eb5* z-ZdtAXxT!&G5HZgd(^uss=Y8BL>EfvN0iK>jr*e7h@(XejM#6-f8Wo6itc2P+a!$D zUwYX~)*#c^;7gd zzslaCe%Mcx+*XJ-%o*vn`2A~Xi~Fqf_*?B2fsJ21Ts%JV@QKmGG4f4fKCS<sCD@Q|@3`b>EX`?t9MFt-6Zj5!_#zMQ8D#+wWAOwoXP z7KpKm=?MFdIfO3uoqeUA=)P|#weOUdD4cQ)pozh29`b?6ul6s%*e9%0Mfk!oR}6l= zW5F+iUJ{d%S6mxIT!C9f|B49w{5g@p_y+k!##I?vn~(90n>chfapFFxDuxt9PZT{jhc13b!*m&48HgE^&$T%zQ0!Go~eg=Lg{ z8Z@#q8TQSo#`ieiuVj7{o*3K1oHcRAUM4dS zlJm5nL$tq$8J`m;*aP4+@;vp5wn5`mN{klZD`Ytf7@Tj<0N!gtU*xO7%O2oZpK;#J z^G%t9PUDyRDO1{RBte5~fO{%8RqRogI*IWM&!Xabf)vVAX42%bzGj|1nMqY+PCB2* zGqzL3XS~KQ^W@Il&H44XjvY6LY>d|*mjSK$0M)m zekOq*`&O^kl}PTPJ~=OcOxtv14R16j$m&e$_lZmMXSLju&KE_1n<0Ri4>8&S+x5hv=6@l((>vA1J}Ge(@k{I_Me*t-(sG*aG5 zs23^UCyC36>e`9+p`oy+Yjba{~5h%=Lfs z^jp`r-<*GPxSc@XR&mVs#5H4Wm*W)1(%_33qcQ%xU1+0XDbAHhzC*2D&mV|tBdqhM z{i9O}T@2*#K*urp?9(*0&P|Jpr%n+~NArV}XFV2o!N+FF`P05m#(9F!6Y7M?v5M`B z!Iv>s65|f6r{UU;&2eMx5R5=B2)fC2$uc(LT28=W{FlP>M#g~s*Qi)7pr<+x49k>_ zcd>V)+w)VK>o0~&v3Dild7|-HWRCak#DzYP_8Q|$*!q1_0{kt(|4Ciwi(Ug%1DTQW zAjkBO$8N~chOxk;kH{@i`9Z{zvgei0I5y8XZcC=@{oVD>Bad`Ak35n8TzIF@=M6RX7Dj%jRR_*Nu7szSb}r1(hq8YUe#6&sXzZQ~nnZvK-o$d?#{D=K#kfa*55zBR1!LqVuy&1aL z>?Zyt7%%D^=%}&?TDpm!ZW${N-gf(g9BjzuEH^ULls|Hkh!y7WTd&vh zgvWseHe8KKozdbg%9e?z3Se08ipi?a>--&KkyWc+q(3Z%PqBBu4_xEgwEB3(SZL$h z(!fa44ez*V&eK|Y&YW($Z)wY!+B|!c7gd<755xF zTC6WoxNt0xYk>V-sOJmkVcuapVsFfK;h8;W7?_uff)&-TlPO2sfWxTcl&CgNRljWg zEyg2D4#ym;h4C+?O{={zjRQpP;p-_!@WU&kWHzp!R-0qeHLG4^+!F4;=*SpsBV@!| zi-$hl7u%<}vFsSuB*oFj&^3h1`BAu>On(`BM8t9Tpk3Mr&KZ^-$HB%$tz}kr?eVKl zHSUyy5Pjl#6@wf5Z{$hE-pCoS?~bf-mNn6lxm`^kmPMX}>rI4S`o21x-^qF5{2Ueg{OX(lY@NRtO^%d){xVWuLU;voa}jfa zx5wpX!g5GFO{`KBKQ#s!v)vKiNzA?bf&fiQ@wJovF+TQLB|zWXOMnsJndTMevL8g= ziSyVQd=E<2SL^)KS&C;+ z;-mf5gg`wlH(@z`%lt-gc$$kjyy41G}<_^g|Lae>oc{cR{Z9E;@#~2wvJ?6oC$6C*~ ziQf{uQskhAs$H-_z z+#9>Eq!_Ir58*LN&v)QkEJ7d4{)Ee+k6e=&T*Gda7y8G@LZKe!?_@Z*b%*pFT2%nFp}c_3|^gN6OB z!L^)u!)JQULOXD)iS%O;_RHuD>f5;@?%V9Fn<}|ZvEA0X`s?(&O4dPcrP6vAnHwo) z6T}9iEx@tnA%5`7vCc!3*oKuS{V`3gXKYn#F9%^~}Kb9A?@xFb2@gnkB=Zt=@ z_BqZrj>_{@j1|7~M3i2QS{F9%ZCgiCbRP5h_uYF$@1&g-ShILgOtZ+Zj zcNJfc;)BgTAle(y*xT>OZ|PyIIzFSi)qn^VrSR~WBn1XA&^)<^!zpb zoUy;e{d#;M-~Kc4hu5Z#nTqL)*a`51b#Fw$T?KJN1x4iZsOW>d78-L;PP~{;;B==CFY>0l5f1qm`dRj?- z5qEo>iSuP%4a()QYb?2xek!>bnw=a65a{IsJIiZ2QmQDGeacz;_Yx%8n zR37GM8$@=8WDe)@06j;uOB~~Y|7a&mnXvRWh3{<7xAc~K_@<$ZoX016OF0_CH>>jb zbE(6WCH%_XKAgFBpb*~6uMwUVx1<oAQu6rSZL^9N1&*O^nH?b34#`yWDI8^Na(<^~jQ!SYkU1NAOg?-o8sJ1IAD zXE3iC%?B@sg7zi811;wV_!l!SW|^2VR20nkI3+?qEnMQ~@*?U{FMOT4^LSK0M%Bm3 z@08f?rMt(9zo8p_D{^v2W9yGOHhk#;`a81+8?cWny?=5Ak?WwhPCJv9Vpq9|Yn=i9--C6y#~K4w^bm+9`ka@)f1Vj+#!chABB6z2~_aG;ao6 zo=wR;&5Yx?p1a2QV565Yv=6{E`DEB6mEQ)u(crMnaG4N&JR2as>J-Ga;lBJna0uCs z5@VU;Jj+|rYl!y$_!P}E#@JRYlb=6^SjKBR1e^2F5pn&oyR9~@xPIiZF|--v=|Z&@ zMCpE1T>tXExNqp@fJ}`N_lbRmOu_zp z;~6(G^eXR}N5L=GewBRw4`Nn1Pl<6D&ibyToVtmxZK1x>7oxvrtUU{|lf-+@uPtY6 zkGg7|je5>{3(zmU#%6Oc9y+mpos(-&eP!RUf2k7ZZB+3LodKLtgY~;r0ov)q1QGolTI~08Q!rMx`x(;ba1LPf_~Y3rCli1C!Nv-wV60LQf0O`I z$3D#81$k=ARg9hY$1$5C=YB%5NYFP!pCvvUn~w;>fF5Iy)_B@O|2(wUj*5N6{L;yu zhsJmlx+iCQ@ml7j5W7Uil|GFEeoV*Ravl(M4!Ttfzl0d;&^T?!lZ30D<#ULY==;q2 z8OdAeTwL&bpwav(Xd8J1<_Z;1IJ-bppA9(PuQvJcmksFB#7zUu*D)q?gZk4VZ;%P*e4F9V)Sf&I3-4*?^}eh@e7{fRCfSsK@fwEliU%n6J+$i3P z4e-bESv?Ot2)nZhGBu2Po8Xs*F_$w%_puRu*kt9{8k_P@s_)gK&%iqc{8L(&wzBN( zHIfV8R2P{G-*pdtkcMgEb+q@0$mME&&)0nKH~-XaMpowzNzS)T)0g@0O-=b-w+QX= z?HkaO-_^!967hW-@9exsZURk-Q$gMyIk`5!uOkz5U&$}#15;vK3i|!?=d~=?oA*4n|6xYM=ukiKjHm+Z#{e~X? z=LXPYzORS3o$r^s^#YVTNj-e^tav?q`X=LB$F7Ha?uypKJra)w_3#P7fj%Qz5BJ<% zTo3o`IkkHDlzf{W{2GHE?ipWP5BHoGr-#L2dDMY!y(VYAS~1T>hA;2zm}mEG+MfM^ z#ymgVPu=iio}WxORWT3kaVho{GAOYHVuA+)Hr$Q}{a8X`5-&GYxF4?6IYBQbf#2br zsL6S>iB2G%5I?4$!^TO@5cZ0(%XP4aoF8IbQfcB6%tv2m%Hf*drqlNAza9ll`s;dq zo>TC9jCMbxVlNc~&iCo`A7k5B;L~?YEPbQeT`0N6D*7n&`Hr#FwZ>p$uBYSj@On;j zKGsCo>C*QN`f*x--|^=^+&!PV;Lo|3^B=y={IQ;M`R?)nEp)6A7enZ8skBp8AOp2H-eGvt0AVkX8}kUi}uCPIebAMFlDO}aRPH)@=Z+x zzbU_WKVmAG=XMhtg6r>M$EyPm1izhx$@|N=HXIH#+e0q>EvgXtJivs$j z`4rL<&#pl}{WI%ntMr-J99M#_Ns)hirw7;B%siY|V4mSSk@Ra^7v?6u$Zy#O%j(=g z0GDVxQ-F((7sI(48K)K<`z+4CsP}vKb9|l2$TvCqUzzqx;)#cpQ#)QZ13u&Pg>*Syx>9_F)2MpEIg&z#!9JuGQ$=QB!waP4W0~wp2!W|e~&Js_P6+Dh9TRGm)iv9Jf{LO-b%P?{n`WEpV^LF zQd?bvdJcHa{1!v+hxxq>+0!oNoATd#RKr5ebYcCE8m5BKoJ zrVZ9*{Ko!S@6VR^XrJ#2as2UXrao~5t@XEwkw06Ay?$yfoUBpBeT({Ld%niN0Uf0+ zMcYTYFH`QD@{bLGW)n#>O`iufEjf3~Z`vCiu~zTL*9i{ufFE!K9$W`uzrVuZXz13I ze|%1;%muoiYOEWqKf% zyT3Q+FM0>!{l$+K3l6dV;zyFNr7!XQ#gpSqThK4~oFB>hAIM^azxYwY^l|L|;(%JG zgxqzszsMZ*{YB>KLVvOEMqft$_R&DBc*_07uegU|Om_V3@)vLII5NXER)0X_$fq8p zJg!}0k0YPDTb_O09!Eaq#has#BOf^boiL6ZjnDlYuPnqLbeVA>V#is~t}cwrIR;%3um?82V~Z(nJ`p(Rcj;qLA0MF~Y+i5-8q3qW zo)z0$l&6Q72RhBuV4V1N^0Yu+p;Ph=F6Q;1SKX9bm9zW8c>5i{2@c-joM5%qpaeNA zkRPLaqQ5%Ugl?Qvz6Y=*x2l-8cqZ3;AaCTj!_7 z()R**5jJ8h@Cs-t_J6XUuWHKwDxqWjB<(otZ@r(}xu5YQ*9K=Hf9t@@WabQ+AH3X@ zYs!C(wk?gAmt+2#^4669u3D1;KjO!CzZubUP1W@s`1aq@ui=}M*DqG( zA2s$YqI^PpP*eV2>U5vDK1t?# z?dR~`%o(b^)%Raz$~5KgcpyjksF#}ue~4fBS@Ycn!9&jS#(4w1OFxtDZM;(Q@W?qm zCS{F{2Fn*r!Xy0{^UXNbu`s zy@1l?H}8wo4?C7F;;Xc+VZL1A55o_@W*+3KNZ7V4`LGN65|Ly6!`J1K=SKEK#I$=N zV%j}1G40W(jUDjkM*hEX@0gf2B*SJ+2yHlRR(incLXjl)vvhz~mm24m|Hb4rhn&D}KD(vbo#2_Znqn{#@D4 zd+!I_U8v7>F_?RRttL*i$-tAgY;^}>9Xx{#=A8F-`CbQp0Y`Gb3eI-*3t_<%cg0!`3!*yVy{)hd#8SJindYS=XTE$OympJkD7>bQAkYy0DD+Hqe!G z8jvfjUwiI(;tUvEM@twx0K=OTQ84bknK1Bf8Eo7Re~s;9*zaG?HMXXIiYCLV?|^rO zPt$wu!u>M9xPp3U*7+*G^}-dVY*YSg^9e6ERp=)07&nT4z&VC|r+tSM18}7k7BLjrB0?*TOZVc#(cMJSF|9F&T z0Y{#ZU+`-?IM&R3lCj2{ud=R&DP@}Sn>Vc83B6FTWbCWt{2%WIES>?;qv7mUJb6`~ zvrW{!9PlWIjVRlLb{l3=^DxS@Dy8_!>sGJtVQZWU|*;OKZMY@-}wqk{3$_qPCsd{40{ z{{xx-r@bN^<{|K|N73g8;{U97v`MDkfQ*Zk{OH`3C(prH%3cppB>o7;>ZBjexrpC? z>ie`noDQB#jM|j{s^^o@x3rnh1%HzGzRq2IHe1zneo%bW)B)BY3BzOtC@t92JU zH}g53Z3wjQ^?l@7jqP^Sr479^oVc9Ro(humL%+WXH z`+Gs7OP~jGJ~;NjEHmSTg z6&>^c;})Hhj2Oc^)|h|EO4>riom1k=n=$`)R$B3ATHAb%l}~ca|CPm{N63eLg??W9 zu)(7_+N_0R9rOPq_dqdsm!!|a@7p})|KS6LWBwoBC3FTpr^ozG_wOx#=a1|9i?4@# z@Tl-`i9L_?pv)&TE`yA2RB_OQk9m9ztcQ#m^M8Hu=`p`IS9E&JpWkv9eFuC+#F+p4 zn=P9gG3Fm;+;R%W{2QN!ERQngzx6t_704%yZOp%uKCQ@@{}*%cev~o)*KQ{a#E+pd z|4+s+=D+n-^fhM8zyAWfll(wa{!2Ob_r%Biw{8HeQO5jVI@h9U31j{})|mfWX6&NJ z{C}^;VkM9H|2yN5(3t<;xnjrWiN73W%>VauqR0H|TN{w)h%x`><=|h$n16Gx$Og}f z1G+s)|mghDp#Q7=N&rc?~^mVyx6?VJ7X8)%F)LBUp)?f{~pKux7-ApOHRTc^Z(BY z{+Ry`{q4D19%4C}17gl$mC1J$8}n}+C>-;zN%&*$)>mW4+!478f6Sj-0l6CEm_K{m zYWF5J=FdJK)qZH5ZVmGDlQ1Uh=zj)zgb`;N=+J>RHoy63)~T4g*_obeaB6Z3ok@6J z3%X3}{bJ3;-W3xj4y8;$(jCVB3B{4BuD0^U0M8^CKJ z4E7Oq*gxiyh9Qf?{`0>)3fUUQyJdK0+P>M~#CBMpIbzqDcDDt;9`I9m-wZsw@x1Fy zxSM{k)8D_zb5poy(6npXn8J1;N5gL7iaXT2`=;%>pZ(bX_(1(G^!Z17kzc!#b1;%C zcbz{rc~s8h^sHV|Hqm-_BkeR|luG1xtI&sT!0%c8jh5=wYZg@F?6OAC^$G2#2iZrI zRrD_t86RA|4Ewh*$FusIFQj`v(v;3rf_Bc|C(wq>w}94z=p*Sb_qdjrRA}t%e$b{d z+8#uE3;cezJmA->K92bce&gNHMZ>G+_qH@$TKHX#!@dlcRZ?!i+l~0$2>H2W?vQo8 z8GTXDC*b)^ef?fs<1FUHBl>`nu`9{9y7JX>a-&HlRVNhbakc-G^~(FbMT-HiF&M9XccN4r9POb72~fOcGi z)RW!myv}_+y`Q`id6_rQBY!h%Ka_^-wSji+x(?5E>4zM)v5nqo;2ZVC`3U_}Kj_t= zaguTdkEVS3JpDe2`W<}ET(RrC=T*uG=)?0gRDWPcI0s|OxlZ*tIwp|48Jur(6Q6!m zw=)fWXB;3f0q-R#JI|@4E%E#P>CKRrSvlCg+(M^a@1Jf-E^)RgJ=oj9xxL=Yu1se~ zoX#BLQ|QY10lRO{75ILqMcbc;E&H<%_U8cX&r`thVeq7q{e?cM7&z}=h=VH$t zN({5Co*(tx}~qjyteQ;^!9dIA!?fI`6%jZQ@xApUHfs@crYP zt#&&AgSJh|H0A#%=M_VJne-6xhwN2A_A1d{|G+|LV_nK|@H+@tJWH`(?VWO(wLRMe zJ4$R?}_=w%oBwQ+UU#hkb7qpkw{goZz;WsUREVcgD_Z{sWk z4y)it@I7+qp6tU`HgoS&`rNE)Pkw&jY=bOL3CKzG+)B5WlRJ%^p#3``8^&jTTkfgf zOArTO4^t-fKJ5MVbfb^&As>tp?xY<64XZ&z@1Fc2Z>W>K^RfO2YoNeu?mrT_08Kd7 z7uf*a=}*L8DLs7GIjj%<$}^w8mvHQCFblXpWW9tN!4z+pXp*Mkq| zLgyI=@cLu8o}{l~Qxmm_NgR~T!d}(GpVWfa8?--J2mY*co$;K9+KxKwU=L|ex967V z->HZtAXBKv@5+k}&Ehu;TiV|Qd;2+|+ji2QG*dR4v&62lf2lI$QbzPIbkcG5wmR=I z>-wfe#224Y@x^16pfA^NcyK|dF4y_uOUt^XNkD`ct-cD5bz z+yVWj{}}XfuD)91yp{I$(@!6sr}iY~i{ZLd<2ubv`~~MP2~XSa32J>N){cO#!+=Sj zHIdimyRNW5)tWb*;EnliNhiv5D!Y?l%;@2W{%>`i_xEa>?%UghdpBf3#c$3TcM*QF zBcF%+yYbBQTw z2jELKxy~P*&-$-jm5J@C_+$aYX}Jgz4JUsXfrTp?1vkb2SY1Q|RC(K1u)H=(XiPznNue&)vjjcPZI? zET!%E`+|0SL2y3b))QY2C2x;*)-y z!^@`p<dDE*yTt#E(e_%hG5>xg8&&t8oNUa$PVw*3`$1#j zc~CYkeU{IC*{IuM%DIV4UkmX<%gm+R-)G6jr7I2p;Q#MJoseu?%Kf1+vT^B_;<7P! zzJcA8zy7fhJ|bs$et&V9xdMzk{NaG z6#R*@kxg^xZ?xU70?nbjm(Gp#rxE^M!|&F3h2S^eRtSIIvtxk|eG**V#N7CNj;}-8 zG`+-UicL+-y$3dv-?6OF_gnP6^2>?21K=TTKoa&Q87fQrpTzr0@4b%??Mo6ggFQiuRu)b2XF9G&N_q&7z#( zeYczVbNV;>i_m%dfBppIiFU8vO*G62=!ll5IDQZZ>aJ?PVJ_PzZ%n*u`r^g#(J^wt z`XJzM=8Q7H>1yjfi~DnQKh!!rT^7%;KtJ?)yE!)kui)NKyDvUHM`?S`)4{gq+#TKa z9QtJ4cKy+~w!`v9eM0WH1u`HqL|G7BK)!-AAmYwaan<{oT{Eg&bzAnZ#1!TpCZ`*NOW&(D+h|GBWh~Pyoju&B>0j*rI z!JwDX`G71$(28~ga;aiE?JL4|BHRvXfVP6VV)>X*KSj6A`Dli($Uj)$=E|SUcf^?I zv0=r2M=abA*c3OCPQG38;t7!{MJrh!C;sUV=^L?rpGx3I%Y$(;R|0QC{Aej|OMJW{ zX#Ht#-J$8n&vU+x&y#pAV-B@eU7Z_P&}I?aF$TR6dKjOAdh)$@@`Ynm=*BU_{t9 z(b>s}i$FW_NODApiwAfQ-%ttsD&R-y8zfgB@XMNqQTV}sbrLpW27YI$O2u6tuPYY! zanE6N+;=ha1Ul}UH9vrZmfc9&M(}fNbeP5bcQhS9vr=U`?wcl&I4gOm8dV^6Mc7O=UH8|HBfzgdYr zc|l+HW^p_0_rbGgkjqTab{*SdY#M$u+J(=P}+a8W$9m zH}Hyj0h@Z88JnPuv7D1UD$OP#_m(N3nR|JOcA^N)+`1E|*)f?jkJF#hXm;#)sWgky zGn4C}?3?&6Tn=*5j6TX*jfir)bRLE4g4!Xk9gx@d+*IT&U^53Aur_F+GY!u=tYCd}xOJdKR)mYE(^V-EbZ5uc@ zFLT?7w-CpDTGpdV|A2E-zQx3UjO#crZ`sqMvL->nab^kL-u(H9tPd6YI)rr~I2Q>v z@|SF%<*{~Q8sM2RGTV`u2{O%moddl2t@K87PdyC8;(BZoWy6dQ0lm8cgEmq07WBi} zd?WlmMA5TbqGUA-oD9#6{|c9j8~?`XFJwZ-fan`@X!qG;29H%UGs z^fh>vYL|!y;3)fp>r%c+QrP#m``eTszDfFC@NLQu7qvshco9K^`IOfap(kYzV|)E= z;SXP<^^Ws{$qUzr{LjF3H{}X3DChGkbCA>ici|qt10R*#LK3-!;F%G&j|tfslOq*7 zv#^x$;i@U3pNR84S+VuX_hCiGI;%`>i{EP;EtD3GBu!(3R(l z9)tbM;yRQ+RF^YpkYleMfk16!oS);OEGu1m}=TkoN*v3+0UIdo8)+ zx_u*ey!PY{yyDt{w@dD19{JSB-6vivl)FznTPSy*c$Cj*(?*xOkN@%yK<=2Eh5XdY z-VgFQO75ES&p#L~cePv(%NP%H@{{k1jbD5_>x~tRPlmi$x#th6^IDKIz;lipg7ccT zZ-|2lcw?N`TpYmLZo~IK0lb60?}Lkr=q%4lzAA!t(B%(~_i1--DeK<~>@nz`0sjy) z|E(7fgKqE#-rh&V*hkI&4zb<9rJ6cQ84mHAdr&g7zb@ZY&eTPIQ@M2<`x=bbmtM_h zoru@@r(NL=+kpVdBuYhn=_zpTDD9p|TgJ_rrMaRB^6igtiG5ap9b z_Mokj@*stA-kJFhC!aTV#l*tJ;ws7m`g4LY?j+`H5aUjt#WvlQY zK43_Ei=2}A_PFF2ioyxe)r{lF8_2E1E|d|_SH@kCH9Y^!^K}i-d9m|OwfU~6;^VPL zP1&Y=!}Gu?iTad*i0_Rz?1B6@qpfB)F^S(V=Gk4zrhNOexW5LtG-JHQcXR!6e=;BC z+>Y>tv5Z;!hsnJH*fv zq1y>w!#47aKGF<2KJPlYw)Mwe1LD&qt8=N|I)BvL)Rdob9q|MnT;q%T!_t4!hU*iF zA9%PPbV~6V=)nC#9U@yp{D%AChcq2hP5GBZZi001;Mx9#`%y%1oAPs>)$MbAJIC|p z`4;mW&$=L;^=IDiIoSE7uGnFjIBjQ7x=xxIMTiTdrVgE4+P>#3aSVaZcz z9<_qDsa%81Z+rE*Hi>)pu)hm^J$}1})uw6F3Ycwx*$UbXGJmGlG9A7Lec5er1YORB zJa0l>!5Q~AGY-c47N3s4>ScdvU%4ho#k9W~;Iq>4J9bp#*R1i2`5ydXS!btX`bJHc z#$X?Q^%Cy``ew^j$bO7&mydHi{|921-%mPPcKMH2kPpHuThHDKyX@QdfX@dnirD2V z9;k!dLVgi{hwbt!b>Oegoqggq^eb7kAHKZ^v>#(f#m~?#0B*>R{_<6!*{F6DxnjJm#yl+RJ zf1;2M&)v*tfEQy&KmN3SAF`t#H}O65V58X4OCFwzP5nDgxi%cwQY!=QrXZ*4b`fu{@)KTF5#B0wA<$1d#`XItV^ZyNCC`o+*LV(+*Rxwy#m{}ogF#`-41!$0sia)Pqs^rnEQ>fw}a~xut%BaVrRbYc|JtlKfY3OQ1B@nm#BFZZ_lk>+qL%WA{*3-+JNpLSC!6yBAv%rv zJeQ>t{gfD1>A}w~Kw0{TF47zCWetsfH$gvheR_WAMwH=sTJj9=n?X~a{oSd~&_2$7 z(C2ZVqLgXMPd#7oQRi4l{-`PcvtBPZr`HYu&aS5XqbpF)DU#T*$~(3Td9uEMSriE7|(j4_+b3ikT)G4jGqHJ)A7NX)Pdj_<#c=yjt`CmG$=WBmVfHI(_&DE=>A3#vA5} zeDT3mGJYxBOLOfjAU-I06ZLE#Z^Q@xG9BeQJ~(n4b-|1e@SXBjyw|y*8y-e{aNO`W zc6rkEH_fx{++R%Dk#0Q}eke&^-T2_coQns<2OmBo<$>`*@haemdgFudQ@8Y(^`Wbh&=c}A zW_;jV1NMGLWC3~aR^#r6WzC*(1##+FLCf>QJ8YTjcZ?P6dZMQo|5U7C?sIX!y^|$o zxZ-vtLo;TW^alIf8#8=}b2s`+xr0r`4Bxw*Ws3GIF3~ZArs+y||EC*6B4(I>CKj4x zj{my;L-FH~ zpFd`p(0p6nb?`_Xb%F7Vdfs)C&vpz`ok~xl&)~dH!}G2!>dt_`@%w)EyiUVv{~|f5 z=uWv`Q(%oY8iU#({zPTMxQFhDe7`Uj%H#Q2xkq(G?)tM%B@sJmdJ7GD@;&2-riZx< z-@HqW-H6p(njR_6pouw7&8G{uD_7dL+uxUh-n{9fKa#Al>3<~5b`>x87TI!_H3>~W z>ymGe?wK(}mUva)?{iSEF<$S;SMF&GaSqjCx9yYrDcTe|6TBinwt%7}~GHm~zUd89I8YK@-oy$0C*Y zyoR=822FPPVV0wPJ_}8V*ZbIB+?v|QaUAbzfwO5T?*PPnAA9`TkfY)KuPpxreq+9n zF4z4f`~Fm4?KsFe2>6&rK4?3jOJqWNk`-tV=L=C+bQXGJ);%C~t+cF1vM$;$%WPxk zDGm2nKpThMHd5O&>+U$L>&jfkOW(bgQMWOm?x?OiH=x~=M=x|8sE8lT~x z{!zXG$F;_om6}FfNMNlMXZqG-k5~wL`npkeJIXAS9np9?5SMZ+9f{{jpM)T*h_;tu zZ7)|kZPI3~GtU|Lrs+14go#u>B4>sSKQ*89+y2Dy$pW`y*d7j;zbVsZ9InD>Xe{%ct08s$DQO=rEd zGv4^*zCRJfH^(Hz8tQwjphebEVaxh&f&N>FSc7r-5c+Y8ia&nNd{?=OKTbUj9kIuq zWBztve=*u0brQDzt94d7#d=wNoXfX2&rqszBA@|#pYx$Jr@i;_n0_*M9LvY2o-l*n5(~dlD#v@8kR>63=ok z9P;_wh%;vW>;|@**cg6A+5Jy%0IkTQhIfOv-DCERlUx7UYf2`QBf~oS7Zg*sIadbzDzSeoSlzDuS1@5*iwPu5cLcZs3 zlv94T+$?GD>frORkZYc;C%Np01Ku`)cl^z%t6)DJ%I<&qEcF!aV-Aw<_2Fmbhkp93 zfxGo=ag&}zWj_44@`Tf@VCV2>{4T;zY5~(2u|l85-(r-lwrx_|OE_*_Iz!{pb}47; zO9+cSXrT$h=S>iP(gfl2CkQ`zg78x&2tRd#@C6fupEg1G3nmDE;RN9eCkQ`%g76nj z5dPu`!DBxZbbU2+yI7xz;aCG-9DL7mbm!^A$&FUH+)7Msv=Vp4FSM?xoA&wCV7Pjq zE-!pzU9|C68Dqz--<%P*>S=3Xz?Vz_o;KHbZQ}C(cj=DPoLeEn-iN1&+;-Pc&{7!QU2bh7RCv_@d2xr|K4M#@r11 z?uz1i?ia;cjQ%Fa#qTmMY{Ohl`B`hPO_QD1!+Zkq9_XyhKRCRmh&i%_`gs)X48-&D zW-xY2&gA?;@e^N;IY(tW&Abci_~9`>tzsOk=cm!+&Z3xe&+A6e9hEz7BT3AEn&;6DOcMUoZPUho%X&LX+ilJAW`4u!a9)7pyr zdbi?SFYiR&hD#PZmmbo>sZd;{85Yhsw6IQbqkUp>AY z>K9e0JOcYd$>QlEm1iq#(sc3sf4!c!Ko%dGlU){hE!0KGVmiKiRR&q_B@R7j+spXb z_nhZ@o@77sFZCbzB!3XI{!R8=QP;GeLVw}=LDZ4x72R=s$B22g!N#K6!NyNRFX1mr zt-a2?d)kx=JV)67h*ADh^2AtAt3$aT{$bH&*q)jz)2C*h-P|tz(}NFu&qGdx`cSKK z<7ksIKu%m_AmyBwIOUVw@~@fYQ`~X~cB(F`^WiRV%RRWKx#b?*7r5mP?hAF zz7zd3#9R;kq0;#$x5Fn6;ky*;lNHvG%7;EAd1=@#?#PAjTb@4(c?^kOVhmC_CVul^ zhUB5zv=23WLp^Pqb>KU>{=sMNi(3u*UafLX)1HEDuZC@}j#^ zW7g{r(ylRXVlS7%&vjYgmG!Mm`4Mm4fy5fLzcExYzZte%8QM0C=V3gHjh4zCI4=V4 zfQ=J0V;_o5^OP)oBe*e+IW&hs^K?z~0BPo$k)rPy_w4MYKc|df7sy##yYQRqafs)v zU0f%E4RDWIjp&Wq!@*p9G_e!BV*QtA8LQLp95MK*GWkJ$cPuKkPV!mZf0v$xxDYXo z(@$5TpLY3pju|}5T4S(0Lm0Olp3zVLCg-Dx%k8I2ndfIe)!H&ua+q>W_Wp;w-F}Lh zeCd9Qzz@6vyryo|x-?H-l^r+s7P&N|pMKJ6>XzG2GcE_5@jIk|-GnzHXp=9ZQs}_Ag zT1T`@igAWl{5tT+IEil@9?|_pSUY~LMIDKyv&Q0%&q?RX2V%$Z_?WabSSNz`IDQ*p zT|QoWexiH?<(|QJy^b+ga}ETV!_VP6j}$lr<<^@`}%ya#a!-Uo^I0uIAG3IUqU)|iJp?~w+pap1O zuVuXYj>sHvD4+0J#su1V;B4Cwx+@un`qwq=we}xmzyHG3X;=1?$=LXE*)y*51la$$ z6LY>&D^7caJuHk_|MzP0s(lLQn;c^>H;3J#A5f0@q1ff6{LQ-AbYQ$Z2l_Yy|H63> z_u0!jPl7hddA6zYd5qe;rx5?I~sdtEhW8kj_{alMSVrZjK^F!T=alV|a zuxi+La;+tE=p@=b6Yy`A#2kpC{?|L6fYKiU}&Xt`rj_|$tkps}N*J#rz z(bYEif6c3%Luf;c6a{_wo*!Tv(U&frY7UHiNxAjSRHOB`&rsIrchXx`9)0F-8!J=a zl=aS?%n8Yu!||-#ZHMuU~mMn zPEH6i3E_U5pFOPK=Z!H}K%DinyL8Or?DvMP-$WV`(0%B&h4{9B@dashc(A}rsoXzt z!bh)j-vab+hC%Q2?DXRkN+_hnR56h;*)<4LbdQZ99@fr0);xo2|_f?=TYV=1e zxdw9*H@_<1_@sP|*p>M$eABonx^#Q$gvMV7Jks|$#3tQF{#Cxo3;wWA2st=4hYW+i zHt>gYSnsa4dGh&36^~8^$ok+MF-!PV7YeXYhUs z`V3a`r-_kbwX$bwa#ptIY^wSpIPowCkA@tK0x1WCgI(1I> z6We0nP(SS7)Q{0D{WJ``!_<)+`pFyDZA4CDC+}1GugP}%y5CqHQTri(dLQ3uy>3KX zao>LH*`O^7ei?5J*x%pAp4gin|7=t}n8ER5x0^jR2km=$lq+#P3Q$wQVn&WYKL`PMa*S&n^a z*N?#FWUrx~v&q@u_`M$;Flq45zp};Npq+EK+s~E`)Q>=S;Cs@mIPRP+9pI@0vTTF@ zlei!F)chG`unny7$-8{Y3h!iHjAeLtHg^&l?WEoy?;4k{ozx4)J2mHA3*QDGV#^xw z_3Jj@(0P8FM}2>t^scpL0XA&F%GoT+NW+HV_h$)jYppWC&Ng5l@Zp^e*fI^f5U}$N z*d`zBe84Ug*gV*^$Sfu6Sej4zUCKaW1dJQvkMuix{w01E?&zVEU4f>rP`{J0N7GLKN}k1U!(Y8+)GN~O zW~h3nUozftuFHBdPeVP)!)u(y`dx{xx5KDcl2sn=`l!c0V;oIrpNM!ckMpF6+TT>P z*k12O*}$eR=FQ0Vj_Zz@dUtxMtsnRXMR<4+I(PQCeR_(qOxrzh&j#+Yv&NkVofcjF zx#V7PhspeNz_n20n#Mi>u7&4-OWV-T)cAE3eBRm0&#^hozZ6}JBhRj%^Hi*f`GJfh z;F0s$v&E%t`rVf`U5wk$7MGqYzx#m3#d)$nzK^T;{*2d7^ge>1yp3KTJ%D)v?L5YD zAz5MZTho&wl}ER5?0{e7w?&!DC@|h_Hr^HD9qpZQ2fr6X`;O7>us%$Cwtrt~j^*z+ zdb0UdpNwSeByT#N!p{m1^extv zk>5bwy1eLh_&Y0JiTM=j)me#B{kyo%I&cy9|DkRfZ3us71IKLGP#I$X*_h*%flvAo z>=zU~#ky|Tz%$E(rxAEIX5z8&+A$sFW6vYBT!!_WTkR#meAAFiou-d@sx92_WW1}< z@92a1&XiM?e#f|u?@W0)djR!2XU{+6uu#{VuirWQ`+c$^PG>(b-p$hW*k^p_?AymX zd;OgKG-UMCG03;3ZraVRU zZ|viYSAKe6)ucq};I+tQ)gabK?xt?q*JNK-at(gxp`VFw*@24&+X3@Afmv9WXI1b_ zr%|trZA+O8H;Zlf;Gho&E|Rjw%cwu~gP;G%z}AhjMpqC0Sq=TEhaO=6jrAJnnWgy) zgBRfQ@K=no5`(`o&EIVB2YLeeTd4V)5B|VMAb;RHgFnbCgFnbSgTK05`Ag8|z-N$N z`^K=0SQzzqpE~AyKYzoCF%d^VZk(eGAP(UA6Z=!vrL;|#N1|9;Q@LQ~G~<{j7a-5~ z0_rfnE|mGC#vQYkK4RdOTqOFWOxMFX=yxB~_41`2+Q++c^q;`uT@24PCV&39cTntr zSRZ>|kYh?&^;l0|%`pRKt+`Ly6WaiPG4PilW+}m(j&?(TgZ;=dzq4bQh%RUTin5Uy z2ES?7_V21>1%5|mt%te481U5u_?g4n&)92a?>jnudgJknkgMd!pcnLowb$NbU9oh> zq=Woj7cE*0Ip;+xU#^WuFP*_L$$7?}eeA{f(k+Snuw_l!hOi)^{^sq&(!_BKcSqyj zi}-g8|K7&CFv^GU`$_dLRD-e()GNln-MZYU!*a2I`nHA4S#o{?{obPXvi!ydM-Q=Q z4SgKd>-<~v*|06p139;hT;eeD4re5`hHu0=9`ge9r(9p+GsizZ=jmt8efcc+Az*HK zT0a-4_jxCPdrQnZa5-^0?P4zJ;>;UGoh-C3{;G#w)YEvkWv}xa?_{adXxE{9V%8#= z3z{@(+|>D@UC5jAydB2$Jj6VV56rSjD6`imRL(Jq@mJZ9eEWcPyfNO33lZaeTg5#u zo`_jry~~F)4}OO77Fj47BVYE*P0<(<{tX%@VV_jJukP|Jbv>wwC>3Lpjq@FBHt8aehd8Tee=jMGM|f)>mGuwAYG)=Mti4KUI46()^h9chht` z^bO3dN4Zu--+(ogm+gKrD7KL z8nbSk%>HBfUbUVP#dwydW` z>F`hOyLJM6WvEE=@^;MH=lveM-uoqX<=!_O)$zqqd+iW$&@se8#}Nme0Ies$$8ONR zTaDcpoaAqJ?EX=qckITqXY9V&NcNyE@cq>yn6$E@qjSV{Uy>E4tA(y=QuE;h@|xOfD*VDD)ff!^ACiGqCn zA1GhXxcIL){+l=%7jK!E3_d>R++;9!kr6K%GMLQx%%lx*cmC+aXj^dqxzVP+;pB`1 zj-KW#pP*wQ*z>WNRknkCz+bdPFwo#{qmS0&=Tz|8;D!VlHuK#%Md$ncj+KDD5y&PPw3j~+dC0nTXH7)&GcJ&c{3QpWza`|jyw(MtMSoSW6~$M9G#LljOZy4iPhZ^(tT#nzo-&md@+lU%J_bg#~ zf_W9ceyZ_vn{6kA)3_G-#!tKaYCV3IyY2oT-e2m(W-)8FIZrqI688FGtkmPNruqNe z<&L3$@y^)u*e4zv=ly-!ULQq2Ju3Z)bp$6LsqeF$Kt7Upb8$S8wO0NGUgj9-U+p}k zyhl0LQWqwnyLe~kEF+j-(O=m)$g;D{H=b8IWPalA$uRSYp1r!@V+4Ma`*dq5TeY`# zKEL0^J7;h<0q1D&SLx4n?eq23HU)J{(|MSRyO!FVJ+eW*>zvh*GPVV}}SvlFu1Nb;#W10Mwy^*Dze%+3b zzq0iPf13fL=4PheoAXeopHq!$9va$*v#9%V7WDwmq8`Lq)KQ#8J+!qVba?BU(2Lrh z_T${)KAf987_(-{zM&CyzHYysckjoUyo2g@=pfcf_wjr`$_`+@Uds78zM+G?%z21M zby?n&3c~T;BI5GZxr%j=kA6s<50pAHR9WbIklmAUE7gs^djsoXT#Zk=?4h`I$@k>j zBGWL=s&-3w#-2VJb#dliaO}pJz!&vcaRP9o@auB+1v2P{4EmC5L>3*38gZAz#!wqz z+8~b(oO^A}q*-BZjqX94GG;@ot9E!!-BZDM{P{TYIvVm~;1+HKhTcTsl~xuJact^y5Ln8aKh zaJxav9v@sG;D~z^xIh(3Keat_Cuv-Bf8^i2^2y zHmcCyh$BMCYldQwFYdz^U3m@gvE)WPySjoLZKz83>jBiKu9RzCiJ)!-b;_YD5wwG` zB{Z7&XXvYpQ-+m2+D`fz(jAF6({b$SFky**H;oxYw*9X0!UHe_E0-r3i)bYF)76NY?dp})fD z>sk0c8}x?J*RaW{1%NM0qFnX$lv9AGe-(R-SyPT@@)DMF)tZ-K@WQyyr;jXyOkiuk z@n`^!s|}qV0uItGErcY23vqkMXx{<9LpMKRqV=%5;uFdrM`E z*eI%nM;F1!$+xq+u6m<+>ST0osY-UoGf)ei zuXh|<3%_uWRj_rVb!zKQ>oj;ejK6Q|G5sX;;3RbaZOkD~LNDIN?^DSN>!dr5$#)1& zy7IP8!-u@BWiq7XZJki^wvMCj@#Gro#8&*>iod43(bfR)$6YyFuYs0h$lbjLoX1@` z<9Q>VopB5>z?F-f?KXntJ83A>Hm;iN*v3XV|1+xQn4yEp--ixrTj^#l5OliZfTQ~# z`H_xSJG5Nez_$|%p?(|qVXQC!osL6?5DSLljAbJSth|`DYk`j6c#j2R3G@9VyuZYF zpYXj8#jHP*cnt9i>tmeH+eNu+JEc!@#$qWe<=B@u3_RL)!;d*KSYtIp4_aV1qoBJH zbhp@X0P4h`Uk72=^(e=Db(iEMRLm#-Btv$Y^8Uz!Mq9OLt4_<;k!wJmCZkRab!u{` zGuNntao4Ky*8wm4Rm>OahK%;>oNXch!XA!-jst2Qv;A58K8QG7o)O2_t2y;{#_4r@ z2U+e{=jzgF-YJ50hZxp2YG4mh=x!Bs{HQU%KB)1&jF^n$1irZ#N)V6T-WTwUcf|$` z_&%dGYQWmG;roms>IC5b6zhGV1Mu5n9m^VLD>2U~wGP>Ru40`JPlG-m3eb1a7bo6X zW9(Zdew^p9<2d_Ucvy##y&Lddmc-~PuZ1|l&c&$pGt9r@K7B;4FI0!Vs3Y&5HEDBB z=FC~#d*vYe-Qaa0^f9V`%XtXgllHE*mx8!A4>SXCTqi7K9mo^ojXdWYIHLH?c`U|e z;K$k_@nt<_S)C(B>i{=^l6P%3%!Z~u8uZH9QeK3{wB=e zO)Ccmrz{(YPsRKPc|OmYS1IoPQ~gq|`?efyx3yu6r@o+X%B20ZkPGIx#I50FzXD+S zeNW6KQpdBxA!o&Rh$Eso^krDDgHqO~(3ep~$K<{8T#5Y?h*Kbcz1H$DzZveV4V5Rj zANhORl`THZ`^k9!pRDn~Mn_p*osKgnKzvW4U*o_>JJahx58sZyg#B5EkdHcKlrKd- z>JZ+wpiH+t!o72+AQ#TP_fl6m_peU>?mGs4_;}>r&<^O3+?Im*?RO|kTh8d`7;y8x zLAzbMjdr$+ens1V@}|mj+54_#uf*!|1Kf9g81*0i0orL({^BZr?~mU%J&19*5bti2 zzQcDg_`M3q0(183TS@;Hz6gES^{P{U!?U>}cjAd){D@iq>m}09=j!wwvKIz=PW?WG zb@LhEzesSa`SWV$J3 zxjy!CH~yvHhfh^HBHytwWhkSK>5c>kmIB%ae@ct zO-8i7*K7NzN12@yU#-XgdfLFPKRBMt-j-g~U*Fpkvqt7-=W&L!=LkB1F*cA6=9h-f zk)8pUo+$_uWf3>p#{EsAcLDujvS z%2;$1e#;rp^nRbC@J|b+{k7;5_;lN+ao?JX8OGZ0llKuV$I~%u+bWw6)i)PEPF(aa zzStw6Kk`Zyp6}z{h;7qNJkS-~y>PMY!(#bf%n9+g8#=;ywIe%iyMVpy2e!UaE|7

t{FC))eZV%8r#&i9aW8T$j{s1>t*O>+Mne;`9k+f*aQear!!^)EgC zeRvUUY7g`n?RYNxeqTcgl|b=&NX(v6;PAXqP`mS>c@%bD*sS zz=!$hAKxx=QZcT~*ERptTb?VRELQvZMcf+(KE@JuTbhSIeA(@nKfHtW419i>F{eWO zm|KVTYMIr7F4*?gXUCvRbRTlsV%xHcXA9Tc_6)hIIWNZJY_=Ovf38tq&3`9U|3cFT zM<5%HXTj~eI$_V9nQs+c0qrB`Qyt$vumQiF_#L`kt9X5Y_wLpuF~0#H%n^-nEaKdW zcPL>lE$5i5E<7ul0rFuuTW|u-56mtjpAgRFzL3biFOl zyZW$Yg-;)jf(PEqmwnz7aIO@*;_iu4FR8z8T?w3R@FP)uCnkR{RO?q5=iyrhXCiNJ z+_RAg!M7Jo`jUN4&bN;1A9v?dKhXwtZWeym>fZ~M%@v5A!UqJ+n`s9^BZo_ZhMI+BThLJMBZHMoj9kaGPMO(o02>Tg2usvpdZYk;wY5gCG zSw&66qi{yg82INP2elo#xC=4SF4hOWo6sk_KvRKTZq$7?;GL%R(jV|0aG>tzlF%(j zE`E9A-O=Q7oLilPGidIeO~Yu9zLTE}__u~|st-#g-b9~Op}Yz>*zXF~ZKE)`)@=ha8&0kf`BZVe zoVe_Ja*z*+NtrY#8>x?dr7G&Q;!odxEsC4~6jCvCDGF zn|!}R>FLllc*p%hVsDW7Fw3jcpScP&bKLAhU#mHaW0ONyg9nby+hB*>qoHkeXc~Cf zhIh=H=(hiWX9qbJ(Eo}LqfS+)Z|8X_8-FeInR!%x+rHNBlj`)%U-jt)=IbImyIs2t z&iS`NXVCWVKb4s`30PL( z&#|(5$f3k|mv6ok+^$^~+^g;KUY3C;?8z;`o*d#9-=%2CdrSDf5;2*#{0S+SwJ3>& z)ps=jvkT(^*UuOeZ(8D41eYVRPms6h`-L^MBXVb)XNRQIz-+I%)9|bQ}cu#$fx-iS$B=6cEwfS^e z^R~Iw)#ZENAP&~APA`{z2?_XKwhz4&{Q8}oje;&R{wmNqsLr;E9Dn+zU&eUmoO?@P zECIiAO9FQ`736)1`{cBb*`;%}1Lj^R&KpKb)pwxPejmC27JCbd82gIPS8ENwKiA{O z^nN7&K0L@Uc5Nb*#(tIJNHh=Yuju2-Ne@Au#gG^8OJj^(jPhdgPMmh^lYtBR0s5|# zIa_Y9a;|7Ryx_kE@~g4uOj+O$XnEBGo^uZ84u`#^)`$6wanZS>0A;j;di1Y-H^cm0 zC{y-@v+#LS7vlNDm_sk*eGL4|caQ~QDyxj|e6YnqunE9tq1W8=w*`CMh9gnTTN`DL zHyd_o-~SLsA8>y*{g2$gfc_`#TXa0loMBl1<~orhQ{wB!Kh%xYwNKf&wL;_=gPzo& ze^rdM5of$NBHpjSS+hCm*8o$S+=y>Se;#wy?eJNpQl}RB#aK2X^ua$u234q2vnqUQ zBjBUqYU@|x){ObU&G;%BZwCBE`9@G=aL%Lw;EfO$Ve!2@;^O>fHgJ@oEE3QA^Z=gA z2S19tFV?7gE`X;5d`$%`_c2kvePYYoQ>XB581P}(rG?+K(QcV(TRt64Xx$irZpeMc zImmjuwl&InyO!^EO%rWGXtH(PkafM5HFdBabUF7f;5WzcTJT(}W!(rK8Wm46KCA{z zW4y9>KKo};7<=C!W6B!1R@X&OZN&T9@G>oH;3uwlWlZ4lE*5Ww{MZMjnCJ7Ig?E&D z1!TPjd6iPY>PkprHkAw#>U<=@I=1U|NFoi0|t1php$ZqiNu+GJigGp19%`WC6XyJLu76 zqDLAR-ic0@1Fwu{S1-e!l9?gu#q1>Y0elWNdwAT1cf4bBOr06a52LLC857|5Nf&sg z9?N>-*!jor9>x9xoeO_4KW1%uz{X|EF{K}C|S>d_cLiQ9HWg#O+&N|!|$rzWm$$jheD|R`3yZt*n z));Hkken$xTmxOS2E)PY5?RI_87FzJk>e!Bokp}R-@d^eX0(gd=vRw)`I~&onUQhE zeZq6D4IfgFrCrY*ALLidLB5&b^Vbfnz!5k5a4Z^(cRu^wt9^eP+G`^o+~xUPP;8W~ z9^}OJkT%fL!TJ(^rXK#$L~uB5r+zXys9un+p>Jx@rt~r8z`nrWTHQB%&ip>4yKh7I zjt@#d%Qqbn+jby6?&cb`yY`d5U)HQ4KgS2?eIP+Jk&d8#6WL{H8+AHJv)wM_|9G}G z$HW8r4IHi6aQNwd5B28ppuWqdH%_0Y(+`|wy;VW={QQYe$U*-D^*EiL@b^J8Y$2V# zD`z@0^_lw3IhN9A^}awq^Do~Q>gPhXlhs$`_%4V3`kRcb-k_L~Ipn{Ft{v zf76f4`U&mVI$j&kyP~_?I&`SfI`l$3FZ4aT4S&qxvk&17bIAe3E{d+5yqhoe6zK$y zJP&J@bDs~(nfsP?7cI-Bl2g?&q|;`WoY(~W(i3N)eKSVMHO}$$A$(1OI+2_yx|EB=Wr5> z2h{WFuVX9VMbAC{EBigju7B|8ROT4^Us+?{vHE?}E{w(Kd&)!Q(9;i`Yrp&DB(^h# z90P4j#dv2G1CGV7*7E{G&-=6Sn**L=1JB&E!L#XcC4cBpvAvh6I{o$!#>5pcrb31t z@Ue(Le)f|1So)lM0{6%kskOQ9VC|!0eb88+O<(OcR4kI-!1mPd(^rn=OUJ^;7z+90 z0^$KZvL;OXM?Xd8-6P+6V;-d2UUN@YAit)+V>V&hwY@2t-+mc*?U?D88cPN0zhN(9 z>LL5t_1W*)*b*?VtjJL($MEy%McRKeKRSk=PxHJ0$85vT|L42o>R1+EscqgE+fvCK zd2xI-b)UM*I3{Mb2hPFA({u3Dq1PRY@mqX9brJh3@V&hB{S(n=>TYta!~)!(RAB5? zLTnY|x?h`p_64~4ZEQW({Kv}^X-90{pcUU*3CvXq@9y1tjt+oMxqCwX-h(-PDdM(` zSlf{p<1O)Xn>PP=Ao2{y_y2g1@2b-$pCBB^B*q~gdiC8Q*<@X=?k~3Q>1fmWG0Lb+ z%f5`VLq4+%x#S4ikvu)tD{#(LV(dly8?)}bi#c6gr;zeQ*&QBQbgX#(Xh}VxXj%6< z=XqXQ)*YD$Et&oJ)>~QY`|Jp@cAM14U);^A*0~XX#+|tSzn(jrxZWQpkRCf8%O+Ek z59r3Tx$ctTB=I!Ig!D#=i>rqE?%>R>5$|_g*Alcw<6Zk%L z=aio>(Wf!>`t1;PnD^ws<}g?N&$n!y&UVJbZo`>70>86oBTHL4XEYmowz}c#U{C)c zdoi6cJoVi-Rr!BDh&fINf9v^}%vb3Huvhw^M}Ks?e*K|Lb$&?l4@R!YE|;9DF8Ab7 zbFn`aN4>#)_u1npz4ilJ<=Hpp#bnP2p3iO!Mc>4%rk6bYk3DDi*w45+GDd8z_)W_l zd2JXQGWvgv@qoUfI{nJS6OCaU-wWActm?pc#=N)WwJ1+n@4;W_Exr+uzMuH(ux%%P zmF%74dv89_)X@N5iIet@exhzTxypWztic#&)}Y$HE5eYUG9C7-}wrzw0rO~qMxj5$F8E& z_WSsS*w>IHr<2V$vAsnzWeuHvrof#~r{_$-?xY{=JZ#py8)9sZ_tZs|PyDwd+2RPl zUk)0(>|7pr$a!oQJQIkSfZNRTJms+s(;i)&^vr*3J<@*g!L0RNdv~VWvOS9 z9(nDsmBIVRNQ6)ony%0Tj?Pj6hBlJ(yIX!mW#WId(63fHB@tjcK2TZ@{Y0u;#K$gi0_&eqQN(?`A z3CnCBg|T8*Brkp1eSeDk;W(yZ-<>mts9b^TLybJ)Pad8KO~jql{t-fddWFejr6k9mlSGYi-Utj<5V(^i$9p+-+m|DSzKV{xKC_$-dE?$4Rzr`!A0^x&7?* zJsTNore*!ooe!qvEE)CY{LTk|c!}-nlu!C$6UHFWlX_>O^TF}wys3a(PRg6h8A~5r z`FZRlC}v_@=Z%++pUE{|ideYMNz-BXpIB>jW7$JCI&2>pNys;eIA)J&S3W$RF%r1!yz7Icg?$FS zlXY`7Cpq!hq6#^~#BtJzv5~_@On2gl4O^XhY6Wmb?0yTJ_qk()hX&CfjLB#(0bW+w zbPykXFmZCNGG^VjBFN|a`19B{ue#M?g>KKFf8R_>Y zzRcg)D=FuY)mrI`8%Ud;YwkN+TI@Et4uEr+eM2dk^DW7WFCfnj{rAP!KN0&iba^q#Wz1CL#CNA_d5pm4_OlMg5$C;H z`~1nfN+w612TdbNw^Hv;NIs>GPEKfC)bg{ktcN~Ge-^WTvnhxczx|Y3zw!&V_vKvM zhP@-_E%v_r<+1EtY}&OSSGOoTC*N@JE#jbEG6vUq5Qz`ihDQ#jJ-B!?>;W{&eh2zh z$dfiIu>)iuk@ysUslP#a2h=HtjdI+Dy)M6!^)W8QVN0;%f4>A}H}O5j9=@MLyH>ED z^x9W2t;1TU<$K;L-|`P??W+`LlcSeC1iE;(F^YAf0{o@jMN!5(uz3EN`}C?D8%RAO zch=BO0XL-ACx*1`4XHWJ&*i&5`n|xxj^!`xn0o}GJiAjKH%qz_}*A2vw!0}-Y4HA z9>|q=jzF#&=S@5lKLi;Rh(4h0>h!l&1g^CO`zZKjjfsXg1no3t{rrS;TvHy-;wk8IByym zfqtp7f9D;XasF1iby9NuIwn8lp+9(h$!Ht8Kz*kSY&+vTG1g<-x`MO8Mb{| zb^7oQ@W=0(leZ<==HkA7%FwT2%vaDqB^ZTd!?Qf8%Xudi?{L<8kAFCwGA8fn%LOv-Fi(3GeAylF<=F3my^8tj{i~0= z^$6K6}Cj6cMu?5@cqNEP2LN%g)~*Ck6bPL zTh_vFma03KP&VD(^MbN%3hwZ`&c2uCe;U~IC}JSB-Xif2dFI?iZ zBYk1|Bha>4``L2a-x~TT{6p_HLk7G9DK-q78q-H*nQL(_B5k?44txGK^$2$!AhvVM zH}j4fv`M+&ByGY68}C`~S*eFO5q~-6DEm#VS%H2lr>s;g|4K+~K6MAj{W$k#0MBOF zv*?GK6C9PjASFD*fwM4#lUS(~^rA3BuIBvjTy-3DKz~o5FR9CM{X4F8AAFv^;lHPj ze|t%$j(>YjrjCF6^4xX&TkmG{#VIpf3ydwa4C-*lYrR)}Pl1T7w!dHU^zsM|@iP7`Dgr zIC0sZI^MpH2y-sTA1{)aZ%m!cVpEWvij#K2=G8t9Sw|TYmm6b?ed_UA=8=r^xn@FH z!!{+($5`2idE|X)D>Cl*JPvL@UaWy27EN=1%Q@p74x~Fr+yU~HeogJ3Hc>w}@{Bq! zuKe-WB^GCYfX|0j**ADcw&A0{yTXpwvFA6Jxva;pl1}#3&@-H$;0%Zvw}Y>2ahg51 zV(c`67z}+N>wp+z=Chxw(_asXJuxob$$05sd2bQp2*$(`7Xjua)Qj8mJk;e~sX8xp z<0{a`x}Z`%Zy0~Vc7`C2&5+Xo;yerT;JsMr`-4x(91^lpx^VC@%GRBy z{|oO~)bE~4syff{4rhMf#E2&m-|M*@bY(a28#%*;ucMx{ow$d4y3V{1vu?P=mHEPV zT$x}0F5B?P%apszXP}P=wqrTB`^&Xscg(8Q`OZ=F^C9TVVf4u;@`GGY97T>!_BSJ! zz&zxr-tX$ZM}Cs=vi+?eH8=Y4(^6O7$$G>nV|nyZi}>4}*5T^(kFRuL(nnz@oS*Y< z%GHEXbAo4SN2APv>X@AOvDO2o&VXr0*^tJ22zuEFKU`m(euwJ{hge>n{+h%xs3+|! z+$VXTvpiR){x`m3HE9p}e;78$J8JE6e8&oR=%GAj&3_AjN2}8Z?xS9TUatG$`DJkh9LAJ?||?6XcRr`HXD2mSt|9jNEP zNc-$x#N3Px3eW+=>Ln{Br!O|8_ki;^bS9ROe-V4CTB&jksZYNNe3EN|{>e8SSdTdAJMm7- z^S}yQ=K3AwYS&x9cd%;EWYxYP;wpd)A2npC<+S21B}2K-T-(FEN7x4NFLnFq zmQ{R)u2P=*yV8dy+c4Fs6?0%;tfOiA`yDpDwtq*TBB%R1$i>e~+H~MI@1ND}&h?Jl z!Fd4hxW7i$Md{DlTz>}pEk#V|?jy~&^Ua_EYXh&oBk-;dV@?)pATqCvfIq~tUuFJ- zIVxix!p|P_j1}gX=#H%!V$zQm-=fC*h}P2qb*J#WCbn(D$op(D%@}Rl z`6j#Hz&~?7x6!AJi8JT<-}eLNf8P(7|9yV~^S@``Kl49VwjRBc*lUfR$76nO=m}z{ zKj%7|n&am_chA6&c+?-0-Ias>W#A!g&}o^+=om43Y&QnK!}M8Fy{^%`%lII zJio%cvz*Fl7|dGVjq5UORnGwuv{U$l*}zGEfU)tPIBuCaa^%H@ zZjRT^x(wpc!?a!0M|>~y0KF&dW6YZ}-;Obzd#FA(2p=eWQSiG7K2XEWZUtN}`%rS} z=gY^n^NIC$a$J1l%a-wqDO>oX|4Vyu=2ZA?%GRD&y{P4>=S#ECKu#QsAkQ;z;(JPS zAx}N8nsW){so{R@a*rOE@%gumC=F+-)&C`H;uXHsu zu5L|C&g1K^0?gF^t&rsXNdH_Fp;io_hb}3Y62=sCmSWP?^vO zIMU6vmQ9Vg6CZV%CzQYUsK02-ork5W2Kl^6uYYa2@5g$d>(5`e;i^;1*p|%IY~0LA zvy5>Q%Rpy6;2FaYEUIw7$1`|MHT3iw4*+IJuR+=TAJS`3c>k}D!L}LSZ$S*X#cj9p zCFmOFP$A}J*aqi_Y~v8xaOR1sjjw!}ZQvch<#32=&FVW0$LFAqp7TAp6yH2QWynIw zZdo(CzHk0KDt-lY z)c}72_>DR8m#2X)`qa&MXX_<-xth8pcYdJX@NT(F)6x}$1s*Bmybv)p=gCkJ*y`XN)z(s$+acZ;1^P<{geu8r?fvZk^;s|92d{rppx@whEKYj2) zl$mr-_t9<4v7-Wu`pz7ix(2#8E4trY4_#m$&9*^J`zLPGHW)SD*|af-Li?O$@T}*R zpO737e2>g!@eLU9L7>-|Uq{J*l=DOGu@{|8{jo8>u6QX4T@u}<4xleM$D7#vy5<42 zA-O~J>oj{#N?dw=y_xc?PVarw_m1|W>+LU#Z_mjn-zvZ_6tNjO0 zJWV*?`3=^<5KkQaeWx)>EOZ613?yuTT|Zs z@Mdi3#&W}+J*SA(kXK}kKZG{7C>~PJX+K<#zOI*bhtwZFi2kbw9DHMmx)UMwhe?m@ zb$kBxJLp&pc4ARZgwJJ(Zr1fYVvC{-v%)4nSZa6>}R&+n+WeG~CY=$l=(410B;pY#ne z>niTo@xnqk&z6=f`Jtuf5{tjD`oXosgtkNH8#w5P5!lHrJ)ZD4_9r1<>)h=jdt=Zs=rd= zPOfVolKt-}j{q0nRhcr;z9hnL7UE3CYP=7U4Sb*@n|k0`o#Y(Dkd4V7>GaCs^yPpb zAuq|b5=XGF1;*v~&{ceo_U$tY{9P{d8|>k5pU+CZdTQ0y@*CpNKgmJDPv|`mW87Vs#W$gy zxPA91&&ME^;5rz;FCAje7`*D-{tJ)OKLCC}^bRyKmXh}>=RN=$i)|UGG43zkAiT)T zu4nX9b^58d1Rw5d;9ubLo&f;OPMqP=@5zCoUR#oVLV4+XCG@=y)H`!Mz@bg82mA%+ zx2#jle&%ns51lKreHq63>~T*vde|n%VDt&(x7?!#Iq>6O-$$NoBKf@YIi`8!PC5f} z)&1|)7@~956B*Al=o`+=U5}5?9Xm4cAx1;~`kDI}&vK4~II@F%jk3D};&ZGC9KAhI z9y*5e`GcUo<37G@@yPi5owDfY|Jc5B`OT0ebYU}We6w-phG!7ss{ghRvj6OJH-O{* zVea)wxG?)y!Ji~_4wZZ1x&AJDUFa{f+PSMwLQ|GK;t^v`V(tx}i+0A}8}9O*p|iA6 z&Mn}N+UWN%hk;&>u~%vgT((~X9(&)>eOdV)15bcmW?xfs^R>GnLvMhEThYK}19SE|N1$Y@`6`b!T3mN_ju zKf9kgqVlhQx0Uuxn`B!$KP&!Ty?<;P$`7Ev&d*w>geH#XY`;-*j{9_MwNK|q_M!dN zZW|Bt9L?&0-0bBxTy=V6y@{7`9G@j_K|7$Yo;)FLYg@#aNz<=#rhhkw{OP=`jP2li zzs}3Tzy0%rq!l=rcO{Pfz~RfgK1vwAW8QVYn|FQwe(by1Mp`s)N*22m-@xbQTGJ!X z;yFvM^~dXN*y{A3B#94WJYyok$5>M5SryN0?~C%DvXps|>W`5-_)Hq9|8Ac3=l9ug zz<)LIBMx96$(c(&QeNK76pJm^R;2Y;KkC5|=@Y4zOH~4z;5p5qi zY*>>eshfbPe|SO%N?h#&UoS$ z*beuFjB^)o>PO_oI780)n^)I^<7}rbX$SUV%>QWjoKMPM+HK|?x$p^)r#jb)`!z@_ z#tQzWt%7bf|I4;-%iX8z(GA)OV^r+rAKF@KZP{934R2ke&Nsq`Nt~*DXzFV1-y_gr z?hloB)#*1xUoq}lG8S&MwpXVgUO*lG0?NMdMH$aDY>Ind@%~Fc0NoKC>qbDkeb#di ze%pQ)aDT*e_1+lQ+^6UAlwgdeV_f;>Go|vX*x29)1=-CB&9@X@00X@T@XB+4l0X=W! zNY6xMRpXPH%Kaj4t4=?_{k^pll-V0O(s&j!dw}bE6P4L{q-V=rHa(c%)sKX%Wzel$ z`|_RhC#TQ9Y}56g(c}8lsGchw#a!tX#9~L$me@Y@`W40~uxI>z>|y!`z9XM*9KZho z_!i!su?ux~*>$VapX2)CF4WzHJn@&^^84Sx?_q7n!22L$!eRK9ZLpP*Bzz6xxenwP zyJ2U2Tj5K5@EZc)`3?C-z_$Rt4Y-bCzEyyF##;X8_&pWc>e1@-7tX*>a<9Mm5B#ML zMuE3Y+b#3Qjj-DmewPz^kNTc> zd7l%0_%`qRZ>s-?N{d zZr}U8zGol*2_OGSAHRuFZ~f$E-*b!iIdQ=Iob2#DN4(F8eZJ@Y-sj|e-*cn)IdRnc zoUHRbSNWc6ea}AmCu@A~W4`Cr-si+_?{l);_Z;>>#rOQS@A;JXIa%g=o@GB{ z>S8rCv~1{TX;|O%nbwAu){dqPt$65a>F;Q5Xzy(AYj5gk|6i>=4b4p*9lZv8`}(Fk zTN|3Y`aAm^9Cx<%HK_8=ruD5ZZnwOxwW+1G$8PhMl{H;mpXu*jxncdFrn(SY_5S2W4_4hQlHmqy!XtmmVZ(PW-u665rTS04ccYoc6?pAAUQ*SHT$=u9{3i7c4J`lUvSkge1I?}7eGPq0Yk>^^n|tl2?^qnRtZRA~U(>%hysin2 zw1k^_dqGrtS7*5Kn%-Z#0C4keY3=*HuAa}#TiMzJf_vw+^sl|HyQ!n8x%Il<*3Q1x z>zdo<{Z>~;|N2(G>+b4o>6^C-SbFC*cl7tQwa=^V>H6K)=Dyx}t2!a`rk<90DD7$K zZtCgVFz?Q;t~)zg=dSH(ZTd`iQ_H-bk1vSK>+NZt*Von6(K~N_Q!|jR@1~G?=UsQ5 z{(p1V`t@C%-nZASUr)YT+M6LA%A)S3`nm>mHlQSt(8k_8XA^2IQ@H_@O5WrKmPVXA;?r1zi)~)tm{$c1K7Ui zbtvoX>YRIbdrx0~Q%AV3t-td#D7$&pEz82!baV`;|JdYOZV`!YAq!URs>+(>8rlYI z|2PDP|6Mab0wjyUA2zAZl|L3V%L>m{Z&)TEb1tx&dYao-LM6awZ}{pZ;m-CB>zZEH zw5+>P-qo{sG3=EJ=R7y8pdEBTOw>>$XxNj0uWM@!ukG(_K_7Kfdt1U#-aZskM8V7hc!XwLW}J z)VgJ5rL;y`Z&`UWUae^AgukHy-m-EH(o@udsUj^+1*H9Prtl_Jg`kKu8 z2G}htm$fzZG&RE^tt6IPR^HOTeyucz-?|~xt%8*(@79a*Ti4R$*v1OzsFt<0s_y29 zT?3j05`VkBugxu`jdTijDevrUzq7NorKYR%PX1eLwKetD_Oz~R9{^x)|5}COW(a0^ zXG<#z@qT6hI`zKUpqkhmE_#=DDjF7BJx!f=w%)qVc|}xUl4Mv;{iS^xJA9vTb#qrw zb?XKKVJzut#$OIFtOLiW7+(z2(l9-(9j$PYR#Quheiy{!@=mrI%===iyQ#13rh&dz z2&AhM?erUx`K_joemc~S*3LWo+ANzV&0<%#D7h)Gx-N$w6AvY9<03yIvo848&OVG= zE2y_E)Hd?HUTIn7hQ3y@nYHkhc3rn$A*c0CB21UBNtfj9=;xL0FQoPRSPBuuP!87y59*qle41%vw8}yJ&*YkJfIEGq*N3_xJRmxRoQgz%Twi5UzjPG8Szj z`Jh9>39T=#0@?CLZ`_3+Moivs8ffqB>s=~*5@Az6T$0wK=B{qBUFCBq zKT2b<=A&{$72x_nJxfiUp$?%(KGoVQgZkpGbsWAIw|7>x_lRJi(e1rA-38xV*QGfl zFCAUK*V@wz4OV5~P2z@SwH^Jv{HJVwG4=aq4EXG(#dLX#QNWmIaWAm55V*Q~x*$Vc zWjVr_#l0fUIu3CF=z#B2_?BZ70f`JXbh&uSfR`GldM&I`OQpWup1iY(Q*Rtv+ga7n2b+aU20z=NrPI*a)zaF)>DiL@H36mQ`b^N^!olT(q6Lng8am+0O@5(0%q5gt zFJ}x@7M61UM5i^i_w`C~g)Vm$nGopSGEsz&Uw;mwJ#QpY{U)M-=aG<{_4ho|a4zb9 zUdb~1=>20ombK=yn4z>GN7b#&`P_}g6{B*ZG@_3w6S{F>MOi}wCgw;C4J=;FmfxdR z?S5}%u-MSo^&X>jUBcMhDO)68GUruP7z2vbK6eo-|7GCy%Geghxi@rvJ8O)g?iVE} zTU750y>Ye7kb6VS)+QM}e`zWusy!&);yp7iga+@q;2CaY521c>dIdUk=={FyOdSos z&sFYYDz@=V7Z4-9Z%krv%?H#3jq-FBh|dwDt7&A^KVNHZYf!W3CCl5}m*an&(b@CT zyCcgn1I4pUU0E)3(RLz<8VK*!@1tHgY3#j^YYa2y0RLWwOyi8_Wno|2@0kPEGoJU{ z31`ft#t)l5_TN1+^!3pP`jK@$ji5_uygT~jpdT_6od3}JgKo?1nLv)t%`U)1ctX!3)2Pz*I= zR6keqMYj*K-zndj?{(^dh$Zmtoq0a85Jb=2d7o+BF!L9Yk@!Fz&%X~6WnA0e{F&B1 zD9tY~z4Jj|pZC6gKjg{Ir>AWHC0P_VmsC1!nm^==1a5=io^l@kZ`UY$& zUC*7sGqK8mb%B}gPV?5jndY;*XK|*2Q`<%XWAB60o9UK(dclp$?vVd*NkaZNsMjLa ze0EGA?v=Ba>vf3bSf>~p9(&doTyO3wTkz}4R&mQGH%G>>@2{h^=O#bQ^$V7*GB>n2 za4Ha8ycpw^Z1`ca^Z?(fydGRng3oq;cKUZa(5^F20uvg0UUqaW0f zjE1KE0hG72_cTCb!%LQg@w2yKZUs*>fdS)Px$o6HymQ*9!U2QMR&ItRu3o!75%LVo zI=t`~UegLiH0(Uy#wtSzFB~tAy@WqKw<(NMLvfyniQ^d29pQ3=j0(U`o7=QFY!VaZ ziJkDL^&a%a;ZAhu-K}@r7l&PVSyK*V|pxytA)e#5m&-L5$e4a%3lx&y1iEY2{ z&y0!ftp(9)k1s8cT1p*T7>>uo_5&7S1J9iK>d$TO?6?kRKX9%Ms;SJXL80chWL>Uz zM;kBxd&tRj-O5L))$E4rcpea2z$v!tDYk&}kCXpZoo(XgTj+h(i_%*Pw!5zN zj^kJB;ISI;q<<-G6Zx62*G~Xecfs6>TgB6@6h}0H`U}Q^b!p~qejIUa&_s*=TFb#Uo8bjF@m1s=z46MZdQ=~!~;>*{l4G`2Kwj!N7Kh7Wzf zKzAPGGT#~NIckzdn?DF3!#91rN;dO5@q^!Y-N1uPIB~(V3^<_LM+cSxlM$^n`e7nA zh&VvYx`Cp@zh^Bgbf0BS3R%{askpKj|BCT%KAsydv8)4=ajWliYmznDnqpmP6)rS}JD(-|Pr*g=|17jKk3aLLm$H;_ zF%1_U2d*1%@Pt;M0T=b*n~nD)fO`^uqYhlrMYV*xWa&m0>835h9t7+t{?_FHdlIlG zbAt_)q|bbV@)-~BEJzUieateX}Zc)YCj6%l&w;FKc@dDVq8GzlKBWx6~dvbsUPk9}HeG#xV22TOJ=WPSrDZni>-~xEh z+n+u&N)Qt+2;VWl6^#!!sSt1_fE%Z8CM^V98Q{k0n@OtyhZ9EQ>BOYXfP=|eC1dc5 zewnlfaI*l{=)h&QiAhHRTMyV5$A`_&PoH@npt<19pAT5_RBPaE46sYknGgP-Ck2egg8$p`=SBk-xK4cNUQ0`Hi#J>Tm@06)1P zeP+!;%bM!aT69r1c+fIAl0MV=8tlsLv!aW#$YF8|`r;7i9><4H-lE~g(W}W%0*-bx z9^5N{du4pMDd_*vV}Nsc5AkX8OcLslmp{r}U+|Id_%r;Zf-$+U+qc<{n) zg{z(r0?1xB15n9Em*JhQ`MMxfL{~&kS^f9uvobU|lGH{wK=7pGos; z;YVNlV0VDW`1i-qGt2Y`wV9|1J8cGF6VS6q z4ZeeHo3PRJnFnXV54d_3><0+jkv{WK1T;LE1Ktsgfib|Eel{Du2LaoW11#vAhWO_j z!+>?|EzmA5D9#ZM{0lzU4+i6F1Keh`I~E*dbipv-1^}0XJzTI~FEE_8Gy|}{?noV61$Bx7DHCk!T%_2KcjtLpAr`QkJ4A=(mwisl(s)BAOErV zpFmxm4*o~m@HPXdN26pecM@OE(( z;-X@}x^YQhA6yLo|9lDH$_;vhd^&N$|342N4Sfm5iT-~+mLr|u|M?EU);R44;w(b{ zKhH5DLr$5z7eW7@-!~3U@KJ>RfBqG~jiBv6{Td0-<78$y&U``<`2S`VpvKZc!h!#9 zMgiygpkSV$|KFrd)w5}_ldQUW3HbkJ98ggQHW23}(Eo341Dq?*tp5KJ@c+#x0ejfN znKe$h1or=}dcaavHmyPN$1KD@;Qw0(0X2?azXbe$i~Z!vDJ!j)f`7r83oQEoTZePN z3tBIQ{(p-)5O(+qlZ>A3T+9xddKNQOmFZBOVOAdHpTbCjJ`=cTF!7Ywl$F!}>-UjYE;2uk7 z&|fo3G`(ZNfv*|xe}~F}F9&^@(XDZg2g~-i=Rhah2md11@o*CMq{f*8?B(RYF$cat z>*X=Pb^vy^(+8QlO*rzO3mp5OaAV1y_@Mtn<5+Ou`*PU7^mz_^UqSuPk?$+0|Krh# z_OF2d%Lyl8VgG_N7h1{xKyH2X|Fic#@NrdT{{Q4p+W>(CNFhiH0RjXlZGZrU7EK`o z1rmtRtW}FiX#%aLZERC0Ut0|%k<3o>HS4x+UF&Y5QM=#muG!s)*|lJRNaJpSh;=Pk zHA>W}i5lJRQvJ3wzxU_dJ2Q7??qsgN-}kkz-|zM7ymIb6_ngmp&htFyd7g9bxpyWP z$p1StkI{vaKNAiKH(S_L)}zu0y${{O1RHbcBF#{Xa44sJ#AIHbnlV*LNr zJz!Jj>{RSU`2VY#Gd<9~2>*Xob55{(FbT(qA) zWJ4MBanWILBi{Iamk+G$CllY;<+~PwJ?W9|s>rF=iapS+fNm%IEy%^bEDdZwim&6P zj}%?JYZ&^1m&e+;#@lyI*tli0;E?U&Je%K?HAkvlTwDnjz7y7xZucl<&}{^}8tiQG zS-5U+TA$8_6Q6_Ns=;}PjTaxaX=cLGe~IMxz-LK?H$F=={vP=(Vf>BkUig&!nfOFc zB}Y8c1iK*DrWv=9wDER<^Hq$(|5V}oZb&s?kJJ>nNVU~Me@v$p%YP<$irZE8^J1mtw_eEt}CzH33i_cy5d#iKLR!ruabWl zTqfUu*Q+G|4A@NLMgLbV0edoY|5r)=MG>_Za&!VWL>4Mt*%1;@2&&8+JSXj zgG;VSuzSFIu&t{L!Ds+g(8ME>|U{8R} zq_Z+YH1Yp?Vl{&=lutubHtRuO*Azpu2&@NNyrvqgV$AAfeWmK)npUuVU_FfQHOznC z8w8ul78$E+SpR(Q5ZFxm681RQBVe20_nEJX>9q0d+S16We=qb#_u3k;C15?scI`H> z3&DCAi)#nKR)h6myVs6`Z3o+#JQk^Te(g!H(t~XG=|c`Zq>kHl<&jh0mrr=G-Ro9@ ztpl5BEXsVo>)OGt2Akoz=ym(RHGxafmkY0l!EOiJD3Q!O7JD9$patYv=mRSo^PsPV z3nQnFV7wjNd>A{0;7aj%M3N}MrxIP!$I&dkv zP3`~s3b5^9J?P;2)nNB}q}vU42yByM%-o(0qp$0Sz$%tkWx%5U>n9?o-UOOS2aEEc zsd$^Ie`qeMgk}ZU@>u_=>m=cj-{3OX_9Djr%_Y$DpwmT+|C=kpri@jpA1q@0-)sS! z$q(RlG4j9J2X;1@(EVb@-{3l9vZsBHyIAr|rygu|G2{Q1NXB)LcTSbwPg9}&vb*|6 z{1@`}gKCl_a^#BM+>9f3ydz({~Krgi$c_=S`zvLts7F?oBgb zPk@d4Zrb&FWl7}JkBhv~ty}@N3~aSSXKD0X*#>qQ*lw`fHmgC}^+{zPSm|NfK{t&a zDi1|YO~@biimnN|>FJ&TI|epWY{n*UE{mM{*f93sj7@Gll!2{-?mp<2#Q1f!^P5@! zPVDvA|A0-?3$No~oxc%T(fXfg=Z#@jII*CWO7)swud|1b$+^SB64c74y=dxd3%23)XxgR?iJn2 zS?S)s1Z+FlxNWE1L%6*Otn8r^lAHfv(RH&&Z0Gjg$f=(L^|B7U{Q%e{QMx0u(+z>` z1?$0YmllB?1sfk@SASf(4BRBR4F0$j`F}o<)VG`bWj^0hmBPNr$Q^hmdCKJyxxKQ z2G<+IrS+>jkUz8^nsGZ#kH!8&V_=U$chf(Kxcl0OIr-h#|1su-to;ri;_u@mDxwU0 zb>!496^}B=_U;xN=Rvl2?}?n6TIEf)caMVA++<|Ccy`%lBB!R|*^_M8`Flzur+(E3 zZ4dVNo*J+dVBzs512+TCgFU{dFLLVFRbV~X<9iN)Z3OGV9^Z2UtZb(wHpZ^J zRw4hd`@k)W;nLbz74rXj5NwJ)CiyOUt=b0m5ZFEkUAHy0umh1(zo`OS<-n$y_p8Ri zt^^w&gY^8K1ltJKgKW#o!M1v%yL=^B#igbU{4V5|huXmof%UTfMHkBl!OPcndZ2wY za;mk7?<$Lr7W+GrgE`iBB$GE3pnYe4vBIg3aLbcQ)F%Zg_~U1=Eb( zojbu!fO6V;I_z-d)Ne&`KXhC2Mcf|eBwH(kSK|L~+d*XD^)BQ$I1jwuh5Wxwo+r}q zdRG%z%@gAFBj(pD+<9dT?jrvGPPVgCBANL=?Ob&i@&9+?!MO%=^C9f)F5>@xh~!=e z-PWind~QxcP=}A|V(_x}76(4feNJ^XSowV%>$-PY-2zUwn~7ibzbA6)cnR1Qj{ei= zw|W$;)`4EI#Q)=p4<4}o60p*NQ)g~EK)?PKU?+HowHSWae?v?co)euj6O>C0^7*$# zPQ5cme!D|HH`>AuL{6P32D>f;whS!s?}X&bFc$t3;P!y?Fcx>0fgJ(sL1%Z@ft5{q z!EOh8!XtKHl zw*vnUAMu907yl0{UU`u1Ui?3@8mtG|?q&TK*#*{vZ1?to9rDQUA+X~fvG{*v8mx1S z)9ClUvPhT*#hGmld$_L->`Jg6WV>%W*fy}M9b;_lA<;DyFYnt2b^vUh1DlTD!(hj} zVej{Wl^#6My?;&$Zhk;WJC2@4-)M z2f$W=-S42EMjy4~U`N1?fqgVb4bsN$+LMv+SsHKI=$ijbk7W!WC}%F?oPAW-Uszb{ zcY2Zx6ne<_0QP@YJ9+0Art#MYI>C;B^{^IsU=VBwtOvb4a5NIm&jahU4L5&<-v{%+ zdi0YAE5Um7lLs5Yw!?!5pL%d7*a5H};>&}>k?`5b<~6=N7>b0?Sp{tm@ujW^>|U@Q z^j22|_K-LE>RQ0gc*O3BgbRv1V6n-%QLq}jy)sLC4bqza-lpz2c%56X84 z>@Kjf-A6_&x!vrm49tm0_*x<2>s(j4vas0;j)2=Eu#w+=4-A@F*z7eYK*jAOm8NjW ze{Bi4g)y3`xN>lN!Igqr7sI9Rdkn1NXn72qN>hE$*tiTlW*38NhhBzp&n9MFtMTci z-_<%`!)`i99)7bjeC-5?x)_h{@(8;p624Bb?V@|1MK_HfWfQZmlRX*iz3H)K&_(|1 z2EbMeX2vsBPxPOI{MU_uNZ~bUiiT!RHP}h8@j2I>Ch{*VOu)J83Lnlv{)J1x?u5?| z_KDe8Y)E!ttr2n<|An&sCP8Pn(;Q;6YTq5Py=_m z;uZT}+zw(k9jX6m8`qSfe`w|*|6+~NY&3;KeuK-Pr@VFG#-Nv}Z}`mH6$w`W^@JS( zy9BJ$_tMN0dB|TOKb20SF*1$soq_xnqo7jaf9hDBf&W*8zR5SQ~g9Z#{b4raMc-b zz2KH*mgCG}kGKgNmw~^t^1!Xk%->lR;4~-1=dVCzXHu4)>CSFAo`776Xpo#nj=Y^)^ z@Ag2G@i(|kG|~S#jDO`m?hjgXA?(v3tqq=o{5Ma7h_83uZ5#Q|LH=8cz|J=Q!XbY~ zocP544X)e4r?LN3J2?mWZ;`J$<#)rcS|5nWl9_E`u?Elsouuj?1%#VdjBH<+~!8&cg4Z9FS zY680*>|Td#t?Boa3U`4Ifp2l()6D7oW@Y#`bYk{J9vD&scUuHg$ozj>G9PX{gFTn| z@3v$ccf%szxy=8!YwSGAcWxW_cJLnLJGT$)2-tQ+tNq=q@|}Aq5?(4koMV#4hR!_! zb{W_vhmO-=&npAl239syyK`0^&Z`4^h&Yn#pqpmw&f6XdFB^bvCOfX+w<-5U!gH{R zT%(7pEFPkJ=6iFKUb=v08Ex=?Lw~l|!&sl6YvVk`l=JcbJ0PEW?~)pS&d2}nC;>YT zyEQ+ycy`kTHgrDzf5!-VD;CU`fK9pI7k)Sre)m51Gn{LNbbEY~F%$_`jYBz;uAyC2 z6ba{@gtqin^AU@eLHjq=lEjpr`OV63)nRC7&~s6Xjq{-AqCJuDa>m_@p83tn@bVh4 zvW*1YB{3`6X2AA&*Yo_+Nchff?|Pn({Z|jdg$F&)$NtYa0Cw8JcW)X!!~6XGJdfH2 z?+SDGh1IC=oanQ$BvG{|G#~q~?gUlopr6LaFUSMC6RdOoPlv4pD_g4aK(`U>B-jwx z`<_&TwCjosc1FVfJ`k&u=_c(rA=?Gmzh69L!lJheCL`gyf##kR4_8|}MD>>JT+rq> zE5r94qCsCWA4y6Uwu&*){OSdZ{ok+n>|s1E#QyJB?C>xi7h?bSH-hyr9v5Q&_bZlb zJnpsMt#XS=$W~ku3D?L6GwE2^6=20fCM@Go%=}l=%U)Qac(CKkEaOo;5DCAx7226} zEZXDv)IR)GG3H+T_ZXsaF=_bZBNzF2P6+Aj67ct(&jI^vwbmvHaA6nnoNy+JeKcH%(l6Wp1x+cnx0-e*Y`l>-L0S|^ed2SW+kX;$E`%;5!>U5g)e>PA{)DXo ztFssEHn3InT;!lTvRng_$e`rLF5WM?iih_uRs-VUnJ$Azjf*_zCdu=`L2xPdo7k;v zM)G`c!Xp-WR!dKH4tdTHV+=|G2gf^JZF~qE2}dSe(W%IDs#EV{K`yvJo?BQiiFn>!1od1$2p|;&8&$? zSpWMdOMZOM>$76B^CRJpR7J7omrv9BeD;z^xTOM~_lu-$=OgC5!$iY?-|VJHcoVua z&vT<#H{TMrHxh2G@qmrmZ7i1D`hnzF^3h@FteeFL%cv)oeDs6|9I<5c5^!}H=rKQS zZuEc~0oM(#&8BB!U83r=hV+HNVH+`=n~#9YDvX4;$c9F3dRDAUBq$u?_GByPRvYIw z4#G7?!rRbaR-=ux>^GHOcO?AO47hzZ&RP$r;szt(kI}Dh+{U@dTTFez{BZLpV`ExM z6|wc%5Qt(!BX!?ZnCeKl`zUsF#Ksu;a;b3qAIWu*aMu_`(Rm?_PJP(oCwFGRMR|_@ zZ_CQ>B*o8zBhY9P53|UQ&J{n+|0ImZuGBqL;aDe_{~@?AM$;X)7hEa$Ot?{SqFa%H z-ZVJPFM|$Tm8KP4$Mu_41a63NYH{FP#vyB2B>e3Yj8%NymuJ7v9w$gl$Rd6mq9pa+ zInm5C2W2s4`mOSe*fKB&BH>rz)3FDXsz=eBjD!P?;IuZ(FoxOq;j5FNYGT+_n)I#s z`C1;h6%L$>F0=8&*Wh8+v7tU2Km60NN~~~V-TaZU&Yp;bKTSM7 zs~0|(+wbI!#C}ISaR87jNAmB3-wZaFgZ!`V2UqTpzarI^a**HPG=EvTPt_+fNOkpI?EzN&eizmd%&vyonSdT_E=KwPdJVLYH+jplyFDE)n&k;`+2$Gs=;N_k+2mu zO)uEhHlLZW@H$WSzYZQsb2->^e{wug|AXKfL8RDzYMhuS`L}t)=H-Fy1)ItL;5Co& ze=Sq&gV#LCFPsPY^CbT;*bMULN&Z1_O))*CwY@yaAM%Dh1NqHwt5;>9i~MIG|Lc{| zbGbR5auw^m2slG3ol79?bOAMDb_MeIT<9T4) z9N0ART<-~tORpK^*LwovtH5Q_DZHMA{Nt@)8o+{HYrv>Q|}3Ur#J&m;gH|pW*aBrR)N!e9=Cm09`oD5fp_52`g8t% zuoYl4=?LBD9|0?W%7mrwvx)!TSqFADeG0eG#?2O^gj)%&5qj})ca{C@?cnx!;1PMw z-UoKbBla-Zaj;Imt8>{tgYG##urpwrayj^PNUQ&IkpB(Zq^|pt>`8PP|2L%n6hC#r zc7ojr)(a2#{~M!Vt1|Fg1`pW(8%Mxq@aY1^|BVT7)yXtd{Z#J>ym11ob3ZXn{L^~^ z-<7^P9dzB|&qC`xfnA*Qhrr%EtOo3P+P_1Pq%wWauwXb6?i*xXd&ogM-5wo06olZV z6snp00WAO9GW^|TV3#>)8~aIOMA#~@HDFhIz_x&G1G~-xb`MzO%Q(*HqHq-KDA-m9 zU3*ND9|P(BsqlCtd|1$(4tyH<&MgJo|aBsKO4hy35` z12NnDAY30f*+C}U7`PE|v-!H{&43%rj61&=+&H*+oJo}fo%6pf!`};m%QTL{V*mfn zIpceK@Ol0ou=17J^eCDm;P$xDO!d|Cr@>Bw&14_+UxfVsejIED`HPVM`?9$dJ4)?e z?+KXS2ak_s+POyW34Fg2x*qhZ_XNH#U3KSjFgBN-F5~}wjcZ#nHp%bME&tmxd_;cd zfiC~sGJHfl)H&$7#d^_g1FJEM>ozUF^RfRU`@!yW&~@`Y(Z&DY9ONrrLRmr&Ny6n66^@rl({=eF0jSrU_)SA9sH)T@8Xq_@DHSeT@Gv-J1lMo zy9;c)2kd^Z;vrM~D1+Z4U^TuaF}kkfp!Wp4($sqbhGsJG_5l}}kpG7(zrR$EHC|qf|Nlt#6pz(uW5vbz|BqxR zoesKgV~?Gd;Qv2T407r;9Txe2Gy-;~gKirCFTwtQTng41Tivk4lM?Lz$JJoRpkN9zMc+y9BkAcGhi<(1uJ`W z>NkzfE~|-z&F}p><7pbZxs3JSFW@(8AerCPal4H8ADV;*FLa6j$CiQJn@l&!9?|b* z#Q$Ua!8&c%O=k=F|B>Zj4=2%Wwe}QKUPpxX<*Op$Usi!{N#-L-KGE(3+YWX*73&sH zE+2}7r##AdIq`4Gql{PNgZ(39ykc1-JncnB^l`;Hu#!3c=0mcW%&QE>cBefXqNFVTLE4%z{!W3pD^BKZD3D=4LNjSV^hYv z3_SM#>ml%EF}&*>R(1$nbgs>y#G)mEdo0P-O|TJJhuKyh%V^i zD*S(DFNhT$c)hCN~j!5#)H+bO+pb{>vK!oTeW>s(8u8MmwRz>avpV!u~cf<w&`lG+ zuMUB22kX(F%klqrrom_OXXGodj)YI3mxR5fH1d_Vf^7ur!7j@8g5B;BI|g=-N9=L1 z@}(5JNU&lA&uQ?eB|Dg_qhq1V}9Bhk6>`JhbP4{UFo}HD4Yuh8?|1I0` zpoeSsgB8D-uoXVvwMW3V>D?ajaI3{b+(%QtSIC%Lmmi5_S3}>!oN(O|uuZJr@?~T~j2IBf70%7rajm+}G0R;X3^PlLNdDrueqN{>`I_G~XR713v<7#ei~=HGH_v zjn{>2oYSAv*zv+5u=1r$aRr?%tO7d%)`QL#wt$@g>-0OfcqO`fA`$cZmOEo|*>;@j zqYFpDwnEnnzcXMZn+JZcF9AF3fnUb$`W0Y9yl?7^uh#u#(jozR$anp=NMznh^4lEp zr5TUw2f+4$9dTgO={gKESr5>?Iz*c+1F3ttJ4y^n$>dQuFNkaz@iz~oN4<2M&yc+CLupVSv z+#QLWsouR{hrpJ3#7=-+0d|)|wlua=LHs*&5NuO2HdPN5#J@8`U_IDF1@Z5!Jg^?- znTlSpk}VUK7+-M!Y!$K6ITn4fce`CgJ zc=4McATe`mNx5!S8XuRp& zs@ATT&pYuexjsv^c6}omXFYb8&|c#=kEE0O-$sV<)5lzQlF2cb)^#`eY{&J^r21a2 zo$dE>?c{%uYX|?I7e1fFNBw=ik4%=X?CSwC=bKBbeuTV(pU;mbU5|0?q(9E}91xvO zx!aWFbnfwGSDYZV*yS_azg$hehM{OO7&7C$Tv>ka!NMmbF_axc%3E=pq!$TZp)+vR%u?2G-JeIxdT z@v0pv;q!llMkHsiRE|or@(finBV-V1juf74i0+FNE~Jy(752q;o!jh-eLDA97p9*%rPc*UdbZn;wMTaeSt$B&2p8K+QwucWyEkV! z=K+%1kC1$}6w3OtiaAh|bsRNh*Ko0u^AXM_{;3U>=JB^CQA)PV5Mq??Td0)9VjN&L2%3vV*tv?Ksl#{a}E}eHDlM%Q6RcS50{xOhls#MBv)87lEJD&O zl(R}X$Mm#M7k#8?O_sFKO43KJp_=S`&e>$lh0HL!j6)$wA6Z&>IK#=*#De#Z+s~6c^nB@yQYgkT8~Rc$uoYs)2Hdb5@a6o7JL= zGW%kQE-IWgP4|IK~5MmMRUjbx^yd}X4(X4|wWimf6?bg7{( zR3-|oA{*7E&$jFAVG51;CqOHmP-$B2G=9cG6Bv+&V^o{CXe6m`-*M6(4K>_uWk^cw zVG*UADh_m#Go}lhpPcQwkXB+flPnCXDbVN4b`I2>B^J)yXI-3mKo>)fnzPES3yuu* za%ziW1vIX)p(C8lzj_kIUAoxmtdYFb@PUXX4nb6~mt=xjLhTB>Rt6oN3CP)PtL<9# zojU16^}SNHEhLLFt?hVfTf483AYfKQ0<@E2Orcp_@`?EFF!Omk`6wMTc)FMbm1V2P z_;^-T3}zFsIgawAddE#toTqBLVT;;z+85oNWAl%bCzp9)$Zj*NHizsBXPd3YEE=g1 z$L2H1u?$QxXAcuWO3;jj#(faTmF47;OsBEA(bjoX0j-ixatSF5iO%NaY?Z~vDcYt< z728Q_(@t_7Crc;Q)C$(AHnJ^U^pO&$ZWYkazAWobrj08B^~oybz(tlU)WqjTyl5d8 zvFTCbX7_ObmXpspM~!tMSk4L#10;Q-)8m|CCYfBDp*fXY%uzg{&D>R7%sp&h9N|27 z+PdI~6qY7!JBpgFRAbhN>KI9^Xupaq1!nPK7DcL+7|}(#sWBE?rcypxO&oxksUxe8 zi*b@Z*(XT*;d79SIfpm^<3nF&eX)$jh7HQHZNYL%bRqWZNc!X!>%iZT&Xx9sG?ZIq zUzi&8YSBmjh1SK~QOXm!?1SQi{^?bO%>D>=vHH?%LB3))%cdS%2GR+GhRjh&fva`g~*B zWOF_#Xb z<;(tZBWWEepX+K;DT&qd7iUNz(oxbFX_z!X+C|z)T1i?$T1YA+<@&O}aMG9krB2SY z`@$je6Qtwh_mlRLAN6H_1^gGf>4W^2){);%Y9ZB7Ho&=(@(NNB*E|#a5@lbZ?n|nN zmw|RL@c4y15`6YglPLenYR=H?-wy`5{e7f8q)rlj^tX|kNOdIo=!fV2T<)J{NRy;7 z(jaMo_2mfq*h#A3ns$BA>sv*tCegMJx_xD&B2q5TT#u7NFc>xpYMs2&TCjM|Uc3qm69sxkjHa zfKI=>!oqA320cHw(&zi^7uXOr+x8#vmU&wN^#yOjEbn)6r^10+&$e$pe zM>>P+Qm%K|b%k~w8eakX+IGtG(ZLM)7V^}8dD1SIZs5mYiph`Jd35*XA@b@2+F$O2 z7ttvr&9i9mK10p``f^_XMLE~jN0yP(znZi&T6Fq+S_7vwa9RVWHE>!3r!{a|1E)1` zS_7vw@c(%Y;B+s8$;H26VD2{htO?= z@1BAJ(fQ1A@*lGEy8rl?o!7ljzm@+Bvc4fZpG*EVJFk9^*?IWMnrr9jAgk2Q7m;6X z=Znd&weuz9pSAO)~ijZvR=yaW$V70Pu9;I`A9sUeW@dVhapL4z=e|?rO%jPF%i6eifBmaN{U!Uch6UDE0VA>q{k2~^zn&r!l z;{P(smlMtZjU)fhj{LVB`5!v+zl-N{c@P|>lY5RMU+T!;-#yn(?yz}Ciykhb;%{=Tamgl{|C_j0N9r^b-@_t9Y){*}cNB%>O zJmVOn`LrYN&`I8x9OVw#^SsVgjoA6cf-6%anH|KWyyvI88T-%iEdHQmF zhpO5-KRw8su3SGoVxPzD^Mrk#vChw+C*htcw9lpXxxzkI+2=a@+-RR$?Q^?*?zPW- z_Ic1gkJ#sN`#fQvXRLFF&psF0=TiGzVV|q)bDe!|w9l>fx!peZ+UGv|JZPUs?DM#N zp0Lj|*16MX&OTo$nafC*ldd2!5BRPmT}8T@q-MN-@9cdxydeS1&Vp0X^2GWhB zn@E+Un@P8jZY423zS~H*la`W}k?tV9oAe&ioh0q3-9?h4`$>0`?jfxp-AlTUR728t za^6dNi1aXNC8?hDC!|%R_me(A`XFgF=|iLjQX^>%=~2>J(qp8@N$W`KNgpPCgw#UX zK-x&!L~12{l(d<&h15oRg!DdA9jUgR10TJ!a(_FAbf zZ<0~Eki62nbf&S8UZqdzUiy~aH3k|F=}`LD80C;;9~wiAwe0B%l5FB8(p{v*B-x8> z=uVQx;u@0d>spe=N@MG5cwp7?&5y6O&rkRo8a~j}QuoBe4a#kNazmYp8d^7RdVJ%W z4b9{?tZQiA*1UFWTXVy@<~2>tn|%#y*R-uw>DuPjw)LAfHf&zAehX07;)X44YuaY7 zY*^pays>S4+f$He*|hc}4QpD~Y~IkYxw*B4qNYs^8`jX>#!YSOAA72y2_70O){<&A zZfe-lyb%Vsq%>;Xw7HFzEzNDsO(~UX)UaveT9}05mgbLc+_YtuE?odgJ-Z-M7;wQj z_-Nkv#QM#fHu})P+UE67G&gKnv!S)6d5dq+rbj=#7A>vWvc)K&;em&jZ*AMO8PV2k zX|CI}sl^R)=hlr)EzNExM_&nS1cj4>zxMmHARX$PNk8y#&8ElYNcS|i)ofb3re*o&wd?NP_}C_2 z!^10EKQ^5(U8&t}JU^M=;8 zr{dSQuHCeub?^vUQ_@n0~0gwV|PH-R4bC(z=O|LF9o-Ol+@DaM)Z)g9Xy+}>8y{~Y7;fIYX|p{H54XjuH*IZe*z_0?a^vI8 z@#@=R46fg}rJ2~Y225W*@F-c*s)E%0GGF1~^!|ZQGhh*FSNCRAI%0 zwx?Q~8`fijW|Wd(;%du!SEQx@>4FJ>Q^Q?%-?eEYfqP?{ zCRD0|EqCj-j4VxLH^&7>UP5SX>YedXs#8kMpdCQh3nWP$8 z+nD{Ls4X^X>qd8+bg>D)WKPrU*wnHKN7H%BQz#jO*+`&h-lnMXm?d*rP4%5MH{7^{ z0*sgAlbhFT?u4IBt-#DYn8@-5yORyg8#Ziu0xTIA^EH@>V#AilA4b;?Z$*oVMG7ni zW_W`7n$3hV&IBbN(?815Nh1;G$||KLdi04x%i30EXk{eXmM7P=HZ(oevi{Kq0uv(+ z2~+mi8uUqQbX-Q45~jXo6GM^M#E6;zvd7n^v8DNOxplnN6I(VWvukNji=NY;(;7If zfzui|t%1`TIIV%x8aS$NvHUL)w9lehQ{GKIzjH0ls#0vghR+lP&pb!p7C;w+z&r3`jjm0V|8yc#YuUu}?F~@caOUY?GI7e+D&r}MpeNX#>lUsY) zhT1#(j<+y0o@!}|mn73z0uSnM$*eTiKIRk8aU}ujnV4#$IUT+m-2Ph~8c*8yX(G^FBT8 zihlYil%Mxn=crwsVb}BUik&+iPq0h)7)-de=Rv+{@9f*@Bj})Ii``yilWCOqTRJHJ zv&6ATrojfP%~dLmMri0^V-9Wal zl=3=k)HyB`#XjumKDFV|O)XKaCiBq>jUv#kv(i|f{|=rl|azYS-cAy{fMVx zT~M!SboFqyZxX_aV|6Nbd^8S9jgGS9?2+fP%|q(euVtHu-O>7U$dr&2BNlJnvUxGv z%Zu4$R;a(2Bp!Y-@vk?v{$yZb_`=3(pF8WP7s`jkgZM2ZdHyixyM5HRbfmr{_dEiO zQj8yXTD$qF*0xQHDi+!fr+8$sVR6m+M>q3mb@APr zcAwm|`6F8v-@S=vwQKaub&;8jRl4|3uo6nPEWXQ84_)z9>7<`)S(%fsEp1I}ue)y1 zEl!>i+88ZmCCH-LXUn1+qD@lzIWuP!y(YG?L|Sxbv{4FgzPD4_=o!VL<+F zJ^LEsjj(bd2N% z3%lOf`c6-4Zog*jps#DBEju#apXay;4Y7Xg@lOP*%W@CqmNh{=r1$e8^%Fh*NxO8H zO7EdG=%0i}ULdzD^e79A{#+;>G+GU`mE}vE!1l6SxEJC>OaMA}(nD|WI?c?HD|K7e z8@X~BCuHuJ&I5eVOiAB2hV3bIuMdYA=M#L;yJ^mS*=UFGHeAS{tWn^504*DlWX6jlYa?67L{K$CF zKhrg`^*l#OjO0wfKZ!m%Mk|wh?eT|f#c44UTHTv1&F4d3%pAL!5f1|KPj~E?_HDi9 zATr4aP`?&Up{3xXm9a)rQP4kK@LW|+=SV@<>%!ActDT;XA>OW*rVCBWnT{PZzJksn zQ}w#403wJG|M4kkzXYK`U0zSe(ZtGsk5}dc30CF7cB{$dlY30LI=d#YvMg5wd%_Hb z|9HoaK$N8eTkWcrn=ob0JZJsnet9c+zvfQi#VA!G|Iyb93h)Vp+sVYFeicLi;1 z%{jH*F}(zY#1Gvms(vH&))L!BqOE`SKh=7|jO!!8+L>T|elR<*JU4h}ZeV#{@Xoxz zas%StY4ZY6!;W=xE8WQAt1$h^jvbS8o?JdG%Lu$w@LcWWcYhkFS2rCK z^RY?TCU>oJQx}^?xsmaybCnZah~zUqkvGU{oX(LVY?Z#!BWdzFcI5dAx*kL~Fk|yx zF24LB+sI$>zY}ZpXQq)c*|zH$BP=ny+y9OkyzDGaM&y~K(QBp^woV-*eV%ei&ZPoG z<5fo`3&HcOpkLXXWm#LXLKAB!QMbWUYJB+EtucJg zvVww7e#MNY1{>+#2i6)nHF8++8o0qgI(AI>6a=iEe`PnVQ&bCb$frr3@v8hXEGjat z{uEmc*+K>-iR_tfWItn*RX9Mm7L})?R2bUnBr2o9m}M&h8s?@RW+b$p5Bo1hr zdhmZ#{%%G(I)=_EL2YP4)O#VIInB}JESgx8K(CowiXVe&!PouAU!2Ipg~&YiVkqy7 z@q(|9*ydhrx;eAzV;b@UNdHyu=E={c;lZ(5H|zg=Xk;l*X_Y{m`?C zWpSdR4o8h58$aaX3$6Q84Gt2AbQ!EK>@Q~5M-m5$%0llqwKE6($BjPBY@Kh-Jq(5k zq8bcz`68M!L(lBJ^@@INVFg|c&M)F@0i%W&nqz1px*3BvrD6YZOA0Md8iRgRHW>7m z1pGt&3q|MU;Ms+S&S0>9$hP5pEph@SWufOx$CE+-;935mu91SymvVf*SNv1HU~S>> zxE3|@^F<_X`k@Y*FvIO0=^SahQX=O8V5;MbNCZM#^bZ-jg;2_xx=yqvTxs3vpp`4I zpfd)Vo78Q799qy-0+)jNo)(A6(4Tb2I4tP;EjRdr7P>;8b3$JM+P-6osd*Qo^jC<3 z7l%ttL!T}jTG&BDjP9WSD0cA)W-tvg{RHQq?9-T-m5d!NLUjgwI8c8CCkxge3HV0? z^<#<~^%DXAp+Nn3uzob?KXltmTbbdg7$-OP75`VWrqIe)eFe|?zuN7enz~!+J^_8H zTOCH#{hMdAeUEjVXeijFQMokTsEh#%_%*d@@_CUc7My<^a!$bp48~gde7L_-V!zZs zV}XoScL?xO|Fom1)oNqYeOYwtr-NsQEJ!|TFso`AoF6Ea{gaO7H&E8GqtMq@9;}`2 zFK*YECbM-m7<>bz{GCzC-$^Ndhp=}CAF9YwZ0g|7140mhQ&?~OcvFM0kR zd8$QTZ33@Y{>v~G1?L}uDd#Yq>XMd>hPAMdS|%EPo0^W%#t(kTiVEhgWjpc^iTwv& z@xLtDm_+9=pI&HXbC;EA-W!lb9s8OBnL$uo(8V`@;|-6+VZXtb*L( zZAY!ObRFLk4c3nLm$>Tphn>=|s51^Q1D|TdWj4RnK7OO>GI1$^)v|h$AYzE!xbiwBm*i1c&UHf(v|VB%S@X? z(NSnB=(?Oyh|UWB135AX%?+_(r=w{eL9rqU)*tRaFEQ+&jm-1`iesC2Y{%t7PN zD30n-& zoILFAYX8N zb%MOxsBtQWhQ4Eb5gWOOvEoai9rOX;2`HkdsaY{Gr`aK*0# zeQoEfw5l+4|9`S>@7m6~V+xy4k#!X`WhN#a=on!EIA)p^@EnMx>U_2Gx9g^u?onoa zd!YW%EB@~y4^GPdfxDCL`UFZ!bke6yk#SPO!C{E`j`3A*2#p1O7+paZKR}=>Zs!aO ztT?#y$`Ae7aq-YO#SVn7$p-zM_@D!n7iuw}ZX3iMQFpMuJ5WFA02PMrF`%6`h?}pS zLH|y33x)`i#Jw89EH=nF;uLmc%^;fP$43)c4r>i2Uc zL+{o~TDdvh{(msdxZ9n!gMa8RXv+=EXQsF1qmfs5sz{mIVEKg7te@u`9;N%yt>u(HfHbh5b%5oAdG5+O{p1(aY-bACIs#Oe3nTG46ds7n%MCq%B>`S?UMOYIH2e&uVn6hxtVL%Bc z=I_RHqe{a#3qzB?6+;OoR=+b)A0obDV!B&%u`g>iWQ<4gP?rRd&O=FN*KKG!&91gL zQ0vX?N@+X0*|AD9`+!*9O{Swgf%?5u+QtjAo3SE4P`@WoyZ4VUy55haH9BnBGP=3R zMmNBJZ^Y96D5F~tGdi(8}WT@`yrY09_v+V zap!l;4hr`KPfs7kCXFpK;S952aZWhjY~S%sGvN%&6W;o@9GZWmY$hBPSyw?*7VwYI z+Dtg3rrCLBOEffKTD7UwnFqUc#$$cK9_0eHtca1i%}6us6t@gU5BlXWzGFPRfW=Ww zDq{s*o2)A>a@ndH$qRI~KFAs}k z+nEK=-5n`-?!m}4V>o8l#n6n(dKild{rXpubsH@-xvI#z3YxNj|A+%!5*jh+=u`~4 z#GZ>`VQvC_J{rv-fKL(O~x& zix2qsM#-AnH*2jEv&Cl(v@dveg&{i-yRA6-FVe32-PA*-(Z2qLhVA{aHb-V@a|vyN z^II%#D-7-0oveu$1__ikWo#7e;#3x_-NUIgSi6@~NwBt$Q*p3%fKyShb|0t0VC{ZR zu{-1-fu0Sw7oHG(bNifhhc`gYLI0p^b*d&he4`q^?@np>hBSP-CL63B3e=8snd4_S zc(liVNVDjunMDsR^^X)h^KSN~p=Jc|4?aCAr!z}b;+yfpX$qoVI2dHTVU~T?wEFe- z9bY$II4Cb%sqVX0*_Npy>ndo^N+svIv#2 z)ex#Ngyijk-ST{!P-$>QSzxy*?lA%3YbGE(uY6$Zk-!f8Gp6C((2tH$9E)>kIM$#0?GYd0-rtVKvE7hQ znUT9xQJx)kR2n{5?tSPt~~ zN94o@j1zMUJzVh2@JTsw9}34+`<@<^&&KXEpPugK@}PfQ)%H@=ZP`)-OX-&_i&U$9 zj-v_dkqb@ngzo&!^G4s+QbC*(`|*!TRBc%Mjy+=b?k0&LFZ@gRU$vH3{$IoY@`5%_ z_n3{wJ=$p8)2*jfs(hVq07QY@Z@w7U4P61>Z<|{;A;Z@r2+n>DE?)) z|CjOZ+KR2bC?+@hoN4qqQU6?b{Z#voW4^5m+jsoZxAm&_9U&J9&vQulF+!T#R?@Fq z(O=?S>JLnjxl1h;;eyV;F=1^|0nI;cHhi&)Nm<2-pUEorDzxjGY|zjBSoG1&u{CO0 ze>^b$;zV|q4s2m(y%ebLGgL|vs&ZIn`$C^K6bA@I&Ss|0vN6kY+mROlahYOjVziP;;|7E6YnFqksVG)Hb3-5 zL-v3hS#JFgnA@k}0K3U9+>WFpTNtV_WJle|vJWt7o}`Qf>JoKp6#rtVxML!VJ@$LG z_;mJa^vim59SaU(8IEIZwdoxS_Evj0+Iu_9_2Yq;Ui`zQY*+{C4^Q2bj!=_3p?lI0 zGB@$&PHLv$nLlUEFttq{(RRC8C5u>m4=jPR|Jsm-vn8gb*37Ow-)3pfnSs=`UBW67_UV{|37vPVa?;b@k6odQ7pCRG8)X z$>8(K|L*StWABWwz~K^L6Aqa2Q5ZKzHgUR=gVV5J21M| z+RJOmnQjcf)B>HZV%QA!=xA20srP{&H?R@_9nb5i$3nZ6>EC0GyqT9*8C35dka_nm zj#EVkyL4ryiY}EX7c^x-g9vnKeG%AQ#?fX#6Ll&Br#>P+7Xs^eUPr@#G6@WP-=Ovw z2KL$v=*nV1C5D0BDhu}LI%V^ot9($7a>>=lTEc$*B_H#0#QC|Nlhd6goXY`v-qm_<|GBtX!zmB5d{2Hqw zcKvI>{`K5!t}3@5_r>~8Y&7DDvW6?)@`q8 zTBB~w5%&i^$rqNgFhT1P93A?GU?|4wnB zYrnXa!gy?%V2)o`^-IAn86^D_2A>y{S0v3d>)}sms7;J1)QIQ)??|N6ex_L982ase z^T3cVN*c>mBA;$7mm1b|-{iKSSztIzFsCz319Q8z+caC|82Vp5E9)Ps*d*-g1aR|VE2%?VyWLVOeS_O)LWJMw7bAC7!v1S6WF}WY6}p2UUUM>%0kB; z)0?ur5sA0d=%V16KVWIEbT!Z)w`h%=q#J9e$ja%C(8{&gx!`U&Sie)dpMo+sW3Tw1 z#k}>T#&>Kvx4*$2n_UNhVq6^R|O4%yDK^7nBLE~dUv2KEm|gJULM(-Xfj$TJuVhlh}P~muP~$n?lyoy z0n95DDbLHVG=QOw9YemYmkH+nI!L%l9St4yn`Oj7{{fAO8u1RvZpFBS;Ts3N)C9dJ z&UmHko0v=1)I2N0ZHOsg%6Kr?qn5UZ7`SspgX;371f_1HC_$+0Y4B=r7kgsD9pt&bUIq>4a{! zp+25Ur}DbX3BAXL7P>;$JE0{uwA2;)ZYT7&dYcPn6}s|zz7zV24Xtpc8hX^BfzR1c zJ#0@E>v<=%6==uv3ZC30{tQdv{WpJ~o{@ERE4J+3$uVe-OU?e$lUD|NRJPP?D-}HR z53~t>P1vPoi)qW8W9Fq|vm+GN)4V*>w?_SsbnF;JA3pAVF14bUd;}YMK<;V zg&9ms!}-Gt_9aZ~*YkALZCd9$73^3(i@0^<*jx@iGGILh2%4~Y&Dce6@jxI@e>C{K znb4je5&LMhv>lU632pbmTViRjOD#0ZE)w6?7Ec@736uSmeMS&-8*#2GyGDWXOv2h1 z-L0!&{a^y_SOXpOsD?FCiKPa6L(hJXBtZ=~CaU2o9*RcQ@Tg;TV+=V-&7Ytr=(By2 zK=H0biidgl7^TQ&=>UvjLB6R6HIMfA_b5c}VOlGA=ATYzRVsiMpi_%@iX!4-)a!;z4?0KVlxK-h4evt);t)1Ec*|EIs44_%ZxE(V1It88-e6<6A?rnk(E?XKW|bbxuK;GL}Y9q;(s z*4g^v&9<3DtJOsRaoX7H81uaxSocjWGflL{E_Z10VW7eKnf@|I*?TCn?~L;FRMPC0 z^D2ya>YHbgv9HXiIB!66)Rs*L221Z%={`?JgE<;!nOsfvi^GGiq8_9&suv!(nRnZ# zE)j|6pusseOKURg<>~=ZGGAMX#J^K=gV|T{(Q(o{zAd25*DcHo-3z#K3T9bYIg&xK zzo}o8kN2Pz=l$X$)1mdX5A)8^dFJabg@HTS(L*amfjgy}sJ&Wx%5~8iFM?MZC8mA# z?u8G+LE_!&-L@(+V>E8Py==VWM8tZ*YPWSp_dKYogXfh6&M}dOcry~mma{_^_wZg zj=Fx&-9_yCWqSXl_@s12Z2 z(`s1d?CAQq<<<6Du2%fRA5fr$&{?o<13zUE(B?K3Z}F=y9Wz<1Y9F)fHzm{$QZH)5 z%{HYM>C{I0EhH~!p+;kem)kYh#cE93kJxRy;%(2c5tvX_p~j)D)NcD5ej5PsttWq` zhQRa-^DN*OdVuf?c=g-Zmu>8-;$UluUG~*zdr>yZXyfh3s6sZ`to#AF>;}8UiZvS7 zU!l=B&MvDO*!9&A)EGWu#;_{ked!i^@LR7`Ltc*>vl@;{w|CL-SO@0P!+V)r&$l>J zcJ2GDf&GA4{9<}(U#q)A1CZ!|*P0^ZfcY_BFg?8eE?ak!-Q692MbGBV2s$G;_6@-CB)~pHfJ)l5B@|NIU0P#CeAX=^=>#2fa(%4WaBa6=?8^A% zhVcnA(Hu1s%>>pL8^s(`t#2Qi?;_ZY*H5}j_dU9>dEa35ZH$uJWJK223{tJ&3p7Dw zJEdwKZJgh-i3RSGN}r=zBONiL6nw5Or~*& zKLc+$#6jZ_2Q^4gl-wp;V1cw$ABZp2^Ay9h;3z5!b%3ze;k-$? z3%@{P=B@L?ngAWI?*G8BH_Mk0Dxrjq^|fb)H~RIb4y|YGr%(LHJeRLOz4tDC{po0$ zZ!Y}kLE|+09W4KwiuA7i56nAd6TvFJwfimZqPzC70@B-#DzdJErVI@U&9||;_5*

BxWjmF>6iAg{;&hO*b5Z)IhD)|+D#ev^9-yZ#bW|6M`<&dwUB*`T4Y zs8mo>->-VB4>aA=WgyH?HeJ(98^WUX(N;AZVn|B4mEcs;V;-fED;CQqU4dM$pU7jFAhZTOAV{Zq7VuW72MAT|T$-G^ON$NOwp9^)E*{?^D4)zLfr z9E7b!>b}L8OkE!6>Vx;-=XH!zxdZjD1JuBgbm3R+Ia%Rl}?^Ts&u`OwUM zV|=q|rEPe)mk566MvEz_|HBqHKIl+`S`+(M-Jv-5weM-`OdFp-W zFlp^lZHj0X;2l`gIQ_R2ior(LlXW)uWqp~oQnOOxy9?9zrgZftMfPGNX}bTWYGR#_ zr>@HWO4OLi6f+dL*>iUWg-@93BYgXv0r4H%VP32ovELrP$+|LodLtbpOV~k*ju|i4 zRfK{s$T;*QLSv>P>ndoysawy_Da;tM|G;otYv)%?V4UoDDes>fwX3>dJ3PUVwzc)1 zY91Q`=1Y-3Um?Da2Ol{c+*oxY%@aXwjLfrPT9T)!d+_t)exbp${Cc- z9Jn)AWxD!Lhh>5&3w`N%NvU8VDOF@$MO7g(p>_jmjf2YVH;#9!3@72+YeDnGNz<&n z@+7g2ubT9Hej5Or?bw^T*AXH+rgNj;RoEZ>M&Mx3-_Fxg>#JnU)+Ww8py0h*WUQHs znc6Jsw7j|Vo&-X@Q9`>|__lZZ_t+#B@XiafPlvCX9TI&DZAM%Ayn!`c@XTFytT8Vg zd|pSpQHbA{4w!ST0!{NGSlhy4s9d&ka~83yUTr~Vu0*!-r9 z9W!45X*U{BBmAYV%vuDPHQfb?Vxn07jJhrC9JbM`4_mc-=f-R`p}DcqV?g2M0uCl z>(YXP9%od3qMGn^k-jA<<_z>Yi`8Q+BIt%?$8m|zmUPt8^qpIbDYp4LAws{^>l>CL zYO#WZjfrnnSw`dEV>Y6AfA$FG($}pU2-Em28c$tdabXu7qzHvg6{;KP^NU9gh$;GT z9Aad-MY6=Gn4&8v5|wMF&b3wiMJ!WBqfl_%9?w&E3DwI4Z4a55`hHb_&T33(C4z7sgw!v>af)BY*-ZU0u2d7$69B8RY5V}+gyD^3}Exlc$!&q5P= zw09X>gDs|tku|^GQL0zP${p>_qw=7CjB)ZE`<-Gd)?4PN|D7bTevToxzfS#Hzed2f z<4P@9te=B|`X}^DM+Kc_CV*jv$?xs;8`Pw3n@b%1{Ha~c7v@{dqpf1AvXISlY(<7K z=@jY%1|RCsOWn(oiQS<}{lpD4lGpkO^;({l**HOivOGd`L7FTLsq-%%j^Fn#f3Ke(tblq0D5N{qO8 z@bJ2>Ozados5StNj^}b2+-UHTQC1&n_>Yhba8*C54le({*n1!NI*06kJZ)1_ViPtc zC=HvEYEipIqeWW1tCp;G3AF@k?fP%A$+niP)=f0e_qvqTWmikPiY{G(mY^kVqY1jC zT3S>aWc9|46-3)DE5G;q%%5kTn|qVA?DzBg{(fICuk=1MXU?2C=ggTiGiPR!H0B_b zHUjTs8pDa~7^jM_Q82u%PuAUaGzl|E;PN68C|9@OA|DY5!^SamKvKLoQmW>B zB=}5+;8WS|J&m=RIynR0(FwaHDY*IMZIEtoU}rd!f_Vz6X4B?n*TDK?zoI0= z>nlMZ&|ea^h7iJ$G&p6kT0c%gkYf~7U#VVq-~Yl<^<^tq9F_A$pLpPT(p^1 z%e`F4M-(=iqjpc{4RR>=+vBDtwr8+YcW$73BIK7RxGfLhOlZ%m7Lr#+MoMs+CpS`> z?^0Y{(pFs@lh!p$>sqQyH%N_Pb5o@3+vBu=Zlh${Ho3S23vhu)Nx9Q=ey_MIx?-p? z95>RKm*;R^tIA{WMG~1oac=l#nw?*40aFuY3mE4m@FUk7 z$CzR^Yg~@}$n(bK%8z_+970HtRp5=w1OA30Y(}Qp8iUoS>enZsayOsK0+IqMZyJLx zEMCP{e!hT7rr`nV;mv`Wk+j0)*fd0^b91mPnH~5xG6a>GESKR0^8@h7AbMMuDa(4W zP>qTv26oIX9$9-!kjks09c?ED7y~^pJcO(yIE_5-2$mEXS0toiPZvzQ9jR&nA{z`} zh)3oBCTTwShJoAIiG(l1>4es7a_t*Af!fz3Nqf;rGc{1}oz^!Ch|yp-XQjzOug}3y zfQ=S879ykRtH|`$hwF3BeR+9$nu>`qHJE=52R8{K1!L0wUqCJS5YSij4Lxb-AVc2* z+0NL)TyFMBrxAd~20&SBK`yI6u+~SE#Nh9M(}y zD4T?0-gVLuE$)co_!ZD)V-9WR3X~vR1fMFJ5*2y?f90`J)cb5jAG;DIWM$3sKp5K{ z_*!7|MQ+<1fkiO=&`5U^KuxU<)m>`C<&;q&C?jfEFSCFZig3(iQecsdDqQe9Hr<=# z^0O3(gl>gaE=I)sGYQ>>ljLbpx;nq^BUGFi8AUu3L~_Nk%0l4$D)4V5Uu0^9=&6g5 zMX#_0J2@J99Fn}!7P`VHn~5)-F;t-eyU_o_%SDywI9>(6SOhBS@o_Fv7 zTGU5pU56|T=<(B_WUIG{V*?+r%`A4S*sECpLKqg+49kp#%YO?cY2!32lmR}#7iu3W z=f&c?u$;PE_@>8DgSL62YWc(x(AG|TpZ_BAh`khQ)y}@CBfLt56kx*@Chg^WATu0e zs15FL0%V8$f<#i-)6GsBjSeTXQ13c$hCcS&WcJkdB&Q1{wVGPOu0*hp$+j`d1+sZl zIB2{=L*MHTEtF!=HqGm?jG^EBYw&Jz@R~H27m4u6c<1uT;CRu&3z1;VgX`~G5q|_U zsrp}2{(qV-<&jzIS+k95jr-L3AAb}fP)Prh8IkF!hW=lofS(qy#IuDp!i$7jw(V#w zkM^<_HP$Ttq2m?t7_N+m+An$oR7ocdW#B&T@(+w${-^Zyf2>|-j*5=X?u7sY#`8*8!%Z1M zEpJVaF#j4I+k{F@36r+QNi*=~Ujx%qIRp2ig9~Y*!zXVE)G28{a?)r(eVXV9_j6kQ zHZW4qVrA%LQ|agfLETI#Vo;%KaM=5JlK_LuOgVH_Pc$uYYYF~NWx;!eHNir=zK^ZB z8yLek*BYC&1YSz3U3*~glh5DA-%Kda{*yTVBwC)0fJx#B5EEtd4_pstW#hL#DV4Mh z0n7Lra6@tpMO>Iq>PP_|lO^f_FBq}E9eR284M(Z!oO0%H zUD}=9T`u{Ul4a6zmp|vzsOmX^ci{QxZU=aL2=npXi^PhrnAvV&GcG|o1j#S(jIGt|*afCQ!<-Emqj})DH2-YSVbWX~0hhrLSo8X? zYU7z(r4fp;ZX<32m0E&VOCti_;TJf-w`1C9TL0l8zQz@RBRYt5J%w{1WD?%q$$bhD z%(Z~kKX-vt{2n2_nisqnJ{o;q=3ti^cS@hRWtCE&2chXfJxr<3rvTJZKu4dCXU>l5 z^NqZDt{3|J2rpu#j*C7IACjQY5o9OR=OdAxRG;gyVz2diFkl>>chzTbCb*tR8Ix$e zRFGuNlJHo|$I6e|I}0A2c@VNdOSJ5PP3_P~&G#Y?Tx8&ZU&DM!ltWbLq}M>d{jv#b z5T^)kXWhcJE_>zcfGB@|0U9NioJ0UO=T4GoJZjayZ;&dx+TdjUJDDv{wgyA}cFH?r zVv5mg6b#QH!!C8m$m71rqglSyV4~*QM74_@1C4Pn%3_ zZGozL4XKg>Mnh0PW_E@e;CA#S3dk<{@+V0&`ogv(*qH}D3hKP9XHy=kl``w^@UZY{ zETk(bHNVd6vZVT$5RG*1wISAw3e2TeQe*Ws=ySi<0_wZkFiDcd?dye4| z?d1QiHYI3l<`#DDUae83)YgFZv7fMOKAY!{GXMQ~o$s5e$E=*mZaM_e?c{A30Q5Nf zYw?uCvRxIBPoV8>@GeYG^|jFIjFx54h$gjKD3(BsutG9Jdf@fj6Wk1vX9&MBUQk)T9)>omo z8!6j?$31`-JWpEw09z>Jsz7=bV|EGfF(R`BfdXcf2uSmXZrc-k?^S3lDbvh*$Ctd} z?yg9Z4Gmeo7qBol1CleD~QT?9eJ6$kb3Jhw29cQ)~k7|_n-&js#XeuM7%5On> zLs2$IWXtD#UBzUnLW;4Ih{v|*D^}~wKt6@z7eA45F2&we5O@ZFJtRwxxRl~LFQKo< zv^JWH`-uFeN9-xY*FCfb>NK-oDS3m$A90_{t*L)tqtPPlBYBe z33_^t4ZaJ7y0yW3ps2RNk6_NIIdF#4T2|E6uN9REn$VrHwCv5kkE2$l#ZS?uM6}{Q z87r*~2mehOY*`8;VB)YvsrANi2{{JN-&;kRo3DQFjFl($oiELHQ#~K;){5PLTze&g zu!4S^q2J)RL~xjK<|g?{7-!CsV!az@elLoqVH550$s8qoyZlHHFI)7I^%;|S_}$sm z&V8KzME-n7Hgzccj0BrH9z^;!H60b}PB07^J84sIp%3$|Z0dMmNNQ8}fJ}GVrnV&7 zR1X)hr?RQfB)6$&@y>Q@Q`Zhmw5hJ&|2cALGXim7&;{6iac2nt|M(;Gb#u6QXaK@=^*G{)hbWAi}kxJ+-X+TRXR z#bGMuv4Z4O{W&F7KM7E^ILENZ@i{SLQZxM&Hm(*o@5*FfmH98*E`P=*R>&RkoY7F` z6K+T2xQzs5#WP2oqXXe!LhqDq6nIYSdH9^zCWp7;Se#-<@LkxscDDey)9VJI%(?Mq7Gz-Fyo!iT#7X`piBLv;E3vEzg7cbYwp zwr@aEI_LB*b?u?*ddXnPs4Xce8EC$QSFn-q1B&lp->FU_tLtC-$C~$ozLsQqO?~R* z`g5Ao4x~BK;u{2g(jW~A1)gDf_P2Or_#7{SSkCHJ28UCi(c_bZD@P~%?Va#IZAX$})ox-1X zQ}T{I36IDu{{+Z*YXd~@KE%>1Be6>|WrrbVi2juG3Lq5+FVxY>Yj6b!TUAy@NBk3o zF;i319AL21occ`^CQ|xh!QOHr7rqao#7C=#+JqOnHN2n!Z1^*Z@jx?}q_1qyeBK2$ zwaz3BV79RwSyh*V{lWI|0vuX2+>Zp$6j2HZ?b?SUD>S(sc`y}4+0ltm(o9^jzB05) zexYt=gT?w-Pr4AbNfE_ELT0*jE!ImwpFA{;5KtM*GitHV@9gd=HA$g~XJun0SPneCn9^2hbm7h2c}P zKRI|CwdYe-z75?%n>lUG4nwBQE!*)l_B?ByC2B-k$gxzzZosgZ&>DL8u7wEKi78(% z$!7K;NpHK5iL32zAQOAqbQ=6=@p`KHjf)1KxxqJ~5n7d-)B_B8BvkX`)4H&OJI z+fKMAW^n4o^PvQQ(!I)|nP0+FZ$Qvj-k}!Ops?SzFl&YS%mJYEf+Lzx`ERJ~anVk}QEVzACiwK64;Y97 z9YzoSCxLv%fkYqa0ir;t&T%T_FB6W%b!aEarSi7f8ZpYxktM@{gqeC0AZuzNP2;nMl4on?Ao=~#@94-JX9W7aB z6zY6MUPEX-)h`-iMy9%W3XBw|lJ_#Ax?P0Eb^Q4Z5I2NcSfX_;{-~3;ER4**uvVVK zt>@Q*{^+B6W1_`WI*gMFl!~>^Kxym}$ZkY4kH!-OO=Qt>3=-n!$KWC)qKI*zhm_h_ zKvTGu12YU!j3&v=cwT!2F^LYA`GlqAeikAvJpYX6FQt_&T+wbJ*KR%$35w^@l16iC zKNCKkuCxy)0B>j}s5YODHtX9p;!~{4E=)X1YLkgVFe6uy;kW)JNH+-bSv^&-)9JSy~1>|@BnbIilMtj#+K&zXnXt53@C))T8f zmnPN_2boJUqdcK1JoG5h*R2;{aCBj#|!%;u_NCX#qY_Eyvu&W^@3z}q={3<1Us?> zX-VzK0|Z77OlC)Bu+Wa$k$XUz?taI^!%DCtyQ0l0?8v@STM|2xrpWN^$ZGLx+8s0b z9{rPKcBCE|DeOoD*2u9V)6=XSxt2d&J5mOd`Dxr7$J7fFDrl@7QKoeY}P;FB4~Yq zv)G9RFd3eI24cifTMt8JJ*+Hn%c{`mhu86Ajzq3oXJ!<7O9)eHH+&rgG_q4YiY$;olKzV>%3>%h)<=4TKz zS4iNIe?b#S-{husVpF)lEzUSst>L@Sm51vo9J~$8&A@$cN~|VnQj+{4+n`hbyO!7srA8sqh!wNGUyAOs+-ug8|)ZR*Ic=jz$paB6F< zy>nY8sO8!lsyDrey%2;Sj=@0S*V}8DCH)s5oUy2l3GnkUC2ZXTmy)64Xvs#?lD$kz zaH;Yz?)_v$CV&Ub$28j_;cG9iV#kX)sQf^;0mE>ul-mZN=Q_JI`l&Z8qb33^)8(N+ z&b|Sn+tMH1j+ww*|FX{-7pKx59!^m4?iLF%-kq8Fd8L$xdd2KjegbkGoF^gj6N5J`K;&9{QJt8L z8fx*6*m5nov4+S`Sjn!2NIM=p1y4qI6g8N@I}3~l!+~Fq2QN1WDM=0iCm#=f05_6X zDx%_5Sks~4u-F?_O@Gd&Q11ljVV%U)N!{Zz#Pv5T|70K9n8abY5q;OJAO=UlF(6tg zg)G}}tQN(;8WUtaHv(CDMQn!h>lnidqS{q;EMkYpYcZw(J~1Y7q$pjkL4L+cLdmCI zmAjrPvIeE*-a^AQ*x1ndS4jzjH`s(Bs5AZ}9?xYIr=hhNg&Be*Y2@+eFR27|+V`5z z`yg&{q`Hj_wt0Ls^d+Hww@e7(7q7vV6Id`LTvwC>?iX_<3fi5|N(ZY-bf zLIpbG7-Yy^v5Dh%d`IG?+{KuPZ?p*o|F3sR9?!(2*m!8xyW9hsfF9XP@A4`Ly{mV5 z0QA`Sj*fTvI$qMEET9IT!L}KQfOq+O+LN92E+>JSZmr2w0BCFSR6Qy8odo|%f#lZY ziq}PPciy{9rzJJss^ku$n;W0qIY>I0Q7k9fGXW<@A6#qXYDv1##RKp%Uqjcz03YO={xl$q8Hxf z6BzN(m%p`lS+bOTcD>6Rn3CvSZifxi-sQ2 z@-IB>C375k2kb^^e~pX*i{#qe1#+$KLR68RRrL~}Q3PHL4`(xjoT&`3WsjqL!S@JeUL`hE})jg%^2M zh2{#MaRs*gn}?Y>rmhZcC_GFuN~LJ1TL+Q=tOC2V9S9%RxS%jXpoI{9=E+u9D^5_;lryqf`L zaV-gknYIf3MJPzmXNlMdS(vE9gE0b+nP?rE%V|*sUd+RT3{tDi80(*)m2KgxuEKv= zEw~> zJXem2QVUP+Bt zyoirZMv51W#+&ask$;TS~Lu>D+d~2 zMAOi)M*N3wf5nu^PpQ-piuo21SZ;Ro_<)^_JIO_#pVERqr<3!m2VFil80} zDaW6T0N5oKOsk_7l%tA&!?Q8HVALp0_(b%3%c%GBq|IopT)RuniG*s%*CD(m7GEU` z*y>rENbMraQx#pzdsP8?AS5*!cZSL3=8*WIwHH!BwC0=(++D|!g=~{RQw=X&K~|J`#RwDPQ|}WTJeu`#TcPLI^XF5 z>1DfwE3!NJuxmr$9m}lBi;UR-oz`sp0)s8(NKFKiMH^}GL>njdCqG*{@gLs%<3CoK z8hFJnVng@Q&DQ0rfTHzI5RCJ=&)vaB$dfZ|##%m(QjjqgNU@Bk^7tx^3=VOdr)UyF zMhZ>sByTW&@>v*I+B$u(J`+h^X&oPzk&xc6-*Z7EsTD~Ck-+MSa4)USoO>9_lv;lO z7*;GTYDu~TNgA~eMe08-q81Q_1^G9uO27qkG-i(JP5W_{- z!Feui7J`lNoh{44co3eqLX*kkU?uSbw~IoAGPYd}lOd6J%3C_L_F+eBCMMOI|1?ou zMd?0HEd8ugdQ#HTFQT-b7W@W&lwSIEG(+Tcsbp~lJY5qShZ)ln`#Cbn>9u&kODCO7 zm#lPce1DC4Un$>0j=X~XA0JvSa{KCC1$~}Vt-$t2F|Dh(e1Iye2Yub%D+@@3fJPQ7 zaVsJuX)2OPM1L+^GhNH1>0U|4o1diTEL85!CyeB<>$F3XTLe|#LCKx;x|Q4rSinH( zo+Z~Gr8RpOzmrmOk4cs*xuXuUlADW6Ult} z$vt_9mE7t_x=8K?BqfvF-hXi=Hyg@rC5QXd18=(6oqnhHsV=$t&#-)G3f)EXHq08J z@=Fxh{;Ep+2Gu5(nCF(zibdbUju9Mysb9w;5kK{o(opjydHdrlj;HoI)OiLCvl~)z zq=8c+ok2Vu^f>K7hq?H&b5-6QuTDtwe6qeL6DOvTidYL1_0BIYizIvPLzyGz<|P~n z!f1)3D)=GS{>y?2mXOo)JKr#z5{#B_-Qg!1^E!yktku8@H-=Yf$9~DSB|jz2DQfbw z+xfx}I9{T+w*$_dabwQxM!$H-M*s5P3jq~sm(Gsx1kvW09t_6(OIbH;hqJ48HIn>w zkNsE#vgO8_AA_8L_oyy-2X@7~cL4A5x4PifGKTy(jvxX}ewnu%cJOrtxbBXoWYd+G z@39%)Bz>k+q{K&|{B?_{+OVdHCxh_V6S}EfX_GI_$G$ANs%_Fi(gxo3(d8wD{g7q& zs-d^N>GE|szI4VW{M5=#Wlj&go}e?FwsgG*?AM@C?*+3pwypX$S@OzDlGxemtGq4^2*X=uKzj`wrBF<-i= zSDxRZMEMJ(8iK=Q(@-8I0nxOiUBMaJJXto9yZrMmZ^4Gr&FLWZ<=SQf*zxiSk zzFg}WY%OgmETi;#n8mWB)LH!l4+6IoC|u^v8UYiH<*FuSb@VrC@A*$E+-CzVA(D?l zEm}4Pa?*d2LT37q1(Xuxn)(*Z{{V+5r_ca+W#5F7GeC)SGgoWogN0Z@(Nm;$6!)oe zN0^_9MBNlfNd78;iUy^vw>?cLJJ_oW5%0u(eQd z&3K1CkVX$hmn5M^GeJ3R_=I$?B<2;jsgZ|Y?Ot&QrjvA}aBF#Caocs6H+B?;+NNMq z(_UB-yAJOU%9$=4eKOcskCqRj{`}E6adb0xd^;4Spl|0fYM;l23an3h65YQQAab0{(zk**wVpo< zNKCDh_|ZeHSy*;;YW?~BwpK=pbyushbjGJsr>WU(u>;zvjHpZy76$qYM?1irhQ~f- zWmeAm8oslatNh_f^C{^b>l@?O*DH93zFxuK=;I#+df1wS?qsiQ*I&f|Kp&0&RQshj zkssXUQ+>}yj@=LbVp9Zj5IEWGD52rsyhpIb5ydFZz%%L_FMFnyFJ!cf3{WvvJefnI zqTvqw)JDqB-+(HhCRimA@FAc?S#eE^__+HBP??N{z&Sw>web407#&}BU2UyZe*t>B z#@l^6L%yXN87Whv6)L_+)-}uxH7Bf+aSj1~(jI)-+E8ve7k6P^WOYN=`w$votW;o> z>7k~zucD@eyKrJi>#4rEetiYndYWPPF%*Z~!WA89Wq7(VJJJ_+(CZVy>JI*u>!G;0 zIL^$!P~O-+G&tD}&F{jqgxEDrQlHhU)yV5&`-5ZC)xJy$+=x0{CrXX{0lIUz0NzbD z{_3{q#hkysLVvphr=`)Do7N%K(2(*>28;^?L5u0ew|}w)Eie&C&HNalt=JlV1S61u zL0aVczULEc=gu05?+&$rrkHugp0QAKW?0TV7+eSn z9TJAqzvHRwBz(aI6L@>Q)S)0oMvtzy=q~!J3?MRwaCe|rx9IlSO7X{fb&Iadadve_ z=WZ-{*-CB6`xEFkd^wiY*m3-uPJfXgoV_aCkj_XwOuT|ba7J#P!OIx#XFKFs~iL{E<(e>_qKQ46o8p#L+!Rtq{HvY61I*k-~ zECS(jG1xmrZ;sL!5%sY`cDtPQ`>{s(U(Ii0s@P zR*fY11PSu24s8Wm(T?`4r;FWNA7rNmTauYVB<71ba?ux-O5lp>d5r9A{1t8rj?Vk* zCum2RCiY5?e1~%{&G{GyN1(YpdKt%lXqz}Uf@3e(F}0ciNk&7@uo15SI-wDK=K~~9 ztJs=G$3lwEnn|Ry>DS2j6!p!}2KD%P`7BFs4e@>snGr))&K4eCWzh93;gR@imJ0W`aI1pbTG9#3R@wQZheWUxpwlv%V1U-oEj@*o@j! z?#v(H!*%Pg-L_nMc{E2Zmx-po2_~ft6>{%ImWw4>pU1+x-{&c6UhFMH>2 z1a#+mr7Uw=$~>V-?*ppF46o%PN@uhB4RQm^>WUjiaX!u$Us!^>;**n9#V6C8U4|dweqr3=+viH%!qHBhh~c&+LIteI_)chu=n~;aILsVf4I+s=rQhqvu-@ zy<`$l~;cx z6mm(83T2nnrbS>njzI;6+fwivmx$7uST+Hm{lztmVC`7jL`*mEI zZyw5yBr8>~2UqEGT3T|j4$52_4zvdDczXN?{1;8R6()mXu?2McR4nv5vnGNr_Ke4b z+O6F`2Ml1YWB2bwQqbsrfbI*U`z`GL=cLov{eSX9+x<^5q-eXppVTXMKdTD~7bp@S zdzq6tcK^m&s)3jTJwFn=e?5}5-M@@Kt=)g(8N&b9>^|o~DeXQCS`xdj??e^>W3`6@ zwsv27O+F&+Sdw-hdrUZK=Gy&>EBxHtE_VONlAFZtpNf%G+x;_vpC&;13;XaSBBBzZ|=NGy4yw_%C*U z6i|Wxty{!SfFc3-bkCbj;{ zD%lp1#UNB*t-tVXH=9E1FF;#KGIsg!V6oZB%;|$RAl66^0;<*0zHuN4t>z$LRPPV) z7Np5`5SR`icMu>$AyKLA6j+{UNNo9*sg}^+k_N_>Bn$#yV(UM46e?hKRDCJ96a_62 zrE_Du698SIcrFKlGoJFng^jlh2g ziDM~i-kJ0IVz+Ew`&|43uCS{wCczM83kLFm`OJ5Qo_nMisQWtN&CTAuvwF_tV2TWIVLtS)b8r}9Ml7a5-g5IY= zU+)?85e+&YpyDCm%-8g`TY(Kj2To>r#j9e!uK~%S=5R%GS{e2_n!)j9vD|Pow-_g@ z@8fZ#q)+*PhEV-XFp}oGei}K-LpQ7Fq4bU8qp5bIYQ2bAN68+EnyW*br&Vn3RM&zI zYsHP8kPhn!Z`+Gl8?Vt=8!r^BjT-AhOwl%1hgM9hSn-Rpz47~%fV{vl#mlT|0oCsDgdd+p20>1wo5p` z$M*4)=c;6+rp3~bJa0H92jpvUOX0RYW#hW`kbMDbJKTp_m)AdLYbthX`a6>6oiyHn_W5I8AXIH)%Ly-ymiwH1ph&*9pgcUesZV(sg240s*TcD7K$ zXqAk#AjIDd#Pqg%@>te}w9w$)fLvJ?ZSO44YN)E*)Y(bGTRr@VhVCLr?m`A}cch_k ze2^Yzqg8hSlD1I;ZF`hPS|(zC9+&cg;1JY-sN4H_1_n&x?y|BTPilZiQ3LS+9h-(C z_XC}xhKd&vy7WHL^tKLZpv+pMRl_k*vINfDfdF@D$Im+oQh@!-Y^cfyG%@m(gXFM( zgmosJ0vbQUtI9)>$Q=Il5pDzyPtqciPXcm4vJZjf5s=O5rq`2Ry9Qr?cz6&1j<)fi z)&=;3&5(YfjI5{A>SDOjxGvnBC4RV0G$~+QTYA}E_`6FPUTAO2;F+Md-O90-66+Vr zT$y$_&h&NCJ0I`|M6|bu>yE7seGnfYKS$uFg3EfkIJkzK(XTp&<_cUp8);P zf_|t$5%|X2t7F*As@M(HW@X*>WAr+eaw7`HCUC>e4;T@O>|Q_y=5gla6n&?pn%a*- zhYpZ0S`RinqWWfrHk4$62vRJlGYj4Fhj!^UL=>;_dDgTahsUvu>>1ilj6ByhFCxZ}S z*p7cgnMKKy!*zXAW%Nsx0i8-#L%6Pgs*GJyW$cJtFWn?AEz>GSahK`{FV8ldaRh^5G6MKmWV!U?RuG8RNZhaq5^Tx6+tNV%pEXG(n8OrE?aZ;#X7^vxO6A%g`2CN>C7^f@g0pP+2?74p_ zmN@%4T4W4KUP(vmdi=zV6lo~*yFEFGu{8ORGc-HC2lre<=qx!bfd+7OKyAT8x!dS< zMXTDdZs-j4w_(7Q@Rh8pTci+-F)2}V7CGEGtr6cCA!SKI~R)4m4xf_QOBGaFG`ur~%H?KtX9 zlwmmE+Yo9d66gn8r89nxGwUj_6H_8Nu^s31E4*$0@`6Y)tV}b`QAheppkTryl6o5@ z4o^W99BfvyWj7}iRr>oj_x;sw^L#OYL@Wx|U#xCLIU8G97Yg}2(Vtmc8z5g+C$B^i zeYw6RUo!56R2BJ|nu=DQgp7pNhqvvKRaGXxvsW@DyGZ?mk;(k%hadhmirPJ|G46Sd za?dBgVd#h-k5COhbw1czwygEQX!>s9=6*vPaW%(!+%KK=G?$kk&8(->v!gkEB#{nD zdnaV3?etXmKipRWOy4m_mOl>sfOO+8{J60`|EGn5JCPf@~ty>%zP9BXij{)LaV%>O4qQn5mP2!%f~pCj*t6{5?qyre#%UC)0?9 zkqPwFM(2SWYYaQ&I~mY*JIpRA zgK@SGNd0%K3u};J+c5#{P(@{`B3soR_p!FM=n-k`vZ}$sCY}Sj_;`V8VjKl@6N`|6 zDYI%KXPoG=J+$#zIltd{U}n#4yqNq(8?QlyDcZ<;KdhNjq)Qv6sNcq+J-4wObop)E z)oshssisJ05w_s%wJeMj)uJ02@Z8lBLUeT&*9X2!4Mg?vGnr8Na!A%+8q`ty$ip%K-`R&FrG5f>#S^*$hM8z z!T0)1Gsd$SVqPOv6G0<4fMy(pAFZeZm54z0&8oV+8-YyliIYmyPBnI+y0-9VK;sK! z&1Xg+!XA)zB3uJ?A5DTl<|jqh59mxwCMbb)fEe|fR4Rc?6mk>vXFFKmmD~paYRDZN z%U9$&0udx2dppRER9y(RS(%)q_zAHTMye(tCo=0a{KcZU@R>qdA1T?8Qb=bo)J^N! zL?xsS&c|y;hdQ!muwtd>-~g(o#!s(jCsUR)+%`e?HmCwUw3h0U4O*J}m;XX8Fu^cO zHGyK-u9ZtR;nOtFPGG;HROy>q zlJjEc-UH0~vST08)qa?YpN^$g=Z`Oa`pu4qIYXWz57AVN}b^K))TJv zBv=9nxPgmBW>t4(=nJI9j(_2~Z(d>iQ|$OxzIpD2@_|Ul^>(2z1VvWma+HXVWcF*@ zKl!HYpZxXBC)-~udzZgnXWD9=_Ig=^sqhUn3>7jCfs+l}85OncpJtFNLDLeboh5~J zH9{FGe7zi!ZiyX+RR{EZ{KV-@tcB_ZUZm=4U~5eSkw^Bn{y0fqGTN}b3QlftXnU4R z9CEJBR`hQG#h%5&cX(T0b@D4G_6R;%O1ndQ-p!FrwLM&y5q<-^j#l6(p4K`Ke+-1n zogAd=P;Mv-d&jYs0+=e1W&HQCv9}AIV(ZgW--fW&@8LEaaXVI{gct7I9o4)wavzblhvUOT8UdJgRWLsF_%+V zBlz>!3d3A++FI{NQEiCN!kV+#E(37&&aE!UIi=04e&L~9lx`Y$Kz=EH>r;vB;V z4D?an$%_EfdIWi4>k;)?RnHS)uJuWXaW~wycnPx8TA#)rpk$AF9p(|;R2tY?3C@sF5w6xT*e*7w%->bZ%(%izRPdH^KWq35jb2i}GSunB+WfQobbfKF`>hCYe{>O7h4^(TLdbCV7N6 z34X* zWyI$ANy3Vv%-H|(lV}wpMcJ__ev-nK6T8??$`PpC*d#wmS&cz4-nO6#9wgLZ7N28` z`a>K;86(B_OYkS%ThWh?lR7C}*;FjfAf}V@yfg9x04a(H``?7ZdM6clXAJK}5y<5Z zfgjNu;E}P51$bm{fJe!Q>zy>JH^5_Jy9wqoy#X$Yy~lC-q@vyckB`*|@c7;UPl$yD zc!ED>WoF&{QwTv_Eu&%pGM>B8xd}|~>_Z#$=Dz$A=Td$t)3451jib`6gz=Yu_O;&n zcaJgGr?HkM3C7M`YWB^o{(eAesP)OA=mt8tp7fz;eXI4tYpA1o+`iK)I?~HB@fZ8j zD?^*aPuRpUZxbAkLu>!e+x;-ebIoQru-4YA1pngZ(bMR|bflN(%^QVa5=1ds`-=Y3 z94T%=aFRD6BYxn#k&++Nd+6Y91kVK*x2b$%PZKH3-2n=ZNlM|LZ|a%COm9MVcN8+; zP>2ymZDZAW7>mrFFFxAvVRm})*)E@Ie;1z^NMNvXuryYFC>N}ov5LGq-%I9x(EwOZ z#N+1JO4XJ}mr8Cu?&uFyTtOnXfxZpao(JNUcCDn#CGMkKFj-Ou1 zTFF$K*2r8Be@K^H@5w?(xK3?cBeNN;)S1n4-@9gIR@FZsbM1sJ^VVd|e>G#-`x##2 z?x6+VJG-OF#kG;rCEjb^rmXo}vzL98?JXPdnYU)ZSK2RJ>8(RX?y`?^y~Y9U-a7-f zM~WLGrK?!N+xh~KBUsavXyRqfD4{c!ZAL|=5Z$kB^&38`BagZo*BNNgLA`DOp9*x-_N^ zYxWLZeq(AQB}-B@1_zE7IfVj^S-`u;d(jxxuyFl(=04 zLE3Y1nGjwTPJ{o~9&Yd4J=B39!DF~|%Gne&fFAMDm{deC`%0tn4x%{%!J$gCu%wSt zoP6t2oebGxDV5gFaYpMPg{r-iT=D7AZ?V|cF)s(^Dp~|1m4QdrIq{HEV+VPY@?a#kOcmJQ*G4SQ$J zxRZ+{=xFJ)CgLXQ&Su)Di6hl4Qd&hH8^LO&N0P1C+>k}|dM4vs+(jf5qg?K#OBiZy z{WGyvWS;C*G`B|iTWlh8Zj$;k!^?32RdegL3NGA`LC9Y!$Y+5BSk_BdK}_I!z3GUs zq#~jiBVftNeEJAh)`nSnpXIC|yBpYp(ImoFWcF!b^)0ew0-G|DP5Jn62`00ca3KPq zGqRp3%KSB!LCU`GfAmW{?JuKd#|D4Yd=28R&3{i4{86+2^#PRS2a@@!_A7PmhPDZT z+WTcy^$!p`EP>d4b?(HGR7@?x!xWHVqY4lp8y%Qj!aP$47>r?L_UoXWWCftMZ|m$7 z5UfBpw=T3GUDf6g;Is1}Zs})&<06{)RHwD@DljoKl8BdfjX(`t+58SU2^pPLnJh*- zDd;eO+TH$U1eyE0sxl!e%IDBs+7?~`!(;AUmsbz4uwS?$>yLFHP~_UK#3&v^a+L#?ra2qi2IL_8-QJ`NkyOn}l}}QFY%Qsvfk_SE>Ibt@_E|nW|B*5&TKR zAOz0Je(g=<0#P_kDpH!(jtjRrDaO>Mt%vF-IMw%ohIQ5GA0?}PHl!`rSP%GxNVF>>WEucK4_-&WFGfJ&BSJ-tl4F>3ND zV^|3mV*t$hP!a1(s0dpPoogZ$IT#nFwJyha-hDL@Rn0RyS4}8KOxU#6a}p{V(WO0y zb)bK)7A1*H9)nioAke(~mJG`8d@E9tBjeb#)-4k6;Ipi26~ElcDk^ehaGciqN2vln z$s(U=gRsvKs*Hvnr7^tj4~$KC6kLZsEW$rnMxD=$tB}Dm6UHz>bfJ3@l>nub9EXw! z`KX#o&6~r&I%6m@JV}V3psU|j!CDrn!MmyquzLJn%HMVf&%qErt#u`%DgtPw35$S3 zp^Zo;sh=u%yRbG21rKWe^M?TEP6#ms*E@$p(zMniC8opFl@rlo>{{36ov*7Rhu+4t z))f+4Vd}~@bva%6^Fw#CK|m@l%%MZH3!|GiQB|4Jg^9?-KZ4;P6zSr^%t&g@#$6+w z*q|)`t*@NPnl$*^HtEcK?I~z3R=|}D9Pdlw52Rg{M0+lS>@Wk86%dTQvkdeynA{o-Jw>ZKWGV-fr<946S$b53DCQx9WjL5D zM0WRjit)Y#C?&Y@%PCz46Uo?s3_X|}sjGh!NkW;}vEsa7r>})K!H!U?<%U^7*0Jc!HJ<E`Cu}YacN5$qyIYVY(C~9b z!~I~9TK83_cKcunM`Fa-B5mt*RVxojORKKBgr1T>FxWY#6C>&@rlC4D{is8n&CTn9 zM^Yx{Mx{sravivRI4!H1$$cdi$gp*>d`MD6WnflElsN#+dVIOJeA#xmYnP%bZx-G8 zUg3i!Q&{%SdZCWD+A1s($v2D6Teu=WEvvF#8k@`L7Q7laYXRwsF2vtRao+Rfgcp_l zyE%)PCVva(Fh6UC$D)gwUbvVk*L^Rtl(2sHm`+ndEhxKIyCq!msa&|N0t&g>v5R}dmH{;{mEIST z#jGc?l=bv^ZO={K;&%M0MOAi*7@*H|J~omA>H; zKZitl^7mU4U&VSNvsjN+Fsfkd0!&3xiT<+v!1K^FucR^(5V~l#=xu0Pq@>a!q{b?R z_?b*_jQ$%X*m%@iM_~&Cj!V^10>Ez4dPp}EoW3t9sP;;3O`xEp8bo;6t*w}9q#}PW zDLm6Fxht{oOctJ))B31PRIp4_gd-W@&)H?Mc++~9N@mY%t(M;$e$sV^D9uev`?VLk zPjvyTaj7ORqh|R^nI^q5omyng7GrL`ISek3$lt;_%+H!}3yUshdf{TG&}SjmY1^r8&d{#bjEcMA1_*30F9aIJ+pO z#cG8s+VXpu_2`kHQCV}Ya@De9c`Jsl@!nC1GN!CVM8o#MTffPAe3`QKA?`aVc5$=I zVHd-by=XrE`s^xT+MMA`lfQ*?n4dKxEbL->;bNwcU4$)MN-R?@@!2&3-`=c|_-ok( zN18iemRF+)vUChV^y zl}YMjllr&b-B$#&vS_~)!%jp1+#d0Syt^xVx5e;DWrisOT``Ebp6mq-Q!4ljftOw2Ucs+NNS>Y+1>hMWomE*bqaDvV)bW*; zsv;-_=9XU7c>IV~U4Xyz27ht|rZ(zJ2Gx3TI;$q@>=Ti#BKnao6GGm)A=5)f!{tO~ z5gmTX1^|8nwUiZ0MBlk{7Hih2sPOB{G4VOrtGWkFjm+U+Kd%{io}|V1^+{Za)YgaC zbpwSi09v*nY70f8M8^p3Nk~H%j}#4pPF<~|FXCgO>Wo4c@8LFVl0;OVR`gjDh3E_M zw-1i#wYW|zu%f|oMD>gVsqgr|Zgi*x_d>u$zqgC?0?L7%4iRqUfK=?_R)H@;mLMO+HC*tHySmTMgZAJ8?~=Jp1ScnI1o(NVE&$%+ z>(zS*xe%{Kt9d`r&SpAaEkK(f59r-*@fK^7I-iIJhZs$UP?Wl|J9e64~A)omOtYyz6SM}2R<5!dPQU@)A;r~U%acv42^7^ zT%=3hk3&*qOi>Xhh|pHqTI_!cQA-os?f`(&CtS&1l+BYqjDW5~1hfWuSwOIsB)TV1 z9Lk2S+;^SV?rm2#F$#wXZMz9GO%Vik*()K4447aekF8lWa82QgrnK@i9@{f5e(Yzz7aPj#XZB~?kb1hpb88$ZX>#{;^w4PjVryvL>@Zo%*19=opr}aX1}|%819ZSLj#k^^m$lAmqa!@JJ~nOogVp?FQS3{cHdE z>>5YB(WGQwHCb~VU8LHm<{ysZst5InU8MC-3<3@Gb#ugPA$7B2HS|}3L1-%h7T@USE3B?SpqE^Pw z#xEp7#q?>s9Th3!O#vwbTo}H2x|wSOyCx z*sH*hpvPF=c2R=TvP`}hKzzJeHBgfNiX=2JeyXmZOz^DL4*iYjtHz<{Z@UM(q)0BU zZeqK1L#j>!08jTT?6RJIh{CSf*M0$s7v(aIpMz%W^P#QkEE*aQi?%@%Fx4S|zk>uw zgVEBtY_QW$zQCdvjGqK}&JC!1SJ(!Djd{Fgr6<^X1-4xdbGWcdP@FMvlxk)eM#Xxs z;;v}ud8*C+((dOKksFlI7BORQWUvkN3?wMfP8VY8Y>JvLgl3{lCaw*H;-j^Th=Fks z+!ql%@15_;Rgzvo66K0sCp65)H%=3|^5PnlFE4@mohqf}RU~C7FYYib@y3msUOyKa z%IhTbt#oR2{91{M6g%^C_`agMqjc{Zu5KNdRRU)P-1?s*B-R(oj_4`Xg=E8K_AUW$ zewFs-@h>#Kfy_G#21z~Rf)w$xYKJI?D>MxzqX2})c4K=&m676UaHhfJN)~*45;|FN zB~$eEb)5rLL1gZ7u)>O;15iQhez49elqNEVJwW4lxD<#bfexu;$d{(1?jV#(nk}S1 zPLrX~MOl`!uQlgE7jV%A`+dIV*)ng%vabeL z4=82l;8aS@eMaVYu2bjT5Z1WfX)21a0Y~7@V`xwOFoTFN^haGR8un+nKv*{D>MU5$`x zM&+RzC34AR)y+R=pOoxbkIyUFi#{`QqX2I2YmW|#>5sL%pt zPEL8)i&`^)7r5BWf_6@n*YRh~WUACUAkL`$snwDuX8jFWLIt#h9)f7e ze=zGbS|U()Y6K{7nJ%ETWDmSTpcc;bp;RrB2XB(YmA~@!L-70rg#-E_raHcQI$7dZFKr_=Pk#=^f}gDNwkO|Qu41ZSu0RhtI=kk$9CnDCuZ`j6o4j|zA7FfJmQx@PZe8=ymSuTm>E70(ws@a;IPTIk0I@b}2Vf-Ps;hJs z9Ipv&uB@B-0AE0b5$`Lb!P;>Ba641u1ED)aS91!wHgu&+A7^PF(CBUV>B0h_r3+Ky z6Q_(PmCItgsH^3Ui4)2tf0{HQu^9BzF(ye4fcE^7$3S6bMdq=oAB zV>KEC;&<+Gg7|MneYG_z!4KjuIz_rN#z{rmAkl&hd*vOXhShy{&_dj`3Jt-43dO+> z9O{xg?o5P!X9<+kXg@3t=d%H7-gBs#k(8PzCunLiU23v@YBCe4LGXv721n>qP=mb# zIWLH#ENQ9};Y^E!QUuOXGONq^d3c|Y91a-*3C>eur$CFGQ%5`>8Yd+H|1*a%I-M&TB$x`Z~SYdDYm#N`tx?o|~b8?E{_0tiE!9zQ13+ z6hP=nxG>j1!%FZyb(kdl$yUF3TwBMdpl8xT@pTm$5#EkL4mhET%U99%gfW# z9F4X5Yv|$$d&6nlj`%>aI99VZ0;m&m4rSme?eY%|e6CEF^=uXm^yBu3i zQLaWvP#hJE)KE_Tz-p_XhTiWV?a-_1H$A5SMZSeD`u#)8SL5Ra4;@aYcn$Po>TFsg zP+}Z|U=JHG-LeqaOG${lluCa<5U%4ua$3Xj`3~>*#naiB)%|1Ds#PLH-?|d+0u+-t zJ?R%y6gh`AsYpuHXhFc2yKUHQ!O}S?~Ni}gH_cL#a0IJ(%R_~ zMt_##NRuOngnsiT4?G3>O|stgA_&2oF&<9Mex0g+nR0VUSKV1pODOQ4~mCx%13tpVK}8!MQw?oqp89eiqVKd;#L zSE;WcON;IW)EP_}gbAsyYXXbK5zKkhVxOM|bow?h8HczQAkWu(lg!;A33jDLE%bal zyJE*apDuS?O4bKJ9{Kr_-p)EKgFk($oL$GFhC3O0jX8G z;s#7~Y_CyazSKdW{!>7%crlBU8p$a`8TD9|novdHNZ1(gk^|e}Wl5ojB*#h#Qe+IJ`r62m5$O5iiFw z2XDTQH$h7eHe7S;`}yc)j(tB}eWtYU#%7qF==*xftk4}}l3AewtqG>T-F!;V{SDfa z!k3jC--k`GveuhSNOyf(>RrOO>Q{jq`y8Gf#@=qU{s4a1Z9p{?DsLt?K14qRI1h~H zy=Gby&j(v{PF!?OI)+Zc!ULZse97n>+n3s|FcWW4;XebPAoE)hB%T}tO)|9fZqX(@ z+?mTSEM{13H!WOqvfr8D2A3lTCdY2c^|*2npNc&*w4;6@D> zkYe(EmW z<&7o2R|_iS>9-hLF%#ADYDWA#92vgERSTX+wn`&sW4FK(@&;9Mg9a4~Mw#B4p}0dF zj@yK+#~Yai|4AUyO-{c)D8jWRRV2-(!?{Y302Bz`ZFspF|6zNvE~O-^=ll>)f`?`v zhDdPIwu+Ksurl7D+^d;TRSdXPJTdRA6+VR_ZbZC`0jRi+>0WA1}4H z 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 OR%KK9Y`J!Eoc|A3JqqXm literal 0 HcmV?d00001 diff --git a/thirdparty/google-breakpad/r318/bin/win32/dump_syms.exe b/thirdparty/google-breakpad/r318/bin/win32/dump_syms.exe new file mode 100644 index 0000000000000000000000000000000000000000..79e1b7f7bb11019beef63be8b66dd503ac72f9a6 GIT binary patch literal 23040 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 CO!YGW literal 0 HcmV?d00001 diff --git a/thirdparty/google-breakpad/r318/breakpad.pro b/thirdparty/google-breakpad/r318/breakpad.pro new file mode 100644 index 00000000..8e1810a6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/breakpad.pro @@ -0,0 +1,315 @@ +###################################################################### +# Automatically generated by qmake (2.01a) Fri Mar 13 16:41:05 2009 +###################################################################### + +TEMPLATE = lib +CONFIG += staticlib debug_and_release + +BUILD_DIR = build +CONFIG(debug, debug|release) { + BUILD_DIR = $$BUILD_DIR/debug + mac: TARGET = $$join(TARGET,,,_debug) + win32: TARGET = $$join(TARGET,,d) +} +CONFIG(release, debug|release) { + BUILD_DIR = $$BUILD_DIR/release + CONFIG += warn_off +} + +BREAKPAD_DIR = "$$[UNIBOARD_DIR]/thirdparty/google-breakpad/r318" +headersHandlerMac.path = "$$BREAKPAD_DIR/include/google_breakpad/client/mac/handler" +headersHandlerMac.files = "src/client/mac/handler/*.h" + +headersHandlerWin.path = "$$BREAKPAD_DIR/include/google_breakpad/client/windows/handler" +headersHandlerWin.files = "src/client/windows/handler/*.h" + +headersClient.path = "$$BREAKPAD_DIR/include/google_breakpad/client" +headersClient.files = "src/client/*.h" + +headersClientCommonWin.path = "$$BREAKPAD_DIR/include/google_breakpad/client/windows/common" +headersClientCommonWin.files = "src/client/windows/common/*.h" + +headersClientCrashGenerationWin.path = "$$BREAKPAD_DIR/include/google_breakpad/client/windows/crash_generation" +headersClientCrashGenerationWin.files = "src/client/windows/crash_generation/*.h" + +headersClientSenderWin.path = "$$BREAKPAD_DIR/include/google_breakpad/client/windows/sender" +headersClientSenderWin.files = "src/client/windows/sender/*.h" + +headersCommon.path = "$$BREAKPAD_DIR/include/google_breakpad/common" +headersCommon.files = "src/common/*.h" + +headersCommonWin.path = "$$BREAKPAD_DIR/include/google_breakpad/common/windows" +headersCommonWin.files = "src/common/windows/*.h" + +headersGbCommon.path = "$$BREAKPAD_DIR/include/google_breakpad/google_breakpad/common" +headersGbCommon.files = "src/google_breakpad/common/*.h" + +headersGbProcessor.path = "$$BREAKPAD_DIR/include/google_breakpad/google_breakpad/processor" +headersGbProcessor.files = "src/google_breakpad/processor/*.h" + +headersProcessor.path = "$$BREAKPAD_DIR/include/google_breakpad/processor" +headersProcessor.files = "src/processor/*.h" + +INSTALLS += "headersHandlerMac" "headersHandlerWin" "headersClient" "headersClientCommonWin" "headersCommonWin"\ + "headersClientCrashGenerationWin" "headersClientSenderWin" "headersCommon" "headersGbCommon" "headersGbProcessor" "headersProcessor" + +INCLUDEPATH += src \ + src/client \ + src/google_breakpad/common \ + src/common \ + src/processor \ + src/google_breakpad/processor + +# Input +HEADERS += src/client/minidump_file_writer-inl.h \ + src/client/minidump_file_writer.h \ + src/common/convert_UTF.h \ + src/common/md5.h \ + src/common/string_conversion.h \ + src/processor/address_map-inl.h \ + src/processor/address_map.h \ + src/processor/basic_code_module.h \ + src/processor/basic_code_modules.h \ + src/processor/contained_range_map-inl.h \ + src/processor/contained_range_map.h \ + src/processor/linked_ptr.h \ + src/processor/logging.h \ + src/processor/pathname_stripper.h \ + src/processor/postfix_evaluator-inl.h \ + src/processor/postfix_evaluator.h \ + src/processor/range_map-inl.h \ + src/processor/range_map.h \ + src/processor/scoped_ptr.h \ + src/processor/simple_symbol_supplier.h \ + src/processor/stack_frame_info.h \ + src/processor/stackwalker_amd64.h \ + src/processor/stackwalker_ppc.h \ + src/processor/stackwalker_sparc.h \ + src/processor/stackwalker_x86.h \ + src/google_breakpad/common/breakpad_types.h \ + src/google_breakpad/common/minidump_cpu_amd64.h \ + src/google_breakpad/common/minidump_cpu_ppc.h \ + src/google_breakpad/common/minidump_cpu_ppc64.h \ + src/google_breakpad/common/minidump_cpu_sparc.h \ + src/google_breakpad/common/minidump_cpu_x86.h \ + src/google_breakpad/common/minidump_exception_linux.h \ + src/google_breakpad/common/minidump_exception_mac.h \ + src/google_breakpad/common/minidump_exception_solaris.h \ + src/google_breakpad/common/minidump_exception_win32.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_size.h \ + src/google_breakpad/processor/basic_source_line_resolver.h \ + src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/processor/minidump.h \ + src/google_breakpad/processor/minidump_processor.h \ + src/google_breakpad/processor/process_state.h \ + src/google_breakpad/processor/source_line_resolver_interface.h \ + src/google_breakpad/processor/stack_frame.h \ + src/google_breakpad/processor/stack_frame_cpu.h \ + src/google_breakpad/processor/stackwalker.h \ + src/google_breakpad/processor/symbol_supplier.h \ + src/google_breakpad/processor/system_info.h + + +win32 { + + DESTDIR = "lib/win32" + OBJECTS_DIR = $$BUILD_DIR/objects + MOC_DIR = $$BUILD_DIR/moc + RCC_DIR = $$BUILD_DIR/rcc + UI_DIR = $$BUILD_DIR/ui + + INCLUDEPATH += "C:\Program Files\Microsoft Visual Studio 9.0\DIA SDK\include" + + HEADERS += src/common/windows/guid_string.h \ + src/common/windows/http_upload.h \ + src/common/windows/pdb_source_line_writer.h \ + src/common/windows/string_utils-inl.h \ + src/client/windows/common/auto_critical_section.h \ + src/client/windows/common/ipc_protocol.h \ + src/client/windows/crash_generation/client_info.h \ + src/client/windows/crash_generation/crash_generation_client.h \ + src/client/windows/crash_generation/crash_generation_server.h \ + src/client/windows/crash_generation/minidump_generator.h \ + src/client/windows/handler/exception_handler.h \ + src/client/windows/sender/crash_report_sender.h \ + src/tools/windows/converter/ms_symbol_server_converter.h \ + src/client/windows/tests/crash_generation_app/abstract_class.h \ + src/client/windows/tests/crash_generation_app/crash_generation_app.h \ + src/client/windows/tests/crash_generation_app/precompile.h \ + src/client/windows/tests/crash_generation_app/resource.h + + SOURCES += src/common/windows/guid_string.cc \ + src/common/windows/http_upload.cc \ + src/common/windows/pdb_source_line_writer.cc \ + src/common/windows/string_utils.cc \ + src/client/windows/crash_generation/client_info.cc \ + src/client/windows/crash_generation/crash_generation_client.cc \ + src/client/windows/crash_generation/crash_generation_server.cc \ + src/client/windows/crash_generation/minidump_generator.cc \ + src/client/windows/handler/exception_handler.cc \ + src/client/windows/sender/crash_report_sender.cc \ + src/tools/windows/dump_syms/dump_syms.cc \ + src/tools/windows/symupload/symupload.cc +} + +macx { + + DESTDIR = "lib/macx" + OBJECTS_DIR = $$BUILD_DIR + + CONFIG += x86 ppc + QMAKE_MACOSX_DEPLOYMENT_TARGET = "10.4" + + INCLUDEPATH += src/common/mac \ + src/client/mac/handler \ + src/common/mac/dwarf + + HEADERS += src/common/mac/dump_syms.h \ + src/common/mac/file_id.h \ + src/common/mac/HTTPMultipartUpload.h \ + src/common/mac/macho_id.h \ + src/common/mac/macho_utilities.h \ + src/common/mac/macho_walker.h \ + src/common/mac/string_utilities.h \ + src/client/mac/handler/breakpad_exc_server.h \ + src/client/mac/handler/breakpad_nlist_64.h \ + src/client/mac/handler/dynamic_images.h \ + src/client/mac/handler/exception_handler.h \ + src/client/mac/handler/minidump_generator.h \ + src/client/mac/handler/protected_memory_allocator.h \ + src/common/mac/dwarf/bytereader-inl.h \ + src/common/mac/dwarf/bytereader.h \ + src/common/mac/dwarf/dwarf2enums.h \ + src/common/mac/dwarf/dwarf2reader.h \ + src/common/mac/dwarf/functioninfo.h \ + src/common/mac/dwarf/line_state_machine.h \ + src/common/mac/dwarf/types.h \ + src/common/mac/externals/google-toolbox-for-mac/GTMDefines.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEvent.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMDelegatingTableColumn.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextField.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindow.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShading.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItems.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPath.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRect.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+Shading.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+Luminance.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+Scaling.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+Running.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMShading.h \ + src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMTheme.h \ + src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugSelectorValidation.h \ + src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidation.h \ + src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheck.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListener.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRange.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlines.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueue.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCode.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGarbageCollection.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtils.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPFetcher.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServer.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxy.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASL.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriter.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Foundation.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Handler.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+Handler.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+Merge.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlib.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArguments.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+Filter.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Carbon.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Path.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObserving.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolder.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTML.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+Replace.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XML.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2Runtime.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjectSingleton.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPath.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMProgressMonitorInputStream.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegex.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunner.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandler.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLite.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTrace.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersion.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxy.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxy.h \ + src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainers.h \ + src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.h \ + src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMUIFont+LineHeight.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMAppKit+UnitTesting.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMCALayer+UnitTesting.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+BindingUnitTesting.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+UnitTesting.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMSenTestCase.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestHTTPServer.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestTimer.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTesting.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestDevLog.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingTest.h \ + src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingUtilities.h \ + src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/PluginID.h \ + src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/PluginID.h \ + src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/PluginID.h + + SOURCES += src/common/convert_UTF.c \ + src/common/md5.c \ + src/common/string_conversion.cc \ + src/client/minidump_file_writer.cc \ + src/client/minidump_file_writer_unittest.cc \ + src/processor/address_map_unittest.cc \ + src/processor/basic_code_modules.cc \ + src/processor/basic_source_line_resolver.cc \ + src/processor/basic_source_line_resolver_unittest.cc \ + src/processor/call_stack.cc \ + src/processor/contained_range_map_unittest.cc \ + src/processor/logging.cc \ + src/processor/minidump.cc \ + src/processor/minidump_dump.cc \ + src/processor/minidump_processor.cc \ + src/processor/minidump_processor_unittest.cc \ + src/processor/minidump_stackwalk.cc \ + src/processor/pathname_stripper.cc \ + src/processor/pathname_stripper_unittest.cc \ + src/processor/postfix_evaluator_unittest.cc \ + src/processor/process_state.cc \ + src/processor/range_map_unittest.cc \ + src/processor/simple_symbol_supplier.cc \ + src/processor/stackwalker.cc \ + src/processor/stackwalker_amd64.cc \ + src/processor/stackwalker_ppc.cc \ + src/processor/stackwalker_selftest.cc \ + src/processor/stackwalker_sparc.cc \ + src/processor/stackwalker_x86.cc \ + src/common/mac/file_id.cc \ + src/common/mac/macho_id.cc \ + src/common/mac/macho_utilities.cc \ + src/common/mac/macho_walker.cc \ + src/common/mac/string_utilities.cc \ + src/client/mac/handler/breakpad_exc_server.c \ + src/client/mac/handler/breakpad_nlist_64.cc \ + src/client/mac/handler/dynamic_images.cc \ + src/client/mac/handler/exception_handler.cc \ + src/client/mac/handler/exception_handler_test.cc \ + src/client/mac/handler/minidump_generator.cc \ + src/client/mac/handler/minidump_generator_test.cc \ + src/client/mac/handler/protected_memory_allocator.cc \ + src/common/mac/dwarf/bytereader.cc \ + src/common/mac/dwarf/dwarf2reader.cc \ + src/common/mac/dwarf/functioninfo.cc +} + diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/breakpad_exc_server.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/breakpad_exc_server.h new file mode 100644 index 00000000..c05f25a8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/breakpad_exc_server.h @@ -0,0 +1,258 @@ +#ifndef _exc_user_ +#define _exc_user_ + +/* Module exc */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef AUTOTEST +#ifndef FUNCTION_PTR_T +#define FUNCTION_PTR_T +typedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t); +typedef struct { + char *name; + function_ptr_t function; +} function_table_entry; +typedef function_table_entry *function_table_t; +#endif /* FUNCTION_PTR_T */ +#endif /* AUTOTEST */ + +#ifndef exc_MSG_COUNT +#define exc_MSG_COUNT 3 +#endif /* exc_MSG_COUNT */ + +#include +#include +#include +#include + +#ifdef __BeforeMigUserHeader +__BeforeMigUserHeader +#endif /* __BeforeMigUserHeader */ + +#include +__BEGIN_DECLS + + +/* Routine exception_raise */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t exception_raise +( + mach_port_t exception_port, + mach_port_t thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t codeCnt +); + +/* Routine exception_raise_state */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t exception_raise_state +( + mach_port_t exception_port, + exception_type_t exception, + const exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + const thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt +); + +/* Routine exception_raise_state_identity */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t exception_raise_state_identity +( + mach_port_t exception_port, + mach_port_t thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt +); + +__END_DECLS + +/********************** Caution **************************/ +/* The following data types should be used to calculate */ +/* maximum message sizes only. The actual message may be */ +/* smaller, and the position of the arguments within the */ +/* message layout may vary from what is presented here. */ +/* For example, if any of the arguments are variable- */ +/* sized, and less than the maximum is sent, the data */ +/* will be packed tight in the actual message to reduce */ +/* the presence of holes. */ +/********************** Caution **************************/ + +/* typedefs for all requests */ + +#ifndef __Request__exc_subsystem__defined +#define __Request__exc_subsystem__defined + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + } __Request__exception_raise_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[144]; + } __Request__exception_raise_state_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[144]; + } __Request__exception_raise_state_identity_t; +#ifdef __MigPackStructs +#pragma pack() +#endif +#endif /* !__Request__exc_subsystem__defined */ + +/* union of all requests */ + +#ifndef __RequestUnion__exc_subsystem__defined +#define __RequestUnion__exc_subsystem__defined +union __RequestUnion__exc_subsystem { + __Request__exception_raise_t Request_exception_raise; + __Request__exception_raise_state_t Request_exception_raise_state; + __Request__exception_raise_state_identity_t Request_exception_raise_state_identity; +}; +#endif /* !__RequestUnion__exc_subsystem__defined */ +/* typedefs for all replies */ + +#ifndef __Reply__exc_subsystem__defined +#define __Reply__exc_subsystem__defined + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + } __Reply__exception_raise_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + int flavor; + mach_msg_type_number_t new_stateCnt; + natural_t new_state[144]; + } __Reply__exception_raise_state_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + int flavor; + mach_msg_type_number_t new_stateCnt; + natural_t new_state[144]; + } __Reply__exception_raise_state_identity_t; +#ifdef __MigPackStructs +#pragma pack() +#endif +#endif /* !__Reply__exc_subsystem__defined */ + +/* union of all replies */ + +#ifndef __ReplyUnion__exc_subsystem__defined +#define __ReplyUnion__exc_subsystem__defined +union __ReplyUnion__exc_subsystem { + __Reply__exception_raise_t Reply_exception_raise; + __Reply__exception_raise_state_t Reply_exception_raise_state; + __Reply__exception_raise_state_identity_t Reply_exception_raise_state_identity; +}; +#endif /* !__RequestUnion__exc_subsystem__defined */ + +#ifndef subsystem_to_name_map_exc +#define subsystem_to_name_map_exc \ + { "exception_raise", 2401 },\ + { "exception_raise_state", 2402 },\ + { "exception_raise_state_identity", 2403 } +#endif + +#ifdef __AfterMigUserHeader +__AfterMigUserHeader +#endif /* __AfterMigUserHeader */ + +#endif /* _exc_user_ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/breakpad_nlist_64.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/breakpad_nlist_64.h new file mode 100644 index 00000000..ee10afb9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/breakpad_nlist_64.h @@ -0,0 +1,43 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// breakpad_nlist.h +// +// This file is meant to provide a header for clients of the modified +// nlist function implemented to work on 64-bit. + +#ifndef CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__ + +typedef struct nlist_64 breakpad_nlist; + +int +breakpad_nlist_64(const char *name, + breakpad_nlist *list, + const char **symbolNames); + +#endif /* CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/dynamic_images.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/dynamic_images.h new file mode 100644 index 00000000..85ba8cf9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/dynamic_images.h @@ -0,0 +1,297 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dynamic_images.h +// +// Implements most of the function of the dyld API, but allowing an +// arbitrary task to be introspected, unlike the dyld API which +// only allows operation on the current task. The current implementation +// is limited to use by 32-bit tasks. + +#ifndef CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__ +#define CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__ + +#include +#include +#include +#include +#include + +namespace google_breakpad { + +using std::vector; + +//============================================================================== +// The memory layout of this struct matches the dyld_image_info struct +// defined in "dyld_gdb.h" in the darwin source. +typedef struct dyld_image_info { + struct mach_header *load_address_; + char *file_path_; + uintptr_t file_mod_date_; +} dyld_image_info; + +//============================================================================== +// This is as defined in "dyld_gdb.h" in the darwin source. +// _dyld_all_image_infos (in dyld) is a structure of this type +// which will be used to determine which dynamic code has been loaded. +typedef struct dyld_all_image_infos { + uint32_t version; // == 1 in Mac OS X 10.4 + uint32_t infoArrayCount; + const struct dyld_image_info *infoArray; + void* notification; + bool processDetachedFromSharedRegion; +} dyld_all_image_infos; + +// some typedefs to isolate 64/32 bit differences +#ifdef __LP64__ +typedef mach_header_64 breakpad_mach_header; +typedef segment_command_64 breakpad_mach_segment_command; +#else +typedef mach_header breakpad_mach_header; +typedef segment_command breakpad_mach_segment_command; +#endif + +//============================================================================== +// A simple wrapper for a mach_header +// +// This could be fleshed out with some more interesting methods. +class MachHeader { + public: + explicit MachHeader(const breakpad_mach_header &header) : header_(header) {} + + void Print() { + printf("magic\t\t: %4x\n", header_.magic); + printf("cputype\t\t: %d\n", header_.cputype); + printf("cpusubtype\t: %d\n", header_.cpusubtype); + printf("filetype\t: %d\n", header_.filetype); + printf("ncmds\t\t: %d\n", header_.ncmds); + printf("sizeofcmds\t: %d\n", header_.sizeofcmds); + printf("flags\t\t: %d\n", header_.flags); + } + + breakpad_mach_header header_; +}; + +//============================================================================== +// Represents a single dynamically loaded mach-o image +class DynamicImage { + public: + DynamicImage(breakpad_mach_header *header, // we take ownership + int header_size, // includes load commands + breakpad_mach_header *load_address, + char *inFilePath, + uintptr_t image_mod_date, + mach_port_t task) + : header_(header), + header_size_(header_size), + load_address_(load_address), + file_mod_date_(image_mod_date), + task_(task) { + InitializeFilePath(inFilePath); + CalculateMemoryAndVersionInfo(); + } + + ~DynamicImage() { + if (file_path_) { + free(file_path_); + } + free(header_); + } + + // Returns pointer to a local copy of the mach_header plus load commands + breakpad_mach_header *GetMachHeader() {return header_;} + + // Size of mach_header plus load commands + int GetHeaderSize() const {return header_size_;} + + // Full path to mach-o binary + char *GetFilePath() {return file_path_;} + + uintptr_t GetModDate() const {return file_mod_date_;} + + // Actual address where the image was loaded + breakpad_mach_header *GetLoadAddress() const {return load_address_;} + + // Address where the image should be loaded + mach_vm_address_t GetVMAddr() const {return vmaddr_;} + + // Difference between GetLoadAddress() and GetVMAddr() + ptrdiff_t GetVMAddrSlide() const {return slide_;} + + // Size of the image + mach_vm_size_t GetVMSize() const {return vmsize_;} + + // Task owning this loaded image + mach_port_t GetTask() {return task_;} + + uint32_t GetVersion() {return version_;} + // For sorting + bool operator<(const DynamicImage &inInfo) { + return GetLoadAddress() < inInfo.GetLoadAddress(); + } + + // Debugging + void Print(); + + private: + friend class DynamicImages; + + // Sanity checking + bool IsValid() {return GetVMSize() != 0;} + + // Makes local copy of file path to mach-o binary + void InitializeFilePath(char *inFilePath) { + if (inFilePath) { + size_t path_size = 1 + strlen(inFilePath); + file_path_ = reinterpret_cast(malloc(path_size)); + strlcpy(file_path_, inFilePath, path_size); + } else { + file_path_ = NULL; + } + } + + // Initializes vmaddr_, vmsize_, and slide_ + void CalculateMemoryAndVersionInfo(); + + breakpad_mach_header *header_; // our local copy of the header + int header_size_; // mach_header plus load commands + breakpad_mach_header *load_address_; // base address image is mapped into + mach_vm_address_t vmaddr_; + mach_vm_size_t vmsize_; + ptrdiff_t slide_; + uint32_t version_; // Dylib version + char *file_path_; // path dyld used to load the image + uintptr_t file_mod_date_; // time_t of image file + + mach_port_t task_; +}; + +//============================================================================== +// DynamicImageRef is just a simple wrapper for a pointer to +// DynamicImage. The reason we use it instead of a simple typedef is so +// that we can use stl::sort() on a vector of DynamicImageRefs +// and simple class pointers can't implement operator<(). +// +class DynamicImageRef { + public: + explicit DynamicImageRef(DynamicImage *inP) : p(inP) {} + // The copy constructor is required by STL + DynamicImageRef(const DynamicImageRef &inRef) : p(inRef.p) {} + + bool operator<(const DynamicImageRef &inRef) const { + return (*const_cast(this)->p) + < (*const_cast(inRef).p); + } + + bool operator==(const DynamicImageRef &inInfo) const { + return (*const_cast(this)->p).GetLoadAddress() == + (*const_cast(inInfo)).GetLoadAddress(); + } + + // Be just like DynamicImage* + DynamicImage *operator->() {return p;} + operator DynamicImage*() {return p;} + + private: + DynamicImage *p; +}; + +//============================================================================== +// An object of type DynamicImages may be created to allow introspection of +// an arbitrary task's dynamically loaded mach-o binaries. This makes the +// assumption that the current task has send rights to the target task. +class DynamicImages { + public: + explicit DynamicImages(mach_port_t task); + + ~DynamicImages() { + for (int i = 0; i < (int)image_list_.size(); ++i) { + delete image_list_[i]; + } + } + + // Returns the number of dynamically loaded mach-o images. + int GetImageCount() const {return image_list_.size();} + + // Returns an individual image. + DynamicImage *GetImage(int i) { + if (i < (int)image_list_.size()) { + return image_list_[i]; + } + return NULL; + } + + // Returns the image corresponding to the main executable. + DynamicImage *GetExecutableImage(); + int GetExecutableImageIndex(); + + // Returns the task which we're looking at. + mach_port_t GetTask() const {return task_;} + + // Debugging + void Print() { + for (int i = 0; i < (int)image_list_.size(); ++i) { + image_list_[i]->Print(); + } + } + + void TestPrint() { + const breakpad_mach_header *header; + for (int i = 0; i < (int)image_list_.size(); ++i) { + printf("dyld: %p: name = %s\n", _dyld_get_image_header(i), + _dyld_get_image_name(i) ); + + const void *imageHeader = _dyld_get_image_header(i); + header = reinterpret_cast(imageHeader); + + MachHeader(*header).Print(); + } + } + + private: + bool IsOurTask() {return task_ == mach_task_self();} + + // Initialization + void ReadImageInfoForTask(); + void* GetDyldAllImageInfosPointer(); + + mach_port_t task_; + vector image_list_; +}; + +// Returns a malloced block containing the contents of memory at a particular +// location in another task. +void* ReadTaskMemory(task_port_t target_task, + const void* address, + size_t len, + kern_return_t *kr); + +} // namespace google_breakpad + +#endif // CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/exception_handler.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/exception_handler.h new file mode 100644 index 00000000..2a8ee1e4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/exception_handler.h @@ -0,0 +1,212 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// exception_handler.h: MacOS exception handler +// This class can install a Mach exception port handler to trap most common +// programming errors. If an exception occurs, a minidump file will be +// generated which contains detailed information about the process and the +// exception. + +#ifndef CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__ +#define CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__ + +#include + +#include + +namespace google_breakpad { + +using std::string; + +struct ExceptionParameters; + +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. context is the parameter supplied by the user as + // callback_context when the handler was created. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, Breakpad + // will immediately report the exception as unhandled without writing a + // minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void *context); + + // A callback function to run after the minidump has been written. + // |minidump_id| is a unique id for the dump, so the minidump + // file is /.dmp. + // |context| is the value passed into the constructor. + // |succeeded| indicates whether a minidump file was successfully written. + // Return true if the exception was fully handled and breakpad should exit. + // Return false to allow any other exception handlers to process the + // exception. + typedef bool (*MinidumpCallback)(const char *dump_dir, + const char *minidump_id, + void *context, bool succeeded); + + // A callback function which will be called directly if an exception occurs. + // This bypasses the minidump file writing and simply gives the client + // the exception information. + typedef bool (*DirectCallback)( void *context, + int exception_type, + int exception_code, + mach_port_t thread_name); + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Minidump files will be written to dump_path, and the optional callback + // is called after writing the dump file, as described above. + // If install_handler is true, then a minidump will be written whenever + // an unhandled exception occurs. If it is false, minidumps will only + // be written when WriteMinidump is called. + ExceptionHandler(const string &dump_path, + FilterCallback filter, MinidumpCallback callback, + void *callback_context, bool install_handler); + + // A special constructor if we want to bypass minidump writing and + // simply get a callback with the exception information. + ExceptionHandler(DirectCallback callback, + void *callback_context, + bool install_handler); + + ~ExceptionHandler(); + + // Get and set the minidump path. + string dump_path() const { return dump_path_; } + void set_dump_path(const string &dump_path) { + dump_path_ = dump_path; + dump_path_c_ = dump_path_.c_str(); + UpdateNextID(); // Necessary to put dump_path_ in next_minidump_path_. + } + + // Writes a minidump immediately. This can be used to capture the + // execution state independently of a crash. Returns true on success. + bool WriteMinidump(); + + // Convenience form of WriteMinidump which does not require an + // ExceptionHandler instance. + static bool WriteMinidump(const string &dump_path, MinidumpCallback callback, + void *callback_context); + + private: + // Install the mach exception handler + bool InstallHandler(); + + // Uninstall the mach exception handler (if any) + bool UninstallHandler(bool in_exception); + + // Setup the handler thread, and if |install_handler| is true, install the + // mach exception port handler + bool Setup(bool install_handler); + + // Uninstall the mach exception handler (if any) and terminate the helper + // thread + bool Teardown(); + + // Send an "empty" mach message to the exception handler. Return true on + // success, false otherwise + bool SendEmptyMachMessage(); + + // All minidump writing goes through this one routine + bool WriteMinidumpWithException(int exception_type, int exception_code, + mach_port_t thread_name); + + // When installed, this static function will be call from a newly created + // pthread with |this| as the argument + static void *WaitForMessage(void *exception_handler_class); + + // disallow copy ctor and operator= + explicit ExceptionHandler(const ExceptionHandler &); + void operator=(const ExceptionHandler &); + + // Generates a new ID and stores it in next_minidump_id_, and stores the + // path of the next minidump to be written in next_minidump_path_. + void UpdateNextID(); + + // These functions will suspend/resume all threads except for the + // reporting thread + bool SuspendThreads(); + bool ResumeThreads(); + + // The destination directory for the minidump + string dump_path_; + + // The basename of the next minidump w/o extension + string next_minidump_id_; + + // The full path to the next minidump to be written, including extension + string next_minidump_path_; + + // Pointers to the UTF-8 versions of above + const char *dump_path_c_; + const char *next_minidump_id_c_; + const char *next_minidump_path_c_; + + // The callback function and pointer to be passed back after the minidump + // has been written + FilterCallback filter_; + MinidumpCallback callback_; + void *callback_context_; + + // The callback function to be passed back when we don't want a minidump + // file to be written + DirectCallback directCallback_; + + // The thread that is created for the handler + pthread_t handler_thread_; + + // The port that is waiting on an exception message to be sent, if the + // handler is installed + mach_port_t handler_port_; + + // These variables save the previous exception handler's data so that it + // can be re-installed when this handler is uninstalled + ExceptionParameters *previous_; + + // True, if we've installed the exception handler + bool installed_exception_handler_; + + // True, if we're in the process of uninstalling the exception handler and + // the thread. + bool is_in_teardown_; + + // Save the last result of the last minidump + bool last_minidump_write_result_; + + // A mutex for use when writing out a minidump that was requested on a + // thread other than the exception handler. + pthread_mutex_t minidump_write_mutex_; + + // True, if we're using the mutext to indicate when mindump writing occurs + bool use_minidump_write_mutex_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/minidump_generator.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/minidump_generator.h new file mode 100644 index 00000000..0d3424c3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/minidump_generator.h @@ -0,0 +1,157 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_generator.h: Create a minidump of the current MacOS process. + +#ifndef CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__ +#define CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__ + +#include + +#include + +#include "client/minidump_file_writer.h" +#include "google_breakpad/common/minidump_format.h" +#include "common/mac/macho_utilities.h" + +#include "dynamic_images.h" + +namespace google_breakpad { + +using std::string; + +#if TARGET_CPU_X86_64 || TARGET_CPU_PPC64 +#define TOP_OF_THREAD0_STACK 0x00007fff5fbff000 +#else +#define TOP_OF_THREAD0_STACK 0xbffff000 +#endif + +#if TARGET_CPU_X86_64 +typedef x86_thread_state64_t breakpad_thread_state_t; +typedef MDRawContextAMD64 MinidumpContext; +#elif TARGET_CPU_X86 +typedef i386_thread_state_t breakpad_thread_state_t; +typedef MDRawContextX86 MinidumpContext; +#elif TARGET_CPU_PPC64 +typedef ppc_thread_state64_t breakpad_thread_state_t; +typedef MDRawContextPPC64 MinidumpContext; +#elif TARGET_CPU_PPC +typedef ppc_thread_state_t breakpad_thread_state_t; +typedef MDRawContextPPC MinidumpContext; +#endif + +// Creates a minidump file of the current process. If there is exception data, +// use SetExceptionInformation() to add this to the minidump. The minidump +// file is generated by the Write() function. +// Usage: +// MinidumpGenerator minidump(); +// minidump.Write("/tmp/minidump"); +// +class MinidumpGenerator { + public: + MinidumpGenerator(); + MinidumpGenerator(mach_port_t crashing_task, mach_port_t handler_thread); + + ~MinidumpGenerator(); + + // Return

/.dmp + // Sets |unique_name| (if requested) to the unique name for the minidump + static string UniqueNameInDirectory(const string &dir, string *unique_name); + + // Write out the minidump into |path| + // All of the components of |path| must exist and be writable + // Return true if successful, false otherwise + bool Write(const char *path); + + // Specify some exception information, if applicable + void SetExceptionInformation(int type, int code, mach_port_t thread_name) { + exception_type_ = type; + exception_code_ = code; + exception_thread_ = thread_name; + } + + // Gather system information. This should be call at least once before using + // the MinidumpGenerator class. + static void GatherSystemInformation(); + + private: + typedef bool (MinidumpGenerator::*WriteStreamFN)(MDRawDirectory *); + + // Stream writers + bool WriteThreadListStream(MDRawDirectory *thread_list_stream); + bool WriteExceptionStream(MDRawDirectory *exception_stream); + bool WriteSystemInfoStream(MDRawDirectory *system_info_stream); + bool WriteModuleListStream(MDRawDirectory *module_list_stream); + bool WriteMiscInfoStream(MDRawDirectory *misc_info_stream); + bool WriteBreakpadInfoStream(MDRawDirectory *breakpad_info_stream); + + // Helpers + u_int64_t CurrentPCForStack(breakpad_thread_state_data_t state); + bool WriteStackFromStartAddress(mach_vm_address_t start_addr, + MDMemoryDescriptor *stack_location); + bool WriteStack(breakpad_thread_state_data_t state, + MDMemoryDescriptor *stack_location); + bool WriteContext(breakpad_thread_state_data_t state, + MDLocationDescriptor *register_location); + bool WriteThreadStream(mach_port_t thread_id, MDRawThread *thread); + bool WriteCVRecord(MDRawModule *module, int cpu_type, + const char *module_path); + bool WriteModuleStream(unsigned int index, MDRawModule *module); + + size_t CalculateStackSize(mach_vm_address_t start_addr); + + int FindExecutableModule(); + + // disallow copy ctor and operator= + explicit MinidumpGenerator(const MinidumpGenerator &); + void operator=(const MinidumpGenerator &); + + // Use this writer to put the data to disk + MinidumpFileWriter writer_; + + // Exception information + int exception_type_; + int exception_code_; + mach_port_t exception_thread_; + mach_port_t crashing_task_; + mach_port_t handler_thread_; + + // System information + static char build_string_[16]; + static int os_major_version_; + static int os_minor_version_; + static int os_build_number_; + + // Information about dynamically loaded code + DynamicImages *dynamic_images_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/protected_memory_allocator.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/protected_memory_allocator.h new file mode 100644 index 00000000..ed4f51d5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/mac/handler/protected_memory_allocator.h @@ -0,0 +1,85 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ProtectedMemoryAllocator +// +// A very simple allocator class which allows allocation, but not deallocation. +// The allocations can be made read-only with the Protect() method. +// This class is NOT useful as a general-purpose memory allocation system, +// since it does not allow deallocation. It is useful to use for a group +// of allocations which are created in the same time-frame and destroyed +// in the same time-frame. It is useful for making allocations of memory +// which will not need to change often once initialized. This memory can then +// be protected from memory smashers by calling the Protect() method. + +#ifndef PROTECTED_MEMORY_ALLOCATOR_H__ +#define PROTECTED_MEMORY_ALLOCATOR_H__ + +#include + +// +class ProtectedMemoryAllocator { + public: + ProtectedMemoryAllocator(vm_size_t pool_size); + ~ProtectedMemoryAllocator(); + + // Returns a pointer to an allocation of size n within the pool. + // Fails by returning NULL is no more space is available. + // Please note that the pointers returned from this method should not + // be freed in any way (for example by calling free() on them ). + char * Allocate(size_t n); + + // Returns the base address of the allocation pool. + char * GetBaseAddress() { return (char*)base_address_; } + + // Returns the size of the allocation pool, including allocated + // plus free space. + vm_size_t GetTotalSize() { return pool_size_; } + + // Returns the number of bytes already allocated in the pool. + vm_size_t GetAllocatedSize() { return next_alloc_offset_; } + + // Returns the number of bytes available for allocation. + vm_size_t GetFreeSize() { return pool_size_ - next_alloc_offset_; } + + // Makes the entire allocation pool read-only including, of course, + // all allocations made from the pool. + kern_return_t Protect(); + + // Makes the entire allocation pool read/write. + kern_return_t Unprotect(); + + private: + vm_size_t pool_size_; + vm_address_t base_address_; + int next_alloc_offset_; + bool valid_; +}; + +#endif // PROTECTED_MEMORY_ALLOCATOR_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/minidump_file_writer-inl.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/minidump_file_writer-inl.h new file mode 100644 index 00000000..7c556a27 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/minidump_file_writer-inl.h @@ -0,0 +1,94 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_file_writer-inl.h: Minidump file writer implementation. +// +// See minidump_file_writer.h for documentation. + +#ifndef CLIENT_MINIDUMP_FILE_WRITER_INL_H__ +#define CLIENT_MINIDUMP_FILE_WRITER_INL_H__ + +#include + +#include "client/minidump_file_writer.h" +#include "google_breakpad/common/minidump_size.h" + +namespace google_breakpad { + +template +inline bool TypedMDRVA::Allocate() { + allocation_state_ = SINGLE_OBJECT; + return UntypedMDRVA::Allocate(minidump_size::size()); +} + +template +inline bool TypedMDRVA::Allocate(size_t additional) { + allocation_state_ = SINGLE_OBJECT; + return UntypedMDRVA::Allocate(minidump_size::size() + additional); +} + +template +inline bool TypedMDRVA::AllocateArray(size_t count) { + assert(count); + allocation_state_ = ARRAY; + return UntypedMDRVA::Allocate(minidump_size::size() * count); +} + +template +inline bool TypedMDRVA::AllocateObjectAndArray(unsigned int count, + size_t size) { + assert(count && size); + allocation_state_ = SINGLE_OBJECT_WITH_ARRAY; + return UntypedMDRVA::Allocate(minidump_size::size() + count * size); +} + +template +inline bool TypedMDRVA::CopyIndex(unsigned int index, MDType *item) { + assert(allocation_state_ == ARRAY); + return writer_->Copy(position_ + index * minidump_size::size(), item, + minidump_size::size()); +} + +template +inline bool TypedMDRVA::CopyIndexAfterObject(unsigned int index, + const void *src, + size_t size) { + assert(allocation_state_ == SINGLE_OBJECT_WITH_ARRAY); + return writer_->Copy(position_ + minidump_size::size() + index * size, + src, size); +} + +template +inline bool TypedMDRVA::Flush() { + return writer_->Copy(position_, &data_, minidump_size::size()); +} + +} // namespace google_breakpad + +#endif // CLIENT_MINIDUMP_FILE_WRITER_INL_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/minidump_file_writer.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/minidump_file_writer.h new file mode 100644 index 00000000..f569a553 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/minidump_file_writer.h @@ -0,0 +1,250 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_file_writer.h: Implements file-based minidump generation. It's +// intended to be used with the Google Breakpad open source crash handling +// project. + +#ifndef CLIENT_MINIDUMP_FILE_WRITER_H__ +#define CLIENT_MINIDUMP_FILE_WRITER_H__ + +#include + +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +class UntypedMDRVA; +template class TypedMDRVA; + +// The user of this class can Open() a file and add minidump streams, data, and +// strings using the definitions in minidump_format.h. Since this class is +// expected to be used in a situation where the current process may be +// damaged, it will not allocate heap memory. +// Sample usage: +// MinidumpFileWriter writer; +// writer.Open("/tmp/minidump.dmp"); +// TypedMDRVA header(&writer_); +// header.Allocate(); +// header->get()->signature = MD_HEADER_SIGNATURE; +// : +// writer.Close(); +class MinidumpFileWriter { +public: + // Invalid MDRVA (Minidump Relative Virtual Address) + // returned on failed allocation + static const MDRVA kInvalidMDRVA; + + MinidumpFileWriter(); + ~MinidumpFileWriter(); + + // Open |path| as the destination of the minidump data. Any existing file + // will be overwritten. + // Return true on success, or false on failure + bool Open(const char *path); + + // Close the current file + // Return true on success, or false on failure + bool Close(); + + // Copy the contents of |str| to a MDString and write it to the file. + // |str| is expected to be either UTF-16 or UTF-32 depending on the size + // of wchar_t. + // Maximum |length| of characters to copy from |str|, or specify 0 to use the + // entire NULL terminated string. Copying will stop at the first NULL. + // |location| the allocated location + // Return true on success, or false on failure + bool WriteString(const wchar_t *str, unsigned int length, + MDLocationDescriptor *location); + + // Same as above, except with |str| as a UTF-8 string + bool WriteString(const char *str, unsigned int length, + MDLocationDescriptor *location); + + // Write |size| bytes starting at |src| into the current position. + // Return true on success and set |output| to position, or false on failure + bool WriteMemory(const void *src, size_t size, MDMemoryDescriptor *output); + + // Copies |size| bytes from |src| to |position| + // Return true on success, or false on failure + bool Copy(MDRVA position, const void *src, ssize_t size); + + // Return the current position for writing to the minidump + inline MDRVA position() const { return position_; } + + private: + friend class UntypedMDRVA; + + // Allocates an area of |size| bytes. + // Returns the position of the allocation, or kInvalidMDRVA if it was + // unable to allocate the bytes. + MDRVA Allocate(size_t size); + + // The file descriptor for the output file + int file_; + + // Current position in buffer + MDRVA position_; + + // Current allocated size + size_t size_; + + // Copy |length| characters from |str| to |mdstring|. These are distinct + // because the underlying MDString is a UTF-16 based string. The wchar_t + // variant may need to create a MDString that has more characters than the + // source |str|, whereas the UTF-8 variant may coalesce characters to form + // a single UTF-16 character. + bool CopyStringToMDString(const wchar_t *str, unsigned int length, + TypedMDRVA *mdstring); + bool CopyStringToMDString(const char *str, unsigned int length, + TypedMDRVA *mdstring); + + // The common templated code for writing a string + template + bool WriteStringCore(const CharType *str, unsigned int length, + MDLocationDescriptor *location); +}; + +// Represents an untyped allocated chunk +class UntypedMDRVA { + public: + explicit UntypedMDRVA(MinidumpFileWriter *writer) + : writer_(writer), + position_(writer->position()), + size_(0) {} + + // Allocates |size| bytes. Must not call more than once. + // Return true on success, or false on failure + bool Allocate(size_t size); + + // Returns the current position or kInvalidMDRVA if allocation failed + inline MDRVA position() const { return position_; } + + // Number of bytes allocated + inline size_t size() const { return size_; } + + // Return size and position + inline MDLocationDescriptor location() const { + MDLocationDescriptor location = { size_, position_ }; + return location; + } + + // Copy |size| bytes starting at |src| into the minidump at |position| + // Return true on success, or false on failure + bool Copy(MDRVA position, const void *src, size_t size); + + // Copy |size| bytes from |src| to the current position + inline bool Copy(const void *src, size_t size) { + return Copy(position_, src, size); + } + + protected: + // Writer we associate with + MinidumpFileWriter *writer_; + + // Position of the start of the data + MDRVA position_; + + // Allocated size + size_t size_; +}; + +// Represents a Minidump object chunk. Additional memory can be allocated at +// the end of the object as a: +// - single allocation +// - Array of MDType objects +// - A MDType object followed by an array +template +class TypedMDRVA : public UntypedMDRVA { + public: + // Constructs an unallocated MDRVA + explicit TypedMDRVA(MinidumpFileWriter *writer) + : UntypedMDRVA(writer), + data_(), + allocation_state_(UNALLOCATED) {} + + inline ~TypedMDRVA() { + // Ensure that the data_ object is written out + if (allocation_state_ != ARRAY) + Flush(); + } + + // Address of object data_ of MDType. This is not declared const as the + // typical usage will be to access the underlying |data_| object as to + // alter its contents. + MDType *get() { return &data_; } + + // Allocates minidump_size::size() bytes. + // Must not call more than once. + // Return true on success, or false on failure + bool Allocate(); + + // Allocates minidump_size::size() + |additional| bytes. + // Must not call more than once. + // Return true on success, or false on failure + bool Allocate(size_t additional); + + // Allocate an array of |count| elements of MDType. + // Must not call more than once. + // Return true on success, or false on failure + bool AllocateArray(size_t count); + + // Allocate an array of |count| elements of |size| after object of MDType + // Must not call more than once. + // Return true on success, or false on failure + bool AllocateObjectAndArray(unsigned int count, size_t size); + + // Copy |item| to |index| + // Must have been allocated using AllocateArray(). + // Return true on success, or false on failure + bool CopyIndex(unsigned int index, MDType *item); + + // Copy |size| bytes starting at |str| to |index| + // Must have been allocated using AllocateObjectAndArray(). + // Return true on success, or false on failure + bool CopyIndexAfterObject(unsigned int index, const void *src, size_t size); + + // Write data_ + bool Flush(); + + private: + enum AllocationState { + UNALLOCATED = 0, + SINGLE_OBJECT, + ARRAY, + SINGLE_OBJECT_WITH_ARRAY + }; + + MDType data_; + AllocationState allocation_state_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_MINIDUMP_FILE_WRITER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/common/auto_critical_section.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/common/auto_critical_section.h new file mode 100644 index 00000000..82c7b7f1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/common/auto_critical_section.h @@ -0,0 +1,63 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ +#define CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ + +#include + +namespace google_breakpad { + +// Automatically enters the critical section in the constructor and leaves +// the critical section in the destructor. +class AutoCriticalSection { + public: + // Creates a new instance with the given critical section object + // and enters the critical section immediately. + explicit AutoCriticalSection(CRITICAL_SECTION* cs) : cs_(cs) { + assert(cs_); + EnterCriticalSection(cs_); + } + + // Destructor: leaves the critical section. + ~AutoCriticalSection() { + LeaveCriticalSection(cs_); + } + + private: + // Disable copy ctor and operator=. + AutoCriticalSection(const AutoCriticalSection&); + AutoCriticalSection& operator=(const AutoCriticalSection&); + + CRITICAL_SECTION* cs_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/common/ipc_protocol.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/common/ipc_protocol.h new file mode 100644 index 00000000..cba8699c --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/common/ipc_protocol.h @@ -0,0 +1,179 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ +#define CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ + +#include +#include +#include +#include +#include "common/windows/string_utils-inl.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Name/value pair for custom client information. +struct CustomInfoEntry { + // Maximum length for name and value for client custom info. + static const int kNameMaxLength = 64; + static const int kValueMaxLength = 64; + + CustomInfoEntry() { + // Putting name and value in initializer list makes VC++ show warning 4351. + set_name(NULL); + set_value(NULL); + } + + CustomInfoEntry(const wchar_t* name_arg, const wchar_t* value_arg) { + set_name(name_arg); + set_value(value_arg); + } + + void set_name(const wchar_t* name_arg) { + if (!name_arg) { + name[0] = L'\0'; + return; + } + WindowsStringUtils::safe_wcscpy(name, kNameMaxLength, name_arg); + } + + void set_value(const wchar_t* value_arg) { + if (!value_arg) { + value[0] = L'\0'; + return; + } + + WindowsStringUtils::safe_wcscpy(value, kValueMaxLength, value_arg); + } + + void set(const wchar_t* name_arg, const wchar_t* value_arg) { + set_name(name_arg); + set_value(value_arg); + } + + wchar_t name[kNameMaxLength]; + wchar_t value[kValueMaxLength]; +}; + +// Constants for the protocol between client and the server. + +// Tags sent with each message indicating the purpose of +// the message. +enum MessageTag { + MESSAGE_TAG_NONE = 0, + MESSAGE_TAG_REGISTRATION_REQUEST = 1, + MESSAGE_TAG_REGISTRATION_RESPONSE = 2, + MESSAGE_TAG_REGISTRATION_ACK = 3 +}; + +struct CustomClientInfo { + const CustomInfoEntry* entries; + int count; +}; + +// Message structure for IPC between crash client and crash server. +struct ProtocolMessage { + ProtocolMessage() + : tag(MESSAGE_TAG_NONE), + pid(0), + dump_type(MiniDumpNormal), + thread_id(0), + exception_pointers(NULL), + assert_info(NULL), + custom_client_info(), + dump_request_handle(NULL), + dump_generated_handle(NULL), + server_alive_handle(NULL) { + } + + // Creates an instance with the given parameters. + ProtocolMessage(MessageTag arg_tag, + DWORD arg_pid, + MINIDUMP_TYPE arg_dump_type, + DWORD* arg_thread_id, + EXCEPTION_POINTERS** arg_exception_pointers, + MDRawAssertionInfo* arg_assert_info, + const CustomClientInfo& custom_info, + HANDLE arg_dump_request_handle, + HANDLE arg_dump_generated_handle, + HANDLE arg_server_alive) + : tag(arg_tag), + pid(arg_pid), + dump_type(arg_dump_type), + thread_id(arg_thread_id), + exception_pointers(arg_exception_pointers), + assert_info(arg_assert_info), + custom_client_info(custom_info), + dump_request_handle(arg_dump_request_handle), + dump_generated_handle(arg_dump_generated_handle), + server_alive_handle(arg_server_alive) { + } + + // Tag in the message. + MessageTag tag; + + // Process id. + DWORD pid; + + // Dump type requested. + MINIDUMP_TYPE dump_type; + + // Client thread id pointer. + DWORD* thread_id; + + // Exception information. + EXCEPTION_POINTERS** exception_pointers; + + // Assert information in case of an invalid parameter or + // pure call failure. + MDRawAssertionInfo* assert_info; + + // Custom client information. + CustomClientInfo custom_client_info; + + // Handle to signal the crash event. + HANDLE dump_request_handle; + + // Handle to check if server is done generating crash. + HANDLE dump_generated_handle; + + // Handle to a mutex that becomes signaled (WAIT_ABANDONED) + // if server process goes down. + HANDLE server_alive_handle; + + private: + // Disable copy ctor and operator=. + ProtocolMessage(const ProtocolMessage& msg); + ProtocolMessage& operator=(const ProtocolMessage& msg); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/client_info.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/client_info.h new file mode 100644 index 00000000..774816fb --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/client_info.h @@ -0,0 +1,170 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ +#define CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ + +#include +#include +#include "client/windows/common/ipc_protocol.h" +#include "google_breakpad/common/minidump_format.h" +#include "processor/scoped_ptr.h" + +namespace google_breakpad { + +class CrashGenerationServer; + +// Abstraction for a crash client process. +class ClientInfo { + public: + // Creates an instance with the given values. Gets the process + // handle for the given process id and creates necessary event + // objects. + ClientInfo(CrashGenerationServer* crash_server, + DWORD pid, + MINIDUMP_TYPE dump_type, + DWORD* thread_id, + EXCEPTION_POINTERS** ex_info, + MDRawAssertionInfo* assert_info, + const CustomClientInfo& custom_client_info); + + ~ClientInfo(); + + CrashGenerationServer* crash_server() const { return crash_server_; } + DWORD pid() const { return pid_; } + MINIDUMP_TYPE dump_type() const { return dump_type_; } + EXCEPTION_POINTERS** ex_info() const { return ex_info_; } + MDRawAssertionInfo* assert_info() const { return assert_info_; } + DWORD* thread_id() const { return thread_id_; } + HANDLE process_handle() const { return process_handle_; } + HANDLE dump_requested_handle() const { return dump_requested_handle_; } + HANDLE dump_generated_handle() const { return dump_generated_handle_; } + + HANDLE dump_request_wait_handle() const { + return dump_request_wait_handle_; + } + + void set_dump_request_wait_handle(HANDLE value) { + dump_request_wait_handle_ = value; + } + + HANDLE process_exit_wait_handle() const { + return process_exit_wait_handle_; + } + + void set_process_exit_wait_handle(HANDLE value) { + process_exit_wait_handle_ = value; + } + + // Unregister all waits for the client. + bool UnregisterWaits(); + + bool Initialize(); + bool GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const; + bool GetClientThreadId(DWORD* thread_id) const; + + // Reads the custom information from the client process address space. + bool PopulateCustomInfo(); + + // Returns the client custom information. + CustomClientInfo GetCustomInfo() const; + + private: + // Calcualtes the uptime for the client process, converts it to a string and + // stores it in the last entry of client custom info. + void SetProcessUptime(); + + // Crash generation server. + CrashGenerationServer* crash_server_; + + // Client process ID. + DWORD pid_; + + // Dump type requested by the client. + MINIDUMP_TYPE dump_type_; + + // Address of an EXCEPTION_POINTERS* variable in the client + // process address space that will point to an instance of + // EXCEPTION_POINTERS containing information about crash. + // + // WARNING: Do not dereference these pointers as they are pointers + // in the address space of another process. + EXCEPTION_POINTERS** ex_info_; + + // Address of an instance of MDRawAssertionInfo in the client + // process address space that will contain information about + // non-exception related crashes like invalid parameter assertion + // failures and pure calls. + // + // WARNING: Do not dereference these pointers as they are pointers + // in the address space of another process. + MDRawAssertionInfo* assert_info_; + + // Custom information about the client. + CustomClientInfo custom_client_info_; + + // Contains the custom client info entries read from the client process + // memory. This will be populated only if the method GetClientCustomInfo + // is called. + scoped_array custom_info_entries_; + + // Address of a variable in the client process address space that + // will contain the thread id of the crashing client thread. + // + // WARNING: Do not dereference these pointers as they are pointers + // in the address space of another process. + DWORD* thread_id_; + + // Client process handle. + HANDLE process_handle_; + + // Dump request event handle. + HANDLE dump_requested_handle_; + + // Dump generated event handle. + HANDLE dump_generated_handle_; + + // Wait handle for dump request event. + HANDLE dump_request_wait_handle_; + + // Wait handle for process exit event. + HANDLE process_exit_wait_handle_; + + // Time when the client process started. It is used to determine the uptime + // for the client process when it signals a crash. + FILETIME start_time_; + + // Disallow copy ctor and operator=. + ClientInfo(const ClientInfo& client_info); + ClientInfo& operator=(const ClientInfo& client_info); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/crash_generation_client.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/crash_generation_client.h new file mode 100644 index 00000000..81b0e6ca --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/crash_generation_client.h @@ -0,0 +1,159 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ +#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ + +#include +#include +#include +#include +#include "client/windows/common/ipc_protocol.h" +#include "processor/scoped_ptr.h" + +namespace google_breakpad { + +struct CustomClientInfo; + +// Abstraction of client-side implementation of out of process +// crash generation. +// +// The process that desires to have out-of-process crash dump +// generation service can use this class in the following way: +// +// * Create an instance. +// * Call Register method so that the client tries to register +// with the server process and check the return value. If +// registration is not successful, out-of-process crash dump +// generation will not be available +// * Request dump generation by calling either of the two +// overloaded RequestDump methods - one in case of exceptions +// and the other in case of assertion failures +// +// Note that it is the responsibility of the client code of +// this class to set the unhandled exception filter with the +// system by calling the SetUnhandledExceptionFilter function +// and the client code should explicitly request dump generation. +class CrashGenerationClient { + public: + CrashGenerationClient(const wchar_t* pipe_name, + MINIDUMP_TYPE dump_type, + const CustomClientInfo* custom_info); + + ~CrashGenerationClient(); + + // Registers the client process with the crash server. + // + // Returns true if the registration is successful; false otherwise. + bool Register(); + + // Requests the crash server to generate a dump with the given + // exception information. + // + // Returns true if the dump was successful; false otherwise. Note that + // if the registration step was not performed or it was not successful, + // false will be returned. + bool RequestDump(EXCEPTION_POINTERS* ex_info); + + // Requests the crash server to generate a dump with the given + // assertion information. + // + // Returns true if the dump was successful; false otherwise. Note that + // if the registration step was not performed or it was not successful, + // false will be returned. + bool RequestDump(MDRawAssertionInfo* assert_info); + + private: + // Connects to the appropriate pipe and sets the pipe handle state. + // + // Returns the pipe handle if everything goes well; otherwise Returns NULL. + HANDLE ConnectToServer(); + + // Performs a handshake with the server over the given pipe which should be + // already connected to the server. + // + // Returns true if handshake with the server was successful; false otherwise. + bool RegisterClient(HANDLE pipe); + + // Validates the given server response. + bool ValidateResponse(const ProtocolMessage& msg) const; + + // Returns true if the registration step succeeded; false otherwise. + bool IsRegistered() const; + + // Connects to the given named pipe with given parameters. + // + // Returns true if the connection is successful; false otherwise. + HANDLE ConnectToPipe(const wchar_t* pipe_name, + DWORD pipe_access, + DWORD flags_attrs); + + // Signals the crash event and wait for the server to generate crash. + bool SignalCrashEventAndWait(); + + // Pipe name to use to talk to server. + std::wstring pipe_name_; + + // Custom client information + CustomClientInfo custom_info_; + + // Type of dump to generate. + MINIDUMP_TYPE dump_type_; + + // Event to signal in case of a crash. + HANDLE crash_event_; + + // Handle to wait on after signaling a crash for the server + // to finish generating crash dump. + HANDLE crash_generated_; + + // Handle to a mutex that will become signaled with WAIT_ABANDONED + // if the server process goes down. + HANDLE server_alive_; + + // Server process id. + DWORD server_process_id_; + + // Id of the thread that caused the crash. + DWORD thread_id_; + + // Exception pointers for an exception crash. + EXCEPTION_POINTERS* exception_pointers_; + + // Assertion info for an invalid parameter or pure call crash. + MDRawAssertionInfo assert_info_; + + // Disable copy ctor and operator=. + CrashGenerationClient(const CrashGenerationClient& crash_client); + CrashGenerationClient& operator=(const CrashGenerationClient& crash_client); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/crash_generation_server.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/crash_generation_server.h new file mode 100644 index 00000000..cacb639a --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/crash_generation_server.h @@ -0,0 +1,269 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ +#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ + +#include +#include +#include "client/windows/common/ipc_protocol.h" +#include "client/windows/crash_generation/client_info.h" +#include "client/windows/crash_generation/minidump_generator.h" +#include "processor/scoped_ptr.h" + +namespace google_breakpad { + +// Abstraction for server side implementation of out-of-process crash +// generation protocol for Windows platform only. It generates Windows +// minidump files for client processes that request dump generation. When +// the server is requested to start listening for clients (by calling the +// Start method), it creates a named pipe and waits for the clients to +// register. In response, it hands them event handles that the client can +// signal to request dump generation. When the clients request dump +// generation in this way, the server generates Windows minidump files. +class CrashGenerationServer { + public: + typedef void (*OnClientConnectedCallback)(void* context, + const ClientInfo* client_info); + + typedef void (*OnClientDumpRequestCallback)(void* context, + const ClientInfo* client_info, + const std::wstring* file_path); + + typedef void (*OnClientExitedCallback)(void* context, + const ClientInfo* client_info); + + // Creates an instance with the given parameters. + // + // Parameter pipe_name: Name of the Windows named pipe + // Parameter pipe_sec_attrs Security attributes to set on the pipe. Pass + // NULL to use default security on the pipe. By default, the pipe created + // allows Local System, Administrators and the Creator full control and + // the Everyone group read access on the pipe. + // Parameter connect_callback: Callback for a new client connection. + // Parameter connect_context: Context for client connection callback. + // Parameter crash_callback: Callback for a client crash dump request. + // Parameter crash_context: Context for client crash dump request callback. + // Parameter exit_callback: Callback for client process exit. + // Parameter exit_context: Context for client exit callback. + // Parameter generate_dumps: Whether to automatically generate dumps. + // Client code of this class might want to generate dumps explicitly in the + // crash dump request callback. In that case, false can be passed for this + // parameter. + // Parameter dump_path: Path for generating dumps; required only if true is + // passed for generateDumps parameter; NULL can be passed otherwise. + CrashGenerationServer(const std::wstring& pipe_name, + SECURITY_ATTRIBUTES* pipe_sec_attrs, + OnClientConnectedCallback connect_callback, + void* connect_context, + OnClientDumpRequestCallback dump_callback, + void* dump_context, + OnClientExitedCallback exit_callback, + void* exit_context, + bool generate_dumps, + const std::wstring* dump_path); + + ~CrashGenerationServer(); + + // Performs initialization steps needed to start listening to clients. + // + // Returns true if initialization is successful; false otherwise. + bool Start(); + + private: + // Various states the client can be in during the handshake with + // the server. + enum IPCServerState { + // Server is in error state and it cannot serve any clients. + IPC_SERVER_STATE_ERROR, + + // Server starts in this state. + IPC_SERVER_STATE_INITIAL, + + // Server has issued an async connect to the pipe and it is waiting + // for the connection to be established. + IPC_SERVER_STATE_CONNECTING, + + // Server is connected successfully. + IPC_SERVER_STATE_CONNECTED, + + // Server has issued an async read from the pipe and it is waiting for + // the read to finish. + IPC_SERVER_STATE_READING, + + // Server is done reading from the pipe. + IPC_SERVER_STATE_READ_DONE, + + // Server has issued an async write to the pipe and it is waiting for + // the write to finish. + IPC_SERVER_STATE_WRITING, + + // Server is done writing to the pipe. + IPC_SERVER_STATE_WRITE_DONE, + + // Server has issued an async read from the pipe for an ack and it + // is waiting for the read to finish. + IPC_SERVER_STATE_READING_ACK, + + // Server is done writing to the pipe and it is now ready to disconnect + // and reconnect. + IPC_SERVER_STATE_DISCONNECTING + }; + + // + // Helper methods to handle various server IPC states. + // + void HandleErrorState(); + void HandleInitialState(); + void HandleConnectingState(); + void HandleConnectedState(); + void HandleReadingState(); + void HandleReadDoneState(); + void HandleWritingState(); + void HandleWriteDoneState(); + void HandleReadingAckState(); + void HandleDisconnectingState(); + + // Prepares reply for a client from the given parameters. + bool PrepareReply(const ClientInfo& client_info, + ProtocolMessage* reply) const; + + // Duplicates various handles in the ClientInfo object for the client + // process and stores them in the given ProtocolMessage instance. If + // creating any handle fails, ProtocolMessage will contain the handles + // already created successfully, which should be closed by the caller. + bool CreateClientHandles(const ClientInfo& client_info, + ProtocolMessage* reply) const; + + // Response to the given client. Return true if all steps of + // responding to the client succeed, false otherwise. + bool RespondToClient(ClientInfo* client_info); + + // Handles a connection request from the client. + void HandleConnectionRequest(); + + // Handles a dump request from the client. + void HandleDumpRequest(const ClientInfo& client_info); + + // Callback for pipe connected event. + static void CALLBACK OnPipeConnected(void* context, BOOLEAN timer_or_wait); + + // Callback for a dump request. + static void CALLBACK OnDumpRequest(void* context, BOOLEAN timer_or_wait); + + // Callback for client process exit event. + static void CALLBACK OnClientEnd(void* context, BOOLEAN timer_or_wait); + + // Releases resources for a client. + static DWORD WINAPI CleanupClient(void* context); + + // Cleans up for the given client. + void DoCleanup(ClientInfo* client_info); + + // Adds the given client to the list of registered clients. + bool AddClient(ClientInfo* client_info); + + // Generates dump for the given client. + bool GenerateDump(const ClientInfo& client, std::wstring* dump_path); + + // Sync object for thread-safe access to the shared list of clients. + CRITICAL_SECTION clients_sync_; + + // List of clients. + std::list clients_; + + // Pipe name. + std::wstring pipe_name_; + + // Pipe security attributes + SECURITY_ATTRIBUTES* pipe_sec_attrs_; + + // Handle to the pipe used for handshake with clients. + HANDLE pipe_; + + // Pipe wait handle. + HANDLE pipe_wait_handle_; + + // Handle to server-alive mutex. + HANDLE server_alive_handle_; + + // Callback for a successful client connection. + OnClientConnectedCallback connect_callback_; + + // Context for client connected callback. + void* connect_context_; + + // Callback for a client dump request. + OnClientDumpRequestCallback dump_callback_; + + // Context for client dump request callback. + void* dump_context_; + + // Callback for client process exit. + OnClientExitedCallback exit_callback_; + + // Context for client process exit callback. + void* exit_context_; + + // Whether to generate dumps. + bool generate_dumps_; + + // Instance of a mini dump generator. + scoped_ptr dump_generator_; + + // State of the server in performing the IPC with the client. + // Note that since we restrict the pipe to one instance, we + // only need to keep one state of the server. Otherwise, server + // would have one state per client it is talking to. + volatile IPCServerState server_state_; + + // Whether the server is shutting down. + volatile bool shutting_down_; + + // Overlapped instance for async I/O on the pipe. + OVERLAPPED overlapped_; + + // Message object used in IPC with the client. + ProtocolMessage msg_; + + // Client Info for the client that's connecting to the server. + ClientInfo* client_info_; + + // Count of clean-up work items that are currently running or are + // already queued to run. + volatile LONG cleanup_item_count_; + + // Disable copy ctor and operator=. + CrashGenerationServer(const CrashGenerationServer& crash_server); + CrashGenerationServer& operator=(const CrashGenerationServer& crash_server); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/minidump_generator.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/minidump_generator.h new file mode 100644 index 00000000..8ab6a8f6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/crash_generation/minidump_generator.h @@ -0,0 +1,121 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ +#define CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ + +#include +#include +#include +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Abstraction for various objects and operations needed to generate +// minidump on Windows. This abstraction is useful to hide all the gory +// details for minidump generation and provide a clean interface to +// the clients to generate minidumps. +class MinidumpGenerator { + public: + // Creates an instance with the given dump path. + explicit MinidumpGenerator(const std::wstring& dump_path); + + ~MinidumpGenerator(); + + // Writes the minidump with the given parameters. Stores the + // dump file path in the dump_path parameter if dump generation + // succeeds. + bool WriteMinidump(HANDLE process_handle, + DWORD process_id, + DWORD thread_id, + DWORD requesting_thread_id, + EXCEPTION_POINTERS* exception_pointers, + MDRawAssertionInfo* assert_info, + MINIDUMP_TYPE dump_type, + bool is_client_pointers, + std::wstring* dump_path); + + private: + // Function pointer type for MiniDumpWriteDump, which is looked up + // dynamically. + typedef BOOL (WINAPI* MiniDumpWriteDumpType)( + HANDLE hProcess, + DWORD ProcessId, + HANDLE hFile, + MINIDUMP_TYPE DumpType, + CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); + + // Function pointer type for UuidCreate, which is looked up dynamically. + typedef RPC_STATUS (RPC_ENTRY* UuidCreateType)(UUID* Uuid); + + // Loads the appropriate DLL lazily in a thread safe way. + HMODULE GetDbghelpModule(); + + // Loads the appropriate DLL and gets a pointer to the MiniDumpWriteDump + // function lazily and in a thread-safe manner. + MiniDumpWriteDumpType GetWriteDump(); + + // Loads the appropriate DLL lazily in a thread safe way. + HMODULE GetRpcrt4Module(); + + // Loads the appropriate DLL and gets a pointer to the UuidCreate + // function lazily and in a thread-safe manner. + UuidCreateType GetCreateUuid(); + + // Returns the path for the file to write dump to. + bool GenerateDumpFilePath(std::wstring* file_path); + + // Handle to dynamically loaded DbgHelp.dll. + HMODULE dbghelp_module_; + + // Pointer to the MiniDumpWriteDump function. + MiniDumpWriteDumpType write_dump_; + + // Handle to dynamically loaded rpcrt4.dll. + HMODULE rpcrt4_module_; + + // Pointer to the UuidCreate function. + UuidCreateType create_uuid_; + + // Folder path to store dump files. + std::wstring dump_path_; + + // Critical section to sychronize action of loading modules dynamically. + CRITICAL_SECTION module_load_sync_; + + // Critical section to synchronize action of dynamically getting function + // addresses from modules. + CRITICAL_SECTION get_proc_address_sync_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/handler/exception_handler.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/handler/exception_handler.h new file mode 100644 index 00000000..2cacdc38 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/handler/exception_handler.h @@ -0,0 +1,415 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ExceptionHandler can write a minidump file when an exception occurs, +// or when WriteMinidump() is called explicitly by your program. +// +// To have the exception handler write minidumps when an uncaught exception +// (crash) occurs, you should create an instance early in the execution +// of your program, and keep it around for the entire time you want to +// have crash handling active (typically, until shutdown). +// +// If you want to write minidumps without installing the exception handler, +// you can create an ExceptionHandler with install_handler set to false, +// then call WriteMinidump. You can also use this technique if you want to +// use different minidump callbacks for different call sites. +// +// In either case, a callback function is called when a minidump is written, +// which receives the unqiue id of the minidump. The caller can use this +// id to collect and write additional application state, and to launch an +// external crash-reporting application. +// +// It is important that creation and destruction of ExceptionHandler objects +// be nested cleanly, when using install_handler = true. +// Avoid the following pattern: +// ExceptionHandler *e = new ExceptionHandler(...); +// ExceptionHandler *f = new ExceptionHandler(...); +// delete e; +// This will put the exception filter stack into an inconsistent state. + +#ifndef CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ +#define CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ + +#include +#include +#include +#include + +#pragma warning( push ) +// Disable exception handler warnings. +#pragma warning( disable : 4530 ) + +#include +#include + +#include "client/windows/common/ipc_protocol.h" +#include "client/windows/crash_generation/crash_generation_client.h" +#include "google_breakpad/common/minidump_format.h" +#include "processor/scoped_ptr.h" + +namespace google_breakpad { + +using std::vector; +using std::wstring; + +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. context is the parameter supplied by the user as + // callback_context when the handler was created. exinfo points to the + // exception record, if any; assertion points to assertion information, + // if any. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, Breakpad + // will immediately report the exception as unhandled without writing a + // minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void* context, EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion); + + // A callback function to run after the minidump has been written. + // minidump_id is a unique id for the dump, so the minidump + // file is \.dmp. context is the parameter supplied + // by the user as callback_context when the handler was created. exinfo + // points to the exception record, or NULL if no exception occurred. + // succeeded indicates whether a minidump file was successfully written. + // assertion points to information about an assertion if the handler was + // invoked by an assertion. + // + // If an exception occurred and the callback returns true, Breakpad will treat + // the exception as fully-handled, suppressing any other handlers from being + // notified of the exception. If the callback returns false, Breakpad will + // treat the exception as unhandled, and allow another handler to handle it. + // If there are no other handlers, Breakpad will report the exception to the + // system as unhandled, allowing a debugger or native crash dialog the + // opportunity to handle the exception. Most callback implementations + // should normally return the value of |succeeded|, or when they wish to + // not report an exception of handled, false. Callbacks will rarely want to + // return true directly (unless |succeeded| is true). + // + // For out-of-process dump generation, dump path and minidump ID will always + // be NULL. In case of out-of-process dump generation, the dump path and + // minidump id are controlled by the server process and are not communicated + // back to the crashing process. + typedef bool (*MinidumpCallback)(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded); + + // HandlerType specifies which types of handlers should be installed, if + // any. Use HANDLER_NONE for an ExceptionHandler that remains idle, + // without catching any failures on its own. This type of handler may + // still be triggered by calling WriteMinidump. Otherwise, use a + // combination of the other HANDLER_ values, or HANDLER_ALL to install + // all handlers. + enum HandlerType { + HANDLER_NONE = 0, + HANDLER_EXCEPTION = 1 << 0, // SetUnhandledExceptionFilter + HANDLER_INVALID_PARAMETER = 1 << 1, // _set_invalid_parameter_handler + HANDLER_PURECALL = 1 << 2, // _set_purecall_handler + HANDLER_ALL = HANDLER_EXCEPTION | + HANDLER_INVALID_PARAMETER | + HANDLER_PURECALL + }; + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Before writing a minidump, the optional filter callback will be called. + // Its return value determines whether or not Breakpad should write a + // minidump. Minidump files will be written to dump_path, and the optional + // callback is called after writing the dump file, as described above. + // handler_types specifies the types of handlers that should be installed. + ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types); + + // Creates a new ExcetpionHandler instance that can attempt to perform + // out-of-process dump generation if pipe_name is not NULL. If pipe_name is + // NULL, or if out-of-process dump generation registration step fails, + // in-process dump generation will be used. This also allows specifying + // the dump type to generate. + ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + const CustomClientInfo* custom_info); + + ~ExceptionHandler(); + + // Get and set the minidump path. + wstring dump_path() const { return dump_path_; } + void set_dump_path(const wstring &dump_path) { + dump_path_ = dump_path; + dump_path_c_ = dump_path_.c_str(); + UpdateNextID(); // Necessary to put dump_path_ in next_minidump_path_. + } + + // Writes a minidump immediately. This can be used to capture the + // execution state independently of a crash. Returns true on success. + bool WriteMinidump(); + + // Writes a minidump immediately, with the user-supplied exception + // information. + bool WriteMinidumpForException(EXCEPTION_POINTERS* exinfo); + + // Convenience form of WriteMinidump which does not require an + // ExceptionHandler instance. + static bool WriteMinidump(const wstring &dump_path, + MinidumpCallback callback, void* callback_context); + + // Get the thread ID of the thread requesting the dump (either the exception + // thread or any other thread that called WriteMinidump directly). This + // may be useful if you want to include additional thread state in your + // dumps. + DWORD get_requesting_thread_id() const { return requesting_thread_id_; } + + // Controls behavior of EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP. + bool get_handle_debug_exceptions() const { return handle_debug_exceptions_; } + void set_handle_debug_exceptions(bool handle_debug_exceptions) { + handle_debug_exceptions_ = handle_debug_exceptions; + } + + // Returns whether out-of-process dump generation is used or not. + bool IsOutOfProcess() const { return crash_generation_client_.get() != NULL; } + + private: + friend class AutoExceptionHandler; + + // Initializes the instance with given values. + void Initialize(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + const CustomClientInfo* custom_info); + + // Function pointer type for MiniDumpWriteDump, which is looked up + // dynamically. + typedef BOOL (WINAPI *MiniDumpWriteDump_type)( + HANDLE hProcess, + DWORD dwPid, + HANDLE hFile, + MINIDUMP_TYPE DumpType, + CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); + + // Function pointer type for UuidCreate, which is looked up dynamically. + typedef RPC_STATUS (RPC_ENTRY *UuidCreate_type)(UUID* Uuid); + + // Runs the main loop for the exception handler thread. + static DWORD WINAPI ExceptionHandlerThreadMain(void* lpParameter); + + // Called on the exception thread when an unhandled exception occurs. + // Signals the exception handler thread to handle the exception. + static LONG WINAPI HandleException(EXCEPTION_POINTERS* exinfo); + +#if _MSC_VER >= 1400 // MSVC 2005/8 + // This function will be called by some CRT functions when they detect + // that they were passed an invalid parameter. Note that in _DEBUG builds, + // the CRT may display an assertion dialog before calling this function, + // and the function will not be called unless the assertion dialog is + // dismissed by clicking "Ignore." + static void HandleInvalidParameter(const wchar_t* expression, + const wchar_t* function, + const wchar_t* file, + unsigned int line, + uintptr_t reserved); +#endif // _MSC_VER >= 1400 + + // This function will be called by the CRT when a pure virtual + // function is called. + static void HandlePureVirtualCall(); + + // This is called on the exception thread or on another thread that + // the user wishes to produce a dump from. It calls + // WriteMinidumpWithException on the handler thread, avoiding stack + // overflows and inconsistent dumps due to writing the dump from + // the exception thread. If the dump is requested as a result of an + // exception, exinfo contains exception information, otherwise, it + // is NULL. If the dump is requested as a result of an assertion + // (such as an invalid parameter being passed to a CRT function), + // assertion contains data about the assertion, otherwise, it is NULL. + bool WriteMinidumpOnHandlerThread(EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion); + + // This function does the actual writing of a minidump. It is called + // on the handler thread. requesting_thread_id is the ID of the thread + // that requested the dump. If the dump is requested as a result of + // an exception, exinfo contains exception information, otherwise, + // it is NULL. + bool WriteMinidumpWithException(DWORD requesting_thread_id, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion); + + // Generates a new ID and stores it in next_minidump_id_, and stores the + // path of the next minidump to be written in next_minidump_path_. + void UpdateNextID(); + + FilterCallback filter_; + MinidumpCallback callback_; + void* callback_context_; + + scoped_ptr crash_generation_client_; + + // The directory in which a minidump will be written, set by the dump_path + // argument to the constructor, or set_dump_path. + wstring dump_path_; + + // The basename of the next minidump to be written, without the extension. + wstring next_minidump_id_; + + // The full pathname of the next minidump to be written, including the file + // extension. + wstring next_minidump_path_; + + // Pointers to C-string representations of the above. These are set when + // the above wstring versions are set in order to avoid calling c_str during + // an exception, as c_str may attempt to allocate heap memory. These + // pointers are not owned by the ExceptionHandler object, but their lifetimes + // should be equivalent to the lifetimes of the associated wstring, provided + // that the wstrings are not altered. + const wchar_t* dump_path_c_; + const wchar_t* next_minidump_id_c_; + const wchar_t* next_minidump_path_c_; + + HMODULE dbghelp_module_; + MiniDumpWriteDump_type minidump_write_dump_; + MINIDUMP_TYPE dump_type_; + + HMODULE rpcrt4_module_; + UuidCreate_type uuid_create_; + + // Tracks the handler types that were installed according to the + // handler_types constructor argument. + int handler_types_; + + // When installed_handler_ is true, previous_filter_ is the unhandled + // exception filter that was set prior to installing ExceptionHandler as + // the unhandled exception filter and pointing it to |this|. NULL indicates + // that there is no previous unhandled exception filter. + LPTOP_LEVEL_EXCEPTION_FILTER previous_filter_; + +#if _MSC_VER >= 1400 // MSVC 2005/8 + // Beginning in VC 8, the CRT provides an invalid parameter handler that will + // be called when some CRT functions are passed invalid parameters. In + // earlier CRTs, the same conditions would cause unexpected behavior or + // crashes. + _invalid_parameter_handler previous_iph_; +#endif // _MSC_VER >= 1400 + + // The CRT allows you to override the default handler for pure + // virtual function calls. + _purecall_handler previous_pch_; + + // The exception handler thread. + HANDLE handler_thread_; + + // True if the exception handler is being destroyed. + // Starting with MSVC 2005, Visual C has stronger guarantees on volatile vars. + // It has release semantics on write and acquire semantics on reads. + // See the msdn documentation. + volatile bool is_shutdown_; + + // The critical section enforcing the requirement that only one exception be + // handled by a handler at a time. + CRITICAL_SECTION handler_critical_section_; + + // Semaphores used to move exception handling between the exception thread + // and the handler thread. handler_start_semaphore_ is signalled by the + // exception thread to wake up the handler thread when an exception occurs. + // handler_finish_semaphore_ is signalled by the handler thread to wake up + // the exception thread when handling is complete. + HANDLE handler_start_semaphore_; + HANDLE handler_finish_semaphore_; + + // The next 2 fields contain data passed from the requesting thread to + // the handler thread. + + // The thread ID of the thread requesting the dump (either the exception + // thread or any other thread that called WriteMinidump directly). + DWORD requesting_thread_id_; + + // The exception info passed to the exception handler on the exception + // thread, if an exception occurred. NULL for user-requested dumps. + EXCEPTION_POINTERS* exception_info_; + + // If the handler is invoked due to an assertion, this will contain a + // pointer to the assertion information. It is NULL at other times. + MDRawAssertionInfo* assertion_; + + // The return value of the handler, passed from the handler thread back to + // the requesting thread. + bool handler_return_value_; + + // If true, the handler will intercept EXCEPTION_BREAKPOINT and + // EXCEPTION_SINGLE_STEP exceptions. Leave this false (the default) + // to not interfere with debuggers. + bool handle_debug_exceptions_; + + // A stack of ExceptionHandler objects that have installed unhandled + // exception filters. This vector is used by HandleException to determine + // which ExceptionHandler object to route an exception to. When an + // ExceptionHandler is created with install_handler true, it will append + // itself to this list. + static vector* handler_stack_; + + // The index of the ExceptionHandler in handler_stack_ that will handle the + // next exception. Note that 0 means the last entry in handler_stack_, 1 + // means the next-to-last entry, and so on. This is used by HandleException + // to support multiple stacked Breakpad handlers. + static LONG handler_stack_index_; + + // handler_stack_critical_section_ guards operations on handler_stack_ and + // handler_stack_index_. The critical section is initialized by the + // first instance of the class and destroyed by the last instance of it. + static CRITICAL_SECTION handler_stack_critical_section_; + + // The number of instances of this class. + volatile static LONG instance_count_; + + // disallow copy ctor and operator= + explicit ExceptionHandler(const ExceptionHandler &); + void operator=(const ExceptionHandler &); +}; + +} // namespace google_breakpad + +#pragma warning( pop ) + +#endif // CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/sender/crash_report_sender.h b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/sender/crash_report_sender.h new file mode 100644 index 00000000..da1ed0af --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/client/windows/sender/crash_report_sender.h @@ -0,0 +1,125 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__ +#define CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__ + +// CrashReportSender is a "static" class which provides an API to upload +// crash reports via HTTP(S). A crash report is formatted as a multipart POST +// request, which contains a set of caller-supplied string key/value pairs, +// and a minidump file to upload. +// +// To use this library in your project, you will need to link against +// wininet.lib. + +#pragma warning( push ) +// Disable exception handler warnings. +#pragma warning( disable : 4530 ) + +#include +#include + +namespace google_breakpad { + +using std::wstring; +using std::map; + +typedef enum { + RESULT_FAILED = 0, // Failed to communicate with the server; try later. + RESULT_REJECTED, // Successfully sent the crash report, but the + // server rejected it; don't resend this report. + RESULT_SUCCEEDED, // The server accepted the crash report. + RESULT_THROTTLED // No attempt was made to send the crash report, because + // we exceeded the maximum reports per day. +} ReportResult; + +class CrashReportSender { + public: + // Initializes a CrashReportSender instance. + // If checkpoint_file is non-empty, breakpad will persist crash report + // state to this file. A checkpoint file is required for + // set_max_reports_per_day() to function properly. + explicit CrashReportSender(const wstring &checkpoint_file); + ~CrashReportSender() {} + + // Sets the maximum number of crash reports that will be sent in a 24-hour + // period. This uses the state persisted to the checkpoint file. + // The default value of -1 means that there is no limit on reports sent. + void set_max_reports_per_day(int reports) { + max_reports_per_day_ = reports; + } + + int max_reports_per_day() const { return max_reports_per_day_; } + + // Sends the specified minidump file, along with the map of + // name value pairs, as a multipart POST request to the given URL. + // Parameter names must contain only printable ASCII characters, + // and may not contain a quote (") character. + // Only HTTP(S) URLs are currently supported. The return value indicates + // the result of the operation (see above for possible results). + // If report_code is non-NULL and the report is sent successfully (that is, + // the return value is RESULT_SUCCEEDED), a code uniquely identifying the + // report will be returned in report_code. + // (Otherwise, report_code will be unchanged.) + ReportResult SendCrashReport(const wstring &url, + const map ¶meters, + const wstring &dump_file_name, + wstring *report_code); + + private: + // Reads persistent state from a checkpoint file. + void ReadCheckpoint(FILE *fd); + + // Called when a new report has been sent, to update the checkpoint state. + void ReportSent(int today); + + // Returns today's date (UTC) formatted as YYYYMMDD. + int GetCurrentDate() const; + + // Opens the checkpoint file with the specified mode. + // Returns zero on success, or an error code on failure. + int OpenCheckpointFile(const wchar_t *mode, FILE **fd); + + wstring checkpoint_file_; + int max_reports_per_day_; + // The last date on which we sent a report, expressed as YYYYMMDD. + int last_sent_date_; + // Number of reports sent on last_sent_date_ + int reports_sent_; + + // Disallow copy constructor and operator= + explicit CrashReportSender(const CrashReportSender &); + void operator=(const CrashReportSender &); +}; + +} // namespace google_breakpad + +#pragma warning( pop ) + +#endif // CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/common/convert_UTF.h b/thirdparty/google-breakpad/r318/include/google_breakpad/common/convert_UTF.h new file mode 100644 index 00000000..b1556de8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/common/convert_UTF.h @@ -0,0 +1,143 @@ +/* + * Copyright 2001-2004 Unicode, Inc. + * + * Disclaimer + * + * This source code is provided as is by Unicode, Inc. No claims are + * made as to fitness for any particular purpose. No warranties of any + * kind are expressed or implied. The recipient agrees to determine + * applicability of information provided. If this file has been + * purchased on magnetic or optical media from Unicode, Inc., the + * sole remedy for any claim will be exchange of defective media + * within 90 days of receipt. + * + * Limitations on Rights to Redistribute This Code + * + * Unicode, Inc. hereby grants the right to freely use the information + * supplied in this file in the creation of products supporting the + * Unicode Standard, and to make copies of this file in any form + * for internal or external distribution as long as this notice + * remains attached. + */ + +/* --------------------------------------------------------------------- + +Conversions between UTF32, UTF-16, and UTF-8. Header file. + +Several funtions are included here, forming a complete set of +conversions between the three formats. UTF-7 is not included +here, but is handled in a separate source file. + +Each of these routines takes pointers to input buffers and output +buffers. The input buffers are const. + +Each routine converts the text between *sourceStart and sourceEnd, +putting the result into the buffer between *targetStart and +targetEnd. Note: the end pointers are *after* the last item: e.g. +*(sourceEnd - 1) is the last item. + +The return result indicates whether the conversion was successful, +and if not, whether the problem was in the source or target buffers. +(Only the first encountered problem is indicated.) + +After the conversion, *sourceStart and *targetStart are both +updated to point to the end of last text successfully converted in +the respective buffers. + +Input parameters: +sourceStart - pointer to a pointer to the source buffer. +The contents of this are modified on return so that +it points at the next thing to be converted. +targetStart - similarly, pointer to pointer to the target buffer. +sourceEnd, targetEnd - respectively pointers to the ends of the +two buffers, for overflow checking only. + +These conversion functions take a ConversionFlags argument. When this +flag is set to strict, both irregular sequences and isolated surrogates +will cause an error. When the flag is set to lenient, both irregular +sequences and isolated surrogates are converted. + +Whether the flag is strict or lenient, all illegal sequences will cause +an error return. This includes sequences such as: , , +or in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code +must check for illegal sequences. + +When the flag is set to lenient, characters over 0x10FFFF are converted +to the replacement character; otherwise (when the flag is set to strict) +they constitute an error. + +Output parameters: +The value "sourceIllegal" is returned from some routines if the input +sequence is malformed. When "sourceIllegal" is returned, the source +value will point to the illegal value that caused the problem. E.g., +in UTF-8 when a sequence is malformed, it points to the start of the +malformed sequence. + +Author: Mark E. Davis, 1994. +Rev History: Rick McGowan, fixes & updates May 2001. +Fixes & updates, Sept 2001. + +------------------------------------------------------------------------ */ + +/* --------------------------------------------------------------------- +The following 4 definitions are compiler-specific. +The C standard does not guarantee that wchar_t has at least +16 bits, so wchar_t is no less portable than unsigned short! +All should be unsigned values to avoid sign extension during +bit mask & shift operations. +------------------------------------------------------------------------ */ + +typedef unsigned long UTF32; /* at least 32 bits */ +typedef unsigned short UTF16; /* at least 16 bits */ +typedef unsigned char UTF8; /* typically 8 bits */ +typedef unsigned char Boolean; /* 0 or 1 */ + +/* Some fundamental constants */ +#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD +#define UNI_MAX_BMP (UTF32)0x0000FFFF +#define UNI_MAX_UTF16 (UTF32)0x0010FFFF +#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF +#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF + +typedef enum { + conversionOK, /* conversion successful */ + sourceExhausted, /* partial character in source, but hit end */ + targetExhausted, /* insuff. room in target for conversion */ + sourceIllegal /* source sequence is illegal/malformed */ +} ConversionResult; + +typedef enum { + strictConversion = 0, + lenientConversion +} ConversionFlags; + +/* This is for C++ and does no harm in C */ +#ifdef __cplusplus +extern "C" { +#endif + +ConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); + +#ifdef __cplusplus +} +#endif + +/* --------------------------------------------------------------------- */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/common/md5.h b/thirdparty/google-breakpad/r318/include/google_breakpad/common/md5.h new file mode 100644 index 00000000..dbf4893c --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/common/md5.h @@ -0,0 +1,31 @@ +// Copyright 2007 Google Inc. All Rights Reserved. +// Author: liuli@google.com (Liu Li) +#ifndef COMMON_MD5_H__ +#define COMMON_MD5_H__ + +#include + +typedef uint32_t u32; +typedef uint8_t u8; + +struct MD5Context { + u32 buf[4]; + u32 bits[2]; + u8 in[64]; +}; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +void MD5Init(struct MD5Context *ctx); + +void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len); + +void MD5Final(unsigned char digest[16], struct MD5Context *ctx); + +#ifdef __cplusplus +} +#endif + +#endif // COMMON_MD5_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/common/string_conversion.h b/thirdparty/google-breakpad/r318/include/google_breakpad/common/string_conversion.h new file mode 100644 index 00000000..d51f46bb --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/common/string_conversion.h @@ -0,0 +1,66 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// string_conversion.h: Conversion between different UTF-8/16/32 encodings. + +#ifndef COMMON_STRING_CONVERSION_H__ +#define COMMON_STRING_CONVERSION_H__ + +#include +#include +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::vector; + +// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the +// conversion failed, |out| will be zero length. +void UTF8ToUTF16(const char *in, vector *out); + +// Convert at least one character (up to a maximum of |in_length|) from |in| +// to UTF-16 into |out|. Return the number of characters consumed from |in|. +// Any unused characters in |out| will be initialized to 0. No memory will +// be allocated by this routine. +int UTF8ToUTF16Char(const char *in, int in_length, u_int16_t out[2]); + +// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the +// conversion failed, |out| will be zero length. +void UTF32ToUTF16(const wchar_t *in, vector *out); + +// Convert |in| to UTF-16 into |out|. Any unused characters in |out| will be +// initialized to 0. No memory will be allocated by this routine. +void UTF32ToUTF16Char(wchar_t in, u_int16_t out[2]); + +// Convert |in| to UTF-8. If |swap| is true, swap bytes before converting. +std::string UTF16ToUTF8(const vector &in, bool swap); + +} // namespace google_breakpad + +#endif // COMMON_STRING_CONVERSION_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/guid_string.h b/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/guid_string.h new file mode 100644 index 00000000..f8aa8a23 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/guid_string.h @@ -0,0 +1,58 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// guid_string.cc: Convert GUIDs to strings. + +#ifndef COMMON_WINDOWS_GUID_STRING_H__ +#define COMMON_WINDOWS_GUID_STRING_H__ + +#include + +#include + +namespace google_breakpad { + +using std::wstring; + +class GUIDString { + public: + // Converts guid to a string in the format recommended by RFC 4122 and + // returns the string. + static wstring GUIDToWString(GUID *guid); + + // Converts guid to a string formatted as uppercase hexadecimal, with + // no separators, and returns the string. This is the format used for + // symbol server identifiers, although identifiers have an age tacked + // on to the string. + static wstring GUIDToSymbolServerWString(GUID *guid); +}; + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_GUID_STRING_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/http_upload.h b/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/http_upload.h new file mode 100644 index 00000000..a1ba7ae1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/http_upload.h @@ -0,0 +1,125 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// HTTPUpload provides a "nice" API to send a multipart HTTP(S) POST +// request using wininet. It currently supports requests that contain +// a set of string parameters (key/value pairs), and a file to upload. + +#ifndef COMMON_WINDOWS_HTTP_UPLOAD_H__ +#define COMMON_WINDOWS_HTTP_UPLOAD_H__ + +#pragma warning( push ) +// Disable exception handler warnings. +#pragma warning( disable : 4530 ) + +#include +#include + +#include +#include +#include + +namespace google_breakpad { + +using std::string; +using std::wstring; +using std::map; +using std::vector; + +class HTTPUpload { + public: + // Sends the given set of parameters, along with the contents of + // upload_file, as a multipart POST request to the given URL. + // file_part_name contains the name of the file part of the request + // (i.e. it corresponds to the name= attribute on an . + // Parameter names must contain only printable ASCII characters, + // and may not contain a quote (") character. + // Only HTTP(S) URLs are currently supported. Returns true on success. + // If the request is successful and response_body is non-NULL, + // the response body will be returned in response_body. + // If response_code is non-NULL, it will be set to the HTTP response code + // received (or 0 if the request failed before getting an HTTP response). + static bool SendRequest(const wstring &url, + const map ¶meters, + const wstring &upload_file, + const wstring &file_part_name, + wstring *response_body, + int *response_code); + + private: + class AutoInternetHandle; + + // Retrieves the HTTP response. If NULL is passed in for response, + // this merely checks (via the return value) that we were successfully + // able to retrieve exactly as many bytes of content in the response as + // were specified in the Content-Length header. + static bool HTTPUpload::ReadResponse(HINTERNET request, wstring* response); + + // Generates a new multipart boundary for a POST request + static wstring GenerateMultipartBoundary(); + + // Generates a HTTP request header for a multipart form submit. + static wstring GenerateRequestHeader(const wstring &boundary); + + // Given a set of parameters, an upload filename, and a file part name, + // generates a multipart request body string with these parameters + // and minidump contents. Returns true on success. + static bool GenerateRequestBody(const map ¶meters, + const wstring &upload_file, + const wstring &file_part_name, + const wstring &boundary, + string *request_body); + + // Fills the supplied vector with the contents of filename. + static void GetFileContents(const wstring &filename, vector *contents); + + // Converts a UTF8 string to UTF16. + static wstring UTF8ToWide(const string &utf8); + + // Converts a UTF16 string to UTF8. + static string WideToUTF8(const wstring &wide); + + // Checks that the given list of parameters has only printable + // ASCII characters in the parameter name, and does not contain + // any quote (") characters. Returns true if so. + static bool CheckParameters(const map ¶meters); + + // No instances of this class should be created. + // Disallow all constructors, destructors, and operator=. + HTTPUpload(); + explicit HTTPUpload(const HTTPUpload &); + void operator=(const HTTPUpload &); + ~HTTPUpload(); +}; + +} // namespace google_breakpad + +#pragma warning( pop ) + +#endif // COMMON_WINDOWS_HTTP_UPLOAD_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/pdb_source_line_writer.h b/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/pdb_source_line_writer.h new file mode 100644 index 00000000..e91d0737 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/pdb_source_line_writer.h @@ -0,0 +1,163 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// PDBSourceLineWriter uses a pdb file produced by Visual C++ to output +// a line/address map for use with BasicSourceLineResolver. + +#ifndef _PDB_SOURCE_LINE_WRITER_H__ +#define _PDB_SOURCE_LINE_WRITER_H__ + +#include + +#include + +struct IDiaEnumLineNumbers; +struct IDiaSession; +struct IDiaSymbol; + +namespace google_breakpad { + +using std::wstring; + +// A structure that carries information that identifies a pdb file. +struct PDBModuleInfo { + public: + // The basename of the pdb file from which information was loaded. + wstring debug_file; + + // The pdb's identifier. For recent pdb files, the identifier consists + // of the pdb's guid, in uppercase hexadecimal form without any dashes + // or separators, followed immediately by the pdb's age, also in + // uppercase hexadecimal form. For older pdb files which have no guid, + // the identifier is the pdb's 32-bit signature value, in zero-padded + // hexadecimal form, followed immediately by the pdb's age, in lowercase + // hexadecimal form. + wstring debug_identifier; + + // A string identifying the cpu that the pdb is associated with. + // Currently, this may be "x86" or "unknown". + wstring cpu; +}; + +class PDBSourceLineWriter { + public: + enum FileFormat { + PDB_FILE, // a .pdb file containing debug symbols + EXE_FILE, // a .exe or .dll file + ANY_FILE // try PDB_FILE and then EXE_FILE + }; + + explicit PDBSourceLineWriter(); + ~PDBSourceLineWriter(); + + // Opens the given file. For executable files, the corresponding pdb + // file must be available; Open will be if it is not. + // If there is already a pdb file open, it is automatically closed. + // Returns true on success. + bool Open(const wstring &file, FileFormat format); + + // Locates the pdb file for the given executable (exe or dll) file, + // and opens it. If there is already a pdb file open, it is automatically + // closed. Returns true on success. + bool OpenExecutable(const wstring &exe_file); + + // Writes a map file from the current pdb file to the given file stream. + // Returns true on success. + bool WriteMap(FILE *map_file); + + // Closes the current pdb file and its associated resources. + void Close(); + + // Retrieves information about the module's debugging file. Returns + // true on success and false on failure. + bool GetModuleInfo(PDBModuleInfo *info); + + // Sets uses_guid to true if the opened file uses a new-style CodeView + // record with a 128-bit GUID, or false if the opened file uses an old-style + // CodeView record. When no GUID is available, a 32-bit signature should be + // used to identify the module instead. If the information cannot be + // determined, this method returns false. + bool UsesGUID(bool *uses_guid); + + private: + // Outputs the line/address pairs for each line in the enumerator. + // Returns true on success. + bool PrintLines(IDiaEnumLineNumbers *lines); + + // Outputs a function address and name, followed by its source line list. + // Returns true on success. + bool PrintFunction(IDiaSymbol *function); + + // Outputs all functions as described above. Returns true on success. + bool PrintFunctions(); + + // Outputs all of the source files in the session's pdb file. + // Returns true on success. + bool PrintSourceFiles(); + + // Outputs all of the frame information necessary to construct stack + // backtraces in the absence of frame pointers. Returns true on success. + bool PrintFrameData(); + + // Outputs a single public symbol address and name, if the symbol corresponds + // to a code address. Returns true on success. If symbol is does not + // correspond to code, returns true without outputting anything. + bool PrintCodePublicSymbol(IDiaSymbol *symbol); + + // Outputs a line identifying the PDB file that is being dumped, along with + // its uuid and age. + bool PrintPDBInfo(); + + // Returns the function name for a symbol. If possible, the name is + // undecorated. If the symbol's decorated form indicates the size of + // parameters on the stack, this information is returned in stack_param_size. + // Returns true on success. If the symbol doesn't encode parameter size + // information, stack_param_size is set to -1. + static bool GetSymbolFunctionName(IDiaSymbol *function, BSTR *name, + int *stack_param_size); + + // Returns the number of bytes of stack space used for a function's + // parameters. function must have the tag SymTagFunction. In the event of + // a failure, returns 0, which is also a valid number of bytes. + static int GetFunctionStackParamSize(IDiaSymbol *function); + + // The session for the currently-open pdb file. + CComPtr session_; + + // The current output file for this WriteMap invocation. + FILE *output_; + + // Disallow copy ctor and operator= + PDBSourceLineWriter(const PDBSourceLineWriter&); + void operator=(const PDBSourceLineWriter&); +}; + +} // namespace google_breakpad + +#endif // _PDB_SOURCE_LINE_WRITER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/string_utils-inl.h b/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/string_utils-inl.h new file mode 100644 index 00000000..6f650812 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/common/windows/string_utils-inl.h @@ -0,0 +1,139 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// string_utils-inl.h: Safer string manipulation on Windows, supporting +// pre-MSVC8 environments. + +#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H__ +#define COMMON_WINDOWS_STRING_UTILS_INL_H__ + +#include +#include + +#include + +// The "ll" printf format size specifier corresponding to |long long| was +// intrudced in MSVC8. Earlier versions did not provide this size specifier, +// but "I64" can be used to print 64-bit types. Don't use "I64" where "ll" +// is available, in the event of oddball systems where |long long| is not +// 64 bits wide. +#if _MSC_VER >= 1400 // MSVC 2005/8 +#define WIN_STRING_FORMAT_LL "ll" +#else // MSC_VER >= 1400 +#define WIN_STRING_FORMAT_LL "I64" +#endif // MSC_VER >= 1400 + +// A nonconforming version of swprintf, without the length argument, was +// included with the CRT prior to MSVC8. Although a conforming version was +// also available via an overload, it is not reliably chosen. _snwprintf +// behaves as a standards-confirming swprintf should, so force the use of +// _snwprintf when using older CRTs. +#if _MSC_VER < 1400 // MSVC 2005/8 +#define swprintf _snwprintf +#else +// For MSVC8 and newer, swprintf_s is the recommended method. Conveniently, +// it takes the same argument list as swprintf. +#define swprintf swprintf_s +#endif // MSC_VER < 1400 + +namespace google_breakpad { + +using std::string; +using std::wstring; + +class WindowsStringUtils { + public: + // Roughly equivalent to MSVC8's wcscpy_s, except pre-MSVC8, this does + // not fail if source is longer than destination_size. The destination + // buffer is always 0-terminated. + static void safe_wcscpy(wchar_t *destination, size_t destination_size, + const wchar_t *source); + + // Roughly equivalent to MSVC8's wcsncpy_s, except that _TRUNCATE cannot + // be passed directly, and pre-MSVC8, this will not fail if source or count + // are longer than destination_size. The destination buffer is always + // 0-terminated. + static void safe_wcsncpy(wchar_t *destination, size_t destination_size, + const wchar_t *source, size_t count); + + // Performs multi-byte to wide character conversion on C++ strings, using + // mbstowcs_s (MSVC8) or mbstowcs (pre-MSVC8). Returns false on failure, + // without setting wcs. + static bool safe_mbstowcs(const string &mbs, wstring *wcs); + + // Returns the base name of a file, e.g. strips off the path. + static wstring GetBaseName(const wstring &filename); + + private: + // Disallow instantiation and other object-based operations. + WindowsStringUtils(); + WindowsStringUtils(const WindowsStringUtils&); + ~WindowsStringUtils(); + void operator=(const WindowsStringUtils&); +}; + +// static +inline void WindowsStringUtils::safe_wcscpy(wchar_t *destination, + size_t destination_size, + const wchar_t *source) { +#if _MSC_VER >= 1400 // MSVC 2005/8 + wcscpy_s(destination, destination_size, source); +#else // _MSC_VER >= 1400 + // Pre-MSVC 2005/8 doesn't have wcscpy_s. Simulate it with wcsncpy. + // wcsncpy doesn't 0-terminate the destination buffer if the source string + // is longer than size. Ensure that the destination is 0-terminated. + wcsncpy(destination, source, destination_size); + if (destination && destination_size) + destination[destination_size - 1] = 0; +#endif // _MSC_VER >= 1400 +} + +// static +inline void WindowsStringUtils::safe_wcsncpy(wchar_t *destination, + size_t destination_size, + const wchar_t *source, + size_t count) { +#if _MSC_VER >= 1400 // MSVC 2005/8 + wcsncpy_s(destination, destination_size, source, count); +#else // _MSC_VER >= 1400 + // Pre-MSVC 2005/8 doesn't have wcsncpy_s. Simulate it with wcsncpy. + // wcsncpy doesn't 0-terminate the destination buffer if the source string + // is longer than size. Ensure that the destination is 0-terminated. + if (destination_size < count) + count = destination_size; + + wcsncpy(destination, source, count); + if (destination && count) + destination[count - 1] = 0; +#endif // _MSC_VER >= 1400 +} + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_STRING_UTILS_INL_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/breakpad_types.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/breakpad_types.h new file mode 100644 index 00000000..926b47f2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/breakpad_types.h @@ -0,0 +1,83 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* breakpad_types.h: Precise-width types + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file ensures that types u_intN_t are defined for N = 8, 16, 32, and + * 64. Types of precise widths are crucial to the task of writing data + * structures on one platform and reading them on another. + * + * Author: Mark Mentovai */ + +#ifndef GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ +#define GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ + +#ifndef _WIN32 + +#include +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif /* __STDC_FORMAT_MACROS */ +#include + +#if defined(__SUNPRO_CC) || (defined(__GNUC__) && defined(__sun__)) +typedef uint8_t u_int8_t; +typedef uint16_t u_int16_t; +typedef uint32_t u_int32_t; +typedef uint64_t u_int64_t; +#endif + +#else /* !_WIN32 */ + +#include + +typedef unsigned __int8 u_int8_t; +typedef unsigned __int16 u_int16_t; +typedef unsigned __int32 u_int32_t; +typedef unsigned __int64 u_int64_t; + +#endif /* !_WIN32 */ + +typedef struct { + u_int64_t high; + u_int64_t low; +} u_int128_t; + +typedef u_int64_t breakpad_time_t; + +/* Try to get PRIx64 from inttypes.h, but if it's not defined, fall back to + * llx, which is the format string for "long long" - this is a 64-bit + * integral type on many systems. */ +#ifndef PRIx64 +#define PRIx64 "llx" +#endif /* !PRIx64 */ + +#endif /* GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_amd64.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_amd64.h new file mode 100644 index 00000000..75dae7dd --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_amd64.h @@ -0,0 +1,231 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on amd64. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai + * Change to split into its own file: Neal Sidhwaney */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ + + +/* + * AMD64 support, see WINNT.H + */ + +typedef struct { + u_int16_t control_word; + u_int16_t status_word; + u_int8_t tag_word; + u_int8_t reserved1; + u_int16_t error_opcode; + u_int32_t error_offset; + u_int16_t error_selector; + u_int16_t reserved2; + u_int32_t data_offset; + u_int16_t data_selector; + u_int16_t reserved3; + u_int32_t mx_csr; + u_int32_t mx_csr_mask; + u_int128_t float_registers[8]; + u_int128_t xmm_registers[16]; + u_int8_t reserved4[96]; +} MDXmmSaveArea32AMD64; /* XMM_SAVE_AREA32 */ + +#define MD_CONTEXT_AMD64_VR_COUNT 26 + +typedef struct { + /* + * Register parameter home addresses. + */ + u_int64_t p1_home; + u_int64_t p2_home; + u_int64_t p3_home; + u_int64_t p4_home; + u_int64_t p5_home; + u_int64_t p6_home; + + /* The next field determines the layout of the structure, and which parts + * of it are populated */ + u_int32_t context_flags; + u_int32_t mx_csr; + + /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ + u_int16_t cs; + + /* The next 4 registers are included with MD_CONTEXT_AMD64_SEGMENTS */ + u_int16_t ds; + u_int16_t es; + u_int16_t fs; + u_int16_t gs; + + /* The next 2 registers are included with MD_CONTEXT_AMD64_CONTROL */ + u_int16_t ss; + u_int32_t eflags; + + /* The next 6 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */ + u_int64_t dr0; + u_int64_t dr1; + u_int64_t dr2; + u_int64_t dr3; + u_int64_t dr6; + u_int64_t dr7; + + /* The next 4 registers are included with MD_CONTEXT_AMD64_INTEGER */ + u_int64_t rax; + u_int64_t rcx; + u_int64_t rdx; + u_int64_t rbx; + + /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ + u_int64_t rsp; + + /* The next 11 registers are included with MD_CONTEXT_AMD64_INTEGER */ + u_int64_t rbp; + u_int64_t rsi; + u_int64_t rdi; + u_int64_t r8; + u_int64_t r9; + u_int64_t r10; + u_int64_t r11; + u_int64_t r12; + u_int64_t r13; + u_int64_t r14; + u_int64_t r15; + + /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ + u_int64_t rip; + + /* The next set of registers are included with + * MD_CONTEXT_AMD64_FLOATING_POINT + */ + union { + MDXmmSaveArea32AMD64 flt_save; + struct { + u_int128_t header[2]; + u_int128_t legacy[8]; + u_int128_t xmm0; + u_int128_t xmm1; + u_int128_t xmm2; + u_int128_t xmm3; + u_int128_t xmm4; + u_int128_t xmm5; + u_int128_t xmm6; + u_int128_t xmm7; + u_int128_t xmm8; + u_int128_t xmm9; + u_int128_t xmm10; + u_int128_t xmm11; + u_int128_t xmm12; + u_int128_t xmm13; + u_int128_t xmm14; + u_int128_t xmm15; + } sse_registers; + }; + + u_int128_t vector_register[MD_CONTEXT_AMD64_VR_COUNT]; + u_int64_t vector_control; + + /* The next 5 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */ + u_int64_t debug_control; + u_int64_t last_branch_to_rip; + u_int64_t last_branch_from_rip; + u_int64_t last_exception_to_rip; + u_int64_t last_exception_from_rip; + +} MDRawContextAMD64; /* CONTEXT */ + +/* For (MDRawContextAMD64).context_flags. These values indicate the type of + * context stored in the structure. The high 26 bits identify the CPU, the + * low 6 bits identify the type of context saved. */ +#define MD_CONTEXT_AMD64_CONTROL (MD_CONTEXT_AMD64 | 0x00000001) + /* CONTEXT_CONTROL */ +#define MD_CONTEXT_AMD64_INTEGER (MD_CONTEXT_AMD64 | 0x00000002) + /* CONTEXT_INTEGER */ +#define MD_CONTEXT_AMD64_SEGMENTS (MD_CONTEXT_AMD64 | 0x00000004) + /* CONTEXT_SEGMENTS */ +#define MD_CONTEXT_AMD64_FLOATING_POINT (MD_CONTEXT_AMD64 | 0x00000008) + /* CONTEXT_FLOATING_POINT */ +#define MD_CONTEXT_AMD64_DEBUG_REGISTERS (MD_CONTEXT_AMD64 | 0x00000010) + /* CONTEXT_DEBUG_REGISTERS */ +/* WinNT.h refers to CONTEXT_MMX_REGISTERS but doesn't appear to define it + * I think it really means CONTEXT_FLOATING_POINT. + */ + +#define MD_CONTEXT_AMD64_FULL (MD_CONTEXT_AMD64_CONTROL | \ + MD_CONTEXT_AMD64_INTEGER | \ + MD_CONTEXT_AMD64_FLOATING_POINT) + /* CONTEXT_FULL */ + +#define MD_CONTEXT_AMD64_ALL (MD_CONTEXT_AMD64_FULL | \ + MD_CONTEXT_AMD64_SEGMENTS | \ + MD_CONTEXT_X86_DEBUG_REGISTERS) + /* CONTEXT_ALL */ + + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_ppc.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_ppc.h new file mode 100644 index 00000000..038e921a --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_ppc.h @@ -0,0 +1,163 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on ppc. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai + * Change to split into its own file: Neal Sidhwaney */ + +/* + * Breakpad minidump extension for PowerPC support. Based on Darwin/Mac OS X' + * mach/ppc/_types.h + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ + +#define MD_FLOATINGSAVEAREA_PPC_FPR_COUNT 32 + +typedef struct { + /* fpregs is a double[32] in mach/ppc/_types.h, but a u_int64_t is used + * here for precise sizing. */ + u_int64_t fpregs[MD_FLOATINGSAVEAREA_PPC_FPR_COUNT]; + u_int32_t fpscr_pad; + u_int32_t fpscr; /* Status/control */ +} MDFloatingSaveAreaPPC; /* Based on ppc_float_state */ + + +#define MD_VECTORSAVEAREA_PPC_VR_COUNT 32 + +typedef struct { + /* Vector registers (including vscr) are 128 bits, but mach/ppc/_types.h + * exposes them as four 32-bit quantities. */ + u_int128_t save_vr[MD_VECTORSAVEAREA_PPC_VR_COUNT]; + u_int128_t save_vscr; /* Status/control */ + u_int32_t save_pad5[4]; + u_int32_t save_vrvalid; /* Identifies which vector registers are saved */ + u_int32_t save_pad6[7]; +} MDVectorSaveAreaPPC; /* ppc_vector_state */ + + +#define MD_CONTEXT_PPC_GPR_COUNT 32 + +/* Use the same 32-bit alignment when accessing this structure from 64-bit code + * as is used natively in 32-bit code. #pragma pack is a MSVC extension + * supported by gcc. */ +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#pragma pack(4) +#else +#pragma pack(push, 4) +#endif + +typedef struct { + /* context_flags is not present in ppc_thread_state, but it aids + * identification of MDRawContextPPC among other raw context types, + * and it guarantees alignment when we get to float_save. */ + u_int32_t context_flags; + + u_int32_t srr0; /* Machine status save/restore: stores pc + * (instruction) */ + u_int32_t srr1; /* Machine status save/restore: stores msr + * (ps, program/machine state) */ + /* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is + * used for brevity. */ + u_int32_t gpr[MD_CONTEXT_PPC_GPR_COUNT]; + u_int32_t cr; /* Condition */ + u_int32_t xer; /* Integer (fiXed-point) exception */ + u_int32_t lr; /* Link */ + u_int32_t ctr; /* Count */ + u_int32_t mq; /* Multiply/Quotient (PPC 601, POWER only) */ + u_int32_t vrsave; /* Vector save */ + + /* float_save and vector_save aren't present in ppc_thread_state, but + * are represented in separate structures that still define a thread's + * context. */ + MDFloatingSaveAreaPPC float_save; + MDVectorSaveAreaPPC vector_save; +} MDRawContextPPC; /* Based on ppc_thread_state */ + +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#pragma pack(0) +#else +#pragma pack(pop) +#endif + +/* For (MDRawContextPPC).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its + * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other + * CPUs. */ +#define MD_CONTEXT_PPC 0x20000000 +#define MD_CONTEXT_PPC_BASE (MD_CONTEXT_PPC | 0x00000001) +#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008) +#define MD_CONTEXT_PPC_VECTOR (MD_CONTEXT_PPC | 0x00000020) + +#define MD_CONTEXT_PPC_FULL MD_CONTEXT_PPC_BASE +#define MD_CONTEXT_PPC_ALL (MD_CONTEXT_PPC_FULL | \ + MD_CONTEXT_PPC_FLOATING_POINT | \ + MD_CONTEXT_PPC_VECTOR) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_ppc64.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_ppc64.h new file mode 100644 index 00000000..a788e5d1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_ppc64.h @@ -0,0 +1,129 @@ +/* Copyright (c) 2008, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on ppc64. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Neal Sidhwaney */ + + +/* + * Breakpad minidump extension for PPC64 support. Based on Darwin/Mac OS X' + * mach/ppc/_types.h + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ + +#include "minidump_cpu_ppc.h" + +// these types are the same in ppc64 & ppc +typedef MDFloatingSaveAreaPPC MDFloatingSaveAreaPPC64; +typedef MDVectorSaveAreaPPC MDVectorSaveAreaPPC64; + +#define MD_CONTEXT_PPC64_GPR_COUNT MD_CONTEXT_PPC_GPR_COUNT + +typedef struct { + /* context_flags is not present in ppc_thread_state, but it aids + * identification of MDRawContextPPC among other raw context types, + * and it guarantees alignment when we get to float_save. */ + u_int64_t context_flags; + + u_int64_t srr0; /* Machine status save/restore: stores pc + * (instruction) */ + u_int64_t srr1; /* Machine status save/restore: stores msr + * (ps, program/machine state) */ + /* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is + * used for brevity. */ + u_int64_t gpr[MD_CONTEXT_PPC64_GPR_COUNT]; + u_int64_t cr; /* Condition */ + u_int64_t xer; /* Integer (fiXed-point) exception */ + u_int64_t lr; /* Link */ + u_int64_t ctr; /* Count */ + u_int64_t vrsave; /* Vector save */ + + /* float_save and vector_save aren't present in ppc_thread_state, but + * are represented in separate structures that still define a thread's + * context. */ + MDFloatingSaveAreaPPC float_save; + MDVectorSaveAreaPPC vector_save; +} MDRawContextPPC64; /* Based on ppc_thread_state */ + +/* For (MDRawContextPPC).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its + * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other + * CPUs. */ +#define MD_CONTEXT_PPC 0x20000000 +#define MD_CONTEXT_PPC_BASE (MD_CONTEXT_PPC | 0x00000001) +#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008) +#define MD_CONTEXT_PPC_VECTOR (MD_CONTEXT_PPC | 0x00000020) + +#define MD_CONTEXT_PPC_FULL MD_CONTEXT_PPC_BASE +#define MD_CONTEXT_PPC_ALL (MD_CONTEXT_PPC_FULL | \ + MD_CONTEXT_PPC_FLOATING_POINT | \ + MD_CONTEXT_PPC_VECTOR) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_sparc.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_sparc.h new file mode 100644 index 00000000..ee95b64e --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_sparc.h @@ -0,0 +1,158 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on sparc. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai + * Change to split into its own file: Neal Sidhwaney */ + +/* + * SPARC support, see (solaris)sys/procfs_isa.h also + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ + +#define MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT 32 + +typedef struct { + + /* FPU floating point regs */ + u_int64_t regs[MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT]; + + u_int64_t filler; + u_int64_t fsr; /* FPU status register */ +} MDFloatingSaveAreaSPARC; /* FLOATING_SAVE_AREA */ + +#define MD_CONTEXT_SPARC_GPR_COUNT 32 + +typedef struct { + /* The next field determines the layout of the structure, and which parts + * of it are populated + */ + u_int32_t context_flags; + u_int32_t flag_pad; + /* + * General register access (SPARC). + * Don't confuse definitions here with definitions in . + * Registers are 32 bits for ILP32, 64 bits for LP64. + * SPARC V7/V8 is for 32bit, SPARC V9 is for 64bit + */ + + /* 32 Integer working registers */ + + /* g_r[0-7] global registers(g0-g7) + * g_r[8-15] out registers(o0-o7) + * g_r[16-23] local registers(l0-l7) + * g_r[24-31] in registers(i0-i7) + */ + u_int64_t g_r[MD_CONTEXT_SPARC_GPR_COUNT]; + + /* several control registers */ + + /* Processor State register(PSR) for SPARC V7/V8 + * Condition Code register (CCR) for SPARC V9 + */ + u_int64_t ccr; + + u_int64_t pc; /* Program Counter register (PC) */ + u_int64_t npc; /* Next Program Counter register (nPC) */ + u_int64_t y; /* Y register (Y) */ + + /* Address Space Identifier register (ASI) for SPARC V9 + * WIM for SPARC V7/V8 + */ + u_int64_t asi; + + /* Floating-Point Registers State register (FPRS) for SPARC V9 + * TBR for for SPARC V7/V8 + */ + u_int64_t fprs; + + /* The next field is included with MD_CONTEXT_SPARC_FLOATING_POINT */ + MDFloatingSaveAreaSPARC float_save; + +} MDRawContextSPARC; /* CONTEXT_SPARC */ + +/* For (MDRawContextSPARC).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_SPARC is Breakpad-defined. Its + * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other + * CPUs. */ +#define MD_CONTEXT_SPARC 0x10000000 +#define MD_CONTEXT_SPARC_CONTROL (MD_CONTEXT_SPARC | 0x00000001) +#define MD_CONTEXT_SPARC_INTEGER (MD_CONTEXT_SPARC | 0x00000002) +#define MD_CONTEXT_SAPARC_FLOATING_POINT (MD_CONTEXT_SPARC | 0x00000004) +#define MD_CONTEXT_SAPARC_EXTRA (MD_CONTEXT_SPARC | 0x00000008) + +#define MD_CONTEXT_SPARC_FULL (MD_CONTEXT_SPARC_CONTROL | \ + MD_CONTEXT_SPARC_INTEGER) + +#define MD_CONTEXT_SPARC_ALL (MD_CONTEXT_SPARC_FULL | \ + MD_CONTEXT_SAPARC_FLOATING_POINT | \ + MD_CONTEXT_SAPARC_EXTRA) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_x86.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_x86.h new file mode 100644 index 00000000..4dbc0e9a --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_cpu_x86.h @@ -0,0 +1,172 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on x86. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ + +#define MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE 80 + /* SIZE_OF_80387_REGISTERS */ + +typedef struct { + u_int32_t control_word; + u_int32_t status_word; + u_int32_t tag_word; + u_int32_t error_offset; + u_int32_t error_selector; + u_int32_t data_offset; + u_int32_t data_selector; + + /* register_area contains eight 80-bit (x87 "long double") quantities for + * floating-point registers %st0 (%mm0) through %st7 (%mm7). */ + u_int8_t register_area[MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE]; + u_int32_t cr0_npx_state; +} MDFloatingSaveAreaX86; /* FLOATING_SAVE_AREA */ + + +#define MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE 512 + /* MAXIMUM_SUPPORTED_EXTENSION */ + +typedef struct { + /* The next field determines the layout of the structure, and which parts + * of it are populated */ + u_int32_t context_flags; + + /* The next 6 registers are included with MD_CONTEXT_X86_DEBUG_REGISTERS */ + u_int32_t dr0; + u_int32_t dr1; + u_int32_t dr2; + u_int32_t dr3; + u_int32_t dr6; + u_int32_t dr7; + + /* The next field is included with MD_CONTEXT_X86_FLOATING_POINT */ + MDFloatingSaveAreaX86 float_save; + + /* The next 4 registers are included with MD_CONTEXT_X86_SEGMENTS */ + u_int32_t gs; + u_int32_t fs; + u_int32_t es; + u_int32_t ds; + /* The next 6 registers are included with MD_CONTEXT_X86_INTEGER */ + u_int32_t edi; + u_int32_t esi; + u_int32_t ebx; + u_int32_t edx; + u_int32_t ecx; + u_int32_t eax; + + /* The next 6 registers are included with MD_CONTEXT_X86_CONTROL */ + u_int32_t ebp; + u_int32_t eip; + u_int32_t cs; /* WinNT.h says "must be sanitized" */ + u_int32_t eflags; /* WinNT.h says "must be sanitized" */ + u_int32_t esp; + u_int32_t ss; + + /* The next field is included with MD_CONTEXT_X86_EXTENDED_REGISTERS. + * It contains vector (MMX/SSE) registers. It it laid out in the + * format used by the fxsave and fsrstor instructions, so it includes + * a copy of the x87 floating-point registers as well. See FXSAVE in + * "Intel Architecture Software Developer's Manual, Volume 2." */ + u_int8_t extended_registers[ + MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE]; +} MDRawContextX86; /* CONTEXT */ + +/* For (MDRawContextX86).context_flags. These values indicate the type of + * context stored in the structure. The high 26 bits identify the CPU, the + * low 6 bits identify the type of context saved. */ +#define MD_CONTEXT_X86 0x00010000 + /* CONTEXT_i386, CONTEXT_i486: identifies CPU */ +#define MD_CONTEXT_X86_CONTROL (MD_CONTEXT_X86 | 0x00000001) + /* CONTEXT_CONTROL */ +#define MD_CONTEXT_X86_INTEGER (MD_CONTEXT_X86 | 0x00000002) + /* CONTEXT_INTEGER */ +#define MD_CONTEXT_X86_SEGMENTS (MD_CONTEXT_X86 | 0x00000004) + /* CONTEXT_SEGMENTS */ +#define MD_CONTEXT_X86_FLOATING_POINT (MD_CONTEXT_X86 | 0x00000008) + /* CONTEXT_FLOATING_POINT */ +#define MD_CONTEXT_X86_DEBUG_REGISTERS (MD_CONTEXT_X86 | 0x00000010) + /* CONTEXT_DEBUG_REGISTERS */ +#define MD_CONTEXT_X86_EXTENDED_REGISTERS (MD_CONTEXT_X86 | 0x00000020) + /* CONTEXT_EXTENDED_REGISTERS */ + +#define MD_CONTEXT_X86_FULL (MD_CONTEXT_X86_CONTROL | \ + MD_CONTEXT_X86_INTEGER | \ + MD_CONTEXT_X86_SEGMENTS) + /* CONTEXT_FULL */ + +#define MD_CONTEXT_X86_ALL (MD_CONTEXT_X86_FULL | \ + MD_CONTEXT_X86_FLOATING_POINT | \ + MD_CONTEXT_X86_DEBUG_REGISTERS | \ + MD_CONTEXT_X86_EXTENDED_REGISTERS) + /* CONTEXT_ALL */ + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_linux.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_linux.h new file mode 100644 index 00000000..d52c7519 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_linux.h @@ -0,0 +1,85 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_linux.h: A definition of exception codes for + * Linux + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + + +/* For (MDException).exception_code. These values come from bits/signum.h. + */ +typedef enum { + MD_EXCEPTION_CODE_LIN_SIGHUP = 1, /* Hangup (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGINT = 2, /* Interrupt (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGQUIT = 3, /* Quit (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGILL = 4, /* Illegal instruction (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGTRAP = 5, /* Trace trap (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGABRT = 6, /* Abort (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGBUS = 7, /* BUS error (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGFPE = 8, /* Floating-point exception (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGKILL = 9, /* Kill, unblockable (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGUSR1 = 10, /* User-defined signal 1 (POSIX). */ + MD_EXCEPTION_CODE_LIN_SIGSEGV = 11, /* Segmentation violation (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGUSR2 = 12, /* User-defined signal 2 (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGPIPE = 13, /* Broken pipe (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGALRM = 14, /* Alarm clock (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTERM = 15, /* Termination (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGSTKFLT = 16, /* Stack faultd */ + MD_EXCEPTION_CODE_LIN_SIGCHLD = 17, /* Child status has changed (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGCONT = 18, /* Continue (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGSTOP = 19, /* Stop, unblockable (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTSTP = 20, /* Keyboard stop (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTTIN = 21, /* Background read from tty (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTTOU = 22, /* Background write to tty (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGURG = 23, + /* Urgent condition on socket (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGXCPU = 24, /* CPU limit exceeded (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGXFSZ = 25, + /* File size limit exceeded (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGVTALRM = 26, /* Virtual alarm clock (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGPROF = 27, /* Profiling alarm clock (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGWINCH = 28, /* Window size change (4.3 BSD, Sun) */ + MD_EXCEPTION_CODE_LIN_SIGIO = 29, /* I/O now possible (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGPWR = 30, /* Power failure restart (System V) */ + MD_EXCEPTION_CODE_LIN_SIGSYS = 31 /* Bad system call */ +} MDExceptionCodeLinux; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_mac.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_mac.h new file mode 100644 index 00000000..5fba44ca --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_mac.h @@ -0,0 +1,193 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_mac.h: A definition of exception codes for Mac + * OS X + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +/* For (MDException).exception_code. Breakpad minidump extension for Mac OS X + * support. Based on Darwin/Mac OS X' mach/exception_types.h. This is + * what Mac OS X calls an "exception", not a "code". */ +typedef enum { + /* Exception code. The high 16 bits of exception_code contains one of + * these values. */ + MD_EXCEPTION_MAC_BAD_ACCESS = 1, /* code can be a kern_return_t */ + /* EXC_BAD_ACCESS */ + MD_EXCEPTION_MAC_BAD_INSTRUCTION = 2, /* code is CPU-specific */ + /* EXC_BAD_INSTRUCTION */ + MD_EXCEPTION_MAC_ARITHMETIC = 3, /* code is CPU-specific */ + /* EXC_ARITHMETIC */ + MD_EXCEPTION_MAC_EMULATION = 4, /* code is CPU-specific */ + /* EXC_EMULATION */ + MD_EXCEPTION_MAC_SOFTWARE = 5, + /* EXC_SOFTWARE */ + MD_EXCEPTION_MAC_BREAKPOINT = 6, /* code is CPU-specific */ + /* EXC_BREAKPOINT */ + MD_EXCEPTION_MAC_SYSCALL = 7, + /* EXC_SYSCALL */ + MD_EXCEPTION_MAC_MACH_SYSCALL = 8, + /* EXC_MACH_SYSCALL */ + MD_EXCEPTION_MAC_RPC_ALERT = 9 + /* EXC_RPC_ALERT */ +} MDExceptionMac; + +/* For (MDException).exception_flags. Breakpad minidump extension for Mac OS X + * support. Based on Darwin/Mac OS X' mach/ppc/exception.h and + * mach/i386/exception.h. This is what Mac OS X calls a "code". */ +typedef enum { + /* With MD_EXCEPTION_BAD_ACCESS. These are relevant kern_return_t values + * from mach/kern_return.h. */ + MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS = 1, + /* KERN_INVALID_ADDRESS */ + MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE = 2, + /* KERN_PROTECTION_FAILURE */ + MD_EXCEPTION_CODE_MAC_NO_ACCESS = 8, + /* KERN_NO_ACCESS */ + MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE = 9, + /* KERN_MEMORY_FAILURE */ + MD_EXCEPTION_CODE_MAC_MEMORY_ERROR = 10, + /* KERN_MEMORY_ERROR */ + + /* With MD_EXCEPTION_SOFTWARE */ + MD_EXCEPTION_CODE_MAC_BAD_SYSCALL = 0x00010000, /* Mach SIGSYS */ + MD_EXCEPTION_CODE_MAC_BAD_PIPE = 0x00010001, /* Mach SIGPIPE */ + MD_EXCEPTION_CODE_MAC_ABORT = 0x00010002, /* Mach SIGABRT */ + + /* With MD_EXCEPTION_MAC_BAD_ACCESS on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ = 0x0101, + /* EXC_PPC_VM_PROT_READ */ + MD_EXCEPTION_CODE_MAC_PPC_BADSPACE = 0x0102, + /* EXC_PPC_BADSPACE */ + MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED = 0x0103, + /* EXC_PPC_UNALIGNED */ + + /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL = 1, + /* EXC_PPC_INVALID_SYSCALL */ + MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION = 2, + /* EXC_PPC_UNIPL_INST */ + MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION = 3, + /* EXC_PPC_PRIVINST */ + MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER = 4, + /* EXC_PPC_PRIVREG */ + MD_EXCEPTION_CODE_MAC_PPC_TRACE = 5, + /* EXC_PPC_TRACE */ + MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR = 6, + /* EXC_PPC_PERFMON */ + + /* With MD_EXCEPTION_MAC_ARITHMETIC on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW = 1, + /* EXC_PPC_OVERFLOW */ + MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE = 2, + /* EXC_PPC_ZERO_DIVIDE */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT = 3, + /* EXC_FLT_INEXACT */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE = 4, + /* EXC_PPC_FLT_ZERO_DIVIDE */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW = 5, + /* EXC_PPC_FLT_UNDERFLOW */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW = 6, + /* EXC_PPC_FLT_OVERFLOW */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER = 7, + /* EXC_PPC_FLT_NOT_A_NUMBER */ + + /* With MD_EXCEPTION_MAC_EMULATION on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION = 8, + /* EXC_PPC_NOEMULATION */ + MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST = 9, + /* EXC_PPC_ALTIVECASSIST */ + + /* With MD_EXCEPTION_MAC_SOFTWARE on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_TRAP = 0x00000001, /* EXC_PPC_TRAP */ + MD_EXCEPTION_CODE_MAC_PPC_MIGRATE = 0x00010100, /* EXC_PPC_MIGRATE */ + + /* With MD_EXCEPTION_MAC_BREAKPOINT on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT = 1, /* EXC_PPC_BREAKPOINT */ + + /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86, see also x86 interrupt + * values below. */ + MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION = 1, /* EXC_I386_INVOP */ + + /* With MD_EXCEPTION_MAC_ARITHMETIC on x86 */ + MD_EXCEPTION_CODE_MAC_X86_DIV = 1, /* EXC_I386_DIV */ + MD_EXCEPTION_CODE_MAC_X86_INTO = 2, /* EXC_I386_INTO */ + MD_EXCEPTION_CODE_MAC_X86_NOEXT = 3, /* EXC_I386_NOEXT */ + MD_EXCEPTION_CODE_MAC_X86_EXTOVR = 4, /* EXC_I386_EXTOVR */ + MD_EXCEPTION_CODE_MAC_X86_EXTERR = 5, /* EXC_I386_EXTERR */ + MD_EXCEPTION_CODE_MAC_X86_EMERR = 6, /* EXC_I386_EMERR */ + MD_EXCEPTION_CODE_MAC_X86_BOUND = 7, /* EXC_I386_BOUND */ + MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR = 8, /* EXC_I386_SSEEXTERR */ + + /* With MD_EXCEPTION_MAC_BREAKPOINT on x86 */ + MD_EXCEPTION_CODE_MAC_X86_SGL = 1, /* EXC_I386_SGL */ + MD_EXCEPTION_CODE_MAC_X86_BPT = 2, /* EXC_I386_BPT */ + + /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86. These are the raw + * x86 interrupt codes. Most of these are mapped to other Mach + * exceptions and codes, are handled, or should not occur in user space. + * A few of these will do occur with MD_EXCEPTION_MAC_BAD_INSTRUCTION. */ + /* EXC_I386_DIVERR = 0: mapped to EXC_ARITHMETIC/EXC_I386_DIV */ + /* EXC_I386_SGLSTP = 1: mapped to EXC_BREAKPOINT/EXC_I386_SGL */ + /* EXC_I386_NMIFLT = 2: should not occur in user space */ + /* EXC_I386_BPTFLT = 3: mapped to EXC_BREAKPOINT/EXC_I386_BPT */ + /* EXC_I386_INTOFLT = 4: mapped to EXC_ARITHMETIC/EXC_I386_INTO */ + /* EXC_I386_BOUNDFLT = 5: mapped to EXC_ARITHMETIC/EXC_I386_BOUND */ + /* EXC_I386_INVOPFLT = 6: mapped to EXC_BAD_INSTRUCTION/EXC_I386_INVOP */ + /* EXC_I386_NOEXTFLT = 7: should be handled by the kernel */ + /* EXC_I386_DBLFLT = 8: should be handled (if possible) by the kernel */ + /* EXC_I386_EXTOVRFLT = 9: mapped to EXC_BAD_ACCESS/(PROT_READ|PROT_EXEC) */ + MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT = 10, + /* EXC_INVTSSFLT */ + MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT = 11, + /* EXC_SEGNPFLT */ + MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT = 12, + /* EXC_STKFLT */ + MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT = 13, + /* EXC_GPFLT */ + /* EXC_I386_PGFLT = 14: should not occur in user space */ + /* EXC_I386_EXTERRFLT = 16: mapped to EXC_ARITHMETIC/EXC_I386_EXTERR */ + MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT = 17 + /* EXC_ALIGNFLT (for vector operations) */ + /* EXC_I386_ENOEXTFLT = 32: should be handled by the kernel */ + /* EXC_I386_ENDPERR = 33: should not occur */ +} MDExceptionCodeMac; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_OSX_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_solaris.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_solaris.h new file mode 100644 index 00000000..d48632ac --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_solaris.h @@ -0,0 +1,94 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_solaris.h: A definition of exception codes for + * Solaris + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +/* For (MDException).exception_code. These values come from sys/iso/signal_iso.h + */ +typedef enum { + MD_EXCEPTION_CODE_SOL_SIGHUP = 1, /* Hangup */ + MD_EXCEPTION_CODE_SOL_SIGINT = 2, /* interrupt (rubout) */ + MD_EXCEPTION_CODE_SOL_SIGQUIT = 3, /* quit (ASCII FS) */ + MD_EXCEPTION_CODE_SOL_SIGILL = 4, /* illegal instruction (not reset when caught) */ + MD_EXCEPTION_CODE_SOL_SIGTRAP = 5, /* trace trap (not reset when caught) */ + MD_EXCEPTION_CODE_SOL_SIGIOT = 6, /* IOT instruction */ + MD_EXCEPTION_CODE_SOL_SIGABRT = 6, /* used by abort, replace SIGIOT in the future */ + MD_EXCEPTION_CODE_SOL_SIGEMT = 7, /* EMT instruction */ + MD_EXCEPTION_CODE_SOL_SIGFPE = 8, /* floating point exception */ + MD_EXCEPTION_CODE_SOL_SIGKILL = 9, /* kill (cannot be caught or ignored) */ + MD_EXCEPTION_CODE_SOL_SIGBUS = 10, /* bus error */ + MD_EXCEPTION_CODE_SOL_SIGSEGV = 11, /* segmentation violation */ + MD_EXCEPTION_CODE_SOL_SIGSYS = 12, /* bad argument to system call */ + MD_EXCEPTION_CODE_SOL_SIGPIPE = 13, /* write on a pipe with no one to read it */ + MD_EXCEPTION_CODE_SOL_SIGALRM = 14, /* alarm clock */ + MD_EXCEPTION_CODE_SOL_SIGTERM = 15, /* software termination signal from kill */ + MD_EXCEPTION_CODE_SOL_SIGUSR1 = 16, /* user defined signal 1 */ + MD_EXCEPTION_CODE_SOL_SIGUSR2 = 17, /* user defined signal 2 */ + MD_EXCEPTION_CODE_SOL_SIGCLD = 18, /* child status change */ + MD_EXCEPTION_CODE_SOL_SIGCHLD = 18, /* child status change alias (POSIX) */ + MD_EXCEPTION_CODE_SOL_SIGPWR = 19, /* power-fail restart */ + MD_EXCEPTION_CODE_SOL_SIGWINCH = 20, /* window size change */ + MD_EXCEPTION_CODE_SOL_SIGURG = 21, /* urgent socket condition */ + MD_EXCEPTION_CODE_SOL_SIGPOLL = 22, /* pollable event occured */ + MD_EXCEPTION_CODE_SOL_SIGIO = 22, /* socket I/O possible (SIGPOLL alias) */ + MD_EXCEPTION_CODE_SOL_SIGSTOP = 23, /* stop (cannot be caught or ignored) */ + MD_EXCEPTION_CODE_SOL_SIGTSTP = 24, /* user stop requested from tty */ + MD_EXCEPTION_CODE_SOL_SIGCONT = 25, /* stopped process has been continued */ + MD_EXCEPTION_CODE_SOL_SIGTTIN = 26, /* background tty read attempted */ + MD_EXCEPTION_CODE_SOL_SIGTTOU = 27, /* background tty write attempted */ + MD_EXCEPTION_CODE_SOL_SIGVTALRM = 28, /* virtual timer expired */ + MD_EXCEPTION_CODE_SOL_SIGPROF = 29, /* profiling timer expired */ + MD_EXCEPTION_CODE_SOL_SIGXCPU = 30, /* exceeded cpu limit */ + MD_EXCEPTION_CODE_SOL_SIGXFSZ = 31, /* exceeded file size limit */ + MD_EXCEPTION_CODE_SOL_SIGWAITING = 32, /* reserved signal no longer used by threading code */ + MD_EXCEPTION_CODE_SOL_SIGLWP = 33, /* reserved signal no longer used by threading code */ + MD_EXCEPTION_CODE_SOL_SIGFREEZE = 34, /* special signal used by CPR */ + MD_EXCEPTION_CODE_SOL_SIGTHAW = 35, /* special signal used by CPR */ + MD_EXCEPTION_CODE_SOL_SIGCANCEL = 36, /* reserved signal for thread cancellation */ + MD_EXCEPTION_CODE_SOL_SIGLOST = 37, /* resource lost (eg, record-lock lost) */ + MD_EXCEPTION_CODE_SOL_SIGXRES = 38, /* resource control exceeded */ + MD_EXCEPTION_CODE_SOL_SIGJVM1 = 39, /* reserved signal for Java Virtual Machine */ + MD_EXCEPTION_CODE_SOL_SIGJVM2 = 40 /* reserved signal for Java Virtual Machine */ +} MDExceptionCodeSolaris; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_win32.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_win32.h new file mode 100644 index 00000000..7fd4bc4f --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_exception_win32.h @@ -0,0 +1,102 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_win32.h: Definitions of exception codes for + * Win32 platform + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + + +/* For (MDException).exception_code. These values come from WinBase.h + * and WinNT.h (names beginning with EXCEPTION_ are in WinBase.h, + * they are STATUS_ in WinNT.h). */ +typedef enum { + MD_EXCEPTION_CODE_WIN_CONTROL_C = 0x40010005, + /* DBG_CONTROL_C */ + MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION = 0x80000001, + /* EXCEPTION_GUARD_PAGE */ + MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT = 0x80000002, + /* EXCEPTION_DATATYPE_MISALIGNMENT */ + MD_EXCEPTION_CODE_WIN_BREAKPOINT = 0x80000003, + /* EXCEPTION_BREAKPOINT */ + MD_EXCEPTION_CODE_WIN_SINGLE_STEP = 0x80000004, + /* EXCEPTION_SINGLE_STEP */ + MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION = 0xc0000005, + /* EXCEPTION_ACCESS_VIOLATION */ + MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR = 0xc0000006, + /* EXCEPTION_IN_PAGE_ERROR */ + MD_EXCEPTION_CODE_WIN_INVALID_HANDLE = 0xc0000008, + /* EXCEPTION_INVALID_HANDLE */ + MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION = 0xc000001d, + /* EXCEPTION_ILLEGAL_INSTRUCTION */ + MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION = 0xc0000025, + /* EXCEPTION_NONCONTINUABLE_EXCEPTION */ + MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION = 0xc0000026, + /* EXCEPTION_INVALID_DISPOSITION */ + MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED = 0xc000008c, + /* EXCEPTION_BOUNDS_EXCEEDED */ + MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND = 0xc000008d, + /* EXCEPTION_FLT_DENORMAL_OPERAND */ + MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO = 0xc000008e, + /* EXCEPTION_FLT_DIVIDE_BY_ZERO */ + MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT = 0xc000008f, + /* EXCEPTION_FLT_INEXACT_RESULT */ + MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION = 0xc0000090, + /* EXCEPTION_FLT_INVALID_OPERATION */ + MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW = 0xc0000091, + /* EXCEPTION_FLT_OVERFLOW */ + MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK = 0xc0000092, + /* EXCEPTION_FLT_STACK_CHECK */ + MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW = 0xc0000093, + /* EXCEPTION_FLT_UNDERFLOW */ + MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO = 0xc0000094, + /* EXCEPTION_INT_DIVIDE_BY_ZERO */ + MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW = 0xc0000095, + /* EXCEPTION_INT_OVERFLOW */ + MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION = 0xc0000096, + /* EXCEPTION_PRIV_INSTRUCTION */ + MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW = 0xc00000fd, + /* EXCEPTION_STACK_OVERFLOW */ + MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK = 0xc0000194 + /* EXCEPTION_POSSIBLE_DEADLOCK */ +} MDExceptionCodeWin; + + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_format.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_format.h new file mode 100644 index 00000000..4d9e767f --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_format.h @@ -0,0 +1,721 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + + +#if defined(_MSC_VER) +/* Disable "zero-sized array in struct/union" warnings when compiling in + * MSVC. DbgHelp.h does this too. */ +#pragma warning(push) +#pragma warning(disable:4200) +#endif /* _MSC_VER */ + + +/* + * guiddef.h + */ + +typedef struct { + u_int32_t data1; + u_int16_t data2; + u_int16_t data3; + u_int8_t data4[8]; +} MDGUID; /* GUID */ + + +/* + * WinNT.h + */ + +/* Non-x86 CPU identifiers found in the high 26 bits of + * (MDRawContext*).context_flags. These aren't used by Breakpad, but are + * defined here for reference, to avoid assigning values that conflict + * (although some values already conflict). */ +#define MD_CONTEXT_IA64 0x00080000 /* CONTEXT_IA64 */ +#define MD_CONTEXT_AMD64 0x00100000 /* CONTEXT_AMD64 */ +/* Additional values from winnt.h in the Windows CE 5.0 SDK: */ +#define MD_CONTEXT_SHX 0x000000c0 /* CONTEXT_SH4 (Super-H, includes SH3) */ +#define MD_CONTEXT_ARM 0x00000040 /* CONTEXT_ARM (0x40 bit set in SHx?) */ +#define MD_CONTEXT_MIPS 0x00010000 /* CONTEXT_R4000 (same value as x86?) */ +#define MD_CONTEXT_ALPHA 0x00020000 /* CONTEXT_ALPHA */ + +#define MD_CONTEXT_CPU_MASK 0xffffffc0 + + +/* This is a base type for MDRawContextX86 and MDRawContextPPC. This + * structure should never be allocated directly. The actual structure type + * can be determined by examining the context_flags field. */ +typedef struct { + u_int32_t context_flags; +} MDRawContextBase; + +#include "minidump_cpu_sparc.h" +#include "minidump_cpu_x86.h" +#include "minidump_cpu_ppc.h" +#include "minidump_cpu_ppc64.h" +#include "minidump_cpu_amd64.h" + + +/* + * WinVer.h + */ + + +typedef struct { + u_int32_t signature; + u_int32_t struct_version; + u_int32_t file_version_hi; + u_int32_t file_version_lo; + u_int32_t product_version_hi; + u_int32_t product_version_lo; + u_int32_t file_flags_mask; /* Identifies valid bits in fileFlags */ + u_int32_t file_flags; + u_int32_t file_os; + u_int32_t file_type; + u_int32_t file_subtype; + u_int32_t file_date_hi; + u_int32_t file_date_lo; +} MDVSFixedFileInfo; /* VS_FIXEDFILEINFO */ + +/* For (MDVSFixedFileInfo).signature */ +#define MD_VSFIXEDFILEINFO_SIGNATURE 0xfeef04bd + /* VS_FFI_SIGNATURE */ + +/* For (MDVSFixedFileInfo).version */ +#define MD_VSFIXEDFILEINFO_VERSION 0x00010000 + /* VS_FFI_STRUCVERSION */ + +/* For (MDVSFixedFileInfo).file_flags_mask and + * (MDVSFixedFileInfo).file_flags */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG 0x00000001 + /* VS_FF_DEBUG */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRERELEASE 0x00000002 + /* VS_FF_PRERELEASE */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PATCHED 0x00000004 + /* VS_FF_PATCHED */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRIVATEBUILD 0x00000008 + /* VS_FF_PRIVATEBUILD */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_INFOINFERRED 0x00000010 + /* VS_FF_INFOINFERRED */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_SPECIALBUILD 0x00000020 + /* VS_FF_SPECIALBUILD */ + +/* For (MDVSFixedFileInfo).file_os: high 16 bits */ +#define MD_VSFIXEDFILEINFO_FILE_OS_UNKNOWN 0 /* VOS_UNKNOWN */ +#define MD_VSFIXEDFILEINFO_FILE_OS_DOS (1 << 16) /* VOS_DOS */ +#define MD_VSFIXEDFILEINFO_FILE_OS_OS216 (2 << 16) /* VOS_OS216 */ +#define MD_VSFIXEDFILEINFO_FILE_OS_OS232 (3 << 16) /* VOS_OS232 */ +#define MD_VSFIXEDFILEINFO_FILE_OS_NT (4 << 16) /* VOS_NT */ +#define MD_VSFIXEDFILEINFO_FILE_OS_WINCE (5 << 16) /* VOS_WINCE */ +/* Low 16 bits */ +#define MD_VSFIXEDFILEINFO_FILE_OS__BASE 0 /* VOS__BASE */ +#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS16 1 /* VOS__WINDOWS16 */ +#define MD_VSFIXEDFILEINFO_FILE_OS__PM16 2 /* VOS__PM16 */ +#define MD_VSFIXEDFILEINFO_FILE_OS__PM32 3 /* VOS__PM32 */ +#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32 4 /* VOS__WINDOWS32 */ + +/* For (MDVSFixedFileInfo).file_type */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_UNKNOWN 0 /* VFT_UNKNOWN */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_APP 1 /* VFT_APP */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_DLL 2 /* VFT_DLL */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_DRV 3 /* VFT_DLL */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_FONT 4 /* VFT_FONT */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_VXD 5 /* VFT_VXD */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_STATIC_LIB 7 /* VFT_STATIC_LIB */ + +/* For (MDVSFixedFileInfo).file_subtype */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN 0 + /* VFT2_UNKNOWN */ +/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_DRV */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_PRINTER 1 + /* VFT2_DRV_PRINTER */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_KEYBOARD 2 + /* VFT2_DRV_KEYBOARD */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_LANGUAGE 3 + /* VFT2_DRV_LANGUAGE */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_DISPLAY 4 + /* VFT2_DRV_DISPLAY */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_MOUSE 5 + /* VFT2_DRV_MOUSE */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_NETWORK 6 + /* VFT2_DRV_NETWORK */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SYSTEM 7 + /* VFT2_DRV_SYSTEM */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INSTALLABLE 8 + /* VFT2_DRV_INSTALLABLE */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SOUND 9 + /* VFT2_DRV_SOUND */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_COMM 10 + /* VFT2_DRV_COMM */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INPUTMETHOD 11 + /* VFT2_DRV_INPUTMETHOD */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_VERSIONED_PRINTER 12 + /* VFT2_DRV_VERSIONED_PRINTER */ +/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_FONT */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_RASTER 1 + /* VFT2_FONT_RASTER */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_VECTOR 2 + /* VFT2_FONT_VECTOR */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_TRUETYPE 3 + /* VFT2_FONT_TRUETYPE */ + + +/* + * DbgHelp.h + */ + + +/* An MDRVA is an offset into the minidump file. The beginning of the + * MDRawHeader is at offset 0. */ +typedef u_int32_t MDRVA; /* RVA */ + +typedef struct { + u_int32_t data_size; + MDRVA rva; +} MDLocationDescriptor; /* MINIDUMP_LOCATION_DESCRIPTOR */ + + +typedef struct { + /* The base address of the memory range on the host that produced the + * minidump. */ + u_int64_t start_of_memory_range; + + MDLocationDescriptor memory; +} MDMemoryDescriptor; /* MINIDUMP_MEMORY_DESCRIPTOR */ + + +typedef struct { + u_int32_t signature; + u_int32_t version; + u_int32_t stream_count; + MDRVA stream_directory_rva; /* A |stream_count|-sized array of + * MDRawDirectory structures. */ + u_int32_t checksum; /* Can be 0. In fact, that's all that's + * been found in minidump files. */ + u_int32_t time_date_stamp; /* time_t */ + u_int64_t flags; +} MDRawHeader; /* MINIDUMP_HEADER */ + +/* For (MDRawHeader).signature and (MDRawHeader).version. Note that only the + * low 16 bits of (MDRawHeader).version are MD_HEADER_VERSION. Per the + * documentation, the high 16 bits are implementation-specific. */ +#define MD_HEADER_SIGNATURE 0x504d444d /* 'PMDM' */ + /* MINIDUMP_SIGNATURE */ +#define MD_HEADER_VERSION 0x0000a793 /* 42899 */ + /* MINIDUMP_VERSION */ + +/* For (MDRawHeader).flags: */ +typedef enum { + /* MD_NORMAL is the standard type of minidump. It includes full + * streams for the thread list, module list, exception, system info, + * and miscellaneous info. A memory list stream is also present, + * pointing to the same stack memory contained in the thread list, + * as well as a 256-byte region around the instruction address that + * was executing when the exception occurred. Stack memory is from + * 4 bytes below a thread's stack pointer up to the top of the + * memory region encompassing the stack. */ + MD_NORMAL = 0x00000000, + MD_WITH_DATA_SEGS = 0x00000001, + MD_WITH_FULL_MEMORY = 0x00000002, + MD_WITH_HANDLE_DATA = 0x00000004, + MD_FILTER_MEMORY = 0x00000008, + MD_SCAN_MEMORY = 0x00000010, + MD_WITH_UNLOADED_MODULES = 0x00000020, + MD_WITH_INDIRECTLY_REFERENCED_MEMORY = 0x00000040, + MD_FILTER_MODULE_PATHS = 0x00000080, + MD_WITH_PROCESS_THREAD_DATA = 0x00000100, + MD_WITH_PRIVATE_READ_WRITE_MEMORY = 0x00000200, + MD_WITHOUT_OPTIONAL_DATA = 0x00000400, + MD_WITH_FULL_MEMORY_INFO = 0x00000800, + MD_WITH_THREAD_INFO = 0x00001000, + MD_WITH_CODE_SEGS = 0x00002000 +} MDType; /* MINIDUMP_TYPE */ + + +typedef struct { + u_int32_t stream_type; + MDLocationDescriptor location; +} MDRawDirectory; /* MINIDUMP_DIRECTORY */ + +/* For (MDRawDirectory).stream_type */ +typedef enum { + MD_UNUSED_STREAM = 0, + MD_RESERVED_STREAM_0 = 1, + MD_RESERVED_STREAM_1 = 2, + MD_THREAD_LIST_STREAM = 3, /* MDRawThreadList */ + MD_MODULE_LIST_STREAM = 4, /* MDRawModuleList */ + MD_MEMORY_LIST_STREAM = 5, /* MDRawMemoryList */ + MD_EXCEPTION_STREAM = 6, /* MDRawExceptionStream */ + MD_SYSTEM_INFO_STREAM = 7, /* MDRawSystemInfo */ + MD_THREAD_EX_LIST_STREAM = 8, + MD_MEMORY_64_LIST_STREAM = 9, + MD_COMMENT_STREAM_A = 10, + MD_COMMENT_STREAM_W = 11, + MD_HANDLE_DATA_STREAM = 12, + MD_FUNCTION_TABLE_STREAM = 13, + MD_UNLOADED_MODULE_LIST_STREAM = 14, + MD_MISC_INFO_STREAM = 15, /* MDRawMiscInfo */ + MD_LAST_RESERVED_STREAM = 0x0000ffff, + + /* Breakpad extension types. 0x4767 = "Gg" */ + MD_BREAKPAD_INFO_STREAM = 0x47670001, /* MDRawBreakpadInfo */ + MD_ASSERTION_INFO_STREAM = 0x47670002 /* MDRawAssertionInfo */ +} MDStreamType; /* MINIDUMP_STREAM_TYPE */ + + +typedef struct { + u_int32_t length; /* Length of buffer in bytes (not characters), + * excluding 0-terminator */ + u_int16_t buffer[1]; /* UTF-16-encoded, 0-terminated */ +} MDString; /* MINIDUMP_STRING */ + +static const size_t MDString_minsize = offsetof(MDString, buffer[0]); + + +typedef struct { + u_int32_t thread_id; + u_int32_t suspend_count; + u_int32_t priority_class; + u_int32_t priority; + u_int64_t teb; /* Thread environment block */ + MDMemoryDescriptor stack; + MDLocationDescriptor thread_context; /* MDRawContext[CPU] */ +} MDRawThread; /* MINIDUMP_THREAD */ + + +typedef struct { + u_int32_t number_of_threads; + MDRawThread threads[1]; +} MDRawThreadList; /* MINIDUMP_THREAD_LIST */ + +static const size_t MDRawThreadList_minsize = offsetof(MDRawThreadList, + threads[0]); + + +typedef struct { + u_int64_t base_of_image; + u_int32_t size_of_image; + u_int32_t checksum; /* 0 if unknown */ + u_int32_t time_date_stamp; /* time_t */ + MDRVA module_name_rva; /* MDString, pathname or filename */ + MDVSFixedFileInfo version_info; + + /* The next field stores a CodeView record and is populated when a module's + * debug information resides in a PDB file. It identifies the PDB file. */ + MDLocationDescriptor cv_record; + + /* The next field is populated when a module's debug information resides + * in a DBG file. It identifies the DBG file. This field is effectively + * obsolete with modules built by recent toolchains. */ + MDLocationDescriptor misc_record; + + /* Alignment problem: reserved0 and reserved1 are defined by the platform + * SDK as 64-bit quantities. However, that results in a structure whose + * alignment is unpredictable on different CPUs and ABIs. If the ABI + * specifies full alignment of 64-bit quantities in structures (as ppc + * does), there will be padding between miscRecord and reserved0. If + * 64-bit quantities can be aligned on 32-bit boundaries (as on x86), + * this padding will not exist. (Note that the structure up to this point + * contains 1 64-bit member followed by 21 32-bit members.) + * As a workaround, reserved0 and reserved1 are instead defined here as + * four 32-bit quantities. This should be harmless, as there are + * currently no known uses for these fields. */ + u_int32_t reserved0[2]; + u_int32_t reserved1[2]; +} MDRawModule; /* MINIDUMP_MODULE */ + +/* The inclusion of a 64-bit type in MINIDUMP_MODULE forces the struct to + * be tail-padded out to a multiple of 64 bits under some ABIs (such as PPC). + * This doesn't occur on systems that don't tail-pad in this manner. Define + * this macro to be the usable size of the MDRawModule struct, and use it in + * place of sizeof(MDRawModule). */ +#define MD_MODULE_SIZE 108 + + +/* (MDRawModule).cv_record can reference MDCVInfoPDB20 or MDCVInfoPDB70. + * Ref.: http://www.debuginfo.com/articles/debuginfomatch.html + * MDCVInfoPDB70 is the expected structure type with recent toolchains. */ + +typedef struct { + u_int32_t signature; + u_int32_t offset; /* Offset to debug data (expect 0 in minidump) */ +} MDCVHeader; + +typedef struct { + MDCVHeader cv_header; + u_int32_t signature; /* time_t debug information created */ + u_int32_t age; /* revision of PDB file */ + u_int8_t pdb_file_name[1]; /* Pathname or filename of PDB file */ +} MDCVInfoPDB20; + +static const size_t MDCVInfoPDB20_minsize = offsetof(MDCVInfoPDB20, + pdb_file_name[0]); + +#define MD_CVINFOPDB20_SIGNATURE 0x3031424e /* cvHeader.signature = '01BN' */ + +typedef struct { + u_int32_t cv_signature; + MDGUID signature; /* GUID, identifies PDB file */ + u_int32_t age; /* Identifies incremental changes to PDB file */ + u_int8_t pdb_file_name[1]; /* Pathname or filename of PDB file, + * 0-terminated 8-bit character data (UTF-8?) */ +} MDCVInfoPDB70; + +static const size_t MDCVInfoPDB70_minsize = offsetof(MDCVInfoPDB70, + pdb_file_name[0]); + +#define MD_CVINFOPDB70_SIGNATURE 0x53445352 /* cvSignature = 'SDSR' */ + +typedef struct { + u_int32_t data1[2]; + u_int32_t data2; + u_int32_t data3; + u_int32_t data4; + u_int32_t data5[3]; + u_int8_t extra[2]; +} MDCVInfoELF; + +/* In addition to the two CodeView record formats above, used for linking + * to external pdb files, it is possible for debugging data to be carried + * directly in the CodeView record itself. These signature values will + * be found in the first 4 bytes of the CodeView record. Additional values + * not commonly experienced in the wild are given by "Microsoft Symbol and + * Type Information", http://www.x86.org/ftp/manuals/tools/sym.pdf, section + * 7.2. An in-depth description of the CodeView 4.1 format is given by + * "Undocumented Windows 2000 Secrets", Windows 2000 Debugging Support/ + * Microsoft Symbol File Internals/CodeView Subsections, + * http://www.rawol.com/features/undocumented/sbs-w2k-1-windows-2000-debugging-support.pdf + */ +#define MD_CVINFOCV41_SIGNATURE 0x3930424e /* '90BN', CodeView 4.10. */ +#define MD_CVINFOCV50_SIGNATURE 0x3131424e /* '11BN', CodeView 5.0, + * MS C7-format (/Z7). */ + +#define MD_CVINFOUNKNOWN_SIGNATURE 0xffffffff /* An unlikely value. */ + +/* (MDRawModule).miscRecord can reference MDImageDebugMisc. The Windows + * structure is actually defined in WinNT.h. This structure is effectively + * obsolete with modules built by recent toolchains. */ + +typedef struct { + u_int32_t data_type; /* IMAGE_DEBUG_TYPE_*, not defined here because + * this debug record type is mostly obsolete. */ + u_int32_t length; /* Length of entire MDImageDebugMisc structure */ + u_int8_t unicode; /* True if data is multibyte */ + u_int8_t reserved[3]; + u_int8_t data[1]; +} MDImageDebugMisc; /* IMAGE_DEBUG_MISC */ + +static const size_t MDImageDebugMisc_minsize = offsetof(MDImageDebugMisc, + data[0]); + + +typedef struct { + u_int32_t number_of_modules; + MDRawModule modules[1]; +} MDRawModuleList; /* MINIDUMP_MODULE_LIST */ + +static const size_t MDRawModuleList_minsize = offsetof(MDRawModuleList, + modules[0]); + + +typedef struct { + u_int32_t number_of_memory_ranges; + MDMemoryDescriptor memory_ranges[1]; +} MDRawMemoryList; /* MINIDUMP_MEMORY_LIST */ + +static const size_t MDRawMemoryList_minsize = offsetof(MDRawMemoryList, + memory_ranges[0]); + + +#define MD_EXCEPTION_MAXIMUM_PARAMETERS 15 + +typedef struct { + u_int32_t exception_code; /* Windows: MDExceptionCodeWin, + * Mac OS X: MDExceptionMac, + * Linux: MDExceptionCodeLinux. */ + u_int32_t exception_flags; /* Windows: 1 if noncontinuable, + Mac OS X: MDExceptionCodeMac. */ + u_int64_t exception_record; /* Address (in the minidump-producing host's + * memory) of another MDException, for + * nested exceptions. */ + u_int64_t exception_address; /* The address that caused the exception. + * Mac OS X: exception subcode (which is + * typically the address). */ + u_int32_t number_parameters; /* Number of valid elements in + * exception_information. */ + u_int32_t __align; + u_int64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS]; +} MDException; /* MINIDUMP_EXCEPTION */ + +#include "minidump_exception_win32.h" +#include "minidump_exception_mac.h" +#include "minidump_exception_linux.h" +#include "minidump_exception_solaris.h" + +typedef struct { + u_int32_t thread_id; /* Thread in which the exception + * occurred. Corresponds to + * (MDRawThread).thread_id. */ + u_int32_t __align; + MDException exception_record; + MDLocationDescriptor thread_context; /* MDRawContext[CPU] */ +} MDRawExceptionStream; /* MINIDUMP_EXCEPTION_STREAM */ + + +typedef union { + struct { + u_int32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */ + u_int32_t version_information; /* cpuid 1: eax */ + u_int32_t feature_information; /* cpuid 1: edx */ + u_int32_t amd_extended_cpu_features; /* cpuid 0x80000001, ebx */ + } x86_cpu_info; + struct { + u_int64_t processor_features[2]; + } other_cpu_info; +} MDCPUInformation; /* CPU_INFORMATION */ + + +typedef struct { + /* The next 3 fields and numberOfProcessors are from the SYSTEM_INFO + * structure as returned by GetSystemInfo */ + u_int16_t processor_architecture; + u_int16_t processor_level; /* x86: 5 = 586, 6 = 686, ... */ + u_int16_t processor_revision; /* x86: 0xMMSS, where MM=model, + * SS=stepping */ + + u_int8_t number_of_processors; + u_int8_t product_type; /* Windows: VER_NT_* from WinNT.h */ + + /* The next 5 fields are from the OSVERSIONINFO structure as returned + * by GetVersionEx */ + u_int32_t major_version; + u_int32_t minor_version; + u_int32_t build_number; + u_int32_t platform_id; + MDRVA csd_version_rva; /* MDString further identifying the + * host OS. + * Windows: name of the installed OS + * service pack. + * Mac OS X: the Apple OS build number + * (sw_vers -buildVersion). + * Linux: uname -srvmo */ + + u_int16_t suite_mask; /* Windows: VER_SUITE_* from WinNT.h */ + u_int16_t reserved2; + + MDCPUInformation cpu; +} MDRawSystemInfo; /* MINIDUMP_SYSTEM_INFO */ + +/* For (MDRawSystemInfo).processor_architecture: */ +typedef enum { + MD_CPU_ARCHITECTURE_X86 = 0, /* PROCESSOR_ARCHITECTURE_INTEL */ + MD_CPU_ARCHITECTURE_MIPS = 1, /* PROCESSOR_ARCHITECTURE_MIPS */ + MD_CPU_ARCHITECTURE_ALPHA = 2, /* PROCESSOR_ARCHITECTURE_ALPHA */ + MD_CPU_ARCHITECTURE_PPC = 3, /* PROCESSOR_ARCHITECTURE_PPC */ + MD_CPU_ARCHITECTURE_SHX = 4, /* PROCESSOR_ARCHITECTURE_SHX + * (Super-H) */ + MD_CPU_ARCHITECTURE_ARM = 5, /* PROCESSOR_ARCHITECTURE_ARM */ + MD_CPU_ARCHITECTURE_IA64 = 6, /* PROCESSOR_ARCHITECTURE_IA64 */ + MD_CPU_ARCHITECTURE_ALPHA64 = 7, /* PROCESSOR_ARCHITECTURE_ALPHA64 */ + MD_CPU_ARCHITECTURE_MSIL = 8, /* PROCESSOR_ARCHITECTURE_MSIL + * (Microsoft Intermediate Language) */ + MD_CPU_ARCHITECTURE_AMD64 = 9, /* PROCESSOR_ARCHITECTURE_AMD64 */ + MD_CPU_ARCHITECTURE_X86_WIN64 = 10, + /* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */ + MD_CPU_ARCHITECTURE_SPARC = 0x8001, /* Breakpad-defined value for SPARC */ + MD_CPU_ARCHITECTURE_UNKNOWN = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */ +} MDCPUArchitecture; + +/* For (MDRawSystemInfo).platform_id: */ +typedef enum { + MD_OS_WIN32S = 0, /* VER_PLATFORM_WIN32s (Windows 3.1) */ + MD_OS_WIN32_WINDOWS = 1, /* VER_PLATFORM_WIN32_WINDOWS (Windows 95-98-Me) */ + MD_OS_WIN32_NT = 2, /* VER_PLATFORM_WIN32_NT (Windows NT, 2000+) */ + MD_OS_WIN32_CE = 3, /* VER_PLATFORM_WIN32_CE, VER_PLATFORM_WIN32_HH + * (Windows CE, Windows Mobile, "Handheld") */ + + /* The following values are Breakpad-defined. */ + MD_OS_UNIX = 0x8000, /* Generic Unix-ish */ + MD_OS_MAC_OS_X = 0x8101, /* Mac OS X/Darwin */ + MD_OS_LINUX = 0x8201, /* Linux */ + MD_OS_SOLARIS = 0x8202 /* Solaris */ +} MDOSPlatform; + + +typedef struct { + u_int32_t size_of_info; /* Length of entire MDRawMiscInfo structure. */ + u_int32_t flags1; + + /* The next field is only valid if flags1 contains + * MD_MISCINFO_FLAGS1_PROCESS_ID. */ + u_int32_t process_id; + + /* The next 3 fields are only valid if flags1 contains + * MD_MISCINFO_FLAGS1_PROCESS_TIMES. */ + u_int32_t process_create_time; /* time_t process started */ + u_int32_t process_user_time; /* seconds of user CPU time */ + u_int32_t process_kernel_time; /* seconds of kernel CPU time */ + + /* The following fields are not present in MINIDUMP_MISC_INFO but are + * in MINIDUMP_MISC_INFO_2. When this struct is populated, these values + * may not be set. Use flags1 or sizeOfInfo to determine whether these + * values are present. These are only valid when flags1 contains + * MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO. */ + u_int32_t processor_max_mhz; + u_int32_t processor_current_mhz; + u_int32_t processor_mhz_limit; + u_int32_t processor_max_idle_state; + u_int32_t processor_current_idle_state; +} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO2 */ + +#define MD_MISCINFO_SIZE 24 +#define MD_MISCINFO2_SIZE 44 + +/* For (MDRawMiscInfo).flags1. These values indicate which fields in the + * MDRawMiscInfoStructure are valid. */ +typedef enum { + MD_MISCINFO_FLAGS1_PROCESS_ID = 0x00000001, + /* MINIDUMP_MISC1_PROCESS_ID */ + MD_MISCINFO_FLAGS1_PROCESS_TIMES = 0x00000002, + /* MINIDUMP_MISC1_PROCESS_TIMES */ + MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO = 0x00000004 + /* MINIDUMP_MISC1_PROCESSOR_POWER_INFO */ +} MDMiscInfoFlags1; + + +/* + * Breakpad extension types + */ + + +typedef struct { + /* validity is a bitmask with values from MDBreakpadInfoValidity, indicating + * which of the other fields in the structure are valid. */ + u_int32_t validity; + + /* Thread ID of the handler thread. dump_thread_id should correspond to + * the thread_id of an MDRawThread in the minidump's MDRawThreadList if + * a dedicated thread in that list was used to produce the minidump. If + * the MDRawThreadList does not contain a dedicated thread used to produce + * the minidump, this field should be set to 0 and the validity field + * must not contain MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID. */ + u_int32_t dump_thread_id; + + /* Thread ID of the thread that requested the minidump be produced. As + * with dump_thread_id, requesting_thread_id should correspond to the + * thread_id of an MDRawThread in the minidump's MDRawThreadList. For + * minidumps produced as a result of an exception, requesting_thread_id + * will be the same as the MDRawExceptionStream's thread_id field. For + * minidumps produced "manually" at the program's request, + * requesting_thread_id will indicate which thread caused the dump to be + * written. If the minidump was produced at the request of something + * other than a thread in the MDRawThreadList, this field should be set + * to 0 and the validity field must not contain + * MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID. */ + u_int32_t requesting_thread_id; +} MDRawBreakpadInfo; + +/* For (MDRawBreakpadInfo).validity: */ +typedef enum { + /* When set, the dump_thread_id field is valid. */ + MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID = 1 << 0, + + /* When set, the requesting_thread_id field is valid. */ + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID = 1 << 1 +} MDBreakpadInfoValidity; + +typedef struct { + /* expression, function, and file are 0-terminated UTF-16 strings. They + * may be truncated if necessary, but should always be 0-terminated when + * written to a file. + * Fixed-length strings are used because MiniDumpWriteDump doesn't offer + * a way for user streams to point to arbitrary RVAs for strings. */ + u_int16_t expression[128]; /* Assertion that failed... */ + u_int16_t function[128]; /* ...within this function... */ + u_int16_t file[128]; /* ...in this file... */ + u_int32_t line; /* ...at this line. */ + u_int32_t type; +} MDRawAssertionInfo; + +/* For (MDRawAssertionInfo).type: */ +typedef enum { + MD_ASSERTION_INFO_TYPE_UNKNOWN = 0, + + /* Used for assertions that would be raised by the MSVC CRT but are + * directed to an invalid parameter handler instead. */ + MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER, + + /* Used for assertions that would be raised by the MSVC CRT but are + * directed to a pure virtual call handler instead. */ + MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL +} MDAssertionInfoData; + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif /* _MSC_VER */ + + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ */ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_size.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_size.h new file mode 100644 index 00000000..918544b6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/common/minidump_size.h @@ -0,0 +1,107 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +// minidump_size.h: Provides a C++ template for programmatic access to +// the sizes of various types defined in minidump_format.h. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ + +#include + +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +template +class minidump_size { + public: + static size_t size() { return sizeof(T); } +}; + +// Explicit specializations for variable-length types. The size returned +// for these should be the size for an object without its variable-length +// section. + +template<> +class minidump_size { + public: + static size_t size() { return MDString_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDRawThreadList_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDCVInfoPDB20_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDCVInfoPDB70_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDImageDebugMisc_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDRawModuleList_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDRawMemoryList_minsize; } +}; + +// Explicit specialization for MDRawModule, for which sizeof may include +// tail-padding on some architectures but not others. + +template<> +class minidump_size { + public: + static size_t size() { return MD_MODULE_SIZE; } +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/basic_source_line_resolver.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/basic_source_line_resolver.h new file mode 100644 index 00000000..38759579 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/basic_source_line_resolver.h @@ -0,0 +1,114 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// BasicSourceLineResolver implements SourceLineResolverInterface, using +// address map files produced by a compatible writer, e.g. PDBSourceLineWriter. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ + +// TODO: Platforms that have no hash_map can use map, at the likely cost of +// performance. +#ifdef __SUNPRO_CC +#define BSLR_NO_HASH_MAP +#endif // __SUNPRO_CC + +#ifdef BSLR_NO_HASH_MAP +#include +#else // BSLR_NO_HASH_MAP +#include +#endif // BSLR_NO_HASH_MAP + +#include "google_breakpad/processor/source_line_resolver_interface.h" + +namespace google_breakpad { + +using std::string; +#ifdef BSLR_NO_HASH_MAP +using std::map; +#else // BSLR_NO_HASH_MAP +using __gnu_cxx::hash_map; +#endif // BSLR_NO_HASH_MAP + +class BasicSourceLineResolver : public SourceLineResolverInterface { + public: + BasicSourceLineResolver(); + virtual ~BasicSourceLineResolver(); + + // SourceLineResolverInterface methods, see source_line_resolver_interface.h + // for more details. + + // Adds a module to this resolver, returning true on success. + // The given map_file is read into memory, and its symbols will be + // retained until the BasicSourceLineResolver is destroyed. + virtual bool LoadModule(const string &module_name, const string &map_file); + + // Exactly the same as above, except the given map_buffer is used + // for symbols. + virtual bool LoadModuleUsingMapBuffer(const string &module_name, + const string &map_buffer); + + + virtual bool HasModule(const string &module_name) const; + + virtual StackFrameInfo* FillSourceLineInfo(StackFrame *frame) const; + + private: + template class MemAddrMap; + struct Line; + struct Function; + struct PublicSymbol; + struct File; +#ifdef BSLR_NO_HASH_MAP + struct CompareString { + bool operator()(const string &s1, const string &s2) const; + }; +#else // BSLR_NO_HASH_MAP + struct HashString { + size_t operator()(const string &s) const; + }; +#endif // BSLR_NO_HASH_MAP + class Module; + + // All of the modules we've loaded +#ifdef BSLR_NO_HASH_MAP + typedef map ModuleMap; +#else // BSLR_NO_HASH_MAP + typedef hash_map ModuleMap; +#endif // BSLR_NO_HASH_MAP + ModuleMap *modules_; + + // Disallow unwanted copy ctor and assignment operator + BasicSourceLineResolver(const BasicSourceLineResolver&); + void operator=(const BasicSourceLineResolver&); +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/call_stack.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/call_stack.h new file mode 100644 index 00000000..21f595e7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/call_stack.h @@ -0,0 +1,77 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// call_stack.h: A call stack comprised of stack frames. +// +// This class manages a vector of stack frames. It is used instead of +// exposing the vector directly to allow the CallStack to own StackFrame +// pointers without having to publicly export the linked_ptr class. A +// CallStack must be composed of pointers instead of objects to allow for +// CPU-specific StackFrame subclasses. +// +// By convention, the stack frame at index 0 is the innermost callee frame, +// and the frame at the highest index in a call stack is the outermost +// caller. CallStack only allows stacks to be built by pushing frames, +// beginning with the innermost callee frame. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_CALL_STACK_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_CALL_STACK_H__ + +#include + +namespace google_breakpad { + +using std::vector; + +struct StackFrame; +template class linked_ptr; + +class CallStack { + public: + CallStack() { Clear(); } + ~CallStack(); + + // Resets the CallStack to its initial empty state + void Clear(); + + const vector* frames() const { return &frames_; } + + private: + // Stackwalker is responsible for building the frames_ vector. + friend class Stackwalker; + + // Storage for pushed frames. + vector frames_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCSSOR_CALL_STACK_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/code_module.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/code_module.h new file mode 100644 index 00000000..38ee956e --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/code_module.h @@ -0,0 +1,94 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// code_module.h: Carries information about code modules that are loaded +// into a process. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__ + +#include +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::string; + +class CodeModule { + public: + virtual ~CodeModule() {} + + // The base address of this code module as it was loaded by the process. + // (u_int64_t)-1 on error. + virtual u_int64_t base_address() const = 0; + + // The size of the code module. 0 on error. + virtual u_int64_t size() const = 0; + + // The path or file name that the code module was loaded from. Empty on + // error. + virtual string code_file() const = 0; + + // An identifying string used to discriminate between multiple versions and + // builds of the same code module. This may contain a uuid, timestamp, + // version number, or any combination of this or other information, in an + // implementation-defined format. Empty on error. + virtual string code_identifier() const = 0; + + // The filename containing debugging information associated with the code + // module. If debugging information is stored in a file separate from the + // code module itself (as is the case when .pdb or .dSYM files are used), + // this will be different from code_file. If debugging information is + // stored in the code module itself (possibly prior to stripping), this + // will be the same as code_file. Empty on error. + virtual string debug_file() const = 0; + + // An identifying string similar to code_identifier, but identifies a + // specific version and build of the associated debug file. This may be + // the same as code_identifier when the debug_file and code_file are + // identical or when the same identifier is used to identify distinct + // debug and code files. + virtual string debug_identifier() const = 0; + + // A human-readable representation of the code module's version. Empty on + // error. + virtual string version() const = 0; + + // Creates a new copy of this CodeModule object, which the caller takes + // ownership of. The new CodeModule may be of a different concrete class + // than the CodeModule being copied, but will behave identically to the + // copied CodeModule as far as the CodeModule interface is concerned. + virtual const CodeModule* Copy() const = 0; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/code_modules.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/code_modules.h new file mode 100644 index 00000000..29c55d4e --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/code_modules.h @@ -0,0 +1,98 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// code_modules.h: Contains all of the CodeModule objects that were loaded +// into a single process. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__ + +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +class CodeModule; + +class CodeModules { + public: + virtual ~CodeModules() {} + + // The number of contained CodeModule objects. + virtual unsigned int module_count() const = 0; + + // Random access to modules. Returns the module whose code is present + // at the address indicated by |address|. If no module is present at this + // address, returns NULL. Ownership of the returned CodeModule is retained + // by the CodeModules object; pointers returned by this method are valid for + // comparison with pointers returned by the other Get methods. + virtual const CodeModule* GetModuleForAddress(u_int64_t address) const = 0; + + // Returns the module corresponding to the main executable. If there is + // no main executable, returns NULL. Ownership of the returned CodeModule + // is retained by the CodeModules object; pointers returned by this method + // are valid for comparison with pointers returned by the other Get + // methods. + virtual const CodeModule* GetMainModule() const = 0; + + // Sequential access to modules. A sequence number of 0 corresponds to the + // module residing lowest in memory. If the sequence number is out of + // range, returns NULL. Ownership of the returned CodeModule is retained + // by the CodeModules object; pointers returned by this method are valid for + // comparison with pointers returned by the other Get methods. + virtual const CodeModule* GetModuleAtSequence( + unsigned int sequence) const = 0; + + // Sequential access to modules. This is similar to GetModuleAtSequence, + // except no ordering requirement is enforced. A CodeModules implementation + // may return CodeModule objects from GetModuleAtIndex in any order it + // wishes, provided that the order remain the same throughout the life of + // the CodeModules object. Typically, GetModuleAtIndex would be used by + // a caller to enumerate all CodeModule objects quickly when the enumeration + // does not require any ordering. If the index argument is out of range, + // returns NULL. Ownership of the returned CodeModule is retained by + // the CodeModules object; pointers returned by this method are valid for + // comparison with pointers returned by the other Get methods. + virtual const CodeModule* GetModuleAtIndex(unsigned int index) const = 0; + + // Creates a new copy of this CodeModules object, which the caller takes + // ownership of. The new object will also contain copies of the existing + // object's child CodeModule objects. The new CodeModules object may be of + // a different concrete class than the object being copied, but will behave + // identically to the copied object as far as the CodeModules and CodeModule + // interfaces are concerned, except that the order that GetModuleAtIndex + // returns objects in may differ between a copy and the original CodeModules + // object. + virtual const CodeModules* Copy() const = 0; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/memory_region.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/memory_region.h new file mode 100644 index 00000000..1ac3fe8d --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/memory_region.h @@ -0,0 +1,76 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// memory_region.h: Access to memory regions. +// +// A MemoryRegion provides virtual access to a range of memory. It is an +// abstraction allowing the actual source of memory to be independent of +// methods which need to access a virtual memory space. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__ + + +#include "google_breakpad/common/breakpad_types.h" + + +namespace google_breakpad { + + +class MemoryRegion { + public: + virtual ~MemoryRegion() {} + + // The base address of this memory region. + virtual u_int64_t GetBase() = 0; + + // The size of this memory region. + virtual u_int32_t GetSize() = 0; + + // Access to data of various sizes within the memory region. address + // is a pointer to read, and it must lie within the memory region as + // defined by its base address and size. The location pointed to by + // value is set to the value at address. Byte-swapping is performed + // if necessary so that the value is appropriate for the running + // program. Returns true on success. Fails and returns false if address + // is out of the region's bounds (after considering the width of value), + // or for other types of errors. + virtual bool GetMemoryAtAddress(u_int64_t address, u_int8_t* value) = 0; + virtual bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value) = 0; + virtual bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value) = 0; + virtual bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value) = 0; +}; + + +} // namespace google_breakpad + + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/minidump.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/minidump.h new file mode 100644 index 00000000..5c5dccc9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/minidump.h @@ -0,0 +1,904 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump.h: A minidump reader. +// +// The basic structure of this module tracks the structure of the minidump +// file itself. At the top level, a minidump file is represented by a +// Minidump object. Like most other classes in this module, Minidump +// provides a Read method that initializes the object with information from +// the file. Most of the classes in this file are wrappers around the +// "raw" structures found in the minidump file itself, and defined in +// minidump_format.h. For example, each thread is represented by a +// MinidumpThread object, whose parameters are specified in an MDRawThread +// structure. A properly byte-swapped MDRawThread can be obtained from a +// MinidumpThread easily by calling its thread() method. +// +// Most of the module lazily reads only the portion of the minidump file +// necessary to fulfill the user's request. Calling Minidump::Read +// only reads the minidump's directory. The thread list is not read until +// it is needed, and even once it's read, the memory regions for each +// thread's stack aren't read until they're needed. This strategy avoids +// unnecessary file input, and allocating memory for data in which the user +// has no interest. Note that although memory allocations for a typical +// minidump file are not particularly large, it is possible for legitimate +// minidumps to be sizable. A full-memory minidump, for example, contains +// a snapshot of the entire mapped memory space. Even a normal minidump, +// with stack memory only, can be large if, for example, the dump was +// generated in response to a crash that occurred due to an infinite- +// recursion bug that caused the stack's limits to be exceeded. Finally, +// some users of this library will unfortunately find themselves in the +// position of having to process potentially-hostile minidumps that might +// attempt to cause problems by forcing the minidump processor to over- +// allocate memory. +// +// Memory management in this module is based on a strict +// you-don't-own-anything policy. The only object owned by the user is +// the top-level Minidump object, the creation and destruction of which +// must be the user's own responsibility. All other objects obtained +// through interaction with this module are ultimately owned by the +// Minidump object, and will be freed upon the Minidump object's destruction. +// Because memory regions can potentially involve large allocations, a +// FreeMemory method is provided by MinidumpMemoryRegion, allowing the user +// to release data when it is no longer needed. Use of this method is +// optional but recommended. If freed data is later required, it will +// be read back in from the minidump file again. +// +// There is one exception to this memory management policy: +// Minidump::ReadString will return a string object to the user, and the user +// is responsible for its deletion. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__ + +#include + +#include +#include +#include + +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/memory_region.h" + + +namespace google_breakpad { + + +using std::map; +using std::string; +using std::vector; + + +class Minidump; +template class RangeMap; + + +// MinidumpObject is the base of all Minidump* objects except for Minidump +// itself. +class MinidumpObject { + public: + virtual ~MinidumpObject() {} + + bool valid() const { return valid_; } + + protected: + explicit MinidumpObject(Minidump* minidump); + + // Refers to the Minidump object that is the ultimate parent of this + // Some MinidumpObjects are owned by other MinidumpObjects, but at the + // root of the ownership tree is always a Minidump. The Minidump object + // is kept here for access to its seeking and reading facilities, and + // for access to data about the minidump file itself, such as whether + // it should be byte-swapped. + Minidump* minidump_; + + // MinidumpObjects are not valid when created. When a subclass populates + // its own fields, it can set valid_ to true. Accessors and mutators may + // wish to consider or alter the valid_ state as they interact with + // objects. + bool valid_; +}; + + +// This class exists primarily to provide a virtual destructor in a base +// class common to all objects that might be stored in +// Minidump::mStreamObjects. Some object types (MinidumpContext) will +// never be stored in Minidump::mStreamObjects, but are represented as +// streams and adhere to the same interface, and may be derived from +// this class. +class MinidumpStream : public MinidumpObject { + public: + virtual ~MinidumpStream() {} + + protected: + explicit MinidumpStream(Minidump* minidump); + + private: + // Populate (and validate) the MinidumpStream. minidump_ is expected + // to be positioned at the beginning of the stream, so that the next + // read from the minidump will be at the beginning of the stream. + // expected_size should be set to the stream's length as contained in + // the MDRawDirectory record or other identifying record. A class + // that implements MinidumpStream can compare expected_size to a + // known size as an integrity check. + virtual bool Read(u_int32_t expected_size) = 0; +}; + + +// MinidumpContext carries a CPU-specific MDRawContext structure, which +// contains CPU context such as register states. Each thread has its +// own context, and the exception record, if present, also has its own +// context. Note that if the exception record is present, the context it +// refers to is probably what the user wants to use for the exception +// thread, instead of that thread's own context. The exception thread's +// context (as opposed to the exception record's context) will contain +// context for the exception handler (which performs minidump generation), +// and not the context that caused the exception (which is probably what the +// user wants). +class MinidumpContext : public MinidumpStream { + public: + virtual ~MinidumpContext(); + + // Returns an MD_CONTEXT_* value such as MD_CONTEXT_X86 or MD_CONTEXT_PPC + // identifying the CPU type that the context was collected from. The + // returned value will identify the CPU only, and will have any other + // MD_CONTEXT_* bits masked out. Returns 0 on failure. + u_int32_t GetContextCPU() const; + + // Returns raw CPU-specific context data for the named CPU type. If the + // context data does not match the CPU type or does not exist, returns + // NULL. + const MDRawContextX86* GetContextX86() const; + const MDRawContextPPC* GetContextPPC() const; + const MDRawContextAMD64* GetContextAMD64() const; + const MDRawContextSPARC* GetContextSPARC() const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class MinidumpThread; + friend class MinidumpException; + + explicit MinidumpContext(Minidump* minidump); + + bool Read(u_int32_t expected_size); + + // Free the CPU-specific context structure. + void FreeContext(); + + // If the minidump contains a SYSTEM_INFO_STREAM, makes sure that the + // system info stream gives an appropriate CPU type matching the context + // CPU type in context_cpu_type. Returns false if the CPU type does not + // match. Returns true if the CPU type matches or if the minidump does + // not contain a system info stream. + bool CheckAgainstSystemInfo(u_int32_t context_cpu_type); + + // Store this separately because of the weirdo AMD64 context + u_int32_t context_flags_; + + // The CPU-specific context structure. + union { + MDRawContextBase* base; + MDRawContextX86* x86; + MDRawContextPPC* ppc; + MDRawContextAMD64* amd64; + // on Solaris SPARC, sparc is defined as a numeric constant, + // so variables can NOT be named as sparc + MDRawContextSPARC* ctx_sparc; + } context_; +}; + + +// MinidumpMemoryRegion does not wrap any MDRaw structure, and only contains +// a reference to an MDMemoryDescriptor. This object is intended to wrap +// portions of a minidump file that contain memory dumps. In normal +// minidumps, each MinidumpThread owns a MinidumpMemoryRegion corresponding +// to the thread's stack memory. MinidumpMemoryList also gives access to +// memory regions in its list as MinidumpMemoryRegions. This class +// adheres to MemoryRegion so that it may be used as a data provider to +// the Stackwalker family of classes. +class MinidumpMemoryRegion : public MinidumpObject, + public MemoryRegion { + public: + virtual ~MinidumpMemoryRegion(); + + static void set_max_bytes(u_int32_t max_bytes) { max_bytes_ = max_bytes; } + static u_int32_t max_bytes() { return max_bytes_; } + + // Returns a pointer to the base of the memory region. Returns the + // cached value if available, otherwise, reads the minidump file and + // caches the memory region. + const u_int8_t* GetMemory(); + + // The address of the base of the memory region. + u_int64_t GetBase(); + + // The size, in bytes, of the memory region. + u_int32_t GetSize(); + + // Frees the cached memory region, if cached. + void FreeMemory(); + + // Obtains the value of memory at the pointer specified by address. + bool GetMemoryAtAddress(u_int64_t address, u_int8_t* value); + bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value); + bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value); + bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class MinidumpThread; + friend class MinidumpMemoryList; + + explicit MinidumpMemoryRegion(Minidump* minidump); + + // Identify the base address and size of the memory region, and the + // location it may be found in the minidump file. + void SetDescriptor(MDMemoryDescriptor* descriptor); + + // Implementation for GetMemoryAtAddress + template bool GetMemoryAtAddressInternal(u_int64_t address, + T* value); + + // The largest memory region that will be read from a minidump. The + // default is 1MB. + static u_int32_t max_bytes_; + + // Base address and size of the memory region, and its position in the + // minidump file. + MDMemoryDescriptor* descriptor_; + + // Cached memory. + vector* memory_; +}; + + +// MinidumpThread contains information about a thread of execution, +// including a snapshot of the thread's stack and CPU context. For +// the thread that caused an exception, the context carried by +// MinidumpException is probably desired instead of the CPU context +// provided here. +class MinidumpThread : public MinidumpObject { + public: + virtual ~MinidumpThread(); + + const MDRawThread* thread() const { return valid_ ? &thread_ : NULL; } + MinidumpMemoryRegion* GetMemory(); + MinidumpContext* GetContext(); + + // The thread ID is used to determine if a thread is the exception thread, + // so a special getter is provided to retrieve this data from the + // MDRawThread structure. Returns false if the thread ID cannot be + // determined. + bool GetThreadID(u_int32_t *thread_id) const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + // These objects are managed by MinidumpThreadList. + friend class MinidumpThreadList; + + explicit MinidumpThread(Minidump* minidump); + + // This works like MinidumpStream::Read, but is driven by + // MinidumpThreadList. No size checking is done, because + // MinidumpThreadList handles that directly. + bool Read(); + + MDRawThread thread_; + MinidumpMemoryRegion* memory_; + MinidumpContext* context_; +}; + + +// MinidumpThreadList contains all of the threads (as MinidumpThreads) in +// a process. +class MinidumpThreadList : public MinidumpStream { + public: + virtual ~MinidumpThreadList(); + + static void set_max_threads(u_int32_t max_threads) { + max_threads_ = max_threads; + } + static u_int32_t max_threads() { return max_threads_; } + + unsigned int thread_count() const { return valid_ ? thread_count_ : 0; } + + // Sequential access to threads. + MinidumpThread* GetThreadAtIndex(unsigned int index) const; + + // Random access to threads. + MinidumpThread* GetThreadByID(u_int32_t thread_id); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + typedef map IDToThreadMap; + typedef vector MinidumpThreads; + + static const u_int32_t kStreamType = MD_THREAD_LIST_STREAM; + + explicit MinidumpThreadList(Minidump* aMinidump); + + bool Read(u_int32_t aExpectedSize); + + // The largest number of threads that will be read from a minidump. The + // default is 256. + static u_int32_t max_threads_; + + // Access to threads using the thread ID as the key. + IDToThreadMap id_to_thread_map_; + + // The list of threads. + MinidumpThreads* threads_; + u_int32_t thread_count_; +}; + + +// MinidumpModule wraps MDRawModule, which contains information about loaded +// code modules. Access is provided to various data referenced indirectly +// by MDRawModule, such as the module's name and a specification for where +// to locate debugging information for the module. +class MinidumpModule : public MinidumpObject, + public CodeModule { + public: + virtual ~MinidumpModule(); + + static void set_max_cv_bytes(u_int32_t max_cv_bytes) { + max_cv_bytes_ = max_cv_bytes; + } + static u_int32_t max_cv_bytes() { return max_cv_bytes_; } + + static void set_max_misc_bytes(u_int32_t max_misc_bytes) { + max_misc_bytes_ = max_misc_bytes; + } + static u_int32_t max_misc_bytes() { return max_misc_bytes_; } + + const MDRawModule* module() const { return valid_ ? &module_ : NULL; } + + // CodeModule implementation + virtual u_int64_t base_address() const { + return valid_ ? module_.base_of_image : static_cast(-1); + } + virtual u_int64_t size() const { return valid_ ? module_.size_of_image : 0; } + virtual string code_file() const; + virtual string code_identifier() const; + virtual string debug_file() const; + virtual string debug_identifier() const; + virtual string version() const; + virtual const CodeModule* Copy() const; + + // The CodeView record, which contains information to locate the module's + // debugging information (pdb). This is returned as u_int8_t* because + // the data can be of types MDCVInfoPDB20* or MDCVInfoPDB70*, or it may be + // of a type unknown to Breakpad, in which case the raw data will still be + // returned but no byte-swapping will have been performed. Check the + // record's signature in the first four bytes to differentiate between + // the various types. Current toolchains generate modules which carry + // MDCVInfoPDB70 by default. Returns a pointer to the CodeView record on + // success, and NULL on failure. On success, the optional |size| argument + // is set to the size of the CodeView record. + const u_int8_t* GetCVRecord(u_int32_t* size); + + // The miscellaneous debug record, which is obsolete. Current toolchains + // do not generate this type of debugging information (dbg), and this + // field is not expected to be present. Returns a pointer to the debugging + // record on success, and NULL on failure. On success, the optional |size| + // argument is set to the size of the debugging record. + const MDImageDebugMisc* GetMiscRecord(u_int32_t* size); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + // These objects are managed by MinidumpModuleList. + friend class MinidumpModuleList; + + explicit MinidumpModule(Minidump* minidump); + + // This works like MinidumpStream::Read, but is driven by + // MinidumpModuleList. No size checking is done, because + // MinidumpModuleList handles that directly. + bool Read(); + + // Reads indirectly-referenced data, including the module name, CodeView + // record, and miscellaneous debugging record. This is necessary to allow + // MinidumpModuleList to fully construct MinidumpModule objects without + // requiring seeks to read a contiguous set of MinidumpModule objects. + // All auxiliary data should be available when Read is called, in order to + // allow the CodeModule getters to be const methods. + bool ReadAuxiliaryData(); + + // The largest number of bytes that will be read from a minidump for a + // CodeView record or miscellaneous debugging record, respectively. The + // default for each is 1024. + static u_int32_t max_cv_bytes_; + static u_int32_t max_misc_bytes_; + + // True after a successful Read. This is different from valid_, which is + // not set true until ReadAuxiliaryData also completes successfully. + // module_valid_ is only used by ReadAuxiliaryData and the functions it + // calls to determine whether the object is ready for auxiliary data to + // be read. + bool module_valid_; + + // True if debug info was read from the module. Certain modules + // may contain debug records in formats we don't support, + // so we can just set this to false to ignore them. + bool has_debug_info_; + + MDRawModule module_; + + // Cached module name. + const string* name_; + + // Cached CodeView record - this is MDCVInfoPDB20 or (likely) + // MDCVInfoPDB70, or possibly something else entirely. Stored as a u_int8_t + // because the structure contains a variable-sized string and its exact + // size cannot be known until it is processed. + vector* cv_record_; + + // If cv_record_ is present, cv_record_signature_ contains a copy of the + // CodeView record's first four bytes, for ease of determinining the + // type of structure that cv_record_ contains. + u_int32_t cv_record_signature_; + + // Cached MDImageDebugMisc (usually not present), stored as u_int8_t + // because the structure contains a variable-sized string and its exact + // size cannot be known until it is processed. + vector* misc_record_; +}; + + +// MinidumpModuleList contains all of the loaded code modules for a process +// in the form of MinidumpModules. It maintains a map of these modules +// so that it may easily provide a code module corresponding to a specific +// address. +class MinidumpModuleList : public MinidumpStream, + public CodeModules { + public: + virtual ~MinidumpModuleList(); + + static void set_max_modules(u_int32_t max_modules) { + max_modules_ = max_modules; + } + static u_int32_t max_modules() { return max_modules_; } + + // CodeModules implementation. + virtual unsigned int module_count() const { + return valid_ ? module_count_ : 0; + } + virtual const MinidumpModule* GetModuleForAddress(u_int64_t address) const; + virtual const MinidumpModule* GetMainModule() const; + virtual const MinidumpModule* GetModuleAtSequence( + unsigned int sequence) const; + virtual const MinidumpModule* GetModuleAtIndex(unsigned int index) const; + virtual const CodeModules* Copy() const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + typedef vector MinidumpModules; + + static const u_int32_t kStreamType = MD_MODULE_LIST_STREAM; + + explicit MinidumpModuleList(Minidump* minidump); + + bool Read(u_int32_t expected_size); + + // The largest number of modules that will be read from a minidump. The + // default is 1024. + static u_int32_t max_modules_; + + // Access to modules using addresses as the key. + RangeMap *range_map_; + + MinidumpModules *modules_; + u_int32_t module_count_; +}; + + +// MinidumpMemoryList corresponds to a minidump's MEMORY_LIST_STREAM stream, +// which references the snapshots of all of the memory regions contained +// within the minidump. For a normal minidump, this includes stack memory +// (also referenced by each MinidumpThread, in fact, the MDMemoryDescriptors +// here and in MDRawThread both point to exactly the same data in a +// minidump file, conserving space), as well as a 256-byte snapshot of memory +// surrounding the instruction pointer in the case of an exception. Other +// types of minidumps may contain significantly more memory regions. Full- +// memory minidumps contain all of a process' mapped memory. +class MinidumpMemoryList : public MinidumpStream { + public: + virtual ~MinidumpMemoryList(); + + static void set_max_regions(u_int32_t max_regions) { + max_regions_ = max_regions; + } + static u_int32_t max_regions() { return max_regions_; } + + unsigned int region_count() const { return valid_ ? region_count_ : 0; } + + // Sequential access to memory regions. + MinidumpMemoryRegion* GetMemoryRegionAtIndex(unsigned int index); + + // Random access to memory regions. Returns the region encompassing + // the address identified by address. + MinidumpMemoryRegion* GetMemoryRegionForAddress(u_int64_t address); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + typedef vector MemoryDescriptors; + typedef vector MemoryRegions; + + static const u_int32_t kStreamType = MD_MEMORY_LIST_STREAM; + + explicit MinidumpMemoryList(Minidump* minidump); + + bool Read(u_int32_t expected_size); + + // The largest number of memory regions that will be read from a minidump. + // The default is 256. + static u_int32_t max_regions_; + + // Access to memory regions using addresses as the key. + RangeMap *range_map_; + + // The list of descriptors. This is maintained separately from the list + // of regions, because MemoryRegion doesn't own its MemoryDescriptor, it + // maintains a pointer to it. descriptors_ provides the storage for this + // purpose. + MemoryDescriptors *descriptors_; + + // The list of regions. + MemoryRegions *regions_; + u_int32_t region_count_; +}; + + +// MinidumpException wraps MDRawExceptionStream, which contains information +// about the exception that caused the minidump to be generated, if the +// minidump was generated in an exception handler called as a result of +// an exception. It also provides access to a MinidumpContext object, +// which contains the CPU context for the exception thread at the time +// the exception occurred. +class MinidumpException : public MinidumpStream { + public: + virtual ~MinidumpException(); + + const MDRawExceptionStream* exception() const { + return valid_ ? &exception_ : NULL; + } + + // The thread ID is used to determine if a thread is the exception thread, + // so a special getter is provided to retrieve this data from the + // MDRawExceptionStream structure. Returns false if the thread ID cannot + // be determined. + bool GetThreadID(u_int32_t *thread_id) const; + + MinidumpContext* GetContext(); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const u_int32_t kStreamType = MD_EXCEPTION_STREAM; + + explicit MinidumpException(Minidump* minidump); + + bool Read(u_int32_t expected_size); + + MDRawExceptionStream exception_; + MinidumpContext* context_; +}; + + +// MinidumpSystemInfo wraps MDRawSystemInfo and provides information about +// the system on which the minidump was generated. See also MinidumpMiscInfo. +class MinidumpSystemInfo : public MinidumpStream { + public: + virtual ~MinidumpSystemInfo(); + + const MDRawSystemInfo* system_info() const { + return valid_ ? &system_info_ : NULL; + } + + // GetOS and GetCPU return textual representations of the operating system + // and CPU that produced the minidump. Unlike most other Minidump* methods, + // they return string objects, not weak pointers. Defined values for + // GetOS() are "mac", "windows", and "linux". Defined values for GetCPU + // are "x86" and "ppc". These methods return an empty string when their + // values are unknown. + string GetOS(); + string GetCPU(); + + // I don't know what CSD stands for, but this field is documented as + // returning a textual representation of the OS service pack. On other + // platforms, this provides additional information about an OS version + // level beyond major.minor.micro. Returns NULL if unknown. + const string* GetCSDVersion(); + + // If a CPU vendor string can be determined, returns a pointer to it, + // otherwise, returns NULL. CPU vendor strings can be determined from + // x86 CPUs with CPUID 0. + const string* GetCPUVendor(); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const u_int32_t kStreamType = MD_SYSTEM_INFO_STREAM; + + explicit MinidumpSystemInfo(Minidump* minidump); + + bool Read(u_int32_t expected_size); + + MDRawSystemInfo system_info_; + + // Textual representation of the OS service pack, for minidumps produced + // by MiniDumpWriteDump on Windows. + const string* csd_version_; + + // A string identifying the CPU vendor, if known. + const string* cpu_vendor_; +}; + + +// MinidumpMiscInfo wraps MDRawMiscInfo and provides information about +// the process that generated the minidump, and optionally additional system +// information. See also MinidumpSystemInfo. +class MinidumpMiscInfo : public MinidumpStream { + public: + const MDRawMiscInfo* misc_info() const { + return valid_ ? &misc_info_ : NULL; + } + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const u_int32_t kStreamType = MD_MISC_INFO_STREAM; + + explicit MinidumpMiscInfo(Minidump* minidump_); + + bool Read(u_int32_t expected_size_); + + MDRawMiscInfo misc_info_; +}; + + +// MinidumpBreakpadInfo wraps MDRawBreakpadInfo, which is an optional stream in +// a minidump that provides additional information about the process state +// at the time the minidump was generated. +class MinidumpBreakpadInfo : public MinidumpStream { + public: + const MDRawBreakpadInfo* breakpad_info() const { + return valid_ ? &breakpad_info_ : NULL; + } + + // These thread IDs are used to determine if threads deserve special + // treatment, so special getters are provided to retrieve this data from + // the MDRawBreakpadInfo structure. The getters return false if the thread + // IDs cannot be determined. + bool GetDumpThreadID(u_int32_t *thread_id) const; + bool GetRequestingThreadID(u_int32_t *thread_id) const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const u_int32_t kStreamType = MD_BREAKPAD_INFO_STREAM; + + explicit MinidumpBreakpadInfo(Minidump* minidump_); + + bool Read(u_int32_t expected_size_); + + MDRawBreakpadInfo breakpad_info_; +}; + + +// Minidump is the user's interface to a minidump file. It wraps MDRawHeader +// and provides access to the minidump's top-level stream directory. +class Minidump { + public: + // path is the pathname of a file containing the minidump. + explicit Minidump(const string& path); + + ~Minidump(); + + static void set_max_streams(u_int32_t max_streams) { + max_streams_ = max_streams; + } + static u_int32_t max_streams() { return max_streams_; } + + static void set_max_string_length(u_int32_t max_string_length) { + max_string_length_ = max_string_length; + } + static u_int32_t max_string_length() { return max_string_length_; } + + const MDRawHeader* header() const { return valid_ ? &header_ : NULL; } + + // Reads the minidump file's header and top-level stream directory. + // The minidump is expected to be positioned at the beginning of the + // header. Read() sets up the stream list and map, and validates the + // Minidump object. + bool Read(); + + // The next set of methods are stubs that call GetStream. They exist to + // force code generation of the templatized API within the module, and + // to avoid exposing an ugly API (GetStream needs to accept a garbage + // parameter). + MinidumpThreadList* GetThreadList(); + MinidumpModuleList* GetModuleList(); + MinidumpMemoryList* GetMemoryList(); + MinidumpException* GetException(); + MinidumpSystemInfo* GetSystemInfo(); + MinidumpMiscInfo* GetMiscInfo(); + MinidumpBreakpadInfo* GetBreakpadInfo(); + + // The next set of methods are provided for users who wish to access + // data in minidump files directly, while leveraging the rest of + // this class and related classes to handle the basic minidump + // structure and known stream types. + + unsigned int GetDirectoryEntryCount() const { + return valid_ ? header_.stream_count : 0; + } + const MDRawDirectory* GetDirectoryEntryAtIndex(unsigned int index) const; + + // The next 2 methods are lower-level I/O routines. They use fd_. + + // Reads count bytes from the minidump at the current position into + // the storage area pointed to by bytes. bytes must be of sufficient + // size. After the read, the file position is advanced by count. + bool ReadBytes(void* bytes, size_t count); + + // Sets the position of the minidump file to offset. + bool SeekSet(off_t offset); + + // Returns the current position of the minidump file. + off_t Tell() { return valid_ ? lseek(fd_, 0, SEEK_CUR) : (off_t)-1; } + + // The next 2 methods are medium-level I/O routines. + + // ReadString returns a string which is owned by the caller! offset + // specifies the offset that a length-encoded string is stored at in the + // minidump file. + string* ReadString(off_t offset); + + // SeekToStreamType positions the file at the beginning of a stream + // identified by stream_type, and informs the caller of the stream's + // length by setting *stream_length. Because stream_map maps each stream + // type to only one stream in the file, this might mislead the user into + // thinking that the stream that this seeks to is the only stream with + // type stream_type. That can't happen for streams that these classes + // deal with directly, because they're only supposed to be present in the + // file singly, and that's verified when stream_map_ is built. Users who + // are looking for other stream types should be aware of this + // possibility, and consider using GetDirectoryEntryAtIndex (possibly + // with GetDirectoryEntryCount) if expecting multiple streams of the same + // type in a single minidump file. + bool SeekToStreamType(u_int32_t stream_type, u_int32_t* stream_length); + + bool swap() const { return valid_ ? swap_ : false; } + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + // MinidumpStreamInfo is used in the MinidumpStreamMap. It lets + // the Minidump object locate interesting streams quickly, and + // provides a convenient place to stash MinidumpStream objects. + struct MinidumpStreamInfo { + MinidumpStreamInfo() : stream_index(0), stream(NULL) {} + ~MinidumpStreamInfo() { delete stream; } + + // Index into the MinidumpDirectoryEntries vector + unsigned int stream_index; + + // Pointer to the stream if cached, or NULL if not yet populated + MinidumpStream* stream; + }; + + typedef vector MinidumpDirectoryEntries; + typedef map MinidumpStreamMap; + + template T* GetStream(T** stream); + + // Opens the minidump file, or if already open, seeks to the beginning. + bool Open(); + + // The largest number of top-level streams that will be read from a minidump. + // Note that streams are only read (and only consume memory) as needed, + // when directed by the caller. The default is 128. + static u_int32_t max_streams_; + + // The maximum length of a UTF-16 string that will be read from a minidump + // in 16-bit words. The default is 1024. UTF-16 strings are converted + // to UTF-8 when stored in memory, and each UTF-16 word will be represented + // by as many as 3 bytes in UTF-8. + static unsigned int max_string_length_; + + MDRawHeader header_; + + // The list of streams. + MinidumpDirectoryEntries* directory_; + + // Access to streams using the stream type as the key. + MinidumpStreamMap* stream_map_; + + // The pathname of the minidump file to process, set in the constructor. + const string path_; + + // The file descriptor for all file I/O. Used by ReadBytes and SeekSet. + // Set based on the |path_| member by Open, which is called by Read. + int fd_; + + // swap_ is true if the minidump file should be byte-swapped. If the + // minidump was produced by a CPU that is other-endian than the CPU + // processing the minidump, this will be true. If the two CPUs are + // same-endian, this will be false. + bool swap_; + + // Validity of the Minidump structure, false immediately after + // construction or after a failed Read(); true following a successful + // Read(). + bool valid_; +}; + + +} // namespace google_breakpad + + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/minidump_processor.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/minidump_processor.h new file mode 100644 index 00000000..73447f97 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/minidump_processor.h @@ -0,0 +1,94 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__ + +#include +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::string; + +class Minidump; +class ProcessState; +class SourceLineResolverInterface; +class SymbolSupplier; +class SystemInfo; + +class MinidumpProcessor { + public: + // Return type for Process() + enum ProcessResult { + PROCESS_OK, // the minidump was processed successfully + PROCESS_ERROR, // there was an error processing the minidump + PROCESS_INTERRUPTED // processing was interrupted by the SymbolSupplier + }; + + // Initializes this MinidumpProcessor. supplier should be an + // implementation of the SymbolSupplier abstract base class. + MinidumpProcessor(SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + ~MinidumpProcessor(); + + // Processes the minidump file and fills process_state with the result. + ProcessResult Process(const string &minidump_file, + ProcessState *process_state); + + // Populates the cpu_* fields of the |info| parameter with textual + // representations of the CPU type that the minidump in |dump| was + // produced on. Returns false if this information is not available in + // the minidump. + static bool GetCPUInfo(Minidump *dump, SystemInfo *info); + + // Populates the os_* fields of the |info| parameter with textual + // representations of the operating system that the minidump in |dump| + // was produced on. Returns false if this information is not available in + // the minidump. + static bool GetOSInfo(Minidump *dump, SystemInfo *info); + + // Returns a textual representation of the reason that a crash occurred, + // if the minidump in dump was produced as a result of a crash. Returns + // an empty string if this information cannot be determined. If address + // is non-NULL, it will be set to contain the address that caused the + // exception, if this information is available. This will be a code + // address when the crash was caused by problems such as illegal + // instructions or divisions by zero, or a data address when the crash + // was caused by a memory access violation. + static string GetCrashReason(Minidump *dump, u_int64_t *address); + + private: + SymbolSupplier *supplier_; + SourceLineResolverInterface *resolver_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/process_state.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/process_state.h new file mode 100644 index 00000000..afbbb193 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/process_state.h @@ -0,0 +1,115 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// process_state.h: A snapshot of a process, in a fully-digested state. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__ + +#include +#include +#include "google_breakpad/processor/system_info.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::string; +using std::vector; + +class CallStack; +class CodeModules; + +class ProcessState { + public: + ProcessState() : modules_(NULL) { Clear(); } + ~ProcessState(); + + // Resets the ProcessState to its default values + void Clear(); + + // Accessors. See the data declarations below. + u_int32_t time_date_stamp() const { return time_date_stamp_; } + bool crashed() const { return crashed_; } + string crash_reason() const { return crash_reason_; } + u_int64_t crash_address() const { return crash_address_; } + int requesting_thread() const { return requesting_thread_; } + const vector* threads() const { return &threads_; } + const SystemInfo* system_info() const { return &system_info_; } + const CodeModules* modules() const { return modules_; } + + private: + // MinidumpProcessor is responsible for building ProcessState objects. + friend class MinidumpProcessor; + + // The time-date stamp of the minidump (time_t format) + u_int32_t time_date_stamp_; + + // True if the process crashed, false if the dump was produced outside + // of an exception handler. + bool crashed_; + + // If the process crashed, the type of crash. OS- and possibly CPU- + // specific. For example, "EXCEPTION_ACCESS_VIOLATION" (Windows), + // "EXC_BAD_ACCESS / KERN_INVALID_ADDRESS" (Mac OS X), "SIGSEGV" + // (other Unix). + string crash_reason_; + + // If the process crashed, and if crash_reason implicates memory, + // the memory address that caused the crash. For data access errors, + // this will be the data address that caused the fault. For code errors, + // this will be the address of the instruction that caused the fault. + u_int64_t crash_address_; + + // The index of the thread that requested a dump be written in the + // threads vector. If a dump was produced as a result of a crash, this + // will point to the thread that crashed. If the dump was produced as + // by user code without crashing, and the dump contains extended Breakpad + // information, this will point to the thread that requested the dump. + // If the dump was not produced as a result of an exception and no + // extended Breakpad information is present, this field will be set to -1, + // indicating that the dump thread is not available. + int requesting_thread_; + + // Stacks for each thread (except possibly the exception handler + // thread) at the time of the crash. + vector threads_; + + // OS and CPU information. + SystemInfo system_info_; + + // The modules that were loaded into the process represented by the + // ProcessState. + const CodeModules *modules_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/source_line_resolver_interface.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/source_line_resolver_interface.h new file mode 100644 index 00000000..93ef85d2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/source_line_resolver_interface.h @@ -0,0 +1,82 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Abstract interface to return function/file/line info for a memory address. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ + +#include +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::string; + +struct StackFrame; +struct StackFrameInfo; + +class SourceLineResolverInterface { + public: + typedef u_int64_t MemAddr; + + virtual ~SourceLineResolverInterface() {} + + // Adds a module to this resolver, returning true on success. + // + // module_name may be an arbitrary string. Typically, it will be the + // filename of the module, optionally with version identifiers. + // + // map_file should contain line/address mappings for this module. + virtual bool LoadModule(const string &module_name, + const string &map_file) = 0; + // Same as above, but takes the contents of a pre-read map buffer + virtual bool LoadModuleUsingMapBuffer(const string &module_name, + const string &map_buffer) = 0; + + // Returns true if a module with the given name has been loaded. + virtual bool HasModule(const string &module_name) const = 0; + + // Fills in the function_base, function_name, source_file_name, + // and source_line fields of the StackFrame. The instruction and + // module_name fields must already be filled in. Additional debugging + // information, if available, is returned. If the information is not + // available, returns NULL. A NULL return value does not indicate an + // error. The caller takes ownership of any returned StackFrameInfo + // object. + virtual StackFrameInfo* FillSourceLineInfo(StackFrame *frame) const = 0; + + protected: + // SourceLineResolverInterface cannot be instantiated except by subclasses + SourceLineResolverInterface() {} +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stack_frame.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stack_frame.h new file mode 100644 index 00000000..b330f8ae --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stack_frame.h @@ -0,0 +1,84 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__ + +#include +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +class CodeModule; + +using std::string; + +struct StackFrame { + StackFrame() + : instruction(), + module(NULL), + function_name(), + function_base(), + source_file_name(), + source_line(), + source_line_base() {} + virtual ~StackFrame() {} + + // The program counter location as an absolute virtual address. For the + // innermost called frame in a stack, this will be an exact program counter + // or instruction pointer value. For all other frames, this will be within + // the instruction that caused execution to branch to a called function, + // but may not necessarily point to the exact beginning of that instruction. + u_int64_t instruction; + + // The module in which the instruction resides. + const CodeModule *module; + + // The function name, may be omitted if debug symbols are not available. + string function_name; + + // The start address of the function, may be omitted if debug symbols + // are not available. + u_int64_t function_base; + + // The source file name, may be omitted if debug symbols are not available. + string source_file_name; + + // The (1-based) source line number, may be omitted if debug symbols are + // not available. + int source_line; + + // The start address of the source line, may be omitted if debug symbols + // are not available. + u_int64_t source_line_base; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stack_frame_cpu.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stack_frame_cpu.h new file mode 100644 index 00000000..70823b9c --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stack_frame_cpu.h @@ -0,0 +1,153 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stack_frame_cpu.h: CPU-specific StackFrame extensions. +// +// These types extend the StackFrame structure to carry CPU-specific register +// state. They are defined in this header instead of stack_frame.h to +// avoid the need to include minidump_format.h when only the generic +// StackFrame type is needed. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ + +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stack_frame.h" + +namespace google_breakpad { + +struct StackFrameX86 : public StackFrame { + // ContextValidity has one entry for each relevant hardware pointer register + // (%eip and %esp) and one entry for each nonvolatile (callee-save) register. + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_EIP = 1 << 0, + CONTEXT_VALID_ESP = 1 << 1, + CONTEXT_VALID_EBP = 1 << 2, + CONTEXT_VALID_EBX = 1 << 3, + CONTEXT_VALID_ESI = 1 << 4, + CONTEXT_VALID_EDI = 1 << 5, + CONTEXT_VALID_ALL = -1 + }; + + StackFrameX86() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextX86 context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +struct StackFramePPC : public StackFrame { + // ContextValidity should eventually contain entries for the validity of + // other nonvolatile (callee-save) registers as in + // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently + // locate registers other than the ones listed here. + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_SRR0 = 1 << 0, + CONTEXT_VALID_GPR1 = 1 << 1, + CONTEXT_VALID_ALL = -1 + }; + + StackFramePPC() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextPPC context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +struct StackFrameAMD64 : public StackFrame { + // ContextValidity has one entry for each relevant hardware pointer register + // (%rip and %rsp) and one entry for each nonvolatile (callee-save) register. + //FIXME: validate this list + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_RIP = 1 << 0, + CONTEXT_VALID_RSP = 1 << 1, + CONTEXT_VALID_RBP = 1 << 2, + CONTEXT_VALID_ALL = -1 + }; + + StackFrameAMD64() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextAMD64 context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +struct StackFrameSPARC : public StackFrame { + // to be confirmed + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_PC = 1 << 0, + CONTEXT_VALID_SP = 1 << 1, + CONTEXT_VALID_FP = 1 << 2, + CONTEXT_VALID_ALL = -1 + }; + + StackFrameSPARC() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextSPARC context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stackwalker.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stackwalker.h new file mode 100644 index 00000000..c463fd80 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/stackwalker.h @@ -0,0 +1,140 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker.h: Generic stackwalker. +// +// The Stackwalker class is an abstract base class providing common generic +// methods that apply to stacks from all systems. Specific implementations +// will extend this class by providing GetContextFrame and GetCallerFrame +// methods to fill in system-specific data in a StackFrame structure. +// Stackwalker assembles these StackFrame strucutres into a CallStack. +// +// Author: Mark Mentovai + + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__ + +#include + +namespace google_breakpad { + +class CallStack; +class CodeModules; +template class linked_ptr; +class MemoryRegion; +class MinidumpContext; +class SourceLineResolverInterface; +struct StackFrame; +struct StackFrameInfo; +class SymbolSupplier; +class SystemInfo; + +using std::vector; + + +class Stackwalker { + public: + virtual ~Stackwalker() {} + + // Populates the given CallStack by calling GetContextFrame and + // GetCallerFrame. The frames are further processed to fill all available + // data. Returns true if the stackwalk completed, or false if it was + // interrupted by SymbolSupplier::GetSymbolFile(). + bool Walk(CallStack *stack); + + // Returns a new concrete subclass suitable for the CPU that a stack was + // generated on, according to the CPU type indicated by the context + // argument. If no suitable concrete subclass exists, returns NULL. + static Stackwalker* StackwalkerForCPU(const SystemInfo *system_info, + MinidumpContext *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + protected: + // system_info identifies the operating system, NULL or empty if unknown. + // memory identifies a MemoryRegion that provides the stack memory + // for the stack to walk. modules, if non-NULL, is a CodeModules + // object that is used to look up which code module each stack frame is + // associated with. supplier is an optional caller-supplied SymbolSupplier + // implementation. If supplier is NULL, source line info will not be + // resolved. resolver is an instance of SourceLineResolverInterface + // (see source_line_resolver_interface.h and basic_source_line_resolver.h). + // If resolver is NULL, source line info will not be resolved. + Stackwalker(const SystemInfo *system_info, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + // Information about the system that produced the minidump. Subclasses + // and the SymbolSupplier may find this information useful. + const SystemInfo *system_info_; + + // The stack memory to walk. Subclasses will require this region to + // get information from the stack. + MemoryRegion *memory_; + + // A list of modules, for populating each StackFrame's module information. + // This field is optional and may be NULL. + const CodeModules *modules_; + + private: + // Obtains the context frame, the innermost called procedure in a stack + // trace. Returns NULL on failure. GetContextFrame allocates a new + // StackFrame (or StackFrame subclass), ownership of which is taken by + // the caller. + virtual StackFrame* GetContextFrame() = 0; + + // Obtains a caller frame. Each call to GetCallerFrame should return the + // frame that called the last frame returned by GetContextFrame or + // GetCallerFrame. To aid this purpose, stack contains the CallStack + // made of frames that have already been walked. GetCallerFrame should + // return NULL on failure or when there are no more caller frames (when + // the end of the stack has been reached). GetCallerFrame allocates a new + // StackFrame (or StackFrame subclass), ownership of which is taken by + // the caller. + virtual StackFrame* GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info) = 0; + + // The optional SymbolSupplier for resolving source line info. + SymbolSupplier *supplier_; + + // The SourceLineResolver implementation + SourceLineResolverInterface *resolver_; +}; + + +} // namespace google_breakpad + + +#endif // GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/symbol_supplier.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/symbol_supplier.h new file mode 100644 index 00000000..7b9d00e4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/symbol_supplier.h @@ -0,0 +1,82 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// The caller may implement the SymbolSupplier abstract base class +// to provide symbols for a given module. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__ + +#include + +namespace google_breakpad { + +using std::string; +class CodeModule; +class SystemInfo; + +class SymbolSupplier { + public: + // Result type for GetSymbolFile + enum SymbolResult { + // no symbols were found, but continue processing + NOT_FOUND, + + // symbols were found, and the path has been placed in symbol_file + FOUND, + + // stops processing the minidump immediately + INTERRUPT + }; + + virtual ~SymbolSupplier() {} + + // Retrieves the symbol file for the given CodeModule, placing the + // path in symbol_file if successful. system_info contains strings + // identifying the operating system and CPU; SymbolSupplier may use + // to help locate the symbol file. system_info may be NULL or its + // fields may be empty if these values are unknown. symbol_file + // must be a pointer to a valid string + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file) = 0; + // Same as above, except also places symbol data into symbol_data. + // If symbol_data is NULL, the data is not returned. + // TODO(nealsid) Once we have symbol data caching behavior implemented + // investigate making all symbol suppliers implement all methods, + // and make this pure virtual + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data) = 0; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/system_info.h b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/system_info.h new file mode 100644 index 00000000..fdbdbfd6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/google_breakpad/processor/system_info.h @@ -0,0 +1,97 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// system_info.h: Information about the system that was running a program +// when a crash report was produced. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__ + +#include + +namespace google_breakpad { + +using std::string; + +struct SystemInfo { + public: + SystemInfo() : os(), os_short(), os_version(), cpu(), cpu_info(), + cpu_count(0) {} + + // Resets the SystemInfo object to its default values. + void Clear() { + os.clear(); + os_short.clear(); + os_version.clear(); + cpu.clear(); + cpu_info.clear(); + cpu_count = 0; + } + + // A string identifying the operating system, such as "Windows NT", + // "Mac OS X", or "Linux". If the information is present in the dump but + // its value is unknown, this field will contain a numeric value. If + // the information is not present in the dump, this field will be empty. + string os; + + // A short form of the os string, using lowercase letters and no spaces, + // suitable for use in a filesystem. Possible values are "windows", + // "mac", and "linux". Empty if the information is not present in the dump + // or if the OS given by the dump is unknown. The values stored in this + // field should match those used by MinidumpSystemInfo::GetOS. + string os_short; + + // A string identifying the version of the operating system, such as + // "5.1.2600 Service Pack 2" or "10.4.8 8L2127". If the dump does not + // contain this information, this field will be empty. + string os_version; + + // A string identifying the basic CPU family, such as "x86" or "ppc". + // If this information is present in the dump but its value is unknown, + // this field will contain a numeric value. If the information is not + // present in the dump, this field will be empty. The values stored in + // this field should match those used by MinidumpSystemInfo::GetCPU. + string cpu; + + // A string further identifying the specific CPU, such as + // "GenuineIntel level 6 model 13 stepping 8". If the information is not + // present in the dump, or additional identifying information is not + // defined for the CPU family, this field will be empty. + string cpu_info; + + // The number of processors in the system. Will be greater than one for + // multi-core systems. + int cpu_count; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/address_map-inl.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/address_map-inl.h new file mode 100644 index 00000000..d88b4fcc --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/address_map-inl.h @@ -0,0 +1,92 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// address_map-inl.h: Address map implementation. +// +// See address_map.h for documentation. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_ADDRESS_MAP_INL_H__ +#define PROCESSOR_ADDRESS_MAP_INL_H__ + +#include + +#include "processor/address_map.h" +#include "processor/logging.h" + +namespace google_breakpad { + +template +bool AddressMap::Store(const AddressType &address, + const EntryType &entry) { + // Ensure that the specified address doesn't conflict with something already + // in the map. + if (map_.find(address) != map_.end()) { + BPLOG(INFO) << "Store failed, address " << HexString(address) << + " is already present"; + return false; + } + + map_.insert(MapValue(address, entry)); + return true; +} + +template +bool AddressMap::Retrieve( + const AddressType &address, + EntryType *entry, AddressType *entry_address) const { + BPLOG_IF(ERROR, !entry) << "AddressMap::Retrieve requires |entry|"; + assert(entry); + + // upper_bound gives the first element whose key is greater than address, + // but we want the first element whose key is less than or equal to address. + // Decrement the iterator to get there, but not if the upper_bound already + // points to the beginning of the map - in that case, address is lower than + // the lowest stored key, so return false. + MapConstIterator iterator = map_.upper_bound(address); + if (iterator == map_.begin()) + return false; + --iterator; + + *entry = iterator->second; + if (entry_address) + *entry_address = iterator->first; + + return true; +} + +template +void AddressMap::Clear() { + map_.clear(); +} + +} // namespace google_breakpad + +#endif // PROCESSOR_ADDRESS_MAP_INL_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/address_map.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/address_map.h new file mode 100644 index 00000000..14139e7a --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/address_map.h @@ -0,0 +1,80 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// address_map.h: Address maps. +// +// An address map contains a set of objects keyed by address. Objects are +// retrieved from the map by returning the object with the highest key less +// than or equal to the lookup key. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_ADDRESS_MAP_H__ +#define PROCESSOR_ADDRESS_MAP_H__ + +#include + +namespace google_breakpad { + +template +class AddressMap { + public: + AddressMap() : map_() {} + + // Inserts an entry into the map. Returns false without storing the entry + // if an entry is already stored in the map at the same address as specified + // by the address argument. + bool Store(const AddressType &address, const EntryType &entry); + + // Locates the entry stored at the highest address less than or equal to + // the address argument. If there is no such range, returns false. The + // entry is returned in entry, which is a required argument. If + // entry_address is not NULL, it will be set to the address that the entry + // was stored at. + bool Retrieve(const AddressType &address, + EntryType *entry, AddressType *entry_address) const; + + // Empties the address map, restoring it to the same state as when it was + // initially created. + void Clear(); + + private: + // Convenience types. + typedef std::map AddressToEntryMap; + typedef typename AddressToEntryMap::const_iterator MapConstIterator; + typedef typename AddressToEntryMap::value_type MapValue; + + // Maps the address of each entry to an EntryType. + AddressToEntryMap map_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_ADDRESS_MAP_H__ + diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/basic_code_module.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/basic_code_module.h new file mode 100644 index 00000000..5c9f75f1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/basic_code_module.h @@ -0,0 +1,95 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// basic_code_module.h: Carries information about code modules that are loaded +// into a process. +// +// This is a basic concrete implementation of CodeModule. It cannot be +// instantiated directly, only based on other objects that implement +// the CodeModule interface. It exists to provide a CodeModule implementation +// a place to store information when the life of the original object (such as +// a MinidumpModule) cannot be guaranteed. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_BASIC_CODE_MODULE_H__ +#define PROCESSOR_BASIC_CODE_MODULE_H__ + +#include + +#include "google_breakpad/processor/code_module.h" + +namespace google_breakpad { + +using std::string; + +class BasicCodeModule : public CodeModule { + public: + // Creates a new BasicCodeModule given any existing CodeModule + // implementation. This is useful to make a copy of the data relevant to + // the CodeModule interface without requiring all of the resources that + // other CodeModule implementations may require. + explicit BasicCodeModule(const CodeModule *that) + : base_address_(that->base_address()), + size_(that->size()), + code_file_(that->code_file()), + code_identifier_(that->code_identifier()), + debug_file_(that->debug_file()), + debug_identifier_(that->debug_identifier()), + version_(that->version()) {} + virtual ~BasicCodeModule() {} + + // See code_module.h for descriptions of these methods and the associated + // members. + virtual u_int64_t base_address() const { return base_address_; } + virtual u_int64_t size() const { return size_; } + virtual string code_file() const { return code_file_; } + virtual string code_identifier() const { return code_identifier_; } + virtual string debug_file() const { return debug_file_; } + virtual string debug_identifier() const { return debug_identifier_; } + virtual string version() const { return version_; } + virtual const CodeModule* Copy() const { return new BasicCodeModule(this); } + + private: + u_int64_t base_address_; + u_int64_t size_; + string code_file_; + string code_identifier_; + string debug_file_; + string debug_identifier_; + string version_; + + // Disallow copy constructor and assignment operator. + BasicCodeModule(const BasicCodeModule &that); + void operator=(const BasicCodeModule &that); +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_BASIC_CODE_MODULE_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/basic_code_modules.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/basic_code_modules.h new file mode 100644 index 00000000..df87fc49 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/basic_code_modules.h @@ -0,0 +1,85 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// basic_code_modules.h: Contains all of the CodeModule objects that +// were loaded into a single process. +// +// This is a basic concrete implementation of CodeModules. It cannot be +// instantiated directly, only based on other objects that implement +// the CodeModules interface. It exists to provide a CodeModules +// implementation a place to store information when the life of the original +// object (such as a MinidumpModuleList) cannot be guaranteed. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_BASIC_CODE_MODULES_H__ +#define PROCESSOR_BASIC_CODE_MODULES_H__ + +#include "google_breakpad/processor/code_modules.h" + +namespace google_breakpad { + +template class linked_ptr; +template class RangeMap; + +class BasicCodeModules : public CodeModules { + public: + // Creates a new BasicCodeModules object given any existing CodeModules + // implementation. This is useful to make a copy of the data relevant to + // the CodeModules and CodeModule interfaces without requiring all of the + // resources that other implementations may require. A copy will be + // made of each contained CodeModule using CodeModule::Copy. + explicit BasicCodeModules(const CodeModules *that); + + virtual ~BasicCodeModules(); + + // See code_modules.h for descriptions of these methods. + virtual unsigned int module_count() const; + virtual const CodeModule* GetModuleForAddress(u_int64_t address) const; + virtual const CodeModule* GetMainModule() const; + virtual const CodeModule* GetModuleAtSequence(unsigned int sequence) const; + virtual const CodeModule* GetModuleAtIndex(unsigned int index) const; + virtual const CodeModules* Copy() const; + + private: + // The base address of the main module. + u_int64_t main_address_; + + // The map used to contain each CodeModule, keyed by each CodeModule's + // address range. + RangeMap > *map_; + + // Disallow copy constructor and assignment operator. + BasicCodeModules(const BasicCodeModules &that); + void operator=(const BasicCodeModules &that); +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_BASIC_CODE_MODULES_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/contained_range_map-inl.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/contained_range_map-inl.h new file mode 100644 index 00000000..5cc498df --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/contained_range_map-inl.h @@ -0,0 +1,197 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// contained_range_map-inl.h: Hierarchically-organized range map implementation. +// +// See contained_range_map.h for documentation. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_CONTAINED_RANGE_MAP_INL_H__ +#define PROCESSOR_CONTAINED_RANGE_MAP_INL_H__ + + +#include + +#include "processor/contained_range_map.h" +#include "processor/logging.h" + + +namespace google_breakpad { + + +template +ContainedRangeMap::~ContainedRangeMap() { + // Clear frees the children pointed to by the map, and frees the map itself. + Clear(); +} + + +template +bool ContainedRangeMap::StoreRange( + const AddressType &base, const AddressType &size, const EntryType &entry) { + AddressType high = base + size - 1; + + // Check for undersize or overflow. + if (size <= 0 || high < base) { + //TODO(nealsid) We are commenting this out in order to prevent + // excessive logging. We plan to move to better logging as this + // failure happens quite often and is expected(see comment in + // basic_source_line_resolver.cc:671). + // BPLOG(INFO) << "StoreRange failed, " << HexString(base) << "+" + // << HexString(size) << ", " << HexString(high); + return false; + } + + if (!map_) + map_ = new AddressToRangeMap(); + + MapIterator iterator_base = map_->lower_bound(base); + MapIterator iterator_high = map_->lower_bound(high); + MapIterator iterator_end = map_->end(); + + if (iterator_base == iterator_high && iterator_base != iterator_end && + base >= iterator_base->second->base_) { + // The new range is entirely within an existing child range. + + // If the new range's geometry is exactly equal to an existing child + // range's, it violates the containment rules, and an attempt to store + // it must fail. iterator_base->first contains the key, which was the + // containing child's high address. + if (iterator_base->second->base_ == base && iterator_base->first == high) { + // TODO(nealsid): See the TODO above on why this is commented out. +// BPLOG(INFO) << "StoreRange failed, identical range is already " +// "present: " << HexString(base) << "+" << HexString(size); + return false; + } + + // Pass the new range on to the child to attempt to store. + return iterator_base->second->StoreRange(base, size, entry); + } + + // iterator_high might refer to an irrelevant range: one whose base address + // is higher than the new range's high address. Set contains_high to true + // only if iterator_high refers to a range that is at least partially + // within the new range. + bool contains_high = iterator_high != iterator_end && + high >= iterator_high->second->base_; + + // If the new range encompasses any existing child ranges, it must do so + // fully. Partial containment isn't allowed. + if ((iterator_base != iterator_end && base > iterator_base->second->base_) || + (contains_high && high < iterator_high->first)) { + // TODO(mmentovai): Some symbol files will trip this check frequently + // on STACK lines. Too many messages will be produced. These are more + // suitable for a DEBUG channel than an INFO channel. + // BPLOG(INFO) << "StoreRange failed, new range partially contains " + // "existing range: " << HexString(base) << "+" << + // HexString(size); + return false; + } + + // When copying and erasing contained ranges, the "end" iterator needs to + // point one past the last item of the range to copy. If contains_high is + // false, the iterator's already in the right place; the increment is safe + // because contains_high can't be true if iterator_high == iterator_end. + if (contains_high) + ++iterator_high; + + // Optimization: if the iterators are equal, no child ranges would be + // moved. Create the new child range with a NULL map to conserve space + // in leaf nodes, of which there will be many. + AddressToRangeMap *child_map = NULL; + + if (iterator_base != iterator_high) { + // The children of this range that are contained by the new range must + // be transferred over to the new range. Create the new child range map + // and copy the pointers to range maps it should contain into it. + child_map = new AddressToRangeMap(iterator_base, iterator_high); + + // Remove the copied child pointers from this range's map of children. + map_->erase(iterator_base, iterator_high); + } + + // Store the new range in the map by its high address. Any children that + // the new child range contains were formerly children of this range but + // are now this range's grandchildren. Ownership of these is transferred + // to the new child range. + map_->insert(MapValue(high, + new ContainedRangeMap(base, entry, child_map))); + return true; +} + + +template +bool ContainedRangeMap::RetrieveRange( + const AddressType &address, EntryType *entry) const { + BPLOG_IF(ERROR, !entry) << "ContainedRangeMap::RetrieveRange requires " + "|entry|"; + assert(entry); + + // If nothing was ever stored, then there's nothing to retrieve. + if (!map_) + return false; + + // Get an iterator to the child range whose high address is equal to or + // greater than the supplied address. If the supplied address is higher + // than all of the high addresses in the range, then this range does not + // contain a child at address, so return false. If the supplied address + // is lower than the base address of the child range, then it is not within + // the child range, so return false. + MapConstIterator iterator = map_->lower_bound(address); + if (iterator == map_->end() || address < iterator->second->base_) + return false; + + // The child in iterator->second contains the specified address. Find out + // if it has a more-specific descendant that also contains it. If it does, + // it will set |entry| appropriately. If not, set |entry| to the child. + if (!iterator->second->RetrieveRange(address, entry)) + *entry = iterator->second->entry_; + + return true; +} + + +template +void ContainedRangeMap::Clear() { + if (map_) { + MapConstIterator end = map_->end(); + for (MapConstIterator child = map_->begin(); child != end; ++child) + delete child->second; + + delete map_; + map_ = NULL; + } +} + + +} // namespace google_breakpad + + +#endif // PROCESSOR_CONTAINED_RANGE_MAP_INL_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/contained_range_map.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/contained_range_map.h new file mode 100644 index 00000000..f30016f3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/contained_range_map.h @@ -0,0 +1,145 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// contained_range_map.h: Hierarchically-organized range maps. +// +// A contained range map is similar to a standard range map, except it allows +// objects to be organized hierarchically. A contained range map allows +// objects to contain other objects. It is not sensitive to the order that +// objects are added to the map: larger, more general, containing objects +// may be added either before or after smaller, more specific, contained +// ones. +// +// Contained range maps guarantee that each object may only contain smaller +// objects than itself, and that a parent object may only contain child +// objects located entirely within the parent's address space. Attempts +// to introduce objects (via StoreRange) that violate these rules will fail. +// Retrieval (via RetrieveRange) always returns the most specific (smallest) +// object that contains the address being queried. Note that while it is +// not possible to insert two objects into a map that have exactly the same +// geometry (base address and size), it is possible to completely mask a +// larger object by inserting smaller objects that entirely fill the larger +// object's address space. +// +// Internally, contained range maps are implemented as a tree. Each tree +// node except for the root node describes an object in the map. Each node +// maintains its list of children in a map similar to a standard range map, +// keyed by the highest address that each child occupies. Each node's +// children occupy address ranges entirely within the node. The root node +// is the only node directly accessible to the user, and represents the +// entire address space. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_CONTAINED_RANGE_MAP_H__ +#define PROCESSOR_CONTAINED_RANGE_MAP_H__ + + +#include + + +namespace google_breakpad { + + +template +class ContainedRangeMap { + public: + // The default constructor creates a ContainedRangeMap with no geometry + // and no entry, and as such is only suitable for the root node of a + // ContainedRangeMap tree. + ContainedRangeMap() : base_(), entry_(), map_(NULL) {} + + ~ContainedRangeMap(); + + // Inserts a range into the map. If the new range is encompassed by + // an existing child range, the new range is passed into the child range's + // StoreRange method. If the new range encompasses any existing child + // ranges, those child ranges are moved to the new range, becoming + // grandchildren of this ContainedRangeMap. Returns false for a + // parameter error, or if the ContainedRangeMap hierarchy guarantees + // would be violated. + bool StoreRange(const AddressType &base, + const AddressType &size, + const EntryType &entry); + + // Retrieves the most specific (smallest) descendant range encompassing + // the specified address. This method will only return entries held by + // child ranges, and not the entry contained by |this|. This is necessary + // to support a sparsely-populated root range. If no descendant range + // encompasses the address, returns false. + bool RetrieveRange(const AddressType &address, EntryType *entry) const; + + // Removes all children. Note that Clear only removes descendants, + // leaving the node on which it is called intact. Because the only + // meaningful things contained by a root node are descendants, this + // is sufficient to restore an entire ContainedRangeMap to its initial + // empty state when called on the root node. + void Clear(); + + private: + // AddressToRangeMap stores pointers. This makes reparenting simpler in + // StoreRange, because it doesn't need to copy entire objects. + typedef std::map AddressToRangeMap; + typedef typename AddressToRangeMap::const_iterator MapConstIterator; + typedef typename AddressToRangeMap::iterator MapIterator; + typedef typename AddressToRangeMap::value_type MapValue; + + // Creates a new ContainedRangeMap with the specified base address, entry, + // and initial child map, which may be NULL. This is only used internally + // by ContainedRangeMap when it creates a new child. + ContainedRangeMap(const AddressType &base, const EntryType &entry, + AddressToRangeMap *map) + : base_(base), entry_(entry), map_(map) {} + + // The base address of this range. The high address does not need to + // be stored, because it is used as the key to an object in its parent's + // map, and all ContainedRangeMaps except for the root range are contained + // within maps. The root range does not actually contain an entry, so its + // base_ field is meaningless, and the fact that it has no parent and thus + // no key is unimportant. For this reason, the base_ field should only be + // is accessed on child ContainedRangeMap objects, and never on |this|. + const AddressType base_; + + // The entry corresponding to this range. The root range does not + // actually contain an entry, so its entry_ field is meaningless. For + // this reason, the entry_ field should only be accessed on child + // ContainedRangeMap objects, and never on |this|. + const EntryType entry_; + + // The map containing child ranges, keyed by each child range's high + // address. This is a pointer to avoid allocating map structures for + // leaf nodes, where they are not needed. + AddressToRangeMap *map_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_CONTAINED_RANGE_MAP_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/linked_ptr.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/linked_ptr.h new file mode 100644 index 00000000..1a4ef7d4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/linked_ptr.h @@ -0,0 +1,193 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A "smart" pointer type with reference tracking. Every pointer to a +// particular object is kept on a circular linked list. When the last pointer +// to an object is destroyed or reassigned, the object is deleted. +// +// Used properly, this deletes the object when the last reference goes away. +// There are several caveats: +// - Like all reference counting schemes, cycles lead to leaks. +// - Each smart pointer is actually two pointers (8 bytes instead of 4). +// - Every time a pointer is assigned, the entire list of pointers to that +// object is traversed. This class is therefore NOT SUITABLE when there +// will often be more than two or three pointers to a particular object. +// - References are only tracked as long as linked_ptr<> objects are copied. +// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS +// will happen (double deletion). +// +// A good use of this class is storing object references in STL containers. +// You can safely put linked_ptr<> in a vector<>. +// Other uses may not be as good. +// +// Note: If you use an incomplete type with linked_ptr<>, the class +// *containing* linked_ptr<> must have a constructor and destructor (even +// if they do nothing!). + +#ifndef PROCESSOR_LINKED_PTR_H__ +#define PROCESSOR_LINKED_PTR_H__ + +namespace google_breakpad { + +// This is used internally by all instances of linked_ptr<>. It needs to be +// a non-template class because different types of linked_ptr<> can refer to +// the same object (linked_ptr(obj) vs linked_ptr(obj)). +// So, it needs to be possible for different types of linked_ptr to participate +// in the same circular linked list, so we need a single class type here. +// +// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr. +class linked_ptr_internal { + public: + // Create a new circle that includes only this instance. + void join_new() { + next_ = this; + } + + // Join an existing circle. + void join(linked_ptr_internal const* ptr) { + linked_ptr_internal const* p = ptr; + while (p->next_ != ptr) p = p->next_; + p->next_ = this; + next_ = ptr; + } + + // Leave whatever circle we're part of. Returns true iff we were the + // last member of the circle. Once this is done, you can join() another. + bool depart() { + if (next_ == this) return true; + linked_ptr_internal const* p = next_; + while (p->next_ != this) p = p->next_; + p->next_ = next_; + return false; + } + + private: + mutable linked_ptr_internal const* next_; +}; + +template +class linked_ptr { + public: + typedef T element_type; + + // Take over ownership of a raw pointer. This should happen as soon as + // possible after the object is created. + explicit linked_ptr(T* ptr = NULL) { capture(ptr); } + ~linked_ptr() { depart(); } + + // Copy an existing linked_ptr<>, adding ourselves to the list of references. + template linked_ptr(linked_ptr const& ptr) { copy(&ptr); } + linked_ptr(linked_ptr const& ptr) { copy(&ptr); } + + // Assignment releases the old value and acquires the new. + template linked_ptr& operator=(linked_ptr const& ptr) { + depart(); + copy(&ptr); + return *this; + } + + linked_ptr& operator=(linked_ptr const& ptr) { + if (&ptr != this) { + depart(); + copy(&ptr); + } + return *this; + } + + // Smart pointer members. + void reset(T* ptr = NULL) { depart(); capture(ptr); } + T* get() const { return value_; } + T* operator->() const { return value_; } + T& operator*() const { return *value_; } + // Release ownership of the pointed object and returns it. + // Sole ownership by this linked_ptr object is required. + T* release() { + bool last = link_.depart(); + T* v = value_; + value_ = NULL; + return v; + } + + bool operator==(T* p) const { return value_ == p; } + bool operator!=(T* p) const { return value_ != p; } + template + bool operator==(linked_ptr const& ptr) const { + return value_ == ptr.get(); + } + template + bool operator!=(linked_ptr const& ptr) const { + return value_ != ptr.get(); + } + + private: + template + friend class linked_ptr; + + T* value_; + linked_ptr_internal link_; + + void depart() { + if (link_.depart()) delete value_; + } + + void capture(T* ptr) { + value_ = ptr; + link_.join_new(); + } + + template void copy(linked_ptr const* ptr) { + value_ = ptr->get(); + if (value_) + link_.join(&ptr->link_); + else + link_.join_new(); + } +}; + +template inline +bool operator==(T* ptr, const linked_ptr& x) { + return ptr == x.get(); +} + +template inline +bool operator!=(T* ptr, const linked_ptr& x) { + return ptr != x.get(); +} + +// A function to convert T* into linked_ptr +// Doing e.g. make_linked_ptr(new FooBarBaz(arg)) is a shorter notation +// for linked_ptr >(new FooBarBaz(arg)) +template +linked_ptr make_linked_ptr(T* ptr) { + return linked_ptr(ptr); +} + +} // namespace google_breakpad + +#endif // PROCESSOR_LINKED_PTR_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/logging.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/logging.h new file mode 100644 index 00000000..b638ff58 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/logging.h @@ -0,0 +1,153 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// logging.h: Breakpad logging +// +// Breakpad itself uses Breakpad logging with statements of the form: +// BPLOG(severity) << "message"; +// severity may be INFO, ERROR, or other values defined in this file. +// +// BPLOG is an overridable macro so that users can customize Breakpad's +// logging. Left at the default, logging messages are sent to stderr along +// with a timestamp and the source code location that produced a message. +// The streams may be changed by redefining BPLOG_*_STREAM, the logging +// behavior may be changed by redefining BPLOG_*, and the entire logging +// system may be overridden by redefining BPLOG(severity). These +// redefinitions may be passed to the preprocessor as a command-line flag +// (-D). +// +// If an additional header is required to override Breakpad logging, it can +// be specified by the BP_LOGGING_INCLUDE macro. If defined, this header +// will #include the header specified by that macro. +// +// If any initialization is needed before logging, it can be performed by +// a function called through the BPLOG_INIT macro. Each main function of +// an executable program in the Breakpad processor library calls +// BPLOG_INIT(&argc, &argv); before any logging can be performed; define +// BPLOG_INIT appropriately if initialization is required. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_LOGGING_H__ +#define PROCESSOR_LOGGING_H__ + +#include +#include + +#include "google_breakpad/common/breakpad_types.h" + +#ifdef BP_LOGGING_INCLUDE +#include BP_LOGGING_INCLUDE +#endif // BP_LOGGING_INCLUDE + +namespace google_breakpad { + +class LogStream { + public: + enum Severity { + SEVERITY_INFO, + SEVERITY_ERROR + }; + + // Begin logging a message to the stream identified by |stream|, at the + // indicated severity. The file and line parameters should be set so as to + // identify the line of source code that is producing a message. + LogStream(std::ostream &stream, Severity severity, + const char *file, int line); + + // Finish logging by printing a newline and flushing the output stream. + ~LogStream(); + + template std::ostream& operator<<(const T &t) { + return stream_ << t; + } + + private: + std::ostream &stream_; + + // Disallow copy constructor and assignment operator + explicit LogStream(const LogStream &that); + void operator=(const LogStream &that); +}; + +// This class is used to explicitly ignore values in the conditional logging +// macros. This avoids compiler warnings like "value computed is not used" +// and "statement has no effect". +class LogMessageVoidify { + public: + LogMessageVoidify() {} + + // This has to be an operator with a precedence lower than << but higher + // than ?: + void operator&(std::ostream &) {} +}; + +// Returns number formatted as a hexadecimal string, such as "0x7b". +std::string HexString(u_int32_t number); +std::string HexString(u_int64_t number); +std::string HexString(int number); + +// Returns the error code as set in the global errno variable, and sets +// error_string, a required argument, to a string describing that error +// code. +int ErrnoString(std::string *error_string); + +} // namespace google_breakpad + +#ifndef BPLOG_INIT +#define BPLOG_INIT(pargc, pargv) +#endif // BPLOG_INIT + +#ifndef BPLOG +#define BPLOG(severity) BPLOG_ ## severity +#endif // BPLOG + +#ifndef BPLOG_INFO +#ifndef BPLOG_INFO_STREAM +#define BPLOG_INFO_STREAM std::clog +#endif // BPLOG_INFO_STREAM +#define BPLOG_INFO google_breakpad::LogStream(BPLOG_INFO_STREAM, \ + google_breakpad::LogStream::SEVERITY_INFO, \ + __FILE__, __LINE__) +#endif // BPLOG_INFO + +#ifndef BPLOG_ERROR +#ifndef BPLOG_ERROR_STREAM +#define BPLOG_ERROR_STREAM std::cerr +#endif // BPLOG_ERROR_STREAM +#define BPLOG_ERROR google_breakpad::LogStream(BPLOG_ERROR_STREAM, \ + google_breakpad::LogStream::SEVERITY_ERROR, \ + __FILE__, __LINE__) +#endif // BPLOG_ERROR + +#define BPLOG_IF(severity, condition) \ + !(condition) ? (void) 0 : \ + google_breakpad::LogMessageVoidify() & BPLOG(severity) + +#endif // PROCESSOR_LOGGING_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/pathname_stripper.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/pathname_stripper.h new file mode 100644 index 00000000..17db75d6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/pathname_stripper.h @@ -0,0 +1,53 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// pathname_stripper.h: Manipulates pathnames into their component parts. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_PATHNAME_STRIPPER_H__ +#define PROCESSOR_PATHNAME_STRIPPER_H__ + +#include + +namespace google_breakpad { + +using std::string; + +class PathnameStripper { + public: + // Given path, a pathname with components separated by slashes (/) or + // backslashes (\), returns the trailing component, without any separator. + // If path ends in a separator character, returns an empty string. + static string File(const string &path); +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_PATHNAME_STRIPPER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/postfix_evaluator-inl.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/postfix_evaluator-inl.h new file mode 100644 index 00000000..aa0851d9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/postfix_evaluator-inl.h @@ -0,0 +1,282 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// postfix_evaluator-inl.h: Postfix (reverse Polish) notation expression +// evaluator. +// +// Documentation in postfix_evaluator.h. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_POSTFIX_EVALUATOR_INL_H__ +#define PROCESSOR_POSTFIX_EVALUATOR_INL_H__ + + +#include + +#include "processor/postfix_evaluator.h" +#include "google_breakpad/processor/memory_region.h" +#include "processor/logging.h" + +namespace google_breakpad { + +using std::istringstream; +using std::ostringstream; + + +// A small class used in Evaluate to make sure to clean up the stack +// before returning failure. +class AutoStackClearer { + public: + explicit AutoStackClearer(vector *stack) : stack_(stack) {} + ~AutoStackClearer() { stack_->clear(); } + + private: + vector *stack_; +}; + + +template +bool PostfixEvaluator::Evaluate(const string &expression, + DictionaryValidityType *assigned) { + // Ensure that the stack is cleared before returning. + AutoStackClearer clearer(&stack_); + + // Tokenize, splitting on whitespace. + istringstream stream(expression); + string token; + while (stream >> token) { + // There are enough binary operations that do exactly the same thing + // (other than the specific operation, of course) that it makes sense + // to share as much code as possible. + enum BinaryOperation { + BINARY_OP_NONE = 0, + BINARY_OP_ADD, + BINARY_OP_SUBTRACT, + BINARY_OP_MULTIPLY, + BINARY_OP_DIVIDE_QUOTIENT, + BINARY_OP_DIVIDE_MODULUS + }; + + BinaryOperation operation = BINARY_OP_NONE; + if (token == "+") + operation = BINARY_OP_ADD; + else if (token == "-") + operation = BINARY_OP_SUBTRACT; + else if (token == "*") + operation = BINARY_OP_MULTIPLY; + else if (token == "/") + operation = BINARY_OP_DIVIDE_QUOTIENT; + else if (token == "%") + operation = BINARY_OP_DIVIDE_MODULUS; + + if (operation != BINARY_OP_NONE) { + // Get the operands. + ValueType operand1, operand2; + if (!PopValues(&operand1, &operand2)) { + BPLOG(ERROR) << "Could not PopValues to get two values for binary " + "operation " << token << ": " << expression; + return false; + } + + // Perform the operation. + ValueType result; + switch (operation) { + case BINARY_OP_ADD: + result = operand1 + operand2; + break; + case BINARY_OP_SUBTRACT: + result = operand1 - operand2; + break; + case BINARY_OP_MULTIPLY: + result = operand1 * operand2; + break; + case BINARY_OP_DIVIDE_QUOTIENT: + result = operand1 / operand2; + break; + case BINARY_OP_DIVIDE_MODULUS: + result = operand1 % operand2; + break; + case BINARY_OP_NONE: + // This will not happen, but compilers will want a default or + // BINARY_OP_NONE case. + BPLOG(ERROR) << "Not reached!"; + return false; + break; + } + + // Save the result. + PushValue(result); + } else if (token == "^") { + // ^ for unary dereference. Can't dereference without memory. + if (!memory_) { + BPLOG(ERROR) << "Attempt to dereference without memory: " << + expression; + return false; + } + + ValueType address; + if (!PopValue(&address)) { + BPLOG(ERROR) << "Could not PopValue to get value to derefence: " << + expression; + return false; + } + + ValueType value; + if (!memory_->GetMemoryAtAddress(address, &value)) { + BPLOG(ERROR) << "Could not dereference memory at address " << + HexString(address) << ": " << expression; + return false; + } + + PushValue(value); + } else if (token == "=") { + // = for assignment. + ValueType value; + if (!PopValue(&value)) { + BPLOG(ERROR) << "Could not PopValue to get value to assign: " << + expression; + return false; + } + + // Assignment is only meaningful when assigning into an identifier. + // The identifier must name a variable, not a constant. Variables + // begin with '$'. + string identifier; + if (PopValueOrIdentifier(NULL, &identifier) != POP_RESULT_IDENTIFIER) { + BPLOG(ERROR) << "PopValueOrIdentifier returned a value, but an " + "identifier is needed to assign " << + HexString(value) << ": " << expression; + return false; + } + if (identifier.empty() || identifier[0] != '$') { + BPLOG(ERROR) << "Can't assign " << HexString(value) << " to " << + identifier << ": " << expression; + return false; + } + + (*dictionary_)[identifier] = value; + if (assigned) + (*assigned)[identifier] = true; + } else { + // The token is not an operator, it's a literal value or an identifier. + // Push it onto the stack as-is. Use push_back instead of PushValue + // because PushValue pushes ValueType as a string, but token is already + // a string. + stack_.push_back(token); + } + } + + // If there's anything left on the stack, it indicates incomplete execution. + // This is a failure case. If the stack is empty, evalution was complete + // and successful. + BPLOG_IF(ERROR, !stack_.empty()) << "Incomplete execution: " << expression; + return stack_.empty(); +} + + +template +typename PostfixEvaluator::PopResult +PostfixEvaluator::PopValueOrIdentifier( + ValueType *value, string *identifier) { + // There needs to be at least one element on the stack to pop. + if (!stack_.size()) + return POP_RESULT_FAIL; + + string token = stack_.back(); + stack_.pop_back(); + + // First, try to treat the value as a literal. In order for this to + // succed, the entire string must be parseable as ValueType. If this + // isn't possible, it can't be a literal, so treat it as an identifier + // instead. + istringstream token_stream(token); + ValueType literal; + if (token_stream >> literal && token_stream.peek() == EOF) { + if (value) { + *value = literal; + } + return POP_RESULT_VALUE; + } else { + if (identifier) { + *identifier = token; + } + return POP_RESULT_IDENTIFIER; + } +} + + +template +bool PostfixEvaluator::PopValue(ValueType *value) { + ValueType literal; + string token; + PopResult result; + if ((result = PopValueOrIdentifier(&literal, &token)) == POP_RESULT_FAIL) { + return false; + } else if (result == POP_RESULT_VALUE) { + // This is the easy case. + *value = literal; + } else { // result == POP_RESULT_IDENTIFIER + // There was an identifier at the top of the stack. Resolve it to a + // value by looking it up in the dictionary. + typename DictionaryType::const_iterator iterator = + dictionary_->find(token); + if (iterator == dictionary_->end()) { + // The identifier wasn't found in the dictionary. Don't imply any + // default value, just fail. + BPLOG(ERROR) << "Identifier " << token << " not in dictionary"; + return false; + } + + *value = iterator->second; + } + + return true; +} + + +template +bool PostfixEvaluator::PopValues(ValueType *value1, + ValueType *value2) { + return PopValue(value2) && PopValue(value1); +} + + +template +void PostfixEvaluator::PushValue(const ValueType &value) { + ostringstream token_stream; + token_stream << value; + stack_.push_back(token_stream.str()); +} + + +} // namespace google_breakpad + + +#endif // PROCESSOR_POSTFIX_EVALUATOR_INL_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/postfix_evaluator.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/postfix_evaluator.h new file mode 100644 index 00000000..552ed159 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/postfix_evaluator.h @@ -0,0 +1,158 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// postfix_evaluator.h: Postfix (reverse Polish) notation expression evaluator. +// +// PostfixEvaluator evaluates an expression, using the expression itself +// in postfix (reverse Polish) notation and a dictionary mapping constants +// and variables to their values. The evaluator supports standard +// arithmetic operations, assignment into variables, and when an optional +// MemoryRange is provided, dereferencing. (Any unary key-to-value operation +// may be used with a MemoryRange implementation that returns the appropriate +// values, but PostfixEvaluator was written with dereferencing in mind.) +// +// The expression language is simple. Expressions are supplied as strings, +// with operands and operators delimited by whitespace. Operands may be +// either literal values suitable for ValueType, or constants or variables, +// which reference the dictionary. The supported binary operators are + +// (addition), - (subtraction), * (multiplication), / (quotient of division), +// and % (modulus of division). The unary ^ (dereference) operator is also +// provided. These operators allow any operand to be either a literal +// value, constant, or variable. Assignment (=) of any type of operand into +// a variable is also supported. +// +// The dictionary is provided as a map with string keys. Keys beginning +// with the '$' character are treated as variables. All other keys are +// treated as constants. Any results must be assigned into variables in the +// dictionary. These variables do not need to exist prior to calling +// Evaluate, unless used in an expression prior to being assigned to. The +// internal stack state is not made available after evaluation, and any +// values remaining on the stack are treated as evidence of incomplete +// execution and cause the evaluator to indicate failure. +// +// PostfixEvaluator is intended to support evaluation of "program strings" +// obtained from MSVC frame data debugging information in pdb files as +// returned by the DIA APIs. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_POSTFIX_EVALUATOR_H__ +#define PROCESSOR_POSTFIX_EVALUATOR_H__ + + +#include +#include +#include + +namespace google_breakpad { + +using std::map; +using std::string; +using std::vector; + +class MemoryRegion; + +template +class PostfixEvaluator { + public: + typedef map DictionaryType; + typedef map DictionaryValidityType; + + // Create a PostfixEvaluator object that may be used (with Evaluate) on + // one or more expressions. PostfixEvaluator does not take ownership of + // either argument. |memory| may be NULL, in which case dereferencing + // (^) will not be supported. |dictionary| may be NULL, but evaluation + // will fail in that case unless set_dictionary is used before calling + // Evaluate. + PostfixEvaluator(DictionaryType *dictionary, MemoryRegion *memory) + : dictionary_(dictionary), memory_(memory), stack_() {} + + // Evaluate the expression. The results of execution will be stored + // in one (or more) variables in the dictionary. Returns false if any + // failures occure during execution, leaving variables in the dictionary + // in an indeterminate state. If assigned is non-NULL, any keys set in + // the dictionary as a result of evaluation will also be set to true in + // assigned, providing a way to determine if an expression modifies any + // of its input variables. + bool Evaluate(const string &expression, DictionaryValidityType *assigned); + + DictionaryType* dictionary() const { return dictionary_; } + + // Reset the dictionary. PostfixEvaluator does not take ownership. + void set_dictionary(DictionaryType *dictionary) {dictionary_ = dictionary; } + + private: + // Return values for PopValueOrIdentifier + enum PopResult { + POP_RESULT_FAIL = 0, + POP_RESULT_VALUE, + POP_RESULT_IDENTIFIER + }; + + // Retrieves the topmost literal value, constant, or variable from the + // stack. Returns POP_RESULT_VALUE if the topmost entry is a literal + // value, and sets |value| accordingly. Returns POP_RESULT_IDENTIFIER + // if the topmost entry is a constant or variable identifier, and sets + // |identifier| accordingly. Returns POP_RESULT_FAIL on failure, such + // as when the stack is empty. + PopResult PopValueOrIdentifier(ValueType *value, string *identifier); + + // Retrieves the topmost value on the stack. If the topmost entry is + // an identifier, the dictionary is queried for the identifier's value. + // Returns false on failure, such as when the stack is empty or when + // a nonexistent identifier is named. + bool PopValue(ValueType *value); + + // Retrieves the top two values on the stack, in the style of PopValue. + // value2 is popped before value1, so that value1 corresponds to the + // entry that was pushed prior to value2. Returns false on failure. + bool PopValues(ValueType *value1, ValueType *value2); + + // Pushes a new value onto the stack. + void PushValue(const ValueType &value); + + // The dictionary mapping constant and variable identifiers (strings) to + // values. Keys beginning with '$' are treated as variable names, and + // PostfixEvaluator is free to create and modify these keys. Weak pointer. + DictionaryType *dictionary_; + + // If non-NULL, the MemoryRegion used for dereference (^) operations. + // If NULL, dereferencing is unsupported and will fail. Weak pointer. + MemoryRegion *memory_; + + // The stack contains state information as execution progresses. Values + // are pushed on to it as the expression string is read and as operations + // yield values; values are popped when used as operands to operators. + vector stack_; +}; + +} // namespace google_breakpad + + +#endif // PROCESSOR_POSTFIX_EVALUATOR_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/range_map-inl.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/range_map-inl.h new file mode 100644 index 00000000..77bf7d20 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/range_map-inl.h @@ -0,0 +1,210 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// range_map-inl.h: Range map implementation. +// +// See range_map.h for documentation. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_RANGE_MAP_INL_H__ +#define PROCESSOR_RANGE_MAP_INL_H__ + + +#include + +#include "processor/range_map.h" +#include "processor/logging.h" + + +namespace google_breakpad { + + +template +bool RangeMap::StoreRange(const AddressType &base, + const AddressType &size, + const EntryType &entry) { + AddressType high = base + size - 1; + + // Check for undersize or overflow. + if (size <= 0 || high < base) { + // The processor will hit this case too frequently with common symbol + // files in the size == 0 case, which is more suited to a DEBUG channel. + // Filter those out since there's no DEBUG channel at the moment. + BPLOG_IF(INFO, size != 0) << "StoreRange failed, " << HexString(base) << + "+" << HexString(size) << ", " << + HexString(high); + return false; + } + + // Ensure that this range does not overlap with another one already in the + // map. + MapConstIterator iterator_base = map_.lower_bound(base); + MapConstIterator iterator_high = map_.lower_bound(high); + + if (iterator_base != iterator_high) { + // Some other range begins in the space used by this range. It may be + // contained within the space used by this range, or it may extend lower. + // Regardless, it is an error. + AddressType other_base = iterator_base->second.base(); + AddressType other_size = iterator_base->first - other_base + 1; + BPLOG(INFO) << "StoreRange failed, an existing range is contained by or " + "extends lower than the new range: new " << + HexString(base) << "+" << HexString(size) << ", existing " << + HexString(other_base) << "+" << HexString(other_size); + return false; + } + + if (iterator_high != map_.end()) { + if (iterator_high->second.base() <= high) { + // The range above this one overlaps with this one. It may fully + // contain this range, or it may begin within this range and extend + // higher. Regardless, it's an error. + AddressType other_base = iterator_high->second.base(); + AddressType other_size = iterator_high->first - other_base + 1; + BPLOG(INFO) << "StoreRange failed, an existing range contains or " + "extends higher than the new range: new " << + HexString(base) << "+" << HexString(size) << + ", existing " << + HexString(other_base) << "+" << HexString(other_size); + return false; + } + } + + // Store the range in the map by its high address, so that lower_bound can + // be used to quickly locate a range by address. + map_.insert(MapValue(high, Range(base, entry))); + return true; +} + + +template +bool RangeMap::RetrieveRange( + const AddressType &address, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) const { + BPLOG_IF(ERROR, !entry) << "RangeMap::RetrieveRange requires |entry|"; + assert(entry); + + MapConstIterator iterator = map_.lower_bound(address); + if (iterator == map_.end()) + return false; + + // The map is keyed by the high address of each range, so |address| is + // guaranteed to be lower than the range's high address. If |range| is + // not directly preceded by another range, it's possible for address to + // be below the range's low address, though. When that happens, address + // references something not within any range, so return false. + if (address < iterator->second.base()) + return false; + + *entry = iterator->second.entry(); + if (entry_base) + *entry_base = iterator->second.base(); + if (entry_size) + *entry_size = iterator->first - iterator->second.base() + 1; + + return true; +} + + +template +bool RangeMap::RetrieveNearestRange( + const AddressType &address, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) const { + BPLOG_IF(ERROR, !entry) << "RangeMap::RetrieveNearestRange requires |entry|"; + assert(entry); + + // If address is within a range, RetrieveRange can handle it. + if (RetrieveRange(address, entry, entry_base, entry_size)) + return true; + + // upper_bound gives the first element whose key is greater than address, + // but we want the first element whose key is less than or equal to address. + // Decrement the iterator to get there, but not if the upper_bound already + // points to the beginning of the map - in that case, address is lower than + // the lowest stored key, so return false. + MapConstIterator iterator = map_.upper_bound(address); + if (iterator == map_.begin()) + return false; + --iterator; + + *entry = iterator->second.entry(); + if (entry_base) + *entry_base = iterator->first; + if (entry_size) + *entry_size = iterator->first - iterator->second.base() + 1; + + return true; +} + + +template +bool RangeMap::RetrieveRangeAtIndex( + int index, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) const { + BPLOG_IF(ERROR, !entry) << "RangeMap::RetrieveRangeAtIndex requires |entry|"; + assert(entry); + + if (index >= GetCount()) { + BPLOG(ERROR) << "Index out of range: " << index << "/" << GetCount(); + return false; + } + + // Walk through the map. Although it's ordered, it's not a vector, so it + // can't be addressed directly by index. + MapConstIterator iterator = map_.begin(); + for (int this_index = 0; this_index < index; ++this_index) + ++iterator; + + *entry = iterator->second.entry(); + if (entry_base) + *entry_base = iterator->first; + if (entry_size) + *entry_size = iterator->first - iterator->second.base() + 1; + + return true; +} + + +template +int RangeMap::GetCount() const { + return map_.size(); +} + + +template +void RangeMap::Clear() { + map_.clear(); +} + + +} // namespace google_breakpad + + +#endif // PROCESSOR_RANGE_MAP_INL_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/range_map.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/range_map.h new file mode 100644 index 00000000..a7b67412 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/range_map.h @@ -0,0 +1,126 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// range_map.h: Range maps. +// +// A range map associates a range of addresses with a specific object. This +// is useful when certain objects of variable size are located within an +// address space. The range map makes it simple to determine which object is +// associated with a specific address, which may be any address within the +// range associated with an object. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_RANGE_MAP_H__ +#define PROCESSOR_RANGE_MAP_H__ + + +#include + + +namespace google_breakpad { + + +template +class RangeMap { + public: + RangeMap() : map_() {} + + // Inserts a range into the map. Returns false for a parameter error, + // or if the location of the range would conflict with a range already + // stored in the map. + bool StoreRange(const AddressType &base, + const AddressType &size, + const EntryType &entry); + + // Locates the range encompassing the supplied address. If there is + // no such range, returns false. entry_base and entry_size, if non-NULL, + // are set to the base and size of the entry's range. + bool RetrieveRange(const AddressType &address, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) const; + + // Locates the range encompassing the supplied address, if one exists. + // If no range encompasses the supplied address, locates the nearest range + // to the supplied address that is lower than the address. Returns false + // if no range meets these criteria. entry_base and entry_size, if + // non-NULL, are set to the base and size of the entry's range. + bool RetrieveNearestRange(const AddressType &address, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) + const; + + // Treating all ranges as a list ordered by the address spaces that they + // occupy, locates the range at the index specified by index. Returns + // false if index is larger than the number of ranges stored. entry_base + // and entry_size, if non-NULL, are set to the base and size of the entry's + // range. + // + // RetrieveRangeAtIndex is not optimized for speedy operation. + bool RetrieveRangeAtIndex(int index, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) + const; + + // Returns the number of ranges stored in the RangeMap. + int GetCount() const; + + // Empties the range map, restoring it to the state it was when it was + // initially created. + void Clear(); + + private: + class Range { + public: + Range(const AddressType &base, const EntryType &entry) + : base_(base), entry_(entry) {} + + AddressType base() const { return base_; } + EntryType entry() const { return entry_; } + + private: + // The base address of the range. The high address does not need to + // be stored, because RangeMap uses it as the key to the map. + const AddressType base_; + + // The entry corresponding to a range. + const EntryType entry_; + }; + + // Convenience types. + typedef std::map AddressToRangeMap; + typedef typename AddressToRangeMap::const_iterator MapConstIterator; + typedef typename AddressToRangeMap::value_type MapValue; + + // Maps the high address of each range to a EntryType. + AddressToRangeMap map_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_RANGE_MAP_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/scoped_ptr.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/scoped_ptr.h new file mode 100644 index 00000000..0d4f7fd3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/scoped_ptr.h @@ -0,0 +1,335 @@ +// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. +// Copyright (c) 2001, 2002 Peter Dimov +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +// See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation. +// + +// scoped_ptr mimics a built-in pointer except that it guarantees deletion +// of the object pointed to, either on destruction of the scoped_ptr or via +// an explicit reset(). scoped_ptr is a simple solution for simple needs; +// use shared_ptr or std::auto_ptr if your needs are more complex. + +// *** NOTE *** +// If your scoped_ptr is a class member of class FOO pointing to a +// forward declared type BAR (as shown below), then you MUST use a non-inlined +// version of the destructor. The destructor of a scoped_ptr (called from +// FOO's destructor) must have a complete definition of BAR in order to +// destroy it. Example: +// +// -- foo.h -- +// class BAR; +// +// class FOO { +// public: +// FOO(); +// ~FOO(); // Required for sources that instantiate class FOO to compile! +// +// private: +// scoped_ptr bar_; +// }; +// +// -- foo.cc -- +// #include "foo.h" +// FOO::~FOO() {} // Empty, but must be non-inlined to FOO's class definition. + +// scoped_ptr_malloc added by Google +// When one of these goes out of scope, instead of doing a delete or +// delete[], it calls free(). scoped_ptr_malloc is likely to see +// much more use than any other specializations. + +// release() added by Google +// Use this to conditionally transfer ownership of a heap-allocated object +// to the caller, usually on method success. + +#ifndef PROCESSOR_SCOPED_PTR_H__ +#define PROCESSOR_SCOPED_PTR_H__ + +#include // for std::ptrdiff_t +#include // for assert +#include // for free() decl + +namespace google_breakpad { + +template +class scoped_ptr { + private: + + T* ptr; + + scoped_ptr(scoped_ptr const &); + scoped_ptr & operator=(scoped_ptr const &); + + public: + + typedef T element_type; + + explicit scoped_ptr(T* p = 0): ptr(p) {} + + ~scoped_ptr() { + typedef char type_must_be_complete[sizeof(T)]; + delete ptr; + } + + void reset(T* p = 0) { + typedef char type_must_be_complete[sizeof(T)]; + + if (ptr != p) { + delete ptr; + ptr = p; + } + } + + T& operator*() const { + assert(ptr != 0); + return *ptr; + } + + T* operator->() const { + assert(ptr != 0); + return ptr; + } + + bool operator==(T* p) const { + return ptr == p; + } + + bool operator!=(T* p) const { + return ptr != p; + } + + T* get() const { + return ptr; + } + + void swap(scoped_ptr & b) { + T* tmp = b.ptr; + b.ptr = ptr; + ptr = tmp; + } + + T* release() { + T* tmp = ptr; + ptr = 0; + return tmp; + } + + private: + + // no reason to use these: each scoped_ptr should have its own object + template bool operator==(scoped_ptr const& p) const; + template bool operator!=(scoped_ptr const& p) const; +}; + +template inline +void swap(scoped_ptr& a, scoped_ptr& b) { + a.swap(b); +} + +template inline +bool operator==(T* p, const scoped_ptr& b) { + return p == b.get(); +} + +template inline +bool operator!=(T* p, const scoped_ptr& b) { + return p != b.get(); +} + +// scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to +// is guaranteed, either on destruction of the scoped_array or via an explicit +// reset(). Use shared_array or std::vector if your needs are more complex. + +template +class scoped_array { + private: + + T* ptr; + + scoped_array(scoped_array const &); + scoped_array & operator=(scoped_array const &); + + public: + + typedef T element_type; + + explicit scoped_array(T* p = 0) : ptr(p) {} + + ~scoped_array() { + typedef char type_must_be_complete[sizeof(T)]; + delete[] ptr; + } + + void reset(T* p = 0) { + typedef char type_must_be_complete[sizeof(T)]; + + if (ptr != p) { + delete [] ptr; + ptr = p; + } + } + + T& operator[](std::ptrdiff_t i) const { + assert(ptr != 0); + assert(i >= 0); + return ptr[i]; + } + + bool operator==(T* p) const { + return ptr == p; + } + + bool operator!=(T* p) const { + return ptr != p; + } + + T* get() const { + return ptr; + } + + void swap(scoped_array & b) { + T* tmp = b.ptr; + b.ptr = ptr; + ptr = tmp; + } + + T* release() { + T* tmp = ptr; + ptr = 0; + return tmp; + } + + private: + + // no reason to use these: each scoped_array should have its own object + template bool operator==(scoped_array const& p) const; + template bool operator!=(scoped_array const& p) const; +}; + +template inline +void swap(scoped_array& a, scoped_array& b) { + a.swap(b); +} + +template inline +bool operator==(T* p, const scoped_array& b) { + return p == b.get(); +} + +template inline +bool operator!=(T* p, const scoped_array& b) { + return p != b.get(); +} + + +// This class wraps the c library function free() in a class that can be +// passed as a template argument to scoped_ptr_malloc below. +class ScopedPtrMallocFree { + public: + inline void operator()(void* x) const { + free(x); + } +}; + +// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a +// second template argument, the functor used to free the object. + +template +class scoped_ptr_malloc { + private: + + T* ptr; + + scoped_ptr_malloc(scoped_ptr_malloc const &); + scoped_ptr_malloc & operator=(scoped_ptr_malloc const &); + + public: + + typedef T element_type; + + explicit scoped_ptr_malloc(T* p = 0): ptr(p) {} + + ~scoped_ptr_malloc() { + typedef char type_must_be_complete[sizeof(T)]; + free_((void*) ptr); + } + + void reset(T* p = 0) { + typedef char type_must_be_complete[sizeof(T)]; + + if (ptr != p) { + free_((void*) ptr); + ptr = p; + } + } + + T& operator*() const { + assert(ptr != 0); + return *ptr; + } + + T* operator->() const { + assert(ptr != 0); + return ptr; + } + + bool operator==(T* p) const { + return ptr == p; + } + + bool operator!=(T* p) const { + return ptr != p; + } + + T* get() const { + return ptr; + } + + void swap(scoped_ptr_malloc & b) { + T* tmp = b.ptr; + b.ptr = ptr; + ptr = tmp; + } + + T* release() { + T* tmp = ptr; + ptr = 0; + return tmp; + } + + private: + + // no reason to use these: each scoped_ptr_malloc should have its own object + template + bool operator==(scoped_ptr_malloc const& p) const; + template + bool operator!=(scoped_ptr_malloc const& p) const; + + static FreeProc const free_; +}; + +template +FP const scoped_ptr_malloc::free_ = FP(); + +template inline +void swap(scoped_ptr_malloc& a, scoped_ptr_malloc& b) { + a.swap(b); +} + +template inline +bool operator==(T* p, const scoped_ptr_malloc& b) { + return p == b.get(); +} + +template inline +bool operator!=(T* p, const scoped_ptr_malloc& b) { + return p != b.get(); +} + +} // namespace google_breakpad + +#endif // PROCESSOR_SCOPED_PTR_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/simple_symbol_supplier.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/simple_symbol_supplier.h new file mode 100644 index 00000000..dff6a512 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/simple_symbol_supplier.h @@ -0,0 +1,125 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// simple_symbol_supplier.h: A simple SymbolSupplier implementation +// +// SimpleSymbolSupplier is a straightforward implementation of SymbolSupplier +// that stores symbol files in a filesystem tree. A SimpleSymbolSupplier is +// created with one or more base directories, which are the root paths for all +// symbol files. Each symbol file contained therein has a directory entry in +// the base directory with a name identical to the corresponding debugging +// file (pdb). Within each of these directories, there are subdirectories +// named for the debugging file's identifier. For recent pdb files, this is +// a concatenation of the pdb's uuid and age, presented in hexadecimal form, +// without any dashes or separators. The uuid is in uppercase hexadecimal +// and the age is in lowercase hexadecimal. Within that subdirectory, +// SimpleSymbolSupplier expects to find the symbol file, which is named +// identically to the debug file, but with a .sym extension. If the original +// debug file had a name ending in .pdb, the .pdb extension will be replaced +// with .sym. This sample hierarchy is rooted at the "symbols" base +// directory: +// +// symbols +// symbols/test_app.pdb +// symbols/test_app.pdb/63FE4780728D49379B9D7BB6460CB42A1 +// symbols/test_app.pdb/63FE4780728D49379B9D7BB6460CB42A1/test_app.sym +// symbols/kernel32.pdb +// symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542 +// symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym +// +// In this case, the uuid of test_app.pdb is +// 63fe4780-728d-4937-9b9d-7bb6460cb42a and its age is 1. +// +// This scheme was chosen to be roughly analogous to the way that +// symbol files may be accessed from Microsoft Symbol Server. A hierarchy +// used for Microsoft Symbol Server storage is usable as a hierarchy for +// SimpleSymbolServer, provided that the pdb files are transformed to dumped +// format using a tool such as dump_syms, and given a .sym extension. +// +// SimpleSymbolSupplier will iterate over all root paths searching for +// a symbol file existing in that path. +// +// SimpleSymbolSupplier supports any debugging file which can be identified +// by a CodeModule object's debug_file and debug_identifier accessors. The +// expected ultimate source of these CodeModule objects are MinidumpModule +// objects; it is this class that is responsible for assigning appropriate +// values for debug_file and debug_identifier. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__ +#define PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__ + +#include +#include + +#include "google_breakpad/processor/symbol_supplier.h" + +namespace google_breakpad { + +using std::string; +using std::vector; + +class CodeModule; + +class SimpleSymbolSupplier : public SymbolSupplier { + public: + // Creates a new SimpleSymbolSupplier, using path as the root path where + // symbols are stored. + explicit SimpleSymbolSupplier(const string &path) : paths_(1, path) {} + + // Creates a new SimpleSymbolSupplier, using paths as a list of root + // paths where symbols may be stored. + explicit SimpleSymbolSupplier(const vector &paths) : paths_(paths) {} + + virtual ~SimpleSymbolSupplier() {} + + // Returns the path to the symbol file for the given module. See the + // description above. + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file); + + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data); + protected: + SymbolResult GetSymbolFileAtPathFromRoot(const CodeModule *module, + const SystemInfo *system_info, + const string &root_path, + string *symbol_file); + + private: + vector paths_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stack_frame_info.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stack_frame_info.h new file mode 100644 index 00000000..052a9338 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stack_frame_info.h @@ -0,0 +1,126 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stack_frame_info.h: Holds debugging information about a stack frame. +// +// This structure is specific to Windows debugging information obtained +// from pdb files using the DIA API. +// +// Author: Mark Mentovai + + +#ifndef PROCESSOR_STACK_FRAME_INFO_H__ +#define PROCESSOR_STACK_FRAME_INFO_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +struct StackFrameInfo { + public: + enum Validity { + VALID_NONE = 0, + VALID_PARAMETER_SIZE = 1, + VALID_ALL = -1 + }; + + StackFrameInfo() : valid(VALID_NONE), + prolog_size(0), + epilog_size(0), + parameter_size(0), + saved_register_size(0), + local_size(0), + max_stack_size(0), + allocates_base_pointer(0), + program_string() {} + + StackFrameInfo(u_int32_t set_prolog_size, + u_int32_t set_epilog_size, + u_int32_t set_parameter_size, + u_int32_t set_saved_register_size, + u_int32_t set_local_size, + u_int32_t set_max_stack_size, + int set_allocates_base_pointer, + const std::string set_program_string) + : valid(VALID_ALL), + prolog_size(set_prolog_size), + epilog_size(set_epilog_size), + parameter_size(set_parameter_size), + saved_register_size(set_saved_register_size), + local_size(set_local_size), + max_stack_size(set_max_stack_size), + allocates_base_pointer(set_allocates_base_pointer), + program_string(set_program_string) {} + + // CopyFrom makes "this" StackFrameInfo object identical to "that". + void CopyFrom(const StackFrameInfo &that) { + valid = that.valid; + prolog_size = that.prolog_size; + epilog_size = that.epilog_size; + parameter_size = that.parameter_size; + saved_register_size = that.saved_register_size; + local_size = that.local_size; + max_stack_size = that.max_stack_size; + allocates_base_pointer = that.allocates_base_pointer; + program_string = that.program_string; + } + + // Clears the StackFrameInfo object so that users will see it as though + // it contains no information. + void Clear() { + valid = VALID_NONE; + program_string.erase(); + } + + // Identifies which fields in the structure are valid. This is of + // type Validity, but it is defined as an int because it's not + // possible to OR values into an enumerated type. Users must check + // this field before using any other. + int valid; + + // These values come from IDiaFrameData. + u_int32_t prolog_size; + u_int32_t epilog_size; + u_int32_t parameter_size; + u_int32_t saved_register_size; + u_int32_t local_size; + u_int32_t max_stack_size; + + // Only one of allocates_base_pointer or program_string will be valid. + // If program_string is empty, use allocates_base_pointer. + bool allocates_base_pointer; + std::string program_string; +}; + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACK_FRAME_INFO_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_amd64.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_amd64.h new file mode 100644 index 00000000..a3e11358 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_amd64.h @@ -0,0 +1,80 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_amd64.h: amd64-specific stackwalker. +// +// Provides stack frames given amd64 register context and a memory region +// corresponding to a amd64 stack. +// +// Author: Mark Mentovai, Ted Mielczarek + + +#ifndef PROCESSOR_STACKWALKER_AMD64_H__ +#define PROCESSOR_STACKWALKER_AMD64_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerAMD64 : public Stackwalker { + public: + // context is a amd64 context object that gives access to amd64-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerAMD64(const SystemInfo *system_info, + const MDRawContextAMD64 *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + private: + // Implementation of Stackwalker, using amd64 context (stack pointer in %rsp, + // stack base in %rbp) and stack conventions (saved stack pointer at 0(%rbp)) + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextAMD64 *context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_AMD64_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_ppc.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_ppc.h new file mode 100644 index 00000000..3d312419 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_ppc.h @@ -0,0 +1,81 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_ppc.h: ppc-specific stackwalker. +// +// Provides stack frames given ppc register context and a memory region +// corresponding to a ppc stack. +// +// Author: Mark Mentovai + + +#ifndef PROCESSOR_STACKWALKER_PPC_H__ +#define PROCESSOR_STACKWALKER_PPC_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerPPC : public Stackwalker { + public: + // context is a ppc context object that gives access to ppc-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerPPC(const SystemInfo *system_info, + const MDRawContextPPC *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + private: + // Implementation of Stackwalker, using ppc context (stack pointer in %r1, + // saved program counter in %srr0) and stack conventions (saved stack + // pointer at 0(%r1), return address at 8(0(%r1)). + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextPPC *context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_PPC_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_sparc.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_sparc.h new file mode 100644 index 00000000..f051e5bb --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_sparc.h @@ -0,0 +1,86 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_sparc.h: sparc-specific stackwalker. +// +// Provides stack frames given sparc register context and a memory region +// corresponding to an sparc stack. +// +// Author: Michael Shang + + +#ifndef PROCESSOR_STACKWALKER_SPARC_H__ +#define PROCESSOR_STACKWALKER_SPARC_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerSPARC : public Stackwalker { + public: + // context is a sparc context object that gives access to sparc-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerSPARC(const SystemInfo *system_info, + const MDRawContextSPARC *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + private: + // Implementation of Stackwalker, using x86 context (%ebp, %esp, %eip) and + // stack conventions (saved %ebp at [%ebp], saved %eip at 4[%ebp], or + // alternate conventions as guided by stack_frame_info_). + // Implementation of Stackwalker, using ppc context (stack pointer in %r1, + // saved program counter in %srr0) and stack conventions (saved stack + // pointer at 0(%r1), return address at 8(0(%r1)). + // Implementation of Stackwalker, using sparc context (%fp, %sp, %pc) and + // stack conventions (saved %sp at) + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextSPARC *context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_SPARC_H__ diff --git a/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_x86.h b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_x86.h new file mode 100644 index 00000000..14b9e8b9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/include/google_breakpad/processor/stackwalker_x86.h @@ -0,0 +1,82 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_x86.h: x86-specific stackwalker. +// +// Provides stack frames given x86 register context and a memory region +// corresponding to an x86 stack. +// +// Author: Mark Mentovai + + +#ifndef PROCESSOR_STACKWALKER_X86_H__ +#define PROCESSOR_STACKWALKER_X86_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + + +class StackwalkerX86 : public Stackwalker { + public: + // context is an x86 context object that gives access to x86-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerX86(const SystemInfo *system_info, + const MDRawContextX86 *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + private: + // Implementation of Stackwalker, using x86 context (%ebp, %esp, %eip) and + // stack conventions (saved %ebp at [%ebp], saved %eip at 4[%ebp], or + // alternate conventions as guided by stack_frame_info_). + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextX86 *context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_X86_H__ diff --git a/thirdparty/google-breakpad/r318/lib/macx/libbreakpad.a b/thirdparty/google-breakpad/r318/lib/macx/libbreakpad.a new file mode 100644 index 0000000000000000000000000000000000000000..b8f80b2fb17a7540d85bba0bbc1b2d6d0e42f6e8 GIT binary patch literal 3008416 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%0Apt9> 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⪚VWi~}^mbGg3WtGX;n$!K) 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

&4mYbLd{HrLd( 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%0DCX81d7T|MXGsw>hhnjzGV5pFJ7v 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%0DKMdtn-r_(kw&#B50EsMq7wchGOxu;% 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�$?<6e;)edx0lbK`0=EP!y0%pkmpqz zuf;1*|My6gUU^1+1RVE@+~`aHN%U&Fdex6!eS}$(oBL5Pkgf**3ZWr`#4CQ`ZSJeh z!N4pPx>baT+{%rfR|AAu!>hhv8n4F2;?OJEsac2keGp>2^7NlY4!rV=;wQy%ugHxa z#HJ{A4Lk;R^1kX%uZ|M0UJeHQYVbO=B_V^vtBX9Z0(&VDIK&1HX8m5|h}<=M7@~bw zq3~; z?ST6BZ%pt)0U~$J0n4|Q!mrWRKLV!lZ9^;?edEr`o^QY7wfN>GaThu8%`=V548(mS zH#!L$HQ06X@9NtH^ldig?=E)L4zz=)`|J-aB_t|)F$+&NBxVT)z7yXf>f7;1C=?)a z*Br8Zdle52*w%BqW%SF0#w+f&Y$7m$cY!>wUg5QP|a z^l;M=^l)b|FhV_?4h12D#KS9N9`aFnFtA5GyjtXl+%78Y^e$c<*y@NJX&HkiI~nHx9v z-C!U~ZQg~6b;uy`?bDcVnc~|vmD?_IMD7}&<=cGW*XRRo0@L_*Pb?aJ3j%q*&E>WD z<|T0*Iq=OhjoV?weIqxT^J!waeXYLb(zi=f=-Vs7K%v_F9VXTxgT%LUF#I*;)>(Yp zta6`<9Fe=GqvhKQ;n(mDn`5YN&&HzBw?6`TzAfjq_~s?Ch#dIlnN|rL_l?}>#QllB z^@O!-Er-yz%4YO!Z!pkWZT3My$RP2pIObaq@ol5Z9V2o??wTyiw;hE)8j$DPi@X-!ywE4ffp4B^_W{R!BR4v)I?=aE^=&A9yRRvIdpj5ypf(SNf{;Pt z+lrWP{l&NSD%Vrwh}<n~@>|Sn-`ZkQd{iO+g`yd!-qc%^2f{;PtTXoF0!Q$IGmAgXZh}<;;EZ;JO zU!zVQ4W{w!tXMSq))vU~?I>Q0Z(b7LVrER=Jkve^j{8P#bXzphx3AT=;q>hT{Bd(X z2?iXsc_9>p3=-eY^}#H3!ERuL__kW*=87DVyJnc>TMqcrgI}N#IXdYErt$6KSTy=} z9+2l-Hm}7uFNxF0@u@M8ZVntcyfv^BiK0jx{}}VopQcAYj3jzF9Le*}y9k1?A3t4u zfsqtF301AfZwSp-F#uY*hpf>FhEughw1*@Sx9H$i_?i2KI}sDVlhnH}>@ujKx&y7f&I zDG{rwkx4ZeUxboIr()wia;{E)Bz+O9nS3mIopC*hBrzMbo4zGAn@UaWdef~l^2COH zmb8=lTz5X1Qcf&#np$7pGCY1aalyO*vWmwC;KbiC7F=IoT7tp$gR_KXGDWgmalj-SP}hNMNF*P^X_05ndw& zl=HcbsV_z-mRP*1n3AvCMkFv1N3vT`>V89I8W*aWc)angFHg0NPHsU#Ur|Ei>eB(S zcw#lpuyl0g>xfh)7j@@Jf!O5 zLxIHMzBv?ogd>Fk3g!`vSKueevqNSmkT_2(fRK4RjM`ibbDgvBhhQoJ-!3?!=TQ23g!}wQE)xML_6eK1rmpE;!?rQ zcy8q!hd%^Y5Oh^Ak|4(p8KOYqyrW<|U&r}O!MOz7@0HrlAmGBw1QOCtfy7y*;2b>b zbg=h^h&3nR#yyPlHK?=K4*6Vx#JLT!6l=m4f$mqpO@*9Q3SJ@L_I4DLkZlSi&O}6H z$lFxFU5yC1La1|_g5MD=wnH9JAaT0k@jB!D5!4x~;C6zE3VuPr4Ff4AA$|oC=ScjP z!jK@SbB2Nff*b{x6AZFLMk|mw+#`_+iuj@v7rrI9fFJ{Z2)YxTsz5?IE08!ZC>V&r zxbv=plL-zeNF(^h4oL-vswK{Y3Qok7#Cb{qw}f=IDA-5vsvYv40*OEvaJn6m zr9k3rRgjAZXwLfzP9r#|;5dRG?2y*rFdd2Wu!8n@y68Ns;9JIdRl#Qj@7N&`1rq0G zM5MOwso)+3ZxgIk@G`+#J7lv0iE|a6>QceqL7fT(PZBIp@F>BZcF02tBu;NU45xw( zpw1-<77-LGs3It_L*^)uINV5>3iQBlZF1m!?h*1r_YwE603+SJ(Ty<~Kqk%ucxpZd zlzm3+_qxfgYStNlN8?=f_Tj^sNG7ENeh#m-S2=pDpSG7Z;>Qn^wZnF~Ez%=x-PQ@e zPower_Zj%p6!--EuH@kZZLpt@FOEM3UWd3iME(Wj74>kRWzywJmnywo>0G7PBmQJx zJpMH0k5-z4@G(|+N9DHyzn#U$OQ8vNe1bw}`fn?JQR&l4|Dbfa(uGR>N+)7}=A$kB zBb472{9Sk=ghTwz1h)M@Qsuryt!4UArT7J`{rzt&3X%nSi;5HO{lQ<|-`ozfJg z`>{_m-yiYvb2l1S+Vvdxd+~(bVouM>O>3F3Bly+2_4t?)g`neA@ z)5Si};nfy@7qFe~26QEqdtB*nl-{AVO6hE+g-S;#?E!s%vh-&vzXka7E&g}MB&Pcj z`aq`phSE(+*C>5d>2H*BUunvhDV+d)b1nVDlz%q(<1D_fM!H9++*jztsc)aszbk!N z=_aL*V;|~EEPanC|5r+HKseVw_sVsO@`r(+Y4Ohow)4G%${nw?nbNN?I-y-rrSB`{ z5QhA9O7B+st28Iv-b$w&_&fZn?b$O8*iQEnjdy|4E=t=gJx*y$r3W$gV!FGPu2y?ReH11 zN~M#OUaXY+cAsJC=Uxhop9=ndGZ>J5;fEs=)7^(D0p;FQ`hwD@l>T1ngGzs?v{LCL z=zG`FKU(?S!1wkaV}ISTM!IP#cNlXTrvItZ50r8b7V@_%U9I#%rN6}fh+G%ntEV?A ze}v0tLG1IEyv_pqNJU$OG^|4sSW10$Sn@gD)U({)u2`yq;+ z>y&bTSNv~&snVfJdm{ePmcGu)KT#?6FbTJ`!av7U96`-@V*kJ0cnQk0?)IQ4&|^lhcvm2Ob_n9`+6=QYQEd6xb%<&OcM zdrEluItck+S6lqWz;?RWuUzy@RXSej zaHZU5mg!_GZKpIvDfiiX)Y88j5A-Pi9Qb~VzZ%$1_kNWNDdqm-j5kARp3?D32Po~R zG#&b;S^6F2e~5kMdRTnyYnzbn>v(+0bY4=rS}FF&6aJk_x!*12W+^REdWF(~N;^S+ zM=QOy%KsLRW%pY1rGEq4{_jEsr2cJ6*D8HX=`y8vDxHV;f420^RDPb)p$O;qjyR-W z>aBcq3t|1Gm`M3g=eRpZc0LYn8XZZ-|=?cv61#t-GCFOjUKFVDU{1})x zmIoj-4j5B6!E=B|1J7b)g!2nF{15ZnPU6u3nZP5ga14{f{1A`f{Xo&}IvC3H`(+11 z0{MoI`r#Lc)DDJ44u)zDhLH}Y9uB5u4yHm*2Fl@RILP0qJMbFymHE(v*Eo5cr!usM z<$E;R9Qwk?;okmf3$5#iD1&yBemthv!*GpD`DU7SA=pX7A3yld;oAFVy03M8mv#N9 zb^VET{U7VPB@*!T+-ULtW?fIWu9+XSi3jpGcFkd_$6q7YigdZ0__AGzD{h%(w(9!k zy4G?-^?kmL?|fy=9&3@UnkzD4bsw{+5Wd~6z3Nqb38na&K(!als;Sdku*fXIv$yp-aRMzIvzc9y7w{P$K!iizzI`cSM}fi`{5#fds> zeGPrPzkeitQbp%7X^hb^8oq31e*B1U_vfRNUW7ys71-9JjDN(p`^QZ--^1UII&L3u zPs*G;tsk+)T56WrmH1?5g1(Jjn2%_95$}9Zcj+>|m0orFaPa(C*@Z9IFU_H3MrPz9=!K+P`Qnrf zCp%jL4}sq#@~GiPegJi=vKUj|2@Eq9b>PjmbT8(XDH~2g%oP%IhQ{11F$cwBuC!vl zg?dxnJbE13L`ixpzs!J!Rifb>)o`n57#Gv9+S0JZXm|~^L^N!ZpEkAx)#8-IMUPb@&=Cdwgg@k4QHr^8%0APreUY0VWH8$Nu%V$jtv}B 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

VuWhpXi`?{ww_OlR<3!RX?Grsn0? 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 V!Rc*yan{o4!71FZaVc)3~bG*#ni(R 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�GR6fsoWkhFL)TNlpbct!vAI$BI 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
m&%Ag9D-9J3{N(%(Cb%^dqk3IJ=auA3G(%(K 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 z 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 z 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 _#F^o=7sA>QuJRZ`bxaG?zCF1EX>IfYwIZ^uF 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�J{3ZpEjF# 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

FRVG1S6eY(2g9;jDzKS3dNf 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

U2l_o)NSqebl>Ev3O>g}25wCK62mkbh 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 =H?{C8Ij_OS|eHUG#Xlh|m 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

1H9;WoXnnSx%)b~2Xb!h&NJl41kY>1# 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

t|HnXfbyI<1Jv*Yi!rv0;lXi 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

X3#gk-jq5LGSoF(uNzEZ$9$%GZ3!|KRW0~J3I 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�ij6Z6`bUld5$SF>d{gI9| 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 voruY~ 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¥k-t4Mbb4F~$KBaLJE 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

J5r|TOm-Vc&H}|DpkpZDnpXi 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

G^pVK9^CknC*a5lhY-Uvqvi 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

+to( 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ⅅRw~CZnV`J1i=1yBl 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�+ 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

tk52}BaAkRYHrrwsIXcNV|9%RtK%@%&Zw~C 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 z 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πD*Ajzcolnx+##&qRd0#5 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 z%0D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 h?kHS|xE1Pz6AY_`!*?L|8};v5xm zj*K`*7!7USTx)0xd9;*AD?F@u5p@JwcMY!+`NnsZ2!OUmdc8F#qqWxDh&mF)?rc>L zoLhj%eleovkV!33bu`@+Wr>#}YOW?$N9ji?Vo+)umWt<=c;c~@JhpLTx5d+XIcugV z+-2!HkfSTcrV}aMt;;vTWaaMM(t3roW=gq`Ft&3mY>TJ;24l8INZ8Q5>kEwAfvJla z+A&Y+&P;uiskEhd3Z+Ar^cq0DHbkT<{-%N3L8d^$3G)m^3P<05LAsrtW}s=Kjjh_QuMo%dLEcc~iT zP+WuEGa~AJ)TtfH8@NhduFaZ$1c~N$$-#TB<+McN!bZ9kk$`i_Wc3f= z_6n~=9W6W1KH#GH13w#^=OI0yg>Jl`BC2I{T<<%|v4$T@59xa0CUT?;g#2uUOM1LX7$LBQ~2c4?xIyTuenxFd%vJGN8H4^D;iCG#7vr(x_-% z2U9&|(wZ`99sNffOoxgbeur}|vD-aOlLSsqTIZ9$=J z5%np~W-PeT$ux_qosGskOtah}N~N)&NfHmP?$8p0K1nCD8$8SCWOksx)a_(;jRrdz zH*27i+11npL4qmiWOgANyZG7I4E+ZiXFBSCz{Uc8Kw>=E*iqOhafqXSmBqJ1df&LEr1noi}Q&!SYu3hNJ?)v%1mgUR7V-(-wpcianIj?yiiw`;C zyO5*HtZg^3Zb*7e8Fh0qzJP&`FqSkp*jEqdKTFGfPe(=?{p7TtC+pn6C#RFUQRcfz zA0%|>gBFDPPWv`Hp$$qLwL98i3_mvnA@*~2k~YY_YCi|Kn-Og=ri?v&(^u{1X5R^I zFo|t2Nw+~0SMBHK70gmKnqU*I+RrH~GZgp>wRR53pNFX=ndFUKwJ#hAMV`C&vI}Uc z@4;33d$7s(i0Zo^B`cbIOj)?z1CyOATk5fWG)y}-uJ>e)?bF!u4@aGcbmN2OD$uye zWQWVvugWDfqW9P3c(cE{Ts_R4=(wM-R2je(+0Emx1|M`@xR(O-}3YAj-ID|TxY>Ex4>}UCiZTd)>FQ48^ET9$>=?84kK6IX%_gEKBgq|z)uORox79E#heg_ax%p_G^Ca2;+!Ek5e|#O2>9o;7G^gA4~suHC+1o1rB?8sY%x z*+!rDA?oKd0#?rS1*5+~zqhCwU@iF;AhA}le6Ly(Qkja-&1=vD3 zEL#hOtrw%J+OYL9*;){F<{O4yB|{zmFeCwnR=5gw6!}?T6im%GA?Yxa1pS(TMmQ|! zw*>U7QMI=L{USjxj5@DGotLA|O9uK9P#SG3Er_}F0S;a?P12VvEc7+RD~1X6GGeE4 zf{)45OPR3SBt6L8yR50OVX3ar=p9nR^7?`B`c_n>46m<}*EgfiqNwvm)OkJXyk^*4 z0pg+MEn_ZifX`PApS9%kO;7a}`8a;Vvc{(rd7h^|A8X(I)=2v}DI(YLWKT!O@33 zW_Ms@>`0!M8lJgH=k{_q89385tMk7vu@PScJaxC1=PrUcMPh>@V>jRAPUz zxk~&Sgh6E!s{G2P-h(3fcjNw!OvyfMo<7n%k~_P3HpAHnUHD6y=ffzz%olY&FrDTG zMyn5iB(od0U(Aiba==`F(k{_YYkNT}-P0H1;pNJB>9`v=kLhDC>ALd$WBO4S%iWE; zv)PTiE@wCHy7IahV65Z#vrg~EU8i^BdhuH6OQCjd>6#dQD0C0q-y(E>XT$KQHwA&+ zxc%AhG`1Ue1?17#ZruHtF=scfiA7WAbwuaejcXtv&lKIwWp!P_-MB%HVf#OpTieAV z2qL+qm&h_cO|(&?o4=4oI|lb<$rb?4&Rz0&_MF?f zw*g^t0Bv|c>>qinvW2z-dH-oQ64j;eNG zs%|kiIl}=%GQx4ISy^I`?tXSehTyl2rPyFT-g)#rof-dz|1!8+Y9|zcx95k(Y!q1k zH??YHWr@Rd)jPB5!MpJ7KtaQe*wlp%XISwOvAkvEAb`0I1yb0B zm|EJ0#q|D_Lpewfr1%Gh7yoW38U_b1&yf(nb`onB#b-u)b|+UY+)G9-LJ_VmGk|*(kCR&U6!-r!-}P8V;Xh4QlPM_%iBzVSsl4 z4Jz$O(&X_mdvMJ9!t>#+Ev~bVkEt(U0c(q)0#nQJB`^G#T3(tMLad#T%}ow+FBN8U zF9mgPLt&6rYMN7@%dpeHQc1D_Z@ZncjAyts`dJEpAp+-o$X;&Kwbpe4@ z>~C5j%w}$NlTCXvaaR&|k&SRz)ZGO&98ISg)VgWcM4fL8@I66;N+Tpqo)NRpj9K3V zn)ZyC`o`b1Yuu(ii&&$`<|YTZmkP7Fmx7vZ+B0LeE;^Pe+TXONv)VY)bkpKjSRp0I zdA$X%)_F!q+Uxb5kx(^(e8+av=65~;@I!oPBZR|Nzpqpe|I`JhdhN{mA?mD)I%^Gx z8jxvMk5C2H+d)^)I<(K#rE0By__mAvpc`=zjZ_H@!XBXxyKC+X$zd;42o4br%V9s1 z1OdZMb&=sv`?G$DIzLC9pQ6rs!{om}iK_RLM}M79{lW>7`boH2@8haN^`#h9q8uXX zte%}@tT-2AMY>LJroA-An^RC;EeZmQ9Y_qnc?x<35ga545Dtsr zP(c8f)|CcseM917|_w6Pv}p`5)Q8a>W5E9v8sl8LKmT< ze~}^mo=d0^>t)elS6ixc_JXyDIn85EvzSv9a|&bbJq5>s z7_}cSkHI>tY7wKt7R5B)Lj4dHJ5&#AQelS~g&l%|f(o0bG_90UykB8;?K-VFs@4N? zKw(cn*)BLy*sCeO6A=rAML4YdPS!%OTE*0GBfpQ_RR`)hg|$n985?rmk%Jp}d;sp9 z^5h7DJ5|6T92VRe0tc9^(Cr4n(jA@^>)fKZaf>0e&5UpDn-<4h0;Y=MFJ-3&g1%mY>r8 zM`{)1;!fflTP3NH)JDo0TO@Cb1$QsGS^Zs_eVeICdOC1}y9RIN4EffOY(OAai~R44 zsdn*ky|1<*z3Xgnb8pPK$Jo?0pcz{Hz9B&`a~yna=Boh|RgujAbL-q^Kr8K1f* zW?qErtrDeiR5eUwk8mj2qonHu^n)?g-hduX(4%6`12N}*gZp~oZvK&>3gDh-Lqmqy zB@Gh^d=xb2HuiGZ2k`*H!)%0y+3NmGm|8Tt!*X)7a55&QIv7rFBqyU| z&ciY1A;ZZ?an9=Eb?)e@PTkxKJF1dCd5={!^cRr$9TiR zz2so$uS|M?gOTCZjYr5$hzMfF~lnj;4UK3!?HBg#M5~M>s6>F#>&ZOm#8PwTK@#xE~?z z(r-9OB!w`>KPdUtLX@v zZ3ELXVe0nPrO5~xn#uAD8x$W=^ZFJkVcDC70x?r~E~cV}z5kHCXJd|vIWuF0fwev%D~-KQ^?OOqhRX!j5Q-Uxfek%5YPyR1-(!}&yT4p z1Nt6fG#+*4Z=LG}(4Nw|w>s}mp=>r_xV|vef$ih4b+$@pidhE7r^p#594FfEz(G3HBpw^CYECc)- z20o=ExM3g_N1anPZo`0&HtVgMw_#uv%C(jm`J(92Hctplu-y{^6QC2Q6Eg*O!@y_A z;B6TA96yph;%Mw1as94cn83^2(RS#@Urm2|qymijvSr zyc<*f<7^zX(|Gg|d5$GE%cDlRsr9>d$vucgq_d1q6Xki=o;xu33u&}taNo86M&K@J z)=;e9Xfu>~ADpPu7VQ z^w{4BAL9l#^_jk)pcqCiX&JD5YrhocFq8LK=6P#BfacK1Tl>Obf%@a!`t~lbz&y8i z9jNUq|Lt8xC@^^dWpaRD88@#-Y=Od{jBueH1bJkmuKIT>Qa&Mk2hm+o;MJ0-E*`OcBoE0(W z1H;3XAVa-d$zy9gtoC>V+k04PLBnjaB)PL$`Vft7+;1xo9)?~T|I`PWu%1PhCI^zO zZBQ=QLO3j2+oL433mj{M3|rd$_DRfH8FM~1Y?TNtF1oKkJ7~9aSJ|GuT=O{eST7*#Z^ex*qN)4KK49Y)rXVI9Z_5Iu(+*%?1Ud~ z72=dRgd{s7R=;$`udt%njm*_s@XZ|&5XI*)=d+lz%7|ijkfG*1NS!a`GN>-CqOscIkKaRh1+XpxO@SeO+8 z6Ar%P4NUEz`a0&UHb}dG29;KlG&v-0pAffJd(DL}f7nCfYBkzv9k+=LvkTPMZlj$@ ztPZld$w79d!fbY>AYNd{OMue)131YO;*c;y%=6q+6R)YqW zCP|t+EpDG4x4sKB-f405oxkzEcN^~vV%;0r+~gp;Qeif`QczaoogTM!Sv@jk`5W(4 z){{b-Zan-7+ju?6YQ6PCOr2$yZ+Y|~Mc~s)QWUdr zR^Z-Ghe9yMtS{zly^w1HYaRCln(LvhbD0bmxUQ*;H(NDq*Z_f^8%L0v%(X?IO#$>p zjZg}N!?M30N&@@v%U%#*|3|}qe=-N@_><+GgZ9?`XnZl^t-X-wY6Ts_VbKi`ba234 zWYB4E?JqIs=a}=8!FUkJv@cVr0uH61FY{-p>(!;|C;jm4Irs$;?kfl-G-wNtP={U5 z=EdajVBrwqupAyD9KsKKiQ!N?Z2uc`{)joh$DH2`lZS#5RUamg!*xFOU%Cv`@50q@ zKCU`cUmkC2U(DrkcVEmAEGT(p+`cMq{iaQw$GNXAwf^wgJ&to<8CO!iTU%+Ofs!~9 z+0`Ffdejn+3D}TNOC%?b>o%0?EsXkXt8~^^#cf^CQ7lO4#7}-Hi$5B%+S2hWtf-G8 zr}b7rTwQHMJ%tm>4Ke30Bjn>jgK7ukVO<-v`5}^Y0+RyYh?CN?js03NcJ-I()2(5g z`g?aPlD@E1ZJ_-i2|wEwl;b0*_^EB34(V$sf)i08Y#rgS0yr5ZK>%=(4-W{SDDD)- z-OVhgkUfaVPvP^O7sY`~@5d=*ucQZEy&-M{p`I#G5e^IWY=H`2_;m)V_MNwiJ1yf* zi@4L=06rI#+LyPnbqHEYp_=({PO6V3^iU^sVB~mT{*|+}R@Tv^IQS3S!iLnLIAnS=Cl?b_ZK% z4pnRY@H5(>`lcp3g_}&La0QD?j*Q#4#I4p^H+ikYFx%Qv|6mV+YfbCyk#V;cx6abU ztrW?X$gZ|T^=pf%OCC2cH=i!G@uVzBgER89?D4%NZtEhiVv#~8v$z{sQ3GOi_kdra zqz|*$Ev{~d*tOf{DfSDuX;IUiBk`V}6HXnuv1UBx;kX;II%Hz1Kq)O{~dldHt#LPv#qs}kB+O!;AS43P;Zf&hvUve!qEHN+3TG{ zT!)j5bM42<>3L#2&g|fFFUdQI1@J{h@Mw>Em<;O~%#d#Pk864U>`qUxZ=0#VQxW_G zhI$BU;JysyRYACwpLgR2GBxTUBz3bOt@iJA#`%d6kCkKN)24BPisT4l@D#~WEUb|C zntX;LTr?n{e?6pW+;~aDA^p!I7*KA^;5bu(Xd{g%U ziq>~|9f^|lU0#bj<{nih!bb1%@`JU~RaqwWA*7L9Sp|8otkUoJgd8TdIFw0gQLhwH z_p4H$7*W5U-=vx~$%5n-d1tX82DLHr^%v5pd|iY3gi`sGQu(wh%bC7;O80|E;@~Q^ z3X)hwrTg5K1XOZ8QmsK%ve*7A7?Mkcw)(=x_<{fWl+{m!^%-G(W(q<>tqR{zzY4ti zD)o6Dc)t06| zHxWo)t0+)IV0o`qlqObJ@!ew^65zQdo-Q4=r5FwboH-X-iNI$;DsYkU>lNAsZ;qaC zg?!fi!TR9`A5l@#u+sxXC`<8CnHB;_sc>1T>}{OUxnX;ZI*Auk2f2 z%*Zw@0{1=tpw+b$nZaLsJaD@6$0{4q_3Gp*v{quhrYJ)avosupKu-({I)7kj(%nP{ z7SS^KQimR~T<5`QC@A`;{kOmn8>7mUgD_kuB$8z~qKH&-y7DVQyiEfTh{ zSng-B`0rS3)hLUt8)wmE`g;})=Dc?n;bp62RCd5xVQ!Q!t)UrM5H}Zzsmn4aNvDf(0)bEC|LD4t=LrVZExmJ`Z1% z__iXxt-|BmOYogprM3Y+J*eH287r!g>L#!c;DGKQzx8G6+a}Pi2@nDh!ePgX9s=l` zDz%*vm>w(6u5!*YGE0$0on^)b+^(~|?l1O1Jlor!Gt=JcZ1(UtmfjuLPqyuDfoG2p zJj(~dcjjQN#DN|hR`@XeqOAUMd=OAE?V&lTF~c~pDa z2A0ya4TQtm#=!#XqAFFE2Ufic%S#Kw(rrs@g>AGAXn-9EaG(H0I4rVHYEJ;t%S7EnU1n_d zG-8r8g9)p@%h+Rix|cPLKOI>(_<1D;2fs{VvXtah-WvwbK;C481|JE}+}Xn1l~rml z!<_Drt}x7$%+|wnlG<<)2muJ;u-b5`0J^$L?QH}$isMy-5!huQuu=&(*}#(Jm|6E>9(_H6XBhC*0%= zaB8RFY#3;O>RLQ<=yD>MQCo<*CJ*Z}`7i|!XNkQ%-g}Yv5r_lt2#4kU29yNeM^vf( z4DX}as>7?CYYqE1g2t*%xD@%>|2Jp=>?S;N=yD=5><=gVTWe9YQP+C1P&!_sS)Zsx zP%byKs#;Gj{VA7`h=W`Z4l9@2P!i;FeU&=M$mJ2rT_@AE%lz z)4q40pya{qH4Y9B`#%EvhAMRkVC%{KxJ<8cH!({BF_)m%Si)Xov9H%SlybZWgaCwa zSUKJ=fc{;j4l{Cmlybb$$ngOXSVtt>WCJVMYm6dp$)6!mH&UWTiVu?H2u~XhCl?PP z4qPA{mWwec3EFT|l{zwySRY~Cl0bOeMU^AgqX=lM075t{pz#7|WR*HPAl93WSSNtM zIyT`Z8(2ZHP9$#0pCM2;`^7qmB*%JUJ%(I7hB$~7;jmmxK}itnEmi7xBi4yjj^h%p zi*+gptO?!KaS43Ag1g>l;B#7dFKU%E%)mt#ZZ?AN2%*1Qfm0O=EcmK$`$hK={hqL_ z=_W5+A&V@!*gnO#)%9DS!MrKsC{i`Ab1Q%od0OY>U^4lHFo|$jCZ`FLw^gYVOjAuF zlebnmLkyqOg-`3GgoiVWQ^{*MUFzo)O!_lsF-X4ki_96UAOyP$G2m_9`<0f1VN6^zE#Z*+?t( zIl>=tbt1zh4L{-?B4t{nXRFqX0NEEH(>nKse$&Vtx=CiC$orA$l!UdYin$Bp_{T1d zY)T48kUo0WGn9!y+0a=f zmfgrAaGX4gQ=YTJi}-C3FpI+Jr- zXs3T|XJ$Ohg84X^3*;+7KL0et_4LH=Tr6|vaie}Gb^@GQ}(OK6S^~xCv;~rwnfNNrof<}dCSyUAq2E`gTaJSKlJdj1q4l1E zulS?6eIdNwC^ECB-~zI}nu$d=!kH0a^LDFzi;^(PK2W8uHr>@Uj0l|Yx-nu3+|p+) z%idD-9dcU>-0dP&l(>|F=ABW&-7GU?>h(S7lGm_@y~YoDlMgrQZ4f^QyiU>#viD4V|FO-Ca9aE*Q%V}7NX{uoh ziqK%!v%#)UxCLPQ(YOBXN1NAp%}_94JyNA^$c6=ZG)JnNKy)&gp_`lr+4Dce+#*QR z9DVsu`dko5dR;(@mO%>Hg`v4MgHEd;g$#0}XedOAp(+ki$&f~>mWHBrkU|EpKuuc& zDRM_1;B6D6kr@}b_IgOrYzZ1Vsy(R%9M!r?uOHbeSe{4`ldEZ+Z^|=uYi_1)(>l8} z=ys=d)GY|0GTzEmm-W)_cn{sdndz5BOwmq}YTe%m@<618W1 zCmE`}A#Z20IFc-mOt`c#kM}AT>*4hT}|5a{N_=nx<#Y5srSe9E*J2O1^GQxCMc)m43c9&+NMjUl>ep z17G^x4F=PG&TP|xcO!vyN5V}fe6a)H93XjT!oDj(qC1+HDBPJzmWjfD*wc1L`Mzx4 zsQ+~Zrwh2Kl!I5M*sSToZF&IKJ(pmQ=Tr!GHx)_MfwE^qC1hm)8bo=aOL^JFg;n4|69GJFrFap@a>p zdUc;$J6|z3jS9f7TQjUxrvE9{+sb}8p>MT*D1kk9 z4h{`{L%cmo?dxd(<{%*Sx_^BZeHl)JiVZvrx(;-yzUuF(Pz4)Yhv^y=s2;Ueh>5g zQ>g8tSy?Kh%M>p4c%sWP{rkKMcM(nKx>WZ1BIG`lMcyKPqUlSCG=qsiA2Ji1%`=hx zP!>i8ERe?;6Tt%6xX1bm_ly%yAHur!ObCM4WkS)vhElamtmV+j&X z)cPy2_N0WG;M3>Q#N*WX{fS~?CMkDOne8o^S25X;>ymX7PIiTjX?13|TV3+8gsp2i z0JY>m_Srmp_5+2(gEWUz{2be25gDR5IJN+^SK6xHjDQPH!Po4~# z58f}$dw6CB^kohGerqby_`h_M4$1iIhNSKpQFs5OX$-vLWk*3;B?Gp z^i^ns6;WvXQ8;8ZX}bZ1tp^lM#G@q-S#2_J%-Qg`94Hyx6Xzs*x-ZHm^B4&> zFg)CoE`WPS^v2c<+1|K2*wTtq(6c}vm(+gDDWG?Wffy$z#`HwVQxOZ`2!|LeG{&b; z5}IKwFg{{1PD30w8a!e!VxxgzZ0}**S}+P=^e^5LYdQf-P67NV0nZS?2!{ncQvi<# z;Bf}9asiKP0&sUf;8GvpXOUS+P60fDfS*GwB#dxaz_U>jBs>X#CmO&nAdV8A*aYB! zgmEI-lkgm5c5@2g#|U^XVgVT8uz+7gNdP<#19*`OcxvN-=fDp{p^6T>KQ!Ps30QIp;3ohsF0fN&>#;f$uqk?+X{-bB*G|O2@_bCGiQN;G0E!UkN^h!{Yl!@Vx+h zvkksAF231~;w$y=eM@{oDEQ_O-*M0{C?TZYh8f4hy)o0A2*ZZy3N^xPaei9B^RBX@F2Y3GFz6;2jAVljp?-aL(j8)1~i3d_pMr-X*@B1s}p;@%@kBTLyef4Zhu6d`la}m+8`X zCq5w*eD4w89)b_yu=sd{77hMB@GUp^%3OTQ8^xFD(mN2J5DLBzh_9pILpUtH&Vuhl z;9FtvmAm*>G>R|NrQ5_Ogo5uQ;;RsR2#3Yz2)>oT_p!m()y4O5qxdpidN<+|Lc#Y5 z@pTt`2#3WN6@06J?^A;>=HmObQGA&$Jx+W=DEK}jzP$t=!Y;m|33=AQ$Fwcpt$SI^ zE&3L=Y13?*Z5vAQ@$rJKPj8#py;t9@TNV};;@;eC2I#B}M__RXJ-nty&8Wc_jk)A~ zsY?MaQ>k%R#7BYvH6JC9qw%n2k$6P!@4CPZ_I(!)kjF53b`7WM-b=`18TV?9wX_C4 zg0)?^XLNWa-7ssrlr*&15$w%EAtNf`Ul~!Ewq6TR{@KO#Cj5yBYx*c=(mVZ*N1^rB z>!d|_8%V{A0ydB;v8;yf@4+O&a|r8yuLhfq^$Ma|?)Mp4aZ|4776>nWwmXwQj!(6*Tnx9H8rD0+j#L$1c%3w)sx7wb=5!2 z=!1sQJq)7_93b_{t)8Wc_qDW#vT8s$8PDVgHTH@c$Xp9$TS%tP{-8$9=B`UEp>~N6 zMMuSM$G>AMnHLBo9*nuaS;+e3iubL3z! z`2_f>f!U-04V4k#DlNdX^9b-<3b5E-4{7imUV}G8d_MZjS{)?d6e?hfBA6Y5% z3s_5z+J9+q|6hyu|6c74tG-tI%5dLgs~IZOYO8gtT}XLmsr^NW8`#=jU4xr7KCiLA zKF>J%CBqO*#V{)BPwMVzmCSs+Yy!6$B+NXrzx&0kj2}HR%9bC z#MF(msfL%E!7%Hs1-sca}8jAZD4*)m{8uY zjWioo-fxIb$V7hj3VQ>jd4;K)2qY`+?}7iR+CJ8`Z=giB8BwcE1qadO?S< zi>_$=<}ag|wc$8H`CMqU2$q?CmB|xOKpeJ=61y# za&FhO6$@l}9$EAOsvgL}W!0pvdRcWcO0T!Nk`@IkQgK;TO{zq)52q=okOa?D@zjfs z(}-w~K9-elUjCf33G;FSo=3p*x^fntJ1?JP=H(UaIB|t|dy46F4cb3*0-Vg$xkn#& z;n3t9!cdtxL`pMz26>YfXlAC)XCe;Mhkg3kLUR^=s}ew8<5(xTv-3U>m;oU;F<0ED z&%joIdp7fL;-n*t7&ms(v3DPUI|twf+k5xXlaBL?98ThV`nz1TS>z-NXMHaD^@j~RZZ`fwr&YznTjmBGn=aA$=td# zi)$utAT0`hoK)=09w$}eE)8xk7hDydz?dMOyZc%<$1tb+t-PS&GHi#!acY7#-iGjE z!jWtgKdo~~gN^CZ{XB+yUtjc5I3oc5rgcu^0CFG}!pVQu8V8D-Aq!4t!!lkk*Oyp> zjU?F6UGv^#&w8M*HKN+83an(ls645NjcwFbuRqA97szscWi|EJ=!vl(sP`Y1yk<=M zhuH$Zbi;YvUCBm4!&vQLVNyYa{{vJUC4T9aPK?$i??W+z&3##esCc0nEqWp@`4ELr zgV4aO5a`9gmdP=FZDeP@-pn^Ts_ur4|Jsd4Q10q#l=}A^FmHEuLBsDp%xO+xqt~|I zZofhJm#!YGf%Nez>&rT}w#W7zxYfWd?J<1^wn;wN*M6w)z%2&0Zfd>TEubZfLu$!K z&=PH#$LO_DBkSGP$@?jvetT_*>a`^&QyK`d`K*L(e6B(dypN(;wCA zwRj6)sU?=?_Qid1kWI`0BhCZelIIh39TSUegfqSN=8ZJB^i_}cW#DItVGp;Z2j_do6j5Gtl zJw}?T7-=S(k>)_eK`;l&qn;FbMjFl@HesZh4AYpvso?}YHOv}mrfcmV$f{8DAUv%Z z!I9<=#$nn#lOs)I(`N0BQLM^8ZT4kpY}$O7W)jopnH*`drp-!&JKP0#1fIZnB=J1g z*P7QC-RPg)3K}-hxN}FEaAL|c(#*~~(wNwd8)+W0%}8@J*w7=*F=WqL(AVl5dKHk> z)El)5NWR$Deu?IIEaeIq-TuG8uwT?|eH=jq)*}lz(zvetSJ(o4k_$U

_Iw#>P9y$Sw&F{qxw5D`#aC{m-WJ_)}7nPJg8`AEN@kRY{o8y z4&x)KGyCIg01x-5XAtXtH;wx-&r3en9{`{0Zvbx2j%-4@1dzr9(hL2a+5Mea{hjAs zRF_$ETvT^qcBWqNkj(bso8`qmAH>&i9o+oMxx_fv!&p>`?zrQCqIvxX6ykdw^ZRd> zAd#)G;cgTUPlrggkk+Y%GsSXt$fbi%s9J^FD<#3LHY<2xsO; zo4l&k;(Zt;LA;+syr1=VRvGb*Mzmg^O+uijo)h)DKp#F+pBed0F6GKL(=PQGE9-_g77*`t_*J=$40Ec&1UuDAh%vjC&$!`d1 zzJNkFEGTXehY-I5sBil_YYeED3F>PoTMp3ocC@L|!zpJs?MwL~xQB;K+MWsJ6I3ho; zmYuKdJ-Qg5V{M;LPR*N4QXGKja#YEg^6Y?wB=VWs@uX(x^r)`tFwUZ+2V zhVPtWyx0p-NG{tC;Q5}ZKz|c*Kw-if*hT$`mb`N9rUb?-zb*Yz?x2Nd=kP>A=Gc8CN)cKx64-B_F8S*Fxs!S|FYWD zQf+%?scnC%ZELh-<7#Wl%B!|+)~3}~h(v9-s2xyP3$?}5^u5%<{n_bmvJ0ZeF6hj8 zCLbEy+g97x@-ru}o}bIa6Jf0_*Q2cK?*3}elZwWdDHy!p2_d=QgjiNam*8q`wDZbJ z8dk&fbatKq>3PkLv&;BP?-JF~ADL+Q`$tB0tA$1167fjj>_QG}M7f&^xBtipma4z$ zuHn`QU6Hp%@R^`pVBpAlTSRiCyI-@TD&s4ny}+3DXNAiavdSl1hMO;zwa~W>_PPLF z3C_L3O{}Nt`j8PXC`gu2&Ly>Oer%9jR%T?r*~0#}2>Vc5?QVpj2-`Y z-O3}`RC};M#RlVBRAzhuf;7feGd9=Ul6m1xW8DQfRn8 z8M=K3dN8fq*ZOpuJ$)qE2|azoeaHrg2o!Jps#+VgY@&L z=scuat-A!$fbVlC>nqR)e*XCLvSepsIv=FKgm7p~R|}@&D^$6`v@nC|8l<`jG#1`u zb!VizrHK|)FkD^!I+^a~I+Ytg_NM4SU|#FGNkX9uD9`CC^oJB5x>EI9f(^9D)4#h@pS$$(G-v8_7q2Os6{+G-JUck`xvRVN0;fJq z#ZWwpQ=bVDE^S`WQ=d8LIQDg?K6CWc=Ps;DSF0_&slw7bq=I2t@Lt{!;hbxcOZxz}vV9#eFvj;JW~La&Jmu@7l1h2(=_Sh$Oy` zs~(WVtCYlRkc9JH-1#={tcg3{#GS9>&g!`HmHE1TM`Tgo#Bl;CqE_SaVgww&7*XFL z{BlIC!DDSPqWBehK<)%`3Za>Hn5Eb?Scn1(2xq#6P4+r!_+144FLAYxf&Vt){~ULI ziaYD$&W~~Dhq$vY?yNQND+&KcfLs(&>+pDk@ZX52pAmjDqSj}@cLMPDCH$@eAK|d@ zBLe@wan;knUrhLa#GT*c&Tnz&SA#lA)PD%X-!c#>;8*}*4H3o#A;Mu1Rtv(yy;LuQ za2XL6?B#5TJAcKUKMlepC{gv^c&LKCFs!HzzzMzhOFx?F8ERSMNjx%@@%Hv68$E;# zgfnbx@({wyXeuyKIIUXs0}Ida1^!(31-=`jZ54BtpGvK7s&kF__3eCgy!7xZ_VH_U zAHNoTytdP`*~QB{eE3H(9!%@pzg9o?tMz41AiH~iHq_3&5_3Ne9Md|>6_*-Jsr9N{ zjM-n3fcbm8s2ZqgC9_P-e|?x9VI1$yoRM2tOhrW*H?7ACYp9o^cG_cAg=@ z4bIPWgGAPs-p7qgGH28KmdK{=M(Us*=YUf@Gpe!4T?n~sxCYJ*a5}PDrE@uL7=~03 zT`P~_@)&^!`7b2@UaltjpWq|>)Z_ot4F7?>PkJ}g0d#F~&(m;U-rzp2%5lLBP$r9P zfYPN5Fr_rPbIMS;JEyDwF}1+sG6;YT;x)?twAt$*8#D~UVH<{LlhH7G3 zVn_*w`PJ&MJQ(&tDyrL;Q2cucwFMmET7d3hBzNOIOtwXt%sz`ca-%HDQ02F%K;Jmt z$5h_F!LzW#Db$|e5)F%RSfTbsNl@*Vs?||OsLQC@FIGDXjCTJEG(&fL)sO@vx76*M zm!ca}FIJ;Rl$mX>3-ATA4I4N-sRh-X38If*TP#cAqsha5!UMu#c}NQn0C=q7VJUf7 zSna%0?YwN**dJu5_W*eu$V}D=cu`zrB)nQMy+8m_=-DtSGZ9|uqX(!Z5+BU$D9YgdCClda3oW56j19gX70k5Y4dr z`qI4-=SXtMt89;Aphfb$S{qVCXY1bwe0=TD64iHXGsD{cl z)Wik4L5>EXq*j7s2(4A}!dhEWj>T^_@NsxTW?EX9;jS$X?gT!bt^#aAj$kJ+C3ZZ? zMdJ#M6bCbIA&WS_& z>Aao^sn=i;e?-JibbVfuHOdD%%ep|1ZjH@*K5KuiS|E8A^g%bKUBI-%$A zwZ`qz*T7-}Gk7hbjC&9UoIO;UqJ0)Pe4{MTP#Fsxq1*E^;7@8Dx}2=FN?uoMOUf1a zO%AWb6EfG*Mt3E`zKW5emY$t8Fz)rBo$)KE+Rm;MI~ztjyQ0?CH4a0fy3Dh)i>b-i zG6U@lzrxzt^(YH=_I9uQ)+#&FnRja2B{6&Pn zwAy*sbaZ!u#!ZIYU+;#MC;lg&A(FcU3BqBK+#^Wdt5!1&lEpycE^+Qfs_s2?f3H~e zeNr{TVXGb`Rli@Yo;6jkr4W`I2|NgbE=pk@ZFWdq#L7| z6c@}*Nr*ekj|vxzJ6{KEj#$fY_~Y!6ZnDaqQOi z>7gYj7!r&LH&+@L%%n=WZbu*M)oT&#LrczuGM)xb@eHYmbToBNs(HCwW*kl6(o1iW z%N{<$=^mFcAD7z>F(ezo<$Q2SM-!eQxipTZZb`Kum(#yxxw@iH(-rXX)mE1+FWmsA!$dk2To?dOOdx&R$UQpuxwIl2c#8 ztPc;KfkMHweS^(jgochU=v}KB*QN z81o6^I0Hj_>2hJbNf@q|4&kscTrb_=qLpW^Ju9ps-+dHP} z%y1!Ix?J`b6NBreLpUr3*Gq?CWJw+jelMN>{FUy6mb%@?PLb64 zLA-Rj3iYwL7(Umzw3iOlI?1>gTrb_{bTNEOFCBIxH$1{sna-Q>BVcCYA(NR2dw)GM z!T38mN-rIbnV*t0Ub>TgjY2~?cXCooD^6hrPf>nIFWrrmyaeVP&r2s7=Xnpb zm+n*+k;hB-gLn_Vr}yB~T3ch$Ub>Z@_h1E;)brBeS6E|my>w?L)sM!QrqP(rNIIt* zOA2`De({^oZ>|ZQAtv-Y(fPb|Kh;{8)_4WyGoe4U>;qo9pKH}meiITeovuRtEGG0{ zolAS^K&_LE3AtXn|K^&I&g+?wIvo}+_PVeSDy^tPAvVq(!`RrzZuHXF*R^ zdS1F;Y9-BBkoMA@;bt%vq`h=$UwuIfaxwcYDBDZ7q1J{FJujW#kn~_!P$x5TJ?E3Q z2$)o(b3QGhTe*o3Gse7^Z`Z&<&IsC>=cQ{_r@i4DXlK9G+PX&VrTfLRv-Q+u&r642VeQQI z(w&=BE$Upa#RA&dIZ5a2q;po%XaT`wKNVL5QUbQdI5 zYs0~dy?u6T3cOD2K81>w71I)uZ*cfE8MC)Jh){#e4lDCt~iIy&v8 zlVsS;m`Zx-##AP^A`;h2hj3UVu9xnTq}tjbnFu6#y>#2KYS&ALaM-F{FWqHHwXLc8 zB?{qEBLVHD+pZ4Fx$XS5`Mh)+xq*}4>*C?=F+EgURP|^SZn_y!;gX}DZ(C&1*l44h zA|)?2MLrr$ThI1Dt7JLz>hvC4b79Ks)=9agxd5aPY_|HvqSyOZY=P1BE}aqmnFBSgto71eAnbANJ+1sA*o3{R0$+Co|2m2N(zntC|1{Q z0_C=4=P|uiwELLtW=1P{RZtE7C3m2fjFV+J!g;l1QxHu=Q9$%q54B?+L_B@%CJ@n9 z`4H_yM2`s~ghL~mB8VREp>{EdCPGHe&ZgVp_tz{Ou-X~j&NDc{(tBh_wla=c;qc8e zoM%{%b6;*|qUJY+*Og)*d;_P2amaxaW^=&E!nqT-9Oh*?IDH~Ia3MGK<7DahGMp?G zB6JeZlqGj1$4>~y2#4l)ns7Y1huYn6Jc%6dW;mYia=e@2c#hWAERH2JIp&AM=S9Ks zT)z6r<=8E!X^w?RINpOC&k&9g4$bjQ;dn|9)jq&+so_|;9G5o9v1BI4JUY@8$8I@I zb1X!{u|9hCtZkD)@c1jI~9NwZFzM!g?r<~3y z$4WV!QclN|bG*@m(?JjMao2!#g5Dgz!OZ^kLIR&fP*%$Qnq!_%8Wi-zCk+xO>NzL( z1#s@kMFt*vNinp}I-?GY@4I3J4Lj|MN^bF$m*=9TQ#j|%xzf+XLYy0MrQf|VbI}qP zFxJtwb#@(cO7HV3&I~bJ((o#}AKpBTL#wzH4vTx)w~HRjPoLFWF{{2NQEx1`fus=e zf4yUtm-7hI-96M$*wuY8B%z}L`*ZL{coK%Z``O#QMjp|_pqrcnJ-fmV#Ck}xYUYtB zUR#KxjQZ4|;qe0Uc(V)ScMr&=e(o}dJ@vw=5!m-M4f~C}uubfy!q$tm6Y8v`&<-rg z8ro4gj;RpQKhuE&g&gl16>|^Jf%j1{wi7->gNqS5r4aFO%<3plxjPYR$2FaIHIUwY z(LA}V&K4ED6p3be1X`|*toP+ih*5j4kC1ewJoJL-gF5SvBu-?N6*P1p%=hb1_4;D# zG@q4y!*(Vk-=LZQPRm#1)p8U2_gdbBRnmtjvKi~j2G93cA9kq$HulA6lI7%KbS4P| zSL@3st}ew6l3tI-3L^Y(w2X_udbJ!{jSW@r)s-ebtW)pTp)L*%_>4P#eo)5@QT{7z zj|j?{>qPV`Zkpa?X5@SglCYiXL%o3HCH-{+n;{1miuKl)b@CmPa*A8G^hB4NiLrFz zD_!<*P^!-8n-)b0!n@IH1Pg9%e}(eu)d?QPvczhg?YdyLB6H;=SCv@AeqCn^9oLSk z9L4|O_(~~_;FxRa!sg?hgc@XRL9h~5yNAV5hGsiTIa@LteX@|4&mtjZsYR2HY5n^IVW0N)VkgHdd!yG0gUSz7C}41cW{zFJ4E z(ulqnGg3cl%V@-iSS%NwS$eIxfnIBFsMkMf1-&1X%E{I12M`a%`$_Bd_qsl}+IH2y z)Ty#P1tH84WE?8j!zt-75Yr2Q<8^|9fc~{`U zP2G)(Q+ESyRXkEuX6n^p3b+y;X5LlPp4RiLSkGt{{f$^ph2MH4PORr!if;_D71;=f zwVv@P3Dy%&sXvVMd`jzyrJQKWiKLu8Q%?7k^SiO037`jniSn3)hqWPSJ&#G!<4h_@ z(|Wv;bF3%Qg!L4rp+7lu9}~NA*5j3*$9nd3t){#C{IgN(nM_uS($=4iT92f_dj1Sr z&lHixR2I-I9UL|{xYkpUHrDf(YduA2jw?-A&yy%G%X&07upZ3~t*3dKBhFKxRMA}P znTB{MUh_0Zg}=mlq}q1XEz@d)&w5(o>{hQby;WW{OLIKaN?ev`k+xgvN~Q-Z@hoVD zt|ZwiZMV>LPm?YNFkd>2%Ti27DsoN7SF1K1%y-a1^}2wj(+V7b&u3Wl?_xUL{iY*v zVmkk&>C7akA{*hbrZWpA!F2Xcsn%(Caj}x7lT10)DJPL~s#4BgDW^E?`rl@Q9spjD z#~eJYt>j#snFP$0qF{>)qoc3~`ZCGD$vb807z+}rL1vR~9GACR3Zw9XyA%`q&*OfrqbtTmHZMA~E z1WHw%tL-l%9=fuv*7hy6b)oWh)os&iD_Wn{xzfaTX}hg1=apbNoM}eN)apDJPY3dZe5Zqnq!59sm~0V+kJCE>V;L!S z&Fay1$>^q6YmRR2(}ZsRPhQZVBw>LxnB;6h+I z0L8*mg)n>#@__eiT-wv=FKFnh*GU;|^y?`c9$ zX_5lkIN|E4&_@0@J>_?hLzXt`N}!Fp5^7_)){gH%sru$><66W+JIb{-b`)*w0Bx*D zt4=;`w9|HlE@xe^98Vj6(B&k%q-|T%{YbigsPAJ(S!rUfWJ^WxkJ{Kpv~fMDN<|xc z`L$8vL>tSfjX$ycA{*hb+W0$4f;R4-QjXEa<%Bf2^wJE26%GnR=NTZE^fF1z; zD~~_%u=WgU<6n%!O&cwsjn{N2Xy{ID+%uz%UOhS5Slfg)M)PW;iQPDD^vchpjs0CM z+|PaD3jo>Uc6YaLG)X~iyyi)2BmNt0EGo*;MqLTCQCC83jA`v?21-?ztBuVO5ABF) zZR{@E*bUmaS6c1q)5dt(-b6jV*OK$*Qy+*L1B&mqvXn92H3ub0u3Uf`8P; zD$&MbQdNpJ?&sG=i4$$?N^NY-@{4SQ!)oI;C<)qFpHkIE8<$ZV4^BA;rJMs(&VZD2 z04A448@B~L0Bk3Zws=^npf+wVNhR{wffW0stuHaB?Ax=TAxhm$xw?6_uhwsk1Mgec zfp=gNy18#&-88Wqp_>C-r8~fV?j2A*J*k3!p{>=!)j*RT(7@z98#S_6BC2JQ_F?3Gq2p9a>X?OwW^U4!L#8u&lD zoMi8`U8CuCBi+HMZ@HuPNfUD=+arR1)WF`NfxD9`AsTpqUjrphG!QS?@hy3lUt}X3 zRs%brBxvB_Db?3#;Jeho!&1(nDd&)sGbrT@#4v3%up{UJpp!f-Jgojf4eTsQYeXd|)uFi>=pY^%k=7cxpJ?E}pn(UZRezrb z?w_^~(B*Uumg8w)H(gG0K-%74({(4^VW@AZqiWN{T*>x`;2$+`fN0>Jr0OFYIMAcx*}?WHfLwHSm~}b9Bl%D&-uRa*jY}Xf!YZdH|@F zM-mTfP*4N+mZTo?NRi@@w6)IFzyvjLP(}m2T5~k;s3tV<(7YOGVmCqqk90Nf2=`gv zhz1UHHPEDIX`s>?s5}ka7u;rPpsooTsB5AI9;P*-Cn(j?xf)o5cxc37S_21)2G&CZ zk4URQJ`FrPZ6Be_=@l%;)4<-koaB*d`*2OyhjhoFzQv9@1RAJ<8hE5=U|&)lC>nT# zUjrphH1J?*U_X{$WFs6_1M5%{H1NcfI@)O9+tk1lQqGW+GZ-(7Q_gWvMWcaf&;!8! z@;Cqw>-eAs9wbQzGik7Pih3pI%mN2Dp=CqzYMF`sdo81NrV_kUEZ_;v{#VR zIGKRb&36p2WvRX97HY4#rP`mY)$mwQsv)^*e;neW_9tt#KTg#CSg8G}X?46$?N3SD zr|NQ!50>Mp{a{^A^0c&lil!Svx)V^}l!~aHVXG7L6f{Z(3Y!-}GQ*1b0%lk-JL1#C z3{GIKqr?o3^P7Rhi5VP2GdPj;71;=9%wY3&k(A(LF))J%Q|e5Z!LxjS|9mX}M!P>M z8{I`Bd9eZH*;v}L_5pi;yU{MEG#7vr0xfT9qg}%efSo)m4H=x3ZhRlzChQ{N2ah0! zcT?&%$l)c*;a$kVS(0)Vr<`|E&f6*HR?`>oqef^2e$l9&FQ(ry)*M`Oi6L^kNcA0B zE%-g5p}W0r>cDQQmty8<>tcRN^7?p5Lp_EnwIqd?u9b8&a!#xkr|>F|n>O64;9H$h zq25l781Z}MApTRgLTzq{L-04o`Of>sIKHlp_&PTMx^qK3c{_FIRDi%cum7ZN0mbhc z@ihWJFl61G&fUD?ahK=y=e>FRDiizneHFh)c~jiXr1)7QTq?Xm(7KKr1eUry|Kn2Y>Umh0_<3nld zCZEEO<0nda%-h-lI~%o+y?qk|`j7-?KC^M(fMP%!cfjkmdO$Pzi)Xt1Fh^aXb{5K-Unlq2V)3lw@pb^ zZy&-|BW*hVtwx{twixr`^$FF-ME#Dd)YE zvn=H-O*!MtXfd43PfSP0^_tkZC$<<(?95glfml4QlgIV)xPheG?2{?=W3P>mWgEZR zme$s@;TG!M@)U*!d`PFQ)!LWiL!E>7a~;hb7@d~oAD#4+?I|{}*#%`i#$VohJYNcR zv!_;~Nm(TBeb81QUcKjyS5mo*S4(~4)wpycADd!!cB|cwSYUcU z9;4*(AW6|`Ua3vB+Nu=ZVhp;zV0+q{mm{~;K53%W<^@`9PF9oTX|)%!NKC5*;?<{K zt4Zb3YAb!M_FQAFCJEANv)F16K_+N5gu}MlBPa>2wmPL2m{xm(t@c&Q`7-5vk#asy zIrB}cjb&53l-+8NA{Lm&$>aYK_Z{$2RNMa{1PD!v*!2-2j!u$+NC}(O?9%k9B%9q0 z_O4ItPknZuWf2XCii#a9fJjrZfa0hq*hTcIU;zYs7X(C5Q2Bk&Irq-a%$96e{r~-Z zWF~j+J@@o`?wLDhr^{sqb%oR%sM)0UZ4GvvklLOkHD^Ss)V|IlwM8DOz3vl98mYbJ z>!PLRX}7;|q$ZP#)V^{_?WIgolLsQTS4e6z!4pUg_xVa~HXuQ2YijJpT54~S)K=G6 zKjL_0jrDzv^`@5Eqa=#AMQUd`>)K;z1x}C4+Ch?!thny=IJV_Y5#}R5z`(4`G^Dj%Od+f9>;OfEpl+IIvu>BtO z)L+}qqsFCx0g>uJ?P+Rz-`n;K+9-B>mYy|5QKgDJ69u5Hd*Fjwdvy)+vwg>m9aO;o zeHtzUB>YxkSbppM^%w@HN($#gZ{pZBNeg9cpAj5kER@B-{DF7y} zB*x%txKcC$-itDeqNC*aNri)p3%XL~Ik>#mD>9SwvJ$U=9Kyd-Lzwblw6GHJd1^#th!4NO1T?kcl zdV?OmD-&r&ScJCW?SiXnO@_0W{%niljvvH zzHg|n{WH714Ltf=8nwPgMmetUd$hv!ZD7~;ORc%FmWgoO%rAb|$CLI5Y^t@_`uxf! zQnw#u7Oy`M*SE3Oh{g>*?WYnMk|7pV0=_x4G72IKR-J~gO0qtCCUaeY7dx@gy@Oh^C8l3>@zYQwHi4|Th~b&l&31jY6JqOdlyRit1e4N^Wusso9miP;56m?e<28 zxxcWZ73OYmG560*%#{bi+=4m~(i#+ixwua<*Yz5v86VA4v4ev`cB{H+L++pi^wj?8 z-@)A8KjS+X8H?8^cl56{PRQvUObRrGfB>n;{to6c<4}z-dfw5WzF!2|@}c`w1Q$~5 zpmiNM)VeP7OPXeIDKQlhF*p?s*=@k7yNFYFD^5Wi58|nMKs$sEdruuQy?^D@(rNwi zCC+&TDE4<=u$bhgiXGrSDK}RlusIm1Vh6F1-8KzITAo$q>3HjK5vXv zv4eQX?w~Q603KQG>(n<2y4XScx@^S`WH4dfRIvjE$Nk2}^#(*0JCIJW9TYq0NEEAL z2e{9hVpZ&*A!K*f6i+0IJ86o!*a3dDuM;TdA6=f!+UotSa5b1HreX(=^~dYEN9m1P z>JNu2IQl2@(*JO{bOOcr;qWd*u_|_e`@AVu#SVst>~0>4x7QSNu>(-NeO8KPFj3sC z35pe*>=a8Up?C+P_!$@^tRMGDie3J(8Lwwmv4bl@_D&%9aWecl%J2z&cRiTrt&A>G z#=^Tj4i~w17_x2hHFXL!g@6Eo{ui-Ho6|xqGtT#i}qL4LQ>w&x2!Qpkps?=f!i$hHnJ2;|_LeX@^4vwlbPNBZ>U~(BqOXAPB z>)gc--eH%(#SRYF&p1h-`K*c^yi-RRF6{3X)wzltEU%Md2VF=jn40m5n(C*UdVbkWW5uzR%sufrr5z3UY&OrJNUAW^xA=(qSx=~)gX=c{wl3r z>(<=#+JT=&uiqtGhd#ffuAh1Inlwv$#XBHP*O6&$U0RlWZ3>n>?hu z*ughG!~a4I-~N)cip}VAF(dnHwu}r$L|~=Zfk&^I8t64sLwfx!D<~H`SdyyOs@TD| ztk<9Od}`Y6)!*0IUpSgxfTb>?^6 z&t2?bDeytDgN*ECH(<+DEi1U#f&9Vu#9&XcgCE3txY)rev7UF_)+23VJ)e^GsA31W z&)0gUgGy`>SA^^}+Irq5>scPMmW8a3Le_^N>w}QBT3gQy^ald&Vh8KJ*5fXA@H1PF z13ATdKFVS}8`4^jZq3bl9QbLh=R;*RAE@ivjMl@&4t}XK)@HOGc>?QM>$M(tv4f31 z>sha?=V!-y)+y`xr77!?Vh0}UVQOGKObuDjCRSQ5cCakfdQ`E4O>8~u#Cl}f?$y85 z+3Q`_^Bbtv#SS*I@vssj^IB*A#*=WdgXAQR1*u{Oo9oP9x!+S{Y0H5OiXCL+rI?OP zq)f*(E1M329(kdNb#k+q4i`IEEvEB<+jOK&Oy?&u9aZcA_xYO6d@-HRLiX?4bQY88 zd>XPo!Fm(2R)(yPL)I2;I?s#gxQiVWM3`J11f(f;&?4e3c2E#;f-Ps(6th~D#jFY= zaLXxM3f-EUSvm02nAJ*UP9Ll5pB}T~Rbs2?xuG9<*NF_p4m{ef64LgT5q|MW z3ie5=w!emU=t|27#XwtG+cA0f>Q)iEAfltTl0Z?!Y{hV1_rh@$S`|BJ9Wjfz9~V3L z6!W3jL5oOAv4hr_4;shC4z`GHe(cswX%pT2gLG3BJHUOux~YmCd=s*ZBPu9bM7sHP z$oeW|eHpU82w9(ptTqvqzs#bW+ojb_-I|+j zI`Grz<`+sQKUddwG@o}P(4J_(MnFIE>Sl&w2OizzNuZlN3F&4h))g*x@KvgAs$vJ7 zSU1~8ct_DL(!IJ%#O~nI&CU_C3&Y`J2T3@NZmwh<4|a{1ow?sC(&4W$ABr7xj5sxF za1euw9ds4l;U)q>ZU4ouo~Got(&itZvGgueh69L zhpg{H*0&*Rd##(_fD$0^tz5X+!OmXY(exF4fcTKB}x-~a# zbl|7a#_yCCeygrKrfTC(N*nbfk2Yp1cHq%Qo&?&+laMy<#@fNf4t_}0Mpf)!H`d0T zL>qU6HtrFzcXnyx?h$hjhQq}Ul5iYtRK*Vd5ixh?eq8L}N6d#}2fIX4iXHqzw2_M) zY%kjQty>$VO|)?b(neM60QdQ7qbhdrbI2~y+W0DIx3)iS?X{t8vskBi) z@@k{=t(o3*O0ffvHu5CUMxKPUac|ZRE_SdkRU1{YgS}ZB_Y`d`g*KWIyQfPV_lcM$ z!{K5FNjQ!+s$vIa5py5z$HflTV?Go+*ejA!?4V4vk&7L47j0bQ)<$U)ZR|nXsEQrn zK3{EA#SVT8*%ewFUnXt*HDqlHSsO#vFCl9~$ST*`n5Ni4rB@r%6g${A;w^SisdRJ4 zaB|jVI)S%LCGa+8(ak<-byK(IpqsxarQ4vcy*$c?M45cpW%O1WsGoZ@FjKJuj|TEg z&_JGvG_Wsg1Q$Ell&XQM*g;>`z}}*Py`X{pBX*@r1N%kH{tSnU9VFp68mNjLR7K2w z+>eVL{EGQd>|ozWO0k0~(LgSCP%av{!L5PPCK_mw2C8BQxX)JuRk4GuAv>To@I}(V zKSS0ZA?tVSXF}HIkTpPSV47kF`+GGoO|gTTh_~3m{z(mVW=+w+-?M07D6IzS)*Li& zi_*N!>Ke?Tf%_>9)XzN{n5o!-M+12#Xdur-8W?7c;9>`Vq-vllb`WL_+)p$x2n`$* zvG;dr;J}DEh~aRtgCrbB168qu!4Y#H_v2y*e_}oqJE)1I6gwC!8py>C28af3c59%t zi3V1a2C8BQxX)JuRk4FsVSA|7zy+j%MPaLD*eVQLEy7ko*czfWFio+8gS;A;rr5#3 z5pS`BgOVEP%$lNsh2hMVZ4XJSfx0yZ4QvsXY;J+N9+*J`|EV-kKlf>1`eFwj4dj`i zfjkpw;4sz*E_TooB>LVU45F{6i_BrHf&UZ@JP;aK7qJg=X<%){tYbJ_>>vrp(Lhz~ zAQCZaxgQrhD8hUwc5pB>&{ymrA{xlW4u*&Z7KB}|6r@cw@Bq?4RqO!w`D&mlcF;a- zN3{k%Pa4=RY_$zr#bK*W*lHcN>a_-@DRwa2tAXxf2Zu)Jm4X8~B?>IgqGgAr)iT}M zw3bo2DOv2GjZ(GN>KgZ`ocjer=3)njN758K7%tXiA4>YcIiCilwR#GV)}|IaXdVF0 z3Z^S|;8A;~7HZGblG-25YRJV7+NP?#Dt2%*t9^s0eH?0kY{VY!Qu|{f=CKUtM3{-4 zgyX2aDt2&O#5{)kaj}DTn9nJ8a5#sc8HyboCuYFK4(i1WTD#3a+QbZEWCp6(0q&D# zux+PEy5TS+-VF>5+b6;dZlm}2cT}Z6Xm@XU##1CR76(9XtEx2?=X8oB1)4%YfI!Q$ zo+8-+Xa`S<;1tP8k<91ln(>Blgz(|NVfz~JVG{A-QSiaKENopGwk`=<7l*A;+83OP z&XB@sG=^SGU!twqyXO)^97x3u8d)u**g-7Ve;MBVTX+F%Ul#Th zJGeBA0~>T`LrsNM1jP<64mUR5Q;uQ>_mtbCpf<~^U~wy|=#<3@9GRf@Vd?>NXL(id zTGAa=?BKeHDM)#W9gK~n9$s;%OY{2khP1v)w>IsoaE4*XO6Twj7dseOZrm8bNIASh zM?&bnTcVCmMBwO%|0y4=N?*HaUreX)< zBUFdLQ3>xi6#SxtiydU>fVWC0WN=)C$WYF_OrkR{gD>osm_!106+75w80m{0IN;J4 zsk_+0?W`}JVh0z8jaRkN!Z9qYqEkA{aK390+3NTR(C0JkNi%hsCaMP9Q+@}D$7`B6 zH39pCL0(3(ACFig~qcE8vD_ik!)P$bM-iC#D?WQ zYGk{P8rfBDkHTo*nFZ}D2yGNQaQNC(v4d@AVJ7b;#SX;vxjbA-v4iVmeO1K{;02Sb z=C++jQN<46$tUR5;t^Uct_oXMhOH~Y*5zUAZoOJuON_cF;yd`?h*rpVv|Pr>g^L|L z>4G}Xk?{bMv8ULu;HvT}La?JJ%2N+y@}>T=h5b$6!qN*;(bC(?SQiXGrSU#X1)lM(A&8@4BF zsXatey9P^p*t$AwjSO3pwA8rR!2^D&-7IptMK11Q2auWrHJj9~3F~49keV|hRccpf zk(#&I!Gk`Lq>f_EjbUrLmf8eNYs~UXZK8bunMwis4XOfyc5UI^1si|TIxX)K= zs@TCzVf#@nwdo|aabfGmuysS&x;|{p)>7kQ2ao%u_MpgVnp~#KWd<$=q~<`)Cbe;4 zUF-l-b4H{}?S?E;^AZ6PJJSK8_TrTcn z2hT>RKEW-T*J(pXELTp4G;vx%iMQB+)7J}(as~Rl&0Il*iyb`237ekwv$VHY#SZvB zSyO)#G(SeP=x^Tn?eJ6IT@Vh1nsXfAeeYgp!SzW7ze4qil{*${jwV!j+P zh*al`-sA31NM@)v}6gzk|Ld6b**Nd0}E_RT@>$fo>zW7~)?%rYt3nWl|7tev8 zyV$`)E|Z+=1cm)lf>%%G z%0W6E(zz3#gLL|4c98C32TNGbd)n{093|iCkKH>FeOaT`=Na3|AcJNu!^{HY9AByYS47!2e7Pce~5=Ezacnzhoj@7}O=PuQ9m zwkCwFFSP69Vh3OQBlkas@MVUlgw@QYnYk%<#Gc-_ud2T@4(n47056yuSow2=Ix4iP1a600_0uP zw`g>u#^UYCl8Ra*IuQEg`;hmZ0pvasRc#6i2GZ+;5rrwxJV1~$UTsnZgE=T-$|>!> zC}LWB41iFMeedA+^!nxdykEZ%{ry3I?}7FYn*LRw-|98cvIff8<*EkT8mP%F39Kdu zGr%Zwjrh1iA$iP>NXhmZNUu-uKYrG`Yo+mT7wOZ6j7v+p%q{!_(Rb;}tveIZy!;6Y zeA|KlCB9QdhXCH3uZH^y{zx48(X9>5PA?KShJzae2HNYujju@?zE|2%-{Mf!NRr$K z-=}|Cg?C7w&}*L$Dhi;OA5;X_Lop8n8o2%iN_oye`)8oBp$uqjDNC=EKb2)vN*N2L zZYZlY?#f9iQ=lmX1W1!gxq(Em;V)CliwD}jX!^H;e(R!v)`dx>ywIhTn?x!9;~MdY zwwx=VMD|5ZDP=0@GPjVPK`9x93`)6)lyW0+WTRUfwpl5!8fb3;H%6BOm+Q+#8%Qao zQ7h%=q?DhLQf?|ErQB2&{9P#}u1TfbCNxfmZCo?Z{zId2vxCMNs*%vBL{*V5t5E0U zi>hRulRtsPncxMkNhDnEI>#C(Ghm@%U~%Rkdn>S5L#FX?c@cgArb`2R*!{@EP8;$| z$%vM#%Ti=YU5d2pc5ZymTmVDvYhX7I4RSm4`W6F&1@$1Kpx#A>iA+t(}I#<7LQ3VQvh znsJJwv0^BkU1LSCkkIdlAx^>dLKAICpR2JiV};$Z0AuJ`u#IViPS-Kq9f@9 z9sh;n#(h#3TV02?SCd! zIfj6dw?Co5xF}zxbYlq`yh<79T5nwL@m`U z*yP_k9SDS}!z3O70-qBCm5r?ftINR4lc45Zq2@{(*qiP>WyoX2e>00!G3AqkT__mo zQhzLbx58l%DOSEZJ_0)a<{*1}t>XwBoDd5yJ#x@U87f+yQ6ptDdwPS>W*3PKPK627 zR_{P^J;OL(rU^<+@NGI{B8IcSRH({)ydFSm4{HN>n1lv#oe6R60C5Go5!<@e=X-dO z+`;)^)#5?+j$qZFCSF{Tl6PSAw2R8L3JGAacPoO*VT1iK@h-&AUEE}B<1$M> zaST#|gY8{4DYGp2SN!-XB7C@Uj)`~ouCyEz?^AE|qnP-+DvF8!WUu-i4p?1DUUgTj z23xD(Rkz}Ztm)~w5j~|mAnD#Q1i%#&mr-B9`;~gpvU>?@Xn$V&I3^ZcoV8EI#8vgC z^vNC*FHkY@#+?x3OdB+%M}UIOO}z_@+p3X;AkidL=fBiHWORG4bDw zlY}_CdqNx)6K}2BuU_dkV&bhh%F8h^HNyvPt)iHCYgKT!G%+#Sl0Ih}ja9|Op~3e4 z+E^cju_{aDm^kFM)J!q4*DX03?cDfcVwuiSZEyHd9j-U7$=iB-Q>0qY5^X(8U_Ck} z4zq@HOe~Z;enG{=VTy_KR2Uy>DM~B~6Y?kw$He=y7ZjbSamB>APwIjzCeCsFnT}Pk z3{HE>5PKl>;5iGvRo@zgM(=O8I*yH+(LVz zVi>5fhT4Nc#jIYSVnHt~JrzT(@}Z>DM(I#?$SS&jrPqkUMb;aZcE}Qk$XFmcs~7p$ z!~lx!AL`XDk)U;`d?*eu_ktf?*b71Afp1vGp3Q`b74D&4w8A~oOZhH~^bgVf8y2lw zwF-M))g=_2IfT(xan#5GY0#z)srbW(EF?C(X{p8UO-i0r48=m|r1xu8C|VaBLNXX4 zp{Q^Hq3En$F4c0mncQU(g-m)4wTD6`PZKgWWFj6WrW!S=De=_-(D68s!Zoda=Z-`T zkl1smeISr{h>!sD6%rwQgW_3}Xs<(BuGPZvVa|=unF&yq0A4DL9Kc)`6~Rot%{aC` z$m^B_4kAYrHiGH){(s->z~@fAWbQ;!1Qc!{V(Nn^rv4|%|DPFH-Aq?<>`?n)@Om-v z`lDXyUCFDxwk?zuz_8H8y=sluQe4R)M8+W*$jDt|5_h!ZNcNAR_ApQ~Y5*v?Wk82? zPO<3f0ozK8fCeq22GklY4{*ChRw(0Gk9)bN_lQE8OzWnYyc-DI%VKsf;JSoHM~Hi& zt(t&rKbWriRpwg=!LA;#*a=IE3AQ3x@B+xK738t7ClQciNpN zp0kKeSUQDGZzb6zoIlgE?_L8(Gk(Bo$I%GqeIVDA5lFlt5sixPEVMOgpDHme0`#Sd9np@_EGpZpGOGU3|aSQlBo$Sg`fp-n4v9;pOwb-rW*Y zX!&eBpmE6D-tdicd(-l{w3l&ZGhu?u_w^>0OhWj^+rCL^`CQsdmQTTeFfEeh^Iu{@ zYWaKs%V!GOEFM;TH~w(sbBPTf&`M2v$HOp{J^Fz3%V(725S8UqpkVpDx3|k0wt4xy z?f^RmnLI?uJPeuWA{<#=c@yaqx5^^ z2FUoy02xOJ8FO_z$VgXwdzgKMi;Q!9WC%zv8RyokncQTYLu8zjKN+_K?ejp!jg(q^ zo!)mGDP(le?I7buUgUl8p?#!_jPreD2uLp(=hv&5++_TR$oNnGWGvXLWuyddax7UPEM)5!<+g$hahbGAcs$ zWgz33ejwvV`sJo$gpB)YR6EFcrXNY;Is8ZOzv#5y4u|fuZK1td^M%rH^vX6C89P!+f0%u|i;Qc1WT>GY zGOn%H5M5+kLu6c&KN*J(v>QPNpGVzD4)+8h1Lstw9b_zFhl|syLdH?NA-7L(kukvTpzxeA;a4fT9DflZ1>XbUVnn1p;*7NCN<+T}|_*13qaA=uq#(6dex`9S_vg3p06$ z>9xah=l;^k<5}0M1wa0R2kJHJ+ zon;X^1U~3MUjA>B2fWfW(4o@tijL_-$Mkvwxq5ks>9x!1;C5N5deu^L_c~kEfs=p& z1e72v|F=;B$20?!sPwj?WF}EEv)(}NTOMM1?X?so;dWh*}^vP$s{Xt#gBRSEub{~5-rhKs!Q+~HEBH^F*;k4XX z-L5m357YaKM>y~O+rHfrk6@88e%c2)x7h<~E3e-1`BEee6UzWJ_$XofXuX09Y+o$R z8(aEO1IT0jKK5f8+wqh{T<2gb?OCw3*X@Jz_I$#$VDH8uj}7qQ{uSZ=IN|y=gxI-0!XgAMYaE+u_9$-rm2ok80PrKTe!}f;l~-Pq)Mq#OZeU!f(hN=Jf5A z4yWf3wsY#$cwl>XW!{{=n~sM!7{{9STwwbl>BXWwf$cG-b+jP7b|3d5_U*nS3a6La zrP@H{-JOhufqqy@?@ORrIBxJ_X}838^m~l727W@{7m(i2U--#MIf|TErJHeveq5iY z>OuBReVi`%_!c8zmg*^z>f`#r0sO{4ln4vOQLBO-$TR*Z zQ^aBDhouw)UfWZ}fUUX`e(K{~I(o&YRwyH$m`FpP(R^`+j@*-G{S~y0?1GH+F{V1N zW*=<=4t>u{KRY>{XTJv^f=`mvo~&0WKx!Yl?ZXw9_1-wJMBPI!+o@iUS=!Lu8C)*_#FYoFlLbQEVQh5=pNC*QSfBZ?0T ziZ`0Jtx?=eDBhq^e1uS(=z1)yB@~&pH)z(9fS@wqtYG>KVLDqd#eLqGcE>nfZvuv-Pq=rL53+HeH|{$M z?m+H&jXRJ#(0bgo9y6^+H3d6SH{--I`%%USCh!K4KqVL700p)7W2C*MfdzbWY-gf3 zYEaBkkl2r&lR@l4SQnWK=K&jN*d_rOa$_#ZU5pe#xDy^dktn?@!=pv+(BNJ>mK8yMyb>7FB0 z88ehP(w%V)zEW=jrv~E}7d9iw!_eE-7UW^HW0Cn;l>@Ib86^Ng2a0lNitjH$Ca5wfU+XOML~x z!&Kx}#A06{t>26K6q>ltTkH1&C@_4UX}_+uehc}Qr?kHBj}Dl!1{dQ=SFfv?dt|s* zgBs(0oEwJoPwYtiehQ{>Uk`BNz8>HQl$9F3!b*pKl;?Sa=m-fNxX+u8jrgblbgU|~ z7lDp>d%`Z)ll87Fvpz1fR+L%G%OnO({6RfcFA{Axi1xNVmE?EqLOf^G{+1B+R$ z{zUgw3*L%WSny)DEtxSbtd{l)H^{dbWI-`NuF#mKAIFBJEx8Z_Fxy+04P0wU!{4qq z?o~&%pG2G^)7UF%vQqaSRJ@Bt@NtlaSfN71ZFS?*omx1MX+fyz{|BKp_$KK@YofK##C_g6@h^aaP9SJ`N9#7i zl>@Ec%d9P08&07<_LegEmFo9cIwQ~mJWeG%ih@h(O*G?EW<8@>FoQ3&5 zJi^*yc=IiN=DRGo>r zsZW~Flm*AzVVS~-QU64Y%5LpXgs3jMlRToKE%;ZrZNWV0B+n)!$nX7|Zd#j5#qTX4 zzn3IMKoOChv`w5t{DF6MMCEUW75xwB3#=-&k)PDiV>8sL$485)%^3nh@8mtCil?IoQ#UwBx zD8qfyVw$~^=2*BtqHGX0u-sk_!e-Nk3l+neFr&Rmbm$D+ozRf+mA6&u?T2h$WE2!* zb|r0Iuvx?AWo+Io|0FBRKiLMB^L`O5 z7X+Kda^5e_(|mD;euU!njYIwibvl9^&5`B0ivJPia17-9D4-nA0_XkWDw5i&dWC{t zYTLLOQ~Slna{E&)wk5C;>spo>%#rttH+UZd@0SO3OEeJP*OpTmduaIRDvE_(9uWMD ztXS4 z`@At#`^AUK?XNVZ%*UzAKm4GlkikNw2`Lw}rS30{8UPpNuoRz}muL*ax zU&MXhxU0x{Zn^!9#{E6w@*Iu3J92)))oYnU!jT}sI7CIxuTmH{2Wa0+k@L+ea;Apo z;AZiU(w1+D4i!1$K5shy)0&nN67S44q(C4g zWRNMG_3IIRgw-M>lk=yIB?a>&68>0noy3xBDVFquA|l&(V#%LeqMf1xgDK=>99|`3 z$u+dJtjVBPxxFgsxKn+LlM!uQQ*HkOmEwc3_y$oa`M*xB{764QR5-6UB)y?zLgSDn zy`^#of2GLVrj1bbQ-BVxY1KS;bWQ_0*H+t`G&)NibWX?j`z$nLrtA3^`jg2o=8_5SQ%7V2P;P;GLS)!ip4#mt-Ni%UQbplX>MF4=Hiy50N~$-7Yo1gl zCLvW0N^h&Sf76uW(`nS@u2zOT8699wQ{?ghE<*cU*NAMiBTijg{CmAI$JJk0Kxrao z0q_6pTdR@t?t}l;2;LeFRqQExUJv)M=SRh!AHg0k$8W8ckrb3C8Mm1{;Z)E7=HWhH z<~ z*TiajEAV=Uj+w7Y;`Kb9st1Hr3Eb#AwA=ch?8dQ*tt}1~M1j-`=n0H)pD(9g6O8Vy zwp&C~F?yXak_UuQ&$Jj75=L(bM!3%xqjv?PN!4~sV8kBh6H@&9wc@`=NXauosuD=O zOB~uzY~Npv23@yyiMJoI^F8YKO>gOk!N?zVBCe94m!f;HCQ9ysT&;Oh%B(9sBaR~ai1^hn+5fUs_pig@vQr^wC-;q?By9@-_ND{v)sD>ySE=1 zuGW3-#|o6x{Xft>*nxDvL;gf`lehU;hdQR={| z>bTF7{}k!$6|_46ZT{#4708m2&ZYVRRN=-79qG)haMdW|NT)MUqDTkVJkd$0Wh@x9 zyJ(c~rHj^Ny^P5-Vig6z*_N@cB;l_4__bUkT^NN!sdP$+_jKQS+-ZajO|Q< z-Z_6F)G~HZ(B4H8@pMwqyo|{M9|iQMcNt4|a}mI(V;R#*u`7u{En~RPR|IMqJ2+_X zmIixX#^gaZ?0FeWcJpJ;d>578ov>HS81D1MUM*vX1noVvO4~`^^D-t62z$Sg!Hr_; zTcU<)`ZBuFe-P?w8N+?PsH3&K6L~JL^*zlm;LlfcB{Z6!u$paq+^rxfyoxR;$1Tg9@-7h5(bdi+| z_xXxIEy9Ne?LE_I4==*OlKZ7fwU1~2M@9p5o@maAx(>IA!t|U=Gc%K>9%Uy@ItgjzAnj<7hHJj0C1}|Pd5`XITOg0WcE$IsI#{8l z-Z%*b7wL@ASbW@#WWuQ8%Bbp0T38Gn`-oPyktGluzLiG$VN|i|hvremlysnvz@csn z(!%TGhSwSJmJvL=uOD8Ys2|?KwD9`5;ZX`V1H67I@LmMGU@vk-y)y7Nw~QAVMB+@m z-UDmTtg-upweOHo{6I!=MvZlPjdfa$b!v?@qDI9PXQ8t(AZnaF3J7NI0fAU2lLDq z2??~cwCJyiEvM9-5pzvH7SlHlxvpQgL_3Nr!Y}Q7puDN+glxv6oGm0~dr`M1YBnq}GDA)-%q%i+QXIw6q%M~#%f8>6oS2>dww2~qP{Se|>DWo){foj3016A*y~@ z@J4DbGLM20KxX4;;7Kmb3%V!4x9h$eVcjm-QY`vUtvmX)`X&N(tZAI0mIZh+d^~{D zGaur3>LP?sb|ebbs(`=2x%w{Wl4F+_^R#HVM)?*E0>F#L%{0LXFcODc^lPv2XlpP| z)qWX>b?v?nmV#+RRt+fVL;sRx--=$r)1v0-(I)vl%sefcqY|G%f$eRC0Is(aa=Y#X z&-qA6L1G|682cnr4(GkTeE^oxwZ+DHYB~Be<8qYEkTvsA;;_rP&TkGG=SQ&!k1V03 z7}I0zd8C9YlH)N1GiQNnL|fj=0mtI?b$8y zGU>>OD8wrVVcbYvRT8*}XXb-7O^&5yyhSJcL-Wx=8lZ9!F9P`cUi!OL@ZzWm)(|!K zp#hisacL%6F#F4*_I^pnN(|)2Y(k_y?m;DiOQYsxOx`5m5M;%gOjx!F{x@n~%1@@? zZ$kC~!g8X=V7yqQN$&uM@`0JI?XCV zkw7eP1!FS)QJ`YnL_nHZW z6N2!SKp42pMvn$#WYjp$6HWRK2P3*2Su)HV6%}t3xJLYmkXVX80qIeKWRHZsjx4F1 z(j|cn2M8nTuIe7RmQj8TU4q>Caoiy)YK)qALIQdM4a_S|QfDx_G;m!s1!6N;RZ=}B zYF_8YwR>Q6UJy$$-WQ_@6 zz28CgYP`s=A}yIuAd7~#Jhm_~8QZyG*vz3l?MAs7o4JL6is1U(8vACwnOjYpxpQi) zf7e)N*H~xio!pD)X^i*pJGqw`v~QOs zsFT6auDuz%tXBxyT~YfiP~qBTy-Lk@dxPWG(dOHE{Trk7&g<;teQjU@tHv7`0l6*0 z1s-l<)I>9HW2kR#JFi>_^X$Ct<(c0k{O=OOaJ1Rkc{$T(+<7e~lv@Yyi<*GwtnDfvHjRK_-7G%?4$8A6HyHz$G{>YEF+T^qpN& z6Pz%o`J%~;Iyxh2-;sP6Eor98Lf&F%pT3F!ihemneL|DB!{+E=*&NM6AQ7A%HJLk~(!*Bp z5VND^R7UwTv=DBe6R1a{l!kIVsW%PfOB#Ji1F$7}JkypaO{_+nAyTB~PYXA^<{X}p(2A_$V z(!3Ub6Ta(k{Y%w%JpuHo@6R;(cEdZG&qRlJ7~bA|Iy$@^=H5U!P)zxFntjz18TVDs zFB<^m>fGjIs9B5xrq+XWX!%@_E|@A#XL{e!T?zRG2Lx$mp~q`_j1 z&c13ZP1GKt??MTE=VK`h&W)OkMFD*eZ?jO;zUn2$rUlx8Od);GUL1TmYN9#0ugX!d zrGZx%SW7_hV^u_u+XY{Zn$o8g^^wp@3=9arDhR&}gn5$qTAdx8E2(}vYW~lSYxlrgc|k12c=K&0rXw)+uozTqM`X1Rz7sXy(gIfaL({vq z@NKW&WjLJ(&TAAEaneP$SDgt^NAq3r1n;mdnv1cl1>cC8i#Yn?AJN2uX3mzJUsnui zuqTsz0`GZ!+`S?uFC`jzGJ>FKZpFo9|$^9z%4F`BtK+MF(kpcor|7BekId`?QP`HFB^h7XA z8HZi)m^5)$b=?iu;QLYYgJuVZ@8`M%f7m1g-Ai-#z=vdKy8|!19(Ja1F8D#z=`!T~x10OME|DX|R1+U>ySSZyF&=v9hN33DPTVc8$)KX+FC9dJmQv8X_p11^; zMa|{SX3nx)nX{sqk@JdXF_RcXk@E^-X-`n&Qi-0WfsdJSdr>={8@PHH*yM8Miuuz; zuX__f-}1i?+J?8rY-M!Q%KVrTcFUvY3Pzj(3{4)cC7B5D%-)nG?DiOa7H)y zIiuDGBY;_7T;Qd@h?;0_GBRyG<2`AJuXyHuM2z3On~{d-PbjwwejPOd?{7falZN<~ zQLajdax>Bp0|?~~=C@If#J-lm<_kEj2J`z|&Ekh9wbtu=e;`j0AjDl8mmF4};P+9J z$5vykUZ8(uHU!hL!C8^_BO=?HKVsD^-Y>L{yA+734;&zl~NY!=xWG_uzCxUHn(T6Qc+6R7RR&`D{ zihUNn2Rh&g`cNX;4CxqaX_9^5tE;63$}+sokJFc|21@#>{JbxQ}LOh4TLPaEvb zHCR-fydz$@Zsyr{^beJedhE_J{brheOEgJ(qM)*%puK*JzYBVS&|T%STMEc6I*3aY zl+Z~OU^2pXH3Aklp6G7G+i7k*g}R@rU*ywOBey#yvNxsb;2zX2g2fp@d~mjrlAVh-tJ^b1K+!CWDW(Qo7Oilndd=c~>XhSVn+a z$Gl;Ph=|;D4zGFKXq6MR;+S0!qF1bBdAv#UylO4)p7pUMXH#0x?0mq=Q{u_O1ki?F zG*8=@o}hVqMe;AblK^N>?gWqYtTOqmP(5?Zr;p6vm%6lz`ObwDh13xT!u=F3Mj0XvWyq6gu0|W& z?shRs0pOJkt8Ol@WJ&^^NE$dLkmIOQ3?M9mgdeW^5jJ;tRQ75~0B0@KOf6- z^~F(fIYM+Oz&DsX$H1k-aBJ_t=9N4kLOjI@u3g0TQy!P%iMJ6r+B?Po-7cnoTT%}I zKb+>l^#~%TDKUEw8G?H66mUY6IhLblx<>DjGyyv()fx9G+1TA#fsY~_cHp%IDSvQ| zbmV9>VkfqHjKmk*IcDx65nrhh@=bUO0S zWO2Eft+W-OjFkOHO=IKcibLt2iS$n?1({>}Q;<2fKb@-IT+xUAA-c|@DfWOaxnAa; zjW(9uzv-qZxM$1+UJX8Ey9atQvge=^A$=}g8ID*^X<#pYex7>%A6$u;om|9x87>WGsfQs>gw6aV)vdL-1fie@DqOVt$iLR!J3PO%xr0U4X z5?GD2Ic75oJ=rB(OE*QPDT>-i0REC)#%MtD2FE3VO4iIV^aPrD9nH0G%oiP|(af>b zv3Z)gZ!3HQr@8!aj02oGqLW~y7OxXsb3o6wWB>K3{wGAl)^#w$Xa;aa>~uaPC`u^x~G z>s!^Ne~IVu z#QV|q?QygsO^o||Rr*Olf=YJ^*+aBSe?ls~UC8PfvO0vU_93fX$Qm3|y8RUT1A%$C z7zf0>A3sxexINS;Q+D{D-LpzPg57{RP~*JuxFqY-Bf9UlJIz{1|2W^m;ui{L z?p@G_{v{tfAJ}p#k?G7Wl{ie&36uiKWmIWk7<+@~X(~+l0x_tTGbovdJ6rJu)VnTb zZ%1h(9eyt)P-Z>p_KUc+Yt!dFqJn735F7`s=|Q#{sH)G^#RS z%~v%TUL%gAorl~ByINyA*%;ENXdFbnPIR)KD84Xs(l_VbKxrV(Vtj*0tref=oSoZ&EuYLf)dAB6FBH*|+f*8vloj(ZJ~q#}Q;oZ)E5o=?!MKE4|Tl zXHRxY~zl=a2Np;j!eOD!p+y^Y48%;sctkU5El4 z$Cvuj8x5q9ywB+ng6McF)huXBqOo zMr0AQHnZ5pinHP;#qZ zVzy&jIG^vKE#JW8TR=o$vVF)tK?f#ZP+-zEWOWHyokP~~IwbjydInF5nJ34LuF3qE zac!;9IfPX{fnT(59I_Q+76KHQ-o=IxS1wx z!n9Lq&Q9pbOv7Jknbyn#Sv4X1EO6{DI({&*KR9-#ViXEwHRxxR)S*(<!2)hepT@f=*sDnX_tSU&fBp=y1?D?$v+A3PuxIotaA^Qrb zRAUvOPGFx+1+pf_b=!}{}TG=f-T0Vm~qj*)UP1%9T6%V()yJAbX)&a0>$op zRG`)ejSFO5i+2{_lq-F7KJngIUMDq-y3iEcp~rao^_cNhcE{v>ZJ?23y$dh`*jEZimp+88IU_C7wm0?QO~iZYSit1+u1)awK=^*J2r6TWp-MuheV&A>(qC&5&s&I~4yk zqd?XptRdb4SvQd+svnKnf|MtHiUL`)W2W=Wo{pd*Ss-gRL%WNpReo9W1>(BcdGKPP z3S`ZO=QUi8g%;)s#4ldXU2Ls>gU{T_7v_SX##Y1+pIFMF8`w z0$Gp8Ot6Ohm#;upcF-QQVD@uk_Q<4TB`fE~Y(k_y?m;DiIWcoClg9B9xGT%L0n5Pn7wei{fvic%o! zS#Aet)N%e~{^CdT~-2)5rf>?_2=8H@W7szt+7F5h-tq8sx zGZ$*fD*VaECSRzLF5`oIhVvxG7|+s5=lX(s9sz1+zJf!#h{Rr&NNfQjvEcle`FyNF z$>G(QEl%lG2K6+7@&|s-7h$SE)@v~ny%mJ&*LmPGGSDBVs{&cC%k-~ddgc0@WIcH% zT_EcXwII3+WW9k+oGy@cIcZ6n0$FHJyHRe&W^N(yM{vDk*j}VJbIWKmw?o+K7Phtz zTV3@|jtgWh_V46&NVk*Y0$JF}EzYo$dppBUPPb>-$#H?KcYM1nL7jY|_sfYUcUiBH z^xlivUA?<3E|9gv8yri4EYHrXTXMH$Z=bxc4J>8V@D|8=KW3ttw=vW=x1Comgn4#e zAM(sxAnQFbjMSZ%GkwOLmnx9;QOpFqzX4^>&TBcN%muRiC_6i^rcqV}vX+a%eIz@t z_i5*~!YjvjNaP~%R3Vmmn)C4EYPkqs3Mjib;X1|k+BPe`uK&MFv^ay;;JDhBN-0+CK^qK$X z=Sr%J<7QhouH6G| z@`6~3@n$g-!v(V3ECv;-KvuiB*#=~>b}RgGpR&Db&v3XvRtq5M-d?E!S?%NO3EIWE z?qlmXO0Tqxn?-TTdpiZPzLlJx6v$dZ@(FZ^dzR=9JP{Yjayv0HduQ{d3S@PN)7P<{ zOj*X*renORRon<>UQ;PD>>lXIsO<>5!3KeOz>#$GK6<9~U)E)jb62WBR!5@H!=CLJ zhqMKpV-@#Y4Ho#Ht%uuGE+bcaFR16|0@xImU#4?Ba2!-AdTCO?q^Su367b!nh0 zQ^p0d+}w2p?+y!@N8PCaN3q$JHH;I>szBCu#5K(BE|9f--0aqD=4_uUb9RWkiEm2N zdIWZ87Bk5xzp*N)Y_Q)N4l0$I7GA$DifyalrMh?{6`GBRyG<2`AJ?mROW$nrD8c>&zCUsMIM zO5!Hq{S7F4(h#MLa+TlTll+>IhEN5vO5aw&%$~WL#a>Nnt=o#b2lgUQ z!3DBh8n@PBcih~k*`9arTsdPl z)AO3m;-vPxCh=1WWI3J}1+vPRGoAujZVol&%G@$b=Xtq6me2G03uKi+pMv|uO%t4_ zNDFwX0$IDlCpV}V*oxaM%j$}_X))4VAS*S^sS0FOV66QfzbzzfcfQ)u1+sd@ZC<+F z1+sd@liBGvX}_LQAPcSe=BC@zna&1dO4#llpEhI?omF|F3c2aYVQW&@x?d-zJJ1Qu zedG51-Xv~EX-kw&8cAf3S{}7W-O33FzyXQL`0-~IlSg^ zqg7654UXH>Ae50MWO-=|WMzA-Kj)&^vlqx3!lq3VG;gm+F9drt|HL-{fD=5@v&!VN ztOc@$#(n2PW`&Wor4J7XcPWr1ltK&j2TC~hM_+U}S(Sd640HCUISmyYOq`Z;C7P?z2Df_fhlbDVd2>byf}^mMOyhN8_~AgdN(3e^*G zQI@GdmP45>EK(+#wLsRec(Op2Pf-pg8hzB)G4+S!MfEVEuuU)$Hw9WP%>(tQBdEDi zIz#hPp{FS&^~_ozD+ew*a`M4;4ud82rk*gK;gw&MsG}1(5#el%`uJqrKyCG$l+A2M zj{6u+y`yn&fvlvn5NCrU%Okl!RydAzqWJ}~;uH!ThMDYoHm~GIjl@%&;A#-tPkCI5 zC*DT*8ao|*YA<7(+A5Kc+NSc5hl;BKhm$m2 zUywH4+4BXdyFk`aaVjw40BGt9($l~;Qk~OrwU5$4Grk}_I-dMfeL;FO3-}B*;!I-r z17YJ;S4_IFias%0hR-Jk(J@XYi$5iNFpR^QbU@R7Al%q^PdUCIy{8-nvhFEAhJwr$ zRrI~liYhu)e@{8SF}tUnLW#3zio>Bxt~K^-v~gZl705a^ZUV0cAF|y8$1$?!C}hv2 ztGsey%P9>U&(F_O&$&Prh?(yqX1+sA4Tzz^QXor$2KEXm)SQron)5Lil$}k7Ed%Px zP@PXnFF+4>fvn?UFMk1xPt1bUMTC@(#TOGAt^!%d#koYqv9J;dZ^&r2Lu0R&V`JzjlFF4{1lWvCMv>B+-2Z!x{kqI&=`BXleluyaR z(5r|&+07!k3=Z@m;Wv&EStd#}Igz8X^cE?@#we{#o|Bc#QK$5 zAj@wx|IUCLEh$_e3tFX_>eec5bF}IvV9Z)|3*8i%XNXpDfvn~U(7W~01+x5DpOXda zTNU^I649NTWun_?B7C&(#1C0M+UEjUSukp1^|z}K4KJ@sS^cFzmOMl*ZFyBNKr!we zz|2)33vK!4)FuETa%zu;?f>YU+LM%1n;o_u30n{AwCzM<$pvxyVQ<=&3uIj&aW21c z_oQv_BiQzASK9VM_80dHFpdG7QBK-+5}rcSE`+AJ2BSdMMLc+Ny1`D`c8UzXhzCEC zC4+@K_NhEa@RGPG5IhC4{LJtc$nrn+7Rd5HO)ZdhiJ0F*g!85G zBx{>2kmUw#U#cTqcY!QdBfeTJad9Deo}ajooHVBbSrs{J@| zwa~WIc&bp0!HPBbA;Tw&sMbC&Jd_Ve7H5b(zi%KZTirz&v8=6=|}=k7vma zUqx;tB|EHJo0}cx0$KD?HJFwzJDkXn9oFqxvcqW#WL+J%=dd|D=|EblQ6MW#tInvV zdxip8GJ*{nnNSZr6v)c*w0Q-xn9kf%iK8T)KnciPMwJFeu{U@gN9vtY`m!f zE~lZFA@6HM-Yv5>v)ILov+?lu3`mnx`kXL9tnDasmRS1>>bva>v@Zia>0)gzkR=Z# z*1nwF>X(@9*kpk$wB;L^r~+Ab*uF~#CeKn}@^sjm7q*@XTX*V^#+;hZ^%ZtyTyXw5w1cYl0Y+{WPsgrGa~hsPBn| z7e$PVJ%D~hfh-0D&}+Cr7J*(v8KQZJ5bUZ-Pnt;P8y1`xHyP*;0BYaK%(b5iPitIS zCCN+GCOo~HrvDK=xz-c@%9op}Ko<1jKFv)S)PdG3Ve93v^-|cnS94PeWKD{jljFuK zUT(gWk(+%K0bC$U_~#m$g?}$=r>L1WIc_o}E|7JvFzqEb)1*z9c0bMO z6v)C~c`$8em--fE*y@!Hv>yP&mQ+C4A6I~3=0IzofpSu!yuL++aryuX2@+Lp3JL~J z8?xFQQTTSnyC%IVrgr402VI~b97kmi#CJEDTLZ4Ts84qYqpmZfW@>Puty zK^dfDx+wg^-I5;pv2pgj|8*g(IF z_D31maNa=c-0W=lsm#v?fdDpaC`)C-d0sY1U(JTK#D+~}V8f;|u;E-k8rY#39nYi=E^8VTD92yOj<%4tK^4S8DmI z8(Rlfm(enI6MEvOFX!TP9?}*k;;({%JR|>e3?bYCzpp}FZ^kqJ>Y`St zPCWPoN%aXgJ9n8>P+yYxv!K3j$K1XWCvFY{Cl?H|p9Ck@kyO7Xr})AkGH}(%I6ouM5R>xL-uh!vu{&bx5V}G zOEskYC4qUw>^h@5`2Tcv;B#k%a$7s?2x)==5hR}GAw&v3MY4D*t{66mSm{#pZITOp zVz_XS{j`?L&yI%2^JcpMZ6@2FA+|Rd!Mxettl87CeK^?u46)rNw%cwK*g0teIeL`o zuz_R1>zPCBXTj^|EX??(1sj+#L>9SY8;pxme8{s_vwVm^h7WnpBE`O$*1xWm-4dNi zuLJXmv&Z58zKP(X;ebZL0gX`>1czJ_c%CLa0j}!roeq>{@_;Ad zM9TBnPdC^zhJX{*FVGg%O*uL0{Ft2Ts9UrTyg-znjQ{^-EQlK~9sutA(YqkAbtic4 zoBm=1()@hti?p>#$^Yrr-12`L2B_1aBWRU7)p$8>?48ag^U)ih=Y=3=!S`KL+M`>d zjC@}o+`|8z-Vl5xZoV2P9D4tM!NGh5YvLIV#+kcHVY{}#4%lD`8Cx-NYUy1)UMG%^ zttc?g+LiDxNKC+iWh%&cR}VVcdRGrmuc17!Ht+_i$(i{7EaPI2L2f7;QJ4>7x9Z6E zD%c|z?W35N6d&g#(Wj3o2ekMMbe-1rZc`K@=2hsEB<3bEfQVvjM~Ne$VrhyO}wC z&YU?jcV_NN=rlf2cYrk^v0urXgCmdzqD&0mT5K=J4B+?9Xpfl@8A4_@gvO&tIowOx zi~LxsUqKV^qRaB?9h<~I6e|fz)2NZ=QLk4od>7DJoUNd^W)DAh|J5hvySWq&uM?J*L06E}G?a&WjYL_Ml ze3u%iOK=YOzvB+m_;SD!xWc=XjJ!k1$UB3j6_Eoz+|JQ1|2;7o(aU}h4YP_GW^Fq( z%y4d)0ajpQ@>)CR>|5vE`iEz7BPb&=S;f}&Bqkq_m1Sa5?23cmwH*~AR=b^;co=QO zaDwchZNsY3G@caEZzLwGiQ#GC(jMXeDLYv5(I^RUWwc?{qa*-L%~sI|CMhvl&56nI zUX+-u2}(?AX5_%cWDRL95|a-Hhp#S%aDTPRs5+mbyFW3hnE(Na$wz^Si7MT_#ALfC zFv~2~}kj(!VY!N=&x5 zuZVp{ZXyzs_AbM&u3?A#OwDaig_iA0jdNlM<69tz=?S zM6UZB)Ws=poTSMVi8sl?<9(&?-cB2J0P7a}qFoD!2y21hnjo0$BM4Pi)3)R%aK%E==h8n0#_~sf1oju|Xd0s*sf^@LO&BzP<~)&nx1!ei_v}mwZR6d^cFqfhxNSYoZFRe-42vtp?Z| zp~@yYVfinuf3_Szs)UaiK%$CQ8yJr}j|$C-&Wx&@M=TEuL}XB#I+0uajrU;-d;Wm; zVSm&6u$BYx^%%Oqe;4i3FPj++H{C;;7<+%{M4u1YjF))az+>qh-pNGFLNlKhG#Oge zc8{_^re%%kkJJ}{`Mj}C}>XpvLc(%Wu!My z<7c(Jr{`m}1Lm81)5L|yG|`m9OTH)n{(kT&R$jT30Y1K|Q%!w*6ns1~!2Ut`_#g0b za&YdXyXBDrRd~74Be949Eyl#dwHk}nn9<~^T{cs@o)K=)gF91+coDNBs57xV2oX$jq+e{JeM>5-wgK5dYVJgRzYxiG=Oopji53skuRNIN^ zpVCwVtSPckdBx(E1^3in)UqwwE`#UeKVjIL3PJF!!LWA}!t41EVsTVq@>)|1Pb#QRpW3`E+dZ#w8mAy@I{kH?S-q0#KS2E@|YvHrG z5i+WJAYHZRwxaEt^q$Z8IYWB!R`Lr8`O980#Vf7sUm?^3G}1glrg&MK;y2>*+hAD_ zQ#{}t5Nc$KcUsxME3S(Q!S(G{(N$(stb!@F1)Jgz67mnHDI9|B=4*N~I_V_0sl3f!Ku2J;_U2!wlQGIDMn&!?eY*=+^J+#;K$ig1m^Yw-%-bKZ` za;}Ns8>`JRPF>x+0`K_d7MA=8Z?0NGH*c* zfg4uU0{M#6$z*_d?eRC+V>Q_$E3yMYCoYXCsZms*&o=#Dy8sL`ZRU$Fw{FkR$m_Cm za3GWb3I*2X$Nm`{*~u!dAr%LNDfVSl9f@Y7*jKeyi1H6a!CxQYFNAa2^U0iXZR6nZ z?+!ywSBA8psh;13|4l0y?M)^3r~oxG_B!H%=X#RptiEi!jH(M8qiNiB-cblw+EM7x ztdX{jqtIb6Vw0|I0H-@HM!A*% z^Sah8cw^3y%g5Nc6*;e?R6I%AEh@GQamV?`qk?0cDvh4|m zf?Eni8JvUL5@&F$&BiPMO85x}QBQDtQU^DIOdUv5HwU*ISi&9bYmq$)!41Z$4P&um zXiCAc!`9p@Vs%*DBGM3qib-sDc+jvmNvgtw;6VPJ3J)p}Xzm_8Qk}gcv4KlyNViL9 zmfYDpk#e+ayEFaBiqs*OAVa9m&L)UaWhjE*HFk;aAO)9rHe&CqT!K5h9f>}pT%rfT z*w0WaI)`RlP|Eh~iE4kZ?oBdgMe3?%N|9IY;{OXsE_iVMifW2Pip6(M&qxa#$tM*ho+f4ByLxaguA^V@v2L4qr$R!3MKarI3 zn9^^kCZqk1Cmw$gVYhQuE0lI5Z6mLbvK^%F2u0){PKQnLaX2hv?iquWb8aVPni<-L zt)Q*+CxOBZwF+)GZ02&qzW~f`_&5E?isX?S9`10%BgmpVs4^76?;5+|LG)2+`VgDl zT)81G{V9tc-&)R0^BKTCzBP3)0ps?fye{E5ZZD@vPI>s~7GkzDiQb8o)1He+I8J+I zA$1E-qIjbjdE1hCh~~rTLZtGzTCfG_8>UZ3ha&i0V|}~h&@1#sd$dyeqCLu@+myaN z01%#ww_h}A+lh6s`S;YjEw6PP{&YuPMiKpyQAq!~%IP)V9eJdkChOHsRHSTYZzGdZ zU(zb4{HrIVD2c?ObYw3meT+~VbA~obX$(JQ(cfA}e^q)POEBSK4iNWsLiVpDZhkDv zeY+1?$u|V{MJb#%$`MDfB7Gg5P7-OyM9PWCRtLvjYO1k|rWz>%sp%$%c_yO6d<8Qt zX&;Y(YTW*1#uxSg{1@Y@h7=aKS1KqpV;nnu)Un}uUeT6tFmdWf~f~G&refF zyZ1>X-g-nkqBwaPK(ghObcjbFfkPx*tXIe)4J29MjJjQ1!GVLSR&)>%s~stf^LK1J z#QC0@_OP{xy~4D-pxKtR9ZcY%2!7YN)0_)Z=rr)|BIQ5uZuQ;n^H9rnmbLCC&vTS! zVJ%@PZ`RCcIiu%ubTndXZA1MfJ(qPRqlz$4Od6dpG{Wy1Ya|!su4-d^HTE-l)VEs}Vv-36_dHVxjBCHjo*s5$_b> zn^#@f8`G{vbb+Tq5yxr-Q^=1UiE!H1Axj6j^0y9lN-bEG!~^B9nTR8?J(4AHtw#Ld zp#C9Ir@s0jwZctpuvL=JDKZ&qi9jy85AkZm&klO`D0=r0y^=U6XkhPZ#E~=@cgA46 zqO)k(7`3cijll03x9q_f*U`@&ZDV&;Eep3Ri!N>xUDPJ}h-%zJ2rPVRTl*3AHTdpb z&;pV-thx(YRM?BCY4c;HY|2J}_9uspDTT<2ltQI&x9W-MZ01nnZ7(JUb~mzCe(Y#w za~QGdCaYA2c(~wlG`Pg2P8dgLcEY_7EPB&ecSb&fkas%N{*8OvyI4P-Lha(|Z9+l8 zA2So#2k8dC>kHD6VY|4xtH2Q-vtU_Edd4G=iCtPZ!n#107W~;;V!c?6T#z7_$Rl;O z&@wANc35>UEwi$%2sWG(O|{#d)NVbOLCrf;4M*ufh!;n(Jx9pk4yjBgJDPHm&zQ_M zEQfzaWDtC|iDlJ%5(Mt9HF3MU7K#U}W@G@m39UK($cgk4BTP^7`mPSIKZ;arK`@~R ze%ILR@*ZR|4T_3O#&A8!+VOu4*RgZr(m14OmSdUBA*;7-d5p!l+aiWttjK|)@G zLs!y7JrVqI@?kQiL=MBE8rEY`z8l`!N4pvTy;1%c;we|+jwOGmps48?JV?t>5$nT3 zyH?`d9;9Je-n)ySEc`=o2=))n-J?y)KX@e${-Gh={-Ig2e|T5o`jBIgAyhbI6Udb~ z{I0QM$d$OIZR~R87(CED-6r~!atyH&_Y}t?N0ew9>&Ny?yAsz=HB*Ybaw^x@Wixrv z(fc#mGI&3=H?PEDc+v#i!_(7xc+wO&S7TB%gXWbu*k9wj?XR%{SK|7U{mUKpuON}+ zN*sRI-2Ni%gM0&&{UKjj^ryBmN#eOushlhAqPfz2`B&u)qPfx>%$4X5I;(LNoz+N{ z(_Cpz9(6ZO*5jbEB9*b&KT+3HbEOd7Q<8FGo+}NcxzfPBp!7vTX+-J4Q2H8ri;pO+ za@~tjTSPfiZCR~)-b$RDMRA^^n6lkVVgx|h?qx9?t-Uk`(=02qux4|9g6K zzqL@NToW;nu_rF3eF90cc(Uel?T_=akZVa7yHd&ZRZ6Y{P%A4)sA359KFu3`t4)7e z{7EY)cc2@rIlw+3u#N2jR^RGK6AdwwIF33=J%B@c{N77e?NVYN59zON3wzH%uz?)X`95^Qx0NJW zkmts(_7Ek{gR~Ly)VMIwz|s3XqUu~CJy?Wv?V9Eds~)7B?o`CyrP!2#5(-DxG#7VB zhcAq%DtcK=TL3*DaGm+u{rOqt5(sX&G{59Ds5S_y;Tfpf?sar(`KqnBd;{7YQfd!} zcCQtK|F^}^?%>ksL8Z}#rO{zh&8lq#Su!#n8HJCHm(tLL4uur;@``Z7QlM3Jr1W%G zal@*rL*WwzGiLnVwpaKdK%!6aeM`80WTagCJ-8I8`LWT|zkUJX@TC>u%Up!M!Q`0< zf%JEL{Rol%4&z3+*Fdq|{1f~k#irik{-nfK-m8QagM&&_S8UNPb$TDoo707eo1R|AT_B(~UNV>5Lc zqtp~{7oj#PC3n->!rkCEvpQx}jfCIWXQ^4WB!#{*J=bnjN==cZe{eVU-)$#R+AzB# z^`zMyMMH|lf~Fa?blkX9P-5@PV)uiQM47&S$)e?IAtk3;O=FXJ91WqoWIP!!lNOV6 zB9k$@iQ9*j!gchuB-jQ%m7%kUAC$^e%8#(<|lnH;OQzTWj2tN}61Ahhj>mI~r8Y^&V@-#T>%^lGz ztQe>&5D0JXsK$z0I?}n-hE=yvTZlykOJ{r|9R>-RKV}$?`W5tC~ zjm8Q*16AAeu>x1ARY5!cnisB8D~m4c7JaT;^x1CFi&dNwW5p%$$ffb{GWX?5&l)dR z3O~nJRq3(f5;;~Z6IU%=MxM-L#o2sSm4lG^swMa5hlJSvu>uP(2qfET+t2aku;Mcm zsj&hcOCbg~@0VN}kFXp(R$Po``nZ$*tn;EKQ3liFcHZeEu^ub%S4|s0jup6|ZKi4f zT+mh)eW_b?dAI0`-J&mai_TDOAjXO-;*r_$@QV)1hL@)r1Y^Y&BxKN7ag}$hSWfNW z9xGmCdsR19Tobpif~itth4{-B*mA63>b|k!1-`jYYwNkW?;1T;2vTCKc)@eg;I$N4 z4c}4VvEs#UHdAtr70YFrXRKf;wlrf-w)Gh1{e3ewGLn_me6?K)= zE&O^s&HW8%z&V(2%d4brrUtzZe-De?951T3JKQOGj(uA&M@yvDTjeB7B^}Mw?#|qiN4|NSP3G8&=h$G=UbpzM_eD zR^&EXx)Q92U^WO|8AFVo9cxQ5nkS$0Nz<& zQgI6@Q0b_fL!#4rrURAeKLG@|q#NA%ide~=B;e0NK>V($fCED;;H4GzT@dguY6DD? z%A%K4$YvNs0AM*7PdwsyNKnxz3wvG_Lw>fSxQPDAXxe2#JnTHh%;%Etp*TaQmv872 zj10Ex)yeGjIFV>yQh_Gn8CF|5-JDTK|GH?=f}T7aeXk;)_HeX<5{MPC`{I!W>_-W= zP8ocLi(jeBlU7wpK)`|SBL}(*jqwe=iu$=zg`N~#P+@VlmsaRMm8TP~}x7plg< zWLR~G6G_a44(|68_mc#7{H`hYQw8_SE9?gXxDO%j4>-6#NZd~o-0{1n++{GpSHK?v z_g`p6@M}tU5e!6)HyAvU3I=@@Hr(xM4hB21n80&}ovKI4VDJdFWr|=<%lmp>8^cYc z*TndPH9Wg`m{gR(0KaRhq6`N3`uAd}_#>(KM@mHw27MfL|3GvO2LCA0IT$QP8(dAn z;Obb(qa>gV2KZf50c9{ayTAPy1bmYYwBf?mvgp+QX@Y?ORl#5m1%p+cis&B%gQwhg zE%EJ1Pf%~AJC-_@NIo89uzghBAJra*_w1?t(S(%1_-D7qq;xU|gD1&>9z$bnreLtSbIIe>7%~{(cTF2Z27_t+?Wa{^;9_1^FnHR* zeJOF5!2rK&%3TJ7bNbuQ1aRkI@Qj1IP26QL!0#0IJ-%Q_T{3yZ0Q*^R{(+njr=-iG zhw~w8Sx6p37Yyy_Y#+{NrVHtI7L4_{WYT|*e~*p>3$7^!@Mm=-8=@G_@h>Ca=@)#C z|9{6F^7zj2(mrT~s?1JbX zn*BvGdpvwg(Dey>WcEGc9%Od9Wb#Ea`wL|D7o1(-Kc0YGit|RWH;!j6hrRjqCeHJe zMX!%UuZu+IsNLGn5EwqmXwTs@nUKx1gYr7D&-!JKZZ@F(+j5?zqfJ?nmmz=nmFkIQ zs#VzMh`0R;O`h%R1)CMjW*M=$J|e0V^z(wt3UJYJ8DG)oDnkrA|Y>7MBKa zLkWhVz`Fd{tMSNdEXfNbiEqp3av{pABnnT$mG~?9xP&&i;kd*rX+Ii8OdX+m ziHx$6Dnk+cPK_D=vBS*3;xsx8HWR;r4zskG=n87UoQc}-Tk-H+t;mn6*?vh9HC)_|j%{TgPm?lSV5wtlEcORw}=qMa$=JQ77OfmpuMg72s_# ze`upSs!QG^jjy0J^iTx9Ypn5MV%GqUtE^HX0>@R#qMKVse{3E7L2a^bLSXifw3C`; zYZ`lp9rJLMyEdJNH{yfoD`5 z)C4Bl+*(fQgeb}-_kC2v!#eS0q$vKgqsb+9Y^J!MGj3NOP|x=~!? z&G#r&H7AWeh}%C&{ihtTpYnhfgiem9u{|;P1M-gi*lIR=*hxr{Xo*7DZ%sS`Aaavd zD6koi+%Yp-(xyLBot^#)W#`8}j0aYy6G?~~L@qNA^hkt=6f_7lke?8Tx7AVvXiYlh zL_Xvd#K;;nTzDCR#lXkt&N9oa`n$^3)A*bAsPDTNBPu0FQNVk z!Z`m=Z_2gxES&kqv2@L}9SK&=Me6NI9@X5cl?s%!9sUocEhK5P(y!GOkvuqEpdHY4 zx`28;0-E=nKrxW0$*KlnIq7IjHR%s`1mxwjj)3EZz^syW)Ks1DH?A^^%f-Qus4T{1 zAK^$2@v?uWPLdy6&wkVeb)FHA>s18MLVH3DriuFWpQkPDwHQdY)<(3F@uvhl5FOT& zlkKS;js&j5pS|Y=BrokfUEScKHwtG{esUCPjDb>X<{l`u_H5o#0GGT^q3r#=5XzFE zhERrsL|Xiaxxpfi4(k7@d6s(?;gXgq&&05~7O>7XP!xl$_s zz+dt>Cn!kXd9hF9k~Tq}*TAcw%2G*nGomIOV>!jm=dGTBh9JfJ0Rd5~BP(0FZ=sixnh1_tH!wr8RH)uDCa@g62D!!A-2Sq zMK`sLe&05_QEeO-^Pul(Q#VB*t7+^nZeyMYIX9GtH(`gE+%2vtdK+z{prc}gw5gm2 z{T+`8+B^>$LGvJTm_ukDw259Y@auRMg@X{{#GWw1==V2_3M=wF=ub)>{@e?Olt*@P zhGd5_B;qm7DYuPoRaO*7c854XJmQ`UM*NrCv`ZsB=Rp4;Ul|S z930oui3xg7x|WXNqzI(^m#k_t5$%@p$nLIq1XSbpHoA&0mXQ!pa^T_Vs z4z?Q<+YQ8)sRuI8Pg6%bQ%I!1BfC~20twQpcTZ%UXAL$#ay_^yLkG z-1%)fkAMwnf+k@(>o4p1jymqVt#(Nr(p?^R#_vFl_F(Trj(DGp{SEs-A>R9d{S8W? zT2u>uweiHG4jvMYgrs*nH`A-c>9nt4I_)bsAmQIvuwMdxLHi0W?-GoRMFIDX@7~=6 zih^S|L0v^O?QQ}ErFIkSpNJg5&azLCCPIlqQpF*txGh%iG~ffF`vM&kp92$-{h8c; zZgMG<4BngoS3FR-VqE~1?3=(yuy4)V?m!U3EE1b*>Z!KFwi?xT^-zm8t4~09HV}U{ z#6yA`n($zE6NVckaOHn6im&15QfDAI+Nt4gwUdHU?Q~EgaxfeApdfJ_?L-On!GJ+y z9Fm9}#5jkzacBq8*4pk{>l-AJl`9lr;!^o)r^+fW760SA!yUb&Us%_ zed?Qsk~pCVe($BeiR}iB(7wDC0ox5!`v&z*0jC=F7V4W@I>KCAI-+kLo^X9qiC^;{ zO3g#B`NJiWi3b@?{E&Lh&!36%er8Egpr(^A_YYG<)4tqSPy(?c)+7-*Jk>Y7ng}J( zH@9?j2Ea^7Y5^eIRBkMUa%w)MBQhB<1&k9TVa8uJ;Xh z;CqYb?x^IzeMzzr;)l?*rRLe^ePbzs8Cs>>uUybxJMIYb@AHV|!+HF>bq97w&KT z8cPvU?JQqol_VknqTGOAV=*3C5wEcXZTcfM+oQkeHP(@d!0K=sk<8@q8tX_FlwV^( z&>+yjLLrX#HP(@09#w*v5$*~PrwKgLO77QK|3}j9_G>K6xP?Jr3fGLA1Bid_{2yLpl~TtO zudzxK@-@~`R3=_y9hHzv)SJapMmP2&evRc`Mdo^vh$f|4X#dnzFXDOH((ald4?^IU z%SZAxRyT68J+%YB#!5N4bDlS&=i8knFYU7Y8Y=}ZdZTbQ)tmV>78V_}X0AmCTWgrk=yAPzho31OsP@qN@9s|qu7$?X z_+0}*r{N0#xQjOYSQFgj)Fis7iP*+aKW;B-GNb34dG=y{=yJeQ?Ec&&fu-n2(2_tQSs_#9y?a<1N3o zpic&U(V}71uedmn#ws{Hz6Be8$_4fvz<7!DJ3v*OOc?aJm8$PS5|2%Igew#FNoco? zVKnu|FxCD@#lsTeSV4F-9aecZEO$JWG;r*A+DuTx6Jfi+zOoo^m%@Pjo*+S`Vb$pX zwTF?5a~7&;)9&@SJ)9Y0_}m!A!RHYiS!oA5m~X`+kzFz}5kYa>u5>|;V#sZRv#isk ze<93TC8HA&fW^a~;=%;%La3_5H|3;+hzl#iP#Di&!WGo%I6rL~8^d&eC%Ref=FfQT z?$`vf^#VRU@K}s&y&%@GssIrtJdtKK({m}vOwYwhPJG9N?63DvgwG`Uf3{F$93ML2 z`Qr`}vrfrbiHP9(5B{bkX(w?Xp73h*FBPBUE6%_wKzK6Z3pjVKg`FGNYabq!`EaZ2 zTfG_fC9YL50rEsF5Jd8X*c-!ih1U}?+9tD#oxvhT#}?R=(GaVsjsHX&vrnBv-a!5m zB9OjmK{9F4VxL5v$XSU*ZG3xfbb>Ev9f?&`5XeUD{2BOo<=H|ZDeYgaf~6JSBcz3# zf3-T*vU*8;w8vkqdSTM@S1TlGpiK*qr&v{YV@grZtF^SQfzFD`8U$8nXMMSMS#&vn zUk>baXFX^4I;#V0cRK623Hu`M5!&myvtG`fbrl`lO4C_qaA#ePPu>M}*2_(ub%v`8 z&J5_Rvl0;$$L(`nkXNKS>x_h~(_+icIy(^oSUkK2A1|fOx{x}nkPz*Q&U&uDvtH%v ztk>+F&I&Sy&U$SkBDlIbt6wYbtQYx|<<5GYue0t--&vQSvj%`jOX|+LB%rfiSAAzq z1EM?YwW71m7M*pLtF!KGe}k*D?ra|{t?(Y*S$DRVot5y>S$DRl&bqUG$+UEx6_qvU ztn~H4stR;_INDi#%c2wdM#uM!j_Vs8+gA>;{ZJWRs}@r_AJaPtu}-kPx&GXb(-|>CTFxOxKwewI^HGJSzejL!d24Mg&(^p!I9T zfwrknSq`*?Nl#W3y00irPV_uh`+NY>ifm@eh@KA!vee6~$%xW`=pb8=EAA+ikr~mv;viXt-w0XJ?(>Reh$U=<*m=biV&@f?G)lsgO!*KhYuZieWg1*; zExPHN^62XF=m+J|_f>zTw`e#Y26Zsb^K7`JOEOZDlts9w1z&cEbV=H4&~0unwmb70 z4{sT5m63r1`nMH3FTgmGbfGtK@#+v{J$#~mhKo|uSXXv%dMg)RUCwiGmI9RNJsdtD z&=svwQj&}unGBy22_Hq?{}JD+_9l+y(C>y-Z{k=^5nj;oOma}68e z@=WY7VqVIP{IC3EZB-LeE8LAuWeHOqos4u(sv;7SZWDMPmb!~_KHMgN;C=;eG~0(x z2^Y+mv9et+NfoQ_-KXGYmZQmFhZAKyk07o+lf2zly?Sg)WxX8j1Gro&>+LSfCmJPX z$;dHDStZ-9ENS^SLE==f0VOg_YZOSqLDB9;TnRY95Jvr)b{SNyaoCDYV*`_sL99X> z(jWZW;)zETkLuMC;!#hzIN$M`-rn%-8T`H*)Y=iXQt1zDKIPl(QIn_(kOKO#Ur8bv z8A#*O#&Yrb*H&;~`vW-kgT)AF4;HhN%ik4UDyvm9jEh8czraNz;u4Tr)Gb(!+*mRh zsbmXufCLbvkYuga4;sp z(m$D~12H-hBBsVA$0Q@%b2_6SZug`QI>b&)?w)~SCnO^$GT#`mOL~ykcVWVj6OyzM z3@a<$lMya2LHT@it&@^=DJ>XK3yFb)$_nrohK=r1N;(mdBZ&yUrJ`rjp$N)rFktZA zFWd*I?aQLymPfx*Lk0J)WV!tny8(LVwbYLEMb87sJHAEn3o&@d3o+akTEC#=WRj3O zRw#nsHIT}gZJyQ-w{rILW}Bz(Ubg7~+nsE4NYWm`Q~ zW}DMH1<5M>M#zeGpWaDkn}m&Qb9yJrHm7$gIfZ(qDceM4O}nYgHs3%uUD+@CTEFP4 z{h}*We-+v01yDz4n-?V`7bnA_Nah|FCGC~yHnTg~7f=tOA(t=s#tkr6baIaRRiul^ zHmgC91c?-9o0?M7*mQPq&Ng4`7nE&Ir)=}$WTc9-%}c7!Hec(f`Zi^o4urJX=B3=o zo^10nHkHgaFHc5hB*U_ZvrSxAvjUd7nl9qNbv4M9e(%_@>JJ)Lk!?O7?G+YORknFK z8O)V!&I-sjuW+;v;5plz?Jg79=9S6FRmrfZl5KZo(wD<_LBnxMobCMDMLuZ?p1Z1162Zv~Hws}3f43CFbaJIRd z=$>qIZZZN&I@=U348z!$5m%LMdR*VAU(+r(R%;xYZO%(ZZe$e<*=Blmgm^OBWKsEd zaJG4=^oO+B<}Jy{JQ|li?kBR%dUWUWt8nb=J0YN5--(@E{;udUzgjiJxT#9_3*1yC zZkhVkk!{|ZjLc^Xc(TpCqq)pBZ%;;UWhR_$ik_yk&D%w`d5g$4=X$cutCA7!IU?Jf z#o6Ya$=x$h?2csQPUg$m=1lT>nQh*ovdtOE2$!pD^RA?QsW;oa%aLuKPecN;O_bMQ zz;I@pA7j8+*Dv~^8Y;MV9ox_Tklg_BZ3kVsMcL*K%39W;csXU8%VoBCH%Tb7P5iEb zRGe+ng>LZ3UIWXbJqAX*4~!l?Q0AO;kCT1$K$?JFQa@Kruy`BrJtV=&l#z!b_+0}D z*e)~^g9Il)g5w586N)`Ktb5jR+`!bdERp(MaVTfu3rH%OOhGFAu7Ol+mtI1uvmn)k zfzk0ws@^EJ#|Ic?A+awL?D4w>?43rrWe`4YHYj?-AlW8t6j$`PX;3P9+>rV$jq;$w zDEM6isrV(vXknBl@v`Wl@o3|Cv{5{Ih`OTpbX10)r)7R@1Fh08F%~6_FEJLmmiZ5j z%WT4K98bN(XrxOIL8<#C#zUmt7-4h#-b>p34()!8M}LV&x5cAdUE00xdx`Oq`6b3n zF71BRdi(-C)Ju$Qx^yc_-7hg-aA=3$HPDWBGc`vSizdpVZ4%Me3E@pG;&y9#=~{&U z@FBd_6iUP4)_AR^lGXuMOQeKrk`dJLZZzJnAh5Ct%*u~_L};zT%^PFG!S>uwX|nSY z?^~FaM{AUS<~FRFg-@au(RKy%riJx1A>&O8lE$UHjq1|c6|`xg4Q}xGD9K02)+Dhj zZ3<<8fT((mws~kJtSruAAOSp3yyyA=Mr@0SfahK?;IS}ZSt8myWx(DJ1AZwC*xP5o zuaXheISj~HY`_rCth)@jaW5EC~w7s?xf=s&=_UZGL+6)eT#b~4&H^V+Mq;q80Kx-BuK z4NxED%3UbO(dT|oCSn$r@G%pYmpc6(BnPLZq?k*eaNEXk+23+$C+}~$?sl35SdG{>*jQf6p(cqR*pDL>t`QwJds9*XW&HMF_x$FYfG0@7>Tnf1$llKP6=W zrqUa!6g#Avq7;36(g16+hE6RxYzzmy6T)to6|vuw{P;EL?ynR#8gWO3zAIwkv)Pgv zRXt!yi2&v+sI^waU|Reea+b3ZbHjIZbrzyYUKRVKiW*k+#@l3lw3VY7u?wHxe*TP{ zDT`Wcqb~LY?_;}^{b(`vv1P)K!b=P6yI>C9p7Jg4C8ICij6~IZ`f$xwLeyWp!JOAs z3f~YfXFRiC9O7=?6UxkKUJ)MS5dk=hS&)@#r`$^3DL13%Gc5_{nU)n!Em?JZQEO!^ zysT^CLU;@9J6aL@l~z7h#CmZ(%};ucZ)Um1?Kc)o!PIJtm!wT7r$#OPDms>9)I^ z?hom7cm_J%?u|5@J<}dX1UszZ@4}G5m%3vOzbu+iOZ>dxDl4gJ>A01;*WIc_uoK%M zar9IWK)*NL>rRWa=s;E_U2l`%cLRdrC7NO;Q`|*6DM3-dq@hUbx}cZ|iV%c0KsqF) zL&YkTg>Ch1Uf)1l@zIgIC38I=%%wpbz_;P+l?8ccYzD;J6@ zwlU!?iyouq!=hl&TU=|Z?4u1i1+mWdkn`vz=W5$Nc33yLUFo7s{Qwe8rE zJ(E)P+qzqdiKa-Fa{gXd>S*DbdkHH+BqYq8{oa zYP7N**hJ|m?pYK0Xr-D+Xeq=DpH}K^q5;YdV0dFkYN7?|uKESEaMrWb)kNJf#JZYj ze`=!rMH2~DXrdcCI-2OeB|KF#vDF)02`+Si>Pm2)vgiX{qxZ|SyJ{9-!u2Y{XSKKQ zXWxPN?;{1oF%smW?^6zl0rR~Uw7q>cU?nLs4t*GK9j?}(=`>)b=Mv17ZkPiBvz}n= zB7(7t2!_540_lAZ8GhwyK+@Eh=%!?z(kzH0Y) zi-whGvTIt=od23uH0#zeWpZrO8tZ3<^fI~T&zz+(M|Y!SfqZX!zlZS+bNtMxvb7_ za?{$xPWcTDsnTyCmw4Za)oT7=i`ofvGem-9x8UKBs_vdkmA|`EW$lJk^C3>$et-s% zSToK*Zle+idb?ZD|I+VTq?HuskJ5CqJKXI5L+iCl%bj*AwsSSmooW63Wh@CMvArfcckcle@7ktQ!o^)d@%0lp8_^{p%y+M`WK{a6+8N0qJK&v zp}_0*N9iOg43tP6*QMyMu}#t6X;6;-DT#zZ_e`SV^b#TZ?~z2i9sQFI z=e$oPP504T8`rVO%lB%q0H==)v{eNh^ zqXN0BKIVx2(i9y1Qyl+8%XF)jqm2HNqc{3@q3GY1qJLXM^xwU8Cw@QL4a+1*{a;O} zWB5m-0Djn=)^N%y>8w_F`lqB9b(kJvQ3bzKGk3?Rvj=?X<8k1-7O$t)B%-Sm(GL>Q z_Y=|gR>v*v4-)jb1!TB)Uhpmov*b2XE%2(RzkYri(pk%aRGTI;+t)Gn6<9AWeFbNIAadlbhT(VU| zTCt%2>;^E?9J1A%JiERwt%m~lyW4Vyt?;|1GEWfg`#fZRE*X6`8MTwqXOhvSO6G|q z^HZ+&eO60nbJOxa_A|P4DGJ=}JCI~POSCV3?fy{5uv*_Pl z%Sb`-VF-zUh4Zbo=^c*vKE*Up!>iWw56L(H*CAHg3Gm%oTU3`EUl}=}l10Poc>2IE zARtVA>^LMM;e+*G({phS=Xm^y*ZV?<{Mdo#aQO>&tCFJew*xp)$hY z=MuP(LA+!iOhnFSAu~uw{yIAfMRWAav^LjmnqgUWEzA0$ZpM(Z36sVRosuylGb1xA zD*%p?Wr}{*RgKjzF$|o4MkB!Tx5eSg7+^rSAT!dG;k# zzg6}@u~&H5MF?L9l?Id5MwQ=WwNPp{S$!?c0Y1Vom}rar%_OW)15}#4q7mwR`Zv`q zn-HpB|HDvhQ1MVynU!gwDdz*uYeL=rd1m^#X8Kkrj7pQHZBXaav`EWSK&XCA+oRYk zrf%tWs5F=%iYl`i?vZTkhR`P#Xc_JWQqPRbsJDmEanIuF2M$oqxbT3CA^nD)<9DD1 zsEAJ*uDTKABd=iWa}HG4Qx633(;d_;YYK`WqytX`5(ss%#=C&-s>0+;$3Ut-3)TI0E>kzNZdTpwoXo5#lG$X*Y?5SlmSi?jGaK(?HjYRadT3kLSSs$|DXtq* zEUk0338wi-o*hhbs+Xj8;OUy!#Xe#e1rxiF03n}aw7tMcf0m{{!$<$}VEUICiOtc( zuJIAOI+)m11n3s_N)!Fe`LYpjm5q3dY{Z*1-+4a1H=xArF>{H&qxn?UaWj=qr3#sF za0MI*apZ2z;SL{%+kG5v3*-PY0}oPNs^39~)9@|Tr|Mf)1r@;*x`-p+xI+}mnTHtS z<{7APhZjqA$KH(;c8^9JH#K#1;_fJN<59B2Tq`tQAHws+O=4hK$C?SmHGzSC#skcF zCu+Ro2*?{Z1>Z_D{xFR{1VHZKaVkoBrtAv~oPv^pXFGf$QyL)i<3=2$to54SM}X}& zbkdm=EFE17Ux^qp&^7o78Y&#*d?P4jekmz_t|@*>6i1GmFzH;M1Xkz^7dzpRQw7nw zIdyB*tqpf-+*q}4oyJ6J^5mhT^*DhnL|Cg)@3&Bg<~#q z);VwRv}3illqY=+pJ=7Oi|W zhrq6=sTeuRS#hQE*|RnN(MJ4ketaU#)}5yDdm8b3q`^N&;~xVkf4*IY(y}p=CQotZ zICEI7-m1!(=TH?3cCIGeN5MIwiv~MSgY^sKU!jow{L599lfO=i&ewzo2NE8nu>FJw zqKeYtA!Ei5ndVD~2Pniqwijr&mBjXRht9$ol2q(l>PRS}4tQ;&i!{v>1CdWq$bMCh zS5<++UaScZ2_$@~!uAtB1yyDnovaW8*-qDNhZ9@(L~R%q`Rp@P5p>u`H}$2O-bjG; z8#!gD1L_v#ke6ww(SmDgtkb>eat(6^V7$GVNLkhx)OdQc<}pL!a}SuMiH%Dm)|(pY z`T&-mUy*qCqxVt!X|Qh`d-K`&C(_sse>w zqX|D5NO+0D_7i>rRVsk^ZS=T83}pMEX8R1WJw4+R8mh6_n=#R{mQs<=K2Ixx4*Te) z{z%h%7GRzLa<6j8^%`oK;F<~`x;K5IVO|7`H-Hc+%X$Gdo&chGY>@ce13uNnUQQ#{ z+$JgmxuOYjqT!f_IdpuGSzh17o2D*QTFukwH~4@SE1(4$=sq9NQwr#Q4RjL((P^#D zu%2d77Mck>s0rMXhQI@60uO5f^FhFC{pXnfLuT})8vSWE5Yla}<@*}wJvR{2y$_Tr zR%@UY#y0uDjQ*iUU*iMXpm=fELIm(dBqYnF@@w5i>g?xtF>6O z0ar;AV=)ioHRUTLRfngGmv^%iQBMuioU3Wh37~ncpXPx)JHIA?Ce<*_TQtoZ18C0k z)68X>Hw4h68m9T6rnwMcDuVhQctHTi`%vZ|_U;W}r-!}AG`mG<**y}#?%_ao4+XH( z7F(*>J(-r>k^pv31hRWPfSoqxkDA^003%oQJLyJ6z+d&9MDjYRWqqrVyjA>K8kPO0 zjsrdY?iuf+QP_PvvOq`KW&sEqx)7^%6)jW<>(e6T0W#4*x6^GmPy_Z01k{tG#Tsx? z3vUw8P<6V;G|*jv)EaS@e$-6hh^Uf#|EO=35hG)S2^=2vN|3K4$khaznt}2)P@WH{ zoum{BN5xWP3k}>X8n_hM+($!8(@EpDN~2CkAAtrqFu*-IrU`U50)@ItNsrXPU4kVo zG19OqG;V1cNy~i%nkz~BYXbd@K%v1>(m@({K(M3(jWn!b8aI(f(xE;A#Y)l1Yi+GFZ}4MjF;R8uyGel1}px=%pk*PZK!T2o$fGp~p{031LE}D_M$+ef1g0rTmumtq8i7J9q@=HC;Fp3Wec4FE zTBC7aOC#xOAAy-l(zTkvhen{#$5PVu8u+7NN!J-^SUuaTF{HSC(EBpW>e1die%z#_ z?5&YI0ognCy9HqQP>UJ;7>!>zc$$HwkBRy`_QPGy}b(f!;O)y|01ZgVU1(GL~>4T1kyT%j?Ez#eAGf4E8B<^G@)csQt_g8I~NKUpi0ko_?6q2`!C3>eojkui( zAW>=)0&l;5yTCiz7Q(RzvDWGW9;Gth7fGG<$M5E6%&S^nSt*kQ?Jg; zsQQJXs@SfwMpG&SoLT}&O@Mo`Z}$$Yn+@NWFl7`l&>1bJBX&PS|Xkd8!Mgx6q2Kr6|Re)ok@nfb;8ac}Sn(13J_V*fl zqYr47G@|u`209%q5|f6GpFDBsq>*^La0%@ap|>ps*tu^eutgI%0|dM&*;U+-o6YDy zYxHrX;s~`thJAA^iUy7vI-EB7ix&)tj}=VvCnL$s?b2<3k^Zqwv$z5DdJdg3Zs=tA zrDNyTTtDmUQB*e6xdU17-Rk4pU%D7=GnKi=Uz+2e25@-54h^&bymTK>+fk}cVLksg z6WFN<+z$d?%f}i0A0v7wtHZGf9q1VyRCst8WMCdwlK2qHyl))@=?77R9`0xvQU0%i zCE3Qx%I-i|!_LTvMmmfZIO^*{7~1H zXc5_KckqU_R6AK&2NbD?q_{)+ zw7a8^)ClfLkf^JWDDz19ERhn%KwRtxe+CkIf<4x-u#Egp|IaDenBVJ)bldv;MX+G1h4J_nM_8x4zv1w zwaB0*IXKa%2TmlwIVe7EI7wyU083uRSyt#=6#3a_-z4mmbz_HpDUryU*MW~RWZlq# zk1}LkBkD7+7WJ7|iTcbdMZI;Y7QYG%f^2j#%1z>5ggWWI;$Q}E_$3WyiW*J~9kVMd zGy@gK4TsG+pOCwXtOPPzpjB_3-0qP-87J#X_3z=R9Qu{LNx7|5zhI{7u@OdQQ@7sir$!q8sF4a zROJe4&WXB1|g3+`vc^3%&WnCn#qRnXFZ7BZP6P z_8nulmclq|#N;uegz;Ck64abhe#_KaN@~uUZ@4C`sQIf}pek6kNoLiiYSjvaFit6j zYVD;k&KjXwJ0*<2Dryu4J>IjmUfX$^7N#T6b>I;J4hM&er6f+>MT-|HN&HoX0g`NH zTb^x}0z^u&kNXVdk7op}tP4=iDvRyT*p8LGWYep9s_#tz; zxKPYvFVdus1{FH*>F{tdyY5C66Gu79#mrjHVPA zzO%4lMkth-bG!U|K2{)b3^4mv`MgCuvu-S`Pw-ju3hQOSw3#;)@>rWWw~)tL>sm;Y z$;SoDAx&V+=}TgIHVKHp(g!t$m~*V4=5!_zbB>YJoHfD&%M>+#Rc}-Ucg$;irV@R@ z3S9>r{}?+5rS1&}oY2xlpceg?lUe5pVbVH}i)XFJlV>(t$+?!NRN*4dsH#?D?QpU+9-KP#WMcv?^D-gZ1_d;D7%|2R|x8^01Y2ID7D z6>P30Msq#GI3A^~(9om|uMxf9J>8GD);Pr)p^UaUlG>|v`!UHD8#9Bov zZ~P5%`-a+_B5%6T0G*1{vN{^Gwi#$22}Bs7LyN>)*v1<3prSx|8<`0<(YOZ}VSeU$ z$5Y1R^WG4Kte-i-Y(_6pMrShZl>3_)RpQ`#`jpoE*xjW<7ofaW5*U$2jtd_7v}| zdr-k0##eKgK@eJi%WMHrFpKy zOD)MGCP^MPO7f6Fl5iSHthSotVxW7PyNv-8ovNM2d)y@HV*!$ip*d=%TcGJK@ypZR zj8~}fo;JyYJ8OMjBjo8|rdzD(J_B?Lg|0IrMP|%S8gm&iJq|ATKIa!zEHytHAgZY8 zXl5AG3}2EAhfKy{MAvJHP(pQIyVRQA)HZD~RE!v3U36IBD|=3O%mY#Z0WL zCiVsqb4Lnc$k&6otVCg8_;?K!!QtabvlOLTig%?He(Sy?YaC%o$oDo?c&)Gsg@N+D zg^FPLjxx%Z*`rvDJV$Fe*Mf|1wEK`G898?36dZOOHWtq8cqO+6bqOv_EnN)efZNT- zw?D^snvQlah8jWBQ89BstmvghS|23RIur^5o=Is>16PFdGH6RLS9@#H8$cy+Qu+y1 zm?xzJG==^~cGe&b^rcDIfky1?<3-bC9w(nk*;ENlHEuv=6RHKslQsA^5W>@cPV!OE zBk*uJ0uPge%}_bmoTlk*B&C7|+V4=|^+e&(Lk#?AptVldlsEY$9c{owt4@%Tj+c^- zlah|r^fsF${n04tnFf9==@d=*ClK(3_sMQtq_4`V*4Y~K7hncPrEPv;9*X_{LkZ3DG1fcCyni}W|hs5c5S;%Cs= z%D+(V@z@ItbV2W8O>YjB3RTax2Qo4F++=bxf|G_mo-xY(Yu^k;MQ}>xf4eY z!JY^bUd{|JM0m$^<~nJDIhyV@#evfqd@0GZ<|+mVG-hr`HKDkLn7I$_-;AQ5?73-2 zFTLqJ;DBDfrguA#J~BlJ}Vje zLzQh3tdF#tCsI=p!-t)BYl{6>m>fD zju0d$iATWgrpdk+MD|_Mfl)o_d#QmR620ynMf!fUCcPR|0@L>osKS`OXO@E!Z8__! zDfKb1rF;e2^w)rEO@j9`PyqH|jlCY&9tU2BqM%qm$VX2PW(iI2Qy_aBTMT9!NKAL8 zAcm|@P!a4SaU;Xb6FQ1Du;V+5<+$TIisiUUEy$N9eqR{*eU6$S#ghg(cs1@+Dak2P zl9Qz*CuvE(HA(V~QIf9>lAM@E66-Y0aU;+@jXK1D2`?TA4d8p3Bcukyr3S+^y&p^( zYzojo3CbhH5zl8%#-j+K(0DJ4Ba)BD*Z=}$&U#~Aprq!TseZ6M$r zG-=0`HNk*uh0a1GqHR0s#TT|>S)oZNbZzfJS3FyD_|?OKZ*!Sy-~h~XH0E|-dODqG zg+EZ?>2zZ7{T&tFPA6)n85w3)N%LPU&3}R(1t z&ozjurgYqbmuR7O5o_~IiPa)vLAgUt5SMHedR#!n-7HjiT|m^#G)j>8EN3+yLre7VKGRN-x)eNY%Ee;rf=%YTJIey3lAZjchs)e>LVF>p?Jy^os6H_#@J zYTUaZj4xBUlSH2|Ja8BGA|KV4)y(h-P4#gjQ0QqX{!SV`QtU4LuS!vP9lFhBc5a;PXa3h*Vka!VX>d03VPtb!G!$J*&P3o(Mj@&zTfpj|nLW z9QLT^Bc8Gcl845UK_kszQXrW_(vq=`(CAZA=ngv^Za{|#^E7I%4@lX;YNmnm%|ItdkkF zM5A``0cn$U)j(B3yiwz($gTVi_c+o=KnQ4sj*8(V&)5-8EU|t_yXSjo;+Lc$-rY#N zXFB42H1W$poaP>sFKU}!mWJc8Mvi^caU85U&J5x>$Uqf_I8I|$`hav(oS=bb3)v@5 z8aaH-NLw(e>Y$G+1Igl;rkl65Qh>!3QSE7#+qGLzvP`nXM zoi05KLZSUeOV(od?dbppd+#Y!z@4c@oC^{Aj5x<-xibvxfjCYh&I>>sYet-)5pNDa zya{CkN5OxxWXGr~;1PbjkzlQ=7|&>HT^!@pfm#>Ecy*xG1#*NwUp#Zp6L2}_3b>qe z1YG9Xa;TW91-lhOcn|xDL}Q9U43TJ9+0$TX_xY(FlwF9CxlY|$R;>#GG05@Kq9^KM z&Pz1&=>`@6x>N(*4ha#NC!afhxZ`cOXza^{XQ(=HF0N`3Icw%+Mn{;XY0oqZFk1s% zVFtQJ11*G<6=TN3?er=enZvRcpu+2GSNkX)Po|@@D04K$C;b%3fR?oc6$8hQoaS?! zCjwYq>tl7AWR-cNaFWbLmYAGb#67N25CUaAE(FSYO!lEiq@WK=K_8NW-mlHJ&?wY{Bov>Okniz?RF6_| zv8Sh4p~X~O8-Y ztY?krp%UZx zaAA7Dhc)1X=>ZpOz(>*pKCS^DO%M2_27Dqt;8G3vRC>T?HQ+Pp0iV}^&!q=kt^r?2 z5BQ1(d?`KPYZ`DxdcZd{;L7xXt2E%7=>gx>fN!S<{6GV~mmcs#4Y)cz;5rSsHa*}c z8gPAjz|S<`hV+16YQWFa1Ae0cze)>OdsBB_D5&*acYb+M>)Y-kJ^7})NKd{-J$8fb z^M!z`^QnNVvq8Ys`9#8fEb6n@cRv;}CNuLR@wfGKcNGqnbayW;=2_NL-Mv%$@f;nj z&>GNvJ9ghsn2hZlTZk?X z6;}2-01q6ByDRh#ex3QyDG#~V9%nx2XzHsyl>9IENHLdtsh7{JY zuot&sDw=PG1uW~}UfysyDgQec06v>!-+)q=>Q4|7 zr{q@cn@}0Fm#Bi)4{hrCZ0eIi0(fVvLWu8W<#=ZUXeoZyM7E?OvNIUE0?uKu{n-*b`&(bt?$* z`l6hpSU0WUA3`9fr1%mb6#PAqvQY3hC6E(MRQ)RGIVHvS13~YXKzjYSZkwX#L=#n8 z1JQ(nrDg@YYXx@*ft->G1^*7DEVTGb3FJf*ReuJe34x9_3)E8!l+g(zwQtbd1+w%8 z-Dv^Q#Q!Q;{8c*xWl6G4dzfW8M$1y>2Eyy)r84cY$~915Gf+PbRAB}hq=BCA;^;JD zA&$STIM9s@Pt{_?HS&uFc{&8HX5Tv_d2LlCBfSjC4*Qtf;lciuIWzY|oBk25berdzjg+<4TjswOefunpDebNYHb4Jz8O!$dv7%wq1UaA?dbuf@i`5Zw$be4;^7GNy8*VAso&K_%P z!q2#YoN7O(fz}6d5%)$uYbNl#Ca}y61X1d$6_b}V&~h`-D;nr!GtjFVXoVT*4GmOW zg8r*d%Frco*6U`xw>93Wz*7#1We7T-pOJwztW|DgSW@fwu0}r1fc%ab`F)N2o*8Jh z2KvAZ^q~e?;|6lJ$9fGkiVP$MY)3F3iBfkk7rQyv8A;~+BBD~xHW{UU7SCGW%D=x6 z&&;o7)cQ(Btqod~GXg~!BSi5B^V1D7eqxXjAL|YdXP>1BXP^7SnHBmJh2F&mQ!vjg z7h_yVJhOI5v-~5?vO}8XZ)ujlq*;E`W*HY~ma#tVJMiM%uSV^+2W$U(8twn^Yi|tZ zIpu0Dd=^Agea9KbCK}2o1eGJ0XO)}g&LWs+m%FCJ&c3*h7G_EiaRl?pj&g4>uU!q} zI%dXoHREXx22LxS?JU>9Ty(Gf+=QJy_5e+Ie>ad*?RpyMyg)7@m>*~+&_ENY?*@V> z3oy{}{OTYL)X)cXzXCc$108GzI#dHSGMZd`2cof=$Pt=IlWK?@ZYGkiiR4y8B+pEw zg(lM62lR?GOy&@}fvxm;Q@Yr|q> zuSa=rzKxe&8=;(2rR+~ooE$qLbunpG3uf{$flrz=9yO`ebV|!9rqh2}*t_|sY?keK z($zPA$iIJ=&9p@~Q#;s?FY?!oAzqtAQ6Ah(ZBb)trZ%VxY^K(z2yUhyt7)dqhGq(d zehM~d=vS1xcM!2fLqC({e1;DFMr6i2?yePv4s9iHkD;y5Hk9_@T?2Z)PcaS2K2V1@nH73hH4weaU12mfsKM0T$k0Sy(x1 zRg{8As4jtfeB0&5O{MXUkk7;Avxzk3!P=NdLrb?YH*hrXhVo!zmZHXF%%e~jXw0st z2sUQJYK(c1(U^xAjM*sIn1?E3s;i=9plDp3G22MvwU*C_e72It%-6;&gO+Y%e$FwW zH_C&J*$Xu$WA;Q{pfP)(BG{O@)fh9+Xv}5?V>S;qW>^|?7I`LKUuRUcXU}X=oiRI0 z<8_kHj`CS7joD5cvjSSWjk$r1S&s5xWA;Uj$(Vgm7ii35Q4ws+w$&IjYBXkhgE0$& zjajISNuJ5Z?7+tCP@OS*O5^pA&+hVhv@~XkHs)Yx={DwiHs&Cd2OD!BYD~r)fVx0q z_D4mqF=N#jvy0J~M>>qzl@hFuWE?BhHQ1P?(wH-{VNALazN(mwc~o`A93YL?Uq1WE zXN5FonKtI}(9&(pwQS7eP#$c|O4OK)nM7TnF%zf=HfFDCjM>|0%wr73JT};veWfvH zkuljbJF_wSRAKI+8zXE8%YM4L%|W6d$z`U`VWm4OwvbwP&sD2*Z3nhde9 z8bjP~FoYF)ko;omD81e*M~nw?R3sF7NK}d`|Isw^Tt{{Zg&roujKk%av=)#<71vV* zG=55J{F%~Not4bDtWSe9-jGJ)PfQvwsYc@`jT%3lPUEE}jh``U{JhrqYpF3(LR#Xn zG8*7Rk3kxLnMUI;Od3B|jmFE28o!WE;}=aDFL!Fp3s!Sw8^5YG{$6QJZA=ad|Cmet;|{* zM19UDsK=s7&c~uYXT7M;StkSJT0Bv2y{#>{MOiRgTClriZ4R>Fk7+FUgUNz#Rb#b^TpucGSz-urCdBy2W>4u&E^C`Lp|XdwxK04bzV6dpHQl7($-Nuh+LcLYSFH#BAgny2x_+gxtw^UE;6V zFnr!s)5FkTe9~z5kRAd&yP6&ZCa;pM*-{nzwsMPXL~+ z`Nx6D)BIz=WorIWAhI?8_8^*nCs*_DQDtdUjy?iBOY=*q%CzP`CYub+zfba%=05;* zAk9}ywXUjM!ZHa9HVnUVntvWDiEG~OAw36pw&tG&CQtLv0GFxxr-8`U{1=00{>xm= ze@&HTX#N|jEUn>is%Th8h_Z(i0G`xvY!9hkls8<$ItiB(WmZqsam6brWn7td59wvV zvz7T@VDgmt5^$Nyd=ZFjWmZnj>x@SjKVLO9IX190F$T8*MZAa=4(J?D|5sk%3MBI znJeTdbH!|Bt}Mz-?jfx-m@-F;^46DdJqdpx%3RYa^L>;uu1vd!v=s1cWxfYYo-*GB zE>oHB0FkZC?+v2NQMt-oD@U1YXDjpjs?5ZC=sJTbb2CxiPbAz_!XMi(+{h{OQ4(|M{E;X#xra1nFlCMx z!DWqt`vo-)4xE>oGG1Cg!F%?DBD7P-nCo1@IF zvX!}wC^NZ-wDn-hoGQwjBH^wQ?jp+E!6~zByQDJh9#R4DY-L8koES5ZTI{ zFo-fI<|=bijxu-5R_5fCGVLDHPJ=0PA5q@k68=oWpNcYfbIPniDdU!D_mHXq&sJs? zFnP+X1TIsV6+mPwbJ`%voSv)98J;pnaUIQ`(TiqgD|2^MX2NIA%1~w)%?5OU!Dl$v zX|N$B;PM!Tm_4LlS#?*OEa6E~4aZ7&lnuip!OZR<9RNMCI{ZDP#YT77Lz1@zLcVIS z2*A8rSO{EV4`~lGGCDk0*LxZK5vih#GDRuvAsq*`WX*^7X8Q6|fz94SIuV%6nR0v& z>1?OfLqrk&9@3I5MI1bUA`Z$^#F>LA;;bA+gwZ*)i@deJb1gEtaur4AQ8Af&NEf*h zAE71o_K*(GD)C_hl=#rR5??S#i7(78@oxqy@o)1={JY!|U*<}Dtd!W_Lpmm_#77TM z;-m6Pe90gszBISQmk(6p-{+P14}OVD%lBBeyxNucBrUPGhje0AiBA}y#K-5A_{u>_ zd{u6VuNkPs*XEV@y1Wus-enzI^}nauJ*0n4wR=c+PPKbTcUXMI?Z9&n={Ae6_@~8J z{6ie%EeN@XbiLEyFI9uy9@42<8a!nH4W68*!9NY6!9V9}@b6So&L+dnz~yW*{1vF| zO@S%$bJcrBM)m$Wt9nl#pn89mSH1TPQoZ-)R_`NJcuw^`3S3V0 zJ_uBH_5Ozp^Q!lLi%eJV13+X}??XTgQoWB0$)MF6zU->wT&a%a9@05kRdV(KRdQBd zmAo`amHaoiN?x%_%0A8UszoMyVmRYBT;X0%v7U*uXdJi|-WJ1r%Movk+t0FYFW(4o z87F%$Ilh_0ngc1w@V;ZaG)34VGK3#Gq7PC;y>b&+;S&+`V@JFoN6@}ZK|ji2ErNdO z*nW{BJX&uf``QtGl}{8*)Ahq|QbhKyHhk{AW|~>iEw7xm6ZUHgg$f%ll-n?j9FsF~ z^;+rWTQedKrzMyD^bWYfG_Q`_CVd&8(~?)c=}1?$&2jrzVL4>ZK4_@Rd`NCi!!mNR zsw~tCo8gYlzj@bO4_`rYuk&1C&hOQw_`hd#Eu2P*HkNmsMhuuBT+tD(kRtqAYjI^q zv{H)b5V6V1u{P`S&831iv+=@DM5I+6lPz&g94g2^_O?n6-!NJ&Lv3NSX|jS2=48aY zHRZl#&kEWOnX`hnahY$Oo71)#Ia#%a+q>lBQpxQtbZEH~9MOijN^WXr&wj04vB}y7 z-i>r}Nz#4hgzNYeQ@uJa+`%!Om?GLj?iDHQBr4v~5l>1HZ(xX}JUctW$tl8Jg=@I0 zBibcJbhw%Oq0mzu(UcU?FO_JzBRU!vre$d6D1Z~Ux9tfr!f;xOsoo(M&Tve3OA-BE zH8Wc@Gs_XrOc9^wX(rlN612JmbEaWSA$>va{1hL(>L_X#9&L`t?%6!{OYzV74f$->aJod`w(VOC-Z|+8mg~uYt zWAG!s9^4<7e4C4oLCPW4qBI!efc!v3E9)gHt^81W9z5@Ho`**e9Du ze~O2mqlk_a9!EGH#cUpjr+Db{QFM&(INI^}c{Y!uQap4d6CE!+j&nR3vUwbv;-Q0# z=p^BBqT?|)o5u+$9@@1>rwEUe9goIr9=}NO(B3CHO?dp$@o38CacYW(I`HV%!sB$u zqdA+$uTnhJX+~!Wk24*QmTVqpqcZbSqTi;7R5#%zj_BePkrqC@%n@ChB66ksy(79jMf928U3Y~e z`a_CnJ$Wxayvh;1yB?-$SY74W`jAV;L(S`tSEkaA*Q@`oacP$#ZSn%capnTUtMijz z=aSdpZo*jBTbrz}O{HB~%l0Ri_Gd_&7)e@t<6*ErtbxE+I}$%5FM7_ZMy z{uh`0gtRa>=BK;KrMn_G+rQ-|FTcY!lfvy1{!_w#NO+44!<$_;*JLW@YG&Tq(!#U7 zc39RIhF9fE^!FTz!su2EAgA`VduN2rh}6B$Z%3vWH2vF2^k-xfzwyT2=lHLjOfaOq zSBiI!6z^`w?3vM7_5L)VSy?;<_|!46LO%)6w1gt=N=ag`zQjpp6gPHar%#JpQK)*< zN>~1{Nc)h44~oRp2BN1N(UU16cRS{@j%d#fOe^$vVfG*>)e4`<=k|i* zb|jJ}Tj7T09O(1;$zO8Gk4+2nVt%?;T)NA1vwb-~`D-rubx0mJG<&`1tNDrFaEV_} z5uK#I?kz|3W-d|H2V!qa#m?T7@LjRDcN~+?Hq5rSPXSNc+uNxuZSBYH?fsO!nTwgN zy?yMm{wT#v$NS-@j_8woqR$=CFL7&H$?Ka>vVNAI?rWFst9+thx?6=w5#6tI!pISY z)00aoj;PELoewdML-E$X3aNxn2^B73c|K8g(Hh?Ywc>GUeBcSOVUiI#UnBT_``>XP6Jj%Z{)(MpbJ9Byh#*362jgig*? zT*8&}iB@w&tL77};fPjG5xK&Qazwji$oaigLMP{1F5#N_MC&-BwNpe+gdaGf?@!M= zQ@FVq;;oxv;;y6Gz%f~W5GJGZnQZKsY?LC>Id792$8;WR|_xS zS;EOSEbJ)ZBpZgCIi>E4S6H&XN7o8CPkFSoHn*8;Snb#lm$=Pmiuf1ZUpE8xc|gcX z7Po9`F)hI0bZKcd*IuLflT?N3)m3w+%3Mo*t24e38N{%WF54z<2?KJ z8b{aec2|6+0>&^8$)=k-{zVVZav@U5s`#>-mxOR-P!^UQ%ES<}fU=oOBlvZ2Ltyhm zpN{wCn83s<3S}QylPY`PhSl%cu@viTLBlqU3q&9Cxti?4Xh=2!8k#aBFH@r8#a{X+=Z z1Ru2FkOwTh=6(tPBjJ4#-ir|QRrlC<)!jC%yvxc_`EQ#~^&J*oeY@aqlklGczg5Cp z5Q1Oz&4RzlhBbe);gG*bcq2m4)!ZQX>up&1XA7_Rla%w1QqJq7oL5@9sy|5hd!fJF z#w#wfVfm$2{_;y~`tpk<{qHQk@LL;JULf@6NqDZ{&zA5k8-}MiSJO$y(doMZdo^N5 zo-R#Rc>)WvE`!+0JN8oEqxF$k6oYic+ zV&&b;7^PyR-Ru};d4Z3xVRgO4hf7#z!@_b1!KX0H#>20je#&r2Iz4AE06GgFCvP)` z>Mc=3K*UdXxb>qDsKlWVhYN`7!+Mh&B(RSO!*8f^T(c3Yhpz$5JIwhNaEZg5_Ck;^ zb4Q!@LXfZGl^B*Panx=oQq#VDJ-u$+;~Mcdtl$h6VlD}ZDv&bfDt?YPD5I#F;Etx| z?jC#KqQIrqm(U^O;-(?MP3LR%T`{vU+K8%%?8fj5-{IAlZ1B>38Niv1n%RZX>Of~6 zGmUD1*&!>V2#5jvP`RS99iQc?OhYvdH!L3s+Ei-~%U1wc*43;s`;05GZJ1twj*Kzu z&@hNGt-jRq=_@3Q(cm?yyP>hOrKP9YzmGr(eguLY7ImfYXlUc40cm4F&Yk+j?jl4m%JvAe|<2|Q=9H8mBhbvszy9`M+xTddD%nQAcZu6!?% zeoqN^M@aWD!^SJ7i+h-6-9up)iw`HdQVxUI>E=EZ(0KE-gY_XSWU_hI0+`o4YkAH#7MQ8(dA*LzU^88V;x!k#(;94dy-Yx`g84 zajah~4x;#<#})7Fb!Y)n?kiHZij?z3%6U%8?`2B42BGoeF01DW*gS}UEdvM`wmU)g z%VlG)6KIRGfq}W(5B7IVItO9WmCvNtG3iMW=~jB>zic}#zf;0HZ2PRf-Nq|#lklGs z{zJlB5u%-!-(utCH`}o6@3y^{-6X?-zgT$1je@^H!s`Y8Ckg+E5d12x6Z|zcth`#n zt0cS$Pe+tWnvGPT6?Iv(BdmDknns7&y(<6gj}*X3n9{1o?zkS$4Pjs z4GTw0c$5vpgPc<9aAGoR9fe97Vw(^Q56kzBH{m?6MqELj|ws!+Wt z;UYBn)RM))bPgF#$y|~U9Z76PFK{^E7)xL~CB!E%V4hE!&ixkvXDwMA3b;2WNGAIo z(78(%7b`M0$~Z)!Sv`Ijodk5&+$4-n1m;^TSzLl--+Ia7uS}eDz@;S$nI-s378}hl zBkr;dZCE|phE?m&FeB=!^=6n6b=41M*j2c7Exz*mz|&;cvH04xB>gA}zbAC7OSqa1 z%T|?e6@*-}Si!~%BW-?#4zd@6C7g0A+;7> zQzK!ugjEt&A_RR^g^gF0+px0C%28Rc`BVoMUj2=2dX-;G_>~Q-zmV{Agy2{GnczRM zVa>-j9P*)rA0Px>&HI91YQxI+EWF}f>q;u#5!dy$btQ$@EM3(r622_-|F!Xomuy)6 zqIG@cFWB_u&rAB}EWYrp4J)4%`o|@FOz@9L_^=JbyPc~UNym|~WU+jnLm83lQ0lWC z%3Zk*@;5dAtR;)L6zO>~H=`)6H4M6B5zfeRC;vA~7Mt3JR`{`mo7gZMGec)07t)?m zOBNRZnp(0rpQIVHkRQ%S&O+>~i(&L57B$0$eggP_OBVZzyp1-jD%!AoAA#>J;ZG6L z;mon|ika5YRLl^EHdWwLY*@Xk#CMT!XB!qKBLttqPBtEH;q-Gk3Y{JqUj}IAlEtM! zxa5E?JPd@w>z`QxpZ-7h8iR}BQo6X3Z6WRAqH;-2$#spf4 zd!e%O=0sbvf-_u*c_%d*2W-q$Y=L!&D4IZU&XUC>GR#}D7*Awkj)f(QZ2`_~)XWYy zOaYxe{hA0&=90zMKn&oAwo~*nELltgZEElkmQM#bWA^r~mMogUYrrLo{XmejWU)vZ zz(NTZNZ2P0p~p3ZD`|=;M{xz9nM)RbAbEzf=#JYNrhsZ^z0_2OvsesxY}B2(Plz)WS>E?bNpz-Eumn^PjA-QDXH_vMT%xj)k z1DDx64;Z9*9vD}f*E~;xdh(j*!BlB(^E`~$M01iQi{pXHZZrMBP2B)hrfceYK*fk;$zn^h7W(Ie;@1rNtzZ20 zAc{XDu6Sp!X363rk@7;3@&b|ad?)4YnNr?HsQZ4Qd4=kqc>Ca z@20Jn`EJ^8;!I&~da6CV+_Bt0hhcAxYwm;%aqe=5wV|5ZtqoQE)0VU1X3zm&@pnsKxXFg$-ynd!xZ=_YoVKT4hx%(u zE_<9@)WWrJvmPE+-GX*Gp?7gtbK+}VAEN0Dtq!Yi13vj>L=Jd|3>|9zhGESStf1%r zh;a8g?W~#iQr5jG@%&e)DqgUhhCXk@+UF#E)`m4ti`t$NwLK|ndtB7^FzBeZhb(>J zK^uk-IJGrqzeRR`N-lfAKCQM#a@6*TsO&Q`6XDtyIpIDThwwz?CEo8VtgB|ZdaRm^L*uUmbEuQ>)kz@f{;JCetn*XdqOacO0V zBWegX@Rk(jO~>ht0TYDpIKsD6gbNL492kDj5gm({0o;cu?G_)r@+ao}?z<@l?sbLt z9fQ++26nqK2yiC-mw?Cn4%^EwjWb1Nj_HSv=|6m?PO5dyxup-{4B$=O`w<^I2KV|5 zJgM$UNoBt(`B9uHq;gC@bxcpnJ!bz&JUL{t2fa~&-&j*9d}S-L@TG)bNX32*_SW{%2dzW#q^rd;97*gVx0 z8JnInbMt53)i%#UmE>KCysZNMn3>UaISQ!A5x}?>vuT6OhDl~aC9@%}pf{!qdP8RZ zwab#v^572#S*Vx%hD&~RF285e`8}PP-&26fxXx|DFP9@j7>&qRw(4L_k!h5K-xJx^ zaI$@qDah9uf~=k+h*P@BG%R16VwK*Lkd0)VKU-Ha|Gvw7kBs*?))^=ptPR73t?w8t z&3Pwdy&NWZKYtS|Mfr~;9D|V6_d^>mY%JkMHVij(nSF@NW_7o=$KLb!AV-1?awKrt zvYX~+;D91+>T>yUPC^iE=7^5ZeFNerspR?=NMS1}>6TKmEgZXFr(eW4ouJfPA)DuL z52La9#)y_*K2fwfLBj1N94FznHVn6MGF_P|z!fZbXX4eLKM>eDZ@zyB$i9ZMb*{YI z<;zPumLm;tBa=nKokYSNA))nI*JMg~HK6g%&%RwUDMu7%5Ok1JC9^4#*{)6Iz;Mrk-AN!-p@(BD&+81 z2>o+-t7H~v<(vYolqe9!5ccFl>mUW%H@84TaVWYIt$I36XeW+Ehh_T%VYgQ0^*ue` z#N9^Qt1NP*T$swkojN$c5iQOqI@l2%m|GfaLI>qCDI6h{akx~*VNw}~I_7`NToU;! zpjjsLm%Me6Lvm%b3)=lD8TCR%n9!+WLMMv}9WPQJCsH3PQXk`_z7=wKCgd;p-I7_L zn{x{E_e6nULUtwUs6h&JbZ&uYLMP;z&`E=v(63x6PfO*|A}>IdooQ7SoiWp{zx>)I zIz5%hzT9rQh;p+~c8*OPp6wEyl}c2BGYC3~49|Cj=cNe0(K+kyr1pL*+%I&A4#P)V zY}e|y^$Sw07W;W#;*wvSLx^7FGDmc2E>YnRBGB(0@#QJv_x-G|a)ei=2;Ve>=w<&T z#r>mjzs4o%!pLx|$u=!kB}B`W+)1p2EZUOjK^;4djI z`+71JZWc~|cbsk-IKiDrz+vzmHeum*32&3|A2tkcbqr6_8dn4L~|QpDl0Rb@Gd9Mzf-KPHy0p;(cLLlFoOR`!S0iS-Rl^=g&}=u9&FxO zeUqTnX!s34lhd_(Qc~CgnKsN-ohKyU$8GbE9u6LPTTa$U& z$~)Zs4#3`g%S{~b&yggI9;J)R*dTh4dTL(S-Hcs(caqr(ZcgbGyv@xf?ZTbv+Nt5p@acK z8um9L&({)uC31b~x`|D&3zb%yLWM|EZsTFuEVb4TkWt)P z?ZmAxE4kX`zgZ90UJVvuI5Z5ysvJ_7MxErpoP@(9|5}&0CY9Ls&#qOhC`nh4aHO!P zcPxhIu)tc;EZKSRme7roAle$jZ*>V*6TT}uzAL5p+P>6@_I*jZj)ZFqi&2in_i|W- z(V8k6x?G;3Tr*fx`G!Am=}*V%ZQ4NBjdS%^lz-@wZk!@|-(1-cMq`k*W9nK?xT#C} z<9JdGG3^95jDCWo@$Lzl+)j$W?JP62i?*?0`Bs3l35*r|mZF}`T}E%QrKNrQn>oh6 zSxPSTR9i!?xNkSB+|d@4cUgUVINk~NpG>`PAJ5-kGvC=Iotz?C(+oJnXqQaA7p93? zraBf^u9o)Icba#Qt^j7&<`#d+hX_0F*2Ite7WZiw(<~C2X=`ILk?M{H9qa8JT5R zXhe3?%?nx9TKnhm#fZXOfG1

pJbQFdHD8hm^ZPjb!iFlXebS^fWAR?;S&Caxwmr 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�YQJF9kf?VQ@Vwa3)XtDRqaZ0&;Dg|)}k9$$N6?a8&L)}B^- zdhMCD=hU88dw%W3wU^XhTDusg-Ziz?)?Qb8JxsovVD#NudwcED+B<5O)!tcqSMA-k z_tf57dtdGSwGY%jSo=`z!?nw6AE{kY`)KWBwU5_6QM(F8;_BMxTto47n2Kv_*VTSk z`-3tTXTVrI8YbgB7>dUmL-7@f?_n7t~!=x47i5lu2JUVP0C=r-8C8S zgNaGAaiuaGpMvoz#^dX*`S?-Y$I68KTp5w;>b|S{UYU|J>yNIVqYTO=%A|a@eog)J z^)J@Htc=UeNAi@AlGf%;4x8nyU(fB@k&{{)drHd6xS-T2CCyzp5&~{=xR{y}*^Rfp ztE8#5Eql^rl?I;y!0w$dow=c9HBVG98!MPcQ^~u1k?#KoTE9RWQPqv3C1w=DkN)>U-;>tE%hsb$9j5JgvA} zU3I&=cB<>v*2kNfm8Fmg5C{y$AK2IyL13^<2&9nza99rGKne#EAjx248LzPbgAKN1 zK8(EKAS4C+&dIzt@Au8B>Z*RDcjvvX?z;En$&)8fo;-Q-HqM~GC!ZNe_|*9`C#$jYyaYp?kw~3bw4=Rxr?7qe)l)- z@Xyb@xAV#TC+C5t41E2cJ>1EE6c4`XZ;yBIb9D6ZXt#UxaMBx2jfW45g^Qzym%Z7r zZ_Vb@;rQC9;AQ`&H?`)|-f%uMD#mO+Fbsh8MkA-+n>$lH+c)InJ@+re5705YR?8XK zcxatZZQB|<143b)-}WXh=Jjg^sUv$fBg|{G0gVZ?ZX?{;Hy-Yql4*i<;`1G|Y?#yu zin|-Bf6p-9-Pum(=Uq?ZMGcJiOV?Yb7{IoX_mEx>Ju`DfCbWNoH18TUaAk3LNoafxRDFqZIJc)X`!H^6{%T@d^WL?g zs&>Yh!WR8G>dgf_OTf9?4&;RN%zWC(MLlBC1Qho!rs;PAvR<+;7uVKkZcV24z_=q@ z#5J~7vu9w*9JmJAGt+9_5mD6km2IqDW3N-F)a1x7*%+kGt9*>6OB;)Ut330;>B@AH zRpm_ru6X4WK-L7{6Rwy+9MwXF0pfC&TV*6Q{9Sbv8}(8FJY zJ!iq6;5QSG%x)@Xnu1*$vV*qE;$&E|#(ZW1Lke@)2HllYQFlBX59ijEk5i#83u|HK zUQEZPRjI{{*^A!9@Y?XyG)t1m1p7aFTR)r4!>`>VN9Cyy%SQ zz2O+bON$(@5ZukC-YY+ilGKqPl)-x1}%ej6Kofp7M~GHH&UUm@uUlQZTDh0 zzY&Ya?jQrOyQm5^Sz&vqR{kcWIJWXl&MhSIf!0EzLPqPt} z@?G_6U<%&GC?zXBAF093FKN-ezJ2;$ZNsaOZ2@=mK{`Rjk}~ zd+=Y$6)=-_F_cR-H^d{?hCyv;wUpezkj&YY7!t7u>kizK()Au|;xsKxgGFp7?RH9q zrZZTK?ArLsF|HlwdSqLdQ@i(k(vzz@F=o%Pnf%;(Lxq9}Rn#P;?s=9%4H zUO3#PGTn!tmPPflHxQ1$z&Q7&=9t%=f-KsnPzBGWm21%Wb)RSK!1u-+&)FvZ97)@t ze(}%aFO!4t_Ki+~d6MliAZLg7H12&oU=PE)gPR$d<4Y_ec9ncSpzt0zr2D93$r%X9dz~P5@Z5 z;=TLWb7p-X+X%-bBFyzYe2&=tT+piwk`3|OkjZ1QxZwjUuE-r)e z!$>+z$~UbdC$>Bj*psAu7bu-cdfO^~zUKQ25U#uQS9#{4J8kCfdmS%|-+k|LPR}(h zpmjadd#TRez1)kF?8OO5cF5t{^$gtHZKxygN(txgifng<8067awvxKYLfLz@kFf2I z`4lH7pR#}GK!kBW6&tLF_ps14X}5%8tlZrTBI31L6h>R1=;!!dS6LveotsLZ%>Bb$ zJ!q;2W*x;xE7#^>t}8NiMGV{C%4JSV<_cx22YFq^N10ZOSfg3- zVqZ=bV58O&0LQmPd`c;oS50}{K$r%bXr+9D%9x-EW!O%4>vGr^I}7Dp`n9CrEFY0k ziUVkDkmhW2&)Q{$xk$^32l{a?Y?{Ir;99O8Gt{FA^~i&hrR?->4y=g9sI+cF8{^vf z_uPnV>rLI@*2e_{r?;&)L!L7CanzgPy$SE>%NIq%+C@xbyHPL;?Q-1^*3r?!Qu7=i z?W0F?$2od5a>mz34^5LR=OSg}q}{4^%B_k4yYy&pX3w(4nlQzR zMf&Z~$AUh90*@bg53khsDgD`_k1>5PH8#JNSmd9aiLXd1sbSbJJZGZxqZx&TaOrS zxL{Fio9jlWT{$VW>!w?KO^_(qY|)nveQ+~o{Em6;HHN?O3nuxC1mZH;#dX5vTmo?D z(Pf?Z^I=f}`1n#Pg0gn4UNA++GpchcS*DLu`hYZ;CO>O?&qS9r=sOoV^I*gqmL3Jp zc)A3`tyC41=ozG~Ab$HPYZ{GerC2Q%1kYGHxW#>fWoG+2UGZl@uP^C?*~QS@am=`h zSJ)?2T!bCWC8{sr3ORQo%P~I_EY_8O-{@3BmXR?A)hPmSswi(7&1$<|?;KZGkrif!BAU4r zmST>GxV9K&zQ4JDf5B9GNt@g)LoQCS#bk}_|3YL z|5Vz7ODY`vf_seFAh5B1R~_MNp46SH6`1&{g?8zrR2N!?u`tU7bq7osfAVB_PT!R@ z3R#g8JC8WlW=tQW;txRp|Cxn4B)VKDmr?B=2B@!@#X_~xXt4NbRq_6zzG+lT)l#`u z5f;~LMt$4pG-}miqh5LqdEYkLMHpCSE#B}uyT{SXYJ~Mgtl{lRe-#Eoq1G}x)lBip zu+jYE_l8=o^b2LZGR@UTHe+I)z#opH9>QN~R7%yVm~4dxJfPZ+_UW@jA3RpsIAQBv zDFN0KLa!VXAnQS{!lw)wPt$wNtxy#tW|q!>}e*vu(AFoJq|>txztq z;J-eU*NR5FP$-y<#_?-Jc_ohq%8mx2$O`tOT9uHW0|6Mmmr-v==zZAd5qN#Ni$sIE zei!2{a=TEGix5e^H}=cEJ)vZ0^7w};6Q$HwED~lS-|a!2jEGgtuZFGufwESdYU)a@q`wIAW4pygmWS`K1qIf$j@Ac>ZP1X>PtX_3CU z)58!o-t%b9>Q%T;_|3&Rlw|RuH$6wvbv|idGH_-dxtc14oulYmq-#ofdz|{VlKQrq z`nHz(_9XRfJ@suf^=&KlEhQ&S<3|U9is|puIo2`LdDb!0xz;h$`PMPhIoC1MdDk)1 zx!1v3J-z+eEyU@;T4^|&^yd8=LO z#%s~uMFTI))0){j&uC=^IRRoUbKp$oMnVkUQ=GmIAE}$!{l(O#dxdZ&+bS$xLFHrz zTi_I%)#B-%ir|tV@5Z4#9ZfJD4LFq_vE_ZYq+Mkku{FB~hnq|qk_&12Zfh>2S)mUi zvP9o_ z<|)OGSnl;CI=qH5qzfDPRESlc(uG?2fR7#Uf>Ze|CddYmY~1jWt@fsatKM)#l2mhM zmk2pzHL?HXkiO4*bK5{5B3AWQZJdv8T8^ZuQGQ8EkwSuiLq$4a#JRC4DyW~cOAga+Ojqq3ssq?Rf$S!Ze_>bf*oL#^k&s< z@@D19dE(bHj#T9G>)jj6+4 zsoZ|fU7r;>2Od3Cw;pLP!kWG3Heb1rE2Vg)^iCn{db$Yh?#P7ZRN}lpzMcU24z3=GA#Sy*KT1c`}{hW{ap5;_u=|jZtnEk^i2_A7n&7v z%PiJ1!*rS})>OrMz-fZ4<}1pgol8-y6p`Pdd)J#=xm>2orQEe?IelCth=2%)W;j-& zJ+a5P6m2YnC0fqZo{V~ZE#UTag4+nKTRSm6nm5WN80F#52S@DSz`?_($j*a4$R%1w zqC35*JziDfa%s9FY05VYq(?kvp^BL<-!RbIFgSIbTqz|e zrCf}3whP$$KF#-?$lcFoWt>9d!wGrFJ-O5p_#~H+XY;|(iCaS+-_EZ_z3Z8~hCCk* z@-V?9#pOniOD1WZ3>NX`-K*h<+)G+TaNY+0dncTpB2|J`(Ync%^#-3`%;r}^d&Hq! zVXr}`$Ki-2xo9|jzM;fDib1<*(nm|~1m&*HM_bBh6N-vIaULW02QVj+RTH0??@cBo zfMGEWIk)s&U`RG{DNetH(c!!AToH-7?f|*8ujA-Dv+d`D;Z*8P0OcE8Liz)-=k8Dl z9Va2<=5jdhO?j>f_f@FtFCAyp8^K!{*9{?U)*tm|H%1AaJGQO)jcv_d-CjB)%R+2` z)vP@&mki^;mof=AYwR3}LO5!MbEw1F9NsBwKp2LU2+4A;;*nULkqt2tpcK?0>g(N7 z#ZzZ-ed8?V)+=W*wI);N^LBrZ>#MmoyO%pt6Q)@A6kFdJjpUGzo0)j?Z@K_W{Zmt} zZ&UTH7@qEk#Hrq#U#a|}Xy$iBG7btR?az^Sid0anKrVPlhc#Jnk{H;zMYZhSe?(|= z`!mJ<+&9>y8XzY^j7b%mD+l&$K6PjYR@Qy45>iz{L>hB`rSeO7AL0ZpAI2%eI3i{_ zw^Fzzgv=HP*V1QT36!6t)?K98&Xv}J+Rih>B)h4xs0poqV`ADl!%oh|6mP#48_80q z+%j5Hdo_G%>-b2oMov%Lp?d8&dQPYtn+`BU9A62UEm;Ce5u+3<_( z`^vRoR14yaMU6Hze0)+46?ZOqh`ak%&iD~tV+$1!tu}ji*`w8-&3f1NjI4?{f99<- zw&!wtChq+h?~}@o7q|9w$R4P;q7HlQv&0J(2arAbGaP>i;Y=q$(B;xRSFzM(*7d3=2xv$faXf)9el7-A8UD_jI zqI}m_q@(fMTYOeeB0^co?7{(n^6MeDhWe26I1pgB+ta z5AY&N1m2z3;>(=Zl8U^z?G4AcuWq-9jfI<2d*V#zXV|^5rw071*CX4y#Ie}tlOFbk zB#o=)ofDgFSie>5d2unN!-*vdJ<_PzER?IX@+09a-q`);tg4Q&p4KXDmaCmYMa1C@ z9TI20cj(ma4HPy_ObF-cS^*@IWpiBwP~b;^SMN9L15(MPBDY%!X%S8%=6 zE_*j_dlQNm!CW!yTL@Mdj<1ahR@D8Q-qe~;dzAJk`wSrpjIi8Y6BF7LNL#Uyg*_ZV zkBr@pd2#rNMFEP?9F3el$s?YY-P;+fz42faHx`6ie}>R5E$|w{k)siPkIGo=?19Cz zvnGxutE3ZTpzWUO>{{J1q-T7MM)qmM;2hbhg+(Rrp-ecSFnMJ zJf=2XL1AXBCMa=@+~uhFWhA5n>tl)fW27U+j*;eMwq@+fMwhxvS5o0$kPZ;72Cp!& z`0PL2x}&KR8EpT+*!3C(qgEKRER3$`>o(KRa{J}nFjkOYIh~MsEhvGDhE7oRMsT)? zL9#44>#%dxW~^i#h)xvxu*=Q1`dBneLrH4kC zfS}G_g&nI3uCEo#Ormf@?XI>W^yz%n0m1gK)E#%gfTg=}rBSLFuuGmpXFP|?p2GO( zP;_tc(&8W}%f6k=U#+>ihh?-12HJR`Jp_ln0{ZVy4Z{A#`K9@iZ1U4y|0L(4GiYdX%F@qG^d6?M6?=%$6aNMrCdxK?*^$y z;{}eS6XzHT;U=-G-q~yF-6W;H8^BLTtB#;2yBX-+ooaz zjHFD`TM)^$wW5kr)uPrv#>K9-P#i0xaYywGh60v|lw*D60PmOJOQcFXFt zYpwJ0>6rm$cAKTs-U|`?gTAPZuN>N;M(hs?7AlYS_789ZEb?a0P;te8Jn-2Lbr(ISj_qwg)L z(f9OJqi9i7iQs&Lm`UEcSNScJaU4j-vtj0c`~5^r@va1m?n_BDBDjM}_uOt?a%Brt znAWY@)gn=}#zK;*EZ-|fO(eA@b2d!MRv8u`qH?eNKun`=l>2DeDns}hK=g{REvt$n z_ejMvMa8{1AcUL>j`(QVDo0#F6;!;dIC76vSZ_w>%*O?s+dHy~hP7L08m;C@z0~Qn zjo}z3&v0<`NLUR=4@=E+e6)`q%@&ul{&YB*<6b?}ExT7Ri$=XrYL!kpb!-Nk=F!7q zP5#E5W11FyH0k3NeN5aLBykrRS1s^9wYohj9gY<46~ro!>{>6C@fYRJlqtr(6FRp-f%0njZ&pi ztG6WcRH+OS7%+r6cEB^iN*^%k*F*y=iU2Vs(>STs%Vww4W`2YeX-F%H1~ZmhLZdV$ z>wWS1(yNJ8yHZ4=b|y~ojQlAI-MN~X{)(Fb7!y;bh-Z4l zG^-|Mce>;HXw@7dhAa)-j@Vw{hA8>szqp)g zy66gTG?gpHal3kQQiY8|?c5UGtQi#V`7ajt&@(2U1&sUcQqf&As+C%)(I_^x=~lQI z8A}pB^YM}y6$0dEY8(n^{>}=GUo$cmE7ddsC=`hz92&G-J#N-ZOER2Up=f5bT=izD z_XvlD&}tS+C7d^7j)%u7k2toJ(u`PXoU#`4VW@dyR$&NjJ z+SE1*g}T`)i`h(!_XC1C+NaMBeK4oFyLl22{Yfua-3hXe={tA7(sJBa0uMKeU$ZPL zj10rLS^9nbdEsGX7?!l2M|izr6btQ=S#7nrGa{68A+CpO6l5^LEJrNi{FSNlk;)Y@ z48LJ@!36S{VT>%{heV%1%Tz1gD;S=fL^+T0R^2#hRNKW?Ma-B!A>c-^7%|^N{m->9 zC0v0k4sux$Snafkwk~}%ybl+?%6)P4Q2ve;M3<(JNQVeIdc=)_NNv@7jNLYI^2e&g z?^DK|ZS@t3E_2};R_{-DaR4_8W4uKx;nO|SINCK07_d(sU-U*r?1AfHAul6k-4b!p8f8o*H+mm!^=j^!iW8-^S$i>WUv;Jq z9emViERqjcEn-o3GQgSF76Kz{C5>{#Br5h~3O7^}ap!}@?L?y-Hl{><%N9Jt7Wm!t zN};j`X-^W`giUzbcHbv~4$yt@Smo1P$E zZ<$7MrO+Qs*J>3OlnQ@)^8vzltQM;iL}=YkaFR)uxRhc%W`$XnX=6w_6|H|h0#LO&|Kfh-KvQ#mc!RJ+4y%80GSe}CX@v#vykWrX`*mL zC1shh-Q-bAEyNX?si7J5$fS8|Ho0my4}AE*w|NIHW1MvJGl^IFktSZC!T1=kyN{bvyS5LqN%YVqL&WxYEQ@}b(d zC)69RbVVGeD;w;cNz0r_@Iy4YgV1)V1I! zyU`eDSV*kxHs^Xps^BduTruGMxn`rAES#)0`WTJ&GS13;ubh-M3du=XDfw#5E1U+V znZ76|zB4iJMYR&uMvm6_sg9U;wCnof<%vFLgXvq3_*8}#)nthr?P=1+z!XTj_hzeJ zDYUD{#~5ZZsE~JGd9RTksh!fY(QK8=twINzZg}xJ?D5JjvP&3c$4Ft@p@F8sBkAUc zre7mZD@hC7xkYRf&h74EIMA%Q^SHtreidYur?ZLFS-?}eyuPtV6M2`7ULzpN2);Ty zH(SNBWf^R)0@dlHKb;@m1t#9BA@1t84Jp>2)_0?OZn&0O9bHt1H*2lq_G!};wq^jP zdsaTR&dyKEX46WBg00#>#B)6eBDfmZY0_x{)B~R{t=E^`j)}IH5Unp@M-Pu^IpI6n z8L_l5TK#@rb?<6pIGbBzXTWES`A{;S4UHfO8$79%i4+>XPpQCzM5GfePp2-~wAZL% zDg*MiiKZ-QTd8x`K$gqy-o7v8Fcucm1#U{(5(VN!IMHz6B{5`Y-Im%iP!#9y|?DBrNy*4;|2KE1|0vz1Ea5JI%CRTvIL zKASXo(9dMEE;_a&iLRo9!R_VaHXb62BQn%ue%aLA;w=k=8GileQX5;t~_me&UEVu?AWEO{gPZ{e!eKq`LSwvC=!uJ%er-hV$9F% z>3eZ^#(0a)HT*ZE;jzor#g5lA%RE0ntrfcGWy&J;n1WjoJRN4jKE2sLzzbS(yt{w6 zZ?zr?ry=5n=T6@lH4!w7OKRg=&YeREeeT3ABSiON5_!!)?VGX^ygJ-@X-m_7q~80Q z4?RLQJps{B3Rbqk86{fThNlR(Wn0m^;Z#ve>s^=HJJGWO*%Ats3*eyDy6Opsp^yc| zEO?1y3Fm!iDo#E^o8!opBiE5c%63&s1`+q9Um|@(dAhdWM_zs|**!RD{XU=qTVMVW zm}b7lO!OkmNsWD(rYVFpY63<4@=3U(MP(JGd*U8DDATyanuVy_=FpP~y)x-4-wW61 z21-^-A}i5-5h1k`cM#FA%?^@znM81g%zIQYn(a!vP&JPYnzAVy&N(MucrgY9Zrt{HdJ}bCzbsDZ zzfPPl)r@AT+$dE#A|*~Nce&?TURYGPTe*X|Z~2)zAnp?uF2ZNp`_%so!-wCMByeGM z;$4Xn74YN(=blULidm`4oI~qVDUPKxZA_LJ1FE5lY9+}`Iyau*auMc0TAGz|5ouu> zCyi!Pnj~J7Yog zFnbvpV^B>KfJ*+jGp-fk6{FB;Ra>2!P$d}*=hBL1MjI9e{vK*3KT}e_I`tmm)w)qC zm&?sYQ{)7T#2s~rEleQS%eq&wfu&QBvCXU)l{B*gt6cbx_&~^!Rf(Ew5lhckz#I$& zYH^RXN-Lk_3Ugzbd;|$&x`^<~@nW(ZHkHUg#5IZ1B4l}{O_DV010=!S7Iu;eI!lhE zR2#hvy;LT)K;(}GTLKrKiVu+r&+;0cMRExWmSIIT#s-Q#IGcO-vukxJpS=v=z(wMB zfW#S}+Fw{;OMM9j`DiH(u`uE$tw#=pl&wGrR`P+4Qj9K7r_OW@{>c0mYhXAmykMg9!RtuPKCMRS{{+D>TaEfv%JmE99{+lRUJ?D+pJhd}lbZy@9&| z1)Zrq=}qlZdop^ZTijeqWuDrzi8CIYLv!+7BbrXW#Hj+pGS$`yn5<-a0i>Tmc%i-F zP!Q}wZf`T*>>eEAezi=G21y#F-}o)oe)0pr0q3UnxDSV*Na;cQYapdI?$5+&hD|!~ zAz{K=lL<36EYKK0oFF5HyYBU5zF96}EHY!7z2`PZWNeyNPHG-@41r8oNO7K8>1Vf^ z?#PG(+HmL?IbgRExOX5jvNT`OCe~&fRW~^YLYiD`snNpLwkXfl7L=c8_f~onA$UUj z^8k~nVQ4ROvprj*EJhp=yxk6jmGa(ijv4Q^}mIwZoebnY*;)#u%s3=X`*mRevp!(Au z4njjrDTpks5X)%z@UZl_2{B2?C9{%6yVuOH3znhlL+_0ZUIiwUk`>*69>R;+lv zY#vg>Suc7+H(gb_Trplw4o)~+@v>i{_zF0Vc0=A?A=9z#!J)EBR9&WB7#!ZBi<1fC z$)OB$Kkr@RzTbLG6($bQla-(j`e)wKjDXRYdyL`MfBcwcrlY+j+D+qFy712(^5=*B z@JURAi=0FMEA={6>fw;Kpe6|d3lUM9o!Zw3WU{ArWHTd?2HFdt!fsJr;xT4|1!WET zRCD$NYPj5-RDQUA3hOrqb=^dC!(dg(AJ{m^siR?OW zc-&I&KvnU@pw;ie&V)Ok;!)vJxVCJU*sRHRP?2YEdz5`>t?EZHlWzI?iM=EUFXE=zv!(< zvh!sp<%8(cogi)@Y+EdrD+N(3^kz2Y0@Ngw9dB#I(jeqRI&)^kq}$8c+ySRFYmd9} zqSQTl*uUvbt@)Hitt3_@fy1OFZ!#zXvKa{N>kxuBs3j9 zD4ja6LCH)l5tPbA(1=7PLMnE+(wGPulEh@Vh!iG+1|%>MEFgU`P)c*9%#lhM6u7SV z1WPEMrHN3mjGh>U%4CXCEPSRo1xsa$lmgcgD+R6ClpZxmss~$0K(9JN$ty2i$f~6J0|2a&<4{Gah0lgC zxX(qw5T~e~3ctbm45_+R<70*^6`*~ImILeW)V?|u*`5*Gn`jHGgR+qdlDMl=N4RW8 zHE|59Da8P$c9kbXU0!ITQ3YD*8lzg!A>HF|tQ zQb)i71yd>rYeqflRjD-8QAMhW-Cr=Rf}rZvMD7+!K^#=ndU)M35^XI;BZUXOyUu1G zovSZ>g2AdS36bhxrFdzdKq^kED*%#;ET|!3=?Z|PBlGk?JRfLNFCV6MTkHMir+$W^ zcW~KG**q^>?ZOEz+cBs|OdK4V-(n+62>yNzH|P{c4*Wm57Akwwi?|7aveM)JPrmB~ zeHbyRVr(|Ee1c6_OC+Wz<<=cPA3HDL6La?=ju&ITQ3wZy`p@|?>N7f?p+#KLL~8he zr75>XM521$W6?r{l_TwqbOG!uDm>|MPzyWOrIcOOT4;;7A2~!IX`M>PAltg)F+4JpTynDx45fO9?9rn zKVe?Pajnkcay0BqYhQ~qyiFQn4fP$PR0>%i7pWjoSjv+gZ_??IsAfyx^5~#BVVQ!G z8IhUa;|h48FVNmLH1oti`!B~*xyFhc?W&iQ=blwXN*Vt|=}p90g}m8Ozl3i-)GrjC zAG7ER&x#D+o!K+ic3OOvdWSADcW?aeP4uMARaw^1xm;YqDgg$|oR8cHkB&VBEmENz zVAl$-CwNbn+KByPd7B4M>IWo#ac_}zO%@D+Ulai@pGlwy1g4)L1c<`2{hBnX=$8ZJ zzoe^60(XuW?{b|4+{NMYF!)n?-M?(v2*EDF2QbHmW1IrLwMIiE_%(cla$EP^`3PvH z*RwCCB6_FrPN4#A%v*)nB^)omp~^=aXe;&xTUKfSLK)fmsMvr7rVgmPaDI&d{J`x1l+BOOaaqS zRkbnVjwn7x9@%%svYemXS@{c#-iSuQj@76YKt1^07+&JKC3jL*>+Y3b^;?+izKq`+Ec1 z?marN_pShIO`OZmH+vJ_Xg?lKXY=sGMi0-9_=w@;72jm`qBk8_&V&-qm+*fVS1k{m zTdUWnK!cdv)MEFRI*`D3chd^&8ps5T`x3DyjPqVWWc2Q|H@?Pwc{g_dIa)N7iO4w* zw(t525c)o*uf!K>P8=8k&@*z+o9{R%AtFHJDxu33=-N%b51o#~1;BO*E}e~}*3fA_ zEU`!=7;Kagy${x67E1Cxoz@{*(9g2h-A+Z2OG^LmBIDyb=yQptiD1>0M5t?Zand4Rho~HG{iz( zA(*b9gI((@o74#*e34cPQ6$O33fW6R=+BIrGTOOt33m;YpgAs7=}U^5a9Ird%b$>T zlhv?$g(^7hK}HRiGNHO+=tu(d@LV8)kTZp_2d-dA8P1{-B$xCO)>|v#ppjL$pacB= zEZ?|OcrmpR_RV5J4VB2#zO7>hBQbzUsywjbGoZcWB zd`Ij>u&8LhRqf5>W!32H(4u|0NHfAK))o{Ds|5MQa88%GQVh^t3EE+DPCby_z^Pqbdh{p?ty=7DM9~b)8RboAYR# z-}WYMG$M2;`g+*Mb>kEOYE(keiWPx3plU0go}-J!Pyj)6Gs3(ECZG(|0j!hWaB4h+ z6L>w$>hd$x@o?9aftDV>a6IL1>k^T?M^)9mTFQnqpFoL<1iejFI@FVCIwmAx&sIVr z^W;iGd^oh45iHHV{aV|oRcp;!xs;hRms8uKzfF@9L2^RVP!322QJGFvW=V$Qx7x`t zk?xo3Vr)0`7w6WTddVWOS5R%Am@RnBp=@P}UalvS?e~2~dA(^IS56A8N~Q4HP+lbS zkiGnH+aRDgZB``jIlHZ)%hpsqubmPTs*4N)Hw9&LF`5r)FQ?!v#)IDURR-_YjgqG+ z#;sc(-6}YPtXe*WyF_H( z!%LYpy4Sv$p1JiNuVoTe2!bh;N7Flom(B~?ufsu@^~@0(wr9v5AcsvV`_Eh@w}xT$ zfmM=+#x7lDjnh1GN40x?{MNbiWQYus>HT~MG9R*qmmH`>m~a(Qx3>X z>h~tS{&4W-$>n89c@b>W>Y3%V26eof*JlIh zVYavmEHn_}Jqk!mOnQY5JumMjgP}ytnc6a)u2y?QQruT9iKZQ$VlYQcp^?T z!=Y6x$v-2>Mb6B1r+P#u$oMtlm7wAtYJTH0p9=ol+dp{o;H^iG4iAIRcjec;y}h>& z-lQ*|d*iq5?Ckv2*@t$1{?|UXbMvcj?411A$9I0X|1~>5VSi%hNB`p2?hJnL>vq2J zyFa<}-p_n;=kU*d{m%Grf78zRLpwWPh5sJlzps?P=`Zp3SM7Wpf6>na?=SjB@S==> z6%gWY`gBW)=fUscX9BZZihjSb!hdcX=(nJbXcpfDr5|Uih<5tV{YLE;|G7`x-$V&P z5-$kCZSRAfkMdLcPHp)xem)M0Kf3b~JpT}WQ;84b?Hl}rpxip*e-r#_Z5C7!jiRlB zBDaNtZnt%AKZ@R?r>Y&{R=D&B=~a9XHMnnyb|EQ5h3H>;N6(2fN&gYu1RvzG{~KW; z?hwu-EL4YRH$ka3yX~a5P+8HNqCW{v!BQFV&EMOC4(errQ^C9K7H<>;NeONNuL-VGYuxW&1!(&I5r!8}-(VbH#ZMIHKLngqw|YWwf*N`!#sK{$dfk?;`uii? z0-}t@82v{w<#LPY49Xk5cYo+z@U5bP_^7@`|8mQU-+nymiFm5&BkB}a=&jrH#BY~o zdQS50ju9c(^i z!4|tu^?wT~qfh!Fxge@ZG6@ICtLRaBM?VU)pAzD%&?kz=;x89oK#M-0XYOA|M-Pw4 zdytkF1{VE2rzoYXW`jhe6D&8;mu%WSBq3eBVRyWjCqhMnJXZXm9aRfS>K=;I69N zTjd~_fPikKca&6b1iioW^R6ElM(T$8{dB!$jz$gw7jZPmyztVf$tdM$NR1$pBK5Su zYYZpPwO|$PRi?zDft-u12{Pu4z-Y*TmD_wm1@R|Qyp=k44Yawtx9^1;$22)tei#ce zz9S`Es;hEdMR*kvG2Z=0>@J6%!KpF#fH4Y?j*TPrcQ$0Axu+j+?rGK_~$jLnn zB2PPMDN0w@W=1fp7A=K0Ki^d(84~Bumg3y&+auzX*@!agBey!1ns*WP%tIK9g4F_i z5NUAW9yxi2SfM*2il)MqY1%dRA_x5Rjsdz*TJq!$T%r83mwXYLILhK~4jmGfjSzk3 zM<9bIB{xSiZH8i@T#|P=`R%7|t&~|Xl-ahyYQ05rTyt~7Ct~=p&I^oR)lE6OBJ7HY zm*Un2g*x0xTd6dqskvZ81S7eNa%M%C6&5X#bRc-<%suqYj1{>Gb|Z&}?+{U17Kq>s z8b|FCvv)w*YWT;)t=6kbhckMZ!ji33YE_~&dLb)wgnX|>CV*%qu4GKB)Gpsmrk3zj zBSNL&7Oi=XQVIp82xq+nBB>Zs4*u%qlJM|rwGZ13tFQ&leTNG!+2-xgbO&6lQBIO* zMvhd>oQ*{44_|q$HoJ1Elkr3kp;!qp9fE2ST5{*h5uj6(ms=%>MvDN~6|_u!T8Q1; zC7d)Rw) zP>biUe~d8~ML{j*xs6ZFtfPlX3@%*tUmaIyqY+8yD>#$xV3R|kW75RRL8NIH27JZ=czHvYebFKWyAlL*gT0E4t zdw^)If@-kHhG~`ZZ2k}jvwON>44_vESpZ7r03%q(IT?ay#fS~c<<8@$=_;j|A_ch)4s`?Jog6!9tW?$t70%JxiH z_wE>t67C%_8K7}l?c>Q%?C@O)6Av2AV4naNm$yCvG@PwI9xR-rJ`7dJFM_3kAWoIf zg5snuGxbK9Vi%PPic~6iM66PwqoS1x9ulu~*ocUwg9pSc6*M4fen_h@93Yb^bX(d{ zJEYqcetvJd=IKOap6&WG&#sHkRfm$UO`Iq~V-WR8`GGwqkq-yn+sf!weN@VQ|w-XHO)JWq*eU|DqUHCU57 zcTvq+?a-PO?s{ZpwfgRf@_4lA5Y@;$m7%o!7fCQ}xPfU?cJ11L+K zvk^}f{vl40&{U(9_alWwGk@fuxvTyRpV^`UX!cg`a$QhmW3G@99kv9<}@Zk|4u|av$Qa;PmAuJ z{_A?*o}03}glokccpo!A45#!Fc(1>T;W@~j@x#?X?x1JB| zC1kXgbeVAH_ccbnI~%G3`e?NTEPLXP1d5+x(k{H2fLso_?;&#ECN7-ytA?CiiP=>5 zu$q_G^Fq32h(JX`!`^h-du4Qsi`m?{t&Ojo@_3HR{vsD!M4!-DLU=>Cr1I*@8h90+ zIwwXd6R72N;m_eN)8FF1)YI2>`_u!^U(^IFkt zSZC$pd9B@oSCM0O2vN2n60CUDTd*mtwQzQR8V=V?liPS95_iSGHmpB6w3@Y6t<-IH ztn+7`vVq}JCquhym7f;N9cru9Y1dlk<jK2lui zDaOigL@t@oLM4VCecZBHvAEaB?Zv8_ID)?KLJpo;=K1+)tNr}o5|&goJ_Tt~SPnq_5KYEwz4o+Pi$%Ew6B#&=3C zC1l3CU?>U}Dvxl_4^0w#;?n5d*N*I{ls`f&gqWp5Qbb|uQPsRbap{x_O=qwe**vsk zD-t>sfFhioLUW%$nI?&`1fM!{r|*oKxHY|poBm=kKRJ}I&wJOKR!@+?$B)Gj>FCfV znsJUK%g?P>&cZ0!S7^93zp@gQ4=dSm}zDn1FKkN}^x|r*l_tnku21*^_E%oL-QGZI^3S3uwf+ZBs(nKg&MlofHGMSdwc@58>MSu+m=i^9?Gw-LnBM*oWv}L9Fu-a%M}+;g zYo9EQ99Ufmi&mV7nBOTnWz{;e-M6BSHEY^j>_rS=u7_+(N4P!KyY=4JfycE7x#J#M z;)G!;*;(hvbPnmQRe{#l=u)TWJaRUDP|a^`Serh17OiZVBo8}^gdGLOLw-939R-WujR{DRl^@B`kfi*KOFENeaCpdfpAu^x7_9N7 zwWg0d3Xy{MB68YbN$Nef@;%X=5!@fg@GZsi`>Wncur_)#57q_~?sB8u^YOZ~M;;5U zvrp%bg?2f2CvmLMHI>Q!_j+k3Z^@`=aZg(jv3=w+W*M69SgiDSC890xIyM-b%^e_wK!n#E=2M2wQUu0P zob2ZFN2bXV!?riQC?pjP5FZ~>C|fNycH@eOwDVqAf(QE+)Y|qnELHDUu0%z=Z!XO@ z=3x<|Ga1P?9A#l*a#f+FDm=EypxL+I7xG9{tSyhpNbW%%-_GT6C3!SI*dAU?NTDcN z?IUosnz-1P@xx%FmTwJLlZoT*g@kEOMenJA#X=cTWR#l-WQ$3z>HC{=*Dnfy&OIPHT&!{dG(W+mM zS1_f5Xbh|#et)?X^lDW3Oh_F83lvPLARK0^N4+YQhB|T&5k|5O?MhzJ=(GxgalD$y z-9jmdgHgYFc-=Az?HajQxJsW3KLM$p_daIpMc|Ju9$%G)Yd)!(Xi>L{+%(cOjo`Gq z+r8d>F{_pC$>`^+MttHO*`eY|ov3piT-)&c72rLAdeWjRevyLG+525<2DE@mx8TR?iKzB`WocQIj=q#ZV+h0FJ%h0XGj*lZC= zhwh6A>3L-#BpSA<@I80ASNr{`bxDhumx&Sgp|yiVygz# z;<-~}c_nLdfl?8Ae$!Y??%PBZzHaeS!+Om2y-Y-)`pa{g`nt>iHW7t#a7NnTy-F?| zb$t5jSG{WpYcEbx-2IR!1Kc->wY!eU2;uUDC>YvG5%h`8l%~=NAuXA%8DwaIP;aMq zbA^?NDV3YmtM7=3aJ^?MHOw`Ng~Ck6u?@wSNQ;*8&Mv+EHoU9)#B0O$sj%ME&4c>5 zU|`y`-V8-IyN{z0sNS1!o+kH2H2PG&DH_&ppgZvqd5(|v(WANJ z96cI2itJ*2IDh5tf9qr9*je43!t9eo{ zbvkWhIL0}%;o#^|q{7+aa@L;?C%~s@+|S5BhOiv-kE% zwb(gnnhl1Wi1$ToEE8O*MZb|&KU}EMEHxUnO2=PF04EnJm_?&rD78u_ojR9;Q31tF zsEgSAmBc|cn&vC|U|P6YQ-*rPpAU--^^Kd;rteqY$B~39F(#KB_o-JS*UaTrjqec> zn?9IhUYR;Q0+lE7HT^VY4(USyk@(OPu9N|K z9solLLRbnNdcz<5m7$qpZptOSWp42^M)RDWF)#V6q(~88C>tfSQ^fRN;a*X6y$-}z zjB=?|#>f()_*xNPG)j$Pxn59%C`Q@?BT)!KbUYS{MWa)wA6Lqi%uZxM!48RE(z#xi zDi$6FVQJ)NV**y3<+m)tT#O}+i?Mu#P$kK>lD}fjXk){r)h=ar;rovCx=}lB)tmKd zIcw;=4@t+h4Yg*mRDIn@FPo6{cC*!})?PQ#+eWk8=~UZoCfuF(c#thT6^ zwPKvK8pnlJr4?wPcI`|Tx0Kt*Jh`PRm>8yCut-`A!P@Iax!tMMYK;@FUAtDs%XKkJ z_(L$A8Nn=3$U;glOhTt!IVrX4rptgD0l0m{TA)Ku7^!b^clD&GmtSy|UnF3+pIuz8 z9l}-<-Km8dxc9`Lo}uCwh_+FxG-~yh95kvu83Mt8p*F`VdL|%6N`1tXOyi_hFPoi` z7ziP|i)&*BF*?yS<^jtBcM8L>nJ8Yf<-;&MW>jgxJ0^|`@*Dn(*yatG5+=}gyH+P# zj$SaU&*`r+eVozy`Qq0 z(JYl4rAkMrJ2h<8lq~Af?JA$xaS@h(HQg&FtA1uU<}p_`MRMeOr>Di+X4bhLpfmyJ8eNt!k@N6HCYpLE%;_UNbwwLaZ@bSLeE)@N)I! zxLK%fN~PQ_+x>(ex2q>7RXD~-?QKa?lq4(FqBBVSbhqopO51ESneMyS;VBGP)T>F0 zM|-k%RD{=z<7&CuYPIf_aBa5x39nXaaJd!*;X0CXpK4JNjx|}idfcqTzFtbi?@7J* z3GX1SO{ZvzrL4Y;-xJ>z;mzSEjMWb zt5#s`UoEstumQw;#8{YYLEQlp#GkxgIH&JQCveTKJAic@&%{h0qv8)i0RNeVIwSyG zCzny}9tNndnZ-i2(hxgBT2;J%sK+w2R4tWj72)@K&8Tl1okpz+)3L+@;Ps-uZM2K< zp_sLJ-`5$5Im_MlM{kYl<|&0|P9{Lvw*yc5;m2<^3%sEetATjzGznSS4yD|AWL4wS zVN65_LueuwqZ(!6cO0qWY@bAhz--kfY>^deEwfY291ZZ?`?i$!Sl18U;YK7Fzujr9*x%6?;|*jV=ot{xLK>vpcfr{Eb6 z_bR{URw#@-2$iO1rU;A|9!7@Y*`cQ>hbpQxDy3>w*le#6<=Dr)qnbPR*=3m$Q5 z6~J)(md7Z6Wh`o}hfpP{D{p|FRE%o-#B3E#-p{+YK1J)Nyje19CzaCcrWETi@nIXA zScAupP}Zc}rz{0R$Fmk^S>P_`uPg=(EnrytG7P_A!=7bGO;T)rAClCGA}la!KIK{& zhF#I3oX7Ke(>Si2U~98d(6Y_mKXTqG8_ia^+$wa0VHVLX?^~X?>c&Z<+Ag*#-iCRN zyU!mm#s)x!=q8NFi`nv{>$;z_=43fW~%0I4LtHA7ij8X{WZ47taqFoAw}b1U*%Mp1HOXNW; zkq1dc9wZQXkVNF6E|D@M{q!(IruRHbl6n>HXYWmvEPjQPD^~HeY@U~`HtgTxxk0B@ z%t>!LzqQA6aVBQJX6_szjh9gThGt@VM9f$%OisS(LL@*e-q`);o!+!}YtQW|a*v&# zce<02(;Gzd+7wMb>hb~3P)7=~h}>!8#bi1D7b|tBSW(=W*@kX%{-<8?fspU(_ zmLu7^$Yc*WLOVKzNHFn7*!7U8_g@1T+_;`H=K|!C8z4z3HnAeY~zT&=9Q1 z#-G|>SlBbvJjkl`gFXx3H2bPOerW9NL92v{m$20B-}I)|eA*k%XNJ7?8DPE9$m#dy z&J@p}$PQVTg?g+C{bNrzEGcO7fm{2Wrkxfn2II+aJaAsjgu3d^hof0k=dG`^0(FbQ z@2OhW`#yybQJKiSNR|)jz4FsyxpQ7?x2#UP);cerp5dG{kAS(rAar?cU}zxZ`LANn z#njwg3}#J$iHC-iF0XIw(WL1N79(4?EoK)1#%Jedt5~)yajqMvNQV}k@f_{RvM8Uf zF_`3phG8PTFY)KJJ+VDrjQg|-J)8HW&3iWdqNXiYG^^+|%AnvLM3<5y_{H4UHR?zn zy8!kT6-EkJcRJ}$=ZAOE34%_y%{*MS2qY^%)KnTim5#|L!9nAbDUK}j#H}|+LgK-^ zr}f<@hgP%Js+GFUj&=U5Q>N4uUG+$f&syuaecCi>tcGB^XXR7t>>R74rj-m;#GVaK zw$_6n#=A6Pgxv=5BlFF0|AV>aeQJ2EU%6DR%)FcU~hhtB2VN?6w& zXR;V!jukSNZKk@TtTVN-61Gw4=#?%Xm-7jA;BT21oq^q1T#kl)Y1nBQNpj^MF$fu@ z%GIQgi{xGumPV?c45ZT`QO%aX<9`Xrc;oZ7RAGlu6j%Rx@=Q8T>2*S^Gr$0V`LRi9zW7s@TV9`q(B zx1a>n)xBbWfIZamc91wPvyyDX%h1I}Xi6C+4Zf^oS%ti0W7^dy8Cj+p_fiBmX;>Cr z;Ur@cUar*Vx&p>4DQRZMc|cQpIdQfpsbL@9Dku}ZBSP{A=Ww9Yyc!nBq$$nyjfzq{ z^2O{z9u1aCF`ekJ48nb6J~hKZkX6g=i!I!4n&fLwvHH?i9EXNOxU1B*rsM3paX3wQn-9=yo zJgL565?Od)D6yV78(xpGRwQe>{2qp)IUYQLzc@T1laz-yr(&r#jg(3n$KJ%!JwJZy z+<7t_WX*x=Zc0SQ^^*Sa?szH}AH*JPD6-;W6%^sEYTjf3Bei9}oMXFGZ&^nMMt5e< zc!yQX)Z^MZ7)dn6U!2nvd(oSoznWlg7yFkbxy4_>GAH`Boci`S^=&2fZ8i06E%oh5 z>f3ti+h*$9R_fc1na-^a?p^0ueLtR?9b^_vf1l1X8p!G8)A`mh(>aGkP#O5sx!1uN z$#nYQ)6ImS1OEs|6IJZmika6nQN^ykE)sh< z>?mx)Vp~Sp2AmNB!*DztP~1Vbn)jxMWeeVgx#W89uw%Te>yKubeVSx~bZhL_$SLY+ z9fy^db2mm^iyU$m+UwTta&IXdXaYP{Ua#r)Us5|F{ArJ+8&_-uYv7lwoF(0|p>BCH zoZl?dD6Vwb-l4`?=D?ZE4ezp<;Pvwe>$;%3x#x&wvZwscn%RBqQqZD-i_b@{d!b`b zVfskFEPTrdO0)`#SFmVO_hPwIYvgR;jgVjwSjZk568-6c6_Qp78FU;|^%%ZCP@G@< zgbsd)py?2&Xxy}XEV95aTA^C!ST(z`Dj%@LvyV+2ZFq3FkG0(ft|u$;h{KS|h18YH zTu28vT;dN3Q~NmNg_6TJz$OviLwZ)q5oJ@SV@hd@;y@i4uqisDfvQ+%WT04~IyLq( z@6-&9qu(m+C+7oZ>k&c&^BD|ltbo+>Twh0W&{95!F)xzU0}l@zGr=OC1PS&Z2Ca7` z#lziQJl*7&LC65bM<75!*qDlx3%rz>gjH#5PusCB(B&9qmO47TG1fF~^D&+=8rN zRRjXGDiTDNu@R6jU*@ohVwAt&X1;zQi!sqOWZjQ|-rHADED3&rLOIPXz{9NCn+~pe z!x7CNHD`8-JN8%~@53X6?;KzY8nCHhReLj1=)%Pi?}#8@C8Mp4bA?Bqm(&SdOnk1w z1IuO<#<*=ynr1YOM5=I^1;xJM8Q#&lw2ZX%Ru1VjZJw`@s#lU*Kb=}}e_4f`rz%q1-5$lA$8Fx6q> z?OY0Bx`lr%*Jp|PEElH?|DW97Zy@Ov zx*>n%MQB%+wp%DT!_Uf%`qP*qjQkpo+jFic+O-E2$xgNieHwewZY|P_=6P)6H{?a_ z%X!=+RWBiW=6uu`-qPV6_ml-4{Rc~fFWn;+wYZmVoc~GOOE<>99{19V$+u$5dNKKy zuXOIWi1l0K*5DG>Aj0!gWIyyWDEpz8LD>(z49b4!WmxvZuie5@_W5-#`?>7Xs(abc zR450EpB8%G4N#5S7uxK8Hl}pHnrdt=Z1uq49pR>EYshZMZTDE)J=8n2$&?>N2y8TY zQuSVsV{r0)xBz>20w&MY9p_WX_f;}|6H>Dax!mL$NH`u-4>fE_#mni85(#YK#6{TQ zy1}_C=(ub-{VC<7CpSSj=C6(XVYhT{3~NwYUbP&g@*4FxaeXFmdpf!4jV+|a@Yb`T zV~RY5O0da1KmL&5i^qj~Pfe5DJ$}j0r_YF6M~>KlL~T-6#dpj`M=tAO*}!RUj9U?O zjvo-AUPyd=>CFZr@yso#(5gtp#Uo=R<*CZe=~#0*JY(bvAx0ti7pBNV`QC5knf!Ek zeUp!tgh@0XEtw|}f_C9)zM&m^4%?l|@(u0GMI+nyr;d{=r39q}izpW(O)<*jB4|6B zwNK0*1)Va;SBK1QJP~IZtf?pKXGYJ%dK=uv!OhO>f+ZA%Y(KS*cr{@8(64EU@fqTDbDJxUkiK#MkdI(LiR)kruluafy z%EP)Kw1L#)YmKZSrN~Z8TP7j};%-8sB_-!K+TNUw5lf3Sjf|FJylHKvUE<=xty@)Gcm*K}AukcK z_|biUcf@O_+#oUu5X;hoGO`Gld1E0NVi*? z-OB?)65PfZX1t8k zwoiO(+yX+dVufXPAkL< zzKhT$C}*OanBDtx+^v+TOBOs=gx4y;rNzLGb%kh6&7t;Z=Z@v2U_y;s(KL}!vXxq; zHz2d&`7n(P)07U&xfS7-Cun`r3E_bsGU5kb_TUeYp+UaitcK@;6%nk+FwA$=nI-AF z>T!a$l?f-(U0bPD1e&KeIv-ovV@q{b&aDWyq>$lyJL}rUJziK#4=ng(2BY*#X4#hJ z6*yguXHCUT(kqo^n>)j9r~91YG-}mK-Dbx+f7U4*>|M2QC;DzPktjS=M9VT?(_!i6 zD97E&afU>21tEb*R`c7lf|ra5&#&i}mLB$;VPfGJ6R?-IF(KHtVXq$F0UEn4A*$DM z^a&)(Y)S->Z)1e>o*C8%VIntMw{Tk6&Xv|SDwKPE0f;c=bap*s@-*>*v7C)55yDXo z9m7UiG`d{87yX0jJT7erg+BX8+kkGOilvGO?G`7c#R`a=q-e8Bg-6J}?Xf0vXtS*r zT~F82Xz9|c;Y&N#mJ2zBu0~EzJBabxrfsTO-!g>(Rb>?9S{ozUVQkOE-M^`qkwctuDK_nzg8_1RgWclG#kFO>?AsICU7l&&-wfi! zB0{0ToyMRg+gC5z6@imYavZ%-D6uk|S_qHoKesd}-o>!-0>n2vgjjJPayLk0e~P{P zes4r~L-QuS4$)of6hQ*T)7p8hXf~{~a`C*@ZW$D+9K=2x5A2s(d^n-9_RF~SS7^)v ziifQRsE8s9JBCB?h(q_5lsxZQ+!BRMXE)W3y4VL3WxfKAnyFR`EZk7K{9I1c&c10` zwwvym+yIo5wV3m#QS$+loqzjHBc9rGo^VV-WP*;EK(s`_P?`6}eH)h(E)b%oGo_sr zsTf%-BI{as(g;mL&s&IIL;l)^J-(jb7@20^J{@&=e$g8(mM%4tHxy)0G;&_pQ!Bqw zW2x2e+V@A?T9pr+_X=+oO=NI~f=>w2N4Nr{QsprH2oTtKag()%dnsld9dQeW z4WCP5p)IU#u!!T>>sxy^>s{M3S|Y@So!&ZFm&!Qtxc6hcPbxcJ+}hJ&Kk2o@v8-9a zD1={yR;LGHcV(b2Vx;4iJfYRhgp|x^h{$YmN<=4Mu&7Q8?aA%2JiA%E=uOWNSI6)r zaV&KIopkIR=X12}^qx8;!kyxZ0Tcn&;`S@5jWR-ur1ZJB5oG$ zV3Ar{5jQt?u*gYT5jW{}ut+_vNHezi&9ow|*dnd8A~=8^TL{n7i^a=8$4r%iju|fp zc%EKcyexFgRB7m#@$!J@>9xhnM8`~(ijEmC7kHjtTfA&^%v9;MSIf3AG zaubNPB&p5>8EChE@Rr@%INsEUZL(Yh&t!r4c}em{?L8P8TK6^k3EHa5Ly)IorNh9P z;_RE)P?tM4t8AyxzC?68B?0xyTPmWK*y3XUVQSwx?~z6NzUcm`J-efwFbEvfci4F% z_WDA#h~A6kQPc$#c>?bsY6_n%@wTnVXB1Z-Zg3e={G8kef#HFZ;lW_Xxp*5qnT`BSTo^V}%59AvEF zTn_x5XYyU7lc`oYl~I+m$jo|Iwsm`nP0|1j9ad;;1g85-Oi~tJ)#Q7%qi9qGER*wO^vn6)VOy28$(YzHwe~{vx;) zvU&xe69*3ExFvhYmpo%wc2;Cz6Gt^$LnOhK zHJ?&0uNZ+0`GpqnQeQ5v;vhrfxR^}rX5f&y*P8hfbB1|)Nea>|x(UEn!i$GcA)UnuUEt+qc9DB@9@$(=m!EI; zCLCaPJe1YvT6Pvgl>90Xe*0GlO3h$G;*HpZFG5om;& z)(nYIuy;M8#4Ilmo|VF^oB4cVWpvN=VmOdyFjxD=XWXur{hlNtd%L@jA3y%orw;cY zy}iFrz@K}g@u2$^)dxRa>-WEM=XZQ$hyQ(gFomSNXNzw;JAeEuc6L7dJ?=O8`;AZR ze3}L8;hFnp@THxdU$b_0p1l2lAN>M8jh#;vK0O`u<~rY2lj6RxHS*VKf2M-#5A3HMAB?t3)hdYW*y zCfraH?p71-3z~2XO}JN@aNnm1_xm;B{uNEQAJT;TH#On@kS5%}qY3vXG~xa|O}PI+ z1MZ`+2mVY14)#XKE+M!d(}er;ns9$P4(@U`BOAs2NA^qj-w%8Oc1{Q`I8%xeKk$i9 zMC>7$S3Cbjq~3UY=w~(H2;a|Xz)?GXK?9EP{WT3Z!uN|BaD?x_*MK8@U($dhe7~## zNBI6H4LHL0ziPk{zQ3mdNBI7M1{~r0RSh`8_kU@?5x#$<0Y~`0tN};({)q-0;rn$B zIKuav8gPW~K{+^@lGY0!(tsm;AJKp#`aY%sNBF*41CH>0jRqXy`&tb+!uLrHIKuZ0 z8gPW~pVojQeE*CF9O3&`4LHL0Z5nWd?{{jz5x#$31CH>0hXx$s+tYv}dAnK1TzN@O?o8j_@rs;0WIf4LHL0 zy&7_WhO65rupGd?|IKo8&V!(Zhm0>*pz6}vlJulE3cLj3*H zfP4B>z>+=vsZW5uke~4X#_RtWF#qnmzIs0aKVhgHyD0zp?|!iJC-Fo7K8zp67iz~L zp8q_-d{)4H2;X@=5Ap8?&%XsQKPcfmd?EV&G0^-ZVE)s8QQ%{~B+&Q$)`OiN#}EDU z@Ws&gKLh6LK9^44*8;~rV9FAXpyT-WcOfusz#Q0qe3E}ei2OIj?{@(6S0tQAU#Pu* z7ihi=m@i!md|!=nMofGESv>#ln+H4Jk01I+avRqlzX#8M1Tg=dgrji~*B|6K{@(!e z_ArDmMBjgg*FC^|^K$|BamE*w7ozXq0L+g|xHS6y24KEoB=9BC_cws=cL3%eN;vAD zxc>M7p!w0;2Rpyp5%|8wr7yI;{M~r|QxXP$^1nE{^IP!dS2W<>1KdX^qE3O0_#9o= zUf|{TYry?p!2R_ITy)*|{eb(#7h>uSjkm7{+`koqi{oDdsD1=+|Ibw5Bsulu4}ZJ= zz72mooITj7;fMZFzs2GEIw1HSzR)@X^IzkK{(1T@qz@W+_l-aFVCM=y^zW$JC5;an5C11%9{dr3k3Qr2 z;~(Pr#{u(CB%ILCQGG@DKKVxS z`1cYBeiAUde@fu<#&2jodI)?!1DIcta2~!G{{2%w{9xz1@I(KS`1iZ;?i4UzlyFJy z{V3@BmjUw!{{8g!690Y_Fn?LXCE@$WAn0cS^Oyc~I=*iLzApjh%MvaL-){il{|A^~ z|1;_Mh`w+5kq0}!2S4;L3Ewwi{5}TE>3@=rkLa5K<_}1?Bz(UCe18lufB4U(<0JZh z0x*9?!X@GR`@r`Lfcf)(Asrv}?=J%8*CkvMzOO|8e)uOJ?0oDmrQ;*|ekWl51qqjg zkN8&t%;$b89Ut-U`vLPOC0r7|-v<-+Zqocqj~nKNh3oSA#?jCn_New4r2z?`e$BJsNc8Cn5M`Zv+}QT_^m zaca0o{C6;CB`<1HO|udR--){KlaIYJj=-2Z@U`p6P}7=|4hWaMD3? zW_}_4Ir$Nlz--ZQqzB>rwIe{^sbLW0BV7J|r8_^xh+lEi5y}3|#k~`LjuF@3q(kK| z#D5u$+m8VA(=QUI+HXjE%LI?YUtuS4M&p-<+qVI;=eOwm$X_=79wSc0NeBH6SKe{B zQ4Y*)e@GnFn`&pp6_)cJ63c`isH-*EbJ66lkFIak9`X~N|%3FTb@ z%ncnRzewf12N{12m@|)*xHS>@t%IUI+b32mJXzxUaQ>Q(r`LnNc0{ajkCZrSN1VTq zeu2g_J2VV}e1sc^F2bFmnUa?VgIv%rgtRxB^I8ksv7;nb)(6I+A^JQDxJ!U}LBkO` zocsntejfwVeyrpdNq+gLfHA<-kCQm+7sBzgV_`CEh=7GPemM$aGhADwNnq94v^{8CWAgMlfW96f&* zgUMOIBu$aHMEnj{-gCgu56rLAB~ICc5WPPR@yljN4CRlGaQ@J}5ZHxHa82iFW+Hy3 zGn8Lb+!)}lY=Ud5FQmV3h2X-KHx=dG0bDz`OgmEjy20-hU~bfK%KnA)M>)9h955Yc zOMcP(s|~<>py3q1koH0I5v}ILigcWG(BE+Ol=LMBm?;`AlK$nPfKFiUsFnOseDG^J zA3^@mc3?i!aFO`Y_;)ujJAKjl(Y#q3f2>%BlMYHZTzym^p__ndH&5aswck|4p9D;u zhKrQHRNOcdn49KHev#^T5cs_bOxyyAi^OjPZgc>~xG*|DnkSnN%nA(`iJu)et_J4Y z)1sG`+TpO%B?du0!pW}(1UnYEDT|}$kLKr=YZ#4P*!m!U;}YO*IV(Cp%HP`>CK^A= z->1O+eopiJ1};0e@}3M_;rY$;J4?efm%j^vySY9(zmZ__7BHPIlsNhuu0BY9#{zTm z#nJhZov73>(eg+9P6O_uOQZ8^2i#_0o?j(#eIw+L{GmQq#EO^il{oU_l|2aZ|L|(N zcxY{`=()o`-?Hnq>Yq4x>*#fqQqm;Acx{6g&MD^RRgABYue zo{%`QbK&wg4|K=oSn(!KI!M36<&XTeep_P2T%2@}UlPuqlD)qNn9f@zj_gLb`W*&2 z=K!SgU4{`M4Tp0K}fk}T(;wT^C_`QLSdBBUYV&B^m7pc5t{~moOR{RGi9g+Hv zB;1RCH&%4VNeBH6*H4pwb%KT=936}csbA`k#sD`vlwSyr(p?P9MH&ub3d@iBnY)2` zCX`>u_YmZ#e*nxM8jkEK^0ztEe5Kde1)-9LyGeR0yE>5tVB?L$HRsqZc4X4RPdtWrbkH$l119P#4i{EYW(luPPbaQ~2)eMf(^#gN`hKrOg)zd}5To#H8(SzB*T?b5? z|HyJgvM(vPJrbB{A4^;`e=_cqSkWIR9m*br(U(GCW@tE7Zz1iM+WA6YZqabWHDEUa zdO&*h2rw^(;zG(x{mLi6{Hozde&O`~N6=$G#dr%R9g+M$%HQbEVnqc`I_PgWeoukE z2$*r7OPnlkQ-Ak(;AR4IUJx!EKbpV41(-X&ko-u`!r6P$=eRFpMIW4WM9SaixHlA- zBX&rfYUd&Hqw<=7snc+g_)&S61Cvh=3UNd#?_AuQ1Iz~+E|UH&L3umwgdP7{@{2Uy zPX)i!Z(>CrPC8oQWch{Bt6E^L)o_Gny$UJsRiLi}#zX^p9Ha-~>f>4z@M2(2+$(XB zQI;kW4g$X|Iv!yw2< zIDYiJY&&qz?~Bfl?A3k^qp=H{zuUp4!~R(D(1GauXgsrnF;vpX^BYrfI}ut}5+`wy z>Vx>L1m+$M7pXpSz~*6K{)msxF9rP4+Qf-`oODFuHx9R_0CPoR^ZcF#W~YXW#E<3= zegNi(j?wvDi9DHr`9#Cfcqv@{)`Cr8r#SIMXUUInY+pj`_}vg}S{I1{gpY9Zj(NEA zE)BYZ4#tJFH}b!aIWkV1jFXN?Ke`2&Pc$6KFI;&^@7rd_i9R^#h@=Np-s6EW20DMmQCl!5*fFel8CJe8b7>W!YKlmT<8OX4EQh5U`DfccMxizMf+VDl9)`^uv8 zO9z8N<#A$Wg~U-i2q)(oaJzS9oY+(qogd}zTVN8ZB`#Y2IsU*;Fm zj_7%J3NQ;aT%>mN32-+6bJjA+FOvQH3J;oI1?G{J5*JDD$-ggL6(>%|Nr$q3A^Dqy zdp7|Sce%vL`e-`8M)^5O!yw2N{NfAba`=Fx?)KIQkpTo*oPOP+%r&xJdOe z8VqIubL|GnkJ1h2ucbo}F9GxCqY_8s^>F%93&CEw33hFZ#L+k-od0|S5{lg_F@W$9 z&VSCuog24@!G-wGC!l~|0oVCiiH&5hHskg-V9tF};#7Tv^ly~EgqOmk8-kE9CEUJXp2|43XUe{v-F zxq-P}!x1`M{ifo^CSX4PMDmN2KjPQ<(>O5^CmqrFRRYuSMRb0rgU1uVWPT}ek;WfX zzXiZ_{9587%@2(QzY1V(({O|iS6;GzPXm*&SMrNgUa}i54TB&b;rM-kioY1RIp0U; zNAHJS2h0Wy7fD}oz-B8j@jplBN9}L~Fq1S~B!1(-W(F|V{1%-beb@COFkfr9Nc^UP z&5yvC_ebYv0>8z;Y}as+_`$^yuL5I;AqyVaAF9ATA29E0IA!lc`j3_17Z=+~T+v$c zi{u}qf?ryED=`Tt9g1I={$n99w`jOX{Ri34M}YY>2p3LY=zW2off>_YrW;BBsD5jK zS+3zC$&VW1Wx!n4N%D(i4<>=%yTF`~6jI(0`K>?!t-yTRIfP$`olFJ40bL{pK|aFu zThzaqfm@g}|S1 z^_BuTZwGG2k7e>$ zy$Zp#Cps|ZW^lcMn+43GP+Z9KOTw)H=57r~?G5Q}4t-DXIMCMv^Fa{5aOI`v8he5H zagZ#Bs^5@yMCHgF+)Cu)qyu7-m94J_^N!_(Rlx`~XZ+dZ6CI$z?Baslas22$4$&Kk9#{19Ps1i`33H19vqr z(}x7hujzP;>TLlq*K4>){9Xa>eqhcXD)~jSL)5Q42+Wfjj^rG!yaQ07F9P$^@aX); zA%6dpTZwXGaN_zeKRqkuE! zM(0QU?|fiZXt+q__2b6Xz;w)u&My=E#sPDhhKp1mso-}JF!!6H^CS6vu3-@5BV2ju zy@x%(?U)dqALZ}JiLHbUCmoUUSB(6X1M{RgIzN)%Pr!7{m$*ps+Xq|^V7eAW=XWA- zxf%vRKEjok`qjC>-BK8xA6^R*Z)+HhU08jg{Cxu4hn6t>QWv`PxHRtUG)ZD~TDbfX zzuv(0utw)c_GJPv(==S9`q%|rHQ{Vw_~{wJm7Z7B19PK>i&P)a0CzVqe!JwS>_JGs zMe|{o0&}&7qx^9{9nv3l1^r%Nwua(D`d|8f;Vod=70Gldf876u@T2~%8!-JE1T8l}#u2?7RlxNE<~$7-Dcy0vtp#RJGyF(j z;%1>7IO&L#KPral`jLEzQ`^G!3j9HeysnCz11 z=~Dit0JFLo9LePYVD^N^*>RhXS@;|0l4(i`^abmlV}bR-)y|sAGB>tGaM#i@`8BSE znSK4(ob{Cc^DAqH4(Xpl+vS|nKfluD_4qtx{y~$oN2U+TahKGUqZjC(GSBVxVSW2k z`i~rxK4?fr`j8=mM)Xh7w#)H&4cM3i3(C9vbzX2;Fk(3F)s<9Lx+c08+C6jJh?r64 z8c{N|WTZ30oiV~aw4{IEl)*X1TtkuBj$JJ>`_^GO`9avs`rydbzIm=%ufG)N|38aX zS>vjzD|Kg%9XoW~Gy`^V!p1}?gPm2p6TII|;?8t9DywT9W5=eB%|Ez(k}|Y?sHTP8 z%j)2G3>h~r9sj1EqNkqEn`QhREE`v7zHKs8Cnuyn3(YwNhJ2%~Zwe{ucQ{|ibkQsk zLvN#q?95{9@lsq}2`PD5}NlDfc?7Q*y!7R~$%oa-|O&yrkItb)}V_6g05n$=StOrh;Nu z)ga?kqi|K1inQF)mda+H3oRM@Kcu9&QqpQX*lER+k~Y11NP0RhuFUyz`?ECss7y)A z&nZnw8*fcXGv@i|528#Nnvynu=rHWsAg?1vrljQ*6_~OMbBqX0F%=9Qg6kx^!)&mQ zH|CnmMu)A)VkxxRB^leH(8e|LM|Ppr82Dw+vlJzjT8T63uJbtp+x5N@|roY2ohi;ZffU55^lNyt`&#V$`Zb{{`Prhf|) z)hQfeW(W>%bBR_QD0;%s-78K{>pjoNrzHJ!3L??b0``U%qg;7 zSI_a)x?Mi(u~X)(t3u9mJuOx6-~{!}dLXgB;CJvMhXunfRr$Hu#ioL6b5V|wg#MRV z9AsS7t*=_8Ywic})8TMeR5)u&(E+7u zdoUdve7CNKicyAL+N#`s4Uw8LR2&3o$iaXz4hEDi`Zk-Vkq3bpaS)i34+1m%ATTE# z1ZLPlV1^z9X2?NcG7bWh4uv2c`2kMTi6TkY5m4|cGW3e3ID6sx<8UV7PmJ8QtGDQ! zL`tV0fzd${;E5tLdGCP(2fAZyMB%6QQy8<6qFpknsUN4)Tkc{)d;B;Lb8;Ze6CHtQ zg_v=eRIBq=iLMj_zi;Y+cON{ZZbuoM9FYv_01Z{`DXjykJ4gdHAUw1ZPnCpr1KkYz z%lH})jvm}&c*;J}8RR)2lK^~mE*Cbr7F|HA0Lil3UefRF@~1cwrJ>)iYQHDrQ*`>xk5oX*K1i)4EBVu# zB6R5T$IG#N==`)7Ocnp9L-@TJ@>_dBNzB*E`;~V8%VTAI#%Rq#um5)1Z$15f+HXC- z+5;t3{<4t!r)j_S^v(qCCu9`gG^?YFMKFKNH^{Ok_--3e`*4*h;+$nQxZ zzfTSM?GO3AB;@ynA;0NOwczyVNn`NudqRFc67u`$kl(Kc{f?y$@_TSg&>96XCY!eb zN=cs%?;`?^YlK)rcJNwUGjP2QS0k?1<4RMJH{e=|>y5ackLyjiUV-b)xNgMt7F^%M z^;TSyk=7l!&cgLBTxk{DyK#L8*L!fK6{POPbqw;b7T2?JU56`udHx`-^d;m&xZ-Or zu^!iPP`HP2&BAp9u1;JZ!}Wb!AIJ4OTsPyo57#ZYc14A5#dSWe&*1tPuFv91HvTzW zLw$==ksq423-&Drh=6bLGw#g`?x_R5#n|y~KaEHy%NZWIhc@lJ>L|dr(}%F*wcLYq zx>yvPZey?Iznyj}bsN-g&VhU~MW;snCdq67?&aVbkB&heG2z4kzpQf-$yYy69oiAD z8(o2Zh`LegsHjG$lcYY0CVjX^YY*a|N1#fi%(=yVqxRnGR$vK=e-Fx{}>*0Q&5k* z8Pt8Cf|s_{BlmxuAu>9CLm8+)q$lHaP=BJ@>y?tme@WKVULgo^p+?Vz9+Uj@a21sfG=MzzS3@_wlW zzW`=M$HQqSJVVKOej6@56;F4b3Hc6aUBE+eW&`vAsONyG+!|K&0Pu5=6ia2nsKt-h z3aEQz^bG_Zy2r7Zf5FPZco04gg5?7Oq~F@s5#oF8{`K1ZuX@Y-k7&Pj4~^ESp+omr zC!jLup!C?{NFQOHr1D>?H?leO`P0oBeJk3@wnL2$#dQX*uw_fm#PwoaufP?&mfVKxCAi*?>!rAE#T9mI z$!EA;jw`JOdL^!;Pgmhe{Zn6@DWXmCX9%90kf%Du#2pt zbnOEy^%m^~=81D`cB`piyu(sxvpcd23n!Y4qQ3@63I^nw4dWdY!C^0SfT1zluJO!7 zp1L8*)MG#p1(?}&m}B~HLIJgw42t#Lc7W()flmCt=&{NsN(5H z8|?<94h3Kd6FEW08=2f&L$}q)7K1&{k!vl?=N#yF6Scd@mApwXG)0+GJMC`1DL;@- zdyQx_S|=N=D)|mNIXlmoZ%`~c>SPmiPA@?xjhIuIZ!i@oAtq^Lb78hYsT>t8S!bdP zQH!Ya>#W^Jdo(~#NE64P)uG00MGo!ZCFVxjBo9EHrwGU7ER)@ad9yaj%fLNGYkLNJ zkFC8^u01?tK62u9|R zg`s41c^(;jmx_*?lxm&G?5KJ zhXu94fJAb@>SN%LZ^-7JlLXScQG7FG1q01Wj1I~GqoeE5QNch{QNhFlw61_|Q1?ds zjt+*&MoL|=YQ}wn?^_L1bm=OcP6-B}8mCUnG1|4JPS%7HIVKom$j&xe>{dg;c%zN$ z`TV2ED48G%Yk|@3u#rVII&$q6m5IK=@ue$)ej44q-u{nm49K?_vh8p@;H6NPoozHt zHs&bFq&5bVW5SPmVFYb}k&i-|J}w;04iP(K2^6q@M4;8k&Wz4+Ktv$qmT$2uX|!u1 z4dhJ>(lRzEm<<}S&154j(tNByd3EWh2jkgPkltAf&5C12BSaIW)Gdq9?c$JNJZl8p zDT^7MTfWJbZ?Hpy^|mrJ7-}iXGMj99ush10>1}gZFpe68*)XlKH6w55WwfeTfrs@D zw00ZX3);p6`Za`gB@@+#m#U30V0fG_T}e1F*?H7@$vGuJi~>wY$KZh9G&#`y5&%my zYaFO(4sO-NfSL^5k86D2R$$6SH##0q)#QDA`l7{0(?@rO8X;Gh-AWq^hPbp2pp03C z+0a%?ktN?yU>Gkw*`6A=c!kS?fthS7wAxfkZPYzTjJgL${zQjvN>xe;3PpC#3~K^; z;BAM(?1|Kw3KA^ksI9{3-dh$78h4v?J5k-%%Y%ksN6VV3^`R=k_DzwbLVC{)b08D! zpm6B(xh_@dsmG*5J1U4?tU$g8YnV<7lV`VE97XWdNOK$(bR|;?tvL=&IBc?rX_AUy zGvpe1=wUC^1|HNq5hht-iVCtFHUkU@l>xRXdm;v*ZIb6f72||m4v5Hh3Qm` zqK}73BX<)%9K0>FksZ?_cqHVu=CCtJtXgTTNcFh^QR}6QbWxn_hO8`Ojw8!jIEDNR zJhPIBt_oqZnTw{fKS(U&HI{JQ4K{Whh+j8_)^!HGf@wTA0SCN5bo*>p3ERC1)@&Sa zfK4R_h|DDol&GZ>_y`5gErcuSK%H70P#_1~N4T0SG{W^zIE-4T#*~H~sqW}mvm4FS zCFpgpiriBnbB#u1SZ{j06g`X78@{Whh@->0+Snz2q!(npBt{(QRN&!`S`v~#$agL* zadX!zX(Hx8r)h23CXv6^-2yn=OS+v6tF%vzDcz2YtL2U~? zNG^I;*=12|WHAuiX0#K^CNi|-TXRgiwFpxI(od5^9#$lF&mHJFSgWZji6L^_h@n0% zl(w2WekxZyGsf#^@CVGfu(ac;Gn9UiTSIHjTjHW`?xFl6CPGNB6(`3S_8!CbiPs6(<96hA=<59*3sW?=-(=4e0K zDdvp5m89e7%Q0fsrcKalz@IuT!eG17V2q*2o>xfYYp!4d#5M+y89@&U%VScIj*TH& zI&iq{tc1j+b7Kf~kUWYVr?QYovpG2hHg1YUmI*W2WSKmSTgzya7wVMl$cFE1W)4Jx zj$}LXZP_r)=!dwKD6&SQAuiES`+ypBD2>pGj2eV7w!`N|%b^xUMATfiBiE9Pf-qeN zqfP*xMroPZC=wXe2*#EvGG_!0Gyh4`5+H2pTXTph+7-BXVgm z7^WEwa_Wg1BS2-lp<5QX`38qH6U0%P4h(>n)jOq z9NE<8SidIQ9i}1bcf7#w>}hPL>3#zJ&Vn*?6%(Z`QK$iMKT7i;L`^1YktqYLIWKr+ zgf)=vrP4i&6W}cHJ-lDRdQA633ho)KR>L$F%j@YNi5z%6n$OK6IFP7(nDu3?q#17k5Bqhy+^BYJB^ zH)KzQ14+ggNpYTT#1pwLA|d$(Xpi4nj_El=KF#DpdlHgw4j~$+qTC6|H%c-M1Tj*B zU=xzB2gz(vu>tG^DzzwTUg!=cqh=G5pMzRitah^_8;VA=hH5^wqsCWfO3}$nq3I3k zw3y#E5OU#gF(C;E%C$-q^_7sk84#3%-p;4lU5<7&P&EI^raL`_ur@{5W&OL~R1+9EUq!W59(XV( z0z*$(nqa`n=Be|#+~&#}H`^kwI2mBqL4q?g>A7RB$6M|6!v{@B-T`qmNkw~0Qaf>*xCZDM2?>V2A0Q0hVpnO=y0sOSJ9 zRkYbMxe#@ehM(P$e5%72uA);NSm?{^%v$Jo`y3g=IrcZGHcKJ&#LP*OCMh*a1-q}% zPw3p}g@3$E=`JjpjZaz39u(Z;WqmQ~<;tdsAm%hdC*@?B;hHBT|A3TI9VCw&x6kFR ztVQHTIU05nEKfpmha|kK0p3+^esb^gd+S_&&MWDt4YU6aJEuTD@qTobyoU)A@|2ffK%rhdOKxI z${0M}?8ZZ~@QVxjYACWI9TtBok zPE5We;&6MtP-|-CM*WVrt_GjIxV2jj+(atN|3(>fON~ zkL9_YwMwrz64m+Ym*<Hl~EBlHUQL+QU!N}mPg_Dk*kAFS%bdi)nnrnD}B&aH8DbdOr&`A4jfmez4&xa)lq z<7#fPf!uMAj^|Mc$s6>pHRNVyrq^A9Pm#1<_$WZP!Ks!8KN}8#13o$2L)ihjaNDAH zK+2n7aAi$xoxid1Z!DXERi2viP_ONTPy)(A!KxzYtM%-9|9j+#&{zy6Gcg;I=6P65>`m>lQe;4jg#X&%aPwmO!Qa&zfBF90x(Z z^hz`ravnSek2k1F143Z61)j9=JzX1{)Hvq05|U{YDjgwDSs72kT%kvx_qSY5pC2=Q z3CZhq{rA-QLlu=|7o8YG$2CyWtBG^EA&Du-c-xtjaTAd$yK^h~MZD^?|=s(lGN11L?_E$e%I%=&nM4=ty%E?gcJ4 z)~)l@;02q6T=Zhey2fp&(71-4y=GQ}oG(v55F+ z3nDg}IJ>Jw3>r5y*a^^CTKgVU)sV6h`P=4vz%>*2euW9tm`ZYM!n? zzIK>AzLL>+31N�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

  • UMd&rQA@cW1u$Z z2-^s$+Zl$8Rh3rGL$2s26?s1TQ~abtf}LPTled&1Lo$pDW#g^ODZ&v{uu2c!_T#pi zfW*v}U|*S(afGxs?0s-DB+5MA)RX5|UPP?0n=fI5uB@W*Ed3O!4DKzD0!Q97Cu~J> z+a!l9+n~HLD$10=UM|>yh*|{sPeINTfo5_>^)^DrfowKbHJDfFa?`>fQ#db5EL=A< z1exb_RAHWn`F;TrVIRK2iE?`=l3EsG=+=eOVO3EbG#UGGK!iB$QVCg9ygxJB-$dY8 z5zH1g=G5a*M}g^_ke-74HmXh@Cs0ueXoxQNV4`uRkv&}!Yt}S)C^V?dMSp9OyY)=L zh7vZsAI9Z9k1IXbZ09;2Ls>;0uxUH(qY4+Eig+Rv0izV&SBO%hq=WVzl0(Wih>9k` z<290l6n+GL;g|)QEN2BBd=+S8s7eb+iHL*2WBa#4s-%kCQ5?5 z)j&T-^-hkI!$Gdp@L`&sk3eo&s_Ze7sr#K|8m`r7DoGvK4=_y82hu}X#x#IH?`-1L zwjUxVfE^BpzryYCEvzo_R5^GCAfNp1%uG9$v!3Hv=&575ChI>e&ifgK&@1)T@;1QuM;mu;q;dyH4 zb=xq-cUX8fR07?Y#g%fxAP@nsr>?w$Ue$$oFw5)p(9Tla2Mlbs4@hTu(gs%0F5bb4 z%0t>fa)EkL6UYFYkWHt!QIqCs?T#E)(yZ206VwN>sU;a3z>D2|T~M0b$O$HITj`;6 zwW;lnmKH~D3T>p>0gTW%qg$bqsA!rvWG+qNCcqB#Sj^GY*z{DF^ZnPIVdF4Snq4OLT?U-n)!7fKN zZhtoB%qrbBUOtI*XAm(lv?D7IQRX zLDLn~#XLsU3NLYd5xf~H9qm6Sf05^Bp^+}w1oogy19cBKU`?iK+#1#&Al>*3vxwMA zP;OkV)fA;o^Iod2Ap+S;B!(VHGnr(jjXQ=)}oW;ryD}qR;)1Z8sT%BrSgwO^ldZd`F0VOh5gxh8s?~-MOP6yIa~jbG|^LnK+YTep=E#c6XP$9anG3d&=`s zE3Xg>m~PLw^3P{q-F>0+p_^uROY)s7#6wKqHD}ArVrRd5uIzin(ba$4{jw0>GkxhB z3mG2}P@qxw_5G6CU4JUN&BcxlF&RbKF~(H*C9S z->#~dhE*TK=UU73yT7~Olc{&iT3ItKyX(HOm)s^qLLBi)>NxXzlXK2Of9;IIOs8uv zj3m=zJFR%H!^^4TJ{)}Vv16aNT`$DBOh3@~>xUN^IOhGA4tlqOB3QTrmy?%p7;J!u^~67)zfRwY&Q?I zKbYQj%G(dWQ?M^*!ib~3-;tO9iV&k(Q@UBx-*P>B>a$h97EJH9bl9t#A%CX-*#0MT zLg$-Lu?#=!-UG3V(7HAeNSG{&4fXyS~5o!6A^RpXsMs=Uh-(dij!*2d^rPPv5jih;>Xq zcF56J-*9pAuroe>@quAe7kw_oUZziYr)&8+i?8eX>bqzD(f9o4*9tMX4e?LyK5A9j zBf~DgywjC^?}~q{LWmVi|L~GgKEy+5zRt0O)?u|$ZK zOh3JRQH)5cc&mNCmA91t{u;Wu*O=aV&612BLldq$@{xk=JAVK96YTknI!=nI*wFJ` z`;EtrTi@4WHGgxx6Z30KH|33b=H!Oim)&#G2g9m{pS%hAXZks9K8~LmGi?0D=YBCJ z`wmfw{4@R9^iSXZ{GId8`0Dyj?TGxOG#Ei(C zdsp9Wo!&ieYDG47yl+SRH>a(>aL%ZnUp)3!#Y5lSa_S4{N0`3ovFZi)-f-%^w^rS7 z^o!5Ud{v00Ouy=;+6P9z@?fhEv-_>?u<`kwLTq9BLeqe&8*a!r{j!ORY6on*9p*Qt zJ@Fqn_l=)#f5iEFr;W4P-n28X6#CEf3tS_gzrC>L;b-SQ(EIF%&w-s;%=C;CHyktP z(W4B#7mwQa>UH;`+k1@Z=f7L>*p1KJdhw^jJrDmpt;cW$IUrgWY`|i;#wLky4`I3m6@hHS6(&kvksR(mHaI54>NuF_VyQD@zL@R30>4Vywk~XTt zf*)UdzRy|L&f2|2h}}#-$NlEKrziBgbN2lOTT9P*cZCoG(A7i!zBS%Gv1`^2tA3}; z%pY$UCqyOF`?PwZ|0jd;<4&lo{`k%#e!5?XJ0$+?LDLMEZEADI_-(bZH=nj5ZvIrN1p}xGkwcPr_5OY!{wzbFL!_T zzH`P~kU!IBUw_BOpDL@qElJMXTUFTOGVq5DLjT_Vjq5J^bX@F5FZUegTKmpk3=^5Y zy!@)oW#^nQY0pC+8m%jC1fRQ^e#f@D&!3olT-NTBGWt93j0J5M(+lSopS^dpwb#(+ z$8Rd#*I}d($HNg%ib*S9_u-ay+mjb3O*k+nZPY>`N|`>h*CZiU{plTg_1X4bo7dba z1g+pm_pC3(=Iu2 z@7IerpE2W!UH)5y_>$>Y^||EEGv0VL|NQ>fS!#d1ub&WU_^Kxt&do#;$qo{7csieR}YR+eg6$dODZ1@3wAkz~H?PJ<+yX5Gkyq!0`u%`h1>GMn%t2{k-Y}&pz^`@-Lb8fgA zZK!K+F0cR1X-P-D*u7%=b*9eedSO>-{jH>!+)n!^RChh$x_w!7TW)=QLZJ}1Gks;Z zON;KS=yu%a-bY(6nSXB?+6&WHoc;RL-Dkh@pEJI^d-i}{i__r`V04)j^GPdP+*31u z*#BvH&hPa#vmS##!}QLX1KvAprzd9CyQS;L^t^f%`Xi>_+wF|OA6NbS?(_dC^qzyDp6C7E?vhpapF0Nr9@9r> zKJm#3>&`ggj=Ha|ymZZmXM}i~>84(vPB{0`9TT@+m^$pW5k}a_PFUJ2Ddz0Fnjh}2 z9kGA##7V99{ZaQG-u_|wb*%>9w7ucyQUB>OBKi4(NgIT?nCZ^)t>2q2y6)GGKi`nH z`1@Xig?NeSd(ZgdiMT@7`EO6^TAH%?R+On%3i02u`^&BSkN+tD7~8f3tDZj+ZD=~v z$EDss_V{<#Z2M@+Z*!cnUmq{T)l5J8jc4Y3cx(60)&>23KR4}j=)${9U%YMJo6p|& z=ylg`^FDk{k7H&D(eoJMzwv?eb;dPMxC)@@!r^Th*6*S9&b`&=R3XL`X?S3dadI`P#HvBiCswlbJ>NX$=-VHhXg=tOeo-u}%?OyzezowV)CIad^~I&&)Q9@D3G`~9kScWqeI<>=z_Q=i@lzvyeG z-??&P;iiPSAI{3mNjz%q(k(&^OeOxmKGiDaGyjS0eqWPP`feZZYS=xd-^l3 zPdAUXZm9j}JQwUX(?@)?W$Vcz{^_xMZ?E`v=_2&M-!gqe_w*6*({|i`S6RcGy>m9) z0X>K9NQxO+JZM1awXfWL`5zD7w(;Fh24G0Y^!vXY^1{|Lv@(eFR> zOZ$~)-Z=P-v-`q#KAY)x7bJCUbLUypY+H`K?V7q@1_^Vp48wORhEIN4l zTv$%ArSUyg?#j}tmd2j%$1Jk1rLk*V-i5XPmd1wQYD&E=ja}_qP~GBUyUOb-TP$(P zx3BV0DxB9gYH7i-vP`KiHlNp3TwUX?uJjdSPmmH1^k`VIzoODxTI=-s7Z#U$JmppH zv=U6^Um7JG+gj3}l^E>Cr}r$#Ash2LN6sH?5=I9n_g=rNwPw6suj{M84ciSsIb zc)d8q=dUZR^rVa&lwLf~rP?9h!k6p9w5%PXR- zikv?Pw$kJBH=~qM5u6(K5zs>*6?v>rVRk!1i|hRva( z$Bvpjy)fD0o*6aZt9G^Aqd|PHyZjJxkNT_hM2{a?b{^*;xKrd-z@W4=?b4F+3Vb`$ z(&!KzmWFLfqsiCUUC%3V{{O!AQ{yw+Dy>vYW-(bCjm zjGHw#QBwDMY7ar-sI6fkuNLRs)oj{P>y2KRIK-Megzi_XxnV6Webs611+`epuch(P z)SDZEM3vqG?08>QiH(t3Htxiio6R}gQImJcPNs#aV-SRQYnrh(QPV%P($~72zJ)c- z`0SC}ogBnPulcCC#|Q9b^GjPMJRhulm9w@P$2)5B@O{x+976tGvgJlAK-3Ii0izbj zU4VDX+%1k>jrU>kEn<{L6E)*5{t_ly^vGIMS$!yj4SmtWXlX~yI_LZl>Rexr78{2~ zkzVBD)2sn{`a{S8w2pl1Xvs&FfNy>+`Wt`QAvxCznpgeEGN|)bVdmrzM6jTF{f(S@ zt*4fpl|x8Auy$?~6^L2~3wW!&7FQvpPd;*s(4q`Br9R?VIMs_L@9TsD3pB{=BOtNdVD z$vvSYufMD4vJZ8T6YopIR9EzzMy^y;%RyA@L6%f@Zqc)HkgV_}TQl}5a+!h}oP*@# zYNo*)WR_q_T+QU^AUPev92M#dn%+!-4o)<6wAlaOR9Q96bZQ4F7;lRQlyzA9Xnr$R zKC)P}sf>*1(uf?NrsVy;W@a)DQU-V{-P4R1!gA6di1W%VEiFiOwQnIl*J@^%6&47giT&X<0Bc=)}TNEsd_}#E_Q8hbZW6g_cH#j7v-BG&`Xj zR+dT?7Py*wKOk!S<_Bs~qthfwv-68lIcOUlwAk-Fw8t>ol6%ookJ=Jor{^EaSdsQ0 z!IErM3-JkMvGjACH8mc5Mu!jLno+FiV#SsqEgpWtI$_C#Xz?QprKV(Pdh`YnHQ&%j zd=yEaoVPglm^UN?)p7>%TmBZuuRc`szCizEr==pG7d`l!pO!Mvb8tu%S?ct*WFo6+ zFTt}Rhc=ljt2BCXBI`8SdG@1H?dd70?vmP+Q*f!QO`+ezQcg^n$pp}eAbF zu$k`+a+TPe^W0b$vfP)FMsy3)350tVC*F(mQ3UZ%B}AoJz742e0yGGGgE81O(wpP(LD%ul@_PnCKtZ45m+DD4^jiT*Q zv_BN>fTFd-mt>m!v=HQ{XnhpzL`55{XrmNutfEa+v_eIjp=b_8o1t_K~7}qiA~+?GHseplI#zrJN=|Ed==~ zS|3FlrfBqyp47FRPD0!Vt!pFv2tCYJZ-Ev{6uS_*pJ{uwP@-6Y@7gFvJF!v=C5p`m z$+%Bxp+vC}-=|636Iv)yJg;akE86FZ_LZWYgYRY@U z(da8M8TUIy+plOb`2K|MCW;PPsGUeww4)U57)47{vU2~2(g)%z?uo7;RxnQ z=>`9$ToG*?&LucgaMGb;5L|NLz=1P~hU4n7K)qJ*r$S=l_!qGzi8_GSD2JaB;O7z~5?BSpkJ5S)p6#_mj{Lddil8a_a5$!z(u z7xtq>4fJ<;!!!5`jV$8l=#-?|5&;l&Ne>9t(^u@0zSpUVT zPreXzG_jvccg+fCJR6KxTI%x?CNY!c#s`<4@!&9Dn<1NbQugbM9<(;(U(5G2dk96) z2$p)|gNSafoW3kPU~O!<-K07E!`S({;KD34+;cT4#exUei@OMZT6>bTXq{l zN^Suj7x0apRcJO14KGjv6|E4Ke+Hl((4*l zWfhT^y;hgeu#8d+7@Td(Zi=oc_OqV8Y@ zlqc@u1;#|;HV8Lfj6mpg4q+VwaVv*t;BzcIp045ygl=Kl#R$EKP*-seLNt);DxO3L zOCW*Evk2YHq1O?*i9;m$_Zb(9zc(^11%KCY$b`Q);Or`j@mJn0M`!@2TZ_;cIOCbW zj6u_tX?&M{ujacnsFrcpBea-lTk%)M_y{2xV+TSq#xDrT82b=96DM3h^6og)7azTF~AsKfmLT5AWVuWPeI}nmF?n6kX zwgn*><0XV-ExeDAtc5)YQJK4nKM`8W{1W4IeyIpaeghGb{6-@r`AtCR9FAc@NY>VL zgk)`%Ahe9{)*vMFw@iiZMd&(CcRNCo-`gtm8A8``+^-S3hC}-iI+sInuuU?x4hYHA z`XeN{3`b}ubIw(?B7~&oR4Cdagk&1aRp>GmxtR}hlveuR)r zcaNg|iI7Y;xwVcPh|s+6%7b|%c1KLYKz+GD%K%HOV)K2 z+Yust>nc7&Xg)&mVzU7 zXgVieY(Pln?=^&;X3jeilC>IxhYwFN?HGilG>iy6$+QxLwlbG9741rd7BY<k)d4W2{$qUqwik zQuE;Y!MJFy)lM1wfIL=>%o|@2*)xQ1$@|cD`^A+WYO{rsRDT?L-wCj*x5?S&CMmLeo{KOoeEUNGj3kDs-L-U8X{-RpRvW*j2{t_G2nn{YTOQYWUl%kB;y{hLW2<6 zjx$~i#a|h>Z|lpB?1cD{4gmF;5CtI`9cb-*=)Yk{_-OqXuQX#xhkj*G8^57hR5U?( z)YG8fp+~qpQXD;hp?LaDaY#GvK_DLUSn|nVJWnD~mn&TadVUx$#^LT29LiH63qtf1 zGG0tYh@Mf#i&+TK6U=yaxGv*REok)gGaj?0^4Vy-Sb`8eIgJQnF?22w{1Wq$f>i*uxxd&%kRB18JdYr%DY>%ov7Uu+A=j<^88(JyYqkeif+&ZP<{R`={oA89o+q1yPJUF!mg!TQuGnS zK62Ufztip}S^4fb6`jnKQA?ah76^$myC2h8% zou+7zg7^t%Do*{t+DfqWfn)P=@aRM8W%?XN zv56$TOk6OM!vLJ;ag9DN<%;qY{Vw#EvtalY)gw0+$DIOca^PU!kJ$$OB6W zw@coIa1w4{@fsgyfk!5f)WG*(Ausw(#{2)V_bq^N6;=O}wuG<=B!vJ~Kw}9|pg0RIOMw zwNZ}`Gk5OHoHJ+6oSEU}-IEP@dG}w^TQho? zhX1ID7L5r1&wxl%b8yb!}jnbG8rM={66aY$F=V)ZPgOD?0 zxl3`|d!PDdPKOQNww($qTf3Lxz_fcg1lY?+yV#5bW;-NQ3U1uhA7RXDW~ph3^ILSh z_KILR!ez!COg&q)Y=jI!Xnfbkjwh^K-~e9ktrW4NN03x*=^-hz;eK+o3ruT zxBv3snyeBKf#5IAT!BC#;0c6{L4hz9FX!bk_!PZ$_ooN$FACgqE|eGJQy}1?OyGz~ zWdhra$^>F66MiGKB*GC>nebboQ6>;mnZQ(3CJ>95OYm3I6xu~*V?91Sat zBQ2$IgrYQ#eUwIyQW|+wX}@!{KR6osLFE8>rz%^cKXubK$b{b`?SYU9EGv}>EJ>9K zlw}x?rh8|kVw=;k%{?envBy$_q`9IJ%$CcRWa&)fF@|i3v76A?P2Y=$mki17(in$f zs3ZRv`&#N%gjIz#HCW0%K@d3RwlvC$odt6P=a_Htob%wx@!7|u18i!);5i){-R!_F-^rQ}VINJ0Nwb<+bU1;Ngy(_Yr zJ??7-r8F%o=xUv$rj+&%raq5nS%aah!PLZRU8i3=b=Jgc*Su<{)lGzG!!kX1cBP|i%)57$0_q1HF1Q@>zRzw^LN}bIq#D1 zLR6Ru++g^%B9o+kh0Z^DCLlWMBwOiU(E?OiV*5~KiCDyZ3Qu1b+NUiRk@Hy?qttA& zap9GYdyN~nSVTOzH5`rf#3C|8QW~vfN<-7lwm5Fg(Pvm<)1^u74eWkIt;E4i#{3gl zvH38t?2%1>Oj1mfpH?hmfqx0s?{N&`a@^u^qp+O4&E`8XaL~TvAF_-_>`n4HwZQbl zn4RE2g`8M{pLdbh`~#Jn@L-CcOZ>bxy1yI(>%}yGB0=lLRwM*YBcFW-zqSCM@mr96 z$OdCx*#O0kcXJ(5dj`La*#YocX{lHwH5}SqHoxTR z|NQWL{4!V?;LdK+dnHOZ< zAn$o)$EKq8qE-HfxrtPIqlx3AC2i5MFJ@9K?<+<3Fi(nOpKITouHT%VTrxOX0;iED zhoG<_%UP5`FiqQEMJM$4Ac;=uM2+8kgNg3)%lyI>UU z`nC>WWkS0Vn8p>`rO@tkw1*R_ut=fGv5>J-?sYljB9IQzdvSOD0~2HKpwG4#W+wjbL!zPtjZR4;UkP zFI5ZLCVRgm@cak%p3fb#*I6O~zn9F;Z=Om5uHwP6w#w`VNTVm3c5);j+Hdj`fM{6B zm4HJ5Sx$QbQW$WiRnnV=D>ZrMjWFXaYuLP32?h^Mz}Vl(+Fqr283HA@9;u5fJzthMm!6~ zIT0aGlr&r6{7koPFHDs=*PM^HGWVw=9&y}3pBomrBNkc)Q&Hqi+U9fY(Ek;a2~=;!QW}-G{EU_#-D1UxcBE( zCUeBL65V`#tYmRXI=WdUS3chNl=VWq-;477dVu#ChkURneh*O5l1r819XkH6sfnM` zum}e=UeG=lC-nwy`zc87M~+2%_5{f&WIsL&+vAb(*~wSQ_vjyfYcoE!2#`F^>u}qt za~4YZn3(c0F|`gVjohX*^oE#JOT{*I#nihE6Kn5abhfF7X{Mu_=#$9VQ#!b4=Tae9 zzG`DPLm}v06xqAshGD5=(WRt4U=3p&hWQA7D?@8oLI-Ues>QL%PH5)f4lwMJgVr9k zh0z)o8pFa?vZYocQrIt=AZ_eb1xTU02?OG6W0;8D5nebz%BtDLGT=didd)Q^NwL)o zNHvOXmnwdVsrV&^b&rsKO513$JQlTUdsiTlJD7IXOk~$t$ll7%^YE9?#Q8V|Lz~ch zNU{dDuKLw8ebiLv8HkdWzp2hT;F!KFN_R1#j^~O}f~1%50ldW39#_7+8xFz8dAHum zfFWwMlQ(ueF+^Sp=VrL&VmS<*!Ww_NbSE}np81{|DTLTqM7Zy79_s}h70W}U>6IG9tN5UXVPW~jRrEE+oq+fNn-4QCmIedKWC(OD4ud8 z!e_jwHXMmNelyjEnI&);Dk|XXGHGHpI)GZ3X8lTD?aB2Mt9_kl?a6AV&9dO0Tsy{^ zZ)c4jQ;P_kuG-F&kYv_7kSeF4YOAZKOy2%HT9dPvZCITrP1@#EN7qi8JZsG8T9~ab z@Rx4TmKK)qwzjQI30EHzma$BikkfWhE3O_JmhlcR<1t|w@9;7n9hUJ9FJqcls9VsA zeeR%a2Oa7ooUNqA{JGF15t=0CR4r<5ZAa&_jL^Lrzq{qKXv z9E5U|=LVsB+Bt>2VeX56w26DaVq+|<@2GYN-5)#l~7AotpP&qI-_ zIWOmNNQ>erLef8M^RuCFQ|F#w>B}$(7zg|wz?p#e0`7%`v2HO*2aNjx$s-Q{a_Gwy zb2^>Kg#kL9NGu{-pp6z9M-jv#vhHq-&<0_QKnxqppmfFx?Lv!T)3sfUIa+8xwphd* z2HWQ`LOar8n5M@lfjKBOk60{XcEPlm=4CgFMa-GNG~BrsiS$Lw+D(pj zv!h|)ww?u+mce<)+M@F7=-HPU;mXse>==+H1gySZDnuPJYHV+*6Gx$WeF=2@G#t?t zI|`VNv(Oam*lV(TIt!Tk9Gna6c$AASCQ+XQ`Wm1x3tntJ$cK#RgMpBgT&Og;P}qhm zJ9WtmYekp5u+DVJ3u{!Dys(ywrQNX&h`(j_1|fxfu=%F``z}n8#P>oRUA#9M*hw-F ztp(PGr}@1(Id@)xpLcN}>i1o^1Tl~G50wJG3-L2>m=MQ*@iQ@ zP4YB+>Ba40lL`KE3l1^it`U|UOb7YP&iR7<0YdSv!2F5dM*m_j$8;DZXG@SG3PVAp9tw*L?{5@%|)*JL{ z<0MMP4;dc5=!7{)^DfG{%b=Z7?WndyI5&x3+x~#ZfOY^N6;ZC&P(_rQfGVQIA|?UN zX0p&OvslEe#yw+{nl%=Sm^P@D8ut>5Ma(i_8ty)eMW~Zxsc(7KweZtb<=7io#t-x) zyli{?K=~Q!*LJdC0lzlR+e1e+yNKSyO#A~sujGKrax~Jti`ou8%#g;R@k97s6>zek zPQ@_PaDNnVu!_%;-O4GpgDYXlZ9!pm z7HIwsB{($uE1tLcJ;DP+vjLxkv%{Lp{O`;&tl2^Dbwh$E%JZe7Z2Kk43bGvjc#vry z#vi#<`s{>j;=l_#;a6>g3RQ->78a*(@mO2!o&|79;GSk7Ud|$@YmjH5J*nzMPF2;3 z81@W6;IoDHu*D*#4oVbbl$tXv7BL@$!l7|LWU+{e0@HBQECwm#XlFYby#+K}i=$DR zh}F#7p(l@yMO&6i5gJle$J!6r`N&(bsRFibYi;3~MTI8?lbHQD$5R4)GJ4c@%9e}4fX9#1qkBy{0|p~lgOcC8u*G1WMT6;#Tv!o&P5 zv?ZndQN;XAfQ9@@`8y#Cg)CI#a}W!NlC4t8vsnh}NH$?>d58}GWET!em0gG_yAaE; zi@zK4mQ%3nxfY@F^9{XL`|5h0Ld@V`mT}niuxs5f9L$D%Gf;e!>2$pL@)P>WD{e6B z^*3c`m;U~S{6iO2!Y6)b#c5-(VeDCEAyNzqYe#1Y59yZkf z%!azP{e}!OXt|-?U%Lom+C>n{bP@g`MxhBfPNU`TH?}kZ_Z(tg8<;)tPr%9UeaI&^ zV6pZa_7P8jRumy3I;s9tvIkTVA%k7M&7+vhpPerBP8{qn^ zp`0^Pu}VzEDzS`M^{XoWN!ptV%GWJfL#MzE{;j~U)^81cB`9B~S?`Ycr7el(IEH*y zS-AjK(l$74x3n&3nD2Z*;)#a2+K6_-8V^mU*@M^tkQV&i*uvdXi$ffONaZx5z3qcJNxX#I$IMMa)YK zEwt4Zlj6=^3SZ!?LphGHBwaCnXky&F!Cl@`3vY|PSZ@!KL zpcOp8@aT*rXMMUeHn7{-DA`mCf3a;@)|nl_#TWfc!!4v>{-*|7U=lRieOmEbv4s|x zJ#6wNP0b5zAsbv^odbrtAp(Q~h7BM}*7^BqmS}bCQV~K&r zJ=kIqGas0STWGO}oOG(R&p8@T^H3U(J|h;9b6S=5kfZU;Q>CqPH1gO%$c1qW5b_^r zsJxK90O2;gX?qqRurzc5!dC^u0)&1`iIVZLlEmqSWkko-B_^>Sgn38J+ljrbTp60G z8$#g`>rIuU>wAHw2IYv4*qd`wa-#0px`lT!3TK(*Z*O3_=LVah%8pZjsqDBGSYe6r zKX^*MDI_tzjb~^0ms|Okc*Q5pXX<4-jpN46_vCtcn^-X{g53%{2f)rsG;TaYfA3+dNbMBe2URX;?Fx0%p06c}|4 zZB00q$1ht>N19_a-NLfP^ZxZ@%O`C{JlO&vAQ$gNwotM(TOt9!nUW;}NNK_AZb%50 z!`A_sgJpnI0q+5%^!X;>Ie_;8HUV<`p^E_@0Bi?*5Rhev^~xe?*gL7DVVhJ*Lo8xG zk5Jzb8uLLcVk*Jsj8STaSuA2c3QXgE%wiEanOVbq$%W&&$V&U6qwzFsrTxUwe&J|5 zE|E`hnu?>n>1f*{Y3@a;+aqaM8Y*e-6U=Q4k3HZ!#+gJD_JmIlrKmWUyTW73cpgF0 zQDYMOaw~rbn@x$`c__)Cj_x6;=;jT-gNoR3ylEfS{1^&b8iD-r4o@j#V5D@)kW?gH zziB1j3K5G{>ve$N(>wrsSTL?u8zvZ=Jp1Zu{JiT5ASK=nAa#x102%gm{2swC8sI+0 zVVFzsdm7DEuL9cT$J!R+bmjQPs#*G9CJF!HeT{ z3z{xdg_GU&*)~O<8A28cauD+!_1>_s>y~zUszYll};12*N13n5!O%4^3 zya4cVKyuQL09g)C0J5*9v{ucPm};)XB8(wVOU;uOi3S{01h69(SoBdE=SJ21%H9Lkta|X z`3E{%nj0C7zH)QGcE>mz=#=C4ON`O<3O2>iq!F4lc3P7LeOla*K5Xe>OW$c*dOvMb z&UojWYoa5hcFV-HTPD_j<5A(kVBcdr*}CItyvlDKItu-ij_^(drXxJD1W34idRha* z`G+q-o6tf$A8QJ1^glWyAhK*iwKxm%cz>k80B&L*5ivfae)v=TP7UaX%`7ocYoJoh%EzMgefo*Mb(H+_4vx!Xs>SZ`{RU5if7tHAipd-e=PpXUPQo9_o$E z%SaM%eHHp1zwvg!8o)aMCj)*Bka{51934rq?sX(ZEP@khVG$D=M_|Mva)bk8l!|?m zSj1Emq4b2tahAr70n>0ZEEX~6J6eOIUF>L|aJ0pac7vmB&H8%-Lq!&Arx-2JO45fOB_j4w<*K%7Ai7SY}cyFrNE$ zLAKn|cy3E8f2Rl8QhePOw9X0LMMF=eZE+X1zHVU)3Vq$SO1eYBi??Jy#~)K6x7>Dt z5UCWa^axh5N=(Hnv5Z(Pr1o%1ZQIly?g)0k;KD0^Uk%FF(25{ORqz~&(29_)=N__QXc03MR}Z<@;I>!j|WsIZsV7qwYQ`?{Rqn5^?huba(s}reTOQj z_JqN9OJjToZOEgoN|bbnRg&o_VK<=8&fel+hAK!b>J&s{%q%Si5Z?-UwxUJ zZi}bs8FaqXK&fbtxb5_$PAS{)A&)xG%oG19Z#!nrew(MPf!DVsbNu7y(tW1{W-DX< zgbWv(4**m59eR2!714ekusa271GWj_D$SL^{wmmKfc;+La_G*9`KkDM*EfI+!_S*B zr%~%D=#qRRjaHuvJU{dhgFIAV;#-YgX8_Lh+jjjfKXB-Q=x=XK#23^~tiD7xpRb*o zb^7X5d(q`jg(u&xMtn))St%u*};l z-_rtUzD3gQ@CITSw&yP(qw!fdYfLT4bU>JmpLem0Mxa9JaKQTE^^rj)$#NSGI2o`S za2nu2fC~T*0i=V$2tfJ_;k2>j4S;|B+dD~?_2IbZt6xLK?<$T#Y>%b#USjGp%crGg zwG9_B2cZTv+@ThWn2EsH9!t#>i$x5bc-9H+bc?}h0hp$@&SE&s!Jff&>bjf*xOT@& zbz9**f&CeY6`Os5>9)eP!2A~q`d!|8(0hhA8UA?j2reWemq)X=j>aNk#`Qq0Ucn}S z_7}m(Xd49cycFPv1FxLgvcs_zF&t?;j;xjh^$#;mx_1T5%!~2h^Z-{d&aU`Tp?h^3 zxMESu75#O|{*~80J=Yhqigz&|YfK`6+q_i7q%t6fr3$?OiYC`v50vV zp_I1DVj0~wy1C;rI7LoGF?u`LZ%)sk?A@F`h5po=dl1Kn=hEi%sTGHl2sft5vL7@K zMR&1QPC`Z{?;B3?fV?Ei$8ui`l4(pSaZgXd=i zDvohjIP~#(Wg99ken!ij%lp|cI?2NMD%J$AZ{mY_Pg%h0dyt2|`Kdak%3tP{mCO82 zwe;p8TDdKNEV_#U*+ne`q`3J6;Ku+L0rDFYfGliwQd;@MwDO5X=;0(!OU=_3iWKPt57X^fF~lL~KgD+UB+{zH;i*t%Q3d(!6=-&HdG$t~Lo`=s zccLB556r+a4#S{Xn?*VHif~tu&`7^cMtaC$ocAkSh=!HtsshbZ;cL?QlgcDsC-CF`H)yd6=JZi&;Mx(bH%iS}pr)hLO1#$Zf;1LcUM37Z5!h{l(FJJ}!sTajstFW66bih^ zvGHuWEmqqvUMoExMG72Fqywua3pi3WO>Nh8gV%X3&7sG8e?RJoY;kVjgI6(6& zij;#vMe%J6thr?D9l)7@@7jTO1@t6!4W>?}uEE4$m4$k^m(XD46)a-LK{I2FQZvC~ zFuNd&8uw+3Ma&4;FErdpi}8rv-t~BK#yXq3`Wk8GJz{rXymEVv*yU%ackeL4oCV0! zTBDmVVY4YcqY_gxB|VZ$m=K>WO2J-;Mbu*a`7p@e6U~&_{0Dy33}~-o09jXj#w%#( zxgBMAQDD%?I5hOo1lASyS7Cp(o%;p4{;Fxg9FaS0khxbCNSoNPQ-{c~DwXk=xGh_S4g`VKdT8 z7(G3?vTk0H3}Z7v(o6WZjvp7L1VI8tzQjydtV~jZTv-1CY-Q`u!k@9-<=2gbM%ooy zJ;V35ROfuYWeNYLmNerpQX8D^Bv$7ov^e@FW)e{)-SXwJKXpD=e%%s&5*M#G^E1-* z!)D53n#8=A&Nfz;meMF+e#(#;HdJN#^5;8WY>%a*!!qHw=Ue{(Nwt0o#9LSN*}AN6 zoWpPI;@?!)Z2iU|=_SNwdO2Mj{e^zxv-TUKzvx7feU;yMzxzgC9h7+AF{Cc*(+hqm zrgnz;vxQxA=AqOu$L>p2+7ZRNAbr*Bze@16bct&Iw#y!xOAw*=8<(Z)Qz)!3Dr;PiZX<3w+gyZ*i~E4=7(gV~E!RkZ?DOuahj}CFR27!@a2G zk5_cQnE04B0cD3e6bh|2zC!7LbAJt1?F|FhqP~FS*1yie;o>(f9LrqpYwDPJ?|W?h z<|~SOr6?Zpe^{#XJT}ZF{F_>GmNv{?(zXo@(l(Ip;)5B5D@BUBeM<9>yev|BxD4f# zew_-I+-A^TwzBgKyo%y$Lqu_)=K3Y1F0Nk*(S}zTo4>V#66GCtQxLt~6?;V92f?tC zg5gI9&T}Iwmq!S3%Q0`m*l)gRJ84!^%W$yzFK7Evh3=r z!`G&l@Na6#bo>Q>7NqJ(r_L9k}w=S5SJ$@@FI7P1I5fInC*RpaszF`1m zD@wSxKBO2~hwERtVjsgyWv0J)}7#tT$qzH1=*g;)g zOi7+1LLsfz=UK>sZzV>~*s%`mT`aSs>Q-0>+Hpdw2X?ez+!tpUs=nA<2<%aaze?=G zV$3Q$t>pf4=54{g1FRY0D!E^c#eNTLr99{^8w7I9(0n_(>6_~#FUWaj)Ck{y}O)oHg?_0q1y+iSKeeeFjZjmp7 zOPqb%XkeO`C@_65kC)eQJW5aB+XYPD%RSQ+dk~nW{C!}W%G1E~i+%!3zv#EXH06H* z(-?!1-)nJKX(GU0kX#J~rg8TLrg6E_SW{;0X)33=aAyE}48KYf$KU$}YsX(ru^e!w*4;lMP1M*-9PO#!C)n+@y$#7BDpreFD0 zV5{(}G+)PGts@#@H05q!nhL|{J6;5)@AxAyO?edBh1Tj+U>fdJU|I(Cz_bi5a!;=Y zre&}cn10b+4*P)%x5|b4lY9Dx!^*)v+Om%Zrn%?F-a!eMU!(~=wpJzL*<2rzx`3BdHdCjrxU)C1GDdpzbo9+B(TS%4W)r;t={3Deg~N5{%626_rG%3Mi*`n#=9Es0AL#K zP>0n5(>zZDX3Gzl=I>l!n!i?Hn!g)>9U!?{0ZhN`C&092zX(k0==Z=hvz%<4sz_bjm1*T>2Mfda`VESzvZxTRc+(KYE!2mzli+YX!)p6)thTXXwf#3% z+nBK0{u`@pbXaZwjnxKEE3N?j2Q2vu0*-;Si5-b&w*r1CbPNm~0|&}6P;GDG8%Ue0 zchN4Z7aAp8_G*TX#6%%?w4k5hLg3C%kc-v0z-;h`;emW+b5mQBgyGt=W9gL4{U+$Q z+=ECG<}@CPk?%kZ#GvEyQp~n_7u!7@4w(z?3(RXN91JG{;>0L%V1~b6@&ep{6_8s} z+yQts;MV~8O<3KTTn%_P;2}uk8-Viw?*ZgFFW&@w6!2caQt;ll08a;e01$Dw|8){! z%y$4!g(Vvk`N@j`ags^$2Y`rEMoS=7aT6MeJmC+&mq?%h4xd6MNASoJ3?sJSuA3XL;E{YXyYvwF@N11 zZq!2iyTu~r?sBvwq1|J#h&c~Sher!-w#DGojs@)eN;tJ!EMjimTfef@+-|Xmc^jC9 zD*|f}ieH&8XOMRqmbyDC(v{0Dk{GY`7r9%^$zCg<>^y!{ItQJ%?duqADmub zUhri$_|mN4L;S(%2w{WEoWF*&+oD`gFN&O|Fx% zHiSvw9KSX^ZL#=Q3@&Lr^uCV4k^gh691c!60AYCv3Cyg;P! zg5Z&BYatlMOpx*%0gRlWd(E(|7t48ri88^-7K_CM+AM1pIlcnHD%>$xj6-5cU9%F7s zTdOn&0V}+og3XK{#UHQWdWuI;LW=@w6XWcL-!b^z9jZ;C+B8sV)BM&;dE6j&*V^iJ z6+Etw0(Ea_NZbqH66i^Rb2G?3_7_4h8dI8y{{{qOgCV?Gwtpzb%Ye6hxHiIja z#@#HGmb2EPqqpu3q>{aHU2H{HbRGD1g)nd`+MSMdr(%y<2Jh%C<6b!%)Af(4pK&Vs zNILpRD*CWGlD!1h_hLSnu75C9e;<8VZM3!N=zZz}n2Ijziak36&jx2A+y#=n6=Zap zFA0tpQ$}{h*2!(Uegzk62+k!Ch~4poU5F7|!G&9SA4ONBPpQnfYx`nhDTF2|G%KxQ zD^^YtKLk8mIhi^wyyg98WXky|(^0hk%?qfls%OUxV2!APO6=U{dHpPQv@Zi&hq&-# z0;atwdq2gVaM(|QeMiEr0rqVXmi)R$g!V5-8;njveLVIArr{0-_AQCQ{`?>KRpaMf zJh6j|qrHnl)xT-NAn0c`{;7MPuZ8R(6}npFUrRp?TN2{7FO@^gDOb~!FfyEvd=QhtuWvl9VRp@JDIm;S?+eIM4nl01#oAU%WMR2mKO(*?UhPp3GnHbe#0($R#+F{)1ZA8a4q1CfNufb z1h^04eGc$2z|RA+y?+6a%I8VYLew5aJxJ|A#3JT0gqkL_t1K2VKL8ieidIVdm|##+ zasN@F!Oc^!h?xV;gDIDqW{XA4N?3;U9Y3)c;sVof{3v2LCqA}L?HjR;0--`?**i|X zFR!sf)h>RL8at@?DeWL&YNnt8ToGX>RBkllrE&AK@J&(vJjBe`LCK4%dW z8@`_fR4fj#EWTnHBP&K>QztZN@iTZ-^T2Igm_mh24G1`v0ZLf5E*u^da9g(nA*N(% zYIe#^VYX#I#+|t|WI7>#i?2dk;uHeMavwx{D!j?0P6jZ%cd;!N+Gdg~vvmYaOh>@P zB657C(!PuKtu(F-Roe58=J69Y_$aW$@*a4<|EoAyB5#mJ1>rEH^^coOW(XLx&ISj#KsJIrjvD3%r+G!0PLvt?6N z;1z7`5p-L(2R6E89JY2EN-7V;AGx%(zh{S`WKJF&acDm)W-sJbD#qJjNsM#Tn=VYq zUYzWbg)*~cZnMr^a^8kl-EnqLT$#G0R_0wSixLzD3fP%kK5J|9MnIO)O@K_C3+}X5 ziD|78i~rnIg*?wRkM@Gh8{|E&?ATP)UbM>p zFgKA(9#;@6N!OK(?H)g)r2OV?-HGfYc$+Q}gi2yALAHzKC}>@LJr1-*LYwNsO$Szq z&nd?AsTcP`U<)POMZoCdP%Otm?=Iok7XXoMNWgWt6-Y+{?uUDbk0hNdAS05O z0UifPUKs~SK{XG2sk#C&6;#9`W)S`=t=M94t8uh_9F2}D8t!06qpN_@Y8`F3I9yx; z2{B(>Dyo3B!JVQV$Bs0?6(eDWBR`7(=a?G&i{qFQb$OUz8WE=f&lZ`gKnQi}h$9wV zH(CG}p)B%;zd+Jx!PB^;(k3~Yi}3B@3etkyEI?l7$XlAl4I}}{$2_$mOe3KG{f&^x z{D$D$`%3LZq?bQ;ESLFsXCu;77nHv9bt3XoIJKSgTMO01eAF6S$NQ<~`>OqXZK+V% zEfl_Kd!LnEBRGxjU*zaQ9Jw>{5L=D5oKY5|tj&~0Tx6)<5suGW;hg2CRhbj;kM@S) zI0Y<$7PJ6Tld_PqbBZ|}|Ee%0&|)qSxlBn*4y`iN5YpcVOv3Z*K42t5jWUNK^<0O& zY!^MIM<+h!{$k{ia+7bQG=N3UTC}0#))qYGj7AGj-2|GWa&lY6PX<&@#-YjyM^N)_ zsB(t0bOSX@7gRapvCHMOmi^7175+wwc4x0DK+pc|^v!(kUu?6%vFj~R0ojhf1jx4h zWvdc$hZj`|iK$9REMhofRoW(t;4o^L=&KNy9H+DQx<;a}- zN=G+lJ4M-(M>~;)VmVt-w+K55Z@ErrCpj$NsFJb(Dt4CT@nA4LwdU9Hqx1fQ{)04q zPDwn;Wgs^%k#$5kUliM-U>69#9jpH*l#H$&g(FFp`*R#{1^SQ8HO|)1GUtrw&jWKC ztfzzVI|ILRtp3nTNAf%2Jl{?^c_~9*Y9kYT#b%T%e7HN!$~KBWxG~wzEfe$(|R%SX>tW91h4g zCLveU34u~aoe+p&Aqbv!2#w}JViB_n5`-~I4a|XpMa&Z1YusBbhNH27X}BJXL8Lm` zCPy2BQqyoH7K@nu9j(gIC{PbVE;2_RY|8OOz=xWzAy>t6j;ww=hx>>s{}5CDA?D*B9Kc?JkXW0u zdF3R=;X&>zCyQR&adnAlFCNpqVcLeMcg*|vXvv~oh2J)e)`9Nk%-PZnm={fL&v0#ypDjqCS4m}31`7;=>(o6)lQLq`ns6OU*sksJE`{LUB@%;3FOAX_Y zYdID4R^aUDOPU%Jt!)!{Os38lW_+#OInnXS?OT1&dnFw7Sf1_p#iukZY-nsrTrR5n z$3Wrr1FNd5lOFTtUCb}f@@6f}x5U$NdON@23_z;C^?*>^%`CvtfM)`p2zVCY6u`3q zqk!iEo(p&$;9S7-0WSfJ1M;1-0r{S#C~<8e#I%JFiwNYj`Bq}Rd8%N?PK2BO8 zKu&G^2(eMVg!C~Z%b{|U)VB#em_OuGQ2p}RZV6NdU)b7qF&6mJ?13_sYZ+?MRbZ7R67ZXY{>}63rW@QmLq!}h zttes!6}s~HHL1{*M>XrM8q>$8En3i`qSR|u*{}+?UN2UQmKU#+d6xox7TalX zF6CAu7CZA5K(^o804c`qM}t;IBc_Z-EW-V883SH3RlUdvSX0kVtwmSw6(98(cfrXr?Yl+xHmDa~W5l5JzEE$MwBQ-w?g-)oql z;)%9~mc*jK+{4!Ced=tzjXafOtH{Sx4_c;zJw}-7+m@-gZ;tAH#FVLsDN`wpOr6nU`G8HjpDy5OBlm@2Cvx%T? zAc#Y(3vD4dM3$S5hWA0GIS}1s;VlG@$5U#r{t+2FR^HRbfgNLWMr4e`Fk|uS3fVGb z%YkCc3!3J(ED-gPO)~eY0*S`qO>nu&v#X0=d1M<6j>ry&;gDm!k$`NwM_5B5PoC6% zj+n9}F&&X9jUzIpfhA>=5xQg#!!$@<)8SAg@39on9Q*DaNN#>$T*f%G@6wI+=8&yI zwi+n5TGVnyQ$J1iL(%Ts+F`WAprM0pG{{zGfsNR1&jw`MJ;$=uD#upDl&y#55eS4e96&$j}UmxweEnemQ9ZNDM};UYdu@rh7ym`d}F4v%Dn0r;_{lIAS1b_*)!Mo z;`r`+?UZS69cvK>v)}5=ICt$&ck*wlb3XneL%XEAh!x8Ct@$#(VZw$ZpNW3ibVa|+ z?B$K?|IiI(Szn&Dd#YV1@G2O^f0p>MD4Ox2&&>cv>wBfS2$(K$PXH?w+O@#$M9))c zJ`YUKzP$$+t%;T9QD7XcRmyDh+k#b~89gK^9|TN&U3qS}>WmivW4~8vt_8;Bu$AT} z7j8K)P32W!n#xA^laY|t*0 zdA#Cr-=d1}fYvP@(28?`W!XvQblva_;@aBU+>Kr1r-8U*&KQ2m-+TirY{DiSHsNZY zm9qBaT3On)El2zAxF%eE3{Hpf$>6XN!@m(#HO3xe&J)s2%@ixnrun{+G1I_@(4|`mG(`(Wd(y?F}Ng2@#^40W9wL4EqMid`o=NoH_Hkq4wTp zuxDg8oYmpJ*0|_=yar)E#3i75j4-|V-9nkw5=#HjYR-u{tgtbwEd3Hp#Ek)dDInKl zUIusy;N^hR0j~gz16~E#1b8(d)&O9yFq8ZlU=r}>fS&^V1z-mtx9PnOkXigRAWu*E z4B$C{I4mQ1E8z8jCE(jMUr^ z@;!|CrO@`WSj4;pSAky%ZMDVl4$KHJSEXi!#UiE}jYRV|!eSBgEnph%A&W)KYDZh+ zXkD>Y>rt>+;(l|-S{!}LX4TPjv;W-NH4*?bau(ia;jJ3cJFb?KZ8`g!`DyJhn0RNGir-8waQByJg<8I~{!(b9;K4V)^oCF)cc&t9~`+61_+drlSw0 zqW2*|7CTOc?09ZaD%PFGOlenaSPx%TzP!7$JF(l!=rWeihFyV>e0^-$;@BIAh!4R0 zZ+FLQgA!#OP2D)pc(uf{nM_B!(MsgeJKmX(c4~UEmk+MdbvVL5J0unD#)n`gRP(Mg zkD4FOxiSaq)A)l-&hP@2FMq!C#l%rOnsP;|>7{wbeR?X&lPEF6>3#O?-oca`9=9i1 zuIR!VRmpcMdMjRmsctXuQYn@pD3(65v|(7mhuJfw`=h#z`I}Vx-oSKAwG)BqjOA=# zI%ByA*Z~MvX_h+L^T4$EZ*bUKz(&eE<*uk9O=W*z&1kEYW`x5g0s9{bcP_Bc2*xeg zJ}6i_Fim+eFx|1@i@W%l!-)9Gyd zyo+s`mXzHLB-kV_4sVA@0FjaB{W}tPSJT+w&SQbX>&JQ>+@8j;=Ds3YsXC z#^$1Ci;IE%9ba3F&H4Ri3lveo3q_w}wjhm{XRbh!a-jDU4{<_rf$UJfsK}@9|d*`8dLsFyqfS758V~qsVLt9F~;GFfCl`+Bf!JO&;z#^ zdfI{(-Cw}pBwgDyRX}N;-|X)SbO#)Y`MOL<*+H9Pp6zt1rGpESy#Ep)4N6}IJOuDo zK-l2TR{+lhybX|T`>TKyOq;;ex`2$Bu5=-$D_xY<1Not}oRu!HP|mso$plQ4OIJo| zjfZqtDpI1O2LfT~_({Vqo!CrzSL}9o=78MS-wsP-w}jOI(QcI{upgp8-gOb?AW1;QzGD20%JxIO>|o>W6t;iV80q?r z6i@bsPd3cKQkODX5!2BMC)5IwD#ll|@17m)2)rk=$R_(8xxx9~dhC$Wn|VWtTaQ!z zctz)n<()r6$!CSY$Mw2EY2VvSCY3$Lmy~y&T7;NbU8BXnVo2H-AoCh7`@ueZnUB;Z zN38{7id?U7@8|6nU-3*I`AEfj*R!1zN+s4izNGzt?5C+{FU!D{eEtkbPPbH2%v!z9lN#TxuR5zHhAA*Bp>J2ofS|*pyEP`>Yn;)IzJk;y+tRWMC88x z#U=)97r|x&I}})@$j%``TL2oT?kdeSz>0)+8?bsw)3;#?*2cx;s5w?r z{-UE%x6-#g6VY z?VeubFrKQaad}FF#=Xg57&KYhL%{THD;#Y#FwNiZ9F1zSruUYk6{AgQ%0q$a(<(l`;36^Ca;EmocQ56R~JwjC{`j$xRt!MXxAUy>=gY;6r6@rd` zv=uO*&+)HxD3y+YlORnPl^|z%7;Z#r67IC7OU0GY?=?6A+(5%KE?T~w<6&kGU~acf zOCPVJ;Jn8BtMt}f1MfrLr@%M7cu%VdZ6>#CszN7!(PlClcQ;%5ov?xMo9+Uf0(dvz zrvSeJcsJlZfDZ$H6YxiX_W`Z~{1zaGDGvZ{1bhgv2x)#BkXsUb2k-#E?*eicZ)k7H zQGkyCP6YfuAiwxgzy#o9fHeI62=HaVZonSECjkdR1AYo{DBudfV*#HAq%-15z%v1# z18fKU3E-yzR{_E?(fkbXKEVG4d;#!zz&8MY4#)!}Uk3azO8*tWF@UQ9rvv^H@La%O z0VV-o1-upT*MN5b{ub~@fWHHL9`H55HGt~?{|U%#>Gwl<{}J#6z#hQKfH+@nlllAOxn>UnJaSw zTp7N`e*zqn@n3jsu97e;qYA+;ZdiEKqNc=zGfu2Zw6<2wZ(T6g8U6cvavV!hPmbGN zFcd=81)|wYo}jSI2L)pess!@~1y^$>$sJF?nEOa58uHPq@E-3v5~}q4rUi2o&GDwT zHY@`cJyM?Tn-!3xdl@?rpp?e7A9I+7v$vD z?WE;9>j|gTfN9YdymJ(I=+jIjS}Cs0BPDtK$=S?BY*6%Opni~IIKetl)01}j~l)TdqMnkH`V;GS%%xx0!D)M!N_gX;arw*SF zvEp3(T8v53-ESTsi~LZ0pxT;=sjZn<#5`}GmYSC=<{htqTYDXaka{A;bivpG2;c}%ci=Z{77D2JFS&F{gYvU%uA(N6bPSb z*C)F4nUePoW^z*26F#-s0^OG_d4NCpvXyD(Cub$*WsR>nHS38@ILG8a;|{(j+a(!h z>A=~-(Tyt^43<-F^@u};%bdZV*~>j-Sof|uPqKhM-g?Ax((hcMankP`!KezHDH#6b zFcTV^7(@7s7n$i`uofl8>-eq1?_%TImBD8anK){GP?EqeEze=WQ!$kGZ$B|r1w__p zdn$(CwWDj{c)7^`y1?jl$Gj3l4Swr$_)Q524wes!#GH-aSg^HTR&Zp#9&#gdBVvPm zRCSmwSk`Oo4F!qHG&UHOXLH8(<}fzD7C9k_ngx zHcIv~)g<5=j>gD*9SF$0fi68F`!DSgiD{2WEMo3KD5ZVNViB{#(Vlg*Owsm$2Hm4X z)>**a!cEgTeWVltE=B5<(nGfihCewaKN2+3`QsHV`4nhp1WKN9_=OZLHGP%*>_v?Y z^BdZ#<}}T3O0+DP3j~Axb{>6qNIz@D$rf7!Y;tpuSuIIoT9U*v$6Ud|1mV~t`C6en z`wGpG$!HHl^|c6*i_J%XDbL|Hr=TdpNcXN_LEVA}Qv(IXI4meCOvm(9P}c+nu>Vbn zY_BRnuc^9%VN<1$;N^{wsVVa6L!L5kL3s*WlKsY2US2 z#600>PdnNgM_cP?UNiPplD21CFRDD#u)sIuclV*HiHGhA*2a~1a#El+7>BjN8n5b8 zjlO1k^k`|QG)auW&%5~UU}>Y%lhVfIq?Gnm_#iE9Vp`h7BC;Q%(z=n3(!5gi4guei zFkr0h6$aPi?ZLD6{KDYCK1+1~q=6f(s5BrKf7F#4F)cM>A`G&Z*yYz|W#v~uqm6B} z!@K&Djwf-FVgHrdG+tdSeUi>qAB8MlFSLokROHMAcBatqCr8kH0yK7~e8!7S+ppAK z0@|^DEwf)r?I_VsC-~#_TRWAw&Z14p8dNlyXZ8lO@jJ3FK^K&B{7~=mKDZx>rgz@a zNW9CQI!iHlgiY!j)^J#7?>#j$Veg$-WCNm!L6t_CX;gn7|r88htI@2$}L9%m1 zTV|uoy{bT>QuroV-R+CMCkQ2Yus4*Q_(z-M7!e9h9!VgxGdknK-5=<48JO77-jzBG z1)q1ZjdNOs*_dyMe;cA_@oWU768btImCrW-#{fbWB~!s(40Zgo#6Q3&M%BZZIWNTJmmP0;|Gl6XI|WjL%jQEuy73TMjfNj9=(fglpG5N zaps9bc2V=h2tc;oLjlQYw>VBCrkqAhox_zz=WwNoS^ziLO*7J~Qcat?aBP5T2Vw%= zBslk1Ko8#WM1?+r+90Q~b7Z#+DOZ{*U<-F4Mm1S!c#y-N6F{Rh9QMe^;@6aqKjW7)%%6anshS$ULzhzgE?t3B(YF6oU`^pYcm>_c-h=O{$~h=b zN|l?czZY+p4G^l{gF>x35nnnAf7oK$nwr7}w5YkYEwTL!@xE(7BHTS;2KnT>s(@3Q zqoURbu_f~=6;_)&8H6}aFP)1?6Lr&>e;_E6=3DzTHMSAH#3%zP{~@;VO1&D4o+@<# zAmu(530Vz`n96-(m>+>uRoW>Q+rCq?c`imgaF`SefxQzlX~yM9X}CamM^lPOc@Jdf zd+>@-EVs;E&@@L6mmdh}Az~Rq`J)%=scdLVd9EtZ$XRT1&SQ;g6S>B(H8H^KfYwwC zZecr}1jx2J*>caFj(dnH_YlLrY-sIDTWvA_^aM4bAqD|+be#&&Nav3ibsdf~cu(uY zM5OkQqHJAs zuPQ*&3w5S1gFmkb@F(N2Go|IQ;yC<~OZih6GVD1+gNGfu<(U227cBCP>|iMKSnAtvfmSHo=*{{2rmsk1AN9J}Mdr7_Y_2St<2_o1P(e!w_O(sYf$vd3 zrt&>7i)y&UlsAb*3^`J1`&%r-n;D*5Su32T+$q}{VKGgCzLWXELw5!H&L4s|KV5(~ zX~}sr$5sM^WXPK#Z*B{3W^W;kU65KAEK0<;l28AJ7Abt{W}-&8)(w9<;6eWTCHh46 zoxieut-)ARBYlfb?#o701Em!45FzOJ(U z{AN>R-BFsEA6=Qyv7&5jcl&Um%rnhJUXXc%yyul2n~K_tR{0-F=&VF^FSM*7?o&tN zCF+AR78sW8nPPK1FrFw}jHNwr8WwDZ3wJiKN}+L^5{Lb?$KE8d@J+xR~)rOf-Q?ENO(XLR*bER}%moN|aZT+WX0`aj4Yw*7Yi zN00!0pq2oz6R-r3e6gF=6P^HbshlFFa*9|)wir^{-@#)_qdCrG+?38B1qNj5Ep~K5MdJt+hAG%7ZnVD zfuzxb)Z&s#8^SLza}mBBa1rk20yg3Od`q)wMVbjL|KuCn5T+5(|NcgVX~2`<+xtrG zM5LGhYZ~y4^YP9`q?wR+_nog3k(a`$?VR6Qs3zv4*4R1SU;`G9ERROW$#fa z#U?37O5f~I3lNhfJV)qF=0Xb>h?Khk@~#Q#czSJST*>8gT+a3Nf|efoarLF~eGh%m zrve%uU(ctz3pN&rW~j=a-h;Y4wR*NcFrU3jw@VYwY@v8 z(3sNKjw=UHlE`H@PVnt)vwb_Rcoyyb@CLhz&6=+%v|e#VMof#0SU%IUry{JC^1z>* z$)GK%2=_y@UA{}UTajNySQk_gCb!IKN$j*fMI&1lSX=VW=rAP$qUtaeIy>(N9!yW| zu$>NUH=}Jwo6Zh(mc``Z`=*`tvtNGAGlpt6!Crz>jH=oa(_VsDU%kX1@I3$2!IpZ7 zQBb_!>Z6zVMX;BcW~Y7Qm$qOxIJ6f#NqGT!kG7^p?zh%3-%T~e6Ag2BTA>tnDcSx3 z1EBK0_p<0<&2`+hYc^?iGma28^su4tv<*MK%Hu=@|=(B8>I#-5ee+TY&zGU7;lw^BF|7wt$178JX zp4R}fc(Et3EnZ?;yu@_3HKjdk!$o9&7p1LrG#Dnbw-oB=oqh+NW^Iw#OhQ*|ncDXnV)I|GN+$(ibZA(O>sZ(zEq(80j4lLBa5H@%BslYw!A z)khW$4{TWm2{*?=)dso89?h?!jE#XZSl5py0e z4L93j5i{S>7CPEhj+S(^n;mVbqmd1m`^=`<5B7W0Z0rewGO9vk-Rshdn(f&So5iBL z8@(kM_?f#Xc27S)Z$HCXH(m%U7x@Ct8FEj)xEsPexGxCfFbww|XbTR9xNJQ1(hR*c zx5Y~{KBaYjYnwW6=DW3sFK!(k6nUY6qsuMR09ohAp%1mk$dw_-{$7+l zCcU~V&AGt7fP$#R%)WO*?^VE>@lE*+CG-ayfnNoFyeJt)KrVPa=9loU*+uzxo{q;F zE@~2+M|c`n{?oW-Ob(vLHA{y2&QMf~bF;A7_J#fu4(bwNDdR9CmXoSrV`{5MP4aGp z)X!3`9ut=HqS}-5?E1dt)1|hmoJWV{{GOCEHFs)n&p^7j1-zm>x!!^2H-*|;=oK|k zUQwA&Uo<%C4&LRBE;9SxzGTOgT!6Y3xZCB;Tktj*do0G!Y;J0^C$!{@B-xIG+8uTd zNgfM&Eg;+XBx@Gg1-gokB&i|kNRn8@+y=#LH=%vaVi8jeJt-ozh{Ymi0Y0HrXl)k5 znjPFTW$2kuiikzboD%FFDYRybMa+G`G~9z0i%^qW&(eW*Commdhn?=rucI#7(X{Rz zsDeU&Dt$(EN!R4E^r>reMwKj8)!!IvhG=rt4r4j!@l4}^l_O8ZrWTlvG*RU5;>KOn zPkHg|1blSCi{bcQmRYgkds!;Q&>^+VbTnHbG|$I{);qgF9;`ikAmsnzd48>vb_S;J zT|wg=$D<1a5{+>@KhK*(i55zIS4`wPbDbF0 z%%O8LBgh|b;b55;J{8^Qq3QaK*a(|L*wsCZfDOJ=v7U5&&rG@PSTQ7R0?F@{{S;@u zZ-}L1J(*2yD_mSTeLjI*wEa(0^}QSR_uik1_N1dd?hR>d+}Vrt$JcKx@7xbUi^s9M zoZ#WQbbW7j^6f*j4!5sgm#T0dW5!1}wwJrxSZ}Ii!*S{QbuNXpgg^$@WwKx2o2u9_ z6oNhTVn%eSR3LNh$EBma?zt9w2@+1#zqFy;|0orG$wiF4)bCWD52o^bCY9$?CF?)S zqCwTUqRCVe3LCHSKiim9!g~as#(Kt=w3njHQ}yfCC)or7_0hi~&nd3{=OCDOuPI7F z`)Uv0wc)I+FZ0DL86Vr&{-HuoStc9y@9SySvp!3#&R;-Y8$k2e=$cUZ;}sqME-LT5 z5p2kolxZn!-|Jje*7uIDD8KF;gz|?$YwGwv#GXvLzpci4$Cs3Meo?C4--O9SJ`Tg% zJ6~)c@6Y8krpVvKpV5R}KKylu3}&&vvT!M)gEQC5DFOwB1G3$Ie71D(%4djvRr?41 zkC~6?ItY;UkBR85Pcsr}-KzlSEm#PxF@_jt4+N`8a)}KQq_w zv6vj}-Wy0bUE->jPY}?1$NF1PBkOMzVdawVaH{|%q0{%=^4X1 z{*2bOI#o9eCrxlW>9yQBTIwqmU4{7>S6Qj(v+39xvHq?pZ1Meg#^ie-lmb0MO(#yL zps23|$5+BVz&kYJd|n7G(U9M3Sj#blg3k!_3591X|DbaO!Kk_$7d4v zU|^b;6M*U4PIFHi9JbJ5p8|HQ#N}x+8sk=AT53N4rs+KmOyBWK7jB)S;b;Z>bWfzE zsT=@IW3V-7Dia*-qYgVCSS@~)=0g0{xR<)8oeo>#u)AEi2ORAQVEP>|0n@kr!9CsN zuw7A}nyU{0)AtSsrZL6>(=VR^O!IOcFpaU$g}c(xZgki^?&-sh_AD?><>!v}n#0}% zrg?rFnC4&)jy;fD9Gm5^kq#RVOv9bzXlDV_?`U?ktAYJeQu!<}?!8xOz6Y!kt-I1Z z1B~X6O7k0Fg(sZ;g{R|?9sh*Wq1f7sA3$T~fk^jU|8$7YMFTr7ENTkpnhMM{P3qrV zQ-i;719MGb0rxe{)V~78G*ei_XrfvEQ~jM`>SqyS=7X|=8;o2WFcVU~9ExXu0Q_2L zCJfDl17#)@*(h@!?7qCK#6!fHlYVsFzB!N8z>{c%Zr?we(tUFtAHclGI)o7~my=p9 z!;a2P3me*+79_+0rpJ4vhg@-o-CmDmL*v+{(xDqYVw4@^9Ht^}d>7ixahoB}O|O|+ zpS{Q{G*!;S{dty-#jDBVaQ`mgnG84BBwGQB0IvYV=0C|#kqr2Gz&!xrW@9P}c@rRX@#GS~8o;jujtBfc-~_-Q1D*f~zg%-7;Qs+m1l${C2s=!Y zM|wenPvRYBD&P#jDB#6_Cjqtso(z}NELG!1Dng1pGMQcLC#o^d7`$A~^{9+690m zfO7zM2fPq)Bp}*J@+80(zhjGJ&YWa+?x3+zykoU20RiFBb($Tz$DB4){gDM!;JD+W>C`ycX~)fS(8aD&Us^ZwLG);MV}z_uL6cZvP;@RVO7mhSy0+ zViCjE`yruy#bUZa;D?0E0EbJpCF9C8!lK4jO>D0KZhI6@^;S zKxsvd^P3vfm)GAUy{3uo8z{X$U|Y>-LOOFwN8VF1A+e2=Y9qyf6D<8{NKv-iX92lv z1U;l|ZMX_>GVXs0$Ts~mKuTNoTsomjOea){>EVA$qpPpdJlBQ%$83HF5;(v60+%}Z zKR3vMcj65}cY4O*mvDMGJZ3WSwa$#8`B@6fZEt*zU39(j&iI@@T_$rED= z(Ugt=q^5MF+uN((h5*igj8lF{C_q$#QXQH3&BorIc_(x@pZ zEn8Dk+V*Nnno72&q_k{JN%KNYNuP$A(txqI3W#tE)`8s{&o49oV>Bg3`Vq zgpCpF?RcUHUb=R%fZsC{-ilq(H3+>*y&pBkhQ^ModyB3a<`3yl5l;=C`aDPdPx+zZ zY3rORG3_XZ0K0F@Bh2?x_QwAX`eFJKeMZW|x4BIGTVBk#H#PmlI)069=T%9J4mH6Atwp5Jwd!53E;Xb>`x z#@Z5d{-6RY_9wSr&Jj!KLzUl$YTBe|-K6^XX}%(gqrB+L;y+`V_t;RYrO}!(YfrA9 zSj}Cc;)%9~mPCIR{~`iAt?f*yc1*UL4N~PUxV6>QQzmbJ9`h}@A5)91kEEUP2;ZQ= zhHdvKw8Oc8kA?=D&|ouQ1{*85#Q(-G9pTwxuTg;Xzj+jf7!JSA^~=DMeTUWnY*JznA&vG54-Pt(< zX6(+MLtp~pEcroB70T%!+18fC+2yh|b8bCOMC0_$v1o&^j1faqD+5u^Jz66lNDJ;K8j$u9k zCj$QUZ|{hs-{rWk$Nd$6a{#Xdr2cRfActR3=*+tsPH$1WFEz6*7BOp~>GEl*S!c0` z=-L{NfBB1;+4y_1gqvfrhe5I)c=D*M@iT9ERy=Mr_(vr*X(d5zWBLSqbNcb_u;&A#g!6txKCm073 zrwIl-V)o``7>5okI1XLQ;n`YmXeQ%G8Gv#<+&pjMv?LXky~;YSUS|>`%9qE6VHjG8 zfn@~-dS$>%FeF_kV>)hn7G0ByuHLZg%IN=N?@Hk8n(qI7CL%^iLTs@;j0l3sA|jS~ zvn4Z0CYkJ^cqTJ1$;f18%)Ak?4zYz=ilV5!wyLTn)lw8CmZGSl>Thd>*q5U9=l}iw z&T{X$_q~~srGIVj`OLfb%g~xl$!E@m{&^sEoH^g=$Y-)UV8*FNPb}wuP3JQjG^3gIl z7JCh}A@~i%k0v}8dmOZ&`*!#zI2Jn|$iEIY6@kqxabF~EEqXp)%sm#vV0FaE;i=-{ z(y}!?^c$Y4z`1ny2lH-duTY$S=T`Deo=f)Eun2^`!tHu){ zJ^d8&|I)QBQnM^Pl+v#5>mOX*H?gj59=@t=FhD*5qkoXDH5At4vea)XDcs$_@!=@) z%&cn?p)EjY#V=h>7Ea&Tjhp`TjlT_IK3I)mzl3u&TolMz51LNQg|M%3BHo;rx1zKfnPd3x20_% za}n8p3X|iPN;%mD8i3s3`qQcU%VMEOioFj<7|vt21lD(MnRjp6G+h>0>7d` zQ@Pay2{HN9v;?kuh15hD28qAf+}te2S5rf#DWewy8%Ot@#J@&U1yqXB6p73R4$-dt z9TGrc7^o^{zO6MKMOjpp(kf!6Rw|-RsfadpuaBZFhpeKhm4et(F@0OZ?Mb?!CK|Aklndpy*~-{J@?8_*7ZI#d_*O#g%UFST zKhWOBn|b;jyxDidhiYB=Xj7$+wnFbylnO=rLfdk!@4brtxK~1bi1U4=aO!ouIG37x zQme2jmHjd6#?gkjecG^eL&6-Wx@U-i$8U$d<*G{cZF5)9cp>&cZ!B!rB0#x|dIqi> zp_;mlMSU<7LQHP7d>t4~!C9NYH_4LX(Dg)I_lSO4ya2M)y>Y0tl5=bELecyyelYo1 zCaZxC!re51)ySc*h;feV*_7dwILCE2wd&_Md!Oois3lJgb!%8ZqDsU)tGHb>*Pt{W zkjCAbRq58aP3M>~?*G!k@xK5DyW_>kiCnqNDPneD*xBKcejk{zM~=%d%@o~7G8}1Y zY*!2aApJ3ZL^Ou^on0bMeidorYo6D60PL^hJs$5j@Mc#CYw*w&;*f>C4|P}>ZH3-V zC`rc&?G|lQgA+<@;Bjz58|LybVo%NEr%?;y}H369RpcCe{wUUs7Jk6dbm3AVh3Zp36X)ZMw5Mu#o3Qf|q+19SB0 zUe(up@_tWqTPM1AM8!%r>Ft4xnKymA=ZrU(JeI&M8R~p@br&d3Hwi3d^ZR;dNkF(d zQ}y*Y+NzhRkA+Pg);`tJ=E0W#faMe5n#3>I{|nye`FCW5iNP~~gZ;lsH`B)ZgmUi_ zLTg-7Imm(eB!9`I_%&6d&heo%VPuS+4J=IdsZ4f#bioQLmg7 z>Jzcf7=m9jeqY9YqIfOTnpz9xHYfgs&u+U(e<+FkW(=EVWlVqQ>uH~y6zvb#a8_z+6uih&<{9MXlH9%q4x?(+V_R_y0#U1vk^_AV46wW3caTh z8in_qwiSB3oyYa4Hq?CC9%D{^+GRG(pM#6#KkfK7F)I2nB|LKQr?6{?hO6`aHb zHzycc@Xd}8(~w$F$E`B%>bTV(hz%XBDLn8^F2YfVt@c}X|K~4kbwBp5vooa5J;O=E zd8W2@)LxjZ5}w88xy<3JjWW=nw+(*(8&_>{)wZ^)w(a-t;av9LksIy7@a(O>2SR#k z{@~| zE5BGW+RLubMFWfbcpZn#=V9#g0UWv=a>O$oI|%u3Z~i#La`-yt_Q-*}g)Q+!&@l=! z5Wbu_#Xl}lZjbAC@;UG<OqdH`vr&V;sJ=i)*>%n*iHD)X%-W!z?WW+vOsAIBW|= zq7}9cg^vxjIws>su&F~iZndM3QM)6G1J_Q&=2&QVN(Z*oM8FRvwX`e?J?MtzfZxY z!u&_rRG43bO@;YA%l8>>}MT>F4-4BO4%+8y3U z5dQjG3>oqa#rx~H-HhAKwbgE>D>C)cVg_@l$*F28%PhvQ1AtAvf&qqw6)P_Yfyr|Y z=SJQ>19lMx&*N1n{J&cN{~4C<@_+X7X}-|^bG0mu;eSv4>lyxym5-MHS^dA^|3v?9 z_*ukhh;P>i-Y+EeV0mNP9^9gxLR-!e;uoe$xS2Bq_5 zywNap@)pH*ym!Pqi#O|qBk|_2=u*^zs;@zt>TA$e=zRt*MdKYQincjw8%5hn+X{JW zi>B>nX{_xOAMRe!vbZ%x(IrOmUn1(vqR(s1X9#yic@&a||PEbUTDyVcU} zu(WpERMCLtu4BA3J|?x{j*1MX&g;D%Y59M(FVMsnzsXTS;zl+wEA`63H#m^+5y1J9h*AD zu?c?G12ZdrcO9++5SILC|Cw=R+P5LK!YR>&RAcVQms9=|wb51T=gLd@bk{27rtQB> zcl9V?Eb}bU`AXz}YOYZ^rx>*dZLDj3ZKS0RRrd+0T1eH!6)0i#XqCb@53$A#awnnH z7SSs28mdQW%|IptY8Lry4r;gzP{JeQ?J)S_$T+)MXf&tp*q$@LGtupM`9#B#YZPW3 zbBw~?z5pQ#jsDK`?Ce4g@g}HDgka33q_38Y7K@jjeZYZUXUcMo*x(R|=aN=hVQa#yLEcQSsHmrp7r( zTG}zN-6*o1u&Hs*sj#VW&Lyy^G2u^OQ~usBPg?(PMl&bt|DDkcXKsvPdEjVpE5 zJPPphN<0d1$H(y~Am5l?m6~Lr-y4qtdNK;AMnAqDtwYa80i0p!ViXYmbd8T8*v)aq zI;WTRRa>yIt+pRLJReO%?wuJs!<8LQ)42?PzAi?i^{3DlTFUVA-uC#F@Vkl_wT0H- zoELA$O2*rF5gkOL}G}p75QR)c^B$Y^!MSVGT1rCGhXQ^g!^DB4_?|`-!6shm_#-6aL35)$QYW0|n%FoR zu55egMiZXccneAkUt3EVPHbfHi?3jeCpOmD#74TZt*$+K0VA@RHc7nAhhKX{(?Bfp zWENJ(FX1{jxqmVEId}nFnPFk_OmNuGud@}KJekiqVL|YTntpaKHDPfM-l#*oAK+bz z_j!18H^%vR*WrBu-fejQ5O0=~3-RW}1k0(aXJ}LP3~hzp|DvQRS^~XAMH`}R8+b!4 z4Rw!mA#Qlt(I&1ds-=}rfpo}&jE1T(Hi1o5B7-e0SLLt|Txo)p1HvKybJ_Sc2y#zS^pJ4$*C$XGc{5;PWWTN8xtTulXJm`7Q#QSR(=?=5i* z8uRTSyg9Ji3h$A4Z;dze@-}$00N-s3Fm0*;)2422R5ae)sA#KISXE2z7FI=z3oDML zS)JMR_=>>hwK1TvpD5Bbjm>MZuqII$Sy;Enn}u};yjfUx#G8e+2yYfve(qDPEp4i> z(xwWlqOq_ln)K@XF0J|W@Pe~yzEUfO(Q+>3BG)gL?Biv}^V{Y+*sXbHZJ&Lo49sq_ z)_Th)n8GW-G%0Ekf+Y4u~t;Dr>;C}=GQD0~W&~bb(+z5Y*?}41Xh81Yu zB?w4w?+Dm_B(_|IoZmkgG1hW4;qE$DZ?}h9WXiDj(}CZw;ubk>kyoqc419-7Pi||S zU)Rh7`=qQhV@6F9B=*@q#onO-$bQaH{tOV(?^Iuj;*y@&Qolf!X>O$bd>2$M+icPQzk>hSujh0?tETbA@(}(GISUmA%LtC? z>>P+UuK$qLl?UOy1O7i4?@GK6!MhgkL-A&J|1i8c)ULyu>(%Gr-Gp~N-i*!fYz0J{ zs(@%K^w_mmGt?FFW4sTJ6&((;})mW8tHRR() zoPpvG9IN($Lz*j7nW26Pm?Z3Gim4*pTz%Vv9$5#nsX>1ZUMhorY9|-N?S(g+2p+Vn z`lz(2CW1C~mWrbBEEPpFebg`1rN{+Kj{C|x5?kQDT3Y!j@74M=0mw5eKjq@PTph@v zaHg-uggcORkl!-l9@$G7*5pI*%dp81qrNx(H=GSRX3WC6qtfk-N2{sHp!$q5(0IaX z^360T$?oE0hlO2lbaOiNRebo5os!@oh14-`&t;m?PIE1C2=)FGywR8OuEU#Ya6R4( z#8b!>D(BFqat>{U-nB?YMY}=U>=B`dBX`(Mi`=(|9oFnY?Uc9i-wLh_7JoG1Pt?yM zcb^#=b5I7ck)12Mb)9A6s(fC2W^d@@>bF`BDJL%C8?~;AR3SB)l^NDINmyA(Stg5u zg_LbUxRA1l7UO3O^E8WS0p3NLcrJ<}^Eq~0b#99Hd3dvE@`8C)G-*>sleR){AjB1o z*D5F)Ds{7xWCek-+FBJ%LZ$N-%q`*CRl$531@nwh!K4fW%vr@fp#f!b*5z@*j0pLA3qICM{+kIZU@9Z^7IKo-(2gJx#d9{3{CP*`b0-85YdV@f#l( zOw8{$W!l@-{J@;L_Qv}7JNxQ=@(51cO=@Y#BzHxdDO(BJI_k4MESxFiOzGL0!ueQ| zvvZiPBZ1A;C~(M?NAgKMdh{godAPu0-%cm<{-t;`|6isH>?^jw(xwV5ZEE&R(Kvgi zXtuz9#dEc}7zg+2EG_FLi!#+gAp=pAzp@vf)O>Zuj4e)|G7+Pvhf_8B(0tq?JQP7# z0dI28g;m3qg`3laG~vSC8v!~hRJbX_2$tjbw)20eNZG~PHN|vHc z)V3ZUy)TRDK2)Fd%=!B@eU|(-iL+Th#LK#1V36bVeRWd)y9h<_^nI?tI~gJA?J-`; z#+uO+%FAY!6a|~Y)Hq!5 z9QX>J8mI3WEGe?nGN28QTtCQz!*M%w@vsz5Dm^~vbNHmvwe7n-m3tPtM9+riov1gc z%A1AXhTGvGCcMr)sF6@_bq%c1l?F1YfYz>0&MND*>(#$7Qc@u?^BZFdff`%qI^w!7 zlG@Imu?sD?D5kUX>$38FZ+8t-5 z=q-cmN}>H)+X}sdF>6MN4R{=i*b2R!P|}s`F4|V;)x)Ovc(@2{g>uN1qAjwtC65$Xe|A27rPSP%LWzz9S!zyomyqWr3Iru6pOGDdQC_|nd@f#lb zV7RcZRo^WBFBlX23(9-E0%`57Ktg9|dYoTYYqPn^p0*pI%ACIo=s%`?k`-&xNSUe% zwNJn#Vdv16D^d0ge-7LXRaO3b-@=_=)^CUPc0UHP(@QUg;LT==i!sy`6>X~XOIx9r z#8c6*xJ_*KlMcqTX0aNteZvPGLfwd#rngkM;r?iM^Tt0$U#vVdf(_0aZyTpG4~OU_AW7Pe*=tGx5ykd>0?!^vufvB?kSSK?HeI&Rj6ny^nQn&u4s>HTcP)= zrM+os=pUU~*&mZfeW#qI@ABxk?CDdU>F7QD{*}X4?v9BjIQDlPaT-wN79bCtGM`~o zMRdtSeQ!-1@*p<_r%^!FWRtR`KwAg(LvOjvO`VIw{!+O3P63T3H~|GHDeCN7K}B9` zXedP)@=V5W6c*GeqbHy$GIKiSrJJ(p*0zjZk@YX0dtIx|$-kg8r}MhetNTvkUvpEa zYB8W@p|G0X6r+^%#LV2REO_KdNhs>bXRd){G8cfZFWn{*MAX;HiKujC3{(LM4Ud{+ z31Qn)D-`u$`m=bfhqvJ!jk8jiC-%X65Z+_(PU6keqnSl`dNj{v;_1=MHwWO&5PxHf z6K$$E(S})B=Nsx+`va||II78EYZD{tcv?37cv5jrGyopK8APQ+> z9VonB7AfpKp9GV=URF|@;WCC{4bQQ^>Uo`v-)nf2_jSApz8YSLEdy{la} z@IKTw)#Dg(KhlB8a+a@tB+b|TmQ{XJ+izLT*Hg}%F)&veZNW6!7+5Nen8%KTPr1{m z46Y0>qe~M`qqjgiHk3w2<^Z_8lEgy{(+I1F$BgM{uAiT&Uyx}?cQiLPH)b2_ny{v) zAw9RTsVUvOAJZwh>ri|0Qe$&=C~4uY@G7S#lb9;+z)!CRV%L%}JRcAFYQhv|iFZ<% zrMVbCV;IkKp*fb`B2B!wK&9^`cr*Sur&Q9nFZfjY(x%dvHk4Mhm5Mf0+a!H+uNy=8 z7Q-Z=VR8f;onNjKy=H+j~^mm2tU|0=sNlbQJrnmDiqfND7v|%3zo{Cnb zZT{46rJnI!mDcKOw7GY5(OPBV)+%0x=ng*C#NfoOQ~ZVdEp72&aBUpQ@ZUKYJRokV z><*VT+)^dc3aOTgHq}zmR_LYhR5Z3(iY9AI`Yt)HkGE+3M=E6uyK<)`%fA`%%;z0_ zmV8m$zQy6V#q`q^XadzWbZ1q5sxBSCNO{4dwPyC0TVft$qq;Ys2YOruv7$=54ds2ox)%c}D%^@aWn_BAYvU4xMNgR1GK4XfHt+AM$x#PM$sVX7?#jl zaI0&9hl&ja&>Fh$DO8r%B>u%e0mHc^{%cf4{^7#UuVV*^jqWsil$6e#Q`evtC8#yB zLf>3a^~BFv>I!1LlA`9TM=&YQt<<`M%`W`Dg33?LW5h;3!;^J`K_i_%n(!3Sk3cI4 zP1aF{DU!r*F+CEaCdzHN$BePo9*$Jn0VNA5P5qw$Azg!QHFfjUXG3#z$^tk9atv!( zV;HvO2prSKOosB#H}2!e>Mw$9O6K(E4i#_Sgp1U$ld<`mFUp*&;ui!nDI!)S|%;oMI2QSWK{`(750-P4KWJ0=gSJBNXW&w_UuavQx7^a6ur#CQ8g)fD z=FXSAn#lHrw*BsbDXAN1sezJT+o15=Ul@mikEy{QO<3!vfi^Xyb;_`$4#w~J{8~S( zy}qsqUlSWLO_^+C^E_Daff(DYTH1F0wuM*9C36x7|4NIrDJ{|#m<;H{{Y_ofU}qq* zy*X*V8a3EOknXAmTa;fftDG5avj^<7zZBfmU)Lj}T0ODuS9+pN>4~;N?>>ZF(H_(` z(H)LN(2IHwd2oF=G=e#Imf^A;nqZdUS0Vn-`Tsjn+jNGykdz_MhWH&8?m||mt+DaI zHy-$|`q$pjgo;!!$ZR=G5;XG-)Y(=IdU%lm^KEz$iTMh;FS0rFv-ujzGYV9ZqfHe# z+SJ!jMdQ~{MN=a})Zt4}Wupc^yw?g~;nV{jwYcQCFTCu=a*14DoQz%w+tL~8Xd5zd z5Xe?(F6J(Cm(dhlSzWTrK*MSsL9u0YS4ch++Io_ zrC4YrpJ(D(gLu|p^=A$6$yaK9)_YNt1j*F;`S0bJO9+jcm2ijEoKwF{LgxXlqTD8sZ&i1sk z-wdSH?d(5<*6Ey3&yBG&o&C3y_(zOhzc#%slZg)?j1M4OwF3zCcKtD9*1$;d=A@qH zVR>cg6DHriBaqb*pn>>(KFPjM7A6Zt=Pe~LR#&3Fga$T0a9NG=YQ9LlidVD*-_ zB8i8Xxa7qBr#01o8Z+kjRXXrOwP`FRY&BFVp-q(%+Eghyqw*ULHJI_kvvr(bB0V_3 z;Q#z_65uNQ%0lx-MuvrA-R2hqMS2~Cc_!vg+5#eM-5q>m};~Z;-;rDnm>`&@*t+|38BtgrO zDkQNWci@+AJB3M?=Yipr5=PodEOKrQ;+HbRIJc#3VO^6dDNMj({EVRv&V^Q~2UAWi z$4oc>zXEUS=1RO7Htugx2}zquNZPQd3))q*Ds590kL<3&E}Cy-d(ByuU#oB7m>lW1 ztPgh9;0`(2Y-o2y4P-qg151cXBid9N(N^ev zs$DnmzR)(6MqIkTijBjm0NO94;9%o$1dsO+qZ^0nEVfnqtwVQ8G%Y|2aBPM*EkLgU zP74rLTCN7*E^H%W=J++OKWHk*)Hp z5s#i;^H1#L`={L{7T8MG%Vc=j(l;0wKLD=E*cXb8;mMV;*&wqLrU}pby#d<9klvX| z04NJcwstZ$y60oN-V~^FS1~i2`btvDv?C<4zH+K2GhFvK2ik%#IuI69 z5U8`EntpL#HCn#}Z_e^whBphukMU;OvieYIOPfkt+6uiQR8@+`&0~tjPjj;M4Y8fymW&g5$>`3cFCe^?`Rz>h%d@cNo<#B@#d?8*wvx-=|qu3OkxpY*o@wog@3#ie5ic) z5SV+*0a-V}mb+4AZ5}ka@?s{WP|7f^8Tf!gE2u+Mfb%n}uE1bWTzeh`GAv;QPSpzh z31Y4C9&Jj2w5hzOXv}+x#=N(*1}DIN^@#Ya)^W*-oS#7`_rW;qMThevJ3XYacYGFp z;odQ2$it74x9*6Cm_*m=n~rO<7Ni%qbc`8etvy^9aufWJMO|8jY+slmlxk>Gs-ewP zO)5;c+Ias~Y>MhWiFUiVvS=-H_^^s@h7E11s|co2f~uC+i4_kP3L1LxD+k!S$Nd)! zxt3n3aIqt#!ex@Uo1QrM#jq>{6Z14s!^?Zv111lDKV5~yY{79HTYDS#4`w1jX_Lg8 zU2%S8ag&j48eNTHIKt(iR+j@No=R-mRASSndftlm1mqRXAhKG)pEfKbst7P!55sRy zZ^Hq1(;@~{<(M($Gwa%>FK*3LH_vU^uc-yAn0R7z>%y^(nWhG^v9G-zl63=_LZGeC z78SP8qkwr_7npWy3Bd!<#NE*1(&po`KRX(@$MzIA6lh{^VzFuSv4_L07}$?=ft^m{ zScp+01EE!V*wSLs=3|Zo=5Syx>mJhyDZ{y)#iY&0#Oe#&sP2fDzty3G+_V((4F@dm7SoM9G0QC`Z9b;STfglB z)8;Mt`WMBXXt8PYu}$7O_gi4Q=t>_`Ek12N{$7aJ2fqQRPxD}1mW0{hg)3Qd|Xp@kM9B(1LpDr16i1Otrm|qAJ3HCC%VIPLa6ee7aX=&(a%HTq;^qgv(05rC)u?c5!!7!ZcajUXRn~#YuJVtOE4!F+t2)^BD zL&g-q_z1u4@!QVpJ3uZbfgNL1jyQ?}0}-ip7@kMaN~`eDR_GlD+G9dvkZJS7xF;yP zBa9Dsp-VZqDA0n_4=#ySe$eLQnLKoH7kIWF2murKcNUj6AJ?S$omQ7!btG{?1+@c& zZ>u|wmQ=iGE0n{~elN7?K%>nM6QjsHb9xtX)gR>o+EaPvamXrvX!9{mKjn-rFdhBn z$m4&o*tGfBrX2ph3v6{%kRM#8$)7A9Z9bk!lY6?u%Mr%ESWMb{%zg0R-q7jqy1=yY z4+j>q4DTEGDc#cMWAB0gh64NkF0j!{3)Dgi?`?}mn~!Jo`FPiOPV5=J4=f&SKAveW zPUr&9#yu2J;&N_V#hW%C*XZ=39^yIy1`@IVX|ZYZu}%H)P#4&tZo1$lY&}ey!aK;@ zbkl#_vhWX;pItNQzUG%-TJ*?(GLHJ{#~j?=R)6rq=FGyz_JeT-+nkoVwuX@hV>sK^ z&|24)U3~DomX>)J&KFry{7EZ(3Yvs9+?3_Mx6zTi`Jn%X!dB}p_fI|NTXvxqTxl< z3qcldkG6)oY@H$%2v4)dd1I%_lNG&a+PG1pM-OLpDYGaA-X6Y?jD`vlz2L^sxrS64 zz9ALx3zL}$k8#h;yXP(yMsjb#2Ml@EaimbC1*FbgzWze`e4W%sN{``vlM|Lk1NF~J74OGSzFfnQs+|yhCHqmCoz1f1AadI zN?+>daHAoQE5#ACFZKC~svCT%rziqL9#@LF)R!WUFZGW4SLQEVDbAevQf_+n)(KA@ zSBjrUd?`1*_S913ai#h>Qf_)3sHMo`O7(Z7-1Is{OOeNw8sJE|>2<4?B9AMzu_NWC z*UMUpJgyX{&wOp{KYQS%b=pE6SBj4a-?1zTQl01+K$y840&9stw8ZZc{Y=1X0!rO4w-@sv0}gu_lgXOS=Uh?XLcE47^? zRk-`*s9KB;Khsj=aix-ul&g*Hbwy4dS897l3je?uzb0uZ^0-nvfa1r?t!)-*De|~d zJ33NsZF7Z|B9ALo`1w(e4Umek1NHltnXKH$z6fg;c+cR9#@K^Az$jjYYIk?Lzxv?iaf3qm;zFY z+eod;4ipS|T&a52WU_x5FZ4e>{E7E1L0ZPc20r zSLy(fLf0fN^fhHuKo4~+Lic&3&jk1LfDDP1*tZq0V1mLiWURVq@( zul_r}IL-I#Wi3S>SE@{;a{KiUEkzzzs@(DGx6`(TnvKu9bI<@o9#;y<6VSXHuNo~y z9#^VTqzroJoOO5d{W@7ok;j!9+l61(YAN!#QsW%IPMR|cRg3ZY&svH+u2fYQetoH> z$m2>?JAQ4v<2#7D@oOmhIW**PrI3O0>Tsf#B9ALIL8J`&v#p;V<@>cnOOeNwn%IS3 zS7|BoxKcHaUk^^(9Sx)L`8h2`9#?8o7k+)LrO4w-O?Ld6w(&=Y_0S8so|YnyD>cLM%T2GMzHo#gk1I73lzcjr=_R<6$Ca8TQYI#DdUa^O$m2@Q z7OC8I)DN{3d0eRj9lzZ4dO}N)$CWy$3%}mcQsi-^zUTPmrq?zb!V!i%uGGPxM)VY zonCKiDe|~dC{BTR4gA}k=*SqqcGw7xFywKi=75qY{RC~Gw2ai!4N3dHNhe{6fb@7G){MIKjbu}I~P*ZEqCJg(Hyj$fx< ze-IjBlX`DzDe|~d$8_P>`kTNJhCHs+v7q?rwb|cJP5OR~*HYwhrBF@e%^OE(De|o2 z;cL!5Bla4#H?vuR{1j#Hy$6OU`-~hKri>oxQbrZ;Gde^WzSorwW#ouqBUgkeqrM7L zMh{E`!!vTk@M2uv6$l|H!%|_&h}tk^G}pEG@ftZ|MDhGEW#s)~%BUB@l+pc>zzS!N zEH;55yfnw-SCDwIkLNMHcbfdz)udu8#iE6{5K-BW_mWH+lHWml4V%5z31Z%IGb_$m1fEgFv|kY<}Dq zS{{aQkE8fWRb`h>@D(IjLKyY$udL8|!$01MTB;Lvm0NxYN)i6^DL1*u?E(!BNaI(K zVC_M3-;+aid(HoT2Pw`bGxsXw!Go|l8ZLgAe*}s#O3y#F6r<;RBb4VOl#f7p)Qu2Oq;TD&w5C^~hFA<&(;fEts+162*8TTX@I* z>E*3_silxwAJmf}r9$|S#_=iNfI|NiC78oc0kt48l281;>3nN@A9>^sYG0S|z!kL` zC^U)^jQgpe79{55$q*K8d)wq_+)oppPZNIJPqlHsN+X|&Sh#UNU8GFhcNtK%t1tB! zq!{=zK?f7q76@K_0v5I-;5%kB|L9Js~f^b z^L>l_R*|8EwR$!j3KH}fLGtz=KHy7VYO|e`)Y(?6vowYDb;R*#P?*aVPf)ApfLf4X ze}$ayzV`X`KJuMfN_gOk7DOW}N>Hok!nGhV4Nrz}%d?-Xi^ly2!gCMez5#4B=i0dM zG1ySTaX$|Ze%ue*w)uO$)WKTnJRA4RKw(T3B^cB51t%C&ALn^3B|H+40XxgfQx~}@PbXs94>p<$Y)or3@&yPp%1&Ty&xPPCNbD;7sMX*8 z@~;Y+gyXdoc~qKiF+?*8C5Xd1tsr44&}&EC@rjYaegiE<9@qDaMe0aAY0f+0tS5Y_ z%d`}EluUi^LzCw5g0@fg3Zf)B!!@^u1LB0~yg2XO> zWjANmy+H7GQS5=@<2K`lrO!83v1 z@@)=A1sRU%FNCKLVrq1FtBq-686075^}?xh8>ro-&h5hUX&`lOv&dJL6W8-@iy+?t zYC&RaJQ?O$!yf%K8slwvdBZn5f}G(Mv#9EYIkA2TX*C_KHu09A{5z}hM&7)m&AJOqb=L?@mI zk~g&NvSXsizZ0G$@-u5vnujcMqegzn53{aq9tNLZ+YJ4B_s@N)^R(2%kWza1y`~Ty z9>Kg5q4Yu1w?15yRIo;R1XQ<1^8MN$Qmm1L2XD-JgF>Sy!5V2fs0E1&@uUu4tE-$5 z)yAX3GdrM->EETJoiIC17M?h#v<3& z8cNcHS(l6F;NX@EU#eM4J%{k9&|VG-^Sq)2bHX15Czum_oaK;WP7ofvJ?|5ZtSG^p z@H||*tF`_lJO?94Mu*Sam~JUq;khyp=9et;qf_As^HK!)Wl*~d^IwGL3v{B4HeR;KXHFxohbw(-x+{YB3f={Y z>+xILu zh`wL^UTSt$$m*)P8GrX5buJ-UU(uoyt46s-!~f5 zkA$axK!+dNnC{#FN0<*II{X;ag2d0DoU344cGn{pMUg)do?AEPj%;NIpIMl&?Dg zVsV1~pU*&5vov%c_R;PyC_VGPn-=k@_Ol`%24+G34yymH?VN`%zs#3vI7);(@~~ui z-nNTTZ{V%M6U>L7gIbV4aHSO7G;78m{SBK^Zh)@|HZBE{U)8^82<%kTB2Zs}BM`jyR5e?3v9sZZH@3B+K0%CwW!{!&E= z>iK`cSCFW{lQq)Qg%|(D_v_?SR68gzBUv=01FZu>HqG%@6DR1p1DK0AaMbZ84EE9V>{_|LrI!CQxnz^ zscrEe!(8>(2h&kxerH8~#?yp(9gF<2MqVdDWSUc#%1a(@o5JyIcm1(-g(n%vhrO&{ zz0Od`y%OPA^cJae;9Q8`>?cn;8c*{zDCog^tQ;IXDa003OP`g`-s$Fd_rB~-Yom0Z28H7<#S^Rn1_<&{xRH}1aUZ$&1*&cl9>Kc>6dFYd)&Ls| z&L(h!CC?l+Pvt5|R3UFbv0^s1ai8@=L$Pt!JOf2)Yy3y#+;f$i3QusZa-c>2!G#KF zU?PmXnMfTEXNKqJi%ZZJhtq3w;hB%8sR1^#$PZkkkT(-#+CS42+TC2Yh2Ru{4vV+m zM<2|M`o$B*kn8X?wbvHbuN~M>!fcTU$6}C3?EyC;?>?jTm?-jA!ZSL6Jjfz{Pa_YC zAa5;FTWaKM&l-Mf6nPurnU1H?&(;?CB8|MYAOpsGUsGsz^|P(unEL60F&jM=^=muf z*&?KCf~9hM;R*KVlNNc-rAjiH2qW*{g!#|k zue>uF<{cwp-oYaO{KpD;hX^wBKtaN2)>MSk;Ig*+sJysJo=`ts)w zJc`U7E~h+=4n2@S-q_V5Z+@LZ-Zg?eRHQb5)DB?TwRnpYqR6`o4@VRD6EoBz?|Z$W zBu%c)_LoWuqlsaAgObFLJiYP8i8wd%KtdEGT=6K?vzh?{0>!P`;=3DN&Fyk$**yhvZVyu0-jD$keCiPmgPO?eSEDS(@&5C zX@o~?H{7Rs-HH-y3yKBjJv=u9=ffp`x*@7np7vLecp6!pZ3a!T)#{-S7)n^H!$k^R z9GMrqddYsrC@E@nG^hvRM;;lY4I7F7N*&5@{5Ql>VDWzPATM>Hl+pax4=FwSlvxj} zUbj!V^$`^UpR)d=L<{1~K@IjjO9|?Egv4SZ+?e`_ZO-cD$NkR7L4pw;v914mrDsJ6 z>UpH#u)o3f;>W*SnWN_4OL#^G%Ed@u&rga6-pGX2vm$t-MC#ODJW(7i;}JJCL{pF} zdkYfWhi6i7lto_hlmZ&%BkOX(HprhhPQUfy9lq2a&nT(UkV1fARz4>$d7!-r%<1hT zIQ`+mnm`$28~sQ1KY0{wnx>EroIo#kjNlAZ0^YUf{%^C9K`%y2kw@XY01C^q3Slrj z`wC95ALYmEoEKDX5gzer+@F<)iW0=xPjDD7YT)BLmhWQx#=oy9De}15;Q5hi_M73n z{lOpq#+TY!OOXdsfm4hQ5UK4T0gJaz!Dl0Usl&7sc~snw(-elm^}R%J*h7o@ey)}x zkL!C%q_%|=EZ+O0x1DW#!WRfFMIP6$Qjs!#{q?Gq6~5H_T8ccbUu9Mb7VqO3_e}St zhW-yoFyv7&9jhs%0w=H{s9bP%5;|5a_J4o5k_q-DDum|?@R(j)xh)qNja;5c5;>3$ zD@Cd=q*Ts_MYj$3MhhtvMUOm2s;G?|V?~O&SB0E3V|zjSMIKjboJcW`!Q#EK-Z^Lc zQlDrk^0-n}BDEnT{16(y`o0P>40&9sYLPPORrTxF-|+p~=~WT($m2?lccc#6!-r{hI%(2zlgjr6!6LOSOrOZ|l@jg6JQcID?m6|M4%uTRpW5W9TR~3OgiuQ)4cwSOd3SQGf zpfn~XAS)SZMGxliTHq8U4u=E%yW;sP?^E2t96m*Ok^nJ%vRa$Nchr8>CXDaLXbSy8 zyaGE!rV36G=*-<5)%rM>XsM}*q|R@>UI&vlMnCG`X@Zlx?974`(aED?-Rj^F;T%wy z{>ralZOn0vJ0I?c@DoV&ft2tN#+!}2O`|BPbgObYLvV7J(|ffPc~l5r&=fxfKMznE z6AfLa;7sw0eN|YzKTNLtP~iqsaF+0V3U~JOXlB|J-0V$5N$T*7(iGBl3Mv+Fw&0jn zZ&2!46m-TR=oe2fD@Z&9YJrt9HRDo^JUe0hy21KIN-$?0Bsgde1?Q)?*S{6@>wCh} z3s0se%|SL^cWUH=5@F) z(wEv@OU+3nb!ZRM6k@5|dkQGjzTyd%rg}j(+TdK1k9-@XSek@~VBV`5Sy6&Hp+Rss z;AieV;;D|>XnJLY=Q5~tU4p?h*tqxmo1xgaD}pyyqz2(XSiB`WANNrdd7khDN1Agj z^7$(i(A-2AnKMWQiT&WrR6f06DTXTHlF}$VygAu~dA>#d^E(Q8egye&k)rNsa?fup z5FV~EGsuTq_C{CE%I`W+#Eq}b&&sl^|1#;k&h6biU4w}MIMF}r)f=uwb3S0 zNw~q{z4fb~VZa_v!FJ(E1(4e;@+F@@45lp+M$S6Or(OLLVi!j45T4+Sbk-uT{7ito zYy|m8k-8YpoJ-p9%2QEcgpn5sPbZW4iiA1PUp-2sZq|wZ)6WN)pT|_u*I^BRs_c%^z)J zG4LM>`RGJ4gnVodkdKQXA8V1v|5G6!8$mu^q;`TcLz;V}aDwnGhdY8T=6H+T`IVuB z!`#_}FrO$q!PTmr7Wrz8+?fa?pVR~7CBicw6Bj1TCt2jJ`C$;|q(m6`WRcolT(P(9 z^q-@F2&dpF!m|QArY1SrB0sBywaEp@j#o_`+MLkQF7U`SS(G)R5cXxY6>cel8H6pytoF`l;VQA)lYH`Vk*J?}sAw zISS5VP(B{qaBmd(Lg8WaVKo0ki+m=F9n23C7FlclB9UU;S>DI>UvQd|;(D85pd|4l zkJ9`fHdK1PC}A|eOFxCID8X`Zu^^)&5VK9?Etg@gd5YEJ9hneowc#b3Bm(c^j9}g$chq7ol68~E_fK1-P+GMC91gzj~QPK5#RId|4ule7Q&!)_>N?EV2v0D~S6k#^ z+bHC#Bgof^6niEcd&sL(O1F<{<0rzCL@D4L8O^m8`RMK7C=}|M=7H@KGJ8j4mBTkJ zN?^S$rKFw@%#&Ov$XmgU`S6zWf3bm&Ja4ci-w9Q3*`b=OEGbrYmiZQQbV!g~yS43E<4c4HE9q5_c> z&y)Klq-|DG!P@wz;@4r2XMW!M^P|u8{W_r}f%~1YH=R6qBP^IO=Ge%m{H;QT$ERF8 zE+OYsC`wRcH;Z4?7R?P`JcUj=b4GCH*jp`fqei|pf_$4u znf5Dp5C3-I3D%IeS>*jE!V%`S2=W~wm4O@c&-lhGP(H(YzEgN6A~E17<_?Rzutp)@ zk+9m(Idhpv?FfD%bC;+u_0VJ`wG2`!x9mPuwO@)7%yqvMoM7+E$2oVpk`f;Hg0+$} z6|$lPbJSgea{_pn^Uu2fdfgig=BQr@PZL^mQ%BupV|w6$3i+-?IHtcADW*Gf%kb+4 zf1{+>QiI?n@gt8aapxYS!u;!miTjJ3mJ=RB*#XmO+gnOd8+U`%Jt@KuVFuG_EOEj^ zK<~!1LROTZHtrD|rVcs!^*`vuXuAJKc=kgAnNo0%)yDgWQ4Txr5>^}XKfcC@R53Eq zE}*Rc=;wclBHt%GyuzDv95nY@;LTNUz?iLf@F7O4_&L(sc#N$*>t z$bS%?V4L!^MP8RvZZJQ-o+fWRW07CXD&%JpVdUpT ziv2Ni{OX1!S4NTlC_KSA#^)?@ZHGdBE`t2LNU_c!NAB6nKM79?>M~(|-Xbqsq>!JF zAip3|+i2uRQ*-Z#hWSO|3C_5_V3D^vS|Ps>L4HZ3sx|UWzpZ#Biu`Bc;T)q0^Gg=_ zoMRR8OA%zIi#q9uE$kT=ZnJ9?`7gqA0g%nu^JR;?`SA+*Wgl6$-LHrgs#j^d`HjPu zI$BG;0x9N6jDA32o>r7#YxO^Z6KuPEoI_7g?V#`o&Xb_fC`z!kdR1`Po-l_F`{^Oq zM`QY$@No64(c!B$rX`&U`PD=+RFAzbQYJ^`Uc>o@@G!Eb9(&y)e|@4tem#Qxrbtae zc$qr8?r`Hv(J=p2c+N$n4Dy>6`JX2#JLu#V0E%^0;lm zTO!5LI(d7Ya>H@a@T?G?t?@KEe9MOCI*t5RA{jz{TcpY~@&~8c@-DR(v0JS{~YNCnn?ePN|w z@&0z`p#6Qnexjww4MQX6|>#?(Il~k}4{6lzp;c0TzmsW@OY2+^xNg@Zz`#(jB zaaZ*%EP5=#Q-&{8;0V%iyS07GDX@K%vu>#-zb!=fDw$Jg(ILiWJj}9PX;2 zJ+u^gT&b@`imih2!M9atDe|~d--wh+FLzzjL0XDD3Ujfhs5}O*ybA-A#zYlLf$uxr zX>PYX;(K8A8kq|c>;q70mz!trtZcy)Nef$-c99+S%JSmbv!@;VXZULs|3UBO+i92pJsy2A4`kWEN?S>*N3g*st+MUZ*> zTtR}p26Ak(<(IRg$m@>v?W ze*}4Bkutre5uY8tV>Ha02v0VEys<_8SR-#7K^`blW1wePyr*|=xiX5psqhp9kOx}i z<1bd)7#Km`Or(sS%fC5c&nWWd!t(`uHhSL7BL7SyZx%t`LZnQX8*Y4cpD6N{!gFvS z%v)IG_cZbr5#&K4W%S&z@%KN9B5x%;Uj@QE$RgMLNNHnG1bJ(b+6_`Pm)*S12T|m0 zglA+R%v)RJtVZ5Cg1oIr6)IrwoW2+SCW^dWB+T1dBgjdMTzHAnMiR(+KfXrZL8MsM!QyTFN$(#-k#`gxbUSR`*uf%KYvdh#Wbn}x ziIn;N-Ztv?m!rr#3D0tH7l;g{O#VAcBNqYLw3Ui!ut;H2R>G`kXz;|`1S$69$YZ2b zA7E#Z%H0QeN&7_}NCkRCLqv*`nbhE(e;9GF@9PGaDy@>o^^4~>79>p1!ClRJfR-YU zE48agG5!h{7H}xDP)m`=mD)|DOwYkxZ+w}SA`hejE&foEGIhcwm#p`;@+;Wl^FCFa z?}q@GG#P4B=Q)i$RHaVf?z25aifP~*ki_)4OvQ{m2v0z2Pm%KDO?D%-zm_5oq{^pG zFPdFGgB+Y|Rd+xb$vtfdf2yT~$B`Nqk=nyb-KV95$NA>J_PKf<$Lgy--G&;AjfrU=gg!V}bUON6IHc!F_1BEpjro?x1`M|esjJRK39 zvIx(j2v2#0XK{q5LU@8{aZH4#Qg~8<^g1rWGd99=K!j(U@Ei*qQ=V1%3g-E$NO)2a zoND0->aZ-rGhTR_0)DAd8T4y{@C4&k5y6=#Ji&Ay8{w%Do}dn^B0Q5KevOatOpf?9 zF~U6O5pHtVKNmZrVvkj@#@TxL6XBW5T zbzIoeoXOU;EzT$0+_5mz)>xmxi)cy8lSnT8&K!t1$BEpe?EJnoFr} z7#o{&@l0;bG%svvFcE3#$Qj!Zm##^}nJvuK+S&sjvuz#CIm=84Ej_8FzAe);pTXOf zX>F>j&skfAfaf$e>&m^G_{_=7%N3t#naqNQ#x|W3>O0!HXUa6^%+@Yax<*p0G}|<> zabaV&9o2a0^ohE`O4rn}a>(ZxlC0K})u{3#lCEP&a=extpG(qp3`tJVk`r=Cx{e{q zw82g1^fl}pmNwYwoIa-==k|2#+~(T0%#l?sEelfRlUim}m$tWO+OqP$sJpm!RB2UJ zZD~bqX;tc=Qm85mKvroY`)Nr?LMrA#f2Q3H=KsQ%WxVd7qqrCAMCj9!)aJt$Z>hX zX=;KlLTOlBz^Xie%-gDR=>pPcazR1Q18b_5E73t629u(s6jcLC`$xuBrufi)FQ z7odj4g&dy;u(s6jcLC`$xuBrufi-nk7odj4g`AKFu(s6jcLC`$xuBrufwfh17pRuU z1x@FRdu^$e=mIss<>JyIUub)v1KVu4sOfwffOkDW4RE=*bjTChn(hm#VR12Q@&MMB z8vZWzYM5M52hRFqma30th!G<;v=4kU>TWV_QE(2hg z!U4!vnb(%~5ZGr6L&GIc>}pGARL^K$(A=`9Ih6{;E>HI(7kk*V0AOBEbK!KUv|IvV zj~$-8UeBnmXl!q-%hu2DX@n#EVUL55dHrSRB1qlFIU*7E+l9^J`*h^t@&kJk-w>zk zn{mwJOKquP=t)Kj@wz_wQ1mOE?r2`r*xWD|Bf+Ljwn*L1TQqD$UYFr{U54d#DbDAz zPd>>eKC64p%XO z(kS-E=6R`cGfIl;=hwBRvu$-8c8*i?q%%v3WKOj%+tLQw@RTA?DXXk48#ntPuVflV zwNo=kbY$AIsjBJIYiG1#2B{&1Ih1)#ne-ft-50dt|J1Zn43EkHw;H~R{KC4{)at>^ z#Ow`X+k{!z)kK0m90dWjwGNX4MMdSS8C8Z+shT<;nJO->EuA@HWJ-pkCLv2ku9iBd zlvb9O&MY35LQXBNe(+~t%CJ4%keSml zFO8{9l`=X2zW?d=3}&(#vy0R9m>FrzAOM;9^Xr-$nlf#=eg-LBe$-K8+mM=7%7t}S zWPx;af5LrkRuUd+$bFVG&PMoKmri^-LlnYQ-EmS&YhQmF$`Zy(`4fEyN^svZQ!0lSY>2@!T=uPR!v@M=l*VK`jl^TY&!wm=LjPlW^H69Ha zHc)=DtnFyHiTf|`EtqZAx_2cN9Sd8hEnYaMrKx>-%k<2`R%VGcmhI4wtF0(gvxG7k z7-<)CWz7HoFcn2RRNnzjp+qr51k?%TPHX9CtIteqY|hL=&6R13wkK%kP=|z50?n#l z1=lyVwBviRAk?6P@vU%KU*l_P05830ZVSG!u)M1-7(#9G7Mnp;z8$C9y6k)w?UIsV zJ@q`r{ue)Me2d_&ZWnCUNS2SWEo}?&nUH-H1fit(+l1JuyZ--kdZ>E)P6WuQ0lxzw zQYjoLc9B{PMU1&IJf!QXV6N&$a#i1B}GSO>NymzaK@b#dZ=i* zt8;ZLzLmJ`y^62?9Dw%97WiP!`If;8j2TujYHDopErlg7^-PU9t2E@qo=Qh5r*9z} zDPTSK)>b1%Ki|gNl9JLM`czt4!F*Oyk}glBhm}uA)lMEazGCu(QZ7*dNO`q>m-C(G zqn3{rKHB*x*-M^96*c~U;?T(dkLDwzI4st9{l8!`M;jDnEh^UxrKOxo{sfAJK%lY;vlmvbMHr@?;Zaft3Ju5IXDQ3vsUhe;ciJd^Gbhj}H@A6*v&^ z{a$IOYFw(ata?&uZPf(vN@6MK4HPUH;XjYGNcFS{lXxyZmS|;(+k7%e7?hjnKwO%v zi})lDrR^?!79^3BM~kn)^0sWnoOx3-tu1ZYStd?n$EC_^CRS8Unmoy<&q?uVHu%1p zB({EtRpccXXq}Z$q!cobdW(}-B}>eqqpx|fiGyf95X;GA>?#RO+)C0FGAXi9t;tjs z>4BxQG3QVm$lVn+sfktN%B#xDRPOF3ktEm>90`L2TmF^A@q^uJRiqMUb#q=Y$4yRE z)z*|%msOTa>L~q=5bX}5S)l(_RC)%t&P4+>M=tD2pLr7&zBE|b~O z5f19ASgot{CCOK7QS?JuoL|>Oel3cAPmC42Mid+U9vdrmjVLz9%ri$MaUHw5b!>Q^ zCsyhj=?^%w7_m;*h)&%(!dR(mK&dk8m7d;~$#BU^dOGS;v(#sm`^7Td_;0tGrl`2o zEUmHgrTHfMVufM(QEr9hn%j)kl~-LkrgLL$b)_x04ZsX`tgig(QnmX``8JfsWOsMp zhq!W}WEhuA$imK8xmdlCucD)-*220@`vpy9bh8S2ZF-ig%3kB^Rc*YSj`6=hgMp7- zYb#QipssIeZqH%~Wn6NCE0l9}5o7_dULiCrR-5i~It#mVsZFZpk#Pn~b*Cv=yFQ## z^TlQ%n&~A-6BrM3at(82u|&G8u>q^VXRL*0t*W+c29l#xo_ezgw|JM$(7OTHnEvbi zSEVYhg?d;Ebyc=nv3V#iTlvdYweB0F7d2+*<5Vgfo-|_)%3B+H=h)a#*JOJSX>8zA zMPv<^#Nqh#Up8Ze6hk~`rfrxcIB1mZ%txSL7KhjZJZ39T$;doBY9o=<#cCaNxL4aV z!N97sVLY;H0ct5544I_iiXN^L2s`4G4jE#b-6|zL5318q?O8Y@E3A4bR+27lXlc!+ z@@NsOPG+XdTbi?VSkB%ic}MM+$zXJnYf0Z~!G(tds|6OC-&kENXY{{%U?u6vZ8)f^ zIgRaS`SdQ$gDhjKD919k$<-6eO4XXMYA#io&POF5Q~AJzw5CnAG_`(5Rw{|eG|Qu0 zWciKHE;uOldKr%IK?P}8{#2&kfdxI)<*CVKWo4xkCyxF1S6YMOl z9#Xb#@f@7ixnv?(b{I9^Rg1 zgR;tMHb&{`jSW17w)>1zU0ONY?<6;5^sWthmumyZY#iODHi}56+H{k^nqp$)=!B|f zuuObW6A3;0%U ze@^;_$LDeK;#{x)sN{9$RO0mg&r07CeE@shqmTCJFbVNfsn_2I!4pJY&*X&pJ+#iDCl;Ro?)!Xh#?*3P$R8jPp(YRD~x3cH|sZbsg&(ZhJ-wEC{5RrGx1IIX^`X_aFqe%!bCj`l60r-;Yp>bqL5ava1Em#gn+ zx$-{)+g&+vT75^;D#vjVaaw&x(+bBotJCl*Yf?2;lP6559b1LTrP5M4Y^;v9R$2Cl zkNx_DKsjtIaB`TOGbRV_$;n~jEQgkbdE|fJS-^!R2a<_M&Lh_ZR(z4O=>(x2CbZrzf-GtF@|&CvBRwit)0C9N)$5^32fwfmmr>e7aFeE6On>i`CY>+H#DJVzqUz zw$M>|vC6ttS*ZUSYpf?4bGnkT%DPvXI_4;}c)!bS0BdDAZ**sYY=-dnSgbu?&8DIf zY#?0|7g$PEaGU39UCucyRV;gz)Mk#NlA4}fCW=+j;ythUTaBJ)vG`t6Qejsw#mjDU zugfgMeV=PMYpQi(C8I+NpW+nAmjaU2?SVDw=9F=%@slQwEt@pX-lHMYivC>Zk(>{e zDNMP6!JnQ~Q<&l+Q<`##LkGEKN>yerWwumJj~11y`AWFk8O^a1CZ}pAR#%lzoKPWC znlb|_{OWd&5i%t!Pr1WoI{z2n1YXUM25%*iFiMyNN**epV(kt(G#M;@ij4RvxQ%}3 zC#NQtW5a%Fb?#edrZKQ0ErOy8iI%T370bQIsI{|(?jWfqr1+RK{cId6Ca22BR#w)I z8#jJcX2T_Rk_x_pgyzq52a>?gRP_v=@QB7`=3TTR!onx_miU)`PynG$*DS_{txPH| z^SS}+`kOPZ%8vKDWwDezpPELu^qq}+XaxFQ4yQBj`|bwRKZ?}f7!Y^ta(3)+&y*TTsg33s4#tC#y!E}+ z6l!ME6Hb?P^!SW}^rXP41>Kx+ppQ7~H<~HI$gdQHh04e&Y z4)0JWBz&9M3g;frZVyf9(J2Pi?ahr0e*8ry#}^r#W55K9Pb27}cZOLx7K4eIx$#CY z_G0s7qc|5ywVtn!FNc1N7^yQ;ZCzWYInGXTc4|+JQynLqCgV?^k3$*L9 zao+qmH^sSW&E%$<#k@cx?lI+U>el!tgt+bOrtM@8Y))ogBhL?vJMuYtV7ZSk&`0gX z8q1|IeY#-0f;CSU!^~2Y*iWYMELi?Ie9;zW!Q{yKH9L_nV}{7R+i|{)^KDW6{JJ)C zi{+{fB-V1i&2_PPoO9!x`)`nQ0c1Y7k$NxHhZFvs9QJI=aT z_WEtNC&~4-Yw|b?v}6Ybj(5Nb>CW*E71)#!Tn(vr5vdYx>$&;#TD<_RhEv#!T8P=Y`X)_fy z)A5*GvRAgHrDU(BmS#D|C?#FQ`E|_=O_{c$xPj?3n)y+a059-JGUOT;X=J*(I)Uze5#n`SjAf9hvg!=zL5q&e_jNjm9A@ z(e4jVS(U?S(CHdElAV|TWA97A+bXWMue0GSBz6*Z2qGB5X2%;@Oo$~*vaLk66-&+n zh8tOuZ4uitlI$c9Acd5r0SaX;Wi6D3r8H%yKpQA)fsZbf0)-Dsp)7@#wX|&c-*e`! zT5s&ozu)udK2dz{%zMtvoH=u5pUFy3p7WFI2P1NHpgU%_&ugG|iy_Qd4-VlnG_6FC zsjk^VOvTyhj#8a_WL+pSn2g2-M6-=~r??q8S5<3iNkM@xB$481Bqi^xf*NUK6eqxP z({O$|XObhyy*9g7O}ZDQLT<0l=23-1A}bwsx5I7$kt%w@yQVL*dvz9fJ;)T{D(o`4 zR%dc;N{@4g17{1aq|=a)Y3DKSRO=v2S7ZF^9nRQc_MXc#(1 zI7M)j9V4~ilT7EQ#a5JWrE`>$Xi5nuI?}6kTfUhDr?fG@u|Q12$=^^YqLim#rM9ojsQ-+1&0xkz@j6*~*~rT4_l+B{D5-rpkoCbhjeanPpV7 zq-J9Z+M*tc6ymU|!o5FgCnCez5>Meo+PudLL9J6vg5|y&jnv`5wD$g3qA+WeZPtj6 zqA$#U5yY|0WXZUn zwv&=j^&d!r=g7bM3@lx@^KP0tGQ$|*0=3@#jmo})0TM$2AM zr97(SYv5wZ?cu_;GkJQinp$!H!Bvo#C3&Go+OU(`dCKKze92ei(iVHOtJ&rDG%dww zqr+k8F0B8SYqs1TdtUYpDRJc&-y_A}xv!`aXud6r z@1!!Y;0wBRYJTgc08`wUm~XWT(%g}|p!k*)-+`eRzK4U&MPor~BamA5sZnJ}nul>3 zqG2o~-^oUXt$nkvp#z(VVZpR5#mZ!q7(ntQu@@j2i_2@HSm=kTj)=XZ3$ckuLNt3E z?32~|YUE_FM@%N~nbOXp4=}f>cK@)lBWsf?RikT-CvwDva6qe69wc)6u$vqvZNXcF;VMK9WIn9zP!< zK0Jud6Ae5JuMeaPw(*oLwgqh%y*8vY?Fu5@DIzts>IyR52{Nq@^+ke(QL`-TlQ9cH z3nL$^;&zu9%(BjGSzGadz4?1*d8?utsjVm3l&>7lSDi83p)~W z3`27RNydh@^^t)vPMs+zRJIlXFKI$csi06SiELsbg({MdwgjMQk zvho|)8BB-br|-Eaw9^Xhv}8OOO(rlbA$pHHdh^6Lth8KX7Y1wd&a)LNYm1fjH?6OQ zkzgxBoCS6LFHzURFf*oYEagQ(Wi5&6Khcae9VJj`!xq}G|J`j^biB}lEew!bvL6LA zYe`K12{X$J8VaNDxfeJV^!2|(U(0H=@vXwpe!j8Bg3|tXC@qfRs>T&9bg7bhON)AC zOC>FL)lcIe#HBHX)A-fBL9D;xEOQ(iw=*sj_|KijU*D*neOEX`3bWc7R>LD>jYmXQ z7LJI_v&lj$4uvIfEQ)L$VlmYwtW9JUlq|2D zOt#E8AX?C|ys|6Qm)52{Ogd&d6QiJH1tr^Q*UM{-vce(y`8NltwhO21R$@zWbEb7& zg}VqWmrh-byoXO1Il3ygFOtMfv4u+=tab_vf=pRcP!Qq>v=M{Zrbb;s5qDe>Qzrxp ziZ~KQtgl~K7=W`h0N3D_Tls!+s4AVEcFp9a*!X#Smz3XzT zShpf(Nekl2zCW!B_n1LiRAam2bX8g5ny8G^vV}tv^Hvc`!>=W{uAoGj=k}Lku}k56 zvK+hlwS}E*kXoX2FJR#Y43xaGN{4CrPeGIN^sLO9)D|D?4Gze(j;x?ind`R(_e!ig z!k~J=MCDoEK(JJX82O5rES9VfQqni40dbRb9wET@DIi%b>DeC{h4O~!3 z*%=#12BQO!xQtRBk%L3)WR{y8=^sq4{||`KP-jwS^PA5%HbC`Ax+~H()FbyL<-vF) zytA@T)ORDbnb6xBb$!q(hupf8bgB~d?1;-|rM=46(8N6tFrDz;F z9Qq9CFn#iDe4pmQmuHH5Gx>teLGnqtx07e_*_WqJ>&sj%grXm2^*O7!%Ol5w13eM5 zj<`f?R{X!pf!4jN5~E+n;_tFo@5OHmkVQGONEiYBUs2MVgH(VWUcNi%mDNPP`-L^P=8r+Ch5pljQs{evrtvy>PGC7Kjp#tD;LP1zL zgr&A+X#fI!C7Ng`SY+0qZ1Xbg$u_x0Sun#|R*+gwsnO5}rWmw}Ol~U7G31|P(5j-U zg0%8WOVqGsvM(8@%QI;h3IEh_je0aR{h?qV?)|}{HCbKnFDHXN7?*OOA*y!Y)oOMW z!(6$75@Q5%2akMN8uH3H-c^atM)q`d$n7*%C#&OaDajUb(TC%V18^j`l)*M7>YgOV zsTBzu#EVhEaI9YrhC-1Joyy=M4W*M7sA1rh z^I1to&S+SXTi$>=kjo(~lkCCRW?ByLK!0-mU_?tOU}J58`cWCZF`(;@r%A~ey&niWA|6{-^KC!LAMhI)EqLrGE$Sj%|qgb3P&6q?MT zmFZ*l@v@9=b8BjC#;2;fW`50rBaf`DF}m7pRh5!c1iX`dQebq1J@1zo`B21G>Wq!@)bV&-$!tYw)av=WL zrILn?s$QmMvxpnCh)Y_;t+R;RU=g>`B5spK+}Rd!=UT*FU=eq*Mcm~UaaUTzU273{gGJmH zi?~}Y;c+{+emuUW*sVG;MX zMcjK9aUWQ~6{Ft&Bn@XzYabBqON+R1*8^;L>?N7`P057oN+b-V+|Dt6)BDB}v~yB$ z)c#3*HkOp6wTH$4G&3#S%3aK!Ii3pnC; zz6Bid`|{OB2vALG{10Gkf1h5PZq zd{4oR#W#<`B^Zb=@lgD>Dj3yG8dE8WaMy=aw_WjaX9~_%g7~G36MhNYL%==wV?jyr zvzK6;kkg^_n+ErP0Q0qiBY9@x_a5A*ZvhTJdQAL;6aT*l{;#}AlA7?NhuYJb_&ovl zWx(upGod7jV6@$&=IlZs0j?>rK?lY!Z);3$6J zr?l^NekE}KIWWIAPGX3n6jMP9~_8w zW1~?xG8h>MM+QRc>t@rm{?T*RMh9xD=hy}?t9taDmS`v*OT@a970aCqD=S}h{YZ8P%l<(gpxyXa9Out9{h&7`l6ww zk@bPtng|H1xMS7Z@}wmsGHrN7!D1_lVLdjcSbgf z^YMqmk-GYN^}0g)G3F!;4MoEhebKIzlx1;l@h^vHT`Ax;udCJ3;`YzBQ8s^w-|r_- z))tjgmOAS?6Y)@I|3IWan&`y7w60h%9*cf}*YHG{!$ zXS}9rL1))cv@hJrdes^0qM7nUXLtz9o3TtIQ2`gJPFhr2WRs*_q-h9e;<_U3uci~W zL)s6uwP7W6fAl2m?zTB&{e#iINL;F!aCE5@S{oi|^rTQ9k^17Xo_Mg|h9xhNM5i9? z@@Qfx*k|)6hr-dA4GP$~+}YXSY3&U4Rk&BWrBHuZDsK#rR5rsQX!>Bd%T^w;l@G-F zVm&ci`7!;~m6iAts#}Y-F>yIrj*qCVyu}r^l{dB9%H7Qg`VS;4YHa0eYihAdK>S^> z&{pp1X!SVTTyDIr@U+%c~*v^xf?xRx9som`P$k8!nvu#Bclk24`*AuTmK3) zx4RuK9qtL$buLSG)>a%@QCW@{F08Dstm#xV6F$yZJYp-)hiV!^N^*kWJyLN(KSxK6 zY>i?)(I}aSVjye9AQbEGj}45H=}uvy8O>2fCN+gdzO$hx){7JNsM`FlrK%pyM#OUJ znIn{p4o8-aCX0*)sXsOvjWKe{uGjr*5`&Qtj9#QWIMj!jH^xS);Kl$|TMCKI20!Z} zhXupRxRyp|r>E8F?QpqC=sV29A}#VZ(YYdug^z0!ox}4gsth?D@Y%{&N+`7S>rBRC zeThyq2^gx?5Qe%U6p~;oM{4OiRbz`f=2QI2@KYZerlF={vEpzSmP8$d#ty1Kt_QpE zcVB5d*MoSayF#!qFpLVQOkUfMa|xu`Mql%-HUfd`Zt`O)mGCMNpTngRH9WXt*avP0 z;cpxMelm}p@L!P#eqU*N2_-;%r~(&H3I0ry>Pok6-@bi!yib!Rmr^p5_yyxVA$FL8 zkF#d7!?08e#Ct$*I$V<0#%V#UG*wzyss_0iIMTNrH1s?G7<~_jPw9p|#rJi}ca`$3 zwA3Y){uheBO8>g@t@`s=58Tx6Nk}(6Dn6=w6aO*DsgK}yHY3D;B(K#N2bzjcYVOi= z7)J3)hKTY;{Ak#1qX&P>@z;;PkpIRm{H?-Y>akYi@8kGegTE9%$YA3a_&XneXMq0# z{H?&>qwseg{-T+_k@Dwg{QVHPB@-#nb}9Y#0g|+qgWBY^o9FbU2&2)~0rujy+hxPBUT~+)bWV|EgAJo6p_u2zc6Bq2hvPi4o^U zBuuCS6;!Da#oRi4-ZqEJ-Dxdg(TEq_cS71ZY5Y% zo_iU6Dd~t4h1%?Bb$Q+G(sYFPi`g^^>0jlSxpf5<5>ejUNb78C4Y*qaE|1^W=J!xu zI06CWrBtGD7{eS|98PJDLcgzx-V0ed9j(aFfTK0waRl6&9_?oYdOBK{wzjQk)pcW* z!f%!l=JK?=odME6X@A9kf1`i9V}&YRSSgVpn-PF)T)E2S4uA{glTE=KV8l3_PPZ@6 z?r3dt`?X+Z8xhX7wxu4lKp`3wK@rS>W1-84FAgvnkkgPyRro|VKDwO0@7=b8=evh9tK~|Ek zrAU=vr4i4?oph(Y&8u;&G9l6wi`w*L9i&5*7*reaoU87Y0iW05X>IZNTO0vsp{nmS zMyRi&!Rzri!**ykNiAQsMjR=%*RjfMkw~j%agBAGzUgp9} z3{?NIW`BRHr?HXz$yyTqIL#j=+|{-MYUmHNd!YGkt$vmrp~mYdcSD;KD(ma;wK!TG zP3{)b@4Xdn6Es`{?8tIYTf1KiX&228LM1WCElXw9Vrn53YbY{jUKkC?10A(C=TgM3 zRoYJpX`+VnyPX{n`l<%lEr~LbB0Nd+R?~yh5J2%-$yUbe)dHN7jwCIkz{n_aT|gXn z)o`dJ+FE5p>dA-@WU2;HlcmRdu7a7SVVVO0pWNYhx078mPtAKR$$M+aMz>5Uakn&}`lmJ!aTv=SFj|(*fpVQVAOboE7i?4jR)LwQQ5+|tL5dEG--!Ay zz>OoKMig~wzdJz1!H-6%2!1?M2HHFP0ZIVcMxv3!xeAkr+6I=MRgC0H3=v}!Lsy%# zgRGP=oKzK4x+XAV3~Ql=_BO)oHBsdy+LCerwzRDyAnl{DMErG@P3~6Uyli4AJVa6V z^t3LA3ZoV2<^)nmyKqPytz3QsZL*^QBT|woJj6q%7O#zHCL<52;1YeY5FT^~v218- z3$ShY3PoCyI^t1MIMls?RnXmb6g5&|@TVGtFhynzc2hOCk-6jyCcqdofXXy#JeUEG z2AOJxDB+-yD=a^8nQn$qZH3aiOQ~IpLUS9k(1l8c^qHJR!0hbtEw5#LA4Hl;;lBv! zhFUpgC)%xE=0r}=6{pzB9_{~tfk=Zb!0W?Wb$SATzgG_eHjlM>tncY<|vJc=@6df-cGXf*W5rA)nIr7Ly zc2#1->D^5Ucg%s5-sO&VHb5RHoY{X5{H16w2Ukh*pcC%z9ZF)*03A?@_dfWM6rK}e zZufFC0VW&KGz3BEB0tFnKSz7JV-;%* zIgQyUZDaye@zku}Uz$={L~-W_Cp#)9wa6`yMzANsJZs@e<^IpaKnkq#``pkOrT?t? zpeh$WT6>t{x&%K`SE5A?Ef6pcP3Vb|AtU$kn!Cff6sl%i zgDmD>IBhPs-znNMEk4vGo`3_R{0&Rk=4}UJiqeE zl3|>cmK9Zw&jJX8)27#)EsiDhg@F>1cU_Svn=83&wqh0nRXAIJ77sZWN$iX&k(;OY8iOIWpT6i$h~E zRdx12kJJ=QQykHbM^{)AVu|9cjTBKYk>XLRGEw?c)BzwumEUy5ALY)0yr*Km7^MR_ z=I_v|5p_tc$k>5KXOjk&(Ee`gKto%iLi`0tCrQgX-0iDmj~|5wEfz0YJZPh}uVU4v zA;d98HfS}rD#J1An9f+Ef4f_Z`cPLx9fKTa1n>}_+Nt9~J~g@%j4|z9& zcv0_y+o68$8c@uOjbJ5ph?oJX4qr?(A`M|1plUQH8KE82;N<}n7e+u=af6UTo@@kR zkmtpvSHsEc z)2IQQ23KnFQ1b_Qv>c7z;?iGZ=)>2J^9Y=1Xi`De%+^$euga9jsc%ZAfebqHdkhYZ z=*Y4|2@n)(El}9X;?iw^ARV-zfs81VT>%uC8BW(EfM|^0-`cYdn= zpK!$E!S$$^ic7&z>hQKfQAx@#h?IC-=wKl~DBho-(dR*(eGuOFMe8xZ2>HGLC3VXw24IE3??zD-_;i(XCVQ~&q^o^1n+ckgN)D@ zgOShUYVmux{fjvR)T1444t2T`s!Uo)N(^eKSDTMo%Q(cN1}(|r(y^EX^7@vyL2l*v z+#SJ}$%#yvP$pwFay;0uJ{d{KRr8qoZxFMu4b5gR2T6IVWoQ}Ly^Yq3%8gcI^hJ`9 zHeTN0r6V3=an4J(nl2}eXfvlJs*|gMhMbB^KSoHnau4#ram1l`bP&X*7}Xw$W?pgW zu4pOJ@sWLzC^DJO`NwHo99PmGKdMGKz#-5l7B4h%r92swPr$|L=n#5Og^LP`TE5x< zxD2wv0;Re-I@JVcJBPI@8|!m=n9-$BqC#`Hx7dXl|z zBpyd5kGZq)#w#BG}i%VaJMH2M1Busdrtx{ZiaH-!`F0thel~Bt9mR-8Iy$=j)D(fNHt@ zVGdcI;>>!=b)hz#qrbvLE&J*@N>W{nnTz7md(|9E@vN(hN4l^kK*`+w0DTOWM}*=u zbYKt%wy18T0!O4IvM)A}>W1=e2H6f?%oWDpFqO`1h2|(C zIsW%0hKzU{XrFV6Q8xSw+Ym#K7nW zYDNtV^~;b=MkYI@>>)sEcD=8PMQ$5PMw4vxyHxRqaJOG*Sk!D-woqL9sv14T_E}Tm z8c^P2*8ONq82s!)r{>HmHFA)~AkI@uDg~NMeOS$qAuJD$clX8CDm738JpZN=szrAZ zm%9x5b_CTADgQ0z3a(eJ9!Yn#LuoO3Rb2Xj>Lr_Mak_Vb)*T1?xRzR^Rz_H%iHbs0 zoz!r=KC^w!t%PI;em(+1lO4EaL<~%JfHL!VHDyM1*Q2j1Iok$k+U_7aS*?C$Pb|^3 z2yLXrk`3;|>F#J!`6H1v;b^CKiS`7n>u()(hMu=;uzkj_PfeK>TMsewxDTO1ogt8boaUDS4sTnK9FzjekC|#Ch%syB3 zJCiBUGlJff=8Gsf$O?+pG_}eV#TYgl%cB{Qr928}-5NW@k?e+MStr=;sat#fPOVX~ zg(5VpORkr~;C}EN zvIcY2QX1mMe`-{ye~?hgaqK0I=@gciMhTKy3nhW8ad>3lV=Xq>IvrTZS6q6WCdq8D zlt!l)M1RjxU7F*ZH?NVI)IT{^i$VvgJUWRI`Zz$hTah3*J82l|ST!H?I*VHFK{YO! z+CMuUAsWVtt0huK@145W+%q4imYM8lj&dcsj~XGZayQ3fF}Fo()vTnG6LCx@=P1VM z(B@KYpwdbahK7wFn_m*yU)0RaT2Q!cc#JC9tS~KeQ{%W0p}c9XRYemR?aN%I4|z&W z<~mLUbsz_03GQM2RZW)K0^}5l=8MKzvqQOqKp@od{aV$C^zIBdI$I1mA@@WwH#&EU z+8{zLh|mS*#-Nt0)Vh>Yox`w#9W@i5Rnuo~j`1MZ-!wny=o%P#Dk4Ja7`f?&)J02# zipY12q9-}%qR*6i-PagJdPi#>QKOF6c`8fQ>WYSFdPeXN(GlF6Bo6AB5qgf)zxZ0U zd0M-B1frr**XvOr){6R`i&vXkSk;ys0-!l#bj#J4%Pm9LAI?K&pE8;n3k>-{E&pPG zja$vr)aH?JgNTEnNRoSXRjFQVHu?v-b@;HES6y8+%st3@)m;u?kZCv);tbrV=BhUP zD@B#m89LY^ojWQiVUDv}0%YtUf|{w;`=%z8**fGk?0JJy+du0N;?LAl`b~#uY7=>QLgXR%HTbz{0;cQD#Vqn*^JJT=`LDu+Hkjr$4ZhtV*}Ur#Q*nHt-v zxk~`D3+-UGOGfqCab~K590Q)~)uJ-W2&OiRX|(qVl{b}H@Q(l)Lbsb{A#HFcM1u40U8WV@p1(qb`aq`ht>O|7dKDn16T?aUnD}qwq^FCf!)Q@35dxN zl{=GV#wfJX*aQ`j7qwI)e;h-}m=g=LFwfVA@re~`fAtwr0uuqFFbC|A*JDYH+ zJ$yn&LAs)eL7F{W%+q;)GGdl_pe&0#il~n`7;~kv`X$EKUpK~_BM9BKA->NBRblizX%CVL;V$y4?F}=%!@n{eg z6Y1Am8f(xs2G^wJ4^?g7(m<`T4v!;|h{Ti4vDg}JwEaX&ma(L8-{HcvNa-3y)%Cwr zzFamN99VbM(&p;$y60DN+k8m%cXGNhlO5@aVV;WG6||}ewv3iFVV$#B4n;QaMD)_z zXxY7^ooya16#!0MEkGu9C3xF86Yz%k5wgn24nZJcCc+jDr*6$7>IW%~-(| zsUXIrn6#J!;iRtQpfRVxapXln`nnQTZ6AgShk07M7x7UGB|D(aC5ctxm>Qn}e6f%Y zFPh}=cZDN(NYuGOvZ=!}34ud`v>pyy2(c|?1*hEsl&cL}ctlDm5kk()XCeqcLv@3i zhsqnR_k%AjIT7^-3;0yHVrenz5L#VaTsj#EAH-z`Sc=-;B?bjZK8ie6P$KDjHYeFd zJ2m*5sx`GvqY)fh3N2&7rppVHgtgg~m6cUkl~Y_=4S8TzUaT*87$_?FSohz+2|5?P zh@;cd%v^_%KGa<&VQ_>MjuuQ&ZOcoh+I+m-k+kWkyxKIMjr4^5K#$!fv`VJ|3qP?4 zX1S*w+ab!qq$G=HT^)KLG}Rm~r*WF{Au*@7yJdJPgT!Li6UrJ&D=p4N>l9y}0QkcO z46>wXtP88$y)23O3fR%%VfaN*5ZOubp)M6=ZRqp|!r(z5dtQmwa;Pp5Dy<*pl}Ub9X|$K9G=aMX5FSmnQSsg+Yno7mvka8l$9_PCKr2J>10^w zbOc~~bE5JuhFQQOCgmH#NEF?Rl;p(vS$9(ds)2=t>SM15OPwr^02JQnx|4IlUeqFW4jd&<{5!F7ClvM=Fkpn6y@OU|6@v0%Ok~>@R_x zYN>K^!fGKcuTR-S$^f!9yapu6+-NP9x)6(MO?15^pRw4eH9trBBt6Q!291WKpBHXg zJ~q%6C7ynnWibzG*;t;-Y98zBBQ2+dIz&>~V31OkkZzckS8;+)Wb+gtYemDxv?~Bo zRaW)0gr*|bn%n*DV(H%l0Ep94cw1N#_WjW0!0*zWQ_C`p0af9&M7ljP*oQ`O0!N}W zhvTi7T#iRWE*|Giu=VOAZXJ9kix$cuAbuv@Jwq@g)*F#}k3Vwa5c;&Z9bUBPSx}$D z^eg3j1q+H+-lGV*TRU1fy%i9Y*D0f%k$HX?4F>KuV1cV&ZpM)>NHM8Oy{al6=0abjWKOUrte4;SIof~ObaYE~rLdO>T3Y3l~IW$^eG z=PwA&SxgP0XJOeguC1gBVRF9WR<)2z^x33eU?0HkK5MxlM=79c38^&IOtgs7>*HoB z*;QJ2sja#s^Gh0J&RVM5?}Mwyjges5PUjCau}~pm${Jp%M%IE1J&a5^+T9I9L;4CT z3FS@MsKyz*g*Z|D;Ei^1PEo~;NTTlMkr6C7l|;2I2JUD$ALD1VSZ*OW`m=hcs#;%& zE-~Xq-eL}!%#UV!DD70>De_#}DY{|gIHIChe2yKpa;Q>(zH!SOV+_L~Ihe#uWfz7c z6LodiThSU5yCtai^I$r{7mqkp0@k93GhmQN9Yk|p%aGEPpv2Nmlokwp>R^f&ZL~-M zi@h2oX*S$t`827znp+QE#-(a1uk|!7Ys96&RL)2TI{esy7U0rJt2V`=O;QLl?vSU! zzAu2XH;Z;TFO3a=9*r0_=i||0lSQUOeW;$BXE81dSRI?ei$m*Z<`y8CsT35Y~np6&wtSvY7@KygY3345%`$!Nzj^hK?qdzKt@2 zYfI|J@rvDy8Oddn+F4GA*2p6Lr$&&W1w>hRJV#3{5o8L;LSw3WI2wx3s)rREvL*!1 z3F=1-2jxBt)^Jd7LLk^l)3#Ks2`3pffI_t;6b>tfRvnXRw*!&V@)jz`g5fhQ*xF74 zjapQFi5G9j*p70jZ`w+o=iJ?>9Y4u1x1rq+j#+QQVqqQ=b% zt#kPqm6hTn~lv=u)a*1Xxm83b76qbXxK#$h6I%tigGA0#!4J;5L3OZ1mLYy(M*=spNg~uh>F?sDSST$t7;?TSEz89rosqDT z9@@1*U3luhQ&b+LTtNE@2M)SeA!$p8_$r6@Ke+TLY1jI88S6~S!@pnv4ZCi{@hXZ$ zDHIy=(d;ofkm=z}RjrR#bLM#WCA)Trj>xOutgQkRlHjk!a$5O1ByC>kz(R6e;e zO8Q9^B?*8n?G$9Iv6^(SEA0+PIPP_Hb1H^4BkW3f&7o^eUCKeqZWJ6I{u>Kvkn#1? zNIh*y6ayzrO?&={THChI`a`mYT~Ir#)WP{uvEWXx+tJ$LlbhPx@ISUUI^EbCrLrVh z(KZn@dm6l4MN!Y1_LQq#Yf3A%R$xhK>!277q*Q4Gf`lL)V}+w$!l!D`sUtpANdK*R z8so)EKs#6{5wv}U;mYR`n^lR46!XLs+Zmg|nFUKK zEVl@gm1JF_&3UZq%KkhW`=*0Us8Is$IDN()P|hHtQ6pw6MiG=TV3IR65?~ui&Q#)Q z$0#>yXuGb`tf5#=glv>CRJ6;fC&p?+?OTq5um+?lG#biI7!aiZXh)c`9SrCFArbb; zw7V1=wTn*M_3}E;%@==v)n9hK^pVmhx8XVic0cv8;Xge2v!7pe^<(jSez4~Ot0ie8 zyWf9D^Tp3j zv)z7x?bUs*lBE0DJ@mI5PP$<1+UM(E-sS5VACJ32lD=T~6RtV_(5FwWKkB*1KHmK4 zTl?bBzWHN_|2aM1-`2h9ux0lJtV1wVWqO<;B}xp1GB8Sma#IsEX&Rl6_V?PFY7 z!S3fB`qk7AR^D*XJ15-o-0vQ0`y6s&_ajbx?w?!k3w}QB{?!w&f2TQ&bNt2<|LYEZ z;r0EVzxWcz|J+ge)lc8JNRm!u_p@K@dhmx&-1yzs=f&>%tf%^1oV?HO=Z|^6*m3*J z*Zz6im`yJ~GB+qmAF}&f@Bj7TuMT~+?TT#>}?&wh1P)s;tn?C+INK4~ACKwW|BUf& zOj-Sd-B*{ta{F=7^&kFe%9&rk`0P2q#ua1ZiT|ywB{O%q`CF^}4;}d99}Im~fe~?b zFC8j-Vf%eA9Cy?&Ub^ks%f|l>SHQ6Qy}MT~n6T=tEw^-^_lJF5_ueE)AG3Q+XT>4m zD}QtArC;3nz8kc0aIs))m)&x3u<@*PgkfcIAdQ zaDL)0#Q&Vfr<{M;tLMBjq57|nwBEYceQ2w&`zKRA^%hUR;b`ByZ{43kE9Now6tDGC#7hc@8_gSA$zVMRU z&s;1?|7Q1d>|bBCzqdTFcxB{;d-r=IE=kAW9LJKPV9&!JdCtG;UsL~iZTYDm?K4-B zzR&JQUH#<|kA}Mb(eTl?4}4+!uU?R(KeD^M?DqOYU%c+IS6BRdO>oS+hvJN-NyO*o ziaKe_C$?=QtU8Aw}6(T&AtK6g!U?aAKy z_In3kJqvPJ$?iAZv+p@~9@Mq;#)*6Hy?Vu#XAysP4^&kR*PpOkN#aaN zdY;|iTl3KIoxy{Ca{25%X7zt@EATULP-scfua@n7$63$6{?H>gopFEn^6#xfqlVo# zJlMbPwrh|3^7%`yo%PJGkN+*M;b8aU+Shz18oqSn{JEEeCsaPL0axO%`;r%C_G~)! zs=a^v;%Q&ZKKrSk;&9SkiT~Zd|L5jUXFUI{>w;%Zf8Ey&SuSDssqfu<=?@ZnZhJoX z^E*oFhHz--+3Y@Z#e>(B-S_M(+irXBqucJR{;?!I%IfB9bW zN0L;G!$3=lzQ6y4H=pv{Z(GiubCqxKUq3qtQy&v`_oI&rg=5 zAFz9ITVU~&$1a>z()`X3pZ-Vd4U+U%c5j^a)sp_1hh6n$!_Y%F{(eat?7%eQKfUgd zm%jB*tZ4O%;ky^_eZ?h`w4U929_T9WxaNQ>cDZ56FTU*QZh{`Ndvo#+t4j8JX7}F5 zukuVkGkz8hh(NVbQsmj^^(ANi{H>)ApIcV@y9MrNF+{V6 zs~?o4OWA!<-7o)q*w#}HyJ_g{%fENsy-!HeAK3kaQ{MdL*tXEwe_S>*Y}j9{;3m&Hvy^GIk&SVvn!apLyRYQzu^b?JI2WcqQq#>|QeU z_>VlnHS3du$F|i4Lmwc&P(_y%NteX-e(Qn9KPbDt;ZoPNSHNv0yI;K9_d0&oyW7EU z#D6}1kD)$4tB6rCpybv%fNT{(<#R z`LC9w17;Ba+jcu;?rVMjeDSIOZA+dq2a7(WUUt9x=|jK!!S&KU&y+4a=)wLUK$ctB z{q*L6k8d4Z@YUR<%f^5C#n4MQGmPE0UiZhTzc_A_bNU}I-hSG^E9XhloSDSGVwa=K zkJ@$JC%=1Y|8HHn`hAqgZg$^)+%M<+xuRw4VbT8AZrAA>_Sx^=v*g|1?CyB_w14*eDTxDa58jRVKY4T1aYaebzm~52dt_ti zt=ABLcHb2F!|}WzUlr? zqkVtxDsBFtuWiqZB;^mle|pK{fL)yE$Em(ub7 zGySd;uel%RKu#*;VAja_m4;eYt4Bpr%1 ztk9nu;(J^&uKC@QKD%hJX~S+PUnj8pcR~xF+R`>~&yy$KvG3{kY-*RJo7nxL_n&YL z{(4}+g>zb2-V(So`YZ<+nr zv=)w7 z;ymb@UGIPD9Z9-|-9I_qd;6H0SwB6%m$-6jPfd#?y~6J6J%?Oz-nCUHU$k_?;34;K z8Iq*^_9gy%$Y(72(_NoUx%jjn&OPPy*{EY_vq?$Ow_47;Ys%h#IAGS6JC}M7KL0XF zx`*AzU$?Pp&zj<^_PVe2@wYzz=bt5s2IfkN>Yu#(j=QBq`TV{Q_I%H3^e=}MC671U$yMMLzmh0dB^!;B3pS;F5@uX9G!JpkXZ~e(jD>^P| zfB!MhF?(LW>@DzTcj@KFKfB}U=wTYeceHypIQC}Wc)GOx3l)ge>h_vXV&wT58Zs_L%(|ah%FIb zqaQ;oB0=BCdceH<7c z4flp!FH@x8Y%riWNj|m>|)16 z#}Jlib?(q}Y6z+s%;C}Mgb^hl zmF(y$x^*xRB*2jc59tp?l50oRI1`Iba)qB$fFWGI*OjNH%btV%iFN&X+9=tHLp^kJ zUd}ds?x^Q);pC(rbrU6z;$}}d`U9gWbug^C#g;u}VUtHnP5L_GP7q(k#jU~-8w>*r zIT+3plZ<&EO!oD6>%BUBDknPR7Kue(;;?|7!V0~IP#&{vF;cV(B6pOss|zxm&wUsv zy)nb6xP^93o?%WiHsT^+j1wJul&6iHT{u*PlZla7uyidsVzq&zH`b+UQNgtA@vr{ zbvXE|FN#xkM$`^jlkB(9lFAr?bX|()DH<8ssOhkfjGXkmPizDktA>yER5$LF%^}5{ z!H0MQ#)!$8I(O`IDs@jdPm#zOd5k)U8f3)r7v!`ZHirPSry$y&r?Zzc`WPn+qY&i^ zIwyT7KYjM7$AY74$cwOZXMM)lrx`(QE35g(;hKBLI-*7_-7X%rX~jSDpGcGG_MD6_UVX+oRNEZrzx_Bo*c&c zP9se@q8?1FAIMX8WDlH@KJtMQq7IK(Y$EK@j5PIIXj10X`gL6DN29gTJj2~NgQsqM z-l4ASnFqZa7}ZGIXeOw{7}8|FCS(5gH=8jnQTp5b@;r8;8QY)itwYlkY#(pjB&d4_fk&{CL$ezpppCw3ZHL>AX9u{GgZM~@j|K1r*vmc@ zp)P-LID!*idJ?vBa`&-2f#By0#)JI{BEauBxxSr zPGh$^W6@>a5Lp-55bolNVv= zVH`P#&+Xf>Jp*6ZpM?KQ?EKFEk71WF{El_>@Et4uXBRAKhsz9p&*qNpA;8RJ3|4gG zeK&p|$M56#eLTO9=XWfc=dWV^!b)yX?8@&rgahvr`F#SvPvG~C&F`JCy%%0m_&WOE zcgA~meyMrXcb@x`@b%<)#wo>PPB~<=d&=hGWsKd9C1G&hX7?#?k4(9jr1{R5`0u=y z_ueM&$KCWLoiJu|$CS+t<9z3}JR#8MxbNNEa_>1UcRuF+vS@S1o$V^cw7a)`_QF2f z&e&FTw)=1J1S^GP+TAUG`}UK`nk=CgKkj~n!bgylDJs9s?nnOCug2Ae2#APHyZbla z{@qXxUfVMA+V-~tR1S~3AE2bA1^2+_mQTXxVErdn)oyBoPsBtc{Y+W1a`%?E<__z&%ZpbS}G5=HWwo zW{6?BZ;`e?0hNNj&hpIm+%|tl$lXc;z$U~!gbj%s{H(`GZPS?d5U9kZ=ayGHP zzbn=!^8rUKo|SG_UES(1T^4$im$wEpMC|1Lo9unwSxTpd>2k(&-ff5a2DDnn@x^nJNwI)Dt%<^Or zAjKtBfLH;_0=!BSAiW6z(%U5IX;2Bb-zaaBSoh9p`Es-S%f~qicp)vMocIxlCS(*J z7Ob*6Q{X=m9~vy0_|C)oN~y%8k3>TlEH;+5QrY6CD7W~u4Zg;`zS&jI2A|fJ?kK)h!jHT7QG44&>J@zI6m~>7A@UB=Qqv6@Iu^fVP7g*KQ-Yh>Tzjq zZ*X9ZygoK$&y_&Comt*$BF6_m6vXW&AL%ahCjhEJvNMVJPsEE%jEEPR7s}!+#)TSS z#uA*GnPNi>w1^t)vQnHd|1S2}a~My-tE=mmyXYX+MsAN1 zicB0?smW~j>1~o$ROaHV96TQ*=KP2g0&(yi?Tn?p)qK?K;<~!Q{>EseFD&@|5?H~H z-gJHo@P#|dN-xjBPdkm2PioZ}Q#>El_|lusS55obIrtJg+hN9-inuR zr^@rG-26URHKV{(woj#mFZ;``I;gOPQ?2Q zjW@mNyw$S$NDkg~vbj;H#IK0$4;f^7)A0nyJ$S=P3NhW|5I}C)a05H zS&Hkf8ee+T`Ko1ggH^sMktW_VG~V>4^H$5&<2iWCxB?VsSe)OjEQ}gV}eEd=(Nj&FkJn1c+C!NzG9#I#X zPjba+*79KY08YIc=7U{Dx~Z2bMSOpei?4c=iJ2|y zMOfoYZ#rMq_I}qIUlV7F?+F@Tdeix;W%tw^eCc$ARR$F%euEl6deix-W%ucP{7f+v zIxwv9q&J->jS$%(Q##>DJUcehz~c!Z{1Cqb@Y`RS!l#J{UhG?D7=&O8L20C+Fj4O5 zZIZMaZogtTG?e*GkE0(h)P|#jrNon~b5>U;;*>uo6pshBc+lGpT){KdV zgUO(98q1gt#s7QnZF)w$mie2GoVSolu^2fSD^=)3+yfe0G!A}g5zzXhe)JH= zOjQgQo$4Ql+=-49Ns*qU_`~DdW-1!5(y6Xlv6oM$x=5iSjG2o1tvc1>pH^S1Q~gw- zB8-`e^i8Mw?Cs_)I@PlZ6=BR&G#;T-37DF$cNHqan5k&AOs6vE*90Zw31giOQT`FDq1p zF;mSjQ60T<<_`!Vo(akeVa!xym2?>%b@!_Gb*gfOiZEuX-Aq*TPk0!yQp4&{UI=5R z+TBDo@Z2Vt1eI!|@LZ1UFlH+3iZ+DxT4T!sooatFdw2+ArrHNCdJHdka}8=MHHJ+J6=BR& zh>(G5+j&Qr%siZEuX{Y+FF_c`*D_6)M7*sSYtwnbXy+P!YyVb*PETY(>vis0d@GI?P06mIfWuL=R!iRENVw zPnX#qzNAnQ#!PjDiOOsbCr|?c4`Iwy<#5r%GF$8#g^Dm{DjI#$sqleE)!t5piZEuX zxp2{`%(?t6g^Dm{s!9`;IhSu#s0d@GqNcwdmhFst4Yk8l3Ke0@RMd0OseX0+*cw8J zhnB_ALl`p^Kn5zp=v3pW0fmP!W~y4a=wbcEcK`qCRCEjnJ%lk+QD0Q2GN-Fvp(2c# zih6`Pl{sCV3Ke0@RP#+#_`st|W4%H}7&8^B5JOnzbX}@Y5ynhK~8(WsqH)p5rE-lWIycM26@%v3ZMp;O@lkD9Iz6)M7*sTRRSry7#FT{=~X5^=(S zswvM&QFlH*JDXfS5vmjbp+Zu^bp2O1qI3~L$5+b7&FyU zrc$~8e(;lZdRS*DRD>~8d2@tyokB$zGgXTztY7)dQ8B6^Kc`R;#!S_kBdm`UD#Dnl z+Du{jr+;{y9@asV;faSZW-1?CbPHhCL$^Xj7&Fx}rczV#J;y(SdRQA2D#Dnl+H-_; zg+fIbGZl(1VyK2SMyf%lME!b3p(2c#Dv%?r_Z2F_n5jBUVVU!*YzjQ_5XMZk94^^p z*q~4m#!R(>snnF1^J_?sXF13O@>D+RD>~8LB$Qa(ecOI(5zD>npCI=W2QPjM_3mrRD>~8 z$)>O#y)+Int6@E%P!YyVwVJ6i*D3EPRD>~8p*R`RHS@1`p&_G&HG3*N@esyL)diPq zGIS_ZgfUZvm`dfo>Bmu2jOy30LPZ!eRX9gjmnl?)F;hiMVU2r~)>Eiq{YIf8jG3xC zM_7MXs0d@G>M@0N@uscQ^{@_@22VVMF;n%zC94b-D#DnlqD-Zx#Qn+IQ}nRbDO7|p zQ=O0_tVsCE1TM0bz z5XMY302ke27k}r)Cv>VM3Ke0@R57N?TvAR@s0d@G8Z?D<`BUS6p@(&yLPZ!e)rmR6 z`jtXO7&BGe6jsZrx80?O^|eAp7&8?$wzFx}A*JxdLl`qv5-z$7U#XA(N)IccP!YyV zHN;ezWq6H3MHn;HuqiCh{SW_E59{v=6=BR&YjcFP7s?tvgfUa0v1Lfti=WT>u^v{p zLPZ!e)q1ANoUV%$D#DnlPBMjc=8um-C9IZ|Hxw$un5jR@WewHGt~yT==rt# zU(dAZVJ%Up2xF##naHXeCn{8g86#mfXWoLU>II}`WBDgsYO88fU20vLOGPrWjL_o#gM4VC>O9|8o#kcN8tbQ_?_|G%PKp3 z-HjL)f$ECTPtGQ6x>3LCeQK>p98OkFt zw`wjb=1-c7%IDoQmoL*?rtMDqHH_(+4HxmKoadQbD%R1|nh@DW0LK>9(*O8v-}u%6 z_@g|_Kt(yY5kDcZh{8v>R3w-Ye6hA3KizKZdh8WPv9ppp>qGQ)I%AY(gfz=J{YN65 z#yP|@81p6mryQi`bnWdVCG^ud2SvUM&YOT6TSOHD$#(k36D~~W{B6d(hyPX1o3yw4 z6waG;&cM-gCVpd!_Q3x|_{Hbl@p3xnvlxSFLy;0usbRdWa6S{9&86vVrXr0L`hXX0 zHR;|6kn9IxRI0K#A8X5dtam6n02r8qFeU~wB<9{`m&ez^nD4fq1 z`DGY=x`3%DSM*0s#b$+yFo=(V3W|tS=;(pMHo=wwyCm}&JIF+4?j_wRLTpr z7*^~>2nA!Jx(KdjstYu#28D_-(2YpfP>-0kznH1)_+O3JVx}@;E@8|f1IC_)xs)+3 z1EwJja~Wgo28=5Wb2($04VcC>%=Z~%j8AhK<_gBx4SbfQVSd0EV_4oa%$1BWhSi#e zxhf6gOT%2v7^8gJ(=gYh#V3%4xi&4VN+dkA}0a7rif$%h;qjKpyi35S^ni>0b-S;YC-5_B+z zW!@H|Ah1@F)fefu!Z04~>9vAG^dfN_Lt!C~;Rx$N9s$KdR)Xz~tg{eeA{3d)gB-U*SN9Pq-0>Xq@!pY6Sc$m0m5|cTO(Sb}DI!1x++*J~S zlZq^$6ib?_Y$?2ggM$`$;U4aRjAbT;o7@@;;ZR{=!}Ej;Y+T$pZy^F*(E-J{=i%BF z>B+>-ABn69N8^eBLqqZWpvXW*wKj8-TR6wC(a_5WhQo|wYlKo^$t^)L4%s|YC_M_L z2PQv_((IW+xkRB{l8MsnnL@c#pe2!-OF%GHTwAIt@G;IV`(k!*FhavJt@+Fgow6GWnH?92vP zwhW8=m8(|mcGt2RdnShN{0voynV~xiLnJdlOC4lp3iqsR)oA2My3e74QrTvUZDanp zst_~F#;oyF@j2tEg3L^Pj%;k3^2bw!m{~SuiKl7_a>P=Fm>D)_VMw|yj7tudI>^iv z?pfHXrX>ec6=G)T$->a*Q1Llf>L4>yxMyLj8k`(VRfw78k}M2;4i%q+r4BMPg?kpZ zs_n|bRE3yXF3rNw=TPxESn41%Q@CegtC{E=Ts4fDshlnCK8Hq;gR22$=1U&gVrxML zTD4*3Drb`bg0sNYfHLzXk1Vlm$zM=ah?!?g7KT2Diq9!m6=Y@#;w)@i^T$(#m|3=F zVd!(H_?+=nL1v~P&ce3CSkW5doL+tV9IBPh837fP8i8!a+~=^!Scj#uhEJB%`5YbU zE=;@Kkh(0*k4*5?zzhtt2AYXaPN8KYNDbJ8$r^Nrb|Jmh1gpC~HGFEoMwVH_rP!r$ z%A4jiiqx>pY_o(O;GLja{Bwkwf;5MwdS(g5=THGw6e$I34oPQ4Vaf8)0FF8hccUlR z7fF_hx#6;^Y#xTrS6nj~!~owihkND9 zW2AcZfI!Psaw~){M`JWVX19YweU;S!?FbNu0rU^bAgV9J07Wz;i;GR{O&#@RbZUx> zyCiTAl)XueLoTl`Q;tB4#o<(Exs<2zEtnBTiOqjK%wdN$S}m z`D%J9N5z=Z<7;SQaaQiQIOT3}0h@C>5cc>(({mXwOKq@TrmPM#|nuXpKT|uVoIzoi04nSqODa262Lb>R4Yd%WmF0 zY~PVh(02PO2WzKJo@;-y4zIL&+LWq5_40hHB=Z{3+pL${Yj>2OatBVqvM-=8=F`AC zj``@0+3jkuHCBUV4(-)D2Cs71>nk00x5K^zbTrm(72cuP8=(xjbF;>9XjqjUg9anf zpqdWZ*N2-}BjRj7h%+fCdn0lJI*ylkY^bLf<9c*5SzN}+yC+~XxSc|iIW+SY`%G?g z=Pj@qpQ`Gb`85lUJhHaN=xVc7RaVZMH_v9PU3lbt;k9~_7poPTiXQUJ#I)%{%0!KE zKRP*Ghsp8IV#QPaGpWQhyG_o0SP=2mL|nE^lizrJ_}QhB2IF3Fa__|N9Gb>9Ja(zl zZd^%0UNpb-CUEa4Sel~;Zd)op!hM{|uLS%Id(;78exF&yePI!|-6C!*P01S`dzSd^ zVi7mlB5s;R+zgAjJuKq(v54E>BJMzoxH%Sahg-zWwTP>+h?{Q_ca%k3y+xeUBCg3I zZmC6Fn?;=8B5s96+_4sMvPE3TBCf|GZjD7;%pxvf5x3SN?qrL&(=6i7u!uX$B5t!q z+;=VFF0zQb%p&dw7ID{P!Wq`tQI&BT7KL69+-zD#h36prY?5!aaYZh<)4G<6uau;h z@uP>TY{nVZp_2Pb{Eoml!@nUXuv->P8fo1Zb2YQ4`ZJ;-e}es`we zsNP5GV{U(NAleNz%?WsHv&^)~y8O%k*WoenyxvsZF61jMn{J?;Po`r&F;sY*MqnR1kV5c zksYGDKXFk{N*b~_xA>Psh^`cHo7dIqXmR^z+bH8d#P7`sIOs|$D#feh9O0oyT|?2n za3`;K?8HT#$dW{7D2@ZEWlZ(P;z@M=kpJ-t_(^rrqS7K89n?chi6^cr(*A0CU^}G! zP+Qv|7Ux7y!j0%QCyr4vZBUTzP6?oEqU>G!9rWPtE1K9 zY;(Esw!+g|Q;omN0BJy3XObcLr<(1Czr=z^ShR+dNdmm%c*CMP%=6kSvHz1 zGMc9T*l0Ay$SJ#C_pjm0Qeh0cgF}6Yd1Gv(3T_NgwW^TVZ1A%#a#%1-9=9|)J3XyV zZ->iGLf>H)7HN^UiOv-mEyf){ox}4gsth?D@Y%{&N+`7SQ;ME;>#C?9GS(TPkVMDn zjZ}!L(M4U8evbn!y`G65)rI`bmTmcwI$&!I*Nylz4q4XMS30SNYv&5i z&-Giz@ooEPhkG#`d$utS=JELdWIW0$Aq0}kXZRhPas)le@(}!JTg4ye;Xi(gQjAAk zU7FM~IPqEZlrid~Wf1R`nk3bgzKxUicZWBfOaC6;e}^FXdV#&+K#kYkuaS&_y`|% za#0>iw|$J*=2EM;;qS&{@QyfbjN$Km{G|X0bUm2hp34s zMHk!0O41EQnRSuW&mdR3;XQ|D);m_z3iWM|Bw(vBuQ6I(W%~Z$pnY^R9Lq7Qfti^9 z$KH3qM^&utpA86+ngAk#Lc|~_0x5trA)C!6SxH&48;T-J%BDb?*$qv^C|J0NqGGS8 z*IuxrqM{cCdqc$DE2vmdRFwbo%*;8vd$PM(6Tkca%AH>}?>X;0^GP!RXA_ zPD#j9$io{*Z79Kpz~p3GJD2sgi{?W7F1MOKY|%$eL{qwq`wotQo#-h!=Ic zCU%3I(+51PRL}=O z@zPH7Q=s{v&x00#ZUc3Kz5_Z9^gYlbP}Zp%)NF$v2mf6Bj0%Dc<~x17XTSF)e&+A! zFbpwF%SV4rPl~)HVD&Jd9R+^XuM}f$9`_E!jLeZtSda@Vc7{c9c9S8&jLkx zYv}WuQQq1~peKXQ0bK@)dTVY5EdgBzS_;bY@`9S{;Ck?xmEbyHoO&I6jcd25tuhQT zSK;^eU#$Z!P@u*7Mfo%4@QwqGy}@P9)h4%_t3o_SG|PdcUJ*-1FXJ9#WKd& z%y3LM%b0m%+UXXfOqdspj7-tSLM#^23tfk7jb0wN? zp}J?G(ftrwt{H+U|1pm&SC}(#R3y30_+!3L2Spdf0}Pr6f}RP=vRDnuGP}^u1?|p> zpP(!|YFT!dZK|Un%j3v*<~eK*w-xJLnaAUp`p${_f#{}T-7d@JE^-v)c$|eUx5rjk zIMrd-hAKcpFd#e6n&V*rkGs$VF?O39J#FX2nTI1{tpMw59!J4+Yn~&^U|S^Ho@dXu z7r3>96*^9`t!~7eS?soJy_81>>EX7|bZY|?ucPGIvaD{a$Aw58g$3F`<#~XLpup{L z&+-)6v+YIp0-GIeP^PO>u)mS4cqOthUnHxq0v{;ZS%tP@!PisJC6w=R&vM#D88YWx zO`h3B)*KP~Fi7or1hhq)nV-iJU@%XJ@UaMQ(VW&Im)&Et78GKY62*6dT@(~OEB0mOVorpgau^Rv|q)D-V<(s#25{ z+3`BwF4%`E^nr?veQ>#+?4rVakpkVfi}FRPq$gqch@On8tMbivPAtoqxUZKruC=auis0+~xQ3cfH^-}(5 zMOM@}b!swN4Qk9)>`@O$@PUEOiDyEXMKu+xyV&K)Mk_&^Dzdu@i;JL+Y?8ktXcui- zvAt-P$KgU#ak;H|dG;(cjG|dWp(!RVSd6W(pnwWrkR#NM{vCq-i|kpBA_W+t($O&( zkZI3BN(yHb*@Lv`{d@xw$4k-^p z9;J{61|x&w4ua~X+9eoT?4mp?G$G4Y=$xeuR`R+AgIo|OiXJ8Ha^p#$OkMY23>A;9 z(K_Ag$g^hV*>PO6g!Kr9iKzI1fDeNL*drCTXE0Wjj%ya$j?-Qw)ht=zbR#M>1E~u| z={ZeoA+6YH)Y{=nRPSIALh zeS>|`7#-OTdsfRb(<}bqV7QD)>bB9~^l1A9BeQ5w7%dIu%V->N8lJXz5T6Sc-ji=V zo_A?DAzY^Ukl?^98H8n`a;>n8uo&z^9v98iHOu7@&v`H`kzxA>hefM$LvynnE_8Vg zS_E`N&??OAq=Yz)67sD!(GRk`4h;#PhoXeJ7CMfO#|jgqtJz_}Ku2-G)B-fVfaP_TcIb%tK}hRP=e15nE|XJy&l$`a7nFp|TAF;<(+?sOMf3v%o( zBbvd%2-)?cheb!N8-OE10r^g=&5eNq#uDsoZFa|WdzO*+%Ate^`pjwzU| zBg4VmC`6A;qX8Tm5m;mwgAZNeu!umEOuo~NPb$i&M+O7YPF)TcH9?Jf0y)x4FeMl- ztO0eWs4&lvm>Pm;p;)@{&~($67K|6QilL4(58YM1!6|JzIk5^mQfXWsPD;!*+Y%=Q+$i2__AE#bBOYZ(|ugU&>!?w z0k00a7aochy4{r56QPD-Y@DQdre`|PHIVV}0E|SNE!zH`1@)qhN=5=0`6Y`>y`t4g zo@UwKbC%bKez|kvqX>pUWxchG+Zcq#PJr@YWy20Tiifgt0E%IgEtf`wLs|kX2H*tr zPacfBrb}zwT?s{Iv7mrCj*KHt6T9j~|I6@kMtIhaM;I5%r*&bPkZlAH4bvesjH|$r zjR8Oo7OrKQIvW14O6X{zXdH8kk*rJDjm5k^e$28#AO z4`vVrjECTbwy7K>2y@L89cbY6L1-o{u^0}}8y}NWHKpek?b{85F;k5Vj0n56M6%uJ zBNEs#S&ZEc9L6%DhcI%_kpLs@VLL6Bj4|`5hG`BsEjZ4=IBg_2_WHwA(pt%e%_?c9GjM$yUA~?Dfmk2!>DZrYm z!%3Z)>d7w7%fp9tFiQa6BKYjmTrNx&3NVBcnoK{8bP%S%KEoau@1R|{AeMun0x1@@ zC&w;S0=dt(=VxM&!?r*P9fSnzQ)(%JbxjFKKtMtk451sALI}~5*ij~f%8!068@;+) zC_O_XiGk2AyIbss!uKO(^aqHL?xJEW8OQ;moLY&x6!QWP`ZJ+eG=da}6o&}Z=bzF# zbHKrTbrOQHjR@nAylfcC9Cp!iK<#nEA{Q3Rl>v%G`U4_!>;=H(2}4d#Br)Kr)+IPn z<5-k2brvxd7l>Ai1r2K^b^vL5;UOJ?(DE{<(`5K~S$NPGq%spTZDA4qKvTg{=Z)1= zGmJ1WGgr$iP+Z7oH${vk6oXH%=N57vFDjUTxKIFFGWvBieun|+5eiZ9V5ILBN=PZa zLLuxD#cVmlNJ1`GeXi@$tH3VY5)pu^Vl$r$P;ms1+BGt z@?AFAa&%oHnFd?&D3mEimXbHfx z7+0RKlmtVuAlNx0G-Xg1!BwfCgg7h?Su`AxA&i>CCUP+y67bljyvFOQYVu=?NSzpr zZIcyNlqW_t7${&QZ+DAP%yXjBrn^0kG%=RqeY}SIOlX8i6*&izLoE{h0avy*g9}xa zBGJ%{6%7sx=?NVTc;-&c%NONIVaXJR@jrS?QAQ#O&04eIiUk}_Wx6F=Fc_3B%!y`< z<|7D;)7-OMPCH6R&B}#wrw@8W>0=C|St0a62Pb{d%5pHTWq!y%z~EbLQ!zB6)k1se zmUsgfqlKFvSOa!dSJstqU#u_+Yh*=>1yE5Vc4Se^GrDW>i5;*`oadZgh{$^5_BzxZ zURlM`oi(4Utf;&A#2Zaa`%Luw@rl<-jWLB_Bmlv58Dddi@rj!NK}xxkm+P$}*cCu=MN*`^3qWV% znT4w$QzW+>V^MW(3pPlKjBSSu+DU6sk#$xkyLBO&Vj$X(#3XXzSzmS*alHoy(=6g* z(REj$W@19>D9A1pk!H$NvUhj6b42FZJdh3}uP2KdD9q#7Sww%K6vX@s;mkj)3By%6 zj)q#qCl13iB9EuY?RI411v6VsiO*+kY{XOBZtz5`T5(<>#y_m69WoJ)EOe`=QWnfl zSZsHo&XaM?DO8J%I>B2*&;!ILjzlH4KyhSJ+<*^Nmt!UvpZG;MNiDXc2t{M0A#t#f zsmx5ZNckaPTq29Y+R%WF-6ei(2X|u!Il6)P#2n_|R^rDCyLj1?Y?*zQRtnO}7q6|t zR1m!uf}D=5e3wHs0W4)=LBH58YO$zi@z*zss zNIG6;Wo72Ugh0_?eQFS<#>=-e`SNm8nIF$=WVO4n&hBxGkkkU~?9HZ{Vm&`TaVt1B zYjLJfGd4OlAidoc0&poZi5>eBCU}ald*2W1=JQVCE78Z`q`hN!kyM5a0RE(-gKv&J zMuu@m>>pnR6j1LTzmj_;N82NDd8?h@L?;)cY@II%^u`DAY zHRuI$!JVuMN4(gO>n&-p*0AzWOwv1PGNw22i66sK$?$wfLVAgIeq^HZFy29*w4lDa zd@=@v@rhFp3J&EdUCd1%D)12aKWrqs7~3}R3bxl1ls*rtA3G@G6K${tB69g&dNowa zTT(kIwDe^@f`Xg;CnF~=2s`0#5{56!RrnS*nwT3EiOAn8|a(ghnsU z!z)*ndl+JQ1{OueVhbEvAoEoQZ>OFwLrDd=x~>6l9P2!)z%iyw*3{RTd1&vUprj)w zV_#!@;?BM*4N`Md5sE~%)EALUXvq`=d`VB;UkGSugdGAlwMjro?XwWy)(bIMv1N6z zCt=?p)uO(lLJV;()dTP>TO7OU$A~aK@j<=X@H)4-d_|@A*4uYLCEO*I9=|pQp&!sg zdy4B2cU`3yqPaB))Tk-iVh@djXtu{8*foc!!dDG8M01&k$W=fs?W>!+>beCbHPtwo zx3Llj=3*~Q4t#s)T8g7Vg~bEL)Z(T1fTD(~2<<^V1YN0D6i(yyplrel`CHl^BIL;M z8@*UOg-!lyzcBixdhv7jTiF8HvtidqeBuXs@|5k1O@-4D@}W@OudesCqW2t#%+eEw z(rCc(6@C$Bve1!oy+WG!z7)7J<7rcYf=qsraz0@SVGs5djI5$OhowNftgtyPpm5_Ge zkv0Sju>-faNkE7lU}etHa~7=bf#e62oII*_Uj#Zu?|#J@&66-jnye*(zn~=_Ln?KM zDCTYPiN3H1{a{rgq#-N>C!z9mTOp)2EJ8m>8jr-|6X%D8WHr^+F7|k#f_Rb`pLmw3 zahO}ECE$Q zY0=uFG+qH~Y;7?tn+>u30@gloP*A(XLJ=|-`4?mNUVP$_e|w@KJ-5V%<3{inExHad z8B9SR=E=li&_b;+&5)ypiu%TdIHEYv!EiLV1gSb16J=pr{Eev-CRE`y7inrjN;cHi zx9n&_{na2iQ1d45B(^A)_xxDmj-n0bE{RachV-G3{)%3k!CGWW3bsYYC$4No$3w%k zKlh@o&M_k8D8SVFvvN53>!kM)<@NkblQO}>;q#)=VH>I}=Wn5jl_l}3VeT=}tK_U8 zOnfv{cSMpZN>f0JR6GasKGyiue?_9>Qg{%EAe7+4#bmF57Su8vPU$tcN4Fw<~44}rdoFc1hWzEYO_Xe6N+op}Xj zqG)M#oR1nqI4-T7sMkZFH|CtAL{Ce&k=>cs#(LB_BpG!>JDa*o!kl7|}AS9nB?iq)eYx^-9MFKI$WLlzwii|iA< zawD1vjUB}addWtF8I@~J<9G!BEOfje2lp5`M>FcEQ%(jZh)i&f*ii2ibH~s1Z0TcL zks~=UGb9_O89fR_!YMsJ92jAuCWh1bK{es2^oAc!|1D~R1mz<^YeI*)Mz&0iIhKaO z0r1Ou{z3K_vjyHVQGv~Rtr}l{!K(@~cS6zsOUD&>dm=uukKXV9mqw+J z>=q%$d-PWNUmat}XpeJ}TlI<)J+531qS-uKx6Qipa6TVs710L5>^>gQl^WArDU`-) ztC@>3$i_z-_#9#o{5OU1#|%aSXbmb`0vuR)#&!YpjV=B7Jq36v@?O`0YBHVx9YO>FDgl^ z$@$>bdR8zSjkp|~8EWzM6_L>1G!}dBLX0#1CSk^;pUc6HzfEY!LI6iZak`N$t;V-Q zaF`8NNJ?sqK3pumag~V=1TiQ#o(a-mA1Ha)yEjWb&Ed9PVDKbeJndui1wbPus}R|szMC<@z#O?>!ZnSI_gPtyv(3@^eQ6h4k3`Cv71NA zd27XORw1^C+C`Z#NwQ2tfCGW}1tpBariJ2*Kk(&qWu%FFznG0>;9@IB0oEtTV7!dO#!HSuu_H<@_wJw`Oi1^B)(!_5MGlSPHI=$Ti% zI*r)(;Lbta4-F&?wnG^K}vIim1Ub+=oN9a?2YF z2<1S@hfsyWYT z)S1Y&Xh`N35ok(jA|Q8eagQ)JieXomm=KAILBP_W);%P+aTxPL z2UkUyNZNH|#4znW!Q*}-W3v$r7VA2+5_*ICFt`pomIH#f{Gixas$w4ojU`PZT6B4J zMFm!>73ZG6}GrU3t<0mvl^X0wT!)WP*=@@nj_4Iu6G=F0;6T|{RWXDj!74kcxtc& zB&2?Z6k?Nf;Z(V|kQRws^7O{Zp+c_N07!5->S)6R*Lrod)gK6;-+%DC0Xm!jAEn0))d$Lj~B?Aq+UnkXy~c*7unU zKJ!L(4cICgSdq3ov9p20YH=G}BQ#rLpKaJ85bcF}Eq0kw$7ugp0Kx>YT7*Pn7{S73 z&7gusrFKANv!%Ouj0I0hkh3}wny-2=wDGov&~%m`nvFgP=csR=G8eWyyS1R$>B%W7 z#DBcTYqRGCL^A)}NQxdNlkX4683XtD>r)1%pB)7nf3C+;Zk;7l;@dP!__jv0yk`091JNf96~vBQzN{)TN-I%JbN(_s(<4 zm2Zc!XVI;MdK(dM(Yi$!P16r+z|Mn>f#*Spj);eGsIG|i=Rjmpt%G1>!Lg%IF!tyo zM%hr<4!PnXSXlI+W#i^*wX<5&enJLr!BH_5&;-krXCJ)pLCrVf*qYskK0SrQ44(Ot zU>Wvl{@kU{jj}8~YT7q*w#DNtnbQRS!PkFYwWs&?)7O=p-Rom#1rFGGMDWYjU48$F zOP|CT|MJCyyaP|ywBH1O-Zi&Ax~ID4+tS3`-8F^%F4DA#h&aL0W7ln$Tj!)lxTGs_=st*bNtUQra#7?=k0c_rhP5=hs?QS;pg9;yY>Fw1OHgs>xGRt!wz{) zu$)r4)S@L+ZSOW@?LRAjdkr?ILh!3L^nc5J{Sg@t4t5sh?YyQ$({2)cNAAR}$F81t z(VgeLJGy4$m4Sk6ZHx&S?|;d#md#<0hPZ z``~AKzIEixDx0P~EBODK*8jeju8~+?-c6?Rdc-_ra4-9jkSEddluws=i&m6o(G268u{qI&|gzLrSOKbYTDfb7$Q0 zvZlQt_^*Fm=#N|Z&iWlc&$BGP>itPLEeGc(C0OQ;c<<)DQSe_nZkO|& zVN-7S=BS=Y8@8N^Jat3cNU&UfL&JTOUb(;Hd$u9hc7OEwuaJJh|HnO}URmNn?>JaEIjgA#map*Iu!UGtxuGrMHSotF(hcwp`Ccc2`W3x4YG z4TsNvu7_3FD0)wHJs|JPC82T~uoZ&!z7o=WrWPePoqc97ry&4R8+CvX3= zf8mzT{8QdOThlTG|HJPmym@ST_J#e2UUA*R^Pt0y zLc4oR@K>$B^X(bM7Z-i=jN^oUH%$8iA0HBY?cFWE-1kED(WfkaZR^du?uA}Wf^AB$ z-0}TCKAL&!+_iPHY<>1kx!`6^yIAng*tT{4dpGs%RkUcxZ)c786wmCo3I1u_FPq@F zZSCc=KIwkR=EP?aZ!er1mS9=-%z`(bz2}juuX(2Np)30xJ{RK&!N2I6tyvAv)s4Gg z=)jSS?|f#jrd=fXkKUKE-oEaM>>D=^IsIHM<2FruUGTLV8xOv?WA4{Wez~Y2XX!yV z;%v1ZlyA9j+V9>Uep^}o$fCRQhC4pPtXuFGr4LG4zISQG#Mk#W?Rjx2^zA~yfAjGU zDLr5BdhneqpNE_yzSsU_i7s7NlCDjmfX3u`$zY8DEYN<%kpopU4za} z@b~oHcJ)OcXT*K*a{tj~ckkG(X=e-m%F4?(RjfFA+IJ7UXD?cF{dP@zM)21ix#Q!* zwy(X|`qF(Vf86~k>^x7tO|TSfzU=;Q*K1$?7&m*+@&oL{@mxdj3s0VX#_ml;1Ja+* z*;u}>`*@rqCisa>$vgHxyyK*akH3A_%a zg5UeYfgMijG5ypaf8q^5;yif37{^RP@tH%83s`8w& za&p`yA86Wf7@QpgV-+%L?Z+$cj^7~N!lOG&+ z;)6e4Qoi;Q?D){$)p7!pjH@}|UGvVkRXLP^w7EOCX@UL9{$NkPfmTlNE zsciP+mYrv!d<6f9w1HP#cYfmNQ$Kw1zR@$6ehT>qQT|maAHVtOj`q&|LTsT zZrHN==ZWw49+&uh!8G)D6VQeeEG3ms{opw7>b*UFzHY>_9|nv<`3wG)Ok%DSvj_ z=if}lxqlesCRk=3^xNfc?b@)k_rTeeCq4Zr`Vqh2?;rg2L&typN?+>>r~O>{j{k8@ zdrmGXc{&yLSC>*Zpa*KPL3vB=Ezyr zi#B#XHRqXzxSVZ2;G9RnKO?v9$2%Iv{V{6lv;+42-t;!ok1;`lWlwXrxNmwleR0K; zxtr@h=-7xeLk0iOlTZC&*6TN&vSL*I6?2Baakr*jA^7JzOCMXm>DoCj?oYU;^YFeW zL%!fI-?sRnuDwS5`f1X-kE@QqaDk=`K;M&Kx#eH=WAF7{|GewK?{<8+_Lz5(e!>6g zjJ$i}(g)ssxYKu4kIM9Xq+jq)TD!XW+ye$)Q-8sNsXG&|Mj!I7;Gdp<)&t%8zj64$ zTkfBlcjS4OYT6h~)erh^g65YZ1jUT+%UoN$HLoh_nG>-JN(+;?>Q~$-oukV7;v?w?HBwJpT6)xarpS*6s z@32dpfhAbVcHX#TO^1csr@Y(w&)z?FyaMNM3VvMAHE(x+IXUCKQO6!J<$2dNIImXl zpS`WxdPPFz-l;Rc^){D%@gY7IsNtN{!T5(SPvA=y;zKYzE!j7_R{suBlCONe&-gY$ z@OKPm;|%87`nr)-(LyhfpONteJ|nZBO#cwV>_yn{gx#Rg!bgt1v7xLTQJ1wIb=0KG z;L#HhHSOhP-nNFul5=Hwbz4LGyp0P`*9+Pj9-w6uhHq%}Rr#X_j#~2Gs_20u zmwJ7TH?6H<@hAx|g;lnq?NQ<`orkSW?WywW`Z9l;3muo8`D$A&Hl@u zsA*GYf_ldL5^c?;e*yN`M-LpejL{v4t-(=}9yPoS-i`#+itYRD5CBChFKtE7qh_Jj zTZ>2D(fZ=3!F>zm2hT@V*VVLHh`!T2nt;fvUS3n#N;8R?gGJ&sv9?7G?X9b6CGyA# zM;mR2b#CxgHI$UiAJ-1$kx$d33y7TjTHm7DHrw~IN`A>P>KHO|%_U81rAZv1 z)7CO`!)DZs=v+E@2m3G)RZ)|CjoWdh0(f@sEIEV`$eM#kF0wQ z^$qL=qE}qh*hS>g!$*$3wro*bgQCec;7!?f1aHEeHhS==8E@yQl66qZauhj5x3>w9VmBW%6vIHcME9 zsb$d;5V^gvpVPbFNGo@()_~aO(AFuBAKS^=B>+26u$L}c_G8LG^csj5EDz!4bc-2IXG-hL;EzhPE}mnCk^6D<;J7| z$Ks(64g0y|HqI)=N2|qpP%8t;sP%*|zqYN0&^ml&Sea{U6$K^VQ&QeaGl`l79OLP2 zYyZUVp_Sr`tYxv7x2P$v;8|kgRn=&95LJYDXSA(#z=>RWd&YHqK81N$n^Vu_z;>){ zF#W#jR;)zS;#-Ut>RYM*sNq|EWDqqpW(1y+_RS=DG)oEIbzbblYPqkzsj&>Vb@kY1 z4!vqm&KBVqzM5*Bc@<^k6}f4^IzTh)ThXn^;e)LMCq8BEF%S#+24lNce9Pp7y=`R? zoEIJv*vcF-y2iApQmX4p%3Evhk*kDbA-}H`dmlCNn9EcwERR-*QG?UiRM)pTxCq@= zO9_3(Yw~RkU0vIrCu`V$(Ara<$hB66wM#s4h@SGO#lEQZM=p`0pYN}Yp^J?gf8da< zWOqtZvbVG$={S(;h9usPP8yyxM=-!AL*Dr0%{cf1oF{xnmX*3n7I@2xyp_JB5#&1s zpCI@-OYm)O9|K^giM9{>cd=CkA5b`^v;2Z@S1mZ+^up}Oj#RbYP=eYU zOVh9&3_9djS6#J5>Z*(OtHJxj;PvS(Lv+>psjDuU8&{7CDc7m1uG)?2s*A=WpXl3F z8>6neXjX$~H+a(wUa`TeF?bCIFY_qM;xAiWbb@-J7Q40*+kn%3#w=n2hc;FwJ z48FmGjf+|wejODDRj4K5Hw8bsNd6h{YsN1kAO(II_%&Re z8Td8hmxLdkjwxQXYu^4Ua?027zjOJncyW>bv~#unr}7)fT$#UXl|A0MDu360Y~;k& zJ^MZq+;6ca;VantR~7Htl9?>7?7OyP45RPr{N2-pV8Fg4hpZ~zU8LWyvhQ|E zdCNCk?S)_$CcP&BN;{H{yIm7=lba4- zRlIrmlBE6qeuB4om2=p{X-P}FZ0La4zG}w5E%x2`uZeW8&fgl6-PK6%s{B6FRu^wA zT4hhbb+>7&isOq!Jj*xtJIB6L<-!Qr^FjO0GdKAULj2S86m6h-?CiU<&*`V`UW00A zI&cI2Ydbscj7#5S%6x)`{GPt+T==U@uC(u4x!TVnM}<^1!(;X8MYx@&mt;4@*H5PZ zVtVMwiw8e$=bTk%GVtyUM;7k)am+y;l|EE`DWZ@~Zs3TdXo5See6?Z?b^3(mHH)@xCIJ zzP&;mbZ6Qs`#zZnJ*)8mubP&uknq(#x(SbAVLkR4`R%Bu(WGC?clCk7v$mzYo)6h~ zS8qxfs%bqR%Ku^hv*jJ0?DO!A&UW&a#pRuy_qG=c?jv zMS&zjx8q?jWS83sZ=1?G?u0LeY1(!8b%GJXYdqqr68~v9`)D*h_lm32@&8)#rY474c&3PZ~V5rxHf|rD=yTnx%uI?1RC*bNz!K=d+JDEP(ZMa$|c+cbN z0de&vuGWaFPjGd=!2OP^iv;fgDD{2fYB;XeimNdO&yA}aMTjeLb+Pch0ar3d>v1I| zKZvUh!uM%hT_Ubt#??dO>U~^cpEUCJrNP^SD_I7E(1srozInKMTwGP+3Okt*q7hdc z#TA<3{vo*1R=JboS7&xxb^K51TZN7>X6-BfWBU!oywC!30C2M0`r=CFZUC-s#;=o> zg#S0-*9Tu*&~X!RC2{Nw*5lVn%ff$&L!;Y|8@%pz(IF_-h>m`L1=|sL4*oicZr~Pi zm4g2qW_8jg;r~72>U#XA4iSHXcF;k;-BtUlea{UAPt?8p_QEZRnd~kxxo*=6UUAImn!m}Trn zAW<3}EG&~22@rk^MPH;jC@$)T3`Ku$r@1%XhjwjPMh@Or3Y zRVZRYLt#W86l%t$rRN7ixm74)LPN!eg!*pS{Z9u%`Bf-lLPH%G66)F+hoHFi6w(gR z5fd7UniI&^CU-LhEb23Pnt4D2(re@)cTN@2XJ5gof%J66&~_ePA5*`s$=EhzSkVCnVIw2WNc~ z2sJ{5A|^Bx`^rGcA3N_Uq)LygSX~ek8j5y05UOt53N&{;RI|DuCN$K+A)(&Ag|GSQ zp>9$a#Ds=oD-XoAVOnn}f*$GxbwNyMD7-lp6sqBdBM%LP`ay*vCNxz4kWe3H=Z_17 zVy{R?OlT~e+;{Bol^cstj80$#Z@rQuIU{{SknkCe{~auP;;#Q{?jM3J{tbs^ zUXQCli9Lb=9j#Fy%_nl$C7hn-S2?6oPL{^u7%ow}1EKh(DaIT~;Y_5T?Iyt4(;KsF zOK|KH`Y5p=aX7Nk-&lroW~I|(KRyIQzZu}nMM46(IIjif>K2^az)3*$210$>0`ogK z86g-42Q|vcyr0m5b7u%g&63;n~|s9LXOW6}@;+8p)f_KqL9p%Jlgn z`6CyRyy}puNPfQg)eQ@UP#hm$YUFgrXpjE6tBlmN4CEVcdHL}*56Wo`*?>*B*t{*` zYz6D9s$a;5mNAGWw4oknB*u)5C0jM#idY0TR##TVf5q?X`X`mGHmLWHoTRX zfo+uMLdTE*d?!{J_g18qdMm?;Qy(f+1&Gf?v<||S#8yF`u%D=(G9{(O7s4}49~#fd zm}a$SSTmt z?GnVq%%rfUI&9`B=hi!X%{%$unUmxcl^0J%Sxr4Q_3JrHX?M<0%qgiEqOjy=v$1mv zpS!M~U(Hy&Rro$_d5yR6-S*`T5p-p0RMhe?R z`sfU&H8-dWZhuGR%*+w;g1V&tG_n6iP0Z8_|EF&Ld(}N5ShhEZ7hk-wC9S6lt>xEyB7QW-dcV<6odFFoG%ATAsff^ z#U#{f&qdeZw1zDX&%%m&h&9S%ikM7d?%Ixt<+MyYA~Z5G#ar9p=h|xfM0yG!vCF8` z)U>1^mztJ-Z2Gt{V@8K?laf+XQpS!Qo0OC`Iz25dl>z2<$+KKx$+kS{c=_BoZIpVd z6})?g3(f1W%ATANvgC{n9|_py!%xV|9X#~i_^hTqZPm2XyCMKw1xSXLkQuy3hWrdX zX*t!jM=C?h$QW7b^U+^-e3D>x&05N)k%3J?!kbSx9vfuQp2Uxi|1*dS+R;NkanCCZ z@98oUQZmBfUXBs>dW^U?W5m4^BkqG3ai7G9`yxi%&KPmu#fbYcM%*tk;(m`2w?9T) zha{;}Qd=VHOXnDIU1P-cj1kv6M%=+M;s(Ts8x$k%h!}B0W5f-Q5jQGETzZVSV`Ick zj1e~_Mw~51TuzL*sWIXTW5l^)#Lb8icVdhP3)(3`d&dv3E(fmfXlVmK0xwB(&JErPLEOQ3l>Ol(i}uT8iQ{u>feYG?K-^F8 zKG15>{>YR#?&3l}oe{j>fVdj`(z(Gs*u|yD9T-8pV{v^gaN8A@yDgFukUrD6gx){l z-?(fklbanf5-=_?<(IorE(GQ-g(Etgyj|dL0OrOVDUZXZaPm-m+IC>RQn*O+8sPCG zFl7!YkNF5EZy5Ne19PjwMUuA$9`^xbn;Kmn(^mqFU*RIj!-rwCWx)KF7hN9rXY|Xr zXj%BtK`p|TUq5)y1g4=Nx;)m$dBEJJa72fzkB#uSAD9Mbba~A0dBChwxJdHufXD5? z%qWU3kLhay<^qL_BrgL6aV0SCxTDMCuB%^x8CEQDk>quRM;b6=r%PNU{cDE2Dqy}; zIBswXSAI!IU-Aspo7%q2ax(N!?RWx9?Cgod>n2C?l@mCQr-eLIJEtBL0JB8ls0U)4 zZEA0PKjb`Ml1~ieBV77sLcnxj?m9{0qNT59jzwF8A6>NcZ2;y|g^QHFC6KWfm`0D3 z7sG1ma(~^z8#buF9hQi6330_HhCHQmQd;#E*^})56JXhIjrvi}vDtiNkia zKzM+%-O!^@}?sE!@zX(N0&Dm-aUZH zY>F zD8NNZpBH{rz`PiQ3zxpFFaZ03*>akchfSq{_7>D19RdEBW{WlxKe}l4r5Ttz6fTl| zaY4o=V0xc!l4lxEGJO+)>9C^p^qmaMT7`?2zKy_qsc@0f$8q&OU{ci!LySFK`LTW{ z0^>VNrY}-`P~Ja*d0XM4$@>(TL(hpWkMF1yC=4!zi9#=Gb`wDrIwUn6mm?0pL4%~Kd$3K!1aFN4n&EpRRE{cphayB2zIos1XT=fjrY zF-Z6VV6MMO;zGt7LH2JF!jHQd`NfaUs9#gRl?%U{6h;8?FCziz3!|ss0yp>;DKC;9 zi19ZtE`=jHoF3%D<0N4Id21kjh92k%0p&Y;Zvyj;!bOtjgvT$ywRzei#t^$Ul=`#xY^xmV&Mjbnd;0nNS7qD^{C;v&rh zPC|-42gdfe#2I$Yq<>k!tpw&pg_G%PX(yY3+YiiXPe^$z=WzL53-7CeNqth{BIP$3 z;md$ITj7WfCy)Aa0Wjb5byc`X@_g_+;$If+68z{QrH}P{KQMR3{*8+2+!WnklWUsicvO!@ek51TKlfJNBZX@mm8LuJFgk!vYfJs(3*)E}1CLH6< z1ZIv|p6Pib*DV`?xj^9XBY>Hr za7Ow}dNl+%2QYO(^1|uCUf|9EX30x3UPG@;^+r2!2QV8H&M0SrOKya>aGb|)2j**q zGwRKRW4-+eOpljkyec2+d2K)*$7lV38KQ8J;$^wmfbl3?qFikJ1249rnxoJkMn0hbQU)e6UO;q)L0 z1@Wz9;2uzt7 zXUgxvz%2ykJcXmwaQXcS{L6qj_YE0uB>T+ty#~ym3di(?leZcCUfc1!0zW#L-1#IW4VNrcO$&d24?uD5*Mj{*^W*E=46E^`@$M*K?pC;H z>Dvj6>&Mp9_XaSDKee7d8!!tME>ikdBOez7GkA}b7inI*7T#w8)BhKVGuHJ?{Q}2B z=O_#=g$pnY>CT;XY#LMaHjVA190{r7sKN{eOgs*M#!}w;=}Hk-#1Er&%8K$|Ub-K#E%6T9ym-dFlQz z@=WEzamfY~E?l|n0&XjC_X`Udc^<{}=g$=em%@dUw;Mix0{5+j7B{jy_FGADaataJ zbj(pWd7PI`2j=k((dDsU-3?5)j?v|xkAT_tV^@)TGCSV>^IHJSZA-4bL6b6^V37knD_3u644jd%oHRPFajQ22LMkt(N zcTG6z-&9~K&GJn1LC#lC0p<#Yqh29>o6PIa)Q=m1c{WI1IDO%K@I7GONRs(5`e~CM zbOWyQ;izBy=!|>_Twwmj@kS~zc7-#_#e`$I%mSub;Z#1t&If(KG%H-Bcv*he0P~2# z8S$Fz8gVZH^K}p|T)BJ-+@HXFJlIq&CVA9@K1al98Tirhe>i!Y!FL1GFInPbK3duh zo+vgJm_mh%WH;FV&I0C}AyQtX@fyoH{YZ(yrEuZWM>}K#?zEv2Yv_R~zf9jfz&xjL zktaj2IWE-Hsn!r19xhkk@lOa1$gh()e^RaEDBk7$Fe< z!j;P$@Fz}c9XAQM%Uj@D_Jc!!djq)N6qb_1wM)*EdmI<1ZO4x;lHK5V<0oLcOqRGv z<$Mb~`T(X}}E{rbke#jdK%r0kid9)h?r^RX6_|YL)*z{cn4<|5R z7Dbmg9O3)BFfPH5j_oL1ezPF2449jFOg3C3{VRvxTfiKrjyR1}A9EqE9+;P>N0*lm zd6pS*S^<7^h8;KUS7CiD0Ol@kq=YllXBtnk-~SMp-3mu^xN$7UbscBLX$knzMZ&RP zO$H{zj5Cc-iE{(fpm0bo<83iM<-B$YFxLgi3s)Ze*sHk=^SXN+@9?Tz{P6PPY1 zN}RNl`aC&wd^!x6NeXA=H_Z6d3CvuDQ~78yKIJ;zJYamS$YZ&j4a^N@oT;62zV;9> z+k$Z6%4IijUjnmZwy9i9@@OXqo)o7Yj~^ZXhm*Gn{5il3oFj3O`We>SBw$JvE|R=g zfLj1ewnxe{^wg9-jwcrZbAiIKoWrG$>fEE|2=MQ(-8NE}Xo6koPliJsP6Rvmty2Fv}G#Qu?+* z-lf3IZ;URFad~iH4O-<3|9S(Un1G81( zBFSUF`Ytd@3#B|mpG|iBXvnKj7+eY$ZeB3~K5Kw`PGKX(TaI|&2PSiI^nB3n`hmGX z;SelrIq!hSmB9E;i7syi!v7PPqm~A6;p#0J-X{Wc+A@hV%Ei>qsi#jX3@(KWCy#pi z3UFVZ7Kk@oJ9j}s|K>QY7C*X3?Q#X=T@1`2XPDAwsyCiZ>`@pY5dXr}+i~Ep2JSh9 zrPOfw;QZ}R8TL=a=I|7KdOX{jCa0pVl7bhc>d+W*;PZ-SOV~-n(f;BEBb%U#C}9X~Q9*OKj)K``H6!ga?OIuFxi%uZyp561)<1`n zG@>kNL|uJNePw;ph!bklQc^(5CM=ZaO^(1#b<&9Ztn#E0IYmh$?78?3q&*iwW~3*L zSeQN<=W$3nZhX>+tl|QPtuV`us~L`h^fb_EZcm=ID94`d$g_J~#ZG5okz2BJiX9#( zy}Yp%7TE)L?%X1~H7fvjluejD%|Cne$T1^RMj(abQ_@n>XXE>#HBIGS_}Fl0Xwrz* zP&rM=NmLNL+ghCXBvJc9qgr_!a65&V4iue@?;PO}>~;$MTZ9;9vYm-B=P+3AVCYHg z%_+-aO>$*T)%9pF5*Ag@toZQw0`Ii;R8g>Ds;zI2#so`>tk<>k#g~*}3M)!*E|92U&#&dblX&2|*n@`|(UEcCxDBF3<&Ti@&%IJmZcp>Otr zu_IH1YTE5g8ZlEtqvcOEz1ckEmRQw6gy}NM$~1mKtgU6J+gx-p+8+Fpd7<1}pndR5 zQupT%#lQ{2Q*?)-U)+ffa*uX^=oi5_mLxXwh; zVIiye63|T0$3d}x*t`c+_s6C7I({rCy^_p*;y{$&3&EX3&=I-+13LzEb*}~I=6`-y zmvI7mu>XB|O8Z}!r_}$2d7=&a9>4l9{RnLf`;n*c%Y|{4?*BwT(w08pQ&m8EAF$hW zzc1)MY#+e#HunJz)dx%i-2nfhFnvHJZ2UO*CE-VB?gM(k|Ic8n8Po?j@R6+QlA7uz z-VF0_pydRKXaBbM^!tDR1SyRZq>h%Ld7-J-_&-tx$!Y&71@yM5|0xBOf^PS}z;hs% zY5qWaLc2d5wD>RC{Xk0+GY1+a-9eUe380)gYz~?^yz;+d=5PpR6uXg=UdUl}9loJf zSLVf}rK!%Z9i(+I=4e;Jo10AFI341wshM*hv8E%Y2f=9c0NOg#5*(*goNo=rwZ94< z3@i6kmx}=GuSN(A_DEt`jQ8DTAnny;c|Sni{{wN+Uu|d9cB4XguePCSx_`66>;4a^ z`}?39#D8S+|4!W>bCmSwcQffy)P1tL*Zm7j{(g0@r+204{!exPlS+SorBXku`|;|2 zuex`td&)EV+jx~oCX9N{{+1g@_NfWliRfRc`?EpEf}R9Q|2d#JpdL^s=v>efKubW& zK}$h7Nh||h1PWgBnV??K3qUJCuK}$Dy&bd)^dZn{(9NLpL0<)}1$`eBvYK~-)`RW= zZ2;vY@?_ASppBs1_~ZjU3KUb}=CPnnpc$YGK#vDq3`$))74#v{(?NL-z!{)?-*g4& zZqTzpJD_aVfc6GOnwz;#{zA|K(6yjm(2GI&y!tXwYUQ<{&wySB`ZeecpudCO2-*>4 zdlM)>Zhi-7I_RCCQ$X(qJqh%F&}z`9K^-UDU1CgZ2Omyqt6`VFXg z9L0AAtr5miQ&L+WKB}oOxHcBtf;)}d z0O$*Kh2!!XJB_I@XV`nuSmLj5H2RDw0)oV1a}{km%%5=jJVD~A(qC;|)%1I8 zI}}du1JxEVLq4|U2&d1{E;ZfXY`XuzbidPd|4Y!l(Z`HanPg1V4fZj#Gsh_Y2e3V( zaQ`9bIM9zk?Vz86P6Pc6v;_1^(33&G0$mD<{-F6Epu0e?0R0a17SP?GkAnUP`Yh;A zpznhI4Eil7USMec6?8A?pP;{kQaSzrW#0i_^Kj7ppg6yiJL;QH2ep9S4T^rJ`F>DT zX7eV{PM|y+WqodUWJ)CT$rXb$M7pbpT_LGwXb?ggOcx*UqSItG4B2OaBj z2<|%JnsvDyzlz|_F=(AaKD0IJCx*oeTh8(P>`%CduvibM3696q3IEM;8FQ^^$p1`} zuCh#qAm40{GyamUno=ngl%=aXy_E5C5LoOvILYdZYfd_-tUb~&K3yc9dGrVCU8Se^ z$}hj%q;CQf@DJhF3qeY-!K1!T>jn51V5NZNYbxXBKB4OR=+^Zc95a%`(P}7no zf4#@6KY=$y9|p*eN=~)UBetUjV4|_CLlksZBunMrEpN5CC@f)d<+GFxicP{YrT+K9 z^&N`83i`-$J{NQ}=xWd@pld-LpqGNu)?NqXYCi3br zwF%}Q;{)wl(3z-a>0%jA$u?n5n`jy=P~8PJjRR!U;H>gpyPDIiBjK*!-}tXb`mXY-Ysbv8GqF2I?PmsiwNlD}wb?42beJF7TFXY<4>k z9lHl}vtt|k0DdV5q_;6PsSm-6(xkXX@F^fiqj8t$n@mJYIt7C0s?i=fwxU|o>GzMy zTjL(X3E}jXSAy!GD?wrzeyO_Oi+u9_Y;`{$@{O_3CJ{vbW4*Fn9)#Qb75`=EKkFLf ziRR-#Uk5D!-40p~`WEO4(04&^1pNSXGw6q)&w+jf`YPxrpgTZuu2A#WpkIS_MSMF! zF)qjAn4@{;k>9m5B! zlevA~3!po=1+{3OPV9f4Uft-&?o}I}c*oW}@eQ~Wf~AISmu-}6v`35&u+|Yeo??Dk zM~8sULgh;rdwVpcsg2F?-`ZAIt4!*;|Ao45?k#oQf})@c(e>*DOa5b-QP&f3yH@cr zHWs>$^%bG(eL$(}2ZNS_;>E7!`Jg!eq`47vAm|Fv!Jz*HJp%M*&}7gjL5G6A06Glx z9nj&Rm@8;_VL+@M;f#Q0jOjJJJKx+H={XkEtjhzyr;+22j=FpxXh-}wCYug_uSp*m zhM0puPy9>zFryJO(ERGUYHkQA)OX^^QMOPEJsFU0aFQn|g)cGPFIV@vis&N{j>>5cX`SfwQF}L(7M-yi zDaP&VB~$!oxl(7KV_ZKI4rdfJv#ckAviq0HXY*3~Q?~ONK z2zor|HK0>LZv!m=eH;|;MT_x!5h&-1#h}z3ECM(G3_1g}1JW}Kv={3cl=Y2wN?YjA zLBLaAbVnWPj2m5tR^fWONrxDQ7`BhXw(F2kn&7x0F39QAFGFdJeu=%R?wA&qJN^ti zKL`0_`aGaaU$o(4V@R*&D@b~r99HRYROSf5kzo7VPxXV*6xbD_VX;c%>BG!ZqP zrw$K9D(R@>a^QNc^z9QAWm6pjKoR$!fp zt*2s277S(=$mu)W!2oXp_)B!BO_-N?e11Gxt@Vlhpq|5td>Rw+L$MS@5RP8_?sF?Jju24UZz;&`77C zx&o9sjYah4NucL|(tfW3Wj}B(=seKXpf#Z9fu0Gv2J|1G7l5*cE(6^NdO0X7;Y!dK zK(7LQ4fJYIJg?KR7~lLM=q;dMf!+%G9q65)9HZO?iZyKQZcvU@?ghnKw00k80_X#v zTw{3<^f1teK$*748yv6h;qf8X@^T?P6s z=!gH0x+?*UqR84Eju0mt2}VRbh>Cb|gNP9!lVpHMCJ8w>6d6Mjl1MHy6AlFoMwA$% z;=NvoxGuW7UZ{A3BH)UOii+2Yii(0OUMnif|9!8jYkDRJF{uCUK&M~7y6YYF>UC8$ z?(gHi8}|=!?~DAl;g0tz)~C29;r6NtP9Fb&CBM3b})o;>k`PpPHWH zOZ8@^r6#B5xUu^*>2#|%VsMp7XA8S&Q?hfiQq#v`6H|7MFF7M)e5%JfR!4|&Mi`Uk z9_wQQUrvS(*?5w3AS<0>heGLesEM$O#(GnHN!YhKJ`-D4Q`5&}_>i^7?S%*2j)h|` z8OxoW?a7j@Q_g4yA=>04(F!XaTWFEPM0Z+h3j9e59ih;kG>_Mlo&&|M&^S4XvE4an zMpAB$2i|KH&|U@PcqZpyzk$MaP`Kn2caGbajTT`0mUV;Xh;>+@k@nm_@ zlRX%3RN_cyxT#i@&N9O*)#{-mAE3}F8OgbVw`<@E#mm+&AqZO@9Tqqy%RN?7AC6qR zL3y{wCs)(h1Kcs@3(0&q(&MW&?yPK&FWH@*fsM%MzB4@1Q4DOS1IJ{gdeT$UrbwqS zpuG-2f8=Jd>A6{HCa{AJ%*x2fG3BxEnX;n}Gy$X)13Kvd^dE>LeMNMX9p5A9!*uKe zG&<9rGtM_AE5j=_utQxs6tz-;jD}gXDk)lrdQ-i@ayn}yxNM>)%M{>^}_uOfX(7_oY$ukzYWlTy> z%W$VqfJ}8GozcKsA(2khd3AC|3dt)u!<(6rj;d#4orNkm${AU=4mEegJYL541+(md7)I;*bEXi^jp3E*)M!MJ^O+-}ae(tX)e zAY7TAEX9Y^#4OrY*}^)gU1%(u!D1WbmYZqFdZfkRzRO+{xVgoaIg*>&Z679OaCm zED4OU7^-a*aCB${Z>Bpr2X+Tc6Arh@p45q+6w~%Tp^<5q$axshgV~5i6NT04+f=k1 zbfQny(L_A9*@#&lv1RNWk83s}dd8cXV-3(n4{%0=AZDj#lM}QN6>O2+gM*y$Mcm0d zSs7_2$H5^n8Znlw9V}b<4ROX7s>0aGOv8ZXP0jYYbHIf*zYldr&CE?oOU)h!-C=Z+ zEnmZ&@yOI^?kS-fiMGfqkc@T~&MfgkVzapi-s?V{PeX(o5C}nsD z6Atmkm;{Q@))k{KTRMiZItF8Tk}{IPkD0ldUU#~CtgCz%iyd)@ziK!V`*`}mU zCJa4B74P$o_u1;uloVxRQCFowBcMNU=u1ZOc#fD@sN5wsAI7x$wPHW7_DR8|fjzZ8 zocOQ$Zjmsk=+eU(wfznlLFVhV=6 zA}nf%%E6p{(bYt;sTCy0Xw+-hVZVVKp?d;+)<9iIH&e*CoSaNwF04{YlrIy*V--cAdJLic{iks#c>&9q8>yHBkr+3tVjC`<(JSGEnv=2;?<%3{gmP%tuI*svqns}IN zkzz)24lyBi)p9&(>F7V3c}$agnV4fd9#ojt8S_5W;FBo!Fx)e9B{{~GY^*Bj6#Lkr zYBs&MTY7~UAqo*=?d|5xn>!sZYfU68VsE!8g?_L?r`RWu4D;p+w_2^$MWZ6DENmkI zo2wY@EP2x)`7%X&3063Y#Bs2a+tr-?#mq^0B>}vI8mFAzdYz=-8m8lPsG<6vY23yk z@$@dCY$~N}>^ziC8HL7USz&4>nSH!(Om12lmdA98B_7}I0-nQlb~dI$>9GGqh8c!I z24U%*NuJ5xxuTZiti{XbFy;bT~XGpnm7uJ z%B%;+z<^QpxWx=n$trXIuuo6hdG| zXcroR3JNw0bXuy|RVQIYjj$TIro^}8Q>X8!!`3ikA%8PIPHhZ#WvTdC9+~KYT0VV5 z8&Z+eSdp%w716E1WGF{iol&}nMxo&&9*0EJ&~bFbrKD$z)DW$jC+O5nybvH`y*ymE zDa?^3ULj3E3@=&WSFnUhBF$6ol#!qvL?hXkjM-C~)RQRi zd$P})os8iNQAL*+w8qitK^!<4QQdY_`fP{>H)6=j!K?=*ag-nuT$t<|lQ{<6C3rhB z_zRJzu&gxe5JYwjA>-i4#B7*oz8p9u;p|c#73KqOMVXnCLMsg(6s)cwGgpe0N)&I1 zsYf~G3#wnfHm;CH2Q@HoN(s{?s8p^*(^{9RnOJ=E5DGf>kx?6;)+yS9iGf1Oes zA4(ZHQ?fHXAe?rgh)Q7y3>y_>Xi9&tynMRP5~v&B--pzi4Sx?5#khWt!B8*bP`RA{iEg#YE`Q zsMvqPz|G9cfpkH4(KBnj&s}xCcBV{D>xi<HWsHRNv{+fjs*bjtW+CZyIU4w~Fq&bqBo*b$4g1vwhLWgQE*8(s z$;k9!3h7C6>LskE*)5V1&P4q)?Uq~v1OMv^6gKZG&5=!)@}H)%IH zAW8KpO~&k;v5fUPCMwOpN|i$5O4XRd zahP@Zd|5d;sY!YM!sJpc^mWTS=FSL21+3h(4A={-&lXjm)D+k^;9Zi2@5oZY`DB4K zEI>%Z>zEW8!^4L`exhQp1`9a)NXz2s2;ny6M)NO!enn+rfv+-9HL_7ya#fzccx+)g zx1C|?rH-u|1(!=y>|rRSQGA?}7^ujvD7780{SooerXn_(G3@ZD*g;K34?8taVsh0+ zqZ)*ptky}$GqE)>6B2AImuF6q?KluMDnK_aC$9*z6i8)Lak8aLGXqs#@k5WPDlCL= zF)Ehpz8hue#@>oXwPx`jV5Dgj8)wRzmoDmKLYVMyUibnKf(FXx1UOrs&}PIvQgLq9~E2LREE{%{*t2d!h(2zaYa=? zvJOR=LYhQ3QyeAbLG-<CTa})yEa)Rl4~` ziX5ea<43{xi;DdS!>mfrlkQZI(7kW04iF6@>1I`w6pX^8E-H5XLC#dZ>2rA?o=$uW z!XGo$&MjA6;B(Z^2X?>$)~MKI3?x!G`l=+~R|1~J%Bhi|y|3EgNFEkG3N6V-W@r3P znI$Cnv3m`gXbKzpyJhOjmRyA`tO>|^MK9g>3f1iC)iZ*0{q0>qtEM*;r}U@KP+hT& zQ1m&hGm+3BMcJ#P;OvizU1d`&EHELVs&G2|t(v%pBkDS+ELBQ!kmppp@)4YAx63f8 zL@p_>tPV0RS)gB7BTFmF!*P)J&`9xpM_DJMkR3gA9Tey2E|f|(<`-!txMVaEzHHa- zHzYJ1;Xwwg+mt~F_1TH<*q!KPY()-^TpWuOTU5-LA=7~C?F4+goS)|pz<&`H`-n}p zit0dk{|eC$wBFM=7CUtE|!6L*_>N{>-Fh}fQnLT^1p zcfJDHlTE1d>M|etrpZix7uiFBG=;ykyTzAL9ViKi(w}a3KXp+2O^wrn?}CW3jg$x z;Ga=eJn*v`<6-V*7Z%PeD5-*nH!9ZOWQ+`aNT-b3;h9NglTlC*wxw~yd{k^%lQG7W z1!k1y75T9cDJphmlTqONE1T;pgnE#f;>BT#D_na@KS|@RMwSQJG*k9_<9Ym_D_Ntk z3^^)xr5WAyNb*~4=f)h6hiq>;$>xACTR*RQj$ZavSXLRBtJF_0kJj)dn2ZDLPqxl& zYIq8AD4`IOAIaJ9Znhbyh8EZnn5~PxZ)S{8=%9t*ZZuVxifnrZEf8AkzeBbVfTTHr zxmE#k@B6z~8o7_lvk!&9cziBOSz(Ab5ij#As>Hfz1!clbj#eb0#-KZG5KK8=Qbk3n zNHC`JN`K6#sG6Nu<*>6jDWYF%likfu@`jl>IJPY+wr(H%9h#;w=|jWyd@;zcVZmq( zmB%zwC{4yNQ;|)e12EDyC@}J3GOWjIdaGVC)}7%oHCBg}COz?^u?^rAD8fmIO_fKb zcTaPUh#3sDjD_jlR>)2p#f{VIJi8~FnwOYypE@!#h-*4hZq3ht-<84rJ)5J#rbT4G=lLfEBxaA_|$He zJw1~askw#8+1TqX7lA_PmHO4@$Hu+}>=T7EC!8_Ol;)3PNzO#Q4i4}Y6*fH+{ax4< z9pOcRSN70@j4=Q-p+c$J8g;^K{jS$l%--&)P_5E2B@t}V2b9Y zPLi`9f+TOM^}$d=VTKM`N^eYqouwhAa8P3g5WjIhaWOGB+mQ@+5}gje+9QCOjECF1 zlC85Ip8$3Ovv;w|WH*WBl=#z#rSQUATfmUk<3DD1NJ zj&keERJxmOmn$5)I4{32Ag-Rl;X$IV$|~^|JSz6t(7X~7u*t0y_-|~3XqMPRt+L#u zFM=wh6~e>rp(Y(|*TR$ZVXzv9_u&r6|M2G-E^ieV;5GK9YncXT2&> zRGe*d{h>wK=I$Jn_<*ew{^$}zOki@tT{fGDwWIvDoOE1bk3cr7((x9Q!IowRB<;ht z2*DqvGNnr15ROG3j44<9nR_FAbra#3&Z-F1Jw=TpaQPqB=E44G95y4bq?9jQ=+;`$ zI2bGkHzQv?C{cro3hDn~bDg42xRH4*NU%>9GV9bN`~3FIYz8?4dCs*(Wj`wzJ`3Ut zrww-A)DXzOQ0Zve_qW(hfop=Vu3&T<-D}?4B!!MIw(Bxfw)QES=)7!{IO%uF%=oeR z-X`^T%QVEdm58jXhTHRhW4)^>Ol$NY)(T@ihdn4vFM;nzEh@+Ia(f7qZl-Uvz40|= zoyrCVjo`)-2Ewqeyn`2#3VW7MfQ-v^4`1SNth6s)h+TZSro;UC|sM#)qZBF z3rps72$Q4o3cPusJ;G}_s^weCUeyaBh;bovRa%AO$CD#YFUb`3Sg!k zfI{76T?*6i@H}Lp*S?U^xhM*l@D)*N#0yB;~US$it$=gEmr>&PErdwX|x8Y1~MYl7Zba9-#=E zq$nb}9)K7>fWCN5PL1~cFvp4_uJY%CR<-{b@tlFdQ%l*wS=gz=h3eGP+?I_J)V@vb z%NDz30kBwund-%QOR_xJ%2glODJ9L9$_2ZF1`Qf4OA&^E5?G3mCRBJ9vAB{0E8COAUb+mSXiKtt zoa9=KzQpIl&x12oY##1mr7+1Z)(rWQrZn!SBSF87qJz5<-JOjUSBasc*R(z}vrGJm7R7xq=j7U#W!m#u? zO?u*F9oe0mDkCMAyMYz;H=je+yHSOZy|Xg8VpjGkuz;(<%)Vr{fL0p)QasT zWa*ic!^YZ$bLpgrFMSG;=ybJ8MwXk6E5VYks{G=)K{X?^N!%xGh6x*|s6x2Yh|3j4sJT|ru~e}i>mbeC_p+f8LTxg3H75Ji{{eAlah0X7iDj0Q@NAJ8 zXC-Jz^<|2nAlqM*mHfGU6}+X^waRMJPeJUU{5z;EL`vBwk%r40hf5+QU%e`l9W+nj zlG9Q%Ws5hJU>R`9Zak{>NT|OxTiG2V=E=60C(9$%tSplW2(NR2qP;rtFk}XX$68H? z)P^isJug@#S+YuZCD)CjnugSB=_o74#gtg+&GC{{JEE0T8z$=NG7+JQ(o#wgwV+$I zL(~_IU%Z2NjG;!$$d(Z=z{%TmN+L$cCeZ?<<3*f~p{Pa?7U zUOWUh$1@hIS1H}EHA08$At*AAYTTHaRajYyX{R3_g&$W?m5!J9RVDc;@;1yb>~o*! zo2FKcu^VYS7){cm=|Fbo@^lkh)~wOQDP?_g<-7N$9bCQnQe%7*4I$O<1T|8#d88B; zUFDT#i#JQUh$RMX8!1x!w~&b-+V0d4^+#I)pUJXdgrIM+oQ`DY0(6)up7dO=*ct;s z)wESw9VY9LI)Dkw6-}qGFL9r0~5$PJ<1gqaO2sm;bt5T!L}WMHEzOLqw3dQlESHxZ)qH_{Fs$%!!1d{7Ex~do7z>iB8KRdSAL@@F}9; z7gKtWJ+_8b%;xe?DfB3IZcvNqrNwL;jRUmb*asv9*QcAs>EtCce<;t;n0pM^R1f@+ z&PCTC3#lg5=YYuZ75cZJWX25WV2+wdWkJvA{mCNoE0`09<+PINLS5Qbs1-~r8HXVp z`ol}geM4t5yhU87Ne63ov%%p!T$+zHK!L)dimJJzq-3g9qf^;-DmqqPv>dC;Mf9i& z+9U%Ld9OQKz!4Oz$kC14P-f-(@&b5aI2}$Ye?kIwt)y3|9VuMr_*CN z^HHmYDOJi=3DBuoh4~d#1tN)T?f@L2HO8F{g$D@=eK=0{2&tYn{XLV- zWJU_5740ygS?DwwBWx`}21OhzICbN^c~+jU6drrY;uFvg8v--NtGz@dC%3TJs+0zI zBA&x$cS^p<`qCYGdY!|OM&O& zOOLzl!||od*>zc{p4kf{iK~&LY^51GMCkVeq?5L3rae)k(vZH@TW4xG>Q%z;mJk2B z`OF1dM&FIHL}@z4k?yJKsm|@CHVcYD*fWIuwjmL|3yHPnL?>txkh8gQDJWgxX*ib9 z1o!!9gbyDEkz_U_(0f8WnRijXej0>GO=$!zUsRIcLbbQ-ZW=1{9iHy#8261J(%d-A z*%zr9K@KPXa3%~JDOFg78<%pie?@3<5<*h5;oi!_0Zr^-P9BxAXTt7y5>FHL4T}i& zh_ehPOhiTlWSVBTOE;6MXrxjc z>a-RQ5B;NOiu&ML)B-)tx4+UDaRopVa{pPg&Hzd($CO6SI~HAydT2)v)gmow)Lj|X zbW3p-PPtc`cf{VIfb$?hFLy7YCSp4@uR^J@xl!Aj;?%4Y^YB%a60BHiK@)JY&F$0P zln@P(k{8I6j-G(tP&<-jBFK)WZCN&57V&{f%=>agLIWmZ2`pC178dB<)L^B45uPT85j|@E>E)&#>%B-k`r1NsUHt*LQ>`7 z6o(d>(6NV9n7bCSQd3I&mE1Ze#t+X&L^>Q(l8*J3!XFeE?t%u|-U2On_8JvL&}5-i zCiP8|F@`=Ed33TMc}jL(HrY#}p{Oflvl^w1W)S;G6#C~OMvcSd37LSBK4dT{+suW? zHsmo(_(hwxhj?%p%I2}14o^K(^SlP8Hb*W9)3W!Wv}~shXWD!8SeBgTai`~I`o>}h zExj(-9IUqZ%RX236t}9upiNRX>lq}Oa>qeQv7NL+p`*tc9WA^_-u-t-qiv@3X&Xyi z;&v_c##-Z}rD*?X2Rf@LDv2BF*dFetV-;oG&Ge2*mpW9Uuf%R+$I<(Qs1nc}8TvB4 zDZ)X}j%sk14TGW{5mkhmtT`IW%WRkS`NVeTWIx%RDpk0iLw)kB0KG%(Px@Dba@rh$ zZFyByZ^CLBBAL_P_GyEg_5x4IuuZUJaCa(pkFlLyCTlRvL|E2x@P>X1{S~yOJcex!qQfKCjY{0a@$A zvu>z_=)=mw@dNrGFS=P}hCy=#T9$Seg_s9uiY3U?OSLV?f#Lx4lYW1JX;cZ_476`J zA(1*L0jK`pn+QSSWd!vV_m=97rQe|swszrJ1~^$MqU5OQ&p-UimL6*t%yf?&_z2E( zE)o2+Lnq+#x4%{mz45}FLsu`m8|P9B{*_;D8GQ3e-)0y4&aWHQ?z#`;dyUBFqE1^Q zr$r1Kd&R|{j7q+XnH-M-Vj`})yleSKONUMQAma9}hxC468%~ZF{5|P0ah>j7I3;_{ z(SN(C`UiZD4Zptd>X(=0J-qy!gJS#_<2y3#ng7n2Yo<-j zJLcXSjym{=vY+pH1tYoOzpv@s?#lzKKf7_wxV04@bf~hd2LxZcdG4dp-TVKzEq>WY z#iw623*U7Re9@EBqjHxXd1I$LPJen&(TuV9P&AZhOvGQhw}11xhIRMu*;yLVaP3xD zb>)JO={oJ3)V!H<1C?iHB;@7q!nfT7->%!0?{s;kPvZLnPd<9|i`n?t$xgxFH16z9 z$JQP{?X=nf^L-i92g99$F9O6wblrLPbvOBYu6{G`@rPm(s{7*`$AZ8A>wDk%SMjPb zDIK1_?}F%A$YYb>@5+j+<0h8W(bW8f4l+#BX{>^9O zyqhemM({~zyqW*PSud3CPCw(I+F`G*wydWFzpBTe5s_0qTk-c94R0Klvg$5;cT?~~ zrw%x-;O0&DT=(_q~N-mlLuZ~5IN|{d6u0P@I81!z&2}hlLP|^&`I>E*KZ#((*qh{VP>xqmH zkG*q4T}CS8PVh$$IpW6Ku818rf9p#R4Vye~8_t0j{QEBt`R=yecf50ARgb%}7JRu1 zawquA#hsVkGw3$DSor_G1vUH=%?2LI3ElLb;m?3>$~Nn!{5B- zTKCHj4f^H2ZCAt1DEQ)4z245b{piF;j>^nR+i`22WnCxu^tCsv{P+FV_HWxw?Oof^ zgVFO%!N30ERhN%m_S)jBmJNM=;QQ-O#Wy*jgJL35$DO+2aPrvhzSFZ2)8qT{HeD4m=9Q)w_Z~GHU%C_Ep@b?emdx(O+dC*61 zZQF9m{Oz}P>)iK{C(gn5Rl73(1GgU0{;aMuFVDQ}@1JEI`UL1ZQ}B0}{XBZ;wZCNF zvg6L_AN=QAKfcK(_|9)ENiDkj`IvQ|&b)r=wHHjr8AaWg&*ryU=i zC)7R!YfA8E_kaJvvr6WE{ch)re|`Ivx__dd1;6Hl)6RV4+v^Ihxvuczck|AC6K9+Y z{*jHxU$JYsb?8g6ryTQC*-gOFZip!S_KXS;YYt!#J>LQ(_{1J$L>$Q(nLG{EG%w+&JyTH|~Re5d3EUvZ}AzExT`6*_H#ReRo?T zl)m5xbULm7sa@uL_u7lS7v6mKmuv7n0KwmV&G?Kbqt1Q*?1U88;pf%@-=jP8zw6P% z>Q){zef*sV^y+o?q!q8A{(|4VwnO~KffJ*DS{7gMcJHdC=pVt~8FlgIrFpZ@PaB=J zs`7(NAdg!F|J;OL4_)%+M{CyJRr|z@iC4|R`E#&5Vj`-hJy-Qc;Dl?hn3Oo6*{^M^FD^QxEsX3;t8|ZUA4pxKZ#co~s!Cp#Sz4vk&-c%hqf9y@#{p1^>d` zCGHzzigu5m{O`h={Li-H^w~J(f7Ue(HJ5cf;?{~Kv&Qd;y#+Gi6Z~=8yl2n*=fH@0 z$4~fj+U6+8+)}~U-+%8rlX9=k`f^?B89kRz_zd6b6MX)%TUMSqZw=i4f0^66@Q8($ z)%zgkf6lFUJ@I`>>A$DPj@wn5(erA{I$Q8>bgQ`M+1ek!e&_x-y_u(7`HN-UD)pf+u1kvO3=~;_Nf~ zejMBJ zWi1f=+|=W4Y`AUk`B#shS9#nME2=H)X~7RZan+GCA3xlE*n(5{yn4$&4#W4C1^?r~ z!iNVx{?N|${hl4--y07dd1_CV+v~0L=o9+9`D?F?^`8VrzjKLYoiF&UUnjhE^3X9? z^*Z*(hu(N}T{^~b!SC{a{rH;7|NOf8rmz0f`|#s2?(7!))n9H%sr+a8h$Y7!F<|b! z>vrQCzgW5&6LCS88xm6QzUD7eKJIee+SnHmf0p1Q9-8oT;Wt0k6+AxYA89A1euD33 z2!77c-to1&=gm0v_1)Fqzcdf>^_}1|rj4n%ultsaFJ3<7ro6WnVEjD;Ya?SK9=mx# z&&Mx4c=+cR-ZW-G>eH8l4+Vcw;TyA_KmC}y&v`KY*@BDSz7ldO`2O48_<7A|EAHAI zf5)2J4*eP96jyb|M2vpnk%u0!{QXZZ-F4XWqv_$!68wk{);xQ%75V(=T`P+JT{{nQ zeYN0U-L;_psTn5>eDm**9e&Ck6G5-n1iy019?!}%7XN^63*>J*<)a#W4-YhmiMVC? z%)i|GZuU(p3*LYEjh8zF@I4a2-?grK+cOjUCVhF*;A8XdZU-KDSMcBW*nG>?A0@W? z;FVs(^6%TS3*YO*bPW2c=r5~hTy(;OuO5EilXd0oZ{pi&g3ma2>V>;jXB|59#j#Ho z?CEj}^p)WI7v2B+JF5SwbMa+3!8aWLOV?eK?>Of3bN;^hwKW+(;Uv!^ znE$wIe)*vD_Oaa;SO0R#<%ON0H!=jDQE}&#B`5CsV!`V9XFjttfN}pS!5=d1p4p%N z`?3uy4?N90p zKQ8dbl$gU`>QTJ@melSSSAlO2k7xcLcF1nOcG|bUd{mV3Q+@f_Pr(im{FLOHtW&O; z-s_T|qL*Cz;Kie0_X>Vw!ZRP9aR2-h?yBB?!&S>xZNPWY1%FG2fy>u7{O8nv9XKNP z#q|KO4F9~^oM zzO5(t&%XTh*DL3l?QkPL{v-HDUjI-1_XobYa9Q3Z-9O5l0r|Z}@aHU@cKpT# zqfgzu?%VqBKRawO>ZQ|O+8c9grxSaei!(+0F#qo^Onb21&?D|UGSh!^*P@|b@TcH&zYAnu z;Y(lm*0TC{k|V!|oURxA%ct$keD}D~%fCFnTl}i^^I@w-f+u1kt}nmx?sIy+z4V4# z3tpJ;>6hc-;}HBp@5K*y?)AozN32*mKCSQN*JE4|{4cZrzWj^tzkDX|g{7GXoVTDD z-zpLO_#F#e`;BIVOfcPDz>UmufSHmVN(OeB~=BO_Xg%p zRf|FU+h-b2tr|Lbgd_@EB|0^~qO7ceEc=uAE+)Usfa&iz@VwK@~4)R=a*I&6i&^@viXvVHYZ1F9LcaB zsl1?S ze^UEP_J>@Y7(T46^;D{&t*OyR zMFk})^&i$ovo+S|ufP)ik~Rw=RX`bzwVAE+OG~gU(hSgg zJS?fq_rV~M6E^pwhHAl5%NaD!2^dL-v^6b+s9X!d@6|OpHVX$NS4|BHy2cF1&u_^B zYrcU6(~F7=OZPGGw9M|5wf*R$l8XF*Ry1wyrhO^@V1I!qL-#?^7F!Ezv$SM-%gt>u zgVK^RoSN8j2F;TTgAk6XYB_a_#rxH1s%=t>92Ls)_hlHiSiIhPyFnd|G$cIzV zO8xyy%J$_6A`^Lu_ZZdv2SK`7edRVZNByudHb~ZTPz$KY4?vPp*p;I zMb-9+CWkAmn{IRe&LN9%JxvSD-(ny6XIEmqaA3v&a9Nu(!5eri18Z~g{cQurTI!#c z%5R>@I6pG;-8MN3$_mS{ioB)LTciNEbjIw0HYca60@}OH>FrIkZO$NHWW3GEq3YDx z8g0%2wkbyZmX%D46qo}Na1(c%Yd|T+vC(Z#4;spu6>SybeA?z!fi{;97E;zkn{$|p zvkvxQ0JKN~W6ZR<2Guw$IuGYl?++iKAD{}_Tm?VIx_wxUEp`G$dB4h+FD5cMFT#+RB2`qW$4=CFX4{90V%gmyk72UJPxO`!uIo zNbWDL#Mi<`>__GOINxYLlAAesbA$9gE8k`}S?PI&b1E@SZENiz)ou6S(g}-`ecLRV z7+(Et_hh2Jy3?MG<#N*t=WAIV|;v{^yqNVmC<9KG?VUUay#b z&VCGN{>nmacDI@AAe(mM{>zp7DKBs;ywjI;=eXVb3F+E*4`?T*{%)z`t_`}Q)QD2G01u4d8KpxSbOEKsIJP#V|fL>fPkHn`(UFMGoH=;%=_g?R(`Cu za&r0fp@US~HZwu^Yg>Lj5ho7YpHG~cABOO$1p8Sk^gIp&@>f(%4SvdTKeOD|+e1BN zlBFYkat6isDV$yze;RHjmGOKY7Jp*=G(iAQgnIC+hY<)x;Z&qPJR$-Ap zzCZDqf@dUzWpW#vp9!o#t01;!j?`iJAk+v|$69QxpL`5U4?9`Mb+WAI07YBgsKJimrq)&&MvYj9T>98cb3&Ms@I z!7Vqq`wZ?OgL}r{o-?>D2KS!9#b7_hX5`$-N(8iBYM-JZmz9X!5N{})hFsPdtZK$W zbhPqx4Y{l|>^j&YxJ(VXtU1^zz?`G4c^YzAYXGS-p4X7e+IWZ^Z(;f~gj%Nl5KLk(`U!6h49hQVbUoX_C$4X(oA{04V{!POev6$W>;!7Vko4(H7~IDO_m#nYYjArFu08f7u!me$Hw{Hw2O3;&gFD*b1{&N@ zgBxdXX$Cj>aLf7uId`%a1L_z-s$Qlcm-Ql`-9qVCG~}}4urJ_8!S&RT%Q_3tPlC(S zkjuIg(9eRqTSG4ED?ob$_pOGYeXtMU7r~9xkjq*Dh_#Bg?$MCT+6_q6Z;yt+CGmE= zp&D{o*#^V^V(n&)u>p+7$*x-&fxMK}&sKK3VaNO;#@*8V#Jj_7hCK+75 z!4(;t-{58&T&=-fVsKX*-1P=`kHOtvN~cfg2El3A=Jv?`WW0+K$l3ZVve({1}QC0 zLoTZv&|<+=X$aB-h$*72JsNUZUhF1OX(wpNWsN?;j+d+!!aQuR=qxZVc`MgR3{VD-7-qgIi&6X#=qLNosn7hN7*THRQ6= z2ddC$D@#KzYns7LH@I?xt1`F+26v&sU2bq!8QiS~ce}y;!{8n?xTg*7S%ceRaPJx1 zm4mPwO7?|ZPAd+sv4p~qpevQa#@!d+?58m z4bTmeOWaWG3j`Ex_0*8d`WVn(1oxSSK;L011?s0Emv!7pcG`X#a#yR}8(fCLWgDE&;PMTw!r=S{cY(px8r&5I zceTMSHMr#lcb~yMWN;e{Zll5Fxv~GzVtWfU;tW7|KFSVF=|gS-e89@Emb9tavQ@vMUO~;o|ixHy~ z{X77%O7Rcp=9H9|;4__-ld7=ljR0^}h>uS-IF z6_)zV0u*nbX%?>+g~ns`OMJzQcpUIqSOvyZzdyQP$V;Wx47)hc?T_VayS)C^DDePzPMZ#Ndj@H5wOx5xANPPXxXOSF;gd_gRU!YT!>~CL9)t z!_S!~%X2>4bw~uh23I^T{_Hr3fO+NC?>uL3F#xMz8UJS1?u-&(=<}Hkp6?2l6Itio zd5%@@-C4V)^L9S3_t3e3d0m6|TS0Vt#LATLn7s!vWSwVE1Vg{kp-~egbdU*c$I!2J zXiS!bW}49U^`1V+FMdLO?qON=o}Pf?03)8KGhoThuE<{e>ODK_z26nobz#|4>OVQ_ z*?4QC`u%sd?;MN&+SIZ*yJgL`uU`}N+f>Z1Q5{_8*;Vh^RPXIv7ge9TsooP)m(-!& zyQw}mu5LmULe?i%GBQx>-2s7eH?2>aBM?L9*`W(-2;nE$99DPXMTC)T;bK8c!1@a> zvmaP!&$`7|sub%lye1g1zUBt|f$49yA5ijzx7iP#P3vmz;DeO0+D0?ZTKfSNtl3~c zFsqIB1EX!SADGovQ{n z4L8*Do{e>$ZAd8W>D@M=!Mjr;0YwqCAL};=w%a3{ z7QGgTv$5duO%7RO9(E8ybc)rBR(D%81DOG}aLo$VM$s3n6+!k=PoPcRg{u*YO4qI; zU{&`lz6!Tu!tzJOtX^rlZ3Sk9P9`K2TL%;OM*Kz87yqiGVH!;TAOa%*n~b!YeL^V ziMBw9(1TCb&H;_k>L=?b%*)c*1G{Q5iwndsUpZLKy{qcHD-o+>eeTLEJKkc?XH3|j z`J>w-p3fGo4kX#Z^-`q)wL3f4Z>%fa%pxWGI?w$Lo(-WT+|%Gyiskd!&>hINy~!om z#%_;nSoA{Rqg-pLO;@lb>pSu15$+OCkbC25?;TAnnRPyk@uq2AtHx{v_o#SYl5Z%>WSw;swxPF zDB(FqJ=+3Bl(Jkx&4lNKpC>@f>pXjE=kKBR8D{gGqZ-gY^|^a$A7`Z*=cH!hc=yyk zW~<5JO~+XUv<0%3owK*zyQh8$v()WIW1%_sbbDm+9gOorpu>)_I|icQdKtH%i4dQo z3&x*4^@}$Ef?2gkIv=qXU&sNC8eD=|4=ouxE*-j>Mo|Zt4o%2!{4zwfoc5kQ*r5Ly zWIxt<-a}W_N7cvH()cCeR%~2LcDI_sED!ZrRLMUh3Jr*z@f=&u3P*N4(#n zJ>BZP?@4XdaF-B##8?*SMH4ehR~d~}Q6UsNVmW?9VVpH6EgL9uD@)pOEW&CZqcX4p zaS|6*73Hw^RSe*)(pCo6=Weabr8*87QaxKj*+M$1Is0+p&co1d-DNPPf>v@v!&c-g z4YWHhh^bq&1%bs;NPCXeuxJ||G9@Z`3(YQO^fqtzP{-mvYLy?b>} z)viT@W7Obkr(d+~S7fhbfZ^V_Ixmco?d+>{i#|Z+R(%8OBQ;ReI9gZAwi_}XF&0aj z9laVFSTPRg!PF|O+auR9+eNQcXV*(hYgdUu7XW2?!b*w*&&GhLodJWA5~Y4IqwIYZ zHQaGH#wJ9GLzEaq=?pk3*Z{juHsONZ>Li?Z*U*=wLEv>rb~EVxZZcQ1UFVVY%!tp5BRJRwEU;Pjw}iWy!0 z*sKY)x?5X~P^)8_j-w)@z`BJSm~AfV5>_rRHJKrxWVDd#Jm#CU!6%x)9;I z|Gc}mqgd!dD!YT3z@h9^*p9=17EPy~7o#YhOqWU(9`b9X&lm38hEkf+Psm%#pem)I zAr5L#DrNMQ!7N^MAOa0b8T_S!Z=QLiy(x7t>R{uIuqgkwKtEYO4l{Qc2krK5g4R>^ zLMJc_-=VJaKqq;h)Lq2c(CFIvF;?}VYRVrRz?EHtp4oATWbGK+P0;5*p$kw_?c+57 zU`T#}zvoz@T-DsD7>Gm~gyZIDR;dHG&fmSa+eJ?!2t=sM-GHJor(5qKcfseenFg(5 zM%eTqpP1|zfQrVh_iXEoz=qt-7#Y`lR#VY7c(#f;6=MYsU+>x3PNMDN0DyYedB3aA zU0wTZ1ne%12cFf`jX%77=nD^W3r2^Su?`ySddm;;e> zVeckl8m?W5+?C;5yEdwB(LGWm|JE&9fxnuQ>l^qmp_fxO%tWh|&={)3x}<=r zjr5eN1UidMV-)dmim7z$K@*J*6 zd_M!na|?ubxz>FsIL=A}^twPa0?9Xa)Wyu5OrUi^(p?oiYwCk9)DFC zvB*`GaTFj`#t=ZNj6{RWG`ML7$Hf_IB)@9_sWR39qC7`hZvawdd=7{&;v%iD0DUG< zFNg%|6K9PD^oc;FfK*-12lO=J##t8vqHc?`mH>KLaJK+@OrU!JtrTb_p#Mm`R{(ts zDAIZ#&_@DsTFMacGi`R{;k7u*AYJ`m`6K+6Ss4bZ;?+6w3nfj$MK;#rt?{Z()=fKsG zc>p~txN`wfxFW3v1KkctrCk9?wPPJ1RfBDSRJk2H*`;*_q*{3(pg5_0yulpfjZ*V>$8%U3$^k20K_{E(8U6s3uv}LHGouKT@9#0(%uY6<$NC? zE;EX=_5xZcP+xQk7j{KjBLJx~vH+$@LsuSo5K&sB006mYKF$MtQ;;cw( zHy~B}?r;yO+V=sZYJVCaRr@J`R1LT=UDbdK(^Uim`apad zMsWQBJtEL(KzB;H(*XTdpfVG$9*}CUdS&=I(!l1$+ryZ>#~65!1J2ZNPM@fTq|WuH ze>YT_@~ap-n7nfk+>e|*Tb1Kw%5(5*sT|>;-Oi$>JXdd5VN(-T;3Py>L41t5F@Q~D z0PDuU;VN4^2G@A-X_aGn=hN>5-~EJbW- z)fKw_m(u=iAq~beJve|dRL83i>7e1JZjAqX z=3(b$-&sE94bA>oKI6b1ZT8oiI@)E}ZFQD!_eoO)IP+#b{uko1jjM5Cf`Gr2v`9#Z z+EW*a?@_BAcaivtpCvLEX^jK430I_*iNCK1G#P(i7U*pJeMz8F{C!=Z%kX!LK-b{! zn*!a8zi$Y%0)M{{Xe0i1LZ?MqI|2P7xbN_Hk3jtUvp}4l(6@v-1Nu>*I6#zj)EN*b z!l*O;RtYo?f9cO9ZOH-)jWoApaMED0w#vv=M*r5QtN>y9IgOLLS)9Zi%KxZcCXNq00v=@49faV6sl;JOvpH@J=g+oj_=3)lU) z*5Nt|H~;oUTE)xzL9ccsJkiFYSd>dK0sQrETvAZ0(1?DRSG!DatW20%P7 z{;oKd+f&ptb6SIIq7@U1oB1&f;|#`?c9M;b2;1VCkl>kv&mM3S^Eh>+a6$skV(=AU zou>~UDJ=%0b&s*jwR2JTc-*>K(Xkk2_a>tRe22mh4vmhDLcl>iv0}<(($zXeK6K24 zCn1E-hw}ly*?4XT`s4Qvu0#U*$2ROn;T>@wrg8tkyEL}zKHLw+{eIk!$Nd4^+13Yf z?~MCbxH?&rH584d$O`8YJDQ=6Uz&JiW`&E=kjs#q0ta}3ty?g zkhWex%s7kv6;8v$fOGa^I1MR^lfr1oG;Aw+$jbgrG)(npR0lF1*2Ts;>#Dz9xjNm-wr2R7?tIi;d%j0A_Ahk7m1$0@G60 zos5+2B0|}pY1nn$aE%>~Kk|#fVSxz=zKL@5s?R>fbL2jSBL0Mal2WgSuc&HGl2P%a z5)u~td4;u-%EQqcBB~;E6cy@fMLt4`e1wARt~4BVDkds>;Qg;pimG#CG29;Y-kiN0 zj}%R_{&5H;{cIYBvwkj8b_t^&(~y2g;p){4{qU^`f8bA{qD{mvJp~bBh;8|o~YWb5do}|*fT+7R2Fk-(WGkq1gYY{Q}$Gjf*3wN^#iUYA^jJ^ z?+P2An1({y7uT-f_#~=Q9dF$lJ=s>(dNw{zgpZrV7ZjEj2DrbZpb*C}Rr6HsV_PXe z4?9OZC_=P@USrkkgjBB+3ii5F89Ei<3DV0=^{qYjH>Ut=k@D0qsjjdB0W+Z}B1x80K0Zw=YIF-+xC%T1oBB=tdd&Y<1}Z!l^Dve-2}c{)80$ z2?gmNrYxr-ux-lnT%;TsMs}yNjQMXR`-1;by6b5M$;=^6k(rPpGoc`vn-lYah}AT` z_a){XF_(NQjNVQ$x5DY2iX&|Epw4`=O9I6{p7J(QbZZr+Y87R^ynG&jWDFpFX}&e` z+wTw52}+myOvPDe>IsAR-)>1O70q6ISg{q&FF-gIjT&k=U??6WqSIeU*Q@p;%R1+m+Yg8s*gD}HZbBGEE(UW7P#1JYV;NsSp&=sU1E#b zYijJsjrU@85a$OSRn8SHr=oVJ2<~)1TvHM!-V9pUak5HqgoHL_Z`2?KU4>42<2XFg z$?`R>i*b#z`0h-8K3`$6-jdsA^ypzhVI@5ip>YxuC%8Rs_ryVi6WvMtn|Owm;!Iy% z&hr#!RO3sag@IP*(TCJ!eZI$)62^fwz;O~-fom;zL;afOzzQ4$Og(v;FdtiP|Lh)6 zoaC|+Vz)yO4ATs^v?=0qru`qEG7-UG7eV z@Og%Q{+E8Pbv*0Ah+IxDmHn#$KrWBMJxwF80avpxuEm{oxE}X0xZi+#I_`K$Q!^F! z8*wki9qSWn*l#!E&cTkl0SA-;BA4NSG7Y(`d4T9XiMDDqy@(V^zhYdsX3<7#!afD;(e1s(AMr+ye%;!QklF)%ihejzP^V^Ww4byH9!t zl`N31&*O@-4#nTokV~W$4`{96KrwlV(wY|lkvx0vE_v>8mGp9SJldKO1wj3_}m2*m4U=&)W+n@q=~-dit<2S2@Zr5BgW@1 z%&)F0OdLWza)vY4Fg>zgIUDWrE$Z$L(=Kc;C2A3_4g1h8suugBTDoiZ%sMIz9PNmY z9AfQaP`6~G7DI61*Sv0_Gn_wLw_KneEnBxh3CNGnqFbn0iZzlqX)}Zc%X7pVPTXIi zA=nRh;?5eZz&!=`yKtxWxf}O0aK8ulLfr4gy$tvJaIePwe%#rI58zHs!_i4;8uFyl zG=y*z2}1c|Hd^XI2uHZ#FH_(c9Symx@qkp?3=O$t#fXZ>*EWP)7GJw6+!F@3-r)Eu zR>gbE;NCU3T?Y4^!ErP{26b$Ura2wC?2o2lZzxT})<^O!gV|KTMdF2A#~({oaVFN} z*JEKde6V|J6Rg0&biqQ|?8Xj4Y=ml8yBhl`_w4wP@1RcM^5Un^B4GmgV=u_%b}i;K zu0x#*>!R0VVuFU_9Y!YZlT;l5v^!N`ZYba`!cF3VVwBNlx68G%1($$J3tQTyPX5NQ^ME=jtThDCf|d2 zTv+7GEH9j+3{DQ$Q&bFV7lJ54;S$7pb8L1>&`NMV+ww5(ECKDUIU4uJa6bw6$8k@> z{Yl(u$$=m>({aZF0FflT*sWndtihcUL~X4sS3=5iCFGJN0}A)7j_0zrYA9M({;GJp z4Q`K#mkRCev9h2CbF2*9<6&E*TG@Dtw~_^ug=2IwC02@cB+?~Y3D6RmIO?GS$HG)u zc{tV~9?MHgaCk}~4#k*ic>(h%hzdMa;6RlC!Y2af$3YQ!h!v0g1Aq&FtH9GKI4Wik z(oIC(Q&D<4?rA7B1vQ(BV}hy?o4J?ZJ{L7;<~>nf1c$1oSdqRH;_YAfdxme3^69Yo zx6|L!ez=`7oE87KXRUk-W#(-E+f8ZZ?9xoYWgw(j(MzYqijWd3LNeEG-3cGfPWW23 z(VmM$@r5YLX`u}SPFZN908wt^AP+5BXn6>wg=YW4EwoAm40YO44hwDc;2`}&=5&dZ z&wyAuCW2uGSW5|EUs1nvNy+J9`ki$>4p$bged%`xYZ~`~vz0T-IS&tjonn>cy`RmMrbr|(jMr2)}^1uFNMBl8*jrs0rzFNQ_tUyI~k5@N?Agr zy|RP|xvX;$S|B)DP=s8vY=le=8}Sr1Vpk$%B#dZXdo7d zo6w;qltLNVj-e@lRL(T2-XdNq1ucd~FV5Wfrc2|+RZU@A$w$*rn7B--)u>|ldlizw=W*)MJfESTd5S2*OZD@A z^z%afyc^F->ya%dYb=!5xBU#hgb1 zx>9hMG-)=aWuO=vl+n9C5&$Vd;RvIku_m4ukP?8VSUeY@EwT7#2%jFt;!HyppMdM^ z-^}6*es3PPd6>)n__KNV81-n8hsopA6a3jSF?QU|#iWyf!!ZVVlNlJ(BrRow4R4JISRb@G9a} z>u*of%I+^iMP>Nuti72tfv7Zol6borxU+rtcL}A$ScnWc7Eh`gbPTf;Q63*#=Zg|Kf3{FYG(`xD3sV`Ws|N!<}s+nIJP( zAB|51nb=O~&KkBgO_ObUj~U-$0zk0@Y|G zJnKwS(QF@vi$54#LMn_tH3#B33-{A-&&Hi?%f+1%_n09aAw@buIAUIhM#}~bg$wFF zc%G{dI_E60Z5#%UI_#^S2T8Wy!8Sw*i@u1298gaf~8A#DjdNT_*Wz@;QmOV&HCGHh)6Vqi(H*pn~arp6Efi#84-G@8tIzVjbAoI1|R9TMJmWOc= zg^@kZ-u=Bf2!_mWWt}FqG3ywvjY~AAoTE8oroMBViQ*7KibDwDt1rk!;kIi?+ydrx zl74w)zw(h4M9+~qzsE&pw0}ne;5^3ug%6UCBA_a)o0*21l`3HV?<}ZQSmkRkFLKrk zMd@EW?)FO{Gw^lQZ+mF01aNk}>H0*SiZ|9fT)XkPP8OY(i{ zOSL1b@qziG^1_06e{n@sKrP$LFV3s-;rr4h0e@KdsPHw~p~+>Zi*H<>U%SXk0$3I1 zd~BtF`~x)>-AXc&$kbfEiFu{XTA7=a)-(40iR~0scsh@w3L!-mLN1H*B83~Iq1L|w zn81@ocTupoUtjL<{qvE>l^FyKuf|7i%WHu5P-OUPfKf2N;=~pkD$qD&H@{iiwGg3k zEK&a`md=G5@hG9*>Ctz-1{gHDk6MrrxZC zZIAc{(HPbKvA-sF44pr`i3vBIRBz#)hWi%WsU~rUK#l}N8Bni72)ShMGM8pV%c~?p z_|7H%G6lYKsUeq@51CMDi!_Aq)&NrRZq|^Cg7`U#X=xn?Tb_pmadLv#^LUE0s4Tff zKho+AXszHV$N*&PI)a-0F^qY#^6HJoR)Jv7guYswu#9;)kCLtP?$Rox-m5f=ew%1N zI*&nv#m$$ApG)R6`JcrVDO-Fmk>(`gSv8E+`5spvT=owWgGTe-zNk3!{2Et_x?}Kv zo9_63sF2nj1JVEg4$~d%+rGF`a6R{@>y8C~it?a^YX8Vz>SrqtE~f1P6vu9^jtx~F z;ktwU6|Or5VDRRA2?vnL(wRYeF#iPot#k)DU+E4)N_T7*+)GGDNa+ryP`ZPV%PN3$ zsIl<`PN8IOcqaz2g1 zb;h&8HA^TQ()NTM*(}eoL5Q>l@6d^?@ zg(IO9&f#3ZyY9r!C%U87>=rjxQ^G=fz!nsMjT}|$fLjtq1E!&yfogEWpDrx^lJi=- z`(`~VClf98DkWSwvmN2W@&@{xZF>`Uwh!mlieb0M(14Jl0U<>Lg(D3V&ZdFhL#a>a zr7IB=If>Ks(!PCBqbb$pq{ikyof?H@m4UgfocD&3qczm{KvQF@rpAYw8W9-El#O#L-4?gLj+Gepjg7`>e83qtO)S z{JEcDn&E)1LTDToqbbcC2mhpHjg!$3&KiBt=*5880dd?+qoJn6|6YW0wqmP*@Ok!$ zDC;5T)YdW2&I=^|$;PtV-Kq(FD)w7E=B#wseEh$;;(Z4H?^Ye-8|POa;<_Si$RM8` zhwElsZ~o~@Do?qt$>{daX87Qaxz!HCezViCx4m@LNbAe2@GIx48qyQ({BUO*Ih^3X zd3m)93XARj8h17u=WNL`%5QOJUwnr<{RUj^rEGu7ezcVc93hwVC{N9c7CV=aOHSo; z3GRN#I3aw=8Go5ev~{J1TvjZ!g39k84Y{nzfK_JS+;q`YnKCQxhjIX*6k zBR$bL>{1QtZhR9gw<+E2*?@EU_d|D!&w?#;YHsRlnq_L)^Ca|m9Nr4qTDl65>cWKv zYD!CAk5DJ`hHGieC~>f>V|}wjOHa?spZQ;^r{Okz+*#`|HT_>*bLi>+-MVukLQVY| zu5ja?yhe?+7}q<0x~3-0#hP@o`)|uP@wl_CN8(PE#-rkuCZ;Sa zP5giCT?v4dRrUWKgE&4=M;#T-^npMih^&gBFf7Aj3=YdED*6~^9?ZZnGtMI5f}^O3 zh)bE8nnLbrW@=_;ii(P+rbYj(%q6KXNYOM&N&dgzIrrXgdjk&@wDQ9D?wNDXIp1B* zJ$L=?C6tuS3i}G~pP(a@^zK64?kKo>43rf6ODXNWEAUGw>FtY}ukyZPprps^C6%t! zK%cQCJ^-)&EG#h-sFs+CR!jU8<7Z2~S?nE98v9x%NBW7!+!&yJ%r;f zKyxJYr-0P(uX0c}!_Te3tO>RT(D3)b$MxBgRykC>Rt zx*K}wE4E<%{{!NWiE=H6weYWuba`2JJ@7n>=Z`zwkhkX9j?gpfE_Zi4HwC=!#Ra@xl z?u}P!2bYsAJs{-MOo21 zR7J`!)5coC+BV+ckAjvny+^}mi-HoCz4pW4vn~#YKMwu~_%q;RiKB&iQw*QAgE!Xb ztQR4j^&*s%+iDco4mCk>2NPcxt`Jj z3nUw4CCkhSc3`uC_~Iy(&^^lq(!P&G$p(j#CxTY%X&TT73C#e~dU`gX8K{7Ta%+#) zQ}#Es?sC~s7tH^sB9t8VuJ3hmb`eg( zZce6kGJK|Y3VbRTFLBfkI3ewT6H3a#UW#M4TXE51(T@z#Ik6s2j&6Erd1Cf$B1wPZAHYLQ1 zIkkicX$cY15>gyXNO87=0%ss&^zHA~c&x3c`<1O0*THx-qi2gOT9MvH*sYP`A`gp; zt7bi0DXws@GX7O;bW{5$zqrFzr%rmPs7(ms7H}!RTm|KMVh170QlIRhzj7Hv;6&SZ zK^&}LOmDP;{npb8_7Z&N1HS8*3dWmLwfG2W@exXT{E9(w0}SMUW#VQzwsJqfG)U6< z4!pk=(?~_zQi-yqoE<4q@~}j^;rVet{D_Nx=bZIh=D~wMg9HA*i?{klj;4y=l4?#8 z(wrm|&o#3t2~%*bWXaZAi$hT$8zWf~Y%Ok#binM;>9q2i?Wx)B28`|co*Yfx4aft( zfY9MU5tX|lBBVt`NQy|lWW$cvO^fE|d(FE%RlJc(wQf&N{^3x=;RQWMa9bb0G{%3F zA(i%hJY7g<+yMBTfU=I}iCsg|vYmehPjpg_JfvY2-tn9JD$482E2_qNm#|E_s0)BbJ&4I>6X6(%S4*A^N6Jc4S>} z_G&P2jBp{p+cr08Hv{SkT`ZJCk+ctfH*mUI_A@{?i&6Te<5&Yox4QickaFwvGIm}%JIo811_rnGWjExa>WPLY|fFUtxC!*BPg zubj)O%K&Ur3(OOLSz5f`B;2k40+m+(FH4KpKYXqenz`4lzF(Hse^6=Z`LVm8AM&lp zAc=jG?&y=SAM<)-khJ}0skOzF@e4ah)^Tj0j=f`U54k(AJ>*%yZY4a+G&MWs9l_^z zj1a-kB-z(XA3JkqYn!K;7woFzzuP=L2Q$x{AgO`>UHEh1KLWoNKJ%=OKK|yODxH~T zuTy8H3E`L!P;nnfd--UR5KibvpYl|}abAZ|(ksGi8w5AXKuPZ{bYmL@_pX7G-U{>< z`L_1nN&_XmaTrbLdrJ(I^zH+sbPpJaJ5KCu^$UU7YU#DVi9~phqkAm?zAjnxS{pl^ z{ldTF)7cMY-K(OVV1GKhD}-tn`Dh0n3+M?vg|a*_4@qg~oq)er3J&G88Gv)hJ#p6O z)@@%u9GL@1$8ct}PE|7l^*(QAuiod)EZ6(I=L_U!;Wj;0gk0sIW7AW^S+E%0YOa9m6ogC_Ks_*x+CqtoI7ke#Wx?1bu9o`d0A#P206K{PVr5FPfaX?-xL0E z@cY6)9{y1HQ{j(alVe>>Ie*dxyvKp-{OIW$8&kcVY{Af7cl zzRXAQqR_f+E_XYz`+dYXJ-WJ~u?hP@bU{*35u#V}C&bL&cyqE`-@R<)8 zQ-0i{qUA?O%a4#w^(u~2y^0HzALhfFxCc&m!~t-d;qpT};ZX69Dd;&i|IvT7L1DA< zqug7~y7#2vZ4JXw0Mr1EUgxYyjTSlW0cR@f2pat2@LL)=*SQk|h z&N@d|s>#Fbsl&75_rRs6R99}ZesBXE=XdG8kL+@)K%;3L(?wNa+C~{<6^fpJSHovE z&xOAq{CfC@!9NxLMEH&HnIBE?Sui~GLsf;4stTc`$JR=5c~BL_bu>_WF$9VWsE<_t z0%!zxQ0A9PYq4l$0Zalc!qT=Eu}$b8m#EaVTF|s#ENIah_|by?H*nF;9(kB}D%0P0 zye%l3SzS|;<7BmK0oZwC9g%8Z+SDMI$}rK*cyQZQGcI@{4GYut`1BKu*lHfrPlaH< z^}<8<1`3#YvIc%<_y#m0mIJKG-!3;hlQ&$=CIWP;jQR8(#2T!BMBL5oiRUM*tOi zV*q_eaI7si3T`@}D+R~Qc^^*~Jl07~vVXv*vUNo^qEjl9_}!2Jmjw6G2WBwSQ*npt z4&9UY_2E! z6T0VI6sG|`)Px-dOU%EyJDYCd9{Trb`ltM@HInJ3BjdLFx`^PKx>-1gG1Jh1iD|iAbt`h296Cn$r%vvJp?EOD?q-shRM*T)S5M42x_rDY z4>}>+ZywVf9cv-9P`)UBOvLk*QM*e`BAyRjw2{9Qxaf^<|>Dh0pk`Kyf3Hc!|1mJg-B0UpK|Ow7|Gv;LKy04w5TzD zv?KsO*gQnD_bG`E*M1SW=+O=?oY6yg zxPyc0LSyl+L;)?0_ZS`>5WOR~A^3ZPKwk&+cY(51CY@);A zF~j=AED7#u<`vDux&#kBsAVM4cM`4b?s4s71Z4ACH(nr}ouQVH$ zpGI0oMy7(9Ki%+fF0MbSwK_E%fz%Hk9QZ@b2J4Y^Hgo+mEux3j9RksaT!@cNme{{Il9d4t;ahrnjvi{J7 z`W=e+L3ukN_)Wa2og9bt1pd+v#ruLw;qR4#!%xWlOTt-X9|`0ePHQM~?K&{GwCnIs zfkLk_f6$PqO{2o7O|z{fCq;}M;JnA~AZQ~NoRN#Riu(fR>sh>2JO|-NMU(*Wldr{mM_sigdKM0o4uKQ^t*|i+ppPILxHV6dKq?WvM`#(S$Uk2_?NBflF~eHc--g)Zu8a zl#Xi_O81(>Sql*;q_qf?yJuJ~+Ii;IDspC@6lGU4m`BmlI0NCMBc(wemIh1wuq}3@ z7k-+4wB$F3#lhU>yQ8^%zRB$iOm1@^sJSgCEP2zwLkOS37^uCs!r^Q#=DJOpl0L05 zxCn1Ai{xt181&m>u6_pAzztSZsi`fmJ7Yjdb(B!R7;J6a#zE$%9k(q-RJJs3>$SzK z`84`w7gi3z8`9|}Hg*A9$&tA#6(P+YLRls@vv>Ao1vJv($FbY!&7j7X z=kJPF>vevQfxn%cjN3(U!|=CS9@AIFEQ1&)#?Ptvo_W3zQb$GB7o>QN{k96LT z3i9RLc^6(c5y*xo+7D-(*;r1;(|b$pK(rZPLann2&Y>S}RiYQ(WmJN#gq_{H72Oj4 zU1~(zUU-xF+qD|3U#uM3r)Jq{pPCRpvP0;>f}3xkr1z5HXfIc+k{9R2L06P_Zv!R0 zV*xR=J->z$D9NvF46efA>Kv}o;XY0OxjWt&oRHhrUNO_Fy83J;TXj0I`VYtJ)VNyLaoBq zdu%e;xMX;)kb8wx467aqK)91 za5(BkX>De{u0gZszYh7D9$!~6M{34y=B@VH>zU^7S3ni$Pt_YVJ?0%(qT0i+Bm(YV znCNDHeh8oanUCOO%<64|-x>bD;U5M6WB6m>Z-ze(eqty6sJ0FKa{QeKzXE<+_{XULncmsx z*1F{j5zOT7$-}(thi7?2H+Rst zKRe_#qWHGbBCP?J0!+oH3cF8#ct;b-FQiTn_b>bD9$;kNQ8#H`*b}9@J)z6v--l0~ z;{7?QQ-oBf2qooCV8u~a6zBIo&4vjxraBTFI&mAdN7NEq-h6+w$Ih*KFGb3nJUio| z&AU2U<|FHBo64(eGYvRzr!kW*Z=Ro)3wP3Tc=SvhTgUwAj&eoTNi8J4v5l4|zr54(B&6j@DCrf0 zTyf(Jl=P-MT&2U=GS)AQv(;mo$zZCYW%@9}7e~sJJSJY75J#`T|_Wgml*$!s4&60G|$s1p9Sz)mw3pQ<~zWhBjFU@$1<=cBU%R2@Sa4X!1X#o>ZS0o4A>S8ij;vha`xDpTxw4A zg0skFSc3=0zbw{U&vw`s{yCPt`*xf)k~!-3sBm?RMf)UbW4cs3L(&z9>PHGhQCmA4 zHkMO`BaE%(p-HMAgj7EWCB5rVT8dj{pezHmMe7TfLt1DD%HopOo+@5L?2_WwuZBaPEU;AO|)~e!&L#& zJ;Kz?XiLxnTnZ2KmyQ}6yoK!zr2N|8NGv#l8|xpEWHod1UKEwP}d%@nRLcIY!fk%(c znTYoUkIg{_ZbqPUxgP&MUgWSqm|{KdW|BbY?S$99KL;y&vczO>#O^UX?c`od-^%W_ zfX=IAk%9ab{k0}=o@|sfo&SDS!m}bxnlXRs?NGo7AJ zG%Q-#q5q2Jg9JU>n_Zzm8yi@-Xk(%|@vIApvlp6AwlHDAsU$u7l-=1zi6B2}n}`On zoyUo|dcjR{bSDDB_kswmakx_f)d=o1K-B`B2?z=UIx2Cr1I)D|U%BH`A??9=OJvwg z9uC29EwS&*;Q@WEp9fD7Xe;EFr0e=+y3iylQ&xX&un**QCKaa7~As8VYf)Pr3 zdm;A~x37Vc-oXy{HHYi(a7Q@Yc!w)>xX$Rv^4z`@{F(UmPwnfBcr+rU(i@C_X zkvkS)wFo5-Pi;N~pHBp3`td3UO$~S|z@aA*ZjZMQMI44oKGY$WdJdvJ_wW$pQ+Ka3 z&Uk4uu`WlPE5R`m6U{y0k4LJQZsM!K&0IM)lG%MoLrIv)%(z!>2FCPh6}; zx><5OZ;`n=)A+TL8#5&LNER~%E9WHAB2LU7 zQre+mSkU-2w<=XbvPu0Fq~iD|7+-vxWQ^}IT#uT!_w3W-4CVt@tWtrR-@fW(AQw3< zM{UtfY2N_U&g%l4TGL*D)JhI@xRHR)6S}d0&Jkz=AhnVw1G*TvLOHd4p@h;5sJwFl zsk|#3j@xZi-t~ag>fQuMTB->}*F zfUWFC*ka~i6Z{k4H^cuSd`_c21s@vF@-qCh;ID(f5I*zzZ1}X{^HHv9!wIPkCzSLG zQCf=QcYBKK;&9y^Zh*saAyw%{IUKizDsGCyO?9{$hpTtETW*xojxglxH#OOCTu zVF?A>B)^NiM7G3bvsUOid0Vnpw4Kr2NaSH{W6gPne~8nCm-IMu$i1wk4IZ2xlWCf} z0R73P94F47hQP?8Ngw+P_x6 zbR0-I#-H^|dTCIUB1zY<7#x_^5KO8+qggh+4J@M@LBU$H`&rg4Lcdj!ntX;@J z*S_FeIjLQLfX_6(44<`Xnag=Xn)8J8NLI!1NLIz6R)v=ZCN5gvee!X~FNdV?0&Hf( z;*!-^aAg3NQHK<-=50Z%my{Kl+k$v2;gFJo#*S4>P*&N-TJApC^^49b^qO~i6W2-N z8wPWMA-$s9+(E-qQSq^u*3#NcH{Ybiq_&EsavRzbj$;D*DM~9|K?1VfF!JES;3P*j)0-QDjhMq4P zj3Zn(P_i9YLKWfwD&{l9Aa;zqHcN_M?)eyVRif1Do0gQl%oNC* zUhcUH%mwZ&CB1ADnO%U)mb?;Km<>jOb1@K`6OD9t=~eoalX&cko*aBPYEnCIKa{{@ zc-na<;#X%E(tv&_p&39rLr@QBCMs5;cLAVHD9l3dGC;Hmg>v1v9_V$u3#C*ICi?04YZs z@F_=oKo{a^C+E=V+pfXi`nI0|QjV2?RPqaeZWqb_2GmQym;#8cWKwSoR9YOh6J-MvSH=Rtg9VcURzm{X(){lYAe4~wd%Sps#@PKb4|8d;wX)6 z(6#=u#?e3i00~?Tkvm&e+7Kz&{gpN3jb>OAHe?(eBP*W z4ScSuUkjffe0&#vC-^tO$0liS8GKy6Ll5B`ntu_4F13H~+kZ-##({9EAP4gamT zKW_O6{M+#N6Yy_`|2+IV;IDyyC;WEEfxF@F4*y>G2g1J({-N-H41WmxpTK9y{1pCF z_z%HvhW{}91@KqEUj`pjp)EYS2-C|gtKhGM{~P#>2j&;NC-L`N@Sldya~z(7pMw8O z_$IHX|fs)>Phygj;dm9au^w?ilUap!dFMICa7rN^Wlw?dj_T$?#jshjUw&?wE z+|l04HxPOim^$K!p}jZMK-k2TZ{Pchfs)?-yI9@MMR-Th z6$SqQ%pI$!b>dJ;F^AIh?89)vbcnD#C>@7`EeP#~C0#a0RbqkbiPJu&+y0`)=Y zeFCw{-!D)VpdSlV4~U8;-@JyW#1^d|zZ{{V=`b>WwkKjfDKBU7J%*>9tQ9Z$qmy1@>|6EPLX6ET&JCt@nD(&4Hc?$exz`7~k~`~V+` z2|1R=+d@NQ^_)QF({r4J*;H4Ts;R4;<&M3}^)xGHn0~kaj6nDaIllG<2|>%X%?Dxr zS~%I891204&{D^9C82V&nyOkkurk}4-Bym4{DZuU@qHgp7xN~1R4C&4&_$PFF9j~T zDS$j^zvXDj1G!2fPA4&fF~<>cfpp}!6t*7(%BFx%ceG@+r$(Edca-hz@^FFTdn15xYvOZP_^I~rvu)(<#k^2(M1*H4B)nOXi{p63bOFiXo%bA z+g)O&KU`y8fpUT2fySwu3ngGt)EZ@=tx#nkq{=`@cZ(=)1?UxLb1~OLlgPEb4^29F zi@Ew49Gc{+p`KhpZCUGbjgaOVq2TJXUGUn(MU=Ku6L4ue>Iv03YJ0e_vL)No7v0z2 zMz+?Fhqi}XAFddPA8}?w()RcYAN!iNhu9pgq5HVsT0=RpAw9FMVQzVi?6I`QY71Zd zGtZ)5{LeNE+dO$gs{$b{R6K4ri-}-8Pb~q*?j4RMObQ68q+# zJS=G@Z~^BP#A!)y+c*5%`6@j(Fc!pOfxeddFi@9OHAfp44)SB6q%8KyJZl0b}-J_zFT1C=a|?G28)MMWh(WLw(sB&)J`{7(Qts*x6Fa zbG>}S>3cBC8P{l*Uxo}}{4a;kG<*|2^`1-Jn&pHv%LygD^(M5vx4}Rz%bDT!6N=EW z>bTRXl{{ys0DXu7C2>2qEA*;vK3pfs(cZO?aH!dmL0Lj=qWp?z$kB!%(NID~h!6PIO z!HY)%SBUTDJg<|4a!-%$?wJKhza3iOaNOs8pwKM>bPgJkcJf`Nemis>a3hgx*>!g% zLJRQZ z7*BlPL+Oa)qCMrtOht1;M$fok6HH%ZJIQ}Z8r>}B6)4YLBgZFE2fE?87taB$G$G;g z-4Q#WchnoDm&Yn#9cq$sG-RAWjb0GozBIEw=5PB^Fq^v~ zgQLeXq20uPchl=AbVml_@6qtDfIkNQGWcWR-wuBqd^USLTuWzNX_LD_UI<5M0snKji)L17rQbcw6#8Kjlh$rIAmCkM@rCQr-ldhCLqt zQr?;Pm%^u9*+0{Z^7k;G>+y5EnfMT_0jrE$VLVEtlDY}F6pTza{Q7@u__n{pe)1Ro z(9EtH<~oN?_18J{ZUXuJKfm{fPm1LOqMjr2AKlnS$4$FKH(URBs5?Tb%Y5jf!`HWf ziynqRo}KY@#?$?CH^8 zO`BVf6WMNn7*9E1ZIF3RUN6l5-Acq^}aQtvv>83f{bcg%0 zMbra7{Lh%vI7p)opL+Aa5Y8%W`(Yd7BA<^BNBb52e7u*J%IVMz9^Ijz$NMqj;U4__ z+COR|I9HT)!8C=wl-}v^$rns{&din;OuxD(2*iEX3#PVZ_zK<-|8|gz%vx0lX;mTQ zn{l_k#l@S)+ar!+5uSZSyAMJU=v=e`=II7QA|oL3uu?Mvc8eOpN#(WGO*xHts%x8i zMK;}MJ1aINLz~ng+d$iGC>DFZ7!k?QHg`Zax-aNy5ILuzrA$amnb4L>xdh>#td!qH zDgS&6rJRVCvO6(gUNyEi@Ca@_avL{(R@Ti;mseEa3Q0G?k!~uVl}qvU+Kwurrxb^e zI-r{Tm!u>|J==^CvC}g>4T82oHI0yJ8X;fP0#`LXH5?)Qj!{et;rH=$AfLvH&g=FQ@Y$BxDL`aWUP~1vGCs`*qgKX64%wdbp+T@+a^OF`AzqfAZr;6W0 zg+ngBM*|HZv0Us09N%gkb8#2^L0V2UW?N4p4{4aP^CJ~@Ti01bA7}?70@=o;;InJV z`v@AX`C`+>QBE@g(L3d3?ruFPxIV$Say^OZAxw7@a+>kK89tTZ7Whodt?(HIegLl} zKuAk~kgh8!ZiAsy|(m>Gm2+@=)M&_o2xr;I>71! zNC!^E4##f($;ifbI5W)-oXP;{z^NY4#UgL9gRTN}qHr*#DwztYl2lmXE)PquL*eY7;$6ggp6pSoGZ@YHyeHcGT?X78mxI2z4oV zc2pLd9d!$P9Fz4n9CjjfviaK{%yoMt{P{q*ZupTeK1vOm9`lRCG#cDdM8MtPc`eMt zW$>rNUk?8P_$c3&Kfu2U{@>x>44?VTs!2`b;;dFlLRuvWC1r9_aXnCGiW_L4_HzA@ z;))%P=Zq+hm)9sSx2`CT{ZPdlhuIfBwyfc5n@z=+!EgrxIb8gzO-0x*9yV zxwfJzQ!yt~i8HF|7vwTP%W=qc$k45H!t8KXmVHK7H#F+KTTGjv#+MsRfyIo<07LV| zj#?i))-jFI^RPbLRrck0o8U9;|AtT5Gmu$on+U0GBBWDFisO`$;y9hXw73IGKHruy zRAck*_m^#!(qDqo$Kc1H( zO>}{oKMi#Y^scl|cGuBoQD(e+ie+{g;upMpDp+DnM|9)RYo3+nhYC-^L}S;!go}A`>*k)?BzECp$L?fe|WLl$f?KQ zMas|e3&#a4qB}wn7^>IoRS`!k z%>~*ABYHs|(sahNETk8M2b(Wla+nkQWF-m9Q8u^kv`lX5wKcPDJFu}YueWIDts=NR z0D)d=&~7lF*h>wT{ld1om~ak!=HI#Ssb@T$M$4X%mOY`QSA`N#T#bRG?0JOIR-5w< z`e}tW+}v`i5MTU92+wXRdLopL(V}C+%_M+9RAM#!(<3TD9@4N8`CddNXb*BLu3YBV zv`F!qEG`9HPA#=9L06TtHPlQ~w4t8bLB2!wPJqv}o(P}$#AAlE_y}q75z>9qisL?M z#j&Aw9l5n&M<1=NbmGubqbK(+P#ON;+)yJqOb;c7MM+;y-xbmIKBKHQ1pUf(|< z28D9Oi+18h0;d{K>Yx(<{Z;7j6YIoP0!MsM7x*_Hng_0Je=DL3mS;M`vUK9oWv&;; zij0ZZiaGPj8!A6L6-jN+?wlS39jxX|Z&XjF?4~CEIQYzm^+9v~qK$1EJI=-z%I}E=RWWpF@q4No zxFYS**W1`$Aa~(E-W}nW<5h*&x&eg))DG87+b@gRPW=T>c9T$o5Jq330G}qI9efB8 zHNcqKJ0YS5w-W^-CQ3lz?!>J2^yTa#-yTRWZK9Vg~8+q9>7=Ob=v@m_W;FGQe8KT8YNQ;+H zQqK8P+(%x3eN(*NSscmyLb;C?7*$`@N7fh2vMOAIuk&oOR&&WJ}V=i zFwt((%|Sq*U1#mFj&a+7tY_KSsrJSM&I7^UnAs6cU`4D#blvprl+i zuDI764nW9V4Q|cf8wH{c+$>Ot%=|$e(6VRdT^pjaIz^i6Lm|SvTu}Ito70d^IG7}H zR>g|U-}HPH)7Kc~!F=vhLgi}^tPtO+n!@_@rf3^q^*)|1c&uYy5^r5pXU<1JQAB6R zL!F^Ep21{`i|Ne5PpmYY&E!rcI(NmqT9lxEFdk9;I1_roDB%Pi(GS*h)el0dAB2+L z4?v~39~mg=t#Y_$9nNO6TPe@St#wV@_~e^?`x#t&!}V#u1pNl&Op4@sFW{K#tQ8Ae z&-KsXGf-D~rCw5#zUOk0kme$x!02eJ7OV^Ut$MEJC%0f%Aue08VDnnfmrtyWuGxcZ zv%`Y=Y3@f|qb(l|N|q`ygJ{F|N^m-VzMon8u~>nTAWuaE`rf&2U1R;e>RZPjMSSuQ*m^ z4BVN;6c)9Gti8lj+3XHpf% z0=cMo^VSN4O)y=wKwbr|WeWvzN3=jnn;O#S4)5r~VEm;j1Pg zv@o87&%$^fKE+eZwJ->2VGv4s{76A@+%u^-6vm?U`Bk^>Vph8GEf;#F&NAW3z5F3% z9h&y3y4|Pnk9WqTcTWt4{?%r2$;KsR8}-O)tf?#Tpo;m z>q#EcaL37QQLPz?MUZq|{b#B+IxE-u7APHzS;a@J0xkvEwn|%^Kr1kHUWjC&gjRr4 zsZ!yC+Q`fj#S0?Y>He2Ad*sRQn03_7h5aS3?67cb$Qf9uEmr+Nav`7f4K~fwIlH!p4oPCWfr(v#@+5R!uTJIn6<-z(NEFA9delpT(u+Kr7 zeev8EEu1o0cKO1tw;;+{Tne}>Wlj_;M>8I?>57$_IqD{9ZK=z8OVA$VW+ZHV?*p0E zF@K}WGuLB?#yrQd^)1ZzWoF36#Wk(Bgj7igB}pMmZ|%LC45XdtEzj}d%7aflpUZw@ zp5DHRHF!~MiEMS z^HCy-!^D9=qES^tz$Wcgv=g*$7j%ObJ=S(HK3?P1Egd)$kdMyHk~WJI>)tr|arBK$ zA7&pw+J~V|Lnql>yT&5DzOeLiA>xx?sdc|=R=S*;5w^Mk(6t>6Yvb|yu#OAkZVMijAg%fPs z`8OZVeN>{PACDA}hn zdjGP!DqV@~K~zwjt=4`I=BlVsu+e8~vxiFj2+47X}jOOX-sGy8H)-7cd?wO{-u6KD#Nb{7CR#?Tc!YYmxR<|y0 zcJq$9b&kLsFzvW#homfFGXv?g?c&op+0PZePAKx+aa zEj2=V!JOg>P!kk~QsWXe?us*mqAG~+>>LV)MSJ4Ue}TQ7m`D928h^&R9%v}UF$#3i zO7k>u(IO%b74INCE3y|+eI53eWg2psTvPi7QCVCHxGfY>xIj=kI+T$D;k^7lMx?!7 z8h^68!DhueriDesyy<0-IImtR)-Lebg-gO`THBkV;>42{6(KDuLP=?M6vr-};<)or zaV$Q?Mej|nMZ|0HFNKe3>*Pb$COJSpu>TnQj5o`6#iiJ)vX(K$0)gG066u*rCFL+m zE9qf?_HVV4a!sA74{8Aa=EG)`PxKZe%frHdG^7EMU5eXvU*acd8L3Q6s8n42&L}qI z4a{kTQ;Zr;(BveBPsfG|r;}H8(-t0Y6nrsaVaY=pZc=9d}imgnFz|DT6Xh2cDcDhwf27(z*py&uKhX&@Q7aCW{Cy#lfO zk?QZy&NurMtTKNTWELB>k zNRISWVF;zGGWJk)PD zvbws1HWk;v=Lq#W_{_ua!l#09l%fhoNEM7wQYP~h$8R$fM>D_mxkhVzw)){lt4=23)vGdrVA=Ta76YY!lLGcJfxw?dggO5CwOfZmjW(J z6SghpBxE_%PDCeQnD(fdm;rOZ{HTEcRrrrARbB2v0(ZxQs%J5eqg;#)y*${EcgQa;-Y6%s90ZJRT;dpMla7%Jf@7qO zoF}D8>xFm)_b_#HI8MuGpQi>;>tm$T5y}RtwJ{P8-1uq4tdNHd)M0r5Nt8e4vyqDfm!9nLzp`{1N#3Tkt2qzXCpaz74+-{*~}qrdPqIcCj(inm|Zv z0->aL541vY_ZtY;!8zOu4mZ*pjFDU^`dxMCb+IQl*Gu8><7!MtW^lsnG_M43g@iYP zW+r-SDIA(!jj(1=bJB7$aLryNaCP|WNbJ+=1HR*MKHxNbiZlWKc$|4V3diD2gY*m@ z_VpGZ{%kH!^!DES!@K6bSp5Et6CSC3`SdPyqHT3U0XxeENNA~GmUpd43$Gh(oRp6w{ z-qn@6%s&seztPGT&CHZH_3qOrfj20ocV$DSqUp2@5FW94363+vu6HF@9=c2>mYbUL z5)VD?d7NGIUGIj<@}_eAo7O8YQN$vK`|B^)oTE^e$zu*5FleCENTKn1&uC=9ieql% zCAyfu!XCru=(q8D`>&Ff^1KA`q3DnpCm^bWN+9jQ7&2GZ*RZQBN#fn2S2#bG_aDz9)RHUl}ga zgt?L-t{aZu4?O|_6El18gl;$fA_hT7%tL;x%LTh9Wnbc_)9cjW``vc>1)!*0+djc$1 zso^3`n2U4WKG$obO9uH|XBjTigt@rgz~{Q`&vRfJ?YnqYH63ZfTp`d zT%-webqaBXbK`8oMVc^I=MWeEfV1zq({Pa{%ylp@e!9Ze2G@^^BTbmAONc9MZT@Yz zNE7Dj8sZ9Dn{I5l;7AkZ>IRG-!?4|$V7N#V=K5NQE1a$chKn>|uI?eOaJsHHT%-we z^$2l=)3wrYktWP_NQf(JMgL~FNE7Cg5v2415afk(qkzpg9BIN_y@2uaFl-M887|U< zxeg6+h3#Rb;UZ0#t9OViY_TslT%-we9TwukA8=NCA2eK~33K%U#!pwclwUPmqzQBN z4RM7_xh*?2aHI)y^#jI#S2z!Q7%tL;x%zK`>lDL98cpjJz|elP3Mpm~x>U4$KBftn zl*6E(IcUJZ{sY)b(|F~11~U-GFpN3kfhcAWcS{Dj2K1XA#q?hh#SGXG#T=23$cE$$ zIv|1>*mpn}Gw6uJi$a)zeU9uqKZ@!1QWP^_Z4@(bEMD!u9deGqAwXfwpp9Wn-+_mZ zMV1D*`VKs@G=e$2-_!_Z&=J$4m_aKdm?Qge?1|n8 zYql@vV_?)V6?A*D>ncvtHJ^hbO&AAQd5QO+k!*eUJ@128l#aiLf-41IXo&FkXElLS zOz%b!B$y-co0q5&7*}+)f9Xa8!plcz_BHsLtHeJ7%v|_>oG(PzwLFBGh!QFbVfII! z9}~j70SrgSzMNao!K?(vkMrz(bUnw%9EOe|Yo#BbjxZXxhUDyp4&4nQ%x>(giL<%- z6=1Fa#((=h?3x*;IX@tVnHa;&i(#&dVIGWOeig&4jbS#&FuT(jhGKX~3{&DTHl-KD zFn@|+-gX$zXx*;pJl=zM`T5fZ9m8e7_+_yXmrc?l*7!oB~SbH~@?ZyzEw z>+uU?ByO;S_UvRa_U+?==>v=8Yu$Wc+CsdaKlcN(35-7GJzzG3F#S5~@svJIJuokY zXzl{$xe#VOFxIsZAW4&DoMH}&VTQ&q$Hy=;W0?6d%u--Fgi`thFe~wPUlTqCX05{n z%i<_t^Aa!zQWiHZzk6!DERGhMdb}eK5ZzI(ECzM47?wp)@=yfiCA#AmjNYoRPWw(= z@-U&fEFgKPll*{@%)36ql8c0E%W)nqG+a=zaV~O_M|DLYTv1H&2w?LP+S`OhF8Vc; zl;sz!7bAtn_D=AJH^NDN#z-C!lRQeetj-_b_v!cIl8c3gdr54ZM>)x(y75i4w$a=e z4eZuRaE#E%-Yp7&8|@^2$4DL>lROr5em%_|=W#+)giNw=9_u8pHIm21B(tT-OR!}{ zV!cyWW!{PB28;q|Sck0zIL1L|eGP$d$HXL$2R1L!g5P#{dNo{kMqF}<(4-J&>JZ&{ zCwaM%Jl>aVdMOh?r}Lt10rmR$&<}jBXAIW_aA`j5M8!9b8iYd=W0)dfXj_%5ccABR zEU>;Fu7CZ5Tm5%6gDW55LIWS?=^M$43D&_XQ z4DGCzF%DHTT%-we9S=-i;#{)8js3;lPx@R(_f#xt!nO|P7+lm-MBB@5pHC1PUg>D- z;8d5c4~*oglCEHmohV%8_@!=q@A#KTYkY#X?j)gEfmfqbDegok`2w0rxD$QJrlw2- zHe6GDuA2ROPCiy{izU|pyU}&@<1bbMl8;i!c~A@y2?>K z{}Gp*K}cR=1Ac98R5~bQBv*=L%D4}hRQsSNd<4ufNU>k0Q~HupotEkJ80Pd4COtPZ zw=vUXc$hzQmw=`$B>8n<#slMP!ax|0Q6bDlz`TZx^mX-VU~p(yAcp(*M}Izq$pAAy zBtkS2D12XX^8n8)LQ(seyMUPG)di5j0^{xk~Bpn&8CCwZZf z+z^vY+vV%wF2CRZ`MBg}p`rb<+S25pw~gecnB>!hD}!Hhy*>3%G!(2$!8p$onpHr< zG>bdUNgiEfF)5qRrgt$P0eOjo@ynj)2e&l#@VOo;0t#+E;zM16l^w4A1jPh<7Yh&? z?s@uho-|xSBXY)#5Km^ru!kWq=XtuwnT%h?XTM9HFOR4645108^mLcf=Zxgj5oe=O zCZ%Tzmrd!32iBhCbB!E{K)5r(r78UdFzgX2CYaK*fDNbAms2uIxrBxSy%&I?Q%o?W z3xUl`pcxPgu-i9Y>={q#*+LW4!-X!TQ;HD?x6n_iBD@y(zU0#z+rbz_wdEY42}*8p zl1HNNO4kyTd@itgiTx!MeTni*v)IE$LKBpHu9MtnjIy2^lYE|&oB%XG07JQ*AMW^e(`tO{`Mbn$=?tft|jaWi0%R>xyx9KNkug3LImU`P;5fG z@}h^&^|>Ac7xm{t#78x%VVuhGF`bXmJ*A2X>eynDjBbSRZf^N&CtvcjhD&Hf>`nK6@F>wpZxhFtKw;2A~d|D-lqK`m-d6lBM|N)KUYm{x)|7S+I_Caz{Rv* z?9$#?LMcH^mkFA7r3t2eDd_SN!L<95e`&acMkJnrc9Tvq!L(ljY+m9O{ITeLrie*+;3ZiRttmnyB4?c}o~M|gCcqp+&R+OU;K@F}ah=eN1p#w| z?pg=Ea*D;cJXD1DUHEy4eeg@kJKy#u3V^8!md^D;QyP%`T_^dxGy>ti>qRBs0Ib#~ zO5VNT#B<`3mkG`EfaDvT${x7CAb5t-X@21x9K%H##r-ZU zC(sK21T?yGLM!qHt1D0s~pmVxgHd*0|bwfdHlPkherAyhKn@d z3ha&l88CT?gYXN5@isU8;RF9&a}5`1G&e3X7$72Ve+U@ORZ@oE{$0aGn(*5ZMQ|O6 zU%vgVK?kC5pl|ZLR}B|w!YO@NxNJ)QynG!DkLCKvaFHhbE*N?fL%!?XvWL)jvRp@= z1{54=6gSymh=rWMn0f^;d5Nxq$JHkVZ>>_EVB7tu&}_u7t%EBZ)L-&&1puZOg|-r0ZSgm0ELRuN@yCJD`FWcfjStY?pUt~S6XseeT&zvZjW>3_^b()T zn+FseX~JAj0F#&4mA`n@*|+XzxJVP`dJ-64H^x5rr#Jj}^)pleahV|cyy{bzlym4=HnVJ;9MUDPI)mpU8Q-y1H{C~kwnc%oyZE|{-8#8f9< z2btwod{D#DsNh|*@yqw!@PErtEl3^I@aKgl1+;Aoo^u-B$Gqz~_x20j+a+Cr{dK<- zIbHBe?f!jzVP{{?t%mEDkfZvx#{v);XY)t@d;wlwB75Db1Q(@~MpJ!ONDd`j2Mo(! z-xaj;F9I93^L`BZ=^E|4(7?xcLcq`|Mr*g$(_aDGT0Q-R;UbO3@XrS0mtfm7D3^{U z_#w!YQgJAqfQ|Y!kl3||-vpi)k1gJy)WH&5Ei~`p*Y-(%?Mm=q^R8dJ5*+E?PD#Oc z{YK>U!Y|{KeO&N=LPL9E?Z$81yRI~nec2 zILYgc#L)rxZshT>JXZv}?ssx-k` z`6pogd}i;^MNXe{Orz;psqF+mN7$;P_|@D~qft^F9zJy&P3ga)B-i_}w0P{ZFrfWPZ3 zdv3fdG{M|>$K}QqM)Es|v(XKc8~+flqwq`ZWo{@}FgHk}xv~Fwnj8OcX}<>;Iv;b) z`I;Mw3FZddsc>%iF?<i0=@SS5TIijQrvX-eMmYb)BVtJktW=4*$51FqT*e2nd8R{_qq1F zP_d*@NvjQp_^_OR0h5xe~&~nnIU9tj96_yB?r2!jT4CfnHo2;i6{KWnZ<= z6B^n{+k&)_Q35#@VoXQZCXtFrW`D_FTfc6?zCAQP!4lj_XlPHYIE(U-iH?)2lL8Y4NBfwXgC{YCAV{u*Bi<0Vv_TP>i{D;`;OmTgyuZ{f{rfVNnUWN z#YA%>DO~#?7=U;0g+?QW`7%Lzq*0ky0K;Bv z{O$XQ9M)V?vPbR5dB5eFM?!;8%nATQr$6ow09IP z)^5H%JbyUCaFGUFf!Rx*s^`yMw#j?Hzw+}P7Z@(mgzf77!o?cNcV!<*eMM;4@>(0U zzbp3}jpY3kDM}9X0S*wZ4&Y+i)oFdh_dVdEHju`0>C6Dvj9Qx+*yl!-LYgqwfx^Xn z1`wIS>ub136XrTdxY+0QW5`^fJH~L4Cd`!*E?YX`8N3R^MH-cKzQM5mD(2<@raG}U z&r<4p!*ds%Lhs5xHt#GnYrt+xr;{t4C(OG#CHVGWeLq;ZtcGVFn|BeKm5_``iaXdz ze%(kuI1!cHRk-#8Jpk{frTy;K6b4(pZbHLer5%xVb&?Y|$*a7sBAM_qgCQJF#n(g* z%bjl1FApCTe;50c7^mRZ=FivMyPh?Yzm|xmqK9zVRDAgNr_pM#{DP@q&j))L0+M?; z$$Q<*7-6*`5tZCixW0lg0Nzh;TeK`LxtGwecGx)gbdt|El6%G^AF5nNa`s+9Z=snU zkbJ0<{GO3~XiV~9!e!(9!J&usjmMe!ke8SmkbIbveEKbj6x?BnXm0csu9XNwqwh^w zf6yCo$^C?84V2LKpZhw=^2sVV`}&eiub{th9gMKHc(^Oi=fa|~xc-S0bUSFZ1_)OX ze(9cRTz#X)hkxC48-KB<7NOQAC}yB={a*j@9y+s7mr909|9`OT<5y^q}Vu*0jn$flWP4#S* z%)eF}F4BZ^p7lB}aSDmx-Z<=U=uz05zw|D}k|xY`v~V4z!QR@7hA#5CCjU^;qzR{e zsBm>fFyD~9tsEvas}K%#6*ttSJr9t>G%)=gd23P(0dvVF*gk}YP*)yOU>m*kj z$zu~zf&uM4Mz}airMqFl9UD|K|9anWktVE%Ul%U6BXm9Ayt<3e_53}GB~4fl#|u{# zf|>R+mo9ijxq>-gA~aL*Yx8HkOU2@QRr2^mDk6D;a1B5(HN5Tlw_)CuP*C!*LPP6e zB~NgYcexM5a1#Wk+@wS_&dfdCiOL!`w&?ugxa2aSVO_AfF~v!~;(p3StComL zK2EqQ5k{_aZtc}MF8O$&nI4dQoRhrMPrwFuTp}u&?QdS91YvCTj=y65+i}S!2u-jA zr#i`(8p%^ta-eNGQMd{ql_jXoLYoX1X`rhCu9JkT1IS5x!}UYf`}~Cus1(wKxuyx1 z?PG^`H5_WVNCU3G2~e6igh->g_<)fEq?4m#qH>W_D0qg_*_?mbaFNEo zUAblm7t0HP7he5;&v20@%vB*=92MI)_)zkvK*NzH%vC8|w!Fgo6H2jJIAp5r91HBPl2QTNaPcH-v_5jZNtVESUrQb6*BPV#0W`NEjwi-hYuNM(F>IS zXq+z=E?Wz-TjQld6V#}So#ehxieT^JnB+@@Ychh_Ln+?*+9Tp|zEo&f`Zms&ILZ7j znC_B<#5qvzmkC#I3B^jpiG!X|$wZ8KO3|bVm;2?ybu@xm?gPL2>|%w2HtL%~a~*zd zxnJ($v)V|$Jduh>{+4h}fmEjS+^hHgLtOF|LKC!p-*S>KSOqq?ZzZCVzb#xnB^3L2 z&-*PP#y%M5D}{zFf{pXHeaTNN>$ek8$yW*2=?Es*cV1nGwl6CAYN6qX-j>c)PV)Z9 zbGoY%A~{ex-x02b5{gsguj>1rN+x31FBDB0l#ZTo&W!V}5w7VP9QfS`j$u{hwUsrQ zhIC_7dBvP`MMHH{bwznix)EonSJ&01i;Cx0Waxm;d1bo1rlzhUU6N^RET5I}hE>$n)RZ@6iiUMbkFTqk zQQnv-8e4=b>Whl{jU9pDrUmt_2F|Uk%`}xaENG3nws~%*p}L~A;HK)it&7(9HMYi! zRJ0aUi&(W5);OoSex3*&SJybhrS$j#>CtnWX4aI?YAov8uL$YJiTF)3nrBkZ)+p=i zGYu8Yx2@AQR@KduEY6KoE_%&TY<*oW$*RfBY|24kL-nkxT2MY<&5gAxqysrqCwGml&PDU6Wz@6 z>YAJgVZw5vOOM5U7L=MTQ^RqruFXbsY<;G7Ze68KNL_Q*)JCX`C5Ws{+Z1J3&$;_#&ZZMiq z(cG|gqD*a8wGK;~GogHLrlfrS_)P7rrmCWms1S8?$JNfPE3R!qV-#x=r6HShTzO6N zHgkpB<6N5G(&5Jq>v9^}>$-*_z*}#yK`u>ldCnZ#JnQf9XrH0FwlXt6r;frg;H|Dj zWv#8qq$}#0YnyUo8|e)j)@SSKnmD|;X!r=E4o0ZD0zI0B>e^XFW6Fkgsi-P%NH;Z< zS2r~ljnQO;GGR+7v(&1(4;;AExOWBo4mmWKA!j$4klZ%kSWhJ8~ zmCqaA*qCWxw}@I$R8(}LGL9HCuy4Qq=?O(A_8p5RzGU2laihvgO4CzLC@n538dy4_ zOm$~u4O7O^NPQs6NK#aFo}K5#ItB`~CFy-J#nQj%1WtTR{a;oAJL*c0&y=5* z8EKZoChKaL34-7$d9_xj)rJl02c3pWj}x7i^p0be zVnK3FrgB^@rm^Q@BF>EOObK=QAF}lS&)$~+HeF=@e+vk;TrFM*s8y?YQF;I(Ds7si zZD`VjB<0XbOw-T?+NLHchl?y)SjBE#FVyvRb-l0kUav)0!TUtTYeg6D`&wNW<^Oqa zzTe3=Y0{=C7X1DBLNoJy^X7W<=FOX#H}lo&7SZPY|6_bpwUPf{s$D`dtG*55tJRB5 z3@LLelWpvyhxS>8k^QcO7v!-Y(}%_RnPq15e_s8hu3S{%m%|OEQUc(6H8(x zmax4oVxLb^l_Y8kG%C}iSYZmt$<}UDj+-|bvN(Q{nR;vz`sv3`v}m7t-ifBismD$< zCrv%J9MyHg-{jW|e;yi)O~J6b7#JNkO@3_1B-aGo{!lY^EhBz)V3mXL{8nr~MdoW` zCq~;~orflJ8l*hr_p76H{PRIv@hG!P7mW6dFPep(30iz*QrAoAg(~GHbYMalMj{aiMnkP6&fa4KdFrBSsaKo!Y&QwQ#BzBeZgjr*GJM`GLa|ZZBTcE zQ`t@zH7cGYY6N#yG%wCZ+gpySV?i7mo4^SiZ8$2KlmsVk-0CXTQ;WzeWMU{SBxAgV zXhm5J-8fs&C9skQcKza7YB|QstCVBK3ab>Om3R#G!PZD=5-QGdl+E%OgDnwn0J9b5 z39xP`7W1m3ZtSn4q=bn_fxj9%U_$$zRvj09-Z> z70gGg5M>nwG-oR*@fb@zg(hRE!)~`!l^N{NAPoi!{kZAJOg~QgF-VwQ!b&ES*GfMe z#U*h>h>_l-=$sDBMGOXqMC1%i^jeZ0{;|$~wv#paaX~1;8 zk>~EJWrtrg)$iTJwZPC82}*_$#SA4}uOq`FNRQs(M~fLMO)(~>`3V%SBF&=c3yc#h+a%d2FZ-7SB3eiFbXf|PA>o$AVwUI$Gc$_j4CSf4xbL;p zi@0r4MHDjuSNFA`YJDA8P@feDMcTYgMmlcMGgBH3b6A&1*qUi37e9&!x}}*IH*0kJ zwy$X=pnbXpE18YW4ZkhW5}-9fyLP@uUB>8{^w7P?Qnr_7vPx{WDKs%=L}H&Hro0&W zWD!$MBw1le&x}btg#=wN6W%u4yJZ!H81j>q4e&(v#$;h!lxTGRZPp{c%l$TM5!cs$ zvz3SuGQZJU#CGV}Sn}zOxM0}^O}w|lO;ydKnyj{wAQzy!1gToCSbydnTI>O1*R=?` zywiVDn?D>eK|c3tS2c;yAUW5EBom&8pfqb*am9cBZGGnR9YBX1s@nTl1Tu|cWCb3QxT?R8%N7tIL zBO_MeS0`Q><3%Y>m{+vKG8Zq1wNPTb0LHJp>ZMx>J)}j11eQ3@q$-05-(h zdViOq3ma~SGQ_jt_9;Rv8*Yy>l;C7KpYHEhCSY|_vqI=6iwrS{iR1JCpHwzXrvLrg zzst-P8oB+=tr5EOrXT67*|qV-BmI~!+2kc!{qHi#O1O-_BbPSOxvCwyym7m4J91g$ zhMyh0s4>IT4qeugI@}7@zk(-a0gz}GutOI&kpS4S3mhi_cId*!iGUrwtT8fR$1ZG1 zYg?EsCi`C!;P?TIMdix9*gZ{Po4|{tf}*t7$~Wlz1_~WNar+GvIj)!eHcA}R*M18{ zE@=(6Zl4av>x9DQ(oj0XQe`$cOv2`J5v`u`qAV}h@`@_2y6V=3qieR&rQ@Z%3d;tG zyi&_JY^oTI%`maN%n><+eH2+PDOcJ{D;>5nOPSdSoy1_k>Npm7i}|;RejW6~<>3@| z1Y=8_j^K+r`*jMnebxi8<)y7b^y{gN#J1Wy3ID4f$|1rhQfhaSzJEwxpjn}tEv1ze z7L(O#w6S1JSyr>GQ)l&U&h77{hKvT>5)BLKX=BWQeB??%GK)O=JeLBb~ezjf15xr z8YnNpof$iuXvb=z1Q(O+Y@!{ji4xr3va^YHtR{-v?AzHqJ5=+;P2P95&W_ePF_ZkA z&9h@QPl>0jt$*iR7CN@dSD4_66MTv$*zeina7jvrbOmI@?{Np}`@e*2!b1nG^sSoJla|T9Ud$3)XWd?2l@JMUkxpqB1IVu7eQIrd;uP&@EqJW)vxpJs>FxmJ=>=s zx|4b^%#Jx5XR3+)M3YI}0~E8`Vv?U|k|#jimSU_c;4^8S;Cv5=+u#@RFjO*6(K&=Z z=Hnpe|6@M+d>#qkY`L!~M z5&FMUF5Jr#(itHYT>@fxzPsSXjj+$}ia-}po1)rl!n>_|snuvn_E_M;uEh~NgCmd$ zyRX>q^7PR6lS^i8UoI(w2n6kBC~1M4ysbHczQZNx1hNaoeZ!|q?e&9GoTk%534om< zbE+iJuC^4)W`CZ?g3V*E=5wU`YWr>dw7rS>5$(A3c7rr}RYUx|&)c>{{dT-K|CUDL zLR;crDqgh5;tt2e7r%;Grq-cA#opGZO9EOm^s5a5Dv;`AHR&C=YRgncIjLW(P)57P z=y>9)VbM{evSkM-RU*^Jk{zL3aVz;dLYd+P^A13!F4BKTC{sxZE^^;45~KU>wgZ$Z zVRzdR$`#+;c7QU)cefp*NU_S+j!>o;Bf);P5fW+wOa)Ur;YMrT;x6zZuVt)9H$^EV!f2?ed2BSMVAXNS00T!Ltd9GbGxIhI=~FHViGOBXimv~0%rwt0-9 zh^el@>2D2&BC|EpmE%e(o7GfVZ5LNkfp!*3Mx&vNUbudo9G8%5%CAg3QE@)aBu*dY z8Top7Bq3Z5VlP*Qk32=m&OQ!cvUBxC)7UBRs0Dr3_LI$Gt|%?HSI(GGX%MHN7Ew%2 zj>*C0X9{y>BB7KC%f;u4a}u1GNP=t5*>Jk-W7dj;abzwDQ>~85ZH|s<+o6-iSi17r zHnX|ZJi}CFw5k`K^%DuX6{7Ts(vhz@V>)tZlm(f6nq<>gny~{>W-^&8MTd-MVD3cR zGx*e9tK?@LE6`R2!9}a;Qm_y-E`>P4$T(G;LY{Gk>T+Bzb|XQ!qJp_$Sxg-aJ0n`^ zko(|QStnyf>5OV?d0BOZ?3CQIqQv4tFf(yi=Kx(ljCM|zXWWMp5mf8tl)cQo%ve=w zDX*@wRe`n?5|v0Ii(&!_NyoIA#igg8M7@nsIDoqkw`Md&4&~xAsiGZ+tH3Z_$4x5Z z)PcZcE47x{%;p)6#LSRlb3p6GXCdf^3!10~oD!o%8zowJ9Sdpfzzs-C5E`2aujChQ z0J`wMc`4*UlJB$7f>`p;v(SLZ*V$15{QZ{1UmMZxu_>9lU1bmzL#}A?m3iAm$;Yxl zv=q(WC7$herIE+NhUlLD-4e$l&>Zw&jrRRI7!|4Z0A_8!tyk9>?4*}=Lw(n)U~vkS zth6JcrMQkPuVg2wx+N7^OZ&VLU*k?n;q%1ZbVB|f_)exuMPBjR%uc3CL9%1lOV!`Z zRi$QgWx1^iUpFI7DNfgpR|k1!7S+F4S&J%RjGfM0j}^}7ypxlSYS^5CNH!F2%d~R< z??!gSEx_#@lDZSLV(hM?kFu-ZCD13EQ|RDFc1>9t3?~mN?i!>T3?~bSTJI*osOSohGf?b80)2R4!swdOU&26n zYX;V3b1rQcj?B4AN{-thNZ;Ni)=ImvxbX#^>S=i;WME8&5R-{TM$LVK! zBjew8|IzDv|95H?Yj5>`LndJCfC0gFl-gzH%BZ>k&7`@Nzu>T4ON4vUXBDcS3{=14 zXN0`0Dz7kCRQ$%|Wx2i7Zgkk~1`7__kpaODWTeGHl8ri8G_pyA&L%}#mB2Kk(o${0 zUDd)gBTkSeU)tx8=&C+v5Qohx^tzRPE>6_sge_lMiEz=#0eTgtMC22T`tVSBlh3cz zGcPO-o!*u}B(*#8Djj6e2ySG{M&e4T?XVFei6Kh_w_uXiwHP1f#YN}1A-e`=YU+c{ z901u6jo;;k=|TDy>w5nbZ?h| z61JJ@Nea!16vl&9Wu|J=3`bSMZWgBsFh?;b#+Z`njUG7$n|ZNWpw8@6nw)9MOF|_i zF2}e&(}U@m?0RI-r2G^ee8vXCTxP@ zW9rB{mCxQVE2P}#!RRWz=$qnhOA*f3)p_g18B5V~0mo`@vH*-7e1}C`Bwpu@gXtG} zbvH)DVTl#qI3Pup_pTfn7ueI$d9)UA#>cToDJ;h83X{JD4WWQ$(k4H%cC(u0@(2 zjVVy=(&s>4pWY>ZR0Ow4u%s!EzraZ7J4C)=2GbD38bG^EP=y^acA^O%K7_UCL5OQ}lb&$nlzvjr5yd$UaT{lgz7WsrSzhv_QY+u1gd1UI<^cXK(@NQ-Y*m z{VHNFVL@>P->)SN6OyH8K}a2-Uk7BOiw~dNX`nf#stHK>Oe%qgZy*!Rs4 zP6<=wQ;p6k>*9{G3b8Rsb5P2zH5h1t*3df@IMwWAZoEv2wF0x&OBoWs{WL?+q!?I zC537D>PyEZo$XhZVp=y!vDazC;IFH^NrgVW5u}?H-rf%+I?+^=>KLjKHC16zK+>Xn zZJ7I!kR|p~Q-#%1Rjuw&N4x(b>hSS<1yNbTh;bq!x^}NS5XzE=mtQ%UWe}Uq#VqLO zc}T73_3~G5X(QFg?&*`#Kp0*8j8z2FSqlBlDuVskVm;2%gmz9#s%b4p_oWR;yY02m zOM47RK95g@ak<~)qqJpZRfcM_P$9(8=VI>OMfB^SAMUl>mAS)4J27w93C*FL5LpDVb()KhNUPg;eGx7=sWpJ zm4edzSTto2;3qtwC|>;0lYu|rt&LBQ@D{2#ghx+lHqwjBm+*oq;)PShTbv@^?^4A3 zeTsPPDdL@;B3?&|cz;R}@4OW8E=&>ck`(c-ND=Sq6!ET05$~oH@oq~I@6HtQ?oAQz zffVunks{tdQ^Z@JBHq&};ys@t-peWCy_O>0n(oUIfbkvSy0%0mk03z{^-C zfHiP(6~~GBgqOEOVs3=b^`xR4P6IEVJ@LnQOK4z?BEA6lkf#;pHT=;t41YZSh8dAz z^plN0`!n)Ycm@?)21BfSYK+Qep9YR$(7XX^c}xD3PJ z;#)fH09x2PcKqT%OL5Wo+!k*$UTgthC>RdTkL1rX9#xRfvuUH#JwA7lKNQ9(!DGiC zm0yrwR9H|{ls|QRZfht=W?8|IA>?bss-Z7}0~p7SUov$H!rJPZ0=_E$Qg?8n9}x@Z z`=-_v*B#|8^cPO`7uStHAa|n4TyChbx~-P7X$Q2m1?uyg0(Gf@o5PEIt)WOguy@R= zd7H3U*@8WLBJ4En%t~HKWkpTwS4}F!6gy^eR8a~8esyIUyYX>Hno>&vCT+BQGOMrv z+vXLe#~rJcp>i81oI7zxsw?(Se~p?V*;sb9xn`kbnButAZZ%aKY-ZO1xg@;4#^2|I z6(yi#{% z8!9fGT3go^XsWN}-d-E5TYzpBu5HFNyuJ6_1S!*$V{$TbN#=}1hPy7w zkgn|7xraCp&9&puZ*$<}Kubd|*(wK`{2|3O_}Co9x41staw@(iis}dj8$#aZT&y?w z!?n?DX9dD--lkkvq^&*>%!M4Oon@>ovsBmmn)1za%!;qMUYSr{pDvLW`5>@b>+5nS z_;M$-1aTjHFn7Xn%|!(TaD3AiW0ND~iA=ytAa{bzRG&Mc!kIh4Tp6YxM44TjJ7ID0 zBus9FJN2mC38tEAi_vZ}!#CSfU0eirrrTpRI4jKM7OUCgs=-HpoNfWGsIhn;$;6A% z?lec=+?7tV!4yTe_@>p)jMPrbpPXMX0VO=Dps1j@Hqhd0YOD7n#25_ub0_qKRndl; zbc=-Gbjb-u?OSX#Yrx+U>0=^sANQ{H1z{o3(#J%%Ng{IW>tkW!Yp7560Psob-N|Gz z3V>)|kvh^j;^CVqCOsxOR2`MpKK!wTq_Y7wTHt z?Z}-lM?t5hKeg-CLbYRDU&tG7)CLM@aft>GpHG4COjq>RYSI^j4i@h4m&ZQww{E=;*&eSm_YU-<@qS}Y2rdR;j{(BcRJ;DNhhI@}3xtKjCtodb6w+<00NJ@i$Hr{%i{ zuZ^Q6#UWbG#@~azqvi50^zAJ%iEMiyV|p?U6J$DEyvlctKpGk2$vRWTFC48Xf~-te zqLKDc9f_{gZdMgo2>MaIi{O$vgsQI?3wH`!G?;QET;M=y67)YBF46xOxbbwq4zsSc zSiq)u^bp+(l|kIbU*r8^u+j8X!-BJ_ zs>%Tq8}l5a+2OX>t33|8rP^(Fx=OLPSz|Lfy^9Uuus=i>xLEibakD3RY?f+^smA8; zxaT^|rKOZm+A|2ADqu77U;3KGohts#*ABPT{ok%%0hp3_^e^Dy*>SRg_?r5_AK^aS zJJ}G^@GKUngJ@4wNM$4GEM;2GSCFxLqW_Zr7zkWiS0dSKf?vwsy;a#e5b;%2$OH4F z`X;}!2ZDwn&H?z-f&%p{t+Q2dq!AORdJmxc0eN>78uFjihP4k&c05speSiRQqKtra zkT%zvl~EXrUPE)nAvg!YUhZT36-Lf27w}<#^VmSEC<-M;l7T242z!L;8%>M`ltU2o z3zm?g1Iht_x>5ImlT~PfVh}mz0Ox8Hm1Dvr$nW9tXfFgULC{B&6r~M9z=O{T`@PL! zWefsVAb<)J@`s@(d79NxQprKssWD;7Sb$DbLG#;SBLFMhU}&j_vg3-i$KZQ(ILf|= zyAr`vJch@Wk&1r}!l^Z5!#V2p2>JoV=UCC&)8{U^weLdsdNAc;5}=|$qmkl$0Ox~f z+ALYL%s7NRhLFP%qN9h$8wz=sa=X2SP%4QmBv)?}pxnw>z4A7B^o>o;x*5TTp|RCA z)d%mP4AkVk@&kySC)l6()PY#Ur*%ss{;-Fbk_Rpt37eV?JeFIL}Ys_z5U!FaLyuH}Db-1`%8@t=>2 z|Ec=EY#&kn0T>DC(bC%^?%kpai9dj-RNv#&cP)Nv-23V3yO!R?aqkbu;ctk0|1=K& zm$>((;0St%(WpF6#=Vb$_@YNEUqRgaO!ZxBpJw%4EANW9_gmuL|E_zF>Wq~t)hK6@ z(WKjy!+(qlho5zq3bV>FN_en=(wPCp&f=4Ts<6ooDWE7_c`2nnq3BX zF8;KKXm*Ga)&K9wP?T5oTCz_62LV`DGGRnbMg2G6+q+XLDro{x&{d(Ii5Y>^@uO1% zOLe*3X*19?p|msxr^aP=dR%TSLE1dYv5W>QZsRjn#iEoRhtv6Q>FX7z{r|@6hP#9W z&yPa;&5GlBYV$+zcNYGh?lsTLCTD)nMH<>e{Y*UBa7Z0~i&bNx4sVL*ebSpH@9TAr zBM_VT91rPrp8;c=CKCi%03e;XD)-O&} zq2v%vs9#Y(!dSx3m*_7y&L}m9yd2!x?X4W^%C0QVsBdbI)<@BkF++%7nwtvcKwFw~!!MWSv~3Yu z#fmON(L&jSKzkAe_3;SeAyXdKNY(;QOGANrTAWgb1C_L!?~nj6Na3hc%S5s1{UY_f zV6u3BTzxN8-$}gDqlIgWAKK*maFC21ZSs9|+>8aqpMMz2B&N=gB)2 zu#t-(eyA;JjL*VrtqO;($#Zv%VLad11MW<5>|!uD#Kn+(bM_W>k-O=g#|3fGKzEH;PLVzjsoFj6R+ffdmqIkYA#RE~{~yl~HQIKoQ_J&v9chQY1Y{z>Fq?+u(5_ zQ%q~HWGDi6Q8TD^TikO!PII~0X|6V!vBoFD2kXOSu`<;p?KUpfo+|RL0&KDyYZ$JT zAS)KmyD3aVs`=2kz;dUdf@AN4R7V~N^-P&#vl0bp6UGyh_!Pv?P#gxQ%j_{4@X=8V zre2og%uFZ>9H0i4J1ypFlXWf=g#reu0iZ{Xld4|hw93FiYM|3@cgy^U_7rm$H83WC zmawrvgr#8`c&meV}P(|W3D*i50Ln?aYtJ@mWyq?S}fybYB`xX-Z-@Y zyQ*M^!CmPociL@Sb}ckZ4MlxKAfYL{sd0y@p*D-nEb|$r0x`FpWp+yNa1Cs%G}{a^ zi4hvu0=^^mr7Dh8fhN1nV5yem&sM=!yOC$p%yxvIqa~t|UyZ1xH%bjh|1&rQH%>=? zLtDFQJgTXqav(Bag~T${PG)e|xIE?PU+9fav&&xN1S3;t{vV=dDKl%#&bc0o3!Tj6 z#thwTLYH#RM|M2{4cmeFo=*sD==7bet#0GWDZwRR}E4)ahIb5}j4E^i&G zM%64mYK@E1Gk_CJM!RD!_Kif&L-j~5B*>%(rCn}CBg=3-4ly3}W5XIkGk7by%-Ct@xX3H$IN!C3t z7MXMmHi3kga{-Oi4Jy{biO}32qDPcbB92dr=rprlqNR99QbbV3=5WKnMr56@M?^<- zSzN>kszMa4kw(D+JwA7L;vJ{mDpM?s!RW$RnsiV!*;b^-=T?Ol@@~ z{9dd_b<~tuEv`z)4k?qg{xwODM@(%s%#D>uRQ<_Ns52Cs$y0`PVOW_!UBm*ihc!8m zFdq>{s}KW|RD2BniSeCgmY(Q<9@W$pu}Bqq9{q2C0%KSYkifu(b|>wabxs$PpRjg`VwubAMsU5O#$hv58!CjFJ4Q`yu*9P) zp=Vj_PM6GShzvu!&_Lp`Re3a_D|5<}SR@gxkUO9UtcmT$DjIf~uvDU5C7z}bmO=FK z087DHGFYn*I+PndbdEaO$_$5f#Uw`6#&`%0L8##p5845@rK~-Tt(55qiK102TJDJ| z&Pa(<>2^Cjv^_!m>2YAtnQeEPJSuTmxKX0nGJ?xcZsysD+pf+#Vuw=WJFbNfTpFDX_Sm!VRn;l3Z2~sz07K6jkN~43+b~a z))FbHL26Re!MK}}jG%(-CR1`7%F4{tVeGR>6M;#Iz}Q`4xLnqnIXrElBnPWWVm4rK zv5Gp27HGso*Z)fxZX@fyFc7?%4&`YOXLqHj}DEVwYx7Bu@x=FNuteBO|1( z$>j8afv{CXss|H|@J35KOlhdaB!}%SL$so~&DLtrPiuQw934{H1qFRb&fl?hF=$1GvUOy2kcV^u$OgdXU0UboL0Z6+jIAT*`omy_Avq7w zj)zhmH2CO%5>_4rC_{0QDaHu(b%4T~G@LHQ7|6i_My)j+)yI~n#X&4t(^RyZP7( zR-HulyKqdmvj(dJLZcINA!a02yJ9;Vp-9k2WM(LGd#M@xZPqWf>;bERKFgKZWr`C_p?8jRBKzbtMJ8 z2IKut+~}Wtrf}&hVqh( z=t%E!9`3m=hZ&Str_tQSCrY#F2m!uM*=z63>E=%FKBxPf;9Bx7A~W zV4yWXxz0I4O;<~lqLYF^YY;SEaC++iD2J}YfNWq;sb!{U(aan&27u}a=AzZnQGl#P zB-D&f+|oKMI4d*f5-jVLWByF*Myxn_3?LZiaWRslMNB5b7~qZpnGt^$Em_SG8Ws@` zx@Kn1>AU0Dcy$?5rG6h+Qy82ULp7vg1!o<^js{M|K^kF(g%vEK>8mIX$!CMpX_#9^ zx(uUIw#Y^1O!cR=ZEaw88A&5xbWwST&QWd zXq3Vs$=u(VxbK_{RF zv>r~`k*Wr@W6C6SrOcf3(15x#0&2HB6d^BSSEc6@Gf*EhbI8D?3#y?l5;Vg0HsJF% zxp3?h#|$tEX6C#Dq1OeOtN>h*5Ui}3FuS2zR4c9-@!17}FoxDvoD26-T5d9(Cbp^| z`WU?toYAan@)KB)hnTnk{RYfnG_Y7A?DLV3!(y_zEUKzXv(_3j=Q>Kw)kB?;8l9vm z4b>!NLAPS4f|)sF1Z;K8vV*7-@VY0m&+~*6wNRc1cO!(nWo*Vb=QNHqf+b*5-?F zk%>!O*d_3|IVQbgeqK&JfSL9}v>z{IVH0I2%Jc*I=!kUKCg zW+{>^Boj2@LS3L1Z04vkRhq31#-ZK^9N7U0XIBBkbbYR3$NPn#BF>9Un@0DD;fgT2 zJoFekb$bLZ?mU7#x%`on+{5%Q2OlBgShR1yP_*evGZJh{lwey+IM9IGW^==h!BB*g zjs?j~5`vRtM@)SOXfMiQ47NnPxY9Pnb?}JqN^<)g1pZ81iT@<9myyDWB1iy#3mh?V7| zFYqW;Kr=!*apq{afX@>E&*BuqF|pJa_0UC+3!jdfxRBU!+bFSV)517=99jw!F;sM$ zCF*f;s>~M3OeB3hZ1}nIK~e3xw)yhr_qZyiLIP3?_JiQ$B*neA)art5xJCbo-E|eYw$h)B1OmCEQ+|Wl|<1_T5_SlrM5tjzzS~_g0CocGwusr8*>U0^-s=HE|bc zS%lB)V9pq7Xlq9AfI(_z&IpZ5J%V*Tz)9F0qKq2LA|wxjNazx+p<3FSJ)lj(M7Bxa zLx!YZeXfzkV{eNDA}sXlH1hj`^?u(XF|y%MFZ3X-c&hA6jfIO5^WIqA4+Mq4Pfm1F zeCBF}12tN4J8DGj&@{x?YYozd>wQA=n}Ung5vUA-pK1|fyK@45JA%fCxS#1fz%^>a zBk`_0tA)u|X3m3JQ0zz3JhkptA2^R$}j**#kPD3h~n0H^JVNWasDUymgit~&-g(sU&k@I_tWP^nyg z|HAq}2x~)`IpKsDc3kWP%Wpp?(wYzj8AV{>%ZW56#3*l$%y05Ggt70RnX@n<3T#E1 zmwNnQLF}ex=KLY9bHw*hCIeTl2H1B=VWkR&*w5ZEKPTw}0^F6BB+P!&_&bp(h&BZI zV$>@%1(j-~Hsp$K44I8dOwVPBN@IigK9f!@t3|S-qtc!{$=KTD@&7XI)w`&GILIlluU*er%qcD>5C+aKx~mtqt&zHwRVV(#xy7KYGp~J+4a6aw4xc(WQ_+48hkqYU_b|H(jfT_ z{;VF1)e0olme^8EXDw@z)|AjnJi+g%@_wwo0Ev#NE;Q%v#tO74O$MfMB?!MY80NX-2U@i>-8L$kdOeIG z6PnWhqH#pmi5jcZHeE~LKA^+?r=zFHU`#9{-tNs!+AXlz>3 zrr{(2$(Rxi?r~%J3|}PW23(=Fs@#{viE~jq-O_=oTE$YLN2U@8NhJXY*@~=o*T(%{ zRfW+syCul+Z(1+?wR4Qo_NZ-c&>D_MT(QhW`t|9WY}S~E=JU+Q+z8z%!ql{PYfO!4 zu1J)G)f4eh(4f3U+}5!l!q+AU#|%awkThuMieSOQGfXTnHg*l0?+rBJdRpetZmgz<7n9c4?l_ z(xyI(^!-9=(tPkTttyy}`ansKju3J=xGYxUYbzqX?3y5+3pvi-Mv2KuKP?AawppSv z3jw4N4bX&aT>z7Hv0;WQWwarIiA35dnI&WK6s8Qk$w*y~4vhdrr$%7KBTk!;96t$) zEOr-RqT=LTB(fO*p0+jrr5b2uPmHez)cY3Gv=R%17dP3Fjs zhard|wl;YakP;mP5X#Pbn-piDNJ8B|B?hEzaU>eQCr*>mR^GOw?C9-MaB36Q4;Jx; zSR*pG)U+&YA%lsL2!_Z~ggq2C+javWQ&5ignmK=}0@6@OH$WZf)qq!%9k#V*CN`B; z5St_H3XC7nblC8sCAaS<={B5omn^UjPuChrS|_}vfk!<$kcAv*ryunqdn%&RazJ5d zW3j=ghFX|zh;sCh8mT)&LCsci#Z_~iP}C_omB_P+a`aB@r|}-mqR5iS1I{p6J@~Fw zz*A6AP{^BzMIb6R5v@$nM}b9qu&~rCV`BXgp(wl2P|2ybfp)kg{A5f}c%Y{PEX47A zgvHMH*KuWz?vY)OWbzKiblwB|P>m^JH!#cMgaP9O6gfLd;IwJbmuMraege&vCbWqi zgFRD5k53>xotcfAo$87!2ax;sc(YK4qupMn6m=FDiCLKvN2-dz zHLAVwXpw=m{!nP`Ggnrk3?mO$L|1;&L~GHI>UKUEmoRzBvP5TCas-uutJ(98{#2$h zac&!?lJwo?2ro;JO^hdjQ4G=F#hpT52vSB4rWnzFu3gl~>67IWm`9j2vF*KG)}45A(^pGbkk_Ly$GlVXHzjCpdAP3#t9cEbEbrgkW= zYBL9G=gge(F-fWS^=fAww3Io`2N7A^5RR_wHdnx=m-_olUBK~z29k=DEIKja^tU!) zG8M)(;Fa~EYV50p0zMOeWjD<1a~teAtd2wm9YjVN=cR1vc9Z|vK~Z;XS>1^RD@dnTC|46MK>?P9s=e=yjH>_q8y`o2xmzW>|6ASC|DzEj6kGu zJrA)RnxzXhJJ}vWr7&05*jQBOqgAa&59AE7Sc%5m7H$V>NLkxt?MSJT{S26ZO=zfJ zk+~h-rNtfL(75U_*6_GWIMdNJ&@7rk8@DHmw0J=j6>3G?k;zDt4jqtfCk!}w!p_Wz zh_U=hddKt7kP_MrlBzJYC)rVW6btw>sP`awcVj5HnC_0{Ob;O9Mx~f)N=9{~(I54f z3IH_)SrbZALgFQ2{#c$N#p~~YTFhAG(i_>KS*X>x^=U|@0TlALJ}`eiWH2eoh^0Wz zsP^;R<*%odXxz01>bP}DQ9`MpEAgxkodY*GW09?1EK1N)CDsPWhKiQ&TuFoDdAP|( zpTqVy;2zBBoHL14DO0KLB*VU7Ffk?*q=&j zCOp}o&L-y)uzDm$Cj~o-9pzbypeax^O(0u8Vd_V0MnfT5NjDm@k*qKmWot_}N(JG= z1NScI;2yzBU`mp$Q&OzqR34EkkrwAxQ^}H#q-vZ{rM?va*y8m2f}wiuiBw&>o~zv8 zgqmSw;!vmeB<%IXX_HXUrux7ll#*VFu(%mw5?9H^2l6R+FRE4`h=uE@`hz=E zBgI9CKrKNtn<#Dd>In(zPY@baUJ?pwV&-R2;)M3iuum_mso+IK(wd@8CzU4R$`LU` zuFM7JLvTch1${2D4=WF};=?wi30aS&32DtngH)M`7iLF|9Klo6sV_uv=%@@|ML~lY z-7?G9Y?nc(&<9z#eQ2ECGp2azsYml1Ia}dONsHF0(3I&s9wRg*JIQPDAr3lLb8HMyrE| zEYit|Q#fxD)YTw}YFg|;k1+GhhNxUN7pfzb^>pT>a;uxikm-~$QpEiRbg~drGb-NU z;4Vzy*}9gBN9M`VHdcoe%8v5ZndTO9>>)@KjqRYhDlG@l)w^9UI%mFhqPWr)nj^O% zMK+}_F5>q50lk%URfje+BO$`HMuSs*Xmv&CpQJGEPOU9(PZ!5uHO6B#aCA(gYwAP1 ztvNL_O>d%#0P!=Kr$_r#d>k4JVhLZH(m=ODMMLADWcDVB9;P`XJDKz@h-6iGcL(6o;nECixMVdWVS@6 z`XABba8nNiD7vB5ReD#W;LBrpr7pq)rvE<}!TD{$Oh{MxnS|g&fEY!^&MJYgO+EL`n@B#qjADuEt zx&%P|kw%g(%WIT%8_J=s-;gjQJsM>fsx+-G(cGJQyRfEbEr+@>9jdXB1_1^k5LA`Mui9y@5I z1ci$p-V{ZmL+eY5=LQl9J($&72EF*DoNd zSbgNRDdH^M;T`7Kc3@ddfiP~J_cgK}LsuXn9*#&?!{Uq^oq7QsT?1GfwY{$uX?^BM&Uy<3CY4@hXep0385}T8VwPJrS!)!`iV|^iJ41MgAhk? z-f~()d_qixxjT!L0oj1mTrNZV$&&9iY*V4a+fFSLlSB0FEnZ1q7FkwtJzRp zlZPV z))Muo>Jl$kYo$;#lWj#7#;n$d&a6-oSJ1@KVJolZGPHtLtb!5YXdwwz z=YUa25NIamAc#CMF7vS*mU%$sUQDc60*NHgsd+rChSR*=Xs~b*E~G4ti|{FNA2%>9 zo<=)nvIf>Vs5owuK;bCj#7TAbsJb&L0d)3P)258zZc7Wq3%-iLi{d=-=y7zN%n1|M zLx*tT1D8yZHX;J?6*bq_sDhL~vbDe$IE5#)H99XSx`{Y4sEIp|O~|_lTYS&~eG)0O z*5t&2Q1vbiS`Ouz04WfVnWXX#?=T1ava1*V`Ia|b zm)uqV_H(a1Hz(No&mTJMnO{b{bfNq8qI+;r>FEqV^KTPhIQfS|R=@w? zx~r}ja-&mG9%uN`mv1@ZabMk+W#6niaO2j0Zp8W10hG?~9_qaE*z3I?RvY)2uyNu0 zz%?-Z`xV0me7;-ThZjFm`B?CsK_T2#&v19)MZY}x;^%+#-hK6gJ+i}pz@6?4|7_tS z^J={Z-Ez?Zd+po&znh=O{l*M$->~%Fp`#}JcXRGl?={XicM-k^HIVXcc(5+B=8F9< z9&*i$hqpA$#|5lQ82;x`17E$MbKNalK5NS8T(b!Z)IAK(9x?A5i+ADDNbB+TX{EvCI{USIH&$;k z&6v8+Hy>8oUciTeacg9DM%i(%`kp-D$)+ExkK3bt(u-?x?;*p#8}_|5bJR7*I;Na@ z>(&9w&|7X|_}cHj*$^~Y7B>&ic)#R_U3|E2o#9&#_~hOhpS-ZA;hEq6r{T@W!}$Ky zU`oHvd&?8U-@R*~_rIa_?O$ARHtvjM`0leGx+3rI&%eF)*3Z7V^{%4p6y;impWs}0 zW}yCp6-Q27Q$M)i!DWi_9>WhT+V|os|CBT7luggxIcd(a&G>-K5K8}xdnXTj>ipxr zJax-%uP+$(4Dioq_>7IaH>_NK*_an!|NZ|CIOAztH2pHeYrcy({^Y4X^|h-y-Y^dS z9v9&nGAW(6pDX(A${(+JReo~v59hU3EZgH6MR}Cr zuRT1lVC2g~uX}UR@E50UKD-Wmh_(SAHZ03fvKwC=cF_5MZTRUW@VSBEPj~+KQ$OBV4f4)&sZeV!efV#);etzSgk1bzlIA-EK<8cQHE}6{EXuNOC>+ZiCSbEO^ z4yX0g%f0wuF~cpDM?Z07=YsQYIqR)SO;e715Z_c__@xE!y|#Jd>8E^j`N&}h@BP36 ze0zZ5%3JGyxbvC7VZU4Y(i7Kxb_aINhYqFme_njk)t`L-`9Hi*Ug6mF7Ky3 z|F~}CQ%IlT_dIjxpT4?U8T)L`Q3pNLe91^fd5+UwcUbmPcVGtkWGW< zWlXC0(;wcSZoGj$c=0sDUv_@|K*15~?|42(SyD6PyJHn)@(4=*<&!E$?|;Sr{`ULa zJND0gXY6H|D=_?(k-?iEZU67rZ`}T>&2jA6KjWJb48J4Lk}-AKNjDv^Zsh9+&uKK` z9(9KMKE3ATvj;AIwdAcKzwGwypo?+oDe9J;@#KvG!^PPRKUU58!oR}z;U?_5GW?Lu zwiA~a4cn8CMS6z13@yi~;`tF~X?&sh4RNTwX@CBFO@WA(hrZ4Jp zD!*#7k3J9IN5d$PopDL!i9^P>A3E>Y_WV;k_PRoROM~HSCtUHzg-4Hh|DjhK@BaF) zCp?31QZRhkL(NNWz4C-Dudcar-)Eni_abhLfy~Oz`194RcOLV?U4z~>9(2X<2cG^I z>%9!mJ@47}VMjMUbMl`WCRYCOeb8+k!=1w}n|k8$2md=~m*+;^ebN;VpkH7J&CXbA zIppHbD+_;jUe&VJLms#u!>EzrXZntM`g(iIy-%KW=eX1ET?sjV8p8_@zi+=`x@{*!l&+y+5zi67}#`FI?_us=Wcr52h zgDF;l{_a*L|??!rC>zpM&p+F+AhWng8>D^V913`2p>|Q`SBwwLgON8UFW6myf>x%)O?3eA*@D z%PkL|h4dNz<70zz{~bAe=ucPW*1x`A=nCiq48Jz>4;!xVF8-ah#Cc!qJEvnDIdC+k zztaE8qQ_?(bmM|MsvoUi`8vjnc?`dA&w{Cg=YDwoP4hcn8E3lh27CjC;l;K2htyyC z!p#@_@2=|}c>Uc&@a+_aPuTp*{~r19`Wt@Cz2=cC$Nukn+_MV{$?S|fJ}7!?;%lGO zj?6x6<7vZh0lbdkdwJTAdGqcchMoWWzf3&kG#Xp3W_Zby_uP4p5}t5m(^umjFQKL1 zcNzZTSIavdnt#~DS8w|JK1W?M3;iM&27lQZ-|xBMvh&_69q`WcVzFYo&c6P6d;^Bz|C~AI&eLCg z?~%uDXn$b-taF#3{1}6?Gj3Sdw)r2k4letAa^ZOIjRVkD9)`dCi9Ir4^_#bE{Lg}n zrI-E-?R7cB^M@Qe;ppK@zI*BE{Z75~#Lv-QZ!>)AJC8hiq%!#NlCQ3B{GxqXCvGo9 zAIr|z5WXt(<$$Yho7B8#lVHWdftRj6__iluzoAs^OX>f4zjJOpWy6cMGsa)$X#MeT2Pw+A46i)@ z=XZvER59v|wx5qW%RdZ!_yWT(Y5(~y$Ir{}+jxwx_Th|ASK;!r{V1Ki=iR*cgD?L0 z#9h1X`}49<&pe3nh2hgzmYzO({D{n(tuMR2`F-cN_~stND;s>T-Ys_(tmf5Yv5z^zWw>V2GdU+Ehjz%IxxKB z_FLYVU9-md`8vySqpzO%A?U#H4X@?THJtb0kW(twwGOD*@D1p|@a%KO+IIWo?*)q< zJ-=|z>3g6&`|MBY&o!=a9(8`*nA3k6dd`|V{xBWij9~aN)Bf@9VYi=h*bQwTU3BhM z_dS918UD*jr+hQ_UYd7D$)T@bweFqS|6S-E@X4Xj6BvHlh9?%jeeIs3oJ$V+=?@b&qYn+w zqjZ+9TlC74f4l#(%h!eOy=3(MC*nFWhCgs;!R_X&{!xC-V+Wo3N2L_{!&waflcVmT z+t*$(@7b-{mk&97&y&C>3}0}?yhEQ^UUKw?b>DV;|KYeZa054ZD?8)6)2w$4DBkzB z{T<;;M>G`M6lDg(FKjvc#s#Bazv80H>z|zY!RJ-@78b)#wf*7lVPjs|f8XoxscyTbLKWC4h{`~r9_buCP-`a)~9)AG*vx?!* z|9n~DrIWvPHF|!xdisD1-cb}Zy)tn;e(E~eg0MvoxWY%+~RKzgllnjv@Ylk)laI$CwW8lt=>>%X|1?( zWPX9F6={n(~Td*l_B*_ z>Be3h!Gd(!WpD9?mbR+Y?LGg116t}s>6W}XyrenpYWo`SrGj*GrgDb^D(CjT+Gub- zu9j~0ffjFl`eZ}yFr7^|?}d@(J~0ePmu}WVUZfiv)o!Q{^dWY*6=z}7jo%syH}=p? z76roi2x)FO(pDb`<{p(_fG?|SpLwtKg(CF%(dO>+?>31=-g^K19y)rr3E;qoIBuAp zxNr6?>Av*cjx#MiP%n98h{vMtGw!z5d>%%`PkW3KACQ$}s4s-W(Kv+1-)q5TSkb{s zg#|A~qTz6_G? z#G@M=`%uy)VR2VvH*B7qP>>P0FQWV0lgExM!W{$MNAA9dHH&W^byM_izes;XV!6(2LT{84G2&Mzn|Fx?938fmIR? z5T%{JH@vhZ?Fo%o=<6HXhGl2@TE)C3Ja-Po>tfXu^Q!Li?>>RP%v4bJMbKOq^&$U0&Nh6D>8y8mJ-6H1 zxNtXnCa1p&;FZ;G<$nsmgJPu71!gf?_q|XJQ=Kh_hB|s*Qd=)NW1W&vaty3ZpPf?4WKUuT}R!6@b9)1VaTo?`cJp<=hHpeSgFD#)M?eF4Oa>+ zPP+rD^R~it1pw)6k#G+asc!2}D?Qj7>8|qK#$Sr7-g;P7NX`h&&EcitNKYG<$>XCx zME9|ht^ageeCQ4yFShAL1EfEjYzp8Si(c*BrD+d?jY?W+O_yO*hD&?u4vN!!Io<5h zl=bxsdt93Bw#l#v(UUPrxA95e>v5^2+Z0;-i_`8eaw9MqyLQX%E&j;j9yIN4OHMcB zdLiqUhG9Y#4z`7Scx?&d)^~`&Ut0%IcPP{4otC=dg6`vXTXo1ee1ifB|q0*IHec$tb&AX_;k-&g1IF7nqq{SD#V2?TdAoRARa@P@q2 zVTync&cW9A&oG-CqBvCFP{pnKvXoaP>VNdPZE}$DN-J)?5_H<6bF2l za&DKZzM;yMsxM0!4!d;<9jfH0zAR-Q3EN-7CP-MJgdHnkbmD|k$x>_*HdDeHC9Fxp zo`CO4F4d3l-OeT0qWZFwmv9Qm~0KUuj8JWYKMC7c!VZ(L zdQ!HsvP8m`N!SzcJEHGRnAa-S;|1zUQ_5$Wr*s_QpQObosyu?ETsv)S2>kS z;oHbDu2g+l%KzYdjbU3=UzV~GCl@FNa#MX-%8T%cxUZ7+o<# zsbnb)61GsnR!G=N3Hu1XHxXlqGI}3zo^_})PW5Fex5M`qm+CInm!(wii*ptXbE>{9 z?R4jSHd2U zu=Nu5w1mATVQ)&NkkL+yIb{TDY$n$SG^(}DwKk2uI4Lk zN)!I&<1;MHxFTGETcx$&-3U~#@PtO(H;!;_<(i>eh1)h5dH`P;jZN3uLOVeBnvM^*b4k5MJPa6DgIU{ z%34YUrw|o_;nAl_`RU)aGL!G*8sYTK3$^Op4t@33uIZ=k{}9W`6l zmr-PhQSR(G1VY~9+yzaKGR)m;FzKSaMu+mNEQA5YswQ5Ix$cG>}9l#%x+ zj?T_Gcok(>Z{9*N1!$%&t&#Vz zcI^)v&scRDP$^FvTs6`@$UcKgKct+l1&Rf0ecKFt>x(~k;ulUK;oe#pl zx^pdK)a0SL$BA%cfHuuuy^0VzY`Y7b^{XDkD}4le{i-M6qYl-%hSFQT<{A91U$un8 z0cFh9tCr!t!!~Yp=O%cHUz)#q&1QHSe?i0rK>7eL4(5>d$A&d#Lh1n8x%uael><@XK_cXHG-jg6hzkGAj+$}K4s)hT`BiJ%=5%xt zxz$dmHUc{78fp#M2s7}KS|bqV$M2#@r#?iPQ`V6=9n4>9rqMh)DGxR0b*n5X=Rues zpMpF(nPjWi5Czw-dI7)meew0HHo!+YcdVk2)vGq*x1*C9p#71I)$9Q=*AM{I7)^b% zlbPbcM;skBx$W=$>{N@~VH*aTL0YXLv7vS174WZH)sA0uRqoQO)<&jN`%sdIF#3l# z#=a!j?!XtE9k$$=DnUEU!yF`LW7DIQ(B~;x^!dGzCP9$qu=T4-;X_rGPqT!d8urXi zf}YWNDt=?SOO&?U8&!&j?Fe`nzS{g*`zfC(k+EEkj+)O@hF@*|2q|>fK3ZKlsH0|6N7fW|ZGq=_}*jcm5*=b&@3Byda zHJOy1wzV@wZO{bd2HC~RStkVI_YEBV! zOVz+t$0Hy^GTK@JK9j+EW{c@=gOq6?=_U9ZjL#S;%Ejz+OW*16UBR%+qz?yYmCG4+ zuk`&BKEfEx^Q_z1N6m5@`!dlUG#lMrIUK%E*mpF1w{oZ(KAK(ZuC&1?Qn^Cn-6ru~ zgzpxP@iu%nv+r~GZergz@SV-RU*MxM4pzot;Jbl+2f}wf`z-K@JZh!yVu^Q^#Cr(7 z>o~>+iT9!OJ%Ry(YQMYkn)Ho@zIH9gI08Nqw@mux!YA@=lD@NL=(W=KkPLl6`sltL zk=_8@!XkVJ!uMCstpq-ivQzq+;k$>+cRqY;*>@Fu=WvYc;Cq0555o5>hrS9Qts)Fo z-iJ@L+rS}O+_CW8&v=KzcP`@_s-U}npNMfB zd@ti~u;Rh5z-xd{;4Ohq;GF{B>-Zb2oQ7Y4*8!hs72*!zyHff{HVD{S_(UpCNgqj~ z&G;LvY{0KbkBEU6`5dszd3&R?Cw(Ad6fF+n(tENeU0f|aEp4qllpjPx(ueRV{2KfX z#?^mfC4VsP5mJ=988#KaFR;&qU!uZbtc8fxx52zJ@&?05p1#Ari||V;S%Z};@%uLW zuE#H}f(_=@exH3L`ALdw#2@uc=pgDE0!FpfnOHbzpQg0!vEYbC1oD(p)!;BsiJS0? zHG(lfdjfxhaZ@KQgkv9Z?W63Qgx^QlM-~1ae|h-R9s@iCr$2hu9ZU;);{9v5|HPk1 z$h6bbIUf}ugVO{FnMyMIJ@WYx7ZnM&YCAVhW$Q8z08{Ps~hzlxSgx6zvtrm-H zjeyZxD?=m7Qa~Gk6U1*5VoyMf5L~aaka6k}9>RBE3qgr!PCnoUfYpK&Cn}5KZ$X+t z_`-Pi!Pks`K|m)Wr8Zy%QC?c+3&0Jn3C;*S}HW%AR<49 zzrjrYc$VA?A=E6|6VH-=MZk%1EJ<;QC3nN$^IGF8DYE491dQ5So+PFlj?C$iOeff` zKtTDI%DD-Z8wfW~g%^UosO%^<-9L&366{7YUa%Ya1iO(hi>1GSy@+=K`$+W-RX&rj zDEZH{WuAel&=w&uh`RAq9}O76>5raxs#B`h#!;Q(P{~K(?>3S`{A6IaI_~>|z5GI6 zj~}m`7W*~txYrch?pBnTiQ#ygMN##T0Dmj5G_U8 zx@al#iIyT?mU0Bp1*|~zK?oq^IAxDLe!8{!Mf3MpSO25stv430&*8;lm~o|L$Fs*))Ai~Im^jRt145lhBA z`Fz$k&qY8QR|jTnM%Q~P7AI8ijd%r!5*V1VQVric=&xT0Z=S1S%9O%lu({y-fl7Wf z5>sPf2GN8{7yA&D9&!;&m)9-?;aC*zZ+P%NQAT>BmZFDn2E@d|IG~Hw@x-n-Mq`mi zMi1e{#v%@n<~94mx<5r@xhV=B!ikMV3>A&_RvVshVq=Yni51&k6V+IR6B~<0muOzG?KM}8ML4mspg8Da z#kSWfH5TE-#v;8anpbRl-LA$WoY+_-FQc(y+v_bg7U9IkqOl)1KFUqTq-8LWB; zCpH$zs%WhL$K7{;M^$w1-%tZm5PVU@y&XjZJ%$d0} zb7$PO@S9Mq32H22!eg3d zTJLP?fySi8x<>tnnDAI^<)K*j%{~;zk7GB32Vl`bkdT1!tPBj)W;j!4Y zh0^*Uzj$gW*8Zy9Bqlu8kg!;1e!662C{}?Qic!CjYUj&EWB_xq?NYjjAfx%PpPqp36I4=MyNJ=PFN4qqSgE^H5M`9u~Ncf zh1bS#)zA|Y9&315EZpGI(kfA75fdJ31VTbN47WDR)L6uX$2uS^R=Bmb2R36C{8ELM2AhOoQCMND|CF$f9OMtHfh)mX%Y#~K?J zE4*AaYAj;HV;vY4E8L2nrp6*BJl43dSmCv?S&c6A4gD(q=;AUh?Rs; zfdR#Hx@NdSA^h;OyvW&!9fR06VhEWS5Q&M9O#JQ4Pj`!JNK2WabfXd60<8+^#*rEj zXyno^oZmvo5n&;zXaYw-Orf-HL&#NOeDdHAhZuE!20}Y0paA0P@z&rM zT5E#n4-$%?37V$Q(El4lR}t3?p$V$~I2dvWew`DJ;J;zlD#UO)u?o>CRv|izJ%Iqf zt(N7+myfYpFgt6cv&iS>HmU5wY)mU; zGtQztYmoU1M0<`>M0?bTTt#~pSmJG3CYaiAl7U{*`I*lAhG0#-t2U6GmY$7r0Hqme3|2whYIS1&NKPSoNNoco_P103VvRp(hA2P)v^W;<_YM6ZajeXKv(tR=0LE<>#2_?x74+Gv7%VsKq#-Ry50 ze6T9WPS2LX*@vRf^foj(oi=m_`1-u}D39qaYj&mz$;wLYP+Dq! zQ`54MYF1WSoJCxqWf4(2oW9P?ndhnZ1f!PKneX@T+v$F)N2Zb`HYR8p&er~kEgWY_ znPtJ8IdjS^70%FSeYJ1LW@jV3_4j(Sv(Z!Q-@D^?)3dY5Xb*_FxsiL8xy>IXANk*3 zq>*V*%>TJUrRuFMv!mK>vCKnbgNcw$PHpJr9#?gl-{*$=Su9TH%ud(RbmrFk0-iz~ zNLTOCo4r$Rw#mn5F6L*aPt~#~3=Yg)2aM0$9BWxlf!-vu&}m5P*b$xGbG;qRt;M>)7Gk*v80J`QhQbE|IKQUDS(Jr`%uxlQ%*C^;1q9hop6gZ zmE!rf%~+PR!s+(;mUul-4^Lg4&>;W+fQ>`>EnS~&oX=8`#`%hW^2v$CAI+0L{nC36aLN(=Mz zVMr_%H~$3q$H_nZWg~+ESz^sDF0ooma>^_Mn=23*;%_?tiglpE*inl)gaq*AfSk3>?zadY8ZIJ)g@sEfS!Za~V#$(RY;;veQd^|X$ zqICsQ5%le*@hZXOf3WYgs^^eO-4#WeLE|NW&2>pTA2i$kkW-h_jZ zGCSHkkdySBxnVti12dbQ0zX#IP9RD%-vfL_YYT5xdw^?e<=!()%{sOxxI#eUi$Wfr zH^9+NnJZWqr=0$s5&3^OLnG3dARH!Xa{kPTRsl6lR7By$I z)57lQqu&3pIS&D4`+2n(&D29cL%y1+EdnWn5Ix`xEe< zekj*h7_Xj5VM{Ccs0C{_HsbC3@Fcuf$8`-zwvv=%T=35DU$NBUvJ{EoJ+EvfJKMON zo?*<+dFcttMfmaJ-)tpyi0}_C+@j8aWBS+do@nn8*$>^juZEOoVbtU#C;wo?&~;l-^GdhF;3hsapL}n z6ZdzVxXu|Sdl04lc8?RcSDd)MapL;NiQ6Ym+>khN`^SkpAWqzvIB^HXiJKHBE+bCd zlsIuS;>2aeiOY=>R}d#|PMo;XIC1tkaq}bL3=2ZpH}=5-z{7y^&X#Si2S|!ic7#|& zr!EgBZZX0i!-*Xe=1JTbgbAEsQ7m!G@%Z-n3Ccn0t|YGcLqDBuT+m8fC4Q3*mArT_ zu1=|83sxBx#P3uSE+q;1Gi>A|?kD{I2JXkhBu_5o%T9v7VJfc$;iD=Olp6ea(O-zf zk4s=r2jBP5U+3BcWgvdMqVZdc2Pwd8s*BB!@^})Mk5pVVe%!RX1DHW< z$he}(m-(9vj7`NwG{8j+-mWpG$j3kdOVAHE1LD||U`Edodu73tQ zG!o%UeF@6N`0>))ugMNkuO0>FTNOvW67AB|-i|_er=|pDC4RhEFOl+h1Rh@u%7aNcP}(grC?7*V-OXzKMYZWh8#Q_%~AiSiKX0xi~0s(d65L`1b%a zm1i#D;*OL^{8CV1L14~ZCUMk@X!0nB(O*i#k1Liu)&ujbii;+X^TFdiV1g?ozi9fh z01U1H=C7mM&ffzo6O<3|Yb$?=$0R73`0xF9WmiREguhEM1=s_W1yW zKLyNJDlV2i=yzIzG7CRm(b}6G&&q+hTE*%7O#a`QVDLOJho8}Q{+pFy|X^k=pNgu(=+X*UystqRE4sv=YxwP!7S57ym}$Hx>^HfbpFZ zo8KD5-w4d8b0sdCy}uFl=K`kp1rirazDEPIUd6?#zbAp&sp6u^cPH}K?ZO1*SNwQ! zS6-y@u0%pdU6i2we3`^W^A9o*|MK-{NBHs5%WIPFOg!tmAwijgA1{_8l7GOhLje^- z9Ir_En+i6k0{7VEl3z6WPC@)#z>ME0ar_&J-%LE142=JZ*!<=o{#C$yr{bdVOT~lV zfI0B0*!(7d-(kS4RdLb$A@aKhnAfkC{PgjMX?%n|amr9m{u-`G{?IjeKCu<9wLe68 zY%}2^)n5^k+yUIwO)~9h@?ihA7?>6nM|329lIFYu(fBREgB)NkzBx8O%44gF5e)Gs zQvK2XeF9w4t+DyBedGYMLd6jsi68ZEH88i|7MmaS`BPx}ZI-xb`aBkoQ-N7%X=p<2@k~P$MM$wz|2r_(fD162UcL-eK0mZ=I;++ z`aC3Y(fBccgMg`iI5t1#?|5L=tGH<)YHa{M^@DVV{k4juLeqHcj2r&CU zCUMd9ne$hE&;L(eBDgI|%jX#P+h;y(^d;;Ry;`$ML35SOQ7@UOT;c}?Y@-?SFE$5kxr zFOuK18{s>E`Er{~w-@dsmE#UDaJ`nG?ERL+QNEGn#+~990JB-e>2}5D1z+}BE`9;(Fso-}cFxRO#J%1*CYr*CzU`pSQ&5v?F z4w&;)9MO^LFNg;lfa(9CNgT%ok@&Sh zpoetsq&!H)!4<8%?BB9_bW#q*kC)zmn99rkZ8G?Ap-^$GJu)o8BS*hZvHOSu<;~`MQk>82H zT+s$U_8)fvvn>vO?*a3B8~m7VpQKLsaH=e?o+r`NNKS`O9E4)J5V>D;fA zl7t_xXz8+ECIT~C#YIb(xJAGm)dr6FI~|zyDlS_7*uFLab6XqynC=t6eAot#>Fxri zYkyhZXz5Z;eSsNZ#+mehC%O#-X03{2yhwVGg5>T4=B>SDy0PrRnt`2^P5ANB?Lh>6 zc?p-Shn*YrFJqXN~Dvsz#{2oX6ZeSi!KO-T_+jxJ>-6|KBS z;@J*h4j&duH&S_9P~J0u=}Se##gp^&{?{;$ABpg*fq6#7b-}&h7eTLn0A|18k{|yH zy)u>eXoRN$bE5$lDSz9Mzb(LAc!1;=O&%N%?gVDsNQsLkUycV0fq7|^#6^<_?Lnu} z5`%xm6)Au8|M~%!GbT1aoY$rVfmx^G5G|tqHQ~Vpz;r(_Hb43=(|~cPxM=)19$W;> zedA*DWBzsk(-r5@^NPlA0Uq=PrgnU6emEgcxd@oMR9rNEEbkUzQYXgd$NW_RbF_+! z#*gJa0hkXb#pdS$zy7J6l;!yG()HOie{e1o>2hE)GbJw8d%7!tc|yhM{35iEZ-CkN zV9AevBejoX5k3K!8&zDi`I36%?+aiY(U|8oJQiu@pP9%U=L>HVJlqg`Wpq@OTg_? zvE&@7yiX&%hozJ9GJd?IJX-f}98Z4-OxGNVL$Mk1_OF_@eI%sVPhw=X7pwH*Aq z6k{A!V&Z3N=gi;Dz&xblh!*X`gyZ<*6=2?L14n;oCop|VWx6^)(>RZ~5x~q+amX&y z-C~|UVEZiurqRGJl04|I9S_WjWink|z9xIXa%=@=yNc88nrVDQfA?o#dd@YK!-Qk~ z4FhJPic`zcY8*v>WhyY1Hu$k#Du6lCj5GO7Y)2;mbAd9&}rTc>(Ng z5wtSUbo*D@YMt-&dbFYjPg8H&9%AZjxi}qJ^lc`7k9{*X%kZ?rl+N*r%#+Z zCZ$Opg68vE{O&q$5T7t=_Jhmvsgv=nxvJjlp5s~J@GbEmVp@%RYE?$nG*_A@ZK@}u zYRrg~NqN?MOGS~R$d)sGL_=VyyU8D{M)3dtnQg{_6cg*cRi-i+f?f6E)Z3tk6+2xX z9LLS&Q~&Aaa%V{gPN+IgzN*DgyFjJe?+Vm8Yvq9y&{P~><%iNv#B+Se zZ)S2r3QtStkh}-_b&cx!o-(%lz?9M^oHp$}%G+3*l8bM4;Xn(&V(WHDvf^G=-QLV9 z?s`VWX*{(!0WF26WCSWh$`HghpSzuhy3`;n0Tk)Kn1n^kwpx(+Rlorc5Z#t4^6vP@XcuS{UFT zM46wFGGSRpCU#s)I(1sgguIFpTW)Ed75~k*m1LxY&UHA8Eae5(d|Q##X|E_ND=l}( zU>qReMDvz6xuxaS(4C{O+-k`S!EN~1+T37e=EQ?1rcOW(r=_N+W>k7{)@F0H2TyWw zDs9SywonDlC`n8Z9=EqT@h!NH#fDgU-gF0htR>ym`iBn zI|6zVe{;&SSyJqIb2L2~fsDn}GYh_py3{kbBO)@Irv_g~G{(p&x?VRd2{d`!0T{#@ zS93jbp6_d~f*TXmEGuek1o*{Y<*;BDM^SNpZl$dxx2Ph|%1ZyoEaHp{*#;`-<5XVX zvOwk1$rIBIl6I7(Ojw|x(ekG@y-J?oORTxWXceIKAa1w9FFCfiN;MOVo@W<+Bk|L& zGvU~AurgK+sK!5IF@1(EQuLJvpwoO_=_>k41cja9mX(^z9#1_B1Rb7T^mma@N$h|J zp&!&@x8_!q+Z+p>7KfwUmQ&%d+HnB$WXl2^=U0|9FIN~g8_x60PRq_dG@Vbii zgSVOK&XR+1$j7V3;+RfK`tK|f&V2eGEL8gcVxiLh7YmgtZ3WgL;u|{Q9|os=p=~)9 z^keSs6j$r7Fh{f`)2Bxa79aDa(b6tD_VVKRxTi8b`2&0$oO7uBj_()ve<6|KLHH(+x5?w=*htwIp`22>1z8oLI1kzB3I_cFWe6UT>s#R9_BA%b(|5XY2!EB! zy+j#|hn!;Sj2!3>eT`yLW)Pks5#?P(&y{$dZ#3A3(+;!JBC1E^{s)IJ7907P4gWvmH8L$#DcXbV zrtMK~Q}-yhDSMRL&?f##lW+0&&IZey-9*>b8jeV}j8LTwk zMex2+z26I#nD=Yd`!&cj@7J5~7s)&-8vX^Dw9fBs)BUIFz1G=ufoAYxXG8uo4fnG1 z*@>swYAQrhr`Y$5!vC3ScnkU#WKcOCbSCJjpf=FcK+8baf!2eb4ocCV0lF0QY*4^c&>KK6 z0KE}(1L)15n?P>`#lAY_HqhHaZwIBc?*Zjro%=vv2E8AY!h8TU0Qw;4M$m^quK|4+ z^dZnkK%WAA9CRD#6QCc0J`MUc=rf?^zV{83rwe}C#lDv>+!*!)eqZ2cH??QRA%+`^ zK4XQ8EAIAe$7lG0qWKyV*4Ri&ZT}NWtNU!!3ivSMN=FOh{Vesq1h$9w@HNCWS$%$) zdcRE7s;kudsp|8m)O%_@wTwEZX*wUVoYb*CpzvSB^&IMuW#0-q0Q3dW(V#DaP6B-i zbTTO7w(te-cF={OZ-O2U`Vr`HpkISR{>l!}dqKYeg4)e>hx5M_zFUVN^exDy=3wqikwh>60*Y`7%%Ebot zld(auxBC?Vl#Yk;#g{dzJxV_WBlPc71P7Yk{I-y2TO(Dznh>X`_gas^I^;E7ZCj_v zTV3eqsP`9x5!))-i@1z!k8;&6)(>Ue4*{2|frC)@th0SVCx8wCwSW!Bfw$5_z2K*xbT26_-EY@{*~6zx-)1o|0hD(DxWX`qyK2Iw!KlR=?B z$}}}xs}nq8pCZ0v%>Q|rb>Jt2na9P9!}74M+N}e*ay*KcMIkll1%{EYR%$?b|6!6h zJq8+Isz%j{peF#;Xl@Kf)Pvb-Ix|(dH>vlOvu0E440&OhDc7E$m1?*J^~rk30i|5? zK*3Ha1YHO^8`K3l2ec8i2$boRf*u1}2Ff}t2Q|0Nn-OlT4zpZ-#Pcds+hiQ(=X(4) zDi=@ne?%;ck#$~!#>wV(oV-;uv53CTC>NI5ESCkSPu9aiP|D>nP|5`hGFxVYxIJ<76uwZ)WuQwyS%(dvX1UykaHF*{%LQ${mCa-v=I18-+ASA;G%c*L7;^!} zhKr4b0|MO%q0OWbjbJnPWE-MS%1g7A7sy*-OSLwowKG0qy-;?0fogU*fI4Sg1wkph zrJ$7EQJ`#7D?w{Pj{yyWt^#Gc$Ai)r#+gSgmxG=R%KAP9)GWgrkY);=X%}T^d~Yxq z&leacNDT8f(y^d0^6&{{(MGZ(j`Ld2eJ!SZY@n?H_%x%(3i1gi`50F)BTK1GWMO)W?1M5;H~S)NjT(M7bcy9V2eb(EJWvnl`JjGKjFnoJfno}>1%8@x zB`ErO4qJ*W?KGbr?1!I-LL9q1jPX5B3Se^!E45!7An zo^oLun4|Pf2GK7q4oiIq8Bj^*L z2c_I_=0(eN(04#BpdW&g$H$<{K|cXyN;vDF zWi{xRpr?U;1Ga#Q^ri+f4P0X1d>ybV_? z!TpnQfpNwX{-!pE62)6$Kf%63vtZhYk{%^5Z6tA=ycI9Ph+nJTYc2IU^%AEdxy&CvEWW>7t0hBWT5tMBe`}0Lx{SDNG`#(V!gYE`B5fuB`TSN{zDJ`@S zT|qa4Vo!Pt<`u)d-d*KYwcHW}~lCW%)#{ke98Gx%V>W$@10zC+{ zKj>7@y+N&@13}9{vA?v%35tE8Vh(p-P}9{egGZA2P+>#K^Ch;Z0!5)m+ zyfoXOHLn7hQ(d};o9;Qm!b_XL!M{84Yr#*uSa!<0H)v1|Oh>)4J~BX=WG3iP(8-_~ zpi@9Ow}ky=E!m(mK#M_VfzAWPzOEKGDE2!EJ-|LCp$FJEBT`Ju0Z%q{3tJ8<~}qLc{$wF z?ih#Vz7)Ujpy=|7yWN$00!_ZgYKKpXP{@v1hWcuTf{!-4 zO6*Grqq#NCwy~LRL-^3JX3B9AuZIyzS+10~y63YK_eNQ<9?Y_8KpnGg8bOmmeV}7O zn?T2d;vJKaT@aMATL#MBc_k>@@hVW(>#?9_Sq*?Jj7n~n73PE#k4aXH!~A^8-#?d? zY+u?usIO5ScD2#odMmwHcJ1mLnoSs4RFam40js{?kpZcwZDYVR)BRM_{S?#vWYhh@ zru$6OeTL~iT@1`y_0bd6{A+!(Hm$BZMbrlc^{ZX1YwE*(2>3}2Tmw0>{!aqk2Xrmy zNYIl(VFHv>K&OGO1FZl(1C-stnV?mm=YY~zIv2Da^a4=o$%UYtQ@R9n73ig)Eub4f z*MeRSdJ5>3pl5?#1$r*%wV>3mO`z*RZve$RRpmy|O`x}c-U@mv=w{H{LD|RO0r~*w z-Jsh+?*pYyJqT*n(~l576hEU)G0t5*jc3k~#KYFS;&aB*Ec}BREAgFC8A~iqO~-0f zGz49xT79o`PbGrS!~TG>%!JJ6o7x@gU@U$wZ>-i z(TGhxSG0G>YYg{VAGlTxBVpaK9rXcS$pBmrL(f>BTR{0P_(@PZ=u@EcL7xSs@A5n- z+smtFEUW{WWShh?EWx`NVX@%k9`#PWXvIs)`_P|D{EP?q^i zP;)&}mdqx9yjYLjK(%`8fiw;?wIjwMhPJL<^_YjXn(_5oan~Xji_)EBExN^?G`SH? zEI(p5Vs3D(<{>BmFIF?}%jKL!2n!4P|vKNZ$L+aehWGd z^gB?h-4CFLfbIl64D?6PTF_mftka)C&2n0Y@K|!<+S7$5IWZ3NaT0#*l9ROG)<&u8 znu>s%>H5Ew(rh(#O=^|uy=RP+VuN~r7}^D;dYs|8K2ASE4J2VbnPvDJWWc)n9h5Ts z1C%n{4SF!>U!b&gn4A_qK_^ho;dcgQeRl;l%kX@Jvl7|1c$wQ;mk4c*ahQ)Y@%xd= zBd)k@R&Kq=)!5u*@aq4W6!%E8G7C%-5SM&YKx@@fQGi_SVeszAq0WDN*(Rz-Pji9^-x<;WAanaGCZ{8t|B8pSc6n>@%?r#^SdDzn}iO z{^?m1K2r*qXqQ&0A)o0TSm}XyOrIq#pULd=HZKWH6j3MkwC2vFA10ib3*+Kup;_-RFEyEm@)e;vR+EkeIo z$=an=HuMWV5`A*TDr{=dbbYg{bcY9_-xiO7v5oVB=e5Nr^4wup@-Mh&EPohVc1 zHW)5d{tKharl4Q!O_32a_gl;9O@pNgY*w?aEeJkCy+2&-!yZ!axv_>ObE|rC<5Camy0W@u0_mrh>AhX`t7E zrh`5PdNAlKpp!w(ZQwnG)Adcnj~CkjeI|;D{(1`XVxCK89AY@O{rR8ki1B;vLOqy% zCjt)IIBLI_Lz@8K84Pvp^SsW`k0e7Em8( z9_Ug~E9l9f`JnWN=7O@`%Rwohl0!L%(mlEF0d#p56c<^Gti_InWmaciX>LWawZwr9 zW!;l|3Nhj23A?4h>U3BNoF%0tR^>qT5k6jHcvNmJu-P5u7Kg30#93~gTVb_3lyNGw zQ!J>xthB^##Xhy}$&-h3zNgGmZnrvfElAClYbmlFYE|}8A9hk7=9k;7C3!^)^;n(N z2l@`%it-};VHfpbd1_Es~|U5#Na;Smnl^B^;x zs4=pN;Gt@84>h>V;wW_HmzNehnKkWcPxUFn|p@ z)LBW)Ucy-c3-(Q7?XC>(riid&t}mvF3akvXl{$n8$gg+R1{AFf1H#H+L@*a)laPZk zOYC*cLF}M!%=6T{Rul)6;p(HVivGx6@9{L*uoct4)Kw420f3w!+6Rs{$+J5wjtaXo zAOG4)3d*ha(u(q2tH{J3sHUC@8esWCr_JuPl>l2*WX(gfE?+1_N;WtmG{h#iw4}tE z>i{Pld@YmdY1b~D1zX2U=Ssl2)y zL1DadON(J1kaaseSDCX!BUmjRa&ADXS?gnjiKKY$3(xrpVX583_BCQf z?bsK>^pshpwN*x{xFjPExeG^WB~3P>1hZ{)ML5hUy-b!>u~%0S~&*fLwb&6?M`&NRXAV}#3;q;Bi>idL1$4l*M1 zXpfmJySx|CI65gfM8}Er?Ch(GEwg!-E{q8y?`w?Ann7GLl0-Sv17!s56~)@AjzSVLJq~2TxE1L80R% z4x0rQTvN0Cj6hpO$(#~2zL4tBaI-AKj4;`T+3fXJzQ6H#xn;gq`MS!d7y*#-f`xfj zhiVCE@tDYPBgT@OYb}ExP*PyE>&c8TB63Sh=h$$>5#0>U02~kwC@!<)I-F&tMYi09 za3*rCwt3b(z3d~y!IB#eOoA1(1E$sG=twY_O{-JpQ3sBR3M{wIMp<>>*r-6%OmUe* znW)ytL?aOG)DG7O#dWGh*Gr_;V5$)>tO0eWytGK?m==a;rC6Hr5Y8E8l5WHcsah8} z%8Jn27u)Q`76-IYGcOrNXjw&0kf)N4NP9RA#1V#`NYSRhOx zpLfxpqkW>wffB(vwV{iHuPI7SRM!y7np2t!g)6HlE4Gxt-4#yoU^TUFIxYuRV4khC z+^(n8U4Moup^0}E&v9zzP){jQN6}Ulp~<5@aE@1L?i_ZA!Za~QJ#?Jr$mYQ6h^~*1 zd+Lw1@<5jzXdDaFeo#-aS8F77MC*Np!$FR{bsYL_VGZ@tv)3b}j}Fm_70UM{71LM8 z6gnJb&I<%Tqr+dV$qJryHZ2Vt7nNR^f_Qz^kC6 zo+sR2vg)F;qHc>8!sf}0^w&8#EIB#WJZDaM>3sSK!l5N%fR3=+iz*i2UgoZw$`Yd( zi(Pd7MDMMmHJyR!wiU>+6FfO|-NG^wJFpeD$XZ~5S)>y~iwBL?rM{02&M$>K=!8tm zolqdBbQeXXk?9~Ehru5urfb-~`V%c{4r@^f>Q9rsUgW_#GT&-NhUtZn_Ygfihw2T% zlvRl6Fpzc;dlpbQxX@Nct(fD?uP7?QK_u|+5uPBzX`t3sB24&m=GHnJFsZMQna!Hr6qntWFg(@|bwchLQSyCcV0LYBhIb;3Fe z#bRxeA#xnXP#dL6bII}1RUYyYiY@=mhvy3!vbi#T zqO3e<404%+@wl)EyV3e^#(>{THA8>tSO|?RM+2kcfSIB$s~S5cW}Gn4PU>p|BJp%tKeg;Uj}(!XnsKhP7(R z2%m}aLY;D*xo|;?1P2B|M{=FT_FULTbOpkl)PvP9j;k34=>uxfpqv(9FeC_j=zwpC zmctw{5R%Jv=9lH8AR=4?LnZ((WLibSE)fhdf^pgW@SH(7B2>*qUvRz`uT{IWBq)FP zE%Ax0%77#U6uVYbVKtNvQWE~|yU-I5MZaIXjVY>H-HOjb%>;% z74n(qaN5$vw1_MMvun3FnPa9ODkuU`R+ftq6BR_vftHBGL!}2wRsc;sfjtPM!ilbf zp|TPLJGCA-f$%u6&~=$nv{ZdEgH41Fq2!^5g>#CEMP6j}ftjd5sux2rg0MJcg;8f1 z)R{p9h3b~s8_Dd!@kD1VR7O-v3)ZDFR7@qwM*1PJ_L01ox1^ zS~sERpl5ivld}?{4jE}L)5H97OM&1zL`h5@b+Doo+e&PC6~$#vbcLmyRw~IaMN>*l zz8ozy=&Hqxt)-ZvMD`MsuQCN%7ogS>lLv#*JWg3HkbazCl8gseNIb=Ykt52Tn7kfA zMP)i$aOjQDBk_U(HmlH54u2&vc?=jrMb)gSXI(ngBXMc&a-eb;nkOcAHI_k~n5!0q zy%WbNI(m%Cw@tQv0i-2mOt=B_&_gCBKa0uzvT{d}GZ(!Q=dN{O^C@dGlwV_2_Q6w> zSg9x~Eh)e%F5a_Nv?^g@^iU}^wiZkYB_=w-}6lK`Sj^_oZXNlc!KVqv_3zLNo17m5TSo zvy%p3HF-%6`o_fM>iy6TEaf&!34EIZ*eO{PdR0ZM2-dqV4LQI7-Qk2S!fY;^+v|`8 z-7!mfxn*GvM-T9+q^xzG5k$>;rHDcWGRufU><2`d&PEf8bn1mBu#!;fuzI=)?*q$J zZo+|cmO}|K;1zmH!>^fr5%4YosM(^PnJC4rr)ky)nw{Qiq7ebkxs90yY z!(q#D1w6U+u0X)z_q$f0yGl$(E@Vp=>abmA%9e*w2@EK;9(?5d3>LiiH&UVzw1nm5jqx zD;Q3Vgs}_Zlm-38!kNnVdpwwwNKF15>e`B-dLXnN2h26rRs_BE0ihn4T5OG#Lenc- z$n1_trH`c^t!ieLFc1CFT-Y!22UkBa`Fz>nEKN=LIEIV0;=orpgsm@NyUTS2aVCFN zy@$cF*|8T(MQ;sDm1_~+JT3OQU{q$yE4JIj00ZyS;QCcaE7ea;)k&9xHV3iMx0jZ2 zID+<=Av}`K!WhgeMPsFU4Mg%Ioq{1bPI5xZ;WwnTCvy=uftdGR7xiR3aZS+*91nPYLpkN&yq$d(F zI7)KtWjCXqWnQqBJm~T^dSqsB@Huv~d4w!RL6-!k-qTnctaFMJtAr+7wI_ZYQRHp# zsE?dr{F+`4*#L2j5vsw-!x>p(Sx17a{QiU=$2|r_=q$Bz#D`}JJ+3AT2TppVSt+v= zHxd|y<|%Vtp6uWK{?y9gU?3rpzz(d8=n(1eTaQXK!OHXVnUxr>sUk3eRuSN)Rgf|3QIf zDWj0~y}AxmG)jGP8iegc+rlv)iOIQe7et=Wc)V^Wq=|(|4Ku@4S&GjP-SnIivxC{8 zdx+We=>e?X@UOr^c2x2nW9qaEuA;#!bHREO7Tt-$`(&}JnrlLh3&ZYKANB^)_#CK30p5y$whP=E4M2U6yxE$G~Mtu2hBnhn$=%3U`}1{9IjetP&pW>+^NNORx~2*##%Vp z?mCZq38`x(L`525KFYw-Kw5yqJXZ*ETnx2`UA6 z+DB^&PT4-3z?jU6xz`BSLmC|)7+s))n8>ZM&M6s}qf$ zhNj?(nWFAOjk(QEk3+U^v^sZU^&1Xh=8&yQlPwRbbT5^TjxrTb-q*^mTJQMU$8m`H zqh5#{Z?!krM)ysBDrWX|A1EFa49H4kVe5aScZ7eTWFYms!!3)~Cmo>ZDov+@ z4q|J?Eag$e{Y+ORJ?Uj$II7S{k1S*r6wEJ2pg3Aws{qmc#MBnyYR5$UGp&=N4X>eD z3VWF=BfA)}O&oif``QsPte3f=T@1o{nM~y4C{2LzS{q@=_QF)zKeAD}ClXUCvy>~5 zr5^2OF0$nOcLo-!&rc(;5t;1%|8pj#o0YA%FHs}xC1cjUxzmgZW*eANXsCK)@vjlbkuhJ8f0}&CW_%dn(2V`W@ z6cK`i#9`cI(hw1m-w>=3ORD+GVo5{@R*5&PaC%_E#rvHTO}(qxe-PCm3ReM^cj&H^ z>bCsTp>^xJq^tG2);~mYR6>H_f2y}Hdme~_x$4_L%uR;7hG{o}h|-^_wovyKb-S;# ztpwXaAzze(!#%(jijcEBxI(E0_tASi)8Jm{3OK9z)m(HmV!}KX9=0>b=c`v*kmgyM zp)~h&{|81#whqj~Nu!Hh|I1u{g9FYXIcE)y#5*35ouEH$`t&+{WKQiz#Ry#$Lbxy7 zTFT+i)oGoO?wKB^uuW6qOX5j8hCZ6D524@^I<8?7unPRC0x zUT`kb6Xht$G&-Vi=!bi~3dY!-Ga zV=7$hS?V$CvxhsCdhqA>V1yp;dH!hVnzuPKZIho{9+l>k6 zT8}fL*08U-F`8UN`w(v*9GYVJ;ISJ<4~#xZ>&N8mq*<8s?E_kLzsQO7?K$Be)Mpq1 z+(pHy!5{V9M6>_GDL7nj57A({KPZb)1m5398IgwPxy=>}gTb60re~o7gQ^MVM84;OdFzQNFP3iSIaD6Vlp*RVsz;A)i{Mj#k;#cnwOwX1jrtqmCvz~tg??a z;YKy~;_c+2TFpj<>B2SVaT-eeY52GWof2k^QNOW#4#<>KUeiS(h;Q-*#5C+@TCubl z98n@+I{vXcghV(q|Cgo_t>-+&q*1X!68LC&2^@qdGWIGYyBB?bcy(omsaa|S5|{sm%cii$SKCEXFY_fK2qsJPx+t86Gcfm zak@@psg3ld_tIJr;-%bpG388d+FLrz4sm|)FU{uZQ(I=oTquY!AK_I=r-N?|xlwyrxgbZgAR|EG^vWz-zsw9=BMj)1paLU(Tp_)zXQIkk#}r zd51U&91DIl@9kerN*f_8M~b&;t@PhcF>KVpvF&x5;6#rr+ZM-ZCuz1>Qyz}TL#-k- z`L6q4;wg2JqP^7FC<}S1Nz3+ z&uU!WdcI%gtmUfKkD+pyqvy*(sr)b+Vf7y>uCej)|5n2c5s0#vgIV{8>hsT;X$o>E zc&^ZzN(VCto?$A$l_F1TyxC^K-y^Li=M^r~ih@}UzNv@fr&~k)&1z1##n-0h!;Mrt z_MUH6=kFnA`s5?utlIV%)36CidPJQxBO874SJ+do=fluSU(!c|-9v_9-`_&9WQF@> zfx$KevC@vslZQ_rh^J3rDXd(O%&14g*~M}cvC6kE?k$jEQ5m+CVDqiu#U*=)sIA&# zRu{k%8tLS6pFB^%?e{ieg+$nboAflXK8NdoL+c%5E(B&)=y$^lZ}j0E9Niu+I~2?A z#F|5foQ!ohVoMp9+X)OHa&eznu0$?f5QNN%)qRZ98NEPJ88%Cc6@*k%E*nOOdCf4_ z3O0!aMqFyhyGv0Q^_Z<%DwgWhA#qzp z2m}v>9s~--TMKUUO0n%z)-H1^Yga_*0mLs59^^>l#|8Cx%5}-e6L-L|gsTvWEiSfV zY-gc3I-{CHD=|Y061o{yB45I=V$vssfECH}y@2*=BYT-g0*=>p=QzVin6X6COvAEqX8VF3Bwier|m(hte zYEE^H8dtm_rc#uvHmMnskG|kq;Y@dmp4S|7G9tf*Z1SCOB_yb>9^}GrVaT|c+pv~< zJYa)GY1&>uI8{_7Rkj(UMjlHQ6msS=cxQxl@T_LLXbr|p(C-+{7@;Prua2iKaQ_Z8 zLvHL58yr5%G`4JR^Mz<(M~j6l^4gTeWYJ@A!MEV6uK8vKt(0N8MYb|=eh5ud1Hy7G zV*erS0P?Ralijpvz`0rj&K0+`Yhn>yP-rUGRcni?S&XscnH9gYfR zS8R6R93mIpqX@bh$aVJ=;jlPGm?^B%X`(gw>g(AUSV)U3l(16!;~tAY3|*FPOvJ8Q zVMLRtdtpmng>rE}95SeGB@@U85acYvo&#=ja##znF_tr6ue1s_8xdF`x=cJfgCBFi z&?u1W^A}e8ORyHi?{(*iX&rtfATjwCVGttO8tNd=RnnK&izTKswe`$FMR?A*LFDA~PMAUv!t`o+A3Y(>Aq)mXiR2DK2t7WO<+_8guebWvZva>78tq`3Z zF|(kGMP<5PiHaBI#cUKp1}0rJDsCO*E_d#K#I`~)P8Pa>h~etNF~f^+IU;UUV*kBY zTkSY)ny{&Bsk~s1LymmQxcFNnI)Zf;vMB2A1eT3mFv_p@!mQyf2-CL_QAMbw;i^DS z=3a!_te9LfZr(s`Qy4<1v{&q@U<<3gH8rq@?0*nTLAzGZdJ!#d6FISiEAmzeq0xIm zuHe9k9t~QIPmo}4t6I(vaE1^=axS0dteHLPW3y`3yRr5w=&AK_^8t%W6Q|oZ2GFoD z^TMhyyWARtte{Mylb}lVLkZYvLBrV7a0BX6x6_3qs=QS=#wsv5YOBVbU-5Qr}#=Axvgr1E(XS`e)Zb15M(^TnN~Ca~P|%9<9P!^pOj zDm`7eMnwW=R$8%)Kg^|1OBd3k4pi8&4csA8`6aAfhqTb>deZ6P!u>L_Zl8+7jt2E^ z=xfB5H@WplY{_vT9ass`?RG_zbxP%cn$hM@jx*2v&_ZHzA$W<@Dhh>(qWLpfKeiSx zf^Fp1w4-yiU?t)NG zDHN|53vwbvZ10Gu8ltt+k<7K|UL++uKeXQfo2S_5xSxRsHwcr?Mn})k;1)90B4LEJ zX2^U1ql88v9F;9~Ir&mdB>X9=7W;-v=g8fetZnW!(`*$7DcQI;4N{~6QxnzEEv4QQ zIH4RxWui}@14==P(GM+Q2}-1H2XjI}t-?oVHRUYCIStI~NkY*1MGj%4XE9-L#JPDq zD+U7)X73;fA45*j0+>B+DGP}}wb@LLX&bh^q>0$w!4ncM;|Prd*l~zmoLBBzW(nY= zb}nfX8q2CIM|So7YeE3Ops~=|D$~Xk95Rc#g@l-Y&H%_=zGOg$JJcOgV084HPP%%N zGoh*kO+_|EtqCWddiQ%OK#^LCs(0+?euUAAJ#CO7YL|l^bmBH~!_9dW6)?wCri1as zX2)y;x1=-g98gGWM8WmLotOvUqioy=*IdM;oLPlJ$ZU>cb92ZK7>on3ou%lwim)Rd z2WXHTXH~?M3Nt^xO?#RutN?3^c|hf|rYO&5HuJQ}s5^RJX<%fUI}u7vA*-55IWuxs z7MB)Xh?iNifSqvAwIZk`qEj|gwjz1Xnw1j<94Jux9z`xtZG3?wTu?FAL%ZgN$*7|} zswwSXt9cS8&7qJwc&A+GmLc!bGou<0M0H}E@3CGzDM^qo`VgA}v67L}+vz;fae3@f0ycl~X-p z^iIhcHZKc}SPhg7pX|d4%I-SRoAE#a#KT!j+?gY~e`*7^K2c)){n;#O^nh&gVx5p9P|9C zTE|@O$g3!G7GUo&2d3D0k7EV2Lk(DS-17&IB}Y0Xhf;)c(gH1=<))hft5v95Eum|4 z{tFh*ryehs-TE9Wnzgs3B)raej$Np$Ro1I%-x6hvtBa2mQbh zusoqJFd%YzRP3u176eeyn5c+ZXy5ut15T%Ky*Q}Kwa5|G1xzw`X^^93*47sgXJ{A~ zO`KY5lUa|@tEG$b(S35N{u77ZJg-RWvU8!!Hmo1Pt9CiRNE7@^oBapBlqGc>dn)Y} zXoM^>ja3D;MzbHzVrf8vVkF07C1fLzCrj}C5>M8mc@Sq8;9wi|fIUth2`kSI5Qd3e zDq9;5QWl*)k5X2WbIJxT!{q8(+!~OC* zoJk2)uA83j{ox&*UBCICTK(;YGZkeT5>86kHE`Qy=X{ji>HQZ6XS#3M{=K3s7vU$@ zUbLlV&A7SW-TAJy{LCv}$9J|wcRf3(**k3M-;r}N)OZFXY1HT81o1r?;4e-6=#5XdpLEO@>-+W^z3=^t#X0Q= zpS33Yq(Ni)B;Hu`s(t6N>wZ)eZ)fsfnA=i5?cA!tC;h(HS?6s&aTdNCF2XB*3YMMW zEIICtjic^{a*q=cV(?J7#_chwu@ z)a2(%=H7$z$VIrT_R*cT(=YqA&(D`nShaHqJ^=Nm2;cJ4&TYOt+p>n<37=;D($$S` zC*T17q=d_-ygFjZg-h=*{cy}RPoG?B!}n@L_!kR;>pnSaSFck~`28(^*>89`^^yqB z9=SQ|z&AHO`TqRhmbf~7bs%_jBcI3S4!-@Q*FSpX@#|LKUo-FQwf+2uN8^sRPNLL z{>kfhUyn1>@!^N0gzN4edh#8ks^(nNWANZ3=5NA>sE!ul-Vs$#-1*}6fse0RVwpMV zE_|!xV-f!9SEa#DC%=8`_MaCgthn^OnfMk&BKaIK;oZ%LdsqDMcCQovdh^ATpT!n< z5xy<3(f?hijkjbrZ12D5r^~bP-8T__LF1X%FCO&fh6~qMKQs5UZ|2~;O(NXC=rR9m z!ExuEF+Y2v_u~QY;(HuD$bZ4!zhCs`j(b-2A68j=_!IZ%;#7JO{=y+U%HAHEb>%k) z_D#9xsbf&qD@FLLqPh|?rG0$Ds8;`nImr>di>pM$`xg+2p=&2 z!3`tteevBbH}BYa^Bw8e;$We@$iLKg&BC(|`u?j`TaG#G;T^%N!C!>0>FxgJ!Esyv z>hsD4jyKcqTC6CiiSUc|KkNEqw!K`ucFbjEO~2kY3f~PA;mTG1ea`Dr_|;LroYPdW za__5ff+CLNPfD1v{?GAGxU0U)*?GbN+y8!SJ0____|XrpyZn$%uFp$y_nxqQ$){+e zXNvGQ9_pOh_tm|weS2x|m#2PmP!+xhC&G8N^y>6Y|K`sxex&em-}_zsI7GQO`LEu# z;_kirP5AATl#L(N%|3f6&cYYrr`~$gTk|W){JdW{&?!H&xfvs{S@IzeHQJs zxt6R5HXT+v-Q|Ye+akhK&Ut=yuNie)k2<4vQsHTzLQhiB10*G^@w~S5iP@vBU%a{G z(dspC!hS9h;S)Z2?T<%3-*nxtDOWvm`H(+0Da!RCd}8-QCd}x){HIr*+yA&rkND;h ze1A-Ycj|lQTfJW#nf>mhDF=D%_G_L4vIW>4L3=jVmRFDc3oBE01B3-9>$ zR^^KyJ5}z#x~ugdd{1Kl`Q#k>y8D^KpQ-<~2g5oa-e<|_WvAWndHIn0;V671!h5}TmaX>sCz780Y{>E4S8)6;p-0E z-RJuSSB?5|@eSKvd8G7r*d-A@d;5UeHLETg{PLT}{xM?hbGP7I)2NH2gkK-;lJarz zpuK+Im{R@b{(gKEr%r^w`$GCpm;ZXzTL<|EURS>A8}uWaMEEs{CvMx|T6T0%R{1?m z@1KPJ;tLu6#nY!edHWw3o%XB0c=u78y=d1M{UjyaGca{(w}qc?x}j#>YeVzyxenjs z6yX__6USCx`qGW(|8d8)_rLk!SbS$tgb!Oi{_{`PF8lqvKR3=k`?vevKt2bN&*sn4 z-GXFp>nBeEp98QyDkfY3)kDi-0aMs>G;yaBZ{PS- zeaka=fvYS=-=CE5_lU3Vp8eHJ11(#R{kit-;6wNxsR)0qukXf3SO50ITerSmTz1Hr zyP_~GZSYdNj!u=T#Pmd^P)`7+r4efA@ti>_?CedbGd zba^*-)P~;oKldg4VG(}HZIfO)>X)%6fBL|a8#i>nz8v}>!dKYFUcBz|w4=|Nv$ARI z{hON6kBIR7(hp3@f3|Sf@KZY_c02RJjTnp#Bmd9lFMIFD3*SAv{=L=bE*^RU@_(WT zccfkT*E27FbDHbUD;Mvb6gW{)9uwg^mOQek(lzR)3rFlTtl^IvUxf3yKl!8`bkFc5 z_w8pHx@yLsFJE>u%9JI-w_X3k(7V6v_R!S7($~$NyZUz6c^Ur3#D$h~9_W5d!IMp$ z3byS8e-XZW*$r2Iwdv7boI-L5KLjET|)$8;N-aq->Zt0&rUUK8U_hJ%G zg#UHqF*_H&dd<;mCiyO2bkJ*Pk0*%m(na~cTl#G;{py8jm$=?owO&!a7U6eoJ@Ab0 zuT+LSpFC~UgAJF!_8&By{5L)3o4h%2#dG!^-);Zk-0|cLyLY*_UC-%0DcA2jet_^TrPw@IEm)9$-{N9Xa6rU(8`fgK(P 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 z z*K_Gx$~cRb(!^_p$}%|+HFpFr5sl#4Bym&Mj4*Sg`Nbcq&(q@W)UbmU#8{7HQBn{_ zYgkvoAQp;&na#_q8mk(~p#a*@z_eVgxm<~jk43yD_Y-4Nu)rwas`f8d@HlGjtA3RAP#ZQ#xoiVh!1<~3!Q^7XAw%gUA5BfU1Cy9M16C;+HpMMibWH0 zn?yDiks(YYy^G$3DnkmnI)^zCa*vP-jMP zVR;s(J1{ny^X3I3jaceq4P9!^hRR`%PwRd{`QbE@Qe<~J<_UA z$C;@Lau|3nR!wCqE0`J<(_Y4tDsQq`@DB^GNipVSYEv+0Yje@GG}+^;>joXP7YNUf z5~pt?X4=%47EN8-jA_zznIfVts*|mWU`mVo>akfKY)p=bXxom?DkCVzX$IaIB-5iC zMF65ZMR0&f++jj~d_DqM>=)v6Oce*Vw4(?-byJZ_oq?bxU#7h!>~n`=kru3KChhJN z74nckF)DQ%Ds76eN7x3;*JxXv@H#aoX$%VeihG)TH5ju8-ougd< z$QBLcZCWm*H-O+F(GZTB(@z_II=na+>tvZwm4r-~U?*Vw3<+cRhP)5m=Y(9^o<^PM z3?MaQDWEuKG-oSFrhZmdV~IpD zlqmF*13oX#8R0-V^QSW?=u~kyg+=RVSG40ewxqKaOsO2Np!O~iFuU93<6D!+=9>Vs z+wfED3ZsV7LNOAv1=&>#vhz=J7`$1TU^Sw166zrdTI5HJAo+|2A#UivS!62yNWDsY z5{1@I==cb#sr8&VK|Ly$u>waM8%cl3qu4~n*%go@${}q?Ix)aLj!t-? zeC4PXyR7>G63^trk==l^94A+4q3UH5IMong$uyqReF0T?zz5>?I3B!LQ5*AMqazjx zIe5(>j#Hf3xwm42-R(=a!%m7qw+&XhJT6CdrB94mNA++Xk7sAx=^#w*cN*M#wr56#6WK$ZOnL`wW4Mkuk@I&)YPer$R7R~ZFmn_S4aB1?XiOH9Oj>%vTo14Om1sG} z-)45IS~Z5SDVYe@MPrL6bIIgkH1|SnC!43rv%yn!=?EFBf;O?sC9Ua)7SIp?B_h8~ zM@1Ke_{k~a%;2O+IB@ETic_O>@Zte8hA$S@4jHn}Jdy?njnt87eRe8Zno<I!xf z5NUk`U{_T*6phugjZm$}pyH66v9OfgfrL$3V zTLHU0(pm~s3{eVE&0$BS>M_*=IFcU1QnBmi(?CN#~9`}md$9|LIA#j&Cd?r`oL5q~*iE<^~TTU1xrqY=h z=c%qIvHZ*20rql}sbFx#ZPs)f6(U%w-ht>7OhNe68&!{vIO<)XI6W$k$~GLC6Vsv| z;0ZPKQHW0+cmSv?9aX`FHhzc)rf{q(B+4pOS36J19q==>lmZF7j!y)vG+|=dqKByd zG=H1UeNGH0{?msH>M#maWSK&habuuCgfs!wWT|mXNrS)-u;|Ut@QPV-6fI*Ab8*$i z;)lzRxgZ@;r>ao6Dy)-M<=2zyXyZDb4}nmQZil5qp}4!x>1K}oK*Li%VqnD&ju@Fg zbuP(`dzMUt4!8RB0dgQ7Zy|f(?%jCk1n%jeuBDT8e5{UIHKJWFRKONVBBDA#q9h*b z#8xu7!f_B7#T$iSlrsNiO{Shz)Q>ush`W(c$PaR#Qk86A$5Ex)1f@kZd>$-JN8B~( zr0Jv6R>>;&2xbgSjvGVHJwJ}rW)QSS6tQUKmyxo;+g2-TBSYYn`uHy zvr+1HI#Dd+Az`7C!@v9LXm$?)l4(nK0sNGRMY z>OkhGMQGG5)Q5=mc>4yHt$Vhfzm}SuV_yYEL6Dd`|`cAeCW_p#wZW zsb!?DK9Gt1s%9E1z$QkgimA4Aq?jtOj3QiLWtoRdXn`cyt&&)1@&{DT=m&;Cb8xT2 z+Qsq}pPFWK2P&Hc(a|)(ZWD8W3y8ga0p5=k(zIR_o@V4I60rd~Ojbe%TCt`(*3@Cq z4xMu0Ff6tg#3B%Ryr0|k<71gI=^D;J`|(ZzZWB3;YU+2g0lN7@sGhk0LbYwVQW$rF zw*u*=Q8H7WqvKv6<^FEmNgiOQN`nj>1PxoH_4Lpa9$4v7G|JFQo@XaCQCSv4bVl(v zYZ668TnAwhWN@^=#UQM4k)xy2?aI;iA5s1K-gKuCJx}c>PtLAAZa8+P|KWYFy`=T$ zQ4&r*68!wr`!s*Ja?H&4ELZl~W1rhMO43q>AKyFl^#cby`$wObF9^I@bk`A*^dQ6k zar@{OkNkP~DIedze$~nzH&jW|?+ica^4~{19;*3w>Gvn>yW!7AH{f}*C^*M*)B`K7 zIOMwEryl!mBR4dB3>aP#0QgVKdUg4Fm)1`&ez@YX=zCpbctHij1BDm<@zhISpBB9H zsv~yGiJyq)2{QbvhKJ|O3hsCFg+q29)b!t*UchsTtVf~?J zFOZ}t!|U#^$*x{G_~IT{ANt_$b@R&cEI@`|)GzDx^H;3D`S-6HEi2A@AEWcv44?4c z!;g%Yx<6j>?RE9vEMI~LV2;Wn{+CqD?J;cm{&NmlKI&-MTT_VVLo+<5&z$dF!G^_& zmczZ1f}wBmQZI&g>3il|y)rabWsa_o-+D~X1%MsYjrb3`>4P=d57wS_!f|gdE2??#pLixN!*`ng#@!n{ zzdH_{u=n?$R#d)-=W#N;^sv`MPtAU+@fXiwyDcB{(mFgM1J8fVvHaNUCwF$gs}J#w zJNA}8yDWj}1R3r-x!0Qi{yM@35 z4^PXn)C6ySviApTvVy>0P$}=Tt3d47u{=mxodtP{F-7Q~zf6JPpYbEJqhR?2Q z_(!Dn{AJ@upI6(x;Ql3e&Kbk^EgE$36=&p*Ir{zQR*#vnWFv0I$|n8+SKqSl))o&4 z{`-jse>?n&tpD{@ zOTS(#Nxv~%x;nP|d0i{MIP&LnTFRH~hISozGPUz)J-z#2S{ znc+v(EwM;B^{@BZ@7#aZ{q{13hI<)4X!(dwH=exkw}1b>>d>=)z4r}C>b*1Zd1ZdZ zfWa&Od;2kYcMQ&ZZ_mpRLbt0TKIa& z+dcl+<%g~pOVaZUuU|Xx&A^rWTJIX-t8#yNc@WPV=t=xt6$d>ze#H^z+C?SVhMXCGX~BnYY}|0t(Vt!3x7W};?mGg{fo1sf zhkWJx*YJ|7zTUrY-r6UQM&EYDLqBsY(%Vn`y!zS50Y@!<`N?a)x&ym7c7`8Qw50n9 zdG(7DOBa?^)m#H#c{RgddFJfXOIE#n^4Y73A0PeB69?fIJ@}v;%N65a8Pag!g8RH5 z47=vZQ@k$BKp4Jh;f+^)@zd821)o~!+v&)q^^&xl;ji_L-t@@wU%z|nw%03thn%@d zk{)LG9g$|sgh}&n9J0Ren?q;R+wnY6hD#H6zvGK&c|+EvrwqOIDJ*JBNA#g`=j=IE zlFs`hR($bsfj!r)x}T=(zrMt0$pcM`Zn2@ZQy5WsP{GDE?<2bnOa;4}8PZ^ML%<{}||f z;^RcgTPI1<`wV~oyGd`1FD^TK;INBVzjpU}k0j;6$K_bQjemFV!!7^$W8EeH{?9&p z?+<&Q&2aCWvgob-Hh8~ye&Qv;HYH=GhU0qQe4Qj6&+vOLT{__2f9yW)^W!clTk3l7bodR1 z?=CMt_+NMa-0R$9t{i>zaYNusy6sB*j}O1L;PFHEyWxmCJde~K|K^#JWM%l8nZG;N z9Cq^0vdtgbIPt?}c!oH`M{a!WzYl+U-SxlZUH$MCd;S;YZe;jnS2bL8^S}I;tf_tH z`PZKBnn38V8}ToB>aNvyN%4{68^7J_@e*1PIg#NneY^D32j(3x`t=*{*?Z#E)1W7h zGyJFiuU>Y}ht@9dy)bZ0=++J2!tP*WIhIrEE?PJ5_yeZ?`_6ZqRcBuLI_!?&*ROBg z_|UYWrC*ON92UHx3t-C`?wvpDxNp~0?OFUx`Te!O_ns(8>li+=?zVRx?)gOS(wsy8 zoILWN#gg=2hQE5lcYEFadG`k={86;x(5cH;OVYuJ9x+ZmyZ;&AUM21MT<*mE9%#A* zI=h77EB4>i=i3=q@Avr;H@^Dv!`|N{>3)V^fA?Oetl6(-$~8L;95{FSbuVC?V)$*V z-stn-?BnhI-Z=NqW18Pt0sc4}lVkZ~{?XsheC3*>jvpPpc+P>Z-3tB;AJyZKkq7l& z^yACV>~rj;bH9EVFSTU&4d+hr-k&}How<`7JMTSzIpCWZ?u}kE^Q;5E{bK35qYr=R zs|3b7D^AqpSoZ1q(6A3iRc0L!X?p*L-G916l9n<2m&dy1eUvz`=Wna>YTw)^h6l($ z%bgyzHrLZctIz_E6&~YUa!x}`<>jnY2xYOUf}->!!KFBX^n5w(zP27 z4$XSd^5qG*IU8eYj^)v*16QB)`iBoccK!1E=1n_$5oQ<+-(${A3qSehv?tf>GHBD1 ze$T?6pTzJ#hkSAOp|0>Ri*3_ta@o8OvVeO}eq>s^NpxN7RB;1A!C zV|nU^i0$H>x?iTu_$It8^y&K;e;Gb}W98f>Pmi`N*?;QSb6(BH*m5evCm(M;X~3{P z**Cdg@qd5JiXTvahKE*Nw&w694`aRjqQ(1!2OWziFJcCiW2s2IHZy1M=la(_aha>% zi81(}YK9+i`Sthx6lwgXCb#0-M(==g5HB%&)zA$e?*00?=h>cLU9joajex(#@DIBB zvmTrC!=?}G9KW5~Jof>_A%lp&=dladd~=)h*$-W2?X$d_^FTc3nc+ES?OD0Y7xxq_ zc;wu|{*!k@JuhYWO#8B`iRab~Jn6TdXPtM)iIeeMa)uu~>7fq}xb5fzu5bP9!n0Sc zeG<>c-G}(+w&rj6^PUZ}4|?#eTVA-J+sk;aIKy{&e^A!!J`Jb)PP_5bsy*+6-@bt1 zmvtR|)e|fJbI`lHOvru4Gj**by}|Hc-6P+-PQUDzKL5F5+}oWJLR43MV~z8xoMAkARmVRRu%tv_t!@FB1f;< zwCb7@tawW3VB!;-^Jwg~!~y4>G2J>U^3ksEV0>rzb&p2J-4Va?8UIfI-thjpBi_cd z^BMl>*PlGHY5(^s2m9CmdEPU7z}BB(xHbQdlKtOYwf?>7zcvKBe6c_J5xyzMa@?y= zHoS99|9(}A_WSL`ksG12hcdkS$As?;*>mh0t4@8(-u)-|)wK+->UG(KxrYz^D7V}5 z{qCH<@;;4IXse znknv~r(b~Q*)#l^6~FxZkHy*N%-X%jedAVaLb;P*^Es9oyZv_2n_sP6vdf@Zb+aG8 z&yLkuhDV0fJbvd38~Q)Cw83`p=(~nV(z^_QVbf)WmyZ3xUoRhZ%H%HRzsJu#mrfok z;iV9hX5p<${8F-c{8F+e^}Tp`@!E#C_MRN$J9QWs{(sE934B!5`96L_5JCcyAR-D% zz$mCJ*<@d4k_;r0Ws*r)EILjmlLfMjnF$2zf(=$ACS16YTRF4WKDT zKk*6*Vy>%c_?gQ}Wx&y*{m3KEgJ_AnwfkEG^?g{Ws13&38szr&O+T}gLK=Ze$;pl` zt*9AZ?ZG0NxD~3&+a5jbs6AmK%&%WREg+EVe}^hO}-|~+liKe-dhp<$tG|7{v_yIeRciF zeY0;(d^vCN^y$b(m3zCac8xD>`h&2U{ZzzA^C2hLu4wRk-B3~4RI0xT=p0c;a@wb^ zsBY|T&={D~(A3-O5`1;T3B=t|dn_Jgajg0i2I z?aQAHb;2Zp;;k*Jg=Oy!TxqW260(El`g{Qb#-K9@G$3^X+T+`~KUvw`W$@#c>Q*~5P8?vH#6TaV-D8KuMr;Dvj{@NB4E)!AFu)q^+BG$Cm!BRThS2fT z%c8Eh$uS1dx8#V%AxZ`KeJB7OyFPrgs7fS7=tmW_qYn5Yq~B$5dusYHu~EyxZX6r7 zM$1N2`oJ1LL>a7&eqtN%}Y|TKdsB zV0VK4SVMD|7k3Wu_K0s1qR~f{;7?G4@uwdMSp(VQ%-f&Fqzj@SR-y0raJ@@1yd>O4 zu@BE6s#2*Pa^kDfHZ1*L(?|c-dok45FDtqfd#9&S4F>uc`b90g+Rq|d;iJ;SvPYxs zJ?l+PfwcjgZV+$LVU7BJw;na?>UW=`A`tT)suXKC^^0Wn8;;nPlT(aY(htBZDs!kqvoyGnxv9Y1Kt&fjwQR~WA zAHAeei80`Dd-@#q_g+_ssi|4j=X=|zc|d>L*94NN^mP9Fe6<#pgZcUCz~4GSTbg~r zHGPa(qo&Rc{yf+*XKkP%up-dX*6PJ$a|^b1#VX97TMzkJ9xvVEpQF)Sos;=9w-x3Q zOW0cb=~iM(Yh*N|GBZ8HSM5)qhg*X`ozJ=HC#0V$0Kf^*9|HQrOvD1YSYoDnt6iSe zzM2YOT_Al5;ZA`Q32{zOtEVYI0&VDEO}i1((FSYFR47GTp+d>p$Rs^BMH{U`$=YNS zmTAI*2yGNDn^h=9dq#zlwON>t&e#-fo(d&vMJBAoge^B=rkOxQ;V z-6lE6#B5cDQnXwZO4c@;uxCuzb`$ol37d%-iN6yr>s2U4Rzwh%tc}Ln1%^_zu_~0T zO)_DVP1sBmHrIqXO<1J~+liM`fE)tqJ?ygpI-a0iAZ73MFe?8Y&?lxifo3M`%!h}+2Y$nzSFoc>`p=5273A@{b z?Lg>HLNWOeJ(Qwls!+0auL*m=gmI@eQlw}vnXp34=zmJMT&_YX+SMwQtQ~=Q`ixD{ zj#8myE!Tw2G+}omv{|_9RiPAZp9&>wH;&R{Q?y%D2>CN%TvtQdWbG*vw$+6F&4j&b z!v4>MeQ3hIFkxSru%yF`bcd=?viAP*EDeAERH0-IJ3XeWO&MYJv07Sd)x6pY{2H-1 z#-}xFK|HNNxEb3;w;&Xd*jCMhP(2PNsS_+8=sdt}08VoZ7;Z}nQ}N_Q&M=8q_~@K{ z+G>>px5V+^|4aF^mfQ#V{J)dW03_Ec@@qw|JW`vKW+;bP@c?-al69g35E_UdA!xo@ zI(`fA~ieuDjC{YI0>+Ad6O9r&^DXo z0VLb(xdLPCOfz<_gcxgMs6HtXOUg81TTt;SK^@Nw?Kmq{3#N5BQoEA6oJ^>*Ful{6 z!4y9}W$RGwC0u6y_I0#R)`G*3VpsX(3O%F1>}bz4pqb&&TmzbGK#kIY_n*mGzrep^ z*U-+AJzXVxBwwB2dDcFyZD981onw&z#G*%B;P@Vim+L8ChzH?g(%17~zWPMS7X&(z zNow-U*}OArn`18(VI}@HIQCNNisyNo+tMH*mEUcSeH4=}j8KM=-nqLjLPY0=AdVX( z7s&NIhC4Q=JG%thv8ABA>k5HwwN)6gb5(3t`6QKwb7jJY4ecP6l5Z$^UGCc)uP|k1 z?-l3D$pDw*{}sfmpq}W3LvAUewT#wN72@HKymH>F664-ba+~6J8)`p{-)-exRY@uf zicPkjNr790bab+l(_!4VQQNed2v3a}mS z9E)_hqYb~DD)eXC>znZ#q_yGy zP56z}u$)P|RbVfhp^web7YN-VvBQvE`r9M5V-eaUp&W#C+GPm+Uhq5!JtDE^BXqmK zt}yZbhtORD8;qKNSn!4;biag7MCeY5Ek=m`=SaVSuiKGeYe5k|e}l5hE8B%L>+G;R~Z>v6Xdf8Qq!CX&)#==>)S$ z+A<_WmXj2W8bbEp;3u(!;|k&@$;y+ajXRe9z7G2mcXkX*wN#7*LKkU>QhLfeyN>b7& zehZG8_m87U6xJAEO%B82tPdPff(Z<(eWI{hHaZLRSHJ^C{&JaG0XK38`xd_#w4xE4*Hku~c?J_(LCHAE!RNK8P@Nm`7gJKwiWdV4)fWNQkQI`61}x45}FMsJ@jmdie``(ajaB$TNg%k)6&D8A*#zrf{Qp-s$@Vy zY0bYc`{oeUeTd^l94i%HVuYx^{j_jXh>8vfFXC9KXeUBc#0gP-raxjYsz@rliwmQ& z*4H4VF~qT^#j$QEEo*&EQ&hyUQVq9IS?g=Lq9Tr!incD4mbJdlQ&hyUQl(j_to3!j zq9Tr!YJ`Q#T3_!fD&knF@Ww4Hhx3+=gb!nA?;sT*j+Kg*I#jMXk1YQ@L^VZG5ywh( zsD*0A%B{$ikye!o5XVY|_hw;fHNUCwm5QxA zRIbO$4}l^WR4=IjajaB_Td4fE9*e%np!!M$h-0NX!a}uUVad!8)i|0oT*R?bjR7Q- z!%IG1l@X#^q^O8vrDEq8qT0OST7QVDRZ$VgN_C`#YTcLhhE{8{Mo|&RN_Dh_%4%(HQdGpTQe{}Etk#CZ6<)-#QXK{IHia1uP<1JKH zX*{5)h-0NX!9r!VhwmsV;#jG~{WCoWt34dV&L0G+tXZ`O|y`14bKOJ`X^Z2hCla_0SzE+%bMPlKcrwi5T_|L0#)W}5ugx7T8%+TY2YzA(q>^~|T#_A;C#-cajLQ{E8B*0<5=t74SCj%#~VQ0sE+#+J<&tO$}=v`^w)c0V2jfTv3fWLL{H61yaKCj@HNJgTk2Y@xKgZGk@1?irn;d= zDL~LXz+AN>UrTLFcs$ZDCPbL9nDB5+c54l}_9Rqm9vhl_!ZFTjR|UaJ^cb*|C5=?J z2won)KL%bn9j3X*HWR_kUE1QsQX$=j_mMJiTlI62V#q)>cBImcdmmh@eRVytbNPI$ zaCo2+AkJCr8_Cz)qgq=ztt!P)ZY7@fVqbGzu-=w0?}T{@f}=Tz{6>7jP#xK-C7#B% z1EyM#na_#Yi_D#3@*8PXx~EZYci5bHi_no+PIR&XSfyuBr(`y5SvK3r=#3ki{O$z{ zG8bf^nVM(M+ZI(V$k0y%YxQ7~xowf&8!uUqp{5eGv;vlG)4?iT@LRAT>j3h)ER=z) zerLdB=FV?y3HS=--McMUTYw3bSYzR9wZ)z@cPY3n$Zx?6TyLiqm%~6W`%?vZ4%9qzZ4_52NsNU?rro8;wy6{DrL8!6 zc_Fqrv}I?ijJhjvig>`|4VA~1J=2I=NT~WZ$8u%Xv!ckW^`Px;`*5r?s76yab)^i1gL={pg9K(iF%XE#Z(7&$5 zlU`31&+@ylNZ8XT1$Xe=VtaGVQdCo{#gWDnYVah*abhKHjll+gqpz%bC9FummSwbe zoO2tLWMG|i1MEh1c7wUssI@Z5)3Rsfq=#Ku**P8>C>mDr=OUc zGb>l3PD?IMDAF7WTZ%S3tZARA(OCEwHi9-{^nPa8m{ib`Q}Hd#SKU^pe`O=A@?uRp z5@Wd2uNMq_H^!({OU(=a`o$Q&1AdD$CBiP7mT3$Bw#F#FO#B*n-zr>W1N<^KNAe?H z!p-;>cG*(FFYF5+qlkCV&G;8~^@ca(<}f4#d&3(RBVJmJc!$P_cX*6=N5+UZK1RG_ zV#GTxM!YF8;$_8%cVdiqvtq=X7bBiMMm$H1cttVdmBffw9wS~=jCjjq#5*NMJWq^x zz8LWuV#I5T5%2UE@!DdC!oDtOxV{^RiI2d0@OOOD=T4<-&eP;wct*Pp#Q$UQ z8~l4sn}Q!Nkm1cX@Y*>ECWJT{@G9V(tMK?nSo-sTAmT~CNPmUGF<{z&OfCE!JmC}Y zy9Rhqgz-yHMY<9G#y~g(F9YYbO*%Kek+-G7--swLzc?Lqho+E}ZcRG_KVH4@WB%3yXVX18 zUT@_+8qx14938Xg^6p0D55W8U-st>BBYNC@1}FXAll(Xrc?R%W?vKuIJfb%OXRE^N zt-Ny)@e**79*EA5UwdW)r$yoQ#*g3R)&l2_2cz>#Mf5)uj*i*0{8GVhC-A<1D1x7^ zraccH9kMyEBTteYiCd3=Ztw1vA{Pcdt!Ps-VMx~ zSYn(cFm*{jrpp!3@y@TPoS2R|fB~%Anm2LQ)Xb^bS((|{Q)f<0_Zyqi+FQN#7^i!K zZLQ#fZLks7R^8a(UF=(1*|N$9!mL{F%<7!#S)MFk)=Xbc^~4G3(+V65?KlmuxF~P- zgf{M0k3EKB12J2&{(rVG-Cz!+2N3Hg}%Rn%oLppm^NFRo0gEyDS5+@(vbE9^KRCE`lO2E z(#!n#EY)xZ_DxF9$An3Y{#&(qgXX1aUTh^5X9hKIBT4ZBKn}3rD}}&{P_j$(P5oV= zP5qbTufQRoD8p38GKc1Es?nw_tcf%66~-jc^eNu-Da|d7Ep;vFQ%-Km&dkKkJ6pDR zatEj2p&@-rNkL8eltmTkQyhg@3hgKa$P^ znmGkIoRyiKnPVPsP#(<3>+AF>ePJzXLrJ0{Av#`hV)uytQ7hH#CzFV`-0GZ$elq1| zge}eeWMUe~e)5SdVL0Cj(39AkQ$dkE-BqyI(4z^+SX4c;dxMzyT^{U50m4mEQ%ip| zCY)36dfl{2Hb#OGto7jKSNfENE%7RNc!GvCg(N0`U+f}>1+!Ncmn_U*QB;~=Tvgzp z&<~hJjI^lRz>1}6@9gjsfRJdVGkwZ34ULvR)%2pA10bJw^j^d3)i`xNUNIVG7ro6l z_+{W{T(=;={%@=TY&%AuDsJ?N*>HYJBG&7WhEDGF_~mCSLaqCHozQ2d*|S68D64eH z%2=f{AB<&{&S6*)k%S040AAUeNM93yb;hAJAzTkK63_JMxE>_57KG4|fO0KJ&|C+? z^(6FnxemnF9$MT%G04IXIi+5Q9|_!az{3`Og!Smi#;ml<5Y1~H*l|^nzDOfeVERAG z?3DqS5QDoRe@rr3cM+a3Fj&X6V6$+Kte*hjtPA6cte*!E5m`T^Vg0n=SBf0zSM>TR z!X%Rhd{sEZccAsd@*k?w=s;?G<`gSlr4Rw1`HGkqpF{Gg*Mah%d8T}labKa}b080v zV=nIFai53#@wm^&os$v^aL>ctf%{_I7vf%qdok`_+)Hp58Q>l%*9#CIO|GvYzBEGb zNyGfC$IlU?T+fbQ@hLdY^yal*2{ucAG@lo#=QA;Nn)s(gJX5T^7%zhV3J>i9(*Lnc zl>1QJ8x`CMd9j@3xToUo!kyElm*74L_hq1VaLN7h3<;7Rxy7xkMn_gFVy;`ao86%qA78sdO&%=%r$6DQ;YFu%(LM9IU` z1*@=&MrbdV3YtcU_5#oQp}$(7&C3s)B5#OQE<^s|^ipZrw!On{Yn?_h#Iu;0~P@`J-}0{z2SPS6rvNt_t_nxUKae$E)%0YBnNhvsPa`Y^6(Y3B5U7^`6p z5|O^ZSQ;2q&1mDCJAxqLQ zy_@ih)kfn(EWAm!=_-!6^&T)hVIu?joyOtyaO02)z;*x*L41v`(X$r1my)&vkWO@4 z%`I!RL-715o_Ss{Q*aYVvONHvj<$#W4BLF#p@7irm}r>3)~ai=(GgI1H1v>{Tn}aF zn$5cKD;RH-1NAxu_Zk9lT@4viHrL>ODDGHmE_VF}+$Z7rM%=S---tWy`z^T7!~J)- z*WMKfy=RXTMr4MLE1X?hGhV3G)MC0?qc0dQ%ZyCP>l?^qRfK*SC+q=*Svnyf~-30(t$zt!QJi8T~(4&Bt8k#ztV^*9&53K|o+qWiZpi6jtgX)?PVrrPsG zk+Wf%-3~?0cA1I9!k2yPU5d!k7RG8e!j$DfxHFHuUO?HI=NEB54EMj`el+ec<4&Ac zaA*6-fd`SU4Nm(fs&}AP;Be(HE-Ec>7nL}Ri}H&q?Rb}!cak;^7*v3v8s5znxGF1( zN*B4EWv)thep%V#B8N6nA*6;QEG)J!a+APaS>^^CM}8$t&fv6VGmvZ!*oyTY;1QQ;`fcVIB5GaM8iZ)Ph=u`DZ*Y>iULLv(OKS$>tk zjT|If;qJ=iPKU^lB~OWnTv%aWB-BTO>u}UjqPDE0m=YkF+roT0=o2)jy~5>i=i5um z@Fo)CJJ}(EV&ni7xv-+hQCd*ET!g}iL=^#fR8_F(RTaf%u@3`PzCk5&AKD6rFBS?FF^QC1>ZGh&lf zEV8Rd5)J*Ep0^YgTT)aKN@u77x*Qct92I8r!whhKp`*lZvN+fP7eTG4oh-p{1uQ5l zu@{w^(oI$1;<9|Zsa3>JGng3CRfGn=5h@pfmwoT zL-xulmwO?a4;ovA!&O#Q0X=0~{T`&rT6vYDV!6A>g*N1>v=2*;>=3=Bueb1Xtm%9fTEm)Q&0vdrub3P*#|S&&Xp zyatCOS$O4_l{m{vk#!gPZCwCK;mE3V$axs%aSC%tIA&PdVW@^wlfzM~T;ykmCKTkC zIhW(pu%2>CIFbttMf8xgt5P$>GAta2ipOSZUt%vRw&xW)wBr@4gTv7zDSjQ`7oZUC zu?ly1IIc*?wH$57>8Q}vEJNWL)>SkExwB#!B~9zbt;%WE+IYq4kZ>fh3PUmYj0{I{ zR+Lqi<(C!b7u#Jf7;LsrYSE$LNYdb`V^dV@sPI@c#-fEqj)LwoGb;YDaCAK-UAN5! zXCym19J7E1g~=N7JUl#>MMor4EwsZX!X&WwcuLxzYq`rUUvc30>jgR@oEFWd5~^8H zFYwC1*I0CA1+42HMrE2Q5CQM{}IF3C(-{GvR zu$L}!xXffGgk$KPKKfR4(MAhD+KN!(wC7jCMSvH@81oY*U3g+ts9gX5%L5h0lpXQeh(B|SA95e?B*jg+m~A{5`B=D(J}^T_*m&ii*-Tgq2DL*DOSZ z_?)S`b#O-V3)uqcC=wyTL^v77-3@PMNvOvp!T=M2MRQBbBm=5F;}fm%uF|4~=n5C% zUA7)S(2Pg(MVEsbp<61>o=XHnE(e9M9C>B=&_`#Lv&3F%U!?n&M<{NCOuRf8i6up4 z6)rQS!DbvJMicKYS?o5j8iw38yhAJj%mHLnbrnq9E9X^nerx7OkB1a{?MmWnQ@R*9R5(d6x6}$?1 zng!y&k<~!OimERSh^?0yImF~tY0t}Z6u9#$%9heczz$qG#z+&x zgKpGmg&PXwh6@OHQG`ak(Iy_o609*(!wxrNjI32Uic29sqwdWjA7NrHbU2V1=gCDgY&(wbef9K6RLuuz&b+UjV8w zIPD3LVO-c^_saY3VG5L>Rp9jkv{c6!pvf8`;Y*4{iPmAPt@$WEz7rNXsgjG`3#*EY zu@#LDPY^ge50?vmcPYFPX(*(D$pcNPW2qx#_|WWJC=(lRsm>OLYLP?q5uz_~l;pvk zU{fQ9MB#vWKHWJ`(Z~TA2yrNYS*(O15++6#2kO~i+d>br5dCMRI9sGf7DLo7N2Sas z(y~WWXVNl)9uT609dI;3DUeTxl(HQC_H1zB?cOZ?Seb3c(!=F)D|0ql0r-;_VAw5$Mc` z4fV-)m$>p_v(ZIK12Vx1#sMo~Pz<2j4OEV|2}b3@PFKREMWbS4BM_CE?_TI!h%yS? zKt^=|c{$T67JEr#)G!!3m+F}&YRC?_>~5L@BM+!dK@H1p$gltxwuPu6+X9$wUO2wi zjftQsdooTNnwG%VopSZCAq1Uzk|k&$6PsgLCAj%^eQBa3shb^zq+1@AWB^{?Bxpp7&O2|7(Mbu8Q}++ zaC`n@=qwEy9N?j8SDUX{SB2irTRxg_F(dlzq_mqMb!^#*mtyu3zQ2UjlhSUB06LbT z%_ODWqJuer!UzXKNlLpBpkk*<4aDJqQdOz9Fu_Y8U7gY(BLe$=4*b~_2*q;%EQA{) zfK*^GUnW~LwxqPpKtWD9|CMhtp$AE6*P);bF+}C78S#MJc1#Ntj@N<#Ujs^^l7V~v zNPK@P&6ASU;7c$xt;k*q6Shdo{3h7baM~*>?921$WJs!HgH%mU%st=s8t-}~t@i+6 zaU?BDb(o@BhOuB#>B2HeG*2%8eGOOTB9RMq9{DiEz>iDC81~T{m*g+i8BsLCd<>XR z8p|D7Dk>|B@~}%oej`>K+FM)k9cw5ek%m@PT!vnXHMU((vZw&PD(aSE*n{`kMNlG& zv>4y1i=Fg>VDzTvLKTzJE`vzJ*5E3&o`9HTh>4h5XPGH95jbOe!hz-mTd-Y>v31NO zAoAsWcV@C6KlBv|b3~HT&h7~_;BE0^8&(g?J+~J==EDB@=*N=8ym!M4txASRnUprO zr?gy>mNVE|BJ1cEw)%WxprwZOZ-wqDuTK z$?B6Tq>5juYk=MF#{_XX1geso<{p8lMO1`*PY{d#s~dd;>w3WUlZhq>z0J3a{UY|| zVB{<+C~*}jch`-N2UQM9b%aXQ&2~)%rrBk8Pjd_f$``V+}1^4OQ9H;|u^kMQ34@W(F&$mIs z=_CVGkXI}^I}H7jeokuxrYUe?ew#NaS!Q!^;T6BTQYiU|iNg!oSfv48g?f?KRQLjt zf;>GBjC^}l9&Bt<+8^*ajh{gDSN`Vb6PL6dnlPFp!-~<&tw4KnE-ol^6gvfnh5|UI ztsu@29fl$Qa;*%{S3!zcX)t@Xy8^2Yg6LQSzPa4SVKVl}nan`C7mLP&>BomZ96MR3 zDZ(BJ6qS(8$J~>ow8owow&7H_x@KQZI(7$Y4GL>3$V{Y1a4*TRSv>&R>v_R)`=Fw9MakMpRm)h+xVz6b2d}`OD+=zO^EQj8h@P!m& zaAV6bb7As(4(Z@kHzSpH;t?8QLKhZz<& zkQKJ@PzQ?6wMt(vM;LiT{Ct$e1!gDzM9gN-4qzdD>srhqLP38rrf!#T6}7-LwWPF7 zSga+5S4W9rzpPNb9=Hg`g5@|EPGRXbYh70xsnI`=RSKz$A-OHU;q+RgsrYQN`#Wh?)oC7gqAD-;opqh9RQ)J5e_ie92Wyi?Nf;F7(xtJ zY`r?zbFnXi1;-KQEw#1cWL{+ua2Gl+_S?XiGb!y6quQ{+QlxyP(ho7(cSt2FJ=maL zI}y|m8`SQqW~AL*2XDe#@AIz0-Kag?j?p+svz-UB8!@v-uTwpX7R_ZDdanX%=_te8 zH8f)mQ3D;AI&5`^`EQF5d$6IU*wl;Xue*U0(c*RXAw{*S2<<@&7+q&n6!y_`LpD7! z`AOOy5~L&fxgi#JSzE9nC`P~95I;|}^sd%>Hq4$*N_*ePp0a(hsc;S`AGPX!Lrb6! zy{F@|+{hfH;m1^?pwP@09jP%YgeO9`VkfgTs&mQ%;ZB3lP>8uw^*!j@WcCjc|K>{v zS8sHW)LrxZ0t^|G(*9&bxr@SkaW{4l8YK%?_fYmjN=_J6dlZO%X>`A`yW(8)FXzm1th-eC#9|G5d{-Hn%25~JUn_bkbWJ} zI3io9h(QWh1?-1RW2Fqkfx1H7Wl3Z9ouS`7nSxM7Fr>OVz2%@Pn5*GNm#a5p7)02t zXzfuqULk92@8*`R0Nc?aYaiO&tY2)Q2zl+nwU}9%ly>Y-o@sC|^aR|ph!kCijKVX~ zhq?2xjiaa)#xZ)QQQOkG2Ad0pIvBVDGCX|6D08^1BWybkSxidn>_Zc*G~GKRYrJxl zL)sA$jf$p5pK2z`zA~bZWD)4&4>BxiO-mC-0m@KuQ2kf4TQe(Mde#V?pD&X5pJ@~^ z9IB)5+(UY7&Ug35l_H!ku%#duaXlCU`=5ZFtKeqO&rhggD^r24aGS8Mm&}H_w1Z0HuFQZt7 z2Ph@dMPPC^r5Qa5B*KC3kA_BcAI^x=SrS$g?mA!3PUlaeHpoy3GIWX688nL((U@at z7<3a~Hp*vp$K-X`PBRWVx(Y^~O+=SE-rUqe>bfVwCURl8=qZPg=zA)CD3+m!eikL= zz-xoS(&~tIuLyZXG+9QI1iysY}XZqc7h>Gv9ZbgGwqxbjHyvmHmYIt%; zz$XKPaYoMFC2iOMM&8MNBiM8n1ZB6;{`EI_;x!L9+#?+Z5qrGYQ=c#8vLd6zY&7}B zJKSpJHG8%!G)+odV8Gp#SkJNA=amXvXVfZvb7{0#)TNhBT8hQ5u{PO0l}bnG)e@j$ z{YYx0(eMAPNg4i6J5v0E(Mo^r6fHgxJ@-3|ijy8!e`!LqdA?zr4dvmeH`FSkxr^*R z9yXL3gF&4sjn(s!P{?2*HYMg~l5vRN+(SJ4d>w(-psqUt7u{kq1Nz49aojJOZ#$`> zXLpZ=%3+Mp_kOza!)RFKA1ZD)BM_-bMBrek0?Y>Ys6GeI%utY%!E>$ARQj30NVk}8 zdwJZuv@GMq0NrZR$GpKP3dU@`zBJ9VT72WZ!2vc+2+xHSm;OY|%%L$~nilIU-v6CN>Ik`l>p>Vb?{B+DFkS~pFja(`L z5Z6jz3XQ(Tf~Ng+__p}|i1{HELdq|cz%xElG9%02=VZ9~xv9Vx@U}Mi@nYTb!6!RQ zzOB$rhSS{Kf>&?R} zzLLl=0Kr3Jua2Da(T>N0GRzFs#mOw`G7*9y!1xvt#s?i5B(C&9EI)T6Pn<8rVw?>q zW||b0VCo2+hZGdUukUcsRIR(cL{p_(%F^(eHD^>C$0VEq9f?{_Or{rX2W@gEU zt85e$AFhg}kXwPp?|ztJmL~6T0L|x?O&=cXz5}EYi64gY5H)big z%^bV&jnS>XG4hKgD7E5zrOb15KIS|IjjzVi&AjFr^991P$=A0lAanJ#ms29-4b>5n z^}fIE&J?*(quMZF@(1C<%HW$*Gu%DQ&7e$OqO9R5vdcY|6k;H#fS7HJc|DjyE&Ms% z1(mALgAvgd^eNiu;$CuYhES^M87%LaIxN4q$SI3)*v6Xx%eUiE|1gXkYHRe)SXxlN z(Sq{jkp@D(S8~0tKF`9KWWo3Ra1%6Vc!SWFFktpAlRqPrC7H>>*C(8Qf^3>Kr_Vs) ztHPsVtcYA``WJ};<7gi0FSBOXGcKlph9{NUV3{-^cAhh;kiME4B_`@m0O>n(VUlX4 zV-eDqHO>3!stWSZwcHpiKNon`t8+);{r;qGZ z6fTsr9E%|4iVLpYRkCN8nKRBQ`D=H04_TwMZ--EdT-=i!U!6UTF8SOfg=UJ@lNdy- z833cxffz7RfMVqwFLXu()vTCvrv(GLFMKpV%;ec@lmpOfl)k_VtRwH}l zKLT3hz>ACUnNkoa=Yj6l}sh*HvGn=|@Ss_blW z4T=RXQZHo^lf|LT%9h%r4pg}?tGH5{9H%2WWi}EOg7zEoR3@A=-70|(k3{;9gV4I% zdL=_$XjZ4knD$I*!G+)@+^Y)3Owa^HSRiVB1HeTUK5t8FjkFQgYA%v)tZ7({bot0a zVAF#j9@*@3C6g{$)63|?n9+t7yjKnNt9U;f%*h4;$58AgLoLqiBH%U9(N;Neo4X~qr{lJUba}D{YfEkW~9;B>E+t+9O32a8o(;YBz7!A6jPTBJgJpp zr`S#ULzJ(iO;b{e5~=Bp?h>x1CI-cnw;cUE^LoC>e_?T@Sh@L37#y*%mEAV(wcR$lYYP$m2HRoeW1$+xF zr6b`q999mHM7F3Q=AYxWrBdgt3;KVdE`t?DN5$=?t1>+o8bqX-$fih5d`fl#U!z4w zAJOHA`l1h*7KPBkM;g5vz#A z2eD|hX3~h6B|F%OZ)jv!<({43T)hG4tNk1t^f~ODRE|y%xqyiHVqRP)88x6ua_(-g z;|8WccUq0l*bM1hAd9+xK_`w5JJnR5p(!0m6xE_0lp`zpWKi)0SxR=HP1W*kTiKT1 z010fD=-U_jYE;%~OgVz&@R7C2Da3B<%~~LB#>oK*s6x|-rvT?aqEf1?=D4Fr)6Np| zO@L{O2w=MeQ&=d~G>Z*@*{#yxR$3F63~}u%Nc91@tm|T3giZODI_>~gQ9(n%&-t@r z)49C_=&%Z|6f;(&Go#*c2?D^z`U8Pe3RLir-DYPa`7M@N8yw-tV|W$OD$C^U9>pRp zj4eTC>{9927f>itDpsIyG+ioI3+oWhxs13Hp%kh!Apvs8G@CE5NMjDZ?3)q_eXGDf)Kw1-L0yDRq2Fwhsqf6>6Sy(D5_#p|ggA@x# zYe1EV5nu?k0;zR0Z2kR`%ygEP4OD3oq@&-SZ`YmntH?fob&vxoL+ka#docCcl0$a& zZq?WGEi)HY8U0v3bgBpwSn)|fe``bI_HCbr_e5b#UBkR(7q8!z`LaH%9WHw+J>kzL63TUP{rXaYnkDj;`%N{+-x7F9G+|gu6>qM-IO8 z+~uw z)vGGs&VFR2radL_3;!_fl{3Db)cNtBp4)iS;5#d@$-lto+_-P@v)=0e8wOb0GX?cHOtEN37 z@XD;Ke|+KZpI_v8_|}z&rUtON*4F~xwQ9?$D?G>CbM=J7j%xb;Zfp{iIe>gRUSIoY z%7`id`zU?mhxI32x*B@{3cT)5)k#%1jlXvAZ6`goudWt*2;C>}Yepo#dF6)Z?%B7i zF=4|MJJ6qgF7TP}Z`nFS8}#gg-J9ya=s0tOrcF&G|LY1*8$7Y&xKrnKOg+n8R-J`? z*#w??@Tp%Fc~-3r`hQV2+vDA>X|D@>!0=1n8TN99?Y(I;j$ZJh3mb@ygtg{#e z)$jifdzJ}&$kMkS-Cnw{;G~&He)UOV$t#-nfxz=le$)HHDK9kcEj{_rj@-X*#x@Sv zkSsM}&(Lp*lSbS&&pG|vd-o4G6K%&MaOVX>H{N~bKi*w+%YCQjd~Lf8`!orB^PaC> zZz(8R(=;sM;|1RyK|`9VqZqDppT?+Yociwi! zC5da^T=4GT9}oF@;I*1&6Zp!TPCf3Wvlq;H{kgBZzWHSA1^Pi|sR`F-e)!f$+s{Ai z(;J5mJ@)V?R^mVu!Pnm1_U(f&H5~uTwXZ(^`&|#<6U$zK|83qb=RYPbxb^enhNnNa z?JU&!3~UpYn(*3-m;PqK##b-6bYsr5)85-Q2m2NZ{N@?2O;~mH>L#?dFwkb8?jo~eKZ|(Tsm+##FW{Gp&B|l&UFYpH% zniFQuKK-r<&kcY3*k$$k*e6lo+RVcq_^f5os>JI%kG<~&yl&Qh5csKM%8`X1TXU}c zRppq?8}G#4l?Rjm`oTK}otlul=;B|0JU{;qZYX-Dz&B61>7rG0j`;Y=H|rn%@^`1a zgab(7^ZdkGW~s6EFT7au`nj zYl|jbyW!@nUtYHOO#h@OHlfp4Bk&8ovtHa(*8J!Tr$0FMSC6iToqR;#StmR;e%0eg z+Q*(fXW!p%xEKBAHv<3PG~dHnk3YC8aq`ye!2WdTR8A`SAMsXc%JCU*{&+;$wvU4g z-Z>vWtH5`BIs2^{ISVg6V&b(AzVYaDr8v|^;JX7~KEB2O-yb($_n-fcJMuWR>)iq` zJ9S~peIvG)efGCm*LmJL8+K_4Y+q`^Im51=U3BN=*DU|%uq&TQdja^D3;eRrpD*zL zrFrIWCmuC*?LE)!MLh~U;lc9neP4aoS@U@Ny~QUKeGL1Cjx#l(J!f2c$KEq*=e)MJ z?VG=zITx=b1^(Em%$b9hf3oSW+6`}vEqLq>O}k9sIV+}4s=5A^yRZEIq2E98_6L)| zU*Lbd{_N3@UwGK`fB)*bg=ZH%^&9YqkC2-1z`wHJo%YseD~6{Yzx`Lk?%9M9nZOTo zcg+3A!`}|Q{G3~+o%O2;uo+hie7*0D)z6-E%$+MADBW7K{_RU}SdPFSTE5Tm(8(8k z>$bbRAIopKQ8gZ~ARpZXWYJ_^%Q84Y#hk=AM7Ju6wBFy}!Nj zw}EKy{}A|s7an==5iKxfM&s_W&o1Drio*{jpTF-uyX(o?L3w%o5{qJo_*_L*8>Ph?O zPnok;(|#lH*YEst?4$o4^wi8Bvp1Yn-ti#pw!k+W_rt-vm)&;EzgOP%`m0;YzQc}U za39f6y>#5gyKmLT{55UXF;6yK2i+_a_#Kaq?R@B%>czJYIpT=ZmTr1k(=HMC{Ttsp z_^DIY=Z|>n^8M#DzqbMW1^(mdXMMH&wcCHWep<`5r=IY}ec+D?Ey#b%?aP0A!tT$` z-h9?Cp57HiKUE>{se|WDnKP_?&#NzvJNNq2KHq}&F7P`qUtIR5q|@I!ZFWKOk*9Y6 z{+htA8TZ>e&wBmuB^OM*!Rg=ohhsGD2uy=XO&B-u>4_gqElE7Sp=rmRhkf&arkyPC zz0V9x|7Y-ol-gaz=MQH; zwtcR5#Zw78&%?$RnAMS*aC_3PU%$z-=9k3_DjxH{e?I!Vr2;=~%6ku-(y;c+e+>Qg zk8i)+`4{X3FYv=py?f2SzPRZ5hYmUFhcidK1iSr?!2eu+#DnL*`Qesl?&x@;cFCpf z$Upkp)P(&LK6~_}&t4g2f9ah6*8L+0r)!14yY9c|ouyS*RDAwi(aEE4E&l}k1^&XF z4fbnO>-H{Q_Jwbq_mdr(_J0DOzutEK=!pj>-Cg{e>#K7%e2xAcwk9=U(nlqyo%xq( z31=Qx{`sk|C!ufQ%+u6_!r&XrQ;+=XsQPU;6pi?GE9}fBfqOUJ@X#;L+=4gU*Q_1q zJL+6b`&8iPWS=?cy!86^;Mr>yR#e~Kh9MG$MyUxO40I(vbL!VWd{|fTU03sIPhwwN zfv>#rjwilpX#Ao&t#Ef^+33qqj{@I#?Dh|jeDm@v?0}{^0og&pQ5&wok9V zbmL>sLk|UB`pnf2eR03`>DL2RjO#eaaRT&k9QmiUWo+O7$L*)gdFq{eU%u*~SE1(u zzhU6CTeofa@0|ZTWMzC)qA&(8d1@H%y++@@)30H0fATT z2|6!!m!A99#;$kr2Ymy(nhu+lny~55Ez=(e-14Gp$bYu)xP0=vns%DN&wg(88!!Cf z@f&V@uJzIDMvp%Y{-nSwhTbsqv|k+i&$NU7HsayaZ+ZgyCh$`(->~kYgO0kf<+rOB z?@YS^zQg#V$^VH5Gw*k7e0t$+&m42^MVbx$vPa+-JFB0(fAdYJ{&j!qje}1ZbvpLv z75JWC6+bW_=cxO}I|J7rT$fVi5^TptwLH_5K{QBXc zN4zoqs7((oEEseg0n#Opk*97slFAy(vv$u7vKNv4H1lL^C8ZUKIpuH*XVtea&j#&H^ zj#b6|sc@N6A8+yv&7PXR#I{;LAS)0$AZxYPILv1SHeJOl3_W=s@zT`nYibCr!1Al= z7ARuw3T$HETI0u_-fLIr>-?uw<5lh|zo%wJYfje86(ow-06?9lw4w=nyUM91UVoe0 z(^NA(H{N2RU0^m-ywt0LP5shr=;qHXAai|zJJ8bTX>EwR5$g6QUO_?3bu|q?b6Kej zIPR|>dBg$oEpfMYe`}z=4=WY5!FXGPJl(wMXO>b(BTy+h+0msHHN&etSm6@4LN$5Y zqo*CUCvEOS(!CR-C+kn4WqNf#tH>*df0$l^evnh0537V^2NHD}mK?Y=)$5JVU%&}r zm}2bfhlm?myum&iLsa#^RAd~X89f7088qU+$6(z01%rh}zWuBzczN9JucdW`+7bto zV){`cw(r(HG&ib9+A)8ID?8$KKm$$Q_f`tz?6pOKALIof~l#ltM@hb;bcaw zlQo?DFcn#duV$cASUnnDw!LRRxEi|!=)`eLwl5bm)L%Avl(*K~*e|M}ys(E2EzzVD zm0YOfl~YY)T_1L|kF;rY;!PY?+}zkl^1WBFKTz-YcvsDgH+9q%&O?m5fgtk%tVxVF zb&&VNMN(zYjW_kiGkooSEbxt&9%j!N{Qhjsi%z@W7zXv$uzFVyj2Hv)kKg!i0Gorv zZGS-T39N1I!z@I}J<<=TVNq{okJ>WZjadRw9D=9}IDD0922mLFp8o(kk4BIGrzk;m z9gSKBed1|!2ECV|q3P!yabaHy%=L{of9&~TzjgATx)~a8Tx55GxNUS>Ya@=Qj<xo ztr43Z_9Fu^q#v~acwqwnwI3P4n&#RyHPOl+J$-$I8;!nqvm?iX%V4gLW*0pRvWO~L z4x*A{7=g*NoDCnJ4)}fWYUvvW+@6{~EL_x#NHO|RlkKQVzV3*x9C%mK4;QgIhR+jG z3(rp6(-<}HQRxF~{HTLqZNElgfz^F@F;TOi)F7Jpqtc@#>Eo>UIbh*_f2^T7%!`(T z-kURep?<3Ygn;)9@ueSTPPjpDgSS7ekwaCLleis@$akFZVp^J4H2A%4beFPUb@b-m zyQss9%6$d<==%H8yZ$nW|9xB=7S6BfqXX?-3~F$g6|Wd+E`xzS#)eUar}o>4rm#`z z)dmyM=zA}IQ&V7VAZUCo>22`TJ3Sg~-|xqxW*=Qnw5&&^rOC$r z)QT$Wwb+}d4{xw{StF*VW>udrQ=?|US07!}QHe2(a(nvsIs=_>UlTo|W`QGuKHs-R zz%e&gb0p6Vgu=0N@1Z4*~sQ zCSrkHEHP8P)h^F!UrmLtE|5NjaHqhDggB?C)zcIpfwl*8=dZ!EvB8=Rvy>T1(F#-u zN53W+u!Sm=tgSF%r`d^dK0z>p<9Ks4XX+m zLLI44vi6P%`#%%5$As-QVFg$*@H^phi3+7?m#a{+HW72G8JnV=phC%-&4d-0uuBlS zUAVlfLMhq~6-w4_!>oSBrf8c~C|P^Rggs`$UNT{?n6LuO_q7-AK7Uiy;4K4W6Ri2!A}#kk)3(zfNis9DA2aNNfL7G+h&_A zA;wBMK(H+@SH*U0p6T3wsCwx7_>`?C9KpG0y1o$g!DSjn4}}5_kb`N2sxWO&X}wXzhX18@aJCA?`Y4|g2Pwt zr=-d=E6iMXwC9H4x#92(EjUcDGs2;h4CthA=wt&r*?@+LI4o0;N5`(D&XT>)Irb-X zIrd7f#&?zM4dv;)&257atL;oi{5G2|^pd?DYmv|KT~&L#@^Y2T!!S$sZnI0JT$9T;Aveeg?!sJZ7A7MZs^GCU3qgmsqL?KmCx)%=^Y<+I(BuH?C31{w5#gV6A0Ng z#<35Yk?gDxm4=pmnuw((PI>BdZ11dk7xbpalhx=gA0};BpSli7b~^T~OkQd0D%k^> zyj#)b*sjFe@yy6@QHoxn{44iUiM5)I{O|18HC6&S&pJ0a_SCS~&^k-r-R9WEP?zJ~ zuENnho5&Xqmi+^(H)x;Ivt)$Z$BJ<$(C>5PIn4DBr0gIGfvoetFD9>}Rm@V<646785xQAmUNf{7p_>GDu^IZE8M+^#_YgZ$dmo`& z1aHUyBXlxCw+ZY{Gqe*SJum4{xlKaLwZnR70YaY$tRA7?3+=BFx?e(9AatLEwwieV zLFitg7(7tZo|M?b5qeEv1qgj8p(2FX`{8_Fg!D9O5ZWrSYfRWh2;C-l*CRxqVWjqo z8QbO9p*ND{f9|TxNZOD$wCkiDIl2a5@r$PYoBs~N?@s(iVjU1xlt>86ceID`8>CIZ z|33(fYKDL|;h@V7hxmHE7>6u~pD{>!-be5>NTdS&VE-mvlqggv#GVb7lp3X%5=+gr zzv4GixP60A27boHd@&W{+I9@RZyoj}?ib;=R7-`I6S_!494sEvzRxn?2@%78oXIE0 z=yC572TybA2EevgBT~Z?H(2Q%`*1BKjg9huNCH#f1Mox!XV(%zHqr&- zj=o?W^Oub~GoFL{7~Em`*A2y;`Z8Esra~#&3KdG$UNT{?m@p;ljy&c+<0y2 z=Ejx>D(6EW_#`C8t>8${(}6_znuxy;QO3o*QT!OUX>%2D4#dp-;&~m_a31b-e&*v& zWwhbWveR>2YdsoH6saK(7x^`WTR9M-e=!cS&8v*H`LZ4iF9=|~v zr5mZ}M*zl)De|J^VMPS@OWa?@Z%KsYNkbeq=(on=pIqG)eX0KX%q3s=syNjUoAG*T zeeN~hfY-lPl9W zAMl}Pr40v&*B1~pn~Pp!Xb|SbGC7eF%ax&^^{5Fxuf&~Y4dBj{smFTFFr?QEL&@5A zDmF#?QH7GVk+4`g-e?t)+M=P7#&fW0Jm;wgYZPBg2}JFfiK@jaYaqV%{QKQ9kN``7OYmt;m5p zR^8$#Qr(yp;m)$0ggfhsCSI>AhV;5(NN+_tYzLlonBIyyK7~t_+MWhScYoDL{7)=_ z(~-3Eqf@q~Y7}l{BRU!|Uer8Zk&Wn4!15ymPZ}!MIQ%YTj^#=?4g1+((=PqIM{ae9 zuyL%w#6DWg!G>g!M{Ftv%@4H{w>u!u%wiBfx4T)MM7|FN%BcguFQWYl`A^5sxLB^!pc1eWXyE#Fv!<&t z<)GI9LwXG`l&sOH=&-RWBsHLq6X6PXVe|m6c%MGH!Ek_X5Y_@Kr>v(+8IRZ`{EUm0 zG6WCAWuNdOepg0R3TcQ#*RJ&^tdz6ksFm=%BRlF!$DO{@UieOCt%!=VBEtIumW36; z=9z&XuUk+NEZ=Rovy8t}74sg#dc`oLR}4eR+E7%74og*`$cmX$k`x@vk@SF0j#2lS zBR0YuNf^Y)06HD)?!>QWqkke|SYTETugJ=}53t6F$|4O5LpLSx6INEM55AQcsRO8j z?hQlSDI4-;T+A;k{MTV0sZg>=>SXQEL%+MX>FFGSYHQl{GdQE&>POmzYp_F~@k}*VNV;Ptc=7D5=B*!}|>m zI(dx_&u}f8J|k<^bUq1=HZ?>f(nw68_H@gD#F2`ziCTDC)O($Z@xHo0J*MZ8Powz{ z7jXtysOaW~sJfmXf~LZf@tUFE#1*zu4Mt3eYUx$gkb*%~si=r!rDAP{sQxqQp=U!> zK}AIzD-~@}i0Y=LhdV=5mnkaZSgDdNRP*o4zBxp7pQ0j;m5N^gLTP>bY2l_2)ys;C zI94jQ*ASJCW=P{RMMWGd)i4W{wY~5_4TfzB94`cHa$c&Z`nwERx~6( zNCk*vr5b6Wn)Ar=&qGvG6cur-REJuqW~|(bTp4LqsQ_`TRCJ<3Ic$D?J({~gwN3?y zW2HLGLiO&ZA!tkn)$J-k94i%Dc_^*N$`64e7*sE*0CB8T92kYD{I?zpb7fF{r2@pU zQpxaMY!srj9ScilhN#BTq~Ritm5OhYLTO#{@v4jv)gnbj94i&=XNYR^hHL#Hs#Zls z94pn47OHh)PW&K5b)%vpj+Kh<FLOH|(E+ef{MMWGd)dWC7R90)lce%WXW2HJ8kPwyC+T5h5 zh-0P7uuxg8&GU+iI994-EL2vzv0G6Q$4Ygqh00p4G3@Se5ywh35s==>Wm8ndu~JR4 zP+7}WtEh-$r8>?+WwoLgDJtSvsgAc$S*7uSq9Tr!>I4gw)gHd1sEA{wnrxx6+QUI~ z5O5L4N;L(LkPNLBJ4aCw$4WKTLWKuhhW4&dRK&4TO#>v9mbI48RaC^WQe|4GtlE3K zq9Tr!D$7D;mEntuia1s(y6d4FTB*dTM?7)#vQCFRXU|E~051-wDjNPz4j~EOLEqUL zolPA!+|*SGDqcCT3Ob*!6ogP6atIu#`z<*6fEbsKb8j7D3!FdXhS1gdPyHO2OgI+*X%5LF@{Ru!1AtHHwc8nHmsA62l=yNDr?qZDkjS zD_qBB;5jj20{&C}pWV6TpL!^Kbc61kd{Dc}Y+y8Cgq~EX&wzZ;3c|E^mQb-Jf>1l} zAO9}v&Uv=rWQ1{^Wpe&hah}zUGd_$UKlCWbdHXZ9k9FrfS8xh|U^I(4Cg&sRfa97Y zoEiFsf-r0?#XLX~6DR?uwSUw^G$=|cTt4#!C%hE%%(PZ1&hyN)HUhF4il%F3xWpC+ zpQG`g*MQtvH+N6VhM2^J-S}_RzydS$sY+{sq!rHDE>xrOpV!kLU3Y1B&UuJINl{FL zv)v3OaPWc4-i>oUpot0N@gIcR$LAh&R(H+?f-^UabH2&ht2pO(t^&J?KL~*ncSoUiH5A7_b7~1|G&%t1Dn1 z3D-8X`)Xofill2BTRgGkvKkw!c^duoo*3BTq+;xp5(A>AW+mog)He7UW63RbEmmA9 zR;9iQwigZSi7Fvu?xtNEx`T`T>eDWS|=J z7j)y^2iIy}T~F*>KHn-FEUW~GGno5E@-_FU)>cldN->qC#M55vYpx5{+ae|>*&@EG zs*Y^c5`OtVKq~jD5Ob%#FIttK-4=78Em)A5FWcI2VpR8J%k2)E)4n91i_{jGYt&rW zJ;4W=*cPMHv7AI{1NLI4-D$7t;mlG-R&_t*%Vx9ZRq1&Q%Sx8bb~1YVh9Flds>G?iwlLyu;zK#yrOQl)`J!tMoX67Usb*Pce^OJ%%@JFj8ArLT3Vry=NQx6RZRSYd$!$+nf0#fN0{ zEIQh;%P=SENIgc)b{<60dliMGUg7i9C~1_)25`3Q%&-)3<|Pn{YN8iFPi!%`E^zsR z7X6D#Xtz6-g@o&Fn4TMKS%b+GZnvkck%tLs{~vqT9p6@U{hu?PMJxg#5C|fKgb^nm zNk~lMSe9i+#4DDZK?6dTWyi#}j3s9P1yLxJJ<2L&mbO5FmOTrl?7df^lv$vRmKG?q zQ22encRW2kOY(~y+TS0%Pn@H7@Asa&&OP_s@$OyP80+by*_RUUoE)_XEL|E}S+T~m zy3w;*r=d6oDGQ46WL$+#v@s6G;%;q_!vx zY>s9ob4z2TZ>guh)+?b#fg~-fSW`m@^)G8&-~%nHIDmOvTC{YAb!SF};$ZG-?Vrv5 zE>frW3n>&XRNhvKf%y;{6VPF9jU=Nq`X#x9eZ*2M#&4B4DpAlGqCiIGmX<7XTb|;Q z(tS%8&Yxep(Bg=n#YII67A$bPOZJ^tQYyR-9$T9?->A&{y?>V#avL^BwAO`jzQ-{@ z=BI;c&)9;r=@I%}P=QMlFm1Pfe~BytsW1vEt&7(5S%<&nwfvQODvXK>>ykKqI8k>4 zaJMKdk^z22ciZ`i2|YW%f})B{xceRA9(IU(+#&91hq&h*;{Mhbb5VxB{ z+#U{bdpX1vI>Z$_#LahzTjUV8#39b(5a)A<^E<@VImE4Sh--F;TjLOSphH~PAuj3= z*WnP?l?i8AV4+4i2OZy`z>UV@3LkDCaT|>Xi^+eryhV3TXTJr^K8<{n-%3RN1o7P+L{+ zsq+P^Y^>g}fP!ic-D zJJuO%kGTsE=qf2H0*RD~vj;|(} zlIYkFU6B|<2CO=%D>f8~v2w~T*Inzyxq#4uZJ5|Y%By386>w{WTAiXKrh}jJB8LX^ z1Z(T6y=(pT-rD9W9}9hpSvU-fx{a?@b5(1tm(C&5V57TmwSh*3%6{s54;~{(;3D{(Ffu+ZGICoVU<|8 z;~Im**|?>il}l$}v9BW{PQvVNuc&EWIwOMfK|?sR7-!j4)W|h`z|?s$v0k`g5=bod zdn#9!&f|p8xz;4vW_SO0$(m98|21Jns5?=gUeu@kqhrdzp7^^If3I*$uy~w(bZjYX z@wE(PNk6osY8!Pv;#_U}B8p*%c?N$kZ()6k8TPK0I96gJaZ#g;J@cbK ziYXN-2;hHnQ(B=d}K zCf3LB<*#-qfJ0q)b4wKUrrnIZZzisZ#_=V}XxAMGW*GG`PlVTS855LKp20OmRFOms zGge`JEGqai#Bkv)-6o~+4R}Iiok{>x1VwI^CkDAW`T`YWM$yihZ7Pj7E{v#~ck--V~m_A4vvzY>Ly zIPzUJWaJGe(7j<%Er{{D((;>e-HW5Xpa1_ ziWzMXqsdyFPmT}Sp(FBL6CgwKymGDuvWLY-?nVQA&P8GcoML38U@Z(N;J1g!Lu_>vShGl8nw- zqMMHBu1C&fTD-CDL>M>s$i&D+(WuD%9@{F6R3ag9#j3F*Li@B2HmYz_gz^f(>v=OD z@+b`~t9Hi|A$=@>EF%%K#YhpZ<*IPREX%TJxW~ggRas2Z+g)z#fC%2)PNhn0P?TOc zXCvP=6YW_rHtn3n8)6-;02&6tRdyY6*2H^y2i=m-(;+xA~VNCjl@!U@I}hX#m)gfve`$Fr!*dks^#eC^If;<8cS8T z@GL9qjbi^&tE${x0DS;8nw$<6oS5*2W-M&MnNCd;} zI3Z*{Lf@oAhnl;Qj_&p-SabIVsIEOxvEq&&(QKC>*hTnoP}ZqTVw&VKKiR8*QaV|y zJKW!gT~pXe-P?{0&fN)Y!_IeYqoovEIe9*Q2pC(7m+Vu5nl2*L2Qe`EsjevOo(`dG zGBVjJZ4VJ{iwHl`#S&`3^)v~g^jmcC^LXaS2HCU0ILmjvrjw_1pED6IMaWyyWxpd9 zA3*Ne*{{)wLuvG2H%>wc8&!R)t`J^{(2M=68&wZf3C|C7KrIl9Mb&4Jx7q9;Z2y&u z4sM<99x1!2+cIc5{8oE~{MKGPgni>&6$p2VUTU%Kj4%OSeXauoLR*^mHd>D(~Y7%8G#Ph-LKeFzZf=Bx#5QUhW_p_snn)V zV>ck;84-FTtYFfU5rUno+>I=lbY(>7jsM2(h-ZC9NL61~*XB@^w-?L?=r~*Bu(wcA z3?g&QK;LL8E2S8=)D-GpmQ-f{*7BW66{ISHztYq+s)DJSsJmR*jG+*rvvRdZsk~C! z*wfD}TMM>RQrbQ>88sxf5QNH2xUs7h+-Gj}M1%XXa6BZ|ku=8cM` zL?2{E%D&RpM=}c>;f&Inv^Ca+QGilZ`@rXMvs*JOT=c9qnJ*V5@h?*;VmQ=J+c`sg zY|d9_B2M3<)&Gf^ z8q?M=Gpo8As=NculFSCP8J)EV^w%uiWqO(itZP&zQ~EtK3C-y8+Av;&Ja%)`#${_^ z=xk4zu7^~gMaw;`)1n3}Y4*>SCy3TvuWph2c#NZCeBPe#8ll?^3Lg>`3X7?X^p?X; zbgE8}*}12uqFe~)JYALOyF;37kPMqk>p*3tNJS%*pHROnvbS{QW^E`q))J#I zU9wqWX64$`xCp`joZhRN_GK>BhdQOnTqZI>lbMsQtfzN$wzLH(awN?cle1ZxxuZZN z9Qb~%C8GauMi`xSmYTqYI+=~mts*u^P#qFv=$Wq75O&dyGS|Tj^6Rkzha!3_@rrf7|`ODVNBBva9ouXN$8>0OyLQE0O z7NbdW({n}`IdXjQwbps2-93n++6Ig`^}kW}_o8_<=*FroIYhvDMGVVz%0qR1*!6>{ z$b8pl0xd28BjjV<{^k6bu$m`o^GLd(h{F+_`9+Jp*zP6NMpuup4)00lRaVx~Dn^h? zwR?ykuHdjqQGrQatL8VYxcNZlPPCLXyC%KK4k%O-kW~|)VtWwPcDmpHR-@AP&nCop zoo=Pyc8qB@5iR#Cb;XGuS5BHxZ62?6vlbqXdQ+_;m$}I9<0dWC7z|3LR8|k!T~P+r z_!Nzk#k<1)?hO90^Cf`VpuInU-#X!>NA!*T{rHt2wrB|nJ+i+yL=Izo&ihH>htfzZ z|5SGSDFM465x~Jv6PS(8C_Y=xObf^X;JH~hl_4h3ZWeR4_aV(&e^seh|6O&c!LA{wTZY)c2eh{SF+Y#R)B zntiyi+=yEZGh{}HYZ_J2c%-+Z2lL)(3l}BDSOSt(ENt5D7-qycX1M^B(}{uQ2BDC;Pf_P?bFi@yS_Ni?q_nqYo(TUpx$Uqp;fc8!+yDg~9S;un&1@a8ei3#u|l? za>+$3>n!WQx<+qg-R4vtLBY3|?IAJNzw_2>YixbDe-K>|}C4r*5*mA0s= z#f9|&F%6OeQyRIPX#>j@QMOVcO)~~6p$A(FHiSc+FoH25 zlJBC1!Fk=V#}>>3LrU5wD5u=2t5o1-4_I17!W=9H&ZY^)B!f^kNGVs6v#J|rn9W|P zH#R>uE6jJumc{a=aC1inq!3wP1^rEALGd7xhy2TZwa#k=Av2e@B4^QAX;dEuA?N&dimE+o;&gxI3j|A zyh*Q58-Cz6>rZVw`KouDrrv=X;Tb#yd7qB|tTun!pD$@#aP+Ug8FmCRc$9D-|NI&L z_Fvs!@W4Ck&s}@=QLAxMkZ`~I(|Q3vJCt2ynsKbL#2#6W@@D!~8N$wdoCt$Fu~tJ+R^e&?!NuSEF>_tLd< z_H4c2sjJWV^2W>W_`@66c=Q9|UiaxO9~>4quJCW4|lU&)nQ`=I<__ z_z3T$A^&SHeQ}$+4m{So?Tcr9b5!@Mrx-?9xX&5Aq;S6pn?8N!(Or+e;NXvbZy1*d z_bYGN`GgzyXj%TtF+1&a@Tx1G1b^ZF&Gh$g+5i2gCVL(`>YweeB(U*jcWmA%$b0tD zGf!Q5=`%k%^U~7$=f3*jekf<*{_w9lJm(j*f3bY^U!%#$yRRF@y~6#;|6Evn!Te7G z>q3X0P(JLO*RVkb8@mef_I$hU;3FQHn|H)sD?U2tx%{!%|0CRY9r3$aZ_KG1zIR90 z>%ZFJv+E7xSm7SI^uimzcf{|}_x)t^uF+{n8^(RY{g8{UyyLTu&cC*}mVMmWFa>fu zGN1gL#$UMb;P1_R%Qf1?>gT;XoIPUM`-gr0fuQBTWr5|6h?ytujf%-i~xc_J4RhPa0*+;(%KYVfHn8S`-hfiOH z`+;Yjl013jw2NYAY*_w*>%wukkpO=MdA$eS+xvWC@3T)^RWYaIt?gdLWn#kpihE-V zu8;rh(ZHC$z4ZE7v;SxqXA1Yz8e8tX_U?-hdiJ`DBOmag?zo%A@AUj`)2_I2dF{+o&&4ex!u^no58CUoBbV;?+ykGS^x3;R{|I~k zCXoLVOFnFTWzVITeYDp^_pJ|pAF|da+;<2av-p*pJ|BP9Q9qme{U1z+jC_KoUBJ_` zuo)bi%f+`D+#MNT+oiwqap%0RHjW`&bO=`ltC^R>6}<4Aci57FQKx z)7L=vm**^f%O&E2s=W>2Azqdo8TfASoEeb8haf)@%x-nW23-dt^bn$F1qef8umViu zUo#l=oyqc>m9^Qn^ba;|I&(uPA2B~Rgz%fN1)~!OpA5Q!hZ>$Ov^Oz?96&>~;j_8H z)~kFSVpMgdEDtzz54<6Uqo`bkIdC zYIq1mKovNY_+{`RBp|wO2!UY$V6Bhi?m?G7niwW{ql0H4XB7q=9u*)~fCifZ8GI;Z zxUmNbNVLsCTN+9(T01*h1|1$^gy2KSMVDA%8UlljoPZfp8T8>3pfI+V4Aa2m*$Gs0>EGBG@ci`j3SYK}huiY_B zYhjIHD8(blGDJHBkEd!ukC2!4%We3~C;0OM_p8PCSBaI~=m={6k6k#3{aud&7?(`^USZMNxFWV#)TUsoc{ zqm8H3uW`n6>epD~hZyVAcbsv8`Zd-#+jRSh>GliL?Ml<_Ce!UU)9rrK?P1gHdDHC= zrrXD++oz`6Cd>=q1%F4VUt^7*;1{MI;C7+`WMPd5Jw_$Bd|6;K4f3j8H8gGnZw(V!b1D^JE}eP^oZ zR)N1H{@nQEqcONl)PCFh>`MtKy&sp*r!IVd(Dx8sPx6g#Jf-e2d38PRT_>B9F!6%_ zT}|sqP2UrI9}7k&)qT8Qegbzce|*e6c}<6;0H^pK!&SiflGjOf4;}L`?nZy;0pC|C z2(L!B+_7HwVd>-ViO6v4ow%(2F{J;P52qaS{qaWM_J@581shuuWo1kWxApMV_X-Ho7}A&c_AV$LPWOu z@tn*n-hCgQRQI8IWn#(QAM8dnEfSRU*XHp?Kd2_5K}KOUSKsEo5Wga6;eWP;QIJp^sv~|eZ!#<<+|+IEm|9i0rDM_;U#2s} zbNK&E@#|&$kI6{5vA};VetnMruMxj?N4;N-U)vdF_$7UL7rpdt!>_A^?_v1$D-q%Z z(~SbM2izb_4;}M*-o#@mKF35K`kM75JW@BcKc#MJKWYCjGTzzF+>8=;naf{n5WmD9 z(q;Z)%lkS0Mv1S9FBQJ{Q1%=AFdyFM&RWm*An~F_vqu<()g9RnjKXZRxMUMe~Bsr$wx zh_?vND_taB1O`VjnO6^r(vUZS^h<#7V=$K3cee;)(Ly}v$kBILOCB9CN}i>}C;g5i zwoX38q=#bfm`y+A7g(@aP`+yITaUcjtb0i=g#Z)$eW*wBC@Mev2UNF`T1Uyf1q*X^#n) zc_l@(Q`20E4>nz_cXk!iHID~;Vq>gv>aW+m1)`qR-GgrSdOQ?V9rjrQ#PGaj_@CpJ zvdHha&q_TtFn(#*lo)Q20>gNo=5U%zBwxDlf2jkm?dOtDChC!x)_yM6^>azx(Wg0c z7G!tuNu}pv8c^a9`LY~NS_;?UdGq)`{=P}RyPJTC|877imb1VJm&G)@@T6QGP%a#G zqr@z?36q^eRr!Et{Lioi`;j&ihXyhSUl~TL49Pwcejf5 zzgW>$Hvi>Y#VjW-{>Vj@j-rT2nXBoGxedJA-JN_$J>=GytmG|gt|0w z7t+u&k9+4<7O8vYELUh{xUK7dC(Eer{x^Q{q}|lDUjNg?rCkm7KTJtQ_Dj&@&0zZ6 zQipmmR1e{>30RfwJmRVfY@ey9NIQ?X$~=!4*CyJ+J3h}?9Am7-eBNNWh{Qo@pp8Sy zVguN?Fp424rI3Lf-Nfy=z_+|DpPxfLL1eNo3V3Cd1F@U8R%}U z;)M(6&zny?@7B5@k9TVwRy54mbEF&@+V9r7A0x%_RnpJ=Kf~QxSNz#9o~|~G&9n0a z>>H4Z40mfCf_P#TdBz`n6320U1@G2s!9k~%M=x<$oQz~a=DW4_s+PPoHrw4sg${AW z4sr7x;ubl?EpdqRIK=rJ;8_0temK-euVv*97~)nq#I13N3unSPl>-|tT>_*eBnt}e zw&#NrA07ST&3qTzdIvc2i#fnio)2|^BfmZeIP%-*07rg@JHV0O_Z{HK?`Q`&@;k-> zj{J^yfFr*X9N@_B6bCr+JIw)({C?~JM}B8Jz>(ii9N@_Brw(xBcd-K;`CaM&M}EI> zfFr-l9pK3CDhD|7yT$>I{H}9=BflFQ;K=V52RQP(%>j=5?sR}7zu!5)k>9-zaO8Kt z104B1>;Ol8k2=7S-;)k-3?ND-Lkv_o@RN`Mu!)M}BWPz>(j( z4shi67Y8`<`^W)~{Ql+uM}D6;#C_%f$9O+?fMdL0I>3?Ne;nY*FRv!uO2}p>4tIbf zztIkGOy3v>IP#m|07rfk9pK1sk^>z1ZSMd_emgqAk>6AYIP%-o0gn83bAaR0+a3;a z^Bv-R4sp#6aZ!i3K8Ls;I>epr5ci7=INatm1DD35bmhbPxG5{{FbxwM`EJXAb3D$o z+4qds{)q9Q4VT`+We712u;HBYqg>gaOz}G9mlbClZxMHArt-^x`@I8P5%}E?+-C~Q z)!}UVuWMO)DGFTra8T6mp}_SiEJNUq&VJ)9=HsYL{4(U@7>Bsy9pX-Mh&#<8?#B*s z=Q_mw)FJL-hq%ie;x2cHyUHQ%Hx6+(IK`+ohqxyl;+}Pg zd(k286^FRj9OB+`hN9-aP&?UgEKT_f<;3nd= zY*!<$6SxnOdB&<^ByJYm&`0n86il>E3yGE@3kevbn4 zCxy$#?>XS!1Ln6UNq*VNkNjQ+<|Bp6#*cFPIWTveJTSjM0P~^3W#dPA`6n> ze|(DQ+~=eJxM1M)y#vhT3kOc$GGLBSxNPa8UOOL{>lBV$GnF6p?j68fe36Vdn_eTo zKLhiX!sX&O>f$`(ef;ss#&0M16=%$L{PD@g zkK6yeoS8lF!L_Y&2JCj+7yQT_+-lO&R}yAaF<^p`DLr$g$VxIHEK0`vUIQ z0P~CANPgMmigNIx!r-TPGVz-MHeUhfzAktASk7(0T%vH<%DDh+?gHkC>vQvK0>ABU z$TQmT$A|gIl)iQFK9882B#vL6hyeILWU1(>G$BraR}_5ki!g~3npWa7tu=1So1zhCmp zmOhr>xCbOgvCEh~CVVPzQy-MrZ0Te9)dBNEh09ic@Ua`DMR<3vgFGD*0v0FWcLz3X_W;<$2;`dB%Q^=T0Bx-%{X0FGy@Qd1m?j0+?47E?a)7U%mup;!C;tvHY5WIZfem@w*0?-~S;uKbGI< zm-CEW@W+S$XUgvvaGwRtuCGX3uJT)= z+;i_se!0qTrw`EYT@hO!CWCeyoqYf94rG;Exag&%}@R z58%8CgP-Eb#E;VuY~@G&@-8r+=jG!!2G698aTg9-y+~V+YQVwt}waMNBwdlaOZD7Fu%tX zCKo@-%Ui&`HF;ou+wb5kzq5gxHzfnV8JiJJPuq;9lM#PUo8A4 z0(U7e*D4%i&%}@G8ut;mQ-<`xPe0UGZvyi#g+noA~L0e9;zGQVd14su^E z%fbF6`MsaFDL7-bw^{p*z>oJ4=U-L4s{AT4;l2RoD?84%zB&*5Mok-Ll;Mw$EEnw0 zvElZFUp+7z9NFaS=(3(WKx z4&nu-*8%Q0VD1?J$8vrFn4R{>9WT>22bc{5;MhJ+1m^Yua4f$kfEhb8cf1wAO#|kj z0dUMmFEBR`fMY%$0cP7-1IIfPm^KHv!+^Pc0373e0+`8r=8l*8U~ga!8UR$nSb! z{^0;OYM)_7HU9YUe_@x{`lBP@egH5pC>;C6OgPr>*W@=lH$T?f0l@rn0NlaA-44u7 zg_2*kcq#Xlz#OM=+44c$`M~^X037?7e*iOWPVRiLK1zUT8vw_64+G{d2e@Z|nLIal zyp+?ufoU56SHXCJxqSc}`-LZf8HKYv_}I!XC>-(M!T8%rVYD01>2SNn^RB)nvv4w1X~`@%@9thQt4`mNIcKGJQPG^LXiHx^tgcz^4N=@B zAM0K+YtfvdIVHtKB_(qf&T`|D#z-_CkM(+RAACmw7vJ~wg3G3b3*gt+(%BJN9^D*_ zt&bvLaa&|zOKHoZaB;MFVYIYm)^zvWj_ycjUu(2%>C)1QHJ;Utp4AlxxaU^+sy)rM z!CHT1+4R1?j@CK2hY8@pJBJgUam}SG+S?v2!>4acNyQ7_@C7GhcHAopf z!mS&^JslanVx7^9?(uce&djkOM7S@JF;JGGh_CD1i1;(4xGTOP(u3=hP24~QzvGWL`E(h1JdWM)4)UIbmcEY8*0n;5u8p-E0e&MUGI%Y{CkUqGoe(@7c7MyP*dcc6A)q z(cSL$#=3fN?QE~H@2Dj%BZ3PP2boqQ(#fEW>Mq-AahGi>+LaygzHp~Ikm$p$p>DLz zwJW`AEB*CrBb{@6t9?eKtJNs1ZXIOgYxRW`?!t(>ushZnYmd1L59lf>Dgud=iJSgH zi9)<|xC`s5THS>;P3}V9GTg@GTZSO3O5KGUOXn36Pr7iCyRfRc-tTRw^5NGie|>2Q z=!#&d*3(qu<8|txKyzbbLsL*X*EIV>&;#-=~;Ny+;M%{%2p=$b&lbj%U54JdQDag=5qgp$n-H9PGX^+L)JENhN z-e`DzPq=lhyl!=fOt%UXvp*SPV(dAz@|_Mjao(J&{2q6pYPpu9=}1^kIrBsk9UG!6 zhEhdV?bH<;io{qsWtZ!&_3@r)Bo2Mp7Vhgr%By386>w{WTCt+Urh}jJB8LV;_gq)) zUF)y+);3r9Sm;~K!eLm{ZG7!29PAj|7+u^;5H}0fqUT#BI=+mKV6<(4H4&Pnq!W#CuCH*}QW#Ms)^)^TsE#uJ0Y4vPNmo_u242*p_dGVZPZ-AF`$SJ~BgT3?}1< z+n#r(%bxdAEGe^{fcrmB z-3(3wu?*`_#*H@lVYyRgF9Ge`Qu$%lguJlk^pld{0yvE|%3Kejp>V;Rjpl7@qoD&U ze0wb4wxLW77aYdJA%c{&i2}xj4dYxNBhbfi;-Z4GT=7NYA{SSY`P_vZ@ZBR{jU5p) z-CQ%i2qc*f2P9gyVW%RF`S0Sqxn~Ye$e!o$OM&qX=?P@dTCcY%X0z6EISl(Bt5DT}ySEy;-kY$`|wLH7gw9%wn}A)vU~ zE_oEF2lQOfO3>>;eW1^R)`0#SbQ$Qjh}#cZ2)Z1!1hfwHK+t;7KF|ix(?M5&o(&oR z{VgcsPI4a^R#}qVd$AIf>t|~~xfX;pCFg;z1+4`Qf%bwP40 zY1FO3uFqb8Uz=5HSoB#VZ-i$56nCc8Jk)B9o@RelN7&ch*TtaqeO)b>$Ecuo>a@mV z(@tACE>qWVEqA3&*RV_|2i&W(5h5fXr+u_pC_>{@=-{BbjPXe$-l%bYYtcAQSv5|9 z(l~vHo@3v*P)Z*Hat@~2=mH*6;Ywd>L3~6tZac=|Q9}$wk-VI?~ z&N$BXx_Vc`>yB2T(x~)^>Wp@`C)OF00DMn7A<7WyOtdHJoF>WKxDe^#`_bzCI`w|C zde?389QCes(DOF@>o)xRHvC@55FgEdo_g2(%hkK)|9u<&M>hPKHvE&8cZ<%rRmLj* zr(95HY=^h2l{?B<=!_0f=ncrQkz~1dgB}kW1HBlu2lRH(1n4WEeW0I!ZUEf|Q6C06 z7xZw@8qgy^sfLsIcMRy!pg#ru0q6~&KLmXV^f=JhK@nGydt846O1V7&)ZW&qW~tY- z9NODDb<)AsHfV3_)qULlCd#O`BwDMD-qa(km%|68M|4pLRl=zBqpL8bN*+T)oeXcuY{fC5` z{Ev0QHq4^>t#UsJZH4u88Yud9-sqcL33>+TfuLuD#zD^k1=c`cpF9)vd{F%H-rwY< zplIjGYeDfl`4s5SKtBMz9F#J01t@Kht3j#GehoSw^f#apP=rk$4|)UW#h^EW-V1s& zC}rptP%=6{R4=Y5O3 zOTR_lCEp_N;%||65d@R6zX)=;)}|jRyKHx7f*t|wB%dv@vn(PeRHU^f^jDErKtZwH zQ$=#DXR1hQFWNq9q0iboV=duMVI)z-(FyaYSUJEb9u}5VbEjHe;{%vt6Or{sG+#VB zAUsX6_Yq#1UK~$K>yG-ja1N9-N0?SyZYBb&J&d&7sNJcGi3pLQ16RX zcqBwTe^>r$an)Fi+!BAa@?WCfcY#3gS&4UxE%t?U75`IqsK84(K02mx8_u zS_Aqg&{ojbK-o542es?{`@pXPY1WTj?{kA}lT|}!v*osA>;|pB+R8JN*4HM>mhpwX z_HA)468h(Dl*a)!{lhY(yxasjIQ?U0b_>UPX$BfwFSXB!koLH+ljCVaFO1p56-PqN z(8!vOG|Lem6&EL+sHJ4kG{r&1tLAQK@aaKcBHS*Tl~pxNS537=36yT?o$6hyhP&1K zsj8{6{qWIv$h>$oeiq7|kG23g#^9szT6JhV?H@iGuZL+Ge}VGX_+wCae9ly=g7)6W z!bSeaI;NhOir2T5`lZ6wrTx{sQ#hppSv(;X9>gK!<_y`@7+wE~FD5 zX(YM#9lVp=Z#@dM7<4pfGbnUZ@<7mWpg#tk07}`#__3dUm^(T(Mn#gvJoP?CYMz?= z(sSzvnE%l#Ok{4ERXA`f9u(gh^Bm}h!ErAA);O1ZYn+{E%fXdK5oCpG<3Y3;yS}7M z?E^nI=n?!Oo-MK0s&%4-zPwtq0PSzBHA1gxYwcwGHmx;|RXJHU9l^xaZ&*skHV8RZ zm9v{nkC;k`nqD-& z?^a%-B3SD8DF;U0DOqqug=V^7VX0!eKc?KHFwAw;YisuaM9F6t)ulZoUyXNFm!-|f z19y|w=Y_J!jf+uX>=K_>?;ol6@?nyJe!txIUVx^;NBbvj?|-qqHz`@y_5Zn z@?g*%Krtt2>;!r|=v2@jgYF9Y9O!PK=+}(tpydpmRXk28uvm0WAjQS_h_klU1OYFG;e`UkG{)=pxV$L19NE zCnHZwK$}4;K-YpI?&NWxHK6x{?hpDm(B+_WQ1JDjt3ew;&joD)y$Cb_`Vc76njDP^ zSOYo<6lqS@fUX5S6EqC^6Hw$Kc`;}!=)<5<(CttWG0=seanQp-6QDpuYz_0`x&pOlKz_2Tg)L4|+7{JD|saQXd}+Y9AxOJ}_pWZjcS} z*vAMj!*!k2p0|$?yijV5V$Z0Wzjd^Don_v)+Zt1*k;B%E&0OEv7iAE(+5IdR+J9f+ zZ*cRn_N0pLj76;fDA zS@t*P>@3F<925}U5f8EZ5PEGtyz_Zp>BXpgHBD^{KgC16V(N{gawK87QEyDZZ!+g| z9ORB=iRG1~2NXm9=Jmtht}7UZ7!-|hBr8Ka z4sBlCFe??Oo+qg1>IrvjF&UYkjLS7Fc&7UJ?bHekH9`R#5~#_38etcBeuZkfVn_5d z__81p>xDrVieWEwteZw|YMB_#l1r6*7>asiIQaHPdpg6BXcsoNS`ADJiN#xcQG%U~=IGq_GsN)VrjyS0agIP{uTJg67ScN3x(X%GR z3!6Ti5L!!HfpY{3w}&Zhrv>S0_1>WT^~Ay&^{%a|&FcL}C=ObMXWHKHRqrS5BK`Gx zHStoc#hw$+!|8{zM7f>@hp&|5i;z>w7uIr<6G7huWjFC>(0QQmfbI|aE@%trd!Sfr zHvR$1iu)%h%l&iEAA)`XdNL@^E=gVl`fpH{@Ry)>fPMw~6e!O5NWKk<{Uk~1p0UGV zUm>mIKo0=LT6Yq*h=F+tu_lG@_Ql*M<|mTS&76-;UIe;5=;ff;ha%=Q@I7zxHN4|n z$Ry7a!MAHkwjF#+)~`L@g?Ld~X?y8d7N}7%2AzWNb;d-9Q0ieAVkil_6>0bW?Qvry zo``i~_!95n?q4CQk%VY_j5711yJE_e8duSYEsqUNjg~lwWAkDcxFOuxmp)m44P4nl z;u)_R0og^;n%z84LgGG4A_c zk8y#j%STby*hG-lu37(kz@Piojv7Qin^^!vd#70GM~hd=E~h<1g}YsoJ5+Qs% z*V!t1rF{6NZJyu+1WkC+JYyU237?oNF=vnHZrMJeXOF~EqTo6O4A|Fk8By#N6_NE~ zlPX!W6DEsw9qsGLn;l{9iKALHjz?ePL;7>E^DzY5-AszI064kD;Se(^17_;$ z=fZbiNCO@Q;N%kn^hUeFNH3^P)W`S&OHG(!M?ev;p)?P_AX14T>}x=Yg{A zqwMt)^CnQ$#IhY6Nn<6mjMf(#XBW%NE7Pd?;WrqFTV&(o*lm+u}0Vvz^rJ${# zmx0pu`#C7{_Y2U^Kxg1jKa=o7mlxewW*kq^jb(Nm{#Mw^jA4kO9lFKeXm~qgaXGfJ zMhi}shXqE<$tCS8+E+ZCWp-<28i%kC z$X9Dh&8K~vfj+%1*4oz@bv`j5KGJ~YfI+q;sQAtz%~I)aJy_rfEH|-mGqn89C(Gv` z8Dqk_*ncms(*I&yCI7{^ivNpoQO?=^=0mvc`$Z|g#qj$Ke!W|&v(f}uj&sly^rM>u z8pudF;X?yPPxyTJb!u+XZEc@yu=(K8gVcx#9}b6J2ZE-6WvA4;aAMB-;#fCo$N2#0 zh*Jw>;dUwpY1nX)LU7hB zm{eLDpYDK^F$L5u*13Zu!hR1L01xen(^Yiwj`r>_&qxqSJPWS7gK-DWV@Pzgb#OUL zF0hdutqYIffQp(Tt&KX{yPikT{^u)yz4r>6dc>oxk$@B^{(UR!ZIKIK23?HelM}Tms{RtcOm-Dg(}-*#dgE~Vg`QCR_<4!e_&g> z8gyS!tQCp9z1M=);Qcz#04VllB}1S$g0fG&3G@=sn?X5Wg5nT+c<%(|oXuUJUxVHa zIuUW*4@w*F0nk;TkAQZ8J_`CH&?i7CxKDv%Tx~oJ`bW^0KxtRK0{U;zS3#>$)PDk9 z3Hll+rS%O^*iy!upy>0A_dyY-@mEm9VSEe<9>yo2?}B~`x+BWsGtg?#FF+p${WmD} z%9o@_Kg&u#2O<7iyr`1yw^!s>@XI!z-i#KH69KB64YgI58LGz!JJ)>rpt+j!>8umG zO~`ywt$IP@TdH4ml7wnyY3WCoT1vHA=hCl*LYWLG)f0zTrs+c+MAce^@F}%P{mLFxQBg;mnviOtT_snmptT(+@cpj~($4oY65K(7WJ4SFBwSkU)C$AKE) zKNZvkx-)1YD7JwnSy$6Q*=I7FZez6TE&Lc^RQUql<^KArkiV|6*6;NPJvgMIa(`fm zU4_4Cz#f8x4Tt5}mGp&RYlZyvD?PRTs*tC~hnm#>V@&^s=3uCyIu!I{udeo;X!-{I z#S0{V>V~N%VzP;7@&$ZND}7bQuJB~Vj5l!hM^zx$_u)dxkn5SgbOV5!ig8HC8xF*!(tM)bd>b*X6^OE5xtG}77e8sY% zP9$rx0*{f-RSn)|;m%5CBxBRvL%}tTK2b#U9B1=HG1Z9ByCC$$-8qz5U02HzV6c$M z+z@402^FxjF~P+KD<5xd05XctB<0vZ#4~LM{csFJu*rks4|;;l0hIMJUz0y*0`lwt zU%jWY7UIZkEI>;0j7CpWzz3nJZ@{51XbT7UM3vBUnDVS{^84zmYS);dhAR)0d^4h3 z6KZa%H9bct&!&ckpqVqa9^`XS{M0t+mOFeu8#JldAJz`cFo`jdu1!PIV3@ zD#xmZI*-5JEW`rkT-)IFm}1I2xHJ=8h$^7wx2^JrUh_bnw) z4fXYGTJ<$Tp6EZ^>fhw6@;52K9x5Fptbj^i4N}sus=l_tQ^lrgCU=w-2H8pj?W1^& zwt~`lc^m2)8|sntfKY}^S-usla)*>#kb5b%W2{I^+!m-V)v;D+bAbG)T&uhdjcd^T z$f6%-1qHxR6g^5h5X2O=#7wYaD0po5o|PVdEt{jUw}NeBg^8$m-V%@3N?~Uz>_jV8 zln(SX66R}?VrB?k@-+JB87hSC1%!+so#}X;XIDSI&5dUL?WR~wvVy?M0?~Z7vqBo1 z8iEbphFWi}CjeC@x?0xS_EwN+`joap70YC+?@B1PYQL|lf9bL3B(oi?a2b=7a+oc(%REqmz9!Kz-G%0a+153I5KhQ~5x~xhZh6|Rv;-@9 zGPa$p{LrX^5Zo$%0G+>|3IRPHgbGvolEW~;q0ZwKy*E?4b6R+I1<=+)#L>ffpn zZdMEpghupJ^)uCamQZW>+{pD(s`ee4yH*Z z4jzLN3;;$;h{>9n35LE?8ZnJQ6F4g?u*oM(Ce3lrtU#1Z9XQTWQO~gg(M$vW03|`$ zf2kbl5-hUfg)*S*G&P9925s7F@TZv4*(1nIzgszkw#`d;otD>FQq%BMXGRC2_DjdZnB$Off z%5-C&u8AC;jttcMt6`DUh<=EiMwtH4o#^=?`Wz1lBR(L+j;N6-l&`YEi-zCW+*s$S z$4E_>(mSaPk1}zU(9kRW4NUtklrqfIablwEJAZh1&|PC|*x zU`pn1}Go&_`E76gt za(i(Y_nu1NSQDrV1S6{;wA^ZC&j`7`1Np+pD&~psTvzNZ8SSDI?&OMwTg~K-@6U@m zK-*aux65F|46(=nbuH5{!3+nBt)V_-DR6dijA^)tNd}`0#5`_e2GfO^Dw(+oGttB> z3kDlQ%`mm89xzf31XeXPVSFR2L|EAyME@ET1A1S5bDglV>6m9oM|1!PBf2Cepul7v z@KpQ6@HW_>2Dh|Gh;f;i=6Y`^;6eAnGJ!$oU2gIpruf%2R5imgn}V>6cDQo(qZv0< zW58wTY;9|Dt?>mp48d@&E=0y+aMBDjl|z>*q2I`AgknV%DHJUgKGQeJFW^4h`VRo#GL zNeB|w6hc!7$-%2AYvQJuI1G|0D`pGX(e%+N5Bh5BQS4gk%#zy4L{|HJ$PaB`@}6qC zSF-719Mp&z9@$fK{+Bu!d)ow`a^NvL=x?NCE)P{V*VaNeV-yB=T)75!Iq`wPSUn6= z(T3=UYlh%g?_1?-3c+e+5rxo(0~oDPC)7)}P@pwFA>Sy6I$vESEK9aRau_Z+;AGwY z94IX0fCQvCR6&aep%w)box~9`8Ej%O9I9b91%=(s&`4q`bifxBC-`EqNk%_XgbX${ zV|GfK-E!zEDqW1bLa-8qWU^ez5GhV$sK@uRYoSHQe2o%}aq2A$z1nK%{TkXpa=?N) zwmKiC+r&HqSt9)@mNmY5;A%x5Lr)|z<*6p|XbRK9XH26-OwIK|8(^NxQ;7p>4PAIh zM=G@ZS&gw6>X7Z7;qztTL3WVJO3Y*^*`NhMOmDGaTw-`vh62m#Fbwu!o&grWA>?Nr zC>7&>&?In5S8oU93kDzNNz}X_1Rkkjk4#KnI>yr+T-Lx@6(J4;3`+-4alp2MuJMcb zFrQ>Xw@HVp_%P~Hb9~EzrGSv_w&_@!140c}m}y$Z`N^vKfM^bMmMIa={>GK_WPU5a zlQSc!?l0g8u?J+2k?Mxwh@P0U8>v1PZnB$YyNlzGszmm10qGe#wIwC?9OWY7L2x*FtsZC&O5CWYn?)Q(R;?QHJ*+6nQR2-J@xFLtYFE zYef(`p}lxRbpbE>Ds=uLW2UomBX_!?B>?KtP!f*86%i_ns#Bc#|Hs&1@C z^$2$jhI|6NhH=%3A|V(e4aSYD(o+UO6|O23EXVEfM^3{a7@e=E}!m|5M7aVx{RR<#a{H6oV&aa zu4r2_ZO|j;gcutqJ<+IAp39ck)`@02Lo8=tUuQ7fE)M|bF&;D*8I6n4H2aH1S54?h zLqhd#LQ$;r7_B_`L9|GJF;c^H(Q~Zww0wSLK^T@1_qR~?=xw;+?P+TA zVBMI09OF@1=r=5hwLk_|OA2f&?_-!T+^CI3{PCt}dsCDrm5g?MC0v;}e_ZT-6`6m7 zJdEI)K%);Lqb8wDA6Pij#~dp%UWS3eB7LC7YA|`je9|3OhjRCLm%}V)CxYaPbidQU zeC4|?fehk&0ZcM`>bOD!!OM63+~(+8jr`}kekPqc7lFwFWF+5p5u9op&Cmc&gezME zn+CeImC*S4u17Ez-q;kZ4SAtAIg4$s32dYIYNibS0McF!6Of%RI+T3ZXQ(}W2%)%7 z0fWP6xJy)S0sNT>GYujIeaL1rT11Em-4T%26bpYh&#I5Ms)>3=cRoUMs$XP(EFAdN zMxeeDB9ZTkAsh}&hnmGG5fia=V*r$y8HPE$W=|wRpQp~=Bh-Yx5+e|i9Ik-r^)KP@ zDjYb)DB@%pP!~WGh%7UXGi4ks27#Fhw>@`8T0%|1puZBI`g*a`Jnrf34R6MpRlW-h zjpo`07^AGJm+*=t`m11~pi-GDu2%RV9pqk%Wx(1-+IO%J7tF&XO}>jC3E2*|6(<;{ zHb0@$L_tFP^n-ClSq|7?nC82V1^a%O3_GWceF5f~tWLmXWz{%9M;?z0Q#s%DE{daH zKy?naOiXj412YS(V>V$Hjwm3?!#T2iJv}|RVI#~BZG!y9d;+{EJFA2^p(oCF)v(mP z;Y4H|zd0vL7CHs52!f7c_IiXiB>F7yZS+^w1^mit4q^SWSxN!-1Tq0aDB1X^-)VZV z3qWm@is*-rVBM^25Di(@s~(ra8ir+#*&mwkgXA+7TA?%9o4OedFr{S0Y zWzIf86*o4ZS=5R`p^TXVHUs|ep>8!dYG2MTG>FR`puob3Sg(*RpU$*c^%9)+*G^TH zwHQw1yFNioGeRt^s%SjY+tGu-X(^gFABrvCHK71oTloojl-rfKcc(9s5NV}62e8-` z3W^x`irWgR#WEg?{wXv}7JY5N8(fVAy?oajXoAa@`__n;hY-N)X|9Aa%y(S}A8H)A z7G|zs21HxnzzB@UShPO2#tGUOq6Jr`Is_@|NW_I}xk{~2!poxJ9*;bIKm{sym!oUWcfAP(D#LT*xeO^P zVx~)Zs8b6NZbPi2wOnZV<*BGV`oT%P`7ST? zoM3~p>WGAJ#sT|^#eLn}aS?5G$JfPr6EYu`;5L8eBmiayY$ax8WpQj!>)nh!g!!)J zTa9TbAh^oU8CHPx6&U}B%*SN5Tl(5k^}6Lnz@BYa=uW{hWY)SA8&RY8VjG$8P1Pt% zwHy=K`L0`ajoCcQ%6g+M_$WYC?k<2n0M#R7@mlJX;%-FX-Kg_r3aJ2hbocb71eYQ( z+m^}BShw8`4KN+#o>?w>q7Sg~N3fNWql!=@vcJ5DTtZ5gB6Uyb)NMgPQzCp|aQC1X zq}4tP@nv0zR>79lL6yn=M~VeLEfMD1xjFy`W07z?fiZ8s>tC((OAX z62WkLC}GS;=$mxtP;)op?rz6fBawActQ54GqA2wkm4j%uOAzd$9aZ702Ad|i%tQ7n zpp;J5>aL@EL%6d8L(AUwK7J32Q@!(D+h{2bNzvtZd$txY*{1|GT|}r4Vqo-BT~Rn4 zCWNxd$YiUuJw!-L?IT?*p@zOhM?xt57G3;2Dj>2!b~VOApkLF;Q@YQY2zMc5938f7 zf2xGchL&Cs{c9oJU-b~V%CQvD-ICtaI%2Ya>CatAFUo?p)f!zEDEuCtjH~nqyZBaJ z|NMZux2-d_QFVBg@ccjrG&3c#nnAp0vpcf=S1$U~b-FiZQ;BYhM8((H7%t|!eyhDg zerqot>g&drti5q8II&Y)touG3fP;QXcE>b;FU#B=TFzDgi`Sb zb&{~cZq@A!K3BKWh!|_w%0+12xDMVcQX(}kXGs#KK_m`d;~?V`Gc~5QYi3q;H&l5C znkAVHX0vf?5$La3dgt^s4_Mb|wM^;v%p^3U%WK2%5c1f~L856_aW3zBx*k$}76%Gp zot8}I)|MxTbAi3OMTRh2Aih50Ouz`;W>EN$s8BeulI#nmg?A+5+Q7(jY zo~}yt-Jw`pNYtnpEpMZBpfZZ2{u0Vhs9zS@Te@;nYSbPH)#(AcWV6D|%C!eygy4Tp z?^U7qF#d!&n@gjjPHCZ+iA)fWgD~*DXTIwloh@x}iX2Jv#pG<3X6`5u31?Hk))LWw z^dxNDI!jH2+M}6m+^r%uNKhRTbb7imXlBc%SDZ8qnu$;9{H2>?V!HbS(+@Jb9!j1~ zM3y>cZrV`l(h_0OpJ*+5mP4xOGvz+z%U`yB7CGfO?-b24-4N|x5n_sHwivvUo1Qbm zK$XLpueHuI&HOpT!bqQ}tug6_8pWwd2{C3ZwtERJ z)zyR5n|#+j>AcFy@I4|`+EVQv3StUvLzJh&Zp7%Ajg z6%XX72T^UO&5SgQExiN>Y%T*vrOmBPi19kD6u#{k(@Zed&6T?1LgKBIWK5Sxwp2prg{tKb75nI>%nS1aKCk3Cu=k6rU|;rUm2x z@Z7AM$`BK1x57D>{gCF(HVghysibMrUZ}HzAtGnRVP~4k*PIfrOz&XytjHF&7ZhFq zF|OK5%*>HEr-c1mjcMBGoCer1tcW$Ftv8rLwwg%#w+0E1{N$MiZ5CGb^K0`<6>8#!g#Te)R^e4WUc8n zT%Mg!FE5fS7wf})dug<9Q%@K(^|9`iNGX;wIH(#vOZ!@RHDYQ7{cu2-SLH&D{|>+q z62(3LA+KD=V`ywq2@MF0=$QA&|D5>{}!>5Wh6-$4DN8B?n$_pwg@Wv*fv4 zE|<*8L9KD!=gA=UVM08bmt606~#8_#Osx@rEszx%nBq`=-?$mOYCPU5L>$|ZPMrQVS zZ0E?B*_4Qti^XDI)?fvivM7r#Ubz_pfZ-Iwa zdIfh;VPel6wr60UwD=eoLWwF4gxjKGs9V|B))wup3wL8rR_|h!sHULs!&*?lio&(KnA)PW?L7gz2&vJo0%2teKd9$ghsxHTYJuoYD&E#mu_@L7g zPK!t}LZ7eW$sJm^%asW7scr?{KnIuB#V!Jy(9D*lZ2^d{BbG%wdr%eW{S`ZNnhm!X zYstaRkacKXt!Q~zuoYrI1*dYU8tkuz&C~tM#eC-<%%%(Bp=f(?jWsq$bfRY!m(Wp_ z&g@?mLM7Z`x-&3NQ%i`&7bfspEh%2~-r-JDj&M(FzH8AIR70!}-&wH9#ASlFHA@t6 zvIY8WikDNtkLiSkAUmF(gw#LS)gbiGd>{(64#{1YR`tn^FuZfXTC_r=Sc;UGLo#Zx zs*ZRM_mh;1JshuCF)REcA4-&X|DdZ?+gqLtBi`MX>D`-=T*>7;ej&wfI{bVj5Jp z!zM_hP_Nu2(&TUCCLPh0akRl>bWC9pn}yoo>ep37{mT|7+i$vt%iyI_2dS3{l)=n~ zHG5vkqIruJ>|3&EzHBJGrOb?72pHtWS}&83m_4jzw>-L8=mg%5-7loIC6puNzPi8k z2BTd)vY>6sYIe!|1v=GfT?wb1fe)J;kz{-0pxU|FtXcr-_|2MGx7Y*9M4e+wArNNW8Ju0d zM<*&rPO&2mvJV3|iVm3*;qU4|X^J6;HTK$$7P+=|Tc+Afvu>l#%UJ6g=4BpoD`cN0 zTywoP;&z7D4Q4^qh@1LSIi=8TGFA98Ob_E8J&x(>bmy9u6N;?3ZA;DspJ;|;@uQ1E z=dxZD#HrST4PYq?yY@uCh<1gtXRSZ%OyygRNUE+ermBVE@4*no{;6 z%}I_vL>m$%lp2D-V&=fP+iZ7I^l^@%t?~5Vu%h*oZM0<3QRTR?7@I20!r!XA%gR>u zhI{&(B<{V-#kAQtG-#1oZJ~;KS!cExF*IOD?&)r28S@N3VR`@4Cc}&Uru?!bA2-V% zO~%?$mK#gpU1NsMq=!VK&ZdTFW%828e!5QBe^$d|DUe^8RhB6txxp-}`rwe~T5ET( zGThq{#xxH_pLZK&OoMK19MSWpqKqJm+GAh-ftgHd7<4b0`*L=utF-jW(T?c1n4Wjd zIs=R9@cL*bUALc>GJl4?O7zQD+7yr3ubaw;lW)APsb9WC#^o64IBUbU>(u&~H()FP zm)mqT=1`vLhP||-k2bSfA8Yn|;;<@ijipS{;U_Jef?HxuxRhpkj^G$(uz4p zD{a*+2!q?IqA5dX^ivTjYn$^EoVpOINlg!NuId#nG4}qZU*l&CUuZcIY$`oCoX4C2 znFIgBZB5uLvkXH?niA|dgwzXu*4_gXBkXnhbc9}^H&IE^_87L3&V}DdU6eTrKTU-m zo+c5pUsN(dDdpKmm;~hENBCM%9-733qC>G#-oQ_BJxyW{I6qeaPJgjLt+X1;KRLI2 zmlWg6BDv^}CHU?b_6u^&a{^fTR^$8$F~2wgF8oNWw$aNEj0iXZo6E)by8Hl9#6A%v zQrlSNTZw}Ac?1Yd4DtDc*x}Fg?2Me|OwT-i>4XJp1Vui?cM^hnW7Z2v;7;j2w=W3v#x z5O1@GL5#2*HQ}4!N|F7O5e6y8RRAKcK9mM#gAc=YQjuXEro@SDahy_v7>bGU<$eRo z=)OX4j>07&A$$YRkC-a)@f4;-SNfaOM;8TIJj=>pw{g#UYaw@F6!yu@!IK@s?F=x@ zL8)RzGOuey7S;_U*2VKhgZK=gg!P18sYjGEce~(A*;-Lz`zofMX1|E!ZkTMfjdg(< zVTbW+rrOM(GqH*M7&032GLu{qWwq64cKkR^v{P1F9%R>SrR*z5q5S2?D&p&Ooq%XnF60vp+V8>VUn0L0;slBfg$Nn)dFt>j zh;O+lh7enZ`p|>lkbt34>s8HjKgpicrSgkE=A9oFLqPE@N)3dQtd~LIb7dnnpf)%H zbenl)4-@I(X@6>nBiP*B4m;EIZf3W_VMxDttqii!&If8TrEHAg0s zVPMyPpflfm-F3ZJ^Y_dlX>ySlz5!`aHkH)hc^wh6#9bPlw(NZ66c10& z%E@TYX5H5QX(w6YT13cR7bA*-d)296?${L9l*{BKq_a|v+(hMi_DxQeEz4*#$AIhE z9Y4KNnfU^jzF3H>#sS4OTJy<7tkKd0veSj zSJt`9>Nvhdd%?m#KU3jOBS`^n@D+f|j^rVWkCe03st0#;kfh#3v+HvuHe5)TduS&` zsQ8XzBWFmX%+Jkbo1{VRt|b$j$$H9{SOqR*6I;jiW~p{@lskFVU!|jx984SE6j5-+ zG4$cA+!bjafqK(t;GluJa&$Q^NblQy;HBJFa_3nxQuzAzT~Q?XMSOytU}yB%r4By>?KdW70F%1=f!H-qWG=zV$`|J zLt0?oIP80;CLbbmY!8n^pvi->uP?z(`5a7(%biCl->=Aa*uDlvgQBG0;inyoc%>+b z>xN;hWD6A<`!-Ng-=68PK=hd_5wF}+#hxXD())P3W5WrlDP7%KtJeEXTqg_rBu=h< z6Cq;x8(R$5)8aQr1$KoSy?1KQH1Xc-WIm0~b%@)u68;it6Sls}Kvk?;uubyWxAqc{ z>%6(+3fHH@UP|qkT8Mz?#-dF+D=MWTz6Wm+a*Z&1bMbXqjCL1_aht|gfauY)%^xT8 z3at8BuvcQD`MMz)B}@L;t$<(xdKO&#+c#CFXz9W#amnDm$vvd?($leq2Ua5Xq$0@4JW(Di44Vf|Am8!)UUY5AT=sJU@2_7_EP;jIO1n5l81`bzHkRAT`8P42-}Vf z7NaXRTb2m3OG57l**gx9^}T`9nte0%QXxB`h4pa;zFZPM7&R1KTycC2VGz=_N}+Pn z$)6u#{yRzBeO!x_)<=3pG`B(4mbNGdbn-yH;xJ2ECmmHA$gOwxf#{L+v=s-d)3GCg zn04BP^pJ*ulIe(i=Vs-MMW$UrjYIbbKPeidW@JbrYp$7CM=A3l*{zlVj$yfT^6`AG zbRKWOY=$&s=cb#qNiGq#>w{SeM(gY?l+t|=H>Zkgx(cO0$v7pCPA&Uq0DF=oT2RgQVE@}c(o$S!B{IL`%?*mDEh zQ%i+OLWa}q=>0rI?aQi|6^jhq<5>$l9p&%I*?;VUPD`@h8cF7x+xf(*)(VbCP!1y_ zYSudXB1CN65yjOHT5$Gp;53w1MtVsI)#GY(hS~4wjSgC}PB>nfQ#^7I9{iFjaho)R z-p-)l5*8kjWA9?_X@{XMV`uWtK!F<+=mbt9TneipvmTV>KxDygCLwkCS6B}AiBsLt zCUmOWLQP>whC24inf{ghT#sweWp^f+enk*F#dD>^%1u*f&@Sie&)9U6pmn%v7L>AD z>GYmOy&SvwdMxx%?8m34vnPLkN5?vJLit2fGEAfk`ki_TWow+a#IDFsa2R1bd+j?& zemKO&yhbwi0L49LcKoETnqE8-FF}zzS?M|xnS7PESLe=yu~v3;`h@%vX-iGrZZ(_< z9qxIEEO`)~zTrkmtgSbq)nhvqZa0$(w~*ckyVQ#uo1&cRDJT>f{Bc(hcJlUNqSNi< z`9`aJ!z`SyqY~eQs>Id|GRF48h=8rG8{+Pb9d`#y9wlyPZ#d?W6`vJDYCWsZV$3l6 zPby2>{K3_|h(OZ*$r(Y@^-0~=cE!O*s&-LXX^ul|>HT30`{K<3*b2<;b~x4pgANfp z_hpbx8Ac$?;}Cmt9#`4%PAS}itdzlHEqLi2mXCx`Lwc$_0jL*d<1tCq7vFG;ZdZQE zh>=`+0yPz;7Zm1mGa2b4oKt5Xp{>Y_TX3LV$Q~T5!>pAQFB%2~%uQOjms>Asy6q5Y z&?XvEYPLYf!qC955jJG~V2?$-DmC97G0TXU$v7ioUQK0l2x?o0jz4LoE>df(TjF^+ zCy2=sF$CPkh)?g>jZ$dLSEBi#PI9@5jDlo#2R?*5)YLk^LzDEZe?63HP$YGlp1#I3 zE3?l@4QG0f6^(-=lwZe5tY}B0YV=L@s~apNr&nmvbb}R{VIh445&`Y=$lWFF9Vj8& zMqk{HOU8B>8F_emkyUH}N~s&X$Vi&PrWYGCOcs;ElJFvKD}}q$gRv_R>affj&s5`b z1s_w*$KotUQ0#Yc_L5VVEX!-G5E!v=3msbp^cRO4sW7gz%f7vOT7&&wOpqgLJG~UL zYe{*3iQA3XrAfCmcC^a0IkRrPD&@@9-dCGD&(lR9Z8(0%OZ0UKI~ZWY92}TO>Gp6h zX9U%$Wo~FLwV$H|*V$8$rML=0*T?Ah+(p$f1Xh0{%u->U^l< zsyQ#nt?t~3LCS=EeR#G$Vj6h=hNZW+aCimnnAB)K0Qj?;nc&&xT+(b#NB28bw*R4+*P$=K$!wY_?pH*iv0KU#Pv#UsYD({ZB2xAXk$tyo z$jld@Qb|XIp`~+&eWQ9{oWz(pUx?VGqBKKp5K}L)z=%ihK*>;p@o)l8Yz7-iS5zIp z=f>e)S6ihUo8 z*>h|$rvn)~C*%D(*4^bI=O&I!@KHA6e?(FYg4q1Ke|o=+1Fm#u#Kns^Wfw4C$D5km zqSNh5_e6^ji<+COilk}bj1`KmlUD3i{aRO9FYTRbM;Wj32arfc9%Z(=>#;$CXt zL!e?~ll*Aue{zF5q|SyQd(^o`Jv~LOda?BTxgRZUFK03bVrNBXe{D|BOSI}#og0PJ z75kHL71R}t7GEMFeQLhJ#pzYk104nlIyclX;N}F5)I^RHVFQjKe;iPvnv_iF@|#+j^LJy*uycV&#Zl)H{Nk+vuP#!E}WU& zc&@<~Hsp`J?wN7_`EJI##YdjBZ(_6c%em1z`M-~t7-JGfe$=?-tj9+Dz7Ym&neg|{ zJRG=ffG;N3kBSe{bKMb`PER)1Z;*e=obF-o2lrmm~bNEyG@WWZmPpe{p{Pl3z!( zpJB|+!avh5A+ga@H(xzy#c5B>F8LMh=MCXMc>AuIUFUC{cGvt4Z=UoeW?r*Hn^#E)j()BW8S+wOaQ``yMoDE!pMBlg%A{>W`7)xY+L(KAzLJpJ{+^3%+FI!8MJ2qJ#Qb2g+*5iU$(aK z%=77p}@b|AnGQ-X3(= z_nWuPI%g~5k7fKXuRrtlU5}dM-)VYb%h$%tZeq+;!e2Y9V)BfJCq0~h=h(}4Hk}i1 z%xvKo&Hwm_*RP$@v)RY9_TQBES%op52%m7obw4I&jGjyLZh3{}_(Z=KYeg4?7@ojqKd_M0{yo*@)dQI;5eNqLb$#^PGn*tWT{{VRe_Qz7jeqVN z*KEPXspsGP-2QqKVZM%F8Zni-f83PcD|y_Q!(+bc`fI~XJUAh|Sx|V)Jq`MNbHlH9 z7hF2=s0Db(vhdUYaqfm2er;9u)$%p-=Qet3Al^YJ{Kv1?Z`*q(rFO5rSY7{|mF%^#k>8b0ME&_*_+68}dZT{-%xNDF zNX$yAd>nnLiwOvveQt!k3#stpZxg3;rqAGY%!pJgOTH& zft+6z-rSRa+}F$3?rQO9k9&K~d$1Yo3~XgWOvCw;+cobHH|N+_`mO!?_h0@EgDU*V z4c<88-)&OrpOrIa+f&E<`~vKl@WV2mU3d7u7uV1Dt#EDWcXRK+yC;SJuu1+iD@%X- z;gdxlrKDbb$3A2B3jab*UQDOX*FSygnkHLLziMPpyi*))3HBlH_=2)FUoGD>cJ|zi zDR1n=yPt)xY(00z=q|^7_1Z@xU;5#(Yu6jIQuw7ux9t>r_16oZ9$xX`3B8s+iTuOA zB*c8bDQ5k@_jSCc&F5zA?*60S#b%kpzwn>-ThIOYn;}gS&f0v-;m!A(L-22DkCzfsDW{O-apAa+ef)7p|egD{H{r`Q&aj+Pxp$Gw-B# z{(0T|c;}_?!&4hw_3!JCpS$qp+~c=AGyEOAVi7t>h?!lwZ*l6r8<%drD09f`F*~Q? zz2L$>@Myt{7j0PF;Ip1B=N`W7?JB%8RQL(WtsbnH*Y59kUp}#*)v|@KpVh)Y)b@*y zw{N~}(vF9lG(P>T}^=a)obq_R>>Ezj|W# z6K?FX_x(A~p^Nvl@Rv;Kc3bl^j);4v?+1f^ys6?R$Vd3&KJFKPR*R4RJg)!RuZp{V zavR=RnaKFJ{m}X23p(_^>$o!>eDT92Yx?0`?!xaX`r*|T1;6}RIs5xxPCoI>O1vXm z`1%W`95?T%hh}H|u(46)JI%A07wItMGS!yRKKk zKl3`>dB#a?COo@lk1;n1AM@gXKeB)Py)5h1@z3==JNYa4JK@K7I60|w&&1(fKG;+8 z^E(qSGG?Fftu}oB(^b=|23)YFS(Cy%;DCM~y0Q7I(~mj7>XzBPZ%lrDCfbqk z4>YU)(Y+OGp50rW8&h%5Ht6sb;Xk;(PxDje{_&5Sl3q9^>GR{~81tL(nL8KUa7X=d zA9dZ@=+7g6YVaWHIR*y_F{9>Qcjo#VyLQ>M=BM(Xzdm6a9$OIpy5k4HwEtPy;lW!5 zA745DDbyd~%NITS$(3pM4E%OY^52?2I^b*cYlQ#v`bj@t{lVjZpK@;ggV&w?;q%7u zRk;ZRmOW{Yx3jhAD8_QoCe%84kJ^jjw7cRI0_2(tw_pEM^ z^kwnc@xRYc%Gz>rA^JtX2>*E8t()d%jQe}vt^=1Ae1043`T5ujAt7effa6}g?V~SN ztbVd|+3+jw8jtve-+$^iOD_9n!_nQ>-}K9fPm5nSW~uN$AH8YL-CuO8_xXFrb-rZ@xMj(dfyP__UzHHk|N0@f?5Z4ie22F$U7oe~@C)Hbgl|1!(Pt~-*EYQ|;j;ag zwC*y&nCFF`a(L#qubs92&m%V8H+W0?m(h+m3jurEcuuFG*PQ-k(}wRhd+GYQ%kcgn zw3&pME)VZL=grJv-}m@&>S>$zuiA`v)C>Rj*DB^+yfEYIem#$By?OLkF{uB-mmIz5 zi54gHxp+^jso8fOHtsQFeiZ)a$&KrMdt}Mi53cC5I{)(qg|H8>^$9Vhnqk!`Oc>%ZF)at+8J|F3-2IC5_kIc~U~3sz=s;-;e%U_})$S zT{b51tT}sol&pCCgUkA(KO=mf;t#J*IPsmMN3NZd-0apu*nt)&GoEIhTYYkKResFS zEm<#La@>RWz~2c!wDo5%T$?lDhff>d`sbGS%KnLb3cvEXch76G;hiQ+wiT?JJ7(eI zkc043vOgUA=4CCP8udcIm044^++j@XB*y>m27~IazV4@eUySJWdwJf_*H90If8_Di z)xXU?V#T*l-1_l^ElXfm7Yje?;U|~-><@RrWH|((Rt+#*p$BM5PKDj4p z!HRju{{g?i0ZBs4)jcNx_9(_**uu8~xeiM>iWdzUA+?w%(39_@nSQt{MB`TmN`<&cka8m&|T{%1~oEoXYsS zzV-5pFPoy)7v%0b;mxkRZFs%#a~hoc=-P^3y8P?NPEFtLH()8=0WEySh?PGk&z!U8 zh+pQlzVXN7&qaSj_+>A)UF4nrM(+iyTi!gwbc5Y!dm7`v<&FD~8g^CTy60!SKmWB| zvG7L|gik*Hi_30(_3O)5&S=qbV<+!>7E(ivDAYq;D9>GsL{>6wB~ z`_8?5K*PO%lzd{$M&X}aQ?mVyD^Bn6?Ro9a$atzAY-BUk#e|sKQ-{5_sB-Rg@9a-_ zxY5~1Uyoak!XI|!$4fT%+uQ51PAC5Ob)S?Cc(J-J&{^OR~_~H16!(>PCW9YAtSDRb6HQccj2!cIC^?c*1eN2IQO2c*tW|j z8uPgD6=&`{V%Jp*T2_sEdeg=g{eL&+Kf+(OIdR048|NJN{+65mICa|Fu;(pXG5*iq zZNGcoo&}$rU3m1918@8m^#Lx}yo+-tv-1$l#g8b=7?U)d%R`5Z$;m9tFUlWYoK%!G zx@ZV)2;=PuMMK7(-=^J=oV?83lC10@`NKx#WaYLQ8C_^ZSu{2?+R%jsnb;QcAVOzh z|H<&d$L18_y=qBC#U)ue`AHYHX**zuqgG*f%QO0dVmxV-RUsY9-^EmW9>88$dtGk1wQhz#&44BnTDHV4igF;R!d zu0r9$)-HNfYT2OhAj&=-vx>Y66{hU9r=O48pI9n(5Xr-yjN$$RVUiE4{PC>5IoRei z+6X3KC#Zv|I|rM7Nl|t>H?cVg8KU|OAD0zQ0<~)pH3&Dn4^hWJdwBTOXp=@zIMrxFL*^s04o2bQW!u?sG7sBkG7F3GHkj-&;qxCh zim@4RM|DU(Yy|M-xjDna=b(1g!S2-QOv5IxR!5URRQ|LeYgl@btp3HbWqH}@ zCZiCz8wJ~oTh7|7Pwn*#c4s7Z5Q`%HAcgaZw>phzSXn?{c-L1HIdLVSBi!&2)GmqZ z^XsT>wFe!RSvaAfjz&{^Xgbci#w4|eE+`sVfQ3t)qAhlQ#=&*1_^czx^U1kb8pDzuB1`-n$UA_`)h~FNU=ZSyip_CQek?esIFmR?Nt)PC9YP8 z+65teM$v@4I{Gu=)30lUU3=(pMeXbC&D9>d2-Y%KUIz9W4X?MbR&=~J#{(OL zVEWfJqT|P4Z4Gu1iFSe|FMC|nVKZgQH|pR;=&v1&|6uYMrAD8=Oe=D=SQz2eUUdrc z3uws?M)#N+8pg$CVbTv@dDI6-9Uc-qsJUGzKwm`?E(f(s5WWN(k2&+^2i_M#a7@n~ zOyl#tMWV4&)n!3Y_?rXPwjBQ+z6U{1UC`ruT@It)UDMXIw= zM;K4x!L)AK7csnsYZnK)wPVq{I~XI4+lY`u)Gdq_x&SZB3}1qfg0%K6`p2RQ3X4Y8 z;p%D^9|q5-7vn3ZAc?;_CY_yhoe$ zhgTG2j45IOJkGc$)|fwIjA>+gHBuCB`Z&mADlNC#a=U=`ONfi&6vdlv4)U1gmaDW} zHBiHPOyh*Z@PsH(yy4m%B9D0)C{DOn9po_+JsKk3Om>jRtOU}qYaHY;XJYjaV~#hi z9po_=TJB=YC0j1Va#vgKTFd2FZj9w7SZM!a))8nlFH?92YJk~mOIgMXIiecob25pSv;2(VnzrZZMZwG!?U2YJjRKxYc~xPv^VEmk@)mUz?AK^}7x zkj7W)Adfi}E1C4V(;eh7?Jak{<$74Ix8(*}?h4Bdv)pjY6VdK~GS2{ACZ$~DAdlhm`8|b;b&$tg2gEhU@n)EVJmys(uW+wB$YYMi z`lQ~%9p@mADFnJyxUmlMn0JBt2)EHe9+TQ!a}{p}I|!Nq()>N{Adfj4YlxWpcyq3U zJSNw21(ti#a?e`s70bP5xwkC$j^(yk?la3(S?*iQ{bsp+mOBjVKQw=bI|x?Kawl5u zOv|;l+=Z6A*mB91<7{)pc}x;k5@~!b9ON;N0qJ#5I>=*ITW+1@Hd$`7<+fXH zhvjx#Zja>}VC9jf5$7O}Nwi#Z%eAmvE6a7XTqn!*vRog_4Yu4>mdmo-NXr#lZoK8D zSZYW+}|yCo8`(acc0~ETW*o%7F+KAGq5Hf zvTtP80nHRGtalLnOeWb*7$V-RcaX=Ne5M=rGzWRi^FVstiw^RbH!R1U z9eLJc-m}~XmfK;uYReUzWz3xj(a6jLx?6Ivz(F4KBhX#K@qIT$9#e3(hKM)C4)U1S zfi&z&2YF2FIqr2H2f@!+?l{YxZn?88cfRF1TQ1ddgDtlZXtCsew}ax%9tU~M+SYnD z-n{J~kLlgUDE%&zNKDOMamiyXrJ1zIC<^Hf-!Ub-g6CLC+Lpx!26OY1XSJ@rws!^{RnO#6X zN)6lXAdl(M!+K-SO93%NyjkrakMUp?u!cRtK_2rAkY2aQL71VkT&3mKTW*8p zwp(t8<*=Wx@kqK?IS764RAVlVVP2ke5d1mNCBm(8kjMNBsH<>aILKpu1?nc;9}e=E za|U3SUE$g~2yGvzhj4=(gpn6ePvHt21b+$COSrck1l##HY+5EXIpB*V!QR-ii}4ON6A(gkkt|`dk;mZ(#e8Cf3sh*b z%sBbh>rxPQj1y)Ma>KF@GG3&WhB720&Z{MjLHHhoUtYO_*W@GS;()l^^!p;tVF;Cr z+!UD`OseF2r0Iumrj>-35nhbHZFx<8hP;OyyThku4NJl^o=KJ}%pc<&pPe*311rk2 zJd{soGX${}BJC0Q%h-~PTlylLV`(zwe36sCBy$D0BD{-{x=TX7i-EJi<>S|d*crGj z!d-#5hoJO>p@9^{$Y06GFEx?|-FWevvd=}iG7wuf!i^NU49mz$l3QqUj{$kiPtL>U zwwN-%!7t}>DbDGukCUCvO_O9t#B^+Vs#^g&B~5BIrU>^MI<;++m7AMXl85KLxpi(~ zc2?IjAq78~K|mCmDCf4vj0RI6rAb zc5xDyTqPBb&G48IJnyz7|N|yxxG(RCB1m5OH9U?6B-YoNGBgiT|_kU-Fij zUy_@ZcSf;fLvj!tet1cqycFAJ!SMAO5=(Bb#x|}<;zCK%N64#B2W6tnzOv$OcF&PH zxmktTd6tA+dPDbpq4Olu5;cW?i!eS2PG5H}PRd3R@D3&H3oU8+%IKcRPSPtiFTV4X zuMpA=AwSMzUH5-v3@opMu@sdzzIvPuP)>j{1TKoV}P z@Mb<)_XyUbl`&tcCFN@cJC~2vlVvc}!l#w@kTk|!vx0)jum`f z!|Gm5x@~AW=N&Wet@?L<&^hRLm!RLNN#DFYy}|oUZ+XR3_J3ton*l+;3mQFJICs?h zO_x`jp>enO>bL7}*Yx-y`~9Z(HpP9hlMX+8;cMqzxTW8aoxI}9>6e#}+wj5z z&s^2_v2|Y;_8WBcOUR^t67a<%iVy2TtYIxVQV>htOc3h}GJ>;i^jdS82*e2`&^NjT7jlur!)hC1I3 z{A3)pM$i`Ly5X2?OeG^>mdWAcA1BlE|Lx|X8~DjMl5p_jUXxZ{J)kUQZ+Xhz9i+>> zd)Ibr;Gpuau3Z&;9@KjO56+L;Kav5m=JRiAX>}_B9o|f>@b1oflw?`T_VSeNlE5gl zpUuxqt(cc@*{?@=GFZ^T2ZN=JL4m0nPVs44=fe zHIw+Z3cEC#swF6fuLPU?qW5k>DK?ciE$@-Ae*>bw&Ue{{pq!*^Kw&qqu+8f#Y<10? zR9D@KOzdo1yK;8c4779SU|)XLyVWJNJZ(LMvYtXo5}`D&J=SkxYN-61@|4|KWo*>u zYEe{1$wIR*jl2i@+bN~J|-j97%!ectPNQ&8wxy)PXR_|0A?osv7 zpdjo@G}LK>QAeaQb{z>FJKi?Hy{_?YbYy5vn)*pM<&9O-#QmxYka9gYxiata3RDcM z9aui^aujko3)!6NZ8C$;jHu;HlvuWkU=T}vpOBVTq$n-cy{I<9&~bqkJ~x!DZyVsxnj@v}u%d^FXOZbS!-u3~+mB32x5()2*5fOY5hb zkeR4@VIR%$yKJD5De~RG#v0iBjM#r~a@&q=uYMLw>petkE!7EPslv2Z?9S}=F5Oo1 zc~wilPOFwr&(Z5UeOcCbn9KDL?Rr-8#&tE-e>qLnc7+3*>c6TMq0+4NN-cL2VUIxk z<2qE8b*w5Kr95FQ!e`-=`7Eeo3?oMuu^R1QHQPagw1Y75Zw(*+)~YIXNDWK6yQM(h zUDIDVwX)<4dNN2AO}-Xcd|I^tk?iaNzvd~q$i2)j8ahNj?^8=OpX?m!hIK0q4K7@_ zON+^{y%;fj6FsGqs$-f=*&@A-Esp=GC50_vs&ozib941PlxjYXpf2eQ*Pz)dJws|i znRl9d232|*%0JCown^v@%=J}WwW-s+bE_W1e28o0{i`mpHU8p)i-)<9mwBhC9d()y z?dTMwHpQkk@qF6QlD0lEPIl8sRkM;Z8MSCK8baLu_uZ>@-tJ!1G6vaZ0kz!{^%0AzlwM0d8E8QXU4F3^bTSicFe0j=(kf$5( zJhnV#QRq{MvMgnDdD`N#v`yvSd1c-mNU$trgDWk6O;k<$ojt(2=^_tYC3gqA&Kmx* zw7Pi+XStQO-8WvJo(Qo@3v7hR#>JxET}H;(PvA#I+IEP_j?=aG#4D%sWYA1d%8mgp zh1n`Qn8pB{-InHSykGhpu6mp4-Y<9dJEbB;I}A?$p~5=@5}G2-PDk6wd$}*~ zdhv8``Oaj7bf!fsQl7DBy@Rv_X;b_w7fLYQR{}Sx>HZ~1+1244Nu1Npc9st1DXl)C z+?%jgZoD9`f8NHyN#g+{1*FBnnx@1JD8FM0Rf=iT;?9`i_0#obiBxoPxM`OA5VYzJ z{8{VW1q~Zcez>y7q{yDN-fE$}jmzWgAP6URm#6LSlD4N1{VbfpkBSBZ%2W2d|L?O` zunou*$__gx6^H6@x=xGiLG{{^Dy79#4N6nq)IY)9qgV!{8` zh7^7?Gt3y8EU8zzC%w3-??<;LQ(tAMZbFr=tmn@3#FcrsmrmMliVGoG$ZC7(ih4FN z?RH%yIcTz^Y3c9XN|JC{X{Wdwo0O*{ls7H?CJw*L5_TSjpKBpDN(|O$``Pv0-&49H z1`#4VOs?F!TYtC-C+s}O7jJsW$@YTKS1*bQs0=z^TUwpqc6q%h$R1{64+>D0vZp+4 z52OHTO_?H6*;|$Z9qk>x(NmVT7xy+Ec!hUxe*LYBcXvr_>7>18QiJxDJF_)d>7KR| z;}MmV`NA7{=JIkce#VtnwJl58g^0@1b|aSh-d$y0-ZJTuvRfi(!Kg|wm4=IZAo*g3 zZBms@j{s31TvN9sA=;Vb*%Lg1t%W@npBB4GV0?;AP&07~a5=ZI?R7A&&Twg>-3hJEF;qYoKcF_znQ7 zNLekHsvXy0W!?o9G9k18?q&h|IW5@uCN?gew7h+0j$ccCxewGUOuMAt*8SPwB{7qP+f+RCGG?IQu#-Y@;Gl>3pB`!esrW|iTlk#}}_K}?7Y8KA-{e*ifKEwAD zqwC`4zMmYr9k$lHo91CBinANvX1aIxG%wo3p0(YXas1xTyD~cUE;b+O2i%YJ<*b(Z z*_*2yAc^^mt;3tRW#{MODw0s?ODDy_vBP&Sf&5S+wd(+-E0X+hH^pv`#WgSzg%rPR z>Iu@YoZ(@){6z1QEURsz^s_O(zTM|C_1fv)+p9VUj0&1dOuNu`BtqYjU#v+(r9K~v zMwU=?_!f4*um^5-i?1B9>e-huoRL6-cYEZe%WJY~()(co&7MA)jnxJ>U*-Jug5 zqncKv%(6X)#10#Wm!&PP@XmtG^JUWQMIy7dV_Y_s-5&Q0GQ^+A5WkqA<&-OLN4H)x zbrdtCZC?ACw#_^BP_C$YUW%$$q*he)K`0eU+0?zTLgn}HZ`nP2WF`xf_EU*)VJlo` z`v_%IcgwZ>TXxSby|zL5R3a8iV?<`^Ye4(Eo_~sKrk;UFoyoFV^2{szO;yTPUpEnk zBZNQgW{p8Wf49!ntANHuRKAZRNPZ;haII&feOvjeD(6<9fqqx_52WGLfiz z0|@svI5&z4=3R<5eWz4?-p)sNdQHvXYv_>Nu&5Kft%#|ew8a7S4PoD`8TL&KBWUl} zcc{dzw=(Z0xE}hZ3fvTw;*_qA`*rj2m8F%uLp=?GUhV6IyZK)oAYH#sIHb!bU-qN5 zCz`W?8VKqQ#MR@mc*+rvp$N(a;`8>2c-|4u&~laGmUomi>=qym`xTIe*Yc3g}FG`?$rK9}pbZc(q3wR89d`Pu940MayO105zMe-UV#gnb1_!>$6- zG^iC#BNkV4jd!d$3P|eHIRm=2cNGYs`h+a<(w zAPq4KNJBgYq-m@MqIP1<`}QpRR0Aa4-S)bpF}He_$fYHa%B4TheB%h8w9lk+9C0^2huby2D(CWnhZpZ zC7QuN*@A8Y>Mmht0%?4FZ|_h!y8wvm>l4i~d)+_nb)Q@AJIfv2NY^OGnwCH+gNuMz z7ZT0oK$?RqfF=l+2UI0_E(THw-3X+)p9M5Pa3+Fp!)=E1^Px}`2t8| zsRq(m_5)oZu^bWS#&;5s=ISh?UjV%%A-)4zBxoPd8-iLLX3T0q1AvA~eAfbL%sD_Ba|w{fJjHUefV7s( z1JYQY2GaV%cL}RjKLOI1{{y5k{|KZp{|TfqAC7^oa;F0A6q%k2l#E=(n$AFPNltqM zY0QIw*uoP{I*_I@8c5Ta45abR0MayOTaNpNaOHHY`4C9!OEu8D65k&{D*ISCkj=uK z1XL}#Y5}C0ZUdy6?gcbjkGYLByNcDRg(6|h`bdmWI5y&g!zP6pDj z_X25Mn+wF<6%x(M_PRIib)VVm{sS~auG?p?Ym6t?G`?ejR9mM2sa)Cusa(>5GzWP= zP7Z*$4m#E>1X3Nn0YuB3Xx;@<9c=-kjZQTCfhI~0n&9cuUxYgzs0nOkqB#S|Bj|jf zALOhT=vd)K0-YqN2*?PU08}hFm6aQ6dgEYAboDyc04x>?Xafiwrd0JV}3_3)T( zLqUl^?FD&(E)X;hs9eI90%?4=18IB@18IEE0cnVBKpLVNNJH!a(h!Xj+z`hAX^3PX z4Uq<vVk=0^*|bS z5|D;11Jbbf18LY_fp$q-ZGcC@#TA~22yDZ0@A)f0g$F~7tl|Vm$^Wi=a=l+ zkAS$MJl1>#q%m_q^`J<+85TBhwW-ItM>eV6~D;Y@0Hpnmg+SWN_ykBj*d8GD zE)9-zdk;qfsTI8hNY7pdq?Ui8MGGz3WYMn{)x&}mjpan3Qn8M0fHan|Kx(~j0a8o7 z-J+j>G=HaK3BsLH%JYD@|4E|h1(YFZ5Kyk5*+3^s8ZQHJg>bA{2c$Ci3FvF#_FEKx zqRSl#q@`>Lq&}bnkmE^!G=F?Av*!LGpgp41g+Tw2n4bswO}J&2TLq*c{s7Wgnw_NU zMo~L~l;bWXdfjBp-3j!V`%D@o&JpzT13<_n-Nh5HeR6IQXN-pTM~f|>wne3t=f z8pDA8kofX|G``z_H21dywUd}<18LYNfwYBg2GVxIt=5Ms_1{UXyqDj2Mx`58wG9PS4emLA@IvRiS^?cu_K!HR27T*m?1i&Yf=zMPmtA zvjqRN-I#P~OA`~{ly^X$MGANmYmuo3xyn)=PF^&^Vlw0sDBcWl5VlT8*;U0@$_KZI ztLV|V{IX3QbZ%rRSviFXxWG%+g}7w9bLo!2OE-tPRAa^M9w+El=X;y;y(uuN#bKff zDnqCYy0N>dx*2v;TM&@i^dXRAhy;Tqu|32kGXf&IY=(15`DJ@UTs^uzxu8~;o0n!oP93V~OIUtSsMWD+iX4ZI(xe{o!gk1-uX>0+~5dQ+omJnY8 zX^5Rb+7tQ-=w=D~2axud>c_afD9*lW4o(Kr_*wvsmH5sC()ilh>w4JhE(N+>uHzKD zUdMZ&+H=Xa*X3JO3^YqZOaRglHv_4xxJpOMcBe&;0BNqC0QyM6J_Dp-7u)M9fz;Bk z1JV+0vK(jR^z3dRjgPy7DyolIt0d+){MDHGSMzcTkX}c9D{2e$6OLGO9{y?ww9owz zusOBi-Nz#8T0cA&&9!cXj30^C`eFRM29~zgkAEKAi`+cBal_xp$2IS6p55ys%|}Bw zK#1=H$%mW%e_Ot;9GH$PgAiFaypGo#X!+c@g5`W5<)cnmS9J~TQG(inJ4w(*K&-W~ z;#SWTlm(9S-?7-y0khVEW&!mTv>2$5pyfc^TQSzG2I?(nJ&;$>CZJw|wgUAOv>hl@ zP&E*D|BE$yfQAb?0b&{_=pvx&1@!_d5JbC?FK94Oo}eK>oNbRaSwIzn3V`kq#OH$U z67&$zJ%W}4arY+V8EB)R^+4|n+6?rupuIrf2%?|hjz3sYjKBX9M4526pjgupf42&{ z2!B5n#8UqtC>4Kq3u=PDoWnm0$7MLOaFpPfiGw4=`8b}(@ga^KIM}bOrFVA*YFeW7 z;tsTTcPB(WBuww_+c3SmUKz#C#udRGJijv$_VKvUny-(iy*!FpdwE3K%OmpCCWapW zH8I?M4&)@Cnw{Lf*dwE#Y-15D2EQ{AiXjW>1dD;a4HW~Cih;-{2CVazyy0;sK4Qh@ z9b6AE3J=@MFU0wagX#gpu$Rx?{%+}c0T`bEdJGyoQ2YBt5teWVBJwNYkBE_`$NezP zp*UzdTj1d5;(BH>^U)RGm}4{D@ZA{S?W|ykR4_yyLxZFoJ3-31O{aDlVU{wijEZpn zk{}r|4D*Ira-+RdfEqHwrX#XL$mvlDDOg5Kb0`jf8C5zm`X|1bm$w}moo{7Cq%tB> z87W5@Dd#66_t{8RC=T;z%XCME1Fc%62pudo|El#ztyN0~jnUMtBg}eF$9A!vua2Ro19Y!33CX5-DpBpR%hmElCZ4tk(@an(@*y0mu z@ri0J{#{WQ|85ljx-i8r4^w=qTMHYqCb*{}6hwM}AXp2ouwo!mF%Z=%hR358LtTyH z>$=2{Us9Nv-5dLjg%*Y1=?KNKtcEzQvEm?7aS+uij#r}=M_s+Uv)VvC@~LSfbW1Xd zqDI58Qn(~SA?yzjf;Nt!Rt!Wc2BKQU@IlmKn2REg3ez}l3nK=<#?fO!cf2$ajPvlkrth()}ptLy6Cr~=zj}S^iRVS-KXTBn;yOs5sKjX8X_pSA|O%`5Qzwa zckYUtk5U9JGp`o37MAHRmo}BG#Io`=pZj|M2 zupENb7}>JPCgN~EynodS<2a`M1CI4LE-?+8I_J~Vvqz4^E~B~Gg)O>vZJXMwM@oKH zNp5y>-thcxBl7b{o%afx7$^JGrj!7m*jEdMDC23n_V1n94*=% zl33bGnYN=agMun3<$$7_X*iCuL+Y5IB6aQ@P~xDUQZxO9NrCH!G2(4CO?P0T5swXE zh!Nkk8aM$bq@i-mb)j?dv$%7@-+v4GJwE97gU;`E&Gq`n{eE-IMw7<}BN`b_O0p)! zn{E!m>#%_42shb5cpVndT;bL@2wMkZ;*PPz8$R++Z5P8fzd))$i-6G5J zW`Ty~%>s>&6NbudupDn2D976ddfj%*vB}AJ*J)jf-J6xWYuv+Xh*IdS2UcK3rvf!a zj`e2L0wCSSFz`kKE|O0q6YW$prKS?6Ok-u+&Bp|xvk_=q2Fz#7{)^nOq7Fs?rNkPS zUDhse{et{i|evk9}Et5FfBYXmGBE$Na-`FIjGd<=(X1`gjTU-%0pMAH}q; zM`qFo6&J!M#q-%^iN+J~{ zk;goR(kSL_-MZ>oRwWv zoRg>f%pdR6sCsqO9~wM2*DeyAmYu$yojh*G4>PCM@*w8aKZrzVVZ2Sb* zedyS<3zDXP-T&3~!zL!V$a{TBM((9)$-U|@M6@YP@Mi=r98r>!)lSR|wPUIFYF2`! z$h0Rz75-A32a3Pv>Og-E4HgcsB}XX8z!gKEzF=)GOuSL==RLQ9W* zRsVVsTo{KgbH(Nhtlp zJPyUdvYms2pDC!I%=c7$Q`EQOn`O8S->kTNz*;LVk&2wiW8QYo#+&yXsMu?#=sAme^m zR`TvAxCz{i6T#+~VOai-IPQyBZ?1Wc^udP!J)MfA`1u)LFr=QCr=d7l7FSQRpbzE~ zVw>C!-}mBM@{DiliR-LYPeiIGB9B?-oQ*ecILKo*S#GoC{y)5hC=>5j8G|<+<(eGl zO+*EFeCJ|$lqR4amDqapAPP`RJ;HWM_1MN)lbS;ok=LZo2obI(K^vxjkTGQ#YUq3% z4<2w$Y8~l4$GiNSd~j6?Zt=|1P#pd>=>gOj<`aUGnlu~V%=1I|W=-O18?8x1T9b&> zRVi2LT&FcjIo2e-t^iih>a4Un&e^F4-+Q?URq-*{go>SJ%&LhwPTPx(=EKR zmpdP}>%)LqDt5CT#nCrN8w|s1I4vK!Jsy~yn++>1*4IBpMB;ps@Xb!v9!v?@R?RLg zS9Fv?HwA;U#}r7H)@`~0_PCE55x$wnp*S!Emx*9}nMKe7^ZgHeH^ui0_-4OmF}{=V z{Sv-erX~2Mwz$GdwMC@bB2xRT9PP7m+Z_~dc394BSMDP#zRt$w5O8#zjXMzgH9;Do zgJ->KhGR$Q_95QU?;*>;RX2VoB6N=dPhb9sbWw5ahxr+bgB7v14hMJtQ0Wq>bcyh; zZiG^fwp2M+l83y*!6}!lAaVM4IM#(0r|nhvNzQloF4Wlw<+{q>2G!_x=p$)#V(urJ zjt8IpRnZfv=!x)ZSwySchYs?XYRm1iT!1?MVux`baus~n+23JoJP-}Ky^n}}#y|b_ z73?#lC+@GUXq?75R$D}>Eh4-e6D3z}m4iHnu0px3mJ869ubWtf3r6C=3nYTOiEtZo zrsmWboc_wja<`-t@(|kX)8(BfXZrxP7et2=+^HN0jy#PmKf#^K@4;Oa)HWH0rmioJ z&kjVh!EaJL(DoQGn$65D%E^KO*SX=2C&D-3jfwqB@XAHJa!#kxSQ)a$^~^2mnV(mj zJznQx{A&nrclO3b{PcqP4B262d57YloX)|)&ki^!$^Z(KZpJtGraX4yo3i94O4`1O zw8jv5Orsb*8*jJ_OF3?$q}Ls9Io|bDuA}ABm;Epy@8z%hy!_-*-c_gl^Wp-NBppb7 zDW_YheO1(>gOh$%SxrerF?;YYx(@eT02zTwM<MV4=xZBS<`rGFE0TX9NIDVy@+u@kU6Atp(*HyqvSyJ=Q_GbhuHzj^0#8X+XDWM zj(8{zf3r0U=81WQ=t7ROFSWWNQe6>w%+zu zz`t$PP#2AuzqX?3mh`pSB2sM;X}3hVRY*s<%?^q;)RuD4*8gAx`#91Io=<2Gjw3;i z_72GE9oQh&wi$O2I|5n>Gl-S$BD+lPhxr_e<6uUy1E3S_3=pZFh&<+9#H`##2YF=d zs$8|@+*Vc7wWmex+A%|dH)02F5#c|IZC=My_dajKr|$jzJD;ibKO3Pl3S5a2)f77S z>r+V+sicWKQsFUlO5=fAKd;HO98V zMk$(+E!Re=3W!t%L>}`gq@vvC4)U1YmfK@FpIV~7H#rZnjSkWPy90E7jdA>Wz#4G9 zbrQEo36g%qH!kDU_2WY7(|9Vk5h;(P+`)7cJiklT)jlviwbA~b-HEdZ77Zd z=|pjZP}L2Q>W0W;Rv{+k);dTHlXBZE=eB^F=KgO{oBL^qJ^1Nke{(-LwB+@cp1ah} z-^w4vN;}s4Ryf=b^Dz`hJsh=7R&p~Yl`4@+mB?e(A(V3K9TZ&S58>U>`A8yo>Ak;c zzaX?2Z3T9u7Q&(*m^|Afo&Wa8jq5s9NPBOjS1dpOg49QQ=Jg0PKZ3_Rg_vej)0Y;c9h#}xd1)= z#pB*kPXcg!NhfHg|5l6QJmGmhQ_T#OfL)#9LXy)snvL@IhB zkNE)7Q0`*~>3whIc3Cb^9e?FmHq>43PRJ*XY)2ep4oH7)?=;e0QGl-MbhXUaP#kn- z?$pOD$05{qGk{w+tFDMtS429!tlTQZryLuMa-3dPE)$CVh)P=# z_l$DB`Wv9*PE!MiB!@=I+vr|Hk4aASE`5HebhC{yehP4 z1O0=a07Fbkh==jJBtjX#?qApcE0fIJYe-c8MaSjtZ5d#+2J;Iagyf-APW=?&J={ z9`4E8mb{%TpMcv3I*Dx!S!?cER zRze2KaRj0q&5?2ey84UVMyT3YW3kYKusERHbN)L zaavJ1+Ct^rR#nrr=SA(>F+GiCakW2=bW7;g;TtK+J?bL6-J}1lYQLE>=X`_?DR8&P zs78x?A)`v0NTp4rPiiQ)9c5R}mFyvR^-GXMVUT$JCmXXui`TmPnj#G0@oQcbp`6qG zjnjW+#K?U}RSiU{1|pB)I8nJT9psU5qH=pJ7pR)Q((UsNGQo>7=w984$5Bz}@<6?R zfW~ULlSAYF`QB318IkIY$Yb6_X_e!X2+D1<9GjDJ0XqAO-9HUn@N*3Q?tjcdXf5Ji zz;OSDR#R<WWBpMWiD~(+rlh4H;`P7_jWKY<) zcXZ9=5x#Q~_K*X26_08p@{5%+kxH3J?*=MIi7Mwx^pLxb=aEG4zW)9rk^K==W}o*Ju;M3D@e_H>$B>9}Tq2eePelj*5PyKSYM7*&?mik9!e=FP^g*QhBJ!9OD7|tVhbYH}que$J z1wDlR7rPMNh!5T%&42W9Sdm#D#GTI_t_rtsl z#Q_sk=QE-nD_J6yERk+ar`!g_qns{&aH?&_*RF%GfoXHO&Pz*P$KB2 zpK=j8hrst*MCE*&SP2rT1c`L{igN2wM&(=y9&+b97fA%aB*WkNwhJvrYq(ue))=xK zkUY=vw*~(dXUjLJsPQIJaT9qAA2U$yZ3pR0ta95e7pQ{2(%IgLJOyt6=I?ATh)`z- zI!p`DQca63&4BrEKg2_EK+M);&obdR95@yitDcBdPedN`3Sv?2H3#YAxyo&}T!5bb zVkdhSauvKBz~9MsK0r-H>|8teH>jGbIuy?JB&#VR)fAB~kx`CIWR&9+lycORa?sTO z;O-t5=v@{xYHJVfFdQ6NL~7v9x?SFBR!2mtBO+a}r`$V;Pr2<5((Uq;b6ZnQ*L@4(iOzM;L^{C}-~O)qqtLBF zT(|!q!GGq}$4BVG1K-OOl?!hL38<|iQt1-u)T?r=_sY4FJmfC?2_zBxwljYhz9h6b ztqb>wF2vZ`cQQh`zTj_p{wuDWZv<1Z6RFsVJhC&da$G#19B)@E#|c>F0#)%>x^g^f zZ&HJd6Wu1q1RZg_b^y9NP96=VteWaN6fXS&t1Tkc7LiVpE4LCdP>$MCj@nWV+WH^3 z^v951@Xpr$F8x3(-hsJw+h$z1{vfpSKX>aFSv?V{o`^h#&RjWe8>$>FpmMZ;%K2K= z^pv=1ak>Zj$_CO^{~1@cz~O$H10Zra$OW%?Wvq_}*)WEo4Qqzu`Qz|MJ~2hbS)Dr% z%P7jpOfQl*sazEJ!iRI@g3OT_h3UnG89Bv8LFX^g3o>$Z^D{Gw^9zGdCt*;Z-Y26d zJu7=y$%yov;-H@q`mpDaW0{(AUp>TWlJqMwa%DeAwzMQEkN#mm<5E zaO$gwR8vIy>MG^9v7>T6t#DAP`$d0s?J5dCSSiPVBkz8Km2wwO1TW8I7%JsR95bg5TxJZq#@e9|JevdYS&C3eC^~;3My106)KS~0#$As%CFoZ6lz^f ze?=rhwM(IDYx=&mJ4KPcy2Gv_Jb2-9y|D_HNQFzJOM42 zRIo&P7gV|J5Ug^CP_Q!*Y4B|Tf5Dzx$84H=>p6Hp72TcZgBK*9Wl%v9sUV58TcsSk zRmvSgL2_C$__;)XLB3RnAbqv3X6^Kyi?C+e8M1>HDDN<-K#5eKMB3z)W0O~o0_{*a z&AY$0z1t4Qr3h_5oHF5W9zWpVGi)WMNmG2;j~j+J-NtY(LOwCcd71fmQ)y9gc3v^& znuh1(XXX)wP2lq`+NxsV4t8?d}SrhUy#^hus$z>V2c)4$3((wGk zq%$&eGm1u@aYh)?GCh@~jP#Qvef`6{b;2J^AIbAWWP3PMCAXnaDmo$+9g+4%mD`5v zm4oPbcU^WGH#*<+3@(n9d!%;)g}%?%gkk(X6e#C$5I_XV2cEKn1j;bHhMD&hXfMhz zJH2>hcJu;7jJ14f5g_vtEWm+|0B4{ODnKF?Adx=cq}&FCSFV=E%t@pz)u1(kOX*Rdr!WFPvH;Ha`KyWq+ zewf7kfHP)6;7?qDciHXd#ohSF`DnhHD9bOV~Q77BzCXbZGtYnz7B%p{p4(`IXC(v84nGMO|(lT4VI zbOFSOhzKZqSw#?81XM&oM1-O&l|?~70TC716cvz7S>$`(v)p^n-7;PD&sTeXnVfsy z^Ssa5-*fJ{%i&Fd%GZ`zDsSHxk#i=k3_H`Q)VFEhn<-Qk_ob=2-^cc+G%_O z+n=3|#B!Wb28AN%o;O|U>iS^1>xAa`V0a*xSzn*ZWU*q+IEoDpIx;y9Lim9`98GaX z!8oQH9CYO5C@+!e5P4`zW_sF_tLlda5)?vZc$mRKMd0anE|wO$-NEaVj!d2dz%vy*X1l0uilRO_NhS_; zra#fprz2Az8-AfpSoK-EvZ^!v-3)y?GWAQLf21=Xwa5ouS@M=qRn@O|MKIde$5VaD zZm2NM2z;I=Ix;zrz}aEWG}WaOjp=NzBhnZj=QdRkcrMY)xM;^O&P7KiR|UAr zz%>M)J66s#`wb1oGr4}uMXIVG(`(zqp;%aNtyvVVjWNyz1}7bvoHQ|<1k^UQJ1 zrSVK`{a`XO(34(3cjK^lG1y<9O7^C^+$mE=lvw7fr(1+8=zdf9w3=vSB;u$mEc=;{l)a^`!?^S(+tF)A>f4 z=*Z+F8nVAX9)Zs-pO+Y%bYyZ$d-ORUPNQyYiKX(R4=eEgPDduM?C+=K%WF$CabIh2 z(~-$7`{%_ZjU*lt$jA763`-^1B^CGM<&nF2s;XC{K{seQ7Hhy|6};P9ng`< zFKx-seE56%(s8SGqV(Qx@X?XUC;QYRHa<*Z+Ts~Zp{lAftFkAxB-dclfX%yeNuK{^ zBmZ<{^34MK;mH4tNjPARkM9<~M3=(G`PvLVIx_iW+x)pLeb#Y~<=0k-l;?-><7G%k zPR>({SpxBor?Dm75ea3H=Uihty}GI@s}J@Jv}KZO=oBd8tjCXY(vitY)A~b^Z#VlE z>hDTns-(=h_B8TKMUD>DDB1lKKVB61)C!{^G~aNyuRtk66WlRt_x znls&Dl&{}{L{$|p&yh=!%J3GW4C!b*Ytwfy*&>9}k(rJ;kdz}GKk>6aV*kB&_J=?J51 zOS2zy+hC~E^;lo3E7i^GZ?3^ZM<&l)@Kk{3UcdZFi=bwY_2qY=&&!RDOkO#^I5$6D zg_-jGp}|W>Ca)YdbQ%Gia zWwUff4ki_~L;p=Dt6WOSAEjCA6qRYwD*EDGf8%X|IB5JKM;KLWCrHe=es*m^xv901 zRNx4sYEk<)wFqNst>vd|)mYVH`8V?Qr=lOfXlh*~v8!g%)8{En4h1 zwbXq5LTC|2)uNSVQ;Wl7$-g1A2%~CERJ7E5Q4b(T7*%T*ND2a!Uvg@`4iQ>}QMGo3 z#MJ8e;)}SDk}0ecT7*%xc2l%)0w=W+LW?k}7Hh#q3Wv0wI#cU3p+y*ISz2!)Bwl5B zjnE>Dsx_HuiC`R)lPP>ghzX;naCb-w0ur}m@=q}(k!PO>EyAc;Wa-TmzB%Le2TiU0 zggRkVtv!{vCLR1-)YNJbT7*%x_VS6VPiPTF)!JK$>;C8g3(UB_A+!jiYB3vR^e;7E z_X#b+s9IB$xQ4sN9Ad`xzR)6!s4 zFsc^a4e_e4)k2Ffs@DEWT$2y}i>38mCA0{mYSAjcS6ufBEyAc;G>j=T! zdqRsas#XysUUBU%ik2{{)u@tJdb5BWVN|VYka)#KPbHEgjH-1oBxb&% zlixnpjEiodk|T_&RSbz&Tt5_Agi*E7>@0Cz5PCCi#`SlhMHp4q3h#s#c{>T;s$v*9> z7*&hbh|IVyI{j8mNn~6X3N6B@S{S^&%TQ<$M%AJ@yBSyb-L;=H?>mH#+7*(s5X}PEH1))V4RjW>k>(WQZ+-t_QJ6$xu5k}PtL*ms_<_Imq zs9N<*OO|!>so%ZBjB8M65k}Q&@QLekp+y)~t5J#Tch#AnnQ^@$v{P?F&nsFU3vwz;B8;llq{Q{yhX>qX#`UbwB8;ll>=W0R zi3o%vjH=ZFiJ7l6Zdke0jBBaTB8;ll%Cy|`b+XVRjH=b9#I@I}XB3%n-6OOJqiQW- zTJCZENoWy9)oN#2lklJ1u@_bR(2Q%wE?i0&RSTCuC=IE#>YW#1Xk}ZTE3^osYQ+?- z_q*=A#MEjKT7*%xIuxygZ(DY#skKaK5k}QQ^;lAP+riamnp*uri!iFzGDYjCDL=sw zC-Zft&?1bgg~8hr*HhOVc%`XzjnE>DsFj5Oif$PN2OKZZe48kx-p=BKamkOR*2MR61 zs9MMQXf+8f!l+t0(+c3f>11iF7FvW+wT_3xD_>^`EyAc;RFYw7|rFsfD; zBwlenCA0{mY9)NM-V<7c;qf21n^-#}E&MQRhlIL3opH%RNcK=9iy)b*NR~k|Ly;sP zp%KsI$w0!|g^*&ia!3XZjCEzQo216|#o)DvB05=OXF`h{VUTyr8g&v9FRdGd7GYGa z9;Q`-|H9NU1pdK2D6|NpYOR9AjO(uZevP3?rtt4Vi!h_udU$E+{BpYQ%u9pT%ps|` z+K|jP7uvO6gBig#S11f8!zg)A8Cs;0Ty@V~W_k`0T7*$^ae|_C_NH++nOb#1i!iFz zYDH_=C0*y5T5+L87*(rJ(NeF4zaX>-qiXdlTHjbUrOk}%YN16KRck=eTKK)Pt4*zY zgce~`t+b-`!Rw7Tnp!UiEyAc;gNhbT;ABhqKxh$0)jAOpv;C;`wR<6P&|8Ietqdfl zmRes6gcf1cxU!0tT3jI%g7*%UX(NgQ{Cqj!bs@57sORcXz3oXK^ zT5A=pqnGb-1tGZGeKPk6qiU^##4N+3?p*OVQ>#j75k}QouV~FX;iu@FGOjM6MHp3! zMnf~Mfu~Q00gzf>6Bg%)8{tGNX)oYYje8LB8;l_WkpN1Hn#{Z z!l+tjDq5RIRfVEj3>=_Cz2YVN|WNAu&rs%~!L~B8;ka zj-sXJD=V}JqiTIs(NeAGWkQQEs@B&OEwwc66Iz5(wJ;1@@}=6t*Mt^fRIT$AE!7_G zz83=F2%~D94~bcZs>KcpEyAc;7bsddfs?H_CA0{mYF!A48JAkiUlUq{QME2owA5Pu zfzTohkN;Un>Tt+sXb@{JL2|qz`70zhDw6jh*{Ddgz43Y(#s-sTJS5L5m^~nQOOYG^ z$!MsUS~DP-sz}NpS)fQ3KythysfXkgMbZYzIf`T@Bv&hvZb&vNk^x9)dold6AKsOQ z@2S0bp+Ke#jhYRAFVcsqr1A6z6MXY zIaBz-rQqSQJR&3{hYH;O`!bLHNY+6z7QANcJMSmsl4ZD`BALC8 zF1L8bE(5e6K=;+BV#LO^E{E*<`lG#~C#6m8||AIgTJJz%po;tOR zA6o0{3Wo8ouPYhmG5XI5v@4AIT867&a#tAjbs9+kG+WD4kQ@x5SsHWqrzfVZk_#cB zl$!Z^8{Zy@P~#LUH!Mf7^Hlvs1|4M+#s8i0BX_OAd`}S*KtgFI_jD2S*grKF*FiQ?Enm+tPt$+KplR0`alKK* zMb{Z|?ROAr8HqA$c_k!NS7x2w3<=E_UEBcaNab@Q!&oit4MzD?6eAGs2F>1nz76R} z%r`NNwSRrvU_M4Lf7`))a~{mMFpRZMZ#I~}ESPV0Fn=cx=I=Vv{2hb&hl2S#j2S@f zB}g`ox3-o855bPv2r=tx0FrwY$xk4mQZX?*9g0~BBxaqqLGlMfVy)BfK{`^&Q)?&) zJWK!aBlkTc7gvCpOJx6g9Fp^PvF2j@bo9)CHH9l6`4nnqns0>U14Z%yByTE``We_? z(U4fzJiiaAxwbs;&~H1qm4H~g7+T~A!+XK~kkC8AX6)lUU!)&Dg z_>sHQVE(6IzSF^c7jPpn|A=8W(SQ8N-DNNzaF~?H_R|Q-#yza<=L$&Z-E_0QXeghf zNOVYgAu((4K1hyNBt=JHw!Ej6`4~uOMcQP(5t8MK2UTD*i`7CaD&HeWiMj;)wJAt5R67mq?hY2rNA`Qc9>i?{$>VMy4gp zXJ%pJVW!pwXi@oWG|J~m!DC7$LY4B)CDy#(&zLLdKYo;VlQ{$}$~(ir*R-{i1UOUj zT}ZCR6|y-87+cCQ^q-gfUW&w8Vm}3j&)EVvs=EGXe{h!A&lu)q{NEWraz8antXMGr zR4Wp3&G(FpMw*f0dXQnPaXnzf)gYK3FycDaGp>gi4_(GkzMg%c2ZqGnQyyj*dOBO? z>mehqKEeEu5!X$gaWTsipeZ=TRZ&S#QrYABIg5*WzKm;=5!c;he}*f)h6Id z=hl6AE%QDYf@E-twca;C@>RrOTANQG`H~{(F2{$&6v?BIWH9T!7_sa`QE4wia~siEHLu%r_LtS&%%SNZx>i zVmEWzG!M**gBh+v@{~hz_4_ttGiz4ZPq|rzrF@6`4pdqoQ`7wlI1qT0-No}WRP9E<}^WzNj zSNxZ0e#|)f0LU1(c$uRVumF(S57|cfq<|iD?zhYX{;HXEpJUL~Cllduz znP_4DmBGARF#n1%1E^grBy_B<(>@JJL0|&~!0j>R=skE`bau1QB8;l_3?u~sR2y@z z9@%oWsg+#FrG!zhbAJsspvb#5JZ z_XhKwg8BCj=07s6cKoNDesul57{*~3l-cP^3_~+%nlX|4qrtp)kO?3uVtV+}pOBDT zZJB?9#I%QBtbAoUkBg9J2I;@15k}Rbd4;)-wCnRz&oH%a4ssYe7zq;AlxgC5_=8Of`ET5zs@k$T7J!7J}5-Ibk$m9OY@&0EeKT7fBf8S%U>AA zTFZYnnA-&NpB>C^FfIS~L-riC6EN-J8wT@*g82;x^WT`3e?R>@!<1N<|7I}1E13W0 zV1AQn`S;Ve7-lq>sr8b3(>R)0BPI57ej5QJ)!;uE#%f#MHkelk=C>Vb#sE)c$RpO= zNBnm=#**fD4Cb#2=64*-?=da^w(&m0>;YyuqP=G@KP#Bub1;9vwEWAN`ba^5N?Vrm z2gcDMwGhL7;9&k2q$8E{hYVvKh5uzRHwor{Iha3UTK?tyF~iW*LZZ`n z3Dfc~=YKPdbsYS}V7^r_f8t>Nlxg|*K}u~wz{>oo!Tg3`{?x%7U|RctpWLXHpS(iW zP_^Ns7>3%OER8@w9@W*69%f+ydrv7~TK>J8dS5}n+EWS)=0U++;9wrZwESD$P7Fi! zC{sGdV7^8$k8v>5s^Unkj@~3L2w3g&&Ia@2f_Y~LGksTbB>Oy`VXRhkoWcBwU>@gS zp1`#H+Xl4?)jm%!m}|l)B)ACydkyZwwEW9?SB9}#(OnGY>jd*I4rW>{9jTnD9Mrb4 zo5B2yVBXEaT*$Qi``~1TvD&&qgLzy%iUO`MU@wi`nU;S!6K6rd%DlV5yi_pn?qJ@N zY5AA)UJOIFbPRsv_B5F97tDJG>}lScX&u7wn#Z-wJ`7`R&wCrpe-+GoJD8_1E&p=f zmtm~!d5XcjUjt9n6bJKuOv}HV$>yu=c|U{sIKjN1gL!|Zt?r$*P zCz$tlFdxXY{A;j?VaR&O8a&WoepfIb=wLpGY5CXSG={OJ`5=S&&_<29gB;8UGcErb zq*hT7pcW!a<6wiiQ!pRwU_OLt`Pbl~4(3A)=I;pRLmbT0nU;S!&tMp9Pnm8oPmQp` z(55?>XEH7Sa;9(Ms+NDI!Q3F2XF8Yu^DGDRkxa|KoT4lxg{wa~Z=>J<3*BYA`nn=28bU zeGzJ;5w?P1toFIwU_MDOmpho}FfIS~JlDZI$6)@MV4mY(p2xKI(YSM;eN{4ybtW^< zU_NXy*PQ2Irf*S?bPZd@FxHv*e1rK|!93r=d=%62ufYWjW3?Mc8O&c4%ttwxk7io_ zJ!K)oSZBFM8_eGk%tt$ztC^O64F(;|)duscg1Oqk9AaAjV@eIfSZBE*gZbztjk%D6 zxt3}9_rW@bvD&&?gSlTY*E*QPOv}Fp>luc|EZGOc2J=AD`~<{}Q}#Z1e;2AdehI>IhCn3IBev4gppY02I_?)iPO zXl=i?YGD}SAHx%pLn4=Enjy#x`G7MRMS^GSla!@;~P59Z|zV;u*V z8O+}m%*!0iEAn7o$uMN=WSUnP%+Cqt6%OWO@?h>{7;9-9V=#|v)tEcR!F+5U%*Qc| zwQU@0Fdr?Lk99EXc`zT(Ff^vf($Ed&KEbRznB#dccQK4L&2fYIn}Rv+U{2)0+|4j# z>tvb}2J@4GIpJVV=E2;k3 zEa%k*^W}nhwaE+|xqhZaRul)CyA>T^m`w;Tz>i$N!TfW<+#e{S)p*N&t2EOZ3pAyf zyPbsp5wu3*m@rbSI75MhOba)wELu|k@Fj%c7-(7EY(0@_%|RFrv?HG^?=)51TClUmmZEy6&nwmnw7ytadY>zNkCB{kO>Dcmi}sTfAlI?186 z*3ddwXfcd(_w8h+RRL0&u4SxTtR;2|!_2T?+8vnBIWS!g%&81hV&OT)f%&`x)9Jtr zJ21yOFkf(Bj&op6V;F1RbqD5)40D7f%~1#DbO$Epz{a*FifK*u6-StuQH4^ z%~KtiuQ}3lfCF=`Bd#I`<~&DS(;S%d9hhPV<^qPXmf@ie%!Q8h%y3{XVi;?`=x|^z zcBJPp2WA7q1TE!!gadO4!&uWi+kv^1VXXC4;=o+yh^x$jx!i%NaA2-*#5LD}xsqY5 z{d9!`^L2)yi$mF-D;=1t7{=PhsvMYaI50g9%+(IeDhK8ohOySg0te=s4osl~b1lPI z^S;!9`Iducp#yWB0~2&$u4kB2P=+-2kmKWybu74nVXSSV*1>Zl!&vJg?7)1RVU9-} zGA=$^S>w8iVXSSn!NGI00~2vzZebX!4L{z2`3}Qa%Q^1AeAf}zVh84X4otHHb1TDG z+hMB%^L>U1qI_g~UgE&q#xPdfyV8n@L0S6&!yHeCikpWSLAC1+RY81)C>Shn3t`g? z=l)f}(qIUR&8dN4buq%5QvIo1HrU9u${K4ZFuu+w(54v?nh`fmHPEKHNN6r{(^La( znu~?zVmD1S(59(NUfnfTd$3(wa_g=!>q@Y)OG&U+-Nb}vprmbXsIjpvRM!@246a1I zC|k+})eYxFp7j>smc~#));-07bt1R{MItt6^MWi{f(-+fhT0>cmRK-Yx1>DiMi?HM zP(oC~um>TsIWnaQQb{5Aq?O6=$$DEzg6ylWLurCk zQpi1MrNQwbl@OJ3kq2R0NaB4cO^`|oxd*MZT|T4|qEasQAZ!asybq-bQb{5Apfyai z537MuNp-Khw}lK1A65%W<)r|x)aFqJ#;~EX>Ru&)=<;B-pj2K8@JMa*$Q@NeRL*7( z!nTma`g(TiLof4#yLfM11!#dDf((D|*+d|Sx`zAnw z>HZ zXQ+HL?7-V2wo-b=OQ~}(jhJVLhCObT)+6>9+g&Q3{MwLeY%HkOtETU^*X zOLyB~+$Ll@hU3!EviUbJ({fyGEJB?(Mp~k=P)luC*HNu>*}=iaF5edTau$s1L|#P3 z2Hpa~E=Jf@DBr_PYKE55wTqCkD^9UF8@r~lV#_-81~hKi4@!nL1Xr+2X-jJ>3+9pP zp4LHS(`z1mStO+C*^{EVOln}&(s&=Y?>h-cP|6L_)o z>f``%)Tc9vWP7qdjZMLD+LAVp#ipCp&7tM`(oj=JI9O}!rODG#N*B`<99z-m5o+7Q z(@C+UW=RcobY*W&Ck!#^dRM$#kN5SZ6MAzpn~kqZLM`3b7tbYeC8#&06J6N699R0; zTz4?YuJjW*Z0+q8*q(*2cZ-662+>=_D?9PJ}QL{a3^MH1x(|z&2!QOZtSUsBSPNnkz#=B1#%I11f$-aD2 zOKmM*EX!8DU~Hz?-Ia2!D-?8&3<~c@$#hR%xSn{bFE1cWSY9~25gR}ft6QO}X=F=y zj@HyVm>lR&cgu{Vhg@@OLkUZ2Z)|qd;GkQoY^YpjXu!44*l>DFI)P0sxeXs7W?(bP z!M=FH)mqtzyV#hQM@qYrtK3l0WO8+PDkEA#Vkk2*C^_KTtQ97Fqt`+;SnCGq21znkSDc4Oyirle%+DN(63hiHvP-X{nG^8ljc* zg>HE%ww7cmEiWsbBag~O9OY%@5?59sQd*8pKLu`HiPV@^B60H!-FX!vE#>nn4P2#+ zZ5}?#!Q-v06!|T$G;s4}>dWVs&eN)^OWNvcqUj+_W|~q1$z_=oEPIgenX1b@Q-i@J zSS4M)67bT^gkvol6ScNnCP>#Q@hFD(RC+*OGe}x$fWds3F|({$T3rkqmrCeaHkAuD zbW|57dgB>AmxyPKCl?GR0jx;o|HZ{=Q zgT99?(~GPB&y!SKf<&eI2lZ-}OZ1_w$nlbza9d3SYEWF}P*t!>7jfu4gP0QMdgLi$ zPIu{47*bN3j$mq(iua{XN(L(+)w4--?Nn~Pp1@w~Da?ZPWN&YLpt~=b`3w{vrLcD0 zy82AKKiSArRjviCsqRfCR*ST=3?+Lhzo~(q^k*aayg}yT*f{>PkRbGZTW7ArCqH>B zviIjUYD{ELvibGuP$;ao@HK~c7*`LZ+A`GNmCR)6Iuvzj>z&&;0@l|ot#=#Kv#wz_ zu5Hh*G?i^l@2q&UdR!~M9^EKMRz5F_Zms+1`u?tTpHG!<3u=7D%Dp{p6LPZJ_Lj6Q zh~3)IHsW=*o^3*mxdn~=HPKi*U-giqeRaekXRFbCg5e0Gi3cAE_2~L+eI}XY>o+jk z&ZgycabsDl|DRXOTTg>D=Kx|(AJnXe-KQ-$^-Q5}Ys-{^y zO*c1VO5tg**(JedlNEaz*Da*;GOb%k=Ve&8kj~4jZXq2RRl1j>&+kdhn-{O>(#sR2 z3B95siTe`s=2z--6Q$kBWPDC}vXrht?FM(tqIK;9Ti24T#&!!6GE#eoa+q*WK4xWWu@u@i)YX?th!J7iPwKa26s{(8TSnm4sJ1b`)7);;2&!4V zq8cMu>evuF1f-0EWsd7S0GMMQi}mEW6YMeMbj>X@vv#n_P**{p-D3{qd- znpHu*s=LMMkaK0^c&pRVfg3kjy*t@8v`WVfrjk;=?qeAV@+=)&gUDY?ss4P`V9n7; zMy@lYiu3o#1?D^z-KLoNs@m2f@>H`I;AUn}43YUpR^5=y@sUMNPg^k8%g-#;hKyB1 zF*pU;LIQhc9@(HiqOVP4=}W@qSsxzYs3vJICYvkhF*y7+uvJDwp*O=I86OOVY1P?y zPm)D3xIVZH_Ycx*vwU@;BbVySI&Y*zL(36c1dH)%goEq#tjRWz*lfCp!bb!|h-~K4 zeL5Zzz}o$qB)eULTkQ^uw1Sl+3IZ=1XjCP#GNQS7Vs%>_v!*C5{G+Y&t1`cvMYSQk zxWI4s_^jvs2O=r1bau1iR>%WnXw4sG4t zZ`?gEui&#QK8f7=$(waJtB&KrIQBTl*3C>qp{2MruP|3vZ0$4?q?lQv1o-^2nieHu zX+C*~CNpc2nPuYU0)>b}$7mT1ZEYQ3d=wA2n!|QhEI4D_=987`ZIxf85b=0JoSw+p zy4oRoXCI2TsqM2alyB2chh*D_pKX}%>gpQX4J)d1P4)BQxy#lu~uX;Pk`N zB?zDW%7>j;Ut!l4dTl0G*R`rWIhfAmmLZvXZBQ>=)DUd03q=++)P>P8L!nywS6$Bj zm(l+=`j?@9Y5KRyIE~X$KmDtoL;vgPUyA!_4JnZ``72Zt`#+TH*Zm>Mvhk0vW*wJ z7Mo+2gS*UF@}D=qr?jhUPLJL-cWzRzs7%hmQGC8$I;Ubz0*^r^;^p14Ikg5CN9rT> z&2XLj9s9R2LP$Ppxqn3vi z;$J3KBjl!^odX|F~v{^-zleUGL^&=GIGt3A#G?o~1lxKboC)VC}oXtN8!Q1r>Y z=ly@r7UHepRR(SvN-}J$IlOC)$2NLW^mbT!Ku`DRS$5Y~*HNx|b7XlKpKw?a;uoBTdL3yb^;|FR zNqfUfVtAo!wZ1+*6!ce+&-YjB^YT@hTf{Yx}h2j z%4o~;rC<#0Wt#^t4F#)9Lcwq-xEXr%{e*ns9b!F9Q`qt2n*!?tHG%sh=f5*b`@Q(=>Fn+d z(tyu{2p5O^W7@>T>c&q}zS&JdFYF!Aj;+?T`OENuPq_Es1+_^v)^E&{oW8I7=m{J{ z=j4J~FlhZgJjp0IJ@`oe3HXtt|3R%}qn(d%Ie{S@x!|Odpc`&op14!;#0}?(J3UX_ znR(*Q$rE>8p16zh#9f*v?#euISLccQR-U*U^TgefC+^lfakuA*yDLxJJ$d3b=81bC zPu!+FagXJRdm>NV(|O{a%@g-Rp142ciF-Lu-0OMb{+cK5tvqq>=85}fp16;>*{yqOS}|}>pT^5@ zJiH>U?RdW5%sQh~Kf!0YE591h=FnyWaI_67!>#Ma8%V_l@Oa?f#zp~4=mY+6^p$^% ztHIe>24ph&*Na~%eVpIwMwKYLn^4d`_+4hh6-`3=*hA69VxJF9qn(?+58Q*7a!%Uo zBsdB416zI%g!}_w_M#8^!_j{?z8MH80;Z8Z>JLYIzPa&Dg8XX&LpXA7d~ZR16>wjp z2@0H%KFc0CB&V;NZxk3hC&${eEg!o>{!id0&}IQ}^xrMscTpdE0yB<2^bbdS_PFJP z_@)C>C2(GRuOs1gz#Ksz*oX7uTLjFp0_VlohfRQ10rM1n*xrXPjs15-yIuZJtd&&aRYOtoUj{|?M#`hYzg&GQ(atv%CM^s9jB5jYg5Ykiyq`ANXM zD{xdUZs|K7(M`q&@iX+nd$@7_ zoLl-z0J#*nP4ppsIHR4q@O>ySlG2T@2{e;$4`|2T;m_9tlJkIh--2`Fdki!)?nF8N zkn_?0T5k1wFyw3Q3TT(%N6xQ)?+4~@0_Rn~8E^!C6wtExk@ISQFC+LmV7~I>k<&Nf zo`5zRKXQKQTMEo+0_T-JGK3p|`LmtRW+y4Q@FxN7@q2l^w0D$O`5kp1>J2|~e(5^{ znA-%-D}DQc;~`-FC~(B;R=<-F@CGm+ZRGKKwLjXUY}Wl8gG1)r`2LBII^Y)k)Squ( z;0Ay>Q{V{g#`iJg7Xb6MpZW9s8n}(XYKbR1cCG7qx|N8S@#C#^BUiV!FLldhy9h~40~l8&x>GqdVo3O z?;JN)AN>@54Zld90ZpF^VUB`PTzOm z324802n2+X1Ha-3KCs2r+*X%;v_yQMFOfMviu`X1-=>K`{i|Ifgj_ddtb^`IMH z5DEG&on#mo3?e@fqx4-1%&eWvc-_+XPZZc2!2D?< z$I(30t-r+}|M@PXwEcHA<7Ird`Bfuu{Q`qS=7N(jAF{Or+FkAr-~zjGKC%aH`JnmL z(ZKvz;EZ-96gV%w1>oCj@+hr+cg|;A*V^VybgSnU zU|tnCFTO_bjoxFF*0iTT-yYz*9+Ve4!9HHIX z%cYQ?0n7o1nDM%``$6RQ9AG}4VdC7bQ*J>)oG_DPK+PO$&o1qLuOmmsodSmA+;Fyb zbuMtv1D7h{oL<)prz0Pa1GA*UKOcvJ?>>QHnZQ3*eztsk7x{g~fpcCT9S8jjt47Z6 zLg3zZ;GEYVhoNB}dDJLv#RASb8G3H@wh{T=<>*n`<3Wxy#v@xku0}puLnEh;?CzWO zE;w6#(0qJO!zgVre&oFR5v?b70CRLR$050JJz~*Yv`CX23X$0n_<2mjSnO~co9E}9Ux<+ZsQyh0NaBkx-$?rU2l=d8c`y7xbUnR+6}8RcSYS9D*a4w#t05!%iE(fq7eU~tGB z!`b*~JUSV;8|-{G9L4)%U>+4XGz%WD4L23?KLax+!}DRJk8VdHOgg&XGX|9ROSgnDg@ByBwH1N8qD)9|7i7JD<&-Qh#_0m_4&*e%+CLKAN|71JgeOAI19xV7@*A zj^h13F!u|bSG-hDj{@_A9cOC?Cjj?6Fm-Fp`gLmuMF?I4%!YLw=VuRs>oMQOkDOr- zT-wVyz+5VDM!nhkCH3<=fq6;bh}Es$s9n7e%=nXdyavveUmCX#0A`NBQTe&$_g%=V zfhj+k^LdS1l)m-ATqkgZcH?^h@*e^7xl=eF&#!acb|!FF0P}za=f+3tJ}&|D>gPD0 z*Yy##tKg}lv`+lUd8O}Vgbe}{`#i@P{oGc5l;1OexlQ1__$a>*0dv+c=kv-hT@T&} z%#<&f@w(-A82Mcc%%i7qoY%U1G5F$N9Ho5;KXRk-V|*^{>N~(ZCvb#j?aG#4GF*QH zMn9eN(SNt}-GcOGfjRIDj`OOIDbQaJ%mo7H)&61#xDuGRzRdZ&+83dFK{P-w+F9Y}S`6Khqz97H+ z&IfME#Ut~5QD8<&-`9Y<{!)KFx{vcLFolE|OJ5AZuK+Xu8jkb3uJ|!99|#<^E5>K*ZxxWw z{N^a_Sp3LQxw!SWgCRc|n5zWNE5CFda3e5}UCa5r+B4bHe*-i9TO8-bHv<8sz^u5= zpYIUxoej*b0!L`K^4kRY1HhbfJ?G>3b=rHf&o=?{kidDRZ!7|y0Or{n{P{}3_rAd3 zkU6*XeT7)8M8JKU}-cx&-`8}-b;YZG}_qO@QEeOjA3=zD51oZw)Z#2%Hz+ zAObc3v(u0K`Th>RVqhlU&2co3b!&ga;JXKy1@~~AVgGF9Hww6W1qM{ixs~4rglzl? z=Mpg2_DAKs^j9hglPoLlbAFu#71 z^LfqNsXb5q)hMkEKXUZnjgQ)MH!#Cb`KRw7=-&p+Qv&D3N8|Ksz)X0C^BL*0*|o#K zw?trY$ei2wM)h{G4d<2*T1PqqxKn@apN}YTw*ph}8;&!^bKCl4H}Y{fFy}t&pAT9; zeMVq#$edd~$SxK<$GHT|wLWN`I2O2)=l%2129hpdZWB1Kd^CaYd0-BG!Jm)r<17be zgTN8mt(>WU+yu-|f9KCf_4cm7;E*{tKB~7*f&1V^f4*AaX8wMZ)`uTCuk>At^bG^E z&maBy$i6HBCLwT8bImV3Z_y9TA7Aq4qj}Qqf8rP%GUt|GvRC^9H|1r2zWsq)3{0=U zd8O|Z1Z05u`z!u@WM7J2Mg8JOj@qMJ`d$X#CSY!Po#TxDYg@OV`{Mrq=7>LY9Q}9W zBYO}8ru#2uyl&%f4Eh^@`HR5$wdcuiVE*@4e?CgzdB8j(a9-)_MEYI?rt0thd;{R? z1Lk=P&Mm)BfN$cPqqG;^;(SK=+3X+9v!}hyF*sz7&FgICOymC5Hk@0$6^Qpy;6D9_ zEg#&jQSmZ&JpPxyV~ZE>r4|(x9oZirNcAMKeSDI>{hAy|tgo6zFFhYU9h<6_mrXAk zz-zikPj5~oGU;r(CpUX(?fjD2b@a9W+V`rZXXYY#kfZCUQd=u&k?`i!in)$>QYtSbB95ilse?%C7RR`SH?ZX=Sp!Yx=aJ zBkRKTp^m0lQ>3P9T7Py;Vlb2IhWN9e*rB0R_w2q@mn{z#alDW1z>c@?QLt6=d$GmU zjddOBPPlb0JK@&h#b_>G;qoQh{20oD!4mqAZfOa=(OVZ>d9+MJBU%By@bCOY?v@c3 z9r@YFD{{%RyRGwTA^xo7m1neMTj$iERl8<$bSaELovpFAHr2I+n#0j)MP$(5#_tzc z5$w_ebX}~~R&{1GiO&9kWPd8#IW&;!N@L&miq2ebD$_j}&*av3^3OKUlABm}X39$| zJG+MPE&Wbr**eo*^pSvUXKyYys1FVHrQ_YRA=9d~1%-hkdJ&G6cE+s>7`|b@ie|LW zENUIhrTSARr3O|N;hUy|*iSN}9kJ8Vg<4{5_m(D5OZ1UyTPD2jF0!~FxUK~wzWNMp2Zs5 z!=XA89!XSnF3ELP%$_s5WEN65zoe|ByfcOEyN9}y2&u)6_eHZtLNyE_C%zyAZ)tI& zg>IcTsx^i0t868S?fd1OiFAK|dSEL_w+V?cz;9(@>^ZdZPD4A%zdO}MLPgQK#j+hu zL&AL9SqM8FuSqW1nkurIr2h2Qv=}Rscf0OiogGXjvM_=@@u5DXygt394cr=`w5BMr zY2eGh$YH_orJ&~e+RjKzZBs{Gml)aup!O4*-sRk{a`5Gs;`eR{eJAPvUN1H z#RDd+*!nQLl}y1hB8d0(r4#X7Izz03@l+;QTwJ@AS*0}c*)rk?Rs>5*@O^UZpusmw zI^S9uw$JqMsF44Dg{y0o%o4Rh2n6uBx(3 z(X^@BTYNSgxr9zsq6offZjTGhohz=T4&4)`~o z49+C8gZSQRQtwK4uV*1s5t2g^jgSO(>c&ddgu>AuefsG)S?sx9?EnbIe)8$3*MbRO zY-OKoWuGJMO~$*iU{#3l83_Lt6tE>~67f<}8%YHswl;?SVsb-S28}|FDxg?#?Z`44 zgXk*7`v=rwIZ3-1Gz+&To%`Oo>OwpN@! zA zyu3p3PosxF;7&!}>AXywmx}aO+s=o@`6husOPoI}&aV;YSBUt2B+e!O&&9dq|F!LW zf#_pj7y2=AF7>;`xzs<=c7C@w|Ax??Cc3ZGFB9idzuILIp`ShZd+yaeR@G*W*4i*`WsbByWUIHx--UH^awonC`0Kfr8;x@NqnRBK!{c zpM$>?{+Hn|gMT6X17LhQ9)SANu`1DZr1@J!y{}T8&!@rc|C_ChB_yG7@;b z4gBxH{}%j*;9m#-G5FWRe;Pi@VE9$|H^YA${w?r#8-s_8;gjvZ6~294r3UGE7G*+~ znw))IWg)`9qPefDw8K)i3;XN4u)_DF#s<$@wCwwVGndZA`*dtd*RAaV@n1wl*`Y)tne0w>V`X$g z;TuBQ8_yzcK7kQYi75;X=zkTI_}F)Wg<_-nFMz zPzW(|SK|L~`5~!vLS+=nLJt2r_Jr=iREg3!DClU?!c$Je0u7~0IDsaI+7rdO9NNwj z=W?hbi%#wlB!l$trXCQQRr^pC)&2cUlm|8V3C=@^~||4H~A@P7q= z8T_Z<_riY$K0UyMZZS;XW_%7ljae8EhsPt`zk^Tx?M3+Zu>j*6`zR~2#vF|WlW;`m zZ{s%wJe{^aOge-~;dc>gh&%s2+>jhdX5zVIGiJ&un%39IsUux!^hy%d$N0srF3`@X zL+^q%cO{N#PMRr!C74(^4h@34)snC+gY6X7u?aKHkH-R$OZE>k?T@8)DQiYlndGk9 zoj02zc4nT3#QDDfq-M8FoPP_=j5ib3PTGW+JSv+a6dpaWR7V21Kcd_zs@LEb!G9h8 zO!#lWUj!d@Jxm;L!KX4sxjX9VJjg5XvyRy_H1l4_qo}6~tpjDU7u!X2<2HOTwqoaH zFYbplvWuM&25;vRD-E`XX&PJ}rZE?ea8HD9tbLg^QMS?h|1x34rP^mUX(hbx(L=?{ zZGDg0!3_MUon5?{eNU->Hjq+_l1^Fx^lj1atXKG(SRbShGx0%_F5Qi*Ke}#~mxN** zqV6(JP*ZoI^Tpy^TIuEDd_1}+h10`<_3%F5wd~g zv%W&YchQ%~HpA`>Q-6FP{u1~fz^5|&Cw#k2>_z9L4;t=)aB}wf@i)+UAGY4=^6qOj zSfLo9r-}QI|BLqz*^QX3xcgcWEG>0jVC4O1T}2RA7r(Gpq`!UIQJHiz*|hQM&EU^K zWfqr}?x@drHkHt`xeOk~3vS++{TZy!k{$KAJ=JIF{2leVUDaphj{4lL>T}+X`rNMS zbMB7%+^*_#&W`%ruIjU5M}2Nr^;y27KDVp-EZb3^+f{w;SRd-zuIjTydwj?G?e??Y zH-ATUZcp8_az}M;Pt`eZM|Eyb)j4-Zb#719IcG<8Zco)&v7OLtV~_EeqX`Pp6Yj@nY&^Rx79C%u2t3jeY#dw!N417uIn(lesc`9D4T7#=*| z3s8FDgP!1ac^{VEL~(l`c9M|W-iM{`2)|!Y6}aEw_Nz!oP<6FPw>*4 z9OAu^EPMC!JP7H%6!|DGJvhc*lf6|0sL|>}xt>b)#w|VWONtauFX-|R>x(3-QTi_< zF>v%+@E{Zl4#aD~=`4GAmmc{2IuF(!0}-9yCC=q*8ZX+;=_|72#({_M*NF3-#rY%R z{B*(hyf~M9f3cmf$4e1bzU#%g~rBbm*F!-1Ca5}7w0m*i0yoZ?L1{W zUvE4AitYSvaW2d28C&>Ew)3f?RZ9FkaW2zWXFFeFJO7F}m*st@IG6eVy*QWof77P_ zsqOq=dNLbM^0kR`$@e*NF3bBSTliDrT*mh&aW3=oj_tevO^}=n-`#e8kU0OMXfH?F z&b!6Ae9b6h3;(J(m-)F{oXhp6&eKw)64g?G>5-y=>>xZ0ECW=T)}zdfR!s?ff{) zx#fKw`nbPzG#(V8nZht?9}D59cqf3y2ra z?~o0zgOANihQ}elv*6SCHyghF-3NN-1n;YPzGu{h@LQ~}^eFE>%W|FTPKP2mEidrq=O*|7S48#hAXZckix1S-0Ef zFH}D>5WWliU8vDAH`2RzN-o*lh3Z&3G%4X|vO#a$1u)Q4!6AxC=S6`%>$ z$pn3CqZ?XBVW=de@=ob#pb#(j(5phn1DAtHyjM#-lSXsOHo3WCw5{W(#`hzZi1Q;w z__5-AjyPW@&ad2?&koKO=idzY$Yv4ZwzZU+> z@Wb%mf?p4x;%|WeA^Zq@dtY9S^fV%jYLFbg$7FqHuocsr`>egg(w948^_8*ovQ&3+ zgl@bIUKF%_d~x&M-+9oQ0bBR}|0NT67je7D272(@XlECq-8I|n7PUp{2kr33z;JNq zZ@0|qVMHR7v1bZtT} z%+uFY@NPSMvHdNalYyd7JSXs;a*o-jG7-7_{tJD+gxq)b<@Sa&$UQ7(lVtVCEfn_Y zoBY(kQ}-n&@tAHfC-G$B$;sCz%f-2TT@qcMIr+NeskZYoE$4>4l17p=sZPjVQ4#eq zDtwm(c7)!SY=*x8ehd87@KJBWWKd)9&xeoq(1$m|$2U{hcUD%y$9zaT2L8VAJK@u2 zX~)8+IzJA+-99BC-%|TTmMNB|7P8s)DR29-^>4Ic`r+5H|9{EE2=?j!n{4>lCu)mi zpXggayXI-1%zSU9eWK~rS~O_(RWY(p;!`2?RWWIw2J^O0^7~uTKFN=8$gVHHk97vJ zOD-tv)Ajt+_-Kcm4@vw#MYzO|K~a%AQhYrDml@2xFYF(tFwDuTy*0M;VavIzeWE(C z+ow3}2-zoGhcNpD46{$Y@Xv)j1^;6BC%}II{s4S@4?`P-|8Mvi_>;k#g-_pq!jcmE z{?ibAyL}2GJO~|>JaaUEIs|7s;p}bvUcyTO&P*E@=HTfG8};uPb?iLeLu>v6IXhrkxl#|poY=luj* zb7q4_5FFA;d&9r7LzCNkFedoiKd>&lPZS9P84VpYEtbpfR@h|-7ZX&1(O0Nw6r$yS zD~vuza~n_BM8N(4*bq)r3a9~+Uzwm606Gz;3AWBpmRMhNr*Xl0osErYhN&Lb!>@vW5`4wifCK7 zR&S0phhr<+!bV7e458g!Xa^sBM2zcMzZ)J9?R76@^uwKg*#)t@7Vv*Pilt_KJJ={_o#$_B2-^m(oBx|go zY;9)AqDrBd#&L07Yi$RUQ>Bo6yeijO9aEuF-~?M>eS4^ZY3~ofZU@sIv&);Cs02t& zSIFl=KcKaR+M{8;Hq_FJ-GNYiE5odyC=ff3vcUTGNVui0X$7l*AMJ-iLBsuYx0W<3 zB|;VmBnqgboywx4y@?eoM^6H}IljIti7$8UT*zfw;M3h!B(ny^XhG55+8Q&GNmWMt zV?>}4P>6sZBPFQ$bSOc4)3M?u?9Kvm#*4mKKatU83No0iyMaef= zgriS~U{a_-FGL?kbBT87VmCkSU`W3NvViEgp;$*$uScIn4{r}gTRYm(7sx<-1l94{ zl8$iu3Oy1$np#73)O(HO?qr3bVJo1+1=r42kiu2l+T7OKf}}@r&BhC0tQ9PB zhm>28GX-*-6={jv0+ppY-U{uA5?=@{p{};IZG|>X@J+CSq99~NkCKkYG+8XWSTS;x z2rUgonnE>AVeK$MwW}4zqLSl=i9J+cce7$y=|oqcyS0Vec{3{(IBC*Zl_GU2O6IiC z!Pe1c)Y?IUYIiFLR2GQj*~1FK&=za0ZEdP;3PqzB6sUhvE85cvVm5->*enscmo*ff zF;X81*E!2fR{Y*pIFE_9ZKK1&VDZv}C1!iOw+!V{5yP_@WqI^ybhaIxEv; zaZj--Q^`P=64e-jS%$@+0qkDZJ)8lXo8oCS zfYUvJV%jAcXLtfpGRP%sw5j#%?SxMWUOzpoT|VBJ~)(8#J=s6h7Jrhe^RG ziB>|>cQyx(GJ|?1E;<8R1V*L3B^=YEG*b!d^|3ZqmBcZ|v=W87oolBq(uZ6N<9A4x#rn(6U8gq>41K?xSPkikS)<2nf5E1KSjC z2w@bUIU5;xx*{aYMc};+aD6LgzdCBXT}Sg`7tI|}R%nFV$H3w8jOx>9e^ZPQnY38A zi8_~T8Ag`(HIVh;FcK`g?S6*5h8jPn+ie|89pgciX)iLBEKCmS!?7oECPbA^Xo(yXI7?kQUB*$2zCv7Cr)Q*N@Z0BNZ z3c;ht8U`{DYwy771E1aT>mpW{Y*LS96x66Nf<%ZED}?eAl$%#T_G+^5kPcIuAJ$`{k2<9FBGMnr3lA*@sjR`pHnRwypsV1%Y9>X^4ATQ#!i$v} zT&jVe#vH-~R7|KN*4RoH{H%frFiHhbPsX5(&L2VFm{@oTmL#}a-H}aZLaVS#jiI}% zsw)zJ`Fo7DPNJWzLTKP)BXiJ5TO+M3)wS@3PGX)SCXTc%t$R2tud)c1u=|5Q3kZ7p>}3lBDE|ROTmEWak~4G z(cYmP_DdbWrUE+`KFy1#y@|~fFkWLe9FDQYkVjY%Esg1sGIkX}=VLXT*P#4asz@@9 zBvhHqEYs4|1CXM{a7wgyV^x3}8U>=Mn1PLpo0?g95?L{kVGfN!ie!mu{Xq-+tS z4i%tS2_^wS=`v`MtFeU}0YOS**fE=y6`9)Q zK+(b*OZj+!zKloaqb)Tox!ssJq3R-`7Id!$ma$)hgF1Dny*;#|hQ=U9O*Ei3m?(*~ z;3}6}SzNz^fYQw3qN3YHXf4O3Po$;3l|@>^Q%UQ$(O3h^JT)Su!^kT=h|+|s9Gd8{ z=r7co$E+MQ}kr4ac)l89uv$X>)<0J*IpxRaK#(Tsk85wrXUboyRyow(vEi(xE3d z9FDRt)OO@jeOXq1xQVP$npwK1KzRetc4%<0FO`VX=2o%wgGrd7v4stk``UO8&*xzK z3KH|oQ_Cnpeo$GpA=Y^aeG!P-B6ZEth?oNCSflO;vsfpKSaoW#RBP0E$^KHOZVT0w zWASoqA?+H{)V8!0MK%kkdm;K_J?mEf#d>mGE)%a|8*G%$WpPmb8I@NI{nv3>BGqfL zQCJ^#MQiOk0Z+0v@eO-fy@h2)YUzrfF)fm!x|$}8CTL^0uA)tT`;w`Fo;1C@F_g%$ zBvTuRVkKFpHGAG9uxETdTe+S9!6pD|Lmf4&g;9T_z9YNb`v9~f)p!7=s!9*ZeS~rC zmQ5~TLfTH4A6dUAvtVc-n_4xH>@LdorZc%C7?d8O(orUb8=_Msi1}B2iR_xr-0w zMW{!x{~T=z%}5t&y`#n!PVvpK9?K+?`arsy*R~$Rcj{$rvPAwzOXR;$@jMFJbo;;2 zo*hko`|V9fl%Pw&e6(OI#)aAmXlZkHw6vM)|OUu*g`g~xeX&DH=^`9 zN<4)faG1^0#m1K>!O)&7+oL%G{pU>@hM9SY`*b{XXNinnnZVP>3uv(97Rfqn(lL!s zK`5@?0!8$~2u6~gJ~nAM1d|>Xwb(fvE~-#I1mQn2lHGv~V`z-loew$w%n z6RBjp-!>m{){8m2CN8GDu#s|RN4*dzwGqQ@5A zB?o0&U{zHn*_9gT7UTE+fIft!64q<o>?i|t+A$=+H90BeGY|XlD|c6sZz5LWQ9^| zd|tLj63SH&2Ee-g*g{%Nqae&fg-M0%>Qoj?pS!=rZCvba@*);j&4WV&i5%16OL*P#!hL9< zJDKU}ORp8T18bo8hE$Xb2fUHGENC1-H|uQw7P7mIz48_weqM zhYgC=P`rB!6qU8do41JI|FQQbfKe3b`*4LLgbA1c(ZxF=DvHRdLO=+|C;LLj)1;Lep!9hju9-ZA3Mw@*EH6DL8w!*-l2@q_c;rsOgnv4cU8#vHvoS~|Wl{kqiescprA7u6W@pcI zrK7^a{MxV^wPu%K%u2RFJL$wmy>@)wxt{yAv zarOy_3T{HqF;o%u@QDD8tQvb-fcm}`^tFfV>iQhcj)AkSeP1IA%$|XM@~T2`YIGJk zqu&hoOqB-L&;P>%4c7;z6u8nja0perx(d>Bovj#)xYSz5i9x9`{z(^9cLu8$L67m3 z_RYF6B3HEWgv$| z7F)ySlhV^BWXW`{P72e7`sL(1EaS7xm}dsamG^))(9G;!Ng(DWvJangRT$^akn}m+T+PPW?Y3)1@-XS zz`*L5_}O%NV8YQPj*zazzddmEFLs^zU)UL}219nc0%W%<&uvX|JE38o&@kNxo%&Td_FN5qY8`vi=>BSXLse1!v*80tX$-2b2O^?%^{I6b}6XWe6;s zZf8QR-R9b(TLYzEjXD-oJT86UhUTpG%rSc~tBP&PA@jE1B;%j9d?SfhSb zWh`hgU<^u7Z=X0mF-zL7yEHKIDhSu0$NzI3QtC_O%a-<6AxwZs!R)+={2GhTq5px_ zmM%>JUCn_>Qe$z`27C>zK~T0XeP?CjeqqOj zJtM%^Q*hj0WsuuA+xT}o8&#ZOB$E*0{gTf$DZTPZ2!BXkLx8w2&s4j*bfM*rseyJ% z%NU4Chd%Vi&Rk(F<_8WI@uf~+Qr4yvau~_GcDw|Rnot}PagUvkbP#nfM9tyUUI)6@ zTUO{fXgos+n}W|mEZ{oNV7}Qz7)|2)71@#TTalEL?sDBx=!YbC`wSzg;o zGfF@j2NiRKq=BAjM%SV*(usmeWt{l(yWP6ea+kw(jz8`vKKCnZ|XtU7TI^x~yy&mXROiX5)Og8Le^R5wCy8}}iMKTuI;?gX< zEL}%gzP1V%cw&WWiH#FY7eCn_D3fbbeu8!3|Msqwvy)<(4`Gf37k~X02dv?vczbAReUxvB{K`l@rbyaUGXvG z7p4ev1gVy!Q0)TZzZ%INTmo&eoCL?3RGNK`-!VIbTnjg6+H$v^0Sq4QbSm85WV_7@ z0Pd%2-Il}S9<*NtgY&9f*r;EiqHj+?2o!6zQS*nx$7}u|$ILk6QE)Ww4|6nN>@m9< zzOX-6>V&Ze{?$RzW*feNt$j?Wa&aPQ!#6Y|FNb4cPBbI%6)|9dy67ETKNg>H%@VR) z2Dho^u*twE>AvJ{ATWdFiDhwEiUjT_1&SL=VMT7e5f!aYMNcP|jKy-(Nn(|Y%EFwz zt}Mep5)HAoE-scjAiW?pKQj*#S^}0U?b2DaE_RxtLpCQD>kY6u&UI{^W)WNJHr&l& zNJ4+EPfG)(cwt#mo{MY?0~>k)T3O7M;cEm6fsqwxX{Vuf!dm6F85r(wIwXN^^6mlT z`z#EunI@~3X26HIk0Awl8i6 z48v9yPKhE0Nk@@bXbKZQA;J;&6q4L74NvuUNZcDOV3i`rsI`F`?3x8W(m*uU>UakUWdm(PxFyf5<#w|wF%4zlUfumstB ziW#A2jTzx`k;fJ-&^!)|mg=g_O;lCaW#2RIU0#lx5w6fZ8qmezqia2*Qu zbc9oCZ9Le4g5HuLm^6IXQIf%az+D`(GMCSlm%SApaC-yaE>71-3^F%kiS;28Lzi2Q z^i7TvXYN7{arI|7sVy_vud+>Wiv-Ef>@o{QjOo>WWu@hTnOO8LKQ&{fuOLY;Uu=yL z+f6(fpgrMQ-m-@EaLK|DFZO!WE(tM5c+ACX4N0i%#o&e-(%;JdJ++Hw?P|r5+|ee~ z{p>ZO{Q}HZ$r!k9Eq2Uhuw_8?Y4Q>^FK*mjVvu>R5M7Iuac+6J;gV(jU1fRyR0mM+ zlPHljpvK6$Oavv@)keabrL`IES(@uVBrZX=6=Uhn2G_qYZk>|U2!)!?dfh7g{q3^S zUy2SzgRF4K4VLv9+4ch2%m%b=wp2;r>i%5H1geZm@GlU04<>B4!9ZQ-3#cqW&gA2Q z;t0G+7rmzV#dva7Eu*=c6#d&IqvmF1F`qKPef8^zD4-yUWLgKTh%GXXi_XJ;YZZ7A zS*t<0hG4~WZq_)$c@=hs;Ap7#E6~9O5ha;w2lvWKO3%weTeYBnZvMcu{GnLRB|kHD zfXp%|kkXh%*OCK$X$Q;iROBo1hB5ajUNCNW`qV~xM3!(8T?V#8kPnhVL}-mE3hxT`2S#43e&LjPnD;!NM(QWQ;6 zN@Pe83oa|ZLe@nx23O*D`4-}rt_(>pSPV=uO6TyJ%0=fMQqJZvOTdK@8Tq->p~in5-TIdLKi zRtqq&rBEiUjngEzE~877&O#VfQX_oxwOH4;agCYA>Cu^!}DkZUXJ>8!!3kbwng$fFE2%6%cI~nV7qaRH^UM2P%J7 zdxMF}iWouEbulYes+Y_kdOHn~w^bD$@)hghYh;ilcfO9ZHW%rin>!^leYi{`WWGqm zGriS^s6xyoa>V>DyR0zpQC>0vL^Lp2#6_csFtV94keZUH4Usn}0fuv{a&CUD+n8dT zdvMXV*+xrB0OJqE$=3O)PL^9@r2i0S-=WC~uB(!U;TM~u_IIKsXgkUG=gujpqxubz zfU{bG02nAYOm<0iE;jyy?P747mqqAj`=P&gl3v`ag<<1HE%dI4%2`7El|#jcJiNEa zHbw#)A}}fsTEamX8(^v=*|kTiBq`1?Y8v})MD~ybk#%&2dT#%|TFJeKzV)BxX5+xl z$T}>Q2;?pjVAhTyFhn5OZc9DE5G>7)Cu48`?loV9mn3-p;Q<= zhzz-Yjd#fv%Tm4^+W+JZJEnXN?n>c3&pi3bHOY&T4sD3Lw)Mk_Un+I8@IMqaYjCJl z;g|QV8@N7qPosRL)(c;}ZRShiEj#?YFM8=`8H4Veh7Hsj(EUlPCxj(0KIgtBj|_UX zeA2|L@TS5KbZ;LOdFDH(WNdseuI0`7wi20v1f46Py?v9tA+vn}!e^Y9(@E=Sa*!rBszdn0o^mFG#?>YTJr98s- z*}UTU6{?`aFyY_{odMUASd-pPt(`eCPS$%QKL;MZ%v{_W0fR7qnjcVahAdN5&L( zQ0i6TpE>g6C;!S=dF6mcZ$5ov_%!%gF8pH~3irKs_4)k{UE2AAl*b#OJG@sY{cU>9 zM=$LdT0US<_cOo!a$x*crDh4=@7fPjH;>(%b#&;pCl_~nZ>>@<3%_p96{A;tcX!&t zyVL)@GiCILN*xvcgSYRzz0cD3=iRxq>zf^SZ|sQ%T@$+heX}2igtdI+iiFGNJaw$W zER^rR3O_b!%B`7ccNbmWaZy@mr`5BR+AjRNzdhLbflI#|p5eN_w0DEM_h4JjFuJq$ z`){}94v3qc-8|&;K0h^1g(4@s_rl*!Iy~}`^A1dYV%z)chW(<{J;D##5jAP<><3SK z@8cVPZ8Pufr;&ezUwZzI&(8dC;iA6(e7@6fPw%@6TZAI6BSTi6(y4pss4tg2G10sI zi~%bjL->X7I_8pgX%B2&e)q30{A1O}pSFYh!tefPm+zMxedLq&`KLUVH2cs>r9Kk= zxi7lx>iE%DVz+YNi)dA{4oS^Jc_R``Jnf7{b+ z|5YvL75>)a_Vi|pmAY5>Q^zfz{>9g~ZF-^AS-;I{xn(uNFZ}hBW`(H8j1QZgxA5Xp@jMXvoc<#4}D_{asP$G7_G z+4*>{GT|Q$yLsE65fFZ_h1A$BUcO{l{K9qx6OICJcVG>1n5pzh)W2pDp|w ziKjh(%ZHz>TmM+`s)<+MIYX%@g`c%1d&W~s#+HA$XvtacyfyAUrM?z^dqnQ?*NcBX z^2swF#wT1c|2MdQ65W3;Gbf~b%+x2^Y>4>y{E->`5q{y7mxgX z>=vc|F8oKYHtZDfLHIv*PHX;N_kHarDD{Q#<4#XhYSHicUGKYT#OZ67KCaYx5p;iU zlf9wiLb_db$IYMj?*Ev|#Mces|N3y=^S!pd&}eu6^A_4Wa!9v1%AXFG1a?x%L8 zpReAqba9i%la%^Y_?dC-?(;6`eEnU6XXUk9wG0*8IjBz}Lq>GI_xH{39l9;$#fK-K z99eL)Qsaa#o3d`)n3VILytmC?&dUCE`MXNpFMQ|rE6mo>cj^)3a+qLF7?Lxx6%oc7Vs@Qd1h`1@(YHh%8z^9kheNa6P$iTUXA zu2^I3jF%3CzS{lwF5W?j#m^&u z3V&nsdt>4rU-;Ki|89Qw`WBnvewpw$ZQC?u_oJt@Oqy}tFE@AChp*=CThaX$TQ0og z@Wbl#cUtr~Z%y|7h|4L$-*sryfV{VIx-YoktV?D-x#1}Cr|`2kOxwQs*;gL?+lKs? z?r(k0c(^b8GfO`@>D94w`?vgP;jtTYc6;G|6x|PbKJnM|Z+|IGdu7H`L)yoE4)=wh z(e>=;;-j-B_Wa;z;ScZ3>ZKIFr$>gYdcM;$&ZVzi`N;b7=G>-Ykxvc?e@T-oI`nKl zsN05%Vh^{y8p`Aaj)L4REF?pH+t=YPcMmYcu{8d z-pBv)!*fb46aHA6uU;DT)z(w`Zn^QtNju%ID)p7{AAB{;-Jo>mGdq5q95VBPe<3^< zA`K!#Hb0)(_rAzUM+cAmI=v|M%e@G{@Y@QO=6};*>C@e^ceEP!{gPOvmJ8o*U;Ox4 zZ*>frbz$P6aofTmd&-1QUHae)qi3x{_u^k?o}GTy9F#9;wvi$49iHu3Gx4I1A3pK& znLQr48u@&R@RR@c*s32gv%a3tV&LJdVXg0i`@&C1d2&i2^gLi!v+hEVTr*%txddFd<&TmckODFwx?ZmkkC4TebZfDZ`hdxC45`Ng!F*hAv zn{;~Dx35~AR^GgaQV$8A)a=3T<42$W?-q^!+49Ayi&rVNNB9ntp4q)Fd}E8*k%Nx) z?$C249-H*H}%Et{aO?>=)UjQc}gu5 z{$TeNJ0I%hNZQ`>jDkL+&qmz8FZ}(*zrB#~+w7G)dZmteHRNCk+(sUa4B7V4C8PS@ zwYtd-S8d2^aMiYNp`Qr+PCAD8}|P#qS^VUu9~dWeBpb~jlHGy1t*0qAM(NQ zZ*TN|r_@&ANA)jC>alRbX}A0mzF^UFH}{6ys8b_DexG{7x1&CI^!m9SbMG71e*4pC z_Xw{Z$^XluMgzaP?x(x*u9|i7BhY_@AKzj3b7M1S9@*LK=HEYlxAZO4FTy|AsN=&M zy+8K+SF7$V-X5B`67?@+M`TFKq}RWVyZynVC;hmj!|ZQQ?+ATc`1v<|F!In%TmN;# z7t1HNJAHO1#EvQ49OE>Jf=I1FX4ZgY% z@&RqM$dIAy?|tFxXVm`h8jLx+xUsW6I#h*kQP_6Jv6pv@?fL2_PrZ9jJ=<-uvM*Ijr_?*ApdO?>aiSMt-yz{kxL?9j(2!Bt`{KqG^{&?}de@ok(_{E{Y zO1&rivNv)sd#>Q2w}&_VX2;%z7w^K}>1WgZI}#?Wd1me6aqk?9{9BXur%Xlq3O{zC zx9GOUXZm|7^4E{cR?cd5 z)|g3S-&}=yDl(exci*$_^~+W0n|%&1%lNu@7UWW*@N?pCezDnU+s`>`*$ab*oPYa0 zNby#)mrIa8n!TTo;`~_wT;_ zq@2$dcN?`Q|f-Z1*LGWXw=Le^EcoQt2-m@#?zxs&o!vZJ{` zTfvy@%+&ncg4~Jj=z_E<1!K^0ihYa=#!S2HlFnl?b5gSk)6z*6q+-p0OET(azaTF? z6}|rG=Pq!iq`9kiW?E)JVM{eqWd=490^Ak*FGLo2A> z|Ei-QCpCX&UVTDefRB{vb@e?zFEuAEzdp7LGV|(c9XUW|?$y=4e-2S}$8JG&M|sM;bt zLra3X72v}Btn8ZNt$N?H)3fmnv2MPj2v#3))q0(iKE2M~rlr*nR&(16ugC$-ksxF!+TA8`2?)qdv`wi+5hcaNjdizzs0+KK@t%et< z+BRj&v>GIG)wUtbvB`-lyK#|n@(pDFF)w(bPa~&ub>h6FZ#ZqVckm_j@YDj=; z-@s}s)j0rKtW}=~Rp$WYAFNPRSKIDsn5kY@%TP>fs7yXwU@eAxQHIGV)SVr*yAt*s}{}WY<}Wr%o!&tWP_t08_*38gN8< zJro!#+Pc-%_pIyEXXIgXgSy&JOG~eNv@_OC>-o>9|EldPslb)*@?aZ`I*VVtSX$bY8s&GjFM#@U;`FpSMt)vuO2N#W z`Y2^N1vNBQs|`F>eW_O$U8>9^sN2gIWTa}Bz9e`vbLzH2fEr&V+Dpf=hGQzDplLc zsXD1A)b~q-dlzOPEi1k{8ziQ7dy{&Wgsa|cmQAT88%1bpbU#)#@ zy&eH5n4X94Y3_-2{}z^=T`;r2UH8sMq(aTzZ&fD(tV8*(p{ZDH99j!TR+k1IY+hxZe=6}`MeyVP3*V#V1z4L2G{HhZVc?Vf%dVOly znOI1pK3YCId1`DrR-62&EL|z}Q+7@NfnpuGF zF$KAW`Kh?g$;E6B%-g6>!px98gzB6zb>Cn0FIIKNM4vLg)YbVbJCZT4e)VEboy(Np zcXhmd+Yz0j+on&*i@pMv%)DsccZ+TxJx&PlB=k*zzUhvqFg!$_T#`Crc*?Z&w50S& z1<@VICkRhNc$ScY@h1hep#D=H@oi>E7`k*vh!FJu2VP&+$?{t5!&o2;*HKMW6h{BN z4iv6hTgai7hG7JeaDTUuLv?dt)TD6TE#y!eF_LMyaBo}4p{~UU+$V(_XCa3=gi*6k z33tRo4pkJX6b7il-?99mt$e~U*9LEImsYA6l99P@dTu;OG zG2CFo4Kp0qG}3;!3^&DaxrV#ma5oyxW4JpEcfa8l8}13iJ#DyEhI`F$ZyWAi!|gQO z9>X0p+&6~%)o{lQ7mg97R{U8A@n^WR4cFdq9SzshaD5Cn*l@!PH`;J6!*S%R_BYpX z*BkCe!!0!2y@uD*ld1hU)j|%Hj&YRQT&9H_>QTczZnzbOd&O`Y4EL7d zJ~Z4XhWo;BUm5O4!~J47F5aTU;;@iIaS;~Hoo2Z64R?{@E;C$=;jT2?Aj4g4xN8lU zXE?Xv24Z~Xmx#3{YN3U~)x8#Ss8$$VSthZ|?PZ7@DjtY7!d0S$9BQoLQVf@ExT%J_ z!Ekd7cdy|dFx+9FuO(E`(RwUoxN2)5hk6m{8$1nHFI&i=5-^VPuyC9}N#szGZL}-l zD#}6*H4cblE5p?U3pvzsW9}Jaj_WWm1mTKHG!Qw|7Q<~d+%CiIHC&nD4jZoAa9D!C zaxcn4s7VYr2Ixol)rv4tG!@0Ws*_jt@g4pn$LDB)&W$f2A)lxiScoP|)5dtxS>aHm?xq4xDs zs*!N}E#y$o_g1R0a4%WNp>B#*Dpa_eE#y#%{SdRlC0od$q6g^Ne8^!Ia;R^dm|-U7 zzO#@+y?Pb$fN-x{$f3M(NFU)ASjeHq3|6X{aN{k6+!?P^HC&CbkV8EHq|O*PyNhMQwJui+LL?m@#XHQbYid)9Dk47bj3?-=eq z!|gWQr-nOZxFd%9&2S+}CjKmh_%qy@hC9b_9Sqmma90=(YY|F4gZkWXiG~|%xD>-> z8*ZxMZZO;&!+8z2z;F*5ZmHp(G~Ba>TVuF&hI_|w?-_2l;XXCoA;TRp+;4^p8E(IC za|?K*J3&+{h7_RStRIM9l*lERz2=3pvzf$yg^qxEKpTFS%OV zfL>xDhZ+f_?T)dKL%nRwtuf|y8g7r_4jS$o!~JTwV}=XA#`ZVDLTEV{?rg)gH(W=< z^)y@`!wojvFvE>DoXc=i43}%T>kW6K;T9V1UckVA!!w%v=ckV9P$MBl>IjTUk!kKyhx-2H}IY`7;3 z_q5?w8SXX1y=}O64Y$*9dklBbaNij2SHm4MT=*C}%n=qssv7QW!?ibDN5c&;+(5&v z2f7w<&_sO?lp?Wl)I!j`$0{{ixR))29*1#CjS;TMLJpPT(yoN7EDNE>0Z6;|w1p7T z@wU0MErgc8;W`?wr{Ve-Zm{8o8E&-UT!x!sxLm_sZ@3!`=P}$JhP&Tziw*aL;hr|! zD#N{IxVH`WuHp6>ZolEuQj|(V{Gkm7lp!&BuZ0|H_XNz^6z)?CIn>2zSUpv^P8M>g zCF$CgaP^3V9BMz1cCXArXfI5(&0T0AhZJ=fI#dqzNWeD^tDZM2X7VkJHUdA9k|p`Zb2ry-D9G$H*j``v=nzr&uA{} zdPN(bUD#7?ddj3h`%$gku>Im1MKRGSd3jlxSj-PTcEtGgbaw|m=vRUzVb$T)_YAjn zgy9-0OR+QnYJ`(aB+h7@eQ@#!!CBe!Snx$St2EFF&th>FVaXRdauQB*IQ-qDfByG& z7-GQ};f%(~!#0!bDVuyOgG|~|{wB;RJBqLi?)qk_^KgRK`F+~Md{lhH8Oq(%<2+*{ z@02ILS>k?z;`NOpR%|VKzpzP{wFlZZR%&vu$;w+Y;|OK#*+pr>X5g10^p-UG6>Le7uybwJOQ#bjBLrdWDMX-sNE0P%B{28k zO*S~6K<*bW=y8%ZP`o}2W3Rr zd+)Vh7=AVI`fd@5J{w9xtWbpbJ*g>Bv~%EF6bG+!tDRLE!BRtS{8mIo7(7gpmqv1d zZp45^Pex?&iAe|(E-R>$5d;O7#b(3`g{WJu4a1GbxJmRTZ%y(zqmXSP6FtezY(JtR zR;*8(RX8O62nvSTgc?uTMU2 za2|xXSsjbV8=YnNRV)dkQBuTlT@u#n9BaueL}vVIB(58Vk|sCyIKxb$y4%6M5Q%Ru zA17*y65nN>k`|dE0b6-zqSs^O3PI!ufq7FJV=KJ63 zB|9(vD;WO@#)lQ(&`i1Gyw0_F%kFq&*Op1sLVhkTYiB~^ zr)+F=GMig9w=HM!=8ScZvl#^DRvlDU6@CHOA_3SU$!Qyr&{R>}DuicFSzFYSl?BP` zorQRovSbw>ZwVPDnMqqeL!uP9p$O!{kWUdXj@&8_4r~tP8%5!b<{MWKd{pxD^&4t; zI&Ub+p*#A`tVecM@P+JFF?GOAN8?*tQKSn4Vo3te%yuwb7d0Wg-tlmmu_(8tqN{lp zQOhb_lz?B@Xy_>+LRMzM5_9uPvH|Iuc0fo-TCydZBj#R;iampg=uMt)=@ccgcxH(h zN|KTxaMR=EZ>g739j-O<=(@&R5*=iCfEea)sW(;|ZtPh^lw{tO4tTw^soz}(kKXEg z9U$LJ6t9g=@Rle%wiOT*&tBpYe@ngHwMU_zMMTzn`0T^--roZ(cN5F}E%kQNmYaAM z5!sQjmKJnyBoZzb8~iO5Ev_b(jHO!3!+qxXgq7u;mwK)Km!!h-6pnvy~* z2L_?Edz_Ide$V*(&>Z*L8STU14JG3&AKWPmurgyWJn*YtOPV1L zJd5~SDmpN{ImuHJhIEGOkm2veFn>$Ehqd7ro<&43ygJBm znHc78sdv9N+|sj%2!Q)HGU3eLf{FavN z(61Qf@e)B@8xv%Bn;7PAX~|Y?_+*cl2twVL2cn=1nfF7|;eF|?6(1#|fkQyoHGk87 zfEH4jT3bnd`wXJVs&9SDELGPugiQy|s&6O9PL4KpJ<5X5fIpU2T*TbDaCUM7YJmR6 z2EfTgf6B8-(y6p$Jf3(K@fVq>nUKY6c&pr(=th~(9gmnsO4}x@49r0&LfSD?SNl2R z*9fpw{|fO_T-M7dBl~^vv(dSd*$a;A7(yoOh&YSiC;_LgZz9TyJWu?};>{tY@hhPY z9r%)w!#|{$N(DBQXs`TCCEQ3JaWD;MrzWB1z_|=}| z)pm2ek=MD&_m<}Mkb@!iExW<0-~M2o^gk5ed+hlBqvQN$ILzqO`E|X-aq`;Ivc#(6S=w$Xm!X+R!}bP9452Vh1g`om5HxhS;)=lsfl$ z;`f=-(|UvRZKI@HuH5Q;`{0cmoqJ(R9c=1J-dp@SS~q)*wI0sB1#uqdUIf;1Xrd=< zVrl%Yh?kOg75@@Ft7XJX&RxYv+qj!XycEBy_~#pE!<)A%dh^!7)(4jyI1R$amJ(J7 zo(b`nsE`rR>t(=eD3;e$Y8}o{>04&MO_Ums`?WZuS!E6^%IeSqEtic*O{p9snU+9v2h!#x7@ir9D(NZWYX zJlzVUZG2|X$q*ZNiH$RXw99RQUKXwskaneyc{&P6yOM6ubb~xV6m(JQA)v1Xtp?Ju zu?a}~@h%XhX{g!-l#B30sRKYS2^R_l@kg=ChT#g~x&gf?sINf@KsqdA49YR+CZHF@ z#%(~)3wi)Zhu~qL=Y(4Yr2TjsNc*wFpf7>6AKw|&7(LXQyBtWn*Bj_raqns%?cPKn z?OuUFHvwt8w;Qy?pw&REoI_PPkaoEN`uBH&i&E_Aw_*dxiVcGjfV9hF49YR66ljyU z@+i>Ize9m=~Va*NT)(8WPJTb7X#@~^#S^~*cb`)nV_42Zjlsxh~@-63G}Hv z{nBtpfc6U4pa~WX6?3f&$_C=6@hEjS5QTTBdK5^%_h&^(l>H?sJg1Q175EKWrUyuuE6Ht_z2E?)%s!D*g%S(V33HKP#enD%1z7_Nq z&=EmJ=az2V0D}y+D*5q3Ro;9by9`N!6EvB7k-ax*VuX&=8>01&s%~TSA`+bdR8E zKrQezR6Pt7DQF8&grHqOIs|0~9RXs07IG{QB}>8Ek#DHlV( zPo7>6r2Sn6r2X9vbdvbnpqb6J2hw5b38cd^*r3q{O)=UZ@v;pzxk&? z`Yn$DX_rIr^--fxpa;cn1Q6?2bc4W!@bb08i1AAoe|x#5^bry6v=L0t`U0_pS^52VZLG$0O-3RUxf z)``Cl0Syvv1(2@6-T;ad?p>gPg1!Q}O3-gWR|;y>0+InJN}UR{R8SWnZLU9%j*SE$ zr`Q++G(gZqpv_`qCQyIj?grxEq)_#Dpmh?y^*~n(_dbvtC`#=CN)|4(B^GNI#HHSc z3%USEo9hOo&7}h+iQTzC+Qywg+Qwp_{o>n;K#5}RO`s#f?F7it%>b25?a6;9| zKs`}UC&$xq+?h1H57CA8*|Hyxy?X2q+AqU+xP{@B{rHwVex%I zX9DSvb^sbHTz?>)H%0?lX%57}E0Fg<>m;NP0%xZqMre23GyS5 zmTL`8R!ZxCrvmAxJq$M(Xp;C=WS(-`k2a^jJ|93Bpe!%ZSNURQQCp9lC(ra}SdH-| zQ-Ehg+c0mxW}aL5CAsS+CYSOIDz}idSuI!A+OCX&+G}|tUpoTb;YStYPFW@HSfTOY zE8yOch`EqasyKbi?`)}xOK;dg8nn&0Q%QKF3*8FZd^>3D>$ZZ%o&XER0@@~`{jl=G z(#5HxMt6T&Sh_|nT*MAI3y=3<^j~Tc-Hg^#>8i6ZI{X^bL@< z`#n&m*!USp+i27Hu2a#jsq%nvkx~8z$nk(9ax}EAXz|H`;(g450T=pZn+%CTMpJKJfM-vVc$c; zk^_2<9MC)Du%Dwgmcx!izMJi~^(f#{*EqA?w;iiZJlDkz<7*?%P>eFw^Rq)`4B}J5 zQ4T&SC>FoV1r5aS6M_=(`?#Qy`2Cll@%Y^>CQ4W41h>erOf|lX; z2SHo#dkP{fR2tUJ1X0R`3n~ZV{IyV-J=ata&4dYx!fz8nXYf~0Tl}&MEL2^LUrNPL z)eXN51@*#j13?4u8zP8uf}<2eMNwrT2~}fo|GS_xAoQk#%K~C}@NPhqyrF6q&@Y1K z0{txLHlU+|76Sbw=mDU9I3f4(8!w1*FhS5({0d;_QcWJkCO# zOK|ST*#rWj4Nf=Chj8w}8HqxPPT<7Scn&dvmR5>!HRTxj^m-%3^2*e0i_<<@1CZy* zqg@-09oP3%{8y-P zw_s_-J{aa`m_n378_-8rrHUwn-o@Djqp~#$S7R*Xkb0d@!zJesVcx8X-Qw=b-OPiC zZee{|r<;j_$L;`M+OqbU%&flY^q0b{O5K6M4URXyPf|Tv zoQz=bn1!H7WHYL}3#ES;UPd+F^J0tdrc@E%;Zj^9aJ>vyz7On45^Mw3NkF8NfXJaf z!ms9bTF4>7N^{>E&X+76#dN4F_F17+7yEbM`L#i@Pdf}bGs^UO#Qvmo_wmNIiQQ=U zZ66FzG+x3#Bga^=_z9lrSR~T1NQ9*g@T)n-o8~%T`oQu3`NT_n`F^-1k&WIv6^#%@ zN%RJ1dbHcCjdp%CxTQg$jG-MyJ2T7gXW>VV5GrB1mq2koDftmVy6(7ucNX zKk+{H8~I*Yq9`vVGygvjo6*<>r@$SpWBpH!)M%z%C;Y_3h@UQdoza+>*?~kY%jh@A zl2QY)j8ZhPC83KRkuG{fzWO4lxSUt#;_`H3rLJpSb#eJ3xVZGoOv`lZ^!zVO*^99f zqRvA9g)e6nk&FJ@U+{dC%-OCJ8TAjXt^T9(Rm<}Kfs9(q8sanm8bYcFDoDDDAktL? zQI%E1MRl$sI-?C#UQHG8ac~t8hjr&uuveCAdZs(W#id=X`X5zCK6cTr8_y; zFwxZ%k*=nQq?!tx%wAj;wv_Giu5bEAPM5})O~wS{!)9Z_IC`t_lxx>)GlAR~#y)#eVda@?#JCP0N5ewnbX4 zksuC(I0(Wu1bZmq+e?oY9klPN3@q=5Soi<3?$iA4{kmEG`~LVoI}p(fi{1CPSg9hu z;}TqBa9xUPKU^Qel}%@=IZaeAAf|n|inWkKO$F*8T%m<@PZn)pkxp<#SOf{b+OFNL zj-{x;X>%MOqRnx9i00VcuDNW(O*Py+!||hmHpeU-_+`D~_jEMOt$fK?--I(tdTqPH zl~5Ip`!|F`%pU_#wfSJhm}DG;%32rQ1fj1JMXxmesKluI4-5iXkLGfA)VJ|=UDSEAod#J+J8EfEt2E!shy3k@S5)H$p zfsINXp5&t&8_)!MRTFTH)nNd-LeOZS7(oncaOdB3;KFd)2TLPA2+}M|<4T;)pi)6Q zG&2onO{Ky$EI$v$*Oi?v1;XDe*tU*nTv-T?`WJ$eRYO|_D82*xqjB(?0zWc5&$5w_ zlRm>O-P|k?SOZFq!+693z@Bf3H;ZSunfv*nlOGXyyntNJcX<(4`hfQ>Iu}=rx-PmD z*H>`uhwExw2jPkYDVl)mtGH(4`Wmi`hjqBJv`_+S@l2$}GZ7Y*w4R2`2zJfwHQYW6 zIpkA@wp(tvI4n8igcRzF>o8oS)esdYOV>nWaT+p7DjCb!(9{5R4(#>E;xuEx(O0CqhM9-GebfbV7#f)L%j5|ZHmcmT2N^~@Sr1sa*nDK59t~(Itg<#A(&}>1K z)d~~w)L(ZA*3stUd4GR(%U?(9)Tgc9**kW?)qUEUZx^uxw6+$Yv&H#460EZwheMVQ z_d3EgH7K|8UE1Ni2ImL9FNBg?bvS$ZB!mgAaPmc>W;1nA^_C$Zk_lOFU4oGD*nrHY z6*uNWrkZ{59p)jmFoM7g5BM-d74^scN4Uo0x&v3%Kr@ljT3=&6(E1vYL(Rd{S;CcA zNPnxPjd1yxPUMgQ585sVP-we10cmqLTL{Y<8*Yi=kUQwmRVy{JW z$FG@H=h6q4Q2eyIxE;Z&WkuKdkE-a7!y&7pdmiD+531<+F6ZMM zfb+vTl(X5jtm*vYi*c$CmJAj&c4XKEjeQuVph?a4Elkm*eK5?yW#|$pz3l72xH@Tq zVbq>fYzvXbx(qS3br~Yk727?+v0@|A6&r2nij4>>FXLC+58PoH6BeaAu;=0OOgpFCIj-5ix*=#QH zo;e%cK4`oJ4pX2VnmHNg$92d-`RN6j*Xf47?JZpLJEDQ@QGzC8w6fYqB7ujdPZu{T z%`FUHaBkUz+`%w!#+BiI%gQZF5q(-YC(_C}kwfi;Db4M(kna;8$7Gg!Vw<(^8&=gQ zHI5+kf4ks_ormYcgCdr87|2#Qch(_dk0V+?f%BqS+C3ot#f{+zj==3!1Y*E_5ySV9 z6@ibM2qe-GNQ5P}VM=pbEaZzoD~EEOy5hAVj6)7Sqv^^ApHcCvE;dW?d_+)e(hg&j zV&;oF#AbSS9yTzq-B{Lu=!Ad40*qk^j?q0{efNA7Pb)@tC%#ijZAJ}_ZLPL9}OuC+2a4Oq9akZbm`#? z%XfBt-{)dPbuOBRmAKe-b0K>=J^jKOVo5w1!lePdBxo|w3xX(8blxildR{n=BGvxh1Ek$sZn$TGw0kRnw0r3L zv)p4&{Q+lNoc8e{0C}D~g5|+C;6?@IVA^30W@_)RLk`ZxX3!iDFnVk)v#}Ajc4w3b z+XU=V$_D7U2nG*!obtZEzEwY<4}kZQwBU|f_lts_zhd37vqZjTQn6{WUQi%xVFHR@zfI6X1G3sRMdik;hMk&Z7$qG4)qtqoo={JhU;dycB+kXp|3R;eW%g*QWA}8rn(OO ztnIJ>c^iCbiH6d1A^d6sGwdggmLAt=>6gtx|7<#*DA;nVH1ylXpl2PMN8^smi1z}@ zK;tPN?xdoBH3jDAkIyuFYqMZB70-h0^oGga;%2TaSSN(6L(iVx6tgsW z8tn8}?eWKc=1eSHPFwjv>^Y7`f3yEPB#BM^4!$?_e*=cK5UyZLTyZ52zA*;;U7-&; zCjRq%*ZyIZe(T_FgM_7sr=T{1!y2xaZb2<rE zw=|;s3zm)Bz}a6~04sE5Tn5*!^6!N3>&n1~+m!s+S~jsp;`?vBze7R28OQ5b+b(~s zbDjTK=Q<%SkKm*r4%Uts=k0L5iL)-vK#3};R{T@WuHAe+Dogwtdh07R^eSpf3|FwG z)UJ{K_Ix3(4DUs_QpR)51>MwRuGLLFB8Mu$(=EbLGbD1zm*#hb+X0Tqq0YtcKZU!% zLJn#0(dBUIxg>JPdI8#xFL1B@XpP*i&7EN(2bKcZr<;UU(-37?-&-^O2Q9C(iKvSP zU#YPaAy#ynI}d0R&M0*ee&2`ZdN9Qs!XZA70hj}i0}g(g_9aQcBe|h@K4%o@5%7!_ z%>M<)NDD;*+lZOv1L4p)qd#2R{V&d=5OGKM!+`Rz2Q*AWe7xpD$M^B0=Dw792@H7mk9dznSO|5(8=Z9c3J7}s2?a)kDoVQ^>j6P0GHTh$w&ioHfHJOk; zDKkd|9kXP`BN~)FDxn23o@rHAlx@tT^N~p#;@TD`4|ZEYpH`i5W!~*#wE}mbsA>I` zNb9de*zOX!Uvv8{B(1>8iliqoii;BJ;^-`wRVaPMk>60NE`*ojX?2Bg2|S+?R0wH@ zg|H*e6NT{4n!olxSP0W|(&|zKgS%mvKZ6Tkj8y=8;>vv6%PN4oO#vj*1&|0mgUI=s zV^P!`>O`5X?dy7#9<9eSwj{B3QhyD*1 zufW-pF)?<>QHS1A>iqL5vYvHB<7)TP{}@p51s6N!+u&l?44*uimz(3t{CpCwRDkhm z)T;N0bg?7Ch&Pl7&6QiILhq+uBtc5vrYcL`De%Srje>jPDl2)k!_c0&E9bZHanXsTaezwz`Ey{v)_ytvpu9|fCXW{g$plI{g;a>~-rsujE zlXNkCcUnqT^@B}k*V1Gy<9ijtVd5KMrXI$@P`dwtNJkx!FIxpglkT~!EO*ruO{?JD z&DBKHL(woGht-{DMN_6V-MN-=RU6~AjIagK{t?FLVsEXEE+QRWM84?qs~|aeBsmP< zyGt>C#9r5nN-)=Ath|g;Pfzk&ZedU)1?$PyZ~*r9dl>Lw*{lE=z94^Ep9r zNIT4u6yllD_>sek!=#iPtZ*Zv?712Yfmu1l?}n?4xN2>-mRT?(Iw%WH1W_>yvViJ% zB+~InvCsQjMv$3m zZAZ|n@FhT-uQ1Y&VdCsjfA#bZrHVL?Z9c9XdX0Ax^^_T1M=g<#S|a_eT5~&KUUN`S zgGZc%EydHI5hrCb+bhfy*|UYad)1Tp`B9eNY6B*UnHm2TW{ja3kC&2#O#MfP^aR%t zg)S76MC^I}BZ1mWI%fb~B2SsJ!Hte0aQx6LIR;m%H2yREZwA-ff3Sw%sEQ0?w`}X56rmh4`fC(DxQA;<>q!osLKu``WVz_bU;#^-t4zycBx+%#ww+}l8 ze4{3+obz8vM)aQn-5pML)6Q009e|>l=gov{q9Aa>qaZn)jo;< zn9IX(9b%CSk*gUOi*RKaFmAHwN?h;76%91*DpNED*ZXkI!WAQiiWqMX;7UP5*`P;r zv;oqiIfxu+Ln(ERa77k!$Q~E85iUy`6FF2H?fT)^J={Si85yaP?VL;5>vpR7K;x-oP1UmL9L|ssfA`Jrm%3LB}H{u%tkk zdwA6{qWFd|*p@9fTKBeWfe?^`_aa-q z#chT~^1^oxUVY*3kPwWAM{#8cmf<=8*T-lEoq1xvbP^57J*|ph#a!WH*JKg*2tqo4q5P9+Z_f@+r8U*8m{g$ z<~TB3+g)Y2jfQ*Ma32|Nr{NA8?t8=4N77(qNxdWuV?#@tu7axQF5^Ngm8*C)wRk83 z8U<_((DPuHX?Wgp^SpEre9fSI`b{Mf@Q^{s`qCMO%xml9+)RRa(UmGfQ?w1;3f9b$x z2hXxu?y$O_K3G-6O5!)H8^7Vlu5qI|^CJv7OfQoks!j!3hci@BsLaMoM9C=OR#2^@ zFhbm(x_LcNoIJe+s5g*r)pkk=`}hYyYn)*g!P=uEI+p0;DLC1}@PEDl&rij)PdF%} zXh-0h7%SW@D-*o)$Piu^DN1S)z+#b|ZT=N`E z^pW_5Npcil&OS_SBJ(UcBXfr}Q1>L?E4Cdnv>W=;{bqlsrnplx+V=5x`Z!+~6&?o- zaQ>&6ZDK36l+|#WldEZl`S~tZMuDrLjJMwbSH=-X3pd4;>B9pWkqqR4CRo%D_ib^F z!xfrVQ4X#b;5rT0cDS;7x)9gfaQ*t5--{U6kk?X6aO!;%$#MOF!qs>@BhsxiJ`Gnp zz!5nV7gy8fF0_zCaTi$T$8gy~hsYsYQE+e8aM`bo2m^{>PP@0yLYQ1?j~L!pVZ?BA zc)AH^lnh63!iiAz7u;(FG8V}Hu*V47SNj=!l0{^A@4puc`QU>bQ-i_PQv$9M)C=4| zK`dxj3PQC|`A|fPit2_UZj*9Ng@rAxwm9wMQUI1(KI6fX%M|B5OHV1z;PLIWLo+Nv zyX#PTj%V1X$;f`KrB3kIJ{T6}QoNvfuOj3!7Q#8WGK@D_xsLNHv;Zg40-Q+C{?pu6 znAcpDkqr_3Cq*`eY*LV@s&8c1et2JCR8x7ZDWY$+BHCj`^ler|b5e_rXd)faM0(?^NnERfkV(%CV8Ff{al#miJw;*KUdEznk%nW>MZgk7nLrW z1%U#-k>%`GPYD@oLQ=^LU~l|#&PfWjLs?ql)~vXLCyl-FD{YMFPU{7m_tZ0%{B#7L zf-oNGh$w2f`e`gsraT=Aq}{vLpos<*8dRBhrfWmO{pm=K!;YP)T{(phz z0c)`MDIR(*eeLUDDjWeddQfAw4(_$R^bdD2NbC3m!r1i>4`Y`<+(k+F%tH5lbvNhT*ZPTa$vzf zsLsOi#fTiTHO?5}{soRmFSa&TI8M$ba>$}p9}`N;7siH0 z?C0S}+$d=GHrLi5#_A@VQR)i(rovpP>Id|OaMbvk09AG1)lF9j$rNKhRK?;c(WyTVlr;Qi!Fo$Im1DL#2@vToP1TC=M!Z*pt9R$T3M?m``C8(Ya* z&Ktig5w^u<#EPvY??=qN6K;B)`xEfUqR~n&Jj;{3zi0BM!c#oXO;{kN=fJT1a8L3k zPrqh8o%;$}XS6~}W-vJNV=ujc4ag2BYGd$uU!pjO6?=gT0% zqo5UHfVLn`5Z2sG!?ASkm-_QzphJS*2U?Hp6Dk{oxg`he1{WjT_dtUYT~V^t_!D9y z8c%)_KiFHOn+#Rey}E4V!<H934`njZUc8pY#uCP^J0*x4^c&?EhA9Fa5t2 z+^+w(g4_B3R&e!F@SHpz-0eVl(hhQjy33Ds(9@)tN^c#dl6_Ee>4Q2Vd+T06oouUV zn}Cg)cCyuR=8Z(9$O^>bM!#(d(LVUfJp`d~BQEQ@c7DgBoLJ8&I~ zYdEfRaczz(J#2~V7FyJbZ*)cp@II3Yp4q53fN4R_829ZPc$8WB1?E4~esBiI`C)|$~a;T-Kr=|+` zcMCa`8*#)CgsT}A!b0CbIxMeS$f2%+3Z=~rwva;ZSc|`eZZfYH#Ph zOY4`;EwbG_W1~2I3%8pW{ta94G@Hz?gb5|j5HPFmq%B>GQtQ!ve zSkP)?zepl}MK28Pvi4xyL8m<^ihV;(_Vek%&iY$QdGWeNS{sBJjtl0x3FV%FVWop) z9e=$z79T}E!*Tq`H0*Udf^bBsK0vMULQyIa=tc<}(=J%sVgCnto;;}Suob|2wmhH0 z8N4VR?a&NM@UL}{Xs&*RwOvKc2r)`4#%Cc;SO1i}l+;Wt#m2EK!@%%(1;R}CwtkB{ zf9b;TvbD)n$im5EIHUmIVFa${;hKyqTc20s+8NhtaP5ujNL>5lIto`OuA^}sjq4a( zC*e94*J-%AaHXH)aiu@A;h*kHB+`9}L=IWfN^_rB=JcAAnxlrR&7qBB?e<(e1A{L5 zAQPC};7Q~MH|7PX`_`a3ojV3awkIiTr=i^tkcT$*)j5*+Q0GYIQpu6XK5v{1uWv>W zL#10mtJEyACBjvfd8Xp2opAswWS+;s1y_f(!-(hC_`0kz;~J5fcHFs#`Gnt%c|496 z=6#&LRWF%*BO~_`ESeXFl^KWO9Y6v{1`?R}nYc3QvT@~iNmP2$Yd;lNX2}9v`Hm3u zk|E}bJ0rmm=?p>SQ0ol$riC2pJ;QA`T$$kx8_x9h%UaasUVNgpGl^b(#VZR?AN7e6 z?EWF5f~k#;Z=^O$@G~MRIvB39)Q-VZW*|GoDJq&;_eXHui}U)R&j7STGpr8Q1c?f} z=~Ls}mRcGV9Z7OHJPSOcaZBxl`-GUOEhkwb;w%B`mk6^2?#bImN|kS&-s zM}oB8O@MMwGP? z@M@KmIlj>kIQ>%!nXTHCdKjU|30et)c9>FZ0<1U-KXO>ZVoq$V{ReFn{y(@9glkB4 zE}DV0TlF?@xg$!;PF7Cjg?Ti1VykMb>(dZinRgrDN;$?ZbS*WBbm=3~s~u@>KkhY$ zk`^?SX(`+Y>JC0^uLF<%U_SLY!Gx6#gl5f;)0UG{?B`eMLGb~bt6at5tg;*4)t$Sz>Jp1#%}8f-4d?skwxF)z z6FDxRRGi3hneKwvnx#i&@#M>KW?=gv$jh69)ECOf^Kp*A`P~Wi<;40Of7bdPfmNxf zHLREI!`Hx|;!@eZBxZRXdyHxNYLkV|D6p&Y$KKJY+xQ%bR^2^N83;5i`Prb?GnJ}B!pdoo)**t zNPnPq0_oic5{FP{3cX~lN@ z7jSn@ka(pXwhkBK{ON>vJt1EIEb(ejX}zeH4Mwv%61!{csbcna64xNN^02p)n5A!J zI|*M`|3Hi7h54Lf6iRxYAZWLARWAWelt~%8!ri9*y`F|_rt4saL zb}^|c?($G7GLh4{H%eut?7uN5MdMv_rOdNL|1Xsx<{F)II$4N&1dNcYq^rE79%RXyusq{E+zz+z4K1n|7!~l;S+GzUYZ{>|_3H1^S9VVtr96)f8Sl zY^9n#3p{M4I#=ITqf|5R2P@U>p)9jJU@@Pf({Y9Pkj*L}24oz}<+!q}bjOuS^-CyI zTB#<|N;Q!~QEk>7Hg*%_5Vcuzrx>n{F?YVm%^zD`s7if2p?cT6fnZf}cS7|(p?V*`>V1XGRXhHzCgULK z{p*0f73zSCQ8VbxHEUAsndjMg!q8`<1BM%6a&t?q(4(VTuWsOR9%Wbc+1U6@x~fm{ zBp=0!zIv(|dXFPs4a1r#6EccID%Z6AHqM=68>vjwHV-S&v=6W&3jyFVEc*ea*IESz zp|DL*z_99{F`Im}v|rf4M7#?Jml`@!Hf<{pa_AiNkNdn4Uwi(4?0pMhTt(IYUAB~v z7FwVP$ZLTBh4M&W(3VOzuQq9$Hb7Gf7Pi}D+k~b`NH%>SV5EqY%1aPYQ9uwuP(cvi zPz0eUA}A_iMUTG2zjJ2pbCYb+0`2$TN$#E5bI&<5b7tnuduC+!FcM=~ za!t`o-=j~}o57Nco>=eRi+XyL!*%`I@;?Et$I%WLileS<%fAjT9Yp8Qx#Fea(w0A0 z+bZm1aQ$3pd*ISR^o!uqmj4&v`ld#ZsuLf7n;U zW;w(0Ytr{v4;`U>54yDPL07T!2Hpz$w{hX}W|Urq?Q2}c&fzX>j0-#7g`MES>Rs4e z7gp$L6nYxbiIzf7!$0k$(kKk_bND&ebVmRE^THtiQE1I;KFVj1KZT>i*`goFz`phY zIGAonlDuJkyIjTY#=?j%73;*Pq*0Lx83n< z47VdITAFZO0v7X5nZot9>hiA$p4#2Em2dx*BOUW1;qc=$hp^A{2z~? zT-8y?r!7m`GEIrCwJGI&EQJ66(ryhq zE#XBq2LaYsXXbo-58u{A8g^#5vHSsd7e@Fff8^85lqtb$I`WLPds~yYT6i@4vWEV1 z_cvk#+BnpeM}AAh_9iYs4qWK{R*Mx z9A2D~kFz>P;Vh4$O$6h#zSTdAt!a2gPv6s%_@bxpjl^IqPS8VO{HO0#0H&wlart!b z=iG7K$0$5j?(BW~&$-(Jd~f$3ALrYVnyO1L%}5g=zr*e-s^9Cw?y#ZpE`MM{8ydI8 z0GEv2{(_8Qd9INA2Ap4$}RUJSDr>Asr3)6Z$qa1EwdI^5$sa6jP z3==-@!r>bKO#m*?=Rg!i@iXp29m<|@*R!~J`mJ{+mj5&&a|Xu01cB)ru1|PCNUNE+5Bd*J!QAhO`H^vYCM%Q^Yp1?Xlv&WP;-KWWzOtw)W7&pu$-E=Fwq z+3gu*FNXIIuo>nJCcC`~Jgsx+(mIE(VyS5q#spN@2ICs$JmPF(Q;I&ATW_S_W z?Fj5mgs!Q6dG&dtobDZ8Di+)qf8|4oSC5)p{ql&_=b|{T z?SA>mfA}e0?%Mg0>L_5GHwFQZxWlzaZv zn(B>f8#bH0Hv}+qi zjd{}ibg^DKR!I>nQVTD`pl@l2hoFLYYszu*V8nmF-wfbLyC!J(OPy=0_r9d);<`U5 z*_!GNjINws#{;!DjFDEaNvDRVcv`hYLb%xYt(C*K71zi7(&|6B5%GbMh^)eJ@R{Tn z-zhHUMk!p}0I}`_MeM&(>U6*!LIMoMemT75EB8$3zTOVFHUl;a*V5aIC9Z&r8h8}% zt2Bo#-sXP&iTm{>7xuR6;sK?4DC0!9aQGm&oD7$_$;yRY2p9FrD2K<6>PdVz!c{9U z-bTsg(?gvf!*vUuQO;lRR*D^fqZGs7x(LruCxf^8wiYh+?H0I{g1ecO^AF)-RW;Ok z0WLjgn`fw>E+OR(M&(ismwr7BE*yf05Olz$co)F6BdEL@rV4DW`2xOjlZS2Tv4-*A zzI9>f`|v}8w{P)$v`_fk{QeF~ZCh8SGvBMXYRjwV<6Ihh&Rp<_fL_nnHkWmM${&Pq zx8r>aM#%(enDaRG`Jq-3<$NsUd=czd22(5BNJzV!DQ3+`>%i12Yr!eIeGes%QG4Y-+qnuC8sV0-_fG_4KkyKYmxX3eAxF5UxY~xA zuXjceH9$8W-%W3OB(~4}bNqT3Z2K@O_ZL@Y2$aK$e!@?92-EJtZLQ zG78L|Ozo%t5eRvRGYnV9Jx^S?Q*)PfNdM7~+ldc5qAbA>_YZztdcMJWG^e$R*I3y# zbB#jct(hBvFw^khTJ|7#TPO_=B;{`zmh%1HS;Hp>n35-Z7`GZ4(y^SgB|8poc0p+_ zLd%sM+Dl;1g^lK8Pb=)pV6T9E1?&r8e+Kp!VP6HC%Vn>IO?iF}_TOM%3;RvjpNG98 zcz*#l?>_w^>;qtb3HHITuZPWM%nh(puy2ID68257FNS?HY=-Ttu)hlX7TDj0&71bV z5Bpa9=546A!RECqx5NG`>^oo&McnR$Jp%UKu=j<15A4HXe+TwN*x!ZCbo@T-Ik0~O zy9G9m*6!g!&g)=b3Hv9od3ef$u)g6my; z9p*f5T*X}QC=|n-D~t;l*}$c=&l(qcA8^Hl-&@92EC-1*#KYt$Yr2XZ9!bvj!Z6w5 zNLR755^vV@!<=)CtC;;B<1bFT6<0A+&cKjH2KIytd&-3k!J-w$a+p(OT(~dSh3)Oa zN?h1z7dF9#O>$v8&PMt1I2*c(odqszp$kKM??uGKyCw0VKE^`!1mb!;qvS}!Vnp13 zbWQL~a<2N}re7Y9Fwj%UlkmfDlKvlX`%f)L%pwM<>DY(g>83F$B^`7NgVqU*+bCxA z&1}fbGE|1VnK6dSxE&9z&~wg*iHqujS$wE;H90Od6nh^ulX_!1c7TDMIK2c`THUK3 z8j11hc(n{Q40rYg9W#~J5G(=28jeTdql_I9#)crf--L0r@qRqv+pkDNoY8pR8BC+5 zVR1`qtF&n7P1Ga+vS-S=^%ns}_~6zfcDONAd$D2U)?PC3KxOT3Ix+lI*7W=+JT%Wk zNia?uVM7GY3$Pi#zrtp!vAM3pLUify16{?EF%&ig*+F3#0tz09x%%Z{lHu8HEMx0X#$HP`85w#y04g z2%cU#RRP#2XF6a9$k%$fY9WwO&O*5E#gqFK<1T!ekH;EjmO~*%`pwL84W4QKwwJ$G zFuygE-(|cr%jeHO-I?X*6K>iMjF)@(-8~3j_)K)h=}X(>%*?PzUiM4I%h#pg z%hvhLP!VjMvvqMaY?@;+@W|gB?xs0^H~qa_f68y$+8`fm80PS}*^9`ijK|+$GcGTg zjLVA%boiXPLx<1lDt0ae7MIx%lS|v^(o?ZXG0fp;3|++z+Z0MW&A3ntz@>N#jjPyc zbzvPYj6+(A*W<#lMZmz=uU0=;3>bQ^3b`{;@(ifdI90;)$kixQeb*$+F|0tD`1Gj&iYUp z#vLy%24J$d{HV6}u)2tp#|jo&qt3qq_{U%}4;gMrwmFsQ>}>DUV;_ZEX#kO+T#VUL z(g}hu1@MJ&`;wN%0q|vXXc%B_2UoryiSW&=Y|M0UZBrz)?pQfTAkAe8nDG|*^W+LS zE`J2rF9p+4av?Z}J#wojW*`QI4^6l(yBx6UPzRkf)cXhGIbe6Z#OO4*U(Qpe_HJR^&O)8Z|T)3YDoXThe(slK%?qD$){ zx^P>f`8v#b%D7NJg-nerzl^xxnX_74Aw>B}|1>X-gllF14?n~ZXLjI=`QSJw3784O zO*vW=&Tvst<%qHQG--a*@(O_GsV$bd@V$I}s>`2ztRD>I>47i&YJ$Z8dcl$pc;)iO z%jWE2u;No=gGO%}178f|NR!~C8%a6-r}dXszut5c-D~Pz!AaPG<^ZN0AK@pAi}SjX zS5`kT-2Kkr$uZi2qq4O&&Potay_lB37`VCwb^=_T;+hH983=do!i3Bw%M<*C=`a*6 zTi0*I_htS%+E>??m9~a8$w}qa$@0hn)K#HFva3`<1P-vSO5(`mu{<@o%kN#NN$}oy ziIxM~HIL${3@HxE=P*3nCOaO*T8&X0UhJVaydR=ASdOf*!u2kELrMqhaO5r(bRR_NPyuT@f_Y2Z z5p)$}p$abG64@F zzpb>JT^P#`RjAjFcq?Z+q7`8qD)%+42eP&!I9AYCJK|&Vok@0{xID$ll1NYUZ8}g| z+H_bcF4Be#6^ZIJW*F6JwzlMCzR?40`m=tV3lZcl$ejH4@>#T2`~<#F4P|c9uvVl3 zIliyVy`njt@AU-7*__NwX=m&o0nnEzOW~h23S;MD5@|kBse32 z`aED&p)5)o3W}wDVqbzfKdgZLK7rVn1Z+Fz;0lIWmD-rbcFx#Rq@lj`W!=#Vl{do{ zZp2|NLk~+b$VHzr1F4|tQbE&IjD=~My@om8F)qEQO7VW`!Zx^g&$%$0jeW~UH9td5 zFnP7{Jj&qb9ui_x(=VfNw*45sPYb06X_y*J@kF1^=<~Ov9WC+>H<{^oSlX!cMA~ge z+U)kq5%`hTEUrY0v}o&IG2Od{qSZfm-mO!ibqA;(f&bx# zCd16yU?HAk`ciaZJ;#VzVLuBImNh& z9Zq;DtkH$FyRa@7wj~Y3ufk7%1970uKE_v@eYc1UY6kb+uc>?eEL;U|FPN-;eGQNB zd297#CtJ=Ve0IQLKqu4{b?%}+>W1SI`!4-~^@TuwX>T4nv>T_+*l>AkE$&o$Yi;?E zH9NfYU5~FUJ7ktP7P8QJ1)LuU7qdpV<>Su!;LBp11KV2vq^3Ax9F60T?;#gOStC3=4D)I*m2m6u!q2=L~cjk(W;Ct zRmyY~J9{8K6}Fdg6+4Hxu)|&0R2P`j!+3IQWomJI=d!e3U0IB%(DZuOA>$mr>+meI z;`mNCLFv*2rK{N47s;cr1C6WLnc%`ExiBOiJ1pz!&Ui3aX=bjZ;WrwVX7G1Q^H-5` z!&e%ThB(Z@om_`2rf{X-PHMib+<1rZ!A4AaU%DUb+xtVF~I8_EEs|NOR$-LzYLpd>|Ov>bJC>+jjm$Z|DiDM znoyV)s@x^Y){DKBC|;wpEOZJTX&9=Zc(R2ORXBxiYn?)unw43sgK)@MIZOhuUJ6vW zG%=5cOVcf;G<^*=^X{#tH2u&mO>}8#qDwCcRoEt!1BKZtYDn$^)n66Gb<*vj0_Crw z3I(cgEc{kG7Cu#d_D1i`^FR3bS{0q%eLIEul(5+WMTXbzI#Gxo&xu=g4@Q-DWC6^{Vef%6?p9~ENCjjG+ zFvrKQ;tw%qv~eEJ#cS_$55=3>*qrVR51SFD!%G9e&U2Z>l?k&1E3yNDG>zygb`luqRal8}<(Pn7 z{qm?A$vC*6@VQ5-HxjzG`Z;VX*tCgm%(8+FRum3D$%2^9@(sJ;<@BSCdis$PKoJKw z8{hy7js*M(q4S@9#2oh~V56KFaK$8toZ`Zo;nFium^;EVPCbAn@D$;pVXpC?h%^jA zKE*%7>Ytgd@%9h5WHX&c9UIZf)wT-@$f;Q$jDQHtw^8~#pP;!Zz=wWd)K}B^uFs>uZwvL@%KSkb1VKs5OhX_4^3F{qg#fndxA%5lZJ|) z(|{Kx@DdZuuE8S#`d0ro(;k%X4Swe&Ois1ca2Eh6?W_7$cQK<|!!R>zLTXNl0shX> zg^5_g(8IX=9yYTi&jiqlmo8Q6bm^%z3VX}o`IgvuNr1{1rw6SqFFK*3XkVm;mkQTI)wED!yDEQ8%!en2{tE}H^OFoUVzQS z_#X&f6N4^I47!RPY5;}3Zd|=3Mvkp1Tz0ahTT?EDw|#9**?)H+h|#j)UqrWMTT^Vl z-xofZzGYP!J z1oeci`uo-p_Mnk`u=C8jS0+L_@Tw}HwTb@?0EONSWn_(}4r7V-t5t?2tX9v#5($RyW3U;8&8{fvQc==X>^uf6 zg*{TU3&F{DZTS@lZ^Acz@ER<)Jcn0zZUHzV4fireh+Rb~EG7Q-6W zqRY{mVo}4f9->88!e+7K4N+7HF-S|ZFjln?S;@39Z%V z4R^8)Yq5h}mcFgP!Dl#|3RU3nexY-EUkWM)atil-Lc2qFY;Ml zF2?wE-M9}MNAlIZvWZ-9+$%WalDuBmo@!rbBx2}adwL{jj{t0xGY_s2@-+n)TZ=<+ zAFknow;C?JD|-!G_Xx#xaE<9zWj=(jBk>gBp<&tfuUq{GV4ePsjK6nO z>h+F-O{qTnNZ7AcUtU#TF)zHdsw>mj-I>uHSu6d1hC5I1oxkpS*}WmVD?{avvN{aU z-FQ|c@DdX&e?d9qS7GE&Bh?0z%NnG*F{QBCVG3{a>Q4ANOiX3>l!KgO3|y3$F)Zy} z(w{QF?X_>zuSo-=MY*u7`^S%}&@!3`_%zs8!=4WN2G}*QsoQE{v&?g}M|)N*2imiu ztJt{{Uw0PRJ;qh+)H6p5Om-y+-tPcY+CLaqu`?Q>QM{v!tJs<3!lt^gdKWg=g`xbu z2oL+(=LLTqo>w!<*%Pkyc=X7TJ@CPQi-T~Cp|Z*%BnLxw2{ZzZK-yqT;9XdG@1bL+)5X-I#FeA_>h_(+KZ@Sd zh^rsC!~SVGdXR zKSzOQJRXP5F4V7KGfq#zrXpbPUn_sQwDPA*`?CsT%T-}+nr!Cfyf|%B`m(VTcF3O5 z%q8T_c=ToK=i#W{4;JuQPBYsA>W_0ASDAH7Ei;YVM z)fL7;b>-*j?ty6KtydFNqGqv|Tst8hAFh8`*YtTYwoKs!rf%d)ykj7_+?^dZ^6}9% z;e2~9zI-B-Z%M;^i@^iutOQ4>sWop6>JpP& z7^VK?y6$R!&2a-5^jdScA9K_k+CAL7_Uxi~HzvJw;`4-#;VW>V{N}ZtL1ZZOtbwB3v^jGMUV(hG@C|-xXTbtL+D8kP(wHBi+rXk+CzjP{GdSsl|Z0t{Hja3bo z!l<1m3*H>Kw8mXah|HKoX6Ch0yp1rbz8WIL?h0BJG4tQ)CEs|bL(-f?;; zgBxHkgnc9IZ^H(2xpw0x72Lu!elOG^}8dUAlm)`3o8p0vh4iayVX&uX7D=Yaj*paLV;gr&wdbNJRS z(lC_JHO^!GNv$T`m7>tnEp3_3JnP|pBuD?ll6%}p?w7C`t|yG-SZk@|=u*kirMGt} z>>=PQjFKC_?&4}(9x(ExOT7zIiY~7H?}&S=->n~UZ{2_KVdTk|VyWPzb??}7S%#0e zcO>px7zx;L3ma1J<1oZ7EZm#k^qDO0-J8k;kXOEXPKvyN5LY)+WQ+>s~t zlX`X%Peu)U+y2bG&df4`#M@plMTbHVnTTOH!)g4VU7Q}qZ8L0!{~g$j`%C~ejp@=f zrVFb;&DUYF&_ZEM<4dcDBc+OLN+EgQ9dU2NyOM&TyK+V{y>wIPe>C{vV?h4YRD`iatjBXkNdBZD4hoO+Oad=4Dt~iACk5U6V!wuE?aMQ!sPvZ@ zwr+3_6wa&AkjgDI_VjwT;3#iv7!S7K{AqJOw(~P?pMcHyT>zVD!@D~)ZRpapp{v*_ zLh34PxN%9^^9gReCHBEu+vK$7el*x{4GNJAVJ#tjL) z#AuT7RA;~5(iE{cK|6t;14@A4kC)g173-v=}ecV zGhMpgM`5oUyg)h^_1*x%^-j5}s!-G7cyPT7KIJZV75Ive(hP+aX*~Q5uyaGI($buW zZ_g(1662@A#lvtLA^Nu?oL@F9plBr75%463i z&#H@(gG`)Oh!1!1BBaB1<9yk7_QUTA@Zo4+FReL-C0t{tERDfD*CGNkOWEd-8)Hvu5?ECoAcH)dnZpZM0zlmgirhBGYGKbu_o0&Ir=uO^qa zxk9B&g-Vw;krnnb@D;`;@+H;p_9s;42AZ%?Zv?C&lpFm*-7zdwG-*qRKh%7ihcVJt*_g7#oqk1YaK2W<$auqBYZ^AM zKJP8({C%(vPxr<&yd~9voxjA*8$35j8e=?MNpHDBTM%XT7ab4XZE^jnA+^Ifj}zsaquC${ERfj>BJKYr*mNK9C-+yQ7=NUvC$QheJT3R8`# z<*G7^x|f)~bADQSK)EQ6fTpIkv}O=u-yLSNFw!My9Bx)HtYL+H$WYZUC9oNXLt!(e zSXwou=+cy;OMA}>d&S^MEx7tTEZO}K`)M4&kc?&Z0s3XT1N9=1>s||8e1M;kBsd5# z8U}%eN#O5|eI2lH5|D;C2jbZ~cM^28qp_Filp1pjI%GkCL;Bj(6M=Kq<3oVZaEX9d z$R;UJ-V7^~fN?*{z>6SqhJR<+P`^$wY{q36Y|4R3Qj>x%O$xe-onM)+!<^q5mnM(m zF?ke^!`jO+yxocc?j|RJU)^xG!qtJvc7D}mUFaF1=FOuyW7S}|gj@tK!<}V+&3iVN zIEXPNM4B^R)!X0j1r;Mjl23ajocnV%SH2h5-2VgEtX;98T0~B5p(3YCMNU_-jNmBj zG2klfzaGYvqDm4#m1Vxlw)UowTfUH!acDTSsVOXjoE?hSkvoNmBRlIN+3@>F#ps|uhNnC;nC@F`zH#qEw zk2F+1G~vX(53ukEFKL*#e1;u_ml(H>!bbP@RsE0fTDqW}z|XuAJ3PW`8$N+Hj;Az7 z`@CWJIqJIuY_@=CUUgJyqLfPlUF#+gU7A32p)~_ag$*&Tz%a*1+l&YfXW2r_k$O{T z^B%ftfxn}m2kp>RHC#Uw7+#Sok6D&*e~R)qAH>r61D=jhtHaXF!na)lDJrulz5%P? zNQiHwSXam#xzz?g*aTro=|H$sa^HQlv76W62jdnV{J;%5J(R~Ouo>sMu<02`;SC-Y2rK$$JP_iIF%b!HNeH4GP3C`%w) zk2F)vfHEX0yF91DE(QD}uo?anVKeR=a@Vw>OVfrf9bi`227{+1GLJ4l=*0}Q;jw$5 zkl+B$Iu7Ixtl?1vpK~@mb^~)?zdoOa$DL;I>D#bbKizExpE&-lLZeHCMwd1`6!sYK z6~@+@J1Xy+>yi)p z?5=zD8%vBeloLxCH9(00-cqa@?^f89-)*p2s_uZmHG|Nl8HBE4rx_`ruvX)eQe}H& z&~7K2iVXd+kzn;xkmXKn4wurf6-pCUVR3j6Ua&?QMqn>Iqr!>ZAmi~{G7t~0IZOhu z90^Jgh1J(UylsETK)gTE80kQxgqZsQ7#Mhwlnj@2${<{IeL1ELmFrdxg`h*Wq~}=P(Jt z!o%~F8sjO$^H#o^|0DC33`@8GoCA%>@O=z6!+5UIkesAYxzVL^qf3Y974`)16((}a zIWjczj0f34`WZ-b7lQrqm8Q2surm?|XXo#xSo$Un1I-@PK4GDnLXc-0tRDrZ{)OKO z0CJRv!L-c=s?;KhN?C*p!()yn>MvkZMqD+;Ov2W&CMsQ;sB{%Ovmj-KaYLQLkf18y#+r!8`nmwl1(d^CjcJ%7~9nC%gv1|?Hs^y3ys)s&Cvj<;~{$Cr` zrb?Df0h@-hqiUgwSwH|x2kKJF6B(!{0XqwOG;CxS8P#41o1@z2!mfvX9_)Fr&xg%X z?T^Fmgxv$1xp$qLd+E~LOINYeh}2Zr65}d%aDb12^|&y%A&2#S@5;RUrC3t23A`~_ zRAiS?gz~wJZL><@D3mUm_@%h;iu5w407f{&OA~HD-woLOP`o9fPAPFDURSVZs2v6?%X)eCvW3S@|&){2oC`By|b9Ih!gWeWUMAu?|@WTd? z`i5}}*EhK5x`#3v1DkQiRn(I5KLb!xo-R#!x^&z?VH`J5nASHK6^K_4UsJt#{G%7w zy^T)Q+wK||Uv6-hG|9Tn!{Dc;<*{&WfDgITlDW1B4_hQOES=O)AdueG^RQ=y(vmd9 zVUFG}P&(1Q<(NSqOI`+{_46r_woM%vthEh^K=YX`5_g(XMvL6iJPGl!#+GKv;V1*V zcDQQqFTfrF*mbZegD=5msiqFpw53bamabx_1SzVp(Z(gEnr(?IKq%ElNXL$BzS8}I zg=|J6;~b9RV{l*wrn&1z#_Kj?YJBy1o1NwRVBeAq{bSRVEPV5|A>_y!hVOR>i+@I( zc|>8%BdhUsl(P`7-e<(y@Rhm6-!k>*mZK57@WoW5At7QM1ro?r6?K zX6Z@bH?oH0ywAX9AN?xWHL$OSJsb9CVK0Gw4Q$H&bFi5MsM9rv(xo|+F62g}oWf2s zu3|ZaPhp%7SG-D`ny>)l{GHJ7OJw3;nUlamq879rGuS<}0OuXFU{wUaci~x#o=O5| zEO2L0w@d^kaFApc?k2$6@oh3zW|V?%o>Pf;EzVJ>gvM!bs<3Be0d^o|@bJWkRR}-y z;Y+)t2&~=|TZ7|i>WWrB5W```Jg{c@a30iFJ@S&Gi;G{{kh`}!1}tbssuk(2{s{1} zvLg*UR!87T9E6t`Glh|tva>WnJAt1$vg<&UT|lo7Q zsS`)kF3$kKfMMHjnh_3|W16@iqJ$H3GMN*PZNRR&H;C?+AC*|h$ogyOL;n(y~d zJopWTmz*+v;_;>9BT!CX^0b~8Uct$6-+NG zY8v7Msi@yPs$hD3(ohj6NX79ak1Cj6cN!|<1gUlpPzBR#gP|f$kZO+r)ko%!`XVvZ z3^fko1gS;^s7|=|wEyv_jy6=p2~zDDpgR7npCDA$uLk2FPLS$D0jjpAE<|y+R6WK) zoFLU+0jdqR?u^1@sd$MJ4RL~0Eajf$zjx9e$Ox9|G2WUYZmUvXt4Ha>MR0xodYTcz@=bh;>Bg&P--&p(0L@>c9Y1@zGy~YOykW z!%z_?NR8_pcehKp(0L@>c{|9P#WJhRKy8Vv8Cqu71W2%7%Jifsg4Rz z1@+-jR{k)=2~r&mi04;OV~;mf#0gRz6QIHm7@K<+7%Jifsg4E2^DCIjpD0XAmhhz&6XF7iKXMmb1_K(GAR*;Oy=N%A7?`8 zgfL|6f-q#<#bL;VPlqALUlE2(y4HmpljQ}@YQ{1qu{%+T@_?uNE=Mm8_J{Y(>Xo?;sJU!L{EhzxPqq72(JWK*xcKadVvCpsC1`?Lp2!gN_>AgS>#o z8e0t>WEpBww);HD8*DBGAm_1BV~pmgwGqh85y<@!$Zl-r1o)&QkZ(pHZ$}`fGYSDd zAB#Y)i9qg(Kpu@ieiwnf7J*D-1IqP1wJfu&D`V4{DM)io0Edv<0GSHglk*rhj>Jg1 zuVgn#6Mj6P@z_GJVj2G54Wk@fg=q8rADebX{rV`$R843n#t3C>~>L z0ff$^^VTekaz$~UI8S!{Dn+C31|VuVCF7d`VM+DU^hh-EmIWYp0z#eX;T*>XoiUnQ zE{i~3j6jC4K^LGpA_6%NkPCt1`SlJUt$=uW<9sNDxd8|l=f47Bd+|D#No0(M@UZ~I z-#0%2c<~rhji%#?y{}d|^VhS6N^l5pvI()|rJQ>J>3}ZteE%;X-vNdfi^~qe@|ghS zfP?YV80B+z1o9{#zXXoQ=M?DA8vya7@hl)$1R!UzC_$5Y;o0vnoYWul^Z7H>?9&0r zEokOE7Jw{8V`N+SJpsrYXb#*OfcyXj{<;9<234Hx3qNYwuE*dBO;g>%!5cg~M$BqRWEUPsil zPG_BAb<;r&_y{xANrZGA5~*L#WrDK_%q-^1n)r8Ck&Md}5 z@ErBuqu=zXZZK3;pwiGjVIV*?dEO^s{~zm77rFaPdsJPgDU>+M>FCp; z)lvC+TJ#}6_QprAbT9j;Qt_=+cSIonh(L~C5T^QM1oDdrWcM?|RP!T{YXB(;gmChi z4%Y#tdQ+xqFn*gZ@KyFUk@FYy!za4?Bb0Jnf&qg3) z7g;_Q=ZXmAFMwnMzF*sj$*Pz?7IT{PSVb>hJ7vHb%F2t^U4Yyi;InM8<6IJe9I+%E zo^vCR$0CrwM<7$1apiP?^S=No0>lg9Z7n#^HxP^TS;%#x{9(RoDGu%l@cA8@L%#|@ z_H7G?c_|=&3EUS%7Zg2zj%yG^DO6CuIuB5^Q;JGR)_Hzl2dR``TF5G^bf1Uc#N%_ zUErdb?Q;ID;XK>pY_xGb@ZzyU@TN9?^Omk7JgOmG0KwFQN;PDafe;Ge!Yl!#2)5$* zbuX%3aQ5q7kMoU&N^r==*PtoVa5_4qt!s00UiXhRv!3h~F3m2o`A zxG*jDx$NDK{a zOcmmfDJzm-Og%mu4VB<*|NFpjjRxR<^TXpc<+JdrGposm%-BI*GOr>>4DcH;G$XRa(>Nl zUZ|XXv%rgh7msnYmgeRc|NVk;=C6_!eDelK3%k!i2o1I_P$7X28X{tDKJK2^EDd^E zhKe{rswP0O$Oq`(a z)RytsR73T*A(ulv8=ssFhKe{rDpqyz*!hO)%lrQQ5|8S#a}-P*Q2E9WQTc)DDZGpE zeD(gnL+#Noe+r^H1WpaWHU*pA6s-9eKEgD6dBc?4vjC09#^XH{PwF%4@AIh60Tmi? zSeTSB`uRRUSaLnc4(H-$05S~_)_#iPFWsn&;a3&j%)L((U;9VTuM0ty090^bJI;fK zvqJpRXvNofY%<=I!LRFg{YO+9%LHc>sulW0)9Sk7=UGT1Bxh9o;5-rU7@mq5|9e7| zGnxXx8R_HP=5n5D61L5gGq7pUTmTizA35jl{hcj1qkWt^T+Uq|$48is2xrz@@z{s( zCg+`QeG$nY&Kq5VQ|jZ4+n4~Od80=xEFcO?gB6Ktb#fjt^7KzcIa9f#6!wFGcl^x?sjLCGmCvZwh3<=(&etJaW(0%)%Luz05Zr8r&15 z4(DTr^U4Tk7S8@SvzVd(&bQ%rj?4L*hVwZQ&dlf-^Ta!bXZ`*QJ|C3^v#gG|TF&RX zod0S#pBv%K?ATwJnX#~I3|?E#=ewMbybvE@&W~{J0W==l4{wI~)Ul5u(&1e93BeiS z|yK8aA(8U9*&cER85BJ5>TmxuLopj;3>qf)z=CiR7esoj)8c5 zo&pu?3&DYn`ir81QHWowe;Uwu>>9jx#PjELbwf0!mkQ2&Urayk#63skrV8=L^m5_jkEzFJKO`?>DmbuF*D}Fj6ylHR6@d1a!><&aYz&xW z0&|5M)9)D0S9md16z4OrRfa83aZ>q+96R=3GfR|Bf8Zie~llXsorasGnge6>>f#?U@1RP*s>KCGX2 z|8G31=Rw6F2o7xA1d7a_fbBufVfGI|9s-2z77u3xGrO1sX<~Og#-}O^Zj)_X_ zbAq!OZ{|#zYh2f%hVwNdF+b;Pf#-2Pr)%iZQO;2Gz;)IimtBdKQSk^QVe^lX*bRWjV{`Fl z2={z+{^yknWoPVoKqle20gslQC&4En5G%uOC@0GB23M;4Kw(gZ9^}V>kh=#-Q-!z? z|9sqyfT9;5UvaqeyZ1qxQ3KHINTmWp9EIHn2;0%h*)RF80E%%WyczP?{+AB%q_Kd? z07h`c^)?`syh8kvzX?$7?=a7NYgO4KhC&60eZN(3YJ9$b&Gr2%!})8j@4xHSuiJ#rD7?YS`F-`}r$+tyy5J;% zz`B6uHrFpvjRHv+sZOJ^G$tt3+X3~)B~~AP-m6i+?hqV*Z|io~uTI1Hc8Ql?V&4#| z4BpiIGg_`67Uld+!I_2ZkB?%$;d1@~6*J5?JkF+6ehbjxc$7!A8`USww?M^|a-4IZ z_E^3Y;x7ev0va5T^7#A_N`+K{0~=Rt+$ffT_+xq(KEz|!;>}p>a>GT)q~W~rZNce4 zkZerva$|bSP520Nm&VjL0&_Q@@z@=vxZM8cDCiT-snDq`5HQ3+n);~j0mRc1XMg@2 zWL``4S3^adAk}w->Rh~OE`RvTkej8to&^hrIKljLFCg(4TS3Km=0E-^bpFC||E}P0 z1+k6$y>8r3W5I&CHxl>n0UD1TCSP$0;;Os<_#w8vQ9RIBJIyV-t8qVu9 z-F>5BKgomhgM!mM6k&ji<|i)arBo^cNrb}u5TNncLGl$NSQq2aRA2;ake>?9CcKRp zu>!!l4yNLPc_~c;T&JTN>jjmg-RCqHK z*R=hhNvY5RnFs*z^>Pb{0_L~iQzVdtk<9s2U;)TsP*;?}de8>vyB`HK9-F{7o_Blx zc90js^`IIFsNlfHSRPdxj6(eS@MnPPD0&R8tG{_sjvW4T!5I#Oo#3MRnJbMERA~ZX z3er>=2;ISa_!uDC&!t~Gz536^QOW;8ae!b`@-f%dW;j3Q&@X>19v3Q{`tBexow{e{ zqXdO>%P$3I2%>NZTr`inoWEu`KkjihY5D~4y!z{zbLM>7quPUt8RiL4F%_`c5s*jV zF~g&&Tm&_Ir9dps`G9;M@$+!r0A!^=h~uvvo&=wG3`rv9;PaLpqw(U;rBvrI#8JtY zKzTDqX?Xm#=dS>b$F9bkDY)}%dpzdF;yO?z02LhAXgfnyR|OzfQh5g;#Zb)5V;y8qgBy~9cX=GO>kFx`IxXgt=1H{<>L z9WPHr)BU%C^AI@i1{ck5T+WkOQ3%B4Y|{OAfO=yxSKqc{u}5{5q52)d6D*Za3l-&} zDFTP<`i7w*4r1YJ1N}^1x44tU&&j1>1BY9z-gvyOF z5**kVv1N4!qY!^?`2(Q3Vw1W0U-zs(!upL?g`px2V&NM-*dSE<2^=k*2fu`h(Z=FQ zLq!}=`Sv0HQK$~Y8wup>5PxI5N3|!bUl`&jr*Q^CXwdg(0nrgfVg`M$HdMq3`u-=O zIsk9_{*Orq%(p&aWuKuUPSCIC0P*~K;l`IxSZqvhGE~F~`t@g*ihlj8;YV{lsy`bl z;wY!L4Fmx4@zuG10VE!yo+IX(k^fk)E`OWkdBJ%LZ(ExF;<`S}1`EtzoCG=h^5I56 zF&qN}D%O|8u~a3UM0o)Z#=`~9-!xVlmm0r_6QuepAezT0jpui|{4$T~ zRzpRcAl2W5igmIVLhIK9hKe{rs!c+*pTMzV>IZ*;cr4X3hKe{rsuu%P3-{QJJZz~p z8!F-iss1ih)Budvc{?3i;Zg0+1|1A>f>bX75|6P|TOT~vL_YS_5$;j}iNOK1fTf z3CU-vm6tz<{}Z5i>@2+L-}S$}0Zm$B`*Zj!f|CH)YW07*Is9qk*FRm~OTob!#LKs{ z<5l5Pf;V&bGaaK2_V~;(RIh?huwMR`P~|Qu-vD3*Z&F*L&X*d%^Pldtu%hU;Uqxk&k1h=&y&W7lfOo04|ArLi^m?~ z8xPH!F6V0v=Qo8jzkSz0G^T#P{*ABk*b#i=x&7`&D3Y*W{}CL{95MB1{_Xnpkm3Aq z@ypNoZQyzJ#VyZ%1L`o$d9&bb#G84Z=55#YC&T&e2#1nyyJ3y+i-p- z!uegHIva0>=gF~|9MWKNV@3?`5x}8&*X6wLPb|buQ`54F2~`O`55dC{=TS{HRIymX zq-MK;kQ-%&J_;a|zT)^>AUg=>qwtNGod5DTKL9GWe*_0ME|dm@Mj`(6!W=B(#mbF* zet0f-Fwy1LKgf(N1@sW-{5d=zI5E3QO-jJXD;5h zr0nQ&USK%yD4f9pEginq1pV4c_zW}OuAZ{%&!T=63C`YeFW2ql`t>Knd8b%77Ch83 z9-}mAvh@#NALU#uIR0_Son6j{Kdh8H$HJU>k#sy}!~BO&SEFYXmOT5RSk>tZ^Dvil zcD-^Q7U8^0fb;#`sUJl-?;7E}i_7^zNRMWhSUAih0-PKFIM1{b{JCXhg!2fO^KQQo z#?FWc=iP*AGCm`+&N-7u_e8_IyWo`gq_LaJ`8IZWVRnm!!^|BZaX>X6{_XqUfG1%& zj}jb?klTE{hs*i3CqW9cM=Z>FPoe6;H?|x{P5(9udYJQv1ZOV5y8wq~PnYwIUs;ID z+31bEglZ~2Gd$yNIqY4f@{g_%hyG&T9ekKW_lhNqCVAR$_8_Bwt)nXn@oSR3#jgpV zr{p=h;)SpiRBSy74s6HyF(5Pw@t5~~gwG-P21hUJc0MdPC3sso@8e2i=cmXQD@0?i zG~_o9PZg>o@Qa*>?Qq2vQ917?IHP@>_jNhXHk|j3aNb|24h2`HTkihF0fNKAM)}a} z?{dD%aNa)_4)cLRg(_UaoO`88LU2SckuA)DF6ZwU&IiWAoDUMJv4Zb76OX&5H7bpR z1&8&lmGeO^=hqD9gCd*{5vsn!%(TN;0p6DLAui|99HM|ZBo+?yp+d!anfh+-%LhIm z4fA1wa|IH@*06`VoEIC;hkBe%NjY4onCn=>at*LY^`N0T98|$JE%OO#G*HkS{_pe9 z1Yi!J8OK2s7~-Io@%0&x5Gsx#(ER8lcTM!DUN%(3QBDv1PD`cn-Pi8r7`xY!VcqS8 z`A7_zuq+FX_;WQNGz#&TxG^ptIGq1nG!H6!Rg=|+-b(UocH;Ig@idz6e{*Ecf)h~#uu*BnEKQ7IKk<`+tw))UC!qi&J$z8 z*(dqqg^Dden(J5Hj!4@)f1jZuPEhh3rPTFNq`K$KuioZSeQpC`SZxrYnk-Z{y^6|? znBh^K^hc#4PB6Wu2o>uan%ujmPY|4!@!jU&_N?|56zC%T+JX*i!4;hYqz3E<3- z4*BG*=S4Y}3l8f(%Q@+CzT0q4MmSdp)o5^q!+Gf0x*tb5R|*bO)^e_JId3+cDL^;qKWZ`4W&a=~;Z$|w(MR5FO=VaHf(+%g7W8qk^uc~vk48y%ozG7-3 zzkY5I9JY~cEatkLKVdk}Rn9*BJWr^Ol-Qu1om$+WVJ6^fhKe}Bn4T(Bedh$`+u(Y? zQ{C_!`4{!@)L1yCrwP?5_{^47^-fFI*ggtv|9X)fop4Cm97voEF}6{=&v zm8SLdNk8*qdZ(cxPB5kmgv#c)d7H*8iH7G4!C}kI;w^B)^O5J(zXh>Gi1V33Rgce% z=^Z;Q_-@NZ4?}i8QL%}aycJiI4_EDW@^S`m7ros;|DB2&pI6DjNn|0x8>aA za$aOOH$^xv7AmU`$G>sbAyLjt1Sjj`yx8Tu{|g8Z%;H#B8qGpgEMKukX!tcbYP1%? z@oU; z<}9sQS$8@F-!Hg!PqZ7udE;#1>@O)DF6U0exg)~4GZ5yc+n$>o<=iDW)B`rmoi696 z4d>1XXXd4NtPSBM)vbFD`&5*3x8OX1_fEi}$-0~;p`KERNW-VcmJ8MS`q}yH=f=LS zoC$c)P!T7n$5sdx+ekFm-LbSaz#wSqbKOjC2W;YEu=GG z?gK?CwJ6<`O1HMQH>T<`U0vxV8Kss21=x^VB?Ys7W!rBj^viHnTL`Ae_K(*Z6POw zED%(1?MOr5B_)+x7*&Q*BhA=PNS2n?m(LqNAz5EulRO;_iSD))Ep1JUkwIHC*^)vk z_%qD=lnNyi3+WIjo*z(YD49@5hixJq#uw6In@ERog>={^(qU{N9kz*dC`CH7EbB<6 zRy1~H+gt6gnryb?r0z`Ts@k^2?WZQkxoG_0Yu5Tcm2o2h8qt9^Y*nZYTa}{?TjjQ4 zPpYV{uc(^OHXOrL*41(jy8>IrvDV{PHa5g;U`_0k%Bz!oFdJZ8gUm`pAsaZe26QUB zaK$_Bt4g8sTRJu=jbTY#rdoNE?Tgf8(oLDpu2Yj^kMpNDJ6NW-a%yrs6{XPDwq-M& z7)q;bZ)?MSS-C!u(w7sMml~IKL>P3Y8<#e8w)*@nlg>^!i3gY}%rw)zbjg)z2Fy`2 zO{yz{j$uo7RjRSQeQ8SuG0HSIr`wuZGo6Kg#Rt^8OI5C1Iju9jEK{Qi!Io8~nZ3Oh z=&C}pd_c*fo$hRUQER4<1|LWoBvU?p)tqTuYP42zf>TyjTHc*)x2jxAPM~n3r#9 z)405PzJ|%yrg{GpGE{qiAOQ%}T^~RQ%BE-9GM$(tsq1ddw(yGEiuUfdCeCm4t=!7C zP_MaK8WqHrmLlZw>0TD^TG4??jO^l6ms7UX#-_d#6MmQ-9b5JR#yC0Qq>AYk$ad1Z z=|m&aaYJLeKiWZhk7W;igE@;_HH*y+A4F(Ma%lGtG(4W3-|`$9R`F%0ZE2>DR2@ED z`ay~QBd-soDP@r&eX9l}s!L+CX`?ohKy6j*T|G^B&sD zOFI@)Ft`pNI61xzq+rRo{;QNiB5w1E$a*-mup*?%3yHX`C*s)2g+v_SvZ`%QosOMU zNW|?w5sxn<;`X129JMRdi33@sx(%w+94i$I4VxUxG`yw8+h8K*Smszr#O*B+bF7gp zB;xj#h&kpc3yHYBC1PR3W}w?|w!u2FFk-X)Ct_j1X8TXW!g$U0pN56un(aRg3!^pL ze;O7BYqtM1ER5A`|7lnls@eY2urN}y{ik7Jpl16|LwAMi*4}a8uEs7aD=DkVZ`mDo zjmny_)5@c3%k$%aBUwthnPO}yYi7V|0N+*0UKnuRO`7Kz z1y*b3oobTq*bc)TR%QcsW?4s;2k31H!;0$EY~k4Z(&)m-XZxDa zahIu>?YV{Y+s@JtdvF`E*ENfS9k@>nCx_sS&bghL43Ah#&BfjXdq~`t?Q>BIpVE$ujy)J@1#HoZg{Y~^r{OEQq-C6IW}OSxf^;Mf!NykLhA{NjwPaw{9# zJ9dfNo&^?8?OlpA2r`qiUCK%$ANBM;Uo)XEZ$ed4Kd6BnNPXg#rRH?vSk$%@j{of? zlD-B~s!GmVS*8a9YdlZGe)EdyrQBOvR+g$vrp8uPChO z-7191JABg|W`q+cr3oHc3Azmi(^oiC$Q9bIZ&{2JM>FYV$zHk&Zt?YH{6?PU;Pwm# z!vQ|>I8_sbJVSu}mfTHWUZuK1G)Xqo+R7td2gXUdw~Ki&bq&s+^13`-I2U%{+%#M> ze4%RTO10wv0WVzn3EAx}Nz?|z0UbD~pBi6KyuICdr;`fAr;4}LLKp0oY=b2(+VbV!OqWd$&|-K`b8GevvRta;}_ zTNy+&>-LhAAA7l}f(!>JL$Aie@THFL46dbLQC(g!J#yM%Aw33`9-(ThAie>MFHn6J@=@BODYWlr;^P{x~Z17<>}UzrWDRE)^3)aWUiQ# ztgEiCubHE>-!`ZcK$+F`P5OE>!5U6)uDOkYkojjDSPdMY?sRs|^kj8K?dP#-plC}PBI}aNaDHpXoV%;nu#j&-TF;rAYWvvTfT@-^76?yx6gtvl=5o# zBv{#*ty;9?j*m@z>$V)CTGOL^= zk|;5@d=ijkiADVANnTv?!8fZfBy)(^R}#7@Q&pFoRWrS^rm{lwZ9n1{?jla%E&-CC zB6cr89d6`R>|2_r{CQ~(R?yT{)K*kiiriIl<3(=c_^#(mf+D_d3ri#H0^qz9i_YeU z>VtuD$aN>dfO+KD#V}wV>?-Zd`F2kNK+)0g3zTD|JGu&i%fGP10%q8jTp zLQ5dA5Jc);y_L5hwtvsrRT}=#uVD`y)1F`k5mLm+y&{m zmqrHZ&~Q!}uR@8~54Ag68Sr~xJS4IV!O7`1EJ?1y@@QO0+?zMAeht&|E(5 zf@2%=nn~K2&NeoeYzdP{ zLT*ub{Ka9*VwUY(wWt*vE6i@LEn_BP>RPpI%OvHUC9qWjg)2ViHg~qKs9xEa>EMo; zXbT2amA;j>chhT?>&}GzJILIu5kF9#h*$dye>$WD?kcQp{gBMW$ z+g$j{QWf1i0i^$`rM4Uc4muSs`#sDm1a1<{wIBg|_+ITMQQnQw|cV!{>!Z89l27NKLO0~5&70z35&s#9Vv8ADAVIfE5o<=|!Eo3NBLA?$3^Okh^mSaG!tdPy@i53l9JkG8u=%`xIUwll5^@n{VPWpv(LtzlA(j$YWb_@nLUyEYOQAWU@jg z+xnTTtgNcg*3YYcQlZG^S!9E& zrKF%$PEXF5J!@LU?CI{(dr5T3h>}HQbY614tmXH{$u-A%OYmiNcsH|+%}G{HtFEq}K7EEHKu7>vK~?#Zz{^ykcSLiEhoVzODk3hylMNA)oFMdF zBeTUQ_Oe?UhgM@*ZF~N+?wCpERW4;{UvyQmX5S%e8UgY29j30V9RI0_Tk8H@3Yr*4|9~?(kT=YVJqz^Zac7|42y??n9 z$>g8DcwapZuXBIj3Wd#^x-9;E^Hvt6`qtyWe;#`)P3`ji_swtADh-QUuqZ2^hAXNR z)J0s_rMo=JQuA?0Z(gJ`%X98`A0PvnGM-yI9@`7_bl_B`vlABs$h@c-C@jSWlsU61 z$}8qn&rE7#oTD&v@tRXMG27l=HnFw6O$LO*#d^T836#wNQwN(u117JWTi%NxQmM+h z=vtp#no~~6N$CGY#pgekbixD*vsZe4JU+Xs1AU&h#qG)DaTS!L&(HQHEsg%9Q7^;L z-h2$>VfTrjd&b?BBFQeiLoh$*vE$shgs`})rK~gr^po;)uYwxv;a9RYkphfzrW`5v z3B7+BAN|Bwq)r~!+lR3j0K_#t)#b@NFv6l&-s4+y!^iak_q+@V*Rab89hVC_JsRc) zDj_{6s4P|8_xI9B08R34QR2BPJwqWz$aEoSsO^kQ6qess2nKYagc$o&uSVf`|fze}fGhFU9wo1X`^wj7;!|5!qBZF^pe&1<{bTG+xX zEH=-v*nB1~|3aI#u-Lo_$ARKdA8kwr1tr_`%Tlv4iwk=evXE0yI?@bfHY(&I5k>F0 z2m%^E!DJ>J2ao&X3R~wO=lIB8gDk!I}t&*GSR&mo| zp~ci|RoAe!k7O&TYn+~=YSQ* z{(C*i%M5GQpeCtj13rG1Xv-9$^pZR_N?uusms>_<)rNy&nCTGm5nNvA? zx_c;oEz#`Z_~KhVA^9v#z|`Vwr8c&#j1~~uN#+W9StzaR3Cc=pP)6vRu?63E{=W^2 z*b)}OUzH<3WfMcQnD1fAhxHcMa=ynI+DwSQmys$fn>46+1hpOpVwZJbIDe3==0i1c z@Qr#xHb2zPN!HfX*40*5P20}O7Va9TshwSg!~5$cH|AyR*t#x z)hGi})Bbuz@=HZ|WpZXk)$FPn^|~v~r%q)1Mo5ixP?v}*^{uf2jZaMp#T??v9xZuU z1!gWYv5GIJ0t@*V$_JKHKW6MHFIW^&#stJz5Nx0Srv8F)idg~ zAcRvyq%XCTWPi=uXo0a}z*-g9B0;q1O#LMo0t;1>!bz$);Urb3S3~;z9mvHpm>SGv zm#sp!?B!%%&Qtb&u&*qPuSs{M$Usj1&3!&F)u^22YTJ@j!?O0}8G48OmB-|s zT?AzVBFm>hZO*c`-pM(*WvC7s+-T7s9Dm%nbVa(eslWJn(&%n$!I9Z5xZUR*$cEnG zKwfxQ+iRQL2u#l4!cwhB)KxmHYjEzBkvZ;nR3R9l!2`}{@F-NGanA-tjq|mAA!o9b zl{Y9n=egUZIA`l5I~Q7#s?TXgQGYq~Sl0R-E&PG!?eaG<3G!=`#AvPO!B zO(SUd@5}2z9#Hhs(!K~vlMQ_Yqk%`4FUh2ACJluWaxzyjEz2yEl`+FEN>v z;`Haqdc75s@>R5s_LepXIvGH7v2<4?*3QnUpI%!#OSc<&C0-P)XaU)pCLes8_(Uso zQ<=zTd8rbXxX;Lf>$tI%z95Ge;svLH2IgGR-XCAPP7y%}a&YtJ>XC{lc*Hr>-fj#%3xiRHH_< zyPAqRJ|zn`HGSNy#R^6e&ZyN~IVsO{h~zHDdJBXv3V$&9#ww?LGf3|hP+qyjtFQev zGy@T;jaBF#dayYAnm)M_!NA3uK5#EIi4`G9baEiFCnxZ@IuaTCTJKTbX^ES?n`=TyWVs6B6{<6P&cIi{%- z`%;%@%ulB)<~SR7vcHU7JkmL)i7lIwQ|y;JKH@m1?(8`6=?WPIE9s1^IHt2HolRRT z$N3eUKQ}lQnsk!MV}fYT5PbYnjpN*ihX%m_ztVMKe#E=o;1G`{IkGgF3-4Qb;@zDm z-gooF`(d7V_veZCV4ir7+C*H6BUvpOiA60er@34eGSQ2(w2SoOSY+?wI zg(N^qLUsWi7-o4%24*tD%w$unD10g(BHBV}-GIV}h*T+}V67Hcw1PWo6@SpWU{w@F zK3Z!{|L4B<=FOeVkjD&uzwiBiGw;1~&pG$rbI(2Z-1X_idsipk2RiXi=*0U-C*CQY zcwgwm`&uX7S)F+2b>jU?CtjOQyw1gPJyZW9)wgas@e*|6_0fsfPbc0Wop?ia;*Hda zcezfyaXRrP>BO6&6E8z2-c>sBrt8GZ)rnW26K{@Aym>nD%5>sY>BL(Q4$lvVQLR|G zFG0h1E%2WBnGEcKn~{|-RodTb6?G{dhNB%1zNr00Q$NLpkFM2X+qqrxU|+S=U~A1D zP5pqG0$)@XG)Z1benYWH#pglV<5ENg~! znk7w2%aSsz<3<~&6c)|SuPLc6DV~)*+U0AqdAxo*!2kafTUvEB#8McNg|d>u`T3Jx!rY6 zDcS0kEXzF>yUCl8mSwUwI-GVB_q9xJ>oN%0XR2$&hrV%$fTN)<1u&M)W+WMmjCEsu z5L5RSL*O1LQRDc^3C1#f&B^7s4rE4}u5vgfFPj`UGl|)n?a?NX*_=dL?seDU!{bIc zvy#uGMSHcw*JyDXtNe|2huaACFzd$iJNvO!NhcB?Vj zW=w8yV-Jkmn0$>ZJv9|KTXr+L!d|mK87~fFa%rL6m^`P_m|Qg1M}Ht$kYP-2&d7vs zEZ?)H8IucZ<`)-~6&B%XLGk>IblfYd%_aGjbBbmcmlT<+YRb#YDywDioSI@Y6j**K zD61^e-m2$T7UdUe=*6~dQ-$A@nQ~=HYBEwdEj2wg!{opxlp5_4LJHho$(Y;`)|^J< zRNy9SuFvU!AZS z+gMdNPt~K*NZ1ASEZ^pLG)Wb)6j88Aa=ByCm|#wk_1d-E=aFna7{OXgqZ28g?T%K# zgCkU}DI_);{Pc?)7A(KIq;z(Hsd#=tNljr93H_p3=%hv2`b-NPn0RUSnVP1iqy?39 zb-6KlAw#95pGj756IyhR8{A0PYz#&+S`%+ltt=WBb`HNW^q^c1<8Hz)UU`427h{Qd zR@=ar@m$Ulc^jypFrp!xt@wR76o33Ogj9;`Y#7(VD&EY=&(-b)@+%w0`X*AWVXm%> z^3r5+)?|1lsq57$cFefdK46;QtJk0ZK#4db4RsEegMX0-4_LP~LX{ zw-ZBa&e*s3<; z-tj8(x&CQnY$WTMWFQ6O7p7e8%C~$<;jUWhBq&9Q5wvDOkmDFP6Q8W2FFL;)tJtG^NlV;oIM2&I-{G7yxfMNMrdg2+)5M>#nPk_;Zo z;*-V?W0=6KtgbGeg;|0Er^V;X_j)a@Y%~H-fbj)tCz}YIQ(({zM=@M-t*!ApoIW-L zxN|770{TR(#p;x*(G!v5N=Dc~gpD!#!lh-58C@f4 zj*4ahpl0C#E2OD$PAVl!D{z|HB)D@M37^&h| zG!~q3U`5A_Cbz?$!$u%*-hf~#v$d7Ft_txL2!A4w>>3=GWY|gk*8e5T!5YBZxdCJO??c0<&u_5wq-UADm}zD_cYvy<|+yRh%nV z3swQvyM`#4$4AI0+t$Wftz0i&1jE2`WIu(aypn-RT~-@jqR*jS2q{sLY7UzK(t~P= zX~oS0v$MUD70!%OxWj?^A}TxQgLzP`Olew^*$`Z==1ZONoWYSD4W33#aY+Rxhh&mY z1PXznzKcl4u{rE2MDoQzB@MFXC?e#EY_BgoBhZpu5WcFW?ji^S8c_rWhoWL2ls*aZ zeN~8*IHg`FGEPJ=ECOUqYT>S}W&Hu!tP)T|YP0zKXkg=$9#@Oa-RKXMFE8|dYW>z! zqS{ht_OmNN{g_Ivd%l{@1lj$UDZ*DOtf0A+pU6c(S~^fQca8>Z@WUXA#aq|tLhXP% z5uems)l##px@O>n)OeY_rl_KdkUemN(LHKGH8i@+kWE-7m!$3?!oG;`v?>;JS)=-Hb5a`n#w_6aq4itW>g{TQG-6oNTkCW;D=pA01b(3siq$!czD=g~A>=QIH*oc8^GLcIIIxF%4u4dGv;&FB zl3+s(I>=t1#mQT#8ERt`biN9=1KY#f=L;(#*?~VqK`7XPhoWL2*a0fcC2G!s)m=-z zrsM=8)gB0<>(%DhTe0$-Y#xWZ!0cKK_amO3B194O1fq7*i|T&-paD##`S>6Vbn5n4mJ7kdLouov|;91Znu-G75Z(m*HG*B z($d?2ufx5;aln6F&2zAoB+S}HsLAsOeE*Qb(Wc`?@A@}nM6l<`UafQLfIG&A!0&jwNxsndbM znE0f{0ZB$e3voJ2K=f6F=2A>^hh>ezq?BG8NP@N~&e70-)z#|4JoNj4rj~=&W|8M^ zQPUF6|GD@Ck$2}+Yor++X6hZYv4D0_>rCXe-MkSUswODVxQnUC;l4Ux7dL*~{F2B%QVTa?Md7~THL7GIq6G>!G>y{`%O_&13cDxwj4otR zQKsZFXY))DzQ^t3J*-dFY^fd~&k^s9T(q%AB-HW!QPqg{-5Kt5mIjrCxlRi2bY2p* zL4rz=pgTopP!pIaT|E_p+{D+^{E6-u>xZx}0%6e6SFbX)vZ|gO`LVoXFj7sqxwH}M3NTz5pLC96le554&ZzZY9v|agb05_` zl3@_B#U}ZAuP!Y#h?@?XctF`o}j#2Q5$a8;CEjZrd%DqAILT^=V zv#LDQ>(y$-h1^9d+Q(F-MrTlFO2+D?P$*G1P`fDt;Ak%>9O z_@vvp+}uv5+Jq%iK81-aUY02UmlT+b3wi&I3nMhAnmE#V8_qcaNn}Qfm(Wp8)28u8 z_BKi!I8@hr-Oa`1$dhkMoh3-k?x?MWS>g75;`VI~#MG^WE~iCCyen)gGhVE9I*M zTwKqF!9fBwBwAeA9e&31cT7Jn5V2GNjdaEhipLy+ZJQ>vw0ug7#Gfj3 zEFm9c;Kl|irP=0)=7us%)m|}gRQ;%0VfIF@S*miotbBM7Ss*L=9eQzQS~tRr>ua7N zC8mHS3R_%MGx!{MSZtPnV3Iej0OT(e5s!yrT}4%|yma<_9@LkzU0zzq#lD%Fj3#WT zvGI2*QnON~B=hqf%KXYeJvNuhd6nCQ?%<@f2~aWKbBDOT!|xv`Y6I?xhIM;?_x^&K zO_ir#EWT#&_KH)C<#YJb!;LC;%${L5==|IFAe9RBXpom2a~mGHm^O}*a8 z`goF+vBMm`WM~Crn|}0W+ zRJ;Dzu)>26GS;&b@y{@&jJMzW`kr6?YySgJ{^hUZ87t-RL*IS-w!5&n+11PNN$&Zs zHpcGY@O_`AAD{B>=cYc16W_bJ*Y9>Q_6CPvo<8F4ts9auZ#a4M(aeP_KV~ecGx0y> zN%{NnyZXM{Z}NuKgRif7h_U4y{`T%~h8_5O+|yY%yu^P zXwtMRo^suT<+fjP_}*>r_I`Ttnu5OXZfv`;;luTeO+pzY8dAE=OrGAW<-0du8F|ya zOHV(;*fI`(@W8OO`>(Lh+u41{kfjTDy@oAJ9Nsqi^8-Ko{PltPM{fMzx)1zMGj^K8 zU*7G=zdNz+AM+M|C9SfZI?31+tjS3B>J(F|3?WaeB$y@mL$~=5X7#`}SYE z@)@)&ziAyQjkt-iM>u@h{SQ8Q&f)yZnl$%}vuyA$89T$_l|ApvT6*o+kCM8++V`;) zTb^Vr8LOQV4ZAnaEBj;oiVv4&7xoywVl~q5=J0^^>(%|DuJl)NaIo!(aRNeQEbzdA6$FeEr&- zPQN+<9#}AyXxKLPy}u2AXXB>)S07FN_ah%8Uu7IV|M_3<|7tJ$>})5~$kknourO-_ zhbJ|Td9Uq>_ZClo`u&Gr+uZd{@aOP;Cr5N%+Svk1KBYcF|iquU|98efN?{#~xv9 zK8Ld%-a(tX%>Dej^S|`WSvg<_($C>pC!TrsDi-%b?wMWnU#(sVeS4k5JMUOCWb1%? z@3DOIX17B}2TP1iKpcq%cKq=9M~^rrUf=rWOAmax4_j_jj8#a0O#KIsChuOZIij z81cxca^JnZ>oQ8Q#gM~qD!t{gogVQendgio+ds{G2+5 z=$px}h)DuAuOCa$Bv%ZHXi=NRXjOr{T;8rm%b>}EHOsLSqnd>nq`-%JWcsK!pme;n zI9lnnV6B1^hcHI1rLodu$f_1QU!qOFjrS{~C&zXtYh4T_i%Kfb4n>^=ZE`7E8MGh~ z(DA5KKz1q?dYL>1AxiZz5C`TwqRxK{bdW~kqGup?FQcYM0r07SXca&vzqIy6=4qzt z?Mp^88dC|`vBoPV1~G|8nR1G{c$6{LsOh0zQPWc6Lkni2RSoO~BQGXudOCzZmd3LY zi@7XVcpXFOlX-GFtWjq{CXXQjE@9=G7^b4^%F_!qT;Lg%uakl!f71`%*^xE*+;KnLD zZ1Rq!#cNHwV50)CtN?6A z0CpRm&>hF`cIBxD!yLL%neIj*GEC~EV!v4nhC%5mGt5&uU=&7o87ml~hD5p}dVW!O z7F(#qBHq&#crT>=K;P7zlaE_2+PB7 z6=R2p35^{P3|BBuiZA#b1&MLl04X!#nJyKlX5E*ozcg(lP{s>ui+(sBNv%Y8-XyRq)y3!r1UpA~Q-LbAHeqHGg8Am@O+;yKUe(uN- zp5E%<^zPw-KVf=DtuNi%KD~Q`)4PYKcTcwfY`}o;A9lS_bZ-0nKQ$bGzxi;| zEQ%X0QBCfE!r-z(Md4E29}mj4l->r@A1=b_Bv8R52T`qisrzn?>MA0^MK~fAm5ZE0 z3SY3;_S7S#VjoMuov=ei4pHg(2D? zs+>pCw`x=v^5qxdh*V_hwG^KJZ0;_N3KIwXA{>zl!>K`3G8SnEU7yQ0OqhjIVNf-Q zN-Qs$@u7=w#JI?0YAF=UYl=ceI3iUafl4f|MG6(+h*V^AwYbFc`Y(lwa73ykfl4f| zy$TiKh*Ve^6%?0PUdI(G!V#(Z2~;x|_P>WPZ_Ko>5nfutx+W_RD>f^ zk+IjPu3GjiQl-XKqdX9fNQL45AgYG9*PyzqRI8K+!V#$k2~@{-bw_1Vsdg$4gd zE!R?bu%aInL8UsPJP?jZg=LFDRG#f)F{P?feXBeWj!1>IbwN}oXP0JaR3pix;UXN7 z3X_mQRCj)|e2hjlN1-AdkqQY4qB^wxZjVOgRj3F@q#7XCduOp7YRa|#vVh*U;_N|eSZGVr*J_=!}b0MSy27hGyw z^A#$>5vfK4qEU&~rdgpP9FgjBfl9PCTNEn75vj%qRHC(cNueSfk?IP8O0*ki6e_|I zsm2OaV!nn_bBBv?M5=LsXwne#m8Vb!wvOp!;!#HaEaS@J4l?;d`L(yVqC{%7!HV(g;lu2&S!X{ft$&WgwtQZ5;?sU75jc91^=AS$0@fb0bynRD== zbQFDO!%`&0NQX!zdp+*vG_Ph>?3#Q9K? z-{PeYdW9v%IHu%v*dhhfbY-M4mwaf5FH$&q-I0PCkg7;wzU2;2GiQp0&(=Ur7i5~% z?TmT&A`tS8{iuGd@ghDQVR}507aO#BoE_leAc|(1c+kO?Q2Cb$bmQvDmQ(qfcn9h9 zsvq|401s2{k{4rII?{;k&^oZ(HvToI4x+7>T6FO8+2~X>N3E=Y9k8r*v`BUxOc6CU zOv~S#>VTycTOln@PrXG4TWkZs$^jjS7W=YBpTE{2IrXHLbWJZV&z4?foH=8+I>MF} zq(VD~m3kz(Yjxq#UIJZ+Fk!mzus_vnC$8ayDyC8XzH4Y{s+**hj9?R8I8Gs0iY4uU zm&N1J!3(Q{8^YF^kT`K_kqv9qWgFf>%)s?Z9w#;y=|}+10a1*52VAXET{w2iMs!7h z*x=AH5)Ml37>QPZ22Lf*)6Of)3poiXFRuz8%E5{Ls0M*e)xggk6SU!^gHKn}Cz2@! ze3V)J)(rosWDG3%XI*E_3Gg%fl*LPCADU?S2q7%cz|lYM +#include +#include +#include + +#include +#include +#include +#include + +#include "client/linux/handler/exception_handler.h" +#include "common/linux/guid_creator.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Signals that we are interested. +int SigTable[] = { +#if defined(SIGSEGV) + SIGSEGV, +#endif +#ifdef SIGABRT + SIGABRT, +#endif +#ifdef SIGFPE + SIGFPE, +#endif +#ifdef SIGILL + SIGILL, +#endif +#ifdef SIGBUS + SIGBUS, +#endif +}; + +std::vector *ExceptionHandler::handler_stack_ = NULL; +int ExceptionHandler::handler_stack_index_ = 0; +pthread_mutex_t ExceptionHandler::handler_stack_mutex_ = +PTHREAD_MUTEX_INITIALIZER; + +ExceptionHandler::ExceptionHandler(const string &dump_path, + FilterCallback filter, + MinidumpCallback callback, + void *callback_context, + bool install_handler) + : filter_(filter), + callback_(callback), + callback_context_(callback_context), + dump_path_(), + installed_handler_(install_handler) { + set_dump_path(dump_path); + + act_.sa_handler = HandleException; + act_.sa_flags = SA_ONSTACK; + sigemptyset(&act_.sa_mask); + // now, make sure we're blocking all the signals we are handling + // when we're handling any of them + for ( size_t i = 0; i < sizeof(SigTable) / sizeof(SigTable[0]); ++i) { + sigaddset(&act_.sa_mask, SigTable[i]); + } + + if (install_handler) { + SetupHandler(); + pthread_mutex_lock(&handler_stack_mutex_); + if (handler_stack_ == NULL) + handler_stack_ = new std::vector; + handler_stack_->push_back(this); + pthread_mutex_unlock(&handler_stack_mutex_); + } +} + +ExceptionHandler::~ExceptionHandler() { + TeardownAllHandler(); + pthread_mutex_lock(&handler_stack_mutex_); + if (handler_stack_->back() == this) { + handler_stack_->pop_back(); + } else { + fprintf(stderr, "warning: removing Breakpad handler out of order\n"); + for (std::vector::iterator iterator = + handler_stack_->begin(); + iterator != handler_stack_->end(); + ++iterator) { + if (*iterator == this) { + handler_stack_->erase(iterator); + } + } + } + + if (handler_stack_->empty()) { + // When destroying the last ExceptionHandler that installed a handler, + // clean up the handler stack. + delete handler_stack_; + handler_stack_ = NULL; + } + pthread_mutex_unlock(&handler_stack_mutex_); +} + +bool ExceptionHandler::WriteMinidump() { + bool success = InternalWriteMinidump(0, 0, NULL); + UpdateNextID(); + return success; +} + +// static +bool ExceptionHandler::WriteMinidump(const string &dump_path, + MinidumpCallback callback, + void *callback_context) { + ExceptionHandler handler(dump_path, NULL, callback, + callback_context, false); + return handler.InternalWriteMinidump(0, 0, NULL); +} + +void ExceptionHandler::SetupHandler() { + // Signal on a different stack to avoid using the stack + // of the crashing thread. + struct sigaltstack sig_stack; + sig_stack.ss_sp = malloc(MINSIGSTKSZ); + if (sig_stack.ss_sp == NULL) + return; + sig_stack.ss_size = MINSIGSTKSZ; + sig_stack.ss_flags = 0; + + if (sigaltstack(&sig_stack, NULL) < 0) + return; + for (size_t i = 0; i < sizeof(SigTable) / sizeof(SigTable[0]); ++i) + SetupHandler(SigTable[i]); +} + +void ExceptionHandler::SetupHandler(int signo) { + + // We're storing pointers to the old signal action + // structure, rather than copying the structure + // because we can't count on the sa_mask field to + // be scalar. + struct sigaction *old_act = &old_actions_[signo]; + + if (sigaction(signo, &act_, old_act) < 0) + return; +} + +void ExceptionHandler::TeardownHandler(int signo) { + TeardownHandler(signo, NULL); +} + +void ExceptionHandler::TeardownHandler(int signo, struct sigaction *final_handler) { + if (old_actions_[signo].sa_handler) { + struct sigaction *act = &old_actions_[signo]; + sigaction(signo, act, final_handler); + memset(&old_actions_[signo], 0x0, sizeof(struct sigaction)); + } +} + +void ExceptionHandler::TeardownAllHandler() { + for (size_t i = 0; i < sizeof(SigTable) / sizeof(SigTable[0]); ++i) { + TeardownHandler(SigTable[i]); + } +} + +// static +void ExceptionHandler::HandleException(int signo) { + // In Linux, the context information about the signal is put on the stack of + // the signal handler frame as value parameter. For some reasons, the + // prototype of the handler doesn't declare this information as parameter, we + // will do it by hand. It is the second parameter above the signal number. + // However, if we are being called by another signal handler passing the + // signal up the chain, then we may not have this random extra parameter, + // so we may have to walk the stack to find it. We do the actual work + // on another thread, where it's a little safer, but we want the ebp + // from this frame to find it. + uintptr_t current_ebp = 0; + asm volatile ("movl %%ebp, %0" + :"=m"(current_ebp)); + + pthread_mutex_lock(&handler_stack_mutex_); + ExceptionHandler *current_handler = + handler_stack_->at(handler_stack_->size() - ++handler_stack_index_); + pthread_mutex_unlock(&handler_stack_mutex_); + + // Restore original handler. + struct sigaction old_action; + current_handler->TeardownHandler(signo, &old_action); + + struct sigcontext *sig_ctx = NULL; + if (current_handler->InternalWriteMinidump(signo, current_ebp, &sig_ctx)) { + // Fully handled this exception, safe to exit. + exit(EXIT_FAILURE); + } else { + // Exception not fully handled, will call the next handler in stack to + // process it. + if (old_action.sa_handler != NULL && sig_ctx != NULL) { + + // Have our own typedef, because of the comment above w.r.t signal + // context on the stack + typedef void (*SignalHandler)(int signo, struct sigcontext); + + SignalHandler old_handler = + reinterpret_cast(old_action.sa_handler); + + sigset_t old_set; + // Use SIG_BLOCK here because we don't want to unblock a signal + // that the signal handler we're currently in needs to block + sigprocmask(SIG_BLOCK, &old_action.sa_mask, &old_set); + old_handler(signo, *sig_ctx); + sigprocmask(SIG_SETMASK, &old_set, NULL); + } + + } + + pthread_mutex_lock(&handler_stack_mutex_); + current_handler->SetupHandler(signo); + --handler_stack_index_; + // All the handlers in stack have been invoked to handle the exception, + // normally the process should be terminated and should not reach here. + // In case we got here, ask the OS to handle it to avoid endless loop, + // normally the OS will generate a core and termiate the process. This + // may be desired to debug the program. + if (handler_stack_index_ == 0) + signal(signo, SIG_DFL); + pthread_mutex_unlock(&handler_stack_mutex_); +} + +bool ExceptionHandler::InternalWriteMinidump(int signo, + uintptr_t sighandler_ebp, + struct sigcontext **sig_ctx) { + if (filter_ && !filter_(callback_context_)) + return false; + + bool success = false; + // Block all the signals we want to process when writting minidump. + // We don't want it to be interrupted. + sigset_t sig_blocked, sig_old; + bool blocked = true; + sigfillset(&sig_blocked); + for (size_t i = 0; i < sizeof(SigTable) / sizeof(SigTable[0]); ++i) + sigdelset(&sig_blocked, SigTable[i]); + if (sigprocmask(SIG_BLOCK, &sig_blocked, &sig_old) != 0) { + blocked = false; + fprintf(stderr, "google_breakpad::ExceptionHandler::HandleException: " + "failed to block signals.\n"); + } + + success = minidump_generator_.WriteMinidumpToFile( + next_minidump_path_c_, signo, sighandler_ebp, sig_ctx); + + // Unblock the signals. + if (blocked) { + sigprocmask(SIG_SETMASK, &sig_old, NULL); + } + + if (callback_) + success = callback_(dump_path_c_, next_minidump_id_c_, + callback_context_, success); + return success; +} + +void ExceptionHandler::UpdateNextID() { + GUID guid; + char guid_str[kGUIDStringLength + 1]; + if (CreateGUID(&guid) && GUIDToString(&guid, guid_str, sizeof(guid_str))) { + next_minidump_id_ = guid_str; + next_minidump_id_c_ = next_minidump_id_.c_str(); + + char minidump_path[PATH_MAX]; + snprintf(minidump_path, sizeof(minidump_path), "%s/%s.dmp", + dump_path_c_, + guid_str); + + next_minidump_path_ = minidump_path; + next_minidump_path_c_ = next_minidump_path_.c_str(); + } +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/linux/handler/exception_handler.h b/thirdparty/google-breakpad/r318/src/client/linux/handler/exception_handler.h new file mode 100644 index 00000000..6ea09a11 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/linux/handler/exception_handler.h @@ -0,0 +1,226 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Author: Li Liu +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H__ +#define CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H__ + +#include + +#include +#include +#include +#include + +#include "client/linux/handler/minidump_generator.h" + +// Context information when exception occured. +struct sigcontex; + +namespace google_breakpad { + +using std::string; + +// +// ExceptionHandler +// +// ExceptionHandler can write a minidump file when an exception occurs, +// or when WriteMinidump() is called explicitly by your program. +// +// To have the exception handler write minidumps when an uncaught exception +// (crash) occurs, you should create an instance early in the execution +// of your program, and keep it around for the entire time you want to +// have crash handling active (typically, until shutdown). +// (NOTE): There should be only be one this kind of exception handler +// object per process. +// +// If you want to write minidumps without installing the exception handler, +// you can create an ExceptionHandler with install_handler set to false, +// then call WriteMinidump. You can also use this technique if you want to +// use different minidump callbacks for different call sites. +// +// In either case, a callback function is called when a minidump is written, +// which receives the unqiue id of the minidump. The caller can use this +// id to collect and write additional application state, and to launch an +// external crash-reporting application. +// +// Caller should try to make the callbacks as crash-friendly as possible, +// it should avoid use heap memory allocation as much as possible. +// +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. context is the parameter supplied by the user as + // callback_context when the handler was created. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, + // Breakpad will immediately report the exception as unhandled without + // writing a minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void *context); + + // A callback function to run after the minidump has been written. + // minidump_id is a unique id for the dump, so the minidump + // file is \.dmp. context is the parameter supplied + // by the user as callback_context when the handler was created. succeeded + // indicates whether a minidump file was successfully written. + // + // If an exception occurred and the callback returns true, Breakpad will + // treat the exception as fully-handled, suppressing any other handlers from + // being notified of the exception. If the callback returns false, Breakpad + // will treat the exception as unhandled, and allow another handler to handle + // it. If there are no other handlers, Breakpad will report the exception to + // the system as unhandled, allowing a debugger or native crash dialog the + // opportunity to handle the exception. Most callback implementations + // should normally return the value of |succeeded|, or when they wish to + // not report an exception of handled, false. Callbacks will rarely want to + // return true directly (unless |succeeded| is true). + typedef bool (*MinidumpCallback)(const char *dump_path, + const char *minidump_id, + void *context, + bool succeeded); + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Before writing a minidump, the optional filter callback will be called. + // Its return value determines whether or not Breakpad should write a + // minidump. Minidump files will be written to dump_path, and the optional + // callback is called after writing the dump file, as described above. + // If install_handler is true, then a minidump will be written whenever + // an unhandled exception occurs. If it is false, minidumps will only + // be written when WriteMinidump is called. + ExceptionHandler(const string &dump_path, + FilterCallback filter, MinidumpCallback callback, + void *callback_context, + bool install_handler); + ~ExceptionHandler(); + + // Get and set the minidump path. + string dump_path() const { return dump_path_; } + void set_dump_path(const string &dump_path) { + dump_path_ = dump_path; + dump_path_c_ = dump_path_.c_str(); + UpdateNextID(); + } + + // Writes a minidump immediately. This can be used to capture the + // execution state independently of a crash. Returns true on success. + bool WriteMinidump(); + + // Convenience form of WriteMinidump which does not require an + // ExceptionHandler instance. + static bool WriteMinidump(const string &dump_path, + MinidumpCallback callback, + void *callback_context); + + private: + // Setup crash handler. + void SetupHandler(); + // Setup signal handler for a signal. + void SetupHandler(int signo); + // Teardown the handler for a signal. + void TeardownHandler(int signo); + // Teardown the handler for a signal. + void TeardownHandler(int signo, struct sigaction *old); + // Teardown all handlers. + void TeardownAllHandler(); + + // Signal handler. + static void HandleException(int signo); + + // If called from a signal handler, sighandler_ebp is the ebp of + // that signal handler's frame, and sig_ctx is an out parameter + // that will be set to point at the sigcontext that was placed + // on the stack by the kernel. You can pass zero and NULL + // for the second and third parameters if you are not calling + // this from a signal handler. + bool InternalWriteMinidump(int signo, uintptr_t sighandler_ebp, + struct sigcontext **sig_ctx); + + // Generates a new ID and stores it in next_minidump_id, and stores the + // path of the next minidump to be written in next_minidump_path_. + void UpdateNextID(); + + private: + FilterCallback filter_; + MinidumpCallback callback_; + void *callback_context_; + + // The directory in which a minidump will be written, set by the dump_path + // argument to the constructor, or set_dump_path. + string dump_path_; + + // The basename of the next minidump to be written, without the extension + string next_minidump_id_; + + // The full pathname of the next minidump to be written, including the file + // extension + string next_minidump_path_; + + // Pointers to C-string representations of the above. These are set + // when the above are set so we can avoid calling c_str during + // an exception. + const char *dump_path_c_; + const char *next_minidump_id_c_; + const char *next_minidump_path_c_; + + // True if the ExceptionHandler installed an unhandled exception filter + // when created (with an install_handler parameter set to true). + bool installed_handler_; + + // The global exception handler stack. This is need becuase there may exist + // multiple ExceptionHandler instances in a process. Each will have itself + // registered in this stack. + static std::vector *handler_stack_; + // The index of the handler that should handle the next exception. + static int handler_stack_index_; + static pthread_mutex_t handler_stack_mutex_; + + // The minidump generator. + MinidumpGenerator minidump_generator_; + + // disallow copy ctor and operator= + explicit ExceptionHandler(const ExceptionHandler &); + void operator=(const ExceptionHandler &); + + // The sigactions structure we use for each signal + struct sigaction act_; + + + // Keep the previous handlers for the signal. + // We're wasting a bit of memory here since we only change + // the handler for some signals but i want to avoid allocating + // memory in the signal handler + struct sigaction old_actions_[NSIG]; +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/linux/handler/exception_handler_test.cc b/thirdparty/google-breakpad/r318/src/client/linux/handler/exception_handler_test.cc new file mode 100644 index 00000000..2d94553d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/linux/handler/exception_handler_test.cc @@ -0,0 +1,124 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Author: Li Liu +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include + +#include +#include +#include +#include + +#include "client/linux/handler/exception_handler.h" +#include "client/linux/handler/linux_thread.h" + +using namespace google_breakpad; + +// Thread use this to see if it should stop working. +static bool should_exit = false; + +static int foo2(int arg) { + // Stack variable, used for debugging stack dumps. + /*DDDebug*/printf("%s:%d\n", __FUNCTION__, __LINE__); + int c = 0xcccccccc; + fprintf(stderr, "Thread trying to crash: %x\n", getpid()); + c = *reinterpret_cast(0x5); + return c; +} + +static int foo(int arg) { + // Stack variable, used for debugging stack dumps. + int b = 0xbbbbbbbb; + b = foo2(b); + return b; +} + +static void *thread_crash(void *) { + // Stack variable, used for debugging stack dumps. + int a = 0xaaaaaaaa; + sleep(1); + a = foo(a); + printf("%x\n", a); + return NULL; +} + +static void *thread_main(void *) { + while (!should_exit) + sleep(1); + return NULL; +} + +static void CreateCrashThread() { + pthread_t h; + pthread_create(&h, NULL, thread_crash, NULL); + pthread_detach(h); +} + +// Create working threads. +static void CreateThread(int num) { + pthread_t h; + for (int i = 0; i < num; ++i) { + pthread_create(&h, NULL, thread_main, NULL); + pthread_detach(h); + } +} + +// Callback when minidump written. +static bool MinidumpCallback(const char *dump_path, + const char *minidump_id, + void *context, + bool succeeded) { + int index = reinterpret_cast(context); + printf("%d %s: %s is dumped\n", index, __FUNCTION__, minidump_id); + if (index == 0) { + should_exit = true; + return true; + } + // Don't process it. + return false; +} + +int main(int argc, char *argv[]) { + int handler_index = 0; + ExceptionHandler handler_ignore(".", NULL, MinidumpCallback, + (void*)handler_index, true); + ++handler_index; + ExceptionHandler handler_process(".", NULL, MinidumpCallback, + (void*)handler_index, true); + CreateCrashThread(); + CreateThread(10); + + while (true) + sleep(1); + should_exit = true; + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread.cc b/thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread.cc new file mode 100644 index 00000000..c8ac4926 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread.cc @@ -0,0 +1,411 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Author: Li Liu +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "client/linux/handler/linux_thread.h" + +using namespace google_breakpad; + +// This unamed namespace contains helper function. +namespace { + +// Context information for the callbacks when validating address by listing +// modules. +struct AddressValidatingContext { + uintptr_t address; + bool is_mapped; + + AddressValidatingContext() : address(0UL), is_mapped(false) { + } +}; + +// Convert from string to int. +bool LocalAtoi(char *s, int *r) { + assert(s != NULL); + assert(r != NULL); + char *endptr = NULL; + int ret = strtol(s, &endptr, 10); + if (endptr == s) + return false; + *r = ret; + return true; +} + +// Fill the proc path of a thread given its id. +void FillProcPath(int pid, char *path, int path_size) { + char pid_str[32]; + snprintf(pid_str, sizeof(pid_str), "%d", pid); + snprintf(path, path_size, "/proc/%s/", pid_str); +} + +// Read thread info from /proc/$pid/status. +bool ReadThreadInfo(int pid, ThreadInfo *info) { + assert(info != NULL); + char status_path[80]; + // Max size we want to read from status file. + static const int kStatusMaxSize = 1024; + char status_content[kStatusMaxSize]; + + FillProcPath(pid, status_path, sizeof(status_path)); + strcat(status_path, "status"); + int fd = open(status_path, O_RDONLY, 0); + if (fd < 0) + return false; + + int num_read = read(fd, status_content, kStatusMaxSize - 1); + if (num_read < 0) { + close(fd); + return false; + } + close(fd); + status_content[num_read] = '\0'; + + char *tgid_start = strstr(status_content, "Tgid:"); + if (tgid_start) + sscanf(tgid_start, "Tgid:\t%d\n", &(info->tgid)); + else + // tgid not supported by kernel?? + info->tgid = 0; + + tgid_start = strstr(status_content, "Pid:"); + if (tgid_start) { + sscanf(tgid_start, "Pid:\t%d\n" "PPid:\t%d\n", &(info->pid), + &(info->ppid)); + return true; + } + return false; +} + +// Callback invoked for each mapped module. +// It use the module's adderss range to validate the address. +bool IsAddressInModuleCallback(const ModuleInfo &module_info, + void *context) { + AddressValidatingContext *addr = + reinterpret_cast(context); + addr->is_mapped = ((addr->address >= module_info.start_addr) && + (addr->address <= module_info.start_addr + + module_info.size)); + return !addr->is_mapped; +} + +#if defined(__i386__) && !defined(NO_FRAME_POINTER) +void *GetNextFrame(void **last_ebp) { + void *sp = *last_ebp; + if ((unsigned long)sp == (unsigned long)last_ebp) + return NULL; + if ((unsigned long)sp & (sizeof(void *) - 1)) + return NULL; + if ((unsigned long)sp - (unsigned long)last_ebp > 100000) + return NULL; + return sp; +} +#else +void *GetNextFrame(void **last_ebp) { + return reinterpret_cast(last_ebp); +} +#endif + +// Suspend a thread by attaching to it. +bool SuspendThread(int pid, void *context) { + // This may fail if the thread has just died or debugged. + errno = 0; + if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) != 0 && + errno != 0) { + return false; + } + while (waitpid(pid, NULL, __WALL) < 0) { + if (errno != EINTR) { + ptrace(PTRACE_DETACH, pid, NULL, NULL); + return false; + } + } + return true; +} + +// Resume a thread by detaching from it. +bool ResumeThread(int pid, void *context) { + return ptrace(PTRACE_DETACH, pid, NULL, NULL) >= 0; +} + +// Callback to get the thread information. +// Will be called for each thread found. +bool ThreadInfoCallback(int pid, void *context) { + CallbackParam *thread_callback = + reinterpret_cast *>(context); + ThreadInfo thread_info; + if (ReadThreadInfo(pid, &thread_info) && thread_callback) { + // Invoke callback from caller. + return (thread_callback->call_back)(thread_info, thread_callback->context); + } + return false; +} + +} // namespace + +namespace google_breakpad { + +LinuxThread::LinuxThread(int pid) : pid_(pid) , threads_suspened_(false) { +} + +LinuxThread::~LinuxThread() { + if (threads_suspened_) + ResumeAllThreads(); +} + +int LinuxThread::SuspendAllThreads() { + CallbackParam callback_param(SuspendThread, NULL); + int thread_count = 0; + if ((thread_count = IterateProcSelfTask(pid_, &callback_param)) > 0) + threads_suspened_ = true; + return thread_count; +} + +void LinuxThread::ResumeAllThreads() const { + CallbackParam callback_param(ResumeThread, NULL); + IterateProcSelfTask(pid_, &callback_param); +} + +int LinuxThread::GetThreadCount() const { + return IterateProcSelfTask(pid_, NULL); +} + +int LinuxThread::ListThreads( + CallbackParam *thread_callback_param) const { + CallbackParam callback_param(ThreadInfoCallback, + thread_callback_param); + return IterateProcSelfTask(pid_, &callback_param); +} + +bool LinuxThread::GetRegisters(int pid, user_regs_struct *regs) const { + assert(regs); + return (regs != NULL && + (ptrace(PTRACE_GETREGS, pid, NULL, regs) == 0) && + errno == 0); +} + +// Get the floating-point registers of a thread. +// The caller must get the thread pid by ListThreads. +bool LinuxThread::GetFPRegisters(int pid, user_fpregs_struct *regs) const { + assert(regs); + return (regs != NULL && + (ptrace(PTRACE_GETREGS, pid, NULL, regs) ==0) && + errno == 0); +} + +bool LinuxThread::GetFPXRegisters(int pid, user_fpxregs_struct *regs) const { + assert(regs); + return (regs != NULL && + (ptrace(PTRACE_GETFPREGS, pid, NULL, regs) != 0) && + errno == 0); +} + +bool LinuxThread::GetDebugRegisters(int pid, DebugRegs *regs) const { + assert(regs); + +#define GET_DR(name, num)\ + name->dr##num = ptrace(PTRACE_PEEKUSER, pid,\ + offsetof(struct user, u_debugreg[num]), NULL) + GET_DR(regs, 0); + GET_DR(regs, 1); + GET_DR(regs, 2); + GET_DR(regs, 3); + GET_DR(regs, 4); + GET_DR(regs, 5); + GET_DR(regs, 6); + GET_DR(regs, 7); + return true; +} + +int LinuxThread::GetThreadStackDump(uintptr_t current_ebp, + uintptr_t current_esp, + void *buf, + int buf_size) const { + assert(buf); + assert(buf_size > 0); + + uintptr_t stack_bottom = GetThreadStackBottom(current_ebp); + int size = stack_bottom - current_esp; + size = buf_size > size ? size : buf_size; + if (size > 0) + memcpy(buf, reinterpret_cast(current_esp), size); + return size; +} + +// Get the stack bottom of a thread by stack walking. It works +// unless the stack has been corrupted or the frame pointer has been omited. +// This is just a temporary solution before we get better ideas about how +// this can be done. +// +// We will check each frame address by checking into module maps. +// TODO(liuli): Improve it. +uintptr_t LinuxThread::GetThreadStackBottom(uintptr_t current_ebp) const { + void **sp = reinterpret_cast(current_ebp); + void **previous_sp = sp; + while (sp && IsAddressMapped((uintptr_t)sp)) { + previous_sp = sp; + sp = reinterpret_cast(GetNextFrame(sp)); + } + return (uintptr_t)previous_sp; +} + +int LinuxThread::GetModuleCount() const { + return ListModules(NULL); +} + +int LinuxThread::ListModules( + CallbackParam *callback_param) const { + char line[512]; + const char *maps_path = "/proc/self/maps"; + + int module_count = 0; + FILE *fp = fopen(maps_path, "r"); + if (fp == NULL) + return -1; + + uintptr_t start_addr; + uintptr_t end_addr; + while (fgets(line, sizeof(line), fp) != NULL) { + if (sscanf(line, "%x-%x", &start_addr, &end_addr) == 2) { + ModuleInfo module; + memset(&module, 0, sizeof(module)); + module.start_addr = start_addr; + module.size = end_addr - start_addr; + char *name = NULL; + assert(module.size > 0); + // Only copy name if the name is a valid path name. + if ((name = strchr(line, '/')) != NULL) { + // Get rid of the last '\n' in line + char *last_return = strchr(line, '\n'); + if (last_return != NULL) + *last_return = '\0'; + // Keep a space for the ending 0. + strncpy(module.name, name, sizeof(module.name) - 1); + ++module_count; + } + if (callback_param && + !(callback_param->call_back(module, callback_param->context))) + break; + } + } + fclose(fp); + return module_count; +} + +// Parse /proc/$pid/tasks to list all the threads of the process identified by +// pid. +int LinuxThread::IterateProcSelfTask(int pid, + CallbackParam *callback_param) const { + char task_path[80]; + FillProcPath(pid, task_path, sizeof(task_path)); + strcat(task_path, "task"); + + DIR *dir = opendir(task_path); + if (dir == NULL) + return -1; + + int pid_number = 0; + // Record the last pid we've found. This is used for duplicated thread + // removal. Duplicated thread information can be found in /proc/$pid/tasks. + int last_pid = -1; + struct dirent *entry = NULL; + while ((entry = readdir(dir)) != NULL) { + if (strcmp(entry->d_name, ".") && + strcmp(entry->d_name, "..")) { + int tpid = 0; + if (LocalAtoi(entry->d_name, &tpid) && + last_pid != tpid) { + last_pid = tpid; + ++pid_number; + // Invoke the callback. + if (callback_param && + !(callback_param->call_back)(tpid, callback_param->context)) + break; + } + } + } + closedir(dir); + return pid_number; +} + +// Check if the address is a valid virtual address. +// If the address is in any of the mapped modules, we take it as valid. +// Otherwise it is invalid. +bool LinuxThread::IsAddressMapped(uintptr_t address) const { + AddressValidatingContext addr; + addr.address = address; + CallbackParam callback_param(IsAddressInModuleCallback, + &addr); + ListModules(&callback_param); + return addr.is_mapped; +} + +bool LinuxThread::FindSigContext(uintptr_t sighandler_ebp, + struct sigcontext **sig_ctx) { + uintptr_t previous_ebp; + const int MAX_STACK_DEPTH = 10; + int depth_counter = 0; + + do { + // We're looking for a |struct sigcontext| as the second parameter + // to a signal handler function call. Luckily, the sigcontext + // has an ebp member which should match the ebp pointed to + // by the ebp of the signal handler frame. + previous_ebp = reinterpret_cast(GetNextFrame( + reinterpret_cast(sighandler_ebp))); + // The stack looks like this: + // | previous ebp | previous eip | first param | second param |, + // so we need to offset by 3 to get to the second parameter. + *sig_ctx = reinterpret_cast(sighandler_ebp + + 3 * sizeof(uintptr_t)); + sighandler_ebp = previous_ebp; + depth_counter++; + } while(previous_ebp != (*sig_ctx)->ebp && sighandler_ebp != 0 && + IsAddressMapped(sighandler_ebp) && depth_counter < MAX_STACK_DEPTH); + + return previous_ebp == (*sig_ctx)->ebp && previous_ebp != 0; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread.h b/thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread.h new file mode 100644 index 00000000..f738c2e0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread.h @@ -0,0 +1,204 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Author: Li Liu +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +#ifndef CLIENT_LINUX_HANDLER_LINUX_THREAD_H__ +#define CLIENT_LINUX_HANDLER_LINUX_THREAD_H__ + +#include +#include + +namespace google_breakpad { + +// Max module path name length. +#define kMaxModuleNameLength 256 + +// Holding information about a thread in the process. +struct ThreadInfo { + // Id of the thread group. + int tgid; + // Id of the thread. + int pid; + // Id of the parent process. + int ppid; +}; + +// Holding infomaton about a module in the process. +struct ModuleInfo { + char name[kMaxModuleNameLength]; + uintptr_t start_addr; + int size; +}; + +// Holding debug registers. +struct DebugRegs { + int dr0; + int dr1; + int dr2; + int dr3; + int dr4; + int dr5; + int dr6; + int dr7; +}; + +// A callback to run when got a thread in the process. +// Return true will go on to the next thread while return false will stop the +// iteration. +typedef bool (*ThreadCallback)(const ThreadInfo &thread_info, void *context); + +// A callback to run when a new module is found in the process. +// Return true will go on to the next module while return false will stop the +// iteration. +typedef bool (*ModuleCallback)(const ModuleInfo &module_info, void *context); + +// Holding the callback information. +template +struct CallbackParam { + // Callback function address. + CallbackFunc call_back; + // Callback context; + void *context; + + CallbackParam() : call_back(NULL), context(NULL) { + } + + CallbackParam(CallbackFunc func, void *func_context) : + call_back(func), context(func_context) { + } +}; + +/////////////////////////////////////////////////////////////////////////////// + +// +// LinuxThread +// +// Provides handy support for operation on linux threads. +// It uses ptrace to get thread registers. Since ptrace only works in a +// different process other than the one being ptraced, user of this class +// should create another process before using the class. +// +// The process should be created in the following way: +// int cloned_pid = clone(ProcessEntryFunction, stack_address, +// CLONE_VM | CLONE_FILES | CLONE_FS | CLONE_UNTRACED, +// (void*)&arguments); +// waitpid(cloned_pid, NULL, __WALL); +// +// If CLONE_VM is not used, GetThreadStackBottom, GetThreadStackDump +// will not work since it just use memcpy to get the stack dump. +// +class LinuxThread { + public: + // Create a LinuxThread instance to list all the threads in a process. + explicit LinuxThread(int pid); + ~LinuxThread(); + + // Stop all the threads in the process. + // Return the number of stopped threads in the process. + // Return -1 means failed to stop threads. + int SuspendAllThreads(); + + // Resume all the suspended threads. + void ResumeAllThreads() const; + + // Get the count of threads in the process. + // Return -1 means error. + int GetThreadCount() const; + + // List the threads of process. + // Whenever there is a thread found, the callback will be invoked to process + // the information. + // Return number of threads listed. + int ListThreads(CallbackParam *thread_callback_param) const; + + // Get the general purpose registers of a thread. + // The caller must get the thread pid by ListThreads. + bool GetRegisters(int pid, user_regs_struct *regs) const; + + // Get the floating-point registers of a thread. + // The caller must get the thread pid by ListThreads. + bool GetFPRegisters(int pid, user_fpregs_struct *regs) const; + + // Get all the extended floating-point registers. May not work on all + // machines. + // The caller must get the thread pid by ListThreads. + bool GetFPXRegisters(int pid, user_fpxregs_struct *regs) const; + + // Get the debug registers. + // The caller must get the thread pid by ListThreads. + bool GetDebugRegisters(int pid, DebugRegs *regs) const; + + // Get the stack memory dump. + int GetThreadStackDump(uintptr_t current_ebp, + uintptr_t current_esp, + void *buf, + int buf_size) const; + + // Get the module count of the current process. + int GetModuleCount() const; + + // Get the mapped modules in the address space. + // Whenever a module is found, the callback will be invoked to process the + // information. + // Return how may modules are found. + int ListModules(CallbackParam *callback_param) const; + + // Get the bottom of the stack from ebp. + uintptr_t GetThreadStackBottom(uintptr_t current_ebp) const; + + // Finds a sigcontext on the stack given the ebp of our signal handler. + bool FindSigContext(uintptr_t sighandler_ebp, struct sigcontext **sig_ctx); + + private: + // This callback will run when a new thread has been found. + typedef bool (*PidCallback)(int pid, void *context); + + // Read thread information from /proc/$pid/task. + // Whenever a thread has been found, and callback will be invoked with + // the pid of the thread. + // Return number of threads found. + // Return -1 means the directory doesn't exist. + int IterateProcSelfTask(int pid, + CallbackParam *callback_param) const; + + // Check if the address is a valid virtual address. + bool IsAddressMapped(uintptr_t address) const; + + private: + // The pid of the process we are listing threads. + int pid_; + + // Mark if we have suspended the threads. + bool threads_suspened_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_HANDLER_LINUX_THREAD_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread_test.cc b/thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread_test.cc new file mode 100644 index 00000000..aeb5e64c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/linux/handler/linux_thread_test.cc @@ -0,0 +1,224 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Author: Li Liu +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include + +#include +#include +#include + +#include "client/linux/handler/linux_thread.h" + +using namespace google_breakpad; + +// Thread use this to see if it should stop working. +static bool should_exit = false; + +static void foo2(int *a) { + // Stack variable, used for debugging stack dumps. + int c = 0xcccccccc; + c = c; + while (!should_exit) + sleep(1); +} + +static void foo() { + // Stack variable, used for debugging stack dumps. + int a = 0xaaaaaaaa; + foo2(&a); +} + +static void *thread_main(void *) { + // Stack variable, used for debugging stack dumps. + int b = 0xbbbbbbbb; + b = b; + while (!should_exit) { + foo(); + } + return NULL; +} + +static void CreateThreads(int num) { + pthread_t handle; + for (int i = 0; i < num; i++) { + if (0 != pthread_create(&handle, NULL, thread_main, NULL)) + fprintf(stderr, "Failed to create thread.\n"); + else + pthread_detach(handle); + } +} + +static bool ProcessOneModule(const struct ModuleInfo &module_info, + void *context) { + printf("0x%x[%8d] %s\n", module_info.start_addr, module_info.size, + module_info.name); + return true; +} + +static bool ProcessOneThread(const struct ThreadInfo &thread_info, + void *context) { + printf("\n\nPID: %d, TGID: %d, PPID: %d\n", + thread_info.pid, + thread_info.tgid, + thread_info.ppid); + + struct user_regs_struct regs; + struct user_fpregs_struct fp_regs; + struct user_fpxregs_struct fpx_regs; + struct DebugRegs dbg_regs; + + LinuxThread *threads = reinterpret_cast(context); + memset(®s, 0, sizeof(regs)); + if (threads->GetRegisters(thread_info.pid, ®s)) { + printf(" gs = 0x%lx\n", regs.xgs); + printf(" fs = 0x%lx\n", regs.xfs); + printf(" es = 0x%lx\n", regs.xes); + printf(" ds = 0x%lx\n", regs.xds); + printf(" edi = 0x%lx\n", regs.edi); + printf(" esi = 0x%lx\n", regs.esi); + printf(" ebx = 0x%lx\n", regs.ebx); + printf(" edx = 0x%lx\n", regs.edx); + printf(" ecx = 0x%lx\n", regs.ecx); + printf(" eax = 0x%lx\n", regs.eax); + printf(" ebp = 0x%lx\n", regs.ebp); + printf(" eip = 0x%lx\n", regs.eip); + printf(" cs = 0x%lx\n", regs.xcs); + printf(" eflags = 0x%lx\n", regs.eflags); + printf(" esp = 0x%lx\n", regs.esp); + printf(" ss = 0x%lx\n", regs.xss); + } else { + fprintf(stderr, "ERROR: Failed to get general purpose registers\n"); + } + memset(&fp_regs, 0, sizeof(fp_regs)); + if (threads->GetFPRegisters(thread_info.pid, &fp_regs)) { + printf("\n Floating point registers:\n"); + printf(" fctl = 0x%lx\n", fp_regs.cwd); + printf(" fstat = 0x%lx\n", fp_regs.swd); + printf(" ftag = 0x%lx\n", fp_regs.twd); + printf(" fioff = 0x%lx\n", fp_regs.fip); + printf(" fiseg = 0x%lx\n", fp_regs.fcs); + printf(" fooff = 0x%lx\n", fp_regs.foo); + printf(" foseg = 0x%lx\n", fp_regs.fos); + int st_space_size = sizeof(fp_regs.st_space) / sizeof(fp_regs.st_space[0]); + printf(" st_space[%2d] = 0x", st_space_size); + for (int i = 0; i < st_space_size; ++i) + printf("%02lx", fp_regs.st_space[i]); + printf("\n"); + } else { + fprintf(stderr, "ERROR: Failed to get floating-point registers\n"); + } + memset(&fpx_regs, 0, sizeof(fpx_regs)); + if (threads->GetFPXRegisters(thread_info.pid, &fpx_regs)) { + printf("\n Extended floating point registers:\n"); + printf(" fctl = 0x%x\n", fpx_regs.cwd); + printf(" fstat = 0x%x\n", fpx_regs.swd); + printf(" ftag = 0x%x\n", fpx_regs.twd); + printf(" fioff = 0x%lx\n", fpx_regs.fip); + printf(" fiseg = 0x%lx\n", fpx_regs.fcs); + printf(" fooff = 0x%lx\n", fpx_regs.foo); + printf(" foseg = 0x%lx\n", fpx_regs.fos); + printf(" fop = 0x%x\n", fpx_regs.fop); + printf(" mxcsr = 0x%lx\n", fpx_regs.mxcsr); + int space_size = sizeof(fpx_regs.st_space) / sizeof(fpx_regs.st_space[0]); + printf(" st_space[%2d] = 0x", space_size); + for (int i = 0; i < space_size; ++i) + printf("%02lx", fpx_regs.st_space[i]); + printf("\n"); + space_size = sizeof(fpx_regs.xmm_space) / sizeof(fpx_regs.xmm_space[0]); + printf(" xmm_space[%2d] = 0x", space_size); + for (int i = 0; i < space_size; ++i) + printf("%02lx", fpx_regs.xmm_space[i]); + printf("\n"); + } + if (threads->GetDebugRegisters(thread_info.pid, &dbg_regs)) { + printf("\n Debug registers:\n"); + printf(" dr0 = 0x%x\n", dbg_regs.dr0); + printf(" dr1 = 0x%x\n", dbg_regs.dr1); + printf(" dr2 = 0x%x\n", dbg_regs.dr2); + printf(" dr3 = 0x%x\n", dbg_regs.dr3); + printf(" dr4 = 0x%x\n", dbg_regs.dr4); + printf(" dr5 = 0x%x\n", dbg_regs.dr5); + printf(" dr6 = 0x%x\n", dbg_regs.dr6); + printf(" dr7 = 0x%x\n", dbg_regs.dr7); + printf("\n"); + } + if (regs.esp != 0) { + // Print the stack content. + int size = 1024 * 2; + char *buf = new char[size]; + size = threads->GetThreadStackDump(regs.ebp, + regs.esp, + (void*)buf, size); + printf(" Stack content: = 0x"); + size /= sizeof(unsigned long); + unsigned long *p_buf = (unsigned long *)(buf); + for (int i = 0; i < size; i += 1) + printf("%.8lx ", p_buf[i]); + delete []buf; + printf("\n"); + } + return true; +} + +static int PrintAllThreads(void *argument) { + int pid = (int)argument; + + LinuxThread threads(pid); + int total_thread = threads.SuspendAllThreads(); + printf("There are %d threads in the process: %d\n", total_thread, pid); + int total_module = threads.GetModuleCount(); + printf("There are %d modules in the process: %d\n", total_module, pid); + CallbackParam module_callback(ProcessOneModule, &threads); + threads.ListModules(&module_callback); + CallbackParam thread_callback(ProcessOneThread, &threads); + threads.ListThreads(&thread_callback); + return 0; +} + +int main(int argc, char **argv) { + int pid = getpid(); + printf("Main thread is %d\n", pid); + CreateThreads(1); + // Create stack for the process. + char *stack = new char[1024 * 100]; + int cloned_pid = clone(PrintAllThreads, stack + 1024 * 100, + CLONE_VM | CLONE_FILES | CLONE_FS | CLONE_UNTRACED, + (void*)getpid()); + waitpid(cloned_pid, NULL, __WALL); + should_exit = true; + printf("Test finished.\n"); + + delete []stack; + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_generator.cc b/thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_generator.cc new file mode 100644 index 00000000..bc4d213a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_generator.cc @@ -0,0 +1,815 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Author: Li Liu +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "common/linux/file_id.h" +#include "client/linux/handler/linux_thread.h" +#include "client/minidump_file_writer.h" +#include "client/minidump_file_writer-inl.h" +#include "google_breakpad/common/minidump_format.h" +#include "client/linux/handler/minidump_generator.h" + +#ifndef CLONE_UNTRACED +#define CLONE_UNTRACED 0x00800000 +#endif + +// This unnamed namespace contains helper functions. +namespace { + +using namespace google_breakpad; + +// Argument for the writer function. +struct WriterArgument { + MinidumpFileWriter *minidump_writer; + + // Context for the callback. + void *version_context; + + // Pid of the thread who called WriteMinidumpToFile + int requester_pid; + + // The stack bottom of the thread which caused the dump. + // Mainly used to find the thread id of the crashed thread since signal + // handler may not be called in the thread who caused it. + uintptr_t crashed_stack_bottom; + + // Pid of the crashing thread. + int crashed_pid; + + // Signal number when crash happed. Can be 0 if this is a requested dump. + int signo; + + // The ebp of the signal handler frame. Can be zero if this + // is a requested dump. + uintptr_t sighandler_ebp; + + // Signal context when crash happed. Can be NULL if this is a requested dump. + // This is actually an out parameter, but it will be filled in at the start + // of the writer thread. + struct sigcontext *sig_ctx; + + // Used to get information about the threads. + LinuxThread *thread_lister; +}; + +// Holding context information for the callback of finding the crashing thread. +struct FindCrashThreadContext { + const LinuxThread *thread_lister; + uintptr_t crashing_stack_bottom; + int crashing_thread_pid; + + FindCrashThreadContext() : + thread_lister(NULL), + crashing_stack_bottom(0UL), + crashing_thread_pid(-1) { + } +}; + +// Callback for list threads. +// It will compare the stack bottom of the provided thread with the stack +// bottom of the crashed thread, it they are eqaul, this is thread is the one +// who crashed. +bool IsThreadCrashedCallback(const ThreadInfo &thread_info, void *context) { + FindCrashThreadContext *crashing_context = + static_cast(context); + const LinuxThread *thread_lister = crashing_context->thread_lister; + struct user_regs_struct regs; + if (thread_lister->GetRegisters(thread_info.pid, ®s)) { + uintptr_t last_ebp = regs.ebp; + uintptr_t stack_bottom = thread_lister->GetThreadStackBottom(last_ebp); + if (stack_bottom > last_ebp && + stack_bottom == crashing_context->crashing_stack_bottom) { + // Got it. Stop iteration. + crashing_context->crashing_thread_pid = thread_info.pid; + return false; + } + } + return true; +} + +// Find the crashing thread id. +// This is done based on stack bottom comparing. +int FindCrashingThread(uintptr_t crashing_stack_bottom, + int requester_pid, + const LinuxThread *thread_lister) { + FindCrashThreadContext context; + context.thread_lister = thread_lister; + context.crashing_stack_bottom = crashing_stack_bottom; + CallbackParam callback_param(IsThreadCrashedCallback, + &context); + thread_lister->ListThreads(&callback_param); + return context.crashing_thread_pid; +} + +// Write the thread stack info minidump. +bool WriteThreadStack(uintptr_t last_ebp, + uintptr_t last_esp, + const LinuxThread *thread_lister, + UntypedMDRVA *memory, + MDMemoryDescriptor *loc) { + // Maximum stack size for a thread. + uintptr_t stack_bottom = thread_lister->GetThreadStackBottom(last_ebp); + if (stack_bottom > last_esp) { + int size = stack_bottom - last_esp; + if (size > 0) { + if (!memory->Allocate(size)) + return false; + memory->Copy(reinterpret_cast(last_esp), size); + loc->start_of_memory_range = 0 | last_esp; + loc->memory = memory->location(); + } + return true; + } + return false; +} + +// Write CPU context based on signal context. +bool WriteContext(MDRawContextX86 *context, const struct sigcontext *sig_ctx, + const DebugRegs *debug_regs) { + assert(sig_ctx != NULL); + context->context_flags = MD_CONTEXT_X86_FULL; + context->gs = sig_ctx->gs; + context->fs = sig_ctx->fs; + context->es = sig_ctx->es; + context->ds = sig_ctx->ds; + context->cs = sig_ctx->cs; + context->ss = sig_ctx->ss; + context->edi = sig_ctx->edi; + context->esi = sig_ctx->esi; + context->ebp = sig_ctx->ebp; + context->esp = sig_ctx->esp; + context->ebx = sig_ctx->ebx; + context->edx = sig_ctx->edx; + context->ecx = sig_ctx->ecx; + context->eax = sig_ctx->eax; + context->eip = sig_ctx->eip; + context->eflags = sig_ctx->eflags; + if (sig_ctx->fpstate != NULL) { + context->context_flags = MD_CONTEXT_X86_FULL | + MD_CONTEXT_X86_FLOATING_POINT; + context->float_save.control_word = sig_ctx->fpstate->cw; + context->float_save.status_word = sig_ctx->fpstate->sw; + context->float_save.tag_word = sig_ctx->fpstate->tag; + context->float_save.error_offset = sig_ctx->fpstate->ipoff; + context->float_save.error_selector = sig_ctx->fpstate->cssel; + context->float_save.data_offset = sig_ctx->fpstate->dataoff; + context->float_save.data_selector = sig_ctx->fpstate->datasel; + memcpy(context->float_save.register_area, sig_ctx->fpstate->_st, + sizeof(context->float_save.register_area)); + } + + if (debug_regs != NULL) { + context->context_flags |= MD_CONTEXT_X86_DEBUG_REGISTERS; + context->dr0 = debug_regs->dr0; + context->dr1 = debug_regs->dr1; + context->dr2 = debug_regs->dr2; + context->dr3 = debug_regs->dr3; + context->dr6 = debug_regs->dr6; + context->dr7 = debug_regs->dr7; + } + return true; +} + +// Write CPU context based on provided registers. +bool WriteContext(MDRawContextX86 *context, + const struct user_regs_struct *regs, + const struct user_fpregs_struct *fp_regs, + const DebugRegs *dbg_regs) { + if (!context || !regs) + return false; + + context->context_flags = MD_CONTEXT_X86_FULL; + + context->cs = regs->xcs; + context->ds = regs->xds; + context->es = regs->xes; + context->fs = regs->xfs; + context->gs = regs->xgs; + context->ss = regs->xss; + context->edi = regs->edi; + context->esi = regs->esi; + context->ebx = regs->ebx; + context->edx = regs->edx; + context->ecx = regs->ecx; + context->eax = regs->eax; + context->ebp = regs->ebp; + context->eip = regs->eip; + context->esp = regs->esp; + context->eflags = regs->eflags; + + if (dbg_regs != NULL) { + context->context_flags |= MD_CONTEXT_X86_DEBUG_REGISTERS; + context->dr0 = dbg_regs->dr0; + context->dr1 = dbg_regs->dr1; + context->dr2 = dbg_regs->dr2; + context->dr3 = dbg_regs->dr3; + context->dr6 = dbg_regs->dr6; + context->dr7 = dbg_regs->dr7; + } + + if (fp_regs != NULL) { + context->context_flags |= MD_CONTEXT_X86_FLOATING_POINT; + context->float_save.control_word = fp_regs->cwd; + context->float_save.status_word = fp_regs->swd; + context->float_save.tag_word = fp_regs->twd; + context->float_save.error_offset = fp_regs->fip; + context->float_save.error_selector = fp_regs->fcs; + context->float_save.data_offset = fp_regs->foo; + context->float_save.data_selector = fp_regs->fos; + context->float_save.data_selector = fp_regs->fos; + + memcpy(context->float_save.register_area, fp_regs->st_space, + sizeof(context->float_save.register_area)); + } + return true; +} + +// Write information about a crashed thread. +// When a thread crash, kernel will write something on the stack for processing +// signal. This makes the current stack not reliable, and our stack walker +// won't figure out the whole call stack for this. So we write the stack at the +// time of the crash into the minidump file, not the current stack. +bool WriteCrashedThreadStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + const ThreadInfo &thread_info, + MDRawThread *thread) { + assert(writer_args->sig_ctx != NULL); + + thread->thread_id = thread_info.pid; + + UntypedMDRVA memory(minidump_writer); + if (!WriteThreadStack(writer_args->sig_ctx->ebp, + writer_args->sig_ctx->esp, + writer_args->thread_lister, + &memory, + &thread->stack)) + return false; + + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + thread->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextX86)); + return WriteContext(context.get(), writer_args->sig_ctx, NULL); +} + +// Write information about a thread. +// This function only processes thread running normally at the crash. +bool WriteThreadStream(MinidumpFileWriter *minidump_writer, + const LinuxThread *thread_lister, + const ThreadInfo &thread_info, + MDRawThread *thread) { + thread->thread_id = thread_info.pid; + + struct user_regs_struct regs; + memset(®s, 0, sizeof(regs)); + if (!thread_lister->GetRegisters(thread_info.pid, ®s)) { + perror(NULL); + return false; + } + + UntypedMDRVA memory(minidump_writer); + if (!WriteThreadStack(regs.ebp, + regs.esp, + thread_lister, + &memory, + &thread->stack)) + return false; + + struct user_fpregs_struct fp_regs; + DebugRegs dbg_regs; + memset(&fp_regs, 0, sizeof(fp_regs)); + // Get all the registers. + thread_lister->GetFPRegisters(thread_info.pid, &fp_regs); + thread_lister->GetDebugRegisters(thread_info.pid, &dbg_regs); + + // Write context + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + thread->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextX86)); + return WriteContext(context.get(), ®s, &fp_regs, &dbg_regs); +} + +bool WriteCPUInformation(MDRawSystemInfo *sys_info) { + const char *proc_cpu_path = "/proc/cpuinfo"; + char line[128]; + char vendor_id[13]; + const char vendor_id_name[] = "vendor_id"; + const size_t vendor_id_name_length = sizeof(vendor_id_name) - 1; + + struct CpuInfoEntry { + const char *info_name; + int value; + } cpu_info_table[] = { + { "processor", -1 }, + { "model", 0 }, + { "stepping", 0 }, + { "cpuid level", 0 }, + { NULL, -1 }, + }; + + memset(vendor_id, 0, sizeof(vendor_id)); + + FILE *fp = fopen(proc_cpu_path, "r"); + if (fp != NULL) { + while (fgets(line, sizeof(line), fp)) { + CpuInfoEntry *entry = &cpu_info_table[0]; + while (entry->info_name != NULL) { + if (!strncmp(line, entry->info_name, strlen(entry->info_name))) { + char *value = strchr(line, ':'); + value++; + if (value != NULL) + sscanf(value, " %d", &(entry->value)); + } + entry++; + } + + // special case for vendor_id + if (!strncmp(line, vendor_id_name, vendor_id_name_length)) { + char *value = strchr(line, ':'); + if (value == NULL) + continue; + + value++; + while (*value && isspace(*value)) + value++; + if (*value) { + size_t length = strlen(value); + // we don't want the trailing newline + if (value[length - 1] == '\n') + length--; + // ensure we have space for the value + if (length < sizeof(vendor_id)) + strncpy(vendor_id, value, length); + } + } + } + fclose(fp); + } + + // /proc/cpuinfo contains cpu id, change it into number by adding one. + cpu_info_table[0].value++; + + sys_info->number_of_processors = cpu_info_table[0].value; + sys_info->processor_level = cpu_info_table[3].value; + sys_info->processor_revision = cpu_info_table[1].value << 8 | + cpu_info_table[2].value; + + sys_info->processor_architecture = MD_CPU_ARCHITECTURE_UNKNOWN; + struct utsname uts; + if (uname(&uts) == 0) { + // Match i*86 and x86* as X86 architecture. + if ((strstr(uts.machine, "x86") == uts.machine) || + (strlen(uts.machine) == 4 && + uts.machine[0] == 'i' && + uts.machine[2] == '8' && + uts.machine[3] == '6')) { + sys_info->processor_architecture = MD_CPU_ARCHITECTURE_X86; + if (vendor_id[0] != '\0') + memcpy(sys_info->cpu.x86_cpu_info.vendor_id, vendor_id, + sizeof(sys_info->cpu.x86_cpu_info.vendor_id)); + } + } + return true; +} + +bool WriteOSInformation(MinidumpFileWriter *minidump_writer, + MDRawSystemInfo *sys_info) { + sys_info->platform_id = MD_OS_LINUX; + + struct utsname uts; + if (uname(&uts) == 0) { + char os_version[512]; + size_t space_left = sizeof(os_version); + memset(os_version, 0, space_left); + const char *os_info_table[] = { + uts.sysname, + uts.release, + uts.version, + uts.machine, + "GNU/Linux", + NULL + }; + for (const char **cur_os_info = os_info_table; + *cur_os_info != NULL; + cur_os_info++) { + if (cur_os_info != os_info_table && space_left > 1) { + strcat(os_version, " "); + space_left--; + } + if (space_left > strlen(*cur_os_info)) { + strcat(os_version, *cur_os_info); + space_left -= strlen(*cur_os_info); + } else { + break; + } + } + + MDLocationDescriptor location; + if (!minidump_writer->WriteString(os_version, 0, &location)) + return false; + sys_info->csd_version_rva = location.rva; + } + return true; +} + +// Callback context for get writting thread information. +struct ThreadInfoCallbackCtx { + MinidumpFileWriter *minidump_writer; + const WriterArgument *writer_args; + TypedMDRVA *list; + int thread_index; +}; + +// Callback run for writing threads information in the process. +bool ThreadInfomationCallback(const ThreadInfo &thread_info, + void *context) { + ThreadInfoCallbackCtx *callback_context = + static_cast(context); + bool success = true; + MDRawThread thread; + memset(&thread, 0, sizeof(MDRawThread)); + if (thread_info.pid != callback_context->writer_args->crashed_pid || + callback_context->writer_args->sig_ctx == NULL) { + success = WriteThreadStream(callback_context->minidump_writer, + callback_context->writer_args->thread_lister, + thread_info, &thread); + } else { + success = WriteCrashedThreadStream(callback_context->minidump_writer, + callback_context->writer_args, + thread_info, &thread); + } + if (success) { + callback_context->list->CopyIndexAfterObject( + callback_context->thread_index++, + &thread, sizeof(MDRawThread)); + } + return success; +} + +// Stream writers +bool WriteThreadListStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + // Get the thread information. + const LinuxThread *thread_lister = writer_args->thread_lister; + int thread_count = thread_lister->GetThreadCount(); + if (thread_count < 0) + return false; + TypedMDRVA list(minidump_writer); + if (!list.AllocateObjectAndArray(thread_count, sizeof(MDRawThread))) + return false; + dir->stream_type = MD_THREAD_LIST_STREAM; + dir->location = list.location(); + list.get()->number_of_threads = thread_count; + + ThreadInfoCallbackCtx context; + context.minidump_writer = minidump_writer; + context.writer_args = writer_args; + context.list = &list; + context.thread_index = 0; + CallbackParam callback_param(ThreadInfomationCallback, + &context); + int written = thread_lister->ListThreads(&callback_param); + return written == thread_count; +} + +bool WriteCVRecord(MinidumpFileWriter *minidump_writer, + MDRawModule *module, + const char *module_path) { + TypedMDRVA cv(minidump_writer); + + // Only return the last path component of the full module path + const char *module_name = strrchr(module_path, '/'); + // Increment past the slash + if (module_name) + ++module_name; + else + module_name = ""; + + size_t module_name_length = strlen(module_name); + if (!cv.AllocateObjectAndArray(module_name_length + 1, sizeof(u_int8_t))) + return false; + if (!cv.CopyIndexAfterObject(0, const_cast(module_name), + module_name_length)) + return false; + + module->cv_record = cv.location(); + MDCVInfoPDB70 *cv_ptr = cv.get(); + memset(cv_ptr, 0, sizeof(MDCVInfoPDB70)); + cv_ptr->cv_signature = MD_CVINFOPDB70_SIGNATURE; + cv_ptr->age = 0; + + // Get the module identifier + FileID file_id(module_path); + unsigned char identifier[16]; + + if (file_id.ElfFileIdentifier(identifier)) { + cv_ptr->signature.data1 = (uint32_t)identifier[0] << 24 | + (uint32_t)identifier[1] << 16 | (uint32_t)identifier[2] << 8 | + (uint32_t)identifier[3]; + cv_ptr->signature.data2 = (uint32_t)identifier[4] << 8 | identifier[5]; + cv_ptr->signature.data3 = (uint32_t)identifier[6] << 8 | identifier[7]; + cv_ptr->signature.data4[0] = identifier[8]; + cv_ptr->signature.data4[1] = identifier[9]; + cv_ptr->signature.data4[2] = identifier[10]; + cv_ptr->signature.data4[3] = identifier[11]; + cv_ptr->signature.data4[4] = identifier[12]; + cv_ptr->signature.data4[5] = identifier[13]; + cv_ptr->signature.data4[6] = identifier[14]; + cv_ptr->signature.data4[7] = identifier[15]; + } + return true; +} + +struct ModuleInfoCallbackCtx { + MinidumpFileWriter *minidump_writer; + const WriterArgument *writer_args; + TypedMDRVA *list; + int module_index; +}; + +bool ModuleInfoCallback(const ModuleInfo &module_info, + void *context) { + ModuleInfoCallbackCtx *callback_context = + static_cast(context); + // Skip those modules without name, or those that are not modules. + if (strlen(module_info.name) == 0 || + !strchr(module_info.name, '/')) + return true; + + MDRawModule module; + memset(&module, 0, sizeof(module)); + MDLocationDescriptor loc; + if (!callback_context->minidump_writer->WriteString(module_info.name, 0, + &loc)) + return false; + module.base_of_image = (u_int64_t)module_info.start_addr; + module.size_of_image = module_info.size; + module.module_name_rva = loc.rva; + + if (!WriteCVRecord(callback_context->minidump_writer, &module, + module_info.name)) + return false; + callback_context->list->CopyIndexAfterObject( + callback_context->module_index++, &module, MD_MODULE_SIZE); + return true; +} + +bool WriteModuleListStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + TypedMDRVA list(minidump_writer); + int module_count = writer_args->thread_lister->GetModuleCount(); + if (module_count <= 0 || + !list.AllocateObjectAndArray(module_count, MD_MODULE_SIZE)) + return false; + dir->stream_type = MD_MODULE_LIST_STREAM; + dir->location = list.location(); + list.get()->number_of_modules = module_count; + ModuleInfoCallbackCtx context; + context.minidump_writer = minidump_writer; + context.writer_args = writer_args; + context.list = &list; + context.module_index = 0; + CallbackParam callback(ModuleInfoCallback, &context); + return writer_args->thread_lister->ListModules(&callback) == module_count; +} + +bool WriteSystemInfoStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + TypedMDRVA sys_info(minidump_writer); + if (!sys_info.Allocate()) + return false; + dir->stream_type = MD_SYSTEM_INFO_STREAM; + dir->location = sys_info.location(); + + return WriteCPUInformation(sys_info.get()) && + WriteOSInformation(minidump_writer, sys_info.get()); +} + +bool WriteExceptionStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + // This happenes when this is not a crash, but a requested dump. + if (writer_args->sig_ctx == NULL) + return false; + + TypedMDRVA exception(minidump_writer); + if (!exception.Allocate()) + return false; + + dir->stream_type = MD_EXCEPTION_STREAM; + dir->location = exception.location(); + exception.get()->thread_id = writer_args->crashed_pid; + exception.get()->exception_record.exception_code = writer_args->signo; + exception.get()->exception_record.exception_flags = 0; + if (writer_args->sig_ctx != NULL) { + exception.get()->exception_record.exception_address = + writer_args->sig_ctx->eip; + } else { + return true; + } + + // Write context of the exception. + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + exception.get()->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextX86)); + return WriteContext(context.get(), writer_args->sig_ctx, NULL); +} + +bool WriteMiscInfoStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + TypedMDRVA info(minidump_writer); + if (!info.Allocate()) + return false; + + dir->stream_type = MD_MISC_INFO_STREAM; + dir->location = info.location(); + info.get()->size_of_info = sizeof(MDRawMiscInfo); + info.get()->flags1 = MD_MISCINFO_FLAGS1_PROCESS_ID; + info.get()->process_id = writer_args->requester_pid; + + return true; +} + +bool WriteBreakpadInfoStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + TypedMDRVA info(minidump_writer); + if (!info.Allocate()) + return false; + + dir->stream_type = MD_BREAKPAD_INFO_STREAM; + dir->location = info.location(); + + info.get()->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; + info.get()->dump_thread_id = getpid(); + info.get()->requesting_thread_id = writer_args->requester_pid; + return true; +} + +// Prototype of writer functions. +typedef bool (*WriteStringFN)(MinidumpFileWriter *, + const WriterArgument *, + MDRawDirectory *); + +// Function table to writer a full minidump. +WriteStringFN writers[] = { + WriteThreadListStream, + WriteModuleListStream, + WriteSystemInfoStream, + WriteExceptionStream, + WriteMiscInfoStream, + WriteBreakpadInfoStream, +}; + +// Will call each writer function in the writers table. +// It runs in a different process from the crashing process, but sharing +// the same address space. This enables it to use ptrace functions. +int Write(void *argument) { + WriterArgument *writer_args = + static_cast(argument); + + if (!writer_args->thread_lister->SuspendAllThreads()) + return -1; + + if (writer_args->sighandler_ebp != 0 && + writer_args->thread_lister->FindSigContext(writer_args->sighandler_ebp, + &writer_args->sig_ctx)) { + writer_args->crashed_stack_bottom = + writer_args->thread_lister->GetThreadStackBottom( + writer_args->sig_ctx->ebp); + int crashed_pid = FindCrashingThread(writer_args->crashed_stack_bottom, + writer_args->requester_pid, + writer_args->thread_lister); + if (crashed_pid > 0) + writer_args->crashed_pid = crashed_pid; + } + + + MinidumpFileWriter *minidump_writer = writer_args->minidump_writer; + TypedMDRVA header(minidump_writer); + TypedMDRVA dir(minidump_writer); + if (!header.Allocate()) + return 0; + + int writer_count = sizeof(writers) / sizeof(writers[0]); + // Need directory space for all writers. + if (!dir.AllocateArray(writer_count)) + return 0; + header.get()->signature = MD_HEADER_SIGNATURE; + header.get()->version = MD_HEADER_VERSION; + header.get()->time_date_stamp = time(NULL); + header.get()->stream_count = writer_count; + header.get()->stream_directory_rva = dir.position(); + + int dir_index = 0; + MDRawDirectory local_dir; + for (int i = 0; i < writer_count; ++i) { + if (writers[i](minidump_writer, writer_args, &local_dir)) + dir.CopyIndex(dir_index++, &local_dir); + } + + writer_args->thread_lister->ResumeAllThreads(); + return 0; +} + +} // namespace + +namespace google_breakpad { + +MinidumpGenerator::MinidumpGenerator() { + AllocateStack(); +} + +MinidumpGenerator::~MinidumpGenerator() { +} + +void MinidumpGenerator::AllocateStack() { + stack_.reset(new char[kStackSize]); +} + +bool MinidumpGenerator::WriteMinidumpToFile(const char *file_pathname, + int signo, + uintptr_t sighandler_ebp, + struct sigcontext **sig_ctx) const { + assert(file_pathname != NULL); + assert(stack_ != NULL); + + if (stack_ == NULL || file_pathname == NULL) + return false; + + MinidumpFileWriter minidump_writer; + if (minidump_writer.Open(file_pathname)) { + WriterArgument argument; + memset(&argument, 0, sizeof(argument)); + LinuxThread thread_lister(getpid()); + argument.thread_lister = &thread_lister; + argument.minidump_writer = &minidump_writer; + argument.requester_pid = getpid(); + argument.crashed_pid = getpid(); + argument.signo = signo; + argument.sighandler_ebp = sighandler_ebp; + argument.sig_ctx = NULL; + + int cloned_pid = clone(Write, stack_.get() + kStackSize, + CLONE_VM | CLONE_FILES | CLONE_FS | CLONE_UNTRACED, + (void*)&argument); + waitpid(cloned_pid, NULL, __WALL); + if (sig_ctx != NULL) + *sig_ctx = argument.sig_ctx; + return true; + } + + return false; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_generator.h b/thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_generator.h new file mode 100644 index 00000000..7c0511f5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_generator.h @@ -0,0 +1,73 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Author: Li Liu +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_HANDLER_MINIDUMP_GENERATOR_H__ +#define CLIENT_LINUX_HANDLER_MINIDUMP_GENERATOR_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" +#include "processor/scoped_ptr.h" + +struct sigcontext; + +namespace google_breakpad { + +// +// MinidumpGenerator +// +// Write a minidump to file based on the signo and sig_ctx. +// A minidump generator should be created before any exception happen. +// +class MinidumpGenerator { + public: + MinidumpGenerator(); + + ~MinidumpGenerator(); + + // Write minidump. + bool WriteMinidumpToFile(const char *file_pathname, + int signo, + uintptr_t sighandler_ebp, + struct sigcontext **sig_ctx) const; + private: + // Allocate memory for stack. + void AllocateStack(); + + private: + // Stack size of the writer thread. + static const int kStackSize = 1024 * 1024; + scoped_array stack_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_HANDLER_MINIDUMP_GENERATOR_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_test.cc b/thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_test.cc new file mode 100644 index 00000000..f8c4e784 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/linux/handler/minidump_test.cc @@ -0,0 +1,86 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Author: Li Liu +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include + +#include +#include +#include +#include + +#include "client/linux/handler/minidump_generator.h" + +using namespace google_breakpad; + +// Thread use this to see if it should stop working. +static bool should_exit = false; + +static void foo2(int arg) { + // Stack variable, used for debugging stack dumps. + int c = arg; + c = 0xcccccccc; + while (!should_exit) + sleep(1); +} + +static void foo(int arg) { + // Stack variable, used for debugging stack dumps. + int b = arg; + b = 0xbbbbbbbb; + foo2(b); +} + +static void *thread_main(void *) { + // Stack variable, used for debugging stack dumps. + int a = 0xaaaaaaaa; + foo(a); + return NULL; +} + +static void CreateThread(int num) { + pthread_t h; + for (int i = 0; i < num; ++i) { + pthread_create(&h, NULL, thread_main, NULL); + pthread_detach(h); + } +} + +int main(int argc, char *argv[]) { + CreateThread(10); + google_breakpad::MinidumpGenerator mg; + if (mg.WriteMinidumpToFile("minidump_test.out", -1, 0, NULL)) + printf("Succeeded written minidump\n"); + else + printf("Failed to write minidump\n"); + should_exit = true; + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_exc_server.c b/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_exc_server.c new file mode 100644 index 00000000..19f36b19 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_exc_server.c @@ -0,0 +1,1750 @@ +/* + * IDENTIFICATION: + * stub generated Mon Jun 16 18:08:10 2008 + * with a MiG generated Tue Feb 19 02:01:43 PST 2008 by root@b75.local + * OPTIONS: + */ + +/* Module exc */ + +#define __MIG_check__Request__exc_subsystem__ 1 +#define __NDR_convert__Request__exc_subsystem__ 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifndef mig_internal +#define mig_internal static __inline__ +#endif /* mig_internal */ + +#ifndef mig_external +#define mig_external +#endif /* mig_external */ + +#if !defined(__MigTypeCheck) && defined(TypeCheck) +#define __MigTypeCheck TypeCheck /* Legacy setting */ +#endif /* !defined(__MigTypeCheck) */ + +#if !defined(__MigKernelSpecificCode) && defined(_MIG_KERNEL_SPECIFIC_CODE_) +#define __MigKernelSpecificCode _MIG_KERNEL_SPECIFIC_CODE_ /* Legacy setting */ +#endif /* !defined(__MigKernelSpecificCode) */ + +#ifndef LimitCheck +#define LimitCheck 0 +#endif /* LimitCheck */ + +#ifndef min +#define min(a,b) ( ((a) < (b))? (a): (b) ) +#endif /* min */ + +#if !defined(_WALIGN_) +#define _WALIGN_(x) (((x) + 3) & ~3) +#endif /* !defined(_WALIGN_) */ + +#if !defined(_WALIGNSZ_) +#define _WALIGNSZ_(x) _WALIGN_(sizeof(x)) +#endif /* !defined(_WALIGNSZ_) */ + +#ifndef UseStaticTemplates +#define UseStaticTemplates 0 +#endif /* UseStaticTemplates */ + +#ifndef __DeclareRcvRpc +#define __DeclareRcvRpc(_NUM_, _NAME_) +#endif /* __DeclareRcvRpc */ + +#ifndef __BeforeRcvRpc +#define __BeforeRcvRpc(_NUM_, _NAME_) +#endif /* __BeforeRcvRpc */ + +#ifndef __AfterRcvRpc +#define __AfterRcvRpc(_NUM_, _NAME_) +#endif /* __AfterRcvRpc */ + +#ifndef __DeclareRcvSimple +#define __DeclareRcvSimple(_NUM_, _NAME_) +#endif /* __DeclareRcvSimple */ + +#ifndef __BeforeRcvSimple +#define __BeforeRcvSimple(_NUM_, _NAME_) +#endif /* __BeforeRcvSimple */ + +#ifndef __AfterRcvSimple +#define __AfterRcvSimple(_NUM_, _NAME_) +#endif /* __AfterRcvSimple */ + +#define novalue void + +#define msgh_request_port msgh_local_port +#define MACH_MSGH_BITS_REQUEST(bits) MACH_MSGH_BITS_LOCAL(bits) +#define msgh_reply_port msgh_remote_port +#define MACH_MSGH_BITS_REPLY(bits) MACH_MSGH_BITS_REMOTE(bits) + +#define MIG_RETURN_ERROR(X, code) {\ + ((mig_reply_error_t *)X)->RetCode = code;\ + ((mig_reply_error_t *)X)->NDR = NDR_record;\ + return;\ + } + +/* typedefs for all requests */ + +#ifndef __Request__exc_subsystem__defined +#define __Request__exc_subsystem__defined + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + } __Request__exception_raise_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[144]; + } __Request__exception_raise_state_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[144]; + } __Request__exception_raise_state_identity_t; +#ifdef __MigPackStructs +#pragma pack() +#endif +#endif /* !__Request__exc_subsystem__defined */ + +/* typedefs for all replies */ + +#ifndef __Reply__exc_subsystem__defined +#define __Reply__exc_subsystem__defined + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + } __Reply__exception_raise_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + int flavor; + mach_msg_type_number_t new_stateCnt; + natural_t new_state[144]; + } __Reply__exception_raise_state_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + int flavor; + mach_msg_type_number_t new_stateCnt; + natural_t new_state[144]; + } __Reply__exception_raise_state_identity_t; +#ifdef __MigPackStructs +#pragma pack() +#endif +#endif /* !__Reply__exc_subsystem__defined */ + + +/* union of all replies */ + +#ifndef __ReplyUnion__breakpad_exc_subsystem__defined +#define __ReplyUnion__breakpad_exc_subsystem__defined +union __ReplyUnion__breakpad_exc_subsystem { + __Reply__exception_raise_t Reply_exception_raise; + __Reply__exception_raise_state_t Reply_exception_raise_state; + __Reply__exception_raise_state_identity_t Reply_exception_raise_state_identity; +}; +#endif /* __RequestUnion__breakpad_exc_subsystem__defined */ +/* Forward Declarations */ + + +mig_internal novalue _Xexception_raise + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); + +mig_internal novalue _Xexception_raise_state + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); + +mig_internal novalue _Xexception_raise_state_identity + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); + + +#if ( __MigTypeCheck || __NDR_convert__ ) +#if __MIG_check__Request__exc_subsystem__ +#if !defined(__MIG_check__Request__exception_raise_t__defined) +#define __MIG_check__Request__exception_raise_t__defined +#ifndef __NDR_convert__int_rep__Request__exception_raise_t__exception__defined +#if defined(__NDR_convert__int_rep__exc__exception_type_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__int_rep__exc__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__int_rep__exception_type_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__int_rep__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__int_rep__exc__int__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__int_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__int_rep__int__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__int_rep__int((int *)(a), f) +#elif defined(__NDR_convert__int_rep__exc__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__int_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__int_rep__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__int_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_t__exception__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_t__code__defined +#if defined(__NDR_convert__int_rep__exc__exception_data_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__int_rep__exc__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__int_rep__exception_data_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__int_rep__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__int_rep__exc__integer_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__int_rep__exc__integer_t) +#elif defined(__NDR_convert__int_rep__integer_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__int_rep__integer_t) +#elif defined(__NDR_convert__int_rep__exc__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__int_rep__exc__int32_t) +#elif defined(__NDR_convert__int_rep__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__int_rep__int32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_t__code__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_t__codeCnt__defined +#if defined(__NDR_convert__int_rep__exc__mach_msg_type_number_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__codeCnt__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__codeCnt(a, f) \ + __NDR_convert__int_rep__exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f) +#elif defined(__NDR_convert__int_rep__mach_msg_type_number_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_t__codeCnt__defined +#define __NDR_convert__int_rep__Request__exception_raise_t__codeCnt(a, f) \ + __NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_t__codeCnt__defined */ + +#ifndef __NDR_convert__char_rep__Request__exception_raise_t__exception__defined +#if defined(__NDR_convert__char_rep__exc__exception_type_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__char_rep__exc__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__char_rep__exception_type_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__char_rep__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__char_rep__exc__int__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__char_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__char_rep__int__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__char_rep__int((int *)(a), f) +#elif defined(__NDR_convert__char_rep__exc__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__char_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__char_rep__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__char_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__char_rep__Request__exception_raise_t__exception__defined */ + +#ifndef __NDR_convert__char_rep__Request__exception_raise_t__code__defined +#if defined(__NDR_convert__char_rep__exc__exception_data_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__char_rep__exc__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__char_rep__exception_data_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__char_rep__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__char_rep__exc__integer_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__char_rep__exc__integer_t) +#elif defined(__NDR_convert__char_rep__integer_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__char_rep__integer_t) +#elif defined(__NDR_convert__char_rep__exc__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__char_rep__exc__int32_t) +#elif defined(__NDR_convert__char_rep__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__char_rep__int32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__char_rep__Request__exception_raise_t__code__defined */ + +#ifndef __NDR_convert__float_rep__Request__exception_raise_t__exception__defined +#if defined(__NDR_convert__float_rep__exc__exception_type_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__float_rep__exc__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__float_rep__exception_type_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__float_rep__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__float_rep__exc__int__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__float_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__float_rep__int__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__float_rep__int((int *)(a), f) +#elif defined(__NDR_convert__float_rep__exc__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__float_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__float_rep__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__exception(a, f) \ + __NDR_convert__float_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__float_rep__Request__exception_raise_t__exception__defined */ + +#ifndef __NDR_convert__float_rep__Request__exception_raise_t__code__defined +#if defined(__NDR_convert__float_rep__exc__exception_data_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__float_rep__exc__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__float_rep__exception_data_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__float_rep__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__float_rep__exc__integer_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__float_rep__exc__integer_t) +#elif defined(__NDR_convert__float_rep__integer_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__float_rep__integer_t) +#elif defined(__NDR_convert__float_rep__exc__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__float_rep__exc__int32_t) +#elif defined(__NDR_convert__float_rep__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__float_rep__int32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__float_rep__Request__exception_raise_t__code__defined */ + + +mig_internal kern_return_t __MIG_check__Request__exception_raise_t(__attribute__((__unused__)) __Request__exception_raise_t *In0P) +{ + + typedef __Request__exception_raise_t __Request; +#if __MigTypeCheck + unsigned int msgh_size; +#endif /* __MigTypeCheck */ + +#if __MigTypeCheck + msgh_size = In0P->Head.msgh_size; + if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || + (In0P->msgh_body.msgh_descriptor_count != 2) || + (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 8)) || (msgh_size > (mach_msg_size_t)sizeof(__Request)) +) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + +#if __MigTypeCheck + if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR || + In0P->thread.disposition != 17) + return MIG_TYPE_ERROR; +#endif /* __MigTypeCheck */ + +#if __MigTypeCheck + if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR || + In0P->task.disposition != 17) + return MIG_TYPE_ERROR; +#endif /* __MigTypeCheck */ + +#if defined(__NDR_convert__int_rep__Request__exception_raise_t__codeCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) + __NDR_convert__int_rep__Request__exception_raise_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__exception_raise_t__codeCnt__defined */ +#if __MigTypeCheck + if (msgh_size != (mach_msg_size_t)(sizeof(__Request) - 8) + ((4 * In0P->codeCnt))) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + +#if defined(__NDR_convert__int_rep__Request__exception_raise_t__exception__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_t__code__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_t__codeCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) { +#if defined(__NDR_convert__int_rep__Request__exception_raise_t__exception__defined) + __NDR_convert__int_rep__Request__exception_raise_t__exception(&In0P->exception, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__exception_raise_t__exception__defined */ +#if defined(__NDR_convert__int_rep__Request__exception_raise_t__code__defined) + __NDR_convert__int_rep__Request__exception_raise_t__code(&In0P->code, In0P->NDR.int_rep, In0P->codeCnt); +#endif /* __NDR_convert__int_rep__Request__exception_raise_t__code__defined */ + } +#endif /* defined(__NDR_convert__int_rep...) */ + +#if defined(__NDR_convert__char_rep__Request__exception_raise_t__exception__defined) || \ + defined(__NDR_convert__char_rep__Request__exception_raise_t__code__defined) || \ + 0 + if (In0P->NDR.char_rep != NDR_record.char_rep) { +#if defined(__NDR_convert__char_rep__Request__exception_raise_t__exception__defined) + __NDR_convert__char_rep__Request__exception_raise_t__exception(&In0P->exception, In0P->NDR.char_rep); +#endif /* __NDR_convert__char_rep__Request__exception_raise_t__exception__defined */ +#if defined(__NDR_convert__char_rep__Request__exception_raise_t__code__defined) + __NDR_convert__char_rep__Request__exception_raise_t__code(&In0P->code, In0P->NDR.char_rep, In0P->codeCnt); +#endif /* __NDR_convert__char_rep__Request__exception_raise_t__code__defined */ + } +#endif /* defined(__NDR_convert__char_rep...) */ + +#if defined(__NDR_convert__float_rep__Request__exception_raise_t__exception__defined) || \ + defined(__NDR_convert__float_rep__Request__exception_raise_t__code__defined) || \ + 0 + if (In0P->NDR.float_rep != NDR_record.float_rep) { +#if defined(__NDR_convert__float_rep__Request__exception_raise_t__exception__defined) + __NDR_convert__float_rep__Request__exception_raise_t__exception(&In0P->exception, In0P->NDR.float_rep); +#endif /* __NDR_convert__float_rep__Request__exception_raise_t__exception__defined */ +#if defined(__NDR_convert__float_rep__Request__exception_raise_t__code__defined) + __NDR_convert__float_rep__Request__exception_raise_t__code(&In0P->code, In0P->NDR.float_rep, In0P->codeCnt); +#endif /* __NDR_convert__float_rep__Request__exception_raise_t__code__defined */ + } +#endif /* defined(__NDR_convert__float_rep...) */ + + return MACH_MSG_SUCCESS; +} +#endif /* !defined(__MIG_check__Request__exception_raise_t__defined) */ +#endif /* __MIG_check__Request__exc_subsystem__ */ +#endif /* ( __MigTypeCheck || __NDR_convert__ ) */ + + +/* Routine exception_raise */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t breakpad_exception_raise +( + mach_port_t exception_port, + mach_port_t thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t codeCnt +); + +/* Routine exception_raise */ +mig_internal novalue _Xexception_raise + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) +{ + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + mach_msg_trailer_t trailer; + } Request; +#ifdef __MigPackStructs +#pragma pack() +#endif + typedef __Request__exception_raise_t __Request; + typedef __Reply__exception_raise_t Reply; + + /* + * typedef struct { + * mach_msg_header_t Head; + * NDR_record_t NDR; + * kern_return_t RetCode; + * } mig_reply_error_t; + */ + + Request *In0P = (Request *) InHeadP; + Reply *OutP = (Reply *) OutHeadP; +#ifdef __MIG_check__Request__exception_raise_t__defined + kern_return_t check_result; +#endif /* __MIG_check__Request__exception_raise_t__defined */ + + __DeclareRcvRpc(2401, "exception_raise") + __BeforeRcvRpc(2401, "exception_raise") + +#if defined(__MIG_check__Request__exception_raise_t__defined) + check_result = __MIG_check__Request__exception_raise_t((__Request *)In0P); + if (check_result != MACH_MSG_SUCCESS) + { MIG_RETURN_ERROR(OutP, check_result); } +#endif /* defined(__MIG_check__Request__exception_raise_t__defined) */ + + OutP->RetCode = breakpad_exception_raise(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt); + + OutP->NDR = NDR_record; + + + __AfterRcvRpc(2401, "exception_raise") +} + +#if ( __MigTypeCheck || __NDR_convert__ ) +#if __MIG_check__Request__exc_subsystem__ +#if !defined(__MIG_check__Request__exception_raise_state_t__defined) +#define __MIG_check__Request__exception_raise_state_t__defined +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined +#if defined(__NDR_convert__int_rep__exc__exception_type_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__int_rep__exc__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__int_rep__exception_type_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__int_rep__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__int_rep__exc__int__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__int_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__int_rep__int__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__int_rep__int((int *)(a), f) +#elif defined(__NDR_convert__int_rep__exc__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__int_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__int_rep__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__int_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_t__code__defined +#if defined(__NDR_convert__int_rep__exc__exception_data_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__int_rep__exc__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__int_rep__exception_data_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__int_rep__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__int_rep__exc__integer_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__int_rep__exc__integer_t) +#elif defined(__NDR_convert__int_rep__integer_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__int_rep__integer_t) +#elif defined(__NDR_convert__int_rep__exc__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__int_rep__exc__int32_t) +#elif defined(__NDR_convert__int_rep__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__int_rep__int32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__code__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt__defined +#if defined(__NDR_convert__int_rep__exc__mach_msg_type_number_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt(a, f) \ + __NDR_convert__int_rep__exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f) +#elif defined(__NDR_convert__int_rep__mach_msg_type_number_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt(a, f) \ + __NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_t__flavor__defined +#if defined(__NDR_convert__int_rep__exc__int__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__int_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__int_rep__int__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__int_rep__int((int *)(a), f) +#elif defined(__NDR_convert__int_rep__exc__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__int_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__int_rep__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__int_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__flavor__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined +#if defined(__NDR_convert__int_rep__exc__thread_state_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__int_rep__exc__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__int_rep__thread_state_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__int_rep__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__int_rep__exc__natural_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__exc__natural_t) +#elif defined(__NDR_convert__int_rep__natural_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__natural_t) +#elif defined(__NDR_convert__int_rep__exc__uint32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__exc__uint32_t) +#elif defined(__NDR_convert__int_rep__uint32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__uint32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt__defined +#if defined(__NDR_convert__int_rep__exc__mach_msg_type_number_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt(a, f) \ + __NDR_convert__int_rep__exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f) +#elif defined(__NDR_convert__int_rep__mach_msg_type_number_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt(a, f) \ + __NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt__defined */ + +#ifndef __NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined +#if defined(__NDR_convert__char_rep__exc__exception_type_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__char_rep__exc__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__char_rep__exception_type_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__char_rep__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__char_rep__exc__int__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__char_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__char_rep__int__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__char_rep__int((int *)(a), f) +#elif defined(__NDR_convert__char_rep__exc__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__char_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__char_rep__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__char_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined */ + +#ifndef __NDR_convert__char_rep__Request__exception_raise_state_t__code__defined +#if defined(__NDR_convert__char_rep__exc__exception_data_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__char_rep__exc__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__char_rep__exception_data_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__char_rep__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__char_rep__exc__integer_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__char_rep__exc__integer_t) +#elif defined(__NDR_convert__char_rep__integer_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__char_rep__integer_t) +#elif defined(__NDR_convert__char_rep__exc__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__char_rep__exc__int32_t) +#elif defined(__NDR_convert__char_rep__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__char_rep__int32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_t__code__defined */ + +#ifndef __NDR_convert__char_rep__Request__exception_raise_state_t__flavor__defined +#if defined(__NDR_convert__char_rep__exc__int__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__char_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__char_rep__int__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__char_rep__int((int *)(a), f) +#elif defined(__NDR_convert__char_rep__exc__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__char_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__char_rep__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__char_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_t__flavor__defined */ + +#ifndef __NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined +#if defined(__NDR_convert__char_rep__exc__thread_state_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__char_rep__exc__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__char_rep__thread_state_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__char_rep__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__char_rep__exc__natural_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__exc__natural_t) +#elif defined(__NDR_convert__char_rep__natural_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__natural_t) +#elif defined(__NDR_convert__char_rep__exc__uint32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__exc__uint32_t) +#elif defined(__NDR_convert__char_rep__uint32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__uint32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined */ + +#ifndef __NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined +#if defined(__NDR_convert__float_rep__exc__exception_type_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__float_rep__exc__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__float_rep__exception_type_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__float_rep__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__float_rep__exc__int__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__float_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__float_rep__int__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__float_rep__int((int *)(a), f) +#elif defined(__NDR_convert__float_rep__exc__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__float_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__float_rep__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__exception(a, f) \ + __NDR_convert__float_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined */ + +#ifndef __NDR_convert__float_rep__Request__exception_raise_state_t__code__defined +#if defined(__NDR_convert__float_rep__exc__exception_data_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__float_rep__exc__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__float_rep__exception_data_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__float_rep__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__float_rep__exc__integer_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__float_rep__exc__integer_t) +#elif defined(__NDR_convert__float_rep__integer_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__float_rep__integer_t) +#elif defined(__NDR_convert__float_rep__exc__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__float_rep__exc__int32_t) +#elif defined(__NDR_convert__float_rep__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__float_rep__int32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_t__code__defined */ + +#ifndef __NDR_convert__float_rep__Request__exception_raise_state_t__flavor__defined +#if defined(__NDR_convert__float_rep__exc__int__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__float_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__float_rep__int__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__float_rep__int((int *)(a), f) +#elif defined(__NDR_convert__float_rep__exc__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__float_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__float_rep__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__flavor__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__flavor(a, f) \ + __NDR_convert__float_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_t__flavor__defined */ + +#ifndef __NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined +#if defined(__NDR_convert__float_rep__exc__thread_state_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__float_rep__exc__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__float_rep__thread_state_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__float_rep__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__float_rep__exc__natural_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__exc__natural_t) +#elif defined(__NDR_convert__float_rep__natural_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__natural_t) +#elif defined(__NDR_convert__float_rep__exc__uint32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__exc__uint32_t) +#elif defined(__NDR_convert__float_rep__uint32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__uint32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined */ + + +mig_internal kern_return_t __MIG_check__Request__exception_raise_state_t(__attribute__((__unused__)) __Request__exception_raise_state_t *In0P, __attribute__((__unused__)) __Request__exception_raise_state_t **In1PP) +{ + + typedef __Request__exception_raise_state_t __Request; + __Request *In1P; +#if __MigTypeCheck + unsigned int msgh_size; +#endif /* __MigTypeCheck */ + unsigned int msgh_size_delta; + +#if __MigTypeCheck + msgh_size = In0P->Head.msgh_size; + if ((In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || + (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 584)) || (msgh_size > (mach_msg_size_t)sizeof(__Request))) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) + __NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt__defined */ + msgh_size_delta = (4 * In0P->codeCnt); +#if __MigTypeCheck + if (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 584) + msgh_size_delta) + return MIG_BAD_ARGUMENTS; + msgh_size -= msgh_size_delta; +#endif /* __MigTypeCheck */ + + *In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 8); + +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) + __NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt__defined */ +#if __MigTypeCheck + if (msgh_size != (mach_msg_size_t)(sizeof(__Request) - 584) + ((4 * In1P->old_stateCnt))) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_state_t__code__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_state_t__flavor__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) { +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined) + __NDR_convert__int_rep__Request__exception_raise_state_t__exception(&In0P->exception, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__exception__defined */ +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_t__code__defined) + __NDR_convert__int_rep__Request__exception_raise_state_t__code(&In0P->code, In0P->NDR.int_rep, In0P->codeCnt); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__code__defined */ +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_t__flavor__defined) + __NDR_convert__int_rep__Request__exception_raise_state_t__flavor(&In1P->flavor, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__flavor__defined */ +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined) + __NDR_convert__int_rep__Request__exception_raise_state_t__old_state(&In1P->old_state, In0P->NDR.int_rep, In1P->old_stateCnt); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__old_state__defined */ + } +#endif /* defined(__NDR_convert__int_rep...) */ + +#if defined(__NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined) || \ + defined(__NDR_convert__char_rep__Request__exception_raise_state_t__code__defined) || \ + 0 || \ + defined(__NDR_convert__char_rep__Request__exception_raise_state_t__flavor__defined) || \ + defined(__NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined) || \ + 0 + if (In0P->NDR.char_rep != NDR_record.char_rep) { +#if defined(__NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined) + __NDR_convert__char_rep__Request__exception_raise_state_t__exception(&In0P->exception, In0P->NDR.char_rep); +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_t__exception__defined */ +#if defined(__NDR_convert__char_rep__Request__exception_raise_state_t__code__defined) + __NDR_convert__char_rep__Request__exception_raise_state_t__code(&In0P->code, In0P->NDR.char_rep, In0P->codeCnt); +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_t__code__defined */ +#if defined(__NDR_convert__char_rep__Request__exception_raise_state_t__flavor__defined) + __NDR_convert__char_rep__Request__exception_raise_state_t__flavor(&In1P->flavor, In0P->NDR.char_rep); +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_t__flavor__defined */ +#if defined(__NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined) + __NDR_convert__char_rep__Request__exception_raise_state_t__old_state(&In1P->old_state, In0P->NDR.char_rep, In1P->old_stateCnt); +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_t__old_state__defined */ + } +#endif /* defined(__NDR_convert__char_rep...) */ + +#if defined(__NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined) || \ + defined(__NDR_convert__float_rep__Request__exception_raise_state_t__code__defined) || \ + 0 || \ + defined(__NDR_convert__float_rep__Request__exception_raise_state_t__flavor__defined) || \ + defined(__NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined) || \ + 0 + if (In0P->NDR.float_rep != NDR_record.float_rep) { +#if defined(__NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined) + __NDR_convert__float_rep__Request__exception_raise_state_t__exception(&In0P->exception, In0P->NDR.float_rep); +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_t__exception__defined */ +#if defined(__NDR_convert__float_rep__Request__exception_raise_state_t__code__defined) + __NDR_convert__float_rep__Request__exception_raise_state_t__code(&In0P->code, In0P->NDR.float_rep, In0P->codeCnt); +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_t__code__defined */ +#if defined(__NDR_convert__float_rep__Request__exception_raise_state_t__flavor__defined) + __NDR_convert__float_rep__Request__exception_raise_state_t__flavor(&In1P->flavor, In0P->NDR.float_rep); +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_t__flavor__defined */ +#if defined(__NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined) + __NDR_convert__float_rep__Request__exception_raise_state_t__old_state(&In1P->old_state, In0P->NDR.float_rep, In1P->old_stateCnt); +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_t__old_state__defined */ + } +#endif /* defined(__NDR_convert__float_rep...) */ + + return MACH_MSG_SUCCESS; +} +#endif /* !defined(__MIG_check__Request__exception_raise_state_t__defined) */ +#endif /* __MIG_check__Request__exc_subsystem__ */ +#endif /* ( __MigTypeCheck || __NDR_convert__ ) */ + + +/* Routine exception_raise_state */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t breakpad_exception_raise_state +( + mach_port_t exception_port, + exception_type_t exception, + const exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + const thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt +); + +/* Routine exception_raise_state */ +mig_internal novalue _Xexception_raise_state + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) +{ + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[144]; + mach_msg_trailer_t trailer; + } Request; +#ifdef __MigPackStructs +#pragma pack() +#endif + typedef __Request__exception_raise_state_t __Request; + typedef __Reply__exception_raise_state_t Reply; + + /* + * typedef struct { + * mach_msg_header_t Head; + * NDR_record_t NDR; + * kern_return_t RetCode; + * } mig_reply_error_t; + */ + + Request *In0P = (Request *) InHeadP; + Request *In1P; + Reply *OutP = (Reply *) OutHeadP; +#ifdef __MIG_check__Request__exception_raise_state_t__defined + kern_return_t check_result; +#endif /* __MIG_check__Request__exception_raise_state_t__defined */ + + __DeclareRcvRpc(2402, "exception_raise_state") + __BeforeRcvRpc(2402, "exception_raise_state") + +#if defined(__MIG_check__Request__exception_raise_state_t__defined) + check_result = __MIG_check__Request__exception_raise_state_t((__Request *)In0P, (__Request **)&In1P); + if (check_result != MACH_MSG_SUCCESS) + { MIG_RETURN_ERROR(OutP, check_result); } +#endif /* defined(__MIG_check__Request__exception_raise_state_t__defined) */ + + OutP->new_stateCnt = 144; + + OutP->RetCode = breakpad_exception_raise_state(In0P->Head.msgh_request_port, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt); + if (OutP->RetCode != KERN_SUCCESS) { + MIG_RETURN_ERROR(OutP, OutP->RetCode); + } + + OutP->NDR = NDR_record; + + + OutP->flavor = In1P->flavor; + OutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 576) + (((4 * OutP->new_stateCnt))); + + __AfterRcvRpc(2402, "exception_raise_state") +} + +#if ( __MigTypeCheck || __NDR_convert__ ) +#if __MIG_check__Request__exc_subsystem__ +#if !defined(__MIG_check__Request__exception_raise_state_identity_t__defined) +#define __MIG_check__Request__exception_raise_state_identity_t__defined +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined +#if defined(__NDR_convert__int_rep__exc__exception_type_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__int_rep__exc__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__int_rep__exception_type_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__int_rep__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__int_rep__exc__int__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__int_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__int_rep__int__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__int_rep__int((int *)(a), f) +#elif defined(__NDR_convert__int_rep__exc__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__int_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__int_rep__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__int_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined +#if defined(__NDR_convert__int_rep__exc__exception_data_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__int_rep__exc__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__int_rep__exception_data_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__int_rep__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__int_rep__exc__integer_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__int_rep__exc__integer_t) +#elif defined(__NDR_convert__int_rep__integer_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__int_rep__integer_t) +#elif defined(__NDR_convert__int_rep__exc__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__int_rep__exc__int32_t) +#elif defined(__NDR_convert__int_rep__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__int_rep__int32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt__defined +#if defined(__NDR_convert__int_rep__exc__mach_msg_type_number_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt(a, f) \ + __NDR_convert__int_rep__exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f) +#elif defined(__NDR_convert__int_rep__mach_msg_type_number_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt(a, f) \ + __NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor__defined +#if defined(__NDR_convert__int_rep__exc__int__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__int_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__int_rep__int__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__int_rep__int((int *)(a), f) +#elif defined(__NDR_convert__int_rep__exc__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__int_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__int_rep__int32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__int_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined +#if defined(__NDR_convert__int_rep__exc__thread_state_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__int_rep__exc__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__int_rep__thread_state_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__int_rep__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__int_rep__exc__natural_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__exc__natural_t) +#elif defined(__NDR_convert__int_rep__natural_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__natural_t) +#elif defined(__NDR_convert__int_rep__exc__uint32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__exc__uint32_t) +#elif defined(__NDR_convert__int_rep__uint32_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__uint32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined */ + +#ifndef __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt__defined +#if defined(__NDR_convert__int_rep__exc__mach_msg_type_number_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt(a, f) \ + __NDR_convert__int_rep__exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f) +#elif defined(__NDR_convert__int_rep__mach_msg_type_number_t__defined) +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt__defined +#define __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt(a, f) \ + __NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt__defined */ + +#ifndef __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined +#if defined(__NDR_convert__char_rep__exc__exception_type_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__char_rep__exc__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__char_rep__exception_type_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__char_rep__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__char_rep__exc__int__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__char_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__char_rep__int__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__char_rep__int((int *)(a), f) +#elif defined(__NDR_convert__char_rep__exc__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__char_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__char_rep__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__char_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined */ + +#ifndef __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined +#if defined(__NDR_convert__char_rep__exc__exception_data_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__char_rep__exc__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__char_rep__exception_data_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__char_rep__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__char_rep__exc__integer_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__char_rep__exc__integer_t) +#elif defined(__NDR_convert__char_rep__integer_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__char_rep__integer_t) +#elif defined(__NDR_convert__char_rep__exc__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__char_rep__exc__int32_t) +#elif defined(__NDR_convert__char_rep__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__char_rep__int32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined */ + +#ifndef __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor__defined +#if defined(__NDR_convert__char_rep__exc__int__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__char_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__char_rep__int__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__char_rep__int((int *)(a), f) +#elif defined(__NDR_convert__char_rep__exc__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__char_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__char_rep__int32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__char_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor__defined */ + +#ifndef __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined +#if defined(__NDR_convert__char_rep__exc__thread_state_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__char_rep__exc__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__char_rep__thread_state_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__char_rep__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__char_rep__exc__natural_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__exc__natural_t) +#elif defined(__NDR_convert__char_rep__natural_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__natural_t) +#elif defined(__NDR_convert__char_rep__exc__uint32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__exc__uint32_t) +#elif defined(__NDR_convert__char_rep__uint32_t__defined) +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__uint32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined */ + +#ifndef __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined +#if defined(__NDR_convert__float_rep__exc__exception_type_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__float_rep__exc__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__float_rep__exception_type_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__float_rep__exception_type_t((exception_type_t *)(a), f) +#elif defined(__NDR_convert__float_rep__exc__int__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__float_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__float_rep__int__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__float_rep__int((int *)(a), f) +#elif defined(__NDR_convert__float_rep__exc__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__float_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__float_rep__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception(a, f) \ + __NDR_convert__float_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined */ + +#ifndef __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined +#if defined(__NDR_convert__float_rep__exc__exception_data_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__float_rep__exc__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__float_rep__exception_data_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__float_rep__exception_data_t((exception_data_t *)(a), f, c) +#elif defined(__NDR_convert__float_rep__exc__integer_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__float_rep__exc__integer_t) +#elif defined(__NDR_convert__float_rep__integer_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((integer_t *)(a), f, c, __NDR_convert__float_rep__integer_t) +#elif defined(__NDR_convert__float_rep__exc__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__float_rep__exc__int32_t) +#elif defined(__NDR_convert__float_rep__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code(a, f, c) \ + __NDR_convert__ARRAY((int32_t *)(a), f, c, __NDR_convert__float_rep__int32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined */ + +#ifndef __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor__defined +#if defined(__NDR_convert__float_rep__exc__int__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__float_rep__exc__int((int *)(a), f) +#elif defined(__NDR_convert__float_rep__int__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__float_rep__int((int *)(a), f) +#elif defined(__NDR_convert__float_rep__exc__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__float_rep__exc__int32_t((int32_t *)(a), f) +#elif defined(__NDR_convert__float_rep__int32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor(a, f) \ + __NDR_convert__float_rep__int32_t((int32_t *)(a), f) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor__defined */ + +#ifndef __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined +#if defined(__NDR_convert__float_rep__exc__thread_state_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__float_rep__exc__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__float_rep__thread_state_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__float_rep__thread_state_t((thread_state_t *)(a), f, c) +#elif defined(__NDR_convert__float_rep__exc__natural_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__exc__natural_t) +#elif defined(__NDR_convert__float_rep__natural_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__natural_t) +#elif defined(__NDR_convert__float_rep__exc__uint32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__exc__uint32_t) +#elif defined(__NDR_convert__float_rep__uint32_t__defined) +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined +#define __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state(a, f, c) \ + __NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__uint32_t) +#endif /* defined(__NDR_convert__*__defined) */ +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined */ + + +mig_internal kern_return_t __MIG_check__Request__exception_raise_state_identity_t(__attribute__((__unused__)) __Request__exception_raise_state_identity_t *In0P, __attribute__((__unused__)) __Request__exception_raise_state_identity_t **In1PP) +{ + + typedef __Request__exception_raise_state_identity_t __Request; + __Request *In1P; +#if __MigTypeCheck + unsigned int msgh_size; +#endif /* __MigTypeCheck */ + unsigned int msgh_size_delta; + +#if __MigTypeCheck + msgh_size = In0P->Head.msgh_size; + if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || + (In0P->msgh_body.msgh_descriptor_count != 2) || + (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 584)) || (msgh_size > (mach_msg_size_t)sizeof(__Request)) +) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + +#if __MigTypeCheck + if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR || + In0P->thread.disposition != 17) + return MIG_TYPE_ERROR; +#endif /* __MigTypeCheck */ + +#if __MigTypeCheck + if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR || + In0P->task.disposition != 17) + return MIG_TYPE_ERROR; +#endif /* __MigTypeCheck */ + +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) + __NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt__defined */ + msgh_size_delta = (4 * In0P->codeCnt); +#if __MigTypeCheck + if (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 584) + msgh_size_delta) + return MIG_BAD_ARGUMENTS; + msgh_size -= msgh_size_delta; +#endif /* __MigTypeCheck */ + + *In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 8); + +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) + __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt__defined */ +#if __MigTypeCheck + if (msgh_size != (mach_msg_size_t)(sizeof(__Request) - 584) + ((4 * In1P->old_stateCnt))) + return MIG_BAD_ARGUMENTS; +#endif /* __MigTypeCheck */ + +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined) || \ + defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt__defined) + if (In0P->NDR.int_rep != NDR_record.int_rep) { +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined) + __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception(&In0P->exception, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__exception__defined */ +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined) + __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code(&In0P->code, In0P->NDR.int_rep, In0P->codeCnt); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__code__defined */ +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor__defined) + __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor(&In1P->flavor, In0P->NDR.int_rep); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__flavor__defined */ +#if defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined) + __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state(&In1P->old_state, In0P->NDR.int_rep, In1P->old_stateCnt); +#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_state__defined */ + } +#endif /* defined(__NDR_convert__int_rep...) */ + +#if defined(__NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined) || \ + defined(__NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined) || \ + 0 || \ + defined(__NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor__defined) || \ + defined(__NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined) || \ + 0 + if (In0P->NDR.char_rep != NDR_record.char_rep) { +#if defined(__NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined) + __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception(&In0P->exception, In0P->NDR.char_rep); +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_identity_t__exception__defined */ +#if defined(__NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined) + __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code(&In0P->code, In0P->NDR.char_rep, In0P->codeCnt); +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_identity_t__code__defined */ +#if defined(__NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor__defined) + __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor(&In1P->flavor, In0P->NDR.char_rep); +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_identity_t__flavor__defined */ +#if defined(__NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined) + __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state(&In1P->old_state, In0P->NDR.char_rep, In1P->old_stateCnt); +#endif /* __NDR_convert__char_rep__Request__exception_raise_state_identity_t__old_state__defined */ + } +#endif /* defined(__NDR_convert__char_rep...) */ + +#if defined(__NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined) || \ + defined(__NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined) || \ + 0 || \ + defined(__NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor__defined) || \ + defined(__NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined) || \ + 0 + if (In0P->NDR.float_rep != NDR_record.float_rep) { +#if defined(__NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined) + __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception(&In0P->exception, In0P->NDR.float_rep); +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_identity_t__exception__defined */ +#if defined(__NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined) + __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code(&In0P->code, In0P->NDR.float_rep, In0P->codeCnt); +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_identity_t__code__defined */ +#if defined(__NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor__defined) + __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor(&In1P->flavor, In0P->NDR.float_rep); +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_identity_t__flavor__defined */ +#if defined(__NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined) + __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state(&In1P->old_state, In0P->NDR.float_rep, In1P->old_stateCnt); +#endif /* __NDR_convert__float_rep__Request__exception_raise_state_identity_t__old_state__defined */ + } +#endif /* defined(__NDR_convert__float_rep...) */ + + return MACH_MSG_SUCCESS; +} +#endif /* !defined(__MIG_check__Request__exception_raise_state_identity_t__defined) */ +#endif /* __MIG_check__Request__exc_subsystem__ */ +#endif /* ( __MigTypeCheck || __NDR_convert__ ) */ + + +/* Routine exception_raise_state_identity */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t breakpad_exception_raise_state_identity +( + mach_port_t exception_port, + mach_port_t thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt +); + +/* Routine exception_raise_state_identity */ +mig_internal novalue _Xexception_raise_state_identity + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) +{ + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[144]; + mach_msg_trailer_t trailer; + } Request; +#ifdef __MigPackStructs +#pragma pack() +#endif + typedef __Request__exception_raise_state_identity_t __Request; + typedef __Reply__exception_raise_state_identity_t Reply; + + /* + * typedef struct { + * mach_msg_header_t Head; + * NDR_record_t NDR; + * kern_return_t RetCode; + * } mig_reply_error_t; + */ + + Request *In0P = (Request *) InHeadP; + Request *In1P; + Reply *OutP = (Reply *) OutHeadP; +#ifdef __MIG_check__Request__exception_raise_state_identity_t__defined + kern_return_t check_result; +#endif /* __MIG_check__Request__exception_raise_state_identity_t__defined */ + + __DeclareRcvRpc(2403, "exception_raise_state_identity") + __BeforeRcvRpc(2403, "exception_raise_state_identity") + +#if defined(__MIG_check__Request__exception_raise_state_identity_t__defined) + check_result = __MIG_check__Request__exception_raise_state_identity_t((__Request *)In0P, (__Request **)&In1P); + if (check_result != MACH_MSG_SUCCESS) + { MIG_RETURN_ERROR(OutP, check_result); } +#endif /* defined(__MIG_check__Request__exception_raise_state_identity_t__defined) */ + + OutP->new_stateCnt = 144; + + OutP->RetCode = breakpad_exception_raise_state_identity(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt); + if (OutP->RetCode != KERN_SUCCESS) { + MIG_RETURN_ERROR(OutP, OutP->RetCode); + } + + OutP->NDR = NDR_record; + + + OutP->flavor = In1P->flavor; + OutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 576) + (((4 * OutP->new_stateCnt))); + + __AfterRcvRpc(2403, "exception_raise_state_identity") +} + + +extern boolean_t exc_server( + mach_msg_header_t *InHeadP, + mach_msg_header_t *OutHeadP); + +extern mig_routine_t exc_server_routine( + mach_msg_header_t *InHeadP); + + +/* Description of this subsystem, for use in direct RPC */ +const struct breakpad_exc_subsystem { + mig_server_routine_t server; /* Server routine */ + mach_msg_id_t start; /* Min routine number */ + mach_msg_id_t end; /* Max routine number + 1 */ + unsigned int maxsize; /* Max msg size */ + vm_address_t reserved; /* Reserved */ + struct routine_descriptor /*Array of routine descriptors */ + routine[3]; +} breakpad_exc_subsystem = { + exc_server_routine, + 2401, + 2404, + (mach_msg_size_t)sizeof(union __ReplyUnion__breakpad_exc_subsystem), + (vm_address_t)0, + { + { (mig_impl_routine_t) 0, + (mig_stub_routine_t) _Xexception_raise, 6, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__exception_raise_t)}, + { (mig_impl_routine_t) 0, + (mig_stub_routine_t) _Xexception_raise_state, 9, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__exception_raise_state_t)}, + { (mig_impl_routine_t) 0, + (mig_stub_routine_t) _Xexception_raise_state_identity, 11, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__exception_raise_state_identity_t)}, + } +}; + +mig_external boolean_t exc_server + (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) +{ + /* + * typedef struct { + * mach_msg_header_t Head; + * NDR_record_t NDR; + * kern_return_t RetCode; + * } mig_reply_error_t; + */ + + register mig_routine_t routine; + + OutHeadP->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REPLY(InHeadP->msgh_bits), 0); + OutHeadP->msgh_remote_port = InHeadP->msgh_reply_port; + /* Minimal size: routine() will update it if different */ + OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t); + OutHeadP->msgh_local_port = MACH_PORT_NULL; + OutHeadP->msgh_id = InHeadP->msgh_id + 100; + + if ((InHeadP->msgh_id > 2403) || (InHeadP->msgh_id < 2401) || + ((routine = breakpad_exc_subsystem.routine[InHeadP->msgh_id - 2401].stub_routine) == 0)) { + ((mig_reply_error_t *)OutHeadP)->NDR = NDR_record; + ((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID; + return FALSE; + } + (*routine) (InHeadP, OutHeadP); + return TRUE; +} + +mig_external mig_routine_t exc_server_routine + (mach_msg_header_t *InHeadP) +{ + register int msgh_id; + + msgh_id = InHeadP->msgh_id - 2401; + + if ((msgh_id > 2) || (msgh_id < 0)) + return 0; + + return breakpad_exc_subsystem.routine[msgh_id].stub_routine; +} diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_exc_server.h b/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_exc_server.h new file mode 100644 index 00000000..c05f25a8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_exc_server.h @@ -0,0 +1,258 @@ +#ifndef _exc_user_ +#define _exc_user_ + +/* Module exc */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef AUTOTEST +#ifndef FUNCTION_PTR_T +#define FUNCTION_PTR_T +typedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t); +typedef struct { + char *name; + function_ptr_t function; +} function_table_entry; +typedef function_table_entry *function_table_t; +#endif /* FUNCTION_PTR_T */ +#endif /* AUTOTEST */ + +#ifndef exc_MSG_COUNT +#define exc_MSG_COUNT 3 +#endif /* exc_MSG_COUNT */ + +#include +#include +#include +#include + +#ifdef __BeforeMigUserHeader +__BeforeMigUserHeader +#endif /* __BeforeMigUserHeader */ + +#include +__BEGIN_DECLS + + +/* Routine exception_raise */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t exception_raise +( + mach_port_t exception_port, + mach_port_t thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t codeCnt +); + +/* Routine exception_raise_state */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t exception_raise_state +( + mach_port_t exception_port, + exception_type_t exception, + const exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + const thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt +); + +/* Routine exception_raise_state_identity */ +#ifdef mig_external +mig_external +#else +extern +#endif /* mig_external */ +kern_return_t exception_raise_state_identity +( + mach_port_t exception_port, + mach_port_t thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt +); + +__END_DECLS + +/********************** Caution **************************/ +/* The following data types should be used to calculate */ +/* maximum message sizes only. The actual message may be */ +/* smaller, and the position of the arguments within the */ +/* message layout may vary from what is presented here. */ +/* For example, if any of the arguments are variable- */ +/* sized, and less than the maximum is sent, the data */ +/* will be packed tight in the actual message to reduce */ +/* the presence of holes. */ +/********************** Caution **************************/ + +/* typedefs for all requests */ + +#ifndef __Request__exc_subsystem__defined +#define __Request__exc_subsystem__defined + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + } __Request__exception_raise_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[144]; + } __Request__exception_raise_state_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[144]; + } __Request__exception_raise_state_identity_t; +#ifdef __MigPackStructs +#pragma pack() +#endif +#endif /* !__Request__exc_subsystem__defined */ + +/* union of all requests */ + +#ifndef __RequestUnion__exc_subsystem__defined +#define __RequestUnion__exc_subsystem__defined +union __RequestUnion__exc_subsystem { + __Request__exception_raise_t Request_exception_raise; + __Request__exception_raise_state_t Request_exception_raise_state; + __Request__exception_raise_state_identity_t Request_exception_raise_state_identity; +}; +#endif /* !__RequestUnion__exc_subsystem__defined */ +/* typedefs for all replies */ + +#ifndef __Reply__exc_subsystem__defined +#define __Reply__exc_subsystem__defined + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + } __Reply__exception_raise_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + int flavor; + mach_msg_type_number_t new_stateCnt; + natural_t new_state[144]; + } __Reply__exception_raise_state_t; +#ifdef __MigPackStructs +#pragma pack() +#endif + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + int flavor; + mach_msg_type_number_t new_stateCnt; + natural_t new_state[144]; + } __Reply__exception_raise_state_identity_t; +#ifdef __MigPackStructs +#pragma pack() +#endif +#endif /* !__Reply__exc_subsystem__defined */ + +/* union of all replies */ + +#ifndef __ReplyUnion__exc_subsystem__defined +#define __ReplyUnion__exc_subsystem__defined +union __ReplyUnion__exc_subsystem { + __Reply__exception_raise_t Reply_exception_raise; + __Reply__exception_raise_state_t Reply_exception_raise_state; + __Reply__exception_raise_state_identity_t Reply_exception_raise_state_identity; +}; +#endif /* !__RequestUnion__exc_subsystem__defined */ + +#ifndef subsystem_to_name_map_exc +#define subsystem_to_name_map_exc \ + { "exception_raise", 2401 },\ + { "exception_raise_state", 2402 },\ + { "exception_raise_state_identity", 2403 } +#endif + +#ifdef __AfterMigUserHeader +__AfterMigUserHeader +#endif /* __AfterMigUserHeader */ + +#endif /* _exc_user_ */ diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_nlist_64.cc b/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_nlist_64.cc new file mode 100644 index 00000000..c220d88d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_nlist_64.cc @@ -0,0 +1,381 @@ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + + +/* nealsid: + * This file was copied from libc/gen/nlist.c from Darwin's source code + * The version of nlist used as a base is from 10.5.2, libc-498 + * http://www.opensource.apple.com/darwinsource/10.5.2/Libc-498/gen/nlist.c + * + * The full tarball is at: + * http://www.opensource.apple.com/darwinsource/tarballs/apsl/Libc-498.tar.gz + * + * I've modified it to be compatible with 64-bit images. However, + * 32-bit compatibility has not been retained. +*/ + +#ifdef __LP64__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "breakpad_nlist_64.h" +#include +#include +#include + +/* Stuff lifted from and since they are gone */ +/* + * Header prepended to each a.out file. + */ +struct exec { + unsigned short a_machtype; /* machine type */ + unsigned short a_magic; /* magic number */ + unsigned long a_text; /* size of text segment */ + unsigned long a_data; /* size of initialized data */ + unsigned long a_bss; /* size of uninitialized data */ + unsigned long a_syms; /* size of symbol table */ + unsigned long a_entry; /* entry point */ + unsigned long a_trsize; /* size of text relocation */ + unsigned long a_drsize; /* size of data relocation */ +}; + +#define OMAGIC 0407 /* old impure format */ +#define NMAGIC 0410 /* read-only text */ +#define ZMAGIC 0413 /* demand load format */ + +#define N_BADMAG(x) \ + (((x).a_magic)!=OMAGIC && ((x).a_magic)!=NMAGIC && ((x).a_magic)!=ZMAGIC) +#define N_TXTOFF(x) \ + ((x).a_magic==ZMAGIC ? 0 : sizeof (struct exec)) +#define N_SYMOFF(x) \ + (N_TXTOFF(x) + (x).a_text+(x).a_data + (x).a_trsize+(x).a_drsize) + +int +__breakpad_fdnlist_64(int fd, breakpad_nlist *list, const char **symbolNames); + +/* + * nlist - retreive attributes from name list (string table version) + */ + +int +breakpad_nlist_64(const char *name, + breakpad_nlist *list, + const char **symbolNames) { + int fd, n; + + fd = open(name, O_RDONLY, 0); + if (fd < 0) + return (-1); + n = __breakpad_fdnlist_64(fd, list, symbolNames); + (void)close(fd); + return (n); +} + +/* Note: __fdnlist() is called from kvm_nlist in libkvm's kvm.c */ + +int +__breakpad_fdnlist_64(int fd, breakpad_nlist *list, const char **symbolNames) { + register breakpad_nlist *p, *q; + breakpad_nlist space[BUFSIZ/sizeof (breakpad_nlist)]; + + const register char *s1, *s2; + register int n, m; + int maxlen, nreq; + off_t sa; /* symbol address */ + off_t ss; /* start of strings */ + struct exec buf; + unsigned arch_offset = 0; + + maxlen = 500; + for (q = list, nreq = 0; + symbolNames[q-list] && symbolNames[q-list][0]; + q++, nreq++) { + + q->n_type = 0; + q->n_value = 0; + q->n_desc = 0; + q->n_sect = 0; + q->n_un.n_strx = 0; + } + + if (read(fd, (char *)&buf, sizeof(buf)) != sizeof(buf) || + (N_BADMAG(buf) && *((long *)&buf) != MH_MAGIC && + NXSwapBigLongToHost(*((long *)&buf)) != FAT_MAGIC) && + /* nealsid: The following is the big-endian ppc64 check */ + (*((uint32_t*)&buf)) != FAT_MAGIC) { + return (-1); + } + + /* Deal with fat file if necessary */ + if (NXSwapBigLongToHost(*((long *)&buf)) == FAT_MAGIC || + /* nealsid: The following is the big-endian ppc64 check */ + *((int*)&buf) == FAT_MAGIC) { + struct host_basic_info hbi; + struct fat_header fh; + struct fat_arch *fat_archs, *fap; + unsigned i; + host_t host; + + /* Get our host info */ + host = mach_host_self(); + i = HOST_BASIC_INFO_COUNT; + kern_return_t kr; + if ((kr=host_info(host, HOST_BASIC_INFO, + (host_info_t)(&hbi), &i)) != KERN_SUCCESS) { + return (-1); + } + mach_port_deallocate(mach_task_self(), host); + + /* Read in the fat header */ + lseek(fd, 0, SEEK_SET); + if (read(fd, (char *)&fh, sizeof(fh)) != sizeof(fh)) { + return (-1); + } + + /* Convert fat_narchs to host byte order */ + fh.nfat_arch = NXSwapBigLongToHost(fh.nfat_arch); + + /* Read in the fat archs */ + fat_archs = (struct fat_arch *)malloc(fh.nfat_arch * + sizeof(struct fat_arch)); + if (fat_archs == NULL) { + return (-1); + } + if (read(fd, (char *)fat_archs, + sizeof(struct fat_arch) * fh.nfat_arch) != + sizeof(struct fat_arch) * fh.nfat_arch) { + free(fat_archs); + return (-1); + } + + /* + * Convert archs to host byte ordering (a constraint of + * cpusubtype_getbestarch() + */ + for (i = 0; i < fh.nfat_arch; i++) { + fat_archs[i].cputype = + NXSwapBigLongToHost(fat_archs[i].cputype); + fat_archs[i].cpusubtype = + NXSwapBigLongToHost(fat_archs[i].cpusubtype); + fat_archs[i].offset = + NXSwapBigLongToHost(fat_archs[i].offset); + fat_archs[i].size = + NXSwapBigLongToHost(fat_archs[i].size); + fat_archs[i].align = + NXSwapBigLongToHost(fat_archs[i].align); + } + + fap = NULL; + for (i = 0; i < fh.nfat_arch; i++) { + /* nealsid: Although the original Apple code uses host_info */ + /* to retrieve the CPU type, the host_info will still return */ + /* CPU_TYPE_X86 even if running as an x86_64 binary. Given that */ + /* this code isn't necessary on i386, I've decided to hardcode */ + /* looking for a 64-bit binary */ +#if TARGET_CPU_X86_64 + if (fat_archs[i].cputype == CPU_TYPE_X86_64) { +#elif TARGET_CPU_PPC64 + if (fat_archs[i].cputype == CPU_TYPE_POWERPC64) { +#else +#error undefined cpu! + { +#endif + fap = &fat_archs[i]; + break; + } + } + + if (!fap) { + free(fat_archs); + return (-1); + } + arch_offset = fap->offset; + free(fat_archs); + + /* Read in the beginning of the architecture-specific file */ + lseek(fd, arch_offset, SEEK_SET); + if (read(fd, (char *)&buf, sizeof(buf)) != sizeof(buf)) { + return (-1); + } + } + + if (*((int *)&buf) == MH_MAGIC_64) { + struct mach_header_64 mh; + struct load_command *load_commands, *lcp; + struct symtab_command *stp; + long i; + + lseek(fd, arch_offset, SEEK_SET); + if (read(fd, (char *)&mh, sizeof(mh)) != sizeof(mh)) { + return (-1); + } + load_commands = (struct load_command *)malloc(mh.sizeofcmds); + if (load_commands == NULL) { + return (-1); + } + if (read(fd, (char *)load_commands, mh.sizeofcmds) != + mh.sizeofcmds) { + free(load_commands); + return (-1); + } + stp = NULL; + lcp = load_commands; + // nealsid:iterate through all load commands, looking for + // LC_SYMTAB load command + for (i = 0; i < mh.ncmds; i++) { + if (lcp->cmdsize % sizeof(long) != 0 || + lcp->cmdsize <= 0 || + (char *)lcp + lcp->cmdsize > + (char *)load_commands + mh.sizeofcmds) { + free(load_commands); + return (-1); + } + if (lcp->cmd == LC_SYMTAB) { + if (lcp->cmdsize != + sizeof(struct symtab_command)) { + free(load_commands); + return (-1); + } + stp = (struct symtab_command *)lcp; + break; + } + lcp = (struct load_command *) + ((char *)lcp + lcp->cmdsize); + } + if (stp == NULL) { + free(load_commands); + return (-1); + } + // sa points to the beginning of the symbol table + sa = stp->symoff + arch_offset; + // ss points to the beginning of the string table + ss = stp->stroff + arch_offset; + // n is the number of bytes in the symbol table + // each symbol table entry is an nlist structure + n = stp->nsyms * sizeof(breakpad_nlist); + free(load_commands); + } + else { + sa = N_SYMOFF(buf) + arch_offset; + ss = sa + buf.a_syms + arch_offset; + n = buf.a_syms; + } + + lseek(fd, sa, SEEK_SET); + + // the algorithm here is to read the nlist entries in m-sized + // chunks into q. q is then iterated over. for each entry in q, + // use the string table index(q->n_un.n_strx) to read the symbol + // name, then scan the nlist entries passed in by the user(via p), + // and look for a match + while (n) { + long savpos; + + m = sizeof (space); + if (n < m) + m = n; + if (read(fd, (char *)space, m) != m) + break; + n -= m; + savpos = lseek(fd, 0, SEEK_CUR); + for (q = space; (m -= sizeof(breakpad_nlist)) >= 0; q++) { + char nambuf[BUFSIZ]; + + if (q->n_un.n_strx == 0 || q->n_type & N_STAB) + continue; + + // seek to the location in the binary where the symbol + // name is stored & read it into memory + lseek(fd, ss+q->n_un.n_strx, SEEK_SET); + read(fd, nambuf, maxlen+1); + s2 = nambuf; + for (p = list; + symbolNames[p-list] && + symbolNames[p-list][0]; + p++) { + // get the symbol name the user has passed in that + // corresponds to the nlist entry that we're looking at + s1 = symbolNames[p - list]; + while (*s1) { + if (*s1++ != *s2++) + goto cont; + } + if (*s2) + goto cont; + + p->n_value = q->n_value; + p->n_type = q->n_type; + p->n_desc = q->n_desc; + p->n_sect = q->n_sect; + p->n_un.n_strx = q->n_un.n_strx; + if (--nreq == 0) + return (nreq); + + break; + cont: ; + } + } + lseek(fd, savpos, SEEK_SET); + } + return (nreq); + } + +#endif /* __LP64__ */ diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_nlist_64.h b/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_nlist_64.h new file mode 100644 index 00000000..ee10afb9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/breakpad_nlist_64.h @@ -0,0 +1,43 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// breakpad_nlist.h +// +// This file is meant to provide a header for clients of the modified +// nlist function implemented to work on 64-bit. + +#ifndef CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__ + +typedef struct nlist_64 breakpad_nlist; + +int +breakpad_nlist_64(const char *name, + breakpad_nlist *list, + const char **symbolNames); + +#endif /* CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/dynamic_images.cc b/thirdparty/google-breakpad/r318/src/client/mac/handler/dynamic_images.cc new file mode 100644 index 00000000..a2d62700 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/dynamic_images.cc @@ -0,0 +1,456 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +extern "C" { // needed to compile on Leopard + #include + #include + #include + #include +} + +#include "breakpad_nlist_64.h" +#include +#include +#include +#include "client/mac/handler/dynamic_images.h" + +namespace google_breakpad { + +//============================================================================== +// Returns the size of the memory region containing |address| and the +// number of bytes from |address| to the end of the region. +// We potentially, will extend the size of the original +// region by the size of the following region if it's contiguous with the +// first in order to handle cases when we're reading strings and they +// straddle two vm regions. +// +static mach_vm_size_t GetMemoryRegionSize(task_port_t target_task, + const void* address, + mach_vm_size_t *size_to_end) { + mach_vm_address_t region_base = (mach_vm_address_t)address; + mach_vm_size_t region_size; + natural_t nesting_level = 0; + vm_region_submap_info_64 submap_info; + mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64; + + // Get information about the vm region containing |address| + vm_region_recurse_info_t region_info; + region_info = reinterpret_cast(&submap_info); + + kern_return_t result = + mach_vm_region_recurse(target_task, + ®ion_base, + ®ion_size, + &nesting_level, + region_info, + &info_count); + + if (result == KERN_SUCCESS) { + // Get distance from |address| to the end of this region + *size_to_end = region_base + region_size -(mach_vm_address_t)address; + + // If we want to handle strings as long as 4096 characters we may need + // to check if there's a vm region immediately following the first one. + // If so, we need to extend |*size_to_end| to go all the way to the end + // of the second region. + if (*size_to_end < 4096) { + // Second region starts where the first one ends + mach_vm_address_t region_base2 = + (mach_vm_address_t)(region_base + region_size); + mach_vm_size_t region_size2; + + // Get information about the following vm region + result = + mach_vm_region_recurse(target_task, + ®ion_base2, + ®ion_size2, + &nesting_level, + region_info, + &info_count); + + // Extend region_size to go all the way to the end of the 2nd region + if (result == KERN_SUCCESS + && region_base2 == region_base + region_size) { + region_size += region_size2; + } + } + + *size_to_end = region_base + region_size -(mach_vm_address_t)address; + } else { + region_size = 0; + *size_to_end = 0; + } + + return region_size; +} + +#define kMaxStringLength 8192 +//============================================================================== +// Reads a NULL-terminated string from another task. +// +// Warning! This will not read any strings longer than kMaxStringLength-1 +// +static void* ReadTaskString(task_port_t target_task, + const void* address) { + // The problem is we don't know how much to read until we know how long + // the string is. And we don't know how long the string is, until we've read + // the memory! So, we'll try to read kMaxStringLength bytes + // (or as many bytes as we can until we reach the end of the vm region). + mach_vm_size_t size_to_end; + GetMemoryRegionSize(target_task, address, &size_to_end); + + if (size_to_end > 0) { + mach_vm_size_t size_to_read = + size_to_end > kMaxStringLength ? kMaxStringLength : size_to_end; + + kern_return_t kr; + return ReadTaskMemory(target_task, address, size_to_read, &kr); + } + + return NULL; +} + +//============================================================================== +// Reads an address range from another task. A block of memory is malloced +// and should be freed by the caller. +void* ReadTaskMemory(task_port_t target_task, + const void* address, + size_t length, + kern_return_t *kr) { + void* result = NULL; + int systemPageSize = getpagesize(); + + // use the negative of the page size for the mask to find the page address + mach_vm_address_t page_address = + reinterpret_cast(address) & (-systemPageSize); + + mach_vm_address_t last_page_address = + (reinterpret_cast(address) + length + + (systemPageSize - 1)) & (-systemPageSize); + + mach_vm_size_t page_size = last_page_address - page_address; + uint8_t* local_start; + uint32_t local_length; + + kern_return_t r; + + r = mach_vm_read(target_task, + page_address, + page_size, + reinterpret_cast(&local_start), + &local_length); + + + if (kr != NULL) { + *kr = r; + } + + if (r == KERN_SUCCESS) { + result = malloc(length); + if (result != NULL) { + memcpy(result, + &local_start[(mach_vm_address_t)address - page_address], + length); + } + mach_vm_deallocate(mach_task_self(), (uintptr_t)local_start, local_length); + } + + return result; +} + +#pragma mark - + +//============================================================================== +// Initializes vmaddr_, vmsize_, and slide_ +void DynamicImage::CalculateMemoryAndVersionInfo() { + breakpad_mach_header *header = GetMachHeader(); + + // unless we can process the header, ensure that calls to + // IsValid() will return false + vmaddr_ = 0; + vmsize_ = 0; + slide_ = 0; + version_ = 0; + + bool foundTextSection = false; + bool foundDylibIDCommand = false; + +#if __LP64__ + if(header->magic != MH_MAGIC_64) { + return; + } +#else + if(header->magic != MH_MAGIC) { + return; + } +#endif + + uint32_t versionSize = 0; +#ifdef __LP64__ + const uint32_t segmentLoadCommand = LC_SEGMENT_64; + char* sectVersion = getsectdatafromheader_64(header, SEG_DATA, "__version", &versionSize); +#else + const uint32_t segmentLoadCommand = LC_SEGMENT; + char* sectVersion = getsectdatafromheader(header, SEG_DATA, "__version", &versionSize); +#endif + + if (versionSize == 4) { + version_ = NXSwapHostLongToBig(*(unsigned long*)sectVersion); + } + + const struct load_command *cmd = + reinterpret_cast(header + 1); + + for (unsigned int i = 0; cmd && (i < header->ncmds); ++i) { + if (!foundTextSection) { + if (cmd->cmd == segmentLoadCommand) { + const breakpad_mach_segment_command *seg = + reinterpret_cast(cmd); + + if (!strcmp(seg->segname, "__TEXT")) { + vmaddr_ = seg->vmaddr; + vmsize_ = seg->vmsize; + slide_ = 0; + + if (seg->fileoff == 0 && seg->filesize != 0) { + slide_ = (uintptr_t)GetLoadAddress() - (uintptr_t)seg->vmaddr; + } + foundTextSection = true; + } + } + } + + if (!foundDylibIDCommand) { + if (cmd->cmd == LC_ID_DYLIB) { + const struct dylib_command *dc = + reinterpret_cast(cmd); + + version_ = dc->dylib.current_version; + foundDylibIDCommand = true; + } + } + + if (foundDylibIDCommand && foundTextSection) { + return; + } + + cmd = reinterpret_cast + (reinterpret_cast(cmd) + cmd->cmdsize); + } + +} + +void DynamicImage::Print() { + const char *path = GetFilePath(); + if (!path) { + path = "(unknown)"; + } + printf("%p: %s\n", GetLoadAddress(), path); + breakpad_mach_header *header = GetMachHeader(); + MachHeader(*header).Print(); + printf("vmaddr\t\t: %p\n", reinterpret_cast(GetVMAddr())); + printf("vmsize\t\t: %llu\n", GetVMSize()); + printf("slide\t\t: %td\n", GetVMAddrSlide()); +} + +#pragma mark - + +//============================================================================== +// Loads information about dynamically loaded code in the given task. +DynamicImages::DynamicImages(mach_port_t task) + : task_(task) { + ReadImageInfoForTask(); +} + +void* DynamicImages::GetDyldAllImageInfosPointer() +{ + + const char *imageSymbolName = "_dyld_all_image_infos"; + const char *dyldPath = "/usr/lib/dyld"; +#ifndef __LP64__ + struct nlist l[8]; + memset(l, 0, sizeof(l) ); + + // First we lookup the address of the "_dyld_all_image_infos" struct + // which lives in "dyld". This structure contains information about all + // of the loaded dynamic images. + struct nlist &list = l[0]; + list.n_un.n_name = const_cast(imageSymbolName); + nlist(dyldPath,&list); + if(list.n_value) { + return reinterpret_cast(list.n_value); + } + + return NULL; +#else + struct nlist_64 l[8]; + struct nlist_64 &list = l[0]; + + memset(l, 0, sizeof(l) ); + + const char *symbolNames[2] = { imageSymbolName, "\0" }; + + int invalidEntriesCount = breakpad_nlist_64(dyldPath,&list,symbolNames); + + if(invalidEntriesCount != 0) { + return NULL; + } + assert(list.n_value); + return reinterpret_cast(list.n_value); +#endif + +} +//============================================================================== +// This code was written using dyld_debug.c (from Darwin) as a guide. +void DynamicImages::ReadImageInfoForTask() { + void *imageList = GetDyldAllImageInfosPointer(); + + if (imageList) { + kern_return_t kr; + // Read the structure inside of dyld that contains information about + // loaded images. We're reading from the desired task's address space. + + // Here we make the assumption that dyld loaded at the same address in + // the crashed process vs. this one. This is an assumption made in + // "dyld_debug.c" and is said to be nearly always valid. + dyld_all_image_infos *dyldInfo = reinterpret_cast + (ReadTaskMemory(task_, + reinterpret_cast(imageList), + sizeof(dyld_all_image_infos), &kr)); + + if (dyldInfo) { + // number of loaded images + int count = dyldInfo->infoArrayCount; + + // Read an array of dyld_image_info structures each containing + // information about a loaded image. + dyld_image_info *infoArray = reinterpret_cast + (ReadTaskMemory(task_, + dyldInfo->infoArray, + count*sizeof(dyld_image_info), &kr)); + + image_list_.reserve(count); + + for (int i = 0; i < count; ++i) { + dyld_image_info &info = infoArray[i]; + + // First read just the mach_header from the image in the task. + breakpad_mach_header *header = reinterpret_cast + (ReadTaskMemory(task_, + info.load_address_, + sizeof(breakpad_mach_header), &kr)); + + if (!header) + break; // bail on this dynamic image + + // Now determine the total amount we really want to read based on the + // size of the load commands. We need the header plus all of the + // load commands. + unsigned int header_size = + sizeof(breakpad_mach_header) + header->sizeofcmds; + + free(header); + + header = reinterpret_cast + (ReadTaskMemory(task_, info.load_address_, header_size, &kr)); + + // Read the file name from the task's memory space. + char *file_path = NULL; + if (info.file_path_) { + // Although we're reading kMaxStringLength bytes, it's copied in the + // the DynamicImage constructor below with the correct string length, + // so it's not really wasting memory. + file_path = reinterpret_cast + (ReadTaskString(task_, info.file_path_)); + } + + // Create an object representing this image and add it to our list. + DynamicImage *new_image; + new_image = new DynamicImage(header, + header_size, + (breakpad_mach_header*)info.load_address_, + file_path, + info.file_mod_date_, + task_); + + if (new_image->IsValid()) { + image_list_.push_back(DynamicImageRef(new_image)); + } else { + delete new_image; + } + + if (file_path) { + free(file_path); + } + } + + free(dyldInfo); + free(infoArray); + + // sorts based on loading address + sort(image_list_.begin(), image_list_.end() ); + // remove duplicates - this happens in certain strange cases + // You can see it in DashboardClient when Google Gadgets plugin + // is installed. Apple's crash reporter log and gdb "info shared" + // both show the same library multiple times at the same address + + vector::iterator it = unique(image_list_.begin(), + image_list_.end() ); + image_list_.erase(it, image_list_.end()); + } + } +} + +//============================================================================== +DynamicImage *DynamicImages::GetExecutableImage() { + int executable_index = GetExecutableImageIndex(); + + if (executable_index >= 0) { + return GetImage(executable_index); + } + + return NULL; +} + +//============================================================================== +// returns -1 if failure to find executable +int DynamicImages::GetExecutableImageIndex() { + int image_count = GetImageCount(); + + for (int i = 0; i < image_count; ++i) { + DynamicImage *image = GetImage(i); + if (image->GetMachHeader()->filetype == MH_EXECUTE) { + return i; + } + } + + return -1; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/dynamic_images.h b/thirdparty/google-breakpad/r318/src/client/mac/handler/dynamic_images.h new file mode 100644 index 00000000..85ba8cf9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/dynamic_images.h @@ -0,0 +1,297 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dynamic_images.h +// +// Implements most of the function of the dyld API, but allowing an +// arbitrary task to be introspected, unlike the dyld API which +// only allows operation on the current task. The current implementation +// is limited to use by 32-bit tasks. + +#ifndef CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__ +#define CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__ + +#include +#include +#include +#include +#include + +namespace google_breakpad { + +using std::vector; + +//============================================================================== +// The memory layout of this struct matches the dyld_image_info struct +// defined in "dyld_gdb.h" in the darwin source. +typedef struct dyld_image_info { + struct mach_header *load_address_; + char *file_path_; + uintptr_t file_mod_date_; +} dyld_image_info; + +//============================================================================== +// This is as defined in "dyld_gdb.h" in the darwin source. +// _dyld_all_image_infos (in dyld) is a structure of this type +// which will be used to determine which dynamic code has been loaded. +typedef struct dyld_all_image_infos { + uint32_t version; // == 1 in Mac OS X 10.4 + uint32_t infoArrayCount; + const struct dyld_image_info *infoArray; + void* notification; + bool processDetachedFromSharedRegion; +} dyld_all_image_infos; + +// some typedefs to isolate 64/32 bit differences +#ifdef __LP64__ +typedef mach_header_64 breakpad_mach_header; +typedef segment_command_64 breakpad_mach_segment_command; +#else +typedef mach_header breakpad_mach_header; +typedef segment_command breakpad_mach_segment_command; +#endif + +//============================================================================== +// A simple wrapper for a mach_header +// +// This could be fleshed out with some more interesting methods. +class MachHeader { + public: + explicit MachHeader(const breakpad_mach_header &header) : header_(header) {} + + void Print() { + printf("magic\t\t: %4x\n", header_.magic); + printf("cputype\t\t: %d\n", header_.cputype); + printf("cpusubtype\t: %d\n", header_.cpusubtype); + printf("filetype\t: %d\n", header_.filetype); + printf("ncmds\t\t: %d\n", header_.ncmds); + printf("sizeofcmds\t: %d\n", header_.sizeofcmds); + printf("flags\t\t: %d\n", header_.flags); + } + + breakpad_mach_header header_; +}; + +//============================================================================== +// Represents a single dynamically loaded mach-o image +class DynamicImage { + public: + DynamicImage(breakpad_mach_header *header, // we take ownership + int header_size, // includes load commands + breakpad_mach_header *load_address, + char *inFilePath, + uintptr_t image_mod_date, + mach_port_t task) + : header_(header), + header_size_(header_size), + load_address_(load_address), + file_mod_date_(image_mod_date), + task_(task) { + InitializeFilePath(inFilePath); + CalculateMemoryAndVersionInfo(); + } + + ~DynamicImage() { + if (file_path_) { + free(file_path_); + } + free(header_); + } + + // Returns pointer to a local copy of the mach_header plus load commands + breakpad_mach_header *GetMachHeader() {return header_;} + + // Size of mach_header plus load commands + int GetHeaderSize() const {return header_size_;} + + // Full path to mach-o binary + char *GetFilePath() {return file_path_;} + + uintptr_t GetModDate() const {return file_mod_date_;} + + // Actual address where the image was loaded + breakpad_mach_header *GetLoadAddress() const {return load_address_;} + + // Address where the image should be loaded + mach_vm_address_t GetVMAddr() const {return vmaddr_;} + + // Difference between GetLoadAddress() and GetVMAddr() + ptrdiff_t GetVMAddrSlide() const {return slide_;} + + // Size of the image + mach_vm_size_t GetVMSize() const {return vmsize_;} + + // Task owning this loaded image + mach_port_t GetTask() {return task_;} + + uint32_t GetVersion() {return version_;} + // For sorting + bool operator<(const DynamicImage &inInfo) { + return GetLoadAddress() < inInfo.GetLoadAddress(); + } + + // Debugging + void Print(); + + private: + friend class DynamicImages; + + // Sanity checking + bool IsValid() {return GetVMSize() != 0;} + + // Makes local copy of file path to mach-o binary + void InitializeFilePath(char *inFilePath) { + if (inFilePath) { + size_t path_size = 1 + strlen(inFilePath); + file_path_ = reinterpret_cast(malloc(path_size)); + strlcpy(file_path_, inFilePath, path_size); + } else { + file_path_ = NULL; + } + } + + // Initializes vmaddr_, vmsize_, and slide_ + void CalculateMemoryAndVersionInfo(); + + breakpad_mach_header *header_; // our local copy of the header + int header_size_; // mach_header plus load commands + breakpad_mach_header *load_address_; // base address image is mapped into + mach_vm_address_t vmaddr_; + mach_vm_size_t vmsize_; + ptrdiff_t slide_; + uint32_t version_; // Dylib version + char *file_path_; // path dyld used to load the image + uintptr_t file_mod_date_; // time_t of image file + + mach_port_t task_; +}; + +//============================================================================== +// DynamicImageRef is just a simple wrapper for a pointer to +// DynamicImage. The reason we use it instead of a simple typedef is so +// that we can use stl::sort() on a vector of DynamicImageRefs +// and simple class pointers can't implement operator<(). +// +class DynamicImageRef { + public: + explicit DynamicImageRef(DynamicImage *inP) : p(inP) {} + // The copy constructor is required by STL + DynamicImageRef(const DynamicImageRef &inRef) : p(inRef.p) {} + + bool operator<(const DynamicImageRef &inRef) const { + return (*const_cast(this)->p) + < (*const_cast(inRef).p); + } + + bool operator==(const DynamicImageRef &inInfo) const { + return (*const_cast(this)->p).GetLoadAddress() == + (*const_cast(inInfo)).GetLoadAddress(); + } + + // Be just like DynamicImage* + DynamicImage *operator->() {return p;} + operator DynamicImage*() {return p;} + + private: + DynamicImage *p; +}; + +//============================================================================== +// An object of type DynamicImages may be created to allow introspection of +// an arbitrary task's dynamically loaded mach-o binaries. This makes the +// assumption that the current task has send rights to the target task. +class DynamicImages { + public: + explicit DynamicImages(mach_port_t task); + + ~DynamicImages() { + for (int i = 0; i < (int)image_list_.size(); ++i) { + delete image_list_[i]; + } + } + + // Returns the number of dynamically loaded mach-o images. + int GetImageCount() const {return image_list_.size();} + + // Returns an individual image. + DynamicImage *GetImage(int i) { + if (i < (int)image_list_.size()) { + return image_list_[i]; + } + return NULL; + } + + // Returns the image corresponding to the main executable. + DynamicImage *GetExecutableImage(); + int GetExecutableImageIndex(); + + // Returns the task which we're looking at. + mach_port_t GetTask() const {return task_;} + + // Debugging + void Print() { + for (int i = 0; i < (int)image_list_.size(); ++i) { + image_list_[i]->Print(); + } + } + + void TestPrint() { + const breakpad_mach_header *header; + for (int i = 0; i < (int)image_list_.size(); ++i) { + printf("dyld: %p: name = %s\n", _dyld_get_image_header(i), + _dyld_get_image_name(i) ); + + const void *imageHeader = _dyld_get_image_header(i); + header = reinterpret_cast(imageHeader); + + MachHeader(*header).Print(); + } + } + + private: + bool IsOurTask() {return task_ == mach_task_self();} + + // Initialization + void ReadImageInfoForTask(); + void* GetDyldAllImageInfosPointer(); + + mach_port_t task_; + vector image_list_; +}; + +// Returns a malloced block containing the contents of memory at a particular +// location in another task. +void* ReadTaskMemory(task_port_t target_task, + const void* address, + size_t len, + kern_return_t *kr); + +} // namespace google_breakpad + +#endif // CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler.cc b/thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler.cc new file mode 100644 index 00000000..60fde473 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler.cc @@ -0,0 +1,722 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include + +#include "client/mac/handler/exception_handler.h" +#include "client/mac/handler/minidump_generator.h" +#include "common/mac/macho_utilities.h" + +#ifndef USE_PROTECTED_ALLOCATIONS +#define USE_PROTECTED_ALLOCATIONS 0 +#endif + +// If USE_PROTECTED_ALLOCATIONS is activated then the +// gBreakpadAllocator needs to be setup in other code +// ahead of time. Please see ProtectedMemoryAllocator.h +// for more details. +#if USE_PROTECTED_ALLOCATIONS + #include "protected_memory_allocator.h" + extern ProtectedMemoryAllocator *gBreakpadAllocator; +#endif + + +namespace google_breakpad { + +using std::map; + +// These structures and techniques are illustrated in +// Mac OS X Internals, Amit Singh, ch 9.7 +struct ExceptionMessage { + mach_msg_header_t header; + mach_msg_body_t body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + NDR_record_t ndr; + exception_type_t exception; + mach_msg_type_number_t code_count; + integer_t code[EXCEPTION_CODE_MAX]; + char padding[512]; +}; + +struct ExceptionParameters { + ExceptionParameters() : count(0) {} + mach_msg_type_number_t count; + exception_mask_t masks[EXC_TYPES_COUNT]; + mach_port_t ports[EXC_TYPES_COUNT]; + exception_behavior_t behaviors[EXC_TYPES_COUNT]; + thread_state_flavor_t flavors[EXC_TYPES_COUNT]; +}; + +struct ExceptionReplyMessage { + mach_msg_header_t header; + NDR_record_t ndr; + kern_return_t return_code; +}; + +// Only catch these three exceptions. The other ones are nebulously defined +// and may result in treating a non-fatal exception as fatal. +exception_mask_t s_exception_mask = EXC_MASK_BAD_ACCESS | +EXC_MASK_BAD_INSTRUCTION | EXC_MASK_ARITHMETIC | EXC_MASK_BREAKPOINT; + +extern "C" +{ + // Forward declarations for functions that need "C" style compilation + boolean_t exc_server(mach_msg_header_t *request, + mach_msg_header_t *reply); + + kern_return_t catch_exception_raise(mach_port_t target_port, + mach_port_t failed_thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t code_count); + + kern_return_t ForwardException(mach_port_t task, + mach_port_t failed_thread, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t code_count); + + kern_return_t exception_raise(mach_port_t target_port, + mach_port_t failed_thread, + mach_port_t task, + exception_type_t exception, + exception_data_t exception_code, + mach_msg_type_number_t exception_code_count); + + kern_return_t + exception_raise_state(mach_port_t target_port, + mach_port_t failed_thread, + mach_port_t task, + exception_type_t exception, + exception_data_t exception_code, + mach_msg_type_number_t code_count, + thread_state_flavor_t *target_flavor, + thread_state_t thread_state, + mach_msg_type_number_t thread_state_count, + thread_state_t thread_state, + mach_msg_type_number_t *thread_state_count); + + kern_return_t + exception_raise_state_identity(mach_port_t target_port, + mach_port_t failed_thread, + mach_port_t task, + exception_type_t exception, + exception_data_t exception_code, + mach_msg_type_number_t exception_code_count, + thread_state_flavor_t *target_flavor, + thread_state_t thread_state, + mach_msg_type_number_t thread_state_count, + thread_state_t thread_state, + mach_msg_type_number_t *thread_state_count); + + kern_return_t breakpad_exception_raise_state(mach_port_t exception_port, + exception_type_t exception, + const exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + const thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt + ); + + kern_return_t breakpad_exception_raise_state_identity(mach_port_t exception_port, + mach_port_t thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt + ); + + kern_return_t breakpad_exception_raise(mach_port_t port, mach_port_t failed_thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t code_count); +} + + + +kern_return_t breakpad_exception_raise_state(mach_port_t exception_port, + exception_type_t exception, + const exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + const thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt + ) +{ + return KERN_SUCCESS; +} + +kern_return_t breakpad_exception_raise_state_identity(mach_port_t exception_port, + mach_port_t thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t codeCnt, + int *flavor, + thread_state_t old_state, + mach_msg_type_number_t old_stateCnt, + thread_state_t new_state, + mach_msg_type_number_t *new_stateCnt + ) +{ + return KERN_SUCCESS; +} + +kern_return_t breakpad_exception_raise(mach_port_t port, mach_port_t failed_thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t code_count) { + + if (task != mach_task_self()) { + return KERN_FAILURE; + } + return ForwardException(task, failed_thread, exception, code, code_count); +} + + +ExceptionHandler::ExceptionHandler(const string &dump_path, + FilterCallback filter, + MinidumpCallback callback, + void *callback_context, + bool install_handler) + : dump_path_(), + filter_(filter), + callback_(callback), + callback_context_(callback_context), + directCallback_(NULL), + handler_thread_(NULL), + handler_port_(MACH_PORT_NULL), + previous_(NULL), + installed_exception_handler_(false), + is_in_teardown_(false), + last_minidump_write_result_(false), + use_minidump_write_mutex_(false) { + // This will update to the ID and C-string pointers + set_dump_path(dump_path); + MinidumpGenerator::GatherSystemInformation(); + Setup(install_handler); +} + +// special constructor if we want to bypass minidump writing and +// simply get a callback with the exception information +ExceptionHandler::ExceptionHandler(DirectCallback callback, + void *callback_context, + bool install_handler) + : dump_path_(), + filter_(NULL), + callback_(NULL), + callback_context_(callback_context), + directCallback_(callback), + handler_thread_(NULL), + handler_port_(MACH_PORT_NULL), + previous_(NULL), + installed_exception_handler_(false), + is_in_teardown_(false), + last_minidump_write_result_(false), + use_minidump_write_mutex_(false) { + MinidumpGenerator::GatherSystemInformation(); + Setup(install_handler); +} + +ExceptionHandler::~ExceptionHandler() { + Teardown(); +} + +bool ExceptionHandler::WriteMinidump() { + // If we're currently writing, just return + if (use_minidump_write_mutex_) + return false; + + use_minidump_write_mutex_ = true; + last_minidump_write_result_ = false; + + // Lock the mutex. Since we just created it, this will return immediately. + if (pthread_mutex_lock(&minidump_write_mutex_) == 0) { + // Send an empty message to the handle port so that a minidump will + // be written + SendEmptyMachMessage(); + + // Wait for the minidump writer to complete its writing. It will unlock + // the mutex when completed + pthread_mutex_lock(&minidump_write_mutex_); + } + + use_minidump_write_mutex_ = false; + UpdateNextID(); + return last_minidump_write_result_; +} + +// static +bool ExceptionHandler::WriteMinidump(const string &dump_path, + MinidumpCallback callback, + void *callback_context) { + ExceptionHandler handler(dump_path, NULL, callback, callback_context, false); + return handler.WriteMinidump(); +} + +bool ExceptionHandler::WriteMinidumpWithException(int exception_type, + int exception_code, + mach_port_t thread_name) { + bool result = false; + + if (directCallback_) { + if (directCallback_(callback_context_, + exception_type, + exception_code, + thread_name) ) { + if (exception_type && exception_code) + _exit(exception_type); + } + } else { + string minidump_id; + + // Putting the MinidumpGenerator in its own context will ensure that the + // destructor is executed, closing the newly created minidump file. + if (!dump_path_.empty()) { + MinidumpGenerator md; + if (exception_type && exception_code) { + // If this is a real exception, give the filter (if any) a chance to + // decided if this should be sent + if (filter_ && !filter_(callback_context_)) + return false; + + md.SetExceptionInformation(exception_type, exception_code, thread_name); + } + + result = md.Write(next_minidump_path_c_); + } + + // Call user specified callback (if any) + if (callback_) { + // If the user callback returned true and we're handling an exception + // (rather than just writing out the file), then we should exit without + // forwarding the exception to the next handler. + if (callback_(dump_path_c_, next_minidump_id_c_, callback_context_, + result)) { + if (exception_type && exception_code) + _exit(exception_type); + } + } + } + + return result; +} + +kern_return_t ForwardException(mach_port_t task, mach_port_t failed_thread, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t code_count) { + // At this time, we should have called Uninstall() on the exception handler + // so that the current exception ports are the ones that we should be + // forwarding to. + ExceptionParameters current; + + current.count = EXC_TYPES_COUNT; + mach_port_t current_task = mach_task_self(); + kern_return_t result = task_get_exception_ports(current_task, + s_exception_mask, + current.masks, + ¤t.count, + current.ports, + current.behaviors, + current.flavors); + + // Find the first exception handler that matches the exception + unsigned int found; + for (found = 0; found < current.count; ++found) { + if (current.masks[found] & (1 << exception)) { + break; + } + } + + // Nothing to forward + if (found == current.count) { + fprintf(stderr, "** No previous ports for forwarding!! \n"); + exit(KERN_FAILURE); + } + + mach_port_t target_port = current.ports[found]; + exception_behavior_t target_behavior = current.behaviors[found]; + thread_state_flavor_t target_flavor = current.flavors[found]; + + mach_msg_type_number_t thread_state_count = THREAD_STATE_MAX; + breakpad_thread_state_data_t thread_state; + switch (target_behavior) { + case EXCEPTION_DEFAULT: + result = exception_raise(target_port, failed_thread, task, exception, + code, code_count); + break; + + case EXCEPTION_STATE: + result = thread_get_state(failed_thread, target_flavor, thread_state, + &thread_state_count); + if (result == KERN_SUCCESS) + result = exception_raise_state(target_port, failed_thread, task, + exception, code, + code_count, &target_flavor, + thread_state, thread_state_count, + thread_state, &thread_state_count); + if (result == KERN_SUCCESS) + result = thread_set_state(failed_thread, target_flavor, thread_state, + thread_state_count); + break; + + case EXCEPTION_STATE_IDENTITY: + result = thread_get_state(failed_thread, target_flavor, thread_state, + &thread_state_count); + if (result == KERN_SUCCESS) + result = exception_raise_state_identity(target_port, failed_thread, + task, exception, code, + code_count, &target_flavor, + thread_state, + thread_state_count, + thread_state, + &thread_state_count); + if (result == KERN_SUCCESS) + result = thread_set_state(failed_thread, target_flavor, thread_state, + thread_state_count); + break; + + default: + fprintf(stderr, "** Unknown exception behavior\n"); + result = KERN_FAILURE; + break; + } + + return result; +} + +// Callback from exc_server() +kern_return_t catch_exception_raise(mach_port_t port, mach_port_t failed_thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t code_count) { + return ForwardException(task, failed_thread, exception, code, code_count); +} + +// static +void *ExceptionHandler::WaitForMessage(void *exception_handler_class) { + ExceptionHandler *self = + reinterpret_cast(exception_handler_class); + ExceptionMessage receive; + + // Wait for the exception info + while (1) { + receive.header.msgh_local_port = self->handler_port_; + receive.header.msgh_size = sizeof(receive); + kern_return_t result = mach_msg(&(receive.header), + MACH_RCV_MSG | MACH_RCV_LARGE, 0, + sizeof(receive), self->handler_port_, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + + + if (result == KERN_SUCCESS) { + // Uninstall our handler so that we don't get in a loop if the process of + // writing out a minidump causes an exception. However, if the exception + // was caused by a fork'd process, don't uninstall things + + // If the actual exception code is zero, then we're calling this handler + // in a way that indicates that we want to either exit this thread or + // generate a minidump + // + // While reporting, all threads (except this one) must be suspended + // to avoid misleading stacks. If appropriate they will be resumed + // afterwards. + if (!receive.exception) { + if (self->is_in_teardown_) + return NULL; + + self->SuspendThreads(); + +#if USE_PROTECTED_ALLOCATIONS + if(gBreakpadAllocator) + gBreakpadAllocator->Unprotect(); +#endif + + // Write out the dump and save the result for later retrieval + self->last_minidump_write_result_ = + self->WriteMinidumpWithException(0, 0, 0); + + self->UninstallHandler(false); + +#if USE_PROTECTED_ALLOCATIONS + if(gBreakpadAllocator) + gBreakpadAllocator->Protect(); +#endif + + self->ResumeThreads(); + + if (self->use_minidump_write_mutex_) + pthread_mutex_unlock(&self->minidump_write_mutex_); + } else { + + // When forking a child process with the exception handler installed, + // if the child crashes, it will send the exception back to the parent + // process. The check for task == self_task() ensures that only + // exceptions that occur in the parent process are caught and + // processed. If the exception was not caused by this task, we + // still need to call into the exception server and have it return + // KERN_FAILURE (see breakpad_exception_raise) in order for the kernel + // to move onto the host exception handler for the child task + if (receive.task.name == mach_task_self()) { + self->SuspendThreads(); + +#if USE_PROTECTED_ALLOCATIONS + if(gBreakpadAllocator) + gBreakpadAllocator->Unprotect(); +#endif + + // Generate the minidump with the exception data. + self->WriteMinidumpWithException(receive.exception, receive.code[0], + receive.thread.name); + + self->UninstallHandler(true); + +#if USE_PROTECTED_ALLOCATIONS + if(gBreakpadAllocator) + gBreakpadAllocator->Protect(); +#endif + } + // Pass along the exception to the server, which will setup the + // message and call breakpad_exception_raise() and put the return + // code into the reply. + ExceptionReplyMessage reply; + if (!exc_server(&receive.header, &reply.header)) + exit(1); + + // Send a reply and exit + result = mach_msg(&(reply.header), MACH_SEND_MSG, + reply.header.msgh_size, 0, MACH_PORT_NULL, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + } + } + } + + return NULL; +} + +bool ExceptionHandler::InstallHandler() { + try { +#if USE_PROTECTED_ALLOCATIONS + previous_ = new (gBreakpadAllocator->Allocate(sizeof(ExceptionParameters)) ) + ExceptionParameters(); +#else + previous_ = new ExceptionParameters(); +#endif + + } + catch (std::bad_alloc) { + return false; + } + + // Save the current exception ports so that we can forward to them + previous_->count = EXC_TYPES_COUNT; + mach_port_t current_task = mach_task_self(); + kern_return_t result = task_get_exception_ports(current_task, + s_exception_mask, + previous_->masks, + &previous_->count, + previous_->ports, + previous_->behaviors, + previous_->flavors); + + // Setup the exception ports on this task + if (result == KERN_SUCCESS) + result = task_set_exception_ports(current_task, s_exception_mask, + handler_port_, EXCEPTION_DEFAULT, + THREAD_STATE_NONE); + + installed_exception_handler_ = (result == KERN_SUCCESS); + + return installed_exception_handler_; +} + +bool ExceptionHandler::UninstallHandler(bool in_exception) { + kern_return_t result = KERN_SUCCESS; + + if (installed_exception_handler_) { + mach_port_t current_task = mach_task_self(); + + // Restore the previous ports + for (unsigned int i = 0; i < previous_->count; ++i) { + result = task_set_exception_ports(current_task, previous_->masks[i], + previous_->ports[i], + previous_->behaviors[i], + previous_->flavors[i]); + if (result != KERN_SUCCESS) + return false; + } + + // this delete should NOT happen if an exception just occurred! + if (!in_exception) { +#if USE_PROTECTED_ALLOCATIONS + previous_->~ExceptionParameters(); +#else + delete previous_; +#endif + } + + previous_ = NULL; + installed_exception_handler_ = false; + } + + return result == KERN_SUCCESS; +} + +bool ExceptionHandler::Setup(bool install_handler) { + if (pthread_mutex_init(&minidump_write_mutex_, NULL)) + return false; + + // Create a receive right + mach_port_t current_task = mach_task_self(); + kern_return_t result = mach_port_allocate(current_task, + MACH_PORT_RIGHT_RECEIVE, + &handler_port_); + // Add send right + if (result == KERN_SUCCESS) + result = mach_port_insert_right(current_task, handler_port_, handler_port_, + MACH_MSG_TYPE_MAKE_SEND); + + if (install_handler && result == KERN_SUCCESS) + if (!InstallHandler()) + return false; + + if (result == KERN_SUCCESS) { + // Install the handler in its own thread, detached as we won't be joining. + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + int thread_create_result = pthread_create(&handler_thread_, &attr, + &WaitForMessage, this); + pthread_attr_destroy(&attr); + result = thread_create_result ? KERN_FAILURE : KERN_SUCCESS; + } + + return result == KERN_SUCCESS ? true : false; +} + +bool ExceptionHandler::Teardown() { + kern_return_t result = KERN_SUCCESS; + is_in_teardown_ = true; + + if (!UninstallHandler(false)) + return false; + + // Send an empty message so that the handler_thread exits + if (SendEmptyMachMessage()) { + mach_port_t current_task = mach_task_self(); + result = mach_port_deallocate(current_task, handler_port_); + if (result != KERN_SUCCESS) + return false; + } else { + return false; + } + + handler_thread_ = NULL; + handler_port_ = NULL; + pthread_mutex_destroy(&minidump_write_mutex_); + + return result == KERN_SUCCESS; +} + +bool ExceptionHandler::SendEmptyMachMessage() { + ExceptionMessage empty; + memset(&empty, 0, sizeof(empty)); + empty.header.msgh_size = sizeof(empty) - sizeof(empty.padding); + empty.header.msgh_remote_port = handler_port_; + empty.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, + MACH_MSG_TYPE_MAKE_SEND_ONCE); + kern_return_t result = mach_msg(&(empty.header), + MACH_SEND_MSG | MACH_SEND_TIMEOUT, + empty.header.msgh_size, 0, 0, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + + return result == KERN_SUCCESS; +} + +void ExceptionHandler::UpdateNextID() { + next_minidump_path_ = + (MinidumpGenerator::UniqueNameInDirectory(dump_path_, &next_minidump_id_)); + + next_minidump_path_c_ = next_minidump_path_.c_str(); + next_minidump_id_c_ = next_minidump_id_.c_str(); +} + +bool ExceptionHandler::SuspendThreads() { + thread_act_port_array_t threads_for_task; + mach_msg_type_number_t thread_count; + + if (task_threads(mach_task_self(), &threads_for_task, &thread_count)) + return false; + + // suspend all of the threads except for this one + for (unsigned int i = 0; i < thread_count; ++i) { + if (threads_for_task[i] != mach_thread_self()) { + if (thread_suspend(threads_for_task[i])) + return false; + } + } + + return true; +} + +bool ExceptionHandler::ResumeThreads() { + thread_act_port_array_t threads_for_task; + mach_msg_type_number_t thread_count; + + if (task_threads(mach_task_self(), &threads_for_task, &thread_count)) + return false; + + // resume all of the threads except for this one + for (unsigned int i = 0; i < thread_count; ++i) { + if (threads_for_task[i] != mach_thread_self()) { + if (thread_resume(threads_for_task[i])) + return false; + } + } + + return true; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler.h b/thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler.h new file mode 100644 index 00000000..2a8ee1e4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler.h @@ -0,0 +1,212 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// exception_handler.h: MacOS exception handler +// This class can install a Mach exception port handler to trap most common +// programming errors. If an exception occurs, a minidump file will be +// generated which contains detailed information about the process and the +// exception. + +#ifndef CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__ +#define CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__ + +#include + +#include + +namespace google_breakpad { + +using std::string; + +struct ExceptionParameters; + +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. context is the parameter supplied by the user as + // callback_context when the handler was created. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, Breakpad + // will immediately report the exception as unhandled without writing a + // minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void *context); + + // A callback function to run after the minidump has been written. + // |minidump_id| is a unique id for the dump, so the minidump + // file is /.dmp. + // |context| is the value passed into the constructor. + // |succeeded| indicates whether a minidump file was successfully written. + // Return true if the exception was fully handled and breakpad should exit. + // Return false to allow any other exception handlers to process the + // exception. + typedef bool (*MinidumpCallback)(const char *dump_dir, + const char *minidump_id, + void *context, bool succeeded); + + // A callback function which will be called directly if an exception occurs. + // This bypasses the minidump file writing and simply gives the client + // the exception information. + typedef bool (*DirectCallback)( void *context, + int exception_type, + int exception_code, + mach_port_t thread_name); + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Minidump files will be written to dump_path, and the optional callback + // is called after writing the dump file, as described above. + // If install_handler is true, then a minidump will be written whenever + // an unhandled exception occurs. If it is false, minidumps will only + // be written when WriteMinidump is called. + ExceptionHandler(const string &dump_path, + FilterCallback filter, MinidumpCallback callback, + void *callback_context, bool install_handler); + + // A special constructor if we want to bypass minidump writing and + // simply get a callback with the exception information. + ExceptionHandler(DirectCallback callback, + void *callback_context, + bool install_handler); + + ~ExceptionHandler(); + + // Get and set the minidump path. + string dump_path() const { return dump_path_; } + void set_dump_path(const string &dump_path) { + dump_path_ = dump_path; + dump_path_c_ = dump_path_.c_str(); + UpdateNextID(); // Necessary to put dump_path_ in next_minidump_path_. + } + + // Writes a minidump immediately. This can be used to capture the + // execution state independently of a crash. Returns true on success. + bool WriteMinidump(); + + // Convenience form of WriteMinidump which does not require an + // ExceptionHandler instance. + static bool WriteMinidump(const string &dump_path, MinidumpCallback callback, + void *callback_context); + + private: + // Install the mach exception handler + bool InstallHandler(); + + // Uninstall the mach exception handler (if any) + bool UninstallHandler(bool in_exception); + + // Setup the handler thread, and if |install_handler| is true, install the + // mach exception port handler + bool Setup(bool install_handler); + + // Uninstall the mach exception handler (if any) and terminate the helper + // thread + bool Teardown(); + + // Send an "empty" mach message to the exception handler. Return true on + // success, false otherwise + bool SendEmptyMachMessage(); + + // All minidump writing goes through this one routine + bool WriteMinidumpWithException(int exception_type, int exception_code, + mach_port_t thread_name); + + // When installed, this static function will be call from a newly created + // pthread with |this| as the argument + static void *WaitForMessage(void *exception_handler_class); + + // disallow copy ctor and operator= + explicit ExceptionHandler(const ExceptionHandler &); + void operator=(const ExceptionHandler &); + + // Generates a new ID and stores it in next_minidump_id_, and stores the + // path of the next minidump to be written in next_minidump_path_. + void UpdateNextID(); + + // These functions will suspend/resume all threads except for the + // reporting thread + bool SuspendThreads(); + bool ResumeThreads(); + + // The destination directory for the minidump + string dump_path_; + + // The basename of the next minidump w/o extension + string next_minidump_id_; + + // The full path to the next minidump to be written, including extension + string next_minidump_path_; + + // Pointers to the UTF-8 versions of above + const char *dump_path_c_; + const char *next_minidump_id_c_; + const char *next_minidump_path_c_; + + // The callback function and pointer to be passed back after the minidump + // has been written + FilterCallback filter_; + MinidumpCallback callback_; + void *callback_context_; + + // The callback function to be passed back when we don't want a minidump + // file to be written + DirectCallback directCallback_; + + // The thread that is created for the handler + pthread_t handler_thread_; + + // The port that is waiting on an exception message to be sent, if the + // handler is installed + mach_port_t handler_port_; + + // These variables save the previous exception handler's data so that it + // can be re-installed when this handler is uninstalled + ExceptionParameters *previous_; + + // True, if we've installed the exception handler + bool installed_exception_handler_; + + // True, if we're in the process of uninstalling the exception handler and + // the thread. + bool is_in_teardown_; + + // Save the last result of the last minidump + bool last_minidump_write_result_; + + // A mutex for use when writing out a minidump that was requested on a + // thread other than the exception handler. + pthread_mutex_t minidump_write_mutex_; + + // True, if we're using the mutext to indicate when mindump writing occurs + bool use_minidump_write_mutex_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler_test.cc b/thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler_test.cc new file mode 100644 index 00000000..59944377 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/exception_handler_test.cc @@ -0,0 +1,107 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +g++ -framework CoreFoundation -I../../.. \ + ../../minidump_file_writer.cc \ + ../../../common/convert_UTF.c \ + ../../../common/string_conversion.cc \ + ../../../common/mac/string_utilities.cc \ + exception_handler.cc \ + minidump_generator.cc \ + exception_handler_test.cc \ + -o exception_handler_test +*/ + +#include +#include +#include + +#include + +#include "exception_handler.h" +#include "minidump_generator.h" + +using std::string; +using google_breakpad::ExceptionHandler; + +static void *SleepyFunction(void *) { + while (1) { + sleep(10000); + } +} + +static void Crasher() { + int *a = NULL; + + fprintf(stdout, "Going to crash...\n"); + fprintf(stdout, "A = %d", *a); +} + +static void SoonToCrash() { + Crasher(); +} + +bool MDCallback(const char *dump_dir, const char *file_name, + void *context, bool success) { + string path(dump_dir); + string dest(dump_dir); + path.append(file_name); + path.append(".dmp"); + + fprintf(stdout, "Minidump: %s\n", path.c_str()); + // Indicate that we've handled the callback + return true; +} + +int main(int argc, char * const argv[]) { + char buffer[PATH_MAX]; + struct passwd *user = getpwuid(getuid()); + + // Home dir + snprintf(buffer, sizeof(buffer), "/Users/%s/Desktop/", user->pw_name); + + string path(buffer); + ExceptionHandler eh(path, NULL, MDCallback, NULL, true); + pthread_t t; + + if (pthread_create(&t, NULL, SleepyFunction, NULL) == 0) { + pthread_detach(t); + } else { + perror("pthread_create"); + } + + // Dump a test + eh.WriteMinidump(); + + // Test the handler + SoonToCrash(); + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator.cc b/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator.cc new file mode 100644 index 00000000..e6ebce4f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator.cc @@ -0,0 +1,989 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "client/mac/handler/minidump_generator.h" +#include "client/minidump_file_writer-inl.h" +#include "common/mac/file_id.h" +#include "common/mac/string_utilities.h" + +using MacStringUtils::ConvertToString; +using MacStringUtils::IntegerValueAtIndex; + +namespace google_breakpad { + +// constructor when generating from within the crashed process +MinidumpGenerator::MinidumpGenerator() + : exception_type_(0), + exception_code_(0), + exception_thread_(0), + crashing_task_(mach_task_self()), + handler_thread_(mach_thread_self()), + dynamic_images_(NULL) { + GatherSystemInformation(); +} + +// constructor when generating from a different process than the +// crashed process +MinidumpGenerator::MinidumpGenerator(mach_port_t crashing_task, + mach_port_t handler_thread) + : exception_type_(0), + exception_code_(0), + exception_thread_(0), + crashing_task_(crashing_task), + handler_thread_(handler_thread) { + if (crashing_task != mach_task_self()) { + dynamic_images_ = new DynamicImages(crashing_task_); + } else { + dynamic_images_ = NULL; + } + + GatherSystemInformation(); +} + +MinidumpGenerator::~MinidumpGenerator() { + delete dynamic_images_; +} + +char MinidumpGenerator::build_string_[16]; +int MinidumpGenerator::os_major_version_ = 0; +int MinidumpGenerator::os_minor_version_ = 0; +int MinidumpGenerator::os_build_number_ = 0; + +// static +void MinidumpGenerator::GatherSystemInformation() { + // If this is non-zero, then we've already gathered the information + if (os_major_version_) + return; + + // This code extracts the version and build information from the OS + CFStringRef vers_path = + CFSTR("/System/Library/CoreServices/SystemVersion.plist"); + CFURLRef sys_vers = + CFURLCreateWithFileSystemPath(NULL, + vers_path, + kCFURLPOSIXPathStyle, + false); + CFDataRef data; + SInt32 error; + CFURLCreateDataAndPropertiesFromResource(NULL, sys_vers, &data, NULL, NULL, + &error); + + if (!data) + return; + + CFDictionaryRef list = static_cast + (CFPropertyListCreateFromXMLData(NULL, data, kCFPropertyListImmutable, + NULL)); + if (!list) + return; + + CFStringRef build_version = static_cast + (CFDictionaryGetValue(list, CFSTR("ProductBuildVersion"))); + CFStringRef product_version = static_cast + (CFDictionaryGetValue(list, CFSTR("ProductVersion"))); + string build_str = ConvertToString(build_version); + string product_str = ConvertToString(product_version); + + CFRelease(list); + CFRelease(sys_vers); + CFRelease(data); + + strlcpy(build_string_, build_str.c_str(), sizeof(build_string_)); + + // Parse the string that looks like "10.4.8" + os_major_version_ = IntegerValueAtIndex(product_str, 0); + os_minor_version_ = IntegerValueAtIndex(product_str, 1); + os_build_number_ = IntegerValueAtIndex(product_str, 2); +} + +string MinidumpGenerator::UniqueNameInDirectory(const string &dir, + string *unique_name) { + CFUUIDRef uuid = CFUUIDCreate(NULL); + CFStringRef uuid_cfstr = CFUUIDCreateString(NULL, uuid); + CFRelease(uuid); + string file_name(ConvertToString(uuid_cfstr)); + CFRelease(uuid_cfstr); + string path(dir); + + // Ensure that the directory (if non-empty) has a trailing slash so that + // we can append the file name and have a valid pathname. + if (!dir.empty()) { + if (dir.at(dir.size() - 1) != '/') + path.append(1, '/'); + } + + path.append(file_name); + path.append(".dmp"); + + if (unique_name) + *unique_name = file_name; + + return path; +} + +bool MinidumpGenerator::Write(const char *path) { + WriteStreamFN writers[] = { + &MinidumpGenerator::WriteThreadListStream, + &MinidumpGenerator::WriteSystemInfoStream, + &MinidumpGenerator::WriteModuleListStream, + &MinidumpGenerator::WriteMiscInfoStream, + &MinidumpGenerator::WriteBreakpadInfoStream, + // Exception stream needs to be the last entry in this array as it may + // be omitted in the case where the minidump is written without an + // exception. + &MinidumpGenerator::WriteExceptionStream, + }; + bool result = true; + + // If opening was successful, create the header, directory, and call each + // writer. The destructor for the TypedMDRVAs will cause the data to be + // flushed. The destructor for the MinidumpFileWriter will close the file. + if (writer_.Open(path)) { + TypedMDRVA header(&writer_); + TypedMDRVA dir(&writer_); + + if (!header.Allocate()) + return false; + + int writer_count = sizeof(writers) / sizeof(writers[0]); + + // If we don't have exception information, don't write out the + // exception stream + if (!exception_thread_ && !exception_type_) + --writer_count; + + // Add space for all writers + if (!dir.AllocateArray(writer_count)) + return false; + + MDRawHeader *header_ptr = header.get(); + header_ptr->signature = MD_HEADER_SIGNATURE; + header_ptr->version = MD_HEADER_VERSION; + time(reinterpret_cast(&(header_ptr->time_date_stamp))); + header_ptr->stream_count = writer_count; + header_ptr->stream_directory_rva = dir.position(); + + MDRawDirectory local_dir; + for (int i = 0; (result) && (i < writer_count); ++i) { + result = (this->*writers[i])(&local_dir); + + if (result) + dir.CopyIndex(i, &local_dir); + } + } + return result; +} + +size_t MinidumpGenerator::CalculateStackSize(mach_vm_address_t start_addr) { + mach_vm_address_t stack_region_base = start_addr; + mach_vm_size_t stack_region_size; + natural_t nesting_level = 0; + vm_region_submap_info_64 submap_info; + mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64; + + vm_region_recurse_info_t region_info; + region_info = reinterpret_cast(&submap_info); + + if (start_addr == 0) { + return 0; + } + + kern_return_t result = + mach_vm_region_recurse(crashing_task_, &stack_region_base, + &stack_region_size, &nesting_level, + region_info, + &info_count); + + if (start_addr < stack_region_base) { + // probably stack corruption, since mach_vm_region had to go + // higher in the process address space to find a valid region. + return 0; + } + + + if ((stack_region_base + stack_region_size) == TOP_OF_THREAD0_STACK) { + // The stack for thread 0 needs to extend all the way to + // 0xc0000000 on 32 bit and 00007fff5fc00000 on 64bit. HOWEVER, + // for many processes, the stack is first created in one page + // below this, and is then later extended to a much larger size by + // creating a new VM region immediately below the initial page. + + // You can see this for yourself by running vmmap on a "hello, + // world" program + + // Because of the above, we'll add 4k to include the original + // stack frame page. + // This method of finding the stack region needs to be done in + // a better way; the breakpad issue 247 is tracking this. + stack_region_size += 0x1000; + } + + return result == KERN_SUCCESS ? + stack_region_base + stack_region_size - start_addr : 0; +} + +bool MinidumpGenerator::WriteStackFromStartAddress( + mach_vm_address_t start_addr, + MDMemoryDescriptor *stack_location) { + UntypedMDRVA memory(&writer_); + + bool result = false; + size_t size = CalculateStackSize(start_addr); + + if (size == 0) { + // In some situations the stack address for the thread can come back 0. + // In these cases we skip over the threads in question and stuff the + // stack with a clearly borked value. + start_addr = 0xDEADBEEF; + size = 16; + if (!memory.Allocate(size)) + return false; + + unsigned long long dummy_stack[2]; // Fill dummy stack with 16 bytes of + // junk. + dummy_stack[0] = 0xDEADBEEF; + dummy_stack[1] = 0xDEADBEEF; + + result = memory.Copy(dummy_stack, size); + } else { + + if (!memory.Allocate(size)) + return false; + + if (dynamic_images_) { + + kern_return_t kr; + + void *stack_memory = ReadTaskMemory(crashing_task_, + (void*)start_addr, + size, + &kr); + + if (stack_memory == NULL) { + return false; + } + + result = memory.Copy(stack_memory, size); + free(stack_memory); + } else { + result = memory.Copy(reinterpret_cast(start_addr), size); + } + } + + stack_location->start_of_memory_range = start_addr; + stack_location->memory = memory.location(); + + return result; +} + +#if TARGET_CPU_PPC || TARGET_CPU_PPC64 +bool MinidumpGenerator::WriteStack(breakpad_thread_state_data_t state, + MDMemoryDescriptor *stack_location) { + breakpad_thread_state_t *machine_state = + reinterpret_cast(state); +#if TARGET_CPU_PPC + mach_vm_address_t start_addr = machine_state->r1; +#else + mach_vm_address_t start_addr = machine_state->__r1; +#endif + return WriteStackFromStartAddress(start_addr, stack_location); +} + +u_int64_t +MinidumpGenerator::CurrentPCForStack(breakpad_thread_state_data_t state) { + breakpad_thread_state_t *machine_state = + reinterpret_cast(state); + +#if TARGET_CPU_PPC + return machine_state->srr0; +#else + return machine_state->__srr0; +#endif +} + +bool MinidumpGenerator::WriteContext(breakpad_thread_state_data_t state, + MDLocationDescriptor *register_location) { + TypedMDRVA context(&writer_); + breakpad_thread_state_t *machine_state = + reinterpret_cast(state); + + if (!context.Allocate()) + return false; + + *register_location = context.location(); + MinidumpContext *context_ptr = context.get(); + context_ptr->context_flags = MD_CONTEXT_PPC_BASE; + +#if TARGET_CPU_PPC64 +#define AddReg(a) context_ptr->a = machine_state->__ ## a +#define AddGPR(a) context_ptr->gpr[a] = machine_state->__r ## a +#else +#define AddReg(a) context_ptr->a = machine_state->a +#define AddGPR(a) context_ptr->gpr[a] = machine_state->r ## a +#endif + + AddReg(srr0); + AddReg(cr); + AddReg(xer); + AddReg(ctr); + AddReg(lr); + AddReg(vrsave); + + AddGPR(0); + AddGPR(1); + AddGPR(2); + AddGPR(3); + AddGPR(4); + AddGPR(5); + AddGPR(6); + AddGPR(7); + AddGPR(8); + AddGPR(9); + AddGPR(10); + AddGPR(11); + AddGPR(12); + AddGPR(13); + AddGPR(14); + AddGPR(15); + AddGPR(16); + AddGPR(17); + AddGPR(18); + AddGPR(19); + AddGPR(20); + AddGPR(21); + AddGPR(22); + AddGPR(23); + AddGPR(24); + AddGPR(25); + AddGPR(26); + AddGPR(27); + AddGPR(28); + AddGPR(29); + AddGPR(30); + AddGPR(31); + +#if TARGET_CPU_PPC + /* The mq register is only for PPC */ + AddReg(mq); +#endif + + + return true; +} + +#elif TARGET_CPU_X86 || TARGET_CPU_X86_64 + +bool MinidumpGenerator::WriteStack(breakpad_thread_state_data_t state, + MDMemoryDescriptor *stack_location) { + breakpad_thread_state_t *machine_state = + reinterpret_cast(state); + +#if TARGET_CPU_X86_64 + mach_vm_address_t start_addr = machine_state->__rsp; +#else + mach_vm_address_t start_addr = machine_state->esp; +#endif + return WriteStackFromStartAddress(start_addr, stack_location); +} + +u_int64_t +MinidumpGenerator::CurrentPCForStack(breakpad_thread_state_data_t state) { + breakpad_thread_state_t *machine_state = + reinterpret_cast(state); + +#if TARGET_CPU_X86_64 + return machine_state->__rip; +#else + return machine_state->eip; +#endif +} + +bool MinidumpGenerator::WriteContext(breakpad_thread_state_data_t state, + MDLocationDescriptor *register_location) { + TypedMDRVA context(&writer_); + breakpad_thread_state_t *machine_state = + reinterpret_cast(state); + + if (!context.Allocate()) + return false; + + *register_location = context.location(); + MinidumpContext *context_ptr = context.get(); + +#if TARGET_CPU_X86 + context_ptr->context_flags = MD_CONTEXT_X86; + +#define AddReg(a) context_ptr->a = machine_state->a + AddReg(eax); + AddReg(ebx); + AddReg(ecx); + AddReg(edx); + AddReg(esi); + AddReg(edi); + AddReg(ebp); + AddReg(esp); + + AddReg(cs); + AddReg(ds); + AddReg(ss); + AddReg(es); + AddReg(fs); + AddReg(gs); + AddReg(eflags); + + AddReg(eip); +#else + +#define AddReg(a) context_ptr->a = machine_state->__ ## a + context_ptr->context_flags = MD_CONTEXT_AMD64; + AddReg(rax); + AddReg(rbx); + AddReg(rcx); + AddReg(rdx); + AddReg(rdi); + AddReg(rsi); + AddReg(rbp); + AddReg(rsp); + AddReg(r8); + AddReg(r9); + AddReg(r10); + AddReg(r11); + AddReg(r12); + AddReg(r13); + AddReg(r14); + AddReg(r15); + AddReg(rip); + // according to AMD's software developer guide, bits above 18 are + // not used in the flags register. Since the minidump format + // specifies 32 bits for the flags register, we can truncate safely + // with no loss. + context_ptr->eflags = machine_state->__rflags; + AddReg(cs); + AddReg(fs); + AddReg(gs); +#endif + + return true; +} +#endif + +bool MinidumpGenerator::WriteThreadStream(mach_port_t thread_id, + MDRawThread *thread) { + breakpad_thread_state_data_t state; + mach_msg_type_number_t state_count = sizeof(state); + + if (thread_get_state(thread_id, BREAKPAD_MACHINE_THREAD_STATE, + state, &state_count) == + KERN_SUCCESS) { + if (!WriteStack(state, &thread->stack)) + return false; + + if (!WriteContext(state, &thread->thread_context)) + return false; + + thread->thread_id = thread_id; + } else { + return false; + } + + return true; +} + +bool MinidumpGenerator::WriteThreadListStream( + MDRawDirectory *thread_list_stream) { + TypedMDRVA list(&writer_); + thread_act_port_array_t threads_for_task; + mach_msg_type_number_t thread_count; + int non_generator_thread_count; + + if (task_threads(crashing_task_, &threads_for_task, &thread_count)) + return false; + + // Don't include the generator thread + non_generator_thread_count = thread_count - 1; + if (!list.AllocateObjectAndArray(non_generator_thread_count, + sizeof(MDRawThread))) + return false; + + thread_list_stream->stream_type = MD_THREAD_LIST_STREAM; + thread_list_stream->location = list.location(); + + list.get()->number_of_threads = non_generator_thread_count; + + MDRawThread thread; + int thread_idx = 0; + + for (unsigned int i = 0; i < thread_count; ++i) { + memset(&thread, 0, sizeof(MDRawThread)); + + if (threads_for_task[i] != handler_thread_) { + if (!WriteThreadStream(threads_for_task[i], &thread)) + return false; + + list.CopyIndexAfterObject(thread_idx++, &thread, sizeof(MDRawThread)); + } + } + + return true; +} + +bool +MinidumpGenerator::WriteExceptionStream(MDRawDirectory *exception_stream) { + TypedMDRVA exception(&writer_); + + if (!exception.Allocate()) + return false; + + exception_stream->stream_type = MD_EXCEPTION_STREAM; + exception_stream->location = exception.location(); + MDRawExceptionStream *exception_ptr = exception.get(); + exception_ptr->thread_id = exception_thread_; + + // This naming is confusing, but it is the proper translation from + // mach naming to minidump naming. + exception_ptr->exception_record.exception_code = exception_type_; + exception_ptr->exception_record.exception_flags = exception_code_; + + breakpad_thread_state_data_t state; + mach_msg_type_number_t stateCount = sizeof(state); + + if (thread_get_state(exception_thread_, + BREAKPAD_MACHINE_THREAD_STATE, + state, + &stateCount) != KERN_SUCCESS) + return false; + + if (!WriteContext(state, &exception_ptr->thread_context)) + return false; + + exception_ptr->exception_record.exception_address = CurrentPCForStack(state); + + return true; +} + +bool MinidumpGenerator::WriteSystemInfoStream( + MDRawDirectory *system_info_stream) { + TypedMDRVA info(&writer_); + + if (!info.Allocate()) + return false; + + system_info_stream->stream_type = MD_SYSTEM_INFO_STREAM; + system_info_stream->location = info.location(); + + // CPU Information + uint32_t cpu_type; + size_t len = sizeof(cpu_type); + sysctlbyname("hw.cputype", &cpu_type, &len, NULL, 0); + uint32_t number_of_processors; + len = sizeof(number_of_processors); + sysctlbyname("hw.ncpu", &number_of_processors, &len, NULL, 0); + MDRawSystemInfo *info_ptr = info.get(); + + switch (cpu_type) { + case CPU_TYPE_POWERPC: + info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_PPC; + break; + case CPU_TYPE_I386: + info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_X86; +#ifdef __i386__ + // ebx is used for PIC code, so we need + // to preserve it. +#define cpuid(op,eax,ebx,ecx,edx) \ + asm ("pushl %%ebx \n\t" \ + "cpuid \n\t" \ + "movl %%ebx,%1 \n\t" \ + "popl %%ebx" \ + : "=a" (eax), \ + "=g" (ebx), \ + "=c" (ecx), \ + "=d" (edx) \ + : "0" (op)) + int unused, unused2; + // get vendor id + cpuid(0, unused, info_ptr->cpu.x86_cpu_info.vendor_id[0], + info_ptr->cpu.x86_cpu_info.vendor_id[2], + info_ptr->cpu.x86_cpu_info.vendor_id[1]); + // get version and feature info + cpuid(1, info_ptr->cpu.x86_cpu_info.version_information, unused, unused2, + info_ptr->cpu.x86_cpu_info.feature_information); + // family + info_ptr->processor_level = + (info_ptr->cpu.x86_cpu_info.version_information & 0xF00) >> 8; + // 0xMMSS (Model, Stepping) + info_ptr->processor_revision = + (info_ptr->cpu.x86_cpu_info.version_information & 0xF) | + ((info_ptr->cpu.x86_cpu_info.version_information & 0xF0) << 4); +#endif // __i386__ + break; + default: + info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_UNKNOWN; + break; + } + + info_ptr->number_of_processors = number_of_processors; + info_ptr->platform_id = MD_OS_MAC_OS_X; + + MDLocationDescriptor build_string_loc; + + if (!writer_.WriteString(build_string_, 0, + &build_string_loc)) + return false; + + info_ptr->csd_version_rva = build_string_loc.rva; + info_ptr->major_version = os_major_version_; + info_ptr->minor_version = os_minor_version_; + info_ptr->build_number = os_build_number_; + + return true; +} + +void setVersion(MDRawModule *module, uint32_t version, bool isMainExecutable) +{ + module->version_info.signature = MD_VSFIXEDFILEINFO_SIGNATURE; + module->version_info.struct_version |= MD_VSFIXEDFILEINFO_VERSION; + if (!isMainExecutable) { + // Convert MAC dylib version format, which is a 32 bit number, to the + // format used by minidump. The mac format is <16 bits>.<8 bits>.<8 bits> + // so it fits nicely into the windows version with some massaging + // The mapping is: + // 1) upper 16 bits of MAC version go to lower 16 bits of product HI + // 2) Next most significant 8 bits go to upper 16 bits of product LO + // 3) Least significant 8 bits go to lower 16 bits of product LO + module->version_info.file_version_hi = 0; + module->version_info.file_version_hi = version >> 16; + module->version_info.file_version_lo = (version & 0xff00) << 8; + module->version_info.file_version_lo |= (version & 0xff); + } else { + // Convert the __TEXT __version section of the main executable + module->version_info.file_version_hi = (version & 0xff000000) >> 8; + module->version_info.file_version_hi |= (version & 0x00ff0000) >> 16; + module->version_info.file_version_lo = (version & 0x0000ff00) << 8; + module->version_info.file_version_lo |= (version & 0x000000ff); + } +} + +bool MinidumpGenerator::WriteModuleStream(unsigned int index, + MDRawModule *module) { + if (dynamic_images_) { + // we're in a different process than the crashed process + DynamicImage *image = dynamic_images_->GetImage(index); + + if (!image) + return false; + + const breakpad_mach_header *header = image->GetMachHeader(); + + if (!header) + return false; + + int cpu_type = header->cputype; + + memset(module, 0, sizeof(MDRawModule)); + + MDLocationDescriptor string_location; + + const char* name = image->GetFilePath(); + if (!writer_.WriteString(name, 0, &string_location)) + return false; + + module->base_of_image = image->GetVMAddr() + image->GetVMAddrSlide(); + module->size_of_image = image->GetVMSize(); + module->module_name_rva = string_location.rva; + + setVersion(module, image->GetVersion(), index == (uint32_t)FindExecutableModule()); + + if (!WriteCVRecord(module, cpu_type, name)) { + return false; + } + } else { + // we're getting module info in the crashed process + + const breakpad_mach_header *header; + header = (breakpad_mach_header*)_dyld_get_image_header(index); + if (!header) + return false; + +#ifdef __LP64__ + assert(header->magic == MH_MAGIC_64); + + if(header->magic != MH_MAGIC_64) + return false; +#else + assert(header->magic == MH_MAGIC); + + if(header->magic != MH_MAGIC) + return false; +#endif + + int cpu_type = header->cputype; + unsigned long slide = _dyld_get_image_vmaddr_slide(index); + const char* name = _dyld_get_image_name(index); + const struct load_command *cmd = + reinterpret_cast(header + 1); + + memset(module, 0, sizeof(MDRawModule)); + + for (unsigned int i = 0; cmd && (i < header->ncmds); i++) { + if (cmd->cmd == LC_SEGMENT) { + + const breakpad_mach_segment_command *seg = + reinterpret_cast(cmd); + + if (!strcmp(seg->segname, "__TEXT")) { + MDLocationDescriptor string_location; + + if (!writer_.WriteString(name, 0, &string_location)) + return false; + + module->base_of_image = seg->vmaddr + slide; + module->size_of_image = seg->vmsize; + module->module_name_rva = string_location.rva; + + // The header MUST NOT be copied, but as it is free'd by the DynamicImage destructor, we have to leak the DynamicImage + // The other option is to rewrite the content of DynamicImage::CalculateMemoryAndVersionInfo() to get the version + DynamicImage *image = new DynamicImage((breakpad_mach_header*)header, 0, NULL, (char*)name, 0, MACH_PORT_NULL); + setVersion(module, image->GetVersion(), index == (uint32_t)FindExecutableModule()); + + if (!WriteCVRecord(module, cpu_type, name)) + return false; + + return true; + } + } + + cmd = reinterpret_cast((char *)cmd + cmd->cmdsize); + } + } + + return true; +} + +int MinidumpGenerator::FindExecutableModule() { + if (dynamic_images_) { + int index = dynamic_images_->GetExecutableImageIndex(); + + if (index >= 0) { + return index; + } + } else { + int image_count = _dyld_image_count(); + const struct mach_header *header; + + for (int index = 0; index < image_count; ++index) { + header = _dyld_get_image_header(index); + + if (header->filetype == MH_EXECUTE) + return index; + } + } + + // failed - just use the first image + return 0; +} + +bool MinidumpGenerator::WriteCVRecord(MDRawModule *module, int cpu_type, + const char *module_path) { + TypedMDRVA cv(&writer_); + + // Only return the last path component of the full module path + const char *module_name = strrchr(module_path, '/'); + + // Increment past the slash + if (module_name) + ++module_name; + else + module_name = ""; + + size_t module_name_length = strlen(module_name); + + if (!cv.AllocateObjectAndArray(module_name_length + 1, sizeof(u_int8_t))) + return false; + + if (!cv.CopyIndexAfterObject(0, module_name, module_name_length)) + return false; + + module->cv_record = cv.location(); + MDCVInfoPDB70 *cv_ptr = cv.get(); + cv_ptr->cv_signature = MD_CVINFOPDB70_SIGNATURE; + cv_ptr->age = 0; + + // Get the module identifier + FileID file_id(module_path); + unsigned char identifier[16]; + + if (file_id.MachoIdentifier(cpu_type, identifier)) { + cv_ptr->signature.data1 = (uint32_t)identifier[0] << 24 | + (uint32_t)identifier[1] << 16 | (uint32_t)identifier[2] << 8 | + (uint32_t)identifier[3]; + cv_ptr->signature.data2 = (uint32_t)identifier[4] << 8 | identifier[5]; + cv_ptr->signature.data3 = (uint32_t)identifier[6] << 8 | identifier[7]; + cv_ptr->signature.data4[0] = identifier[8]; + cv_ptr->signature.data4[1] = identifier[9]; + cv_ptr->signature.data4[2] = identifier[10]; + cv_ptr->signature.data4[3] = identifier[11]; + cv_ptr->signature.data4[4] = identifier[12]; + cv_ptr->signature.data4[5] = identifier[13]; + cv_ptr->signature.data4[6] = identifier[14]; + cv_ptr->signature.data4[7] = identifier[15]; + } + + return true; +} + +bool MinidumpGenerator::WriteModuleListStream( + MDRawDirectory *module_list_stream) { + TypedMDRVA list(&writer_); + + int image_count = dynamic_images_ ? + dynamic_images_->GetImageCount() : _dyld_image_count(); + + if (!list.AllocateObjectAndArray(image_count, MD_MODULE_SIZE)) + return false; + + module_list_stream->stream_type = MD_MODULE_LIST_STREAM; + module_list_stream->location = list.location(); + list.get()->number_of_modules = image_count; + + // Write out the executable module as the first one + MDRawModule module; + int executableIndex = FindExecutableModule(); + + if (!WriteModuleStream(executableIndex, &module)) { + return false; + } + + list.CopyIndexAfterObject(0, &module, MD_MODULE_SIZE); + int destinationIndex = 1; // Write all other modules after this one + + for (int i = 0; i < image_count; ++i) { + if (i != executableIndex) { + if (!WriteModuleStream(i, &module)) { + return false; + } + + list.CopyIndexAfterObject(destinationIndex++, &module, MD_MODULE_SIZE); + } + } + + return true; +} + +bool MinidumpGenerator::WriteMiscInfoStream(MDRawDirectory *misc_info_stream) { + TypedMDRVA info(&writer_); + + if (!info.Allocate()) + return false; + + misc_info_stream->stream_type = MD_MISC_INFO_STREAM; + misc_info_stream->location = info.location(); + + MDRawMiscInfo *info_ptr = info.get(); + info_ptr->size_of_info = sizeof(MDRawMiscInfo); + info_ptr->flags1 = MD_MISCINFO_FLAGS1_PROCESS_ID | + MD_MISCINFO_FLAGS1_PROCESS_TIMES | + MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO; + + // Process ID + info_ptr->process_id = getpid(); + + // Times + struct rusage usage; + if (getrusage(RUSAGE_SELF, &usage) != -1) { + // Omit the fractional time since the MDRawMiscInfo only wants seconds + info_ptr->process_user_time = usage.ru_utime.tv_sec; + info_ptr->process_kernel_time = usage.ru_stime.tv_sec; + } + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, info_ptr->process_id }; + size_t size; + if (!sysctl(mib, sizeof(mib) / sizeof(mib[0]), NULL, &size, NULL, 0)) { + mach_vm_address_t addr; + if (mach_vm_allocate(mach_task_self(), + &addr, + size, + true) == KERN_SUCCESS) { + struct kinfo_proc *proc = (struct kinfo_proc *)addr; + if (!sysctl(mib, sizeof(mib) / sizeof(mib[0]), proc, &size, NULL, 0)) + info_ptr->process_create_time = proc->kp_proc.p_starttime.tv_sec; + mach_vm_deallocate(mach_task_self(), addr, size); + } + } + + // Speed + uint64_t speed; + size = sizeof(speed); + sysctlbyname("hw.cpufrequency_max", &speed, &size, NULL, 0); + info_ptr->processor_max_mhz = speed / (1000 * 1000); + info_ptr->processor_mhz_limit = speed / (1000 * 1000); + size = sizeof(speed); + sysctlbyname("hw.cpufrequency", &speed, &size, NULL, 0); + info_ptr->processor_current_mhz = speed / (1000 * 1000); + + return true; +} + +bool MinidumpGenerator::WriteBreakpadInfoStream( + MDRawDirectory *breakpad_info_stream) { + TypedMDRVA info(&writer_); + + if (!info.Allocate()) + return false; + + breakpad_info_stream->stream_type = MD_BREAKPAD_INFO_STREAM; + breakpad_info_stream->location = info.location(); + MDRawBreakpadInfo *info_ptr = info.get(); + + if (exception_thread_ && exception_type_) { + info_ptr->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; + info_ptr->dump_thread_id = handler_thread_; + info_ptr->requesting_thread_id = exception_thread_; + } else { + info_ptr->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID; + info_ptr->dump_thread_id = handler_thread_; + info_ptr->requesting_thread_id = 0; + } + + return true; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator.h b/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator.h new file mode 100644 index 00000000..0d3424c3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator.h @@ -0,0 +1,157 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_generator.h: Create a minidump of the current MacOS process. + +#ifndef CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__ +#define CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__ + +#include + +#include + +#include "client/minidump_file_writer.h" +#include "google_breakpad/common/minidump_format.h" +#include "common/mac/macho_utilities.h" + +#include "dynamic_images.h" + +namespace google_breakpad { + +using std::string; + +#if TARGET_CPU_X86_64 || TARGET_CPU_PPC64 +#define TOP_OF_THREAD0_STACK 0x00007fff5fbff000 +#else +#define TOP_OF_THREAD0_STACK 0xbffff000 +#endif + +#if TARGET_CPU_X86_64 +typedef x86_thread_state64_t breakpad_thread_state_t; +typedef MDRawContextAMD64 MinidumpContext; +#elif TARGET_CPU_X86 +typedef i386_thread_state_t breakpad_thread_state_t; +typedef MDRawContextX86 MinidumpContext; +#elif TARGET_CPU_PPC64 +typedef ppc_thread_state64_t breakpad_thread_state_t; +typedef MDRawContextPPC64 MinidumpContext; +#elif TARGET_CPU_PPC +typedef ppc_thread_state_t breakpad_thread_state_t; +typedef MDRawContextPPC MinidumpContext; +#endif + +// Creates a minidump file of the current process. If there is exception data, +// use SetExceptionInformation() to add this to the minidump. The minidump +// file is generated by the Write() function. +// Usage: +// MinidumpGenerator minidump(); +// minidump.Write("/tmp/minidump"); +// +class MinidumpGenerator { + public: + MinidumpGenerator(); + MinidumpGenerator(mach_port_t crashing_task, mach_port_t handler_thread); + + ~MinidumpGenerator(); + + // Return /.dmp + // Sets |unique_name| (if requested) to the unique name for the minidump + static string UniqueNameInDirectory(const string &dir, string *unique_name); + + // Write out the minidump into |path| + // All of the components of |path| must exist and be writable + // Return true if successful, false otherwise + bool Write(const char *path); + + // Specify some exception information, if applicable + void SetExceptionInformation(int type, int code, mach_port_t thread_name) { + exception_type_ = type; + exception_code_ = code; + exception_thread_ = thread_name; + } + + // Gather system information. This should be call at least once before using + // the MinidumpGenerator class. + static void GatherSystemInformation(); + + private: + typedef bool (MinidumpGenerator::*WriteStreamFN)(MDRawDirectory *); + + // Stream writers + bool WriteThreadListStream(MDRawDirectory *thread_list_stream); + bool WriteExceptionStream(MDRawDirectory *exception_stream); + bool WriteSystemInfoStream(MDRawDirectory *system_info_stream); + bool WriteModuleListStream(MDRawDirectory *module_list_stream); + bool WriteMiscInfoStream(MDRawDirectory *misc_info_stream); + bool WriteBreakpadInfoStream(MDRawDirectory *breakpad_info_stream); + + // Helpers + u_int64_t CurrentPCForStack(breakpad_thread_state_data_t state); + bool WriteStackFromStartAddress(mach_vm_address_t start_addr, + MDMemoryDescriptor *stack_location); + bool WriteStack(breakpad_thread_state_data_t state, + MDMemoryDescriptor *stack_location); + bool WriteContext(breakpad_thread_state_data_t state, + MDLocationDescriptor *register_location); + bool WriteThreadStream(mach_port_t thread_id, MDRawThread *thread); + bool WriteCVRecord(MDRawModule *module, int cpu_type, + const char *module_path); + bool WriteModuleStream(unsigned int index, MDRawModule *module); + + size_t CalculateStackSize(mach_vm_address_t start_addr); + + int FindExecutableModule(); + + // disallow copy ctor and operator= + explicit MinidumpGenerator(const MinidumpGenerator &); + void operator=(const MinidumpGenerator &); + + // Use this writer to put the data to disk + MinidumpFileWriter writer_; + + // Exception information + int exception_type_; + int exception_code_; + mach_port_t exception_thread_; + mach_port_t crashing_task_; + mach_port_t handler_thread_; + + // System information + static char build_string_[16]; + static int os_major_version_; + static int os_minor_version_; + static int os_build_number_; + + // Information about dynamically loaded code + DynamicImages *dynamic_images_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator_test.cc b/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator_test.cc new file mode 100644 index 00000000..62530832 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_generator_test.cc @@ -0,0 +1,82 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +#include +#include + +#include + +#include "minidump_generator.h" +#include "minidump_file_writer.h" + +using std::string; +using google_breakpad::MinidumpGenerator; + +static bool doneWritingReport = false; + +static void *Reporter(void *) { + char buffer[PATH_MAX]; + MinidumpGenerator md; + struct passwd *user = getpwuid(getuid()); + + // Write it to the desktop + snprintf(buffer, + sizeof(buffer), + "/Users/%s/Desktop/test.dmp", + user->pw_name); + + fprintf(stdout, "Writing %s\n", buffer); + unlink(buffer); + md.Write(buffer); + doneWritingReport = true; + + return NULL; +} + +static void SleepyFunction() { + while (!doneWritingReport) { + usleep(100); + } +} + +int main(int argc, char * const argv[]) { + pthread_t reporter_thread; + + if (pthread_create(&reporter_thread, NULL, Reporter, NULL) == 0) { + pthread_detach(reporter_thread); + } else { + perror("pthread_create"); + } + + SleepyFunction(); + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_tests32-Info.plist b/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_tests32-Info.plist new file mode 100644 index 00000000..921ebf35 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_tests32-Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.google.breakpad.minidump_tests32 + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_tests64-Info.plist b/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_tests64-Info.plist new file mode 100644 index 00000000..acfbd309 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/minidump_tests64-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.google.breakpad.minidump_tests64 + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CSResourcesFileMapped + yes + + diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/obj-cTestCases-Info.plist b/thirdparty/google-breakpad/r318/src/client/mac/handler/obj-cTestCases-Info.plist new file mode 100644 index 00000000..65013556 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/obj-cTestCases-Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.yourcompany.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/protected_memory_allocator.cc b/thirdparty/google-breakpad/r318/src/client/mac/handler/protected_memory_allocator.cc new file mode 100644 index 00000000..10768541 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/protected_memory_allocator.cc @@ -0,0 +1,92 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ProtectedMemoryAllocator +// +// See the header file for documentation + +#include "protected_memory_allocator.h" +#include + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +ProtectedMemoryAllocator::ProtectedMemoryAllocator(vm_size_t pool_size) + : pool_size_(pool_size), + next_alloc_offset_(0), + valid_(false) { + + kern_return_t result = vm_allocate(mach_task_self(), + &base_address_, + pool_size, + TRUE + ); + + valid_ = (result == KERN_SUCCESS); + assert(valid_); +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +ProtectedMemoryAllocator::~ProtectedMemoryAllocator() { + vm_deallocate(mach_task_self(), + base_address_, + pool_size_ + ); +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +char *ProtectedMemoryAllocator::Allocate(size_t bytes) { + if (valid_ && next_alloc_offset_ + bytes <= pool_size_) { + char *p = (char*)base_address_ + next_alloc_offset_; + next_alloc_offset_ += bytes; + return p; + } + + return NULL; // ran out of memory in our allocation block +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +kern_return_t ProtectedMemoryAllocator::Protect() { + kern_return_t result = vm_protect(mach_task_self(), + base_address_, + pool_size_, + FALSE, + VM_PROT_READ); + + return result; +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +kern_return_t ProtectedMemoryAllocator::Unprotect() { + kern_return_t result = vm_protect(mach_task_self(), + base_address_, + pool_size_, + FALSE, + VM_PROT_READ | VM_PROT_WRITE); + + return result; +} diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/protected_memory_allocator.h b/thirdparty/google-breakpad/r318/src/client/mac/handler/protected_memory_allocator.h new file mode 100644 index 00000000..ed4f51d5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/protected_memory_allocator.h @@ -0,0 +1,85 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ProtectedMemoryAllocator +// +// A very simple allocator class which allows allocation, but not deallocation. +// The allocations can be made read-only with the Protect() method. +// This class is NOT useful as a general-purpose memory allocation system, +// since it does not allow deallocation. It is useful to use for a group +// of allocations which are created in the same time-frame and destroyed +// in the same time-frame. It is useful for making allocations of memory +// which will not need to change often once initialized. This memory can then +// be protected from memory smashers by calling the Protect() method. + +#ifndef PROTECTED_MEMORY_ALLOCATOR_H__ +#define PROTECTED_MEMORY_ALLOCATOR_H__ + +#include + +// +class ProtectedMemoryAllocator { + public: + ProtectedMemoryAllocator(vm_size_t pool_size); + ~ProtectedMemoryAllocator(); + + // Returns a pointer to an allocation of size n within the pool. + // Fails by returning NULL is no more space is available. + // Please note that the pointers returned from this method should not + // be freed in any way (for example by calling free() on them ). + char * Allocate(size_t n); + + // Returns the base address of the allocation pool. + char * GetBaseAddress() { return (char*)base_address_; } + + // Returns the size of the allocation pool, including allocated + // plus free space. + vm_size_t GetTotalSize() { return pool_size_; } + + // Returns the number of bytes already allocated in the pool. + vm_size_t GetAllocatedSize() { return next_alloc_offset_; } + + // Returns the number of bytes available for allocation. + vm_size_t GetFreeSize() { return pool_size_ - next_alloc_offset_; } + + // Makes the entire allocation pool read-only including, of course, + // all allocations made from the pool. + kern_return_t Protect(); + + // Makes the entire allocation pool read/write. + kern_return_t Unprotect(); + + private: + vm_size_t pool_size_; + vm_address_t base_address_; + int next_alloc_offset_; + bool valid_; +}; + +#endif // PROTECTED_MEMORY_ALLOCATOR_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/DynamicImagesTests.cc b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/DynamicImagesTests.cc new file mode 100644 index 00000000..cb76eb10 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/DynamicImagesTests.cc @@ -0,0 +1,85 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// DynamicImagesTests.cpp +// minidump_test +// +// Created by Neal Sidhwaney on 4/17/08. +// Copyright 2008 Google Inc. All rights reserved. +// + +#include "client/mac/handler/testcases/DynamicImagesTests.h" +#include "client/mac/handler/dynamic_images.h" + +DynamicImagesTests test2(TEST_INVOCATION(DynamicImagesTests, + ReadTaskMemoryTest)); +DynamicImagesTests test3(TEST_INVOCATION(DynamicImagesTests, + ReadLibrariesFromLocalTaskTest)); + +DynamicImagesTests::DynamicImagesTests(TestInvocation *invocation) + : TestCase(invocation) { +} + +DynamicImagesTests::~DynamicImagesTests() { +} + +void DynamicImagesTests::ReadTaskMemoryTest() { + kern_return_t kr; + + // pick test2 as a symbol we know to be valid to read + // anything will work, really + void *addr = reinterpret_cast(&test2); + void *buf; + + fprintf(stderr, "reading 0x%p\n", addr); + buf = google_breakpad::ReadTaskMemory(mach_task_self(), + addr, + getpagesize(), + &kr); + + CPTAssert(kr == KERN_SUCCESS); + + CPTAssert(buf != NULL); + + CPTAssert(0 == memcmp(buf, (const void*)addr, getpagesize())); + + free(buf); +} + +void DynamicImagesTests::ReadLibrariesFromLocalTaskTest() { + + mach_port_t me = mach_task_self(); + google_breakpad::DynamicImages *d = new google_breakpad::DynamicImages(me); + + fprintf(stderr,"Local task image count: %d\n", d->GetImageCount()); + + d->TestPrint(); + + CPTAssert(d->GetImageCount() > 0); +} diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/DynamicImagesTests.h b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/DynamicImagesTests.h new file mode 100644 index 00000000..e1e79993 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/DynamicImagesTests.h @@ -0,0 +1,52 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// DynamicImagesTests.h +// minidump_test +// +// Created by Neal Sidhwaney on 4/17/08. +// Copyright 2008 Google Inc. All rights reserved. +// +// + +#ifndef _CLIENT_MAC_HANDLER_TESTCASES_DYNAMICIMAGESTESTS_H__ +#define _CLIENT_MAC_HANDLER_TESTCASES_DYNAMICIMAGESTESTS_H__ + +#include + +class DynamicImagesTests : public TestCase { + public: + explicit DynamicImagesTests(TestInvocation* invocation); + virtual ~DynamicImagesTests(); + + void ReadTaskMemoryTest(); + void ReadLibrariesFromLocalTaskTest(); +}; + +#endif /* _CLIENT_MAC_HANDLER_TESTCASES_DYNAMICIMAGESTESTS_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/breakpad_nlist_test.cc b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/breakpad_nlist_test.cc new file mode 100644 index 00000000..e7332bfb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/breakpad_nlist_test.cc @@ -0,0 +1,106 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// breakpad_nlist_test.cc +// minidump_test +// +// Created by Neal Sidhwaney on 4/13/08. +// Copyright 2008 Google Inc. All rights reserved. +// + +#include "client/mac/handler/testcases/breakpad_nlist_test.h" +#include +#include "client/mac/handler/breakpad_nlist_64.h" + +BreakpadNlistTest test1(TEST_INVOCATION(BreakpadNlistTest, CompareToNM)); + +BreakpadNlistTest::BreakpadNlistTest(TestInvocation *invocation) + : TestCase(invocation) { +} + + +BreakpadNlistTest::~BreakpadNlistTest() { +} + +void BreakpadNlistTest::CompareToNM() { +#if TARGET_CPU_X86_64 + system("/usr/bin/nm -arch x86_64 /usr/lib/dyld > /tmp/dyld-namelist.txt"); +#elif TARGET_CPU_PPC64 + system("/usr/bin/nm -arch ppc64 /usr/lib/dyld > /tmp/dyld-namelist.txt"); +#endif + + FILE *fd = fopen("/tmp/dyld-namelist.txt", "rt"); + + char oneNMAddr[30]; + char symbolType; + char symbolName[500]; + while (!feof(fd)) { + fscanf(fd, "%s %c %s", oneNMAddr, &symbolType, symbolName); + breakpad_nlist symbolList[2]; + breakpad_nlist &list = symbolList[0]; + + memset(symbolList, 0, sizeof(breakpad_nlist)*2); + const char *symbolNames[2]; + symbolNames[0] = (const char*)symbolName; + symbolNames[1] = "\0"; + breakpad_nlist_64("/usr/lib/dyld", &list, symbolNames); + uint64_t nmAddr = strtol(oneNMAddr, NULL, 16); + if (!IsSymbolMoreThanOnceInDyld(symbolName)) { + CPTAssert(nmAddr == symbolList[0].n_value); + } + } + + fclose(fd); +} + +bool BreakpadNlistTest::IsSymbolMoreThanOnceInDyld(const char *symbolName) { + // These are the symbols that occur more than once when nm dumps + // the symbol table of /usr/lib/dyld. Our nlist program returns + // the first address because it's doing a search so we need to exclude + // these from causing the test to fail + const char *multipleSymbols[] = { + "__Z41__static_initialization_and_destruction_0ii", + "___tcf_0", + "___tcf_1", + "_read_encoded_value_with_base", + "_read_sleb128", + "_read_uleb128", + "\0"}; + + bool found = false; + + for (int i = 0; multipleSymbols[i][0]; i++) { + if (!strcmp(multipleSymbols[i], symbolName)) { + found = true; + break; + } + } + + return found; +} diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/breakpad_nlist_test.h b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/breakpad_nlist_test.h new file mode 100644 index 00000000..e93657cc --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/breakpad_nlist_test.h @@ -0,0 +1,62 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// breakpad_nlist_test.h +// minidump_test +// +// Created by Neal Sidhwaney on 4/13/08. +// Copyright 2008 Google Inc. All rights reserved. +// +// + +#ifndef CLIENT_MAC_HANDLER_TESTCASES_BREAKPAD_NLIST_TEST_H__ +#define CLIENT_MAC_HANDLER_TESTCASES_BREAKPAD_NLIST_TEST_H__ + +#include + +class BreakpadNlistTest : public TestCase { + private: + + // nm dumps multiple addresses for the same symbol in + // /usr/lib/dyld. So we track those so we don't report failures + // in mismatches between what our nlist returns and what nm has + // for the duplicate symbols. + bool IsSymbolMoreThanOnceInDyld(const char *symbolName); + + public: + explicit BreakpadNlistTest(TestInvocation* invocation); + virtual ~BreakpadNlistTest(); + + + /* This test case runs nm on /usr/lib/dyld and then compares the + output of every symbol to what our nlist implementation returns */ + void CompareToNM(); +}; + +#endif /* CLIENT_MAC_HANDLER_TESTCASES_BREAKPAD_NLIST_TEST_H__*/ diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/dwarftests.h b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/dwarftests.h new file mode 100644 index 00000000..21ff7a44 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/dwarftests.h @@ -0,0 +1,46 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// dwarftests.h +// minidump_test +// +// Created by Neal Sidhwaney on 9/24/08. +// Copyright 2008 Google Inc. All rights reserved. +// + +#import + + +@interface dwarftests : SenTestCase { + +} + +- (void) testDWARFSymbolFileGeneration; + +@end diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/dwarftests.mm b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/dwarftests.mm new file mode 100644 index 00000000..40c69aff --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/dwarftests.mm @@ -0,0 +1,60 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// dwarftests.m +// minidump_test +// +// Created by Neal Sidhwaney on 9/24/08. +// Copyright 2008 Google Inc. All rights reserved. +// + +#import "dwarftests.h" +#import "dump_syms.h" + +@implementation dwarftests +- (void) testDWARFSymbolFileGeneration { + NSString *inputBreakpadSymbolFile = @"testcases/testdata/dump_syms_i386_breakpad.sym"; + NSString *outputBreakpadSymbolFile = @"/tmp/dump_syms_i386.breakpad"; + + DumpSymbols *dump = [[DumpSymbols alloc] initWithContentsOfFile:@"testcases/testdata/dump_syms_dwarf_data"]; + + STAssertNotNil(dump, @"DumpSymbols is nil"); + [dump setArchitecture:@"i386"]; + [dump writeSymbolFile:outputBreakpadSymbolFile]; + + NSData *d = [[NSData alloc] initWithContentsOfFile:inputBreakpadSymbolFile]; + STAssertNotNil(d, @"Input breakpad symbol file not found"); + + NSData *d1 = [[NSData alloc] initWithContentsOfFile:outputBreakpadSymbolFile]; + STAssertNotNil(d1, @"Output breakpad symbol file not found"); + + STAssertTrue([d isEqualToData:d1], + @"Symbol files were not equal!",nil); +} +@end diff --git a/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data b/thirdparty/google-breakpad/r318/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data new file mode 100644 index 0000000000000000000000000000000000000000..5be17aeedcf1bb46e7a5290fbd7d9eee5969caf0 GIT binary patch literal 702795 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
      cIv3Wg*uhd*&oFmA@X+bQu90#b^;@|uEIzX#m z-5s5-0lvl@&H2@Drv{6vpFj$L64P%kDZdMJZ{fe;o;?sh&|l9kPcvqKi`j8WECzeB z-oANB zzVyO7o%_kMm{ZuI&P{cALLMEzLkvm82KXfUIB5n$^gRy33m%m;NU zaSM`IG0=-81~G|OfjZhRisPzp!*$%~6)1xIuJSd_RVtADu0|sj<$na>7!X$ElcbbK zoT2nstdb3BtkY$&*jQRDU%Z;z$f&F<-fJcWY*kr)HDX^z_BA__NtqhdVm88R9jYkO z>nKGE_?CpM28-lh5sf@0Kh|$ia)W-SBs~EA=1$2X{dS3ozVX9AwAHxS&inb&ZJ|$a zC*67|v}ihMUj(gcAz!4_9Z`J>zI#Q<72ymo(2Kd{F2T)zB-&quT^3kEzL0QCPZ?}c zc_+Zj@LxffQSdIe*s*wG#oWG_;MT(f039kWhdVAV`B;K&F!S}*V9NI!hajD^&{dk} zIE&t!g>cR}J(xyG`Dvj06m%7=XZh#aDpY;|qUspUHG%x6Og)`dszUYk4_-dgBE5mtv-;{ zJ=9qXnlEjsR*rg@&Rlbc>fI=N505<<6nwRE*uyhf>{5O&7{3L^4a#Cqk3s~^*SFO5 zJ=TluH_VGIMkX3MP}~#5GH71W602J^+>4F+nHRg4&;b-+rWN2mKnZyr|1X8mGfZEy zd0?!LfD=Y|vCl)``4%`dR!6|A_-~6`8orlU;D}f`0Zo)u^<%MTR5Zp&ca_cXIAox5 zmwIIO7vQ1##TT#UCUiIoAJO)}Vr~_zq9!{bV>F#gna|mXNe;q;HRo9U!sBz7AK|A8 z=O#qU!uev_8SVhAWDgAU%VzZ9q1#ln49J#p~8=pnI={0kJNK-Qmy{TQ)i)= zJ&dYbL3=FZT8FHT9LX~8vj}pnKs4ogM88GJmHM5Md_}*VlJDpjHJbDbK|cz#4~xEO zTj(oq9EyZ40Eu$K7Y{Ae(U6RM-UR1HXkxCkaR)ii!2^=TDt9;rFMmKtlzagt@7<~* z-ahLBQC%s@4-u2R4-ZlDDlb3(id4#)4{q^eZEF}AD;`TGB&h(CC1CJ?nDhlO`GsMU z+^k>t7=8$#n0Me;#_;e*Ikt!3#fw$_6h8~WhAdtZnu?(4cW!qkX=PSYruImxPC3pZy_c*2M?Cq`T8wNUasGg zSmJJUcQyiV&lxP`cE3d9LU&nwsi~~_qqo1EAyZe2VwK#r?e_wjB$KDCk$+vO4ck@Z z(CuSBs<~3^mo%QESmR&6P^^#G(^jy`C=@(^FTN=-UVI_jB|u_O%_&y zgRVzlU{gm?e1CCH$8@W$zg5OB-5UC(!SoupdL)BiDt{G>P6neXb+P>0JmclzQ;Ruf zN^q3b1mGs6l*mlUIPsaziHq}0V$q4u1pZ*=6JA`Sl& zN6r@{%#EB?#CsK#q(z&;cF)KqvScli1jA}Y#PDTA?MZtkrj^7kPB9Hifi{63POjt4F59R0#lxr5bT zgHR-;tRiqyRj^s8|99s~RJO~eFV~~E4jfYVW{DlaKBVSNV zyg0dv`1RmG>hs0ne#9g%z(e-2j+AQ`KcuDZ^^3&e-7}Kfc;JI z%TnQ$FEU@ZAu7sODTA@%fYK59FCc#xq+f`94au*2SVid6#RRADW2SbQnthg{Q_RpBejD2}g!;75hXH*wN8jyl zvxD!^9DKV_(dYmj=JvM{4So>g`VJ7O_++%Cl^=VEn+AYnKLIbMiEB5Ck+!-01zwMb z@XsK%yjfKLGQ=d4c(5!_(J#t!IXL=HAS7mdvCOLei1%1AFT^wrIO%T($5!CBmpE=f zO!5vq$nie?BA@&o2;qZ;v*Wc^EqpOWkbekR-h41yc%b?N0Z`(6Nh<|@Hl=tUJgT|@ zvAKMx@>;)`(}1+(>arDC3)sUpd7p9ZliFgQ(2eutQ3 z6CTXK9Q`5#{5l8WR|#hgqGf4(F&PL3!qWI9j;n$3dtrT_g;mMjJN_=$S(*6aH5J_I z$4bimJrIZ$b7xO6_mfnSdIcnV6uj1m-|@gm=Ho%hw$m>pcHwz>EWJtW$0*Jp}b$-OTA;fPnU@g-EzQ3&7`v^jWi_eB+{ zOFu)?2wtnjuL&{99(Yhief0|!@qSUlzZT9SL`y|{F?r*(d4hXNHUi_IIaK6Ihs76S zRTusm<#e(CJi_uV+@Mm-rRD_h9z7UTm7@I0QHJ~z+^R$1sY2*@gB8HBjwN`7W+Q+r zgfPS*I1Wl1muDXsGifJyMJREf7XAc>9~OFoTUVX|@HHWv?+~ICx&7yL05=NZR}Mk? zMsDE`&x2+?e-+79sp1S?r;bIuni z6_&xx{t4~|KMWYB2&GU`ck9#PTh~Bp2a9me=VQWq;U_Sj+(YGU5Ca(egBWF(!K3K$IM}sw@D;lfvqA zlf`l!66a|MP#uwz;f?xFfgt}(>Zr~UIo4S&g3AuyV3hP$74cuX8BSWW6vz8!YBRrD z6BWn%T4ZT1s;+|1#?k~aQG{l2cf4&N@Lhb?O6e=g3G`V!VZ{|h2Or26gAXh5< z=3T4LGq_x{@SFE2-|puamP3k$MT|c|78W$Gozrj?!y|2Y^_+$q86M?xjXP-mU`|~E zgva~>Q?<)6cQlNn%L;!D#0#1~oYPRjaHS1@J||Z9Brrcb(ThzFv8VZ*$qSk{0!qlq z3G~eg746xUb}r_(2)P;mD+s-nVl41E85K024=5q;;eQpOza@0BgT0jYza1!o>hTJ9(ciVKY2b7S3P|fv({*Ig<^H14>w70i3Jk9V^Hl;gT z>JG1j@!|hOB6FWl{>wIln4&8ugsd9ssF>Gn!5!Jq$l%*T^qYq^9CbBju-*|4d&-gJWW`@?*f_KKygk{Z3ut6eL%3*F%*BBOSEOif z`&QHDPP)Y!w&u=IPs-N=wi{p#vZhu6ufC-e=TeG-z|NjFyu^%eZ-Z0Hha|n&I{Y{M zh4DKE#-j~uc$dLWftlW)21ydrQTRasSjQ?)McV%Hj$BzWPV^y0T9-$Xwto-A;4LwkLnepfLH{&Zzi@eP zli4*0$>oVzsw^bx4mM=b_bis-!-z?qFLKDjrBVM4N3LQ`B`5L`Anym#r6S)<@~16% z72(x@6V~o*vhQ+h3cT_pj4S;9h>~<_m~2)VX@?vnIRi|{pqH4`k;z_oFsr@wTZFDE zH{d2-g-aqZ|9~$r(E#ep#i9Fc;P8pzko;P|XiNCr zz=eQ6CY)n|qqfA(=`n}=Y(e7mezDl&K-ny``3{W}scdpge`f;cHPM#XW|~-Prg_;z zg6H{3-Q^q>$>WX#U&KKZlD9uC8uZwBxWAYO{}a3kfr;C3q3V7yu^;q0Avfi#@zPfxxqcFv1}?**&DU`XHiAGokTxmA0<I$J> zo{1hyjD~Ck{!<7q0>Kt3522HxDN+-1MM^XlX-^%`Pw+T;?0j_D@$db7V|F4uYDnM( zLO9?zR%qL&&o8e){CW7-K8pBTflhcePlVEWFlinjH;QtkqvQ(hV2P@KEm(1ydEA;OSG+^%m_tK#)T1h=rp#xKaWeh47w3Sb4n>!E{&` z`2<8AR-WP@!3`qne5d7lcpA|KJ^>+7CBIti{{&Hy&n;yTADF@9P}MGYeHTW)6g=+~ z-|>h^?u!Sqm^@IwXy-lvvVSf@Vj~x9XCoOIEAGk(B$AH&2WC#e=mjym8!^c#c#zpl z{esyBQ247660^Z<2UPzG$~?weZlt{p+{o#3ar1r)ZV!t~e)4Jkf*ZfH>+c4TxM>E= za2w(=);1EP-3z{koDQDHBK;Y;72-kJcF-@l@oTvL6okZ0(@}=oA3ereZlpZ}+{kH+ zxLt#o%*SE0%7svaTc_BM1C3MB)v@Js}Ym@mB?ToO-I9lA^s-8 zzCyI@hcCuLzX3v`Cmzdz@v*S>zsq82ITBK++f-!t1r?3qHgndm1iz)T9wZ$vq!y|i znPw#&S-U3F+k$)RHz_96GNJ#{p{I{pPqL%d(7h#iwLou>j1$?@j*KtNLN(`Yaod2K zHYnx=2nineC&ASs+T(7UqmbwtI--r9^+eUnQ-dYtQ$V!@{|)Rf#=o&>82Tr8PL({r z7vI5-uk#fc`lGi?;BgmGC*!jbc=&KQfD?ppoX*Hu++1&aNV1Kd`zKY;F;&lMs{afCt1$mg*OU&#wUz{*rL!AXPE-`@$1D6=Q-6ct;7>zsL0@Hu!v} z>Dal@)(XP!t^^xB68z%dP|%$%+Wml#E^gu$%uo=xR0zWzf~G214v7~qlR)6zLYV9j z+)M(5^ia@=Lm=b|pnN2>n}Oy!JbVv@e9*sLK?q4!dL$OdW3hFh>pP#?`V8^5b=-~9 zCt>SoLaudmOB9K6q}&gbr--`Sy)NYqKHtNXH~4!gn3gh6lybCr6?*Vk(nF3e5 zKxS6*OSIoK40afE11tzLPO)j;Vv-FBzQ+$aH;Vg}S==T6kRXlwkRXk_3wD?>6ilYz zKUT@_zxxk>TS`l+k9Anp#ktpd-WK@Qzp- z-f61^KNr3d)ZdE3QpX`I4P`POSnG);?ni~+4BXlU%-$;CYYf@`IFm^J=x4YJc^m<% zAWGyTxS8=Fm?5H#E)l+%3c@pJi5q}56BzditIq>AGvU}HcLk~J#K!7qU`LHrtcuhf zHU{GLl=#&lCV3bhtTc_@clmJ+#LsnfYNbjUv?C_s{{$RJ{kAyVjhN(Vc(5$z>KCmF zFD_aO_vQkgLAo?Z1A@SeDz<&q~{%jdk@`66U z8=@q>w(_Nt6ZtNXzYEfiizxmek{97Y@e{oMjq&>mR*h(t249S&@%p($2_D^nF;Q68 zI;^l8nA_44ynl)$SBdQRj?9&0EWsfEWUTL@A!LXLghVxdO1)V-hrm#k9nLk#$NCSCI4s3 zcS?hje?Cg4k~ez!w}E?PI%XI4B{NCM*h)fCK1Cu+klGg#ZY^Sx=i|XjvOvE@ z$!qls;~Ylo@*c4%$hu4lxTXrRmMeK|w+S0Tz_IgUX1N!D$#s_Nmxe2R{?2VMMXT;dyqf9J>#b#w_gu}F@As+cOk&vi~WG#TcZg*uv)Bh zT#H+N1JE{+8;!K!{HTddtR8@VKOlXtq{`0DWHg$Lb{K10zVZTK9f<#m3!uFnk|w$d z@_Yq0{QzhZn?Gc-F%9z6um$DxM}Z4sME1lXuoRG9vxHLgc{C$CniAS!I^*H(%I5>~ za$r_mLMdihDJm8-G~0xxR9w%{9MeYESNw{h78Ak@h+5vWJY9hKTYz-8#kF9$P69MI z0W?~LQI26u*fdS|{stPalXvhp=H?4h^}mXuzXLpDN1Z&|xEVWg!J_Jaus~g~qn{xmL{68u~DJMkIBD-WrclXzvl93<5-^3jI9=f`XmjF%CFLtX z_YM9{SuTmnGI0cSM6P>ZL(yCR!EwGbowEyC&MsI|o)5Y`@o$Rqo=7Rvy%q@Wt@S?p z-W26Nz`97Oj0#g(n_dzwXj5@P6lER6B=Lh{@NmdrV>$yDvqB__RYN6;OJ|7@?zF6nfy6Q`HEdp+^PrMZ4UZB|mh3zO>Zy+4S| z>?t=Fv>NK}nI%1___vVtG!Wk)2JN48ImYLEG(NEmT+lLb!IJVbL3bVgb5!akidp5I z;Kg-K#Zq9kx{i9S3{$D{(waFJw5hlt#C#QElDMxJJRLHap3cApEdv)UDc=rs2jYLL zmHKx_L7_l=MG19z%2sN((rPQUn-nmW+Js8Vj{wb!__vkXM59tC=A$gg@FOuD;F$8o zbnV(54y+--S_h0hucwk`IIM6DcMDy+!Xq%F3X%~byTy@(Yq%s!nMeE%nk4Epp??Z= z<*D=0wj{JD;6g>C*-p4n$(So;6CGlSy<5Q$!Qp0c>HDU!4f{;Xi z6Jfn0?EH`;WT|w1=rFaeMe12}eu!wO|2Fv!!TF!PCOa3|+o zZe+gi47t~*akn97dInZ9V>1Z5f-sgi4{UbD+fib(A!M^Tjg1XC)3a>C{3iGj=b_+m z{LK{R%9WXY0Crq=+GNN~G4HgASWsHs6wr-ahKh@D!w4eAyk8%{Ju*1AR!+z<;M#Bq zA^CPBG^Jq&7|u?`cEHrs&_w9=DyE?M&X$I`40o{M+gn@#e>Xf9I|1Atmz>XK%Bk{f zm+%Ql>0mw#*X=F$UcwJs0}^j{3p4tYKe={dd3r4LCzR2D_~kFoMLS#OW>AJ>WJEoXT!z=6k&0GXH}um`Nzg z{4c>^FEGd|=eNPVHvnVBy)oqegDsflKBGT~PQrgI5ih_DI^NC`oBKjGKiGmfAzgkG zyQ2j=9~|c1#jIZRVnz#AtrqMc+Ycy`7I!+x&DpBmK#*j9bBDTBU{v`VFLpS>rb)v$ zRMe#1($a7uo2H-IhODY#0)qo>OSKFw9to#I3e)0M2$2W8O_P_jX^t~ZUacj(+BSLP zZFq6mN}v#@^1Ev38f)A(_b-f@Ute#59PP`6NTetdR{nE*2xZ6Yr+3c3+jL ztKVZXv)ytls99k`ka#dL%VRQlBtZYLc#O%-<9^2@mf%G~-K#NFpTIN^f61m99@IY^ zur7dAT#M7b`Gfd9r=a=jmWtVE^zx4}J5L8z%wuSn2_0FnkfGzuq4c3MhoTeuJ>;m+ zY19#>yv}biR|yp#maA~^7#(0=>!dyF$f2r2$NQ)7TTs}Di$oH0M5LN-Z{R-;l9w3?tlI|X_08APEnxJiyyW4qVH0r%jg|-9n05K?D?HC+r zQNq!$+v=ccGY3WA19XStKgZ}7pR9>_gT1}*L*m1LRjX7g!c+#Qr{aQEOc#WhqafyZ z5HAvgCqo9)(;2v+W#ED(<&B`b9RFJz{Z99)DD`r0ik12b5N%MRJzjRYS)Q(37qp2k zcgiil5pufzUCW4t}m~=*Ng2+sv5?xv&^S7G&1<9MMFy+OYpAr1TgQGbZuVEC0+c+ zJS$x+!Tao20C(Vh%*_c|__LV8i5>ySP5GlhJq)M~a~WT5&)`o%yUwFF34V5foR*5) zd0E`F*|Iopxy2H^wVb$*3;$k+?=}c&q}}lmhd$lA0I8yy-iaR#aX|KwNP{)5ya$JU zQ+6kTY`Utpyj>6m^Arqb9f)_jpE<7&8B9-S;DVNc3t|!;v^#=!Yt=Nd9tm{@;vgk- z7ZS2_IIc&o0rt^WPCJKVLQ&^F(XkMx9l_yLaoH4dsZZl#L$14Nxy%?2qRIG=B@P9f zM!a1qHa~sM39~tkjSac(rW3~X=cjugu^@(fr?fH!u>{;+7srdh(YW>D=|e3Sw0azF zwTyzOg-9fB^8gFttB`@4541Jc1+xm`ebBZB?N$roLL^iG#Ql}fp|88V|KMbr%exz8 zCGG*21Hd6EE@y^ZesD6)6~tj68jJr};&rg8#@hvA^GwL*2Pe~w<0(5`IzgeA}n7KL`FT%VXz~74f z#UcAy>Fj5vv!CS?lkDFB-6pcv>f{;Ge7+eSb_e^-0Pp@FtzZp^>=4*ZE@}jmF$5+W z#{;f#466}fwFlUY6stYnaI9WQW0f&dAsSfC=nbOd@o$H~r-Iig1Wy;QMj*M7ienJXzH*+J;N%>t)ae$Pw}ebahpH(%|#?}qi3y6+@o_x&L-y6RzU7)MgB`);m0 zJ2t)dKE?Ik4c{YU#4cQ?z@vrefO^ip>|Xa#)Jsi{YEU`&SIIn?@l}@-HLSY+3p4BKdLt-=X8U9+`GgMgrUVM~K< zW&2jwNO6{LW)&LdbC5g_vz6*F8?_m$+xcX)>Zf?I-vMS0$nEL#vObi=>C-{eaBypM z$oF<<=x{9VKwy7N5e5>nzr`MEF4;Oj-2z_Kb^4{G)(N~mmU@^;;2?VfZ-hC4cZdy+ zF(>c_*dPUtC3vYMbumc#7@Vn(*dlKLOyCV@cY`$CQ+LQG7Nf>6qT(^C@nVo^corY( z@tr*+ov|3|El?19Eq{&|JraMPi-8U3mWcK##H(+m^U$EoJX68@|B1Rz=pSUFWBAb) zSMOor{1~W2b>Si?z-@cJg@ZJ-ce^Ft}hBx9DyTT=Xp82-<4U>SY98axA*v zkGzxrdZqE(FpUG#({MqX#(|zoqXl$-CF|@(_j`~9^k(+Ob~5IKDUAOEbMk$d%HZ@= zT+pU6*rgInybUo){Gk|3_^VUJ^mGO;Xc?+P~S_6HY#i1gt+`4Nrqv{tA0z))?bG?y>$0Q$IQfd%p!&G(1P_ zCp~__HE3SeQa)r7IsucxW(@%=H3kTp7q>Kg$ndl7UakgBP^|GNhu=K0L30qVc{eIp zUw#v~c;uo>_g2|U_b`$`uDNhtyu&^yGv4XU?A$b!S^9fcmMQ^T0+^Xk`PR&*+}G0Z z4~mlSL;+8zCgziQ4CmEe!w}8;4v)3a=6+A3&Rq+r*Qz_r#E-ZB3|NKnes~t|hQ}{G zZ|}As*sZna@Zr}0sQ%s2kZRY~z47jisNSDQVd$&V0PEIzUjw5rM#x~|u9u%unycG@ z&fD-+0iGU`#<8N6{?l&&kIIV8dPqtl-x&sgH zw@t~{*HxcV+c>Fgn+aiP6Zf0EO=*#2n+djEvdPsa*KAWVQ)m3R!iKKOCe+lFWn%I-_B# zt-`3cDYZD3S~O)p8+rJQrrMu1qQ3Q-h>bU~)Vfht4cOSp5pYuNv>3Jzz!u9UCZ|pu zJHB}ms1PGJV4T4L5YBLeBN<;;UpuyL9FPz&NT8`L?l z+tgTF3n(oad&r654=vB~=S$u*V^ zNU1@vA&=Cz&pjc5%ece>cQ*TW*H7@;T=(?_{E?HkUvzA2x zv20c?5-Vw0m_Zl;EH^Ej3In&PO=M&7rq?ZEldK|*WXVP<9pX1OPpYN(CV{cECE1(JC5s!c^buuznBee{KdV03Xa~kSeB|h4 zeKR>IFsQLHIl~1;y7Cq1$U0RKw3QBiIGRbNC-@N)la0w5)Ps?=%#Wc-HYMHr;7QF5 zVI>hXMC@PPTvy+;U)`j`(9FkjxE!`oYQv#keXJi7pz4Q&?AI?&)GgB zLWehz{;p>F^kj9NNw#Ln6xli)U=js^NYqw*k;U)67dpK?It0F7;su`H(Fjl%ua(kl&rQeFsJTG1lyf(+* zfdR#|^1%J3Fo5WN2x??EvT|Ff7Dv2ycWh|C< zWEtl}g6XtOoG{e?G_QJzuS9t=WyA34Jta!(hYp!^@2u?;XRIl7nHp?PQycP zZ8E5TKFi4lrDZ7zd~GgdEGTVTI4Ba8i+unZF!OqNKGZJ_*atYr{hu%nZ%xcfi77B} zsbxk>O%Q;9LI1~y_QL{!icu}Rr^q?aTH^hOsS;XLCl8~til;c zarGEWfb1|H>U-G$>HF0@>RSc~z8?Kuq;Fg0QRzHmKhUyo>hTE1LAvPC#`uEY1yrec zL5CChwzEmQ!1D`DS>W6Mt4nxoW+?65lGA@`wVk7iI034j#xX?mXjWLnyF zOuKVt+P83uIX_sAwB_J@!(FreA56F8ZOQyOd2lPACF`|hzLkkby3Zh^&YDY>Ys$_Quj^jF1Tri z39D6$+y}g)Z72`nTUS2tHjCb|wSTA=d^?K{&|@R!Gb?c;`{9fev1}A-4d`70e~1@M z;bVLMKzMay@gq)9R@MY81~GzxSVm41-ygsfz#~^f5;un2o2ddX&dR5DAn?cWt&bO+ z=F(yR}yNg#Pd`?=>^-RFzPo(j5g+nW(4b1+2?v# z^WQhL!XYP${4!+UHi)Vua5lEVMWZII=b3EnPXSTueIJJIn{JGZLl3zFC_SLF%lBc5 zd2CFjgFItr-N+9nmZV|r!b*~)W$xyGE`vP63!bySPVNVSL|)JOP?WhNn;8yFE3UlAA;2zMjKQem@F%1bn9dpUF+VVl3M_mYxW_)B z8VK7`qBhI*t4kF3tW9lNY~4s#?4m4LR$D7JQojH#^B##wP#iC|urm3jF%QIbM zc^?QZYgC_D4|P9%zaP7QUr%Q*%l13kup@Y0Yqo;EKbnsw%gZVc0$YDSoNt3zFz8RU zHhpOM50#j7-Zeyqc?ZU-kVTJuVcDVFqny5H`jpZZ9x|4=>A1BcGAzLJhf!PVKSD84 zk2cqvOxojM!FDmhMJ>iNOWs z3JNJkj2g-}Z?MNjk}bv_fyQaLWG_r@qoKduCw&y%Z-!FKjBYZ~cMBU{x|LB=r*N#Z z#vnW{1PIY46sK+YX5%232CXqv#CWUViP;7Lx^3-pfyQhP*6utuYra2~IoqC=KGD>9 z>AtfUZxg(vEXu-9G$su`g~7+R%LAp`@neTs$XJ`;a}CBoA9Zz4H%TNtVpIZSMlO0gEJ5dp z?#bwO!Q&Pi7`u|8RMrxzzXaoWsD|yBzq7IJ<%aN4OK4^&wj|RVxf9=zJGumm?*EcZ z^GH}2ypBGIBq<5LnC%R}-_gkZ6md#|w_w)HB+&1-GZ>MF_}=h&TYVW6!@*7w&V}@z ztAti)MAH_|)bJi}qFwqZ8*6?3-Ui_=BD4)&g3_3{zl(`}%S2xyOD^%^ML|yv@>K}7 z0gZgkz%$Z$*nEvM(S`@GyBXFCGO)Xv=!a6VOT1vHX|-f>YG074DF*e5Gm&2V;6_`` z;@btkYhgcv?$~c{aGoO0cER6~FSfZZyWg1TMIe>)Zcjb3nmUBxXMt|};L#2pFziI) zanoUy0m9hT1ZntVhfYY=Gm`*lOPVMJ&RSDn-_^5Mqdqf+e#BB^qn_igtUZ67Lu_lG z-7@P;<=K!UyUt8!bV=~MwQ*OK7BD(@odI@MO<7O$Ho+%Wfx+wYWK;v}>t=PTWDM5l z@Du2CgVy-)^P4Q3Gl|nK_;Ho*J|bslZk6Hjw9OnavefboQQ8C-!5vX^F8>|Q&B?GA zquT_ZIp;Mk#d)pykCI<&(*0!yY+WVXj0d@#(g&o;O1@)xGOb)=7 z+Q9Oh=e{QN8Ze(_S>|&eIkgF%k4)^=ES!x7XSuW5t*{)9Z4_H$IiENkgBxtJ&Y51% z=pxN8s~&7`e9EIHdY(0>_>RE?bDURnmY9!C7eBfl97g2qdNAe(cx2Ux`G&{Z43BV& z;qgQE`GP@t!`g|(t1a`Wa?!gk+Tgmu`N6<&CTQ1+|f@kx+r+qNo|{+w{k~sWOT>iCWmdu zQ3aQZ$ty0p%xGi?qoY0!2>%?IX)L%hOL``8vNIqh4aBLUUlc8Ps z(>`)}_;$g=Et$5HSfI@2Ou9|*8%^G*DYMfh8er>z?$)KYo1|VUW+IA%hh}9a(EoBI z&?b0O{pG0pKatUG12^zN99K+{#}{ntxfjofm^XTe)LQ zbf$6}8NHQJ*&PPwA`Pg}nJEd@&M{L@u+7isV46%GA>JwYTU#^j3Z#y~S*LO~Qoh34 z&EhMOSauD)i_u#s;2bryXbI4Z(eT(oVhN_%HU3piiTZ>m6R#vl>--^^uhG+muNhXW&3;Rcs;S4sHoOJF;#1;21Ab5kVe5}_pc#Py-t1)FD4 zm#LP-k5a~W3Rr4(=~g4J0v5tIc9v2SpvH0e4(-Mlb3#dMGq~VtFewT$+k)p9y$!sB zf6R28kyfPVv#(J;()1kM6E3>A?D8{=IV!~}L!Glv<6kSznZ1HxCi)WVr2J!z`&ee8 z(>e<%0Q8Mfj`H6n!MD+rgB{-UQ-)CH2ho(notk!*-P#s$2yqI7uk4Hh(65?pHVDAb zi-P++GeeAm_-za4Y1KaX94^QG8J-*M-*P>;>=?Xly&ecZ4O;-P{QDe7>f7GWkvD)K zyZNhRbWw11hSQ(N=xnF6%wXTIp-c*^_*W z(Oc-3w_7Gyrp=5o(P_pJ_9T&@wV@Y?mR7~HEvCawN+HE!ZjUTxKckkJ#MvqMGs@c5 zTTOZ7hfCkL5TP(Q-}+P^*9mdI&~qkwv5U3_xYk5F0}Ph7IP-Izw(iTt&tX72D`lcI zMQ2a96Q?BL>Km;)-Esr7z<}uD;Fq%)NcBVGZw6_$%`ISbw$0scu>Y%UZv8D1CbYS> z!5g8?L7LsnbQ!uE6-KG8ZUuhSkPD?J{bhu53sDM#g--9b7~e6`nWdC}o3JxWsk4a= z%b;EG;!Kv4d{2%UoSDQ=lPjy6wv;H@3Vw*uor4D=r}a;}l8!9d`OYr4OUU);3)ucD zs^?C@Z7pUpPOXM2IJ~2ssOT2Xr<_aTor2$hSc_ep*mIN1cM+C7BvkJ&;=u0-L2?ep zyhim?0cPiPNZ4tQ~bvMzRh5naww9fGO-^fv6Fvw&mGM97jg1m*nzh*9(+&jos9=YvMO=G};-HkPwBVjd-jU1e1*Ur)XN8SWOYaxzdy!|0{21P}f3`inoNam|%2}lB65M0EU@q-tCi-PW zYlUQYqo36#nyavCM(yI-W=59;Pg^E{L9f1lI9=Fft;`|`bgsR?*2l@?D8t9t4FP#( zY=q(tD5ZvfSYRn2K`9AH+Im38FS~6RY!ua}4UY zs8d1U$9g?~wPJC%$s2{x)9BVQt~GLWty@Zw#AM`v=NYnNF8(_EaKQ(zWc z_aXE!dK}DG*>xI-`G_kxyEkGrcQJbY^-_ndr>)K4tX(Oe2rKj;#HVk^8l%4G(tUf%=c~VtC)m zf%+eLc>Z5KQ)PEXsgJ;7~5P8frq zcE%ZLq#nk$1gYnwZB)vcXB%TqR@*@4F=s@l9CH>D53xdmHb3s*D+EhFE$fcK0)ST? zgEg-_v`iJ&*kiCZ7RO-urem;tF~?xdn~uTam8y$Q9H*be_RXp3@bELjsqf(lTH?8r z*2o*)%^_;UhnhwKAm>OhI=T#Sc-Gdk;4x;r+QZp+n}UP3IL~jQw{&|#2c#U? zb#i#1<+*yxC;N0R81Zy&DXxFR^vt{JR{w;39*m^BvCC!qvl{2(fT-OczRcj8U6}h3 zOKa_8IFZ&~|`aZsYg>^{~SCgx^rcN(2&yXjFgOd7iA4c$jAo3z3~6gT&H z%v+MsY$?UoO|A3${?*_<$Nw4ohZwa7JQtzkHqXb*2_r<>9RaoB0PWnhV)dyq3s&to zfzWK`N7RSKjJ-YMtG*!CY2rQ({7oZDA(3@*_3jpPd_q%9gGsUjHgcK{W#v0c;!ut| zdJ5nqn1_~ztM?{M??l6S>uPclMpIWQ~4nnBfL0+oxx$r!8X zKvNTE@3)x@XRQAeBPDm=?W$-`2zB{4gTt;aE~(C>h}*sa|y|=ZN`H$qZ1NE!C5+nrqpvWz5a)&TVV@{ zJBZ@j{jc#akzA|bm$tAm7k^LI{?}o|DF`0WnqsujawelovUUn%($>StLDyD2mzy~L z)sG<_L9C*HQ-sp7yD&aw7T7%gmoPJ0ZQv?J{OwfJp;u%nR^gpHvmFTkEj zbGjN;y)gJJ+|q>e6iZrYmD<}T`)(nXrjE8}{mfdtcx59}Z!d+bh5UiVi<372wIp~J z8IPwdK(A(Wdl{5X76!4kWJi7Tqm%uRsM*P$@GYX_;Z8v`W@t>(o|iLACo1IQhAju8M*S?L8|fR@-XmE0X4X(rz-)N7(eG>A(mGs4gR?ho%O5hnNiH;1Bc<5+ zky9g12`3YwD0l}-5S`V{LKB^>8`t~%(jY8w+4})aJnk!r|3XdN6;IbhNpNOl8@4~T zo;W4J2GkAPbf5rQ%yMWq-r;~Cw~Q_V$s+cfJ;l5HmVf8h$x zSlPej&d>11xv{(^l=p0wU`j3R+DFbsre6EVsX{jmhWGH=M~fF;`^d1Hd@MFRQpoH~ zB9L?kqmoRy&e6paXs&a#G0}C7hQGOok^J4{CgM|O84-#mHVuiH>op{GoY+Kk>ivue zrrghnS-{~V-Ia_AjC5BrDwK95qd{)QZK1gQ61Q-Upi(t+I(($LX%QG(nz2m1TM^4d zxu=)`a8u0YRa4A-wNuPC7E{c8(-bpb%oMYEV=)jK&J!cY8S}w_x)^tXDx$(!VGy{v zTf9bdw+QH($SqIcf(sWe@Dt9nf+%aA)kLJ;7@PBw>6H5tVYgepq83STHulK&UM%Rv z?h+;jeJ*#~8>4>8E)Q-#(MBhGU0^bdQx|(*LV@C$tyJp#AkOZqR}c?%^n6~gV+XY8 znX6mVinj&L<_0=liK5$PJnnSR_`vgLu@{LUuf0Ji0^rRz*O44VWOT{w=9lPAa}kmt ziaWy#_i<0$5xM5AAog}E@j=^eXN%P{gFe)6=QQgo*r*@-5>wn;U8&qA*UUP;O$7f! zdx5LQCrzDNzfH;fN3QZkS0rPl0)4O0<)U!HchsWsHItg?V(=PzTXfRW?pF>kvqd#% z7}porSe=+Uk+;I)g<75*-o?ynQqsv(6Iuk!0;7B##f^gY?1csynzw+J>k^$jGvZY> z(O?HtDsgiG4@}eE42pfRcD1ADPDsdXIVvF-gAuAW99tfs7#s-`emQ%&&_ z3Nn#b2b<8eWIZm^M>P&(nw#qCaizB|Ax0!?bLX8=$++5~NxN2<9CX#M7a&-bI>=7J z+NC+P47z_Qs_xoAX6w9aon{i+hkQOXd~h$YrOAMI?4or3h&dCxjShQ-12fl-sY-kE zoGSH&m_X1?D{%wH+`)9tEEI7?$+`tib`f#5IrAlvFa@DWhPc^U4ie8?Ply?0>uu)m zDlvG;jFl5vP0dymglB8TV`O&H#0jZBg1tvdE)OyXW?i=4|@~`G8wh? zkj-x5*PEsibH%AA;2sj&9%jLOgS`b${SC>oH{--g%dN`5pI7H5p}P8z|yNsc`!0(Amw72Q#Qf3TfEuYtg3Y_BSiGY$pvbZY~H#;<{I` ziP>vs*1%=fX~^5i6fLRGD}2SYz3J7V46Gr@{ILG0Ea+lmTaqYU6@Zes&?^7p0zeZlIWIAu6gk_UWof%BVo(;QtM(dRJ@Cs(h9WC=WKMUT4p8P-s=<}+ zB69hD=ZNi1t5PKdv)kU$`q%|G0iYEHM;ZIt0>3=d&*?=uT?1~pY>l%M`{X_no9oKz z*Vu8Cw)(5rq}d2O$X7&{q4(;?M*ipc{{KO)99jAA{Ag3UYeu=|cFoba0Ny#(^I~L? z>29qH{Sku{%^XCmH4dS#jrYyvYvCVIJ9B@8WEd#mZgYKFWV`|8{ItlqgayGKp(j?Q z!&m^dDXjU3v%C0Qw^m1GGzq9Fv5ZFsZ3Z+~(B43-jx>Q}qQrG=eFPF~d5OwLfbxfOJbhc)zC!KPfLJB_#33(~L{j8)7xer9b(c73Dr%*b=S5{m|9vN)Qkr06iYbSn*!Zp(h*m8>=)#6d%XS#w z#?84VwN~hZ+j)I8N(kE7NDRF3$_GB(GMh)g_4ZQCylRBbqfPd@5wxwXxSXy}vBbIi zP!G-U#?4f+))+OFjW^9u*t74W$wks=ZWK+V06JQ)yTtSrB#&pk)d2g=o(dvL zXLz$~CL)%mpg21}jyNm5Iv5T`9~bldV@QiGi47ueaWfgDK1dXVg1O_^XxV-WPpTdj zYRw3Uy|H=WQM0HJ3eiD<&8<5@iun-R{CzV^e+U_)lyJ=pDAgYXc6dn~__0W#O_p%&)ABu>w zmTx9zp*2+`o4o1}vTN-T^4rCov^TB%OYH^zcMw4{Xx8CC4y8Ve&ZEHZ#UQk+#W2lI zs>ay071U*`8YQf$N96&fXKz7*(c4Oew;4PzHiwe8HEs~gjn-v!ua*JfsG^KQZVT57 zvmPGIq^-c(*uZnloyn9qxar8m*75$xX%P-Y=bHhic6}qvnfbgALoq2 zpCMJ`(Yg=ujohG<$!_(w4@EKC9GFmUA>AC-uvTU!6`Ha(C8kRE zLYV}tXciH*4_$7?mMBQ<gZB}W~+XLXLkD;|?;puyIR(_bxExP#6 zt~1Nr^w=pJq8{ELE#4(9s%ZjMh85{$ z{U*xC&Q>2z3PA1lHrW<}<9JlB)EE=o@8xr7(e_i9GS(d`K z=!XzpNY1Y8QnPGE#&j?bKfufi%oztbe9Z&cm6KwSo`k{+!Tbm<<(2Uk=?7cr= zYVA_Jsh<*h4C7?fsc|^adyPJ-V~_nvb84~mh^#~HNb4|{>!(2}1^UjEv@(u$$S%|< zBT%@#-}Qj$LVZO&ARR{=PfL;Z-_$8%mVtAAjl?br9!2Y^QfX^G3&nSLlw%1|+J<*z zqfR63RD{(;D2_gMWKWxJG|`#oh4-2v`Tl6-3(knn^4g1Qs}05*YNjEF<##TlBT>yP zwG}$+<5&+7xoy_Rv0lj?{kdTsUaoJoAXP_4KjT4Hr*_EkNDKWf)Bj;f?wpxZl9jom z-(_@B^qH>QlC;bI)Lr4f7UP_ zWpqh&_Pbq=?O?Q(o?Y@?xeceMKl z8vl3j93>onhO8vVaqmWh<8E(fo7B%F>#FH9#3;!+`Te?yPCscK59X_#O|7EawSYcu zkG@CuogQYQztyo~MBCGV^(OipTSc7^a~YjtG;v(4>B{%&Jaf#f#0wfsUlwoq?hO{W zezqB0$s6v#4pQX7aHt#CGRhX4dZv=`!8SN`g)Bgr+7Uo$L?6Eg)4% zczM2Sn4U7sLZzpCd;p&r%lb^x&@+{G&b#HO8yIiclFPu|8yfJac|$dFUzvd~vv-5{ zI}6-81Ov?EHmIO2+ZW!GO$}Pz)T>+7((lRJgTILprc~I3AYb=sQHwoiC~@UX8mx7S zS-0LUJR7MN1oz9aM#cR&ql@g75-{}w-V5OL-z%k@Air&74mn4hE`WvDRw#mvF)-eA zD>?6oKEk*`?T^a1BzVm3ER2q`zfQ{bTRYCa*SWxo+i!3pS$i2lg^4~({WNKQQ0TjE zC#)#zD?(2hk}sU3Ma}|)kHQZhP~+-Ds2ig88r_haTG$b@SqH>UDWDU_&JyylgXzFZ z4tZ0RT688qcD^!kgHvES11Jtm@8TX%mk6qiysL*{w6^FY{{#E}`KUA)$`Jvl;rH$mpWz zdv$GbXOQ(pj`C8XY^8NtO&nYeZck+cJ^N;o?JgD{cQc8*ntdpv+l3lnN}7*}Y;#{) z5evsv-W7&Z=4BG=7`@fn*KdAKG3rgUyYwCsoe^Gw;M$LS4UW43A9{QBbTgcWY<4id zo;djW7Rub_z>X|og>PFo32fU?jk*Nb1p&uqns?BYLu;(exnt`q48mruJ<2F>MNtQ1 zmg@}cy$Gg?+KtM>1J_$1tkL!jv(5NlV}t|vHOKd7^PVCZ`2fSM>M{w=?@O^ZxcgLA zGP)o*3+Lul1U#aP8M4icZl85?!}tYal37z`n&@n$1a)jUw&d>Dk}MuvU`MWgf0K5v z%N4yy(U26278GfjiN4ZSCI3(pz1~FMEEPk8cJgUAe1lp0ZdL0$2Fp(Or&xv9s`>6h zBvTli37eLHMZsJ8Dv8wKrd}2)zu6gs*!M;kIM|`&)x?em??DtfH;um3Pt}~C9j0p5 z0WMl`!#M=gRqpmvCEdebi6)9<5}NG*g=RpaEn}y1P@HdW43N8kcbD*ejAoYnQsR7~ zN~_iZP5mP689=C z%hSvOIVGUp({^Dk?{}q$ztD{hLQvw!38yDOe8x=Eyr^{(g6uo(p-qu2PU?50m?qtFlCuJRPY10t~^Aa(bs_K@y zCADT`ul$Q+b$8XPSFc{Zt6o*nm&ntiSLjRRF}kmyFG+|p{<7voxfj`oGyV}sY6kv{ zYDCFft-kL2_b6Z};d4$tb?X`Y7hTKU>N4de6l`s|Z`s&(kd3e8MqFy_rq^_8HZ{T?5&!RA#Ks)5LqB?XHVFHfJUJniDrEIX z9Siap>gJi0hNIZ#;A?>PSj3yp^R!6clri6L(#LVj%zT5A= zk*_1U8@`IlTZ-<)hFeO(KlBC$?Vc?CNcr0B(NpR5U#R2LSq%ZY3RW`*A|H#_sCjr# zk@^NR{n4~>>on3lx271wQDP!>kUGq?N7G^npVOp**r@Rsl2E6R<~~&()5JQBL+bns zCMDYrY9H$T6m^}$)gLRPzKG(VBDWO*-Wk#t+(tFRQ-_z1lt|b@ZJTMv@Sts9wDZ!@X~r+8`I+p`r_YJ6V7b?gDE%Ss0cMd>6qnLVI{YpAE|y2(GyJqKVurKv z#wl`YB@?tinRaBc3B>sXr^}@k*7{69jK|4xB?u$UMB?i zJn7`8_|CJY!_RJNN$GR`8JL_Cy5eDneC^J*ntbifwin~|$)C}-X^X2EZuPFn)`sP4 zx3wAh+HLJ`@Y=lH#WHru-qgP5=c!=iZ5;nkLUwQCIQQL*o-54{$=9w_dknqSGKMuN z%NX|Q7$--@>?cma(hDb(m{&BQ?#a@a#MiX0Xt;n{V^OEY0WXZgN^T_%-uwadNs9wa zCUx25H|g~$z8!V)w|M=F9V6T<^-$^)E8m16tCMi@1X<)N8HICYVD|HTWA(3$b};$r zl44-((>Ih90f*@qfAH_#01JQYv3`Mj(XUgf=F?8va4lhnnR3d>uRB?mfK129urzmm z{OAq;b`m|ItK_MF0-K{Zh!^4icDnsVR^F=dpti-EZ#d_CC11O!QC{LrAM=I61!JQV zqt|6Fs@Dqiiq46i!N0>7@`2NKLK_kmt;}kA#*sO6CJla4n$>qd2EKmzS$BYq1O59b zd3YKI_S6jzpuQmWg(9c7MrV*VjX#eooh1JA%SgmNkjov-FHKb%nQ?KKub3}JhQ&jy z7vrO10WbDnNi}i{)mlS5%YOz0ag+bFw_2GO-?bk3)#+bF3s+T+mZw+5gZTIC;`B<+ z6AS#Xe~ahMSC+lPv16Id9x@jfy@h;z0Y50AEjzuZAYLI0?g>hcQjsZq%N7>1xnWQI zw=9wwHgh90V|$SbI#rpg?#@?c7mKyY;p~by=WB$|{JPP znk?0_2lwRaN5tPHs+Jj&^>&pOi(IjEWOY@X{`Djs*}Q#rmdKD@J#yrTcywf)k;$X^ z+T5_B(oUk%yAl*+a(*L8K_cdVCn-pzJm==9e%Uw<59J#9T4QImyi{7uH%isY;Yz8I zU0qmMT@X)60APaaPflgCtNU}_1QXy;ex9h?7^QUDDf~;ByHog_8RhTW8{o;A6*nhnd3bcXRxK3kbsyZ}3T=EX&N3=7ZLNxNTqzRfUxz%y zZX3D8EgTa!bkxF*<+-_HElD3RZ&$^iJ8DFpua%?`nqMN1BlF{EHJ+`^G9QQ=Rq3($ zYIT0G=*?hT&NWN<*>Re8Qo=BP37vubai@ajNnR(sa4Id5Gz^YVQ|>gDp%U> zP3>9D?LbwO-r`NIP7_ZLn@D7HlO6#?(OlNc?V+-{10EL)cMh|}5Ze zm>~x}DWwU?Tw?+`{P{(kBu7Y7OP4b`gvihi?0`Cm3nRci;(p&sPBI>lOJs$RazHcC z4a^1CsUo??@Q8PC#-m$CJkGlJ^QryWz6Zo{RD(^ZY!(-`L|2Lsb<>N>b^5E`Z@pT40oOA`mQ_Wr7PH@VOXO!~^|)`PjS^e& zq6SvkS})>2xM~Gp4}H(Av?K+V1UuCzmbXgnd?-J&SVWCie&4M@=hdjroQoeTa4VY^6C#}muNpHuo5E!^ZW4TtmTI~8a?nq!y z4v%@eVNvonpr(=`S0{03NjnH)CGA=ZJ2DO+1?#y954<$wL^L zQHaNogyI$hp@8Ecni<9=9@W{63Zf$WV$7(%=}hrjnmbdT_>9Cc&`{IO)Q3;cq1FT) zWrDH-xDPHZfsWU}q4wjUXIewY#OC=#3T-ETqZi)PA@9%-W>KYA&2eYm9)gaRnZ>gF z{mb|so<+M^c?J{W&bSDrSt)bkJRH}Zgv;%#&Mw2=!6ds{%;0X4D{5dsGIa9|@qIko zHS#NYSm4kD<`k=6E$)hYO6-!*0A?9zgQtbc(D5z7JpD-M`%%J0$_uiK0AmL(7`fnK z`*7SqPHM1?C3pf?lo|`hyRGp5_Ai%biZ#^O`Co1grTeC<*cVo;T`eBdtb~MdwYU)l znCDV4D3+F>w!Yd9NJF+#-QVfD6Ix3J=3u-*<4PoOzimI#beQn=c{9cNQU%T39e0>; z?<1S@adY892ib7(!h(CXgd2$E%!qZj+*F)ZkY(5P@45!Vj_p@fFY^hSC1d}NxP*nM zlAt_K<*_!(lSkf=<-4N}B-w~3KA5~|P!x4Cp7?1Sb=YP?owIQZ3`j!u)3A3rrf0Rr z8y90KO6o8J?#PVH7aQ0rOveSFGN^Ew1lgPlu=|+{o|T{=kMpNwL243JX(Vs?8$FVE z!(;UT>kW;@f_xK)hos$&W_3wXPkhUI$t3f{slRPPF=!%2FoGnP%Q^-sQ6_cV+zEV7 z)1sC(C0OP<*+@_-7M>cyF)cM-)hUFLVr3Q-|EMBOPx?8EZPMgCZ2TS5Kc19qTbHk?`od(5LS*H0bT6yAd$05vvSqVRPQ1^L{FED;v}HHOD)a2~2~uW7UeAT4}|+LSOX$j{Dun}j(KKWF2_}HN{Y8sE0v4cvZ(%v$JkJiF*f>`vqm$% zeFky$m28%cueV8X5k_5diA&&ay*ws$j7epf>_`0f9!h?t7^3jsAvSO%f_N_Dn4 z#nIIV%9ijs($$O$)dQ*(Ym4-3eFHV`HzpTUVxZf;tP-JEXW>Y+5A?5mpuOvXGLT>E zH`P7<3gjmlWM+)kBlNPtJ|qIDC8usEBrZZ81Eym0`J&ZQd;~*!e3cXdvT%B>1V|IX zAKsWQv%XysKk1|3v~rvAg#y;VX0hT7FI3!R1G7LcW!`2Wu~?jIj>BPz zLz2l!_M%#VA`Sc8PHOUW`>g7>Io-%))Qejy;?^fi%0!l6Zn#XAXoa`IO;XYL(+8qk zwI=7u^Ni+N)bbbLWUYTywW23Pd(ly&Rmu6A4bJ~#+vpLC-xZgXvIXR`o*64{550I^ z-j-r(u}u3k-B@6q(S%AKZS;ebL~Q9e!IJuNs$iK-?{TUcgbp#479wz4Y62(-7e@36 z#{NIISC5fC`4-Vg`)x_A0R4Pfvc)W{XE)Clkwj2kg&3@htGEJ5yh-^MfifNNTwynb zJd_Xn2t=*M`_njyiYD0`WpMtxZX$Aa#6fP)-aPX(MbGZdHQ(GE)-ZdAzcLMTx~1;1 zR}dS3Xs;NWVKr@j(z+yqYMW2j%-E6_e0fHWQPiMQVuYt*MH0;i;f`+PdX_&DkJCUU zeY6D`&d!4RfY(6r(yU+kA9UpuFjCb0xCYqF&Yv(*Sc6m!PMn#%QonbWnI(dLjyVmgM`S6xX&3<^cYsCS%!6`C(8t5 z*8=}8vx;P=U%G}3GNryBMTMpd4*tAOlzAgPyE~s5LFcqu;E{ZoY@zum(fU?+{DKdTTX zu@SO8+X0597h00TN=KenLBttnIeH>2Ynr!b_`EDU_eo$Z09(`wd|p}!qC_4ao#i-m z;xY$ZUZT-{gF-8Av_pBqptejTad`-BB;%oGP?>l3X&`>?zB6Z<)%G3C=Sv8! ztFc;nhb-BgPh)9oxLt4`f5h-Czbg&`aRyP8+_F(hi4?nUtEkv60k}&GvUc+>AqU41 zF7>i_nQqf@pnb0qyz2-J)cRvwEgsM;ZUW~BiSCaNRE`+Be0|d*+^09l&&JaDdYNvS zQOeu9rr}kV%icA`)$Bn`__Fv-2*Joyj3)N07FJ})J63eN`p?Ma*v&Q|G`Lz5@0NGa#On+oQ||%Y0wEt{N&< z5Yz4^DzXD00rz>lMqe*Iik9fFOW1a3^0sF~LMq1XW(cA7CWYD>g$DLeY~Tm|Lyn<9 z7?Zt}g(QCX9hI_Cn@x>L8y&(xw20;Iki8Sd_d8;exf1V0$UAq(byY{J>;@x~qT zJc+fAOPJaq8hsu}KeRy8-yXW8^WPt+EDzK-Lez5;bb9X7vaY?`owY1BNzq%Mmb57a z*L-dI2#JI-sT^W78S{X(LPAm-6^^tHiDuu!XKK8p4-jFU`#pbH6067%3EI;WFuqu? z-uo_^A=a?v5J&7;4=kAS&sHtFE^Is0aD;xqi?--!%8cZ^k%b+2O@8{?=OudUJykGu zv0?D;f3YsSLV{zrC$h42(slmoDK8|i%TR^V@2*)F;_yBo5a$Nj`nvLo5ySvSA7YHG zAjWzO6a_@~a6sf1=eP!pqjj{AAT2rDkZV)88l-@&dnmr;=0Ux<)opg7F+;X^;^nfP zm?&XVfSWxb?kXpIbka;5AlIFU%=0ulZe@|lpiX2|R)ty7;rZU6 zn4ER@o=tM|$uWzw_@AtF)TW2zwO? zvIZjkm;@N3BmC?dtz8fR_?oI2tqlAc?wp9s$1!lWGALU}eYKi}E^PbDRt(x6BCl!7-d0&Aq#&41Unu+oDa0|=pQ#M-inzELdOD?tFBXLQk%<|VG z@@o=#O(7eZ*=q=9Ym{p(BCEA%Q=yagUV1ZBi^&)PjqIxMzC&gVjNq z8rfW?Qj<5~aj$ujW%zG>DT+h+dX?%=J zu2H;p3Oj!@nZiQ8h9mKKQ*D8c<||}rYkzJ=?gFNr{G_o;vJ0ee%vC6L#vUZE_=4_a zr%@Ag)sf7GEzyyx+n&qBG-j;hUdK*Wvmsg;MsMMAT`l3F<-~Inj0qQv36^XAOI}3JGfXbKNM@@w^xx^pCnuMMfZy2@- zMLigJXMv_D3Q@#pCr6BaB+&-Pv@IZ_08fK>b!SUQ`ps&_#}ZRiv!`Nz zjPN65iz)R*Nv$WP3e;C*ua;oDR%G$yQ99{6Yt|q_04qY=uT#Zi^+*Y0)@4HyWb-NJ z2W7BEs-u}%bH5MbFGU7|l65+Xd^)kfg=p_~4TMisK%`c@vt!z%fCWt(T8Uu-V72^G zPyC0($KXYC$yrAMO`>+5GZLK^cK-dDTh;^vCl`Vov}JC-eWoy3RgUgXPkdbVB_%1O zhY2U`-17llDzFr}C(xmRj)k*O?;{kYY6en&E0O9%$E8RyQ#F22V$@ucq1|5R|2uJt z-IxZy@1xN}ti?&AB@7Rp*FRH$*Vb>)2(@iKrN~+wPWXC1VB$v&&Oe_A%HZ%Q<8M#z z`8*KA(0W?;DU%VZFDLO_XW8Ieg^j*IM_InlQ^@q|AnNl4Kj`vWxrBVcHDIkv%>xPz z?xI^dqQX)*QwuSTOz6ZfL;)^Ccz%CwzdW;W8s?e!Q(v&csB-4+u_>8>MpQREg*{=vn`Bn&V~W!tK14+$OOEB!M@j*X23 zky9^_3>3)YwRF9-;GZbum-2;DV-+6iZix|n3S1l$DRa1Vy6k>1bjxjyl)1qnIoza@ ziL&A7uze#@bV<=={W&+h7WZt4TY#Fozi-X0)JtFke!|6Sy{3A`UW$t*24w|{-}ep5 z(4B`u-O>Hr#p#P9dl{40ty$N#C;EA}hvbR2*CA}|ie$eIe9GPIQ)Z=4c?sDe zXO1LdhIrrEV&q7CHAyC9lfj@TbIz>>cBDrW+Echcw@cE5ud!+G+0m|tWzG}V9HHdz_qq-Au5(GeA&T;dU#=Za3Edq=>t18b zSHW2Hj8wiq^Tsu6l8vRG%I36H&6|LN?wa0y?w%YD0RG8hu z7pc~k3v`$;Z9%3z_f?62(Twhjiuohc_XTYr8OTt(y>V&}!suoR%a9(OnO9^aSOcKl z47_g{Z_>Mc1NCLDb10katj+GQL|MtPhDwi+ROZ@FiDbW$QX4c!Tv{fw@wzA7lxYNY zx7aYvM$kTK1RWre{3*9n&E{>qCq8Vu_v}xeHQ}o4csN529NKzvNWoF@+IE4k5Nt>o zf!s^2t47Wq_L96Zz8xK&ur?FKcghXSI8lhrQ2XD|gwjo<6Hc*Jd=RXW9e`maZnMRa zG<4TjtY9&%7(5iRU{do~9|~>{N(jI8y{#to$vP1ntf&8?w!n zcepqaeFLMs^T39~c4KSXvdLHQBA&Qrt+!$vAaeSHoB>FrzC%(X9p@#1&OhjhNf+hL zbbgQez=lFmqSzxt0hkZlzN5Ar=tE2AQL1nl5`lfOhwY0!Qn%ATq*W<9iS+8Hxg+V> z7eL)fs@DdGdnTE+^@}W^3C7Su9Uc-sOi9%74`F^lVSfI$^v#kUV!u~oPgK8-aW~B< zN0{qqN4)FcIA=(aUJ)OV;E8q}`c(+6(7thNIhgjc2SL_AqfRk&w4Nm zu$0@O{m428;kur*z;5zKH0aSqtk<_O9MP-a?C##`AxseGi039JpL31#WQ`WaYBFHf z&Kq2f`cQ^zdIq7hN1C8TdqW}0q%0caeQO_-NCtw-<^4EN+|^UJCm{|Oy$_1oSCK4M z^Rx2a<<;^`b&>BNsm{&Siw)co^Vd5PK_0^Vdz~!W!dN5Slz1V^verH)VK*PkHbL9w z+AVhK$(ClW16gK4JEGW&Mj-ggFqM&$@H`2=8|o7cyNcafL-uZoP!~g%0zLu#$yxkm zw?hDo96cXci0vLA=&;9SlU?#)inuARqC*pWtj0XAP+eNZ1&f7ij^=B#93*OeuX1)= z)@WllxVHExDwLf*;a{+%R*pFil`!As&UC znC)3L3d6&0BXCX2c^Mny_}GNR!K+y3miI13MvMFsRix`Y!`>2!}rTijJAD`t2tXFB1r&E~xj3itQ zO)_K!<4_C4WE!hWMRDdOl77QOQP{ROzNwJYz*JnRksEDB%(X|5hTOmrmfs;*e&WZB z>i)pqOPr*W!Vr`BNn!-c++;OSUKL4_d+cVR7ijABiUy9W;9pssGu0<3Wk#$3C3%8a zoxjvY&orBOpl~#o_Cga~XT`}p_C;>vvSn%#(P|_)(DiO&RW?oThY}T?N?K$V>*MAj zGU@6#h^R?_{)-=SOPz>JQ^S@i@fU!11b}y5s$@wzvM@g+pQQTt5_p_^NFkaX2!Oxan@9kp&}PI8 zM*#T?Zu{m8Z+m8kr!uWE-)f)hiq97-IBT;}%oPibQnfN!;(zkBRe0jZ_NyU=2W{KG zJu$^0#YSvzP}}D8AyG6|Tkv}+e3{$liEncky0_rdP=$!AN^2T{Vyw7N98lCV(l)!eN#W7btynwc3{7Qg;*&3v^lIWxtP6(X zfJUmh;$AbvXlM=UX+8fEMiK5q&n7_cBvKhiMzM`~S-`KSA544R^iCL+X-N*#{y>2K zyh6Xn)2+vSGWg7%rEk^Ui?)}$pA2i)G4VgTFTI@Hz3mV2pD|WiChW~A(*^Dng#we9 zgQHw9aqIz?iutahw(9)2?2EX47#2gyE=?~S`zzfwoT4OcUOx&ul-)ZslvN?-b^?s1 z+bcCW$A7cr`-+DglJZE=Cpm%iIsn3tZcO=g3g&Q#^Ehyu8nx`X`wP`-X2K5G$$?L$ zW8;UF5=X2&+=z!$U^{JwV+KK3o;V!`&WOiwgPjD=qP*N;+LEOgh`fAdR?ePjc7eeR zWypHOdj2!jMmHnGRjjShEtA>H)w~TecgAM!1cEk&BwRYsLpls{f#ErfAADVAnFKg= zZ_!c|N}?c_75=DDXfbux1221~ZNEZJgUFe-9_WduDvZdNjhvWkg;gL5c|7$z{w(8% zc^u98NIsV8$EIMLt|9ZS`B6s z&cA~3OG|_C5n{Zcsg?>TJs~n}6grI~{Iu+YbGR?KN~s>b9iuZvt-{4Rx|y`~$H~^$ zAf7x-NfyE4syDM-xTe^sL;2qQVN8KFz(EDmab?OLn49tcd3T zq@CM^4GAiiyf44Bt6JM$D=d^6h%PVJiij!S{^6PrdgeO7B}zSx{76Q-V~->3rD^Lu zHe1)?U)lxpT>)-T%WJ?N_ z78)+O|Bya@wx)ZBLN-#)716V6k59My9 z=U|2zCAD=ZB$P?NRIWpPNMYVWc6D!Pu32|%QFrTrxLa%EJoiu-xXaVuSEH3yw5f+f<19+=$;%0Iyb1%mJGL-*w(8sQCk*Uf ziLdKHYGx+&wPf2*$p)qd(!$^#GksuHwGoCu7?5(aW%jA~bw6MqAHA@VzNEk;kBb~Y z{@CeLsh>E|Jh<`0enHWUeQZ~;4;&;dw#+&-G-Dquxl_oW<&elj(UKh!p>WU@rN+X} zYNb)EH0lTDc9j+>7;;(BEm~b};4<(WZ;Mlf1pb_Nkq{fi<4Pxq8{aF$#V-f<7dZr*v=DLhHr={^!wcsR53@UG7W0&qco+oCt}ZOBE{In~0m=-U7;=Mu zl;w2ZwYIKK#TGDZy8W4|xU|^(&QB823=ZdhjN0;&?1T6Lxj;O=;GLU6Q#9d!10dFbiuPJC^lLEl@zpfp{_(_JPs0 z-waSfTm`;3S@^~<#8nMVmZr-#6x>k{X&K_yFH@r}k)#{Jv5Q?622fpEEZF6Od&f~a zK!*6vuktCoN`gs?>Z&LI&2@7PgEq1Cbx*DSo%i?Lzjc|1vvdLEo^?ckr`ii70>)H} zN^Pb6A;IYvby{VpBN+waSF+aoRW~9E`6qY(sCgN63imBu?v6&}a#Isz^wERE5=zh` zK1&%L7&gxa^!w1kkjv)Kk9=^BA;0bkmTY1n0bxsoD{;d>YRK zC4dNe`0V&tS;VnT!zLj_1kPu9bqFKpe3rOjw>ADS8T?Rczm;GO2_8B6alnm!8Vt_E zcDGkCDO-0lpCd_#ZXTAUje8Gbn^x>>^1zCO5;J_UkRxX;5AO>)Mw9*VTD~$5Gj*X@ zxCYDJ9}fZZ89So%?^NlS&PC5xbxrf8SM!({qo!vo-+}z_rk{uN4Iq5I{N5X;Q7C@U z#UXaI6d!O8{;Sj4vV-^i2Spzw2Fzfib+HIDOyA$NN@gCJayZcnX|*|AbW~_$=qMfd zL@2cg$7X7k)ekvIi#A3xr&qv7(WRhqk>@xNit zDm){+o&eu$@mc~4gZCk?Q5{rHnx)W$$ibvD05{Ll4C|JYXFfHit`{{!r?wM zn{af&SwOhw%f^}$F0MUAPgvw%2|%@^Su8|JN^C~l{o16YjD@L5Oy_>jh}TNM!8~6( z9~Xw{G)%Op^ML5gP5x%?Lm&4bZYDhBRnbu$l&dPfF0nUcgjqqeJgVu?Tj%#jC=26% zLM@tsD?NSTe65n<)pC<0ZTMDD&wCvYZ!ijUSYfnqO>mST&H|cafV4?yvRH4_s;jYw zf;4Fj^O$xVA%X7UI`JY_D2h*mCbT@(7p&jSLIYI%MKA z7Y%RCxU)dHOINBEgF;+_@IE_zaGg9^3pKE$Br71Cfbi1pHz}4*^8|=yb`_oaD;tMB zi-i2=apS_E)+aX%1s75`mEm?t@66PRgC23ORYa z;6vU_G;V*G+i2f1Yr$rcHj>L;r<*s~AQm>nTfil!yhU+|x!j}zYy0ePfn)D4LM+P? z&Bb;g70GFnQ330IED8-!bm2V`k|F+j=KHCe=_wp?hqrR?jaIwz|BO5DcS^{12(#Ie z{HVLOeYjFD%~y)ENmjR4#fL+^2q}EpnP+<{zH0zFsDZIG@=qnuRzsT%rmdGZzD@C) zZ&`I7CSx6KT+y*TP1tlpU!hjS;Z6QU8<0kSlVTHFcrO#(mVtZX8X2D;fv=OJwHp$G z;_WF?EqnqVS~#j(7%AtMf+3+9Ylqno$b=vu6Dg}Rt$-uKWN(lVY>v-_lVLV*pPi*7 zhwSQ+BS*xkH@Y*h9o~&|z_J!gpD)|$jHMGaWpnzBY>lEeYUTxGjW-g(5LTQx(sgtv zz!TS?$%uJ@!T)scTTU=tCTY3=n;q|HHC^IHG8yT^vj`3Uvu;?&vyG<-)71o6N>doaB>*|!-kB6G?4!jUI5k=v~ zG(Y>J!xkuHDQ!D8@tux5Lbcmb-gXm`IW3A;>%MiGQr)~A47$-b7}R|H$G>xf#^z}N zP|=1FUpEp{WE0SoG!l5VF0TJ)HTm^kXdmj9rRDkpA9yZHzDJg{r$>aw+A>+3gTk6D z)wtdf@dvJGa&?^1%@((~>$@cPw9E5x&;t)1#sZO0M!{7G++n4hLL&KMLU+xJ>s5nY z%$W``piCjdUvdcXGd&tnC+fs;Tsjzu%)6C5>2%I@jt4P`K^#3Pk1|Haq>ODrN6gxt zvl;U5dD0?U^Ox^&W^K}D?MV$tha{xfS)Cb@)0#4=d0v-}tgecU$N&##e}}DDTJ8*{ z9mV9FEFAxC7|P+L*o>5Hs1#>mZ)Xde&Tr0&BT3O2UK4Z#{#=Z|8^qZCHi##jBE&@} z3&ECyIEr6~>-qVjcpbefHkOwTEKz=WUEB`^%lT4;s*6)jqWbSVe}j0}X+r$|R7vl# z`D%3@dDt^>xvp8t&yI6~`y|rrvHB`D-lBCWT6->t-K|SyMj7TTHVKsGO2t}sdO>_H zrpnm9d|{zF71SxA(*1!q@kkS#hsO|;TY*~_R6A5v+3M4K7N!d&rb8K2+90kS*&v>O zJ0X5@h7kL&++D3VcC0pv2Wqp$nz+xIvYl}tL8u>YlooNXK(W4AVx_6GFSeYd&)>zB zX5l>VJh&5dE{m&f9n%+8e&6I6mw$0w`OJ`PAh&xvdWROi z5m#eeR>*P$J;NltBENVI7@=Gim9t{-%VZ88o|?qAi8A8XSz?1P$5q*4m%sWpF-^cT z#?F$F;cQ8~Ca&xV5sI+*b6m+$rVtgq;C7-)EQQ!RQ{dRl^on@) z*)ae!!$h<;q23hew$BW;4U=Zvt$4znwrhj<{w;;L1qq%5x!h5NJ1UKlVR0c| z?7vbyi_7`Ro{#^iWK{^UjLA(>WKHjynZ}Al1l1@xL3}?MD4w@5ptdU!)*36G+WBNf zX?{OGQPIrU<+$a9=lS&EL%3H2tozkOHMblr=4VON)w9zp>0@Fx8Kj|IrOK=VQ#yD|jGf+u>#V`ej1n`;YCCbaZT8ra z8S$1xRfmUys^g>E8wdDGw(K!+XK-UAzuPVI<_0Py*lQWx4c~Pg~s%7#{X!( z&t&#r8K}MQGMtfNzbM107w5|ucrAZutTPkgmo})op=&^C!UpBAjLSndh$|(CQ5!^E z9_Y_l3Pt6V(Hn(9M zTGkq+TG`V40^1LmRH*g?S*>|n5LINk4k2Jv%2z5_kIjlRlw=y7#jRj-!!?PNfgmj3 zP^E)$m00}LVoUL%SFxpNH|1O7N@Yf1g339T!#zyd1@XPuDx;`^=roS>tgAXSf)BZh zX3ATy+8}=U10kOEbYdyQ#O81l*7QOSA;$&r3-vOCBYS6ybn*4f@|;H(Uzf$*o56+Q`m`$D=&Kn3C6h?JZX38w=uI&*qjLC~yj_9k-Z!*wPfNMYLFW%(Tut zr9f*I8GbaA134m1xDk%y4y#SeSuv9gH`-*j=D58=;)ZxLj&<6Lh;y?|xuMWNX!oyu z?`&4?zeRlhUu6^Nw}2fUC2`N^NS5mXc-o@7LxPXtE6BZTN=yDOY2s^e#ug?K4h$@3 z#Xlv3!xKswNGsx$8q1BJ9%{Gk z@MirXlRtTISHznXoDPA=6cyUnO-Oy4fmyqk+r>)v#@ft$;R_VkrY*6EzbU_bObS9u z1(w;*m&+Ezi*hzMM@%+(wk-Ht3m=m*V6_+GB@(QIoy)eFAtg6>{Sgv_cKZ%_ znw!OGFN~OE85hcCl6(Xq3}96PXg;x4<&3#0z8ssfzm(-z9AT_hL`ELg!7um>hRe(s zG#Q^IU&NpQenkxXTSjFz6mp(8^~HKp0$1Jz?ujeZJ7Sbcwmbb3ELIP$PV0i00WXpz zo439o3Gns!a!i2Rsgo@7Q>aJ;xXgIL1i03GK?HcSd=Z0!B*34H%9;T8;UgpVgT&k< z3VLFnd`DBoPF!B#V%f|HE>+0AMJoFdX^snacj}*h;2CF3@LF0xt&+0DtQPRE8aGkp7ei5N^BHHr4P)M?6)LB6fAfGrskX8UEbHOz9ork@zF;&h)JN4o~4DDXlBsJA50 zhYNhfr8l3jk(dfdV)jXAr3jGI7%_4%a*$7v8JjK5%@q-EEy#QtGV$oh^ZiJ1=aV>S zky41iXT{XT=;&i5_DV=GBu(7w$SzB!g6q(bjRk~B4A)Ay<_@WO1+AwerswWcWn(>Ui%*#NoTfDLLZvmxdR95j z{!8C7`GrqY|C?1IWINr_KTgH=$HP|E1O1ZCEK}xaO;$xdO) z11bJdf@wutb0-GQ`C1icze@TTiL6^mY3wvAw5}!1K$LrjEN5U8p?YBL`f^)a-m)e5 zMc>vfY0{_?{&1c0YB`?mx1r?g76~AP0}G*&{AinGeyqn2ej&_$V5tC?UB+NTLD^6c zi8Lw_i2T?RLdvwbiKscf55=Fe)8+E?jQG}TxUWsH;RRNLh&^HAYI)850LO-RD0YW~00MaY%iu6LMg9NM)EB(iXPsuEH_STfrZL$eM6GwkA24gvdsi<%p1 z?AVhUv7>o1uCPJwNhZ%TEe{O`9dZZ@Mkx}Cu}%IwwNV8*F0XAIofnM?eA123|jI^BX5f7I=DDTxd`y$IUNDoZD(v9 zI_d!n+;ZO|A3M^hY*}aLc4gb z!~#R^U`hEPX#7U?-C(PT`PIoBF>Hi#3Bj6@_?c|0r%f&G<)*g1nTc;S)iaN!QcmWrdSLv; z6XuMh@Q7J??Zr7z=aCX_bA(-0vsxA}@NtRMX%m(Uro{QG_;l-9bcUkdkV$JO$R(Vn zv-`!ldhfd})*vzWc}vwL-dM-G^;SeSy6A*1hH;(Jx zf{1&{@rHP7Om0axszwRgJxwDHSU0^|f-vHaZph(@%}OZe`c>+C2UzF`;^*CdaP)rx zd=&ENJ2@dbe7N?Rayxgp*E&*vfh-WyrwGEbp|D?pZ@;>x$gI8y*IBi!VN9eiXBuv{|bXcV(Y zAg)Y>M=Agz{LH}l<7J`t2TmCY?+9brD=Wc7`!p z;vNxaJYd1>3F)?CoaX?`Ftomo$pj-0&3+@@W^v96T_H`!u6VPh`cl48SU^mwnODvZ z=SmX<;l1qi5dSof9N2o38u4_-LY=YF6^7#d>Ea} zGZ~YbQuaZ5IN*rS%Be~4X_>b6{$lXsD;PdIGr`$wNl_-#FF1VbYZ6scW;>*SC1c95 zKgE%b%G(lX>RmiW&8dwla0^z%(_}%|r}PGw$ne%|8CiXs{6zBEpM>{ojcz(>fRq-lCaV{58ds#Q6c2j8qF*` zNo&~}g?c`mZiDjj5U8*%A7HX2Q(>|eR9H>cf~hPIBLy?Y9&S2Hrct<_QyJ$k@p-BhY!1oGX~k1(T)vGxYCf^*3sx9# z#4@5Fyl*LsGwyUhC&`==f6bU-CNjO^rgjIdBP1TIBy7=#pzNUK1o2BvmQI&`)x3#A zn_PD?Es3=+`H&upR1a!x5_IFU@h!%BBexI6g3jSFw@=nhOksz^PW!OxRxb~3ZQ99% z%yx*8MBm#yr#CTC0z6u=-Fr2y0_8T8RJnD4iZ%ae8j|Ls#7@$LXMBXlEvY8#pmmE7 zDrQ2L$x`D-xN$mt$QP`cxKpF0pnyJ~J|u65gk&Md@tvw8h`AdAbAgh?q+FHfM4$ap zJ^i|sgb}e7n&4Wz$uoN&!ObNVZ;>D|Vy0sFxbA?KSvo=~Rd}2zqL>r}5rX%3`xsNA zg{it=c_TYy`R1l7ifi*;9y7lxYhb?F!E>E7z|fxS$pBrL6Z*mGwPG+_vjg!+QX6wq*d#NMM-W5I5c zq!U)2SoacDzuOb*63A&&EU49eC$#dFaA#sjm9(=#%oBnmunrU&;;c`oA%j%1hm5=h zuafBC$}Vv!lf3{rjhPQonQ_BT*J>1pq7aPbsg#iu@73spX0E2#TA<{Rj3x!*FXD_( zs^JVFCubn+>bN=BCB3kJLd{k-I~_hRDf~JTLFr;9-mGcWskG`I9~woe@0eIxwEdPb zYjIFvQ<8@{1ILP@s;;Y*6Xy)EVjFdJ z$Qu;cz*uM(p!iYKUiqRmF-+tfsCmyJ3r9%q{H)^YsMA|JZA1Kxg4)zLYX>p~`=#LG z4rsykdEG`!W=kqg%Dkk|)GiqLoMN*kY}siu;{RyCAtf5{Z#%%9ZfI8jOw(q3hU&Gh z#?kwR`f=Fs{Li;w!?nds)D$jFnYZ`&G||;JF=pN9YFd(J#*$07@h5^SWnGrq`q^Kg zVd??_eb+@C3BkrhgRE-zhh4Xe!^kLYRKdId7rX6;h9|C+pkgB58F@$+pDIH;iFSO6 z5ula8h-_=M2ahw}7i7r}LOED}RIwa5W4Kfbp@|zA7#g)=Imk;x>_SdX%{yRHWJjL-bvc4E8p*b$;!GK4TvXp%#Iiz_?8wwx6@*B)FjQCkK{wdUbK@#H zYQ#ut3+2H#tAPj;B4f{@IB^(hnUj2!lU9aAujl6UwCf0@Z)wT3vfn6(Er^{$GxqR2 z@Eei=B8Ml1*2EK310AdP$iWzn4jg`h8-skAkjw3m9&%Msxlf&R2<}t%kh+waV_0J3 zUnR}7Q`R9=0OcF4CD7+6pe>!b4qGw=8 z2*h*0)2i@Tu93%0ZpeL?#abFj5!7DMpOeziT2Cs zT}dxUf|kAWYkF0DEI}Hdi>7%bc+%!r8U9UVq6O?EVOLT(t-DnnkpdBu0-WU%bP z=8#~$LMR~0dNth9CV$nWz!bhp>ZOfe+qywU&O%;b|r z;Vyhd7PaSp=v=`}CODmte4y9v_ecTB*{Q z!*3zpQ={+n=W(Tz#1Z_9gQWAdqooRO+w>aZDb_pk3Gos;UW8X&%F~I{ON|8>;j> z^)Nn)Vu$hIG@9pEH9ArX1?qSL$l^RUrZ&WNcq%L{^9n2;|5`oPmuF~A7H^)5H|81f zZ^QGs-h?@C%*4M2D;o{WRv#hp*Ko^g^pAI@&x zaUtG|GR_h6V(FC7JF0u{Q|Wbq?z<6RrQfUNMt%k^DBqSLw%tOA3LQ!yF2%2Ny^&Gz zcKwQ~e?Yz+6MuOc4cmNWx!|qjJ+5&cUg_Ug<9BuDNWsJZ(3*HUo_8ELuvfegKlbMi z$hU9f2VBjtToj+=-}{%#Gq_RaJ9zN+=MLs8xTfdy)2WL5eS7}By;jSwiU;uTeapaq zu_#|Xm|w{|Y{X&nyLxvGznd&E0rIs~@p!Y4@%{z;e#deJSDlD^-;yxcxsb2r3yoq8 zr>~0#^Q*~xBQFl~PlX4+xt8B#E6Zi1HZ-a=aRa}gdapAJ(~Dc)3SHg4xL7TC3njWu z=Q?^J5Ann1OYtLmyc{&F);!vcDW=ZA3w=j!p}Gk0uQp#%p^NK{*{xd_aX$RTG$F=E zw{7Cv2DgdanMUo_MSnv@&6Z2Ic3zxzmh<8*?u&EoiV_}98#kx?efVXN%5VXmOO>VN zhIPxj7{lwiY7NKx&)OgM;KNL5wp5dRoL{s*=kdAukAhb=w9@V1nsHeQlA^22m+;S;?u~|LP5!vF86Y9x7 zMq8ZyU?Jq$%Hk6G*+6qM%Z(y2l*r?abG*AeI9uH2Awtk0Jp1xX;xF-g*K&oY2t7X> z&tM{4Ju@$VK@QaLi$$$?tooH17f)3`QSt`$6GdN&pEkXjestvW#k0oU4O_QzFMW(R zZH)Lz-QEVGp0>jrtP}uV3xE+=27@7|R99F7?{Dl3;hlC9mriOPqW!*IqwTVF_p}BX z#i?U8ODe}!!tBc#jJy6axUBofG&^YKCozPCQvX?6^f+aJS^l67k5{!wV zJ4ZS}ZX@x>9SdaaFX>L&liK2@9wPDV`GDMT3}Bx4_Em>$C2m_XKBNu74?T>qooO+g1s-<+Dw! zJjR@Ht;_xxWwm=BVRzb~C5Zyts3m9&-TNNf#LDar?4O_D(j%Qo35>6Pl1aMMzQAo9_*Hd&pib%e%b`zR&Jn(GHq{IT2;WYUy1EW}Lu(!B8=#_E#d)mM|7hk57o!V#pDCTdDxWCUvu@JwAM3c7UD zknt&DY)qDcT4GTY5<}eyDDm$Yw`Du*=?b=##&V!-+81x_X`4;b{77fK;C22AywM^c zolZL;`)^={q;G|Yx#the&B}7%;H2#gq^?jya^987Buvipy(sBqu%q$07Yxiz?Z=+L z!~EbELO81gD2|XCw$i|{IAI(M6@3c~fx$3u-P-k9X`cm$NN&U4y7P*pTRpOQ I!%T1x*kgISIUNfY#7jTR>OCWpZ31rK-v4(9doFQLW# zUWcelusR=;v67PQFtGC4*Xe<}<3TV?Z-V6pPNnAUI;_xR2{N$q23DTb)B$(1{X)_I z7NLcKmDeLHZ{{B@ZO}AZaG(c5%UJ>6_EVPLKo4-X+h9$8EAgkjgTA@sb-yIBIJCeX zcm*ebSMay5?}O}$c& zNjuML2whtP-y*JCV9!?qlcpOJ48NQ9-1lrvB_2cdW$%X&lK07QeFi;|R5825USb;>qt#e|4pGvptUN_1p_+ z-81jlCoH>%x_$-)JyY~;_OBo8nsP4+Aqhe zqfN|(a7DO8KS$NI)H+RYQ{f?Prgkqg9VSgrWO4`AKw`!bN|P%6`OYl|Yn1Vbh}(Wd z@u@-ezG5mV!n)_G6F?Kk59gXGk_4zoIamjO*?~p3DnF+%zAju+)pojxc>hPu*r8it z4H3D=$JUA}#`22mdAi z(kFv&5NV*id!)QK@(z%J3jbelvQ9q;p}~~yx${LQaUiPwSD)z zp#*437P$6v>H@Rj-FdocuO=S_4TJUNCDi+#|6Ewi z*X!Z~|Ea&zy^2-blPBm;<^gnnCEZb(nap`(9hck7~mrlMxMyKr-1le;#n^hw{> z>0Enx(=CY>);)b6#w&A+iC?sGHX**Oe&MRT@2H=+D(`3NC$7r-4Sw3B3}%vj ze*7d|oaZCy-aEx#^;LO~0AEKf6m<;n695>2Wk6;lZMf4$pdK=~EYZO`?IvE1CL~O( zN|@QsouTdK*mgg7Aj9<|{d`s44O^W1*nW%`_6-W+Hd|#XVQR~};s78`ySWv9WFoE6WC_RZQ^A+%|UKm z_BNBw$h9i&jz_DqWCH&Lz!i~O6>S&n{V#Rt5r`srfU!*FP_`oP14?O-t&2XMy~m{U z`rzIT%Ex7zD7|JyiW#T`sHv8BoSZ$JtNe3PgsR4|E)7sG1 z!Pb4Nq^)oALejc@AoqG?BsMZ41YP3_iT)!f{2 ztvefx`1@L|+Pfk%yo3ufyrO2#tbWDv%zD^vOG)jd1V+l_I{?qrlcL2HfNDr&IgV1E zY!h#?Kc>{3INlLwG)~w<4Q`LFwGiYfQCOz+goc$JO4 zy%+(O9&TQ?!d3lAPN{!`AaQ?UNv7lGqkf>LKao6sNO|lrgF_7(^^18yEwtFnZ%HJ| z@$3ufEKx~a+q)bar-?BO8&4b@YJlvHR=ebxih)E;K-5eA3c6yqf155x9hy5GYh@Hj z?&v;{Wk_qv@JnqCYcM~w_zGA_3L$GxRWk@7#bi9h@`_^rvE@9A)t zookp5%#fr`2P}zt2)3U;tvO9>I@(KNc28TC4B_9Zute(XPme+>oqpShrvo$8#dN@` zA^OlWqo~n}igq7cl?-9ts<0fKH{gEym`iDOAdbnv{#QB#@fQbRrI<15ZQ|`fs)fn2 z1_)s;-3hnIC!~x`W;C8RSq|vqx~%{m#QCuj!P?m*Wem$$j}H@oxOqW$5`=c+Mf4qg1W%XWUi0 z^RU*b8o(WK-=+HwS&w4VNt84>cE1hc38x705WJz8I5O-t1QypR&8;|J#8JKii;AMK zw9I*dc*KeUKh~FL8mmi1yrCq_{a5Z-Z4?jGW|6fCwI$B=hQ*)p?~Vfp_KI7fsr|VF zGe>}{xDP*UuhsIa;(`2o-!k9zC0|{}uX2qV_BIJhzucdjEO8g}wN>$0vx4#d27bRC zRz|J3SVY>_bQQUwzml+u4RK3kY3|RdhH`kZ885ci3JV7LcHq_Ia(OAYTAryc*2T~8 ze6E+-GBkpI2!Xxlpw~Ok-yq&~nh=}u{_$Vllzny|y(tY{DLKQ&i&!+%qgSd8NgLwY!+>Ts@?|v?+>PW?W zCvjfIEA{nB_$gmP6>>)=(9;*I-^@<9(uY4Vsoso-fVbX_Cxf@Jt={1+Bo2#}vPbE@ z0Q(D`zvv#X1x8FA{V>X#2~8gI-ox>-K+IQ$U5%`vLpf}i=@EAd;8(O)6; zmVaN7U%Up>>CI;#`d=&NuUP^!EH9S=jsP{pnds97aoVm8;`^wFBu;}Zr})WcODyRI zBP<7Q0k70(BAOmB<8^qDC19Kzg9fQ%4%*AqV;~T4y1z9{pTzUI-WG8`;A#w)c)tBi z#JxR+!{Yjj@nSCDP$Mjg>M@VGD?Wt>lTv6#d>MZ?h@T$VAa24qJpfN6)`%yO0~quT z87=`&VlB+*-lOqk@Z?j}W6(X=GX_t-0Z%4R{tKRsPEx0Khxv|P|B+v_Y@^4|pf}CO znS|^H@$y3(#M$7L``}3p*|qq|a!4SACOa$Oyz?*QB*V5)y%sM~Khf6P@H1PPE#)hf zBJ%3Lk4KW<2YDLdL5P1khuVAVRU5=Fe;~v?@g~TrCxNJ1eswnCZn&)i3bD zuhmbK{ImLrqIbN%kv0G1^UbXJXKxB+&A)Nj&zk=M{cHf4ndL^2hFkmzZ=$p2KQ;-z@@0$qWopuu!B7|Qv6>a0elgx)HP9?2a&rNq>T?T>}V+`--1^*d-$nlQUKgxhdHp$$0y;V7L7b8 z)_1oL)<=pCJ$$FX_+)*Ht@wi7F4i_xoJqWO>-HI_rIl?$AOSfLPzft7p_0|hMD^TG zB&tMI*}cc7N}@U)H}u!jk{xnnj*}4rA5Gl(va~lvQ~=RtvA&E8fbw5EXmUrtV!1tc ze5BG$0ngMI*TnUJ8VX0q0Ngh5Yx^T>y0G;k6F0)=3M# z3Y>dyZn?t7up$3t94aMLVslQ?z8~bF=vs^L;97MHME*1|IS#}Kl2pbJZVHr4Uy2c6 z`D$QkX|?`D)YWeNi6!an$6n#1J@lV5xp<^2G<8 zEELF69*`EA7_;zQg+VG!>ZvqOpNFm(q|!8IJK)~Fu%4voPu&`KHA;f{`3Z#Tc?R3Q z?W7$di}=XLMu@QzIFSQ!P4l@T>iS{6mIqS23;Sy%?1<}AI)-`*!rp%F5EBSXT!m}& zRwZfC&r+<|eicYP-_hWdnn#yiJ6L-^H)EMAR0{!3^h(8|8^u~4>x;S}S@FJ`fB4vURx(uW!cdFx3^}`pygT>bu13!&p$8B!T6h4)x}zhE@*5 zCM-D`Yx5hQW&~f=p;EWHK6r;kCn0|DTp@mmzh^y9h|l4#{*!+Zq$d7ekH7n9Wm^6D z65`D-xLAlc^%ScjiVP1U6|Q;|Lsdli^Yvo zmBNJ^XO>Hgvm3`oCq^G2E}FlnfQvgX(yN0PKp4y;KjNZ#t#DBTnGW@fu;O^pERq+z z`f9m;(S;YP{|d+*s8;N+7naLyL&S0)-+4mgk7$kgR9~pp8XF<&g#6`yrC0RVdJ$}V zq))+9xDb8k=KKXdwd5GuvJJK+YBi91v6A;_1p#mLs<*1tWC77bw#Gb4%jLzOnzK}> zfYjB$KrJ(lMMeC}2@W*NX@!~o`#yN_VYTFVfx5A<#C;jLH}0r<)YyFNcW+775cXzbn_Yi*Ra5ZfG6x{XjEu|K%3UM-3oKd zx!%aAsCW#u;w@M3n-_nP%R?DU6^|%}e^&B~%SFL;2qRP*1Ix@;mJ2@PX$IWM=hg91 zcJk;t{)zt)z*0Rg__>Z`r2=dUnI`3@NbS#E&MocF?O!g>AO*zRpF5bZ%olkjn8!`O z*q@VWQ+{%jepDG${(Jw~$eQv$TJLr&)1iIBn_JA!*M(P@(=Rl2(di|mXBA3I`9;}J zuTfsg2>So9@N_Y}&_9Qee6a>dH6rK}wc-%2t-k(#paoSZ=s%0-Jd@?UcLSys4Tijg7p<8&&1^v6cE-B~Fk?wojGfy`(lNeWtKbytEyMa`Cfo9m;u|ao9X?1E(4*;i%W^~_E zA*-5Inio=m33S)}yeS@1i;a0if|2gpw=lN-8RkRKiq*JOXuWA2weE@$`@uiSAZ*_XVy`g`hLxvZ*KCL>Z826lP+fjW2PzMhitVKXv4?neG6mAG`C%oZeUJ^ZHn$Dx9h?ilW<^BB7dKcdslWGQMx@ro4Wq&(4tiP zK?3)0Fw9%GrV##8!_haxOx~f2aScZJgdAZv=r|bW6LOeoBDWU=9x%cQ$q4!|Z|Twv zWP7Stf%I8SC}i9X=JW|Ury<-sShgB4!wJa@&N|{?luyV}9*A~q!S?&+I0hwL>f|$YPYnp ziP$wy)AAWyxD@_Gwu?f59h;y-(K@WBJDKD01O56OL+m3pMmVLBizCchZ3v9R<2c;U z7S|KL{%rM=g}#8b#>iC^isRCziMxuvL49v-{MrRKD~d7&pi{GdGJ2h7$uyhruP(9v-@*H-Y9*8FJR?BEdqM$&Ic)3vvq+IK0hty8* zrwh6XZZDh5`1p@`xp7Z;{(V?pA&tF_gOWlus~P_)f}n%b82>wt)5(6Esi^FK9e z`BI|}YGpH<{g=9p?7=;`5o&!FmpJDug<@QzLqXBjZH>*A=H`mEB4F~}zFD+G|22lk zTigem5RD04t|J`K-TdrI%ieC)EtA?A=cXEH{0f?LiW@-S!c-@!eYHNu-LA|1QBDzj*0X0{HR1&d_N@bV+Y zjftlxbj_)0%v{Vz%+eKxZGla4E`HEXtI`n-@6QaIH8P|2vHvV4G7uAl*C+{zpu4^R z+Pc-q$Zx(dDLe1pOqes|9Cm_*3D=WmA}C>s)XbREqbV(N_K@s_T(yKQ1ZXmWyO{+p zL@owt;|%3Gx_{Ld587QKPeyN2h)ihqd>F5tRZOr52{9*OCWW z_~!O_qN~m&7?uvZXpV@)btl;o$1bjy9tAZhMd%1#OqHQ|wMgcPFgjOST%0mYq|D~f zUFAe<%;T0b9Xd8(ipIEHGM&n8_lQHb^IWEXNH$*LDg%>Syh^oJHg0n7n3a-HTZxVi z*LSs$PSBESC{R6Smv_VLY~*Jai|G4oQL09^mZc%a;M-^mQ`-+;tyP1Lj$Rvfn$+yX zsuo5?0?H)F{T0LxBCaM-;SGZ>LnA76;_L&)+Qpu*ourejar1|U> zs!OZ5Zme+4(R^*z%P$}6u{!9XST@|}P_NpsW=vI23Kb&@d9u^X?eK&J*P_%wtGY_M zL#=8u$bhJ+5LJ2jnGuV9*T^K@rDxD?vP)UEkCR30Roa-7VF|81q*!}Fd%0!uaWRoE zCBX+1Jp)|4vv9>=setv61wPjP%AsHTT-ove)QcY7h*|M$HB>Z0H=o5L(+G}d6=NwZkH5N^vICL1Z%ekJQrPN~G3EEN-@4mA@ z*N*WFjoqffI^aH+!T7oT1;%yZzGyprUHGo4xUeU+aknCfyQZq?ecTgiIJB0cyOs{+T1923 zrQ@D}nF%{}qUTI^98;{PvtDVc;pnN_IX82vL6BWZ3Iw}>c=gH}ia~_O75p6r6xT{K zbZ@yN+3d1Iug|E=LMNL~OWOe}^8n9iZ-q>gbg<4Lao~qgPu>kvAq6Qun z>-2%am^=fcT}~bdgARm2$_v*$)DG?u8Uy3Fvg{R(wYwZUm{nb;3B;3dE!MKvY^n_$ zf$p+O;@QQvoCbQVb3GOr-0f==q2W=pBm!m}|E{yv|) zP5e8b*+ivy)C*FlDESQ?4)LE%iepE<>+3hk_y{*pr4diLnFZuksC(xa@;0ZpLH3HR z11E7o#N74|@mjiMXQ;;*}Ku@IsaQ2@QYxP}lNv~J(&w1H3)HX!Hri>+Jb^%qeT zPE_%{O-vINMo&~F6c$fZiz7Wv`5+O9HO7^g$t&YJvUFy_CVvWU-I_LN8F4dieUkHP zqdEfG5|lhg(&>_aQIx*!G$m5`a059N%v|fHRP&5$m%!;E!;PokM+O^oalju*?_lhV zKS+9~%KTBfz?g%QH(h12Yq?Trl&Y1f%3SrlW(wut3@(r;Ho4I)8QhQ_ac7VQ6TIhN zU2FSIEOkbPrNFnX4Q|0p)VrRd6(WwUf9#uC<8`ZDzLlD?OU7tYyKp-S)UMf6gdzsG zYZk)rgbl`YxYMRZIxs`Sm=0L-5+f;LTyjCWj(x~aXT#`S7 z7UQRDgpF?KoWYbu`q#xYZfeNrCw!NDsZrd1Bp^>RK z2AtMDNA!ymCwVP>Y@Bd~!-|7oX?#SdJ()pETtTR`)F{^Y$UIlv@N@T)W#eEx+m6t+ zH=Y9>z(MSRwb65H193%`3IiQ*{72tS9l#F0H_!yf`=|~y!9Wwp)xY+=jP`7ffhM41 zI8KapSSPF2u-6SY!P#t)W=5O}f*Ogu#Jz|`8oB1S&$7)FF?qRL;`( zE#B0jAuoqpbF;|eChAp+#~R*JtyC^L)E#%fXUjfmFR;$F305VWd-!qyL&QdU0rvRr z%P-OPf%CLyVJRtiP0vAR?QOXe=~h%fg`zMLk$)bqDEeEzCMwI%J*Q%sN@gI+v^&>vS!p5|G+&<9`nu#mg;=k9MTTM^ns4 zyCffx97{n2nOc17)|{>9x)45baMR$ImTjaaa9Xy~si^5*wN06P)tzdaX1>}d`Rahl zS1?UGH3=R()R-YbTM;ZlCUbk*Cor8&)zi{+9>T!E;PGWb7h~6wWQVn@hZ#5r|%G2d9I74x%RmF-o$Xw;Ua;YzO3 zo-O_q&Wu>mkEud-bAEQVR;<^v2McYKh4X5AxFNU`YQ4XhEl=-Ri7TBMnl1VjrVHg* zR3^&#V_v=VsA4u2_7)Bn)|Ly6>~!H^Jm#Bci}2E_t0*lhOVv8zlBPq?D{yxDvs zzqGiF_Xmqh9zsR%NAZhM&eb=o5)v=t8PM>l<`*27PgHK7SDGo#mnsUx7XO9%Sggz% z&`Wrf9~O)GYb18mDm}^fg@s~)Kfr~Wz!!d|abOhq38gFG8U+?km@1{-XUn?uVyRpL zi-C(IEPlpkrbMZJgbu&bP%?lrtKM;dgDFS2(ZxuhCotfO!o?7 zMXpYykk2SkW~R&4Gb3J(A);gXS{+}USW5*bJLVVte6y*X$8O><<_-;I+x3Aq0~l=z z04+5AMzu5ey3Z>wH}VbDaq5|T1~Hi^G=7L7)p)Fd^4!zFXaoR#;T^xW>hHFz)LJX(5nK-SMwVf zW3u^=rDM9B{sp9l^9}vh__?&#ASfPug5tL#=y-l_dWuxZ`4!`p8 z(Ju{zj8_UH{l1ey!vVKw~fjf4BmgdFuvHQ{~=+8XAz7V{BJ*`KVI!k=_Q_LrcY%|@Rp)o{NezFRFe z`L3Id_#Cu79`rG)>F{T(<>=44;qX_qTVI|D_;Fl5DIEZ|*<7fWm-01^IJ_I1D5b<9rW0@z6{jw}7)ry>%jq$~5A-`B0r8k&kw5&jY5M-7g#`slMRF=!d zT1hH1{cW>)Npo{?Q5%u|SM@S08ftaS2Rce`vZ9PO8~GZ~YX94Wev9w$0Q2)jX)|iD z6Z&mdz&EpS9l?vNAn^eP+4SfS`saUrR9P(tNd6axjpVy8q27 z%Ko2)R%U`)_RC8Lk&n?CLFX*XKQgRX3p z2QQ1)lHg#2Ab5$v=9dvf7*`bF?@^T8tX@(>Ij>YHHA?wKIK38{Or+qOTQ=NxrczLW z3&>j1aY6%{h&ICvL&K^AwahZv5~-p>70g|C$c&49f-g)5sAv=iDTAPdT*lU3?isgo25m7UPvu^!Fk0k&8pkDVr7s5mq~ ze+D%cs#WP*hf9spHv%Y@D=mtR%ddcC#-PL`-Ar&OKQDjKB?R)9e_4T$7XXkPm_f%H zD2k;{_`0P_$Wg^{GQxxfc1E8T1ayZLSV}HxI2A_R_uB zvDzpel$CcL-djTK^8dH@_04VM$ld%XeyUQb zU|hqb-za7`p=yt&tCQmv{yjf!k@x)t|Jy$2Klma%@;&*|uCgoM>)~>Za_EfEh??k5tTk`zzSu@U^aLDN zP(TBnG4?~*hQ;dg1OQ>F*_(EKsHW@_m$GfreqK%5$s4_a#|15@vf)hBXg$(T)Tp-< zo<}T&L@j$}u{{j1vs9kbQrX+wT1!W?2^lTd2ie(ctdF*{KFICo6sKdXj?iwD+`mZW zVJ#qe3-h&X;nv_!Eiw`;cg*`V{mO5#nW^yM#5ciU_%~@|WE5?n=X}th46ZoQfU?>^ zD|DDZpw;A^j-dqYP8Vcf>Ej4(B{Fo7rYfyLt28Z$y~H^)NeHndSf9(25i&RmY_aP| z13GB4Nd;V=HjoC^1khA4&ACT1G!4j9NIC~F$?$Zbrb5*@4oXC+O~7tOFG!>DkQ&^~or$Td6wUg#fL#hclU(UxPoKzRg!2536E<`k!cq-yrq(&D*?TVC0 zBtv$xKa*Ie>*?t4YiVsx!|!2LCXis0I3;>W3i^y8;&3tf^?u(n0X1_Q?ec~!bDGRC5W zz3=Wowuj-EjCR1qfwMh2u3>1~fk_0#vHfg|i^m1G9~#@fv+G*Wuvmz0kCW%ky#xK& z*1PTTf!1m}lW)DUjC1)RL9ogRCGr8DJ#;xlI=OF+l6H>YVV*RM?I+1L((QnW4Q6{} zlqF7_YHYj6EhyWg;+nm7UE(=I*S39ArY74>AP@zFLx<3DEwr*-aj)AX?YVYsGxGib z+TlZKVe#5_Olvl#cXQjer_5Zt>SL~9Yg=s0R@yoX-F5y9P`N*krPmb118+_`;iii? zt#b8zLuhxqpp2Q8% z;WBI8({(<03%)Y1L_K`#&*#?bM|Kdz>!pYoa0QqDtVK@kT{s%AWJ&#b2^Ty7T`VqU5p+cl~ct<_Wllbp`mbC;B6&bWxCk}-Vu}agxynxdrM_W z>9UNyUt!VS*I1ycBmuq0%(cew4sDHRzs~!uN8pb?uC+zS@qzO%h*)^%7w_<41Q*eP zHn;vx>Dcx-b=^IMMYF`lvlZAIX(>&DZ5@+L4QxH5%z33zrUq`@kW+Es8tk_;-+RNysn)GacOmWOqN_%Nqx{<=YY^Zi=sUC&y(vnBC7ZF6eOLH~o zc$a1z(gv$-dcG`bmo$jAjXN64>kZwscz?5zsxG!pn)6?8;u!!W21JfZy>|_FXPhIb z7RYvq7e%(q1{)-^rtjq0aC45wr_VMp3PQ(k5Q%^Tqi}Fb{vY0o&$r=L&WJh5F4jE zxwQ1LcMWbun--#`eHsAGy;-R62D@nlhy<7!9clzD1P(X^)+#u_Bsi*NrzdHE)EA82+L)vfHQWlXgArs!f!&k(NF~TIk&*1c`m8kxo9*3NHmRr za7cMAJiHoJ2_TITS7AbN-q@C_*-`Rcy6uaCx!q4gO}68>#WdF)(@c|{aa>{=ogSy9 zCcET1)-*Rk`)bGbI%#x)3%T;DHw#UWG7)^7p|={3C#8pA0;^^ z)C7Ymm2v4om|`^5Rw5xtt;Y+PDX{dF=Y-gXL8n35Rfdxy9Ri&OX;-;TigW?!V{?+i zIRUKnIa*Jxbh%bh6|sDiz?ii$76-En?Dw zCTKsWL`=*FuzPjxHJteO8t|gly@r~Qqc1RQ0k`y~0{T^Q^i{L9z?FoPvcsR6;OU-h z)!l=n{i(iWkg_?~#UJ`~0+MxMCIK1n*H43M0B{j>Iv|rES>b1&at%AK#AbUfQURoF$atzalzy^XeHxuWl{rG0d2 zYwz}YGv&};lO*B#iZ?u0ZevYPm+Sq#m#!&y_ollR;Zy#ac5ewawsPlju)|w@;-Tr) z_H(XB|0Lgp>r==}JSFq>j_p(6?w*At5qsW|eF7|Ph)Ga%4($^lXy7G5&pBkr`b>bK z12PFj_nNY-fKCbEbvi>Yz?`m zf=xHtseLtDe%7B-7->fZ;VPPhbStq>DYs=~>?`~#ow>;NS4c7_>d3y_CAXf=(gaNH z2au2;{L}iBV-SX&WXjrY_q;wW+9BA9&~{Jk)1uuZY|mYmk}V4N8x>-RtnIE#EKKkS zOVl>*u);SD>Q;@KrGBqbZQHtSy|(R|wU9R2YP|+cy;{vVs%O0xovO7Ob(P5)GrDy} zPur~1q@z{VsF>3pYt&^QPZe6VMm@`!Q{64wqIQ8gRn(1D@qLwv8ZbJnk0 z+{v!e&1(Qvo|Uc(Z5)r`OsvA?r``fA@|BEgw%92$s=CrqP3Dqic7f-<$XP zqZME3B{D7psJ$)hiW?o0sz8FtZuyOb5M!ZwLMx3G_O@iMOaJkB4I^Qe=gDl zb%B7Y7xk@5S<^tYMirVw{V^~)wn7xDYkv<^w{)6NZR>NOva8b+t&T#SMRz`0Q&_S| zqKsBz#f*SNQl<#)Sd~IRay1IwvwA>ufI20!H5{c96tbzX%-8je9JYjdQO`}`bfZ~Y zCc9H@%d}AH!ka1!phdmN|0nZ1cl5n!OQt0RudcH;1YO>7Z45eJGi?UCx((YHba6$t z8Sr#kc+=qE%-<;Z4UzqvvJf@cfyuRk-%tl8qlO!R+`~?f!#`Jbp;^we9rQ@XvnB92 zzOyy(7{c5RcqG@^8h8}b*$#R%&)E)qJj>Yi3M4=qKJ#3&*$s)QiQ?Km4p7(CQyR9 z`fkr+Y!x$q(KYnU)u_Q^Sm3=A=!luE*fvl@%~Na@Z-!#4>AA6THM?1H+b7fEuUT(A zp7ndH+2Z>4T{pXU>@6QN3NwoBly}Ex=y+I&Ak4Nx z(PVQsGU&6V1gCGVj=?g)V0s46%gRVA3EK3mSd9*+V{yGCUl2hvjW%l8Y%3`gG~YhU ze#VMe_3n@^TwJPFe4x9`jWgG=(CU0@)_leDoMCXv$)LCuK zkBzq&f2v%J&7%~(R+~q~S;{}rQWoTVNcyo>x?EeH*pkWMO@d-KB9Fb!O+Op~35`as z_v3QucrF$^wb<>b;M;p??nbp|x)754`{Q#zSMfRGs(VA{rYrC{=;+kpbbA;bkJbHL z$?EoiQ#7yJ11=7;`{#8`={59PLqi z5X>Tu*bjnN?lfO6Ky#{d2(*Ofz<Nzl>g5M$zLU56zV+kNUO@O_Ps=c;v( zi7NC8I|Mdi2edjU;6>w0 z4#iIaVdZyRHNLLf@*zke7SrzACtzn$ZrD%3<`ee#KExCne{svX{3)yggP3w;uUZdJ zW&P&d<*N{veCKUO&MLh7GRHSB=p7%|Un~C=TzjBX0q5in>3E_}>cznwd|?nP+{@U} zLB@_(>|TFGhVCQwoVj05`!b)H<@$0cq|PbGFZ_pm-`+#v6O6C%1m-TE4CRR+WiqLR z4@E(PoK5BM=!)}!YyWWfP?UCR+0YI@IG!Et32+A6M05D@QL2U@pTpy0pQ9We8*_y5 z6bR>T_%ND28Hw_w#-@FIx9)!)u8<6PJ$*V_K>K{s`zeV>{wy8o{s*$CV$z*kmc}G!m(|S-jhVJ&G9d@ z*#gUAIb5us(iE%EoVoak2UGN9yw4|tkPag12R1y^2({a89L*;)Qengn&tRpM?tLya z<)LO!A#_8Vz!%nqgwYD=hv@1KM1ZhS{FISRf;{iYF7jl?vJT?i8{R}d8QkB~upit0 zl78;`r$6{L(SI^i;P_ZP0gAB0X&)XP#HD?kO^07s8EaWjM0GwUYuac!T8(<+(fDP8SJeaju4|BCo4X(3)tl=ya@!wt^>L z7GH0o&F~pW6D<{=Z#2x4t9g|Qdd z=%O;PQ7!165zNT%od&}RHgrM3hLVo86*fpxhregB$V!Df>vTAfnaBc-TaZP8%*Zax z)?iWLMy7lyA;1EYzJ)^pX^XVV4M4t;8JmlzvmVZMh`SzSkGfw}Qg=P@(d1nZtV7=~ zh`z;CrW$XHz$J}lLM9A7O6M;1L?rm!b=+g=iJ)rhn&#!H0h6woil8obkDL=C0Q-zGQTKO_ zWfQ`4m!LHJfR`*xObA&WXC)OeX@H5Q+zxw^3P&4eA~dZ?B&o2pKqf-cjZ%_SXV^X5 zNQgSsQ8T&MgyV+1$k=fvIiHo+PAVIw00Kz|QlGC?^q2%dBC?2WQeLu3)T(kUNvadu z2WW}#G(jb-XctMR+_Z2os*8_5;V(GL-VpYEB_|PK0qHJbOtLemxJDDined|1tE4Jh z1eQq9YLRbTbKMN>qm2=uxpwQven>F9>=;}X+<{_`xMtPHMnUY*WoCjsjC$BLv9a!X z8=ZYDTYCermjV5?H`mD}_Ryeh)7V3E#yYW=$*U9OAOSnrZ|^ExQW{%@5q>GnwH^Jy$9W*9$tH5 z$oWgqIqR5xiK6!9=TfuoPLPXCw>tq1x;a^#YbW4gYv4{Gi!FXTfel;rb^@u6f?j#M zmz{uyt#dnp4BDu6f@mX|ij)kNhH>qLq&kJgQK!7zhtLHs584TS+0EXxExEU9Qw_Ka zHPN6~U&^h`ZrmON_{ zF0zDJ<+h+Zt$zE+KGD27JJ(dJyyD1Ur!j~)7T67b*z|7=P36s>1Ur$ymD7DRyTx6# z1f8ANzl@fq)!Mhs5;QBWljU{?`}5Y z2-=ETTe~)HEu=g}hm!D7gD^z>tg=UO$i~tXQtBpR)f#&)))@Tz)CDC<_=m+uQJOo0 zd?<>bv+tqs3n&mzY4`$~#uG!2RT7KlpAveLiMX%$bkWNxbWdsc*i7-1=Xd@F(L0~? z5Y8!q$x|M}$+bez-Y`BTDx8d-I)=E+vrHxCoSQO6qQWy@UdT=-QLCFuB^)DK%I~PR zqQR(^lB~z-mQqQdsFu=j!Rn^c$%N{*60-M*#*%UB>b4Rx-H680@z3hUYOunaL#h0+ zTatqz7|C`IhhH4CJ|uoIEdF5lMGA&P;uj@O4u)W~5IPu!@uKT+D8>rBgJBpiCJ%>V zv~WEbib+LswFZz*x>mQ9Oi)HNl}hGCHI+tuRX3GP5=AwYNT^h|l~6uZHT zh~#f{8r(h}aJ9v-HyAG3Cr+*7qfoWZ=J9d!*y2xD*X#pS3gtqT>}==^lw0`Fdw@j@ z=e*<5a;1-O=zQmtzrR|o7NfiMYS_WM7yRnS*n^j_qgZw*cz3rLe!-h14;3<@ z(MOAc!t!lobDFG#y?~?`K*J_%E)8$i_Xq8ikn0nOFFQE=a9r#~)FXM2NNSF58IEtB<~zC3R=(MSsX>qZL+Uj^SN$OYVMf z`h#Axq^H#h(7N6z7dWgsc%_^I@8$J|E4@NavkeE8;~>D-8@53o+emb9(V76FC}kbL zAt#pZFBuoi4-M9)m4)2#Q3C){1E7SxcLHPOoYek8O)&hU*PGRl1jTR>Pz?))OH5<- zwe^Spxmr)=-Oc1~HeNnM5^vDO>hgBHUebT^{mZ|#mZF6Ei#(~5-W2pPkn&rJai+B) zR*P8SvivW1pCI&G@49b$pNH>J5o>7H4>vB`{9CIx7%VUgAfVN3)f-<=2g9%8=jCh- z{<2^=%k^DvvFL4D5_e#ve~EJXQ9yXt?fiY+8#5M50i-Sd9D4`>0X4}lY01Bo7`>EQ z2!>^}yu7__&F((+=kv?Q-l98PwT6@VY9l%+K8WA$NY8~fEjoL>8ctpc_2onFZaf6w z75!~ZdZTGqs7tNoqTfPVYY)fqtT&KAK;$pQ>O%c26WfjM>i8skf0wNm!(oPzSg!Cv z%#Gd!+<>CJ4TVeHoeq{4?H=HTrC=E-XX5TpTuUM?>L(Cy8ORfWbjOSP`Qg>;Zm6@% z%>?5`3LyQN(iR7jDFA?pn7GFIsTr!Wa@YgCTJ#^$+5T$182+s#6jB0#xkn>l`^HhI z^ya>a*H6pVS@rciQ$>6SFTntk5`+5?52BC{JhsFHUs%q2X2!sxI7Y-z8Py?|JL-qw zfOhbA2T{$Pj>@?cXR_@ulbQEMi$5+`gO@Mi@G$B_>!%IPANyD=-#z2^^b_>i8?Bc7 z`p@#cjvp`HKErz!UB^N+ynHEF#@pWfcYn4!0L`ho2kr76fT)>9Nm5X1I#7Rh{UQ5s zq=@~LI!4JZ6E&p-tC|HsMvE*A#6afBRO~_wAuopyt^RyX|8-Z30R4*!<+T5HHdsT@ zgTVjRx`Sj{w(fh-?3O?BztH}ASP#qAUl$-JvJl|){RB+!>l{l2%=cG(SV4zy(d~Wd z!43kJX0N8@-@H=TBHG`<#*o@`(i=m6832X9;Mc&bLfDwq={8EJ3;aUq`D)>)lIiHQ%i#cf$oh5btkg#Mrat8hUK2KZa_` z&;2n1g0}c=CVr2YPk`z6ru|{YvT^jK2W@CFTs_VP%T^yP4_ovu8}~M|wE`{PfR9Pg zqI^c2jipT{DvEX?OI9XS22_jQ8w%JUE6(ubn0ny9i>kj?pqs#(zd}h ztDBQbcT8Emlq29O9CqjiMgrXFgf>Y%W`hyUiaKq+pAyq0A*@CDVpO3}S5FHHsZNu) zLKQQ#^v!*eyQZo(F#x(V0t;f;ax_F6;zbs7N>W7)W}^XgwKXE0$JodP4d z=-vkAnN=Issh^P!^Ske!jbY(TJ_N6z*zr5AY9(&_^JWNId9AmWRGq%uKMirL5A z(mu}Y38%Bc@ES?TIxR8;sQoTyrM2!e--6C|=|z^m(lb)s0ys z;Ag7y*}T6~paE_ZDmuX(k(SF_%{RK0QMnrkgH&^dfzeIX0w?5z;`bg9m;+c_4))_n z$QHlhf;xqW>hb~;4K-x-(==PjO)=E4vgfFkM2@>(x3xqih{zB@yKc7Jy`ya{Yi&V8 zq(;e*O+njv`=Z@8on(kjs%$;W$gb#$s<35Ep+HLO9*lf^0Fb|+3u7Rk4cOsS!#2M% z{-P~h#L|QzDrS3UhQO*9;)Rxh%h>~30Cc;GWTWuiap>!Ha@WSfBa_Ie=n76fp{bx_ zb+HU9o)xk|=jqeTaBlSKULZH(3W~LbN3BK`eFIxN8%^%eO-6>OA&iQ2d*bC}G*Gi| zVeaj>0-RF~U$s`ONtxQqv*0>_ux%v`4ZGGJcCEe%p$5{Hasn~)rDe?g{?2!e4fOe` zJPqI-F_#c02;V)U&nL%!eun>Jp-|pMBNM=EuCaZ0`?9srRx@a9La_>oRzbeGCK2k4 zcO2*GG>RM6Z`0H)QZMrTFDy;X9lC>}tVcO6m<&J$Tkw*`lJ9lRF(O7_9ApsnNn{ZwWwB zlGv`uE2)$G=py6n3Nfhp#Sx3}I=ZIUaE4(kA zV->+h^QjulAlGPZ1%wtDY56ucD(1TdbKJxz92ALd_}1=ou?>IPz10u})Zvi3W1vUd zH#VBy_%Z-mgEuJx8d0s2Cf1OcrS<)8V zff&QjhiIA4qD9NatYF8j2)7{yG)cn>d(SKs7mR*EAsh1_;4$lYKY>JAc_>B^BlGZ1UytZYr_-Lya0wN3#_h+po{ zOBZH6Bt&B{W#2$8_pJ`1e4*aZ7+_Vt@E{WS!qahzpn5jO*QlggvM4*`ebT&iHl`EENu@;S&6qr7aF21K z1-QL8C(snQJ-L2jHzK8&X5R6bD%Aq>DLb#_>Xtxk;k>nCXm>6=f?_qx9w%)_a6dou z$ae8Zoqp)sDIf^dDLLr7_M!;vedgN;&Y465$8Oi} zAcF(jSGxOAWE8S3c}nZs$1ydN=C?=0kj^`N*_Jn64RqZ?BF6^-RaQ9OWgucZSy~}! zUn|Ytbu1VR`H-o?<(yU7H}J4`!(8XiVy@`^q`pdwt9mC+zyx!sM;MX$cN>`P5X^4^ z6j?Z=h9ZHpn~55@YJ^?jgeHxn!qhgP0RMza&^(>^B5b@zI^Rmjk>+ z^1~I`9Dr`ii2Q?7>5VM5Eqp+l-BBbc;O#S!{Mk7#vjSstn6D%_oKSP2=sMk9 zD?vC{a)Yb+vmOxfT{!Gol;9mLD7>oI+p)Wt^)ev-AX=}6apb{J9+6uDFoS!ZWw@q2 zzJ7Dp?sSm33_opRDA=AIhs2K&EASQ2C%Hx^p^Vh%Gu@}d{b>601ve7t>F#8XF3{;6uKXLr$=U<&;n;L>!ZVuS9{%jYaTZpsCFkIWNzGiaKzB zg5aU;SL0%?{y~?Q#oZTu0omNz9NaySo1wgah%1SAYw?1jHqZ^sOol>0!CyFd0>x0s z`~V6W-8IBz4iSt>``9~g`z9P!whqUm%JqigNbuyPR0KfJ6WF|-(6(1%gpFl?Hs54- ze{4<`tINvJ-*F?K8te5xL#G@t3&ur{b3`^6AW%}TPXV{|EiyQvK6K7SjT)X1iq#R% z?c9FIaQ_3rDsc6ia=^gNRdzU=I$eeiOgC?J=u3-RG%97SvmCiAM^p;R_WL!5>};cBokAmtuQZbNI;b~{7*K7>K^uf#ZiNM+FLEf z-qXgmlnL*}R4`#%0eJSc$FmE>>F!81H@Xux8K5u!Y5GFEzDc!L1`2>}g<6W)W}I@t zXhpy__b6tqHyJF++}%a`4TP;`r-m+v4>uUaeobtRFpNhXzMU-gWOcMSTOkp&%}OKg z=#f$KZ6-~^!wefiZnH`1Q0hPu1N!k%2z^8$A?*{rn}G7M@eI(!Z<`~3|FhNR$Q9^& zTMBJ=DeTUHZI)sgUmXiF9e3K>t>37s?h&?6az$Him#ThSs{XibwN#bjm=`Rxns6GU z1j~L_Q{H&-NP&Tdf9JzybE?tUfuFPiz@hO5LJ|L9Q;l0dq<@;$ZI=OcdKT>}fEK=Z zK?fd&E4d$s=Y|*V6Z`W1da)QzIV>Ryt*r%d>5iyz1+B47`1X2T>40F1xUEK44mZ6n zm)|NVYg6UnqO!<|Edi^5Z^S&0iJy6?-urxyur*zURzvR>*SLKqcI?sQjRZ3y|Xi}vtAI^VfqWf*# zA~vr$^i+pmrNrPIdxaNRQgyMx1r{(a8s#pmS^^vQ072basPYaK@meD8;oF+$E2(+n zdUdhp$ zJux!$o`K3Rma3|9xp~70taOx1@ko{20(f)W`YbDp>9`qg^c&1RW#T}8*=5N7BzizW z%J{7sHJTfKA)>s$Hgjpc^$H1pBJ2A#avHoIt*kefw;w+s`ZvG%IQ=}G{W=vWwWbt} z4YB4q{TKcs69@kkIVf5j?VPBCUrzfIggd8qvwQw|Kkhvs{yE-~pA$|#861`87qki} z^muE!#EB?sZYF?BDIVw#B@bJCrCc@071qjLjY09*Bj|2Hc}03y9LA}Zx8}wN+wxX% zS?-nN*6rsS;I9<#o>_6rcEo-QX*NJyy1%enSth)*--`5Rq{$=w(`X4S-)2Ktb7%MX zGF$YJ0wwEacVqbe_{aus9=fQiDW~O4E)hO}xZ8~7Fv&O}!+dg=#JJHd+CNIa;_vQz z0=aXG(@1u=CW!TGJ-og z%a*pWS5}yC=1M#DXK3xes+08@@-@4UQoC2G6t-95(jffxkcRE6NZ!NA9u{kCl_-)HPp!M*!)V%C z$Uo27T#!2vhGYFO{5rxm1nT_^>b)#68Bz)<^~8uEPciR~WQoNPnTv;%D$0HNMeG7UbLSdV6f#lELC~rs~Yvp zI0C~7>N~xa??%%;@<>|aG@3pRk(Y}SVku}NWb8vCapcodxT-J0cA%a(*YpgDsc0OX z?oe)NyL$wQvO_vAe??X=?7fhzOb(*FUlEv0vV1so`@K~ktH+*B<^^scO0Q@Qiy|*D z2iYQRZ=EXlixI6&`I)xBd|S$Urdt>jRS4_5dBtdxjH~^WdvS4J8_I-B( zu}FuDdoUyi7aE@>`mgKi1?dusO}zFv5y~ShOTPOgQPm*qmv7;)l#OSzxkB>i+f48n z@csT`G{+8JePU*@0t>X(zcTe?Y93T!$(H2osJB18`5%XBsk`Yj7Iv?lEsul4nTRf7}K@$32fEv2woVNcra+=!C;LC zgESs87c2zdXaSoKA@u446ofmlF-8whWQJ1W0gr6l66IzKn5j%buqsfL&=*7jzVpYz zUOtaVlHP;I$(HW$!upP!Dia7dk)KcE0xoAik7vJT^S-S9IC^+APh;@OHCdxXO(Ud$ z^qKtK){X$>%I`n;t|P) zNjS*5QWVl0{W(l zOnUvrjIX-NI!a`+h*X0yUyLx!nl52nrUfEvNWI2co|w}W)Nu5UwKX)a#0Gw@p$mAU zrR1GajU@0dqs0ozrA^ykIFWNkYt#oK_Y0cTpq9@t#gs(Vnl7(pL2I&rRB6@1CPY7e z_>p;*9Bz@(Q-EWQNDUE)5z4GJokTz`0q`4(0QlLe!9wyLmTv)G%gjvdTCBHNyki!p z`A@_7Xgqt!zbD}fIlY(xE9e1I-lA9B%yM?Wg1H{r%V-Xb3CitYILAqV)h5j)*qY6G zMO9v`c1gW7Ehf!H``DTe-380VAH^yGP>SvAnje2iV9$T;J#nPrUU~g zpxNMHLi$W~SSZZ?48%G+qsCw?K7Z43wLT*8JThv6@8yV+tjMU`wm zV1|#g4*87~s?{Ui!^f;)9q1)Wy3^QVVe|~*w1hR6kgN96+`s=w*Y6dp7m|a{pN@Z) z7x>?RsOfk|Jzsvb4}H{I7#L`qF3z9cW;lz}zx%)z`ageSmVCc}6otJ38`3$}7XMhz z$0KOd07K_7nKTTjM`<9yqxmJQ1?sGed;ZONLTSa=*bZW>C~~yF$-gKl_Grj}44iZ; zS#SN7Y$Q0%9Zhi7Oh0>H#ZTB%cujJzqzOj%crn9qA;64>_p8Z_QYWJY=sNmAPy^l) z6#%SIG4KP&SM*F3=`UB(=T)t5>g1}Wj=7}ig!U1ChdLxi2ad8>)o>D}!!BFVu$2KW zBl->3+Ql8M#?k$zCH7*Z2+$@C>=%)Dh&)@)%>JDu|jy$;yYku)?g99P?YxciJXhkmHuiAV0;@K+ua z`aJ+*YBl1KSCPUI&uksU0tL0>^mHZ0f&vOl($a`i*)>Mnoa%UVVSUlly?PvBxM@`S zkBbK~U4t)RWhwS!hZ0#1DH|+~<;lPZ?OJADYYoUhL{=aV5b_z3hjf@aFh;1*IHSLt zjX#jE1E-sSlhOHpm(KUUF_B0`OnoF6K$4ACL`)>`0Go_tR(^GeM9yw5Bqg%eBKtg+ z4*x6Y5bt1r#5(;8V9@-LWl^tMc_1&iQj3)Z4%N&vrpeWE3*ZrTowKTs1b`B7Hs;`R zcx8raKq5YXKP=Q|@x#4E|NSO~%F3;l%LeAFPy34tR!ipu%RK))CdFnMRW!CM0B z2k{AbHPS~=tA4-+1^uCH^ckrEET1yiPM25#lp#L*$|Q>)V!`$9$x12;V->Nx14HD^ z5krB> zLt$~g@Ava5oZaNjeDuTz6!}w%BAT$XKf{Tl41`Mtwt$B-ZEuZr31!bq9qk|AWlx7~4kR!LSl3fG!&nfcHHq|Ix`lR=nOvR(cAH{4Ek~l$kR|_HZLYJh7 z8=olhK2?*6&e1-uzFN=<)|Q~EiuUBVSuJi)J3sNNqFuxE!E;u!zT_64^-Ug&d#lqez#Y0!2vvs2q0p@Anh1X5 za@LZ<$zW_bjNfw_>6U_4-aU7ijY}pww8?IXZGy+x+@iSwD1#dwk%}5MhbR}6&&Ah{ zB8ZiM5#$Jb9lGU4K?GljAr$JMiV8;iA;BtLdXP_od9>j}%}S(Q3x^m>tO0pN_BcaK zP8sY=1{^D&B#T&fqCxv27b)9LSg|yXNLJ83amHY4ipF$^YsH8vOc^LHY41g+tM)ud z;@eqND%_7uGvrvl?0mWX09SNgRQb6rT^E?HGP>rQIuJEsnyI8=WULUQ1BM29;tY8? zMU^7e?6NN_5z4Qb*EpN+Mq?|+~P1v;IJ1tHb;zVZB{+N-qZdM0V zToed>*%M3%Oe@+hB4U-Wz}myyxX!1|N|xi(qMmL`3ncR`A>+|RepL5C?fV?j_C>yr ziN>;kD*tIlP)bUn018$~vB&b`nYsCiL!rD2);FjVJlCR6D66#dH2Qs+#PHd7l|W!= zP=~pfHSTfyvZD3(4_nHEssXSzR<^*Fn*xtF#L0`Ye(z(5;zi7EgHy2BtJH&o4NnD+ zJs4h+vUd=4Th1fQOOnyBR_YOZo~f0y@q>-u6Q9?u#BG`xEm)zy&Ew0L#%^9lx6*P| zT7(T%TWbN^Pc&JugqpysSE&igpZ^ciUhM8(awlw_K(b2bM6~sd#|0g?_ArwX%+Anh zVC*t`U}LMKq|X5@2u5P)HtjRG>evqWlp2E~IlqH8bd63Dr|RhQan-f5X+gh4Un>f6 zry4PM28O3{vSHUTgNKoXoszSZBGpyh;d{-)cOiz4Vz21o`+tA3jcLgU0A4d>^)&dK z$;Tl|aR*=~?NB}nMYurkiOd=GsB+3of9?6I?(rq8K#ncqzu(=Ma2&^WCMYIk?SP^) z7tv}{@i;o&r5BO|ImPsO9|v4Z92MF&t(m+OLq;TYo5W=1a02Z@ltdp3?k(gR6|HU z4A%ev1A{{jA!*G5-Y`7P;Pu#=bzG-Yx7Fn4)e*x=OK04Ms1%9)TuuD zieATS>*09%gUwW_}*0+Z2>08Yt`R!m_P3SreImh!{3BMHBtava?k zR*s>ZaOFsmx@pQv>{a`)#yP|K3DgaETc_!eM1BwB%R+ zX0gJQTl$%t8Frp$Pe=1taEFbc0`cb=v?7Uk6%~{s{(sh?60?<()+*=D*rKq4r9qod z6V$>6PkGHELvv@Ap?R)tn6nl%W5gKY+jY471zY|9;=fO{j|d2myvj&?(42+P>4zs| zbaHc2I3N}XeR%bw(g`lfL5Y#Vm;?rXQ~1~G4Oe=_qU1H0S3rReXnjx*_koH!zxn-E z*OppJr`5Nw_`)ED0@H{4`gF%lUda@fg+)9u+W!nJ8!NCT&8iPB3b83)Yz~8-ok3zTZ_^#<_Kv(T(y*k6SKHQPTO-{O;is$U|!+*89KfluN@tfbh?e%Ft^ARDYa3K-# z!|~#Ac6}xO{ee>}>*L4k zD|J&95}Ila_d@#7Nd6yiBcX?Ak{HJ|k%=mScD>>U1c3 zK)cOzB`BkVwI+UDzAguGp^627+_sO$vmSXo^G)Zkceh_!LZ{_ukXJUfffsxRoH4vxnL20T;#9rQ35_aUfW*@f$4Wk`knQ_i4?6sbE>Q?$+d0 zp&~)arx8N)(|@)3W{AshI|yh(Y-Wr=Y2edzq9?DEXXmFl4pZE7uo;i;TB{Kv$*m9q zN1N4TSQIE;h{3RuA(>RLlor=gbKRmyICRkpYMT0`*^4sMi97MeY$u=TDs}FqGzd!G zBPfVTRD|*mlafQz?IWrsii0)$2$o)>t|{Ibz5m*J4~66PW(B?)gq9(nIUrfBigL zu4qz!q40Cz7L-7<)_9@N;~lo(1BGR-ltr+(1m)vft|x8!=eQ+eD2dP>EWX9U5PXCJ z7GXu>zXvR6{KCJ#3Q;fmiiPf{UvB?6ps~&Eu<_|0YNZ9 zh*v?RsEQ^Wf5fyE${$UErhE!t?2>=>-^b_0pKp)b`lG#S+U(ZC~VTmbK&ZL9}sv;kMxx$Z^gx*p_Gn+*22>`FPttG7q0zfH+N}*i#&> zl4Dw?k>zaC_<^8`eJ@Qfj!6)1cuMiOvM-SA|3Xtkf(M*T%1%+(oTI5{gnB|%^Iphb zSxG#6v!G#XgkukA3(GErtswz%Y#UkHN2W0L(oX5lBkin&Xo;wO;uJ<@x8_Yr!$+nl z_@{?(S;e+h7By)If0+)cOVriUnpRoX@96o%uQRI4dO}&{W4o}f{UfqBMO8nc>bkV9 z-=WxEQ2e{GASiAXf^<9KaqJ?b`fv~j>6{?h6)ZSnYO8QL zA_$_W?v0$=s;X_OD$83WZtuj;-+KrhxMiF7Q^&Dfg4kNJZ{Ne{{Z8!dxJ5a_Da?tz>67! z$|kKmNPewgVV`Mg^Pt35)>cRk@gz@UEMQ_BW1+dE!YI-V<%5M4XJ#!m$9yya* zJ!q<%&s0A##@M(}!gN^6>DTRJ7YCv6uz_iX$9awXZ$h=e+2OhW8mSd^q$Qg1)618y?x4SZQP>2p(G=9ltz37^3u^Jg-nuGJkQtLIM+ATV&OD^fMeps< zLYOlg;~*>({)hNAJlwB%xYg;%pZ=uQx}@BH6#?7MPubIjgOP3CZ*Dgnd5q4u-DPe< zk>SMEzB41%fdb}3#Z{JgsAv*~yxB&uU=M*}^mFqfP{N#f1J6hIUbh5x7`=@k(lck& z{!rLzQHOCIjX`3kPtNV)7};x+Ba{{1KO;8^IOtHMs1H~&a27CE@JnNC1XpTMzo?eR z`7u>N4oTGKhqj8QAI+Jh}ZnVkq%n9k= zh;-(Mj4fb>Ij$bH9MrCcG`qU-_EM8;G!x#nVHx6*Qp3YZORW=H9=@1$pFatMhTW(67uTpOF7uf%EzMHziR#J9%|0BCqNR)^%1$)R3WY+tqT;f&; zXx<9&9&76`Bn5-}Xfpw9&dLIj705b&^A{@+c8p9`fQ`q5qU3Il-$vDPr8QZbcu&oH zfvR0v>=>EN9BdB8@*vF)UOXqgt1p#8QGGkiDDKU2BgZetO~|U4AtPOt*n5g&7)&7_ zg{WA-$1s?>yw!|G)0?FUS=11v8wv@uz;@;lb_lIE5`D%b-R)Dtb+hNj+~UP!J8`w_Dcy>-kRpX2O!VY7A6pciS6 z{s*_9)XZB^u)nvr_v}7_Yp=O{YeG*s7i!7%1owwvN2LTQTMJQl^8Az|VSg;CrrJ4585rkLOMiEE?C zg&Qb3ujJkGslO@H)`qyfmcYU6@awjon+mP5#wWDxmBeV@|2V^aKBx?G_kdNunWze?W)BZGzn-`_vyI(gnC#)dI`E+NvsE+ z-{3k((C@9JqB}jiddT_Eoac%~x#b9`Wy}<>mNEHQDvQ@PaABzWKpBi7f%wQeH?(T+ zQRPeE3;?+MZrmcUfpHp;BV4wz+;TMR9cH!JZjTEra!A5^(cK55kTA-1QD@c~Cksy; zODZYer*1baL4&5cH)U=BmE9v$NuPwChf7d)VW}wc&7hkN#Q=ehNW0`ME(amPD}_3z zyI%TokXAp-?@ie#M>Me^jh8olRDE2O0LDugF;E%sUGk zV(OK)$1JJ^x!}z#Mb%<2TW~K+;&39uSVJjnbCwgWodK9)VAM-kcnO*C4!$#-u#m#D zT0J&=-yCFR9`jpvV&Gcg@0h(oiNs8CprLe(o5i}CNITX`165EV= z<2S?U!|JiMnynyJ$KqkWn2l!-xbGyNCx}9ffX-9(JO&Jog~D;4vqf);$jP&LAE^Vx zYm8PVp9KgJ{K_ObXrDM@9^o#Y_e4ao&U;R@W2g8kDNBAWwm`|ly^vCB*qPkkAU1e; z>GsiJs4GwmU6e0Hh{;%#}mZVDynF{<*J=8N}F^(=PI8rN*XQyNC9n%(DleD z*X%ih?NRl@VbldAsd(df(eKTB{n2VuguvNwGFM-7tt0Ct2L|p)dhviG(VJK(xr)VK z+NU5cW*k}naoGP{0Q$JMDuS&)_V=rN}z##pgTsW&9bJ>~O{+kn-_S_GYwP!R|H1 zzbfFD&QI;{67un{+D`l{lZrY$Xq9QR0mw29XCsg~Q)YU|DuHJskVSUS^q@uBYMmG| zHSvk0)EYdNFVl8Xs!j*g&~rkVnv#>klr)?UrlH=XFcsaV1L{$1I>0uq+KCOjE6U{3 z|4i9~&N%8JesM@OnLAyRx5>6%R%c*z%eV@PEFm1?D#)DaET-dXSlQBR)Y6&KPo+)} z*BG`Tw3AUWNky)7Ty0^6xOiW-v38!E^0Q>SXP3R^wIecjvjO+Iem|-j<;Z z6MN^0+>Vu)o1G_$zRkuxWEu>i4Lx|z&b;%sw@Dp=H7R7BAyCN&pWQM5WY zOt83wVrc~>ECy9vq5=joRcnS+00imRD}W&1bQKV!P_HV24Oc}wI464xb#jG+6ikB3 zpb92{4StK%>7HQnoIdV79vzOa_+K+srOYDBz%6^h88Jsf0n3p{_A;VGV>j?+Ug6m-xn# zPt3Mk*tIIT-z=jN^D5IVd-_`itKQ&ramR zvp@P3EkjVQHS3#St$oBsB4K|j7+A-S#Ki4Gc|m3*$A;x1o-;GKpOt;6SgaOcR$USH zkRZm=5>(t`X#H1K(k3Iff4;@Y{b~$GZ!D+N{Ke)OP=e(x+DY)Sy3@vS(+OQs}lcLHc76?a#)jBVLe7y5uvIWWcPaT zU_M@vdS0L&6;Y0FNGpa=G%21Xt{8wo0gOhNy0hVUI2le?%dEE&t1UEh$3!26HH0({ zeI_e&5FX8DQ3U~x&duU*BeoeV9R^g06Ahscht1@yt|)9-2SlQyqMjXFJ+sQXVyz;SXZ z&TuP;ZaDnRu4AV>_`NZMSCP z8QPBRMDw%V+OgPKc=sai$8-YLHKEXkHeIrg*3C*GD-Kj%NOF*>LcDHD3#k=cRj3+L zg<)O}Lb+{T7OF7Mt5W3_dReO6NG}U{c6u^TyRL{Kog?4~tEad^6b7oQdEcUDoHz-! zITr^Q_1jcrvsKL~ZXQ54nnefd#`E1!*4V^$Hj+VvT1C|;4iTyw%_2gT<9S4|b}W+!RgUKp z!P?PmB2-)R3C?3qu8r5z`&sLo{)P4D8l^7Or?W0nu9Nfc?PAtPhH_-?{)KNQ(3&l% z(?0hLcWybaGUd&tM9{;9cyXp$`MEb8jPaIkk!9^u{aThqzH54)bIR=8PA0ePl39ca zr>qv&HqZxZn_%-XZb6k7x)AMovp)VK17vIYIJ$=;smxmLR?g+`yF8|@m_>E**n>MW z%(2(qC33XRd!xlQvUqQB|GJ%>(nowiI>OZj98+;|WHqB__%Bg1qE2TM9=?++O3!+% z1}{G&dA!<(!0VBx5!X>+7+w&Tu`W``$9;=y=J}3k^29*XIEKe3M_y%s&{RD@W_JBs zGTyq#&4S9F+5z@#SHVQb*J*E2hscp4LDATQs3ZmYZRWj{-7LKw%!j~tO8}_P(%2xA z+>x3{2B!(wq_Gbx`B3of9_o7WjBWH(l$BB0-r28Ej|Djysx0sPMHMRp#SB7f8Uh?o zk(wdk!$T#W3(xsPAu+GTtvyC`?y;k=1~#amCYm0s&Y5Br&1t1efO9&>;88$zE_@41 zza35HV~v7;XUiwy!m|`mJ;Ggd%#|+!E5?spbciRJZ|t&F7qpmC35*sQB2#D@tg+_2 zn*nC{S1?H=a?D1@Z>twcP!o(E7Jc^&K2V?n3i{iTWG#GgEfNZ~l%gTX4&`7+^DXB& z=z^wRdgK;3VV4#KK|Cs?NRWiojY5Z(MLkOB7$7=XL(q~aQ!z||ZHQFObUr!}5&QR!@ zD=wL4W4Zxb(ihEGG(o6NGK*6K;a!4LE8bPKwA{Zs5|XIsv*KU6&1hx#(1<` zZ7qFNcf^DXnC_A*Qf?JF6_W=nHJUZ_uIWiqpj9O#7eX6cfgdSC`l8@qw4C=={YM$s zhXtp5TTgtUy_gpTo3~Z3R;$J6ZoL}%kxBULj|iKiqbH;qWp+EMAlOFqV$ce)Mctk-!4kmQ zRU1NjYGZ3bJ0_cbD?V&rE70r6^V{YX^-X(Yl{jOmwHLcH7v;0*dQ#~ZuXGu<^7`Jl zwj{xg|Q2pnd?9LN| z#d(CI#))H2QfJS+Na8U>Ee7K5dPlOpLsF-II4b!ECTvQ=EocdT%P>w4ARQ>aprP;! z@j09BoyHYkWwAnhHB!Rty4GmPkvO6lc_fZ#0NnUkIiBB+Oj#wLauD&Pmh&wq zot&>Rg43z6V^eCEMnrQfD4UHTHO#((@56W=%EIXEr4tlFHE|C!DvAXldaMtSfb?}zuG$@);x2jPBPx3Pnb6q3tV>Z zGJ{sE=90rxW^QG<1XMKOf;j7v{}$ENwd8sNLzX7MD#9!74h~j8lU{c?_pAWzUfB{m zZWREm@RpRes0~I#;+*(H+!XihdUwm&7Y6jO)M^)vwi6yTpfu@T-RLcXFhua zIS-j*f^!OnNpIvr6n|`SNiGo(j)+@F*x|=LFr>SXEOpggSbBtPRdSVLU%)Gg5NQ4M z?&Gt|XQ$sEecyieZ?EP!Nqlxa?SKF5Zao?go}Hauoc??3hcCUw539-ihlhTj{`&*H k{?`6sx!}hi#-lsDJ^r5DtA=x+y}HLq, std::allocator > >) +4078 15 82 3 +408d 13 83 3 +40a0 1e 85 3 +40be 42 89 3 +4100 20 90 3 +4120 2b 91 3 +414b 1a 92 3 +4165 23 93 3 +4188 46 96 3 +41ce 46 99 3 +4214 33 83 3 +4247 8 102 3 +424f 1 102 3 +FUNC 4250 3ef 0 -[DumpSymbols processDWARFFunctionInfo:] +4250 15 473 3 +4265 25 474 3 +428a 1e 476 3 +42a8 a 480 3 +42b2 3c 481 3 +42ee 3d 483 3 +432b 23 485 3 +434e 26 487 3 +4374 6 489 3 +437a 37 490 3 +43b1 2a 491 3 +43db 17 492 3 +43f2 30 496 3 +4422 3d 497 3 +445f 2e 498 3 +448d 30 502 3 +44bd 64 504 3 +4521 34 507 3 +4555 9d 509 3 +45f2 45 474 3 +4637 8 513 3 +463f 1 513 3 +FUNC 4640 1f5 0 -[DumpSymbols processDWARFLineNumberInfo:] +4640 15 515 3 +4655 25 516 3 +467a 39 520 3 +46b3 26 521 3 +46d9 6 523 3 +46df 37 524 3 +4716 2a 525 3 +4740 17 526 3 +4757 30 529 3 +4787 61 531 3 +47e8 45 516 3 +482d 8 534 3 +4835 1 534 3 +FUNC 4836 10f 0 -[DumpSymbols dealloc] +4836 13 1145 3 +4849 1c 1146 3 +4865 1c 1147 3 +4881 1c 1148 3 +489d 1c 1149 3 +48b9 1c 1150 3 +48d5 1c 1151 3 +48f1 25 1152 3 +4916 29 1154 3 +493f 6 1155 3 +4945 1 1155 3 +FUNC 4946 512 0 -[DumpSymbols loadDWARFSymbolInfo:offset:] +4946 17 402 3 +495d 9 405 3 +4966 10 406 3 +4976 2b 408 3 +49a1 38 409 3 +49d9 3a 410 3 +4a13 2e 411 3 +4a41 31 416 3 +4a72 e 418 3 +4a80 24 420 3 +4aa4 5 422 3 +4aa9 b 424 3 +4ab4 b 425 3 +4abf e 426 3 +4acd 2b 427 3 +4af8 2b 428 3 +4b23 2c 431 3 +4b4f 52 439 3 +4ba1 34 444 3 +4bd5 1a 446 3 +4bef 21 451 3 +4c10 1e 452 3 +4c2e 21 453 3 +4c4f 40 422 3 +4c8f 6 453 3 +4c95 170 422 3 +4e05 43 456 3 +4e48 10 457 3 +FUNC 4e58 4fd 0 -[DumpSymbols generateSectionDictionary:] +4e58 18 663 3 +4e70 10 665 3 +4e80 2e 666 3 +4eae 9 668 3 +4eb7 2b 669 3 +4ee2 7 670 3 +4ee9 2e 672 3 +4f17 d 676 3 +4f24 32 678 3 +4f56 29 680 3 +4f7f a 684 3 +4f89 3c 685 3 +4fc5 31 688 3 +4ff6 5d 689 3 +5053 26 692 3 +5079 21 694 3 +509a c 698 3 +50a6 e 699 3 +50b4 6 700 3 +50ba 9 701 3 +50c3 2e 702 3 +50f1 c 704 3 +50fd 3c 706 3 +5139 66 709 3 +519f 1c 712 3 +51bb fb 714 3 +52b6 6 717 3 +52bc 5 718 3 +52c1 19 704 3 +52da 25 714 3 +52ff 2e 722 3 +532d 9 723 3 +5336 17 698 3 +534d 8 725 3 +5355 1 725 3 +FUNC 5356 24a 0 -[DumpSymbols getSectionMapForArchitecture:] +5356 14 643 3 +536a 43 645 3 +53ad 1a 648 3 +53c7 1c 645 3 +53e3 18 648 3 +53fb 40 650 3 +543b 20 651 3 +545b 17 652 3 +5472 16 651 3 +5488 cb 652 3 +5553 11 654 3 +5564 32 657 3 +5596 a 658 3 +FUNC 55a0 3fe 0 -[DumpSymbols initWithContentsOfFile:] +55a0 14 1056 3 +55b4 3b 1057 3 +55ef 44 1059 3 +5633 17 1060 3 +564a c 1061 3 +5656 1f 1064 3 +5675 2b 1067 3 +56a0 a 1069 3 +56aa 35 1083 3 +56df 2 1087 3 +56e1 1a 1088 3 +56fb 3d 1087 3 +5738 33 1092 3 +576b 6 1094 3 +5771 e 1095 3 +577f 17 1096 3 +5796 c 1097 3 +57a2 1c 1101 3 +57be 1f 1103 3 +57dd 18 1104 3 +57f5 23 1107 3 +5818 25 1109 3 +583d 1c 1107 3 +5859 17 1110 3 +5870 c 1111 3 +587c 2a 1115 3 +58a6 8 1116 3 +58ae a 1118 3 +58b8 9 1119 3 +58c1 d 1122 3 +58ce 29 1124 3 +58f7 20 1126 3 +5917 20 1128 3 +5937 57 1132 3 +598e 9 1136 3 +5997 7 1137 3 +FUNC 599e d74 0 -[DumpSymbols outputSymbolFile:] +599e 18 877 3 +59b6 2e 879 3 +59e4 30 880 3 +5a14 5d 882 3 +5a71 30 883 3 +5aa1 5d 885 3 +5afe 2e 888 3 +5b2c 38 891 3 +5b64 46 892 3 +5baa 26 893 3 +5bd0 20 895 3 +5bf0 20 904 3 +5c10 30 898 3 +5c40 f 899 3 +5c4f 1e 904 3 +5c6d 17 907 3 +5c84 17 908 3 +5c9b 44 911 3 +5cdf 44 914 3 +5d23 a 917 3 +5d2d 36 921 3 +5d63 30 923 3 +5d93 9 18 4 +5d9c 9 19 4 +5da5 c 20 4 +5db1 56 923 3 +5e07 74 925 3 +5e7b f 927 3 +5e8a 44 932 3 +5ece 20 933 3 +5eee c 934 3 +5efa 4e 935 3 +5f48 41 936 3 +5f89 f 937 3 +5f98 14 934 3 +5fac 7 941 3 +5fb3 14 942 3 +5fc7 14 943 3 +5fdb 1d 946 3 +5ff8 c 948 3 +6004 24 949 3 +6028 29 950 3 +6051 9 953 3 +605a 28 954 3 +6082 2e 955 3 +60b0 1e 957 3 +60ce 7 959 3 +60d5 26 962 3 +60fb 2a 963 3 +6125 2a 964 3 +614f 6 966 3 +6155 2a 967 3 +617f e 971 3 +618d 43 972 3 +61d0 4c 974 3 +621c 8 975 3 +6224 2e 979 3 +6252 2e 982 3 +6280 2e 985 3 +62ae 2e 988 3 +62dc 2e 991 3 +630a 2e 994 3 +6338 2e 997 3 +6366 2e 1000 3 +6394 54 1004 3 +63e8 c 1005 3 +63f4 e 1007 3 +6402 27 1008 3 +6429 8 1009 3 +6431 34 1010 3 +6465 24 1012 3 +6489 2 1013 3 +648b 2a 1017 3 +64b5 a 1019 3 +64bf 14 1020 3 +64d3 1d 1021 3 +64f0 a 1025 3 +64fa 32 1026 3 +652c 33 1028 3 +655f c 1029 3 +656b 55 1034 3 +65c0 f 1036 3 +65cf 16 1040 3 +65e5 61 1041 3 +6646 f 1043 3 +6655 47 1046 3 +669c c 1048 3 +66a8 11 948 3 +66b9 4e 1052 3 +6707 b 1053 3 +FUNC 6712 11 0 operator new(unsigned long, void*) +6712 c 94 5 +671e 5 94 5 +6723 1 94 5 +FUNC 6724 e 0 operator delete(void*, void*) +6724 c 98 5 +6730 2 98 5 +673e 7 76 6 +6745 2 77 6 +6747 1a 78 6 +6761 d 77 6 +676e 3 79 6 +6771 2 80 6 +6773 1 80 6 +6780 d 95 6 +678d 1 95 6 +678e 13 127 74 +67a1 2a 127 74 +67cb 1 127 74 +67cc 13 127 74 +67df 2a 127 74 +6809 1 127 74 +680a 13 127 74 +681d 2a 127 74 +6847 1 127 74 +FUNC 6848 e 0 dwarf2reader::LineInfoHandler::DefineDir(std::string const&, unsigned int) +6848 c 131 7 +6854 2 131 74 +FUNC 6856 26 0 dwarf2reader::LineInfoHandler::DefineFile(std::string const&, int, unsigned int, unsigned long long, unsigned long long) +6856 24 142 7 +687a 2 142 74 +FUNC 687c 1a 0 dwarf2reader::LineInfoHandler::AddLine(unsigned long long, unsigned int, unsigned int, unsigned int) +687c 18 150 7 +6894 2 150 74 +6896 12 299 74 +68a8 12 299 74 +68ba 13 301 74 +68cd 2a 301 74 +68f7 1 301 74 +68f8 13 301 74 +690b 2a 301 74 +6935 1 301 74 +6936 13 301 74 +6949 2a 301 74 +6973 1 301 74 +FUNC 6974 44 0 dwarf2reader::Dwarf2Handler::StartCompilationUnit(unsigned long long, unsigned char, unsigned char, unsigned long long, unsigned char) +6974 39 308 7 +69ad b 308 74 +FUNC 69b8 1f 0 dwarf2reader::Dwarf2Handler::StartDIE(unsigned long long, dwarf2reader::DwarfTag, std::list, std::allocator > > const&) +69b8 18 314 7 +69d0 7 314 74 +69d7 1 314 74 +FUNC 69d8 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeUnsigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, unsigned long long) +69d8 24 323 7 +69fc 2 323 74 +FUNC 69fe 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeSigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, long long) +69fe 24 332 7 +6a22 2 332 74 +FUNC 6a24 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeBuffer(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, char const*, unsigned long long) +6a24 24 345 7 +6a48 2 345 74 +FUNC 6a4a 1a 0 dwarf2reader::Dwarf2Handler::ProcessAttributeString(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, std::string const&) +6a4a 18 354 7 +6a62 2 354 74 +FUNC 6a64 1a 0 dwarf2reader::Dwarf2Handler::EndDIE(unsigned long long) +6a64 18 360 7 +6a7c 2 360 74 +6a7e c 44 8 +6a8a 2 44 8 +6a8c 13 55 32 +6a9f 35 55 32 +6ad4 13 91 32 +6ae7 73 96 32 +6b5a 13 98 32 +6b6d 35 98 32 +6bae 1a 75 3 +6bc8 2 76 3 +FUNC 6bca 20 0 std::_Rb_tree_const_iterator >::operator!=(std::_Rb_tree_const_iterator > const&) const +6bca c 287 10 +6bd6 14 288 40 +FUNC 6bea 16 0 std::_Rb_tree_const_iterator >::operator->() const +6bea c 249 10 +6bf6 a 250 40 +6c0c 7 614 72 +6c13 1 614 72 +6c14 c 241 40 +6c20 c 242 40 +FUNC 6c2c 16 0 std::_Rb_tree_const_iterator >::operator*() const +6c2c c 245 11 +6c38 a 246 40 +6c42 c 241 40 +6c4e c 242 40 +FUNC 6c5a 20 0 std::_Rb_tree_const_iterator > >::operator!=(std::_Rb_tree_const_iterator > > const&) const +6c5a c 287 11 +6c66 14 288 40 +FUNC 6c7a 16 0 std::_Rb_tree_const_iterator > >::operator->() const +6c7a c 249 11 +6c86 a 250 40 +6c90 c 185 34 +6c9c 18 186 34 +6cc0 14 204 34 +6cd4 c 69 70 +6ce0 d 69 70 +6ced 1 69 70 +6cee c 89 70 +6cfa 20 90 70 +6d1a c 69 70 +6d26 d 69 70 +6d33 1 69 70 +6d34 c 69 70 +6d40 d 69 70 +6d4d 1 69 70 +FUNC 6d4e 25 0 std::_Rb_tree_const_iterator >::operator++() +6d4e c 253 13 +6d5a 14 255 40 +6d6e 5 256 40 +6d73 1 256 40 +FUNC 6d74 25 0 std::_Rb_tree_const_iterator > >::operator++() +6d74 c 253 13 +6d80 14 255 40 +6d94 5 256 40 +6d99 1 256 40 +FUNC 6d9a 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_begin() +6d9a c 461 13 +6da6 8 462 40 +FUNC 6dae 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_begin() +6dae c 461 13 +6dba 8 462 40 +6dc2 c 65 68 +6dce 2 65 68 +6dd0 c 72 68 +6ddc 2 72 68 +6dde c 97 69 +6dea d 97 69 +6df7 1 97 69 +6df8 c 105 69 +6e04 d 105 69 +6e11 1 105 69 +6e12 c 105 69 +6e1e d 105 69 +6e2b 1 105 69 +6e2c c 67 68 +6e38 2 67 68 +6e3a c 99 69 +6e46 14 100 69 +6e5a c 99 69 +6e66 14 100 69 +FUNC 6e7a 2b 0 std::_Vector_base >::get_allocator() const +6e7a 10 93 16 +6e8a 1b 94 71 +6ea5 1 94 71 +6ea6 c 65 68 +6eb2 2 65 68 +6eb4 c 72 68 +6ec0 2 72 68 +6ec2 c 97 69 +6ece d 97 69 +6edb 1 97 69 +6edc c 105 69 +6ee8 d 105 69 +6ef5 1 105 69 +6ef6 c 105 69 +6f02 d 105 69 +6f0f 1 105 69 +6f10 c 67 68 +6f1c 2 67 68 +6f1e c 99 69 +6f2a 14 100 69 +6f3e c 99 69 +6f4a 14 100 69 +FUNC 6f5e 2b 0 std::_Vector_base >::get_allocator() const +6f5e 10 93 16 +6f6e 1b 94 71 +6f89 1 94 71 +6f8a c 603 72 +6f96 c 603 72 +FUNC 6fa2 23 0 std::vector >::begin() +6fa2 c 333 16 +6fae 17 334 71 +6fc5 1 334 71 +FUNC 6fc6 26 0 std::vector >::end() +6fc6 c 351 16 +6fd2 1a 352 71 +6ff8 5 666 72 +6ffd 1 666 72 +6ffe c 608 72 +700a 14 609 72 +702a 5 666 72 +702f 1 666 72 +FUNC 7030 35 0 bool __gnu_cxx::operator!= > >(__gnu_cxx::__normal_iterator > > const&, __gnu_cxx::__normal_iterator > > const&) +7030 d 693 16 +703d 28 694 72 +7065 1 694 72 +7066 c 603 72 +7072 c 603 72 +708a 27 629 72 +70b1 1 629 72 +70b2 c 84 70 +70be 1f 85 70 +70dd 1 85 70 +FUNC 70de 32 0 std::pair, __gnu_cxx::hash, std::equal_to, std::allocator > >*> std::make_pair, __gnu_cxx::hash, std::equal_to, std::allocator > >*>(std::string, __gnu_cxx::hash_map, __gnu_cxx::hash, std::equal_to, std::allocator > >*) +70de 10 144 16 +70ee 22 145 70 +711c a 190 34 +7132 d 194 34 +713f 1 194 34 +7140 c 84 70 +714c 17 85 70 +7163 1 85 70 +FUNC 7164 2d 0 std::pair std::make_pair(char const*, unsigned long) +7164 c 144 16 +7170 21 145 70 +7191 1 145 70 +7192 c 84 70 +719e 1d 85 70 +71bb 1 85 70 +FUNC 71bc 30 0 std::pair > std::make_pair >(char*, std::pair) +71bc 10 144 16 +71cc 20 145 70 +71ec c 89 70 +71f8 20 90 70 +7218 d 89 70 +7225 70 90 70 +7295 1 90 70 +FUNC 7296 12 0 std::iterator_traits::iterator_category std::__iterator_category(unsigned long const* const&) +7296 c 164 17 +72a2 6 165 17 +FUNC 72a8 1d 0 std::iterator_traits::difference_type std::__distance(unsigned long const*, unsigned long const*, std::random_access_iterator_tag) +72a8 c 92 18 +72b4 11 97 18 +72c5 1 97 18 +FUNC 72c6 33 0 std::iterator_traits::difference_type std::distance(unsigned long const*, unsigned long const*) +72c6 c 114 18 +72d2 27 118 18 +72f9 1 118 18 +FUNC 72fa 20 0 void std::__advance(unsigned long const*&, int, std::random_access_iterator_tag) +72fa c 150 18 +7306 14 155 18 +FUNC 731a 33 0 void std::advance(unsigned long const*&, int) +731a c 172 18 +7326 27 175 18 +734d 1 175 18 +FUNC 734e 7a 0 unsigned long const* std::lower_bound(unsigned long const*, unsigned long const*, unsigned long const&) +734e c 2625 19 +735a 15 2642 19 +736f 2 2646 19 +7371 8 2648 19 +7379 6 2649 19 +737f 12 2650 19 +7391 e 2651 19 +739f 6 2653 19 +73a5 4 2654 19 +73a9 e 2655 19 +73b7 6 2658 19 +73bd 6 2646 19 +73c3 5 2660 19 +73db b 227 34 +73e6 e 228 34 +73f4 1c 229 34 +7410 20 230 34 +7430 6 231 34 +7436 c 72 68 +7442 2 72 68 +7444 c 105 69 +7450 d 105 69 +745d 1 105 69 +745e c 105 69 +746a d 105 69 +7477 1 105 69 +7478 c 80 71 +7484 d 80 71 +7491 1 80 71 +7492 c 67 68 +749e 2 67 68 +74a0 c 99 69 +74ac 14 100 69 +FUNC 74c0 2b 0 std::_Vector_base >::get_allocator() const +74c0 10 93 19 +74d0 1b 94 71 +74eb 1 94 71 +74ec c 238 40 +74f8 a 239 40 +FUNC 7502 26 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::begin() const +7502 c 585 19 +750e 1a 588 40 +FUNC 7528 19 0 std::map, std::allocator > >::begin() const +7528 c 243 20 +7534 d 244 45 +7541 1 244 45 +FUNC 7542 26 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::end() const +7542 c 596 20 +754e 1a 597 40 +FUNC 7568 19 0 std::map, std::allocator > >::end() const +7568 c 260 20 +7574 d 261 45 +7581 1 261 45 +7582 c 65 68 +758e 2 65 68 +7590 c 72 68 +759c 2 72 68 +759e c 97 69 +75aa d 97 69 +75b7 1 97 69 +75b8 c 105 69 +75c4 d 105 69 +75d1 1 105 69 +75d2 c 72 68 +75de 2 72 68 +75e0 c 105 69 +75ec d 105 69 +75f9 1 105 69 +75fa c 397 40 +7606 d 397 40 +7613 1 397 40 +7614 c 105 69 +7620 d 105 69 +762d 1 105 69 +FUNC 762e 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_right(std::_Rb_tree_node_base*) +762e c 496 20 +763a 8 497 40 +FUNC 7642 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_left(std::_Rb_tree_node_base*) +7642 c 488 20 +764e 8 489 40 +7656 c 65 68 +7662 2 65 68 +7664 c 72 68 +7670 2 72 68 +7672 c 97 69 +767e d 97 69 +768b 1 97 69 +768c c 105 69 +7698 d 105 69 +76a5 1 105 69 +76a6 c 72 68 +76b2 2 72 68 +76b4 c 105 69 +76c0 d 105 69 +76cd 1 105 69 +76ce c 397 40 +76da d 397 40 +76e7 1 397 40 +76e8 c 105 69 +76f4 d 105 69 +7701 1 105 69 +FUNC 7702 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_right(std::_Rb_tree_node_base*) +7702 c 496 20 +770e 8 497 40 +FUNC 7716 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_left(std::_Rb_tree_node_base*) +7716 c 488 20 +7722 8 489 40 +772a c 84 71 +7736 2f 85 71 +7765 2 86 71 +7767 1 86 71 +7768 c 80 71 +7774 d 80 71 +7781 1 80 71 +7782 c 96 71 +778e 12 97 71 +77a0 2 98 71 +77a2 c 84 71 +77ae 2f 85 71 +77dd 2 86 71 +77df 1 86 71 +77e0 c 80 71 +77ec d 80 71 +77f9 1 80 71 +77fa c 96 71 +7806 12 97 71 +7818 2 98 71 +7826 d 107 68 +7833 1 107 68 +FUNC 7834 2e 0 void std::_Destroy >(std::string*, std::string*, std::allocator) +7834 c 171 21 +7840 2 173 73 +7842 12 174 73 +7854 c 173 73 +7860 2 174 73 +7862 c 167 40 +786e a 168 40 +FUNC 7878 26 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::begin() +7878 c 581 21 +7884 1a 582 40 +FUNC 789e 19 0 std::map, std::allocator > >::begin() +789e c 234 21 +78aa d 235 45 +78b7 1 235 45 +FUNC 78b8 26 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::end() +78b8 c 592 21 +78c4 1a 593 40 +FUNC 78de 19 0 std::map, std::allocator > >::end() +78de c 251 21 +78ea d 252 45 +78f7 1 252 45 +78f8 c 167 40 +7904 a 168 40 +FUNC 790e 26 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::begin() +790e c 581 21 +791a 1a 582 40 +FUNC 7934 19 0 std::map, std::less, std::allocator > > >::begin() +7934 c 234 21 +7940 d 235 45 +794d 1 235 45 +FUNC 794e 26 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::end() +794e c 592 21 +795a 1a 593 40 +FUNC 7974 19 0 std::map, std::less, std::allocator > > >::end() +7974 c 251 21 +7980 d 252 45 +798d 1 252 45 +FUNC 798e 11 0 std::_Select1st, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >::operator()(std::pair, __gnu_cxx::hash, std::equal_to, std::allocator > >*>&) const +798e c 546 22 +799a 5 547 41 +799f 1 547 41 +79a0 c 128 34 +79ac 13 129 34 +79bf 1 129 34 +79cc 22 396 34 +79fa d 199 42 +7a07 1 199 42 +7a08 c 65 68 +7a14 2 65 68 +7a16 c 72 68 +7a22 2 72 68 +7a24 c 97 69 +7a30 d 97 69 +7a3d 1 97 69 +7a3e c 105 69 +7a4a d 105 69 +7a57 1 105 69 +7a58 c 65 68 +7a64 2 65 68 +7a66 c 72 68 +7a72 2 72 68 +7a74 c 105 69 +7a80 d 105 69 +7a8d 1 105 69 +7a8e c 97 69 +7a9a d 97 69 +7aa7 1 97 69 +7aa8 c 72 68 +7ab4 2 72 68 +7ab6 c 105 69 +7ac2 d 105 69 +7acf 1 105 69 +7adc d 94 68 +7ae9 1 94 68 +FUNC 7aea 2f 0 std::_Vector_base >::_M_deallocate(dwarf2reader::CompilationUnit::Abbrev*, unsigned long) +7aea c 120 23 +7af6 6 122 71 +7afc 1d 123 71 +7b19 1 123 71 +7b1a c 108 71 +7b26 43 109 71 +7b69 1 109 71 +7b6a c 65 68 +7b76 2 65 68 +7b78 c 103 69 +7b84 d 103 69 +7b91 1 103 69 +7b92 c 65 68 +7b9e 2 65 68 +7ba0 c 103 69 +7bac d 103 69 +7bb9 1 103 69 +7bc6 d 94 68 +7bd3 1 94 68 +FUNC 7bd4 2f 0 std::_Vector_base >::_M_deallocate(dwarf2reader::SourceFileInfo*, unsigned long) +7bd4 c 120 23 +7be0 6 122 71 +7be6 1d 123 71 +7c03 1 123 71 +7c04 c 108 71 +7c10 43 109 71 +7c53 1 109 71 +7c54 c 188 71 +7c60 12 189 71 +7c72 2 190 71 +7c74 c 35 32 +7c80 d 35 32 +7c8d 1 35 32 +7c9a d 107 68 +7ca7 1 107 68 +FUNC 7ca8 2e 0 void std::_Destroy >(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, std::allocator) +7ca8 c 171 23 +7cb4 2 173 73 +7cb6 12 174 73 +7cc8 c 173 73 +7cd4 2 174 73 +7cd6 d 272 71 +7ce3 8c 273 71 +7d6f 1 273 71 +7d7c d 94 68 +7d89 1 94 68 +FUNC 7d8a 2f 0 std::_Vector_base >::_M_deallocate(std::string*, unsigned long) +7d8a c 120 23 +7d96 6 122 71 +7d9c 1d 123 71 +7db9 1 123 71 +7dba c 108 71 +7dc6 3d 109 71 +7e03 1 109 71 +7e04 c 188 71 +7e10 12 189 71 +7e22 2 190 71 +7e24 d 272 71 +7e31 8c 273 71 +7ebd 1 273 71 +7eca 2b 596 34 +7ef5 1 596 34 +7f02 7 614 72 +7f09 1 614 72 +7f0a c 65 68 +7f16 2 65 68 +7f18 c 72 68 +7f24 2 72 68 +7f26 c 103 69 +7f32 d 103 69 +7f3f 1 103 69 +7f40 c 105 69 +7f4c d 105 69 +7f59 1 105 69 +7f5a c 65 68 +7f66 2 65 68 +7f68 c 72 68 +7f74 2 72 68 +7f76 c 103 69 +7f82 d 103 69 +7f8f 1 103 69 +7f90 c 105 69 +7f9c d 105 69 +7fa9 1 105 69 +7faa c 105 69 +7fb6 d 105 69 +7fc3 1 105 69 +7fd0 d 575 34 +7fdd 1 575 34 +7fea d 575 34 +7ff7 1 575 34 +FUNC 7ff8 11 0 std::_Select1st, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >::operator()(std::pair, __gnu_cxx::hash, std::equal_to, std::allocator > >*> const&) const +7ff8 c 550 23 +8004 5 551 41 +8009 1 551 41 +8016 2f 600 34 +8045 1 600 34 +8046 c 84 70 +8052 1e 85 70 +FUNC 8070 11 0 std::_Select1st > >::operator()(std::pair >&) const +8070 c 546 23 +807c 5 547 41 +8081 1 547 41 +FUNC 8082 11 0 std::_Select1st > >::operator()(std::pair > const&) const +8082 c 550 23 +808e 5 551 41 +8093 1 551 41 +8094 c 128 34 +80a0 13 129 34 +80b3 1 129 34 +80b4 c 84 70 +80c0 1e 85 70 +80de c 65 68 +80ea 2 65 68 +80ec c 103 69 +80f8 d 103 69 +8105 1 103 69 +8106 c 65 68 +8112 2 65 68 +8114 c 72 68 +8120 2 72 68 +8122 c 105 69 +812e d 105 69 +813b 1 105 69 +813c c 103 69 +8148 d 103 69 +8155 1 103 69 +8156 c 105 69 +8162 d 105 69 +816f 1 105 69 +8170 c 80 71 +817c d 80 71 +8189 1 80 71 +818a c 67 68 +8196 2 67 68 +8198 c 99 69 +81a4 14 100 69 +FUNC 81b8 2b 0 std::_Vector_base<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::get_allocator() const +81b8 10 93 23 +81c8 1b 94 71 +81e3 1 94 71 +81e4 c 99 69 +81f0 14 100 69 +8210 2 107 68 +FUNC 8212 2e 0 void std::_Destroy<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>) +8212 c 171 23 +821e 2 173 73 +8220 12 174 73 +8232 c 173 73 +823e 2 174 73 +824c d 107 68 +8259 1 107 68 +825a c 67 68 +8266 2 67 68 +8268 c 99 69 +8274 14 100 69 +8288 c 403 40 +8294 1c 404 40 +82b0 a 406 40 +82ba a 407 40 +82c4 c 408 40 +82d0 e 409 40 +82de c 553 40 +82ea 36 554 40 +8320 2 555 40 +8322 c 103 69 +832e d 103 69 +833b 1 103 69 +FUNC 833c 2b 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::get_allocator() const +833c 10 350 23 +834c 1b 351 40 +8367 1 351 40 +8368 c 69 70 +8374 2 69 70 +8382 d 107 68 +838f 1 107 68 +839c d 94 68 +83a9 1 94 68 +FUNC 83aa 2a 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_put_node(std::_Rb_tree_node >*) +83aa c 359 23 +83b6 1e 360 40 +FUNC 83d4 59 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::destroy_node(std::_Rb_tree_node >*) +83d4 d 387 23 +83e1 35 389 40 +8416 17 390 40 +842d 1 390 40 +FUNC 842e 56 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_erase(std::_Rb_tree_node >*) +842e c 1051 23 +843a 2 1054 40 +843c 1a 1056 40 +8456 e 1057 40 +8464 12 1058 40 +8476 6 1059 40 +847c 6 1054 40 +8482 2 1059 40 +8484 d 569 40 +8491 58 570 40 +84e9 1 570 40 +84ea c 147 45 +84f6 31 148 45 +8527 1 148 45 +8528 c 92 45 +8534 d 92 45 +8541 1 92 45 +8542 c 67 68 +854e 2 67 68 +8550 c 99 69 +855c 14 100 69 +8570 c 403 40 +857c 1c 404 40 +8598 a 406 40 +85a2 a 407 40 +85ac c 408 40 +85b8 e 409 40 +85c6 c 553 40 +85d2 36 554 40 +8608 2 555 40 +860a c 103 69 +8616 d 103 69 +8623 1 103 69 +FUNC 8624 2b 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::get_allocator() const +8624 10 350 23 +8634 1b 351 40 +864f 1 351 40 +8650 c 69 70 +865c d 69 70 +8669 1 69 70 +866a c 69 70 +8676 30 69 70 +86b2 d 107 68 +86bf 1 107 68 +86cc d 94 68 +86d9 1 94 68 +FUNC 86da 2a 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_put_node(std::_Rb_tree_node > >*) +86da c 359 23 +86e6 1e 360 40 +FUNC 8704 59 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::destroy_node(std::_Rb_tree_node > >*) +8704 d 387 23 +8711 35 389 40 +8746 17 390 40 +875d 1 390 40 +FUNC 875e 56 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_erase(std::_Rb_tree_node > >*) +875e c 1051 23 +876a 2 1054 40 +876c 1a 1056 40 +8786 e 1057 40 +8794 12 1058 40 +87a6 6 1059 40 +87ac 6 1054 40 +87b2 2 1059 40 +87b4 d 569 40 +87c1 58 570 40 +8819 1 570 40 +881a c 147 45 +8826 31 148 45 +8857 1 148 45 +8858 c 92 45 +8864 d 92 45 +8871 1 92 45 +8872 c 603 72 +887e c 603 72 +FUNC 888a 23 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::begin() +888a c 333 23 +8896 17 334 71 +88ad 1 334 71 +88ba 2a 654 72 +FUNC 88e4 42 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::operator[](unsigned long) +88e4 c 494 23 +88f0 36 495 71 +FUNC 8926 26 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::end() +8926 c 351 23 +8932 1a 352 71 +FUNC 894c 28 0 bool std::operator==, std::allocator >(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&) +894c c 2115 24 +8958 1c 2116 37 +FUNC 8974 23 0 std::equal_to::operator()(std::string const&, std::string const&) const +8974 c 199 24 +8980 17 200 41 +8997 1 200 41 +8998 c 80 71 +89a4 d 80 71 +89b1 1 80 71 +89b2 c 67 68 +89be 2 67 68 +89c0 c 99 69 +89cc 14 100 69 +FUNC 89e0 2b 0 std::_Vector_base<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::get_allocator() const +89e0 10 93 24 +89f0 1b 94 71 +8a0b 1 94 71 +8a0c c 99 69 +8a18 14 100 69 +8a2c c 84 71 +8a38 2f 85 71 +8a67 2 86 71 +8a69 1 86 71 +8a6a c 96 71 +8a76 12 97 71 +8a88 2 98 71 +8a96 2 107 68 +FUNC 8a98 2e 0 void std::_Destroy<__gnu_cxx::_Hashtable_node > >**, std::allocator<__gnu_cxx::_Hashtable_node > >*> >(__gnu_cxx::_Hashtable_node > >**, __gnu_cxx::_Hashtable_node > >**, std::allocator<__gnu_cxx::_Hashtable_node > >*>) +8a98 c 171 24 +8aa4 2 173 73 +8aa6 12 174 73 +8ab8 c 173 73 +8ac4 2 174 73 +FUNC 8ac6 13 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::max_size() const +8ac6 c 407 24 +8ad2 7 408 71 +8ad9 1 408 71 +8ada c 603 72 +8ae6 c 603 72 +FUNC 8af2 26 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::end() +8af2 c 351 24 +8afe 1a 352 71 +FUNC 8b18 23 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::begin() +8b18 c 333 24 +8b24 17 334 71 +8b3b 1 334 71 +8b48 2a 654 72 +8b7e 7 614 72 +8b85 1 614 72 +FUNC 8b86 42 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::operator[](unsigned long) +8b86 c 494 24 +8b92 36 495 71 +8bd4 d 107 68 +8be1 1 107 68 +FUNC 8be2 28 0 void std::swap<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**>(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**&, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**&) +8be2 c 92 25 +8bee 8 97 61 +8bf6 a 98 61 +8c00 a 99 61 +FUNC 8c0a 50 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::swap(std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >&) +8c0a c 733 25 +8c16 12 735 71 +8c28 18 736 71 +8c40 1a 737 71 +8c66 2b 596 34 +8c91 1 596 34 +8c9e 2f 600 34 +8ccd 1 600 34 +FUNC 8cce 28 0 void std::swap<__gnu_cxx::_Hashtable_node > >**>(__gnu_cxx::_Hashtable_node > >**&, __gnu_cxx::_Hashtable_node > >**&) +8cce c 92 25 +8cda 8 97 61 +8ce2 a 98 61 +8cec a 99 61 +FUNC 8cf6 50 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::swap(std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >&) +8cf6 c 733 25 +8d02 12 735 71 +8d14 18 736 71 +8d2c 1a 737 71 +8d46 c 84 71 +8d52 2f 85 71 +8d81 2 86 71 +8d83 1 86 71 +8d84 c 96 71 +8d90 12 97 71 +8da2 2 98 71 +FUNC 8da4 13 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::max_size() const +8da4 c 407 25 +8db0 7 408 71 +8db7 1 408 71 +8dc4 d 94 68 +8dd1 1 94 68 +FUNC 8dd2 2f 0 std::_Vector_base<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::_M_deallocate(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long) +8dd2 c 120 25 +8dde 6 122 71 +8de4 1d 123 71 +8e01 1 123 71 +8e02 c 108 71 +8e0e 3d 109 71 +8e4b 1 109 71 +8e4c c 272 71 +8e58 4b 273 71 +8ea3 1 273 71 +8ea4 c 188 71 +8eb0 12 189 71 +8ec2 2 190 71 +8ec4 c 603 72 +8ed0 c 603 72 +FUNC 8edc 2b 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::begin() const +8edc c 342 25 +8ee8 1f 343 71 +8f07 1 343 71 +FUNC 8f08 2c 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::end() const +8f08 c 360 25 +8f14 20 361 71 +8f40 5 666 72 +8f45 1 666 72 +8f53 2b 759 72 +FUNC 8f7e 3c 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::size() const +8f7e c 402 25 +8f8a 30 403 71 +8fc6 26 588 34 +8ff8 15 511 34 +900d 79 513 34 +9086 21 517 34 +90a7 1 517 34 +90b4 14 225 42 +90d4 26 592 34 +FUNC 90fa 49 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::capacity() const +90fa c 449 25 +9106 3d 451 71 +9143 1 451 71 +9144 c 103 69 +9150 d 103 69 +915d 1 103 69 +916e 1b 286 34 +9189 1 286 34 +9196 d 94 68 +91a3 1 94 68 +91b0 1e 301 34 +91db 56 622 34 +9231 17 623 34 +9254 9 1080 34 +925d 1a 1082 34 +9277 2 1083 34 +9279 8 1085 34 +9281 12 1086 34 +9293 6 1087 34 +9299 6 1083 34 +929f 1b 1089 34 +92ba 1d 1080 34 +92d7 c 1091 34 +92e3 1 1091 34 +92e4 d 360 34 +92f1 77 361 34 +9368 c 93 42 +9374 d 93 42 +9381 1 93 42 +9382 c 72 68 +938e 2 72 68 +9390 c 105 69 +939c d 105 69 +93a9 1 105 69 +93aa c 301 66 +93b6 d 301 66 +93c3 1 301 66 +93d0 d 94 68 +93dd 1 94 68 +FUNC 93de 2f 0 std::_Vector_base<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::_M_deallocate(__gnu_cxx::_Hashtable_node > >**, unsigned long) +93de c 120 26 +93ea 6 122 71 +93f0 1d 123 71 +940d 1 123 71 +940e c 108 71 +941a 3d 109 71 +9457 1 109 71 +9458 c 188 71 +9464 12 189 71 +9476 2 190 71 +9478 c 272 71 +9484 4b 273 71 +94cf 1 273 71 +94d0 c 603 72 +94dc c 603 72 +FUNC 94e8 2b 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::begin() const +94e8 c 342 26 +94f4 1f 343 71 +9513 1 343 71 +FUNC 9514 2c 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::end() const +9514 c 360 26 +9520 20 361 71 +954c 2d 662 72 +9579 1 662 72 +FUNC 957a 2d 0 unsigned long const& std::max(unsigned long const&, unsigned long const&) +957a c 206 26 +9586 e 211 61 +9594 8 212 61 +959c b 213 61 +95a7 1 213 61 +95b4 19 650 72 +95cd 1 650 72 +95da 5 666 72 +95df 1 666 72 +95ed 2b 759 72 +9624 5 666 72 +9629 1 666 72 +9637 2b 759 72 +FUNC 9662 49 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::capacity() const +9662 c 449 26 +966e 3d 451 71 +96ab 1 451 71 +FUNC 96ac 3c 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::size() const +96ac c 402 26 +96b8 30 403 71 +96f4 26 588 34 +9726 26 592 34 +974c c 103 69 +9758 d 103 69 +9765 1 103 69 +9776 1b 286 34 +9791 1 286 34 +979e d 94 68 +97ab 1 94 68 +97b8 1e 301 34 +97e3 56 622 34 +9839 17 623 34 +985c 9 1080 34 +9865 1a 1082 34 +987f 2 1083 34 +9881 8 1085 34 +9889 12 1086 34 +989b 6 1087 34 +98a1 6 1083 34 +98a7 1b 1089 34 +98c2 1d 1080 34 +98df c 1091 34 +98eb 1 1091 34 +98ec d 360 34 +98f9 77 361 34 +9970 c 69 70 +997c 20 69 70 +99a9 5c 104 68 +9a05 1 104 68 +9a06 c 69 70 +9a12 2c 69 70 +9a4b 5c 104 68 +9aa7 1 104 68 +9ab4 2d 662 72 +9ae1 1 662 72 +9aee 19 650 72 +9b07 1 650 72 +9b14 5 666 72 +9b19 1 666 72 +9b27 2b 759 72 +9b52 c 72 68 +9b5e 2 72 68 +9b60 c 105 69 +9b6c d 105 69 +9b79 1 105 69 +9b7a c 69 70 +9b86 2 69 70 +9b94 d 107 68 +9ba1 1 107 68 +9bae d 94 68 +9bbb 1 94 68 +FUNC 9bbc 2a 0 std::_List_base, std::allocator > >::_M_put_node(std::_List_node >*) +9bbc c 315 26 +9bc8 1e 316 66 +FUNC 9be6 35 0 bool __gnu_cxx::operator!=<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > > const&, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > > const&) +9be6 d 699 26 +9bf3 28 700 72 +9c1b 1 700 72 +9c28 d 623 72 +9c35 5 624 72 +FUNC 9c3a 4b 0 void std::__fill::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::_Hashtable_node > >* const&) +9c3a c 539 61 +9c46 8 541 61 +9c4e 2 542 61 +9c50 12 543 61 +9c62 21 542 61 +9c83 2 543 61 +9c85 1 543 61 +FUNC 9c86 2b 0 void std::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::_Hashtable_node > >* const&) +9c86 c 560 26 +9c92 4 567 61 +9c96 1b 568 61 +9cb1 1 568 61 +FUNC 9cb2 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, std::allocator<__gnu_cxx::_Hashtable_node > >*> >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, std::allocator<__gnu_cxx::_Hashtable_node > >*>) +9cb2 c 171 26 +9cbe 2 173 73 +9cc0 1a 174 73 +9cda 21 173 73 +9cfb 2 174 73 +9cfd 1 174 73 +9d0a 7 98 68 +9d11 1 98 68 +9d1e 1d 85 68 +9d3b 5 86 68 +9d40 16 88 68 +9d62 1d 297 34 +9d7f 1 297 34 +9d8d e 605 34 +9d9b 9 606 34 +9da4 3c 609 34 +9de0 b 610 34 +9deb 11 609 34 +9dfc b 612 34 +9e07 12 614 34 +9e19 b 615 34 +9e24 13 612 34 +9e37 8 615 34 +9e3f 1 615 34 +9e4d 15 751 34 +9e62 1a 752 34 +9e7c b 754 34 +9e87 49 755 34 +9ed0 3b 756 34 +9f0b 12 754 34 +9f1d 15 758 34 +9f32 8 759 34 +9f3a 1c 760 34 +9f56 f 761 34 +9f65 41 762 34 +9fb2 7 98 68 +9fb9 1 98 68 +9fc6 1d 85 68 +9fe3 5 86 68 +9fe8 17 88 68 +9fff 1 88 68 +a00c 1d 297 34 +a029 1 297 34 +a037 e 605 34 +a045 9 606 34 +a04e 3c 609 34 +a08a b 610 34 +a095 11 609 34 +a0a6 b 612 34 +a0b1 12 614 34 +a0c3 b 615 34 +a0ce 13 612 34 +a0e1 8 615 34 +a0e9 1 615 34 +a0f7 15 751 34 +a10c 1a 752 34 +a126 b 754 34 +a131 49 755 34 +a17a 3b 756 34 +a1b5 12 754 34 +a1c7 15 758 34 +a1dc 8 759 34 +a1e4 1c 760 34 +a200 f 761 34 +a20f 41 762 34 +FUNC a250 35 0 bool __gnu_cxx::operator!=<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > > const&, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > > const&) +a250 d 699 26 +a25d 28 700 72 +a285 1 700 72 +a292 d 623 72 +a29f 5 624 72 +FUNC a2a4 4b 0 void std::__fill::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +a2a4 c 539 61 +a2b0 8 541 61 +a2b8 2 542 61 +a2ba 12 543 61 +a2cc 21 542 61 +a2ed 2 543 61 +a2ef 1 543 61 +FUNC a2f0 2b 0 void std::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +a2f0 c 560 26 +a2fc 4 567 61 +a300 1b 568 61 +a31b 1 568 61 +FUNC a31c 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>) +a31c c 171 26 +a328 2 173 73 +a32a 1a 174 73 +a344 21 173 73 +a365 2 174 73 +a367 1 174 73 +a368 c 65 68 +a374 2 65 68 +a376 c 103 69 +a382 d 103 69 +a38f 1 103 69 +FUNC a390 2b 0 std::_List_base, std::allocator > >::get_allocator() const +a390 10 322 26 +a3a0 1b 324 66 +a3bb 1 324 66 +FUNC a3bc 7b 0 std::_List_base, std::allocator > >::_M_clear() +a3bc d 69 27 +a3c9 8 72 77 +a3d1 2 73 77 +a3d3 6 75 77 +a3d9 8 76 77 +a3e1 35 77 77 +a416 12 78 77 +a428 a 73 77 +a432 5 78 77 +a437 1 78 77 +a438 c 331 66 +a444 18 332 66 +a45c c 392 66 +a468 d 392 66 +a475 1 392 66 +a476 c 211 74 +a482 10 211 74 +a49e d 107 68 +a4ab 1 107 68 +FUNC a4ac 2e 0 void std::_Destroy >(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, std::allocator) +a4ac c 171 27 +a4b8 2 173 73 +a4ba 12 174 73 +a4cc c 173 73 +a4d8 2 174 73 +a4da c 272 71 +a4e6 4b 273 71 +a531 1 273 71 +a532 13 196 74 +a545 10 196 74 +a555 2f 197 74 +a584 1a 198 74 +a59e 13 196 74 +a5b1 10 196 74 +a5c1 2f 197 74 +a5f0 1a 198 74 +a616 7 98 68 +a61d 1 98 68 +a62a 1d 85 68 +a647 5 86 68 +a64c 10 88 68 +FUNC a65c 2a 0 std::_Vector_base<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::_M_allocate(unsigned long) +a65c c 116 27 +a668 1e 117 71 +a686 d 100 71 +a693 12 101 71 +a6a5 19 103 71 +a6be b 104 71 +a6c9 3a 105 71 +a703 1 105 71 +a710 7 98 68 +a717 1 98 68 +a724 1d 85 68 +a741 5 86 68 +a746 10 88 68 +FUNC a756 2a 0 std::_Vector_base<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::_M_allocate(unsigned long) +a756 c 116 27 +a762 1e 117 71 +a780 d 100 71 +a78d 12 101 71 +a79f 19 103 71 +a7b8 b 104 71 +a7c3 3a 105 71 +a7fd 1 105 71 +a80b 12 424 61 +a81d 2e 425 61 +a84b 13 426 61 +a86a 4 440 61 +a86e 1b 443 61 +a889 1 443 61 +a898 56 482 61 +a8fa 4 514 61 +a8fe 4 515 61 +a902 1b 517 61 +a91d 1 517 61 +a92a 8 616 61 +a932 2 617 61 +a934 8 618 61 +a93c f 617 61 +a94b 5 619 61 +a95c 4 641 61 +a960 1b 642 61 +a97b 1 642 61 +FUNC a97c 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&, __true_type) +a97c c 182 28 +a988 1b 183 79 +a9a3 1 183 79 +FUNC a9a4 2f 0 void std::uninitialized_fill_n<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +a9a4 c 214 28 +a9b0 23 218 79 +a9d3 1 218 79 +FUNC a9d4 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>) +a9d4 c 308 28 +a9e0 1b 310 79 +a9fb 1 310 79 +a9fc c 200 71 +aa08 19 201 71 +aa21 42 203 71 +aa63 15 205 71 +aa85 11 992 34 +aa96 c 993 34 +aaa2 15 995 34 +aab7 c 996 34 +aac3 4a 998 34 +ab0d f 1001 34 +ab1c 1c 998 34 +ab38 1a 1003 34 +ab52 5 1004 34 +ab57 1f 1007 34 +ab76 1c 1008 34 +ab92 19 1009 34 +abab 19 1010 34 +abc4 1a 1011 34 +abde a 1004 34 +abe8 11 1001 34 +abf9 15 1014 34 +ac0e 13 1028 34 +ac21 b 1016 34 +ac2c 9 1018 34 +ac35 19 1023 34 +ac4e 23 1024 34 +ac71 19 1025 34 +ac8a 1d 1021 34 +aca7 1a 1018 34 +acc1 b 1028 34 +accc b 1016 34 +acd7 1e 1028 34 +acf5 1 1028 34 +ad06 16 438 34 +ad1c 37 439 34 +ad53 1 439 34 +ad64 37 212 42 +ad9b 1 212 42 +ada8 8 616 61 +adb0 2 617 61 +adb2 8 618 61 +adba f 617 61 +adc9 5 619 61 +adda 4 641 61 +adde 1b 642 61 +adf9 1 642 61 +FUNC adfa 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >* const&, __true_type) +adfa c 182 28 +ae06 1b 183 79 +ae21 1 183 79 +FUNC ae22 2f 0 void std::uninitialized_fill_n<__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >* const&) +ae22 c 214 28 +ae2e 23 218 79 +ae51 1 218 79 +FUNC ae52 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >*, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >* const&, std::allocator<__gnu_cxx::_Hashtable_node > >*>) +ae52 c 308 28 +ae5e 1b 310 79 +ae79 1 310 79 +ae7a c 200 71 +ae86 19 201 71 +ae9f 42 203 71 +aee1 15 205 71 +af03 11 992 34 +af14 c 993 34 +af20 15 995 34 +af35 c 996 34 +af41 4a 998 34 +af8b f 1001 34 +af9a 1c 998 34 +afb6 1a 1003 34 +afd0 5 1004 34 +afd5 1f 1007 34 +aff4 1c 1008 34 +b010 19 1009 34 +b029 19 1010 34 +b042 1a 1011 34 +b05c a 1004 34 +b066 11 1001 34 +b077 15 1014 34 +b08c 13 1028 34 +b09f b 1016 34 +b0aa 9 1018 34 +b0b3 19 1023 34 +b0cc 23 1024 34 +b0ef 19 1025 34 +b108 1d 1021 34 +b125 1a 1018 34 +b13f b 1028 34 +b14a b 1016 34 +b155 1e 1028 34 +b173 1 1028 34 +b184 16 438 34 +b19a 37 439 34 +b1d1 1 439 34 +b1e2 37 212 42 +b219 1 212 42 +b227 12 424 61 +b239 2e 425 61 +b267 13 426 61 +b286 4 440 61 +b28a 1b 443 61 +b2a5 1 443 61 +b2b4 56 482 61 +b316 4 514 61 +b31a 4 515 61 +b31e 1b 517 61 +b339 1 517 61 +b346 8 616 61 +b34e 2 617 61 +b350 12 618 61 +b362 16 617 61 +b378 5 619 61 +b37d 1 619 61 +b38a 4 641 61 +b38e 1b 642 61 +b3a9 1 642 61 +FUNC b3aa 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >* const&, __true_type) +b3aa c 182 28 +b3b6 1b 183 79 +b3d1 1 183 79 +FUNC b3d2 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >* const&) +b3d2 c 214 28 +b3de 23 218 79 +b401 1 218 79 +FUNC b402 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >*, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >* const&, std::allocator<__gnu_cxx::_Hashtable_node > >*>) +b402 c 308 28 +b40e 1b 310 79 +b429 1 310 79 +b436 8 616 61 +b43e 2 617 61 +b440 12 618 61 +b452 16 617 61 +b468 5 619 61 +b46d 1 619 61 +b47a 4 641 61 +b47e 1b 642 61 +b499 1 642 61 +FUNC b49a 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&, __true_type) +b49a c 182 28 +b4a6 1b 183 79 +b4c1 1 183 79 +FUNC b4c2 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +b4c2 c 214 28 +b4ce 23 218 79 +b4f1 1 218 79 +FUNC b4f2 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>) +b4f2 c 308 28 +b4fe 1b 310 79 +b519 1 310 79 +b526 22 300 61 +b548 11 301 61 +b559 1 301 61 +b566 4 315 61 +b56a 1b 317 61 +b585 1 317 61 +b592 1b 326 61 +b5ad 1 326 61 +b5ba 4 384 61 +b5be 4 385 61 +b5c2 1b 387 61 +b5dd 1 387 61 +b5ea 1b 74 79 +b605 1 74 79 +b612 23 113 79 +b635 1 113 79 +b642 1b 254 79 +b65d 1 254 79 +b66a 15 763 71 +b67f 40 766 71 +b6bf 3 768 71 +b6c2 2 773 71 +FUNC b6c4 124 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::reserve(unsigned long) +b6c4 13 69 29 +b6d7 15 71 78 +b6ec e 72 78 +b6fa 19 73 78 +b713 e 75 78 +b721 28 78 78 +b749 3e 79 78 +b787 30 81 78 +b7b7 8 84 78 +b7bf 11 85 78 +b7d0 18 86 78 +b7f5 33 335 61 +b834 4 384 61 +b838 4 385 61 +b83c 1b 387 61 +b857 1 387 61 +b864 1b 74 79 +b87f 1 74 79 +b88c 23 113 79 +b8af 1 113 79 +b8bc 1b 254 79 +b8d7 1 254 79 +b8e6 56 354 61 +b948 4 384 61 +b94c 4 385 61 +b950 1b 387 61 +b96b 1 387 61 +b978 1b 74 79 +b993 1 74 79 +b9a0 23 113 79 +b9c3 1 113 79 +b9d0 1b 254 79 +b9eb 1 254 79 +FUNC b9ec 46e 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::_M_fill_insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >* const&) +b9ec 14 311 29 +ba00 b 313 78 +ba0b 24 315 78 +ba2f 8 318 78 +ba37 23 319 78 +ba5a 15 320 78 +ba6f c 321 78 +ba7b 51 323 78 +bacc 14 327 78 +bae0 30 328 78 +bb10 35 330 78 +bb45 48 334 78 +bb8d 17 338 78 +bba4 43 339 78 +bbe7 14 342 78 +bbfb 1e 343 78 +bc19 e 348 78 +bc27 1e 349 78 +bc45 e 350 78 +bc53 1d 353 78 +bc70 8 354 78 +bc78 e 355 78 +bc86 27 357 78 +bcad 6 358 78 +bcb3 4d 361 78 +bd00 40 365 78 +bd40 18 367 78 +bd58 4d 368 78 +bda5 3e 379 78 +bde3 30 381 78 +be13 12 384 78 +be25 13 385 78 +be38 22 386 78 +FUNC be5a 2e 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >* const&) +be5a c 657 29 +be66 22 658 71 +be94 15 580 34 +bea9 15 581 34 +bebe 37 582 34 +bef5 c 583 34 +bf01 1 583 34 +bf02 d 335 34 +bf0f 4e 337 34 +bf5d 4d 338 34 +bfaa d 134 42 +bfb7 65 135 42 +c028 22 300 61 +c04a 11 301 61 +c05b 1 301 61 +c068 4 315 61 +c06c 1b 317 61 +c087 1 317 61 +c094 1b 326 61 +c0af 1 326 61 +c0bc 4 384 61 +c0c0 4 385 61 +c0c4 1b 387 61 +c0df 1 387 61 +c0ec 1b 74 79 +c107 1 74 79 +c114 23 113 79 +c137 1 113 79 +c144 1b 254 79 +c15f 1 254 79 +c16c 15 763 71 +c181 40 766 71 +c1c1 3 768 71 +c1c4 2 773 71 +FUNC c1c6 124 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::reserve(unsigned long) +c1c6 13 69 29 +c1d9 15 71 78 +c1ee e 72 78 +c1fc 19 73 78 +c215 e 75 78 +c223 28 78 78 +c24b 3e 79 78 +c289 30 81 78 +c2b9 8 84 78 +c2c1 11 85 78 +c2d2 18 86 78 +c2f7 33 335 61 +c336 4 384 61 +c33a 4 385 61 +c33e 1b 387 61 +c359 1 387 61 +c366 1b 74 79 +c381 1 74 79 +c38e 23 113 79 +c3b1 1 113 79 +c3be 1b 254 79 +c3d9 1 254 79 +c3e8 56 354 61 +c44a 4 384 61 +c44e 4 385 61 +c452 1b 387 61 +c46d 1 387 61 +c47a 1b 74 79 +c495 1 74 79 +c4a2 23 113 79 +c4c5 1 113 79 +c4d2 1b 254 79 +c4ed 1 254 79 +FUNC c4ee 46e 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::_M_fill_insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +c4ee 14 311 29 +c502 b 313 78 +c50d 24 315 78 +c531 8 318 78 +c539 23 319 78 +c55c 15 320 78 +c571 c 321 78 +c57d 51 323 78 +c5ce 14 327 78 +c5e2 30 328 78 +c612 35 330 78 +c647 48 334 78 +c68f 17 338 78 +c6a6 43 339 78 +c6e9 14 342 78 +c6fd 1e 343 78 +c71b e 348 78 +c729 1e 349 78 +c747 e 350 78 +c755 1d 353 78 +c772 8 354 78 +c77a e 355 78 +c788 27 357 78 +c7af 6 358 78 +c7b5 4d 361 78 +c802 40 365 78 +c842 18 367 78 +c85a 4d 368 78 +c8a7 3e 379 78 +c8e5 30 381 78 +c915 12 384 78 +c927 13 385 78 +c93a 22 386 78 +FUNC c95c 2e 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +c95c c 657 29 +c968 22 658 71 +c996 15 580 34 +c9ab 15 581 34 +c9c0 37 582 34 +c9f7 c 583 34 +ca03 1 583 34 +ca04 d 335 34 +ca11 4e 337 34 +ca5f 4d 338 34 +caac d 134 42 +cab9 65 135 42 +FUNC cb1e 44 0 dwarf2reader::CUFunctionInfoHandler::StartCompilationUnit(unsigned long long, unsigned char, unsigned char, unsigned long long, unsigned char) +cb1e 39 135 42 +cb57 5 102 30 +cb5c 6 103 30 +FUNC cb62 41 0 dwarf2reader::CUFunctionInfoHandler::ProcessAttributeString(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, std::string const&) +cb62 18 136 30 +cb7a 10 137 30 +cb8a 17 138 30 +cba1 2 139 30 +cba3 1 139 30 +FUNC cba4 2a5 0 dwarf2reader::CUFunctionInfoHandler::ProcessAttributeUnsigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, unsigned long long) +cba4 2d 144 30 +cbd1 a 145 30 +cbdb 58 146 30 +cc33 35 147 30 +cc68 32 146 30 +cc9a 2a 147 30 +ccc4 82 152 30 +cd46 18 153 30 +cd5e 1c 152 30 +cd7a 2f 153 30 +cda9 e 154 30 +cdb7 28 155 30 +cddf 12 157 30 +cdf1 2 158 30 +cdf3 12 160 30 +ce05 2 161 30 +ce07 c 163 30 +ce13 2 164 30 +ce15 2c 166 30 +ce41 8 172 30 +ce49 1 172 30 +FUNC ce4a 19c 0 dwarf2reader::CULineInfoHandler::AddLine(unsigned long long, unsigned int, unsigned int, unsigned int) +ce4a 20 84 30 +ce6a 1c 85 30 +ce86 9c 87 30 +cf22 4f 89 30 +cf71 19 87 30 +cf8a 25 90 30 +cfaf 30 93 30 +cfdf 7 95 30 +FUNC cfe6 9f 0 dwarf2reader::CUFunctionInfoHandler::EndDIE(unsigned long long) +cfe6 19 174 30 +cfff 1c 175 30 +d01b 65 177 30 +d080 5 178 30 +d085 1 178 30 +FUNC d086 164 0 dwarf2reader::CUFunctionInfoHandler::StartDIE(unsigned long long, dwarf2reader::DwarfTag, std::list, std::allocator > > const&) +d086 20 111 30 +d0a6 1c 112 30 +d0c2 c 126 30 +d0ce 23 115 30 +d0f1 26 116 30 +d117 1a 117 30 +d131 d 118 30 +d13e 1b 119 30 +d159 5f 120 30 +d1b8 c 124 30 +d1c4 1c 115 30 +d1e0 3 126 30 +d1e3 7 129 30 +FUNC d1ea 73 0 dwarf2reader::CULineInfoHandler::DefineDir(std::string const&, unsigned int) +d1ea 13 52 30 +d1fd 45 54 30 +d242 15 55 30 +d257 6 56 30 +d25d 1 56 30 +FUNC d25e 23b 0 dwarf2reader::CULineInfoHandler::DefineFile(std::string const&, int, unsigned int, unsigned long long, unsigned long long) +d25e 2c 60 30 +d28a 45 62 30 +d2cf 2f 65 30 +d2fe 24 66 30 +d322 b 68 30 +d32d e 69 30 +d33b 19 71 30 +d354 17 72 30 +d36b 93 74 30 +d3fe 64 77 30 +d462 30 79 30 +d492 7 81 30 +d499 1 81 30 +d49a 14 38 30 +d4ae 36 40 30 +d4e4 41 43 30 +d525 41 44 30 +d566 67 45 30 +d5cd 10 46 30 +d5dd 13 45 30 +d5f0 15 47 30 +d605 e 48 30 +d613 3d 49 30 +d650 20 50 30 +d670 14 38 30 +d684 36 40 30 +d6ba 41 43 30 +d6fb 41 44 30 +d73c 67 45 30 +d7a3 10 46 30 +d7b3 13 45 30 +d7c6 15 47 30 +d7db e 48 30 +d7e9 3d 49 30 +d826 20 50 30 +d846 12 125 74 +d858 12 125 74 +d86a 13 55 32 +d87d 35 55 32 +d8b2 13 98 32 +d8c5 35 98 32 +d8fa c 35 32 +d906 d 35 32 +d913 1 35 32 +d914 d 22 32 +d921 40 22 32 +d961 1 22 32 +d962 c 89 70 +d96e 1e 90 70 +d998 14 208 34 +d9ac c 190 67 +d9b8 a 190 67 +d9c2 c 259 67 +d9ce 21 259 67 +d9ef 1 259 67 +FUNC d9f0 13 0 std::auto_ptr::operator->() const +d9f0 c 283 35 +d9fc 7 286 67 +da03 1 286 67 +da11 5c 104 68 +da6d 1 104 68 +FUNC da6e 28 0 bool std::operator==, std::allocator >(std::basic_string, std::allocator > const&, char const*) +da6e c 2139 37 +da7a 1c 2140 37 +FUNC da96 5d 0 std::basic_string, std::allocator > std::operator+, std::allocator >(std::basic_string, std::allocator > const&, char const*) +da96 d 2081 37 +daa3 12 2083 37 +dab5 1a 2084 37 +dacf 24 2085 37 +daf3 1 2085 37 +FUNC daf4 5d 0 std::basic_string, std::allocator > std::operator+, std::allocator >(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&) +daf4 d 2044 37 +db01 12 2046 37 +db13 1a 2047 37 +db2d 24 2048 37 +db51 1 2048 37 +db52 c 84 70 +db5e 17 85 70 +db75 1 85 70 +FUNC db76 2d 0 std::pair std::make_pair(char const*, unsigned int) +db76 c 144 37 +db82 21 145 70 +dba3 1 145 70 +dba4 c 84 70 +dbb0 23 85 70 +dbd3 1 85 70 +FUNC dbd4 3c 0 std::pair > std::make_pair >(unsigned long long, std::pair) +dbd4 1c 144 37 +dbf0 20 145 70 +dc10 d 89 70 +dc1d 64 90 70 +dc81 1 90 70 +dc82 c 89 70 +dc8e 2a 90 70 +dcb8 c 84 70 +dcc4 1d 85 70 +dce1 1 85 70 +FUNC dce2 3c 0 std::pair std::make_pair(unsigned long long, dwarf2reader::FunctionInfo*) +dce2 1c 144 37 +dcfe 20 145 70 +dd2a a 190 34 +dd40 d 194 34 +dd4d 1 194 34 +dd4e c 603 72 +dd5a c 603 72 +FUNC dd66 2b 0 std::vector >::begin() const +dd66 c 342 39 +dd72 1f 343 71 +dd91 1 343 71 +FUNC dd92 2c 0 std::vector >::end() const +dd92 c 360 39 +dd9e 20 361 71 +ddca 5 666 72 +ddcf 1 666 72 +dddd 2b 759 72 +FUNC de08 3c 0 std::vector >::size() const +de08 c 402 39 +de14 30 403 71 +FUNC de44 2b 0 std::vector >::begin() const +de44 c 342 39 +de50 1f 343 71 +de6f 1 343 71 +FUNC de70 2c 0 std::vector >::end() const +de70 c 360 39 +de7c 20 361 71 +dea9 31 759 72 +FUNC deda 3c 0 std::vector >::size() const +deda c 402 39 +dee6 30 403 71 +df16 c 603 72 +df22 c 603 72 +FUNC df2e 26 0 std::vector >::end() +df2e c 351 39 +df3a 1a 352 71 +df60 7 614 72 +df67 1 614 72 +FUNC df68 13 0 std::vector >::max_size() const +df68 c 407 39 +df74 7 408 71 +df7b 1 408 71 +df88 5 666 72 +df8d 1 666 72 +df9a d 623 72 +dfa7 5 624 72 +FUNC dfac 23 0 std::vector >::begin() +dfac c 333 39 +dfb8 17 334 71 +dfcf 1 334 71 +dfd0 c 35 32 +dfdc 26 35 32 +e00f 5c 104 68 +e06b 1 104 68 +e078 7 614 72 +e07f 1 614 72 +FUNC e080 35 0 dwarf2reader::SourceFileInfo::operator=(dwarf2reader::SourceFileInfo const&) +e080 c 35 39 +e08c 29 35 32 +e0b5 1 35 32 +FUNC e0b6 13 0 std::vector >::max_size() const +e0b6 c 407 39 +e0c2 7 408 71 +e0c9 1 408 71 +e0d6 d 623 72 +e0e3 5 624 72 +FUNC e0e8 3c 0 std::vector >::_M_range_check(unsigned long) const +e0e8 13 515 39 +e0fb 15 517 71 +e110 14 518 71 +FUNC e124 3c 0 std::vector >::_M_range_check(unsigned long) const +e124 13 515 39 +e137 15 517 71 +e14c 14 518 71 +e16c 2a 654 72 +FUNC e196 42 0 std::vector >::operator[](unsigned long) +e196 c 494 39 +e1a2 36 495 71 +FUNC e1d8 32 0 std::vector >::at(unsigned long) +e1d8 c 534 39 +e1e4 12 536 71 +e1f6 14 537 71 +e216 32 654 72 +FUNC e248 42 0 std::vector >::operator[](unsigned long) +e248 c 494 39 +e254 36 495 71 +FUNC e28a 32 0 std::vector >::at(unsigned long) +e28a c 534 39 +e296 12 536 71 +e2a8 14 537 71 +FUNC e2bc 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_end() +e2bc c 472 40 +e2c8 8 473 40 +FUNC e2d0 11 0 std::_Select1st > >::operator()(std::pair > const&) const +e2d0 c 550 41 +e2dc 5 551 41 +e2e1 1 551 41 +FUNC e2e2 53 0 std::less::operator()(unsigned long long const&, unsigned long long const&) const +e2e2 c 226 41 +e2ee 47 227 41 +e335 1 227 41 +FUNC e336 20 0 std::_Rb_tree_iterator > >::operator==(std::_Rb_tree_iterator > > const&) const +e336 c 209 41 +e342 14 210 40 +e356 c 84 70 +e362 18 85 70 +FUNC e37a 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_end() +e37a c 472 41 +e386 8 473 40 +FUNC e38e 11 0 std::_Select1st >::operator()(std::pair const&) const +e38e c 550 41 +e39a 5 551 41 +e39f 1 551 41 +FUNC e3a0 20 0 std::_Rb_tree_iterator >::operator==(std::_Rb_tree_iterator > const&) const +e3a0 c 209 41 +e3ac 14 210 40 +e3c0 c 84 70 +e3cc 18 85 70 +e3e4 c 180 34 +e3f0 13 181 34 +e403 1 181 34 +e410 22 409 34 +e43e d 207 42 +e44b 1 207 42 +FUNC e44c 35 0 bool __gnu_cxx::operator!= > >(__gnu_cxx::__normal_iterator > > const&, __gnu_cxx::__normal_iterator > > const&) +e44c d 699 42 +e459 28 700 72 +e481 1 700 72 +FUNC e482 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator > >, std::allocator >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, std::allocator) +e482 c 171 43 +e48e 2 173 73 +e490 1a 174 73 +e4aa 21 173 73 +e4cb 2 174 73 +e4cd 1 174 73 +FUNC e4ce 35 0 bool __gnu_cxx::operator!= > >(__gnu_cxx::__normal_iterator > > const&, __gnu_cxx::__normal_iterator > > const&) +e4ce d 699 43 +e4db 28 700 72 +e503 1 700 72 +FUNC e504 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator > >, std::allocator >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, std::allocator) +e504 c 171 43 +e510 2 173 73 +e512 1a 174 73 +e52c 21 173 73 +e54d 2 174 73 +e54f 1 174 73 +FUNC e550 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_value(std::_Rb_tree_node > > const*) +e550 c 480 43 +e55c 8 481 40 +FUNC e564 28 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_key(std::_Rb_tree_node > > const*) +e564 c 484 43 +e570 1c 485 40 +FUNC e58c 25 0 std::_Rb_tree_iterator >::operator--() +e58c c 194 43 +e598 14 196 40 +e5ac 5 197 40 +e5b1 1 197 40 +FUNC e5b2 25 0 std::_Rb_tree_iterator > >::operator--() +e5b2 c 194 43 +e5be 14 196 40 +e5d2 5 197 40 +e5d7 1 197 40 +FUNC e5d8 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_value(std::_Rb_tree_node_base const*) +e5d8 c 504 43 +e5e4 8 505 40 +FUNC e5ec 28 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_key(std::_Rb_tree_node_base const*) +e5ec c 508 43 +e5f8 1c 509 40 +FUNC e614 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_value(std::_Rb_tree_node > const*) +e614 c 480 43 +e620 8 481 40 +FUNC e628 28 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_key(std::_Rb_tree_node > const*) +e628 c 484 43 +e634 1c 485 40 +FUNC e650 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_value(std::_Rb_tree_node_base const*) +e650 c 504 43 +e65c 8 505 40 +FUNC e664 28 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_key(std::_Rb_tree_node_base const*) +e664 c 508 43 +e670 1c 509 40 +e698 7 614 72 +e69f 1 614 72 +e6ac 7 98 68 +e6b3 1 98 68 +e6c0 1d 85 68 +e6dd 5 86 68 +e6e2 10 88 68 +FUNC e6f2 2a 0 std::_Vector_base >::_M_allocate(unsigned long) +e6f2 c 116 43 +e6fe 1e 117 71 +e728 7 98 68 +e72f 1 98 68 +e73c 1d 85 68 +e759 5 86 68 +e75e 16 88 68 +FUNC e774 2a 0 std::_Vector_base >::_M_allocate(unsigned long) +e774 c 116 43 +e780 1e 117 71 +e7aa 3a 104 68 +e7f0 2a 654 72 +FUNC e81a 42 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::operator[](unsigned long) const +e81a c 509 43 +e826 36 510 71 +FUNC e85c 4e 0 std::string* std::__copy_backward::copy_b(std::string*, std::string*, std::string*) +e85c c 408 61 +e868 14 411 61 +e87c 1e 412 61 +e89a b 411 61 +e8a5 5 413 61 +FUNC e8aa 2b 0 std::string* std::__copy_backward_aux(std::string*, std::string*, std::string*) +e8aa c 432 44 +e8b6 4 440 61 +e8ba 1b 443 61 +e8d5 1 443 61 +e8e4 56 482 61 +e946 4 514 61 +e94a 4 515 61 +e94e 1b 517 61 +e969 1 517 61 +FUNC e96a 69 0 void std::_Construct(std::string*, std::string const&) +e96a d 77 44 +e977 5c 81 73 +e9d3 1 81 73 +FUNC e9d4 54 0 dwarf2reader::SourceFileInfo* std::__copy_backward::copy_b(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*) +e9d4 c 408 61 +e9e0 1a 411 61 +e9fa 1e 412 61 +ea18 b 411 61 +ea23 5 413 61 +FUNC ea28 2b 0 dwarf2reader::SourceFileInfo* std::__copy_backward_aux(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*) +ea28 c 432 44 +ea34 4 440 61 +ea38 1b 443 61 +ea53 1 443 61 +ea62 56 482 61 +eac4 4 514 61 +eac8 4 515 61 +eacc 1b 517 61 +eae7 1 517 61 +FUNC eae8 69 0 void std::_Construct(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo const&) +eae8 d 77 44 +eaf5 5c 81 73 +eb51 1 81 73 +eb52 c 69 70 +eb5e 20 69 70 +eb7e c 69 70 +eb8a 2a 69 70 +ebc1 5c 104 68 +ec1d 1 104 68 +ec2a 15 523 34 +ec3f 79 525 34 +ecb8 21 529 34 +ecd9 1 529 34 +ece6 14 229 42 +ed06 7 98 68 +ed0d 1 98 68 +ed1a 1d 85 68 +ed37 5 86 68 +ed3c 10 88 68 +FUNC ed4c 29 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_get_node() +ed4c c 355 44 +ed58 1d 356 40 +ed75 1 356 40 +FUNC ed76 b6 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_create_node(std::pair > const&) +ed76 d 363 44 +ed83 e 365 40 +ed91 3c 367 40 +edcd b 373 40 +edd8 11 367 40 +ede9 b 368 40 +edf4 12 370 40 +ee06 b 371 40 +ee11 13 368 40 +ee24 8 373 40 +FUNC ee2c cd 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair > const&) +ee2c d 787 44 +ee39 15 789 40 +ee4e 5d 792 40 +eeab 24 796 40 +eecf f 798 40 +eede 1b 799 40 +eef9 1 799 40 +FUNC eefa 1ef 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::insert_unique(std::pair > const&) +eefa d 869 44 +ef07 e 871 40 +ef15 e 872 40 +ef23 4 873 40 +ef27 2 874 40 +ef29 6 876 40 +ef2f 35 877 40 +ef64 2a 878 40 +ef8e 6 874 40 +ef94 12 880 40 +efa6 a 881 40 +efb0 24 882 40 +efd4 51 883 40 +f025 b 885 40 +f030 36 886 40 +f066 4e 887 40 +f0b4 35 888 40 +f0e9 1 888 40 +FUNC f0ea 20 0 std::map, std::less, std::allocator > > >::insert(std::pair > const&) +f0ea c 359 45 +f0f6 14 360 45 +f116 7 98 68 +f11d 1 98 68 +f12a 1d 85 68 +f147 5 86 68 +f14c 1d 88 68 +f169 1 88 68 +FUNC f16a 29 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_get_node() +f16a c 355 45 +f176 1d 356 40 +f193 1 356 40 +FUNC f194 5f 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_create_node(std::pair const&) +f194 d 363 45 +f1a1 e 365 40 +f1af 3c 367 40 +f1eb 8 373 40 +f1f3 1 373 40 +FUNC f1f4 cd 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair const&) +f1f4 d 787 45 +f201 15 789 40 +f216 5d 792 40 +f273 24 796 40 +f297 f 798 40 +f2a6 1b 799 40 +f2c1 1 799 40 +FUNC f2c2 1ef 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::insert_unique(std::pair const&) +f2c2 d 869 45 +f2cf e 871 40 +f2dd e 872 40 +f2eb 4 873 40 +f2ef 2 874 40 +f2f1 6 876 40 +f2f7 35 877 40 +f32c 2a 878 40 +f356 6 874 40 +f35c 12 880 40 +f36e a 881 40 +f378 24 882 40 +f39c 51 883 40 +f3ed b 885 40 +f3f8 36 886 40 +f42e 4e 887 40 +f47c 35 888 40 +f4b1 1 888 40 +FUNC f4b2 20 0 std::map, std::allocator > >::insert(std::pair const&) +f4b2 c 359 45 +f4be 14 360 45 +FUNC f4d2 19 0 void std::_Destroy(std::string*) +f4d2 c 106 45 +f4de d 107 73 +f4eb 1 107 73 +FUNC f4ec 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __false_type) +f4ec c 119 45 +f4f8 2 121 73 +f4fa 13 122 73 +f50d 21 121 73 +f52e 2 122 73 +FUNC f530 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >) +f530 c 148 45 +f53c 1c 155 73 +f565 6 82 79 +f56b 2 85 79 +f56d 24 86 79 +f591 2c 85 79 +f5bd b 87 79 +f5c8 b 89 79 +f5d3 12 91 79 +f5e5 b 92 79 +f5f0 13 89 79 +f603 9 92 79 +f618 23 113 79 +f63b 1 113 79 +f648 1b 254 79 +f663 1 254 79 +FUNC f664 430 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, std::string const&) +f664 14 249 47 +f678 14 251 78 +f68c 22 253 78 +f6ae f 255 78 +f6bd 12 256 78 +f6cf 55 257 78 +f724 4b 260 78 +f76f e 264 78 +f77d 15 265 78 +f792 e 266 78 +f7a0 1d 271 78 +f7bd 8 272 78 +f7c5 e 273 78 +f7d3 27 275 78 +f7fa 6 276 78 +f800 55 279 78 +f855 25 284 78 +f87a b 285 78 +f885 4f 286 78 +f8d4 3 284 78 +f8d7 13 279 78 +f8ea e 286 78 +f8f8 4d 298 78 +f945 30 299 78 +f975 12 302 78 +f987 13 303 78 +f99a 23 304 78 +f9bd 3 298 78 +f9c0 13 286 78 +f9d3 b 292 78 +f9de 39 294 78 +fa17 23 295 78 +fa3a 8 296 78 +fa42 16 294 78 +fa58 3 296 78 +fa5b 19 292 78 +fa74 19 298 78 +fa8d 7 304 78 +FUNC fa94 70 0 std::vector >::push_back(std::string const&) +fa94 c 602 47 +faa0 10 604 71 +fab0 1e 606 71 +face 11 607 71 +fadf 25 610 71 +FUNC fb04 19 0 void std::_Destroy(dwarf2reader::SourceFileInfo*) +fb04 c 106 47 +fb10 d 107 73 +fb1d 1 107 73 +FUNC fb1e 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __false_type) +fb1e c 119 47 +fb2a 2 121 73 +fb2c 13 122 73 +fb3f 21 121 73 +fb60 2 122 73 +FUNC fb62 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >) +fb62 c 148 47 +fb6e 1c 155 73 +fb97 6 82 79 +fb9d 2 85 79 +fb9f 24 86 79 +fbc3 2c 85 79 +fbef b 87 79 +fbfa b 89 79 +fc05 12 91 79 +fc17 b 92 79 +fc22 13 89 79 +fc35 9 92 79 +fc4a 23 113 79 +fc6d 1 113 79 +fc7a 1b 254 79 +fc95 1 254 79 +FUNC fc96 43d 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, dwarf2reader::SourceFileInfo const&) +fc96 14 249 47 +fcaa 14 251 78 +fcbe 22 253 78 +fce0 f 255 78 +fcef 12 256 78 +fd01 55 257 78 +fd56 4b 260 78 +fda1 e 264 78 +fdaf 15 265 78 +fdc4 e 266 78 +fdd2 1d 271 78 +fdef 8 272 78 +fdf7 e 273 78 +fe05 27 275 78 +fe2c 6 276 78 +fe32 55 279 78 +fe87 25 284 78 +feac b 285 78 +feb7 4f 286 78 +ff06 3 284 78 +ff09 13 279 78 +ff1c e 286 78 +ff2a 4d 298 78 +ff77 36 299 78 +ffad 12 302 78 +ffbf 13 303 78 +ffd2 2a 304 78 +fffc 3 298 78 +ffff 13 286 78 +10012 b 292 78 +1001d 39 294 78 +10056 23 295 78 +10079 8 296 78 +10081 16 294 78 +10097 3 296 78 +1009a 19 292 78 +100b3 19 298 78 +100cc 7 304 78 +100d3 1 304 78 +FUNC 100d4 70 0 std::vector >::push_back(dwarf2reader::SourceFileInfo const&) +100d4 c 602 47 +100e0 10 604 71 +100f0 1e 606 71 +1010e 11 607 71 +1011f 25 610 71 +FUNC 10144 16c 0 Start +10144 17 610 71 +1015b 40 49 48 +1019b 6 51 48 +101a1 3f 53 48 +101e0 7 54 48 +101e7 5 55 48 +101ec 2a 58 48 +10216 61 61 48 +10277 7 62 48 +1027e 2 63 48 +10280 29 66 48 +102a9 7 67 48 +FUNC 102b0 108 0 Usage +102b0 19 70 48 +102c9 30 71 48 +102f9 29 73 48 +10322 30 74 48 +10352 30 75 48 +10382 30 76 48 +103b2 6 77 48 +FUNC 103b8 3af 0 SetupOptions +103b8 21 80 48 +103d9 8 82 48 +103e1 6 85 48 +103e7 10 86 48 +103f7 2e 88 48 +10425 2f 94 48 +10454 2a 91 48 +1047e 23 95 48 +104a1 3e 97 48 +104df 11 98 48 +104f0 7c 99 48 +1056c c 100 48 +10578 5 99 48 +1057d 3e 101 48 +105bb 11 102 48 +105cc 3e 103 48 +1060a 11 104 48 +1061b 37 106 48 +10652 b 107 48 +1065d c 108 48 +10669 b 113 48 +10674 c 114 48 +10680 14 119 48 +10694 30 120 48 +106c4 b 121 48 +106cf c 122 48 +106db 81 127 48 +1075c b 128 48 +10767 1 128 48 +FUNC 10768 a7 0 main +10768 13 131 48 +1077b 37 132 48 +107b2 1e 135 48 +107d0 e 136 48 +107de 8 137 48 +107e6 17 139 48 +107fd c 141 48 +10809 6 142 48 +1080f 1 142 48 +10810 c 47 49 +1081c 1a 48 49 +10836 2 49 49 +10838 c 47 49 +10844 1a 48 49 +1085e 2 49 49 +FUNC 10860 cb 0 google_breakpad::FileID::FileIdentifier(unsigned char*) +10860 f 51 49 +1086f 16 52 49 +10885 6 53 49 +1088b f 54 49 +1089a b 57 49 +108a5 7 62 49 +108ac 2 63 49 +108ae 1c 64 49 +108ca 32 63 49 +108fc b 67 49 +10907 12 68 49 +10919 10 70 49 +10929 2 71 49 +1092b 1 71 49 +FUNC 1092c f2 0 google_breakpad::FileID::MachoIdentifier(int, unsigned char*) +1092c 10 73 49 +1093c 15 74 49 +10951 20 76 49 +10971 f 77 49 +10980 20 79 49 +109a0 c 80 49 +109ac 69 82 49 +10a15 9 83 49 +FUNC 10a1e fb 0 google_breakpad::FileID::ConvertIdentifierToString(unsigned char const*, char*, int) +10a1e c 87 49 +10a2a 7 88 49 +10a31 c 89 49 +10a3d 15 90 49 +10a52 12 91 49 +10a64 18 93 49 +10a7c e 94 49 +10a8a 2b 96 49 +10ab5 2b 97 49 +10ae0 17 89 49 +10af7 20 101 49 +10b17 2 102 49 +10b19 1 102 49 +FUNC 10b1a 13 0 NXHostByteOrder +10b1a c 144 56 +10b26 5 147 56 +10b2b 2 153 56 +10b2d 1 153 56 +10b2e c 56 51 +10b3a 1a 57 51 +10b54 1e 58 51 +10b72 2 59 51 +10b74 c 56 51 +10b80 1a 57 51 +10b9a 1e 58 51 +10bb8 2 59 51 +10bba c 61 51 +10bc6 e 62 51 +10bd4 11 63 51 +10be5 2 64 51 +10be7 1 64 51 +10be8 c 61 51 +10bf4 e 62 51 +10c02 11 63 51 +10c13 2 64 51 +10c15 1 64 51 +FUNC 10c16 477 0 MacFileUtilities::MachoID::UpdateCRC(unsigned char*, unsigned long) +10c16 c 74 51 +10c22 11 82 51 +10c33 14 83 51 +10c47 5 86 51 +10c4c 9 87 51 +10c55 7 88 51 +10c5c 18b 90 51 +10de7 6 91 51 +10ded 14 89 51 +10e01 23 93 51 +10e24 23 94 51 +10e47 d 86 51 +10e54 f 98 51 +10e63 6 100 51 +10e69 18b 101 51 +10ff4 6 102 51 +10ffa c 99 51 +11006 13 105 51 +11019 8 106 51 +11021 10 104 51 +11031 23 108 51 +11054 23 109 51 +11077 14 110 51 +1108b 2 112 51 +1108d 1 112 51 +FUNC 1108e 2c 0 MacFileUtilities::MachoID::UpdateMD5(unsigned char*, unsigned long) +1108e c 114 51 +1109a 1e 115 51 +110b8 2 116 51 +FUNC 110ba 2c 0 MacFileUtilities::MachoID::UpdateSHA1(unsigned char*, unsigned long) +110ba c 118 51 +110c6 1e 119 51 +110e4 2 120 51 +FUNC 110e6 121 0 MacFileUtilities::MachoID::Update(MacFileUtilities::MachoWalker*, unsigned long, unsigned long) +110e6 f 122 51 +110f5 1b 123 51 +11110 e 129 51 +1111e 5 130 51 +11123 9 131 51 +1112c 7 132 51 +11133 a 133 51 +1113d 6 135 51 +11143 7 136 51 +1114a 35 139 51 +1117f 6c 142 51 +111eb 10 143 51 +111fb a 130 51 +11205 2 145 51 +11207 1 145 51 +FUNC 11208 cf 0 MacFileUtilities::MachoID::UUIDCommand(int, unsigned char*) +11208 14 147 51 +1121c 25 149 51 +11241 7 151 51 +11248 19 152 51 +11261 9 153 51 +1126a 8 157 51 +11272 1f 158 51 +11291 9 159 51 +1129a 36 162 51 +112d0 7 163 51 +112d7 1 163 51 +FUNC 112d8 224 0 MacFileUtilities::MachoID::IDCommand(int, unsigned char*) +112d8 15 165 51 +112ed 25 167 51 +11312 7 169 51 +11319 19 170 51 +11332 c 171 51 +1133e c 175 51 +1134a 6 180 51 +11350 7 181 51 +11357 9 182 51 +11360 9 183 51 +11369 28 185 51 +11391 33 186 51 +113c4 1e 185 51 +113e2 10 189 51 +113f2 10 190 51 +11402 10 191 51 +11412 d 192 51 +1141f 10 193 51 +1142f 10 194 51 +1143f 10 195 51 +1144f d 196 51 +1145c 17 197 51 +11473 17 198 51 +1148a 17 199 51 +114a1 14 200 51 +114b5 9 202 51 +114be 36 205 51 +114f4 8 206 51 +FUNC 114fc d1 0 MacFileUtilities::MachoID::Adler32(int) +114fc 14 208 51 +11510 25 209 51 +11535 27 210 51 +1155c d 211 51 +11569 19 213 51 +11582 9 214 51 +1158b 3b 216 51 +115c6 7 217 51 +115cd 1 217 51 +FUNC 115ce f8 0 MacFileUtilities::MachoID::MD5(int, unsigned char*) +115ce 14 219 51 +115e2 25 220 51 +11607 27 221 51 +1162e 19 223 51 +11647 19 224 51 +11660 9 225 51 +11669 17 227 51 +11680 9 228 51 +11689 36 231 51 +116bf 7 232 51 +FUNC 116c6 f8 0 MacFileUtilities::MachoID::SHA1(int, unsigned char*) +116c6 14 234 51 +116da 25 235 51 +116ff 27 236 51 +11726 19 238 51 +1173f 19 239 51 +11758 9 240 51 +11761 17 242 51 +11778 9 243 51 +11781 36 246 51 +117b7 7 247 51 +FUNC 117be 378 0 MacFileUtilities::MachoID::WalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*) +117be 2b 251 51 +117e9 6 252 51 +117ef e 254 51 +117fd 38 257 51 +11835 f 258 51 +11844 9 260 51 +1184d 17 261 51 +11864 20 266 51 +11884 f 267 51 +11893 d 271 51 +118a0 c 273 51 +118ac 38 274 51 +118e4 f 275 51 +118f3 9 277 51 +118fc 1f 278 51 +1191b 14 282 51 +1192f 2b 283 51 +1195a d 285 51 +11967 19 273 51 +11980 e 287 51 +1198e 38 290 51 +119c6 f 291 51 +119d5 9 293 51 +119de 17 294 51 +119f5 20 299 51 +11a15 f 300 51 +11a24 d 304 51 +11a31 c 306 51 +11a3d 38 307 51 +11a75 f 308 51 +11a84 9 310 51 +11a8d 1f 311 51 +11aac 1a 315 51 +11ac6 39 316 51 +11aff d 318 51 +11b0c 11 306 51 +11b1d 10 323 51 +11b2d 9 324 51 +FUNC 11b36 95 0 MacFileUtilities::MachoID::UUIDWalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*) +11b36 1e 328 51 +11b54 a 329 51 +11b5e 6 331 51 +11b64 2f 333 51 +11b93 9 335 51 +11b9c 6 337 51 +11ba2 14 338 51 +11bb6 9 340 51 +11bbf a 344 51 +11bc9 2 345 51 +11bcb 1 345 51 +FUNC 11bcc 95 0 MacFileUtilities::MachoID::IDWalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*) +11bcc 1e 349 51 +11bea a 350 51 +11bf4 6 351 51 +11bfa 2f 353 51 +11c29 9 354 51 +11c32 6 356 51 +11c38 14 357 51 +11c4c 9 359 51 +11c55 a 363 51 +11c5f 2 364 51 +11c61 1 364 51 +FUNC 11c62 1c 0 _OSSwapInt32 +11c62 f 53 55 +11c71 8 55 55 +11c79 3 56 55 +11c7c 2 57 55 +FUNC 11c7e 19 0 NXSwapInt +11c7e f 52 56 +11c8d 8 54 56 +11c95 2 55 56 +11c97 1 55 56 +FUNC 11c98 13 0 NXHostByteOrder +11c98 c 144 56 +11ca4 5 147 56 +11ca9 2 153 56 +11cab 1 153 56 +11cac c 52 54 +11cb8 12 54 54 +11cca 1a 55 54 +11ce4 2 56 54 +11ce6 c 52 54 +11cf2 12 54 54 +11d04 1a 55 54 +11d1e 2 56 54 +11d20 c 58 54 +11d2c a 59 54 +11d36 d 60 54 +11d43 2 61 54 +11d45 1 61 54 +11d46 c 58 54 +11d52 a 59 54 +11d5c d 60 54 +11d69 2 61 54 +11d6b 1 61 54 +FUNC 11d6c 37 0 MacFileUtilities::MachoWalker::ValidateCPUType(int) +11d6c c 63 54 +11d78 6 66 54 +11d7e 8 67 54 +11d86 6 68 54 +11d8c b 69 54 +11d97 7 74 54 +11d9e 3 80 54 +11da1 2 81 54 +11da3 1 81 54 +FUNC 11da4 50 0 MacFileUtilities::MachoWalker::ReadBytes(void*, unsigned long, long long) +11da4 18 96 54 +11dbc 36 97 54 +11df2 2 98 54 +FUNC 11df4 73 0 MacFileUtilities::MachoWalker::CurrentHeader(mach_header_64*, long long*) +11df4 c 100 54 +11e00 a 101 54 +11e0a 37 102 54 +11e41 11 103 54 +11e52 9 104 54 +11e5b a 107 54 +11e65 2 108 54 +11e67 1 108 54 +FUNC 11e68 2a6 0 MacFileUtilities::MachoWalker::FindHeader(int, long long&) +11e68 c 110 54 +11e74 15 111 54 +11e89 31 114 54 +11eba c 115 54 +11ec6 10 117 54 +11ed6 4 120 54 +11eda 14 121 54 +11eee 4 122 54 +11ef2 11 129 54 +11f03 28 124 54 +11f2b c 126 54 +11f37 31 133 54 +11f68 c 134 54 +11f74 14 136 54 +11f88 b 137 54 +11f93 8 139 54 +11f9b c 140 54 +11fa7 10 142 54 +11fb7 c 143 54 +11fc3 10 146 54 +11fd3 31 148 54 +12004 c 149 54 +12010 f 151 54 +1201f 14 152 54 +12033 16 154 54 +12049 c 158 54 +12055 31 159 54 +12086 9 160 54 +1208f f 162 54 +1209e 1c 163 54 +120ba 8 165 54 +120c2 10 166 54 +120d2 9 167 54 +120db 16 170 54 +120f1 11 158 54 +12102 a 174 54 +1210c 2 175 54 +FUNC 1210e 109 0 MacFileUtilities::MachoWalker::WalkHeaderCore(long long, unsigned int, bool) +1210e 1e 224 54 +1212c c 225 54 +12138 2f 227 54 +12167 c 228 54 +12173 6 230 54 +12179 14 231 54 +1218d 5b 234 54 +121e8 12 237 54 +121fa 11 225 54 +1220b a 240 54 +12215 2 241 54 +12217 1 241 54 +FUNC 12218 10e 0 MacFileUtilities::MachoWalker::WalkHeader64AtOffset(long long) +12218 18 203 54 +12230 2f 205 54 +1225f c 206 54 +1226b e 208 54 +12279 6 209 54 +1227f 14 210 54 +12293 9 212 54 +1229c a 213 54 +122a6 f 214 54 +122b5 15 215 54 +122ca 2b 216 54 +122f5 a 217 54 +122ff a 218 54 +12309 11 219 54 +1231a a 220 54 +12324 2 221 54 +FUNC 12326 143 0 MacFileUtilities::MachoWalker::WalkHeaderAtOffset(long long) +12326 18 177 54 +1233e 2f 179 54 +1236d c 180 54 +12379 e 182 54 +12387 6 183 54 +1238d 14 184 54 +123a1 2e 189 54 +123cf 7 190 54 +123d6 9 192 54 +123df a 193 54 +123e9 f 194 54 +123f8 15 195 54 +1240d 2b 196 54 +12438 a 197 54 +12442 a 198 54 +1244c 11 199 54 +1245d a 200 54 +12467 2 201 54 +12469 1 201 54 +FUNC 1246a 99 0 MacFileUtilities::MachoWalker::WalkHeader(int) +1246a c 83 54 +12476 15 84 54 +1248b 1d 86 54 +124a8 d 87 54 +124b5 21 88 54 +124d6 21 90 54 +124f7 a 93 54 +12501 2 94 54 +12503 1 94 54 +FUNC 12504 1c 0 _OSSwapInt32 +12504 f 53 55 +12513 8 55 55 +1251b 3 56 55 +1251e 2 57 55 +FUNC 12520 2b 0 _OSSwapInt64 +12520 12 64 55 +12532 11 69 55 +12543 6 70 55 +12549 2 71 55 +1254b 1 71 55 +FUNC 1254c 19 0 NXSwapLong +1254c f 61 56 +1255b 8 63 56 +12563 2 64 56 +12565 1 64 56 +FUNC 12566 1f 0 NXSwapLongLong +12566 12 70 56 +12578 b 72 56 +12583 2 73 56 +12585 1 73 56 +FUNC 12586 32 0 breakpad_swap_uuid_command(breakpad_uuid_command*, NXByteOrder) +12586 c 37 57 +12592 11 39 57 +125a3 13 40 57 +125b6 2 41 57 +FUNC 125b8 da 0 breakpad_swap_segment_command_64(segment_command_64*, NXByteOrder) +125b8 c 44 57 +125c4 11 46 57 +125d5 13 47 57 +125e8 17 49 57 +125ff 17 50 57 +12616 17 51 57 +1262d 17 52 57 +12644 13 54 57 +12657 13 55 57 +1266a 13 56 57 +1267d 13 57 57 +12690 2 58 57 +FUNC 12692 a4 0 breakpad_swap_mach_header_64(mach_header_64*, NXByteOrder) +12692 c 61 57 +1269e 11 63 57 +126af 13 64 57 +126c2 13 65 57 +126d5 13 66 57 +126e8 13 67 57 +126fb 13 68 57 +1270e 13 69 57 +12721 13 70 57 +12734 2 71 57 +FUNC 12736 1d1 0 breakpad_swap_section_64(section_64*, unsigned int, NXByteOrder) +12736 d 75 57 +12743 c 77 57 +1274f 33 78 57 +12782 33 79 57 +127b5 2d 81 57 +127e2 2d 82 57 +1280f 2d 83 57 +1283c 2d 84 57 +12869 2d 85 57 +12896 2d 86 57 +128c3 2d 87 57 +128f0 11 77 57 +12901 6 89 57 +12907 1 89 57 +12908 12 9 58 +1291a 4f 11 58 +12969 2 12 58 +1296b 1 12 58 +1296c 12 9 58 +1297e 4f 11 58 +129cd 2 12 58 +129cf 1 12 58 +129d0 13 14 58 +129e3 2a 14 58 +12a0d 1 14 58 +12a0e 13 14 58 +12a21 2a 14 58 +12a4b 1 14 58 +12a4c 13 14 58 +12a5f 2a 14 58 +12a89 1 14 58 +FUNC 12a8a bb 0 dwarf2reader::ByteReader::SetOffsetSize(unsigned char) +12a8a 19 16 58 +12aa3 a 17 58 +12aad 48 18 58 +12af5 6 19 58 +12afb 23 20 58 +12b1e 21 22 58 +12b3f 6 24 58 +12b45 1 24 58 +FUNC 12b46 bb 0 dwarf2reader::ByteReader::SetAddressSize(unsigned char) +12b46 19 26 58 +12b5f a 27 58 +12b69 48 28 58 +12bb1 6 29 58 +12bb7 23 30 58 +12bda 21 32 58 +12bfb 6 34 58 +12c01 1 34 58 +FUNC 12c02 a2 0 dwarf2reader::ByteReader::ReadFourBytes(char const*) const +12c02 c 24 59 +12c0e c 25 64 +12c1a d 26 64 +12c27 f 27 64 +12c36 f 28 64 +12c45 b 29 64 +12c50 27 30 64 +12c77 2b 32 64 +12ca2 2 34 64 +FUNC 12ca4 40e 0 dwarf2reader::ByteReader::ReadEightBytes(char const*) const +12ca4 11 36 59 +12cb5 1a 37 64 +12ccf 1b 38 64 +12cea 1d 39 64 +12d07 1d 40 64 +12d24 1d 41 64 +12d41 1d 42 64 +12d5e 1d 43 64 +12d7b 1d 44 64 +12d98 f 45 64 +12da7 18f 47 64 +12f36 172 50 64 +130a8 a 52 64 +130b2 2 52 64 +FUNC 130b4 a6 0 ReadInitialLength +130b4 15 29 60 +130c9 18 30 60 +130e1 6 31 60 +130e7 d 35 60 +130f4 13 36 60 +13107 9 37 60 +13110 1a 38 60 +1312a 13 40 60 +1313d 9 41 60 +13146 12 43 60 +13158 2 44 60 +1315a 1f 47 60 +13179 65 50 60 +131de 1f 47 60 +131fd 65 50 60 +FUNC 13262 393 0 dwarf2reader::CompilationUnit::SkipAttribute(char const*, dwarf2reader::DwarfForm) +13262 14 133 60 +13276 82 136 60 +132f8 1f 139 60 +13317 a 140 60 +13321 21 141 60 +13342 c 147 60 +1334e e 151 60 +1335c e 155 60 +1336a e 159 60 +13378 27 162 60 +1339f 1c 166 60 +133bb 10 167 60 +133cb 1c 171 60 +133e7 10 172 60 +133f7 1e 175 60 +13415 56 180 60 +1346b d 181 60 +13478 1e 182 60 +13496 11 183 60 +134a7 1e 184 60 +134c5 24 189 60 +134e9 26 192 60 +1350f 23 195 60 +13532 22 198 60 +13554 15 199 60 +13569 1b 203 60 +13584 30 206 60 +135b4 30 208 60 +135e4 a 209 60 +135ee 7 210 60 +135f5 1 210 60 +FUNC 135f6 29b 0 dwarf2reader::CompilationUnit::ReadHeader() +135f6 14 217 60 +1360a 9 218 60 +13613 4e 221 60 +13661 17 223 60 +13678 a 224 60 +13682 f 225 60 +13691 4e 227 60 +136df 1e 228 60 +136fd 6 229 60 +13703 5e 231 60 +13761 1e 232 60 +1377f 18 233 60 +13797 4c 235 60 +137e3 1d 236 60 +13800 1c 237 60 +1381c 5 238 60 +13821 9 240 60 +1382a 60 245 60 +1388a 7 247 60 +13891 1 247 60 +FUNC 13892 a57 0 dwarf2reader::CompilationUnit::ProcessAttribute(unsigned long long, char const*, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm) +13892 24 299 60 +138b6 8a 302 60 +13940 1f 307 60 +1395f a 308 60 +13969 36 309 60 +1399f 5b 316 60 +139fa c 317 60 +13a06 5b 322 60 +13a61 e 323 60 +13a6f 55 328 60 +13ac4 e 329 60 +13ad2 55 334 60 +13b27 e 335 60 +13b35 6 338 60 +13b3b 9a 340 60 +13bd5 33 341 60 +13c08 25 340 60 +13c2d 5c 348 60 +13c89 10 349 60 +13c99 5c 354 60 +13cf5 10 355 60 +13d05 55 359 60 +13d5a 1e 360 60 +13d78 56 365 60 +13dce d 366 60 +13ddb 55 368 60 +13e30 1e 369 60 +13e4e 11 370 60 +13e5f 55 372 60 +13eb4 1e 373 60 +13ed2 29 378 60 +13efb 4a 380 60 +13f45 f 381 60 +13f54 29 385 60 +13f7d 4c 387 60 +13fc9 11 388 60 +13fda 1b 392 60 +13ff5 4c 394 60 +14041 11 395 60 +14052 22 399 60 +14074 4e 401 60 +140c2 15 402 60 +140d7 3c 406 60 +14113 1b 408 60 +1412e 54 409 60 +14182 f 411 60 +14191 9a 413 60 +1422b 24 414 60 +1424f 25 413 60 +14274 30 418 60 +142a4 30 420 60 +142d4 a 421 60 +142de b 422 60 +142e9 1 422 60 +142ea 1f 489 60 +14309 3a 491 60 +14343 a 492 60 +1434d 6 493 60 +14353 1 493 60 +14354 1f 489 60 +14373 3a 491 60 +143ad a 492 60 +143b7 6 493 60 +143bd 1 493 60 +FUNC 143be b5 0 dwarf2reader::CompilationUnit::ProcessDIE(unsigned long long, char const*, dwarf2reader::CompilationUnit::Abbrev const&) +143be 19 426 60 +143d7 13 427 60 +143ea 46 430 60 +14430 3a 427 60 +1446a 3 432 60 +1446d 6 433 60 +14473 1 433 60 +FUNC 14474 85 0 dwarf2reader::CompilationUnit::SkipDIE(char const*, dwarf2reader::CompilationUnit::Abbrev const&) +14474 c 122 60 +14480 13 123 60 +14493 27 126 60 +144ba 3a 123 60 +144f4 3 128 60 +144f7 2 129 60 +144f9 1 129 60 +FUNC 144fa be4 0 dwarf2reader::LineInfo::ProcessOneOpcode(dwarf2reader::ByteReader*, dwarf2reader::LineInfoHandler*, dwarf2reader::LineInfoHeader const&, char const*, dwarf2reader::LineStateMachine*, unsigned long*, unsigned long, bool*) +144fa 18 593 60 +14512 a 594 60 +1451c 18 596 60 +14534 8 597 60 +1453c 5 598 60 +14541 19 602 60 +1455a f 603 60 +14569 50 605 60 +145b9 46 607 60 +145ff e0 610 60 +146df 6 612 60 +146e5 22 615 60 +14707 22 616 60 +14729 7 617 60 +14730 b 618 60 +1473b f 619 60 +1474a 5a 623 60 +147a4 7 625 60 +147ab b 626 60 +147b6 f 627 60 +147c5 28 631 60 +147ed e 632 60 +147fb 144 635 60 +1493f 6 637 60 +14945 9e 640 60 +149e3 5 642 60 +149e8 22 644 60 +14a0a e 645 60 +14a18 1c 646 60 +14a34 2b 652 60 +14a5f b 653 60 +14a6a 22 658 60 +14a8c e 659 60 +14a9a 8 660 60 +14aa2 5 662 60 +14aa7 22 664 60 +14ac9 e 665 60 +14ad7 9 666 60 +14ae0 5 668 60 +14ae5 12 670 60 +14af7 5 672 60 +14afc 7 674 60 +14b03 5 676 60 +14b08 16 678 60 +14b1e 9 679 60 +14b27 d9 682 60 +14c00 6 684 60 +14c06 1f 687 60 +14c25 5 689 60 +14c2a 40 693 60 +14c6a d6 696 60 +14d40 6 698 60 +14d46 1c 701 60 +14d62 5 703 60 +14d67 1f 706 60 +14d86 d 707 60 +14d93 13 708 60 +14da6 26 710 60 +14dcc 5 711 60 +14dd1 50 713 60 +14e21 7 715 60 +14e28 b 716 60 +14e33 f 717 60 +14e42 18 725 60 +14e5a f 726 60 +14e69 5 728 60 +14e6e 6 730 60 +14e74 28 732 60 +14e9c d 733 60 +14ea9 22 735 60 +14ecb e 736 60 +14ed9 22 739 60 +14efb e 740 60 +14f09 22 743 60 +14f2b e 744 60 +14f39 a 746 60 +14f43 fd 748 60 +15040 a 758 60 +1504a 9 759 60 +15053 1c 761 60 +1506f d 762 60 +1507c e 763 60 +1508a 2e 759 60 +150b8 b 769 60 +150c3 10 770 60 +150d3 b 771 60 +FUNC 150de 14b 0 dwarf2reader::LineInfo::ReadLines() +150de e 773 60 +150ec 9 778 60 +150f5 17 782 60 +1510c 8 783 60 +15114 6 785 60 +1511a 9 787 60 +15123 5 788 60 +15128 19 789 60 +15141 5 790 60 +15146 4a 793 60 +15190 6 794 60 +15196 4a 796 60 +151e0 a 797 60 +151ea f 790 60 +151f9 15 788 60 +1520e 14 801 60 +15222 7 802 60 +15229 1 802 60 +FUNC 1522a 4fd 0 dwarf2reader::CompilationUnit::ReadAbbrevs() +1522a 18 60 60 +15242 e 61 60 +15250 58 65 60 +152a8 38 66 60 +152e0 44 65 60 +15324 2a 66 60 +1534e 45 68 60 +15393 16 69 60 +153a9 1d 75 60 +153c6 6 76 60 +153cc 40 77 60 +1540c b 80 60 +15417 1f 82 60 +15436 e 84 60 +15444 6 77 60 +1544a 1f 68 60 +15469 a 84 60 +15473 1d 79 60 +15490 6 86 60 +15496 a 87 60 +154a0 3d 89 60 +154dd 1f 90 60 +154fc a 91 60 +15506 6 92 60 +1550c 3d 94 60 +15549 1d 95 60 +15566 5 96 60 +1556b 3d 98 60 +155a8 1f 101 60 +155c7 a 102 60 +155d1 3d 104 60 +1560e 1f 105 60 +1562d a 106 60 +15637 c 107 60 +15643 6 111 60 +15649 6 112 60 +1564f 32 113 60 +15681 47 115 60 +156c8 30 116 60 +156f8 24 79 60 +1571c b 118 60 +15727 1 118 60 +FUNC 15728 5dc 0 dwarf2reader::LineInfo::ReadHeader() +15728 18 503 60 +15740 9 504 60 +15749 17 508 60 +15760 a 510 60 +1576a f 511 60 +15779 60 512 60 +157d9 44 516 60 +1581d 1e 518 60 +1583b 6 519 60 +15841 1e 521 60 +1585f 18 522 60 +15877 1d 524 60 +15894 5 525 60 +15899 20 527 60 +158b9 5 528 60 +158be c 530 60 +158ca 5 531 60 +158cf 1d 533 60 +158ec 5 534 60 +158f1 1d 536 60 +1590e 5 537 60 +15913 45 539 60 +15958 1f 540 60 +15977 19 541 60 +15990 15 542 60 +159a5 1f 539 60 +159c4 30 543 60 +159f4 5 544 60 +159f9 14 542 60 +15a0d e 548 60 +15a1b 7 549 60 +15a22 5 550 60 +15a27 6 551 60 +15a2d 8b 552 60 +15ab8 28 553 60 +15ae0 5 554 60 +15ae5 16 550 60 +15afb 25 552 60 +15b20 5 557 60 +15b25 e 560 60 +15b33 7 561 60 +15b3a 5 563 60 +15b3f 6 564 60 +15b45 28 565 60 +15b6d 22 567 60 +15b8f a 568 60 +15b99 22 570 60 +15bbb a 571 60 +15bc5 22 573 60 +15be7 a 574 60 +15bf1 ba 576 60 +15cab 5 577 60 +15cb0 16 563 60 +15cc6 25 576 60 +15ceb 5 580 60 +15cf0 9 582 60 +15cf9 b 583 60 +FUNC 15d04 3d 0 dwarf2reader::LineInfo::Start() +15d04 c 495 60 +15d10 b 496 60 +15d1b b 497 60 +15d26 19 498 60 +15d3f 2 499 60 +15d41 1 499 60 +FUNC 15d42 304 0 dwarf2reader::CompilationUnit::ProcessDIEs() +15d42 11 435 60 +15d53 9 436 60 +15d5c 9 441 60 +15d65 17 445 60 +15d7c 8 446 60 +15d84 6 448 60 +15d8a 6c 453 60 +15df6 8 455 60 +15dfe 16 453 60 +15e14 3 455 60 +15e17 2f 453 60 +15e46 29 458 60 +15e6f 22 460 60 +15e91 a 462 60 +15e9b a 465 60 +15ea5 1e 466 60 +15ec3 13 467 60 +15ed6 2b 468 60 +15f01 18 472 60 +15f19 9 473 60 +15f22 42 474 60 +15f64 1e 475 60 +15f82 2a 477 60 +15fac b 480 60 +15fb7 1e 481 60 +15fd5 26 483 60 +15ffb 1d 455 60 +16018 24 485 60 +1603c a 486 60 +FUNC 16046 35f 0 dwarf2reader::CompilationUnit::Start() +16046 18 249 60 +1605e 58 251 60 +160b6 35 252 60 +160eb 32 251 60 +1611d 2a 252 60 +16147 20 255 60 +16167 37 256 60 +1619e b 259 60 +161a9 f 264 60 +161b8 17 265 60 +161cf c 266 60 +161db a 268 60 +161e5 95 271 60 +1627a 11 276 60 +1628b b 279 60 +16296 58 282 60 +162ee 2f 283 60 +1631d 32 282 60 +1634f 14 284 60 +16363 1a 285 60 +1637d b 289 60 +16388 12 291 60 +1639a b 292 60 +163a5 1 292 60 +FUNC 163a6 3a 0 std::fill(unsigned char*, unsigned char*, unsigned char const&) +163a6 c 573 61 +163b2 9 576 61 +163bb 23 577 61 +163de 2 578 61 +FUNC 163e0 33 0 std::__deque_buf_size(unsigned long) +163e0 c 83 62 +163ec 27 84 62 +16413 1 84 62 +FUNC 16414 18 0 dwarf2reader::ByteReader::OffsetSize() const +16414 c 38 63 +16420 c 38 63 +FUNC 1642c 18 0 dwarf2reader::ByteReader::AddressSize() const +1642c c 41 63 +16438 c 41 63 +FUNC 16444 17 0 dwarf2reader::ByteReader::ReadOneByte(char const*) const +16444 c 10 64 +16450 9 11 64 +16459 2 12 64 +1645b 1 12 64 +FUNC 1645c 63 0 dwarf2reader::ByteReader::ReadTwoBytes(char const*) const +1645c c 14 64 +16468 d 15 64 +16475 e 16 64 +16483 b 17 64 +1648e 17 18 64 +164a5 18 20 64 +164bd 2 22 64 +164bf 1 22 64 +FUNC 164c0 98 0 dwarf2reader::ByteReader::ReadUnsignedLEB128(char const*, unsigned long*) const +164c0 e 59 64 +164ce e 60 64 +164dc 7 61 64 +164e3 7 62 64 +164ea e 66 64 +164f8 5 67 64 +164fd 38 69 64 +16535 6 71 64 +1653b 8 65 64 +16543 8 75 64 +1654b 6 77 64 +16551 7 78 64 +FUNC 16558 ee 0 dwarf2reader::ByteReader::ReadSignedLEB128(char const*, unsigned long*) const +16558 e 84 64 +16566 e 85 64 +16574 7 86 64 +1657b 7 87 64 +16582 e 91 64 +16590 5 92 64 +16595 44 93 64 +165d9 6 94 64 +165df 8 90 64 +165e7 14 97 64 +165fb 36 98 64 +16631 8 99 64 +16639 6 100 64 +1663f 7 101 64 +FUNC 16646 a2 0 dwarf2reader::ByteReader::ReadOffset(char const*) const +16646 13 103 64 +16659 3f 104 64 +16698 4a 105 64 +166e2 6 106 64 +FUNC 166e8 a2 0 dwarf2reader::ByteReader::ReadAddress(char const*) const +166e8 13 108 64 +166fb 3f 109 64 +1673a 4a 110 64 +16784 6 111 64 +FUNC 1678a 61 0 dwarf2reader::LineStateMachine::Reset(bool) +1678a 12 12 65 +1679c 9 13 65 +167a5 11 14 65 +167b6 11 15 65 +167c7 a 16 65 +167d1 a 17 65 +167db 7 18 65 +167e2 7 19 65 +167e9 2 20 65 +167eb 1 20 65 +FUNC 167ec 20 0 std::_List_const_iterator >::operator!=(std::_List_const_iterator > const&) const +167ec c 253 66 +167f8 14 254 66 +FUNC 1680c 25 0 std::_List_const_iterator >::operator++(int) +1680c c 226 66 +16818 8 228 66 +16820 c 229 66 +1682c 5 230 66 +16831 1 230 66 +FUNC 16832 16 0 std::_List_const_iterator >::operator->() const +16832 c 215 66 +1683e a 216 66 +16848 c 190 67 +16854 a 190 67 +FUNC 1685e 13 0 std::auto_ptr > > >::operator->() const +1685e c 283 67 +1686a 7 286 67 +16871 1 286 67 +16872 c 65 68 +1687e 2 65 68 +16880 c 97 69 +1688c d 97 69 +16899 1 97 69 +1689a c 99 69 +168a6 14 100 69 +168ba c 97 69 +168c6 d 97 69 +168d3 1 97 69 +168d4 c 84 70 +168e0 17 85 70 +168f7 1 85 70 +FUNC 168f8 2d 0 std::pair std::make_pair(dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm) +168f8 c 144 70 +16904 21 145 70 +16925 1 145 70 +16926 c 202 66 +16932 a 203 66 +FUNC 1693c 25 0 std::list, std::allocator > >::begin() const +1693c c 588 70 +16948 19 589 66 +16961 1 589 66 +FUNC 16962 23 0 std::list, std::allocator > >::end() const +16962 c 605 70 +1696e 17 606 66 +16985 1 606 66 +16986 c 65 68 +16992 2 65 68 +16994 c 72 68 +169a0 2 72 68 +169a2 c 97 69 +169ae d 97 69 +169bb 1 97 69 +169bc c 105 69 +169c8 d 105 69 +169d5 1 105 69 +169d6 c 105 69 +169e2 d 105 69 +169ef 1 105 69 +169f0 c 67 68 +169fc 2 67 68 +169fe c 99 69 +16a0a 14 100 69 +16a1e c 99 69 +16a2a 14 100 69 +16a3e c 129 62 +16a4a 30 131 62 +16a7a c 65 68 +16a86 2 65 68 +16a88 c 72 68 +16a94 2 72 68 +16a96 c 97 69 +16aa2 d 97 69 +16aaf 1 97 69 +16ab0 c 105 69 +16abc d 105 69 +16ac9 1 105 69 +16aca c 105 69 +16ad6 d 105 69 +16ae3 1 105 69 +16ae4 c 67 68 +16af0 2 67 68 +16af2 c 99 69 +16afe 14 100 69 +16b12 c 99 69 +16b1e 14 100 69 +FUNC 16b32 2b 0 std::_Vector_base >::get_allocator() const +16b32 10 93 71 +16b42 1b 94 71 +16b5d 1 94 71 +16b6a 7 614 72 +16b71 1 614 72 +16b72 c 80 71 +16b7e d 80 71 +16b8b 1 80 71 +16b98 2 107 68 +FUNC 16b9a 2d 0 void std::_Destroy >(unsigned char*, unsigned char*, std::allocator) +16b9a c 171 73 +16ba6 2 173 73 +16ba8 12 174 73 +16bba b 173 73 +16bc5 2 174 73 +16bc7 1 174 73 +16bc8 c 84 71 +16bd4 2f 85 71 +16c03 2 86 71 +16c05 1 86 71 +16c06 c 96 71 +16c12 12 97 71 +16c24 2 98 71 +FUNC 16c26 1f 0 std::_List_base, std::allocator > >::_M_init() +16c26 c 338 73 +16c32 8 340 66 +16c3a b 341 66 +16c45 1 341 66 +16c46 c 105 69 +16c52 d 105 69 +16c5f 1 105 69 +16c60 c 125 66 +16c6c a 126 66 +FUNC 16c76 25 0 std::list, std::allocator > >::begin() +16c76 c 579 73 +16c82 19 580 66 +16c9b 1 580 66 +FUNC 16c9c 23 0 std::list, std::allocator > >::end() +16c9c c 597 73 +16ca8 17 597 66 +16cbf 1 597 66 +16cc0 c 603 72 +16ccc c 603 72 +FUNC 16cd8 2b 0 std::vector >::begin() const +16cd8 c 342 73 +16ce4 1f 343 71 +16d03 1 343 71 +FUNC 16d04 2c 0 std::vector >::end() const +16d04 c 360 73 +16d10 20 361 71 +16d3c 5 666 72 +16d41 1 666 72 +16d4f 31 759 72 +FUNC 16d80 3c 0 std::vector >::size() const +16d80 c 402 73 +16d8c 30 403 71 +16dbc c 603 72 +16dc8 c 603 72 +FUNC 16dd4 23 0 std::vector >::begin() +16dd4 c 333 73 +16de0 17 334 71 +16df7 1 334 71 +16e04 33 654 72 +16e37 1 654 72 +FUNC 16e38 26 0 std::vector >::end() +16e38 c 351 73 +16e44 1a 352 71 +16e6a 7 614 72 +16e71 1 614 72 +FUNC 16e72 42 0 std::vector >::operator[](unsigned long) +16e72 c 494 73 +16e7e 36 495 71 +FUNC 16eb4 13 0 std::vector >::max_size() const +16eb4 c 407 73 +16ec0 7 408 71 +16ec7 1 408 71 +16ed4 5 666 72 +16ed9 1 666 72 +16ee6 d 623 72 +16ef3 5 624 72 +16ef8 c 382 62 +16f04 d 382 62 +16f11 1 382 62 +FUNC 16f12 2b 0 std::_Deque_base >::get_allocator() const +16f12 10 360 73 +16f22 1b 361 62 +16f3d 1 361 62 +FUNC 16f3e 2d 0 std::deque >::get_allocator() const +16f3e 10 764 73 +16f4e 1d 765 62 +16f6b 1 765 62 +FUNC 16f6c 13 0 std::_Deque_iterator::operator*() const +16f6c c 134 73 +16f78 7 135 62 +16f7f 1 135 62 +16f8c 2 107 68 +16f8e c 129 62 +16f9a 30 131 62 +FUNC 16fca 2c 0 std::deque >::end() const +16fca 10 799 73 +16fda 1c 800 62 +FUNC 16ff6 2c 0 std::deque >::begin() const +16ff6 10 781 73 +17006 1c 782 62 +FUNC 17022 2e 0 std::deque >::end() +17022 10 790 73 +17032 1e 791 62 +FUNC 17050 3c 0 std::vector >::_M_range_check(unsigned long) const +17050 13 515 73 +17063 15 517 71 +17078 14 518 71 +FUNC 1708c 32 0 std::vector >::at(unsigned long) +1708c c 534 73 +17098 12 536 71 +170aa 14 537 71 +170ca 2e 104 68 +170f8 c 84 71 +17104 2f 85 71 +17133 2 86 71 +17135 1 86 71 +17136 c 96 71 +17142 12 97 71 +17154 2 98 71 +17156 c 603 72 +17162 c 603 72 +FUNC 1716e 23 0 std::vector >::begin() +1716e c 333 73 +1717a 17 334 71 +17191 1 334 71 +1719e 27 654 72 +171c5 1 654 72 +FUNC 171c6 42 0 std::vector >::operator[](unsigned long) +171c6 c 494 73 +171d2 36 495 71 +FUNC 17208 26 0 std::vector >::end() +17208 c 351 73 +17214 1a 352 71 +1723a d 94 68 +17247 1 94 68 +FUNC 17248 2f 0 std::_Vector_base >::_M_deallocate(unsigned char*, unsigned long) +17248 c 120 73 +17254 6 122 71 +1725a 1d 123 71 +17277 1 123 71 +17278 c 108 71 +17284 3a 109 71 +172be c 188 71 +172ca 12 189 71 +172dc 2 190 71 +172de c 272 71 +172ea 4b 273 71 +17335 1 273 71 +17336 13 62 74 +17349 10 62 74 +17359 a 63 74 +17363 25 64 74 +17388 1a 66 74 +173a2 13 62 74 +173b5 10 62 74 +173c5 a 63 74 +173cf 25 64 74 +173f4 1a 66 74 +1740e c 188 71 +1741a 12 189 71 +1742c 2 190 71 +1743b 31 759 72 +1746c c 65 68 +17478 2 65 68 +1747a c 103 69 +17486 d 103 69 +17493 1 103 69 +FUNC 17494 2d 0 std::list, std::allocator > >::get_allocator() const +17494 10 570 74 +174a4 1d 571 66 +174c1 1 571 66 +174ce 2e 104 68 +FUNC 174fc 20 0 std::_List_iterator >::operator!=(std::_List_iterator > const&) const +174fc c 172 74 +17508 14 173 66 +FUNC 1751c 1d 0 std::_List_const_iterator >::operator++() +1751c c 219 74 +17528 c 221 66 +17534 5 222 66 +17539 1 222 66 +FUNC 1753a 1d 0 std::_List_iterator >::operator++() +1753a c 138 74 +17546 c 140 66 +17552 5 141 66 +17557 1 141 66 +FUNC 17558 16 0 std::_List_const_iterator >::operator*() const +17558 c 211 74 +17564 a 212 66 +FUNC 1756e 16 0 std::_List_iterator >::operator*() const +1756e c 130 74 +1757a a 131 66 +FUNC 17584 20 0 std::_List_const_iterator >::operator==(std::_List_const_iterator > const&) const +17584 c 249 74 +17590 14 250 66 +FUNC 175a4 35 0 bool __gnu_cxx::operator!= > >(__gnu_cxx::__normal_iterator > > const&, __gnu_cxx::__normal_iterator > > const&) +175a4 d 699 74 +175b1 28 700 72 +175d9 1 700 72 +FUNC 175da 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator > >, std::allocator >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, std::allocator) +175da c 171 74 +175e6 2 173 73 +175e8 1a 174 73 +17602 21 173 73 +17623 2 174 73 +17625 1 174 73 +17626 c 127 62 +17632 29 127 62 +1765b 1 127 62 +1765c c 388 62 +17668 41 389 62 +176a9 2 390 62 +176ab 1 390 62 +176b8 d 94 68 +176c5 1 94 68 +FUNC 176c6 20 0 bool std::operator==(std::_Deque_iterator const&, std::_Deque_iterator const&) +176c6 c 243 74 +176d2 14 244 62 +FUNC 176e6 26 0 bool std::operator!=(std::_Deque_iterator const&, std::_Deque_iterator const&) +176e6 c 256 74 +176f2 1a 257 62 +FUNC 1770c 1a 0 std::_Deque_iterator::_S_buffer_size() +1770c c 106 74 +17718 e 107 62 +FUNC 17726 3e 0 std::_Deque_iterator::_M_set_node(unsigned long long**) +17726 d 229 74 +17733 9 231 62 +1773c b 232 62 +17747 1d 233 62 +FUNC 17764 50 0 std::_Deque_iterator::operator++() +17764 c 142 74 +17770 d 144 62 +1777d f 145 62 +1778c 18 147 62 +177a4 b 148 62 +177af 5 150 62 +FUNC 177b4 4b 0 void std::_Destroy, std::allocator >(std::_Deque_iterator, std::_Deque_iterator, std::allocator) +177b4 c 171 74 +177c0 2 173 73 +177c2 1a 174 73 +177dc 21 173 73 +177fd 2 174 73 +177ff 1 174 73 +FUNC 17800 50 0 std::_Deque_iterator::operator--() +17800 c 162 74 +1780c f 164 62 +1781b 18 166 62 +17833 b 167 62 +1783e d 169 62 +1784b 5 170 62 +FUNC 17850 39 0 std::deque >::back() +17850 c 988 74 +1785c 15 990 62 +17871 b 991 62 +1787c d 992 62 +17889 1 992 62 +FUNC 1788a 19 0 std::stack > >::top() +1788a c 163 75 +17896 d 166 75 +178a3 1 166 75 +FUNC 178a4 66 0 std::_Deque_iterator::difference_type std::operator-(std::_Deque_iterator const&, std::_Deque_iterator const&) +178a4 d 328 75 +178b1 59 333 62 +FUNC 1790a 26 0 std::deque >::size() const +1790a c 840 75 +17916 1a 841 62 +1793c 36 662 72 +1797e 23 650 72 +179a1 1 650 72 +179a2 c 67 68 +179ae 2 67 68 +179b0 c 99 69 +179bc 14 100 69 +179d0 c 303 66 +179dc 12 304 66 +179ee 2 305 66 +179f0 c 326 66 +179fc 2f 327 66 +17a2b d 328 66 +17a38 c 457 66 +17a44 14 458 66 +17a58 c 211 74 +17a64 2d 211 74 +17a91 1 211 74 +17a9e 7 98 68 +17aa5 1 98 68 +17ab2 1d 85 68 +17acf 5 86 68 +17ad4 17 88 68 +17aeb 1 88 68 +FUNC 17aec 2a 0 std::_Vector_base >::_M_allocate(unsigned long) +17aec c 116 75 +17af8 1e 117 71 +17b22 d 94 68 +17b2f 1 94 68 +FUNC 17b30 34 0 std::_Deque_base >::_M_deallocate_node(unsigned long long*) +17b30 c 402 75 +17b3c 28 403 62 +FUNC 17b64 38 0 std::_Deque_base >::_M_destroy_nodes(unsigned long long**, unsigned long long**) +17b64 c 504 75 +17b70 8 506 62 +17b78 14 507 62 +17b8c e 506 62 +17b9a 2 507 62 +FUNC 17b9c 62 0 std::deque >::_M_pop_back_aux() +17b9c c 391 76 +17ba8 15 393 76 +17bbd 1b 394 76 +17bd8 f 395 76 +17be7 17 396 76 +FUNC 17bfe 4f 0 std::deque >::pop_back() +17bfe c 1081 76 +17c0a 10 1083 62 +17c1a f 1086 62 +17c29 17 1087 62 +17c40 d 1090 62 +17c4d 1 1090 62 +FUNC 17c4e 19 0 std::stack > >::pop() +17c4e c 205 76 +17c5a d 208 75 +17c67 1 208 75 +17c68 c 72 68 +17c74 2 72 68 +17c76 c 105 69 +17c82 d 105 69 +17c8f 1 105 69 +17c90 c 603 72 +17c9c c 603 72 +FUNC 17ca8 2b 0 std::vector >::begin() const +17ca8 c 342 76 +17cb4 1f 343 71 +17cd3 1 343 71 +FUNC 17cd4 2c 0 std::vector >::end() const +17cd4 c 360 76 +17ce0 20 361 71 +17d0c 5 666 72 +17d11 1 666 72 +17d1f 28 759 72 +17d47 1 759 72 +FUNC 17d48 3c 0 std::vector >::size() const +17d48 c 402 76 +17d54 30 403 71 +17d90 d 623 72 +17d9d 5 624 72 +17dae 5 666 72 +17db3 1 666 72 +FUNC 17db4 35 0 bool __gnu_cxx::operator!= > >(__gnu_cxx::__normal_iterator > > const&, __gnu_cxx::__normal_iterator > > const&) +17db4 d 699 76 +17dc1 28 700 72 +17de9 1 700 72 +FUNC 17dea 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator > >, std::allocator >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, std::allocator) +17dea c 171 76 +17df6 2 173 73 +17df8 1a 174 73 +17e12 21 173 73 +17e33 2 174 73 +17e35 1 174 73 +17e43 28 759 72 +17e6b 1 759 72 +17e78 2a 662 72 +FUNC 17ea2 13 0 std::vector >::max_size() const +17ea2 c 407 76 +17eae 7 408 71 +17eb5 1 408 71 +17ec2 16 650 72 +17ee4 7 98 68 +17eeb 1 98 68 +17ef8 1d 85 68 +17f15 5 86 68 +17f1a 10 88 68 +FUNC 17f2a 29 0 std::_List_base, std::allocator > >::_M_get_node() +17f2a c 311 76 +17f36 1d 312 66 +17f53 1 312 66 +FUNC 17f54 5f 0 std::list, std::allocator > >::_M_create_node(std::pair const&) +17f54 d 435 76 +17f61 e 437 66 +17f6f 3c 440 66 +17fab 8 447 66 +17fb3 1 447 66 +FUNC 17fb4 35 0 std::list, std::allocator > >::_M_insert(std::_List_iterator >, std::pair const&) +17fb4 c 1149 76 +17fc0 15 1151 66 +17fd5 14 1152 66 +17fe9 1 1152 66 +FUNC 17fea 52 0 void std::list, std::allocator > >::_M_insert_dispatch > >(std::_List_iterator >, std::_List_const_iterator >, std::_List_const_iterator >, __false_type) +17fea c 1126 66 +17ff6 2 1128 66 +17ff8 21 1129 66 +18019 21 1128 66 +1803a 2 1129 66 +FUNC 1803c 36 0 void std::list, std::allocator > >::insert > >(std::_List_iterator >, std::_List_const_iterator >, std::_List_const_iterator >) +1803c c 838 66 +18048 2a 842 66 +18072 e 491 66 +18080 32 492 66 +180b2 64 493 66 +18116 c 211 74 +18122 3d 211 74 +1815f 1 211 74 +1816d 5c 104 68 +181c9 1 104 68 +FUNC 181ca 31 0 std::list, std::allocator > >::push_back(std::pair const&) +181ca c 772 76 +181d6 25 773 66 +181fb 1 773 66 +FUNC 181fc 69 0 void std::_Construct(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev const&) +181fc d 77 76 +18209 5c 81 73 +18265 1 81 73 +18272 7 98 68 +18279 1 98 68 +18286 1d 85 68 +182a3 5 86 68 +182a8 10 88 68 +182b8 c 65 68 +182c4 2 65 68 +182c6 c 103 69 +182d2 d 103 69 +182df 1 103 69 +FUNC 182e0 4d 0 std::_Deque_base >::_M_get_map_allocator() const +182e0 11 394 76 +182f1 3c 395 62 +1832d 1 395 62 +FUNC 1832e 75 0 std::_Deque_base >::_M_allocate_map(unsigned long) +1832e d 406 76 +1833b 68 407 62 +183a3 1 407 62 +FUNC 183a4 47 0 std::_Deque_base >::_M_deallocate_map(unsigned long long**, unsigned long) +183a4 c 410 76 +183b0 3b 411 62 +183eb 1 411 62 +183ec c 424 62 +183f8 9 426 62 +18401 22 428 62 +18423 2b 430 62 +1844e c 714 62 +1845a 70 715 62 +184ca c 111 75 +184d6 d 111 75 +184e3 1 111 75 +184e4 c 259 67 +184f0 26 259 67 +18522 7 98 68 +18529 1 98 68 +18536 1d 85 68 +18553 5 86 68 +18558 10 88 68 +FUNC 18568 33 0 std::_Deque_base >::_M_allocate_node() +18568 c 398 76 +18574 27 399 62 +1859b 1 399 62 +FUNC 1859c 82 0 std::_Deque_base >::_M_create_nodes(unsigned long long**, unsigned long long**) +1859c d 486 76 +185a9 8 491 62 +185b1 12 492 62 +185c3 13 491 62 +185d6 b 494 62 +185e1 19 496 62 +185fa b 497 62 +18605 13 494 62 +18618 6 497 62 +FUNC 1861e 17b 0 std::_Deque_base >::_M_initialize_map(unsigned long) +1861e d 447 76 +1862b 1e 450 62 +18649 2a 452 62 +18673 1c 454 62 +1868f 19 462 62 +186a8 c 463 62 +186b4 1e 466 62 +186d2 b 467 62 +186dd 1e 469 62 +186fb 9 470 62 +18704 a 471 62 +1870e b 472 62 +18719 13 467 62 +1872c 15 475 62 +18741 18 476 62 +18759 c 477 62 +18765 34 478 62 +18799 1 478 62 +1879a d 366 62 +187a7 12 367 62 +187b9 39 368 62 +187f2 c 645 62 +187fe 1c 646 62 +FUNC 1881a 4d 0 void std::__fill::fill<__gnu_cxx::__normal_iterator > >, unsigned char>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char const&) +1881a c 539 61 +18826 9 541 61 +1882f 2 542 61 +18831 13 543 61 +18844 21 542 61 +18865 2 543 61 +18867 1 543 61 +FUNC 18868 2b 0 void std::fill<__gnu_cxx::__normal_iterator > >, unsigned char>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char const&) +18868 c 560 76 +18874 4 567 61 +18878 1b 568 61 +18893 1 568 61 +FUNC 18894 6a 0 std::list, std::allocator > >::_M_erase(std::_List_iterator >) +18894 d 1157 76 +188a1 b 1159 66 +188ac 6 1160 66 +188b2 35 1161 66 +188e7 17 1162 66 +FUNC 188fe 37 0 std::list, std::allocator > >::erase(std::_List_iterator >) +188fe c 95 77 +1890a 14 97 77 +1891e 12 98 77 +18930 5 99 77 +18935 1 99 77 +FUNC 18936 3e 0 std::list, std::allocator > >::erase(std::_List_iterator >, std::_List_iterator >) +18936 c 883 77 +18942 2 885 66 +18944 15 886 66 +18959 16 885 66 +1896f 5 887 66 +FUNC 18974 129 0 std::list, std::allocator > >::operator=(std::list, std::allocator > > const&) +18974 e 120 77 +18982 c 122 77 +1898e e 124 77 +1899c e 125 77 +189aa e 126 77 +189b8 e 127 77 +189c6 2 128 77 +189c8 20 130 77 +189e8 5a 128 77 +18a42 16 131 77 +18a58 1b 132 77 +18a73 20 134 77 +18a93 a 136 77 +18a9d 1 136 77 +FUNC 18a9e 4c 0 dwarf2reader::CompilationUnit::Abbrev::operator=(dwarf2reader::CompilationUnit::Abbrev const&) +18a9e c 211 77 +18aaa 40 211 74 +FUNC 18aea 52 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy::copy(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +18aea c 280 61 +18af6 1a 283 61 +18b10 12 285 61 +18b22 4 286 61 +18b26 6 287 61 +18b2c b 283 61 +18b37 5 289 61 +FUNC 18b3c 2b 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_aux(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +18b3c c 307 77 +18b48 4 315 61 +18b4c 1b 317 61 +18b67 1 317 61 +18b76 56 354 61 +18bd8 4 384 61 +18bdc 4 385 61 +18be0 1b 387 61 +18bfb 1 387 61 +FUNC 18bfc ac 0 std::vector >::erase(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >) +18bfc d 122 78 +18c09 26 124 78 +18c2f 43 125 78 +18c72 2e 126 78 +18ca0 8 127 78 +FUNC 18ca8 54 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_backward::copy_b(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +18ca8 c 408 61 +18cb4 1a 411 61 +18cce 1e 412 61 +18cec b 411 61 +18cf7 5 413 61 +FUNC 18cfc 2b 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_backward_aux(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +18cfc c 432 78 +18d08 4 440 61 +18d0c 1b 443 61 +18d27 1 443 61 +18d36 56 482 61 +18d98 4 514 61 +18d9c 4 515 61 +18da0 1b 517 61 +18dbb 1 517 61 +FUNC 18dbc 4d 0 void std::__fill::fill<__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev const&) +18dbc c 526 61 +18dc8 2 528 61 +18dca 1c 529 61 +18de6 21 528 61 +18e07 2 529 61 +18e09 1 529 61 +FUNC 18e0a 2b 0 void std::fill<__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev const&) +18e0a c 560 78 +18e16 4 567 61 +18e1a 1b 568 61 +18e35 1 568 61 +FUNC 18e36 3f 0 unsigned char* std::__copy::copy(unsigned char const*, unsigned char const*, unsigned char*) +18e36 c 298 61 +18e42 22 300 61 +18e64 11 301 61 +18e75 1 301 61 +FUNC 18e76 2b 0 unsigned char* std::__copy_aux(unsigned char*, unsigned char*, unsigned char*) +18e76 c 307 78 +18e82 4 315 61 +18e86 1b 317 61 +18ea1 1 317 61 +18eb0 56 354 61 +18f12 4 384 61 +18f16 4 385 61 +18f1a 1b 387 61 +18f35 1 387 61 +FUNC 18f36 a0 0 std::vector >::erase(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >) +18f36 d 122 78 +18f43 26 124 78 +18f69 43 125 78 +18fac 22 126 78 +18fce 8 127 78 +18fe2 7 98 68 +18fe9 1 98 68 +18ff6 1d 85 68 +19013 5 86 68 +19018 d 88 68 +19025 1 88 68 +FUNC 19026 2a 0 std::_Vector_base >::_M_allocate(unsigned long) +19026 c 116 78 +19032 1e 117 71 +1905c 1b 74 79 +19077 1 74 79 +19084 23 113 79 +190a7 1 113 79 +190b4 1b 254 79 +190cf 1 254 79 +FUNC 190d0 19 0 void std::_Destroy(dwarf2reader::CompilationUnit::Abbrev*) +190d0 c 106 79 +190dc d 107 73 +190e9 1 107 73 +FUNC 190ea 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __false_type) +190ea c 119 79 +190f6 2 121 73 +190f8 13 122 73 +1910b 21 121 73 +1912c 2 122 73 +FUNC 1912e 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >) +1912e c 148 79 +1913a 1c 155 73 +FUNC 19156 8d 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, __false_type) +19156 d 188 79 +19163 6 190 79 +19169 2 193 79 +1916b 1c 194 79 +19187 1b 193 79 +191a2 b 196 79 +191ad 12 198 79 +191bf b 199 79 +191ca 13 196 79 +191dd 6 199 79 +191e3 1 199 79 +FUNC 191e4 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&) +191e4 c 214 79 +191f0 23 218 79 +19213 1 218 79 +FUNC 19214 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, std::allocator) +19214 c 308 79 +19220 1b 310 79 +1923b 1 310 79 +19249 6 82 79 +1924f 2 85 79 +19251 24 86 79 +19275 2c 85 79 +192a1 b 87 79 +192ac b 89 79 +192b7 12 91 79 +192c9 b 92 79 +192d4 13 89 79 +192e7 9 92 79 +192fc 23 113 79 +1931f 1 113 79 +1932c 1b 254 79 +19347 1 254 79 +FUNC 19348 409 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev const&) +19348 14 249 79 +1935c 14 251 78 +19370 22 253 78 +19392 f 255 78 +193a1 12 256 78 +193b3 55 257 78 +19408 4b 260 78 +19453 e 264 78 +19461 15 265 78 +19476 e 266 78 +19484 1d 271 78 +194a1 8 272 78 +194a9 e 273 78 +194b7 27 275 78 +194de 6 276 78 +194e4 55 279 78 +19539 25 284 78 +1955e b 285 78 +19569 4f 286 78 +195b8 3 284 78 +195bb 13 279 78 +195ce e 286 78 +195dc 4d 298 78 +19629 36 299 78 +1965f 12 302 78 +19671 13 303 78 +19684 2e 304 78 +196b2 13 286 78 +196c5 b 292 78 +196d0 39 294 78 +19709 23 295 78 +1972c b 296 78 +19737 13 292 78 +1974a 7 304 78 +19751 1 304 78 +FUNC 19752 70 0 std::vector >::push_back(dwarf2reader::CompilationUnit::Abbrev const&) +19752 c 602 79 +1975e 10 604 71 +1976e 1e 606 71 +1978c 11 607 71 +1979d 25 610 71 +FUNC 197c2 50 0 unsigned char* std::__copy_backward::copy_b(unsigned char const*, unsigned char const*, unsigned char*) +197c2 d 422 61 +197cf f 424 61 +197de 24 425 61 +19802 10 426 61 +FUNC 19812 2b 0 unsigned char* std::__copy_backward_aux(unsigned char*, unsigned char*, unsigned char*) +19812 c 432 79 +1981e 4 440 61 +19822 1b 443 61 +1983d 1 443 61 +1984c 56 482 61 +198ae 4 514 61 +198b2 4 515 61 +198b6 1b 517 61 +198d1 1 517 61 +FUNC 198d2 32 0 unsigned char* std::fill_n(unsigned char*, unsigned long, unsigned char const&) +198d2 c 647 79 +198de 1e 649 61 +198fc 8 650 61 +FUNC 19904 27 0 void std::__uninitialized_fill_n_aux(unsigned char*, unsigned long, unsigned char const&, __true_type) +19904 c 182 79 +19910 1b 183 79 +1992b 1 183 79 +FUNC 1992c 2f 0 void std::uninitialized_fill_n(unsigned char*, unsigned long, unsigned char const&) +1992c c 214 79 +19938 23 218 79 +1995b 1 218 79 +FUNC 1995c 27 0 void std::__uninitialized_fill_n_a(unsigned char*, unsigned long, unsigned char const&, std::allocator) +1995c c 308 79 +19968 1b 310 79 +19983 1 310 79 +FUNC 19984 27 0 void std::__destroy_aux(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, __false_type) +19984 c 119 79 +19990 2 121 73 +19992 b 122 73 +1999d c 121 73 +199a9 2 122 73 +199ab 1 122 73 +FUNC 199ac 28 0 void std::_Destroy(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +199ac c 148 79 +199b8 1c 155 73 +FUNC 199d4 88 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_aux(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, __false_type) +199d4 d 80 79 +199e1 6 82 79 +199e7 2 85 79 +199e9 12 86 79 +199fb 12 85 79 +19a0d b 87 79 +19a18 b 89 79 +19a23 12 91 79 +19a35 b 92 79 +19a40 13 89 79 +19a53 9 92 79 +FUNC 19a5c 2f 0 dwarf2reader::CompilationUnit::Abbrev* std::uninitialized_copy(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +19a5c c 108 79 +19a68 23 113 79 +19a8b 1 113 79 +FUNC 19a8c 27 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_a(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, std::allocator) +19a8c c 252 79 +19a98 1b 254 79 +19ab3 1 254 79 +FUNC 19ab4 7e 0 void std::__uninitialized_fill_n_aux(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, __false_type) +19ab4 d 188 79 +19ac1 6 190 79 +19ac7 2 193 79 +19ac9 12 194 79 +19adb 16 193 79 +19af1 b 196 79 +19afc 12 198 79 +19b0e b 199 79 +19b19 13 196 79 +19b2c 6 199 79 +FUNC 19b32 2f 0 void std::uninitialized_fill_n(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&) +19b32 c 214 79 +19b3e 23 218 79 +19b61 1 218 79 +FUNC 19b62 27 0 void std::__uninitialized_fill_n_a(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, std::allocator) +19b62 c 308 79 +19b6e 1b 310 79 +19b89 1 310 79 +FUNC 19b8a a5 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_aux<__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*, __false_type) +19b8a d 80 79 +19b97 6 82 79 +19b9d 2 85 79 +19b9f 1a 86 79 +19bb9 27 85 79 +19be0 b 87 79 +19beb b 89 79 +19bf6 12 91 79 +19c08 b 92 79 +19c13 13 89 79 +19c26 9 92 79 +19c2f 1 92 79 +FUNC 19c30 2f 0 dwarf2reader::CompilationUnit::Abbrev* std::uninitialized_copy<__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*) +19c30 c 108 79 +19c3c 23 113 79 +19c5f 1 113 79 +FUNC 19c60 27 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*, std::allocator) +19c60 c 252 79 +19c6c 1b 254 79 +19c87 1 254 79 +FUNC 19c88 5f8 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&) +19c88 15 311 79 +19c9d b 313 78 +19ca8 2a 315 78 +19cd2 12 318 78 +19ce4 23 319 78 +19d07 15 320 78 +19d1c c 321 78 +19d28 5a 323 78 +19d82 1c 327 78 +19d9e 35 328 78 +19dd3 16 323 78 +19de9 30 330 78 +19e19 10 343 78 +19e29 48 334 78 +19e71 21 338 78 +19e92 3d 339 78 +19ecf 13 334 78 +19ee2 b 339 78 +19eed 1c 342 78 +19f09 1e 343 78 +19f27 13 339 78 +19f3a 24 343 78 +19f5e e 348 78 +19f6c 1e 349 78 +19f8a e 350 78 +19f98 1d 353 78 +19fb5 8 354 78 +19fbd e 355 78 +19fcb 27 357 78 +19ff2 6 358 78 +19ff8 4d 361 78 +1a045 40 365 78 +1a085 18 367 78 +1a09d 44 368 78 +1a0e1 3 365 78 +1a0e4 19 361 78 +1a0fd 13 365 78 +1a110 e 368 78 +1a11e 3e 379 78 +1a15c 36 381 78 +1a192 12 384 78 +1a1a4 13 385 78 +1a1b7 2e 386 78 +1a1e5 e 368 78 +1a1f3 b 372 78 +1a1fe 39 374 78 +1a237 23 376 78 +1a25a b 377 78 +1a265 13 372 78 +1a278 8 386 78 +FUNC 1a280 2e 0 std::vector >::insert(__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&) +1a280 c 657 79 +1a28c 22 658 71 +FUNC 1a2ae ab 0 std::vector >::resize(unsigned long, dwarf2reader::CompilationUnit::Abbrev const&) +1a2ae d 422 79 +1a2bb 15 424 71 +1a2d0 48 425 71 +1a318 41 427 71 +1a359 1 427 71 +FUNC 1a35a 63 0 std::vector >::resize(unsigned long) +1a35a d 441 79 +1a367 56 442 71 +1a3bd 1 442 71 +FUNC 1a3be 13 0 std::_Deque_iterator::operator*() const +1a3be c 134 79 +1a3ca 7 135 62 +1a3d1 1 135 62 +FUNC 1a3d2 3f 0 unsigned long long** std::__copy::copy(unsigned long long* const*, unsigned long long* const*, unsigned long long**) +1a3d2 c 298 61 +1a3de 22 300 61 +1a400 11 301 61 +1a411 1 301 61 +FUNC 1a412 2b 0 unsigned long long** std::__copy_aux(unsigned long long**, unsigned long long**, unsigned long long**) +1a412 c 307 79 +1a41e 4 315 61 +1a422 1b 317 61 +1a43d 1 317 61 +FUNC 1a43e 27 0 unsigned long long** std::__copy_normal::copy_n(unsigned long long**, unsigned long long**, unsigned long long**) +1a43e c 325 61 +1a44a 1b 326 61 +1a465 1 326 61 +FUNC 1a466 2f 0 unsigned long long** std::copy(unsigned long long**, unsigned long long**, unsigned long long**) +1a466 c 376 79 +1a472 4 384 61 +1a476 4 385 61 +1a47a 1b 387 61 +1a495 1 387 61 +FUNC 1a496 60 0 unsigned long long** std::__copy_backward::copy_b(unsigned long long* const*, unsigned long long* const*, unsigned long long**) +1a496 d 422 61 +1a4a3 12 424 61 +1a4b5 2e 425 61 +1a4e3 13 426 61 +FUNC 1a4f6 2b 0 unsigned long long** std::__copy_backward_aux(unsigned long long**, unsigned long long**, unsigned long long**) +1a4f6 c 432 79 +1a502 4 440 61 +1a506 1b 443 61 +1a521 1 443 61 +FUNC 1a522 27 0 unsigned long long** std::__copy_backward_normal::copy_b_n(unsigned long long**, unsigned long long**, unsigned long long**) +1a522 c 451 61 +1a52e 1b 452 61 +1a549 1 452 61 +FUNC 1a54a 2f 0 unsigned long long** std::copy_backward(unsigned long long**, unsigned long long**, unsigned long long**) +1a54a c 504 79 +1a556 4 514 61 +1a55a 4 515 61 +1a55e 1b 517 61 +1a579 1 517 61 +FUNC 1a57a 1df 0 std::deque >::_M_reallocate_map(unsigned long, bool) +1a57a 13 723 79 +1a58d 1b 726 76 +1a5a8 9 727 76 +1a5b1 13 730 76 +1a5c4 39 732 76 +1a5fd b 735 76 +1a608 27 736 76 +1a62f 2f 740 76 +1a65e 26 748 76 +1a684 15 750 76 +1a699 36 751 76 +1a6cf 22 753 76 +1a6f1 1e 756 76 +1a70f 8 758 76 +1a717 9 759 76 +1a720 15 762 76 +1a735 24 763 76 +1a759 1 763 76 +FUNC 1a75a 59 0 std::deque >::_M_reserve_map_at_back(unsigned long) +1a75a e 1443 79 +1a768 2a 1445 62 +1a792 21 1447 62 +1a7b3 1 1447 62 +FUNC 1a7b4 8c 0 std::deque >::_M_push_back_aux(unsigned long long const&) +1a7b4 c 345 79 +1a7c0 e 347 76 +1a7ce 13 348 76 +1a7e1 18 349 76 +1a7f9 1e 352 76 +1a817 1b 353 76 +1a832 c 355 76 +1a83e 2 360 76 +FUNC 1a840 62 0 std::deque >::push_back(unsigned long long const&) +1a840 c 1039 79 +1a84c 13 1041 62 +1a85f 1e 1044 62 +1a87d 11 1045 62 +1a88e 14 1048 62 +FUNC 1a8a2 20 0 std::stack > >::push(unsigned long long const&) +1a8a2 c 190 79 +1a8ae 14 191 75 +FUNC 1a8c2 27 0 unsigned char* std::__copy_normal::copy_n(unsigned char*, unsigned char*, unsigned char*) +1a8c2 c 325 61 +1a8ce 1b 326 61 +1a8e9 1 326 61 +FUNC 1a8ea 2f 0 unsigned char* std::copy(unsigned char*, unsigned char*, unsigned char*) +1a8ea c 376 79 +1a8f6 4 384 61 +1a8fa 4 385 61 +1a8fe 1b 387 61 +1a919 1 387 61 +FUNC 1a91a 27 0 unsigned char* std::__uninitialized_copy_aux(unsigned char*, unsigned char*, unsigned char*, __true_type) +1a91a c 73 79 +1a926 1b 74 79 +1a941 1 74 79 +FUNC 1a942 2f 0 unsigned char* std::uninitialized_copy(unsigned char*, unsigned char*, unsigned char*) +1a942 c 108 79 +1a94e 23 113 79 +1a971 1 113 79 +FUNC 1a972 27 0 unsigned char* std::__uninitialized_copy_a(unsigned char*, unsigned char*, unsigned char*, std::allocator) +1a972 c 252 79 +1a97e 1b 254 79 +1a999 1 254 79 +FUNC 1a99a 40 0 unsigned char* std::__copy_normal::copy_n<__gnu_cxx::__normal_iterator > >, unsigned char*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char*) +1a99a d 334 61 +1a9a7 33 335 61 +FUNC 1a9da 2f 0 unsigned char* std::copy<__gnu_cxx::__normal_iterator > >, unsigned char*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char*) +1a9da c 376 79 +1a9e6 4 384 61 +1a9ea 4 385 61 +1a9ee 1b 387 61 +1aa09 1 387 61 +FUNC 1aa0a 27 0 unsigned char* std::__uninitialized_copy_aux<__gnu_cxx::__normal_iterator > >, unsigned char*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char*, __true_type) +1aa0a c 73 79 +1aa16 1b 74 79 +1aa31 1 74 79 +FUNC 1aa32 2f 0 unsigned char* std::uninitialized_copy<__gnu_cxx::__normal_iterator > >, unsigned char*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char*) +1aa32 c 108 79 +1aa3e 23 113 79 +1aa61 1 113 79 +FUNC 1aa62 27 0 unsigned char* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator > >, unsigned char*, unsigned char>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char*, std::allocator) +1aa62 c 252 79 +1aa6e 1b 254 79 +1aa89 1 254 79 +1aa96 9 616 61 +1aa9f 2 617 61 +1aaa1 13 618 61 +1aab4 16 617 61 +1aaca 5 619 61 +1aacf 1 619 61 +1aadc 4 641 61 +1aae0 1b 642 61 +1aafb 1 642 61 +FUNC 1aafc 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char>(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char const&, __true_type) +1aafc c 182 79 +1ab08 1b 183 79 +1ab23 1 183 79 +FUNC 1ab24 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char>(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char const&) +1ab24 c 214 79 +1ab30 23 218 79 +1ab53 1 218 79 +FUNC 1ab54 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char, unsigned char>(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char const&, std::allocator) +1ab54 c 308 79 +1ab60 1b 310 79 +1ab7b 1 310 79 +FUNC 1ab7c 45a 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char const&) +1ab7c 14 311 79 +1ab90 b 313 78 +1ab9b 21 315 78 +1abbc 9 318 78 +1abc5 23 319 78 +1abe8 15 320 78 +1abfd c 321 78 +1ac09 4e 323 78 +1ac57 11 327 78 +1ac68 30 328 78 +1ac98 35 330 78 +1accd 48 334 78 +1ad15 14 338 78 +1ad29 43 339 78 +1ad6c 11 342 78 +1ad7d 1e 343 78 +1ad9b e 348 78 +1ada9 1e 349 78 +1adc7 e 350 78 +1add5 1d 353 78 +1adf2 8 354 78 +1adfa e 355 78 +1ae08 27 357 78 +1ae2f 6 358 78 +1ae35 4d 361 78 +1ae82 40 365 78 +1aec2 18 367 78 +1aeda 4d 368 78 +1af27 3e 379 78 +1af65 2d 381 78 +1af92 12 384 78 +1afa4 13 385 78 +1afb7 1f 386 78 +FUNC 1afd6 2e 0 std::vector >::insert(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char const&) +1afd6 c 657 79 +1afe2 22 658 71 +FUNC 1b004 ab 0 std::vector >::resize(unsigned long, unsigned char const&) +1b004 d 422 79 +1b011 15 424 71 +1b026 48 425 71 +1b06e 41 427 71 +1b0af 1 427 71 +FUNC 1b0b0 2b 0 std::vector >::resize(unsigned long) +1b0b0 c 441 79 +1b0bc 1f 442 71 +1b0db 1 442 71 +FUNC 1b0dc 1a 0 std::_Deque_iterator::_S_buffer_size() +1b0dc c 106 79 +1b0e8 e 107 62 +FUNC 1b0f6 66 0 std::_Deque_iterator::difference_type std::operator-(std::_Deque_iterator const&, std::_Deque_iterator const&) +1b0f6 d 328 79 +1b103 59 333 62 +FUNC 1b15c 3e 0 std::_Deque_iterator::_M_set_node(unsigned long long**) +1b15c d 229 79 +1b169 9 231 62 +1b172 b 232 62 +1b17d 1d 233 62 +FUNC 1b19a 50 0 std::_Deque_iterator::operator++() +1b19a c 142 79 +1b1a6 d 144 62 +1b1b3 f 145 62 +1b1c2 18 147 62 +1b1da b 148 62 +1b1e5 5 150 62 +FUNC 1b1ea 84 0 std::_Deque_iterator std::__copy::copy, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator) +1b1ea e 280 61 +1b1f8 17 283 61 +1b20f 20 285 61 +1b22f b 286 61 +1b23a b 287 61 +1b245 b 283 61 +1b250 1e 289 61 +FUNC 1b26e 7e 0 std::_Deque_iterator std::__copy_aux, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator) +1b26e 11 307 79 +1b27f 4 315 61 +1b283 69 317 61 +FUNC 1b2ec 7a 0 std::_Deque_iterator std::__copy_normal::copy_n, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator) +1b2ec 11 325 61 +1b2fd 69 326 61 +FUNC 1b366 82 0 std::_Deque_iterator std::copy, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator) +1b366 11 376 79 +1b377 4 384 61 +1b37b 4 385 61 +1b37f 69 387 61 +FUNC 1b3e8 7a 0 std::_Deque_iterator std::__uninitialized_copy_aux, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator, __true_type) +1b3e8 11 73 79 +1b3f9 69 74 79 +FUNC 1b462 82 0 std::_Deque_iterator std::uninitialized_copy, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator) +1b462 11 108 79 +1b473 71 113 79 +FUNC 1b4e4 7a 0 std::_Deque_iterator std::__uninitialized_copy_a, std::_Deque_iterator, unsigned long long>(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator, std::allocator) +1b4e4 11 252 79 +1b4f5 69 254 79 +1b55e 10 679 62 +1b56e 64 680 62 +1b5d2 e8 681 62 +1b6ba c 143 75 +1b6c6 14 144 75 +1b6da 6 144 75 +FUNC 1b6e0 4d 0 __eprintf +1b6e0 6 1826 80 +1b6e6 3 1832 80 +1b6e9 c 1826 80 +1b6f5 29 1832 80 +1b71e a 1837 80 +1b728 5 1838 80 +1b72d e8d3 1838 80 diff --git a/thirdparty/google-breakpad/r318/src/client/minidump_file_writer-inl.h b/thirdparty/google-breakpad/r318/src/client/minidump_file_writer-inl.h new file mode 100644 index 00000000..7c556a27 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/minidump_file_writer-inl.h @@ -0,0 +1,94 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_file_writer-inl.h: Minidump file writer implementation. +// +// See minidump_file_writer.h for documentation. + +#ifndef CLIENT_MINIDUMP_FILE_WRITER_INL_H__ +#define CLIENT_MINIDUMP_FILE_WRITER_INL_H__ + +#include + +#include "client/minidump_file_writer.h" +#include "google_breakpad/common/minidump_size.h" + +namespace google_breakpad { + +template +inline bool TypedMDRVA::Allocate() { + allocation_state_ = SINGLE_OBJECT; + return UntypedMDRVA::Allocate(minidump_size::size()); +} + +template +inline bool TypedMDRVA::Allocate(size_t additional) { + allocation_state_ = SINGLE_OBJECT; + return UntypedMDRVA::Allocate(minidump_size::size() + additional); +} + +template +inline bool TypedMDRVA::AllocateArray(size_t count) { + assert(count); + allocation_state_ = ARRAY; + return UntypedMDRVA::Allocate(minidump_size::size() * count); +} + +template +inline bool TypedMDRVA::AllocateObjectAndArray(unsigned int count, + size_t size) { + assert(count && size); + allocation_state_ = SINGLE_OBJECT_WITH_ARRAY; + return UntypedMDRVA::Allocate(minidump_size::size() + count * size); +} + +template +inline bool TypedMDRVA::CopyIndex(unsigned int index, MDType *item) { + assert(allocation_state_ == ARRAY); + return writer_->Copy(position_ + index * minidump_size::size(), item, + minidump_size::size()); +} + +template +inline bool TypedMDRVA::CopyIndexAfterObject(unsigned int index, + const void *src, + size_t size) { + assert(allocation_state_ == SINGLE_OBJECT_WITH_ARRAY); + return writer_->Copy(position_ + minidump_size::size() + index * size, + src, size); +} + +template +inline bool TypedMDRVA::Flush() { + return writer_->Copy(position_, &data_, minidump_size::size()); +} + +} // namespace google_breakpad + +#endif // CLIENT_MINIDUMP_FILE_WRITER_INL_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/minidump_file_writer.cc b/thirdparty/google-breakpad/r318/src/client/minidump_file_writer.cc new file mode 100644 index 00000000..fdd59198 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/minidump_file_writer.cc @@ -0,0 +1,251 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_file_writer.cc: Minidump file writer implementation. +// +// See minidump_file_writer.h for documentation. + +#include +#include +#include +#include +#include + +#include "client/minidump_file_writer-inl.h" +#include "common/string_conversion.h" + +namespace google_breakpad { + +const MDRVA MinidumpFileWriter::kInvalidMDRVA = static_cast(-1); + +MinidumpFileWriter::MinidumpFileWriter() : file_(-1), position_(0), size_(0) { +} + +MinidumpFileWriter::~MinidumpFileWriter() { + Close(); +} + +bool MinidumpFileWriter::Open(const char *path) { + assert(file_ == -1); + file_ = open(path, O_WRONLY | O_CREAT | O_EXCL, 0600); + + return file_ != -1; +} + +bool MinidumpFileWriter::Close() { + bool result = true; + + if (file_ != -1) { + ftruncate(file_, position_); + result = (close(file_) == 0); + file_ = -1; + } + + return result; +} + +bool MinidumpFileWriter::CopyStringToMDString(const wchar_t *str, + unsigned int length, + TypedMDRVA *mdstring) { + bool result = true; + if (sizeof(wchar_t) == sizeof(u_int16_t)) { + // Shortcut if wchar_t is the same size as MDString's buffer + result = mdstring->Copy(str, mdstring->get()->length); + } else { + u_int16_t out[2]; + int out_idx = 0; + + // Copy the string character by character + while (length && result) { + UTF32ToUTF16Char(*str, out); + if (!out[0]) + return false; + + // Process one character at a time + --length; + ++str; + + // Append the one or two UTF-16 characters. The first one will be non- + // zero, but the second one may be zero, depending on the conversion from + // UTF-32. + int out_count = out[1] ? 2 : 1; + int out_size = sizeof(u_int16_t) * out_count; + result = mdstring->CopyIndexAfterObject(out_idx, out, out_size); + out_idx += out_count; + } + } + return result; +} + +bool MinidumpFileWriter::CopyStringToMDString(const char *str, + unsigned int length, + TypedMDRVA *mdstring) { + bool result = true; + u_int16_t out[2]; + int out_idx = 0; + + // Copy the string character by character + while (length && result) { + int conversion_count = UTF8ToUTF16Char(str, length, out); + if (!conversion_count) + return false; + + // Move the pointer along based on the nubmer of converted characters + length -= conversion_count; + str += conversion_count; + + // Append the one or two UTF-16 characters + int out_count = out[1] ? 2 : 1; + int out_size = sizeof(u_int16_t) * out_count; + result = mdstring->CopyIndexAfterObject(out_idx, out, out_size); + out_idx += out_count; + } + return result; +} + +template +bool MinidumpFileWriter::WriteStringCore(const CharType *str, + unsigned int length, + MDLocationDescriptor *location) { + assert(str); + assert(location); + // Calculate the mdstring length by either limiting to |length| as passed in + // or by finding the location of the NULL character. + unsigned int mdstring_length = 0; + if (!length) + length = INT_MAX; + for (; mdstring_length < length && str[mdstring_length]; ++mdstring_length) + ; + + // Allocate the string buffer + TypedMDRVA mdstring(this); + if (!mdstring.AllocateObjectAndArray(mdstring_length + 1, sizeof(u_int16_t))) + return false; + + // Set length excluding the NULL and copy the string + mdstring.get()->length = mdstring_length * sizeof(u_int16_t); + bool result = CopyStringToMDString(str, mdstring_length, &mdstring); + + // NULL terminate + if (result) { + u_int16_t ch = 0; + result = mdstring.CopyIndexAfterObject(mdstring_length, &ch, sizeof(ch)); + + if (result) + *location = mdstring.location(); + } + + return result; +} + +bool MinidumpFileWriter::WriteString(const wchar_t *str, unsigned int length, + MDLocationDescriptor *location) { + return WriteStringCore(str, length, location); +} + +bool MinidumpFileWriter::WriteString(const char *str, unsigned int length, + MDLocationDescriptor *location) { + return WriteStringCore(str, length, location); +} + +bool MinidumpFileWriter::WriteMemory(const void *src, size_t size, + MDMemoryDescriptor *output) { + assert(src); + assert(output); + UntypedMDRVA mem(this); + + if (!mem.Allocate(size)) + return false; + if (!mem.Copy(src, mem.size())) + return false; + + output->start_of_memory_range = reinterpret_cast(src); + output->memory = mem.location(); + + return true; +} + +MDRVA MinidumpFileWriter::Allocate(size_t size) { + assert(size); + assert(file_ != -1); + size_t aligned_size = (size + 7) & ~7; // 64-bit alignment + + if (position_ + aligned_size > size_) { + size_t growth = aligned_size; + size_t minimal_growth = getpagesize(); + + // Ensure that the file grows by at least the size of a memory page + if (growth < minimal_growth) + growth = minimal_growth; + + size_t new_size = size_ + growth; + if (ftruncate(file_, new_size) != 0) + return kInvalidMDRVA; + + size_ = new_size; + } + + MDRVA current_position = position_; + position_ += static_cast(aligned_size); + + return current_position; +} + +bool MinidumpFileWriter::Copy(MDRVA position, const void *src, ssize_t size) { + assert(src); + assert(size); + assert(file_ != -1); + + // Ensure that the data will fit in the allocated space + if (size + position > size_) + return false; + + // Seek and write the data + if (lseek(file_, position, SEEK_SET) == static_cast(position)) + if (write(file_, src, size) == size) + return true; + + return false; +} + +bool UntypedMDRVA::Allocate(size_t size) { + assert(size_ == 0); + size_ = size; + position_ = writer_->Allocate(size_); + return position_ != MinidumpFileWriter::kInvalidMDRVA; +} + +bool UntypedMDRVA::Copy(MDRVA position, const void *src, size_t size) { + assert(src); + assert(size); + assert(position + size <= position_ + size_); + return writer_->Copy(position, src, size); +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/minidump_file_writer.h b/thirdparty/google-breakpad/r318/src/client/minidump_file_writer.h new file mode 100644 index 00000000..f569a553 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/minidump_file_writer.h @@ -0,0 +1,250 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_file_writer.h: Implements file-based minidump generation. It's +// intended to be used with the Google Breakpad open source crash handling +// project. + +#ifndef CLIENT_MINIDUMP_FILE_WRITER_H__ +#define CLIENT_MINIDUMP_FILE_WRITER_H__ + +#include + +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +class UntypedMDRVA; +template class TypedMDRVA; + +// The user of this class can Open() a file and add minidump streams, data, and +// strings using the definitions in minidump_format.h. Since this class is +// expected to be used in a situation where the current process may be +// damaged, it will not allocate heap memory. +// Sample usage: +// MinidumpFileWriter writer; +// writer.Open("/tmp/minidump.dmp"); +// TypedMDRVA header(&writer_); +// header.Allocate(); +// header->get()->signature = MD_HEADER_SIGNATURE; +// : +// writer.Close(); +class MinidumpFileWriter { +public: + // Invalid MDRVA (Minidump Relative Virtual Address) + // returned on failed allocation + static const MDRVA kInvalidMDRVA; + + MinidumpFileWriter(); + ~MinidumpFileWriter(); + + // Open |path| as the destination of the minidump data. Any existing file + // will be overwritten. + // Return true on success, or false on failure + bool Open(const char *path); + + // Close the current file + // Return true on success, or false on failure + bool Close(); + + // Copy the contents of |str| to a MDString and write it to the file. + // |str| is expected to be either UTF-16 or UTF-32 depending on the size + // of wchar_t. + // Maximum |length| of characters to copy from |str|, or specify 0 to use the + // entire NULL terminated string. Copying will stop at the first NULL. + // |location| the allocated location + // Return true on success, or false on failure + bool WriteString(const wchar_t *str, unsigned int length, + MDLocationDescriptor *location); + + // Same as above, except with |str| as a UTF-8 string + bool WriteString(const char *str, unsigned int length, + MDLocationDescriptor *location); + + // Write |size| bytes starting at |src| into the current position. + // Return true on success and set |output| to position, or false on failure + bool WriteMemory(const void *src, size_t size, MDMemoryDescriptor *output); + + // Copies |size| bytes from |src| to |position| + // Return true on success, or false on failure + bool Copy(MDRVA position, const void *src, ssize_t size); + + // Return the current position for writing to the minidump + inline MDRVA position() const { return position_; } + + private: + friend class UntypedMDRVA; + + // Allocates an area of |size| bytes. + // Returns the position of the allocation, or kInvalidMDRVA if it was + // unable to allocate the bytes. + MDRVA Allocate(size_t size); + + // The file descriptor for the output file + int file_; + + // Current position in buffer + MDRVA position_; + + // Current allocated size + size_t size_; + + // Copy |length| characters from |str| to |mdstring|. These are distinct + // because the underlying MDString is a UTF-16 based string. The wchar_t + // variant may need to create a MDString that has more characters than the + // source |str|, whereas the UTF-8 variant may coalesce characters to form + // a single UTF-16 character. + bool CopyStringToMDString(const wchar_t *str, unsigned int length, + TypedMDRVA *mdstring); + bool CopyStringToMDString(const char *str, unsigned int length, + TypedMDRVA *mdstring); + + // The common templated code for writing a string + template + bool WriteStringCore(const CharType *str, unsigned int length, + MDLocationDescriptor *location); +}; + +// Represents an untyped allocated chunk +class UntypedMDRVA { + public: + explicit UntypedMDRVA(MinidumpFileWriter *writer) + : writer_(writer), + position_(writer->position()), + size_(0) {} + + // Allocates |size| bytes. Must not call more than once. + // Return true on success, or false on failure + bool Allocate(size_t size); + + // Returns the current position or kInvalidMDRVA if allocation failed + inline MDRVA position() const { return position_; } + + // Number of bytes allocated + inline size_t size() const { return size_; } + + // Return size and position + inline MDLocationDescriptor location() const { + MDLocationDescriptor location = { size_, position_ }; + return location; + } + + // Copy |size| bytes starting at |src| into the minidump at |position| + // Return true on success, or false on failure + bool Copy(MDRVA position, const void *src, size_t size); + + // Copy |size| bytes from |src| to the current position + inline bool Copy(const void *src, size_t size) { + return Copy(position_, src, size); + } + + protected: + // Writer we associate with + MinidumpFileWriter *writer_; + + // Position of the start of the data + MDRVA position_; + + // Allocated size + size_t size_; +}; + +// Represents a Minidump object chunk. Additional memory can be allocated at +// the end of the object as a: +// - single allocation +// - Array of MDType objects +// - A MDType object followed by an array +template +class TypedMDRVA : public UntypedMDRVA { + public: + // Constructs an unallocated MDRVA + explicit TypedMDRVA(MinidumpFileWriter *writer) + : UntypedMDRVA(writer), + data_(), + allocation_state_(UNALLOCATED) {} + + inline ~TypedMDRVA() { + // Ensure that the data_ object is written out + if (allocation_state_ != ARRAY) + Flush(); + } + + // Address of object data_ of MDType. This is not declared const as the + // typical usage will be to access the underlying |data_| object as to + // alter its contents. + MDType *get() { return &data_; } + + // Allocates minidump_size::size() bytes. + // Must not call more than once. + // Return true on success, or false on failure + bool Allocate(); + + // Allocates minidump_size::size() + |additional| bytes. + // Must not call more than once. + // Return true on success, or false on failure + bool Allocate(size_t additional); + + // Allocate an array of |count| elements of MDType. + // Must not call more than once. + // Return true on success, or false on failure + bool AllocateArray(size_t count); + + // Allocate an array of |count| elements of |size| after object of MDType + // Must not call more than once. + // Return true on success, or false on failure + bool AllocateObjectAndArray(unsigned int count, size_t size); + + // Copy |item| to |index| + // Must have been allocated using AllocateArray(). + // Return true on success, or false on failure + bool CopyIndex(unsigned int index, MDType *item); + + // Copy |size| bytes starting at |str| to |index| + // Must have been allocated using AllocateObjectAndArray(). + // Return true on success, or false on failure + bool CopyIndexAfterObject(unsigned int index, const void *src, size_t size); + + // Write data_ + bool Flush(); + + private: + enum AllocationState { + UNALLOCATED = 0, + SINGLE_OBJECT, + ARRAY, + SINGLE_OBJECT_WITH_ARRAY + }; + + MDType data_; + AllocationState allocation_state_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_MINIDUMP_FILE_WRITER_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/minidump_file_writer_unittest.cc b/thirdparty/google-breakpad/r318/src/client/minidump_file_writer_unittest.cc new file mode 100644 index 00000000..8eadff46 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/minidump_file_writer_unittest.cc @@ -0,0 +1,174 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: waylonis@google.com (Dan Waylonis) + +/* + g++ -I../ ../common/convert_UTF.c \ + ../common/string_conversion.cc \ + minidump_file_writer.cc \ + minidump_file_writer_unittest.cc \ + -o minidump_file_writer_unittest + */ + +#include +#include + +#include "minidump_file_writer-inl.h" + +using google_breakpad::MinidumpFileWriter; + +#define ASSERT_TRUE(cond) \ +if (!(cond)) { \ + fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \ + return false; \ +} + +#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2)) +#define ASSERT_NE(e1, e2) ASSERT_TRUE((e1) != (e2)) + +struct StringStructure { + unsigned long integer_value; + MDLocationDescriptor first_string; + MDLocationDescriptor second_string; +}; + +struct ArrayStructure { + unsigned char char_value; + unsigned short short_value; + unsigned long long_value; +}; + +typedef struct { + unsigned long count; + ArrayStructure array[0]; +} ObjectAndArrayStructure; + +static bool WriteFile(const char *path) { + MinidumpFileWriter writer; + if (writer.Open(path)) { + // Test a single structure + google_breakpad::TypedMDRVA strings(&writer); + ASSERT_TRUE(strings.Allocate()); + strings.get()->integer_value = 0xBEEF; + const char *first = "First String"; + ASSERT_TRUE(writer.WriteString(first, 0, &strings.get()->first_string)); + const wchar_t *second = L"Second String"; + ASSERT_TRUE(writer.WriteString(second, 0, &strings.get()->second_string)); + + // Test an array structure + google_breakpad::TypedMDRVA array(&writer); + unsigned int count = 10; + ASSERT_TRUE(array.AllocateArray(count)); + for (unsigned int i = 0; i < count; ++i) { + ArrayStructure local; + local.char_value = i; + local.short_value = i + 1; + local.long_value = i + 2; + ASSERT_TRUE(array.CopyIndex(i, &local)); + } + + // Test an object followed by an array + google_breakpad::TypedMDRVA obj_array(&writer); + ASSERT_TRUE(obj_array.AllocateObjectAndArray(count, + sizeof(ArrayStructure))); + obj_array.get()->count = count; + for (unsigned int i = 0; i < count; ++i) { + ArrayStructure local; + local.char_value = i; + local.short_value = i + 1; + local.long_value = i + 2; + ASSERT_TRUE(obj_array.CopyIndexAfterObject(i, &local, sizeof(local))); + } + } + + return writer.Close(); +} + +static bool CompareFile(const char *path) { + unsigned long expected[] = { +#if defined(__BIG_ENDIAN__) + 0x0000beef, 0x0000001e, 0x00000018, 0x00000020, 0x00000038, 0x00000000, + 0x00000018, 0x00460069, 0x00720073, 0x00740020, 0x00530074, 0x00720069, + 0x006e0067, 0x00000000, 0x0000001a, 0x00530065, 0x0063006f, 0x006e0064, + 0x00200053, 0x00740072, 0x0069006e, 0x00670000, 0x00000001, 0x00000002, + 0x01000002, 0x00000003, 0x02000003, 0x00000004, 0x03000004, 0x00000005, + 0x04000005, 0x00000006, 0x05000006, 0x00000007, 0x06000007, 0x00000008, + 0x07000008, 0x00000009, 0x08000009, 0x0000000a, 0x0900000a, 0x0000000b, + 0x0000000a, 0x00000001, 0x00000002, 0x01000002, 0x00000003, 0x02000003, + 0x00000004, 0x03000004, 0x00000005, 0x04000005, 0x00000006, 0x05000006, + 0x00000007, 0x06000007, 0x00000008, 0x07000008, 0x00000009, 0x08000009, + 0x0000000a, 0x0900000a, 0x0000000b, 0x00000000 +#else + 0x0000beef, 0x0000001e, 0x00000018, 0x00000020, 0x00000038, 0x00000000, + 0x00000018, 0x00690046, 0x00730072, 0x00200074, 0x00740053, 0x00690072, + 0x0067006e, 0x00000000, 0x0000001a, 0x00650053, 0x006f0063, 0x0064006e, + 0x00530020, 0x00720074, 0x006e0069, 0x00000067, 0x0001da00, 0x00000002, + 0x0002da01, 0x00000003, 0x0003da02, 0x00000004, 0x0004da03, 0x00000005, + 0x0005da04, 0x00000006, 0x0006da05, 0x00000007, 0x0007da06, 0x00000008, + 0x0008da07, 0x00000009, 0x0009da08, 0x0000000a, 0x000ada09, 0x0000000b, + 0x0000000a, 0x00018700, 0x00000002, 0x00028701, 0x00000003, 0x00038702, + 0x00000004, 0x00048703, 0x00000005, 0x00058704, 0x00000006, 0x00068705, + 0x00000007, 0x00078706, 0x00000008, 0x00088707, 0x00000009, 0x00098708, + 0x0000000a, 0x000a8709, 0x0000000b, 0x00000000, +#endif + }; + unsigned int expected_byte_count = sizeof(expected); + int fd = open(path, O_RDONLY, 0600); + void *buffer = malloc(expected_byte_count); + ASSERT_NE(fd, -1); + ASSERT_TRUE(buffer); + ASSERT_EQ(read(fd, buffer, expected_byte_count), expected_byte_count); + + char *b1, *b2; + b1 = (char*)buffer; + b2 = (char*)expected; + while (*b1 == *b2) { + b1++; + b2++; + } + + printf("%d\n",b1 - (char*)buffer); + + + ASSERT_EQ(memcmp(buffer, expected, expected_byte_count), 0); + return true; +} + +static bool RunTests() { + const char *path = "/tmp/minidump_file_writer_unittest.dmp"; + ASSERT_TRUE(WriteFile(path)); + ASSERT_TRUE(CompareFile(path)); + unlink(path); + return true; +} + +extern "C" int main(int argc, const char *argv[]) { + return RunTests() ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/client/solaris/handler/Makefile b/thirdparty/google-breakpad/r318/src/client/solaris/handler/Makefile new file mode 100644 index 00000000..9b642865 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/solaris/handler/Makefile @@ -0,0 +1,78 @@ +# Copyright (c) 2007, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Author: Alfred Peng + +CC=cc +CXX=CC + +CPPFLAGS=-g -I../../.. -DNDEBUG -features=extensions -D_REENTRANT +LDFLAGS=-lpthread -lssl -lgnutls-openssl -lelf + +OBJ_DIR=. +BIN_DIR=. + +THREAD_SRC=solaris_lwp.cc +SHARE_SRC=../../minidump_file_writer.cc\ + ../../../common/md5.c\ + ../../../common/string_conversion.cc\ + ../../../common/solaris/file_id.cc\ + minidump_generator.cc +HANDLER_SRC=exception_handler.cc\ + ../../../common/solaris/guid_creator.cc +SHARE_C_SRC=../../../common/convert_UTF.c + +MINIDUMP_TEST_SRC=minidump_test.cc +EXCEPTION_TEST_SRC=exception_handler_test.cc + +THREAD_OBJ=$(patsubst %.cc,$(OBJ_DIR)/%.o,$(THREAD_SRC)) +SHARE_OBJ=$(patsubst %.cc,$(OBJ_DIR)/%.o,$(SHARE_SRC)) +HANDLER_OBJ=$(patsubst %.cc,$(OBJ_DIR)/%.o,$(HANDLER_SRC)) +SHARE_C_OBJ=$(patsubst %.c,$(OBJ_DIR)/%.o,$(SHARE_C_SRC)) +MINIDUMP_TEST_OBJ=$(patsubst %.cc,$(OBJ_DIR)/%.o, $(MINIDUMP_TEST_SRC))\ + $(THREAD_OBJ) $(SHARE_OBJ) $(SHARE_C_OBJ) $(HANDLER_OBJ) +EXCEPTION_TEST_OBJ=$(patsubst %.cc,$(OBJ_DIR)/%.o, $(EXCEPTION_TEST_SRC))\ + $(THREAD_OBJ) $(SHARE_OBJ) $(SHARE_C_OBJ) $(HANDLER_OBJ) + +BIN=$(BIN_DIR)/minidump_test\ + $(BIN_DIR)/exception_handler_test + +.PHONY:all clean + +all:$(BIN) + +$(BIN_DIR)/minidump_test:$(MINIDUMP_TEST_OBJ) + $(CXX) $(CPPFLAGS) $(LDFLAGS) $^ -o $@ + +$(BIN_DIR)/exception_handler_test:$(EXCEPTION_TEST_OBJ) + $(CXX) $(CPPFLAGS) $(LDFLAGS) $^ -o $@ + +clean: + rm -f $(BIN) *.o *.out *.dmp core ../../minidump_file_writer.o\ + ../../../common/*.o ../../../common/solaris/*.o diff --git a/thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler.cc b/thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler.cc new file mode 100644 index 00000000..7fc8d255 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler.cc @@ -0,0 +1,258 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#include +#include +#include +#include + +#include +#include +#include + +#include "client/solaris/handler/exception_handler.h" +#include "common/solaris/guid_creator.h" +#include "common/solaris/message_output.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Signals that we are interested. +static const int kSigTable[] = { + SIGSEGV, + SIGABRT, + SIGFPE, + SIGILL, + SIGBUS +}; + +std::vector *ExceptionHandler::handler_stack_ = NULL; +int ExceptionHandler::handler_stack_index_ = 0; +pthread_mutex_t ExceptionHandler::handler_stack_mutex_ = + PTHREAD_MUTEX_INITIALIZER; + +ExceptionHandler::ExceptionHandler(const string &dump_path, + FilterCallback filter, + MinidumpCallback callback, + void *callback_context, + bool install_handler) + : filter_(filter), + callback_(callback), + callback_context_(callback_context), + dump_path_(), + installed_handler_(install_handler) { + set_dump_path(dump_path); + + if (install_handler) { + SetupHandler(); + } + + if (install_handler) { + pthread_mutex_lock(&handler_stack_mutex_); + + if (handler_stack_ == NULL) + handler_stack_ = new std::vector; + handler_stack_->push_back(this); + pthread_mutex_unlock(&handler_stack_mutex_); + } +} + +ExceptionHandler::~ExceptionHandler() { + TeardownAllHandlers(); + pthread_mutex_lock(&handler_stack_mutex_); + if (handler_stack_->back() == this) { + handler_stack_->pop_back(); + } else { + print_message1(2, "warning: removing Breakpad handler out of order\n"); + for (std::vector::iterator iterator = + handler_stack_->begin(); + iterator != handler_stack_->end(); + ++iterator) { + if (*iterator == this) { + handler_stack_->erase(iterator); + } + } + } + + if (handler_stack_->empty()) { + // When destroying the last ExceptionHandler that installed a handler, + // clean up the handler stack. + delete handler_stack_; + handler_stack_ = NULL; + } + pthread_mutex_unlock(&handler_stack_mutex_); +} + +bool ExceptionHandler::WriteMinidump() { + return InternalWriteMinidump(0, 0, NULL); +} + +// static +bool ExceptionHandler::WriteMinidump(const string &dump_path, + MinidumpCallback callback, + void *callback_context) { + ExceptionHandler handler(dump_path, NULL, callback, + callback_context, false); + return handler.InternalWriteMinidump(0, 0, NULL); +} + +void ExceptionHandler::SetupHandler() { + // Signal on a different stack to avoid using the stack + // of the crashing lwp. + struct sigaltstack sig_stack; + sig_stack.ss_sp = malloc(MINSIGSTKSZ); + if (sig_stack.ss_sp == NULL) + return; + sig_stack.ss_size = MINSIGSTKSZ; + sig_stack.ss_flags = 0; + + if (sigaltstack(&sig_stack, NULL) < 0) + return; + for (size_t i = 0; i < sizeof(kSigTable) / sizeof(kSigTable[0]); ++i) + SetupHandler(kSigTable[i]); +} + +void ExceptionHandler::SetupHandler(int signo) { + struct sigaction act, old_act; + act.sa_handler = HandleException; + act.sa_flags = SA_ONSTACK; + if (sigaction(signo, &act, &old_act) < 0) + return; + old_handlers_[signo] = old_act.sa_handler; +} + +void ExceptionHandler::TeardownHandler(int signo) { + if (old_handlers_.find(signo) != old_handlers_.end()) { + struct sigaction act; + act.sa_handler = old_handlers_[signo]; + act.sa_flags = 0; + sigaction(signo, &act, 0); + } +} + +void ExceptionHandler::TeardownAllHandlers() { + for (size_t i = 0; i < sizeof(kSigTable) / sizeof(kSigTable[0]); ++i) { + TeardownHandler(kSigTable[i]); + } +} + +// static +void ExceptionHandler::HandleException(int signo) { +//void ExceptionHandler::HandleException(int signo, siginfo_t *sip, ucontext_t *sig_ctx) { + // The context information about the signal is put on the stack of + // the signal handler frame as value parameter. For some reasons, the + // prototype of the handler doesn't declare this information as parameter, we + // will do it by hand. The stack layout for a signal handler frame is here: + // http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libproc/common/Pstack.c#81 + // + // However, if we are being called by another signal handler passing the + // signal up the chain, then we may not have this random extra parameter, + // so we may have to walk the stack to find it. We do the actual work + // on another thread, where it's a little safer, but we want the ebp + // from this frame to find it. + uintptr_t current_ebp = (uintptr_t)_getfp(); + + pthread_mutex_lock(&handler_stack_mutex_); + ExceptionHandler *current_handler = + handler_stack_->at(handler_stack_->size() - ++handler_stack_index_); + pthread_mutex_unlock(&handler_stack_mutex_); + + // Restore original handler. + current_handler->TeardownHandler(signo); + + ucontext_t *sig_ctx = NULL; + if (current_handler->InternalWriteMinidump(signo, current_ebp, &sig_ctx)) { +// if (current_handler->InternalWriteMinidump(signo, &sig_ctx)) { + // Fully handled this exception, safe to exit. + exit(EXIT_FAILURE); + } else { + // Exception not fully handled, will call the next handler in stack to + // process it. + typedef void (*SignalHandler)(int signo); + SignalHandler old_handler = + reinterpret_cast(current_handler->old_handlers_[signo]); + if (old_handler != NULL) + old_handler(signo); + } + + pthread_mutex_lock(&handler_stack_mutex_); + current_handler->SetupHandler(signo); + --handler_stack_index_; + // All the handlers in stack have been invoked to handle the exception, + // normally the process should be terminated and should not reach here. + // In case we got here, ask the OS to handle it to avoid endless loop, + // normally the OS will generate a core and termiate the process. This + // may be desired to debug the program. + if (handler_stack_index_ == 0) + signal(signo, SIG_DFL); + pthread_mutex_unlock(&handler_stack_mutex_); +} + +bool ExceptionHandler::InternalWriteMinidump(int signo, + uintptr_t sighandler_ebp, + ucontext_t **sig_ctx) { + if (filter_ && !filter_(callback_context_)) + return false; + + bool success = false; + GUID guid; + char guid_str[kGUIDStringLength + 1]; + if (CreateGUID(&guid) && GUIDToString(&guid, guid_str, sizeof(guid_str))) { + char minidump_path[PATH_MAX]; + snprintf(minidump_path, sizeof(minidump_path), "%s/%s.dmp", + dump_path_c_, guid_str); + + // Block all the signals we want to process when writing minidump. + // We don't want it to be interrupted. + sigset_t sig_blocked, sig_old; + bool blocked = true; + sigfillset(&sig_blocked); + for (size_t i = 0; i < sizeof(kSigTable) / sizeof(kSigTable[0]); ++i) + sigdelset(&sig_blocked, kSigTable[i]); + if (sigprocmask(SIG_BLOCK, &sig_blocked, &sig_old) != 0) { + blocked = false; + print_message1(2, "HandleException: failed to block signals.\n"); + } + + success = minidump_generator_.WriteMinidumpToFile( + minidump_path, signo, sighandler_ebp, sig_ctx); + + // Unblock the signals. + if (blocked) + sigprocmask(SIG_SETMASK, &sig_old, &sig_old); + + if (callback_) + success = callback_(dump_path_c_, guid_str, callback_context_, success); + } + return success; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler.h b/thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler.h new file mode 100644 index 00000000..4d72485f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler.h @@ -0,0 +1,201 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Alfred Peng + +#ifndef CLIENT_SOLARIS_HANDLER_EXCEPTION_HANDLER_H__ +#define CLIENT_SOLARIS_HANDLER_EXCEPTION_HANDLER_H__ + +#include +#include +#include + +#include "client/solaris/handler/minidump_generator.h" + +namespace google_breakpad { + +using std::string; + +// +// ExceptionHandler +// +// ExceptionHandler can write a minidump file when an exception occurs, +// or when WriteMinidump() is called explicitly by your program. +// +// To have the exception handler write minidumps when an uncaught exception +// (crash) occurs, you should create an instance early in the execution +// of your program, and keep it around for the entire time you want to +// have crash handling active (typically, until shutdown). +// (NOTE): There should be only one this kind of exception handler +// object per process. +// +// If you want to write minidumps without installing the exception handler, +// you can create an ExceptionHandler with install_handler set to false, +// then call WriteMinidump. You can also use this technique if you want to +// use different minidump callbacks for different call sites. +// +// In either case, a callback function is called when a minidump is written, +// which receives the unqiue id of the minidump. The caller can use this +// id to collect and write additional application state, and to launch an +// external crash-reporting application. +// +// Caller should try to make the callbacks as crash-friendly as possible, +// it should avoid use heap memory allocation as much as possible. +// +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. context is the parameter supplied by the user as + // callback_context when the handler was created. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, + // Breakpad will immediately report the exception as unhandled without + // writing a minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void *context); + + // A callback function to run after the minidump has been written. + // minidump_id is a unique id for the dump, so the minidump + // file is /.dmp. context is the parameter supplied + // by the user as callback_context when the handler was created. succeeded + // indicates whether a minidump file was successfully written. + // + // If an exception occurred and the callback returns true, Breakpad will + // treat the exception as fully-handled, suppressing any other handlers from + // being notified of the exception. If the callback returns false, Breakpad + // will treat the exception as unhandled, and allow another handler to handle + // it. If there are no other handlers, Breakpad will report the exception to + // the system as unhandled, allowing a debugger or native crash dialog the + // opportunity to handle the exception. Most callback implementations + // should normally return the value of |succeeded|, or when they wish to + // not report an exception of handled, false. Callbacks will rarely want to + // return true directly (unless |succeeded| is true). + typedef bool (*MinidumpCallback)(const char *dump_path, + const char *minidump_id, + void *context, + bool succeeded); + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Before writing a minidump, the optional filter callback will be called. + // Its return value determines whether or not Breakpad should write a + // minidump. Minidump files will be written to dump_path, and the optional + // callback is called after writing the dump file, as described above. + // If install_handler is true, then a minidump will be written whenever + // an unhandled exception occurs. If it is false, minidumps will only + // be written when WriteMinidump is called. + ExceptionHandler(const string &dump_path, + FilterCallback filter, MinidumpCallback callback, + void *callback_context, + bool install_handler); + ~ExceptionHandler(); + + // Get and Set the minidump path. + string dump_path() const { return dump_path_; } + void set_dump_path(const string &dump_path) { + dump_path_ = dump_path; + dump_path_c_ = dump_path_.c_str(); + } + + // Writes a minidump immediately. This can be used to capture the + // execution state independently of a crash. Returns true on success. + bool WriteMinidump(); + + // Convenience form of WriteMinidump which does not require an + // ExceptionHandler instance. + static bool WriteMinidump(const string &dump_path, + MinidumpCallback callback, + void *callback_context); + + private: + // Setup crash handler. + void SetupHandler(); + // Setup signal handler for a signal. + void SetupHandler(int signo); + // Teardown the handler for a signal. + void TeardownHandler(int signo); + // Teardown all handlers. + void TeardownAllHandlers(); + + // Runs the main loop for the exception handler thread. + static void* ExceptionHandlerThreadMain(void *lpParameter); + + // Signal handler. + static void HandleException(int signo); + + // Write all the information to the dump file. + // If called from a signal handler, sighandler_ebp is the ebp of + // that signal handler's frame, and sig_ctx is an out parameter + // that will be set to point at the ucontext_t that was placed + // on the stack by the kernel. You can pass zero and NULL + // for the second and third parameters if you are not calling + // this from a signal handler. + bool InternalWriteMinidump(int signo, uintptr_t sighandler_ebp, + ucontext_t **sig_ctx); + + private: + // The callbacks before and after writing the dump file. + FilterCallback filter_; + MinidumpCallback callback_; + void *callback_context_; + + // The directory in which a minidump will be written, set by the dump_path + // argument to the constructor, or set_dump_path. + string dump_path_; + // C style dump path. Keep this when setting dump path, since calling + // c_str() of std::string when crashing may not be safe. + const char *dump_path_c_; + + // True if the ExceptionHandler installed an unhandled exception filter + // when created (with an install_handler parameter set to true). + bool installed_handler_; + + // Keep the previous handlers for the signal. + typedef void (*sighandler_t)(int); + std::map old_handlers_; + + // The global exception handler stack. This is need becuase there may exist + // multiple ExceptionHandler instances in a process. Each will have itself + // registered in this stack. + static std::vector *handler_stack_; + // The index of the handler that should handle the next exception. + static int handler_stack_index_; + static pthread_mutex_t handler_stack_mutex_; + + // The minidump generator. + MinidumpGenerator minidump_generator_; + + // disallow copy ctor and operator= + explicit ExceptionHandler(const ExceptionHandler &); + void operator=(const ExceptionHandler &); +}; + +} // namespace google_breakpad + +#endif // CLIENT_SOLARIS_HANDLER_EXCEPTION_HANDLER_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler_test.cc b/thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler_test.cc new file mode 100644 index 00000000..6bb8e18d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/solaris/handler/exception_handler_test.cc @@ -0,0 +1,119 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#include +#include + +#include +#include +#include +#include + +#include "client/solaris/handler/exception_handler.h" +#include "client/solaris/handler/solaris_lwp.h" + +using namespace google_breakpad; + +// Thread use this to see if it should stop working. +static bool should_exit = false; + +static int foo2(int arg) { + // Stack variable, used for debugging stack dumps. + int c = 0xcccccccc; + fprintf(stderr, "Thread trying to crash: %x\n", getpid()); + c = *reinterpret_cast(0x5); + return c; +} + +static int foo(int arg) { + // Stack variable, used for debugging stack dumps. + int b = 0xbbbbbbbb; + b = foo2(b); + return b; +} + +static void *thread_crash(void *) { + // Stack variable, used for debugging stack dumps. + int a = 0xaaaaaaaa; + sleep(3); + a = foo(a); + printf("%x\n", a); + return NULL; +} + +static void *thread_main(void *) { + while (!should_exit) + sleep(1); + return NULL; +} + +static void CreateCrashThread() { + pthread_t h; + pthread_create(&h, NULL, thread_crash, NULL); + pthread_detach(h); +} + +// Create working threads. +static void CreateThread(int num) { + pthread_t h; + for (int i = 0; i < num; ++i) { + pthread_create(&h, NULL, thread_main, NULL); + pthread_detach(h); + } +} + +// Callback when minidump written. +static bool MinidumpCallback(const char *dump_path, + const char *minidump_id, + void *context, + bool succeeded) { + int index = reinterpret_cast(context); + if (index == 0) { + should_exit = true; + return true; + } + // Don't process it. + return false; +} + +int main(int argc, char *argv[]) { + int handler_index = 1; + ExceptionHandler handler_ignore(".", NULL, MinidumpCallback, + (void*)handler_index, true); + CreateCrashThread(); + CreateThread(10); + + while (true) + sleep(20); + should_exit = true; + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_generator.cc b/thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_generator.cc new file mode 100644 index 00000000..ea046cff --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_generator.cc @@ -0,0 +1,786 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "client/solaris/handler/minidump_generator.h" +#include "client/minidump_file_writer-inl.h" +#include "common/solaris/file_id.h" + +namespace { + +using namespace google_breakpad; + +// Argument for the writer function. +struct WriterArgument { + MinidumpFileWriter *minidump_writer; + + // Pid of the lwp who called WriteMinidumpToFile + int requester_pid; + + // The stack bottom of the lwp which caused the dump. + // Mainly used to find the lwp id of the crashed lwp since signal + // handler may not be called in the lwp who caused it. + uintptr_t crashed_stack_bottom; + + // Id of the crashing lwp. + int crashed_lwpid; + + // Signal number when crash happened. Can be 0 if this is a requested dump. + int signo; + + // The ebp of the signal handler frame on x86. Can be 0 if this is a + // requested dump. + uintptr_t sighandler_ebp; + + // User context when crash happens. Can be NULL if this is a requested dump. + // This is actually an out parameter, but it will be filled in at the start + // of the writer LWP. + ucontext_t *sig_ctx; + + // Used to get information about the lwps. + SolarisLwp *lwp_lister; +}; + +// Holding context information for the callback of finding the crashing lwp. +struct FindCrashLwpContext { + const SolarisLwp *lwp_lister; + uintptr_t crashing_stack_bottom; + int crashing_lwpid; + + FindCrashLwpContext() : + lwp_lister(NULL), + crashing_stack_bottom(0UL), + crashing_lwpid(-1) { + } +}; + +// Callback for list lwps. +// It will compare the stack bottom of the provided lwp with the stack +// bottom of the crashed lwp, it they are eqaul, this lwp is the one +// who crashed. +bool IsLwpCrashedCallback(lwpstatus_t *lsp, void *context) { + FindCrashLwpContext *crashing_context = + static_cast(context); + const SolarisLwp *lwp_lister = crashing_context->lwp_lister; + const prgregset_t *gregs = &(lsp->pr_reg); +#if TARGET_CPU_SPARC + uintptr_t last_ebp = (*gregs)[R_FP]; +#elif TARGET_CPU_X86 + uintptr_t last_ebp = (*gregs)[EBP]; +#endif + uintptr_t stack_bottom = lwp_lister->GetLwpStackBottom(last_ebp); + if (stack_bottom > last_ebp && + stack_bottom == crashing_context->crashing_stack_bottom) { + // Got it. Stop iteration. + crashing_context->crashing_lwpid = lsp->pr_lwpid; + return false; + } + + return true; +} + +// Find the crashing lwpid. +// This is done based on stack bottom comparing. +int FindCrashingLwp(uintptr_t crashing_stack_bottom, + int requester_pid, + const SolarisLwp *lwp_lister) { + FindCrashLwpContext context; + context.lwp_lister = lwp_lister; + context.crashing_stack_bottom = crashing_stack_bottom; + CallbackParam callback_param(IsLwpCrashedCallback, + &context); + lwp_lister->Lwp_iter_all(lwp_lister->getpid(), &callback_param); + return context.crashing_lwpid; +} + +bool WriteLwpStack(const SolarisLwp *lwp_lister, + uintptr_t last_esp, + UntypedMDRVA *memory, + MDMemoryDescriptor *loc) { + uintptr_t stack_bottom = lwp_lister->GetLwpStackBottom(last_esp); + if (stack_bottom >= last_esp) { + int size = stack_bottom - last_esp; + if (size > 0) { + if (!memory->Allocate(size)) + return false; + memory->Copy(reinterpret_cast(last_esp), size); + loc->start_of_memory_range = last_esp; + loc->memory = memory->location(); + } + return true; + } + return false; +} + +#if TARGET_CPU_SPARC +bool WriteContext(MDRawContextSPARC *context, ucontext_t *sig_ctx) { + assert(sig_ctx != NULL); + int* regs = sig_ctx->uc_mcontext.gregs; + context->context_flags = MD_CONTEXT_SPARC_FULL; + + context->ccr = (unsigned int)(regs[0]); + context->pc = (unsigned int)(regs[REG_PC]); + context->npc = (unsigned int)(regs[REG_nPC]); + context->y = (unsigned int)(regs[REG_Y]); + context->asi = (unsigned int)(regs[19]); + context->fprs = (unsigned int)(regs[20]); + + for ( int i = 0 ; i < 32; ++i ) { + context->g_r[i] = 0; + } + + for ( int i = 1 ; i < 16; ++i ) { + context->g_r[i] = (uintptr_t)(sig_ctx->uc_mcontext.gregs[i + 3]); + } + context->g_r[30] = (uintptr_t)(((struct frame *)context->g_r[14])->fr_savfp); + + return true; +} + +bool WriteContext(MDRawContextSPARC *context, prgregset_t regs, + prfpregset_t *fp_regs) { + if (!context || !regs) + return false; + + context->context_flags = MD_CONTEXT_SPARC_FULL; + + context->ccr = (uintptr_t)(regs[32]); + context->pc = (uintptr_t)(regs[R_PC]); + context->npc = (uintptr_t)(regs[R_nPC]); + context->y = (uintptr_t)(regs[R_Y]); + context->asi = (uintptr_t)(regs[36]); + context->fprs = (uintptr_t)(regs[37]); + for ( int i = 0 ; i < 32 ; ++i ){ + context->g_r[i] = (uintptr_t)(regs[i]); + } + + return true; +} +#elif TARGET_CPU_X86 +bool WriteContext(MDRawContextX86 *context, prgregset_t regs, + prfpregset_t *fp_regs) { + if (!context || !regs) + return false; + + context->context_flags = MD_CONTEXT_X86_FULL; + + context->cs = regs[CS]; + context->ds = regs[DS]; + context->es = regs[ES]; + context->fs = regs[FS]; + context->gs = regs[GS]; + context->ss = regs[SS]; + context->edi = regs[EDI]; + context->esi = regs[ESI]; + context->ebx = regs[EBX]; + context->edx = regs[EDX]; + context->ecx = regs[ECX]; + context->eax = regs[EAX]; + context->ebp = regs[EBP]; + context->eip = regs[EIP]; + context->esp = regs[UESP]; + context->eflags = regs[EFL]; + + return true; +} +#endif /* TARGET_CPU_XXX */ + +// Write information about a crashed Lwp. +// When a lwp crash, kernel will write something on the stack for processing +// signal. This makes the current stack not reliable, and our stack walker +// won't figure out the whole call stack for this. So we write the stack at the +// time of the crash into the minidump file, not the current stack. +bool WriteCrashedLwpStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + const lwpstatus_t *lsp, + MDRawThread *lwp) { + assert(writer_args->sig_ctx != NULL); + + lwp->thread_id = lsp->pr_lwpid; + +#if TARGET_CPU_SPARC + UntypedMDRVA memory(minidump_writer); + if (!WriteLwpStack(writer_args->lwp_lister, + writer_args->sig_ctx->uc_mcontext.gregs[REG_O6], + &memory, + &lwp->stack)) + return false; + + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + lwp->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextSPARC)); + return WriteContext(context.get(), writer_args->sig_ctx); +#elif TARGET_CPU_X86 + UntypedMDRVA memory(minidump_writer); + if (!WriteLwpStack(writer_args->lwp_lister, + writer_args->sig_ctx->uc_mcontext.gregs[UESP], + &memory, + &lwp->stack)) + return false; + + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + lwp->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextX86)); + return WriteContext(context.get(), + (int *)&writer_args->sig_ctx->uc_mcontext.gregs, + &writer_args->sig_ctx->uc_mcontext.fpregs); +#endif +} + +bool WriteLwpStream(MinidumpFileWriter *minidump_writer, + const SolarisLwp *lwp_lister, + const lwpstatus_t *lsp, MDRawThread *lwp) { + prfpregset_t fp_regs = lsp->pr_fpreg; + const prgregset_t *gregs = &(lsp->pr_reg); + UntypedMDRVA memory(minidump_writer); +#if TARGET_CPU_SPARC + if (!WriteLwpStack(lwp_lister, + (*gregs)[R_SP], + &memory, + &lwp->stack)) + return false; + + // Write context + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + // should be the thread_id + lwp->thread_id = lsp->pr_lwpid; + lwp->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextSPARC)); +#elif TARGET_CPU_X86 + if (!WriteLwpStack(lwp_lister, + (*gregs)[UESP], + &memory, + &lwp->stack)) + return false; + + // Write context + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + // should be the thread_id + lwp->thread_id = lsp->pr_lwpid; + lwp->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextX86)); +#endif /* TARGET_CPU_XXX */ + return WriteContext(context.get(), (int *)gregs, &fp_regs); +} + +bool WriteCPUInformation(MDRawSystemInfo *sys_info) { + struct utsname uts; + char *major, *minor, *build; + + sys_info->number_of_processors = sysconf(_SC_NPROCESSORS_CONF); + sys_info->processor_architecture = MD_CPU_ARCHITECTURE_UNKNOWN; + if (uname(&uts) != -1) { + // Match "i86pc" as X86 architecture. + if (strcmp(uts.machine, "i86pc") == 0) + sys_info->processor_architecture = MD_CPU_ARCHITECTURE_X86; + else if (strcmp(uts.machine, "sun4u") == 0) + sys_info->processor_architecture = MD_CPU_ARCHITECTURE_SPARC; + } + + major = uts.release; + minor = strchr(major, '.'); + *minor = '\0'; + ++minor; + sys_info->major_version = atoi(major); + sys_info->minor_version = atoi(minor); + + build = strchr(uts.version, '_'); + ++build; + sys_info->build_number = atoi(build); + + return true; +} + +bool WriteOSInformation(MinidumpFileWriter *minidump_writer, + MDRawSystemInfo *sys_info) { + sys_info->platform_id = MD_OS_SOLARIS; + + struct utsname uts; + if (uname(&uts) != -1) { + char os_version[512]; + size_t space_left = sizeof(os_version); + memset(os_version, 0, space_left); + const char *os_info_table[] = { + uts.sysname, + uts.release, + uts.version, + uts.machine, + "OpenSolaris", + NULL + }; + for (const char **cur_os_info = os_info_table; + *cur_os_info != NULL; + ++cur_os_info) { + if (cur_os_info != os_info_table && space_left > 1) { + strcat(os_version, " "); + --space_left; + } + if (space_left > strlen(*cur_os_info)) { + strcat(os_version, *cur_os_info); + space_left -= strlen(*cur_os_info); + } else { + break; + } + } + + MDLocationDescriptor location; + if (!minidump_writer->WriteString(os_version, 0, &location)) + return false; + sys_info->csd_version_rva = location.rva; + } + return true; +} + +// Callback context for get writting lwp information. +struct LwpInfoCallbackCtx { + MinidumpFileWriter *minidump_writer; + const WriterArgument *writer_args; + TypedMDRVA *list; + int lwp_index; +}; + +bool LwpInformationCallback(lwpstatus_t *lsp, void *context) { + bool success = true; + LwpInfoCallbackCtx *callback_context = + static_cast(context); + + // The current lwp is the one to handle the crash. Ignore it. + if (lsp->pr_lwpid != pthread_self()) { + LwpInfoCallbackCtx *callback_context = + static_cast(context); + MDRawThread lwp; + memset(&lwp, 0, sizeof(MDRawThread)); + + if (lsp->pr_lwpid != callback_context->writer_args->crashed_lwpid || + callback_context->writer_args->sig_ctx == NULL) { + success = WriteLwpStream(callback_context->minidump_writer, + callback_context->writer_args->lwp_lister, + lsp, &lwp); + } else { + success = WriteCrashedLwpStream(callback_context->minidump_writer, + callback_context->writer_args, + lsp, &lwp); + } + if (success) { + callback_context->list->CopyIndexAfterObject( + callback_context->lwp_index++, + &lwp, sizeof(MDRawThread)); + } + } + + return success; +} + +bool WriteLwpListStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + // Get the lwp information. + const SolarisLwp *lwp_lister = writer_args->lwp_lister; + int lwp_count = lwp_lister->GetLwpCount(); + if (lwp_count < 0) + return false; + TypedMDRVA list(minidump_writer); + if (!list.AllocateObjectAndArray(lwp_count - 1, sizeof(MDRawThread))) + return false; + dir->stream_type = MD_THREAD_LIST_STREAM; + dir->location = list.location(); + list.get()->number_of_threads = lwp_count - 1; + + LwpInfoCallbackCtx context; + context.minidump_writer = minidump_writer; + context.writer_args = writer_args; + context.list = &list; + context.lwp_index = 0; + CallbackParam callback_param(LwpInformationCallback, + &context); + int written = + lwp_lister->Lwp_iter_all(lwp_lister->getpid(), &callback_param); + return written == lwp_count; +} + +bool WriteCVRecord(MinidumpFileWriter *minidump_writer, + MDRawModule *module, + const char *module_path, + char *realname) { + TypedMDRVA cv(minidump_writer); + + char path[PATH_MAX]; + const char *module_name = module_path ? module_path : ""; + snprintf(path, sizeof(path), "/proc/self/object/%s", module_name); + + size_t module_name_length = strlen(realname); + if (!cv.AllocateObjectAndArray(module_name_length + 1, sizeof(u_int8_t))) + return false; + if (!cv.CopyIndexAfterObject(0, realname, module_name_length)) + return false; + + module->cv_record = cv.location(); + MDCVInfoPDB70 *cv_ptr = cv.get(); + memset(cv_ptr, 0, sizeof(MDCVInfoPDB70)); + cv_ptr->cv_signature = MD_CVINFOPDB70_SIGNATURE; + cv_ptr->age = 0; + + // Get the module identifier + FileID file_id(path); + unsigned char identifier[16]; + + if (file_id.ElfFileIdentifier(identifier)) { + cv_ptr->signature.data1 = (uint32_t)identifier[0] << 24 | + (uint32_t)identifier[1] << 16 | (uint32_t)identifier[2] << 8 | + (uint32_t)identifier[3]; + cv_ptr->signature.data2 = (uint32_t)identifier[4] << 8 | identifier[5]; + cv_ptr->signature.data3 = (uint32_t)identifier[6] << 8 | identifier[7]; + cv_ptr->signature.data4[0] = identifier[8]; + cv_ptr->signature.data4[1] = identifier[9]; + cv_ptr->signature.data4[2] = identifier[10]; + cv_ptr->signature.data4[3] = identifier[11]; + cv_ptr->signature.data4[4] = identifier[12]; + cv_ptr->signature.data4[5] = identifier[13]; + cv_ptr->signature.data4[6] = identifier[14]; + cv_ptr->signature.data4[7] = identifier[15]; + } + return true; +} + +struct ModuleInfoCallbackCtx { + MinidumpFileWriter *minidump_writer; + const WriterArgument *writer_args; + TypedMDRVA *list; + int module_index; +}; + +bool ModuleInfoCallback(const ModuleInfo &module_info, void *context) { + ModuleInfoCallbackCtx *callback_context = + static_cast(context); + // Skip those modules without name, or those that are not modules. + if (strlen(module_info.name) == 0) + return true; + + MDRawModule module; + memset(&module, 0, sizeof(module)); + MDLocationDescriptor loc; + char path[PATH_MAX]; + char buf[PATH_MAX]; + char *realname; + int count; + + snprintf(path, sizeof (path), "/proc/self/path/%s", module_info.name); + if ((count = readlink(path, buf, PATH_MAX)) < 0) + return false; + buf[count] = '\0'; + + if ((realname = strrchr(buf, '/')) == NULL) + return false; + realname++; + + if (!callback_context->minidump_writer->WriteString(realname, 0, &loc)) + return false; + + module.base_of_image = (u_int64_t)module_info.start_addr; + module.size_of_image = module_info.size; + module.module_name_rva = loc.rva; + + if (!WriteCVRecord(callback_context->minidump_writer, &module, + module_info.name, realname)) + return false; + + callback_context->list->CopyIndexAfterObject( + callback_context->module_index++, &module, MD_MODULE_SIZE); + return true; +} + +bool WriteModuleListStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + TypedMDRVA list(minidump_writer); + int module_count = writer_args->lwp_lister->GetModuleCount(); + + if (module_count <= 0 || + !list.AllocateObjectAndArray(module_count, MD_MODULE_SIZE)) { + return false; + } + + dir->stream_type = MD_MODULE_LIST_STREAM; + dir->location = list.location(); + list.get()->number_of_modules = module_count; + ModuleInfoCallbackCtx context; + context.minidump_writer = minidump_writer; + context.writer_args = writer_args; + context.list = &list; + context.module_index = 0; + CallbackParam callback(ModuleInfoCallback, &context); + return writer_args->lwp_lister->ListModules(&callback) == module_count; +} + +bool WriteSystemInfoStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + TypedMDRVA sys_info(minidump_writer); + + if (!sys_info.Allocate()) + return false; + + dir->stream_type = MD_SYSTEM_INFO_STREAM; + dir->location = sys_info.location(); + + return WriteCPUInformation(sys_info.get()) && + WriteOSInformation(minidump_writer, sys_info.get()); +} + +bool WriteExceptionStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + // This happenes when this is not a crash, but a requested dump. + if (writer_args->sig_ctx == NULL) + return false; + + TypedMDRVA exception(minidump_writer); + if (!exception.Allocate()) + return false; + + dir->stream_type = MD_EXCEPTION_STREAM; + dir->location = exception.location(); + exception.get()->thread_id = writer_args->crashed_lwpid; + exception.get()->exception_record.exception_code = writer_args->signo; + exception.get()->exception_record.exception_flags = 0; + +#if TARGET_CPU_SPARC + if (writer_args->sig_ctx != NULL) { + exception.get()->exception_record.exception_address = + writer_args->sig_ctx->uc_mcontext.gregs[REG_PC]; + } else { + return true; + } + + // Write context of the exception. + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + exception.get()->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextSPARC)); + return WriteContext(context.get(), writer_args->sig_ctx); +#elif TARGET_CPU_X86 + if (writer_args->sig_ctx != NULL) { + exception.get()->exception_record.exception_address = + writer_args->sig_ctx->uc_mcontext.gregs[EIP]; + } else { + return true; + } + + // Write context of the exception. + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + exception.get()->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextX86)); + return WriteContext(context.get(), + (int *)&writer_args->sig_ctx->uc_mcontext.gregs, + NULL); +#endif +} + +bool WriteMiscInfoStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + TypedMDRVA info(minidump_writer); + + if (!info.Allocate()) + return false; + + dir->stream_type = MD_MISC_INFO_STREAM; + dir->location = info.location(); + info.get()->size_of_info = sizeof(MDRawMiscInfo); + info.get()->flags1 = MD_MISCINFO_FLAGS1_PROCESS_ID; + info.get()->process_id = writer_args->requester_pid; + + return true; +} + +bool WriteBreakpadInfoStream(MinidumpFileWriter *minidump_writer, + const WriterArgument *writer_args, + MDRawDirectory *dir) { + TypedMDRVA info(minidump_writer); + + if (!info.Allocate()) + return false; + + dir->stream_type = MD_BREAKPAD_INFO_STREAM; + dir->location = info.location(); + + info.get()->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; + info.get()->dump_thread_id = getpid(); + info.get()->requesting_thread_id = writer_args->requester_pid; + return true; +} + +class AutoLwpResumer { + public: + AutoLwpResumer(SolarisLwp *lwp) : lwp_(lwp) {} + ~AutoLwpResumer() { lwp_->ControlAllLwps(false); } + private: + SolarisLwp *lwp_; +}; + +// Prototype of writer functions. +typedef bool (*WriteStreamFN)(MinidumpFileWriter *, + const WriterArgument *, + MDRawDirectory *); + +// Function table to writer a full minidump. +const WriteStreamFN writers[] = { + WriteLwpListStream, + WriteModuleListStream, + WriteSystemInfoStream, + WriteExceptionStream, + WriteMiscInfoStream, + WriteBreakpadInfoStream, +}; + +// Will call each writer function in the writers table. +//void* MinidumpGenerator::Write(void *argument) { +void* Write(void *argument) { + WriterArgument *writer_args = static_cast(argument); + + if (!writer_args->lwp_lister->ControlAllLwps(true)) + return NULL; + + AutoLwpResumer lwpResumer(writer_args->lwp_lister); + + if (writer_args->sighandler_ebp != 0 && + writer_args->lwp_lister->FindSigContext(writer_args->sighandler_ebp, + &writer_args->sig_ctx)) { + writer_args->crashed_stack_bottom = + writer_args->lwp_lister->GetLwpStackBottom( +#if TARGET_CPU_SPARC + writer_args->sig_ctx->uc_mcontext.gregs[REG_O6] +#elif TARGET_CPU_X86 + writer_args->sig_ctx->uc_mcontext.gregs[UESP] +#endif + ); + + int crashed_lwpid = FindCrashingLwp(writer_args->crashed_stack_bottom, + writer_args->requester_pid, + writer_args->lwp_lister); + if (crashed_lwpid > 0) + writer_args->crashed_lwpid = crashed_lwpid; + } + + MinidumpFileWriter *minidump_writer = writer_args->minidump_writer; + TypedMDRVA header(minidump_writer); + TypedMDRVA dir(minidump_writer); + if (!header.Allocate()) + return 0; + + int writer_count = sizeof(writers) / sizeof(writers[0]); + // Need directory space for all writers. + if (!dir.AllocateArray(writer_count)) + return 0; + header.get()->signature = MD_HEADER_SIGNATURE; + header.get()->version = MD_HEADER_VERSION; + header.get()->time_date_stamp = time(NULL); + header.get()->stream_count = writer_count; + header.get()->stream_directory_rva = dir.position(); + + int dir_index = 0; + MDRawDirectory local_dir; + for (int i = 0; i < writer_count; ++i) { + if ((*writers[i])(minidump_writer, writer_args, &local_dir)) + dir.CopyIndex(dir_index++, &local_dir); + } + + return 0; +} + +} // namespace + +namespace google_breakpad { + +MinidumpGenerator::MinidumpGenerator() { +} + +MinidumpGenerator::~MinidumpGenerator() { +} + +// Write minidump into file. +// It runs in a different thread from the crashing thread. +bool MinidumpGenerator::WriteMinidumpToFile(const char *file_pathname, + int signo, + uintptr_t sighandler_ebp, + ucontext_t **sig_ctx) const { + // The exception handler thread. + pthread_t handler_thread; + + assert(file_pathname != NULL); + + if (file_pathname == NULL) + return false; + + MinidumpFileWriter minidump_writer; + if (minidump_writer.Open(file_pathname)) { + WriterArgument argument; + memset(&argument, 0, sizeof(argument)); + SolarisLwp lwp_lister(getpid()); + argument.lwp_lister = &lwp_lister; + argument.minidump_writer = &minidump_writer; + argument.requester_pid = getpid(); + argument.crashed_lwpid = pthread_self(); + argument.signo = signo; + argument.sighandler_ebp = sighandler_ebp; + argument.sig_ctx = NULL; + + pthread_create(&handler_thread, NULL, Write, (void *)&argument); + pthread_join(handler_thread, NULL); + return true; + } + + return false; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_generator.h b/thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_generator.h new file mode 100644 index 00000000..882f9e1d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_generator.h @@ -0,0 +1,70 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifndef CLIENT_SOLARIS_HANDLER_MINIDUMP_GENERATOR_H__ +#define CLIENT_SOLARIS_HANDLER_MINIDUMP_GENERATOR_H__ + +#include + +#include "client/minidump_file_writer.h" +#include "client/solaris/handler/solaris_lwp.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// +// MinidumpGenerator +// +// A minidump generator should be created before any exception happen. +// +class MinidumpGenerator { + // Callback run for writing lwp information in the process. + friend bool LwpInformationCallback(lwpstatus_t *lsp, void *context); + + // Callback run for writing module information in the process. + friend bool ModuleInfoCallback(const ModuleInfo &module_info, void *context); + + public: + MinidumpGenerator(); + + ~MinidumpGenerator(); + + // Write minidump. + bool WriteMinidumpToFile(const char *file_pathname, + int signo, + uintptr_t sighandler_ebp, + ucontext_t **sig_ctx) const; +}; + +} // namespace google_breakpad + +#endif // CLIENT_SOLARIS_HANDLER_MINIDUMP_GENERATOR_H_ diff --git a/thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_test.cc b/thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_test.cc new file mode 100644 index 00000000..33302d86 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/solaris/handler/minidump_test.cc @@ -0,0 +1,75 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#include +#include + +#include "client/minidump_file_writer.h" +#include "client/solaris/handler/minidump_generator.h" + +using std::string; +using google_breakpad::MinidumpGenerator; + +static bool doneWritingReport = false; + +static void *Reporter(void *) { + char buffer[PATH_MAX]; + MinidumpGenerator md; + + // Write it to the desktop + snprintf(buffer, sizeof(buffer), "./minidump_test.out"); + fprintf(stdout, "Writing %s\n", buffer); + + md.WriteMinidumpToFile(buffer, 0, 0, NULL); + doneWritingReport = true; + + return NULL; +} + +static void SleepyFunction() { + while (!doneWritingReport) { + usleep(100); + } +} + +int main(int argc, char * const argv[]) { + pthread_t reporter_thread; + + if (pthread_create(&reporter_thread, NULL, Reporter, NULL) == 0) { + pthread_detach(reporter_thread); + } else { + perror("pthread_create"); + } + + SleepyFunction(); + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/client/solaris/handler/solaris_lwp.cc b/thirdparty/google-breakpad/r318/src/client/solaris/handler/solaris_lwp.cc new file mode 100644 index 00000000..0148997a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/solaris/handler/solaris_lwp.cc @@ -0,0 +1,436 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "client/solaris/handler/solaris_lwp.h" +#include "common/solaris/message_output.h" + +using namespace google_breakpad; + +// This unamed namespace contains helper function. +namespace { + +uintptr_t stack_base_address = 0; +static const int HEADER_MAX = 2000; +static const int MAP_MAX = 1000; + +// Context information for the callbacks when validating address by listing +// modules. +struct AddressValidatingContext { + uintptr_t address; + bool is_mapped; + + AddressValidatingContext() : address(0UL), is_mapped(false) { + } +}; + +// Convert from string to int. +static bool LocalAtoi(char *s, int *r) { + assert(s != NULL); + assert(r != NULL); + char *endptr = NULL; + int ret = strtol(s, &endptr, 10); + if (endptr == s) + return false; + *r = ret; + return true; +} + +// Callback invoked for each mapped module. +// It uses the module's adderss range to validate the address. +static bool AddressNotInModuleCallback(const ModuleInfo &module_info, + void *context) { + AddressValidatingContext *addr = + reinterpret_cast(context); + if (addr->is_mapped = ((module_info.start_addr > 0) && + (addr->address >= module_info.start_addr) && + (addr->address <= module_info.start_addr + + module_info.size))) { + stack_base_address = module_info.start_addr + module_info.size; + } + + return !addr->is_mapped; +} + +static int IterateLwpAll(int pid, + CallbackParam *callback_param) { + char lwp_path[40]; + DIR *dir; + int count = 0; + + snprintf(lwp_path, sizeof (lwp_path), "/proc/%d/lwp", (int)pid); + if ((dir = opendir(lwp_path)) == NULL) + return -1; + + struct dirent *entry = NULL; + while ((entry = readdir(dir)) != NULL) { + if ((strcmp(entry->d_name, ".") != 0) && + (strcmp(entry->d_name, "..") != 0)) { + int lwpid = 0; + int last_pid = 0; + if (LocalAtoi(entry->d_name, &lwpid) && last_pid != lwpid) { + last_pid = lwpid; + ++count; + if (callback_param && + !(callback_param->call_back)(lwpid, callback_param->context)) { + break; + } + } + } + } + + closedir(dir); + return count; +} + +#if defined(__i386) && !defined(NO_FRAME_POINTER) +void *GetNextFrame(void **last_ebp) { + void *sp = *last_ebp; + if ((unsigned long)sp == (unsigned long)last_ebp) + return NULL; + if ((unsigned long)sp & (sizeof(void *) - 1)) + return NULL; + if ((unsigned long)sp - (unsigned long)last_ebp > 100000) + return NULL; + return sp; +} +#elif defined(__sparc) +void *GetNextFrame(void *last_ebp) { + return reinterpret_cast(last_ebp)->fr_savfp; +} +#else +void *GetNextFrame(void **last_ebp) { + return reinterpret_cast(last_ebp); +} +#endif + + +class AutoCloser { + public: + AutoCloser(int fd) : fd_(fd) {} + ~AutoCloser() { if (fd_) close(fd_); } + private: + int fd_; +}; + +// Control the execution of the lwp. +// Suspend/Resume lwp based on the value of context. +static bool ControlLwp(int lwpid, void *context) { + // The current thread is the one to handle the crash. Ignore it. + if (lwpid != pthread_self()) { + int ctlfd; + char procname[PATH_MAX]; + bool suspend = *(bool *)context; + + // Open the /proc/$pid/lwp/$lwpid/lwpctl files + snprintf(procname, sizeof (procname), "/proc/self/lwp/%d/lwpctl", lwpid); + + if ((ctlfd = open(procname, O_WRONLY|O_EXCL)) < 0) { + print_message2(2, "failed to open %s in ControlLwp\n", procname); + return false; + } + + AutoCloser autocloser(ctlfd); + + long ctl[2]; + ctl[0] = suspend ? PCSTOP : PCRUN; + ctl[1] = 0; + if (write(ctlfd, ctl, sizeof (ctl)) != sizeof (ctl)) { + print_message2(2, "failed in lwp %d\n", lwpid); + return false; + } + } + + return true; +} + +/* + * Utility function to read the contents of a file that contains a + * prheader_t at the start (/proc/$pid/lstatus or /proc/$pid/lpsinfo). + * Return true on success. + */ +static bool read_lfile(int pid, const char *lname, prheader_t *lhp) { + char lpath[PATH_MAX]; + struct stat statb; + int fd; + size_t size; + + snprintf(lpath, sizeof (lpath), "/proc/%d/%s", pid, lname); + if ((fd = open(lpath, O_RDONLY)) < 0) { + print_message2(2, "failed to open %s in read_lfile\n", lpath); + return false; + } + + AutoCloser autocloser(fd); + + if (fstat(fd, &statb) != 0) + return false; + + size = statb.st_size; + if ((size / sizeof (prheader_t)) + 32 > HEADER_MAX) { + print_message1(2, "map size overflow\n"); + return false; + } + + if (pread(fd, lhp, size, 0) <= sizeof (prheader_t)) + return false; + + return true; +} + +} // namespace + +namespace google_breakpad { + +SolarisLwp::SolarisLwp(int pid) : pid_(pid) { +} + +SolarisLwp::~SolarisLwp() { +} + +int SolarisLwp::ControlAllLwps(bool suspend) { + CallbackParam callback_param(ControlLwp, &suspend); + return IterateLwpAll(pid_, &callback_param); +} + +int SolarisLwp::GetLwpCount() const { + return IterateLwpAll(pid_, NULL); +} + +int SolarisLwp::Lwp_iter_all(int pid, + CallbackParam *callback_param) const { + lwpstatus_t *Lsp; + lwpstatus_t *sp; + prheader_t lphp[HEADER_MAX]; + prheader_t lhp[HEADER_MAX]; + prheader_t *Lphp = lphp; + prheader_t *Lhp = lhp; + lwpsinfo_t *Lpsp; + long nstat; + long ninfo; + int rv = 0; + + /* + * The /proc/pid/lstatus file has the array of lwpstatus_t's and the + * /proc/pid/lpsinfo file has the array of lwpsinfo_t's. + */ + if (read_lfile(pid, "lstatus", Lhp) == NULL) + return -1; + if (read_lfile(pid, "lpsinfo", Lphp) == NULL) { + return -1; + } + + Lsp = (lwpstatus_t *)(uintptr_t)(Lhp + 1); + Lpsp = (lwpsinfo_t *)(uintptr_t)(Lphp + 1); + + for (ninfo = Lphp->pr_nent; ninfo != 0; --ninfo) { + if (Lpsp->pr_sname != 'Z') { + sp = Lsp; + Lsp = (lwpstatus_t *)((uintptr_t)Lsp + Lhp->pr_entsize); + } else { + sp = NULL; + } + if (callback_param && + !(callback_param->call_back)(sp, callback_param->context)) + break; + ++rv; + Lpsp = (lwpsinfo_t *)((uintptr_t)Lpsp + Lphp->pr_entsize); + } + + return rv; +} + +uintptr_t SolarisLwp::GetLwpStackBottom(uintptr_t current_esp) const { + AddressValidatingContext addr; + addr.address = current_esp; + CallbackParam callback_param(AddressNotInModuleCallback, + &addr); + ListModules(&callback_param); + return stack_base_address; +} + +int SolarisLwp::GetModuleCount() const { + return ListModules(NULL); +} + +int SolarisLwp::ListModules( + CallbackParam *callback_param) const { + const char *maps_path = "/proc/self/map"; + struct stat status; + int fd = 0, num; + prmap_t map_array[MAP_MAX]; + prmap_t *maps = map_array; + size_t size; + + if ((fd = open(maps_path, O_RDONLY)) == -1) { + print_message2(2, "failed to open %s in ListModules\n", maps_path); + return -1; + } + + AutoCloser autocloser(fd); + + if (fstat(fd, &status)) + return -1; + + /* + * Determine number of mappings, this value must be + * larger than the actual module count + */ + size = status.st_size; + if ((num = (int)(size / sizeof (prmap_t))) > MAP_MAX) { + print_message1(2, "map size overflow\n"); + return -1; + } + + if (read(fd, (void *)maps, size) < 0) { + print_message2(2, "failed to read %d\n", fd); + return -1; + } + + prmap_t *_maps; + int _num; + int module_count = 0; + + /* + * Scan each mapping - note it is assummed that the mappings are + * presented in order. We fill holes between mappings. On intel + * the last mapping is usually the data segment of ld.so.1, after + * this comes a red zone into which non-fixed mapping won't get + * place. Thus we can simply bail from the loop after seeing the + * last mapping. + */ + for (_num = 0, _maps = maps; _num < num; ++_num, ++_maps) { + ModuleInfo module; + char *name = _maps->pr_mapname; + + memset(&module, 0, sizeof (module)); + module.start_addr = _maps->pr_vaddr; + module.size = _maps->pr_size; + if (strlen(name) > 0) { + int objectfd = 0; + char path[PATH_MAX]; + char buf[SELFMAG]; + + snprintf(path, sizeof (path), "/proc/self/object/%s", name); + if ((objectfd = open(path, O_RDONLY)) < 0) { + print_message1(2, "can't open module file\n"); + continue; + } + + AutoCloser autocloser(objectfd); + + if (read(objectfd, buf, SELFMAG) != SELFMAG) { + print_message1(2, "can't read module file\n"); + continue; + } + if (buf[0] != ELFMAG0 || buf[1] != ELFMAG1 || + buf[2] != ELFMAG2 || buf[3] != ELFMAG3) { + continue; + } + + strncpy(module.name, name, sizeof (module.name) - 1); + ++module_count; + } + if (callback_param && + (!callback_param->call_back(module, callback_param->context))) { + break; + } + } + + return module_count; +} + +// Check if the address is a valid virtual address. +// If the address is in any of the mapped modules, we take it as valid. +// Otherwise it is invalid. +bool SolarisLwp::IsAddressMapped(uintptr_t address) const { + AddressValidatingContext addr; + addr.address = address; + CallbackParam callback_param(AddressNotInModuleCallback, + &addr); + ListModules(&callback_param); + return addr.is_mapped; +} + +// We're looking for a ucontext_t as the second parameter +// to a signal handler function call. Luckily, the ucontext_t +// has an ebp(fp on SPARC) member which should match the ebp(fp) +// pointed to by the ebp(fp) of the signal handler frame. +// The Solaris stack looks like this: +// http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libproc/common/Pstack.c#81 +bool SolarisLwp::FindSigContext(uintptr_t sighandler_ebp, + ucontext_t **sig_ctx) { + uintptr_t previous_ebp; + uintptr_t sig_ebp; + const int MAX_STACK_DEPTH = 50; + int depth_counter = 0; + + do { +#if TARGET_CPU_SPARC + previous_ebp = reinterpret_cast(GetNextFrame( + reinterpret_cast(sighandler_ebp))); + *sig_ctx = reinterpret_cast(sighandler_ebp + sizeof (struct frame)); + uintptr_t sig_esp = (*sig_ctx)->uc_mcontext.gregs[REG_O6]; + if (sig_esp < previous_ebp && sig_esp > sighandler_ebp) + sig_ebp = (uintptr_t)(((struct frame *)sig_esp)->fr_savfp); + +#elif TARGET_CPU_X86 + previous_ebp = reinterpret_cast(GetNextFrame( + reinterpret_cast(sighandler_ebp))); + *sig_ctx = reinterpret_cast(sighandler_ebp + sizeof (struct frame) + + 3 * sizeof(uintptr_t)); + sig_ebp = (*sig_ctx)->uc_mcontext.gregs[EBP]; +#endif + sighandler_ebp = previous_ebp; + depth_counter++; + } while(previous_ebp != sig_ebp && sighandler_ebp != 0 && + IsAddressMapped(sighandler_ebp) && depth_counter < MAX_STACK_DEPTH); + + return previous_ebp == sig_ebp && previous_ebp != 0; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/solaris/handler/solaris_lwp.h b/thirdparty/google-breakpad/r318/src/client/solaris/handler/solaris_lwp.h new file mode 100644 index 00000000..0914cfcd --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/solaris/handler/solaris_lwp.h @@ -0,0 +1,160 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifndef CLIENT_SOLARIS_HANDLER_SOLARIS_LWP_H__ +#define CLIENT_SOLARIS_HANDLER_SOLARIS_LWP_H__ + +#if defined(sparc) || defined(__sparc) +#define TARGET_CPU_SPARC 1 +#elif defined(i386) || defined(__i386) +#define TARGET_CPU_X86 1 +#else +#error "cannot determine cpu type" +#endif + +#include +#include +#include +#include + +#ifndef _KERNEL +#define _KERNEL +#define MUST_UNDEF_KERNEL +#endif // _KERNEL +#include +#ifdef MUST_UNDEF_KERNEL +#undef _KERNEL +#undef MUST_UNDEF_KERNEL +#endif // MUST_UNDEF_KERNEL + +namespace google_breakpad { + +// Max module path name length. +static const int kMaxModuleNameLength = 256; + +// Holding infomaton about a module in the process. +struct ModuleInfo { + char name[kMaxModuleNameLength]; + uintptr_t start_addr; + int size; +}; + +// A callback to run when getting a lwp in the process. +// Return true will go on to the next lwp while return false will stop the +// iteration. +typedef bool (*LwpCallback)(lwpstatus_t* lsp, void *context); + +// A callback to run when a new module is found in the process. +// Return true will go on to the next module while return false will stop the +// iteration. +typedef bool (*ModuleCallback)(const ModuleInfo &module_info, void *context); + +// A callback to run when getting a lwpid in the process. +// Return true will go on to the next lwp while return false will stop the +// iteration. +typedef bool (*LwpidCallback)(int lwpid, void *context); + +// Holding the callback information. +template +struct CallbackParam { + // Callback function address. + CallbackFunc call_back; + // Callback context; + void *context; + + CallbackParam() : call_back(NULL), context(NULL) { + } + + CallbackParam(CallbackFunc func, void *func_context) : + call_back(func), context(func_context) { + } +}; + +/////////////////////////////////////////////////////////////////////////////// + +// +// SolarisLwp +// +// Provides handy support for operation on Solaris lwps. +// It uses proc file system to get lwp information. +// +// TODO(Alfred): Currently it only supports x86. Add SPARC support. +// +class SolarisLwp { + public: + // Create a SolarisLwp instance to list all the lwps in a process. + explicit SolarisLwp(int pid); + ~SolarisLwp(); + + int getpid() const { return this->pid_; } + + // Control all the lwps in the process. + // Return the number of suspended/resumed lwps in the process. + // Return -1 means failed to control lwps. + int ControlAllLwps(bool suspend); + + // Get the count of lwps in the process. + // Return -1 means error. + int GetLwpCount() const; + + // Iterate the lwps of process. + // Whenever there is a lwp found, the callback will be invoked to process + // the information. + // Return the callback return value or -1 on error. + int Lwp_iter_all(int pid, CallbackParam *callback_param) const; + + // Get the module count of the current process. + int GetModuleCount() const; + + // Get the mapped modules in the address space. + // Whenever a module is found, the callback will be invoked to process the + // information. + // Return how may modules are found. + int ListModules(CallbackParam *callback_param) const; + + // Get the bottom of the stack from esp. + uintptr_t GetLwpStackBottom(uintptr_t current_esp) const; + + // Finds a signal context on the stack given the ebp of our signal handler. + bool FindSigContext(uintptr_t sighandler_ebp, ucontext_t **sig_ctx); + + private: + // Check if the address is a valid virtual address. + bool IsAddressMapped(uintptr_t address) const; + + private: + // The pid of the process we are listing lwps. + int pid_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_SOLARIS_HANDLER_SOLARIS_LWP_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/common/auto_critical_section.h b/thirdparty/google-breakpad/r318/src/client/windows/common/auto_critical_section.h new file mode 100644 index 00000000..82c7b7f1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/common/auto_critical_section.h @@ -0,0 +1,63 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ +#define CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ + +#include + +namespace google_breakpad { + +// Automatically enters the critical section in the constructor and leaves +// the critical section in the destructor. +class AutoCriticalSection { + public: + // Creates a new instance with the given critical section object + // and enters the critical section immediately. + explicit AutoCriticalSection(CRITICAL_SECTION* cs) : cs_(cs) { + assert(cs_); + EnterCriticalSection(cs_); + } + + // Destructor: leaves the critical section. + ~AutoCriticalSection() { + LeaveCriticalSection(cs_); + } + + private: + // Disable copy ctor and operator=. + AutoCriticalSection(const AutoCriticalSection&); + AutoCriticalSection& operator=(const AutoCriticalSection&); + + CRITICAL_SECTION* cs_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/common/ipc_protocol.h b/thirdparty/google-breakpad/r318/src/client/windows/common/ipc_protocol.h new file mode 100644 index 00000000..cba8699c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/common/ipc_protocol.h @@ -0,0 +1,179 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ +#define CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ + +#include +#include +#include +#include +#include "common/windows/string_utils-inl.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Name/value pair for custom client information. +struct CustomInfoEntry { + // Maximum length for name and value for client custom info. + static const int kNameMaxLength = 64; + static const int kValueMaxLength = 64; + + CustomInfoEntry() { + // Putting name and value in initializer list makes VC++ show warning 4351. + set_name(NULL); + set_value(NULL); + } + + CustomInfoEntry(const wchar_t* name_arg, const wchar_t* value_arg) { + set_name(name_arg); + set_value(value_arg); + } + + void set_name(const wchar_t* name_arg) { + if (!name_arg) { + name[0] = L'\0'; + return; + } + WindowsStringUtils::safe_wcscpy(name, kNameMaxLength, name_arg); + } + + void set_value(const wchar_t* value_arg) { + if (!value_arg) { + value[0] = L'\0'; + return; + } + + WindowsStringUtils::safe_wcscpy(value, kValueMaxLength, value_arg); + } + + void set(const wchar_t* name_arg, const wchar_t* value_arg) { + set_name(name_arg); + set_value(value_arg); + } + + wchar_t name[kNameMaxLength]; + wchar_t value[kValueMaxLength]; +}; + +// Constants for the protocol between client and the server. + +// Tags sent with each message indicating the purpose of +// the message. +enum MessageTag { + MESSAGE_TAG_NONE = 0, + MESSAGE_TAG_REGISTRATION_REQUEST = 1, + MESSAGE_TAG_REGISTRATION_RESPONSE = 2, + MESSAGE_TAG_REGISTRATION_ACK = 3 +}; + +struct CustomClientInfo { + const CustomInfoEntry* entries; + int count; +}; + +// Message structure for IPC between crash client and crash server. +struct ProtocolMessage { + ProtocolMessage() + : tag(MESSAGE_TAG_NONE), + pid(0), + dump_type(MiniDumpNormal), + thread_id(0), + exception_pointers(NULL), + assert_info(NULL), + custom_client_info(), + dump_request_handle(NULL), + dump_generated_handle(NULL), + server_alive_handle(NULL) { + } + + // Creates an instance with the given parameters. + ProtocolMessage(MessageTag arg_tag, + DWORD arg_pid, + MINIDUMP_TYPE arg_dump_type, + DWORD* arg_thread_id, + EXCEPTION_POINTERS** arg_exception_pointers, + MDRawAssertionInfo* arg_assert_info, + const CustomClientInfo& custom_info, + HANDLE arg_dump_request_handle, + HANDLE arg_dump_generated_handle, + HANDLE arg_server_alive) + : tag(arg_tag), + pid(arg_pid), + dump_type(arg_dump_type), + thread_id(arg_thread_id), + exception_pointers(arg_exception_pointers), + assert_info(arg_assert_info), + custom_client_info(custom_info), + dump_request_handle(arg_dump_request_handle), + dump_generated_handle(arg_dump_generated_handle), + server_alive_handle(arg_server_alive) { + } + + // Tag in the message. + MessageTag tag; + + // Process id. + DWORD pid; + + // Dump type requested. + MINIDUMP_TYPE dump_type; + + // Client thread id pointer. + DWORD* thread_id; + + // Exception information. + EXCEPTION_POINTERS** exception_pointers; + + // Assert information in case of an invalid parameter or + // pure call failure. + MDRawAssertionInfo* assert_info; + + // Custom client information. + CustomClientInfo custom_client_info; + + // Handle to signal the crash event. + HANDLE dump_request_handle; + + // Handle to check if server is done generating crash. + HANDLE dump_generated_handle; + + // Handle to a mutex that becomes signaled (WAIT_ABANDONED) + // if server process goes down. + HANDLE server_alive_handle; + + private: + // Disable copy ctor and operator=. + ProtocolMessage(const ProtocolMessage& msg); + ProtocolMessage& operator=(const ProtocolMessage& msg); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/ReadMe.txt b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/ReadMe.txt new file mode 100644 index 00000000..b54d0e11 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/ReadMe.txt @@ -0,0 +1,58 @@ +========================================================================= + State machine transitions for the Crash Generation Server +========================================================================= + +========================================================================= + | + STATE | ACTIONS + | +========================================================================= + ERROR | Clean up resources used to serve clients. + | Always remain in ERROR state. +------------------------------------------------------------------------- + INITIAL | Connect to the pipe asynchronously. + | If connection is successfully queued up asynchronously, + | go into CONNECTING state. + | If connection is done synchronously, go into CONNECTED + | state. + | For any unexpected problems, go into ERROR state. +------------------------------------------------------------------------- + CONNECTING | Get the result of async connection request. + | If I/O is still incomplete, remain in the CONNECTING + | state. + | If connection is complete, go into CONNECTED state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + CONNECTED | Read from the pipe asynchronously. + | If read request is successfully queued up asynchronously, + | go into READING state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + READING | Get the result of async read request. + | If read is done, go into READ_DONE state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + READ_DONE | Register the client, prepare the reply and write the + | reply to the pipe asynchronously. + | If write request is successfully queued up asynchronously, + | go into WRITING state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + WRITING | Get the result of the async write request. + | If write is done, go into WRITE_DONE state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + WRITE_DONE | Read from the pipe asynchronously (for an ACK). + | If read request is successfully queued up asynchonously, + | go into READING_ACK state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + READING_ACK | Get the result of the async read request. + | If read is done, perform action for successful client + | connection. + | Go into DISCONNECTING state. +------------------------------------------------------------------------- + DISCONNECTING | Disconnect from the pipe, reset the event and go into + | INITIAL state and signal the event again. If anything + | fails, go into ERROR state. +========================================================================= diff --git a/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/client_info.cc b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/client_info.cc new file mode 100644 index 00000000..4752c4ae --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/client_info.cc @@ -0,0 +1,210 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "client/windows/crash_generation/client_info.h" +#include "client/windows/common/ipc_protocol.h" + +static const wchar_t kCustomInfoProcessUptimeName[] = L"ptime"; + +namespace google_breakpad { + +ClientInfo::ClientInfo(CrashGenerationServer* crash_server, + DWORD pid, + MINIDUMP_TYPE dump_type, + DWORD* thread_id, + EXCEPTION_POINTERS** ex_info, + MDRawAssertionInfo* assert_info, + const CustomClientInfo& custom_client_info) + : crash_server_(crash_server), + pid_(pid), + dump_type_(dump_type), + ex_info_(ex_info), + assert_info_(assert_info), + custom_client_info_(custom_client_info), + thread_id_(thread_id), + process_handle_(NULL), + dump_requested_handle_(NULL), + dump_generated_handle_(NULL), + dump_request_wait_handle_(NULL), + process_exit_wait_handle_(NULL) { + GetSystemTimeAsFileTime(&start_time_); +} + +bool ClientInfo::Initialize() { + process_handle_ = OpenProcess(GENERIC_ALL, FALSE, pid_); + if (!process_handle_) { + return false; + } + + dump_requested_handle_ = CreateEvent(NULL, // Security attributes. + TRUE, // Manual reset. + FALSE, // Initial state. + NULL); // Name. + if (!dump_requested_handle_) { + return false; + } + + dump_generated_handle_ = CreateEvent(NULL, // Security attributes. + TRUE, // Manual reset. + FALSE, // Initial state. + NULL); // Name. + return dump_generated_handle_ != NULL; +} + +ClientInfo::~ClientInfo() { + if (dump_request_wait_handle_) { + // Wait for callbacks that might already be running to finish. + UnregisterWaitEx(dump_request_wait_handle_, INVALID_HANDLE_VALUE); + } + + if (process_exit_wait_handle_) { + // Wait for the callback that might already be running to finish. + UnregisterWaitEx(process_exit_wait_handle_, INVALID_HANDLE_VALUE); + } + + if (process_handle_) { + CloseHandle(process_handle_); + } + + if (dump_requested_handle_) { + CloseHandle(dump_requested_handle_); + } + + if (dump_generated_handle_) { + CloseHandle(dump_generated_handle_); + } +} + +bool ClientInfo::UnregisterWaits() { + bool success = true; + + if (dump_request_wait_handle_) { + if (!UnregisterWait(dump_request_wait_handle_)) { + success = false; + } else { + dump_request_wait_handle_ = NULL; + } + } + + if (process_exit_wait_handle_) { + if (!UnregisterWait(process_exit_wait_handle_)) { + success = false; + } else { + process_exit_wait_handle_ = NULL; + } + } + + return success; +} + +bool ClientInfo::GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const { + SIZE_T bytes_count = 0; + if (!ReadProcessMemory(process_handle_, + ex_info_, + ex_info, + sizeof(*ex_info), + &bytes_count)) { + return false; + } + + return bytes_count == sizeof(*ex_info); +} + +bool ClientInfo::GetClientThreadId(DWORD* thread_id) const { + SIZE_T bytes_count = 0; + if (!ReadProcessMemory(process_handle_, + thread_id_, + thread_id, + sizeof(*thread_id), + &bytes_count)) { + return false; + } + + return bytes_count == sizeof(*thread_id); +} + +void ClientInfo::SetProcessUptime() { + FILETIME now = {0}; + GetSystemTimeAsFileTime(&now); + + ULARGE_INTEGER time_start; + time_start.HighPart = start_time_.dwHighDateTime; + time_start.LowPart = start_time_.dwLowDateTime; + + ULARGE_INTEGER time_now; + time_now.HighPart = now.dwHighDateTime; + time_now.LowPart = now.dwLowDateTime; + + // Calculate the delay and convert it from 100-nanoseconds to milliseconds. + __int64 delay = (time_now.QuadPart - time_start.QuadPart) / 10 / 1000; + + // Convert it to a string. + wchar_t* value = custom_info_entries_.get()[custom_client_info_.count].value; + _i64tow_s(delay, value, CustomInfoEntry::kValueMaxLength, 10); +} + +bool ClientInfo::PopulateCustomInfo() { + SIZE_T bytes_count = 0; + SIZE_T read_count = sizeof(CustomInfoEntry) * custom_client_info_.count; + + // If the scoped array for custom info already has an array, it will be + // the same size as what we need. This is because the number of custom info + // entries is always the same. So allocate memory only if scoped array has + // a NULL pointer. + if (!custom_info_entries_.get()) { + // Allocate an extra entry for reporting uptime for the client process. + custom_info_entries_.reset( + new CustomInfoEntry[custom_client_info_.count + 1]); + // Use the last element in the array for uptime. + custom_info_entries_.get()[custom_client_info_.count].set_name( + kCustomInfoProcessUptimeName); + } + + if (!ReadProcessMemory(process_handle_, + custom_client_info_.entries, + custom_info_entries_.get(), + read_count, + &bytes_count)) { + return false; + } + + SetProcessUptime(); + return (bytes_count != read_count); +} + +CustomClientInfo ClientInfo::GetCustomInfo() const { + CustomClientInfo custom_info; + custom_info.entries = custom_info_entries_.get(); + // Add 1 to the count from the client process to account for extra entry for + // process uptime. + custom_info.count = custom_client_info_.count + 1; + return custom_info; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/client_info.h b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/client_info.h new file mode 100644 index 00000000..774816fb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/client_info.h @@ -0,0 +1,170 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ +#define CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ + +#include +#include +#include "client/windows/common/ipc_protocol.h" +#include "google_breakpad/common/minidump_format.h" +#include "processor/scoped_ptr.h" + +namespace google_breakpad { + +class CrashGenerationServer; + +// Abstraction for a crash client process. +class ClientInfo { + public: + // Creates an instance with the given values. Gets the process + // handle for the given process id and creates necessary event + // objects. + ClientInfo(CrashGenerationServer* crash_server, + DWORD pid, + MINIDUMP_TYPE dump_type, + DWORD* thread_id, + EXCEPTION_POINTERS** ex_info, + MDRawAssertionInfo* assert_info, + const CustomClientInfo& custom_client_info); + + ~ClientInfo(); + + CrashGenerationServer* crash_server() const { return crash_server_; } + DWORD pid() const { return pid_; } + MINIDUMP_TYPE dump_type() const { return dump_type_; } + EXCEPTION_POINTERS** ex_info() const { return ex_info_; } + MDRawAssertionInfo* assert_info() const { return assert_info_; } + DWORD* thread_id() const { return thread_id_; } + HANDLE process_handle() const { return process_handle_; } + HANDLE dump_requested_handle() const { return dump_requested_handle_; } + HANDLE dump_generated_handle() const { return dump_generated_handle_; } + + HANDLE dump_request_wait_handle() const { + return dump_request_wait_handle_; + } + + void set_dump_request_wait_handle(HANDLE value) { + dump_request_wait_handle_ = value; + } + + HANDLE process_exit_wait_handle() const { + return process_exit_wait_handle_; + } + + void set_process_exit_wait_handle(HANDLE value) { + process_exit_wait_handle_ = value; + } + + // Unregister all waits for the client. + bool UnregisterWaits(); + + bool Initialize(); + bool GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const; + bool GetClientThreadId(DWORD* thread_id) const; + + // Reads the custom information from the client process address space. + bool PopulateCustomInfo(); + + // Returns the client custom information. + CustomClientInfo GetCustomInfo() const; + + private: + // Calcualtes the uptime for the client process, converts it to a string and + // stores it in the last entry of client custom info. + void SetProcessUptime(); + + // Crash generation server. + CrashGenerationServer* crash_server_; + + // Client process ID. + DWORD pid_; + + // Dump type requested by the client. + MINIDUMP_TYPE dump_type_; + + // Address of an EXCEPTION_POINTERS* variable in the client + // process address space that will point to an instance of + // EXCEPTION_POINTERS containing information about crash. + // + // WARNING: Do not dereference these pointers as they are pointers + // in the address space of another process. + EXCEPTION_POINTERS** ex_info_; + + // Address of an instance of MDRawAssertionInfo in the client + // process address space that will contain information about + // non-exception related crashes like invalid parameter assertion + // failures and pure calls. + // + // WARNING: Do not dereference these pointers as they are pointers + // in the address space of another process. + MDRawAssertionInfo* assert_info_; + + // Custom information about the client. + CustomClientInfo custom_client_info_; + + // Contains the custom client info entries read from the client process + // memory. This will be populated only if the method GetClientCustomInfo + // is called. + scoped_array custom_info_entries_; + + // Address of a variable in the client process address space that + // will contain the thread id of the crashing client thread. + // + // WARNING: Do not dereference these pointers as they are pointers + // in the address space of another process. + DWORD* thread_id_; + + // Client process handle. + HANDLE process_handle_; + + // Dump request event handle. + HANDLE dump_requested_handle_; + + // Dump generated event handle. + HANDLE dump_generated_handle_; + + // Wait handle for dump request event. + HANDLE dump_request_wait_handle_; + + // Wait handle for process exit event. + HANDLE process_exit_wait_handle_; + + // Time when the client process started. It is used to determine the uptime + // for the client process when it signals a crash. + FILETIME start_time_; + + // Disallow copy ctor and operator=. + ClientInfo(const ClientInfo& client_info); + ClientInfo& operator=(const ClientInfo& client_info); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_client.cc b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_client.cc new file mode 100644 index 00000000..197807ab --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_client.cc @@ -0,0 +1,337 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "client/windows/crash_generation/crash_generation_client.h" +#include +#include +#include "client/windows/common/ipc_protocol.h" + +namespace google_breakpad { + +const int kPipeBusyWaitTimeoutMs = 2000; + +#ifdef _DEBUG +const DWORD kWaitForServerTimeoutMs = INFINITE; +#else +const DWORD kWaitForServerTimeoutMs = 15000; +#endif + +const int kPipeConnectMaxAttempts = 2; + +const DWORD kPipeDesiredAccess = FILE_READ_DATA | + FILE_WRITE_DATA | + FILE_WRITE_ATTRIBUTES; + +const DWORD kPipeFlagsAndAttributes = SECURITY_IDENTIFICATION | + SECURITY_SQOS_PRESENT; + +const DWORD kPipeMode = PIPE_READMODE_MESSAGE; + +const size_t kWaitEventCount = 2; + +// This function is orphan for production code. It can be used +// for debugging to help repro some scenarios like the client +// is slow in writing to the pipe after connecting, the client +// is slow in reading from the pipe after writing, etc. The parameter +// overlapped below is not used and it is present to match the signature +// of this function to TransactNamedPipe Win32 API. Uncomment if needed +// for debugging. +/** +static bool TransactNamedPipeDebugHelper(HANDLE pipe, + const void* in_buffer, + DWORD in_size, + void* out_buffer, + DWORD out_size, + DWORD* bytes_count, + LPOVERLAPPED) { + // Uncomment the next sleep to create a gap before writing + // to pipe. + // Sleep(5000); + + if (!WriteFile(pipe, + in_buffer, + in_size, + bytes_count, + NULL)) { + return false; + } + + // Uncomment the next sleep to create a gap between write + // and read. + // Sleep(5000); + + return ReadFile(pipe, out_buffer, out_size, bytes_count, NULL) != FALSE; +} +**/ + +CrashGenerationClient::CrashGenerationClient( + const wchar_t* pipe_name, + MINIDUMP_TYPE dump_type, + const CustomClientInfo* custom_info) + : pipe_name_(pipe_name), + dump_type_(dump_type), + thread_id_(0), + server_process_id_(0), + crash_event_(NULL), + crash_generated_(NULL), + server_alive_(NULL), + exception_pointers_(NULL), + custom_info_() { + memset(&assert_info_, 0, sizeof(assert_info_)); + if (custom_info) { + custom_info_ = *custom_info; + } +} + +CrashGenerationClient::~CrashGenerationClient() { + if (crash_event_) { + CloseHandle(crash_event_); + } + + if (crash_generated_) { + CloseHandle(crash_generated_); + } + + if (server_alive_) { + CloseHandle(server_alive_); + } +} + +// Performs the registration step with the server process. +// The registration step involves communicating with the server +// via a named pipe. The client sends the following pieces of +// data to the server: +// +// * Message tag indicating the client is requesting registration. +// * Process id of the client process. +// * Address of a DWORD variable in the client address space +// that will contain the thread id of the client thread that +// caused the crash. +// * Address of a EXCEPTION_POINTERS* variable in the client +// address space that will point to an instance of EXCEPTION_POINTERS +// when the crash happens. +// * Address of an instance of MDRawAssertionInfo that will contain +// relevant information in case of non-exception crashes like assertion +// failures and pure calls. +// +// In return the client expects the following information from the server: +// +// * Message tag indicating successful registration. +// * Server process id. +// * Handle to an object that client can signal to request dump +// generation from the server. +// * Handle to an object that client can wait on after requesting +// dump generation for the server to finish dump generation. +// * Handle to a mutex object that client can wait on to make sure +// server is still alive. +// +// If any step of the expected behavior mentioned above fails, the +// registration step is not considered successful and hence out-of-process +// dump generation service is not available. +// +// Returns true if the registration is successful; false otherwise. +bool CrashGenerationClient::Register() { + HANDLE pipe = ConnectToServer(); + if (!pipe) { + return false; + } + + bool success = RegisterClient(pipe); + CloseHandle(pipe); + return success; +} + +HANDLE CrashGenerationClient::ConnectToServer() { + HANDLE pipe = ConnectToPipe(pipe_name_.c_str(), + kPipeDesiredAccess, + kPipeFlagsAndAttributes); + if (!pipe) { + return NULL; + } + + DWORD mode = kPipeMode; + if (!SetNamedPipeHandleState(pipe, &mode, NULL, NULL)) { + CloseHandle(pipe); + pipe = NULL; + } + + return pipe; +} + +bool CrashGenerationClient::RegisterClient(HANDLE pipe) { + ProtocolMessage msg(MESSAGE_TAG_REGISTRATION_REQUEST, + GetCurrentProcessId(), + dump_type_, + &thread_id_, + &exception_pointers_, + &assert_info_, + custom_info_, + NULL, + NULL, + NULL); + ProtocolMessage reply; + DWORD bytes_count = 0; + // The call to TransactNamedPipe below can be changed to a call + // to TransactNamedPipeDebugHelper to help repro some scenarios. + // For details see comments for TransactNamedPipeDebugHelper. + if (!TransactNamedPipe(pipe, + &msg, + sizeof(msg), + &reply, + sizeof(ProtocolMessage), + &bytes_count, + NULL)) { + return false; + } + + if (!ValidateResponse(reply)) { + return false; + } + + ProtocolMessage ack_msg; + ack_msg.tag = MESSAGE_TAG_REGISTRATION_ACK; + + if (!WriteFile(pipe, &ack_msg, sizeof(ack_msg), &bytes_count, NULL)) { + return false; + } + crash_event_ = reply.dump_request_handle; + crash_generated_ = reply.dump_generated_handle; + server_alive_ = reply.server_alive_handle; + server_process_id_ = reply.pid; + + return true; +} + +HANDLE CrashGenerationClient::ConnectToPipe(const wchar_t* pipe_name, + DWORD pipe_access, + DWORD flags_attrs) { + for (int i = 0; i < kPipeConnectMaxAttempts; ++i) { + HANDLE pipe = CreateFile(pipe_name, + pipe_access, + 0, + NULL, + OPEN_EXISTING, + flags_attrs, + NULL); + if (pipe != INVALID_HANDLE_VALUE) { + return pipe; + } + + // Cannot continue retrying if error is something other than + // ERROR_PIPE_BUSY. + if (GetLastError() != ERROR_PIPE_BUSY) { + break; + } + + // Cannot continue retrying if wait on pipe fails. + if (!WaitNamedPipe(pipe_name, kPipeBusyWaitTimeoutMs)) { + break; + } + } + + return NULL; +} + +bool CrashGenerationClient::ValidateResponse( + const ProtocolMessage& msg) const { + return (msg.tag == MESSAGE_TAG_REGISTRATION_RESPONSE) && + (msg.pid != 0) && + (msg.dump_request_handle != NULL) && + (msg.dump_generated_handle != NULL) && + (msg.server_alive_handle != NULL); +} + +bool CrashGenerationClient::IsRegistered() const { + return crash_event_ != NULL; +} + +bool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info) { + if (!IsRegistered()) { + return false; + } + + exception_pointers_ = ex_info; + thread_id_ = GetCurrentThreadId(); + + assert_info_.line = 0; + assert_info_.type = 0; + assert_info_.expression[0] = 0; + assert_info_.file[0] = 0; + assert_info_.function[0] = 0; + + return SignalCrashEventAndWait(); +} + +bool CrashGenerationClient::RequestDump(MDRawAssertionInfo* assert_info) { + if (!IsRegistered()) { + return false; + } + + exception_pointers_ = NULL; + + if (assert_info) { + memcpy(&assert_info_, assert_info, sizeof(assert_info_)); + } else { + memset(&assert_info_, 0, sizeof(assert_info_)); + } + + thread_id_ = GetCurrentThreadId(); + + return SignalCrashEventAndWait(); +} + +bool CrashGenerationClient::SignalCrashEventAndWait() { + assert(crash_event_); + assert(crash_generated_); + assert(server_alive_); + + // Reset the dump generated event before signaling the crash + // event so that the server can set the dump generated event + // once it is done generating the event. + if (!ResetEvent(crash_generated_)) { + return false; + } + + if (!SetEvent(crash_event_)) { + return false; + } + + HANDLE wait_handles[kWaitEventCount] = {crash_generated_, server_alive_}; + + DWORD result = WaitForMultipleObjects(kWaitEventCount, + wait_handles, + FALSE, + kWaitForServerTimeoutMs); + + // Crash dump was successfully generated only if the server + // signaled the crash generated event. + return result == WAIT_OBJECT_0; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_client.h b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_client.h new file mode 100644 index 00000000..81b0e6ca --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_client.h @@ -0,0 +1,159 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ +#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ + +#include +#include +#include +#include +#include "client/windows/common/ipc_protocol.h" +#include "processor/scoped_ptr.h" + +namespace google_breakpad { + +struct CustomClientInfo; + +// Abstraction of client-side implementation of out of process +// crash generation. +// +// The process that desires to have out-of-process crash dump +// generation service can use this class in the following way: +// +// * Create an instance. +// * Call Register method so that the client tries to register +// with the server process and check the return value. If +// registration is not successful, out-of-process crash dump +// generation will not be available +// * Request dump generation by calling either of the two +// overloaded RequestDump methods - one in case of exceptions +// and the other in case of assertion failures +// +// Note that it is the responsibility of the client code of +// this class to set the unhandled exception filter with the +// system by calling the SetUnhandledExceptionFilter function +// and the client code should explicitly request dump generation. +class CrashGenerationClient { + public: + CrashGenerationClient(const wchar_t* pipe_name, + MINIDUMP_TYPE dump_type, + const CustomClientInfo* custom_info); + + ~CrashGenerationClient(); + + // Registers the client process with the crash server. + // + // Returns true if the registration is successful; false otherwise. + bool Register(); + + // Requests the crash server to generate a dump with the given + // exception information. + // + // Returns true if the dump was successful; false otherwise. Note that + // if the registration step was not performed or it was not successful, + // false will be returned. + bool RequestDump(EXCEPTION_POINTERS* ex_info); + + // Requests the crash server to generate a dump with the given + // assertion information. + // + // Returns true if the dump was successful; false otherwise. Note that + // if the registration step was not performed or it was not successful, + // false will be returned. + bool RequestDump(MDRawAssertionInfo* assert_info); + + private: + // Connects to the appropriate pipe and sets the pipe handle state. + // + // Returns the pipe handle if everything goes well; otherwise Returns NULL. + HANDLE ConnectToServer(); + + // Performs a handshake with the server over the given pipe which should be + // already connected to the server. + // + // Returns true if handshake with the server was successful; false otherwise. + bool RegisterClient(HANDLE pipe); + + // Validates the given server response. + bool ValidateResponse(const ProtocolMessage& msg) const; + + // Returns true if the registration step succeeded; false otherwise. + bool IsRegistered() const; + + // Connects to the given named pipe with given parameters. + // + // Returns true if the connection is successful; false otherwise. + HANDLE ConnectToPipe(const wchar_t* pipe_name, + DWORD pipe_access, + DWORD flags_attrs); + + // Signals the crash event and wait for the server to generate crash. + bool SignalCrashEventAndWait(); + + // Pipe name to use to talk to server. + std::wstring pipe_name_; + + // Custom client information + CustomClientInfo custom_info_; + + // Type of dump to generate. + MINIDUMP_TYPE dump_type_; + + // Event to signal in case of a crash. + HANDLE crash_event_; + + // Handle to wait on after signaling a crash for the server + // to finish generating crash dump. + HANDLE crash_generated_; + + // Handle to a mutex that will become signaled with WAIT_ABANDONED + // if the server process goes down. + HANDLE server_alive_; + + // Server process id. + DWORD server_process_id_; + + // Id of the thread that caused the crash. + DWORD thread_id_; + + // Exception pointers for an exception crash. + EXCEPTION_POINTERS* exception_pointers_; + + // Assertion info for an invalid parameter or pure call crash. + MDRawAssertionInfo assert_info_; + + // Disable copy ctor and operator=. + CrashGenerationClient(const CrashGenerationClient& crash_client); + CrashGenerationClient& operator=(const CrashGenerationClient& crash_client); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_server.cc b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_server.cc new file mode 100644 index 00000000..ac76e590 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_server.cc @@ -0,0 +1,852 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "client/windows/crash_generation/crash_generation_server.h" +#include +#include +#include +#include "client/windows/common/auto_critical_section.h" +#include "processor/scoped_ptr.h" + +namespace google_breakpad { + +// Output buffer size. +static const size_t kOutBufferSize = 64; + +// Input buffer size. +static const size_t kInBufferSize = 64; + +// Access flags for the client on the dump request event. +static const DWORD kDumpRequestEventAccess = EVENT_MODIFY_STATE; + +// Access flags for the client on the dump generated event. +static const DWORD kDumpGeneratedEventAccess = EVENT_MODIFY_STATE | + SYNCHRONIZE; + +// Access flags for the client on the mutex. +static const DWORD kMutexAccess = SYNCHRONIZE; + +// Attribute flags for the pipe. +static const DWORD kPipeAttr = FILE_FLAG_FIRST_PIPE_INSTANCE | + PIPE_ACCESS_DUPLEX | + FILE_FLAG_OVERLAPPED; + +// Mode for the pipe. +static const DWORD kPipeMode = PIPE_TYPE_MESSAGE | + PIPE_READMODE_MESSAGE | + PIPE_WAIT; + +// For pipe I/O, execute the callback in the wait thread itself, +// since the callback does very little work. The callback executes +// the code for one of the states of the server state machine and +// the code for all of the states perform async I/O and hence +// finish very quickly. +static const ULONG kPipeIOThreadFlags = WT_EXECUTEINWAITTHREAD; + +// Dump request threads will, most likely, generate dumps. That may +// take some time to finish, so specify WT_EXECUTELONGFUNCTION flag. +static const ULONG kDumpRequestThreadFlags = WT_EXECUTEINWAITTHREAD | + WT_EXECUTELONGFUNCTION; + +// Maximum delay during server shutdown if some work items +// are still executing. +static const int kShutdownDelayMs = 10000; + +// Interval for each sleep during server shutdown. +static const int kShutdownSleepIntervalMs = 5; + +static bool IsClientRequestValid(const ProtocolMessage& msg) { + return msg.tag == MESSAGE_TAG_REGISTRATION_REQUEST && + msg.pid != 0 && + msg.thread_id != NULL && + msg.exception_pointers != NULL && + msg.assert_info != NULL; +} + +CrashGenerationServer::CrashGenerationServer( + const std::wstring& pipe_name, + SECURITY_ATTRIBUTES* pipe_sec_attrs, + OnClientConnectedCallback connect_callback, + void* connect_context, + OnClientDumpRequestCallback dump_callback, + void* dump_context, + OnClientExitedCallback exit_callback, + void* exit_context, + bool generate_dumps, + const std::wstring* dump_path) + : pipe_name_(pipe_name), + pipe_sec_attrs_(pipe_sec_attrs), + pipe_(NULL), + pipe_wait_handle_(NULL), + server_alive_handle_(NULL), + connect_callback_(connect_callback), + connect_context_(connect_context), + dump_callback_(dump_callback), + dump_context_(dump_context), + exit_callback_(exit_callback), + exit_context_(exit_context), + generate_dumps_(generate_dumps), + dump_generator_(NULL), + server_state_(IPC_SERVER_STATE_INITIAL), + shutting_down_(false), + overlapped_(), + client_info_(NULL), + cleanup_item_count_(0) { + InitializeCriticalSection(&clients_sync_); + + if (dump_path) { + dump_generator_.reset(new MinidumpGenerator(*dump_path)); + } +} + +CrashGenerationServer::~CrashGenerationServer() { + // Indicate to existing threads that server is shutting down. + shutting_down_ = true; + + // Even if there are no current worker threads running, it is possible that + // an I/O request is pending on the pipe right now but not yet done. In fact, + // it's very likely this is the case unless we are in an ERROR state. If we + // don't wait for the pending I/O to be done, then when the I/O completes, + // it may write to invalid memory. AppVerifier will flag this problem too. + // So we disconnect from the pipe and then wait for the server to get into + // error state so that the pending I/O will fail and get cleared. + DisconnectNamedPipe(pipe_); + int num_tries = 100; + while (num_tries-- && server_state_ != IPC_SERVER_STATE_ERROR) { + Sleep(10); + } + + // Unregister wait on the pipe. + if (pipe_wait_handle_) { + // Wait for already executing callbacks to finish. + UnregisterWaitEx(pipe_wait_handle_, INVALID_HANDLE_VALUE); + } + + // Close the pipe to avoid further client connections. + if (pipe_) { + CloseHandle(pipe_); + } + + // Request all ClientInfo objects to unregister all waits. + // New scope to hold the lock for the shortest time. + { + AutoCriticalSection lock(&clients_sync_); + + std::list::iterator iter; + for (iter = clients_.begin(); iter != clients_.end(); ++iter) { + ClientInfo* client_info = *iter; + client_info->UnregisterWaits(); + } + } + + // Now that all waits have been unregistered, wait for some time + // for all pending work items to finish. + int total_wait = 0; + while (cleanup_item_count_ > 0) { + Sleep(kShutdownSleepIntervalMs); + + total_wait += kShutdownSleepIntervalMs; + + if (total_wait >= kShutdownDelayMs) { + break; + } + } + + // Clean up all the ClientInfo objects. + // New scope to hold the lock for the shortest time. + { + AutoCriticalSection lock(&clients_sync_); + + std::list::iterator iter; + for (iter = clients_.begin(); iter != clients_.end(); ++iter) { + ClientInfo* client_info = *iter; + delete client_info; + } + } + + if (server_alive_handle_) { + // Release the mutex before closing the handle so that clients requesting + // dumps wait for a long time for the server to generate a dump. + ReleaseMutex(server_alive_handle_); + CloseHandle(server_alive_handle_); + } + + DeleteCriticalSection(&clients_sync_); +} + +bool CrashGenerationServer::Start() { + server_state_ = IPC_SERVER_STATE_INITIAL; + + server_alive_handle_ = CreateMutex(NULL, TRUE, NULL); + if (!server_alive_handle_) { + return false; + } + + // Event to signal the client connection and pipe reads and writes. + overlapped_.hEvent = CreateEvent(NULL, // Security descriptor. + TRUE, // Manual reset. + FALSE, // Initially signaled. + NULL); // Name. + if (!overlapped_.hEvent) { + return false; + } + + // Register a callback with the thread pool for the client connection. + RegisterWaitForSingleObject(&pipe_wait_handle_, + overlapped_.hEvent, + OnPipeConnected, + this, + INFINITE, + kPipeIOThreadFlags); + + pipe_ = CreateNamedPipe(pipe_name_.c_str(), + kPipeAttr, + kPipeMode, + 1, + kOutBufferSize, + kInBufferSize, + 0, + pipe_sec_attrs_); + if (pipe_ == INVALID_HANDLE_VALUE) { + return false; + } + + // Signal the event to start a separate thread to handle + // client connections. + return SetEvent(overlapped_.hEvent) != FALSE; +} + +// If the server thread serving clients ever gets into the +// ERROR state, reset the event, close the pipe and remain +// in the error state forever. Error state means something +// that we didn't account for has happened, and it's dangerous +// to do anything unknowingly. +void CrashGenerationServer::HandleErrorState() { + assert(server_state_ == IPC_SERVER_STATE_ERROR); + + // If the server is shutting down anyway, don't clean up + // here since shut down process will clean up. + if (shutting_down_) { + return; + } + + if (pipe_wait_handle_) { + UnregisterWait(pipe_wait_handle_); + pipe_wait_handle_ = NULL; + } + + if (pipe_) { + CloseHandle(pipe_); + pipe_ = NULL; + } + + if (overlapped_.hEvent) { + CloseHandle(overlapped_.hEvent); + overlapped_.hEvent = NULL; + } +} + +// When the server thread serving clients is in the INITIAL state, +// try to connect to the pipe asynchronously. If the connection +// finishes synchronously, directly go into the CONNECTED state; +// otherwise go into the CONNECTING state. For any problems, go +// into the ERROR state. +void CrashGenerationServer::HandleInitialState() { + assert(server_state_ == IPC_SERVER_STATE_INITIAL); + + if (!ResetEvent(overlapped_.hEvent)) { + server_state_ = IPC_SERVER_STATE_ERROR; + return; + } + + bool success = ConnectNamedPipe(pipe_, &overlapped_) != FALSE; + + // From MSDN, it is not clear that when ConnectNamedPipe is used + // in an overlapped mode, will it ever return non-zero value, and + // if so, in what cases. + assert(!success); + + DWORD error_code = GetLastError(); + switch (error_code) { + case ERROR_IO_PENDING: + server_state_ = IPC_SERVER_STATE_CONNECTING; + break; + + case ERROR_PIPE_CONNECTED: + if (SetEvent(overlapped_.hEvent)) { + server_state_ = IPC_SERVER_STATE_CONNECTED; + } else { + server_state_ = IPC_SERVER_STATE_ERROR; + } + break; + + default: + server_state_ = IPC_SERVER_STATE_ERROR; + break; + } +} + +// When the server thread serving the clients is in the CONNECTING state, +// try to get the result of the asynchronous connection request using +// the OVERLAPPED object. If the result indicates the connection is done, +// go into the CONNECTED state. If the result indicates I/O is still +// INCOMPLETE, remain in the CONNECTING state. For any problems, +// go into the DISCONNECTING state. +void CrashGenerationServer::HandleConnectingState() { + assert(server_state_ == IPC_SERVER_STATE_CONNECTING); + + DWORD bytes_count = 0; + bool success = GetOverlappedResult(pipe_, + &overlapped_, + &bytes_count, + FALSE) != FALSE; + + if (success) { + server_state_ = IPC_SERVER_STATE_CONNECTED; + return; + } + + if (GetLastError() != ERROR_IO_INCOMPLETE) { + server_state_ = IPC_SERVER_STATE_DISCONNECTING; + } +} + +// When the server thread serving the clients is in the CONNECTED state, +// try to issue an asynchronous read from the pipe. If read completes +// synchronously or if I/O is pending then go into the READING state. +// For any problems, go into the DISCONNECTING state. +void CrashGenerationServer::HandleConnectedState() { + assert(server_state_ == IPC_SERVER_STATE_CONNECTED); + + DWORD bytes_count = 0; + memset(&msg_, 0, sizeof(msg_)); + bool success = ReadFile(pipe_, + &msg_, + sizeof(msg_), + &bytes_count, + &overlapped_) != FALSE; + + // Note that the asynchronous read issued above can finish before the + // code below executes. But, it is okay to change state after issuing + // the asynchronous read. This is because even if the asynchronous read + // is done, the callback for it would not be executed until the current + // thread finishes its execution. + if (success || GetLastError() == ERROR_IO_PENDING) { + server_state_ = IPC_SERVER_STATE_READING; + } else { + server_state_ = IPC_SERVER_STATE_DISCONNECTING; + } +} + +// When the server thread serving the clients is in the READING state, +// try to get the result of the async read. If async read is done, +// go into the READ_DONE state. For any problems, go into the +// DISCONNECTING state. +void CrashGenerationServer::HandleReadingState() { + assert(server_state_ == IPC_SERVER_STATE_READING); + + DWORD bytes_count = 0; + bool success = GetOverlappedResult(pipe_, + &overlapped_, + &bytes_count, + FALSE) != FALSE; + + if (success && bytes_count == sizeof(ProtocolMessage)) { + server_state_ = IPC_SERVER_STATE_READ_DONE; + return; + } + + DWORD error_code; + error_code = GetLastError(); + + // We should never get an I/O incomplete since we should not execute this + // unless the Read has finished and the overlapped event is signaled. If + // we do get INCOMPLETE, we have a bug in our code. + assert(error_code != ERROR_IO_INCOMPLETE); + + server_state_ = IPC_SERVER_STATE_DISCONNECTING; +} + +// When the server thread serving the client is in the READ_DONE state, +// validate the client's request message, register the client by +// creating appropriate objects and prepare the response. Then try to +// write the response to the pipe asynchronously. If that succeeds, +// go into the WRITING state. For any problems, go into the DISCONNECTING +// state. +void CrashGenerationServer::HandleReadDoneState() { + assert(server_state_ == IPC_SERVER_STATE_READ_DONE); + + if (!IsClientRequestValid(msg_)) { + server_state_ = IPC_SERVER_STATE_DISCONNECTING; + return; + } + + scoped_ptr client_info( + new ClientInfo(this, + msg_.pid, + msg_.dump_type, + msg_.thread_id, + msg_.exception_pointers, + msg_.assert_info, + msg_.custom_client_info)); + + if (!client_info->Initialize()) { + server_state_ = IPC_SERVER_STATE_DISCONNECTING; + return; + } + + if (!RespondToClient(client_info.get())) { + server_state_ = IPC_SERVER_STATE_DISCONNECTING; + return; + } + + // Note that the asynchronous write issued by RespondToClient function + // can finish before the code below executes. But it is okay to change + // state after issuing the asynchronous write. This is because even if + // the asynchronous write is done, the callback for it would not be + // executed until the current thread finishes its execution. + server_state_ = IPC_SERVER_STATE_WRITING; + client_info_ = client_info.release(); +} + +// When the server thread serving the clients is in the WRITING state, +// try to get the result of the async write. If the async write is done, +// go into the WRITE_DONE state. For any problems, go into the +// DISONNECTING state. +void CrashGenerationServer::HandleWritingState() { + assert(server_state_ == IPC_SERVER_STATE_WRITING); + + DWORD bytes_count = 0; + bool success = GetOverlappedResult(pipe_, + &overlapped_, + &bytes_count, + FALSE) != FALSE; + + if (success) { + server_state_ = IPC_SERVER_STATE_WRITE_DONE; + return; + } + + DWORD error_code; + error_code = GetLastError(); + + // We should never get an I/O incomplete since we should not execute this + // unless the Write has finished and the overlapped event is signaled. If + // we do get INCOMPLETE, we have a bug in our code. + assert(error_code != ERROR_IO_INCOMPLETE); + + server_state_ = IPC_SERVER_STATE_DISCONNECTING; +} + +// When the server thread serving the clients is in the WRITE_DONE state, +// try to issue an async read on the pipe. If the read completes synchronously +// or if I/O is still pending then go into the READING_ACK state. For any +// issues, go into the DISCONNECTING state. +void CrashGenerationServer::HandleWriteDoneState() { + assert(server_state_ == IPC_SERVER_STATE_WRITE_DONE); + + server_state_ = IPC_SERVER_STATE_READING_ACK; + + DWORD bytes_count = 0; + bool success = ReadFile(pipe_, + &msg_, + sizeof(msg_), + &bytes_count, + &overlapped_) != FALSE; + + if (success) { + return; + } + + DWORD error_code = GetLastError(); + + if (error_code != ERROR_IO_PENDING) { + server_state_ = IPC_SERVER_STATE_DISCONNECTING; + } +} + +// When the server thread serving the clients is in the READING_ACK state, +// try to get result of async read. Go into the DISCONNECTING state. +void CrashGenerationServer::HandleReadingAckState() { + assert(server_state_ == IPC_SERVER_STATE_READING_ACK); + + DWORD bytes_count = 0; + bool success = GetOverlappedResult(pipe_, + &overlapped_, + &bytes_count, + FALSE) != FALSE; + + if (success) { + // The connection handshake with the client is now complete; perform + // the callback. + if (connect_callback_) { + connect_callback_(connect_context_, client_info_); + } + } else { + DWORD error_code = GetLastError(); + + // We should never get an I/O incomplete since we should not execute this + // unless the Read has finished and the overlapped event is signaled. If + // we do get INCOMPLETE, we have a bug in our code. + assert(error_code != ERROR_IO_INCOMPLETE); + } + + server_state_ = IPC_SERVER_STATE_DISCONNECTING; +} + +// When the server thread serving the client is in the DISCONNECTING state, +// disconnect from the pipe and reset the event. If anything fails, go into +// the ERROR state. If it goes well, go into the INITIAL state and set the +// event to start all over again. +void CrashGenerationServer::HandleDisconnectingState() { + assert(server_state_ == IPC_SERVER_STATE_DISCONNECTING); + + // Done serving the client. + client_info_ = NULL; + + overlapped_.Internal = NULL; + overlapped_.InternalHigh = NULL; + overlapped_.Offset = 0; + overlapped_.OffsetHigh = 0; + overlapped_.Pointer = NULL; + + if (!ResetEvent(overlapped_.hEvent)) { + server_state_ = IPC_SERVER_STATE_ERROR; + return; + } + + if (!DisconnectNamedPipe(pipe_)) { + server_state_ = IPC_SERVER_STATE_ERROR; + return; + } + + // If the server is shutting down do not connect to the + // next client. + if (shutting_down_) { + return; + } + + server_state_ = IPC_SERVER_STATE_INITIAL; + if (!SetEvent(overlapped_.hEvent)) { + server_state_ = IPC_SERVER_STATE_ERROR; + } +} + +bool CrashGenerationServer::PrepareReply(const ClientInfo& client_info, + ProtocolMessage* reply) const { + reply->tag = MESSAGE_TAG_REGISTRATION_RESPONSE; + reply->pid = GetCurrentProcessId(); + + if (CreateClientHandles(client_info, reply)) { + return true; + } + + if (reply->dump_request_handle) { + CloseHandle(reply->dump_request_handle); + } + + if (reply->dump_generated_handle) { + CloseHandle(reply->dump_generated_handle); + } + + if (reply->server_alive_handle) { + CloseHandle(reply->server_alive_handle); + } + + return false; +} + +bool CrashGenerationServer::CreateClientHandles(const ClientInfo& client_info, + ProtocolMessage* reply) const { + HANDLE current_process = GetCurrentProcess(); + if (!DuplicateHandle(current_process, + client_info.dump_requested_handle(), + client_info.process_handle(), + &reply->dump_request_handle, + kDumpRequestEventAccess, + FALSE, + 0)) { + return false; + } + + if (!DuplicateHandle(current_process, + client_info.dump_generated_handle(), + client_info.process_handle(), + &reply->dump_generated_handle, + kDumpGeneratedEventAccess, + FALSE, + 0)) { + return false; + } + + if (!DuplicateHandle(current_process, + server_alive_handle_, + client_info.process_handle(), + &reply->server_alive_handle, + kMutexAccess, + FALSE, + 0)) { + return false; + } + + return true; +} + +bool CrashGenerationServer::RespondToClient(ClientInfo* client_info) { + ProtocolMessage reply; + if (!PrepareReply(*client_info, &reply)) { + return false; + } + + if (!AddClient(client_info)) { + return false; + } + + DWORD bytes_count = 0; + bool success = WriteFile(pipe_, + &reply, + sizeof(reply), + &bytes_count, + &overlapped_) != FALSE; + + return success || GetLastError() == ERROR_IO_PENDING; +} + +// The server thread servicing the clients runs this method. The method +// implements the state machine described in ReadMe.txt along with the +// helper methods HandleXXXState. +void CrashGenerationServer::HandleConnectionRequest() { + // If we are shutting doen then get into ERROR state, reset the event so more + // workers don't run and return immediately. + if (shutting_down_) { + server_state_ = IPC_SERVER_STATE_ERROR; + ResetEvent(overlapped_.hEvent); + return; + } + + switch (server_state_) { + case IPC_SERVER_STATE_ERROR: + HandleErrorState(); + break; + + case IPC_SERVER_STATE_INITIAL: + HandleInitialState(); + break; + + case IPC_SERVER_STATE_CONNECTING: + HandleConnectingState(); + break; + + case IPC_SERVER_STATE_CONNECTED: + HandleConnectedState(); + break; + + case IPC_SERVER_STATE_READING: + HandleReadingState(); + break; + + case IPC_SERVER_STATE_READ_DONE: + HandleReadDoneState(); + break; + + case IPC_SERVER_STATE_WRITING: + HandleWritingState(); + break; + + case IPC_SERVER_STATE_WRITE_DONE: + HandleWriteDoneState(); + break; + + case IPC_SERVER_STATE_READING_ACK: + HandleReadingAckState(); + break; + + case IPC_SERVER_STATE_DISCONNECTING: + HandleDisconnectingState(); + break; + + default: + assert(false); + // This indicates that we added one more state without + // adding handling code. + server_state_ = IPC_SERVER_STATE_ERROR; + break; + } +} + +bool CrashGenerationServer::AddClient(ClientInfo* client_info) { + HANDLE request_wait_handle = NULL; + if (!RegisterWaitForSingleObject(&request_wait_handle, + client_info->dump_requested_handle(), + OnDumpRequest, + client_info, + INFINITE, + kDumpRequestThreadFlags)) { + return false; + } + + client_info->set_dump_request_wait_handle(request_wait_handle); + + // OnClientEnd will be called when the client process terminates. + HANDLE process_wait_handle = NULL; + if (!RegisterWaitForSingleObject(&process_wait_handle, + client_info->process_handle(), + OnClientEnd, + client_info, + INFINITE, + WT_EXECUTEONLYONCE)) { + return false; + } + + client_info->set_process_exit_wait_handle(process_wait_handle); + + // New scope to hold the lock for the shortest time. + { + AutoCriticalSection lock(&clients_sync_); + clients_.push_back(client_info); + } + + return true; +} + +// static +void CALLBACK CrashGenerationServer::OnPipeConnected(void* context, BOOLEAN) { + assert (context); + + CrashGenerationServer* obj = + reinterpret_cast(context); + obj->HandleConnectionRequest(); +} + +// static +void CALLBACK CrashGenerationServer::OnDumpRequest(void* context, BOOLEAN) { + assert(context); + ClientInfo* client_info = reinterpret_cast(context); + client_info->PopulateCustomInfo(); + + CrashGenerationServer* crash_server = client_info->crash_server(); + assert(crash_server); + crash_server->HandleDumpRequest(*client_info); + + ResetEvent(client_info->dump_requested_handle()); +} + +// static +void CALLBACK CrashGenerationServer::OnClientEnd(void* context, BOOLEAN) { + assert(context); + ClientInfo* client_info = reinterpret_cast(context); + + CrashGenerationServer* crash_server = client_info->crash_server(); + assert(crash_server); + + InterlockedIncrement(&crash_server->cleanup_item_count_); + + if (!QueueUserWorkItem(CleanupClient, context, WT_EXECUTEDEFAULT)) { + InterlockedDecrement(&crash_server->cleanup_item_count_); + } +} + +// static +DWORD WINAPI CrashGenerationServer::CleanupClient(void* context) { + assert(context); + ClientInfo* client_info = reinterpret_cast(context); + + CrashGenerationServer* crash_server = client_info->crash_server(); + assert(crash_server); + + if (crash_server->exit_callback_) { + crash_server->exit_callback_(crash_server->exit_context_, client_info); + } + + crash_server->DoCleanup(client_info); + + InterlockedDecrement(&crash_server->cleanup_item_count_); + return 0; +} + +void CrashGenerationServer::DoCleanup(ClientInfo* client_info) { + assert(client_info); + + // Start a new scope to release lock automatically. + { + AutoCriticalSection lock(&clients_sync_); + clients_.remove(client_info); + } + + delete client_info; +} + +void CrashGenerationServer::HandleDumpRequest(const ClientInfo& client_info) { + // Generate the dump only if it's explicitly requested by the + // server application; otherwise the server might want to generate + // dump in the callback. + std::wstring dump_path; + if (generate_dumps_) { + if (!GenerateDump(client_info, &dump_path)) { + return; + } + } + + if (dump_callback_) { + std::wstring* ptr_dump_path = (dump_path == L"") ? NULL : &dump_path; + dump_callback_(dump_context_, &client_info, ptr_dump_path); + } + + SetEvent(client_info.dump_generated_handle()); +} + +bool CrashGenerationServer::GenerateDump(const ClientInfo& client, + std::wstring* dump_path) { + assert(client.pid() != 0); + assert(client.process_handle()); + + // We have to get the address of EXCEPTION_INFORMATION from + // the client process address space. + EXCEPTION_POINTERS* client_ex_info = NULL; + if (!client.GetClientExceptionInfo(&client_ex_info)) { + return false; + } + + DWORD client_thread_id = 0; + if (!client.GetClientThreadId(&client_thread_id)) { + return false; + } + + return dump_generator_->WriteMinidump(client.process_handle(), + client.pid(), + client_thread_id, + GetCurrentThreadId(), + client_ex_info, + client.assert_info(), + client.dump_type(), + true, + dump_path); +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_server.h b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_server.h new file mode 100644 index 00000000..cacb639a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/crash_generation_server.h @@ -0,0 +1,269 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ +#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ + +#include +#include +#include "client/windows/common/ipc_protocol.h" +#include "client/windows/crash_generation/client_info.h" +#include "client/windows/crash_generation/minidump_generator.h" +#include "processor/scoped_ptr.h" + +namespace google_breakpad { + +// Abstraction for server side implementation of out-of-process crash +// generation protocol for Windows platform only. It generates Windows +// minidump files for client processes that request dump generation. When +// the server is requested to start listening for clients (by calling the +// Start method), it creates a named pipe and waits for the clients to +// register. In response, it hands them event handles that the client can +// signal to request dump generation. When the clients request dump +// generation in this way, the server generates Windows minidump files. +class CrashGenerationServer { + public: + typedef void (*OnClientConnectedCallback)(void* context, + const ClientInfo* client_info); + + typedef void (*OnClientDumpRequestCallback)(void* context, + const ClientInfo* client_info, + const std::wstring* file_path); + + typedef void (*OnClientExitedCallback)(void* context, + const ClientInfo* client_info); + + // Creates an instance with the given parameters. + // + // Parameter pipe_name: Name of the Windows named pipe + // Parameter pipe_sec_attrs Security attributes to set on the pipe. Pass + // NULL to use default security on the pipe. By default, the pipe created + // allows Local System, Administrators and the Creator full control and + // the Everyone group read access on the pipe. + // Parameter connect_callback: Callback for a new client connection. + // Parameter connect_context: Context for client connection callback. + // Parameter crash_callback: Callback for a client crash dump request. + // Parameter crash_context: Context for client crash dump request callback. + // Parameter exit_callback: Callback for client process exit. + // Parameter exit_context: Context for client exit callback. + // Parameter generate_dumps: Whether to automatically generate dumps. + // Client code of this class might want to generate dumps explicitly in the + // crash dump request callback. In that case, false can be passed for this + // parameter. + // Parameter dump_path: Path for generating dumps; required only if true is + // passed for generateDumps parameter; NULL can be passed otherwise. + CrashGenerationServer(const std::wstring& pipe_name, + SECURITY_ATTRIBUTES* pipe_sec_attrs, + OnClientConnectedCallback connect_callback, + void* connect_context, + OnClientDumpRequestCallback dump_callback, + void* dump_context, + OnClientExitedCallback exit_callback, + void* exit_context, + bool generate_dumps, + const std::wstring* dump_path); + + ~CrashGenerationServer(); + + // Performs initialization steps needed to start listening to clients. + // + // Returns true if initialization is successful; false otherwise. + bool Start(); + + private: + // Various states the client can be in during the handshake with + // the server. + enum IPCServerState { + // Server is in error state and it cannot serve any clients. + IPC_SERVER_STATE_ERROR, + + // Server starts in this state. + IPC_SERVER_STATE_INITIAL, + + // Server has issued an async connect to the pipe and it is waiting + // for the connection to be established. + IPC_SERVER_STATE_CONNECTING, + + // Server is connected successfully. + IPC_SERVER_STATE_CONNECTED, + + // Server has issued an async read from the pipe and it is waiting for + // the read to finish. + IPC_SERVER_STATE_READING, + + // Server is done reading from the pipe. + IPC_SERVER_STATE_READ_DONE, + + // Server has issued an async write to the pipe and it is waiting for + // the write to finish. + IPC_SERVER_STATE_WRITING, + + // Server is done writing to the pipe. + IPC_SERVER_STATE_WRITE_DONE, + + // Server has issued an async read from the pipe for an ack and it + // is waiting for the read to finish. + IPC_SERVER_STATE_READING_ACK, + + // Server is done writing to the pipe and it is now ready to disconnect + // and reconnect. + IPC_SERVER_STATE_DISCONNECTING + }; + + // + // Helper methods to handle various server IPC states. + // + void HandleErrorState(); + void HandleInitialState(); + void HandleConnectingState(); + void HandleConnectedState(); + void HandleReadingState(); + void HandleReadDoneState(); + void HandleWritingState(); + void HandleWriteDoneState(); + void HandleReadingAckState(); + void HandleDisconnectingState(); + + // Prepares reply for a client from the given parameters. + bool PrepareReply(const ClientInfo& client_info, + ProtocolMessage* reply) const; + + // Duplicates various handles in the ClientInfo object for the client + // process and stores them in the given ProtocolMessage instance. If + // creating any handle fails, ProtocolMessage will contain the handles + // already created successfully, which should be closed by the caller. + bool CreateClientHandles(const ClientInfo& client_info, + ProtocolMessage* reply) const; + + // Response to the given client. Return true if all steps of + // responding to the client succeed, false otherwise. + bool RespondToClient(ClientInfo* client_info); + + // Handles a connection request from the client. + void HandleConnectionRequest(); + + // Handles a dump request from the client. + void HandleDumpRequest(const ClientInfo& client_info); + + // Callback for pipe connected event. + static void CALLBACK OnPipeConnected(void* context, BOOLEAN timer_or_wait); + + // Callback for a dump request. + static void CALLBACK OnDumpRequest(void* context, BOOLEAN timer_or_wait); + + // Callback for client process exit event. + static void CALLBACK OnClientEnd(void* context, BOOLEAN timer_or_wait); + + // Releases resources for a client. + static DWORD WINAPI CleanupClient(void* context); + + // Cleans up for the given client. + void DoCleanup(ClientInfo* client_info); + + // Adds the given client to the list of registered clients. + bool AddClient(ClientInfo* client_info); + + // Generates dump for the given client. + bool GenerateDump(const ClientInfo& client, std::wstring* dump_path); + + // Sync object for thread-safe access to the shared list of clients. + CRITICAL_SECTION clients_sync_; + + // List of clients. + std::list clients_; + + // Pipe name. + std::wstring pipe_name_; + + // Pipe security attributes + SECURITY_ATTRIBUTES* pipe_sec_attrs_; + + // Handle to the pipe used for handshake with clients. + HANDLE pipe_; + + // Pipe wait handle. + HANDLE pipe_wait_handle_; + + // Handle to server-alive mutex. + HANDLE server_alive_handle_; + + // Callback for a successful client connection. + OnClientConnectedCallback connect_callback_; + + // Context for client connected callback. + void* connect_context_; + + // Callback for a client dump request. + OnClientDumpRequestCallback dump_callback_; + + // Context for client dump request callback. + void* dump_context_; + + // Callback for client process exit. + OnClientExitedCallback exit_callback_; + + // Context for client process exit callback. + void* exit_context_; + + // Whether to generate dumps. + bool generate_dumps_; + + // Instance of a mini dump generator. + scoped_ptr dump_generator_; + + // State of the server in performing the IPC with the client. + // Note that since we restrict the pipe to one instance, we + // only need to keep one state of the server. Otherwise, server + // would have one state per client it is talking to. + volatile IPCServerState server_state_; + + // Whether the server is shutting down. + volatile bool shutting_down_; + + // Overlapped instance for async I/O on the pipe. + OVERLAPPED overlapped_; + + // Message object used in IPC with the client. + ProtocolMessage msg_; + + // Client Info for the client that's connecting to the server. + ClientInfo* client_info_; + + // Count of clean-up work items that are currently running or are + // already queued to run. + volatile LONG cleanup_item_count_; + + // Disable copy ctor and operator=. + CrashGenerationServer(const CrashGenerationServer& crash_server); + CrashGenerationServer& operator=(const CrashGenerationServer& crash_server); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/minidump_generator.cc b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/minidump_generator.cc new file mode 100644 index 00000000..c03b191a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/minidump_generator.cc @@ -0,0 +1,289 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "client/windows/crash_generation/minidump_generator.h" +#include +#include "client/windows/common/auto_critical_section.h" +#include "common/windows/guid_string.h" + +using std::wstring; + +namespace google_breakpad { + +MinidumpGenerator::MinidumpGenerator(const wstring& dump_path) + : dbghelp_module_(NULL), + rpcrt4_module_(NULL), + dump_path_(dump_path), + write_dump_(NULL), + create_uuid_(NULL) { + InitializeCriticalSection(&module_load_sync_); + InitializeCriticalSection(&get_proc_address_sync_); +} + +MinidumpGenerator::~MinidumpGenerator() { + if (dbghelp_module_) { + FreeLibrary(dbghelp_module_); + } + + if (rpcrt4_module_) { + FreeLibrary(rpcrt4_module_); + } + + DeleteCriticalSection(&get_proc_address_sync_); + DeleteCriticalSection(&module_load_sync_); +} + +bool MinidumpGenerator::WriteMinidump(HANDLE process_handle, + DWORD process_id, + DWORD thread_id, + DWORD requesting_thread_id, + EXCEPTION_POINTERS* exception_pointers, + MDRawAssertionInfo* assert_info, + MINIDUMP_TYPE dump_type, + bool is_client_pointers, + wstring* dump_path) { + MiniDumpWriteDumpType write_dump = GetWriteDump(); + if (!write_dump) { + return false; + } + + wstring dump_file_path; + if (!GenerateDumpFilePath(&dump_file_path)) { + return false; + } + + // If the client requests a full memory dump, we will write a normal mini + // dump and a full memory dump. Both dump files use the same uuid as file + // name prefix. + bool full_memory_dump = (dump_type & MiniDumpWithFullMemory) != 0; + wstring full_dump_file_path; + if (full_memory_dump) { + full_dump_file_path.assign(dump_file_path); + full_dump_file_path.resize(full_dump_file_path.size() - 4); // strip .dmp + full_dump_file_path.append(TEXT("-full.dmp")); + } + + HANDLE dump_file = CreateFile(dump_file_path.c_str(), + GENERIC_WRITE, + 0, + NULL, + CREATE_NEW, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (dump_file == INVALID_HANDLE_VALUE) { + return false; + } + + HANDLE full_dump_file = INVALID_HANDLE_VALUE; + if (full_memory_dump) { + full_dump_file = CreateFile(full_dump_file_path.c_str(), + GENERIC_WRITE, + 0, + NULL, + CREATE_NEW, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (full_dump_file == INVALID_HANDLE_VALUE) { + CloseHandle(dump_file); + return false; + } + } + + MINIDUMP_EXCEPTION_INFORMATION* dump_exception_pointers = NULL; + MINIDUMP_EXCEPTION_INFORMATION dump_exception_info; + + // Setup the exception information object only if it's a dump + // due to an exception. + if (exception_pointers) { + dump_exception_pointers = &dump_exception_info; + dump_exception_info.ThreadId = thread_id; + dump_exception_info.ExceptionPointers = exception_pointers; + dump_exception_info.ClientPointers = is_client_pointers; + } + + // Add an MDRawBreakpadInfo stream to the minidump, to provide additional + // information about the exception handler to the Breakpad processor. + // The information will help the processor determine which threads are + // relevant. The Breakpad processor does not require this information but + // can function better with Breakpad-generated dumps when it is present. + // The native debugger is not harmed by the presence of this information. + MDRawBreakpadInfo breakpad_info = {0}; + if (!is_client_pointers) { + // Set the dump thread id and requesting thread id only in case of + // in-process dump generation. + breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; + breakpad_info.dump_thread_id = thread_id; + breakpad_info.requesting_thread_id = requesting_thread_id; + } + + // Leave room in user_stream_array for a possible assertion info stream. + MINIDUMP_USER_STREAM user_stream_array[2]; + user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM; + user_stream_array[0].BufferSize = sizeof(breakpad_info); + user_stream_array[0].Buffer = &breakpad_info; + + MINIDUMP_USER_STREAM_INFORMATION user_streams; + user_streams.UserStreamCount = 1; + user_streams.UserStreamArray = user_stream_array; + + MDRawAssertionInfo* actual_assert_info = assert_info; + MDRawAssertionInfo client_assert_info = {0}; + + if (assert_info) { + // If the assertion info object lives in the client process, + // read the memory of the client process. + if (is_client_pointers) { + SIZE_T bytes_read = 0; + if (!ReadProcessMemory(process_handle, + assert_info, + &client_assert_info, + sizeof(client_assert_info), + &bytes_read)) { + CloseHandle(dump_file); + if (full_dump_file != INVALID_HANDLE_VALUE) + CloseHandle(full_dump_file); + return false; + } + + if (bytes_read != sizeof(client_assert_info)) { + CloseHandle(dump_file); + if (full_dump_file != INVALID_HANDLE_VALUE) + CloseHandle(full_dump_file); + return false; + } + + actual_assert_info = &client_assert_info; + } + + user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM; + user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo); + user_stream_array[1].Buffer = actual_assert_info; + ++user_streams.UserStreamCount; + } + + bool result_minidump = write_dump( + process_handle, + process_id, + dump_file, + static_cast((dump_type & (~MiniDumpWithFullMemory)) + | MiniDumpNormal), + exception_pointers ? &dump_exception_info : NULL, + &user_streams, + NULL) != FALSE; + + bool result_full_memory = true; + if (full_memory_dump) { + result_full_memory = write_dump( + process_handle, + process_id, + full_dump_file, + static_cast(dump_type & (~MiniDumpNormal)), + exception_pointers ? &dump_exception_info : NULL, + &user_streams, + NULL) != FALSE; + } + + bool result = result_minidump && result_full_memory; + + CloseHandle(dump_file); + if (full_dump_file != INVALID_HANDLE_VALUE) + CloseHandle(full_dump_file); + + // Store the path of the dump file in the out parameter if dump generation + // succeeded. + if (result && dump_path) { + *dump_path = dump_file_path; + } + + return result; +} + +HMODULE MinidumpGenerator::GetDbghelpModule() { + AutoCriticalSection lock(&module_load_sync_); + if (!dbghelp_module_) { + dbghelp_module_ = LoadLibrary(TEXT("dbghelp.dll")); + } + + return dbghelp_module_; +} + +MinidumpGenerator::MiniDumpWriteDumpType MinidumpGenerator::GetWriteDump() { + AutoCriticalSection lock(&get_proc_address_sync_); + if (!write_dump_) { + HMODULE module = GetDbghelpModule(); + if (module) { + FARPROC proc = GetProcAddress(module, "MiniDumpWriteDump"); + write_dump_ = reinterpret_cast(proc); + } + } + + return write_dump_; +} + +HMODULE MinidumpGenerator::GetRpcrt4Module() { + AutoCriticalSection lock(&module_load_sync_); + if (!rpcrt4_module_) { + rpcrt4_module_ = LoadLibrary(TEXT("rpcrt4.dll")); + } + + return rpcrt4_module_; +} + +MinidumpGenerator::UuidCreateType MinidumpGenerator::GetCreateUuid() { + AutoCriticalSection lock(&module_load_sync_); + if (!create_uuid_) { + HMODULE module = GetRpcrt4Module(); + if (module) { + FARPROC proc = GetProcAddress(module, "UuidCreate"); + create_uuid_ = reinterpret_cast(proc); + } + } + + return create_uuid_; +} + +bool MinidumpGenerator::GenerateDumpFilePath(wstring* file_path) { + UUID id = {0}; + + UuidCreateType create_uuid = GetCreateUuid(); + if(!create_uuid) { + return false; + } + + create_uuid(&id); + wstring id_str = GUIDString::GUIDToWString(&id); + + *file_path = dump_path_ + TEXT("\\") + id_str + TEXT(".dmp"); + return true; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/minidump_generator.h b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/minidump_generator.h new file mode 100644 index 00000000..8ab6a8f6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/crash_generation/minidump_generator.h @@ -0,0 +1,121 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ +#define CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ + +#include +#include +#include +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Abstraction for various objects and operations needed to generate +// minidump on Windows. This abstraction is useful to hide all the gory +// details for minidump generation and provide a clean interface to +// the clients to generate minidumps. +class MinidumpGenerator { + public: + // Creates an instance with the given dump path. + explicit MinidumpGenerator(const std::wstring& dump_path); + + ~MinidumpGenerator(); + + // Writes the minidump with the given parameters. Stores the + // dump file path in the dump_path parameter if dump generation + // succeeds. + bool WriteMinidump(HANDLE process_handle, + DWORD process_id, + DWORD thread_id, + DWORD requesting_thread_id, + EXCEPTION_POINTERS* exception_pointers, + MDRawAssertionInfo* assert_info, + MINIDUMP_TYPE dump_type, + bool is_client_pointers, + std::wstring* dump_path); + + private: + // Function pointer type for MiniDumpWriteDump, which is looked up + // dynamically. + typedef BOOL (WINAPI* MiniDumpWriteDumpType)( + HANDLE hProcess, + DWORD ProcessId, + HANDLE hFile, + MINIDUMP_TYPE DumpType, + CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); + + // Function pointer type for UuidCreate, which is looked up dynamically. + typedef RPC_STATUS (RPC_ENTRY* UuidCreateType)(UUID* Uuid); + + // Loads the appropriate DLL lazily in a thread safe way. + HMODULE GetDbghelpModule(); + + // Loads the appropriate DLL and gets a pointer to the MiniDumpWriteDump + // function lazily and in a thread-safe manner. + MiniDumpWriteDumpType GetWriteDump(); + + // Loads the appropriate DLL lazily in a thread safe way. + HMODULE GetRpcrt4Module(); + + // Loads the appropriate DLL and gets a pointer to the UuidCreate + // function lazily and in a thread-safe manner. + UuidCreateType GetCreateUuid(); + + // Returns the path for the file to write dump to. + bool GenerateDumpFilePath(std::wstring* file_path); + + // Handle to dynamically loaded DbgHelp.dll. + HMODULE dbghelp_module_; + + // Pointer to the MiniDumpWriteDump function. + MiniDumpWriteDumpType write_dump_; + + // Handle to dynamically loaded rpcrt4.dll. + HMODULE rpcrt4_module_; + + // Pointer to the UuidCreate function. + UuidCreateType create_uuid_; + + // Folder path to store dump files. + std::wstring dump_path_; + + // Critical section to sychronize action of loading modules dynamically. + CRITICAL_SECTION module_load_sync_; + + // Critical section to synchronize action of dynamically getting function + // addresses from modules. + CRITICAL_SECTION get_proc_address_sync_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/handler/exception_handler.cc b/thirdparty/google-breakpad/r318/src/client/windows/handler/exception_handler.cc new file mode 100644 index 00000000..f3bb5a61 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/handler/exception_handler.cc @@ -0,0 +1,746 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +#include +#include + +#include "common/windows/string_utils-inl.h" + +#include "client/windows/common/ipc_protocol.h" +#include "client/windows/handler/exception_handler.h" +#include "common/windows/guid_string.h" + +namespace google_breakpad { + +static const int kWaitForHandlerThreadMs = 60000; +static const int kExceptionHandlerThreadInitialStackSize = 64 * 1024; + +vector* ExceptionHandler::handler_stack_ = NULL; +LONG ExceptionHandler::handler_stack_index_ = 0; +CRITICAL_SECTION ExceptionHandler::handler_stack_critical_section_; +volatile LONG ExceptionHandler::instance_count_ = 0; + +ExceptionHandler::ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + const CustomClientInfo* custom_info) { + Initialize(dump_path, + filter, + callback, + callback_context, + handler_types, + dump_type, + pipe_name, + custom_info); +} + +ExceptionHandler::ExceptionHandler(const wstring &dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types) { + Initialize(dump_path, + filter, + callback, + callback_context, + handler_types, + MiniDumpNormal, + NULL, + NULL); +} + +void ExceptionHandler::Initialize(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + const CustomClientInfo* custom_info) { + LONG instance_count = InterlockedIncrement(&instance_count_); + filter_ = filter; + callback_ = callback; + callback_context_ = callback_context; + dump_path_c_ = NULL; + next_minidump_id_c_ = NULL; + next_minidump_path_c_ = NULL; + dbghelp_module_ = NULL; + minidump_write_dump_ = NULL; + dump_type_ = dump_type; + rpcrt4_module_ = NULL; + uuid_create_ = NULL; + handler_types_ = handler_types; + previous_filter_ = NULL; +#if _MSC_VER >= 1400 // MSVC 2005/8 + previous_iph_ = NULL; +#endif // _MSC_VER >= 1400 + previous_pch_ = NULL; + handler_thread_ = NULL; + is_shutdown_ = false; + handler_start_semaphore_ = NULL; + handler_finish_semaphore_ = NULL; + requesting_thread_id_ = 0; + exception_info_ = NULL; + assertion_ = NULL; + handler_return_value_ = false; + handle_debug_exceptions_ = false; + + // Attempt to use out-of-process if user has specified pipe name. + if (pipe_name != NULL) { + scoped_ptr client( + new CrashGenerationClient(pipe_name, + dump_type_, + custom_info)); + + // If successful in registering with the monitoring process, + // there is no need to setup in-process crash generation. + if (client->Register()) { + crash_generation_client_.reset(client.release()); + } + } + + if (!IsOutOfProcess()) { + // Either client did not ask for out-of-process crash generation + // or registration with the server process failed. In either case, + // setup to do in-process crash generation. + + // Set synchronization primitives and the handler thread. Each + // ExceptionHandler object gets its own handler thread because that's the + // only way to reliably guarantee sufficient stack space in an exception, + // and it allows an easy way to get a snapshot of the requesting thread's + // context outside of an exception. + InitializeCriticalSection(&handler_critical_section_); + handler_start_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL); + assert(handler_start_semaphore_ != NULL); + + handler_finish_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL); + assert(handler_finish_semaphore_ != NULL); + + // Don't attempt to create the thread if we could not create the semaphores. + if (handler_finish_semaphore_ != NULL && handler_start_semaphore_ != NULL) { + DWORD thread_id; + handler_thread_ = CreateThread(NULL, // lpThreadAttributes + kExceptionHandlerThreadInitialStackSize, + ExceptionHandlerThreadMain, + this, // lpParameter + 0, // dwCreationFlags + &thread_id); + assert(handler_thread_ != NULL); + } + + dbghelp_module_ = LoadLibrary(L"dbghelp.dll"); + if (dbghelp_module_) { + minidump_write_dump_ = reinterpret_cast( + GetProcAddress(dbghelp_module_, "MiniDumpWriteDump")); + } + + // Load this library dynamically to not affect existing projects. Most + // projects don't link against this directly, it's usually dynamically + // loaded by dependent code. + rpcrt4_module_ = LoadLibrary(L"rpcrt4.dll"); + if (rpcrt4_module_) { + uuid_create_ = reinterpret_cast( + GetProcAddress(rpcrt4_module_, "UuidCreate")); + } + + // set_dump_path calls UpdateNextID. This sets up all of the path and id + // strings, and their equivalent c_str pointers. + set_dump_path(dump_path); + } + + // There is a race condition here. If the first instance has not yet + // initialized the critical section, the second (and later) instances may + // try to use uninitialized critical section object. The feature of multiple + // instances in one module is not used much, so leave it as is for now. + // One way to solve this in the current design (that is, keeping the static + // handler stack) is to use spin locks with volatile bools to synchronize + // the handler stack. This works only if the compiler guarantees to generate + // cache coherent code for volatile. + // TODO(munjal): Fix this in a better way by changing the design if possible. + + // Lazy initialization of the handler_stack_critical_section_ + if (instance_count == 1) { + InitializeCriticalSection(&handler_stack_critical_section_); + } + + if (handler_types != HANDLER_NONE) { + EnterCriticalSection(&handler_stack_critical_section_); + + // The first time an ExceptionHandler that installs a handler is + // created, set up the handler stack. + if (!handler_stack_) { + handler_stack_ = new vector(); + } + handler_stack_->push_back(this); + + if (handler_types & HANDLER_EXCEPTION) + previous_filter_ = SetUnhandledExceptionFilter(HandleException); + +#if _MSC_VER >= 1400 // MSVC 2005/8 + if (handler_types & HANDLER_INVALID_PARAMETER) + previous_iph_ = _set_invalid_parameter_handler(HandleInvalidParameter); +#endif // _MSC_VER >= 1400 + + if (handler_types & HANDLER_PURECALL) + previous_pch_ = _set_purecall_handler(HandlePureVirtualCall); + + LeaveCriticalSection(&handler_stack_critical_section_); + } +} + +ExceptionHandler::~ExceptionHandler() { + if (dbghelp_module_) { + FreeLibrary(dbghelp_module_); + } + + if (rpcrt4_module_) { + FreeLibrary(rpcrt4_module_); + } + + if (handler_types_ != HANDLER_NONE) { + EnterCriticalSection(&handler_stack_critical_section_); + + if (handler_types_ & HANDLER_EXCEPTION) + SetUnhandledExceptionFilter(previous_filter_); + +#if _MSC_VER >= 1400 // MSVC 2005/8 + if (handler_types_ & HANDLER_INVALID_PARAMETER) + _set_invalid_parameter_handler(previous_iph_); +#endif // _MSC_VER >= 1400 + + if (handler_types_ & HANDLER_PURECALL) + _set_purecall_handler(previous_pch_); + + if (handler_stack_->back() == this) { + handler_stack_->pop_back(); + } else { + // TODO(mmentovai): use advapi32!ReportEvent to log the warning to the + // system's application event log. + fprintf(stderr, "warning: removing Breakpad handler out of order\n"); + for (vector::iterator iterator = + handler_stack_->begin(); + iterator != handler_stack_->end(); + ++iterator) { + if (*iterator == this) { + handler_stack_->erase(iterator); + } + } + } + + if (handler_stack_->empty()) { + // When destroying the last ExceptionHandler that installed a handler, + // clean up the handler stack. + delete handler_stack_; + handler_stack_ = NULL; + } + + LeaveCriticalSection(&handler_stack_critical_section_); + } + + // Some of the objects were only initialized if out of process + // registration was not done. + if (!IsOutOfProcess()) { +#ifdef BREAKPAD_NO_TERMINATE_THREAD + // Clean up the handler thread and synchronization primitives. The handler + // thread is either waiting on the semaphore to handle a crash or it is + // handling a crash. Coming out of the wait is fast but wait more in the + // eventuality a crash is handled. This compilation option results in a + // deadlock if the exception handler is destroyed while executing code + // inside DllMain. + is_shutdown_ = true; + ReleaseSemaphore(handler_start_semaphore_, 1, NULL); + WaitForSingleObject(handler_thread_, kWaitForHandlerThreadMs); +#else + TerminateThread(handler_thread_, 1); +#endif // BREAKPAD_NO_TERMINATE_THREAD + + DeleteCriticalSection(&handler_critical_section_); + CloseHandle(handler_start_semaphore_); + CloseHandle(handler_finish_semaphore_); + } + + // There is a race condition in the code below: if this instance is + // deleting the static critical section and a new instance of the class + // is created, then there is a possibility that the critical section be + // initialized while the same critical section is being deleted. Given the + // usage pattern for the code, this race condition is unlikely to hit, but it + // is a race condition nonetheless. + if (InterlockedDecrement(&instance_count_) == 0) { + DeleteCriticalSection(&handler_stack_critical_section_); + } +} + +// static +DWORD ExceptionHandler::ExceptionHandlerThreadMain(void* lpParameter) { + ExceptionHandler* self = reinterpret_cast(lpParameter); + assert(self); + assert(self->handler_start_semaphore_ != NULL); + assert(self->handler_finish_semaphore_ != NULL); + + while (true) { + if (WaitForSingleObject(self->handler_start_semaphore_, INFINITE) == + WAIT_OBJECT_0) { + // Perform the requested action. + if (self->is_shutdown_) { + // The instance of the exception handler is being destroyed. + break; + } else { + self->handler_return_value_ = + self->WriteMinidumpWithException(self->requesting_thread_id_, + self->exception_info_, + self->assertion_); + } + + // Allow the requesting thread to proceed. + ReleaseSemaphore(self->handler_finish_semaphore_, 1, NULL); + } + } + + // This statement is not reached when the thread is unconditionally + // terminated by the ExceptionHandler destructor. + return 0; +} + +// HandleException and HandleInvalidParameter must create an +// AutoExceptionHandler object to maintain static state and to determine which +// ExceptionHandler instance to use. The constructor locates the correct +// instance, and makes it available through get_handler(). The destructor +// restores the state in effect prior to allocating the AutoExceptionHandler. +class AutoExceptionHandler { + public: + AutoExceptionHandler() { + // Increment handler_stack_index_ so that if another Breakpad handler is + // registered using this same HandleException function, and it needs to be + // called while this handler is running (either becaause this handler + // declines to handle the exception, or an exception occurs during + // handling), HandleException will find the appropriate ExceptionHandler + // object in handler_stack_ to deliver the exception to. + // + // Because handler_stack_ is addressed in reverse (as |size - index|), + // preincrementing handler_stack_index_ avoids needing to subtract 1 from + // the argument to |at|. + // + // The index is maintained instead of popping elements off of the handler + // stack and pushing them at the end of this method. This avoids ruining + // the order of elements in the stack in the event that some other thread + // decides to manipulate the handler stack (such as creating a new + // ExceptionHandler object) while an exception is being handled. + EnterCriticalSection(&ExceptionHandler::handler_stack_critical_section_); + handler_ = ExceptionHandler::handler_stack_->at( + ExceptionHandler::handler_stack_->size() - + ++ExceptionHandler::handler_stack_index_); + LeaveCriticalSection(&ExceptionHandler::handler_stack_critical_section_); + + // In case another exception occurs while this handler is doing its thing, + // it should be delivered to the previous filter. + SetUnhandledExceptionFilter(handler_->previous_filter_); +#if _MSC_VER >= 1400 // MSVC 2005/8 + _set_invalid_parameter_handler(handler_->previous_iph_); +#endif // _MSC_VER >= 1400 + _set_purecall_handler(handler_->previous_pch_); + } + + ~AutoExceptionHandler() { + // Put things back the way they were before entering this handler. + SetUnhandledExceptionFilter(ExceptionHandler::HandleException); +#if _MSC_VER >= 1400 // MSVC 2005/8 + _set_invalid_parameter_handler(ExceptionHandler::HandleInvalidParameter); +#endif // _MSC_VER >= 1400 + _set_purecall_handler(ExceptionHandler::HandlePureVirtualCall); + + EnterCriticalSection(&ExceptionHandler::handler_stack_critical_section_); + --ExceptionHandler::handler_stack_index_; + LeaveCriticalSection(&ExceptionHandler::handler_stack_critical_section_); + } + + ExceptionHandler* get_handler() const { return handler_; } + + private: + ExceptionHandler* handler_; +}; + +// static +LONG ExceptionHandler::HandleException(EXCEPTION_POINTERS* exinfo) { + AutoExceptionHandler auto_exception_handler; + ExceptionHandler* current_handler = auto_exception_handler.get_handler(); + + // Ignore EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP exceptions. This + // logic will short-circuit before calling WriteMinidumpOnHandlerThread, + // allowing something else to handle the breakpoint without incurring the + // overhead transitioning to and from the handler thread. This behavior + // can be overridden by calling ExceptionHandler::set_handle_debug_exceptions. + DWORD code = exinfo->ExceptionRecord->ExceptionCode; + LONG action; + bool is_debug_exception = (code == EXCEPTION_BREAKPOINT) || + (code == EXCEPTION_SINGLE_STEP); + + bool success = false; + + if (!is_debug_exception || + current_handler->get_handle_debug_exceptions()) { + // If out-of-proc crash handler client is available, we have to use that + // to generate dump and we cannot fall back on in-proc dump generation + // because we never prepared for an in-proc dump generation + + // In case of out-of-process dump generation, directly call + // WriteMinidumpWithException since there is no separate thread running. + if (current_handler->IsOutOfProcess()) { + success = current_handler->WriteMinidumpWithException( + GetCurrentThreadId(), + exinfo, + NULL); + } else { + success = current_handler->WriteMinidumpOnHandlerThread(exinfo, NULL); + } + } + + // The handler fully handled the exception. Returning + // EXCEPTION_EXECUTE_HANDLER indicates this to the system, and usually + // results in the application being terminated. + // + // Note: If the application was launched from within the Cygwin + // environment, returning EXCEPTION_EXECUTE_HANDLER seems to cause the + // application to be restarted. + if (success) { + action = EXCEPTION_EXECUTE_HANDLER; + } else { + // There was an exception, it was a breakpoint or something else ignored + // above, or it was passed to the handler, which decided not to handle it. + // This could be because the filter callback didn't want it, because + // minidump writing failed for some reason, or because the post-minidump + // callback function indicated failure. Give the previous handler a + // chance to do something with the exception. If there is no previous + // handler, return EXCEPTION_CONTINUE_SEARCH, which will allow a debugger + // or native "crashed" dialog to handle the exception. + if (current_handler->previous_filter_) { + action = current_handler->previous_filter_(exinfo); + } else { + action = EXCEPTION_CONTINUE_SEARCH; + } + } + + return action; +} + +#if _MSC_VER >= 1400 // MSVC 2005/8 +// static +void ExceptionHandler::HandleInvalidParameter(const wchar_t* expression, + const wchar_t* function, + const wchar_t* file, + unsigned int line, + uintptr_t reserved) { + // This is an invalid parameter, not an exception. It's safe to play with + // sprintf here. + AutoExceptionHandler auto_exception_handler; + ExceptionHandler* current_handler = auto_exception_handler.get_handler(); + + MDRawAssertionInfo assertion; + memset(&assertion, 0, sizeof(assertion)); + _snwprintf_s(reinterpret_cast(assertion.expression), + sizeof(assertion.expression) / sizeof(assertion.expression[0]), + _TRUNCATE, L"%s", expression); + _snwprintf_s(reinterpret_cast(assertion.function), + sizeof(assertion.function) / sizeof(assertion.function[0]), + _TRUNCATE, L"%s", function); + _snwprintf_s(reinterpret_cast(assertion.file), + sizeof(assertion.file) / sizeof(assertion.file[0]), + _TRUNCATE, L"%s", file); + assertion.line = line; + assertion.type = MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER; + + bool success = false; + // In case of out-of-process dump generation, directly call + // WriteMinidumpWithException since there is no separate thread running. + if (current_handler->IsOutOfProcess()) { + success = current_handler->WriteMinidumpWithException( + GetCurrentThreadId(), + NULL, + &assertion); + } else { + success = current_handler->WriteMinidumpOnHandlerThread(NULL, &assertion); + } + + if (!success) { + if (current_handler->previous_iph_) { + // The handler didn't fully handle the exception. Give it to the + // previous invalid parameter handler. + current_handler->previous_iph_(expression, + function, + file, + line, + reserved); + } else { + // If there's no previous handler, pass the exception back in to the + // invalid parameter handler's core. That's the routine that called this + // function, but now, since this function is no longer registered (and in + // fact, no function at all is registered), this will result in the + // default code path being taken: _CRT_DEBUGGER_HOOK and _invoke_watson. + // Use _invalid_parameter where it exists (in _DEBUG builds) as it passes + // more information through. In non-debug builds, it is not available, + // so fall back to using _invalid_parameter_noinfo. See invarg.c in the + // CRT source. +#ifdef _DEBUG + _invalid_parameter(expression, function, file, line, reserved); +#else // _DEBUG + _invalid_parameter_noinfo(); +#endif // _DEBUG + } + } + + // The handler either took care of the invalid parameter problem itself, + // or passed it on to another handler. "Swallow" it by exiting, paralleling + // the behavior of "swallowing" exceptions. + exit(0); +} +#endif // _MSC_VER >= 1400 + +// static +void ExceptionHandler::HandlePureVirtualCall() { + AutoExceptionHandler auto_exception_handler; + ExceptionHandler* current_handler = auto_exception_handler.get_handler(); + + MDRawAssertionInfo assertion; + memset(&assertion, 0, sizeof(assertion)); + assertion.type = MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL; + + bool success = false; + // In case of out-of-process dump generation, directly call + // WriteMinidumpWithException since there is no separate thread running. + + if (current_handler->IsOutOfProcess()) { + success = current_handler->WriteMinidumpWithException( + GetCurrentThreadId(), + NULL, + &assertion); + } else { + success = current_handler->WriteMinidumpOnHandlerThread(NULL, &assertion); + } + + if (!success) { + if (current_handler->previous_pch_) { + // The handler didn't fully handle the exception. Give it to the + // previous purecall handler. + current_handler->previous_pch_(); + } else { + // If there's no previous handler, return and let _purecall handle it. + // This will just put up an assertion dialog. + return; + } + } + + // The handler either took care of the invalid parameter problem itself, + // or passed it on to another handler. "Swallow" it by exiting, paralleling + // the behavior of "swallowing" exceptions. + exit(0); +} + +bool ExceptionHandler::WriteMinidumpOnHandlerThread( + EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion) { + EnterCriticalSection(&handler_critical_section_); + + // There isn't much we can do if the handler thread + // was not successfully created. + if (handler_thread_ == NULL) { + LeaveCriticalSection(&handler_critical_section_); + return false; + } + + // The handler thread should only be created when the semaphores are valid. + assert(handler_start_semaphore_ != NULL); + assert(handler_finish_semaphore_ != NULL); + + // Set up data to be passed in to the handler thread. + requesting_thread_id_ = GetCurrentThreadId(); + exception_info_ = exinfo; + assertion_ = assertion; + + // This causes the handler thread to call WriteMinidumpWithException. + ReleaseSemaphore(handler_start_semaphore_, 1, NULL); + + // Wait until WriteMinidumpWithException is done and collect its return value. + WaitForSingleObject(handler_finish_semaphore_, INFINITE); + bool status = handler_return_value_; + + // Clean up. + requesting_thread_id_ = 0; + exception_info_ = NULL; + assertion_ = NULL; + + LeaveCriticalSection(&handler_critical_section_); + + return status; +} + +bool ExceptionHandler::WriteMinidump() { + return WriteMinidumpForException(NULL); +} + +bool ExceptionHandler::WriteMinidumpForException(EXCEPTION_POINTERS* exinfo) { + // In case of out-of-process dump generation, directly call + // WriteMinidumpWithException since there is no separate thread running. + if (IsOutOfProcess()) { + return WriteMinidumpWithException(GetCurrentThreadId(), + exinfo, + NULL); + } + + bool success = WriteMinidumpOnHandlerThread(exinfo, NULL); + UpdateNextID(); + return success; +} + +// static +bool ExceptionHandler::WriteMinidump(const wstring &dump_path, + MinidumpCallback callback, + void* callback_context) { + ExceptionHandler handler(dump_path, NULL, callback, callback_context, + HANDLER_NONE); + return handler.WriteMinidump(); +} + +bool ExceptionHandler::WriteMinidumpWithException( + DWORD requesting_thread_id, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion) { + // Give user code a chance to approve or prevent writing a minidump. If the + // filter returns false, don't handle the exception at all. If this method + // was called as a result of an exception, returning false will cause + // HandleException to call any previous handler or return + // EXCEPTION_CONTINUE_SEARCH on the exception thread, allowing it to appear + // as though this handler were not present at all. + if (filter_ && !filter_(callback_context_, exinfo, assertion)) { + return false; + } + + bool success = false; + if (IsOutOfProcess()) { + // Use the EXCEPTION_POINTERS overload for RequestDump if + // both exinfo and assertion are NULL. + if (!assertion) { + success = crash_generation_client_->RequestDump(exinfo); + } else { + success = crash_generation_client_->RequestDump(assertion); + } + } else { + if (minidump_write_dump_) { + HANDLE dump_file = CreateFile(next_minidump_path_c_, + GENERIC_WRITE, + 0, // no sharing + NULL, + CREATE_NEW, // fail if exists + FILE_ATTRIBUTE_NORMAL, + NULL); + if (dump_file != INVALID_HANDLE_VALUE) { + MINIDUMP_EXCEPTION_INFORMATION except_info; + except_info.ThreadId = requesting_thread_id; + except_info.ExceptionPointers = exinfo; + except_info.ClientPointers = FALSE; + + // Add an MDRawBreakpadInfo stream to the minidump, to provide additional + // information about the exception handler to the Breakpad processor. The + // information will help the processor determine which threads are + // relevant. The Breakpad processor does not require this information but + // can function better with Breakpad-generated dumps when it is present. + // The native debugger is not harmed by the presence of this information. + MDRawBreakpadInfo breakpad_info; + breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; + breakpad_info.dump_thread_id = GetCurrentThreadId(); + breakpad_info.requesting_thread_id = requesting_thread_id; + + // Leave room in user_stream_array for a possible assertion info stream. + MINIDUMP_USER_STREAM user_stream_array[2]; + user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM; + user_stream_array[0].BufferSize = sizeof(breakpad_info); + user_stream_array[0].Buffer = &breakpad_info; + + MINIDUMP_USER_STREAM_INFORMATION user_streams; + user_streams.UserStreamCount = 1; + user_streams.UserStreamArray = user_stream_array; + + if (assertion) { + user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM; + user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo); + user_stream_array[1].Buffer = assertion; + ++user_streams.UserStreamCount; + } + + // The explicit comparison to TRUE avoids a warning (C4800). + success = (minidump_write_dump_(GetCurrentProcess(), + GetCurrentProcessId(), + dump_file, + dump_type_, + exinfo ? &except_info : NULL, + &user_streams, + NULL) == TRUE); + + CloseHandle(dump_file); + } + } + } + + if (callback_) { + // TODO(munjal): In case of out-of-process dump generation, both + // dump_path_c_ and next_minidump_id_ will be NULL. For out-of-process + // scenario, the server process ends up creating the dump path and dump + // id so they are not known to the client. + success = callback_(dump_path_c_, next_minidump_id_c_, callback_context_, + exinfo, assertion, success); + } + + return success; +} + +void ExceptionHandler::UpdateNextID() { + assert(uuid_create_); + UUID id = {0}; + if (uuid_create_) { + uuid_create_(&id); + } + next_minidump_id_ = GUIDString::GUIDToWString(&id); + next_minidump_id_c_ = next_minidump_id_.c_str(); + + wchar_t minidump_path[MAX_PATH]; + swprintf(minidump_path, MAX_PATH, L"%s\\%s.dmp", + dump_path_c_, next_minidump_id_c_); + + // remove when VC++7.1 is no longer supported + minidump_path[MAX_PATH - 1] = L'\0'; + + next_minidump_path_ = minidump_path; + next_minidump_path_c_ = next_minidump_path_.c_str(); +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/windows/handler/exception_handler.h b/thirdparty/google-breakpad/r318/src/client/windows/handler/exception_handler.h new file mode 100644 index 00000000..2cacdc38 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/handler/exception_handler.h @@ -0,0 +1,415 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ExceptionHandler can write a minidump file when an exception occurs, +// or when WriteMinidump() is called explicitly by your program. +// +// To have the exception handler write minidumps when an uncaught exception +// (crash) occurs, you should create an instance early in the execution +// of your program, and keep it around for the entire time you want to +// have crash handling active (typically, until shutdown). +// +// If you want to write minidumps without installing the exception handler, +// you can create an ExceptionHandler with install_handler set to false, +// then call WriteMinidump. You can also use this technique if you want to +// use different minidump callbacks for different call sites. +// +// In either case, a callback function is called when a minidump is written, +// which receives the unqiue id of the minidump. The caller can use this +// id to collect and write additional application state, and to launch an +// external crash-reporting application. +// +// It is important that creation and destruction of ExceptionHandler objects +// be nested cleanly, when using install_handler = true. +// Avoid the following pattern: +// ExceptionHandler *e = new ExceptionHandler(...); +// ExceptionHandler *f = new ExceptionHandler(...); +// delete e; +// This will put the exception filter stack into an inconsistent state. + +#ifndef CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ +#define CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ + +#include +#include +#include +#include + +#pragma warning( push ) +// Disable exception handler warnings. +#pragma warning( disable : 4530 ) + +#include +#include + +#include "client/windows/common/ipc_protocol.h" +#include "client/windows/crash_generation/crash_generation_client.h" +#include "google_breakpad/common/minidump_format.h" +#include "processor/scoped_ptr.h" + +namespace google_breakpad { + +using std::vector; +using std::wstring; + +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. context is the parameter supplied by the user as + // callback_context when the handler was created. exinfo points to the + // exception record, if any; assertion points to assertion information, + // if any. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, Breakpad + // will immediately report the exception as unhandled without writing a + // minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void* context, EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion); + + // A callback function to run after the minidump has been written. + // minidump_id is a unique id for the dump, so the minidump + // file is \.dmp. context is the parameter supplied + // by the user as callback_context when the handler was created. exinfo + // points to the exception record, or NULL if no exception occurred. + // succeeded indicates whether a minidump file was successfully written. + // assertion points to information about an assertion if the handler was + // invoked by an assertion. + // + // If an exception occurred and the callback returns true, Breakpad will treat + // the exception as fully-handled, suppressing any other handlers from being + // notified of the exception. If the callback returns false, Breakpad will + // treat the exception as unhandled, and allow another handler to handle it. + // If there are no other handlers, Breakpad will report the exception to the + // system as unhandled, allowing a debugger or native crash dialog the + // opportunity to handle the exception. Most callback implementations + // should normally return the value of |succeeded|, or when they wish to + // not report an exception of handled, false. Callbacks will rarely want to + // return true directly (unless |succeeded| is true). + // + // For out-of-process dump generation, dump path and minidump ID will always + // be NULL. In case of out-of-process dump generation, the dump path and + // minidump id are controlled by the server process and are not communicated + // back to the crashing process. + typedef bool (*MinidumpCallback)(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded); + + // HandlerType specifies which types of handlers should be installed, if + // any. Use HANDLER_NONE for an ExceptionHandler that remains idle, + // without catching any failures on its own. This type of handler may + // still be triggered by calling WriteMinidump. Otherwise, use a + // combination of the other HANDLER_ values, or HANDLER_ALL to install + // all handlers. + enum HandlerType { + HANDLER_NONE = 0, + HANDLER_EXCEPTION = 1 << 0, // SetUnhandledExceptionFilter + HANDLER_INVALID_PARAMETER = 1 << 1, // _set_invalid_parameter_handler + HANDLER_PURECALL = 1 << 2, // _set_purecall_handler + HANDLER_ALL = HANDLER_EXCEPTION | + HANDLER_INVALID_PARAMETER | + HANDLER_PURECALL + }; + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Before writing a minidump, the optional filter callback will be called. + // Its return value determines whether or not Breakpad should write a + // minidump. Minidump files will be written to dump_path, and the optional + // callback is called after writing the dump file, as described above. + // handler_types specifies the types of handlers that should be installed. + ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types); + + // Creates a new ExcetpionHandler instance that can attempt to perform + // out-of-process dump generation if pipe_name is not NULL. If pipe_name is + // NULL, or if out-of-process dump generation registration step fails, + // in-process dump generation will be used. This also allows specifying + // the dump type to generate. + ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + const CustomClientInfo* custom_info); + + ~ExceptionHandler(); + + // Get and set the minidump path. + wstring dump_path() const { return dump_path_; } + void set_dump_path(const wstring &dump_path) { + dump_path_ = dump_path; + dump_path_c_ = dump_path_.c_str(); + UpdateNextID(); // Necessary to put dump_path_ in next_minidump_path_. + } + + // Writes a minidump immediately. This can be used to capture the + // execution state independently of a crash. Returns true on success. + bool WriteMinidump(); + + // Writes a minidump immediately, with the user-supplied exception + // information. + bool WriteMinidumpForException(EXCEPTION_POINTERS* exinfo); + + // Convenience form of WriteMinidump which does not require an + // ExceptionHandler instance. + static bool WriteMinidump(const wstring &dump_path, + MinidumpCallback callback, void* callback_context); + + // Get the thread ID of the thread requesting the dump (either the exception + // thread or any other thread that called WriteMinidump directly). This + // may be useful if you want to include additional thread state in your + // dumps. + DWORD get_requesting_thread_id() const { return requesting_thread_id_; } + + // Controls behavior of EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP. + bool get_handle_debug_exceptions() const { return handle_debug_exceptions_; } + void set_handle_debug_exceptions(bool handle_debug_exceptions) { + handle_debug_exceptions_ = handle_debug_exceptions; + } + + // Returns whether out-of-process dump generation is used or not. + bool IsOutOfProcess() const { return crash_generation_client_.get() != NULL; } + + private: + friend class AutoExceptionHandler; + + // Initializes the instance with given values. + void Initialize(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + const CustomClientInfo* custom_info); + + // Function pointer type for MiniDumpWriteDump, which is looked up + // dynamically. + typedef BOOL (WINAPI *MiniDumpWriteDump_type)( + HANDLE hProcess, + DWORD dwPid, + HANDLE hFile, + MINIDUMP_TYPE DumpType, + CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); + + // Function pointer type for UuidCreate, which is looked up dynamically. + typedef RPC_STATUS (RPC_ENTRY *UuidCreate_type)(UUID* Uuid); + + // Runs the main loop for the exception handler thread. + static DWORD WINAPI ExceptionHandlerThreadMain(void* lpParameter); + + // Called on the exception thread when an unhandled exception occurs. + // Signals the exception handler thread to handle the exception. + static LONG WINAPI HandleException(EXCEPTION_POINTERS* exinfo); + +#if _MSC_VER >= 1400 // MSVC 2005/8 + // This function will be called by some CRT functions when they detect + // that they were passed an invalid parameter. Note that in _DEBUG builds, + // the CRT may display an assertion dialog before calling this function, + // and the function will not be called unless the assertion dialog is + // dismissed by clicking "Ignore." + static void HandleInvalidParameter(const wchar_t* expression, + const wchar_t* function, + const wchar_t* file, + unsigned int line, + uintptr_t reserved); +#endif // _MSC_VER >= 1400 + + // This function will be called by the CRT when a pure virtual + // function is called. + static void HandlePureVirtualCall(); + + // This is called on the exception thread or on another thread that + // the user wishes to produce a dump from. It calls + // WriteMinidumpWithException on the handler thread, avoiding stack + // overflows and inconsistent dumps due to writing the dump from + // the exception thread. If the dump is requested as a result of an + // exception, exinfo contains exception information, otherwise, it + // is NULL. If the dump is requested as a result of an assertion + // (such as an invalid parameter being passed to a CRT function), + // assertion contains data about the assertion, otherwise, it is NULL. + bool WriteMinidumpOnHandlerThread(EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion); + + // This function does the actual writing of a minidump. It is called + // on the handler thread. requesting_thread_id is the ID of the thread + // that requested the dump. If the dump is requested as a result of + // an exception, exinfo contains exception information, otherwise, + // it is NULL. + bool WriteMinidumpWithException(DWORD requesting_thread_id, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion); + + // Generates a new ID and stores it in next_minidump_id_, and stores the + // path of the next minidump to be written in next_minidump_path_. + void UpdateNextID(); + + FilterCallback filter_; + MinidumpCallback callback_; + void* callback_context_; + + scoped_ptr crash_generation_client_; + + // The directory in which a minidump will be written, set by the dump_path + // argument to the constructor, or set_dump_path. + wstring dump_path_; + + // The basename of the next minidump to be written, without the extension. + wstring next_minidump_id_; + + // The full pathname of the next minidump to be written, including the file + // extension. + wstring next_minidump_path_; + + // Pointers to C-string representations of the above. These are set when + // the above wstring versions are set in order to avoid calling c_str during + // an exception, as c_str may attempt to allocate heap memory. These + // pointers are not owned by the ExceptionHandler object, but their lifetimes + // should be equivalent to the lifetimes of the associated wstring, provided + // that the wstrings are not altered. + const wchar_t* dump_path_c_; + const wchar_t* next_minidump_id_c_; + const wchar_t* next_minidump_path_c_; + + HMODULE dbghelp_module_; + MiniDumpWriteDump_type minidump_write_dump_; + MINIDUMP_TYPE dump_type_; + + HMODULE rpcrt4_module_; + UuidCreate_type uuid_create_; + + // Tracks the handler types that were installed according to the + // handler_types constructor argument. + int handler_types_; + + // When installed_handler_ is true, previous_filter_ is the unhandled + // exception filter that was set prior to installing ExceptionHandler as + // the unhandled exception filter and pointing it to |this|. NULL indicates + // that there is no previous unhandled exception filter. + LPTOP_LEVEL_EXCEPTION_FILTER previous_filter_; + +#if _MSC_VER >= 1400 // MSVC 2005/8 + // Beginning in VC 8, the CRT provides an invalid parameter handler that will + // be called when some CRT functions are passed invalid parameters. In + // earlier CRTs, the same conditions would cause unexpected behavior or + // crashes. + _invalid_parameter_handler previous_iph_; +#endif // _MSC_VER >= 1400 + + // The CRT allows you to override the default handler for pure + // virtual function calls. + _purecall_handler previous_pch_; + + // The exception handler thread. + HANDLE handler_thread_; + + // True if the exception handler is being destroyed. + // Starting with MSVC 2005, Visual C has stronger guarantees on volatile vars. + // It has release semantics on write and acquire semantics on reads. + // See the msdn documentation. + volatile bool is_shutdown_; + + // The critical section enforcing the requirement that only one exception be + // handled by a handler at a time. + CRITICAL_SECTION handler_critical_section_; + + // Semaphores used to move exception handling between the exception thread + // and the handler thread. handler_start_semaphore_ is signalled by the + // exception thread to wake up the handler thread when an exception occurs. + // handler_finish_semaphore_ is signalled by the handler thread to wake up + // the exception thread when handling is complete. + HANDLE handler_start_semaphore_; + HANDLE handler_finish_semaphore_; + + // The next 2 fields contain data passed from the requesting thread to + // the handler thread. + + // The thread ID of the thread requesting the dump (either the exception + // thread or any other thread that called WriteMinidump directly). + DWORD requesting_thread_id_; + + // The exception info passed to the exception handler on the exception + // thread, if an exception occurred. NULL for user-requested dumps. + EXCEPTION_POINTERS* exception_info_; + + // If the handler is invoked due to an assertion, this will contain a + // pointer to the assertion information. It is NULL at other times. + MDRawAssertionInfo* assertion_; + + // The return value of the handler, passed from the handler thread back to + // the requesting thread. + bool handler_return_value_; + + // If true, the handler will intercept EXCEPTION_BREAKPOINT and + // EXCEPTION_SINGLE_STEP exceptions. Leave this false (the default) + // to not interfere with debuggers. + bool handle_debug_exceptions_; + + // A stack of ExceptionHandler objects that have installed unhandled + // exception filters. This vector is used by HandleException to determine + // which ExceptionHandler object to route an exception to. When an + // ExceptionHandler is created with install_handler true, it will append + // itself to this list. + static vector* handler_stack_; + + // The index of the ExceptionHandler in handler_stack_ that will handle the + // next exception. Note that 0 means the last entry in handler_stack_, 1 + // means the next-to-last entry, and so on. This is used by HandleException + // to support multiple stacked Breakpad handlers. + static LONG handler_stack_index_; + + // handler_stack_critical_section_ guards operations on handler_stack_ and + // handler_stack_index_. The critical section is initialized by the + // first instance of the class and destroyed by the last instance of it. + static CRITICAL_SECTION handler_stack_critical_section_; + + // The number of instances of this class. + volatile static LONG instance_count_; + + // disallow copy ctor and operator= + explicit ExceptionHandler(const ExceptionHandler &); + void operator=(const ExceptionHandler &); +}; + +} // namespace google_breakpad + +#pragma warning( pop ) + +#endif // CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/sender/crash_report_sender.cc b/thirdparty/google-breakpad/r318/src/client/windows/sender/crash_report_sender.cc new file mode 100644 index 00000000..7672acfd --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/sender/crash_report_sender.cc @@ -0,0 +1,143 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Disable exception handler warnings. +#pragma warning( disable : 4530 ) + +#include + +#include "client/windows/sender/crash_report_sender.h" +#include "common/windows/http_upload.h" + +#if _MSC_VER < 1400 // MSVC 2005/8 +// Older MSVC doesn't have fscanf_s, but they are compatible as long as +// we don't use the string conversions (%s/%c/%S/%C). +#define fscanf_s fscanf +#endif + +namespace google_breakpad { + +static const char kCheckpointSignature[] = "GBP1\n"; + +CrashReportSender::CrashReportSender(const wstring &checkpoint_file) + : checkpoint_file_(checkpoint_file), + max_reports_per_day_(-1), + last_sent_date_(-1), + reports_sent_(0) { + FILE *fd; + if (OpenCheckpointFile(L"r", &fd) == 0) { + ReadCheckpoint(fd); + fclose(fd); + } +} + +ReportResult CrashReportSender::SendCrashReport( + const wstring &url, const map ¶meters, + const wstring &dump_file_name, wstring *report_code) { + int today = GetCurrentDate(); + if (today == last_sent_date_ && + max_reports_per_day_ != -1 && + reports_sent_ >= max_reports_per_day_) { + return RESULT_THROTTLED; + } + + int http_response = 0; + bool result = HTTPUpload::SendRequest( + url, parameters, dump_file_name, L"upload_file_minidump", report_code, + &http_response); + + if (result) { + ReportSent(today); + return RESULT_SUCCEEDED; + } else if (http_response == 400) { // TODO: update if/when the server + // switches to a different code + return RESULT_REJECTED; + } else { + return RESULT_FAILED; + } +} + +void CrashReportSender::ReadCheckpoint(FILE *fd) { + char buf[128]; + if (!fgets(buf, sizeof(buf), fd) || + strcmp(buf, kCheckpointSignature) != 0) { + return; + } + + if (fscanf_s(fd, "%d\n", &last_sent_date_) != 1) { + last_sent_date_ = -1; + return; + } + if (fscanf_s(fd, "%d\n", &reports_sent_) != 1) { + reports_sent_ = 0; + return; + } +} + +void CrashReportSender::ReportSent(int today) { + // Update the report stats + if (today != last_sent_date_) { + last_sent_date_ = today; + reports_sent_ = 0; + } + ++reports_sent_; + + // Update the checkpoint file + FILE *fd; + if (OpenCheckpointFile(L"w", &fd) == 0) { + fputs(kCheckpointSignature, fd); + fprintf(fd, "%d\n", last_sent_date_); + fprintf(fd, "%d\n", reports_sent_); + fclose(fd); + } +} + +int CrashReportSender::GetCurrentDate() const { + SYSTEMTIME system_time; + GetSystemTime(&system_time); + return (system_time.wYear * 10000) + (system_time.wMonth * 100) + + system_time.wDay; +} + +int CrashReportSender::OpenCheckpointFile(const wchar_t *mode, FILE **fd) { + if (checkpoint_file_.empty()) { + return ENOENT; + } +#if _MSC_VER >= 1400 // MSVC 2005/8 + return _wfopen_s(fd, checkpoint_file_.c_str(), mode); +#else + *fd = _wfopen(checkpoint_file_.c_str(), mode); + if (*fd == NULL) { + return errno; + } + return 0; +#endif +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/windows/sender/crash_report_sender.h b/thirdparty/google-breakpad/r318/src/client/windows/sender/crash_report_sender.h new file mode 100644 index 00000000..da1ed0af --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/sender/crash_report_sender.h @@ -0,0 +1,125 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__ +#define CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__ + +// CrashReportSender is a "static" class which provides an API to upload +// crash reports via HTTP(S). A crash report is formatted as a multipart POST +// request, which contains a set of caller-supplied string key/value pairs, +// and a minidump file to upload. +// +// To use this library in your project, you will need to link against +// wininet.lib. + +#pragma warning( push ) +// Disable exception handler warnings. +#pragma warning( disable : 4530 ) + +#include +#include + +namespace google_breakpad { + +using std::wstring; +using std::map; + +typedef enum { + RESULT_FAILED = 0, // Failed to communicate with the server; try later. + RESULT_REJECTED, // Successfully sent the crash report, but the + // server rejected it; don't resend this report. + RESULT_SUCCEEDED, // The server accepted the crash report. + RESULT_THROTTLED // No attempt was made to send the crash report, because + // we exceeded the maximum reports per day. +} ReportResult; + +class CrashReportSender { + public: + // Initializes a CrashReportSender instance. + // If checkpoint_file is non-empty, breakpad will persist crash report + // state to this file. A checkpoint file is required for + // set_max_reports_per_day() to function properly. + explicit CrashReportSender(const wstring &checkpoint_file); + ~CrashReportSender() {} + + // Sets the maximum number of crash reports that will be sent in a 24-hour + // period. This uses the state persisted to the checkpoint file. + // The default value of -1 means that there is no limit on reports sent. + void set_max_reports_per_day(int reports) { + max_reports_per_day_ = reports; + } + + int max_reports_per_day() const { return max_reports_per_day_; } + + // Sends the specified minidump file, along with the map of + // name value pairs, as a multipart POST request to the given URL. + // Parameter names must contain only printable ASCII characters, + // and may not contain a quote (") character. + // Only HTTP(S) URLs are currently supported. The return value indicates + // the result of the operation (see above for possible results). + // If report_code is non-NULL and the report is sent successfully (that is, + // the return value is RESULT_SUCCEEDED), a code uniquely identifying the + // report will be returned in report_code. + // (Otherwise, report_code will be unchanged.) + ReportResult SendCrashReport(const wstring &url, + const map ¶meters, + const wstring &dump_file_name, + wstring *report_code); + + private: + // Reads persistent state from a checkpoint file. + void ReadCheckpoint(FILE *fd); + + // Called when a new report has been sent, to update the checkpoint state. + void ReportSent(int today); + + // Returns today's date (UTC) formatted as YYYYMMDD. + int GetCurrentDate() const; + + // Opens the checkpoint file with the specified mode. + // Returns zero on success, or an error code on failure. + int OpenCheckpointFile(const wchar_t *mode, FILE **fd); + + wstring checkpoint_file_; + int max_reports_per_day_; + // The last date on which we sent a report, expressed as YYYYMMDD. + int last_sent_date_; + // Number of reports sent on last_sent_date_ + int reports_sent_; + + // Disallow copy constructor and operator= + explicit CrashReportSender(const CrashReportSender &); + void operator=(const CrashReportSender &); +}; + +} // namespace google_breakpad + +#pragma warning( pop ) + +#endif // CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/abstract_class.cc b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/abstract_class.cc new file mode 100644 index 00000000..f71addfb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/abstract_class.cc @@ -0,0 +1,53 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "precompile.h" + +namespace google_breakpad { + +Base::Base(Derived* derived) + : derived_(derived) { +} + +Base::~Base() { + derived_->DoSomething(); +} + +#pragma warning(push) +#pragma warning(disable:4355) +// Disable warning C4355: 'this' : used in base member initializer list. +Derived::Derived() + : Base(this) { // C4355 +} +#pragma warning(pop) + +void Derived::DoSomething() { +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/abstract_class.h b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/abstract_class.h new file mode 100644 index 00000000..e3f2a4f3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/abstract_class.h @@ -0,0 +1,57 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_ABSTRACT_CLASS_H__ +#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_ABSTRACT_CLASS_H__ + +namespace google_breakpad { + +// Dummy classes to help generate a pure call violation. + +class Derived; + +class Base { + public: + Base(Derived* derived); + virtual ~Base(); + virtual void DoSomething() = 0; + + private: + Derived* derived_; +}; + +class Derived : public Base { + public: + Derived(); + virtual void DoSomething(); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.cc b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.cc new file mode 100644 index 00000000..a3c560bd --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.cc @@ -0,0 +1,510 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// crash_generation_app.cpp : Defines the entry point for the application. +// + +#include "precompile.h" + +namespace google_breakpad { + +const int kMaxLoadString = 100; +const wchar_t kPipeName[] = L"\\\\.\\pipe\\BreakpadCrashServices\\TestServer"; + +const DWORD kEditBoxStyles = WS_CHILD | + WS_VISIBLE | + WS_VSCROLL | + ES_LEFT | + ES_MULTILINE | + ES_AUTOVSCROLL | + ES_READONLY; + +// Maximum length of a line in the edit box. +const size_t kMaximumLineLength = 256; + +// CS to access edit control in a thread safe way. +static CRITICAL_SECTION* cs_edit = NULL; + +// Edit control. +static HWND client_status_edit_box; + +HINSTANCE current_instance; // Current instance. +TCHAR title[kMaxLoadString]; // Title bar text. +TCHAR window_class[kMaxLoadString]; // Main window class name. + +ATOM MyRegisterClass(HINSTANCE instance); +BOOL InitInstance(HINSTANCE, int); +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); +INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); + +static int kCustomInfoCount = 2; +static CustomInfoEntry kCustomInfoEntries[] = { + CustomInfoEntry(L"prod", L"CrashTestApp"), + CustomInfoEntry(L"ver", L"1.0"), +}; + +static ExceptionHandler* handler = NULL; +static CrashGenerationServer* crash_server = NULL; + +// Registers the window class. +// +// This function and its usage are only necessary if you want this code +// to be compatible with Win32 systems prior to the 'RegisterClassEx' +// function that was added to Windows 95. It is important to call this +// function so that the application will get 'well formed' small icons +// associated with it. +ATOM MyRegisterClass(HINSTANCE instance) { + WNDCLASSEX wcex; + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = instance; + wcex.hIcon = LoadIcon(instance, + MAKEINTRESOURCE(IDI_CRASHGENERATIONAPP)); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP); + wcex.lpszClassName = window_class; + wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); + + return RegisterClassEx(&wcex); +} + +// Saves instance handle and creates main window +// +// In this function, we save the instance handle in a global variable and +// create and display the main program window. +BOOL InitInstance(HINSTANCE instance, int command_show) { + current_instance = instance; + HWND wnd = CreateWindow(window_class, + title, + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + 0, + CW_USEDEFAULT, + 0, + NULL, + NULL, + instance, + NULL); + + if (!wnd) { + return FALSE; + } + + ShowWindow(wnd, command_show); + UpdateWindow(wnd); + + return TRUE; +} + +static void AppendTextToEditBox(TCHAR* text) { + EnterCriticalSection(cs_edit); + SYSTEMTIME current_time; + GetLocalTime(¤t_time); + TCHAR line[kMaximumLineLength]; + int result = swprintf_s(line, + kMaximumLineLength, + L"[%.2d-%.2d-%.4d %.2d:%.2d:%.2d] %s", + current_time.wMonth, + current_time.wDay, + current_time.wYear, + current_time.wHour, + current_time.wMinute, + current_time.wSecond, + text); + + if (result == -1) { + return; + } + + int length = GetWindowTextLength(client_status_edit_box); + SendMessage(client_status_edit_box, + EM_SETSEL, + (WPARAM)length, + (LPARAM)length); + SendMessage(client_status_edit_box, + EM_REPLACESEL, + (WPARAM)FALSE, + (LPARAM)line); + LeaveCriticalSection(cs_edit); +} + +static DWORD WINAPI AppendTextWorker(void* context) { + TCHAR* text = reinterpret_cast(context); + + AppendTextToEditBox(text); + delete[] text; + + return 0; +} + +bool ShowDumpResults(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded) { + TCHAR* text = new TCHAR[kMaximumLineLength]; + text[0] = _T('\0'); + int result = swprintf_s(text, + kMaximumLineLength, + TEXT("Dump generation request %s\r\n"), + succeeded ? TEXT("succeeded") : TEXT("failed")); + if (result == -1) { + delete [] text; + } + + AppendTextWorker(text); + return succeeded; +} + +static void _cdecl ShowClientConnected(void* context, + const ClientInfo* client_info) { + TCHAR* line = new TCHAR[kMaximumLineLength]; + line[0] = _T('\0'); + int result = swprintf_s(line, + kMaximumLineLength, + L"Client connected:\t\t%d\r\n", + client_info->pid()); + + if (result == -1) { + delete[] line; + return; + } + + QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); +} + +static void _cdecl ShowClientCrashed(void* context, + const ClientInfo* client_info, + const wstring* dump_path) { + TCHAR* line = new TCHAR[kMaximumLineLength]; + line[0] = _T('\0'); + int result = swprintf_s(line, + kMaximumLineLength, + TEXT("Client requested dump:\t%d\r\n"), + client_info->pid()); + + if (result == -1) { + delete[] line; + return; + } + + QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); + + CustomClientInfo custom_info = client_info->GetCustomInfo(); + if (custom_info.count <= 0) { + return; + } + + wstring str_line; + for (int i = 0; i < custom_info.count; ++i) { + if (i > 0) { + str_line += L", "; + } + str_line += custom_info.entries[i].name; + str_line += L": "; + str_line += custom_info.entries[i].value; + } + + line = new TCHAR[kMaximumLineLength]; + line[0] = _T('\0'); + result = swprintf_s(line, + kMaximumLineLength, + L"%s\n", + str_line.c_str()); + if (result == -1) { + delete[] line; + return; + } + QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); +} + +static void _cdecl ShowClientExited(void* context, + const ClientInfo* client_info) { + TCHAR* line = new TCHAR[kMaximumLineLength]; + line[0] = _T('\0'); + int result = swprintf_s(line, + kMaximumLineLength, + TEXT("Client exited:\t\t%d\r\n"), + client_info->pid()); + + if (result == -1) { + delete[] line; + return; + } + + QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); +} + +void CrashServerStart() { + // Do not create another instance of the server. + if (crash_server) { + return; + } + + std::wstring dump_path = L"C:\\Dumps\\"; + crash_server = new CrashGenerationServer(kPipeName, + NULL, + ShowClientConnected, + NULL, + ShowClientCrashed, + NULL, + ShowClientExited, + NULL, + true, + &dump_path); + + if (!crash_server->Start()) { + MessageBoxW(NULL, L"Unable to start server", L"Dumper", MB_OK); + delete crash_server; + crash_server = NULL; + } +} + +void CrashServerStop() { + delete crash_server; + crash_server = NULL; +} + +void DerefZeroCrash() { + int* x = 0; + *x = 1; +} + +void InvalidParamCrash() { + printf(NULL); +} + +void PureCallCrash() { + Derived derived; +} + +void RequestDump() { + if (!handler->WriteMinidump()) { + MessageBoxW(NULL, L"Dump request failed", L"Dumper", MB_OK); + } + kCustomInfoEntries[1].set_value(L"1.1"); +} + +void CleanUp() { + if (cs_edit) { + DeleteCriticalSection(cs_edit); + delete cs_edit; + } + + if (handler) { + delete handler; + } + + if (crash_server) { + delete crash_server; + } +} + +// Processes messages for the main window. +// +// WM_COMMAND - process the application menu. +// WM_PAINT - Paint the main window. +// WM_DESTROY - post a quit message and return. +LRESULT CALLBACK WndProc(HWND wnd, + UINT message, + WPARAM w_param, + LPARAM l_param) { + int message_id; + int message_event; + PAINTSTRUCT ps; + HDC hdc; + +#pragma warning(push) +#pragma warning(disable:4312) + // Disable warning C4312: 'type cast' : conversion from 'LONG' to + // 'HINSTANCE' of greater size. + // The value returned by GetwindowLong in the case below returns unsigned. + HINSTANCE instance = (HINSTANCE)GetWindowLong(wnd, GWL_HINSTANCE); +#pragma warning(pop) + + switch (message) { + case WM_COMMAND: + // Parse the menu selections. + message_id = LOWORD(w_param); + message_event = HIWORD(w_param); + switch (message_id) { + case IDM_ABOUT: + DialogBox(current_instance, + MAKEINTRESOURCE(IDD_ABOUTBOX), + wnd, + About); + break; + case IDM_EXIT: + DestroyWindow(wnd); + break; + case ID_SERVER_START: + CrashServerStart(); + break; + case ID_SERVER_STOP: + CrashServerStop(); + break; + case ID_CLIENT_DEREFZERO: + DerefZeroCrash(); + break; + case ID_CLIENT_INVALIDPARAM: + InvalidParamCrash(); + break; + case ID_CLIENT_PURECALL: + PureCallCrash(); + break; + case ID_CLIENT_REQUESTEXPLICITDUMP: + RequestDump(); + break; + default: + return DefWindowProc(wnd, message, w_param, l_param); + } + break; + case WM_CREATE: + client_status_edit_box = CreateWindow(TEXT("EDIT"), + NULL, + kEditBoxStyles, + 0, + 0, + 0, + 0, + wnd, + NULL, + instance, + NULL); + break; + case WM_SIZE: + // Make the edit control the size of the window's client area. + MoveWindow(client_status_edit_box, + 0, + 0, + LOWORD(l_param), // width of client area. + HIWORD(l_param), // height of client area. + TRUE); // repaint window. + break; + case WM_SETFOCUS: + SetFocus(client_status_edit_box); + break; + case WM_PAINT: + hdc = BeginPaint(wnd, &ps); + EndPaint(wnd, &ps); + break; + case WM_DESTROY: + CleanUp(); + PostQuitMessage(0); + break; + default: + return DefWindowProc(wnd, message, w_param, l_param); + } + + return 0; +} + +// Message handler for about box. +INT_PTR CALLBACK About(HWND dlg, + UINT message, + WPARAM w_param, + LPARAM l_param) { + UNREFERENCED_PARAMETER(l_param); + switch (message) { + case WM_INITDIALOG: + return (INT_PTR)TRUE; + + case WM_COMMAND: + if (LOWORD(w_param) == IDOK || LOWORD(w_param) == IDCANCEL) { + EndDialog(dlg, LOWORD(w_param)); + return (INT_PTR)TRUE; + } + break; + } + + return (INT_PTR)FALSE; +} + +} // namespace google_breakpad + +int APIENTRY _tWinMain(HINSTANCE instance, + HINSTANCE previous_instance, + LPTSTR command_line, + int command_show) { + using namespace google_breakpad; + + UNREFERENCED_PARAMETER(previous_instance); + UNREFERENCED_PARAMETER(command_line); + + cs_edit = new CRITICAL_SECTION(); + InitializeCriticalSection(cs_edit); + + CustomClientInfo custom_info = {kCustomInfoEntries, kCustomInfoCount}; + + // This is needed for CRT to not show dialog for invalid param + // failures and instead let the code handle it. + _CrtSetReportMode(_CRT_ASSERT, 0); + handler = new ExceptionHandler(L"C:\\dumps\\", + NULL, + google_breakpad::ShowDumpResults, + NULL, + ExceptionHandler::HANDLER_ALL, + MiniDumpNormal, + kPipeName, + &custom_info); + + // Initialize global strings. + LoadString(instance, IDS_APP_TITLE, title, kMaxLoadString); + LoadString(instance, + IDC_CRASHGENERATIONAPP, + window_class, + kMaxLoadString); + MyRegisterClass(instance); + + // Perform application initialization. + if (!InitInstance (instance, command_show)) { + return FALSE; + } + + HACCEL accel_table = LoadAccelerators( + instance, + MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP)); + + // Main message loop. + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) { + if (!TranslateAccelerator(msg.hwnd, accel_table, &msg)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return (int)msg.wParam; +} + diff --git a/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.h b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.h new file mode 100644 index 00000000..4d3bb6eb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.h @@ -0,0 +1,35 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ +#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ + +#include "resource.h" + +#endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.ico b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/crash_generation_app.ico new file mode 100644 index 0000000000000000000000000000000000000000..d551aa3aaf80adf9b7760e2eb8de95a5c3e53df6 GIT binary patch literal 23558 zcmeI430zgx+QuJHKtxbe5gbu*030B5$VyGcDGSFOalkY&2LuvC5pp(7&2XNl96=@z zNXGH2`|DO#nx)3nwUq43A>_N=+wHsYe$U#6ePmShD&p^B>2uySylbs@uYIPy&-w#c zpc-6UYC)x+ErDgUwQ8BlZ7hIURRB*7exZ#T}AXG2* z=^weGTI5~Inq#r?3QZRh5>Vvy7AqDy*^i;1p6BY7;LQSXZ{;g>M z?fm5AM!1uJ~14CP5-;mbWJGeF0 z_iurN!(6GBI54yo4h(CB{j~e(6Em$hj*V=Fqpvo{5$e#07L+U2`wvFkn8s8S#Efo= z^|!}o{tozLT1|Z7UlaSMxZ(5FgK^Rilm(Khv|vko7i5X}36?lI))Ggklas69 zVxSe$=33+10BfA^v%)uXY;b;dHGCaV4e6oPadwt1PEE7L#SjO4G`kKy33kG#^P1yK zcx(J^Ra<Ti+?95-JJvGIWK0JnTs;vs^DcXy)=jK$w z=lme~e0CM~SM61i7E+Zy6!Vv8(?YCpX|5H%3$bS21{dbq;8I96Tne>C8jm-9o*mM| z?2r~#1K&~U^BwT@ygK+I#1UDG8sIO%&iE*}A+E1$jbGNa!S(fRas9ovxba>)TBY{5 zxxo`Rq9|oIDtY0?rjE#1t!!u9+}s5>w|2#i&D55z%y+}h?JrQ>af9~O4zA^n9=Nr$ z7jEt9gPXg&@$23JxV49(y|Q~4emOiI-)H_6dH=qKoBYhlq5e+&PW_AegZf|U-_)N} z9@RJC3MS7vp?yXL1qC4>AOQaU{+Kjr5++WZhzS!Wz}MFoW5Wxo&I+1!G$zZHn#$;`!98-<yjHIyy#~ zd!^|5sm6LSF)_!K%8;V#rWzZU(N_%@(#Q5Ewg{KRHI95 zY?=LIo2D9@#Ky*zb^O>SmHu~IE44l?Dgh-;K81z)WLJ`;4wqn z_ZrZ%LmzL?wy3kD_lL%jZ@l`n*YIJJ=8o?=KVm^dc=tK8XTNSrUK1xwofb5!|4WPJ z4;&O=5uecStt8`&$o&U)@7lX>*XEsj-g|fBj_upFZrx%^n^vq{{r0M5OP8-%`Odni z4ek1_pUw~WS3(xf3w~KkBmDdVRSL~dfr0)bOf7sI@n%@?lm1=c0pd4Z&T02Hm@RH2 z)we;5{I7(S*0d0%twR;wLsA|##n-X4buN70s`TsBg@MbpxknH6!QPjfV-K~P+VA6v z_lLE?{$Xwi?eB?&gE}IlpC>|?5A<%2&;edpIl33d4IhkA?7Qcs#@NdnYWsbf({dao zjuAS*69M!eGt37G)4CyX#*2ub-V>ij1>vuo!mzs+z)KgL@b7{zHqOE48v-$!zJ3#Y zv6uJbc6$T6dQ*KU=65px!K_Y5n$a2Cr*_9zn`Ys&O+gqt+y{pT0q+l>1_JwOKM87w zj|1D|zXCjwI@=4Ewok|DRTFSw+Z#B)bq3CDnTav%mol33yacQq;D9qB?)YqOTV(8< zhO{02IO`82u>Hs|UYpK$#ksIn_%f8&v3sW=YtK}ip9y^Z1~r3H`B~I#;2iDQ=@jeE zsP;Kl_%^%|E=9QF`(^IPTIr6TH*`S`ui5^ww+}9?dJfr}dg8{OA;>xEhiiu?LYUzwb+T)8Ci=PAZtkjWKvm68X{|HBivlm3|Y&X;^sP6+GhB5eJk92w>5I2 z+$j(Ix}hC1827D>9dK(?2jp()h@8zG@!QT$$l2N%x3+e|?QJ|JOre?J8PhnJ%Ni~CLrzWB&44|iS%zyB8@if zn`DaR3m@|O^QyPhwX#dzrgIKY+OQIBHLeiIw|EP z&VT0+jvL~&)rdRJe}-vnAIJ6*Q-ZDH1N-*w-gRv2&ZLw99b3D3xO=#{xw*T!wQ+Oz@bGBcd0?|n&$#sN_2S8-lrFX#RqEa{~iIg60Iwp0)kazxeJo zgX#N&>G3k(9Zpk`k46?8yGp_NR9<~gx%0b2>EBc6h6N*s;*a0{2Wy6O#7ZA8q(u55 zXmAg#9`ZC+QBk9x#nSQpa4CKpR!sCp#>stnXRBl-)qQFW^fsryy=(Z?FI2AS<5;lV$HB*W zpm$$$hhFu3THa~z+qYL;AE$u>2QZl)2G;Ru)3f^vUAny3rOUHDp6~jct50i}CXE|6 zZPK7&qvp+?vT*b1+^M5y`wmZgdAPT0`%H^xiXL6DvWOu*60xx;u6V#Q2{0r8adCy( zEn;IuV&g28p4jI>W#CW53OF&!CsAr~RottogHM>&s@S>DKq|7h|3SD9 zqF9XiYwfgmNUJRFhY%(1o6xLY)@?;QKJMM%9Zv1};>0~2!r#}0zp0zW`xNH9UeDj( zg}=XRQtjm}{_d~Eq+;bB6m$ICmr^L!lH$^jp`^CQQOEr>=J>f^rrg)^KRssd^D)QI zeLuo|80KTp^Sb>{=X%)v)pLRSmCW&T|B@EJinpT1Tyzb%m&zPJ_g4w`z?hFg`Rd1_ z>Wj7&9jm;{DmLy1Gsn+8Vp@!PtSTNouWWh8cdz+W{M_4Sj-PwjDs;R>k4LR3_uiS~ z=YBll{weJklr8FC(aI`*?jJPA&pn00ytW2@1pNNmFr)z)}MRaMZIsT^P*Jr zd{v~ficiI=V%Fb3xlf-prc}}2|5bcSDrP-?@&@_Qn~c8Rs-)*Df-M*%`H0H+%lZ72 zvi{EGQOr#h;dxS84CWx2AwMJBn{b$~fyU%&3N}@!=X}9qDHtRuG5tUm68j-~fkG1sqOUyGmYlwPgb z2OYaS`ssnHnDzL{f$7y1HvU2ZvOsRl96y=1qRkb)O#V)fzZuy)A>;K#iJYK%{YIx)`7mahDM1B1t%cm9kaZNYkD4X_DC9qd+$8->B5TQhB} zPLpFP(T5^y$$V8IA1dTRh5V#84>?gGBg(O=3b|S#mnh^Cg)FI%vsB;THmdl^aSGW> zA@3;U9fcgEkcSj)tKX)y|CMyJ9 zWMGAisgNZVGNwZIRLI7bES?uKuA0cIN->306SAtME58p}SdPK5N}H!(y?QQ$SPR)# zEw=cH;9p8myVEOE~ZJrY}3iIg?0rP&%LTBp=}8h@I%TXv<9-xUO`%}-uWt5a*E=2Z6^)Nip$4?6}mrb=W3r9pMm{N(?%I<=0f{ZX!iK0oKQ1d^EdG#^%`N>O4Lp#&)lc_BC`N?cbBh&ou z$Ha>#mE4>Z3XbJ2L!+Nt++W%XmzCnEDKwe#1XEVN#&9kX7z*Ba>aDt~p(O7d58 ztNMbLMIj4qo}V1Gs?t)?V|bWl{j*<9L>}8bKN)V*HyMT)&Xn7jpKpqbGz6zmVk@{(S%;moMb= zg`B=PIy$QPUCF}>xq2agFXZoq+`W*w*DN`FAuBIr%G&-D!IW`F9}` zFJ#_@jJ%MQmz-@~sV+i3UdYL7B1xFE+kg*rC_sn}}eaYVo*?J*YFZ>$;!oOJ{ z{QCgB-)1FF4i?imzkPZz{4Rvr{h7I>sgUu{%LsSK%b0JUml0-1RnN;GSP!(-+jpO%JopO`B((dnpK-(&yRaUJ6F; zchnE_k$Wv1f4{oG;*T$8Vx5|ss!Wf01@yO_$nuNBLZ4Gvb)Vu6x9f7RD3t3{RPFna z@~=**zWfUs8kYPPZCSL4e)B1xT|TXnSM+U>y|{O?8%m4vtzIr_BVKg5vCP}`*3dR} z&a!{N#n>%>kU18z!$Q_q$meQ#RW3=oZ=knFmg=8&V&`qOUg~p1N&lWwnpHmPb9YW3 zw+z)kIP(xwOMAJX5{|A*v__uZdtvV;w2rOkgeCCc1i z#a5Q%Amc3IgIa3+fBIm(x&OWTs_~Un|HxNN{coH$#m{POUDev^Dy>e{FMhe1Y5iiu zZ +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "client/windows/common/ipc_protocol.h" +#include "client/windows/crash_generation/client_info.h" +#include "client/windows/crash_generation/crash_generation_client.h" +#include "client/windows/crash_generation/crash_generation_server.h" +#include "client/windows/crash_generation/minidump_generator.h" +#include "client/windows/handler/exception_handler.h" +#include "client/windows/tests/crash_generation_app/abstract_class.h" +#include "client/windows/tests/crash_generation_app/crash_generation_app.h" +#include "google_breakpad/common/minidump_format.h" + +#endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_PRECOMPILE_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/resource.h b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/resource.h new file mode 100644 index 00000000..8c7f6570 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/resource.h @@ -0,0 +1,73 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// PreCompile.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__ +#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__ + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by crash_generation_app.rc +// +#define IDC_MYICON 2 +#define IDD_CRASHGENERATIONAPP_DIALOG 102 +#define IDS_APP_TITLE 103 +#define IDD_ABOUTBOX 103 +#define IDM_ABOUT 104 +#define IDM_EXIT 105 +#define IDI_CRASHGENERATIONAPP 107 +#define IDI_SMALL 108 +#define IDC_CRASHGENERATIONAPP 109 +#define IDR_MAINFRAME 128 +#define ID_SERVER_START 32771 +#define ID_SERVER_STOP 32772 +#define ID_CLIENT_INVALIDPARAM 32773 +#define ID_CLIENT_ASSERTFAILURE 32774 +#define ID_CLIENT_DEREFZERO 32775 +#define ID_CLIENT_PURECALL 32777 +#define ID_CLIENT_REQUESTEXPLICITDUMP 32778 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 129 +#define _APS_NEXT_COMMAND_VALUE 32780 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 110 +#endif +#endif + +#endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__ diff --git a/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/small.ico b/thirdparty/google-breakpad/r318/src/client/windows/tests/crash_generation_app/small.ico new file mode 100644 index 0000000000000000000000000000000000000000..d551aa3aaf80adf9b7760e2eb8de95a5c3e53df6 GIT binary patch literal 23558 zcmeI430zgx+QuJHKtxbe5gbu*030B5$VyGcDGSFOalkY&2LuvC5pp(7&2XNl96=@z zNXGH2`|DO#nx)3nwUq43A>_N=+wHsYe$U#6ePmShD&p^B>2uySylbs@uYIPy&-w#c zpc-6UYC)x+ErDgUwQ8BlZ7hIURRB*7exZ#T}AXG2* z=^weGTI5~Inq#r?3QZRh5>Vvy7AqDy*^i;1p6BY7;LQSXZ{;g>M z?fm5AM!1uJ~14CP5-;mbWJGeF0 z_iurN!(6GBI54yo4h(CB{j~e(6Em$hj*V=Fqpvo{5$e#07L+U2`wvFkn8s8S#Efo= z^|!}o{tozLT1|Z7UlaSMxZ(5FgK^Rilm(Khv|vko7i5X}36?lI))Ggklas69 zVxSe$=33+10BfA^v%)uXY;b;dHGCaV4e6oPadwt1PEE7L#SjO4G`kKy33kG#^P1yK zcx(J^Ra<Ti+?95-JJvGIWK0JnTs;vs^DcXy)=jK$w z=lme~e0CM~SM61i7E+Zy6!Vv8(?YCpX|5H%3$bS21{dbq;8I96Tne>C8jm-9o*mM| z?2r~#1K&~U^BwT@ygK+I#1UDG8sIO%&iE*}A+E1$jbGNa!S(fRas9ovxba>)TBY{5 zxxo`Rq9|oIDtY0?rjE#1t!!u9+}s5>w|2#i&D55z%y+}h?JrQ>af9~O4zA^n9=Nr$ z7jEt9gPXg&@$23JxV49(y|Q~4emOiI-)H_6dH=qKoBYhlq5e+&PW_AegZf|U-_)N} z9@RJC3MS7vp?yXL1qC4>AOQaU{+Kjr5++WZhzS!Wz}MFoW5Wxo&I+1!G$zZHn#$;`!98-<yjHIyy#~ zd!^|5sm6LSF)_!K%8;V#rWzZU(N_%@(#Q5Ewg{KRHI95 zY?=LIo2D9@#Ky*zb^O>SmHu~IE44l?Dgh-;K81z)WLJ`;4wqn z_ZrZ%LmzL?wy3kD_lL%jZ@l`n*YIJJ=8o?=KVm^dc=tK8XTNSrUK1xwofb5!|4WPJ z4;&O=5uecStt8`&$o&U)@7lX>*XEsj-g|fBj_upFZrx%^n^vq{{r0M5OP8-%`Odni z4ek1_pUw~WS3(xf3w~KkBmDdVRSL~dfr0)bOf7sI@n%@?lm1=c0pd4Z&T02Hm@RH2 z)we;5{I7(S*0d0%twR;wLsA|##n-X4buN70s`TsBg@MbpxknH6!QPjfV-K~P+VA6v z_lLE?{$Xwi?eB?&gE}IlpC>|?5A<%2&;edpIl33d4IhkA?7Qcs#@NdnYWsbf({dao zjuAS*69M!eGt37G)4CyX#*2ub-V>ij1>vuo!mzs+z)KgL@b7{zHqOE48v-$!zJ3#Y zv6uJbc6$T6dQ*KU=65px!K_Y5n$a2Cr*_9zn`Ys&O+gqt+y{pT0q+l>1_JwOKM87w zj|1D|zXCjwI@=4Ewok|DRTFSw+Z#B)bq3CDnTav%mol33yacQq;D9qB?)YqOTV(8< zhO{02IO`82u>Hs|UYpK$#ksIn_%f8&v3sW=YtK}ip9y^Z1~r3H`B~I#;2iDQ=@jeE zsP;Kl_%^%|E=9QF`(^IPTIr6TH*`S`ui5^ww+}9?dJfr}dg8{OA;>xEhiiu?LYUzwb+T)8Ci=PAZtkjWKvm68X{|HBivlm3|Y&X;^sP6+GhB5eJk92w>5I2 z+$j(Ix}hC1827D>9dK(?2jp()h@8zG@!QT$$l2N%x3+e|?QJ|JOre?J8PhnJ%Ni~CLrzWB&44|iS%zyB8@if zn`DaR3m@|O^QyPhwX#dzrgIKY+OQIBHLeiIw|EP z&VT0+jvL~&)rdRJe}-vnAIJ6*Q-ZDH1N-*w-gRv2&ZLw99b3D3xO=#{xw*T!wQ+Oz@bGBcd0?|n&$#sN_2S8-lrFX#RqEa{~iIg60Iwp0)kazxeJo zgX#N&>G3k(9Zpk`k46?8yGp_NR9<~gx%0b2>EBc6h6N*s;*a0{2Wy6O#7ZA8q(u55 zXmAg#9`ZC+QBk9x#nSQpa4CKpR!sCp#>stnXRBl-)qQFW^fsryy=(Z?FI2AS<5;lV$HB*W zpm$$$hhFu3THa~z+qYL;AE$u>2QZl)2G;Ru)3f^vUAny3rOUHDp6~jct50i}CXE|6 zZPK7&qvp+?vT*b1+^M5y`wmZgdAPT0`%H^xiXL6DvWOu*60xx;u6V#Q2{0r8adCy( zEn;IuV&g28p4jI>W#CW53OF&!CsAr~RottogHM>&s@S>DKq|7h|3SD9 zqF9XiYwfgmNUJRFhY%(1o6xLY)@?;QKJMM%9Zv1};>0~2!r#}0zp0zW`xNH9UeDj( zg}=XRQtjm}{_d~Eq+;bB6m$ICmr^L!lH$^jp`^CQQOEr>=J>f^rrg)^KRssd^D)QI zeLuo|80KTp^Sb>{=X%)v)pLRSmCW&T|B@EJinpT1Tyzb%m&zPJ_g4w`z?hFg`Rd1_ z>Wj7&9jm;{DmLy1Gsn+8Vp@!PtSTNouWWh8cdz+W{M_4Sj-PwjDs;R>k4LR3_uiS~ z=YBll{weJklr8FC(aI`*?jJPA&pn00ytW2@1pNNmFr)z)}MRaMZIsT^P*Jr zd{v~ficiI=V%Fb3xlf-prc}}2|5bcSDrP-?@&@_Qn~c8Rs-)*Df-M*%`H0H+%lZ72 zvi{EGQOr#h;dxS84CWx2AwMJBn{b$~fyU%&3N}@!=X}9qDHtRuG5tUm68j-~fkG1sqOUyGmYlwPgb z2OYaS`ssnHnDzL{f$7y1HvU2ZvOsRl96y=1qRkb)O#V)fzZuy)A>;K#iJYK%{YIx)`7mahDM1B1t%cm9kaZNYkD4X_DC9qd+$8->B5TQhB} zPLpFP(T5^y$$V8IA1dTRh5V#84>?gGBg(O=3b|S#mnh^Cg)FI%vsB;THmdl^aSGW> zA@3;U9fcgEkcSj)tKX)y|CMyJ9 zWMGAisgNZVGNwZIRLI7bES?uKuA0cIN->306SAtME58p}SdPK5N}H!(y?QQ$SPR)# zEw=cH;9p8myVEOE~ZJrY}3iIg?0rP&%LTBp=}8h@I%TXv<9-xUO`%}-uWt5a*E=2Z6^)Nip$4?6}mrb=W3r9pMm{N(?%I<=0f{ZX!iK0oKQ1d^EdG#^%`N>O4Lp#&)lc_BC`N?cbBh&ou z$Ha>#mE4>Z3XbJ2L!+Nt++W%XmzCnEDKwe#1XEVN#&9kX7z*Ba>aDt~p(O7d58 ztNMbLMIj4qo}V1Gs?t)?V|bWl{j*<9L>}8bKN)V*HyMT)&Xn7jpKpqbGz6zmVk@{(S%;moMb= zg`B=PIy$QPUCF}>xq2agFXZoq+`W*w*DN`FAuBIr%G&-D!IW`F9}` zFJ#_@jJ%MQmz-@~sV+i3UdYL7B1xFE+kg*rC_sn}}eaYVo*?J*YFZ>$;!oOJ{ z{QCgB-)1FF4i?imzkPZz{4Rvr{h7I>sgUu{%LsSK%b0JUml0-1RnN;GSP!(-+jpO%JopO`B((dnpK-(&yRaUJ6F; zchnE_k$Wv1f4{oG;*T$8Vx5|ss!Wf01@yO_$nuNBLZ4Gvb)Vu6x9f7RD3t3{RPFna z@~=**zWfUs8kYPPZCSL4e)B1xT|TXnSM+U>y|{O?8%m4vtzIr_BVKg5vCP}`*3dR} z&a!{N#n>%>kU18z!$Q_q$meQ#RW3=oZ=knFmg=8&V&`qOUg~p1N&lWwnpHmPb9YW3 zw+z)kIP(xwOMAJX5{|A*v__uZdtvV;w2rOkgeCCc1i z#a5Q%Amc3IgIa3+fBIm(x&OWTs_~Un|HxNN{coH$#m{POUDev^Dy>e{FMhe1Y5iiu zZ +#endif + +static const int halfShift = 10; /* used for shifting by 10 bits */ + +static const UTF32 halfBase = 0x0010000UL; +static const UTF32 halfMask = 0x3FFUL; + +#define UNI_SUR_HIGH_START (UTF32)0xD800 +#define UNI_SUR_HIGH_END (UTF32)0xDBFF +#define UNI_SUR_LOW_START (UTF32)0xDC00 +#define UNI_SUR_LOW_END (UTF32)0xDFFF +#define false 0 +#define true 1 + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF32* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + if (target >= targetEnd) { + result = targetExhausted; break; + } + ch = *source++; + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = (UTF16)ch; /* normal case */ + } + } else if (ch > UNI_MAX_LEGAL_UTF32) { + if (flags == strictConversion) { + result = sourceIllegal; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + --source; /* Back up source pointer! */ + result = targetExhausted; break; + } + ch -= halfBase; + *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); + } + } +*sourceStart = source; +*targetStart = target; +return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF16* source = *sourceStart; + UTF32* target = *targetStart; + UTF32 ch, ch2; + while (source < sourceEnd) { + const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { + /* If the 16 bits following the high surrogate are in the source buffer... */ + if (source < sourceEnd) { + ch2 = *source; + /* If it's a low surrogate, convert to UTF32. */ + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else { /* We don't have the 16 bits following the high surrogate. */ + --source; /* return to the high surrogate */ + result = sourceExhausted; + break; + } + } else if (flags == strictConversion) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + if (target >= targetEnd) { + source = oldSource; /* Back up source pointer! */ + result = targetExhausted; break; + } + *target++ = ch; + } + *sourceStart = source; + *targetStart = target; +#ifdef CVTUTF_DEBUG + if (result == sourceIllegal) { + fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2); + fflush(stderr); + } +#endif + return result; +} + +/* --------------------------------------------------------------------- */ + +/* + * Index into the table below with the first byte of a UTF-8 sequence to + * get the number of trailing bytes that are supposed to follow it. + * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is + * left as-is for anyone who may want to do such conversion, which was + * allowed in earlier algorithms. + */ +static const char trailingBytesForUTF8[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 +}; + +/* + * Magic values subtracted from a buffer value during UTF8 conversion. + * This table contains as many values as there might be trailing bytes + * in a UTF-8 sequence. + */ +static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, + 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; + +/* + * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed + * into the first byte, depending on how many bytes follow. There are + * as many entries in this table as there are UTF-8 sequence types. + * (I.e., one byte sequence, two byte... etc.). Remember that sequencs + * for *legal* UTF-8 will be 4 or fewer bytes total. + */ +static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + +/* --------------------------------------------------------------------- */ + +/* The interface converts a whole buffer to avoid function-call overhead. +* Constants have been gathered. Loops & conditionals have been removed as +* much as possible for efficiency, in favor of drop-through switches. +* (See "Note A" at the bottom of the file for equivalent code.) +* If your compiler supports it, the "isLegalUTF8" call can be turned +* into an inline function. +*/ + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF16* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { + /* If the 16 bits following the high surrogate are in the source buffer... */ + if (source < sourceEnd) { + UTF32 ch2 = *source; + /* If it's a low surrogate, convert to UTF32. */ + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else { /* We don't have the 16 bits following the high surrogate. */ + --source; /* return to the high surrogate */ + result = sourceExhausted; + break; + } + } else if (flags == strictConversion) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* Figure out how many bytes the result will require */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch < (UTF32)0x110000) { bytesToWrite = 4; + } else { bytesToWrite = 3; + ch = UNI_REPLACEMENT_CHAR; + } + + target += bytesToWrite; + if (target > targetEnd) { + source = oldSource; /* Back up source pointer! */ + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } +*sourceStart = source; +*targetStart = target; +return result; +} + +/* --------------------------------------------------------------------- */ + +/* + * Utility routine to tell whether a sequence of bytes is legal UTF-8. + * This must be called with the length pre-determined by the first byte. + * If not calling this from ConvertUTF8to*, then the length can be set by: + * length = trailingBytesForUTF8[*source]+1; + * and the sequence is illegal right away if there aren't that many bytes + * available. + * If presented with a length > 4, this returns false. The Unicode + * definition of UTF-8 goes up to 4-byte sequences. + */ + +static Boolean isLegalUTF8(const UTF8 *source, int length) { + UTF8 a; + const UTF8 *srcptr = source+length; + switch (length) { + default: return false; + /* Everything else falls through when "true"... */ + case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; + case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; + case 2: if ((a = (*--srcptr)) > 0xBF) return false; + + switch (*source) { + /* no fall-through in this inner switch */ + case 0xE0: if (a < 0xA0) return false; break; + case 0xED: if (a > 0x9F) return false; break; + case 0xF0: if (a < 0x90) return false; break; + case 0xF4: if (a > 0x8F) return false; break; + default: if (a < 0x80) return false; + } + + case 1: if (*source >= 0x80 && *source < 0xC2) return false; + } + if (*source > 0xF4) return false; + return true; +} + +/* --------------------------------------------------------------------- */ + +/* + * Exported function to return whether a UTF-8 sequence is legal or not. + * This is not used here; it's just exported. + */ +Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { + int length = trailingBytesForUTF8[*source]+1; + if (source+length > sourceEnd) { + return false; + } + return isLegalUTF8(source, length); +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF8* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! isLegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ + case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ + case 3: ch += *source++; ch <<= 6; + case 2: ch += *source++; ch <<= 6; + case 1: ch += *source++; ch <<= 6; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up source pointer! */ + result = targetExhausted; break; + } + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + source -= (extraBytesToRead+1); /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = (UTF16)ch; /* normal case */ + } + } else if (ch > UNI_MAX_UTF16) { + if (flags == strictConversion) { + result = sourceIllegal; + source -= (extraBytesToRead+1); /* return to the start */ + break; /* Bail out; shouldn't continue */ + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up source pointer! */ + result = targetExhausted; break; + } + ch -= halfBase; + *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); + } + } +*sourceStart = source; +*targetStart = target; +return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF32* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + ch = *source++; + if (flags == strictConversion ) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* + * Figure out how many bytes the result will require. Turn any + * illegally large UTF32 things (> Plane 17) into replacement chars. + */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; + } else { bytesToWrite = 3; + ch = UNI_REPLACEMENT_CHAR; + result = sourceIllegal; + } + + target += bytesToWrite; + if (target > targetEnd) { + --source; /* Back up source pointer! */ + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } +*sourceStart = source; +*targetStart = target; +return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF8* source = *sourceStart; + UTF32* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! isLegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 5: ch += *source++; ch <<= 6; + case 4: ch += *source++; ch <<= 6; + case 3: ch += *source++; ch <<= 6; + case 2: ch += *source++; ch <<= 6; + case 1: ch += *source++; ch <<= 6; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up the source pointer! */ + result = targetExhausted; break; + } + if (ch <= UNI_MAX_LEGAL_UTF32) { + /* + * UTF-16 surrogate values are illegal in UTF-32, and anything + * over Plane 17 (> 0x10FFFF) is illegal. + */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + source -= (extraBytesToRead+1); /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = ch; + } + } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */ + result = sourceIllegal; + *target++ = UNI_REPLACEMENT_CHAR; + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- + +Note A. +The fall-through switches in UTF-8 reading code save a +temp variable, some decrements & conditionals. The switches +are equivalent to the following loop: +{ + int tmpBytesToRead = extraBytesToRead+1; + do { + ch += *source++; + --tmpBytesToRead; + if (tmpBytesToRead) ch <<= 6; + } while (tmpBytesToRead > 0); +} +In UTF-8 writing code, the switches on "bytesToWrite" are +similarly unrolled loops. + +--------------------------------------------------------------------- */ diff --git a/thirdparty/google-breakpad/r318/src/common/convert_UTF.h b/thirdparty/google-breakpad/r318/src/common/convert_UTF.h new file mode 100644 index 00000000..b1556de8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/convert_UTF.h @@ -0,0 +1,143 @@ +/* + * Copyright 2001-2004 Unicode, Inc. + * + * Disclaimer + * + * This source code is provided as is by Unicode, Inc. No claims are + * made as to fitness for any particular purpose. No warranties of any + * kind are expressed or implied. The recipient agrees to determine + * applicability of information provided. If this file has been + * purchased on magnetic or optical media from Unicode, Inc., the + * sole remedy for any claim will be exchange of defective media + * within 90 days of receipt. + * + * Limitations on Rights to Redistribute This Code + * + * Unicode, Inc. hereby grants the right to freely use the information + * supplied in this file in the creation of products supporting the + * Unicode Standard, and to make copies of this file in any form + * for internal or external distribution as long as this notice + * remains attached. + */ + +/* --------------------------------------------------------------------- + +Conversions between UTF32, UTF-16, and UTF-8. Header file. + +Several funtions are included here, forming a complete set of +conversions between the three formats. UTF-7 is not included +here, but is handled in a separate source file. + +Each of these routines takes pointers to input buffers and output +buffers. The input buffers are const. + +Each routine converts the text between *sourceStart and sourceEnd, +putting the result into the buffer between *targetStart and +targetEnd. Note: the end pointers are *after* the last item: e.g. +*(sourceEnd - 1) is the last item. + +The return result indicates whether the conversion was successful, +and if not, whether the problem was in the source or target buffers. +(Only the first encountered problem is indicated.) + +After the conversion, *sourceStart and *targetStart are both +updated to point to the end of last text successfully converted in +the respective buffers. + +Input parameters: +sourceStart - pointer to a pointer to the source buffer. +The contents of this are modified on return so that +it points at the next thing to be converted. +targetStart - similarly, pointer to pointer to the target buffer. +sourceEnd, targetEnd - respectively pointers to the ends of the +two buffers, for overflow checking only. + +These conversion functions take a ConversionFlags argument. When this +flag is set to strict, both irregular sequences and isolated surrogates +will cause an error. When the flag is set to lenient, both irregular +sequences and isolated surrogates are converted. + +Whether the flag is strict or lenient, all illegal sequences will cause +an error return. This includes sequences such as: , , +or in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code +must check for illegal sequences. + +When the flag is set to lenient, characters over 0x10FFFF are converted +to the replacement character; otherwise (when the flag is set to strict) +they constitute an error. + +Output parameters: +The value "sourceIllegal" is returned from some routines if the input +sequence is malformed. When "sourceIllegal" is returned, the source +value will point to the illegal value that caused the problem. E.g., +in UTF-8 when a sequence is malformed, it points to the start of the +malformed sequence. + +Author: Mark E. Davis, 1994. +Rev History: Rick McGowan, fixes & updates May 2001. +Fixes & updates, Sept 2001. + +------------------------------------------------------------------------ */ + +/* --------------------------------------------------------------------- +The following 4 definitions are compiler-specific. +The C standard does not guarantee that wchar_t has at least +16 bits, so wchar_t is no less portable than unsigned short! +All should be unsigned values to avoid sign extension during +bit mask & shift operations. +------------------------------------------------------------------------ */ + +typedef unsigned long UTF32; /* at least 32 bits */ +typedef unsigned short UTF16; /* at least 16 bits */ +typedef unsigned char UTF8; /* typically 8 bits */ +typedef unsigned char Boolean; /* 0 or 1 */ + +/* Some fundamental constants */ +#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD +#define UNI_MAX_BMP (UTF32)0x0000FFFF +#define UNI_MAX_UTF16 (UTF32)0x0010FFFF +#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF +#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF + +typedef enum { + conversionOK, /* conversion successful */ + sourceExhausted, /* partial character in source, but hit end */ + targetExhausted, /* insuff. room in target for conversion */ + sourceIllegal /* source sequence is illegal/malformed */ +} ConversionResult; + +typedef enum { + strictConversion = 0, + lenientConversion +} ConversionFlags; + +/* This is for C++ and does no harm in C */ +#ifdef __cplusplus +extern "C" { +#endif + +ConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); + +#ifdef __cplusplus +} +#endif + +/* --------------------------------------------------------------------- */ diff --git a/thirdparty/google-breakpad/r318/src/common/linux/dump_symbols.cc b/thirdparty/google-breakpad/r318/src/common/linux/dump_symbols.cc new file mode 100644 index 00000000..aff0d792 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/linux/dump_symbols.cc @@ -0,0 +1,781 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "common/linux/dump_symbols.h" +#include "common/linux/file_id.h" +#include "common/linux/guid_creator.h" +#include "processor/scoped_ptr.h" + +// This namespace contains helper functions. +namespace { + +// Infomation of a line. +struct LineInfo { + // The index into string table for the name of the source file which + // this line belongs to. + // Load from stab symbol. + uint32_t source_name_index; + // Offset from start of the function. + // Load from stab symbol. + ElfW(Off) rva_to_func; + // Offset from base of the loading binary. + ElfW(Off) rva_to_base; + // Size of the line. + // It is the difference of the starting address of the line and starting + // address of the next N_SLINE, N_FUN or N_SO. + uint32_t size; + // Line number. + uint32_t line_num; + // Id of the source file for this line. + int source_id; +}; + +typedef std::list LineInfoList; + +// Information of a function. +struct FuncInfo { + // Name of the function. + const char *name; + // Offset from the base of the loading address. + ElfW(Off) rva_to_base; + // Virtual address of the function. + // Load from stab symbol. + ElfW(Addr) addr; + // Size of the function. + // It is the difference of the starting address of the function and starting + // address of the next N_FUN or N_SO. + uint32_t size; + // Total size of stack parameters. + uint32_t stack_param_size; + // Is there any lines included from other files? + bool has_sol; + // Line information array. + LineInfoList line_info; +}; + +typedef std::list FuncInfoList; + +// Information of a source file. +struct SourceFileInfo { + // Name string index into the string table. + uint32_t name_index; + // Name of the source file. + const char *name; + // Starting address of the source file. + ElfW(Addr) addr; + // Id of the source file. + int source_id; + // Functions information. + FuncInfoList func_info; +}; + +typedef std::list SourceFileInfoList; + +// Information of a symbol table. +// This is the root of all types of symbol. +struct SymbolInfo { + SourceFileInfoList source_file_info; + + // The next source id for newly found source file. + int next_source_id; +}; + +// Stab section name. +static const char *kStabName = ".stab"; + +// Demangle using abi call. +// Older GCC may not support it. +static std::string Demangle(const char *mangled) { + int status = 0; + char *demangled = abi::__cxa_demangle(mangled, NULL, NULL, &status); + if (status == 0 && demangled != NULL) { + std::string str(demangled); + free(demangled); + return str; + } + return std::string(mangled); +} + +// Fix offset into virtual address by adding the mapped base into offsets. +// Make life easier when want to find something by offset. +static void FixAddress(void *obj_base) { + ElfW(Word) base = reinterpret_cast(obj_base); + ElfW(Ehdr) *elf_header = static_cast(obj_base); + elf_header->e_phoff += base; + elf_header->e_shoff += base; + ElfW(Shdr) *sections = reinterpret_cast(elf_header->e_shoff); + for (int i = 0; i < elf_header->e_shnum; ++i) + sections[i].sh_offset += base; +} + +// Find the prefered loading address of the binary. +static ElfW(Addr) GetLoadingAddress(const ElfW(Phdr) *program_headers, + int nheader) { + for (int i = 0; i < nheader; ++i) { + const ElfW(Phdr) &header = program_headers[i]; + // For executable, it is the PT_LOAD segment with offset to zero. + if (header.p_type == PT_LOAD && + header.p_offset == 0) + return header.p_vaddr; + } + // For other types of ELF, return 0. + return 0; +} + +static bool WriteFormat(int fd, const char *fmt, ...) { + va_list list; + char buffer[4096]; + ssize_t expected, written; + va_start(list, fmt); + vsnprintf(buffer, sizeof(buffer), fmt, list); + expected = strlen(buffer); + written = write(fd, buffer, strlen(buffer)); + va_end(list); + return expected == written; +} + +static bool IsValidElf(const ElfW(Ehdr) *elf_header) { + return memcmp(elf_header, ELFMAG, SELFMAG) == 0; +} + +static const ElfW(Shdr) *FindSectionByName(const char *name, + const ElfW(Shdr) *sections, + const ElfW(Shdr) *strtab, + int nsection) { + assert(name != NULL); + assert(sections != NULL); + assert(nsection > 0); + + int name_len = strlen(name); + if (name_len == 0) + return NULL; + + for (int i = 0; i < nsection; ++i) { + const char *section_name = + (char*)(strtab->sh_offset + sections[i].sh_name); + if (!strncmp(name, section_name, name_len)) + return sections + i; + } + return NULL; +} + +// TODO(liuli): Computer the stack parameter size. +// Expect parameter variables are immediately following the N_FUN symbol. +// Will need to parse the type information to get a correct size. +static int LoadStackParamSize(struct nlist *list, + struct nlist *list_end, + struct FuncInfo *func_info) { + struct nlist *cur_list = list; + assert(cur_list->n_type == N_FUN); + ++cur_list; + int step = 1; + while (cur_list < list_end && cur_list->n_type == N_PSYM) { + ++cur_list; + ++step; + } + func_info->stack_param_size = 0; + return step; +} + +static int LoadLineInfo(struct nlist *list, + struct nlist *list_end, + const struct SourceFileInfo &source_file_info, + struct FuncInfo *func_info) { + struct nlist *cur_list = list; + func_info->has_sol = false; + // Records which source file the following lines belongs. Default + // to the file we are handling. This helps us handling inlined source. + // When encountering N_SOL, we will change this to the source file + // specified by N_SOL. + int current_source_name_index = source_file_info.name_index; + do { + // Skip non line information. + while (cur_list < list_end && cur_list->n_type != N_SLINE) { + // Only exit when got another function, or source file. + if (cur_list->n_type == N_FUN || cur_list->n_type == N_SO) + return cur_list - list; + // N_SOL means source lines following it will be from + // another source file. + if (cur_list->n_type == N_SOL) { + func_info->has_sol = true; + + if (cur_list->n_un.n_strx > 0 && + cur_list->n_un.n_strx != current_source_name_index) { + // The following lines will be from this source file. + current_source_name_index = cur_list->n_un.n_strx; + } + } + ++cur_list; + } + struct LineInfo line; + while (cur_list < list_end && cur_list->n_type == N_SLINE) { + line.source_name_index = current_source_name_index; + line.rva_to_func = cur_list->n_value; + // n_desc is a signed short + line.line_num = (unsigned short)cur_list->n_desc; + // Don't set it here. + // Will be processed in later pass. + line.source_id = -1; + func_info->line_info.push_back(line); + ++cur_list; + } + } while (list < list_end); + + return cur_list - list; +} + +static int LoadFuncSymbols(struct nlist *list, + struct nlist *list_end, + const ElfW(Shdr) *stabstr_section, + struct SourceFileInfo *source_file_info) { + struct nlist *cur_list = list; + assert(cur_list->n_type == N_SO); + ++cur_list; + source_file_info->func_info.clear(); + while (cur_list < list_end) { + // Go until the function symbol. + while (cur_list < list_end && cur_list->n_type != N_FUN) { + if (cur_list->n_type == N_SO) { + return cur_list - list; + } + ++cur_list; + continue; + } + if (cur_list->n_type == N_FUN) { + struct FuncInfo func_info; + func_info.name = + reinterpret_cast(cur_list->n_un.n_strx + + stabstr_section->sh_offset); + func_info.addr = cur_list->n_value; + func_info.rva_to_base = 0; + func_info.size = 0; + func_info.stack_param_size = 0; + func_info.has_sol = 0; + + // Stack parameter size. + cur_list += LoadStackParamSize(cur_list, list_end, &func_info); + // Line info. + cur_list += LoadLineInfo(cur_list, + list_end, + *source_file_info, + &func_info); + + // Functions in this module should have address bigger than the module + // startring address. + // There maybe a lot of duplicated entry for a function in the symbol, + // only one of them can met this. + if (func_info.addr >= source_file_info->addr) { + source_file_info->func_info.push_back(func_info); + } + } + } + return cur_list - list; +} + +// Comapre the address. +// The argument should have a memeber named "addr" +template +static bool CompareAddress(T1 *a, T2 *b) { + return a->addr < b->addr; +} + +// Sort the array into increasing ordered array based on the virtual address. +// Return vector of pointers to the elements in the incoming array. So caller +// should make sure the returned vector lives longer than the incoming vector. +template +static std::vector SortByAddress( + Container *container) { + typedef typename Container::iterator It; + typedef typename Container::value_type T; + std::vector sorted_array_ptr; + sorted_array_ptr.reserve(container->size()); + for (It it = container->begin(); it != container->end(); it++) + sorted_array_ptr.push_back(&(*it)); + std::sort(sorted_array_ptr.begin(), + sorted_array_ptr.end(), + std::ptr_fun(CompareAddress)); + + return sorted_array_ptr; +} + +// Find the address of the next function or source file symbol in the symbol +// table. The address should be bigger than the current function's address. +static ElfW(Addr) NextAddress( + std::vector *sorted_functions, + std::vector *sorted_files, + const struct FuncInfo &func_info) { + std::vector::iterator next_func_iter = + std::find_if(sorted_functions->begin(), + sorted_functions->end(), + std::bind1st( + std::ptr_fun( + CompareAddress + ), + &func_info) + ); + if (next_func_iter != sorted_functions->end()) + return (*next_func_iter)->addr; + + std::vector::iterator next_file_iter = + std::find_if(sorted_files->begin(), + sorted_files->end(), + std::bind1st( + std::ptr_fun( + CompareAddress + ), + &func_info) + ); + if (next_file_iter != sorted_files->end()) { + return (*next_file_iter)->addr; + } + return 0; +} + +static int FindFileByNameIdx(uint32_t name_index, + SourceFileInfoList &files) { + for (SourceFileInfoList::iterator it = files.begin(); + it != files.end(); it++) { + if (it->name_index == name_index) + return it->source_id; + } + + return -1; +} + +// Add included file information. +// Also fix the source id for the line info. +static void AddIncludedFiles(struct SymbolInfo *symbols, + const ElfW(Shdr) *stabstr_section) { + for (SourceFileInfoList::iterator source_file_it = + symbols->source_file_info.begin(); + source_file_it != symbols->source_file_info.end(); + ++source_file_it) { + struct SourceFileInfo &source_file = *source_file_it; + + for (FuncInfoList::iterator func_info_it = source_file.func_info.begin(); + func_info_it != source_file.func_info.end(); + ++func_info_it) { + struct FuncInfo &func_info = *func_info_it; + + for (LineInfoList::iterator line_info_it = func_info.line_info.begin(); + line_info_it != func_info.line_info.end(); ++line_info_it) { + struct LineInfo &line_info = *line_info_it; + + assert(line_info.source_name_index > 0); + assert(source_file.name_index > 0); + + // Check if the line belongs to the source file by comparing the + // name index into string table. + if (line_info.source_name_index != source_file.name_index) { + // This line is not from the current source file, check if this + // source file has been added before. + int found_source_id = FindFileByNameIdx(line_info.source_name_index, + symbols->source_file_info); + if (found_source_id < 0) { + // Got a new included file. + // Those included files don't have address or line information. + SourceFileInfo new_file; + new_file.name_index = line_info.source_name_index; + new_file.name = reinterpret_cast(new_file.name_index + + stabstr_section->sh_offset); + new_file.addr = 0; + new_file.source_id = symbols->next_source_id++; + line_info.source_id = new_file.source_id; + symbols->source_file_info.push_back(new_file); + } else { + // The file has been added. + line_info.source_id = found_source_id; + } + } else { + // The line belongs to the file. + line_info.source_id = source_file.source_id; + } + } // for each line. + } // for each function. + } // for each source file. + +} + +// Compute size and rva information based on symbols loaded from stab section. +static bool ComputeSizeAndRVA(ElfW(Addr) loading_addr, + struct SymbolInfo *symbols) { + std::vector sorted_files = + SortByAddress(&(symbols->source_file_info)); + for (size_t i = 0; i < sorted_files.size(); ++i) { + struct SourceFileInfo &source_file = *sorted_files[i]; + std::vector sorted_functions = + SortByAddress(&(source_file.func_info)); + for (size_t j = 0; j < sorted_functions.size(); ++j) { + struct FuncInfo &func_info = *sorted_functions[j]; + assert(func_info.addr >= loading_addr); + func_info.rva_to_base = func_info.addr - loading_addr; + func_info.size = 0; + ElfW(Addr) next_addr = NextAddress(&sorted_functions, + &sorted_files, + func_info); + // I've noticed functions with an address bigger than any other functions + // and source files modules, this is probably the last function in the + // module, due to limitions of Linux stab symbol, it is impossible to get + // the exact size of this kind of function, thus we give it a default + // very big value. This should be safe since this is the last function. + // But it is a ugly hack..... + // The following code can reproduce the case: + // template + // void Foo(T value) { + // } + // + // int main(void) { + // Foo(10); + // Foo(std::string("hello")); + // return 0; + // } + // TODO(liuli): Find a better solution. + static const int kDefaultSize = 0x10000000; + static int no_next_addr_count = 0; + if (next_addr != 0) { + func_info.size = next_addr - func_info.addr; + } else { + if (no_next_addr_count > 1) { + fprintf(stderr, "Got more than one funtion without the \ + following symbol. Igore this function.\n"); + fprintf(stderr, "The dumped symbol may not correct.\n"); + assert(!"This should not happen!\n"); + func_info.size = 0; + continue; + } + + no_next_addr_count++; + func_info.size = kDefaultSize; + } + // Compute line size. + for (LineInfoList::iterator line_info_it = func_info.line_info.begin(); + line_info_it != func_info.line_info.end(); line_info_it++) { + struct LineInfo &line_info = *line_info_it; + LineInfoList::iterator next_line_info_it = line_info_it; + next_line_info_it++; + line_info.size = 0; + if (next_line_info_it != func_info.line_info.end()) { + line_info.size = + next_line_info_it->rva_to_func - line_info.rva_to_func; + } else { + // The last line in the function. + // If we can find a function or source file symbol immediately + // following the line, we can get the size of the line by computing + // the difference of the next address to the starting address of this + // line. + // Otherwise, we need to set a default big enough value. This occurs + // mostly because the this function is the last one in the module. + if (next_addr != 0) { + ElfW(Off) next_addr_offset = next_addr - func_info.addr; + line_info.size = next_addr_offset - line_info.rva_to_func; + } else { + line_info.size = kDefaultSize; + } + } + line_info.rva_to_base = line_info.rva_to_func + func_info.rva_to_base; + } // for each line. + } // for each function. + } // for each source file. + return true; +} + +static bool LoadSymbols(const ElfW(Shdr) *stab_section, + const ElfW(Shdr) *stabstr_section, + ElfW(Addr) loading_addr, + struct SymbolInfo *symbols) { + if (stab_section == NULL || stabstr_section == NULL) + return false; + + struct nlist *lists = + reinterpret_cast(stab_section->sh_offset); + int nstab = stab_section->sh_size / sizeof(struct nlist); + // First pass, load all symbols from the object file. + for (int i = 0; i < nstab; ) { + int step = 1; + struct nlist *cur_list = lists + i; + if (cur_list->n_type == N_SO) { + // FUNC
      + struct SourceFileInfo source_file_info; + source_file_info.name_index = cur_list->n_un.n_strx; + source_file_info.name = reinterpret_cast(cur_list->n_un.n_strx + + stabstr_section->sh_offset); + source_file_info.addr = cur_list->n_value; + if (strchr(source_file_info.name, '.')) + source_file_info.source_id = symbols->next_source_id++; + else + source_file_info.source_id = -1; + step = LoadFuncSymbols(cur_list, lists + nstab, + stabstr_section, &source_file_info); + symbols->source_file_info.push_back(source_file_info); + } + i += step; + } + + // Second pass, compute the size of functions and lines. + if (ComputeSizeAndRVA(loading_addr, symbols)) { + // Third pass, check for included source code, especially for header files. + // Until now, we only have compiling unit information, but they can + // have code from include files, add them here. + AddIncludedFiles(symbols, stabstr_section); + return true; + } + return false; +} + +static bool LoadSymbols(ElfW(Ehdr) *elf_header, struct SymbolInfo *symbols) { + // Translate all offsets in section headers into address. + FixAddress(elf_header); + ElfW(Addr) loading_addr = GetLoadingAddress( + reinterpret_cast(elf_header->e_phoff), + elf_header->e_phnum); + + const ElfW(Shdr) *sections = + reinterpret_cast(elf_header->e_shoff); + const ElfW(Shdr) *strtab = sections + elf_header->e_shstrndx; + const ElfW(Shdr) *stab_section = + FindSectionByName(kStabName, sections, strtab, elf_header->e_shnum); + if (stab_section == NULL) { + fprintf(stderr, "Stab section not found.\n"); + return false; + } + const ElfW(Shdr) *stabstr_section = stab_section->sh_link + sections; + + // Load symbols. + return LoadSymbols(stab_section, stabstr_section, loading_addr, symbols); +} + +static bool WriteModuleInfo(int fd, + ElfW(Half) arch, + const std::string &obj_file) { + const char *arch_name = NULL; + if (arch == EM_386) + arch_name = "x86"; + else if (arch == EM_X86_64) + arch_name = "x86_64"; + else + return false; + + unsigned char identifier[16]; + google_breakpad::FileID file_id(obj_file.c_str()); + if (file_id.ElfFileIdentifier(identifier)) { + char identifier_str[40]; + file_id.ConvertIdentifierToString(identifier, + identifier_str, sizeof(identifier_str)); + char id_no_dash[40]; + int id_no_dash_len = 0; + memset(id_no_dash, 0, sizeof(id_no_dash)); + for (int i = 0; identifier_str[i] != '\0'; ++i) + if (identifier_str[i] != '-') + id_no_dash[id_no_dash_len++] = identifier_str[i]; + // Add an extra "0" by the end. + id_no_dash[id_no_dash_len++] = '0'; + std::string filename = obj_file; + size_t slash_pos = obj_file.find_last_of("/"); + if (slash_pos != std::string::npos) + filename = obj_file.substr(slash_pos + 1); + return WriteFormat(fd, "MODULE Linux %s %s %s\n", arch_name, + id_no_dash, filename.c_str()); + } + return false; +} + +static bool WriteSourceFileInfo(int fd, const struct SymbolInfo &symbols) { + for (SourceFileInfoList::const_iterator it = + symbols.source_file_info.begin(); + it != symbols.source_file_info.end(); it++) { + if (it->source_id != -1) { + const char *name = it->name; + if (!WriteFormat(fd, "FILE %d %s\n", it->source_id, name)) + return false; + } + } + return true; +} + +static bool WriteOneFunction(int fd, + const struct FuncInfo &func_info){ + // Discard the ending part of the name. + std::string func_name(func_info.name); + std::string::size_type last_colon = func_name.find_last_of(':'); + if (last_colon != std::string::npos) + func_name = func_name.substr(0, last_colon); + func_name = Demangle(func_name.c_str()); + + if (func_info.size <= 0) + return true; + + if (WriteFormat(fd, "FUNC %lx %lx %d %s\n", + func_info.rva_to_base, + func_info.size, + func_info.stack_param_size, + func_name.c_str())) { + for (LineInfoList::const_iterator it = func_info.line_info.begin(); + it != func_info.line_info.end(); it++) { + const struct LineInfo &line_info = *it; + if (!WriteFormat(fd, "%lx %lx %d %d\n", + line_info.rva_to_base, + line_info.size, + line_info.line_num, + line_info.source_id)) + return false; + } + return true; + } + return false; +} + +static bool WriteFunctionInfo(int fd, const struct SymbolInfo &symbols) { + for (SourceFileInfoList::const_iterator it = + symbols.source_file_info.begin(); + it != symbols.source_file_info.end(); it++) { + const struct SourceFileInfo &file_info = *it; + for (FuncInfoList::const_iterator fiIt = file_info.func_info.begin(); + fiIt != file_info.func_info.end(); fiIt++) { + const struct FuncInfo &func_info = *fiIt; + if (!WriteOneFunction(fd, func_info)) + return false; + } + } + return true; +} + +static bool DumpStabSymbols(int fd, const struct SymbolInfo &symbols) { + return WriteSourceFileInfo(fd, symbols) && + WriteFunctionInfo(fd, symbols); +} + +// +// FDWrapper +// +// Wrapper class to make sure opened file is closed. +// +class FDWrapper { + public: + explicit FDWrapper(int fd) : + fd_(fd) { + } + ~FDWrapper() { + if (fd_ != -1) + close(fd_); + } + int get() { + return fd_; + } + int release() { + int fd = fd_; + fd_ = -1; + return fd; + } + private: + int fd_; +}; + +// +// MmapWrapper +// +// Wrapper class to make sure mapped regions are unmapped. +// +class MmapWrapper { + public: + MmapWrapper(void *mapped_address, size_t mapped_size) : + base_(mapped_address), size_(mapped_size) { + } + ~MmapWrapper() { + if (base_ != NULL) { + assert(size_ > 0); + munmap(base_, size_); + } + } + void release() { + base_ = NULL; + size_ = 0; + } + + private: + void *base_; + size_t size_; +}; + +} // namespace + +namespace google_breakpad { + +bool DumpSymbols::WriteSymbolFile(const std::string &obj_file, + int sym_fd) { + int obj_fd = open(obj_file.c_str(), O_RDONLY); + if (obj_fd < 0) + return false; + FDWrapper obj_fd_wrapper(obj_fd); + struct stat st; + if (fstat(obj_fd, &st) != 0 && st.st_size <= 0) + return false; + void *obj_base = mmap(NULL, st.st_size, + PROT_READ | PROT_WRITE, MAP_PRIVATE, obj_fd, 0); + if (obj_base == MAP_FAILED) + return false; + MmapWrapper map_wrapper(obj_base, st.st_size); + ElfW(Ehdr) *elf_header = reinterpret_cast(obj_base); + if (!IsValidElf(elf_header)) + return false; + struct SymbolInfo symbols; + symbols.next_source_id = 0; + + if (!LoadSymbols(elf_header, &symbols)) + return false; + // Write to symbol file. + if (WriteModuleInfo(sym_fd, elf_header->e_machine, obj_file) && + DumpStabSymbols(sym_fd, symbols)) + return true; + + return false; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/common/linux/dump_symbols.h b/thirdparty/google-breakpad/r318/src/common/linux/dump_symbols.h new file mode 100644 index 00000000..64f4c9e6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/linux/dump_symbols.h @@ -0,0 +1,48 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// dump_symbols.cc: Implements a linux stab debugging format dumper. +// + +#ifndef COMMON_LINUX_DUMP_SYMBOLS_H__ +#define COMMON_LINUX_DUMP_SYMBOLS_H__ + +#include + +namespace google_breakpad { + +class DumpSymbols { + public: + bool WriteSymbolFile(const std::string &obj_file, + int sym_fd); +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_DUMP_SYMBOLS_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/linux/file_id.cc b/thirdparty/google-breakpad/r318/src/common/linux/file_id.cc new file mode 100644 index 00000000..1adf2a13 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/linux/file_id.cc @@ -0,0 +1,145 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// file_id.cc: Return a unique identifier for a file +// +// See file_id.h for documentation +// + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/linux/file_id.h" +#include "common/md5.h" + +namespace google_breakpad { + +static bool FindElfTextSection(const void *elf_mapped_base, + const void **text_start, + int *text_size) { + assert(elf_mapped_base); + assert(text_start); + assert(text_size); + + const unsigned char *elf_base = + static_cast(elf_mapped_base); + const ElfW(Ehdr) *elf_header = + reinterpret_cast(elf_base); + if (memcmp(elf_header, ELFMAG, SELFMAG) != 0) + return false; + *text_start = NULL; + *text_size = 0; + const ElfW(Shdr) *sections = + reinterpret_cast(elf_base + elf_header->e_shoff); + const char *text_section_name = ".text"; + int name_len = strlen(text_section_name); + const ElfW(Shdr) *string_section = sections + elf_header->e_shstrndx; + const ElfW(Shdr) *text_section = NULL; + for (int i = 0; i < elf_header->e_shnum; ++i) { + if (sections[i].sh_type == SHT_PROGBITS) { + const char *section_name = (char*)(elf_base + + string_section->sh_offset + + sections[i].sh_name); + if (!strncmp(section_name, text_section_name, name_len)) { + text_section = §ions[i]; + break; + } + } + } + if (text_section != NULL && text_section->sh_size > 0) { + int text_section_size = text_section->sh_size; + *text_start = elf_base + text_section->sh_offset; + *text_size = text_section_size; + } + return true; +} + +FileID::FileID(const char *path) { + strncpy(path_, path, sizeof(path_)); +} + +bool FileID::ElfFileIdentifier(unsigned char identifier[16]) { + int fd = open(path_, O_RDONLY); + if (fd < 0) + return false; + struct stat st; + if (fstat(fd, &st) != 0 && st.st_size <= 0) { + close(fd); + return false; + } + void *base = mmap(NULL, st.st_size, + PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + if (base == MAP_FAILED) { + close(fd); + return false; + } + bool success = false; + const void *text_section = NULL; + int text_size = 0; + if (FindElfTextSection(base, &text_section, &text_size) && (text_size > 0)) { + struct MD5Context md5; + MD5Init(&md5); + MD5Update(&md5, + static_cast(text_section), + text_size); + MD5Final(identifier, &md5); + success = true; + } + + close(fd); + munmap(base, st.st_size); + return success; +} + +// static +void FileID::ConvertIdentifierToString(const unsigned char identifier[16], + char *buffer, int buffer_length) { + int buffer_idx = 0; + for (int idx = 0; (buffer_idx < buffer_length) && (idx < 16); ++idx) { + int hi = (identifier[idx] >> 4) & 0x0F; + int lo = (identifier[idx]) & 0x0F; + + if (idx == 4 || idx == 6 || idx == 8 || idx == 10) + buffer[buffer_idx++] = '-'; + + buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi; + buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo; + } + + // NULL terminate + buffer[(buffer_idx < buffer_length) ? buffer_idx : buffer_idx - 1] = 0; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/common/linux/file_id.h b/thirdparty/google-breakpad/r318/src/common/linux/file_id.h new file mode 100644 index 00000000..5e1cd6e1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/linux/file_id.h @@ -0,0 +1,66 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// file_id.h: Return a unique identifier for a file +// + +#ifndef COMMON_LINUX_FILE_ID_H__ +#define COMMON_LINUX_FILE_ID_H__ + +#include + +namespace google_breakpad { + +class FileID { + public: + FileID(const char *path); + ~FileID() {}; + + // Load the identifier for the elf file path specified in the constructor into + // |identifier|. Return false if the identifier could not be created for the + // file. + // The current implementation will return the MD5 hash of the file's bytes. + bool ElfFileIdentifier(unsigned char identifier[16]); + + // Convert the |identifier| data to a NULL terminated string. The string will + // be formatted as a UUID (e.g., 22F065BB-FC9C-49F7-80FE-26A7CEBD7BCE). + // The |buffer| should be at least 37 bytes long to receive all of the data + // and termination. Shorter buffers will contain truncated data. + static void ConvertIdentifierToString(const unsigned char identifier[16], + char *buffer, int buffer_length); + + private: + // Storage for the path specified + char path_[PATH_MAX]; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_FILE_ID_H__ + diff --git a/thirdparty/google-breakpad/r318/src/common/linux/guid_creator.cc b/thirdparty/google-breakpad/r318/src/common/linux/guid_creator.cc new file mode 100644 index 00000000..d133c6b0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/linux/guid_creator.cc @@ -0,0 +1,82 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include +#include + +#include "common/linux/guid_creator.h" + +// +// GUIDGenerator +// +// This class is used to generate random GUID. +// Currently use random number to generate a GUID since Linux has +// no native GUID generator. This should be OK since we don't expect +// crash to happen very offen. +// +class GUIDGenerator { + public: + GUIDGenerator() { + srandom(time(NULL)); + } + + bool CreateGUID(GUID *guid) const { + guid->data1 = random(); + guid->data2 = (u_int16_t)(random()); + guid->data3 = (u_int16_t)(random()); + *reinterpret_cast(&guid->data4[0]) = random(); + *reinterpret_cast(&guid->data4[4]) = random(); + return true; + } +}; + +// Guid generator. +const GUIDGenerator kGuidGenerator; + +bool CreateGUID(GUID *guid) { + return kGuidGenerator.CreateGUID(guid); +} + +// Parse guid to string. +bool GUIDToString(const GUID *guid, char *buf, int buf_len) { + // Should allow more space the the max length of GUID. + assert(buf_len > kGUIDStringLength); + int num = snprintf(buf, buf_len, kGUIDFormatString, + guid->data1, guid->data2, guid->data3, + *reinterpret_cast(&(guid->data4[0])), + *reinterpret_cast(&(guid->data4[4]))); + if (num != kGUIDStringLength) + return false; + + buf[num] = '\0'; + return true; +} diff --git a/thirdparty/google-breakpad/r318/src/common/linux/guid_creator.h b/thirdparty/google-breakpad/r318/src/common/linux/guid_creator.h new file mode 100644 index 00000000..c86d856c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/linux/guid_creator.h @@ -0,0 +1,48 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_LINUX_GUID_CREATOR_H__ +#define COMMON_LINUX_GUID_CREATOR_H__ + +#include "google_breakpad/common/minidump_format.h" + +typedef MDGUID GUID; + +// Format string for parsing GUID. +#define kGUIDFormatString "%08x-%04x-%04x-%08x-%08x" +// Length of GUID string. Don't count the ending '\0'. +#define kGUIDStringLength 36 + +// Create a guid. +bool CreateGUID(GUID *guid); + +// Get the string from guid. +bool GUIDToString(const GUID *guid, char *buf, int buf_len); + +#endif diff --git a/thirdparty/google-breakpad/r318/src/common/linux/http_upload.cc b/thirdparty/google-breakpad/r318/src/common/linux/http_upload.cc new file mode 100644 index 00000000..8748d117 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/linux/http_upload.cc @@ -0,0 +1,185 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include +#include + +#include "common/linux/http_upload.h" + +namespace { + +// Callback to get the response data from server. +static size_t WriteCallback(void *ptr, size_t size, + size_t nmemb, void *userp) { + if (!userp) + return 0; + + std::string *response = reinterpret_cast(userp); + size_t real_size = size * nmemb; + response->append(reinterpret_cast(ptr), real_size); + return real_size; +} + +} // namespace + +namespace google_breakpad { + +static const char kUserAgent[] = "Breakpad/1.0 (Linux)"; + +// static +bool HTTPUpload::SendRequest(const string &url, + const map ¶meters, + const string &upload_file, + const string &file_part_name, + const string &proxy, + const string &proxy_user_pwd, + string *response_body, + string *error_description) { + if (!CheckParameters(parameters)) + return false; + + void *curl_lib = dlopen("libcurl.so", RTLD_NOW); + if (!curl_lib) { + curl_lib = dlopen("libcurl.so.4", RTLD_NOW); + } + if (!curl_lib) { + curl_lib = dlopen("libcurl.so.3", RTLD_NOW); + } + if (!curl_lib) { + return false; + } + + CURL* (*curl_easy_init)(void); + *(void**) (&curl_easy_init) = dlsym(curl_lib, "curl_easy_init"); + CURL *curl = (*curl_easy_init)(); + if (error_description != NULL) + *error_description = "No Error"; + + if (!curl) { + dlclose(curl_lib); + return false; + } + + CURLcode err_code = CURLE_OK; + CURLcode (*curl_easy_setopt)(CURL *, CURLoption, ...); + *(void**) (&curl_easy_setopt) = dlsym(curl_lib, "curl_easy_setopt"); + (*curl_easy_setopt)(curl, CURLOPT_URL, url.c_str()); + (*curl_easy_setopt)(curl, CURLOPT_USERAGENT, kUserAgent); + // Set proxy information if necessary. + if (!proxy.empty()) + (*curl_easy_setopt)(curl, CURLOPT_PROXY, proxy.c_str()); + if (!proxy_user_pwd.empty()) + (*curl_easy_setopt)(curl, CURLOPT_PROXYUSERPWD, proxy_user_pwd.c_str()); + + struct curl_httppost *formpost = NULL; + struct curl_httppost *lastptr = NULL; + // Add form data. + CURLFORMcode (*curl_formadd)(struct curl_httppost **, struct curl_httppost **, ...); + *(void**) (&curl_formadd) = dlsym(curl_lib, "curl_formadd"); + map::const_iterator iter = parameters.begin(); + for (; iter != parameters.end(); ++iter) + (*curl_formadd)(&formpost, &lastptr, + CURLFORM_COPYNAME, iter->first.c_str(), + CURLFORM_COPYCONTENTS, iter->second.c_str(), + CURLFORM_END); + + // Add form file. + (*curl_formadd)(&formpost, &lastptr, + CURLFORM_COPYNAME, file_part_name.c_str(), + CURLFORM_FILE, upload_file.c_str(), + CURLFORM_END); + + (*curl_easy_setopt)(curl, CURLOPT_HTTPPOST, formpost); + + // Disable 100-continue header. + struct curl_slist *headerlist = NULL; + char buf[] = "Expect:"; + struct curl_slist* (*curl_slist_append)(struct curl_slist *, const char *); + *(void**) (&curl_slist_append) = dlsym(curl_lib, "curl_slist_append"); + headerlist = (*curl_slist_append)(headerlist, buf); + (*curl_easy_setopt)(curl, CURLOPT_HTTPHEADER, headerlist); + + if (response_body != NULL) { + (*curl_easy_setopt)(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + (*curl_easy_setopt)(curl, CURLOPT_WRITEDATA, + reinterpret_cast(response_body)); + } + + CURLcode (*curl_easy_perform)(CURL *); + *(void**) (&curl_easy_perform) = dlsym(curl_lib, "curl_easy_perform"); + err_code = (*curl_easy_perform)(curl); + const char* (*curl_easy_strerror)(CURLcode); + *(void**) (&curl_easy_strerror) = dlsym(curl_lib, "curl_easy_strerror"); +#ifndef NDEBUG + if (err_code != CURLE_OK) + fprintf(stderr, "Failed to send http request to %s, error: %s\n", + url.c_str(), + (*curl_easy_strerror)(err_code)); +#endif + if (error_description != NULL) + *error_description = (*curl_easy_strerror)(err_code); + + void (*curl_easy_cleanup)(CURL *); + *(void**) (&curl_easy_cleanup) = dlsym(curl_lib, "curl_easy_cleanup"); + (*curl_easy_cleanup)(curl); + if (formpost != NULL) { + void (*curl_formfree)(struct curl_httppost *); + *(void**) (&curl_formfree) = dlsym(curl_lib, "curl_formfree"); + (*curl_formfree)(formpost); + } + if (headerlist != NULL) { + void (*curl_slist_free_all)(struct curl_slist *); + *(void**) (&curl_slist_free_all) = dlsym(curl_lib, "curl_slist_free_all"); + (*curl_slist_free_all)(headerlist); + } + dlclose(curl_lib); + return err_code == CURLE_OK; +} + +// static +bool HTTPUpload::CheckParameters(const map ¶meters) { + for (map::const_iterator pos = parameters.begin(); + pos != parameters.end(); ++pos) { + const string &str = pos->first; + if (str.size() == 0) + return false; // disallow empty parameter names + for (unsigned int i = 0; i < str.size(); ++i) { + int c = str[i]; + if (c < 32 || c == '"' || c > 127) { + return false; + } + } + } + return true; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/common/linux/http_upload.h b/thirdparty/google-breakpad/r318/src/common/linux/http_upload.h new file mode 100644 index 00000000..fa6ad12c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/linux/http_upload.h @@ -0,0 +1,83 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// HTTPUpload provides a "nice" API to send a multipart HTTP(S) POST +// request using libcurl. It currently supports requests that contain +// a set of string parameters (key/value pairs), and a file to upload. + +#ifndef COMMON_LINUX_HTTP_UPLOAD_H__ +#define COMMON_LINUX_HTTP_UPLOAD_H__ + +#include +#include + +namespace google_breakpad { + +using std::string; +using std::map; + +class HTTPUpload { + public: + // Sends the given set of parameters, along with the contents of + // upload_file, as a multipart POST request to the given URL. + // file_part_name contains the name of the file part of the request + // (i.e. it corresponds to the name= attribute on an . + // Parameter names must contain only printable ASCII characters, + // and may not contain a quote (") character. + // Only HTTP(S) URLs are currently supported. Returns true on success. + // If the request is successful and response_body is non-NULL, + // the response body will be returned in response_body. + // If the send fails, a description of the error will be + // returned in error_description. + static bool SendRequest(const string &url, + const map ¶meters, + const string &upload_file, + const string &file_part_name, + const string &proxy, + const string &proxy_user_pwd, + string *response_body, + string *error_description); + + private: + // Checks that the given list of parameters has only printable + // ASCII characters in the parameter name, and does not contain + // any quote (") characters. Returns true if so. + static bool CheckParameters(const map ¶meters); + + // No instances of this class should be created. + // Disallow all constructors, destructors, and operator=. + HTTPUpload(); + explicit HTTPUpload(const HTTPUpload &); + void operator=(const HTTPUpload &); + ~HTTPUpload(); +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_HTTP_UPLOAD_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/mac/HTTPMultipartUpload.h b/thirdparty/google-breakpad/r318/src/common/mac/HTTPMultipartUpload.h new file mode 100644 index 00000000..95f259b9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/HTTPMultipartUpload.h @@ -0,0 +1,61 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// HTTPMultipartUpload: A multipart/form-data HTTP uploader. +// Each parameter pair is sent as a boundary +// Each file is sent with a name field in addition to the filename and data +// The data will be sent synchronously. + +#import + +@interface HTTPMultipartUpload : NSObject { + @protected + NSURL *url_; // The destination URL (STRONG) + NSDictionary *parameters_; // The key/value pairs for sending data (STRONG) + NSMutableDictionary *files_; // Dictionary of name/file-path (STRONG) + NSString *boundary_; // The boundary string (STRONG) + NSHTTPURLResponse *response_; // The response from the send (STRONG) +} + +- (id)initWithURL:(NSURL *)url; + +- (NSURL *)URL; + +- (void)setParameters:(NSDictionary *)parameters; +- (NSDictionary *)parameters; + +- (void)addFileAtPath:(NSString *)path name:(NSString *)name; +- (void)addFileContents:(NSData *)data name:(NSString *)name; +- (NSDictionary *)files; + +// Set the data and return the response +- (NSData *)send:(NSError **)error; +- (NSHTTPURLResponse *)response; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/HTTPMultipartUpload.m b/thirdparty/google-breakpad/r318/src/common/mac/HTTPMultipartUpload.m new file mode 100644 index 00000000..dd3612d8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/HTTPMultipartUpload.m @@ -0,0 +1,205 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "HTTPMultipartUpload.h" + +@interface HTTPMultipartUpload(PrivateMethods) +- (NSString *)multipartBoundary; +- (NSData *)formDataForKey:(NSString *)key value:(NSString *)value; +- (NSData *)formDataForFileContents:(NSData *)contents name:(NSString *)name; +- (NSData *)formDataForFile:(NSString *)file name:(NSString *)name; +@end + +@implementation HTTPMultipartUpload +//============================================================================= +#pragma mark - +#pragma mark || Private || +//============================================================================= +- (NSString *)multipartBoundary { + // The boundary has 27 '-' characters followed by 16 hex digits + return [NSString stringWithFormat:@"---------------------------%08X%08X", + rand(), rand()]; +} + +//============================================================================= +- (NSData *)formDataForKey:(NSString *)key value:(NSString *)value { + NSString *escaped = + [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + NSString *fmt = + @"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n"; + NSString *form = [NSString stringWithFormat:fmt, boundary_, escaped, value]; + + return [form dataUsingEncoding:NSUTF8StringEncoding]; +} + +//============================================================================= +- (NSData *)formDataForFileContents:(NSData *)contents name:(NSString *)name { + NSMutableData *data = [NSMutableData data]; + NSString *escaped = + [name stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + NSString *fmt = @"--%@\r\nContent-Disposition: form-data; name=\"%@\"; " + "filename=\"minidump.dmp\"\r\nContent-Type: application/octet-stream\r\n\r\n"; + NSString *pre = [NSString stringWithFormat:fmt, boundary_, escaped]; + NSString *post = [NSString stringWithFormat:@"\r\n--%@--\r\n", boundary_]; + + [data appendData:[pre dataUsingEncoding:NSUTF8StringEncoding]]; + [data appendData:contents]; + [data appendData:[post dataUsingEncoding:NSUTF8StringEncoding]]; + + return data; +} + +//============================================================================= +- (NSData *)formDataForFile:(NSString *)file name:(NSString *)name { + NSData *contents = [NSData dataWithContentsOfFile:file]; + + return [self formDataForFileContents:contents name:name]; +} + +//============================================================================= +#pragma mark - +#pragma mark || Public || +//============================================================================= +- (id)initWithURL:(NSURL *)url { + if ((self = [super init])) { + url_ = [url copy]; + boundary_ = [[self multipartBoundary] retain]; + files_ = [[NSMutableDictionary alloc] init]; + } + + return self; +} + +//============================================================================= +- (void)dealloc { + [url_ release]; + [parameters_ release]; + [files_ release]; + [boundary_ release]; + [response_ release]; + + [super dealloc]; +} + +//============================================================================= +- (NSURL *)URL { + return url_; +} + +//============================================================================= +- (void)setParameters:(NSDictionary *)parameters { + if (parameters != parameters_) { + [parameters_ release]; + parameters_ = [parameters copy]; + } +} + +//============================================================================= +- (NSDictionary *)parameters { + return parameters_; +} + +//============================================================================= +- (void)addFileAtPath:(NSString *)path name:(NSString *)name { + [files_ setObject:path forKey:name]; +} + +//============================================================================= +- (void)addFileContents:(NSData *)data name:(NSString *)name { + [files_ setObject:data forKey:name]; +} + +//============================================================================= +- (NSDictionary *)files { + return files_; +} + +//============================================================================= +- (NSData *)send:(NSError **)error { + NSMutableURLRequest *req = + [[NSMutableURLRequest alloc] + initWithURL:url_ cachePolicy:NSURLRequestUseProtocolCachePolicy + timeoutInterval:10.0 ]; + + NSMutableData *postBody = [NSMutableData data]; + int i, count; + + [req setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", + boundary_] forHTTPHeaderField:@"Content-type"]; + + // Add any parameters to the message + NSArray *parameterKeys = [parameters_ allKeys]; + NSString *key; + + count = [parameterKeys count]; + for (i = 0; i < count; ++i) { + key = [parameterKeys objectAtIndex:i]; + [postBody appendData:[self formDataForKey:key + value:[parameters_ objectForKey:key]]]; + } + + // Add any files to the message + NSArray *fileNames = [files_ allKeys]; + count = [fileNames count]; + for (i = 0; i < count; ++i) { + NSString *name = [fileNames objectAtIndex:i]; + id fileOrData = [files_ objectForKey:name]; + NSData *fileData; + + // The object can be either the path to a file (NSString) or the contents + // of the file (NSData). + if ([fileOrData isKindOfClass:[NSData class]]) + fileData = [self formDataForFileContents:fileOrData name:name]; + else + fileData = [self formDataForFile:fileOrData name:name]; + + [postBody appendData:fileData]; + } + + [req setHTTPBody:postBody]; + [req setHTTPMethod:@"POST"]; + + [response_ release]; + response_ = nil; + + NSData *data = [NSURLConnection sendSynchronousRequest:req + returningResponse:&response_ + error:error]; + + [response_ retain]; + + return data; +} + +//============================================================================= +- (NSHTTPURLResponse *)response { + return response_; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dump_syms.h b/thirdparty/google-breakpad/r318/src/common/mac/dump_syms.h new file mode 100644 index 00000000..12d8f7d6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dump_syms.h @@ -0,0 +1,79 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dump_syms.h: Interface for DumpSymbols. This class will take a mach-o file +// and extract the symbol information and write it to a file using the +// breakpad symbol file format. + +#import +#include +#include "common/mac/dwarf/dwarf2reader.h" + +// This will map from an architecture string to a SectionMap, which +// will contain the offsets for all the sections in the dictionary +typedef hash_map ArchSectionMap; + +@interface DumpSymbols : NSObject { + @protected + NSString *sourcePath_; // Source of symbols (STRONG) + NSString *architecture_; // Architecture to extract (STRONG) + NSMutableDictionary *addresses_; // Addresses and symbols (STRONG) + NSMutableSet *functionAddresses_; // Function addresses (STRONG) + NSMutableDictionary *sources_; // Address and Source file paths (STRONG) + NSMutableDictionary *headers_; // Mach-o header information (STRONG) + NSMutableDictionary *sectionData_; // Keyed by seg/sect name (STRONG) + uint32_t lastStartAddress_; + ArchSectionMap *sectionsForArch_; +} + +- (id)initWithContentsOfFile:(NSString *)machoFile; + +- (NSArray *)availableArchitectures; + +// One of ppc, x86, i386, ppc64, x86_64 +// If the architecture is not available, it will return NO +// If not set, the native architecture will be used +- (BOOL)setArchitecture:(NSString *)architecture; +- (NSString *)architecture; + +// Write the symbols to |symbolFilePath|. Return YES if successful. +- (BOOL)writeSymbolFile:(NSString *)symbolFilePath; + +@end + +@interface MachSection : NSObject { + @protected + struct section *sect_; + uint32_t sectionNumber_; +} +- (id)initWithMachSection:(struct section *)sect andNumber:(uint32_t)sectionNumber; +- (struct section*)sectionPointer; +- (uint32_t)sectionNumber; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dump_syms.mm b/thirdparty/google-breakpad/r318/src/common/mac/dump_syms.mm new file mode 100644 index 00000000..88f1f4f1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dump_syms.mm @@ -0,0 +1,1224 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dump_syms.mm: Create a symbol file for use with minidumps + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#import + +#import "dump_syms.h" +#import "common/mac/file_id.h" +#import "common/mac/macho_utilities.h" +#import "common/mac/dwarf/dwarf2reader.h" +#import "common/mac/dwarf/functioninfo.h" +#import "common/mac/dwarf/bytereader.h" + +using google_breakpad::FileID; + +static NSString *kAddressSymbolKey = @"symbol"; +static NSString *kAddressConvertedSymbolKey = @"converted_symbol"; +static NSString *kAddressSourceLineKey = @"line"; +static NSString *kFunctionSizeKey = @"size"; +static NSString *kFunctionFileKey = @"source_file"; +static NSString *kHeaderBaseAddressKey = @"baseAddr"; +static NSString *kHeaderSizeKey = @"size"; +static NSString *kHeaderOffsetKey = @"offset"; // Offset to the header +static NSString *kHeaderIs64BitKey = @"is64"; +static NSString *kHeaderCPUTypeKey = @"cpuType"; + +// The section for __TEXT, __text seems to be always 1. This is useful +// for pruning out extraneous non-function symbols. +static const int kTextSection = 1; + +namespace __gnu_cxx { +template<> + struct hash { + size_t operator()(const std::string& k) const { + return hash< const char* >()( k.c_str() ); + } +}; +} + +// Dump FunctionMap to stdout. Print address, function name, file +// name, line number, lowpc, and highpc if available. +void DumpFunctionMap(const dwarf2reader::FunctionMap function_map) { + for (dwarf2reader::FunctionMap::const_iterator iter = function_map.begin(); + iter != function_map.end(); ++iter) { + if (iter->second->name.empty()) { + continue; + } + printf("%08llx: %s", iter->first, + iter->second->name.data()); + if (!iter->second->file.empty()) { + printf(" - %s", iter->second->file.data()); + if (iter->second->line != 0) { + printf(":%u", iter->second->line); + } + } + if (iter->second->lowpc != 0 && iter->second->highpc != 0) { + printf(" (%08llx - %08llx)\n", + iter->second->lowpc, + iter->second->highpc); + } + } +} + + +@interface DumpSymbols(PrivateMethods) +- (NSString *)convertCPlusPlusSymbol:(NSString *)symbol; +- (void)addFunction:(NSString *)name line:(int)line address:(uint64_t)address section:(int)section; +- (BOOL)processSymbolItem:(struct nlist_64 *)list stringTable:(char *)table; +- (BOOL)loadSymbolInfo:(void *)base offset:(uint32_t)offset; +- (BOOL)loadSymbolInfo64:(void *)base offset:(uint32_t)offset; +- (BOOL)loadSymbolInfoForArchitecture; +- (BOOL)loadDWARFSymbolInfo:(void *)base offset:(uint32_t)offset; +- (BOOL)loadSTABSSymbolInfo:(void *)base offset:(uint32_t)offset; +- (void)generateSectionDictionary:(struct mach_header*)header; +- (BOOL)loadHeader:(void *)base offset:(uint32_t)offset; +- (BOOL)loadHeader64:(void *)base offset:(uint32_t)offset; +- (BOOL)loadModuleInfo; +- (void)processDWARFLineNumberInfo:(dwarf2reader::LineMap*)line_map; +- (void)processDWARFFunctionInfo:(dwarf2reader::FunctionMap*)address_to_funcinfo; +- (void)processDWARFSourceFileInfo:(vector*) files; +- (BOOL)loadSymbolInfo:(void *)base offset:(uint32_t)offset; +- (dwarf2reader::SectionMap*)getSectionMapForArchitecture:(NSString*)architecture; +@end + +@implementation DumpSymbols +//============================================================================= +- (NSString *)convertCPlusPlusSymbol:(NSString *)symbol { + // __cxa_demangle will realloc this if needed + char *buffer = (char *)malloc(1024); + size_t buffer_size = 1024; + int result; + + const char *sym = [symbol UTF8String]; + NSString *demangled = nil; + buffer = abi::__cxa_demangle(sym, buffer, &buffer_size, &result); + if (result == 0) { + demangled = [NSString stringWithUTF8String:buffer]; + } + free(buffer); + return demangled; +} + +//============================================================================= +- (void)addFunction:(NSString *)name line:(int)line address:(uint64_t)address section:(int)section { + NSNumber *addressNum = [NSNumber numberWithUnsignedLongLong:address]; + + if (!address) + return; + + // If the function starts with "_Z" or "__Z" then demangle it. + BOOL isCPP = NO; + + if ([name hasPrefix:@"__Z"]) { + // Remove the leading underscore + name = [name substringFromIndex:1]; + isCPP = YES; + } else if ([name hasPrefix:@"_Z"]) { + isCPP = YES; + } + + // Filter out non-functions + if ([name hasSuffix:@".eh"]) + return; + + if ([name hasSuffix:@"__func__"]) + return; + + if ([name hasSuffix:@"GCC_except_table"]) + return; + + if (isCPP) { + // OBJCPP_MANGLING_HACK + // There are cases where ObjC++ mangles up an ObjC name using quasi-C++ + // mangling: + // @implementation Foozles + (void)barzles { + // static int Baz = 0; + // } @end + // gives you _ZZ18+[Foozles barzles]E3Baz + // c++filt won't parse this properly, and will crash in certain cases. + // Logged as radar: + // 5129938: c++filt does not deal with ObjC++ symbols + // If 5129938 ever gets fixed, we can remove this, but for now this prevents + // c++filt from attempting to demangle names it doesn't know how to handle. + // This is with c++filt 2.16 + NSCharacterSet *objcppCharSet = [NSCharacterSet characterSetWithCharactersInString:@"-+[]: "]; + NSRange emptyRange = { NSNotFound, 0 }; + NSRange objcppRange = [name rangeOfCharacterFromSet:objcppCharSet]; + isCPP = NSEqualRanges(objcppRange, emptyRange); + } else if ([name characterAtIndex:0] == '_') { + // Remove the leading underscore + name = [name substringFromIndex:1]; + } + + // If there's already an entry for this address, check and see if we can add + // either the symbol, or a missing line # + NSMutableDictionary *dict = [addresses_ objectForKey:addressNum]; + + if (!dict) { + dict = [[NSMutableDictionary alloc] init]; + [addresses_ setObject:dict forKey:addressNum]; + [dict release]; + } + + if (name && ![dict objectForKey:kAddressSymbolKey]) { + [dict setObject:name forKey:kAddressSymbolKey]; + + // only functions, not line number addresses + [functionAddresses_ addObject:addressNum]; + } + + if (isCPP) { + // try demangling + NSString *demangled = [self convertCPlusPlusSymbol:name]; + if (demangled != nil) + [dict setObject:demangled forKey:kAddressConvertedSymbolKey]; + } + + if (line && ![dict objectForKey:kAddressSourceLineKey]) + [dict setObject:[NSNumber numberWithUnsignedInt:line] + forKey:kAddressSourceLineKey]; + +} + +//============================================================================= +- (BOOL)processSymbolItem:(struct nlist_64 *)list stringTable:(char *)table { + uint32_t n_strx = list->n_un.n_strx; + BOOL result = NO; + + // We don't care about non-section specific information except function length + if (list->n_sect == 0 && list->n_type != N_FUN ) + return NO; + + if (list->n_type == N_FUN) { + if (list->n_sect != 0) { + // we get the function address from the first N_FUN + lastStartAddress_ = list->n_value; + } + else { + // an N_FUN from section 0 may follow the initial N_FUN + // giving us function length information + NSMutableDictionary *dict = [addresses_ objectForKey: + [NSNumber numberWithUnsignedLong:lastStartAddress_]]; + + assert(dict); + + // only set the function size the first time + // (sometimes multiple section 0 N_FUN entries appear!) + if (![dict objectForKey:kFunctionSizeKey]) { + [dict setObject:[NSNumber numberWithUnsignedLongLong:list->n_value] + forKey:kFunctionSizeKey]; + } + } + } + + int line = list->n_desc; + + // __TEXT __text section + NSMutableDictionary *archSections = [sectionData_ objectForKey:architecture_]; + + uint32_t mainSection = [[archSections objectForKey:@"__TEXT__text" ] sectionNumber]; + + // Extract debugging information: + // Doc: http://developer.apple.com/documentation/DeveloperTools/gdb/stabs/stabs_toc.html + // Header: /usr/include/mach-o/stab.h: + if (list->n_type == N_SO) { + NSString *src = [NSString stringWithUTF8String:&table[n_strx]]; + NSString *ext = [src pathExtension]; + NSNumber *address = [NSNumber numberWithUnsignedLongLong:list->n_value]; + + // Leopard puts .c files with no code as an offset of 0, but a + // crash can't happen here and it throws off our code that matches + // symbols to line numbers so we ignore them.. + // Return YES because this isn't an error, just something we don't + // care to handle. + if ([address unsignedLongValue] == 0) { + return YES; + } + // TODO(waylonis):Ensure that we get the full path for the source file + // from the first N_SO record + // If there is an extension, we'll consider it source code + if ([ext length]) { + if (!sources_) + sources_ = [[NSMutableDictionary alloc] init]; + // Save the source associated with an address + [sources_ setObject:src forKey:address]; + result = YES; + } + } else if (list->n_type == N_FUN) { + NSString *fn = [NSString stringWithUTF8String:&table[n_strx]]; + NSRange range = [fn rangeOfString:@":" options:NSBackwardsSearch]; + + if (![fn length]) + return NO; + + if (range.length > 0) { + // The function has a ":" followed by some stuff, so strip it off + fn = [fn substringToIndex:range.location]; + } + + [self addFunction:fn line:line address:list->n_value section:list->n_sect ]; + + result = YES; + } else if (list->n_type == N_SLINE && list->n_sect == mainSection) { + [self addFunction:nil line:line address:list->n_value section:list->n_sect ]; + result = YES; + } else if (((list->n_type & N_TYPE) == N_SECT) && !(list->n_type & N_STAB)) { + // Regular symbols or ones that are external + NSString *fn = [NSString stringWithUTF8String:&table[n_strx]]; + + [self addFunction:fn line:0 address:list->n_value section:list->n_sect ]; + result = YES; + } + + return result; +} + +#define SwapLongLongIfNeeded(a) (swap ? NXSwapLongLong(a) : (a)) +#define SwapLongIfNeeded(a) (swap ? NXSwapLong(a) : (a)) +#define SwapIntIfNeeded(a) (swap ? NXSwapInt(a) : (a)) +#define SwapShortIfNeeded(a) (swap ? NXSwapShort(a) : (a)) + +//============================================================================= +- (BOOL)loadSymbolInfo:(void *)base offset:(uint32_t)offset { + NSMutableDictionary *archSections = [sectionData_ objectForKey:architecture_]; + if ([archSections objectForKey:@"__DWARF__debug_info"]) { + // Treat this this as debug information + return [self loadDWARFSymbolInfo:base offset:offset]; + } + + return [self loadSTABSSymbolInfo:base offset:offset]; +} + +//============================================================================= +- (BOOL)loadDWARFSymbolInfo:(void *)base offset:(uint32_t)offset { + + struct mach_header *header = (struct mach_header *) + ((uint32_t)base + offset); + BOOL swap = (header->magic == MH_CIGAM); + + NSMutableDictionary *archSections = [sectionData_ objectForKey:architecture_]; + assert (archSections != nil); + section *dbgInfoSection = [[archSections objectForKey:@"__DWARF__debug_info"] sectionPointer]; + uint32_t debugInfoSize = SwapLongIfNeeded(dbgInfoSection->size); + + // i think this will break if run on a big-endian machine + dwarf2reader::ByteReader byte_reader(swap ? + dwarf2reader::ENDIANNESS_BIG : + dwarf2reader::ENDIANNESS_LITTLE); + + uint64_t dbgOffset = 0; + + dwarf2reader::SectionMap* oneArchitectureSectionMap = [self getSectionMapForArchitecture:architecture_]; + + while (dbgOffset < debugInfoSize) { + // Prepare necessary objects. + dwarf2reader::FunctionMap off_to_funcinfo; + dwarf2reader::FunctionMap address_to_funcinfo; + dwarf2reader::LineMap line_map; + vector files; + vector dirs; + + dwarf2reader::CULineInfoHandler line_info_handler(&files, &dirs, + &line_map); + + dwarf2reader::CUFunctionInfoHandler function_info_handler(&files, &dirs, + &line_map, + &off_to_funcinfo, + &address_to_funcinfo, + &line_info_handler, + *oneArchitectureSectionMap, + &byte_reader); + + dwarf2reader::CompilationUnit compilation_unit(*oneArchitectureSectionMap, + dbgOffset, + &byte_reader, + &function_info_handler); + + dbgOffset += compilation_unit.Start(); + + // The next 3 functions take the info that the dwarf reader + // gives and massages them into the data structures that + // dump_syms uses + [self processDWARFSourceFileInfo:&files]; + [self processDWARFFunctionInfo:&address_to_funcinfo]; + [self processDWARFLineNumberInfo:&line_map]; + } + + return YES; +} + +- (void)processDWARFSourceFileInfo:(vector*) files { + if (!sources_) + sources_ = [[NSMutableDictionary alloc] init]; + // Save the source associated with an address + vector::const_iterator iter = files->begin(); + for (; iter != files->end(); iter++) { + NSString *sourceFile = [NSString stringWithUTF8String:(*iter).name.c_str()]; + if ((*iter).lowpc != ULLONG_MAX) { + NSNumber *address = [NSNumber numberWithUnsignedLongLong:(*iter).lowpc]; + if ([address unsignedLongLongValue] == 0) { + continue; + } + [sources_ setObject:sourceFile forKey:address]; + } + } +} + +- (void)processDWARFFunctionInfo:(dwarf2reader::FunctionMap*)address_to_funcinfo { + for (dwarf2reader::FunctionMap::const_iterator iter = address_to_funcinfo->begin(); + iter != address_to_funcinfo->end(); ++iter) { + if (iter->second->name.empty()) { + continue; + } + + if (!addresses_) + addresses_ = [[NSMutableDictionary alloc] init]; + + NSNumber *addressNum = [NSNumber numberWithUnsignedLongLong:(*iter).second->lowpc]; + + [functionAddresses_ addObject:addressNum]; + + NSMutableDictionary *dict = [addresses_ objectForKey:addressNum]; + + if (!dict) { + dict = [[NSMutableDictionary alloc] init]; + [addresses_ setObject:dict forKey:addressNum]; + [dict release]; + } + + // set name of function if it isn't already set + if (![dict objectForKey:kAddressSymbolKey]) { + NSString *symbolName = [NSString stringWithUTF8String:iter->second->name.c_str()]; + [dict setObject:symbolName forKey:kAddressSymbolKey]; + } + + // try demangling function name if we have a mangled name + if (![dict objectForKey:kAddressConvertedSymbolKey] && + !iter->second->mangled_name.empty()) { + NSString *mangled = [NSString stringWithUTF8String:iter->second->mangled_name.c_str()]; + NSString *demangled = [self convertCPlusPlusSymbol:mangled]; + if (demangled != nil) + [dict setObject:demangled forKey:kAddressConvertedSymbolKey]; + } + + // set line number for beginning of function + if (iter->second->line && ![dict objectForKey:kAddressSourceLineKey]) + [dict setObject:[NSNumber numberWithUnsignedInt:iter->second->line] + forKey:kAddressSourceLineKey]; + + // set function size by subtracting low PC from high PC + if (![dict objectForKey:kFunctionSizeKey]) { + [dict setObject:[NSNumber numberWithUnsignedLongLong:iter->second->highpc - iter->second->lowpc] + forKey:kFunctionSizeKey]; + } + + // Set the file that the function is in + if (![dict objectForKey:kFunctionFileKey]) { + [dict setObject:[NSString stringWithUTF8String:iter->second->file.c_str()] + forKey:kFunctionFileKey]; + } + } +} + +- (void)processDWARFLineNumberInfo:(dwarf2reader::LineMap*)line_map { + for (dwarf2reader::LineMap::const_iterator iter = line_map->begin(); + iter != line_map->end(); + ++iter) { + + NSNumber *addressNum = [NSNumber numberWithUnsignedLongLong:iter->first]; + NSMutableDictionary *dict = [addresses_ objectForKey:addressNum]; + + if (!dict) { + dict = [[NSMutableDictionary alloc] init]; + [addresses_ setObject:dict forKey:addressNum]; + [dict release]; + } + + if (iter->second.second && ![dict objectForKey:kAddressSourceLineKey]) { + [dict setObject:[NSNumber numberWithUnsignedInt:iter->second.second] + forKey:kAddressSourceLineKey]; + } + + // Set the file that the function's address is in + if (![dict objectForKey:kFunctionFileKey]) { + [dict setObject:[NSString stringWithUTF8String:iter->second.first.c_str()] + forKey:kFunctionFileKey]; + } + } +} + +//============================================================================= +- (BOOL)loadSTABSSymbolInfo:(void *)base offset:(uint32_t)offset { + struct mach_header *header = (struct mach_header *)((uint32_t)base + offset); + BOOL swap = (header->magic == MH_CIGAM); + uint32_t count = SwapLongIfNeeded(header->ncmds); + struct load_command *cmd = + (struct load_command *)((uint32_t)header + sizeof(struct mach_header)); + uint32_t symbolTableCommand = SwapLongIfNeeded(LC_SYMTAB); + BOOL result = NO; + + if (!addresses_) + addresses_ = [[NSMutableDictionary alloc] init]; + + for (uint32_t i = 0; cmd && (i < count); ++i) { + if (cmd->cmd == symbolTableCommand) { + struct symtab_command *symtab = (struct symtab_command *)cmd; + uint32_t ncmds = SwapLongIfNeeded(symtab->nsyms); + uint32_t symoff = SwapLongIfNeeded(symtab->symoff); + uint32_t stroff = SwapLongIfNeeded(symtab->stroff); + struct nlist *list = (struct nlist *)((uint32_t)base + symoff + offset); + char *strtab = ((char *)header + stroff); + + // Process each command, looking for debugging stuff + for (uint32_t j = 0; j < ncmds; ++j, ++list) { + // Fill in an nlist_64 structure and process with that + struct nlist_64 nlist64; + nlist64.n_un.n_strx = SwapLongIfNeeded(list->n_un.n_strx); + nlist64.n_type = list->n_type; + nlist64.n_sect = list->n_sect; + nlist64.n_desc = SwapShortIfNeeded(list->n_desc); + nlist64.n_value = (uint64_t)SwapLongIfNeeded(list->n_value); + + // TODO(nealsid): is this broken? we get NO if one symbol fails + // but then we lose that information if another suceeeds + if ([self processSymbolItem:&nlist64 stringTable:strtab]) + result = YES; + } + } + + uint32_t cmdSize = SwapLongIfNeeded(cmd->cmdsize); + cmd = (struct load_command *)((uint32_t)cmd + cmdSize); + } + + return result; +} + +//============================================================================= +- (BOOL)loadSymbolInfo64:(void *)base offset:(uint32_t)offset { + struct mach_header_64 *header = (struct mach_header_64 *) + ((uint32_t)base + offset); + BOOL swap = (header->magic == MH_CIGAM_64); + uint32_t count = SwapLongIfNeeded(header->ncmds); + struct load_command *cmd = + (struct load_command *)((uint32_t)header + sizeof(struct mach_header)); + uint32_t symbolTableCommand = SwapLongIfNeeded(LC_SYMTAB); + BOOL result = NO; + + for (uint32_t i = 0; cmd && (i < count); i++) { + if (cmd->cmd == symbolTableCommand) { + struct symtab_command *symtab = (struct symtab_command *)cmd; + uint32_t ncmds = SwapLongIfNeeded(symtab->nsyms); + uint32_t symoff = SwapLongIfNeeded(symtab->symoff); + uint32_t stroff = SwapLongIfNeeded(symtab->stroff); + struct nlist_64 *list = (struct nlist_64 *)((uint32_t)base + symoff); + char *strtab = ((char *)header + stroff); + + // Process each command, looking for debugging stuff + for (uint32_t j = 0; j < ncmds; ++j, ++list) { + if (!(list->n_type & (N_STAB | N_TYPE))) + continue; + + // Fill in an nlist_64 structure and process with that + struct nlist_64 nlist64; + nlist64.n_un.n_strx = SwapLongIfNeeded(list->n_un.n_strx); + nlist64.n_type = list->n_type; + nlist64.n_sect = list->n_sect; + nlist64.n_desc = SwapShortIfNeeded(list->n_desc); + nlist64.n_value = SwapLongLongIfNeeded(list->n_value); + + if ([self processSymbolItem:&nlist64 stringTable:strtab]) + result = YES; + } + } + + uint32_t cmdSize = SwapLongIfNeeded(cmd->cmdsize); + cmd = (struct load_command *)((uint32_t)cmd + cmdSize); + } + + return result; +} + +//============================================================================= +- (BOOL)loadSymbolInfoForArchitecture { + NSMutableData *data = [[NSMutableData alloc] + initWithContentsOfMappedFile:sourcePath_]; + + NSDictionary *headerInfo = [headers_ objectForKey:architecture_]; + void *base = [data mutableBytes]; + uint32_t offset = + [[headerInfo objectForKey:kHeaderOffsetKey] unsignedLongValue]; + BOOL is64 = [[headerInfo objectForKey:kHeaderIs64BitKey] boolValue]; + BOOL result = is64 ? [self loadSymbolInfo64:base offset:offset] : + [self loadSymbolInfo:base offset:offset]; + + [data release]; + return result; +} + +- (dwarf2reader::SectionMap*)getSectionMapForArchitecture:(NSString*)architecture { + + string currentArch([architecture UTF8String]); + dwarf2reader::SectionMap *oneArchitectureSectionMap; + + ArchSectionMap::const_iterator iter = sectionsForArch_->find(currentArch); + + if (iter == sectionsForArch_->end()) { + oneArchitectureSectionMap = new dwarf2reader::SectionMap(); + sectionsForArch_->insert(make_pair(currentArch, oneArchitectureSectionMap)); + } else { + oneArchitectureSectionMap = iter->second; + } + + return oneArchitectureSectionMap; +} + +//============================================================================= +// build a dictionary of section numbers keyed off a string +// which is the concatenation of the segment name and the section name +- (void)generateSectionDictionary:(struct mach_header*)header { + + BOOL swap = (header->magic == MH_CIGAM); + uint32_t count = SwapLongIfNeeded(header->ncmds); + struct load_command *cmd = + (struct load_command *)((uint32_t)header + sizeof(struct mach_header)); + uint32_t segmentCommand = SwapLongIfNeeded(LC_SEGMENT); + uint32_t sectionNumber = 1; // section numbers are counted from 1 + + cpu_type_t cpu = SwapIntIfNeeded(header->cputype); + + NSString *arch; + + if (cpu & CPU_ARCH_ABI64) + arch = ((cpu & ~CPU_ARCH_ABI64) == CPU_TYPE_X86) ? + @"x86_64" : @"ppc64"; + else + arch = (cpu == CPU_TYPE_X86) ? @"x86" : @"ppc"; + + NSMutableDictionary *archSections; + + if (!sectionData_) { + sectionData_ = [[NSMutableDictionary alloc] init]; + } + + if (![sectionData_ objectForKey:architecture_]) { + [sectionData_ setObject:[[NSMutableDictionary alloc] init] forKey:arch]; + } + + archSections = [sectionData_ objectForKey:arch]; + + dwarf2reader::SectionMap* oneArchitectureSectionMap = [self getSectionMapForArchitecture:arch]; + + // loop through every segment command, then through every section + // contained inside each of them + for (uint32_t i = 0; cmd && (i < count); ++i) { + if (cmd->cmd == segmentCommand) { + struct segment_command *seg = (struct segment_command *)cmd; + section *sect = (section *)((uint32_t)cmd + sizeof(segment_command)); + uint32_t nsects = SwapLongIfNeeded(seg->nsects); + + for (uint32_t j = 0; j < nsects; ++j) { + NSString *segSectName = [NSString stringWithFormat:@"%s%s", + seg->segname, sect->sectname]; + + [archSections setObject:[[MachSection alloc] initWithMachSection:sect andNumber:sectionNumber] + forKey:segSectName]; + + // filter out sections with size 0, offset 0 + if (sect->offset != 0 && sect->size != 0) { + // fill sectionmap for dwarf reader + oneArchitectureSectionMap->insert(make_pair(sect->sectname,make_pair(((const char*)header) + SwapLongIfNeeded(sect->offset), (size_t)SwapLongIfNeeded(sect->size)))); + } + + ++sect; + ++sectionNumber; + } + } + + uint32_t cmdSize = SwapLongIfNeeded(cmd->cmdsize); + cmd = (struct load_command *)((uint32_t)cmd + cmdSize); + } +} + +//============================================================================= +- (BOOL)loadHeader:(void *)base offset:(uint32_t)offset { + struct mach_header *header = (struct mach_header *)((uint32_t)base + offset); + BOOL swap = (header->magic == MH_CIGAM); + uint32_t count = SwapLongIfNeeded(header->ncmds); + struct load_command *cmd = + (struct load_command *)((uint32_t)header + sizeof(struct mach_header)); + uint32_t segmentCommand = SwapLongIfNeeded(LC_SEGMENT); + + [self generateSectionDictionary:header]; + + for (uint32_t i = 0; cmd && (i < count); ++i) { + if (cmd->cmd == segmentCommand) { + struct segment_command *seg = (struct segment_command *)cmd; + + if (!strcmp(seg->segname, "__TEXT")) { + uint32_t addr = SwapLongIfNeeded(seg->vmaddr); + uint32_t size = SwapLongIfNeeded(seg->vmsize); + cpu_type_t cpu = SwapIntIfNeeded(header->cputype); + NSString *cpuStr = (cpu == CPU_TYPE_I386) ? @"x86" : @"ppc"; + + [headers_ setObject:[NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithUnsignedLongLong:(uint64_t)addr], + kHeaderBaseAddressKey, + [NSNumber numberWithUnsignedLongLong:(uint64_t)size], kHeaderSizeKey, + [NSNumber numberWithUnsignedLong:offset], kHeaderOffsetKey, + [NSNumber numberWithBool:NO], kHeaderIs64BitKey, + [NSNumber numberWithUnsignedLong:cpu], kHeaderCPUTypeKey, + nil] forKey:cpuStr]; + + return YES; + } + } + + uint32_t cmdSize = SwapLongIfNeeded(cmd->cmdsize); + cmd = (struct load_command *)((uint32_t)cmd + cmdSize); + } + + return NO; +} + +//============================================================================= +- (BOOL)loadHeader64:(void *)base offset:(uint32_t)offset { + struct mach_header_64 *header = + (struct mach_header_64 *)((uint32_t)base + offset); + BOOL swap = (header->magic == MH_CIGAM_64); + uint32_t count = SwapLongIfNeeded(header->ncmds); + struct load_command *cmd = + (struct load_command *)((uint32_t)header + sizeof(struct mach_header_64)); + + for (uint32_t i = 0; cmd && (i < count); ++i) { + uint32_t segmentCommand = SwapLongIfNeeded(LC_SEGMENT_64); + if (cmd->cmd == segmentCommand) { + struct segment_command_64 *seg = (struct segment_command_64 *)cmd; + if (!strcmp(seg->segname, "__TEXT")) { + uint64_t addr = SwapLongLongIfNeeded(seg->vmaddr); + uint64_t size = SwapLongLongIfNeeded(seg->vmsize); + cpu_type_t cpu = SwapIntIfNeeded(header->cputype); + cpu &= (~CPU_ARCH_ABI64); + NSString *cpuStr = (cpu == CPU_TYPE_I386) ? @"x86_64" : @"ppc64"; + + [headers_ setObject:[NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithUnsignedLongLong:addr], kHeaderBaseAddressKey, + [NSNumber numberWithUnsignedLongLong:size], kHeaderSizeKey, + [NSNumber numberWithUnsignedLong:offset], kHeaderOffsetKey, + [NSNumber numberWithBool:YES], kHeaderIs64BitKey, + [NSNumber numberWithUnsignedLong:cpu], kHeaderCPUTypeKey, + nil] forKey:cpuStr]; + return YES; + } + } + + uint32_t cmdSize = SwapLongIfNeeded(cmd->cmdsize); + cmd = (struct load_command *)((uint32_t)cmd + cmdSize); + } + + return NO; +} + +//============================================================================= +- (BOOL)loadModuleInfo { + uint64_t result = 0; + NSMutableData *data = [[NSMutableData alloc] + initWithContentsOfMappedFile:sourcePath_]; + void *bytes = [data mutableBytes]; + struct fat_header *fat = (struct fat_header *)bytes; + + if (!fat) { + [data release]; + return 0; + } + + // Gather some information based on the header + BOOL isFat = fat->magic == FAT_MAGIC || fat->magic == FAT_CIGAM; + BOOL is64 = fat->magic == MH_MAGIC_64 || fat->magic == MH_CIGAM_64; + BOOL is32 = fat->magic == MH_MAGIC || fat->magic == MH_CIGAM; + BOOL swap = fat->magic == FAT_CIGAM || fat->magic == MH_CIGAM_64 || + fat->magic == MH_CIGAM; + + if (!is64 && !is32 && !isFat) { + [data release]; + return 0; + } + + // Load any available architectures and save the information + headers_ = [[NSMutableDictionary alloc] init]; + + if (isFat) { + struct fat_arch *archs = + (struct fat_arch *)((uint32_t)fat + sizeof(struct fat_header)); + uint32_t count = SwapLongIfNeeded(fat->nfat_arch); + + for (uint32_t i = 0; i < count; ++i) { + archs[i].cputype = SwapIntIfNeeded(archs[i].cputype); + archs[i].cpusubtype = SwapIntIfNeeded(archs[i].cpusubtype); + archs[i].offset = SwapLongIfNeeded(archs[i].offset); + archs[i].size = SwapLongIfNeeded(archs[i].size); + archs[i].align = SwapLongIfNeeded(archs[i].align); + + if (archs[i].cputype & CPU_ARCH_ABI64) + result = [self loadHeader64:bytes offset:archs[i].offset]; + else + result = [self loadHeader:bytes offset:archs[i].offset]; + } + } else if (is32) { + result = [self loadHeader:bytes offset:0]; + } else { + result = [self loadHeader64:bytes offset:0]; + } + + [data release]; + return result; +} + +//============================================================================= +static BOOL WriteFormat(int fd, const char *fmt, ...) { + va_list list; + char buffer[4096]; + ssize_t expected, written; + + va_start(list, fmt); + vsnprintf(buffer, sizeof(buffer), fmt, list); + expected = strlen(buffer); + written = write(fd, buffer, strlen(buffer)); + va_end(list); + + return expected == written; +} + +//============================================================================= +- (BOOL)outputSymbolFile:(int)fd { + // Get the baseAddress for this architecture + NSDictionary *archDict = [headers_ objectForKey:architecture_]; + NSNumber *baseAddressNum = [archDict objectForKey:kHeaderBaseAddressKey]; + uint64_t baseAddress = + baseAddressNum ? [baseAddressNum unsignedLongLongValue] : 0; + NSNumber *moduleSizeNum = [archDict objectForKey:kHeaderSizeKey]; + uint64_t moduleSize = + moduleSizeNum ? [moduleSizeNum unsignedLongLongValue] : 0; + + // UUID + FileID file_id([sourcePath_ fileSystemRepresentation]); + unsigned char identifier[16]; + char identifierStr[40]; + const char *moduleName = [[sourcePath_ lastPathComponent] UTF8String]; + int cpu_type = [[archDict objectForKey:kHeaderCPUTypeKey] unsignedLongValue]; + if (file_id.MachoIdentifier(cpu_type, identifier)) { + FileID::ConvertIdentifierToString(identifier, identifierStr, + sizeof(identifierStr)); + } + else { + fprintf(stderr, "Unable to calculate UUID of mach-o binary!\n"); + return NO; + } + + // keep track exclusively of function addresses + // for sanity checking function lengths + functionAddresses_ = [[NSMutableSet alloc] init]; + + // Gather the information + [self loadSymbolInfoForArchitecture]; + + NSArray *sortedAddresses = [[addresses_ allKeys] + sortedArrayUsingSelector:@selector(compare:)]; + + NSArray *sortedFunctionAddresses = [[functionAddresses_ allObjects] + sortedArrayUsingSelector:@selector(compare:)]; + + // position ourselves at the 2nd function + unsigned int funcIndex = 1; + + // Remove the dashes from the string + NSMutableString *compactedStr = + [NSMutableString stringWithCString:identifierStr encoding:NSASCIIStringEncoding]; + [compactedStr replaceOccurrencesOfString:@"-" withString:@"" options:0 + range:NSMakeRange(0, [compactedStr length])]; + + if (!WriteFormat(fd, "MODULE mac %s %s0 %s\n", [architecture_ UTF8String], + [compactedStr UTF8String], moduleName)) { + return NO; + } + + // Sources ordered by address + NSArray *sources = [[sources_ allKeys] + sortedArrayUsingSelector:@selector(compare:)]; + NSMutableDictionary *fileNameToFileIndex = [[NSMutableDictionary alloc] init]; + unsigned int sourceCount = [sources count]; + for (unsigned int i = 0; i < sourceCount; ++i) { + NSString *file = [sources_ objectForKey:[sources objectAtIndex:i]]; + if (!WriteFormat(fd, "FILE %d %s\n", i + 1, [file UTF8String])) + return NO; + + [fileNameToFileIndex setObject:[NSNumber numberWithUnsignedInt:i+1] + forKey:file]; + } + + // Symbols + char terminatingChar = '\n'; + uint32_t fileIdx = 0, nextFileIdx = 0; + uint64_t nextSourceFileAddress = 0; + NSNumber *nextAddress; + uint64_t nextAddressVal; + unsigned int addressCount = [sortedAddresses count]; + + bool insideFunction = false; + + for (unsigned int i = 0; i < addressCount; ++i) { + NSNumber *address = [sortedAddresses objectAtIndex:i]; + // skip sources that have a starting address of 0 + if ([address unsignedLongValue] == 0) { + continue; + } + + uint64_t addressVal = [address unsignedLongLongValue] - baseAddress; + + // Get the next address to calculate the length + if (i + 1 < addressCount) { + nextAddress = [sortedAddresses objectAtIndex:i + 1]; + nextAddressVal = [nextAddress unsignedLongLongValue] - baseAddress; + } else { + nextAddressVal = baseAddress + moduleSize; + // The symbol reader doesn't want a trailing newline + terminatingChar = '\0'; + } + + NSDictionary *dict = [addresses_ objectForKey:address]; + NSNumber *line = [dict objectForKey:kAddressSourceLineKey]; + NSString *symbol = [dict objectForKey:kAddressConvertedSymbolKey]; + + if (!symbol) + symbol = [dict objectForKey:kAddressSymbolKey]; + + // sanity check the function length by making sure it doesn't + // run beyond the next function entry + uint64_t nextFunctionAddress = 0; + if (symbol && funcIndex < [sortedFunctionAddresses count]) { + nextFunctionAddress = [[sortedFunctionAddresses objectAtIndex:funcIndex] + unsignedLongLongValue] - baseAddress; + ++funcIndex; + } + + // Skip some symbols + if ([symbol hasPrefix:@"vtable for"]) + continue; + + if ([symbol hasPrefix:@"__static_initialization_and_destruction_0"]) + continue; + + if ([symbol hasPrefix:@"_GLOBAL__I_"]) + continue; + + if ([symbol hasPrefix:@"__func__."]) + continue; + + if ([symbol hasPrefix:@"__gnu"]) + continue; + + if ([symbol hasPrefix:@"typeinfo "]) + continue; + + if ([symbol hasPrefix:@"EH_frame"]) + continue; + + if ([symbol hasPrefix:@"GCC_except_table"]) + continue; + + if ([symbol hasPrefix:@"__tcf"]) + continue; + + if ([symbol hasPrefix:@"non-virtual thunk"]) + continue; + + // Find the source file (if any) that contains this address + while (sourceCount && (addressVal >= nextSourceFileAddress)) { + fileIdx = nextFileIdx; + + if (nextFileIdx < sourceCount) { + NSNumber *addr = [sources objectAtIndex:nextFileIdx]; + ++nextFileIdx; + nextSourceFileAddress = [addr unsignedLongLongValue] - baseAddress; + } else { + nextSourceFileAddress = baseAddress + moduleSize; + break; + } + } + + NSNumber *functionLength = [dict objectForKey:kFunctionSizeKey]; + + if (line) { + if (symbol && functionLength) { + + uint64_t functionLengthVal = [functionLength unsignedLongLongValue]; + + insideFunction = true; + // sanity check to make sure the length we were told does not exceed + // the space between this function and the next + if (nextFunctionAddress != 0) { + uint64_t functionLengthVal2 = nextFunctionAddress - addressVal; + + if(functionLengthVal > functionLengthVal2 ) { + functionLengthVal = functionLengthVal2; + } + } + + // Function + if (!WriteFormat(fd, "FUNC %llx %llx 0 %s\n", addressVal, + functionLengthVal, [symbol UTF8String])) + return NO; + } + + // Throw out line number information that doesn't correspond to + // any function + if (insideFunction) { + // Source line + uint64_t length = nextAddressVal - addressVal; + + // if fileNameToFileIndex/dict has an entry for the + // file/kFunctionFileKey, we're processing DWARF and have stored + // files for each program counter. If there is no entry, we're + // processing STABS and can use the old method of mapping + // addresses to files(which was basically iterating over a set + // of addresses until we reached one that was greater than the + // high PC of the current file, then moving on to the next file) + NSNumber *fileIndex = [fileNameToFileIndex objectForKey:[dict objectForKey:kFunctionFileKey]]; + if (!WriteFormat(fd, "%llx %llx %d %d\n", addressVal, length, + [line unsignedIntValue], fileIndex ? [fileIndex unsignedIntValue] : fileIdx)) + return NO; + } + } else { + // PUBLIC
      + if (!WriteFormat(fd, "PUBLIC %llx 0 %s\n", addressVal, + [symbol UTF8String])) + return NO; + insideFunction = false; + } + } + + return YES; +} + +//============================================================================= +- (id)initWithContentsOfFile:(NSString *)path { + if ((self = [super init])) { + + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + [self autorelease]; + return nil; + } + + sourcePath_ = [path copy]; + + // Test for .DSYM bundle + NSBundle *dsymBundle = [NSBundle bundleWithPath:sourcePath_]; + + if (dsymBundle) { + + // we need to take the DSYM bundle path and remove it's + // extension to get the name of the file inside the resources + // directory of the bundle that actually has the DWARF + // information + // But, Xcode supports something called "Wrapper extension"(see + // build settings), which would make the bundle name + // /tmp/foo/test.kext.dSYM, but the dwarf binary name would + // still be "test". so, now we loop through until deleting the + // extension doesn't change the string + + // e.g. suppose sourcepath_ is /tmp/foo/test.dSYM + + NSString *dwarfBinName = [sourcePath_ lastPathComponent]; + NSString *dwarfBinPath; + + // We use a do/while loop so we can handle files without an extension + do { + dwarfBinName = [dwarfBinName stringByDeletingPathExtension]; + // now, dwarfBinName is "test" + dwarfBinPath = [dsymBundle pathForResource:dwarfBinName ofType:nil inDirectory:@"DWARF"]; + if (dwarfBinPath != nil) + break; + } while (![[dwarfBinName stringByDeletingPathExtension] isEqualToString:dwarfBinName]); + + if (dwarfBinPath == nil) { + NSLog(@"The bundle passed on the command line does not appear to be a DWARF dSYM bundle"); + [self autorelease]; + return nil; + } + + // otherwise we're good to go + [sourcePath_ release]; + + sourcePath_ = [dwarfBinPath copy]; + NSLog(@"Loading DWARF dSYM file from %@", sourcePath_); + } + + sectionsForArch_ = new ArchSectionMap(); + + if (![self loadModuleInfo]) { + [self autorelease]; + return nil; + } + + // If there's more than one, use the native one + if ([headers_ count] > 1) { + const NXArchInfo *localArchInfo = NXGetLocalArchInfo(); + + if (localArchInfo) { + cpu_type_t cpu = localArchInfo->cputype; + NSString *arch; + + if (cpu & CPU_ARCH_ABI64) + arch = ((cpu & ~CPU_ARCH_ABI64) == CPU_TYPE_X86) ? + @"x86_64" : @"ppc64"; + else + arch = (cpu == CPU_TYPE_X86) ? @"x86" : @"ppc"; + + [self setArchitecture:arch]; + } + } else { + // Specify the default architecture + [self setArchitecture:[[headers_ allKeys] objectAtIndex:0]]; + } + } + + return self; +} + +//============================================================================= +- (NSArray *)availableArchitectures { + return [headers_ allKeys]; +} + +//============================================================================= +- (void)dealloc { + [sourcePath_ release]; + [architecture_ release]; + [addresses_ release]; + [functionAddresses_ release]; + [sources_ release]; + [headers_ release]; + delete sectionsForArch_; + + [super dealloc]; +} + +//============================================================================= +- (BOOL)setArchitecture:(NSString *)architecture { + NSString *normalized = [architecture lowercaseString]; + BOOL isValid = NO; + + if ([normalized isEqualToString:@"ppc"]) { + isValid = YES; + } + else if ([normalized isEqualToString:@"i386"]) { + normalized = @"x86"; + isValid = YES; + } + else if ([normalized isEqualToString:@"x86"]) { + isValid = YES; + } + else if ([normalized isEqualToString:@"ppc64"]) { + isValid = YES; + } + else if ([normalized isEqualToString:@"x86_64"]) { + isValid = YES; + } + + if (isValid) { + if (![headers_ objectForKey:normalized]) + return NO; + + [architecture_ autorelease]; + architecture_ = [normalized copy]; + } + + return isValid; +} + +//============================================================================= +- (NSString *)architecture { + return architecture_; +} + +//============================================================================= +- (BOOL)writeSymbolFile:(NSString *)destinationPath { + const char *dest = [destinationPath fileSystemRepresentation]; + int fd; + + if ([[destinationPath substringToIndex:1] isEqualToString:@"-"]) + fd = STDOUT_FILENO; + else + fd = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0666); + + if (fd == -1) + return NO; + + BOOL result = [self outputSymbolFile:fd]; + + close(fd); + + return result; +} + +@end + +@implementation MachSection + +- (id)initWithMachSection:(section *)sect andNumber:(uint32_t)sectionNumber { + if ((self = [super init])) { + sect_ = sect; + sectionNumber_ = sectionNumber; + } + + return self; +} + +- (section*)sectionPointer { + return sect_; +} + +- (uint32_t)sectionNumber { + return sectionNumber_; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader-inl.h b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader-inl.h new file mode 100644 index 00000000..7ccd0fe6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader-inl.h @@ -0,0 +1,141 @@ +// Copyright 2006 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef UTIL_DEBUGINFO_BYTEREADER_INL_H__ +#define UTIL_DEBUGINFO_BYTEREADER_INL_H__ + +#include "common/mac/dwarf/bytereader.h" + +namespace dwarf2reader { + +inline uint8 ByteReader::ReadOneByte(const char* buffer) const { + return buffer[0]; +} + +inline uint16 ByteReader::ReadTwoBytes(const char* buffer) const { + const uint16 buffer0 = static_cast(buffer[0]); + const uint16 buffer1 = static_cast(buffer[1]); + if (endian_ == ENDIANNESS_LITTLE) { + return buffer0 | buffer1 << 8; + } else { + return buffer1 | buffer0 << 8; + } +} + +inline uint64 ByteReader::ReadFourBytes(const char* buffer) const { + const uint32 buffer0 = static_cast(buffer[0]); + const uint32 buffer1 = static_cast(buffer[1]); + const uint32 buffer2 = static_cast(buffer[2]); + const uint32 buffer3 = static_cast(buffer[3]); + if (endian_ == ENDIANNESS_LITTLE) { + return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24; + } else { + return buffer3 | buffer2 << 8 | buffer1 << 16 | buffer0 << 24; + } +} + +inline uint64 ByteReader::ReadEightBytes(const char* buffer) const { + const uint64 buffer0 = static_cast(buffer[0]); + const uint64 buffer1 = static_cast(buffer[1]); + const uint64 buffer2 = static_cast(buffer[2]); + const uint64 buffer3 = static_cast(buffer[3]); + const uint64 buffer4 = static_cast(buffer[4]); + const uint64 buffer5 = static_cast(buffer[5]); + const uint64 buffer6 = static_cast(buffer[6]); + const uint64 buffer7 = static_cast(buffer[7]); + if (endian_ == ENDIANNESS_LITTLE) { + return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24 | + buffer4 << 32 | buffer5 << 40 | buffer6 << 48 | buffer7 << 56; + } else { + return buffer7 | buffer6 << 8 | buffer5 << 16 | buffer4 << 24 | + buffer3 << 32 | buffer2 << 40 | buffer1 << 48 | buffer0 << 56; + } +} + +// Read an unsigned LEB128 number. Each byte contains 7 bits of +// information, plus one bit saying whether the number continues or +// not. + +inline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer, + size_t* len) const { + uint64 result = 0; + size_t num_read = 0; + unsigned int shift = 0; + unsigned char byte; + + do { + byte = *buffer++; + num_read++; + + result |= (static_cast(byte & 0x7f)) << shift; + + shift += 7; + + } while (byte & 0x80); + + *len = num_read; + + return result; +} + +// Read a signed LEB128 number. These are like regular LEB128 +// numbers, except the last byte may have a sign bit set. + +inline int64 ByteReader::ReadSignedLEB128(const char* buffer, + size_t* len) const { + int64 result = 0; + unsigned int shift = 0; + size_t num_read = 0; + unsigned char byte; + + do { + byte = *buffer++; + num_read++; + result |= (static_cast(byte & 0x7f) << shift); + shift += 7; + } while (byte & 0x80); + + if ((shift < 8 * sizeof (result)) && (byte & 0x40)) + result |= -((static_cast(1)) << shift); + *len = num_read; + return result; +} + +inline uint64 ByteReader::ReadOffset(const char* buffer) const { + assert(this->offset_reader_); + return (this->*offset_reader_)(buffer); +} + +inline uint64 ByteReader::ReadAddress(const char* buffer) const { + assert(this->address_reader_); + return (this->*address_reader_)(buffer); +} + +} // namespace dwarf2reader + +#endif // UTIL_DEBUGINFO_BYTEREADER_INL_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader.cc b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader.cc new file mode 100644 index 00000000..823cf2b6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader.cc @@ -0,0 +1,62 @@ +// Copyright 2006 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "common/mac/dwarf/bytereader-inl.h" + +#include "common/mac/dwarf/bytereader.h" + +namespace dwarf2reader { + +ByteReader::ByteReader(enum Endianness endian) + :offset_reader_(NULL), address_reader_(NULL), endian_(endian), + address_size_(0), offset_size_(0) +{ } + +ByteReader::~ByteReader() { } + +void ByteReader::SetOffsetSize(uint8 size) { + offset_size_ = size; + assert(size == 4 || size == 8); + if (size == 4) { + this->offset_reader_ = &ByteReader::ReadFourBytes; + } else { + this->offset_reader_ = &ByteReader::ReadEightBytes; + } +} + +void ByteReader::SetAddressSize(uint8 size) { + address_size_ = size; + assert(size == 4 || size == 8); + if (size == 4) { + this->address_reader_ = &ByteReader::ReadFourBytes; + } else { + this->address_reader_ = &ByteReader::ReadEightBytes; + } +} + +} // namespace dwarf2reader diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader.h b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader.h new file mode 100644 index 00000000..299dd9ac --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/bytereader.h @@ -0,0 +1,132 @@ +// Copyright 2006 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_MAC_DWARF_BYTEREADER_H__ +#define COMMON_MAC_DWARF_BYTEREADER_H__ + +#include +#include "common/mac/dwarf/types.h" + +namespace dwarf2reader { + +// We can't use the obvious name of LITTLE_ENDIAN and BIG_ENDIAN +// because it conflicts with a macro +enum Endianness { + ENDIANNESS_BIG, + ENDIANNESS_LITTLE +}; + +// Class that knows how to read both big endian and little endian +// numbers, for use in DWARF2/3 reader. +// Takes an endianness argument. +// To read addresses and offsets, SetAddressSize and SetOffsetSize +// must be called first. +class ByteReader { + public: + explicit ByteReader(enum Endianness endian); + virtual ~ByteReader(); + + // Set the address size to SIZE, which sets up the ReadAddress member + // so that it works. + void SetAddressSize(uint8 size); + + // Set the offset size to SIZE, which sets up the ReadOffset member + // so that it works. + void SetOffsetSize(uint8 size); + + // Return the current offset size + uint8 OffsetSize() const { return offset_size_; } + + // Return the current address size + uint8 AddressSize() const { return address_size_; } + + // Read a single byte from BUFFER and return it as an unsigned 8 bit + // number. + uint8 ReadOneByte(const char* buffer) const; + + // Read two bytes from BUFFER and return it as an unsigned 16 bit + // number. + uint16 ReadTwoBytes(const char* buffer) const; + + // Read four bytes from BUFFER and return it as an unsigned 32 bit + // number. This function returns a uint64 so that it is compatible + // with ReadAddress and ReadOffset. The number it returns will + // never be outside the range of an unsigned 32 bit integer. + uint64 ReadFourBytes(const char* buffer) const; + + // Read eight bytes from BUFFER and return it as an unsigned 64 bit + // number + uint64 ReadEightBytes(const char* buffer) const; + + // Read an unsigned LEB128 (Little Endian Base 128) number from + // BUFFER and return it as an unsigned 64 bit integer. LEN is set + // to the length read. Everybody seems to reinvent LEB128 as a + // variable size integer encoding, DWARF has had it for a long time. + uint64 ReadUnsignedLEB128(const char* buffer, size_t* len) const; + + // Read a signed LEB128 number from BUFFER and return it as an + // signed 64 bit integer. LEN is set to the length read. + int64 ReadSignedLEB128(const char* buffer, size_t* len) const; + + // Read an offset from BUFFER and return it as an unsigned 64 bit + // integer. DWARF2/3 define offsets as either 4 or 8 bytes, + // generally depending on the amount of DWARF2/3 info present. + uint64 ReadOffset(const char* buffer) const; + + // Read an address from BUFFER and return it as an unsigned 64 bit + // integer. DWARF2/3 allow addresses to be any size from 0-255 + // bytes currently. Internally we support 4 and 8 byte addresses, + // and will CHECK on anything else. + uint64 ReadAddress(const char* buffer) const; + + private: + + // Function pointer type for our address and offset readers. + typedef uint64 (ByteReader::*AddressReader)(const char*) const; + + // Read an offset from BUFFER and return it as an unsigned 64 bit + // integer. DWARF2/3 define offsets as either 4 or 8 bytes, + // generally depending on the amount of DWARF2/3 info present. + // This function pointer gets set by SetOffsetSize. + AddressReader offset_reader_; + + // Read an address from BUFFER and return it as an unsigned 64 bit + // integer. DWARF2/3 allow addresses to be any size from 0-255 + // bytes currently. Internally we support 4 and 8 byte addresses, + // and will CHECK on anything else. + // This function pointer gets set by SetAddressSize. + AddressReader address_reader_; + + Endianness endian_; + uint8 address_size_; + uint8 offset_size_; +}; + +} // namespace dwarf2reader + +#endif // COMMON_MAC_DWARF_BYTEREADER_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2enums.h b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2enums.h new file mode 100644 index 00000000..c52e2b47 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2enums.h @@ -0,0 +1,490 @@ +// Copyright 2006 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_MAC_DWARF_DWARF2ENUMS_H__ +#define COMMON_MAC_DWARF_DWARF2ENUMS_H__ + +namespace dwarf2reader { + +// These enums do not follow the google3 style only because they are +// known universally (specs, other implementations) by the names in +// exactly this capitalization. +// Tag names and codes. +enum DwarfTag { + DW_TAG_padding = 0x00, + DW_TAG_array_type = 0x01, + DW_TAG_class_type = 0x02, + DW_TAG_entry_point = 0x03, + DW_TAG_enumeration_type = 0x04, + DW_TAG_formal_parameter = 0x05, + DW_TAG_imported_declaration = 0x08, + DW_TAG_label = 0x0a, + DW_TAG_lexical_block = 0x0b, + DW_TAG_member = 0x0d, + DW_TAG_pointer_type = 0x0f, + DW_TAG_reference_type = 0x10, + DW_TAG_compile_unit = 0x11, + DW_TAG_string_type = 0x12, + DW_TAG_structure_type = 0x13, + DW_TAG_subroutine_type = 0x15, + DW_TAG_typedef = 0x16, + DW_TAG_union_type = 0x17, + DW_TAG_unspecified_parameters = 0x18, + DW_TAG_variant = 0x19, + DW_TAG_common_block = 0x1a, + DW_TAG_common_inclusion = 0x1b, + DW_TAG_inheritance = 0x1c, + DW_TAG_inlined_subroutine = 0x1d, + DW_TAG_module = 0x1e, + DW_TAG_ptr_to_member_type = 0x1f, + DW_TAG_set_type = 0x20, + DW_TAG_subrange_type = 0x21, + DW_TAG_with_stmt = 0x22, + DW_TAG_access_declaration = 0x23, + DW_TAG_base_type = 0x24, + DW_TAG_catch_block = 0x25, + DW_TAG_const_type = 0x26, + DW_TAG_constant = 0x27, + DW_TAG_enumerator = 0x28, + DW_TAG_file_type = 0x29, + DW_TAG_friend = 0x2a, + DW_TAG_namelist = 0x2b, + DW_TAG_namelist_item = 0x2c, + DW_TAG_packed_type = 0x2d, + DW_TAG_subprogram = 0x2e, + DW_TAG_template_type_param = 0x2f, + DW_TAG_template_value_param = 0x30, + DW_TAG_thrown_type = 0x31, + DW_TAG_try_block = 0x32, + DW_TAG_variant_part = 0x33, + DW_TAG_variable = 0x34, + DW_TAG_volatile_type = 0x35, + // DWARF 3. + DW_TAG_dwarf_procedure = 0x36, + DW_TAG_restrict_type = 0x37, + DW_TAG_interface_type = 0x38, + DW_TAG_namespace = 0x39, + DW_TAG_imported_module = 0x3a, + DW_TAG_unspecified_type = 0x3b, + DW_TAG_partial_unit = 0x3c, + DW_TAG_imported_unit = 0x3d, + // SGI/MIPS Extensions. + DW_TAG_MIPS_loop = 0x4081, + // HP extensions. See: + // ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz + DW_TAG_HP_array_descriptor = 0x4090, + // GNU extensions. + DW_TAG_format_label = 0x4101, // For FORTRAN 77 and Fortran 90. + DW_TAG_function_template = 0x4102, // For C++. + DW_TAG_class_template = 0x4103, // For C++. + DW_TAG_GNU_BINCL = 0x4104, + DW_TAG_GNU_EINCL = 0x4105, + // Extensions for UPC. See: http://upc.gwu.edu/~upc. + DW_TAG_upc_shared_type = 0x8765, + DW_TAG_upc_strict_type = 0x8766, + DW_TAG_upc_relaxed_type = 0x8767, + // PGI (STMicroelectronics) extensions. No documentation available. + DW_TAG_PGI_kanji_type = 0xA000, + DW_TAG_PGI_interface_block = 0xA020 +}; + + +enum DwarfHasChild { + DW_children_no = 0, + DW_children_yes = 1 +}; + +// Form names and codes. +enum DwarfForm { + DW_FORM_addr = 0x01, + DW_FORM_block2 = 0x03, + DW_FORM_block4 = 0x04, + DW_FORM_data2 = 0x05, + DW_FORM_data4 = 0x06, + DW_FORM_data8 = 0x07, + DW_FORM_string = 0x08, + DW_FORM_block = 0x09, + DW_FORM_block1 = 0x0a, + DW_FORM_data1 = 0x0b, + DW_FORM_flag = 0x0c, + DW_FORM_sdata = 0x0d, + DW_FORM_strp = 0x0e, + DW_FORM_udata = 0x0f, + DW_FORM_ref_addr = 0x10, + DW_FORM_ref1 = 0x11, + DW_FORM_ref2 = 0x12, + DW_FORM_ref4 = 0x13, + DW_FORM_ref8 = 0x14, + DW_FORM_ref_udata = 0x15, + DW_FORM_indirect = 0x16 +}; + +// Attribute names and codes +enum DwarfAttribute { + DW_AT_sibling = 0x01, + DW_AT_location = 0x02, + DW_AT_name = 0x03, + DW_AT_ordering = 0x09, + DW_AT_subscr_data = 0x0a, + DW_AT_byte_size = 0x0b, + DW_AT_bit_offset = 0x0c, + DW_AT_bit_size = 0x0d, + DW_AT_element_list = 0x0f, + DW_AT_stmt_list = 0x10, + DW_AT_low_pc = 0x11, + DW_AT_high_pc = 0x12, + DW_AT_language = 0x13, + DW_AT_member = 0x14, + DW_AT_discr = 0x15, + DW_AT_discr_value = 0x16, + DW_AT_visibility = 0x17, + DW_AT_import = 0x18, + DW_AT_string_length = 0x19, + DW_AT_common_reference = 0x1a, + DW_AT_comp_dir = 0x1b, + DW_AT_const_value = 0x1c, + DW_AT_containing_type = 0x1d, + DW_AT_default_value = 0x1e, + DW_AT_inline = 0x20, + DW_AT_is_optional = 0x21, + DW_AT_lower_bound = 0x22, + DW_AT_producer = 0x25, + DW_AT_prototyped = 0x27, + DW_AT_return_addr = 0x2a, + DW_AT_start_scope = 0x2c, + DW_AT_stride_size = 0x2e, + DW_AT_upper_bound = 0x2f, + DW_AT_abstract_origin = 0x31, + DW_AT_accessibility = 0x32, + DW_AT_address_class = 0x33, + DW_AT_artificial = 0x34, + DW_AT_base_types = 0x35, + DW_AT_calling_convention = 0x36, + DW_AT_count = 0x37, + DW_AT_data_member_location = 0x38, + DW_AT_decl_column = 0x39, + DW_AT_decl_file = 0x3a, + DW_AT_decl_line = 0x3b, + DW_AT_declaration = 0x3c, + DW_AT_discr_list = 0x3d, + DW_AT_encoding = 0x3e, + DW_AT_external = 0x3f, + DW_AT_frame_base = 0x40, + DW_AT_friend = 0x41, + DW_AT_identifier_case = 0x42, + DW_AT_macro_info = 0x43, + DW_AT_namelist_items = 0x44, + DW_AT_priority = 0x45, + DW_AT_segment = 0x46, + DW_AT_specification = 0x47, + DW_AT_static_link = 0x48, + DW_AT_type = 0x49, + DW_AT_use_location = 0x4a, + DW_AT_variable_parameter = 0x4b, + DW_AT_virtuality = 0x4c, + DW_AT_vtable_elem_location = 0x4d, + // DWARF 3 values. + DW_AT_allocated = 0x4e, + DW_AT_associated = 0x4f, + DW_AT_data_location = 0x50, + DW_AT_stride = 0x51, + DW_AT_entry_pc = 0x52, + DW_AT_use_UTF8 = 0x53, + DW_AT_extension = 0x54, + DW_AT_ranges = 0x55, + DW_AT_trampoline = 0x56, + DW_AT_call_column = 0x57, + DW_AT_call_file = 0x58, + DW_AT_call_line = 0x59, + // SGI/MIPS extensions. + DW_AT_MIPS_fde = 0x2001, + DW_AT_MIPS_loop_begin = 0x2002, + DW_AT_MIPS_tail_loop_begin = 0x2003, + DW_AT_MIPS_epilog_begin = 0x2004, + DW_AT_MIPS_loop_unroll_factor = 0x2005, + DW_AT_MIPS_software_pipeline_depth = 0x2006, + DW_AT_MIPS_linkage_name = 0x2007, + DW_AT_MIPS_stride = 0x2008, + DW_AT_MIPS_abstract_name = 0x2009, + DW_AT_MIPS_clone_origin = 0x200a, + DW_AT_MIPS_has_inlines = 0x200b, + // HP extensions. + DW_AT_HP_block_index = 0x2000, + DW_AT_HP_unmodifiable = 0x2001, // Same as DW_AT_MIPS_fde. + DW_AT_HP_actuals_stmt_list = 0x2010, + DW_AT_HP_proc_per_section = 0x2011, + DW_AT_HP_raw_data_ptr = 0x2012, + DW_AT_HP_pass_by_reference = 0x2013, + DW_AT_HP_opt_level = 0x2014, + DW_AT_HP_prof_version_id = 0x2015, + DW_AT_HP_opt_flags = 0x2016, + DW_AT_HP_cold_region_low_pc = 0x2017, + DW_AT_HP_cold_region_high_pc = 0x2018, + DW_AT_HP_all_variables_modifiable = 0x2019, + DW_AT_HP_linkage_name = 0x201a, + DW_AT_HP_prof_flags = 0x201b, // In comp unit of procs_info for -g. + // GNU extensions. + DW_AT_sf_names = 0x2101, + DW_AT_src_info = 0x2102, + DW_AT_mac_info = 0x2103, + DW_AT_src_coords = 0x2104, + DW_AT_body_begin = 0x2105, + DW_AT_body_end = 0x2106, + DW_AT_GNU_vector = 0x2107, + // VMS extensions. + DW_AT_VMS_rtnbeg_pd_address = 0x2201, + // UPC extension. + DW_AT_upc_threads_scaled = 0x3210, + // PGI (STMicroelectronics) extensions. + DW_AT_PGI_lbase = 0x3a00, + DW_AT_PGI_soffset = 0x3a01, + DW_AT_PGI_lstride = 0x3a02 +}; + + +// Line number opcodes. +enum DwarfLineNumberOps { + DW_LNS_extended_op = 0, + DW_LNS_copy = 1, + DW_LNS_advance_pc = 2, + DW_LNS_advance_line = 3, + DW_LNS_set_file = 4, + DW_LNS_set_column = 5, + DW_LNS_negate_stmt = 6, + DW_LNS_set_basic_block = 7, + DW_LNS_const_add_pc = 8, + DW_LNS_fixed_advance_pc = 9, + // DWARF 3. + DW_LNS_set_prologue_end = 10, + DW_LNS_set_epilogue_begin = 11, + DW_LNS_set_isa = 12 +}; + +// Line number extended opcodes. +enum DwarfLineNumberExtendedOps { + DW_LNE_end_sequence = 1, + DW_LNE_set_address = 2, + DW_LNE_define_file = 3, + // HP extensions. + DW_LNE_HP_negate_is_UV_update = 0x11, + DW_LNE_HP_push_context = 0x12, + DW_LNE_HP_pop_context = 0x13, + DW_LNE_HP_set_file_line_column = 0x14, + DW_LNE_HP_set_routine_name = 0x15, + DW_LNE_HP_set_sequence = 0x16, + DW_LNE_HP_negate_post_semantics = 0x17, + DW_LNE_HP_negate_function_exit = 0x18, + DW_LNE_HP_negate_front_end_logical = 0x19, + DW_LNE_HP_define_proc = 0x20 +}; + +// Type encoding names and codes +enum DwarfEncoding { + DW_ATE_address =0x1, + DW_ATE_boolean =0x2, + DW_ATE_complex_float =0x3, + DW_ATE_float =0x4, + DW_ATE_signed =0x5, + DW_ATE_signed_char =0x6, + DW_ATE_unsigned =0x7, + DW_ATE_unsigned_char =0x8, + // DWARF3/DWARF3f + DW_ATE_imaginary_float =0x9, + DW_ATE_packed_decimal =0xa, + DW_ATE_numeric_string =0xb, + DW_ATE_edited =0xc, + DW_ATE_signed_fixed =0xd, + DW_ATE_unsigned_fixed =0xe, + DW_ATE_decimal_float =0xf, + DW_ATE_lo_user =0x80, + DW_ATE_hi_user =0xff +}; + +// Location virtual machine opcodes +enum DwarfOpcode { + DW_OP_addr =0x03, + DW_OP_deref =0x06, + DW_OP_const1u =0x08, + DW_OP_const1s =0x09, + DW_OP_const2u =0x0a, + DW_OP_const2s =0x0b, + DW_OP_const4u =0x0c, + DW_OP_const4s =0x0d, + DW_OP_const8u =0x0e, + DW_OP_const8s =0x0f, + DW_OP_constu =0x10, + DW_OP_consts =0x11, + DW_OP_dup =0x12, + DW_OP_drop =0x13, + DW_OP_over =0x14, + DW_OP_pick =0x15, + DW_OP_swap =0x16, + DW_OP_rot =0x17, + DW_OP_xderef =0x18, + DW_OP_abs =0x19, + DW_OP_and =0x1a, + DW_OP_div =0x1b, + DW_OP_minus =0x1c, + DW_OP_mod =0x1d, + DW_OP_mul =0x1e, + DW_OP_neg =0x1f, + DW_OP_not =0x20, + DW_OP_or =0x21, + DW_OP_plus =0x22, + DW_OP_plus_uconst =0x23, + DW_OP_shl =0x24, + DW_OP_shr =0x25, + DW_OP_shra =0x26, + DW_OP_xor =0x27, + DW_OP_bra =0x28, + DW_OP_eq =0x29, + DW_OP_ge =0x2a, + DW_OP_gt =0x2b, + DW_OP_le =0x2c, + DW_OP_lt =0x2d, + DW_OP_ne =0x2e, + DW_OP_skip =0x2f, + DW_OP_lit0 =0x30, + DW_OP_lit1 =0x31, + DW_OP_lit2 =0x32, + DW_OP_lit3 =0x33, + DW_OP_lit4 =0x34, + DW_OP_lit5 =0x35, + DW_OP_lit6 =0x36, + DW_OP_lit7 =0x37, + DW_OP_lit8 =0x38, + DW_OP_lit9 =0x39, + DW_OP_lit10 =0x3a, + DW_OP_lit11 =0x3b, + DW_OP_lit12 =0x3c, + DW_OP_lit13 =0x3d, + DW_OP_lit14 =0x3e, + DW_OP_lit15 =0x3f, + DW_OP_lit16 =0x40, + DW_OP_lit17 =0x41, + DW_OP_lit18 =0x42, + DW_OP_lit19 =0x43, + DW_OP_lit20 =0x44, + DW_OP_lit21 =0x45, + DW_OP_lit22 =0x46, + DW_OP_lit23 =0x47, + DW_OP_lit24 =0x48, + DW_OP_lit25 =0x49, + DW_OP_lit26 =0x4a, + DW_OP_lit27 =0x4b, + DW_OP_lit28 =0x4c, + DW_OP_lit29 =0x4d, + DW_OP_lit30 =0x4e, + DW_OP_lit31 =0x4f, + DW_OP_reg0 =0x50, + DW_OP_reg1 =0x51, + DW_OP_reg2 =0x52, + DW_OP_reg3 =0x53, + DW_OP_reg4 =0x54, + DW_OP_reg5 =0x55, + DW_OP_reg6 =0x56, + DW_OP_reg7 =0x57, + DW_OP_reg8 =0x58, + DW_OP_reg9 =0x59, + DW_OP_reg10 =0x5a, + DW_OP_reg11 =0x5b, + DW_OP_reg12 =0x5c, + DW_OP_reg13 =0x5d, + DW_OP_reg14 =0x5e, + DW_OP_reg15 =0x5f, + DW_OP_reg16 =0x60, + DW_OP_reg17 =0x61, + DW_OP_reg18 =0x62, + DW_OP_reg19 =0x63, + DW_OP_reg20 =0x64, + DW_OP_reg21 =0x65, + DW_OP_reg22 =0x66, + DW_OP_reg23 =0x67, + DW_OP_reg24 =0x68, + DW_OP_reg25 =0x69, + DW_OP_reg26 =0x6a, + DW_OP_reg27 =0x6b, + DW_OP_reg28 =0x6c, + DW_OP_reg29 =0x6d, + DW_OP_reg30 =0x6e, + DW_OP_reg31 =0x6f, + DW_OP_breg0 =0x70, + DW_OP_breg1 =0x71, + DW_OP_breg2 =0x72, + DW_OP_breg3 =0x73, + DW_OP_breg4 =0x74, + DW_OP_breg5 =0x75, + DW_OP_breg6 =0x76, + DW_OP_breg7 =0x77, + DW_OP_breg8 =0x78, + DW_OP_breg9 =0x79, + DW_OP_breg10 =0x7a, + DW_OP_breg11 =0x7b, + DW_OP_breg12 =0x7c, + DW_OP_breg13 =0x7d, + DW_OP_breg14 =0x7e, + DW_OP_breg15 =0x7f, + DW_OP_breg16 =0x80, + DW_OP_breg17 =0x81, + DW_OP_breg18 =0x82, + DW_OP_breg19 =0x83, + DW_OP_breg20 =0x84, + DW_OP_breg21 =0x85, + DW_OP_breg22 =0x86, + DW_OP_breg23 =0x87, + DW_OP_breg24 =0x88, + DW_OP_breg25 =0x89, + DW_OP_breg26 =0x8a, + DW_OP_breg27 =0x8b, + DW_OP_breg28 =0x8c, + DW_OP_breg29 =0x8d, + DW_OP_breg30 =0x8e, + DW_OP_breg31 =0x8f, + DW_OP_regX =0x90, + DW_OP_fbreg =0x91, + DW_OP_bregX =0x92, + DW_OP_piece =0x93, + DW_OP_deref_size =0x94, + DW_OP_xderef_size =0x95, + DW_OP_nop =0x96, + // DWARF3/DWARF3f + DW_OP_push_object_address =0x97, + DW_OP_call2 =0x98, + DW_OP_call4 =0x99, + DW_OP_call_ref =0x9a, + DW_OP_form_tls_address =0x9b, + DW_OP_call_frame_cfa =0x9c, + DW_OP_bit_piece =0x9d, + DW_OP_lo_user =0xe0, + DW_OP_hi_user =0xff, + // GNU extensions + DW_OP_GNU_push_tls_address =0xe0 +}; + +} // namespace dwarf2reader +#endif // COMMON_MAC_DWARF_DWARF2ENUMS_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2reader.cc b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2reader.cc new file mode 100644 index 00000000..6e7a2f1d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2reader.cc @@ -0,0 +1,830 @@ +// Copyright 2006 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include + +#include "common/mac/dwarf/bytereader-inl.h" +#include "common/mac/dwarf/dwarf2reader.h" +#include "common/mac/dwarf/bytereader.h" +#include "common/mac/dwarf/line_state_machine.h" + +namespace __gnu_cxx +{ + template<> struct hash< std::string > + { + size_t operator()( const std::string& x ) const + { + return hash< const char* >()( x.c_str() ); + } + }; +} + +namespace dwarf2reader { + +// Read a DWARF2/3 initial length field from START, using READER, and +// report the length in LEN. Return the actual initial length. + +static uint64 ReadInitialLength(const char* start, + ByteReader* reader, size_t* len) { + const uint64 initial_length = reader->ReadFourBytes(start); + start += 4; + + // In DWARF2/3, if the initial length is all 1 bits, then the offset + // size is 8 and we need to read the next 8 bytes for the real length. + if (initial_length == 0xffffffff) { + reader->SetOffsetSize(8); + *len = 12; + return reader->ReadOffset(start); + } else { + reader->SetOffsetSize(4); + *len = 4; + } + return initial_length; +} + +CompilationUnit::CompilationUnit(const SectionMap& sections, uint64 offset, + ByteReader* reader, Dwarf2Handler* handler) + : offset_from_section_start_(offset), reader_(reader), + sections_(sections), handler_(handler), abbrevs_(NULL), + string_buffer_(NULL), string_buffer_length_(0) {} + +// Read a DWARF2/3 abbreviation section. +// Each abbrev consists of a abbreviation number, a tag, a byte +// specifying whether the tag has children, and a list of +// attribute/form pairs. +// The list of forms is terminated by a 0 for the attribute, and a +// zero for the form. The entire abbreviation section is terminated +// by a zero for the code. + +void CompilationUnit::ReadAbbrevs() { + if (abbrevs_) + return; + + // First get the debug_abbrev section + SectionMap::const_iterator iter = sections_.find("__debug_abbrev"); + assert(iter != sections_.end()); + + abbrevs_ = new vector; + abbrevs_->resize(1); + + // The only way to check whether we are reading over the end of the + // buffer would be to first compute the size of the leb128 data by + // reading it, then go back and read it again. + const char* abbrev_start = iter->second.first + + header_.abbrev_offset; + const char* abbrevptr = abbrev_start; + const uint64 abbrev_length = iter->second.second - header_.abbrev_offset; + + while (1) { + CompilationUnit::Abbrev abbrev; + size_t len; + const uint32 number = reader_->ReadUnsignedLEB128(abbrevptr, &len); + + if (number == 0) + break; + abbrev.number = number; + abbrevptr += len; + + assert(abbrevptr < abbrev_start + abbrev_length); + const uint32 tag = reader_->ReadUnsignedLEB128(abbrevptr, &len); + abbrevptr += len; + abbrev.tag = static_cast(tag); + + assert(abbrevptr < abbrev_start + abbrev_length); + abbrev.has_children = reader_->ReadOneByte(abbrevptr); + abbrevptr += 1; + + assert(abbrevptr < abbrev_start + abbrev_length); + + while (1) { + const uint32 nametemp = reader_->ReadUnsignedLEB128(abbrevptr, &len); + abbrevptr += len; + + assert(abbrevptr < abbrev_start + abbrev_length); + const uint32 formtemp = reader_->ReadUnsignedLEB128(abbrevptr, &len); + abbrevptr += len; + if (nametemp == 0 && formtemp == 0) + break; + + const enum DwarfAttribute name = + static_cast(nametemp); + const enum DwarfForm form = static_cast(formtemp); + abbrev.attributes.push_back(make_pair(name, form)); + } + assert(abbrev.number == abbrevs_->size()); + abbrevs_->push_back(abbrev); + } +} + +// Skips a single DIE's attributes. +const char* CompilationUnit::SkipDIE(const char* start, + const Abbrev& abbrev) { + for (AttributeList::const_iterator i = abbrev.attributes.begin(); + i != abbrev.attributes.end(); + i++) { + start = SkipAttribute(start, i->second); + } + return start; +} + +// Skips a single attribute form's data. +const char* CompilationUnit::SkipAttribute(const char* start, + enum DwarfForm form) { + size_t len; + + switch (form) { + case DW_FORM_indirect: + form = static_cast(reader_->ReadUnsignedLEB128(start, + &len)); + start += len; + return SkipAttribute(start, form); + break; + + case DW_FORM_data1: + case DW_FORM_flag: + case DW_FORM_ref1: + return start + 1; + break; + case DW_FORM_ref2: + case DW_FORM_data2: + return start + 2; + break; + case DW_FORM_ref4: + case DW_FORM_data4: + return start + 4; + break; + case DW_FORM_ref8: + case DW_FORM_data8: + return start + 8; + break; + case DW_FORM_string: + return start + strlen(start) + 1; + break; + case DW_FORM_udata: + case DW_FORM_ref_udata: + reader_->ReadUnsignedLEB128(start, &len); + return start + len; + break; + + case DW_FORM_sdata: + reader_->ReadSignedLEB128(start, &len); + return start + len; + break; + case DW_FORM_addr: + return start + reader_->AddressSize(); + break; + case DW_FORM_ref_addr: + // DWARF2 and 3 differ on whether ref_addr is address size or + // offset size. + assert(header_.version == 2 || header_.version == 3); + if (header_.version == 2) { + return start + reader_->AddressSize(); + } else if (header_.version == 3) { + return start + reader_->OffsetSize(); + } + break; + + case DW_FORM_block1: + return start + 1 + reader_->ReadOneByte(start); + break; + case DW_FORM_block2: + return start + 2 + reader_->ReadTwoBytes(start); + break; + case DW_FORM_block4: + return start + 4 + reader_->ReadFourBytes(start); + break; + case DW_FORM_block: { + uint64 size = reader_->ReadUnsignedLEB128(start, &len); + return start + size + len; + } + break; + case DW_FORM_strp: + return start + reader_->OffsetSize(); + break; + default: + fprintf(stderr,"Unhandled form type"); + } + fprintf(stderr,"Unhandled form type"); + return NULL; +} + +// Read a DWARF2/3 header. +// The header is variable length in DWARF3 (and DWARF2 as extended by +// most compilers), and consists of an length field, a version number, +// the offset in the .debug_abbrev section for our abbrevs, and an +// address size. +void CompilationUnit::ReadHeader() { + const char* headerptr = buffer_; + size_t initial_length_size; + + assert(headerptr + 4 < buffer_ + buffer_length_); + const uint64 initial_length = ReadInitialLength(headerptr, reader_, + &initial_length_size); + headerptr += initial_length_size; + header_.length = initial_length; + + assert(headerptr + 2 < buffer_ + buffer_length_); + header_.version = reader_->ReadTwoBytes(headerptr); + headerptr += 2; + + assert(headerptr + reader_->OffsetSize() < buffer_ + buffer_length_); + header_.abbrev_offset = reader_->ReadOffset(headerptr); + headerptr += reader_->OffsetSize(); + + assert(headerptr + 1 < buffer_ + buffer_length_); + header_.address_size = reader_->ReadOneByte(headerptr); + reader_->SetAddressSize(header_.address_size); + headerptr += 1; + + after_header_ = headerptr; + + // This check ensures that we don't have to do checking during the + // reading of DIEs. header_.length does not include the size of the + // initial length. + assert(buffer_ + initial_length_size + header_.length <= + buffer_ + buffer_length_); +} + +uint64 CompilationUnit::Start() { + // First get the debug_info section + SectionMap::const_iterator iter = sections_.find("__debug_info"); + assert(iter != sections_.end()); + + // Set up our buffer + buffer_ = iter->second.first + offset_from_section_start_; + buffer_length_ = iter->second.second - offset_from_section_start_; + + // Read the header + ReadHeader(); + + // Figure out the real length from the end of the initial length to + // the end of the compilation unit, since that is the value we + // return. + uint64 ourlength = header_.length; + if (reader_->OffsetSize() == 8) + ourlength += 12; + else + ourlength += 4; + + // See if the user wants this compilation unit, and if not, just return. + if (!handler_->StartCompilationUnit(offset_from_section_start_, + reader_->AddressSize(), + reader_->OffsetSize(), + header_.length, + header_.version)) + return ourlength; + + // Otherwise, continue by reading our abbreviation entries. + ReadAbbrevs(); + + // Set the string section if we have one. + iter = sections_.find("__debug_str"); + if (iter != sections_.end()) { + string_buffer_ = iter->second.first; + string_buffer_length_ = iter->second.second; + } + + // Now that we have our abbreviations, start processing DIE's. + ProcessDIEs(); + + return ourlength; +} + +// If one really wanted, you could merge SkipAttribute and +// ProcessAttribute +// This is all boring data manipulation and calling of the handler. +const char* CompilationUnit::ProcessAttribute( + uint64 dieoffset, const char* start, enum DwarfAttribute attr, + enum DwarfForm form) { + size_t len; + + switch (form) { + // DW_FORM_indirect is never used because it is such a space + // waster. + case DW_FORM_indirect: + form = static_cast(reader_->ReadUnsignedLEB128(start, + &len)); + start += len; + return ProcessAttribute(dieoffset, start, attr, form); + break; + + case DW_FORM_data1: + case DW_FORM_flag: + case DW_FORM_ref1: + handler_->ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadOneByte(start)); + return start + 1; + break; + case DW_FORM_ref2: + case DW_FORM_data2: + handler_->ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadTwoBytes(start)); + return start + 2; + break; + case DW_FORM_ref4: + case DW_FORM_data4: + handler_->ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadFourBytes(start)); + return start + 4; + break; + case DW_FORM_ref8: + case DW_FORM_data8: + handler_->ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadEightBytes(start)); + return start + 8; + break; + case DW_FORM_string: { + const char* str = start; + handler_->ProcessAttributeString(dieoffset, attr, form, + str); + return start + strlen(str) + 1; + } + break; + case DW_FORM_udata: + case DW_FORM_ref_udata: + handler_->ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadUnsignedLEB128(start, + &len)); + return start + len; + break; + + case DW_FORM_sdata: + handler_->ProcessAttributeSigned(dieoffset, attr, form, + reader_->ReadSignedLEB128(start, &len)); + return start + len; + break; + case DW_FORM_addr: + handler_->ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadAddress(start)); + return start + reader_->AddressSize(); + break; + case DW_FORM_ref_addr: + // DWARF2 and 3 differ on whether ref_addr is address size or + // offset size. + assert(header_.version == 2 || header_.version == 3); + if (header_.version == 2) { + handler_->ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadAddress(start)); + return start + reader_->AddressSize(); + } else if (header_.version == 3) { + handler_->ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadOffset(start)); + return start + reader_->OffsetSize(); + } + break; + + case DW_FORM_block1: { + uint64 datalen = reader_->ReadOneByte(start); + handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 1, + datalen); + return start + 1 + datalen; + } + break; + case DW_FORM_block2: { + uint64 datalen = reader_->ReadTwoBytes(start); + handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 2, + datalen); + return start + 2 + datalen; + } + break; + case DW_FORM_block4: { + uint64 datalen = reader_->ReadFourBytes(start); + handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 4, + datalen); + return start + 4 + datalen; + } + break; + case DW_FORM_block: { + uint64 datalen = reader_->ReadUnsignedLEB128(start, &len); + handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + len, + datalen); + return start + datalen + len; + } + break; + case DW_FORM_strp: { + assert(string_buffer_ != NULL); + + const uint64 offset = reader_->ReadOffset(start); + assert(string_buffer_ + offset < string_buffer_ + string_buffer_length_); + + const char* str = string_buffer_ + offset; + handler_->ProcessAttributeString(dieoffset, attr, form, + str); + return start + reader_->OffsetSize(); + } + break; + default: + fprintf(stderr, "Unhandled form type"); + } + fprintf(stderr, "Unhandled form type"); + return NULL; +} + +const char* CompilationUnit::ProcessDIE(uint64 dieoffset, + const char* start, + const Abbrev& abbrev) { + for (AttributeList::const_iterator i = abbrev.attributes.begin(); + i != abbrev.attributes.end(); + i++) { + start = ProcessAttribute(dieoffset, start, i->first, i->second); + } + return start; +} + +void CompilationUnit::ProcessDIEs() { + const char* dieptr = after_header_; + size_t len; + + // lengthstart is the place the length field is based on. + // It is the point in the header after the initial length field + const char* lengthstart = buffer_; + + // In 64 bit dwarf, the initial length is 12 bytes, because of the + // 0xffffffff at the start. + if (reader_->OffsetSize() == 8) + lengthstart += 12; + else + lengthstart += 4; + + // we need semantics of boost scoped_ptr here - no intention of trasnferring + // ownership of the stack. use const, but then we limit ourselves to not + // ever being able to call .reset() on the smart pointer. + auto_ptr > const die_stack(new stack); + + while (dieptr < (lengthstart + header_.length)) { + // We give the user the absolute offset from the beginning of + // debug_info, since they need it to deal with ref_addr forms. + uint64 absolute_offset = (dieptr - buffer_) + offset_from_section_start_; + + uint64 abbrev_num = reader_->ReadUnsignedLEB128(dieptr, &len); + + dieptr += len; + + // Abbrev == 0 represents the end of a list of children. + if (abbrev_num == 0) { + const uint64 offset = die_stack->top(); + die_stack->pop(); + handler_->EndDIE(offset); + continue; + } + + const Abbrev& abbrev = abbrevs_->at(abbrev_num); + const enum DwarfTag tag = abbrev.tag; + if (!handler_->StartDIE(absolute_offset, tag, abbrev.attributes)) { + dieptr = SkipDIE(dieptr, abbrev); + } else { + dieptr = ProcessDIE(absolute_offset, dieptr, abbrev); + } + + if (abbrev.has_children) { + die_stack->push(absolute_offset); + } else { + handler_->EndDIE(absolute_offset); + } + } +} + +LineInfo::LineInfo(const char* buffer, uint64 buffer_length, + ByteReader* reader, LineInfoHandler* handler): + handler_(handler), reader_(reader), buffer_(buffer), + buffer_length_(buffer_length) { + header_.std_opcode_lengths = NULL; +} + +uint64 LineInfo::Start() { + ReadHeader(); + ReadLines(); + return after_header_ - buffer_; +} + +// The header for a debug_line section is mildly complicated, because +// the line info is very tightly encoded. +void LineInfo::ReadHeader() { + const char* lineptr = buffer_; + size_t initial_length_size; + + const uint64 initial_length = ReadInitialLength(lineptr, reader_, + &initial_length_size); + + lineptr += initial_length_size; + header_.total_length = initial_length; + assert(buffer_ + initial_length_size + header_.total_length <= + buffer_ + buffer_length_); + + // Address size *must* be set by CU ahead of time. + assert(reader_->AddressSize() != 0); + + header_.version = reader_->ReadTwoBytes(lineptr); + lineptr += 2; + + header_.prologue_length = reader_->ReadOffset(lineptr); + lineptr += reader_->OffsetSize(); + + header_.min_insn_length = reader_->ReadOneByte(lineptr); + lineptr += 1; + + header_.default_is_stmt = reader_->ReadOneByte(lineptr); + lineptr += 1; + + header_.line_base = *reinterpret_cast(lineptr); + lineptr += 1; + + header_.line_range = reader_->ReadOneByte(lineptr); + lineptr += 1; + + header_.opcode_base = reader_->ReadOneByte(lineptr); + lineptr += 1; + + header_.std_opcode_lengths = new vector; + header_.std_opcode_lengths->resize(header_.opcode_base + 1); + (*header_.std_opcode_lengths)[0] = 0; + for (int i = 1; i < header_.opcode_base; i++) { + (*header_.std_opcode_lengths)[i] = reader_->ReadOneByte(lineptr); + lineptr += 1; + } + + // It is legal for the directory entry table to be empty. + if (*lineptr) { + uint32 dirindex = 1; + while (*lineptr) { + const char* dirname = lineptr; + handler_->DefineDir(dirname, dirindex); + lineptr += strlen(dirname) + 1; + dirindex++; + } + } + lineptr++; + + // It is also legal for the file entry table to be empty. + if (*lineptr) { + uint32 fileindex = 1; + size_t len; + while (*lineptr) { + const char* filename = lineptr; + lineptr += strlen(filename) + 1; + + uint64 dirindex = reader_->ReadUnsignedLEB128(lineptr, &len); + lineptr += len; + + uint64 mod_time = reader_->ReadUnsignedLEB128(lineptr, &len); + lineptr += len; + + uint64 filelength = reader_->ReadUnsignedLEB128(lineptr, &len); + lineptr += len; + handler_->DefineFile(filename, fileindex, dirindex, mod_time, + filelength); + fileindex++; + } + } + lineptr++; + + after_header_ = lineptr; +} + +/* static */ +bool LineInfo::ProcessOneOpcode(ByteReader* reader, + LineInfoHandler* handler, + const struct LineInfoHeader &header, + const char* start, + struct LineStateMachine* lsm, + size_t* len, + uintptr_t pc, + bool *lsm_passes_pc) { + size_t oplen = 0; + size_t templen; + uint8 opcode = reader->ReadOneByte(start); + oplen++; + start++; + + // If the opcode is great than the opcode_base, it is a special + // opcode. Most line programs consist mainly of special opcodes. + if (opcode >= header.opcode_base) { + opcode -= header.opcode_base; + const int64 advance_address = (opcode / header.line_range) + * header.min_insn_length; + const int64 advance_line = (opcode % header.line_range) + + header.line_base; + + // Check if the lsm passes "pc". If so, mark it as passed. + if (lsm_passes_pc && + lsm->address <= pc && pc < lsm->address + advance_address) { + *lsm_passes_pc = true; + } + + lsm->address += advance_address; + lsm->line_num += advance_line; + lsm->basic_block = true; + *len = oplen; + return true; + } + + // Otherwise, we have the regular opcodes + switch (opcode) { + case DW_LNS_copy: { + lsm->basic_block = false; + *len = oplen; + return true; + } + + case DW_LNS_advance_pc: { + uint64 advance_address = reader->ReadUnsignedLEB128(start, &templen); + oplen += templen; + + // Check if the lsm passes "pc". If so, mark it as passed. + if (lsm_passes_pc && lsm->address <= pc && + pc < lsm->address + header.min_insn_length * advance_address) { + *lsm_passes_pc = true; + } + + lsm->address += header.min_insn_length * advance_address; + } + break; + case DW_LNS_advance_line: { + const int64 advance_line = reader->ReadSignedLEB128(start, &templen); + oplen += templen; + lsm->line_num += advance_line; + + // With gcc 4.2.1, we can get the line_no here for the first time + // since DW_LNS_advance_line is called after DW_LNE_set_address is + // called. So we check if the lsm passes "pc" here, not in + // DW_LNE_set_address. + if (lsm_passes_pc && lsm->address == pc) { + *lsm_passes_pc = true; + } + } + break; + case DW_LNS_set_file: { + const uint64 fileno = reader->ReadUnsignedLEB128(start, &templen); + oplen += templen; + lsm->file_num = fileno; + } + break; + case DW_LNS_set_column: { + const uint64 colno = reader->ReadUnsignedLEB128(start, &templen); + oplen += templen; + lsm->column_num = colno; + } + break; + case DW_LNS_negate_stmt: { + lsm->is_stmt = !lsm->is_stmt; + } + break; + case DW_LNS_set_basic_block: { + lsm->basic_block = true; + } + break; + case DW_LNS_fixed_advance_pc: { + const uint16 advance_address = reader->ReadTwoBytes(start); + oplen += 2; + + // Check if the lsm passes "pc". If so, mark it as passed. + if (lsm_passes_pc && + lsm->address <= pc && pc < lsm->address + advance_address) { + *lsm_passes_pc = true; + } + + lsm->address += advance_address; + } + break; + case DW_LNS_const_add_pc: { + const int64 advance_address = header.min_insn_length + * ((255 - header.opcode_base) + / header.line_range); + + // Check if the lsm passes "pc". If so, mark it as passed. + if (lsm_passes_pc && + lsm->address <= pc && pc < lsm->address + advance_address) { + *lsm_passes_pc = true; + } + + lsm->address += advance_address; + } + break; + case DW_LNS_extended_op: { + const size_t extended_op_len = reader->ReadUnsignedLEB128(start, + &templen); + start += templen; + oplen += templen + extended_op_len; + + const uint64 extended_op = reader->ReadOneByte(start); + start++; + + switch (extended_op) { + case DW_LNE_end_sequence: { + lsm->end_sequence = true; + *len = oplen; + return true; + } + break; + case DW_LNE_set_address: { + // With gcc 4.2.1, we cannot tell the line_no here since + // DW_LNE_set_address is called before DW_LNS_advance_line is + // called. So we do not check if the lsm passes "pc" here. See + // also the comment in DW_LNS_advance_line. + uint64 address = reader->ReadAddress(start); + lsm->address = address; + } + break; + case DW_LNE_define_file: { + const char* filename = start; + + templen = strlen(filename) + 1; + start += templen; + + uint64 dirindex = reader->ReadUnsignedLEB128(start, &templen); + oplen += templen; + + const uint64 mod_time = reader->ReadUnsignedLEB128(start, + &templen); + oplen += templen; + + const uint64 filelength = reader->ReadUnsignedLEB128(start, + &templen); + oplen += templen; + + if (handler) { + handler->DefineFile(filename, -1, dirindex, mod_time, + filelength); + } + } + break; + } + } + break; + + default: { + // Ignore unknown opcode silently + if (header.std_opcode_lengths) { + for (int i = 0; i < (*header.std_opcode_lengths)[opcode]; i++) { + size_t templen; + reader->ReadUnsignedLEB128(start, &templen); + start += templen; + oplen += templen; + } + } + } + break; + } + *len = oplen; + return false; +} + +void LineInfo::ReadLines() { + struct LineStateMachine lsm; + + // lengthstart is the place the length field is based on. + // It is the point in the header after the initial length field + const char* lengthstart = buffer_; + + // In 64 bit dwarf, the initial length is 12 bytes, because of the + // 0xffffffff at the start. + if (reader_->OffsetSize() == 8) + lengthstart += 12; + else + lengthstart += 4; + + const char* lineptr = after_header_; + while (lineptr < lengthstart + header_.total_length) { + lsm.Reset(header_.default_is_stmt); + while (!lsm.end_sequence) { + size_t oplength; + bool add_line = ProcessOneOpcode(reader_, handler_, header_, + lineptr, &lsm, &oplength, (uintptr_t)-1, NULL); + if (add_line) + handler_->AddLine(lsm.address, lsm.file_num, lsm.line_num, + lsm.column_num); + lineptr += oplength; + } + } + + after_header_ = lengthstart + header_.total_length; +} + +} // namespace dwarf2reader diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2reader.h b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2reader.h new file mode 100644 index 00000000..f27cdac7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/dwarf2reader.h @@ -0,0 +1,393 @@ +// Copyright 2006 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file contains definitions related to the DWARF2/3 reader and +// it's handler interfaces. +// The DWARF2/3 specification can be found at +// http://dwarf.freestandards.org and should be considered required +// reading if you wish to modify the implementation. +// Only a cursory attempt is made to explain terminology that is +// used here, as it is much better explained in the standard documents +#ifndef COMMON_MAC_DWARF_DWARF2READER_H__ +#define COMMON_MAC_DWARF_DWARF2READER_H__ + +#include +#include +#include +#include +#include + +#include "common/mac/dwarf/dwarf2enums.h" +#include "common/mac/dwarf/types.h" + +using namespace std; +using namespace __gnu_cxx; + +namespace dwarf2reader { +struct LineStateMachine; +class ByteReader; +class Dwarf2Handler; +class LineInfoHandler; + +// This maps from a string naming a section to a pair containing a +// the data for the section, and the size of the section. +typedef hash_map > SectionMap; +typedef list > AttributeList; +typedef AttributeList::iterator AttributeIterator; +typedef AttributeList::const_iterator ConstAttributeIterator; + +struct LineInfoHeader { + uint64 total_length; + uint16 version; + uint64 prologue_length; + uint8 min_insn_length; // insn stands for instructin + bool default_is_stmt; // stmt stands for statement + int8 line_base; + uint8 line_range; + uint8 opcode_base; + // Use a pointer so that signalsafe_addr2line is able to use this structure + // without heap allocation problem. + vector *std_opcode_lengths; +}; + +class LineInfo { + public: + + // Initializes a .debug_line reader. Buffer and buffer length point + // to the beginning and length of the line information to read. + // Reader is a ByteReader class that has the endianness set + // properly. + LineInfo(const char* buffer_, uint64 buffer_length, + ByteReader* reader, LineInfoHandler* handler); + + virtual ~LineInfo() { + if (header_.std_opcode_lengths) { + delete header_.std_opcode_lengths; + } + } + + // Start processing line info, and calling callbacks in the handler. + // Consumes the line number information for a single compilation unit. + // Returns the number of bytes processed. + uint64 Start(); + + // Process a single line info opcode at START using the state + // machine at LSM. Return true if we should define a line using the + // current state of the line state machine. Place the length of the + // opcode in LEN. + // If LSM_PASSES_PC is non-NULL, this function also checks if the lsm + // passes the address of PC. In other words, LSM_PASSES_PC will be + // set to true, if the following condition is met. + // + // lsm's old address < PC <= lsm's new address + static bool ProcessOneOpcode(ByteReader* reader, + LineInfoHandler* handler, + const struct LineInfoHeader &header, + const char* start, + struct LineStateMachine* lsm, + size_t* len, + uintptr_t pc, + bool *lsm_passes_pc); + + private: + // Reads the DWARF2/3 header for this line info. + void ReadHeader(); + + // Reads the DWARF2/3 line information + void ReadLines(); + + // The associated handler to call processing functions in + LineInfoHandler* handler_; + + // The associated ByteReader that handles endianness issues for us + ByteReader* reader_; + + // A DWARF2/3 line info header. This is not the same size as + // in the actual file, as the one in the file may have a 32 bit or + // 64 bit lengths + + struct LineInfoHeader header_; + + // buffer is the buffer for our line info, starting at exactly where + // the line info to read is. after_header is the place right after + // the end of the line information header. + const char* buffer_; + uint64 buffer_length_; + const char* after_header_; +}; + +// This class is the main interface between the line info reader and +// the client. The virtual functions inside this get called for +// interesting events that happen during line info reading. The +// default implementation does nothing + +class LineInfoHandler { + public: + LineInfoHandler() { } + + virtual ~LineInfoHandler() { } + + // Called when we define a directory. NAME is the directory name, + // DIR_NUM is the directory number + virtual void DefineDir(const string& name, uint32 dir_num) { } + + // Called when we define a filename. NAME is the filename, FILE_NUM + // is the file number which is -1 if the file index is the next + // index after the last numbered index (this happens when files are + // dynamically defined by the line program), DIR_NUM is the + // directory index for the directory name of this file, MOD_TIME is + // the modification time of the file, and LENGTH is the length of + // the file + virtual void DefineFile(const string& name, int32 file_num, + uint32 dir_num, uint64 mod_time, + uint64 length) { } + + // Called when the line info reader has a new line, address pair + // ready for us. ADDRESS is the address of the code, FILE_NUM is + // the file number containing the code, LINE_NUM is the line number in + // that file for the code, and COLUMN_NUM is the column number the code + // starts at, if we know it (0 otherwise). + virtual void AddLine(uint64 address, uint32 file_num, uint32 line_num, + uint32 column_num) { } +}; + +// The base of DWARF2/3 debug info is a DIE (Debugging Information +// Entry. +// DWARF groups DIE's into a tree and calls the root of this tree a +// "compilation unit". Most of the time, their is one compilation +// unit in the .debug_info section for each file that had debug info +// generated. +// Each DIE consists of + +// 1. a tag specifying a thing that is being described (ie +// DW_TAG_subprogram for functions, DW_TAG_variable for variables, etc +// 2. attributes (such as DW_AT_location for location in memory, +// DW_AT_name for name), and data for each attribute. +// 3. A flag saying whether the DIE has children or not + +// In order to gain some amount of compression, the format of +// each DIE (tag name, attributes and data forms for the attributes) +// are stored in a separate table called the "abbreviation table". +// This is done because a large number of DIEs have the exact same tag +// and list of attributes, but different data for those attributes. +// As a result, the .debug_info section is just a stream of data, and +// requires reading of the .debug_abbrev section to say what the data +// means. + +// As a warning to the user, it should be noted that the reason for +// using absolute offsets from the beginning of .debug_info is that +// DWARF2/3 support referencing DIE's from other DIE's by their offset +// from either the current compilation unit start, *or* the beginning +// of the .debug_info section. This means it is possible to reference +// a DIE in one compilation unit from a DIE in another compilation +// unit. This style of reference is usually used to eliminate +// duplicated information that occurs across compilation +// units, such as base types, etc. GCC 3.4+ support this with +// -feliminate-dwarf2-dups. Other toolchains will sometimes do +// duplicate elimination in the linker. + +class CompilationUnit { + public: + + // Initialize a compilation unit. This requires a map of sections, + // the offset of this compilation unit in the debug_info section, a + // ByteReader, and a Dwarf2Handler class to call callbacks in. + CompilationUnit(const SectionMap& sections, uint64 offset, + ByteReader* reader, Dwarf2Handler* handler); + virtual ~CompilationUnit() { + if (abbrevs_) delete abbrevs_; + } + + // Begin reading a Dwarf2 compilation unit, and calling the + // callbacks in the Dwarf2Handler + // Return the offset of the end of the compilation unit - the passed + // in offset. + uint64 Start(); + + private: + + // This struct represents a single DWARF2/3 abbreviation + // The abbreviation tells how to read a DWARF2/3 DIE, and consist of a + // tag and a list of attributes, as well as the data form of each attribute. + struct Abbrev { + uint32 number; + enum DwarfTag tag; + bool has_children; + AttributeList attributes; + }; + + // A DWARF2/3 compilation unit header. This is not the same size as + // in the actual file, as the one in the file may have a 32 bit or + // 64 bit length. + struct CompilationUnitHeader { + uint64 length; + uint16 version; + uint64 abbrev_offset; + uint8 address_size; + } header_; + + // Reads the DWARF2/3 header for this compilation unit. + void ReadHeader(); + + // Reads the DWARF2/3 abbreviations for this compilation unit + void ReadAbbrevs(); + + // Processes a single DIE for this compilation unit and return a new + // pointer just past the end of it + const char* ProcessDIE(uint64 dieoffset, + const char* start, + const Abbrev& abbrev); + + // Processes a single attribute and return a new pointer just past the + // end of it + const char* ProcessAttribute(uint64 dieoffset, + const char* start, + enum DwarfAttribute attr, + enum DwarfForm form); + + // Processes all DIEs for this compilation unit + void ProcessDIEs(); + + // Skips the die with attributes specified in ABBREV starting at + // START, and return the new place to position the stream to. + const char* SkipDIE(const char* start, + const Abbrev& abbrev); + + // Skips the attribute starting at START, with FORM, and return the + // new place to position the stream to. + const char* SkipAttribute(const char* start, + enum DwarfForm form); + + // Offset from section start is the offset of this compilation unit + // from the beginning of the .debug_info section. + uint64 offset_from_section_start_; + + // buffer is the buffer for our CU, starting at .debug_info + offset + // passed in from constructor. + // after_header points to right after the compilation unit header. + const char* buffer_; + uint64 buffer_length_; + const char* after_header_; + + // The associated ByteReader that handles endianness issues for us + ByteReader* reader_; + + // The map of sections in our file to buffers containing their data + const SectionMap& sections_; + + // The associated handler to call processing functions in + Dwarf2Handler* handler_; + + // Set of DWARF2/3 abbreviations for this compilation unit. Indexed + // by abbreviation number, which means that abbrevs_[0] is not + // valid. + vector* abbrevs_; + + // String section buffer and length, if we have a string section. + // This is here to avoid doing a section lookup for strings in + // ProcessAttribute, which is in the hot path for DWARF2 reading. + const char* string_buffer_; + uint64 string_buffer_length_; +}; + +// This class is the main interface between the reader and the +// client. The virtual functions inside this get called for +// interesting events that happen during DWARF2 reading. +// The default implementation skips everything. + +class Dwarf2Handler { + public: + Dwarf2Handler() { } + + virtual ~Dwarf2Handler() { } + + // Start to process a compilation unit at OFFSET from the beginning of the + // debug_info section. Return false if you would like + // to skip this compilation unit. + virtual bool StartCompilationUnit(uint64 offset, uint8 address_size, + uint8 offset_size, uint64 cu_length, + uint8 dwarf_version) { return false; } + + // Start to process a DIE at OFFSET from the beginning of the + // debug_info section. Return false if you would like to skip this + // DIE. + virtual bool StartDIE(uint64 offset, enum DwarfTag tag, + const AttributeList& attrs) { return false; } + + // Called when we have an attribute with unsigned data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of compilation unit, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA. + virtual void ProcessAttributeUnsigned(uint64 offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64 data) { } + + // Called when we have an attribute with signed data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of compilation unit, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA. + virtual void ProcessAttributeSigned(uint64 offset, + enum DwarfAttribute attr, + enum DwarfForm form, + int64 data) { } + + // Called when we have an attribute with a buffer of data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of compilation unit, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA, and the + // length of the buffer is LENGTH. The buffer is owned by the + // caller, not the callee, and may not persist for very long. If + // you want the data to be available later, it needs to be copied. + virtual void ProcessAttributeBuffer(uint64 offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const char* data, + uint64 len) { } + + // Called when we have an attribute with string data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of compilation unit, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA. + virtual void ProcessAttributeString(uint64 offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const string& data) { } + + // Called when finished processing the DIE at OFFSET. + // Because DWARF2/3 specifies a tree of DIEs, you may get starts + // before ends of the previous DIE, as we process children before + // ending the parent. + virtual void EndDIE(uint64 offset) { } + +}; + + +} // namespace dwarf2reader + +#endif // UTIL_DEBUGINFO_DWARF2READER_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dwarf/functioninfo.cc b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/functioninfo.cc new file mode 100644 index 00000000..b6d3f0fe --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/functioninfo.cc @@ -0,0 +1,240 @@ +// Copyright 2006 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This is a client for the dwarf2reader to extract function and line +// information from the debug info. + +#include +#include +#include + + +#include "common/mac/dwarf/functioninfo.h" + +#include "common/mac/dwarf/bytereader.h" + + +namespace __gnu_cxx +{ + template<> + struct hash + { + size_t operator()(const std::string& k) const; + }; +} + + +namespace dwarf2reader { + +// Given an offset value, its form, and the base offset of the +// compilation unit containing this value, return an absolute offset +// within the .debug_info section. +uint64 GetAbsoluteOffset(uint64 offset, + enum DwarfForm form, + uint64 compilation_unit_base) { + switch (form) { + case DW_FORM_ref1: + case DW_FORM_ref2: + case DW_FORM_ref4: + case DW_FORM_ref8: + case DW_FORM_ref_udata: + return offset + compilation_unit_base; + case DW_FORM_ref_addr: + default: + return offset; + } +} + +CULineInfoHandler::CULineInfoHandler(vector* files, + vector* dirs, + LineMap* linemap):linemap_(linemap), + files_(files), + dirs_(dirs) { + // The dirs and files are 1 indexed, so just make sure we put + // nothing in the 0 vector. + assert(dirs->size() == 0); + assert(files->size() == 0); + dirs->push_back(""); + SourceFileInfo s; + s.name = ""; + s.lowpc = ULLONG_MAX; + files->push_back(s); +} + +void CULineInfoHandler::DefineDir(const string& name, uint32 dir_num) { + // These should never come out of order, actually + assert(dir_num == dirs_->size()); + dirs_->push_back(name); +} + +void CULineInfoHandler::DefineFile(const string& name, + int32 file_num, uint32 dir_num, + uint64 mod_time, uint64 length) { + assert(dir_num >= 0); + assert(dir_num < dirs_->size()); + + // These should never come out of order, actually. + if (file_num == (int32)files_->size() || file_num == -1) { + string dir = dirs_->at(dir_num); + + SourceFileInfo s; + s.lowpc = ULLONG_MAX; + + if (dir == "") { + s.name = name; + } else { + s.name = dir + "/" + name; + } + + files_->push_back(s); + } else { + fprintf(stderr, "error in DefineFile"); + } +} + +void CULineInfoHandler::AddLine(uint64 address, uint32 file_num, + uint32 line_num, uint32 column_num) { + if (file_num < files_->size()) { + linemap_->insert(make_pair(address, make_pair(files_->at(file_num).name.c_str(), + line_num))); + + if(address < files_->at(file_num).lowpc) { + files_->at(file_num).lowpc = address; + } + } else { + fprintf(stderr,"error in AddLine"); + } +} + +bool CUFunctionInfoHandler::StartCompilationUnit(uint64 offset, + uint8 address_size, + uint8 offset_size, + uint64 cu_length, + uint8 dwarf_version) { + current_compilation_unit_offset_ = offset; + return true; +} + + +// For function info, we only care about subprograms and inlined +// subroutines. For line info, the DW_AT_stmt_list lives in the +// compile unit tag. + +bool CUFunctionInfoHandler::StartDIE(uint64 offset, enum DwarfTag tag, + const AttributeList& attrs) { + switch (tag) { + case DW_TAG_subprogram: + case DW_TAG_inlined_subroutine: { + current_function_info_ = new FunctionInfo; + current_function_info_->lowpc = current_function_info_->highpc = 0; + current_function_info_->name = ""; + current_function_info_->line = 0; + current_function_info_->file = ""; + offset_to_funcinfo_->insert(make_pair(offset, current_function_info_)); + }; + // FALLTHROUGH + case DW_TAG_compile_unit: + return true; + default: + return false; + } + return false; +} + +// Only care about the name attribute for functions + +void CUFunctionInfoHandler::ProcessAttributeString(uint64 offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const string &data) { + if (current_function_info_) { + if (attr == DW_AT_name) + current_function_info_->name = data; + else if(attr == DW_AT_MIPS_linkage_name) + current_function_info_->mangled_name = data; + } +} + +void CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64 offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64 data) { + if (attr == DW_AT_stmt_list) { + SectionMap::const_iterator iter = sections_.find("__debug_line"); + assert(iter != sections_.end()); + + // this should be a scoped_ptr but we dont' use boost :-( + auto_ptr lireader(new LineInfo(iter->second.first + data, + iter->second.second - data, + reader_, linehandler_)); + lireader->Start(); + } else if (current_function_info_) { + switch (attr) { + case DW_AT_low_pc: + current_function_info_->lowpc = data; + break; + case DW_AT_high_pc: + current_function_info_->highpc = data; + break; + case DW_AT_decl_line: + current_function_info_->line = data; + break; + case DW_AT_decl_file: + current_function_info_->file = files_->at(data).name; + break; + case DW_AT_specification: { + // Some functions have a "specification" attribute + // which means they were defined elsewhere. The name + // attribute is not repeated, and must be taken from + // the specification DIE. Here we'll assume that + // any DIE referenced in this manner will already have + // been seen, but that's not really required by the spec. + uint64 abs_offset = GetAbsoluteOffset(data, form, current_compilation_unit_offset_); + FunctionMap::iterator iter = offset_to_funcinfo_->find(abs_offset); + if (iter != offset_to_funcinfo_->end()) { + current_function_info_->name = iter->second->name; + current_function_info_->mangled_name = iter->second->mangled_name; + } else { + // If you hit this, this code probably needs to be rewritten. + fprintf(stderr, "Error: DW_AT_specification was seen before the referenced DIE! (Looking for DIE at offset %08llx, in DIE at offset %08llx)\n", abs_offset, offset); + } + break; + } + default: + break; + } + } +} + +void CUFunctionInfoHandler::EndDIE(uint64 offset) { + if (current_function_info_ && current_function_info_->lowpc) + address_to_funcinfo_->insert(make_pair(current_function_info_->lowpc, + current_function_info_)); +} + +} // namespace dwarf2reader diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dwarf/functioninfo.h b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/functioninfo.h new file mode 100644 index 00000000..130f182e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/functioninfo.h @@ -0,0 +1,178 @@ +// Copyright 2006 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// This file contains the definitions for a DWARF2/3 information +// collector that uses the DWARF2/3 reader interface to build a mapping +// of addresses to files, lines, and functions. + +#ifndef COMMON_MAC_DWARF_FUNCTIONINFO_H__ +#define COMMON_MAC_DWARF_FUNCTIONINFO_H__ + +#include +#include +#include +#include + +#include "common/mac/dwarf/dwarf2reader.h" + + +namespace dwarf2reader { + +struct FunctionInfo { + // Name of the function + string name; + // Mangled name of the function + string mangled_name; + // File containing this function + string file; + // Line number for start of function. + uint32 line; + // Beginning address for this function + uint64 lowpc; + // End address for this function. + uint64 highpc; +}; + +struct SourceFileInfo { + // Name of the source file name + string name; + // Low address of source file name + uint64 lowpc; +}; + +typedef map FunctionMap; +typedef map > LineMap; + +// This class is a basic line info handler that fills in the dirs, +// file, and linemap passed into it with the data produced from the +// LineInfoHandler. +class CULineInfoHandler: public LineInfoHandler { + public: + + // + CULineInfoHandler(vector* files, + vector* dirs, + LineMap* linemap); + virtual ~CULineInfoHandler() { } + + // Called when we define a directory. We just place NAME into dirs_ + // at position DIR_NUM. + virtual void DefineDir(const string& name, uint32 dir_num); + + // Called when we define a filename. We just place + // concat(dirs_[DIR_NUM], NAME) into files_ at position FILE_NUM. + virtual void DefineFile(const string& name, int32 file_num, + uint32 dir_num, uint64 mod_time, uint64 length); + + + // Called when the line info reader has a new line, address pair + // ready for us. ADDRESS is the address of the code, FILE_NUM is + // the file number containing the code, LINE_NUM is the line number + // in that file for the code, and COLUMN_NUM is the column number + // the code starts at, if we know it (0 otherwise). + virtual void AddLine(uint64 address, uint32 file_num, uint32 line_num, + uint32 column_num); + + + private: + LineMap* linemap_; + vector* files_; + vector* dirs_; +}; + +class CUFunctionInfoHandler: public Dwarf2Handler { + public: + CUFunctionInfoHandler(vector* files, + vector* dirs, + LineMap* linemap, + FunctionMap* offset_to_funcinfo, + FunctionMap* address_to_funcinfo, + CULineInfoHandler* linehandler, + const SectionMap& sections, + ByteReader* reader) + : files_(files), dirs_(dirs), linemap_(linemap), + offset_to_funcinfo_(offset_to_funcinfo), + address_to_funcinfo_(address_to_funcinfo), + linehandler_(linehandler), sections_(sections), + reader_(reader), current_function_info_(NULL) { } + + virtual ~CUFunctionInfoHandler() { } + + // Start to process a compilation unit at OFFSET from the beginning of the + // debug_info section. We want to see all compilation units, so we + // always return true. + + virtual bool StartCompilationUnit(uint64 offset, uint8 address_size, + uint8 offset_size, uint64 cu_length, + uint8 dwarf_version); + + // Start to process a DIE at OFFSET from the beginning of the + // debug_info section. We only care about function related DIE's. + virtual bool StartDIE(uint64 offset, enum DwarfTag tag, + const AttributeList& attrs); + + // Called when we have an attribute with unsigned data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of compilation unit, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA. + virtual void ProcessAttributeUnsigned(uint64 offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64 data); + + // Called when we have an attribute with string data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of compilation unit, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA. + virtual void ProcessAttributeString(uint64 offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const string& data); + + // Called when finished processing the DIE at OFFSET. + // Because DWARF2/3 specifies a tree of DIEs, you may get starts + // before ends of the previous DIE, as we process children before + // ending the parent. + virtual void EndDIE(uint64 offset); + + private: + vector* files_; + vector* dirs_; + LineMap* linemap_; + FunctionMap* offset_to_funcinfo_; + FunctionMap* address_to_funcinfo_; + CULineInfoHandler* linehandler_; + const SectionMap& sections_; + ByteReader* reader_; + FunctionInfo* current_function_info_; + uint64 current_compilation_unit_offset_; +}; + +} // namespace dwarf2reader +#endif // COMMON_MAC_DWARF_FUNCTIONINFO_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dwarf/line_state_machine.h b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/line_state_machine.h new file mode 100644 index 00000000..4ba98f74 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/line_state_machine.h @@ -0,0 +1,61 @@ +// Copyright 2008 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#ifndef COMMON_MAC_DWARF_LINE_STATE_MACHINE_H__ +#define COMMON_MAC_DWARF_LINE_STATE_MACHINE_H__ + +namespace dwarf2reader { + +// This is the format of a DWARF2/3 line state machine that we process +// opcodes using. There is no need for anything outside the lineinfo +// processor to know how this works. +struct LineStateMachine { + void Reset(bool default_is_stmt) { + file_num = 1; + address = 0; + line_num = 1; + column_num = 0; + is_stmt = default_is_stmt; + basic_block = false; + end_sequence = false; + } + + uint32 file_num; + uint64 address; + uint64 line_num; + uint32 column_num; + bool is_stmt; // stmt means statement. + bool basic_block; + bool end_sequence; +}; + +} // namespace dwarf2reader + + +#endif // COMMON_MAC_DWARF_LINE_STATE_MACHINE_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/mac/dwarf/types.h b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/types.h new file mode 100644 index 00000000..76541597 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/dwarf/types.h @@ -0,0 +1,46 @@ +// Copyright 2008 Google, Inc. All Rights reserved +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// This file contains some typedefs for basic types + + +#ifndef _COMMON_MAC_DWARF_TYPES_H__ +#define _COMMON_MAC_DWARF_TYPES_H__ + +typedef signed char int8; +typedef short int16; +typedef int int32; +typedef long long int64; + +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned int uint32; +typedef unsigned long long uint64; + +#endif // _COMMON_MAC_DWARF_TYPES_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEvent.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEvent.h new file mode 100644 index 00000000..83482e92 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEvent.h @@ -0,0 +1,380 @@ +// +// GTMCarbonEvent.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import + +#import "GTMDefines.h" + +@class GTMCarbonEventHandler; + +// Objective C wrapper for a Carbon Event +@interface GTMCarbonEvent : NSObject { + @private + EventRef event_; //Event we are wrapping. STRONG +} + + +// Create an event of class |inClass| and kind |inKind| +// +// Returns: +// Autoreleased GTMCarbonEvent +// ++ (id)eventWithClass:(UInt32)inClass kind:(UInt32)kind; + +// Create an event based on |event|. Retains |event|. +// +// Returns: +// Autoreleased GTMCarbonEvent +// ++ (id)eventWithEvent:(EventRef)event; + +// Create an event based on the event currently being handled. +// +// Returns: +// Autoreleased GTMCarbonEvent +// ++ (id)currentEvent; + +// Create an event of class |inClass| and kind |inKind| +// +// Returns: +// GTMCarbonEvent +// +- (id)initWithClass:(UInt32)inClass kind:(UInt32)kind; + +// Create an event based on |event|. Retains |event|. +// +// Returns: +// GTMCarbonEvent +// +- (id)initWithEvent:(EventRef)event; + +// Get the event's class. +// +// Returns: +// event class +// +- (UInt32)eventClass; + +// Get the event's kind. +// +// Returns: +// event kind +// +- (UInt32)eventKind; + +// Set the event's time. +// +// Arguments: +// time - the time you want associated with the event +// +- (void)setTime:(EventTime)eventTime; + +// Get the event's time. +// +// Returns: +// the time associated with the event +// +- (EventTime)time; + +// Get the event's eventref for passing to other carbon functions. +// +// Returns: +// the event ref associated with the event +// +- (EventRef)event; + +// Sets (or adds) a parameter to an event. Try not to use this function +// directly. Look at the PARAM_TEMPLATE_DECL/DEFN macros below. +// +// Arguments: +// name - the parameter name. +// type - the parameter type. +// size - the size of the data that |data| points to. +// data - pointer to the data you want to set the parameter to. +// +- (void)setParameterNamed:(EventParamName)name + type:(EventParamType)type + size:(ByteCount)size + data:(const void *)data; + + +// Gets a parameter from an event. Try not to use this function +// directly. Look at the PARAM_TEMPLATE_DECL/DEFN macros below. +// +// Arguments: +// name - the parameter name. +// type - the parameter type. +// size - the size of the data that |data| points to. +// data - pointer to the buffer that you want to fill with your data. +// +// Returns: +// YES is parameter is retrieved successfully. NO if parameter doesn't exist. +// +- (BOOL)getParameterNamed:(EventParamName)name + type:(EventParamType)type + size:(ByteCount)size + data:(void *)data; + +// Gets a the size of a parameter from an event. +// +// Arguments: +// name - the parameter name. +// type - the parameter type. +// +// Returns: +// The size of the buffer required to hold the parameter. 0 if parameter +// doesn't exist. +// +- (ByteCount)sizeOfParameterNamed:(EventParamName)name + type:(EventParamType)type; + +// Sends event to an event target with options +// +// Arguments: +// target - target to send event to. +// options - options to send event. See SendEventToEventTargetWithOptions +// for details. +// +// Returns: +// OSStatus value. +// +- (OSStatus)sendToTarget:(GTMCarbonEventHandler *)target + options:(OptionBits)options; + +// Post event to an event queue. +// +// Arguments: +// queue - queue to post it to. +// priority - priority to post it with +// +// Returns: +// OSStatus value. +// +- (OSStatus)postToQueue:(EventQueueRef)queue priority:(EventPriority)priority; + +// Post event to current queue with standard priority. +// +- (void)postToCurrentQueue; + +// Post event to main queue with standard priority. +// +- (void)postToMainQueue; + +@end + +// Macros for defining simple set/get parameter methods for GTMCarbonEvent. See +// the category GTMCarbonEvent (GTMCarbonEventGettersAndSetters) for an example +// of their use. GTM_PARAM_TEMPLATE_DECL2/DEFN2 is for the case where the +// parameter name is different than the parameter type (rare, but it does +// occur...e.g. for a Rect, the name is typeQDRectangle, and the type is Rect, +// so it would be GTM_PARAM_TEMPLATE_DECL2(QDRectangle, Rect) ). In most cases +// you will just use GTM_PARAM_TEMPLATE_DECL/DEFN. +#define GTM_PARAM_TEMPLATE_DECL2(paramName, paramType) \ +- (void)set##paramName##ParameterNamed:(EventParamName)name data:(paramType *)data; \ +- (BOOL)get##paramName##ParameterNamed:(EventParamName)name data:(paramType *)data; + +#define GTM_PARAM_TEMPLATE_DEFN2(paramName, paramType) \ +- (void)set##paramName##ParameterNamed:(EventParamName)name data:(paramType *)data { \ +[self setParameterNamed:name type:type##paramName size:sizeof(paramType) data:data]; \ +} \ +- (BOOL)get##paramName##ParameterNamed:(EventParamName)name data:(paramType *)data { \ +return [self getParameterNamed:name type:type##paramName size:sizeof(paramType) data:data]; \ +} + +#define GTM_PARAM_TEMPLATE_DECL(paramType) GTM_PARAM_TEMPLATE_DECL2(paramType, paramType) +#define GTM_PARAM_TEMPLATE_DEFN(paramType) GTM_PARAM_TEMPLATE_DEFN2(paramType, paramType) + + +// Category defining some basic types that we want to be able to easily set and +// get from GTMCarbonEvents +@interface GTMCarbonEvent (GTMCarbonEventGettersAndSetters) +GTM_PARAM_TEMPLATE_DECL(UInt32) +GTM_PARAM_TEMPLATE_DECL(EventHotKeyID) +@end + +// Utility function for converting between modifier types +// Arguments: +// inCocoaModifiers - keyboard modifiers in carbon form +// (NSCommandKeyMask etc) +// Returns: +// Carbon modifiers equivalent to |inCocoaModifiers| (cmdKey etc) +GTM_EXTERN UInt32 GTMCocoaToCarbonKeyModifiers(NSUInteger inCocoaModifiers); + +// Utility function for converting between modifier types +// Arguments: +// inCarbonModifiers - keyboard modifiers in carbon form (cmdKey etc) +// Returns: +// cocoa modifiers equivalent to |inCocoaModifiers| (NSCommandKeyMask etc) +GTM_EXTERN NSUInteger GTMCarbonToCocoaKeyModifiers(UInt32 inCarbonModifiers); + +// An "abstract" superclass for objects that handle events such as +// menus, HIObjects, etc. +// +// Subclasses are expected to override the eventTarget and +// handleEvent:handler: methods to customize them. +@interface GTMCarbonEventHandler : NSObject { + @private + // handler we are wrapping + // lazily created in the eventHandler method + EventHandlerRef eventHandler_; + __weak id delegate_; // Our delegate + // Does our delegate respond to the gtm_eventHandler:receivedEvent:handler: + // selector? Cached for performance reasons. + BOOL delegateRespondsToHandleEvent_; +} + +// Registers the event handler to listen for |events|. +// +// Arguments: +// events - an array of EventTypeSpec. The events to register for. +// count - the number of EventTypeSpecs in events. +// +- (void)registerForEvents:(const EventTypeSpec *)events count:(size_t)count; + +// Causes the event handler to stop listening for |events|. +// +// Arguments: +// events - an array of EventTypeSpec. The events to register for. +// count - the number of EventTypeSpecs in events. +// +- (void)unregisterForEvents:(const EventTypeSpec *)events count:(size_t)count; + +// To be overridden by subclasses to respond to events. +// +// All subclasses should call [super handleEvent:handler:] if they +// don't handle the event themselves. +// +// Arguments: +// event - the event to be handled +// handler - the call ref in case you want to call CallNextEventHandler +// in your method +// Returns: +// OSStatus - usually either noErr or eventNotHandledErr +// +- (OSStatus)handleEvent:(GTMCarbonEvent *)event + handler:(EventHandlerCallRef)handler; + +// To be overridden by subclasses to return the event target for the class. +// GTMCarbonEventHandler's implementation returns NULL. +// +// Returns: +// The event target ref. +// +- (EventTargetRef)eventTarget; + +// Gets the underlying EventHandlerRef for that this class wraps. +// +// Returns: +// The EventHandlerRef this class wraps. +// +- (EventHandlerRef)eventHandler; + +// Gets the delegate for the handler +// +// Returns: +// the delegate +- (id)delegate; + +// Sets the delegate for the handler +// +// Arguments: +// delegate - the delegate to set to +- (void)setDelegate:(id)delegate; + +@end + +// Category for methods that a delegate of GTMCarbonEventHandlerDelegate may +// want to implement. +@interface NSObject (GTMCarbonEventHandlerDelegate) + +// If a delegate implements this method it gets called before every event +// that the handler gets sent. If it returns anything but eventNotHandledErr, +// the handlers handlerEvent:handler: method will not be called, and +// the return value returned by the delegate will be returned back to the +// carbon event dispatch system. This allows you to override any method +// that a handler may implement. +// +// Arguments: +// delegate - the delegate to set to +// +- (OSStatus)gtm_eventHandler:(GTMCarbonEventHandler *)sender + receivedEvent:(GTMCarbonEvent *)event + handler:(EventHandlerCallRef)handler; + +@end + +// A general OSType for use when setting properties on GTMCarbonEvent objects. +// This is the "signature" as part of commandIDs, controlsIDs, and properties. +// 'GooG' +GTM_EXTERN const OSType kGTMCarbonFrameworkSignature; + +// An event handler class representing the event monitor event handler +// +// there is only one of these per application. This way you can put +// event handlers directly on the dispatcher if necessary. +@interface GTMCarbonEventMonitorHandler : GTMCarbonEventHandler +// Accessor to get the GTMCarbonEventMonitorHandler singleton. +// +// Returns: +// pointer to the GTMCarbonEventMonitorHandler singleton. ++ (GTMCarbonEventMonitorHandler *)sharedEventMonitorHandler; +@end + +// An event handler class representing the toolbox dispatcher event handler +// +// there is only one of these per application. This way you can put +// event handlers directly on the dispatcher if necessary. +@interface GTMCarbonEventDispatcherHandler : GTMCarbonEventHandler { + @private + NSMutableDictionary *hotkeys_; // Collection of registered hotkeys +} + +// Accessor to get the GTMCarbonEventDispatcherHandler singleton. +// +// Returns: +// pointer to the GTMCarbonEventDispatcherHandler singleton. ++ (GTMCarbonEventDispatcherHandler *)sharedEventDispatcherHandler; + +// Registers a hotkey. When the hotkey is executed by the user, target will be +// called with selector. +// Arguments: +// keyCode - the virtual keycode of the hotkey +// cocoaModifiers - the modifiers that need to be used with |keyCode|. NB +// that these are cocoa modifiers, so NSCommandKeyMask etc. +// target - instance that will get |action| called when the hotkey fires +// action - the method to call on |target| when the hotkey fires +// onPress - is YES, the hotkey fires on the keydown (usual) otherwise +// it fires on the key up. +// Returns: +// a EventHotKeyRef that you can use with other Carbon functions, or for +// unregistering the hotkey. Note that all hotkeys are unregistered +// automatically when an app quits. Will be NULL on failure. +- (EventHotKeyRef)registerHotKey:(NSUInteger)keyCode + modifiers:(NSUInteger)cocoaModifiers + target:(id)target + action:(SEL)action + whenPressed:(BOOL)onPress; + +// Unregisters a hotkey previously registered with registerHotKey. +// Arguments: +// keyRef - the EventHotKeyRef to unregister +- (void)unregisterHotKey:(EventHotKeyRef)keyRef; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEvent.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEvent.m new file mode 100644 index 00000000..16c46c83 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEvent.m @@ -0,0 +1,710 @@ +// +// GTMCarbonEvent.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMCarbonEvent.h" +#import "GTMObjectSingleton.h" +#import "GTMDebugSelectorValidation.h" + +// Wrapper for all the info we need about a hotkey that we can store in a +// Foundation storage class. We expecct selector to have this signature: +// - (void)hitHotKey:sender; +@interface GTMCarbonHotKey : NSObject { + @private + EventHotKeyID id_; // EventHotKeyID for this hotkey. + id target_; // Object we are going to call when the hotkey is hit + SEL selector_; // Selector we are going to call on target_ + BOOL onKeyDown_; // Do we do it on key down or on key up? +} + +// Create a HotKey record +// Arguments: +// keyID - id of the hotkey +// target - object we are going to call when the hotkey is hit +// action - selector we are going to call on target +// whenPressed - do we do it on key down or key up? +// Returns: +// a hotkey record, or nil on failure +- (id)initWithHotKey:(EventHotKeyID)keyID + target:(id)target + action:(SEL)selector + whenPressed:(BOOL)onKeyDown; + +// Does this record match key |keyID| +// Arguments: +// keyID - the id to match against +// Returns: +// Yes if we match this key id +- (BOOL)matchesHotKeyID:(EventHotKeyID)keyID; + +// Make target perform selector +// Returns: +// Yes if handled +- (BOOL)sendAction:(id)sender; + +// Do we do it on key down or key up? +// Returns: +// Yes if on keydown +- (BOOL)onKeyDown; + +@end + +@implementation GTMCarbonEvent + +// Create an event of class |inClass| and kind |inKind| +// +// Returns: +// Autoreleased GTMCarbonEvent +// ++ (id)eventWithClass:(UInt32)inClass kind:(UInt32)kind { + return [[[[self class] alloc] initWithClass:inClass kind:kind] autorelease]; +} + + +// Create an event based on |event|. Retains |event|. +// +// Returns: +// Autoreleased GTMCarbonEvent +// ++ (id)eventWithEvent:(EventRef)event { + return [[[[self class] alloc] initWithEvent:event] autorelease]; +} + + +// Create an event based on the event currently being handled. +// +// Returns: +// Autoreleased GTMCarbonEvent +// ++ (id)currentEvent { + return [[self class] eventWithEvent:GetCurrentEvent()]; +} + + +// Create an event of class |inClass| and kind |inKind| +// +// Returns: +// GTMCarbonEvent +// +- (id)initWithClass:(UInt32)inClass kind:(UInt32)kind { + if ((self = [super init])) { + verify_noerr(CreateEvent(kCFAllocatorDefault, inClass, kind, + 0, kEventAttributeNone, &event_)); + } + return self; +} + + +// Create an event based on |event|. Retains |event|. +// +// Returns: +// GTMCarbonEvent +// +- (id)initWithEvent:(EventRef)event { + if ((self = [super init])) { + if (event) { + event_ = RetainEvent(event); + } + } + return self; +} + + +// This does a proper event copy, but ignores the |zone|. No way to do a copy +// of an event into a specific zone. +// +// Arguments: +// zone - the zone to copy to +// Returns: +// the copied event. nil on failure +- (id)copyWithZone:(NSZone *)zone { + GTMCarbonEvent *carbonEvent = nil; + EventRef newEvent = CopyEvent([self event]); + if (newEvent) { + carbonEvent = [[[self class] allocWithZone:zone] initWithEvent:newEvent]; + ReleaseEvent(newEvent); + } + return carbonEvent; +} + +#if GTM_SUPPORT_GC +- (void)finalize { + if (event_) { + ReleaseEvent(event_); + event_ = NULL; + } + [super finalize]; +} +#endif + +// releases our retained event +// +- (void)dealloc { + if (event_) { + ReleaseEvent(event_); + event_ = NULL; + } + [super dealloc]; +} + +// description utliity for debugging +// +- (NSString *)description { + char cls[5]; + UInt32 kind; + + // Need everything bigendian if we are printing out the class as a "string" + *((UInt32 *)cls) = CFSwapInt32HostToBig([self eventClass]); + kind = [self eventKind]; + cls[4] = 0; + return [NSString stringWithFormat:@"GTMCarbonEvent '%s' %d", cls, kind]; +} + + +// Get the event's class. +// +// Returns: +// event class +// +- (UInt32)eventClass { + return GetEventClass(event_); +} + + +// Get the event's kind. +// +// Returns: +// event kind +// +- (UInt32)eventKind { + return GetEventKind(event_); +} + + +// Set the event's time. +// +// Arguments: +// time - the time you want associated with the event +// +- (void)setTime:(EventTime)eventTime { + verify_noerr(SetEventTime(event_, eventTime)); +} + + +// Get the event's time. +// +// Returns: +// the time associated with the event +// +- (EventTime)time { + return GetEventTime(event_); +} + + +// Get the event's eventref for passing to other carbon functions. +// +// Returns: +// the event ref associated with the event +// +- (EventRef)event { + return event_; +} + + +// Sends event to an event target with options +// +// Arguments: +// target - target to send event to. +// options - options to send event. See SendEventToEventTargetWithOptions +// for details. +// +// Returns: +// OSStatus value. +// +- (OSStatus)sendToTarget:(GTMCarbonEventHandler *)target + options:(OptionBits)options { + return SendEventToEventTargetWithOptions(event_, + [target eventTarget], options); +} + +// Post event to an event queue. +// +// Arguments: +// queue - queue to post it to. +// priority - priority to post it with +// +// Returns: +// OSStatus value. +// +- (OSStatus)postToQueue:(EventQueueRef)queue priority:(EventPriority)priority { + return PostEventToQueue(queue, event_, priority); +} + + +// Post event to current queue with standard priority. +// +- (void)postToCurrentQueue { + verify_noerr([self postToQueue:GetCurrentEventQueue() + priority:kEventPriorityStandard]); +} + + +// Post event to main queue with standard priority. +// +- (void)postToMainQueue { + verify_noerr([self postToQueue:GetMainEventQueue() + priority:kEventPriorityStandard]); +} + + +// Sets (or adds) a parameter to an event. Try not to use this function +// directly. Look at the PARAM_TEMPLATE_DECL/DEFN macros below. +// +// Arguments: +// name - the parameter name. +// type - the parameter type. +// size - the size of the data that |data| points to. +// data - pointer to the data you want to set the parameter to. +// +- (void)setParameterNamed:(EventParamName)name + type:(EventParamType)type + size:(ByteCount)size + data:(const void *)data { + verify_noerr(SetEventParameter(event_, name, type, size, data)); +} + + +// Gets a parameter from an event. Try not to use this function +// directly. Look at the PARAM_TEMPLATE_DECL/DEFN macros below. +// +// Arguments: +// name - the parameter name. +// type - the parameter type. +// size - the size of the data that |data| points to. +// data - pointer to the buffer that you want to fill with your data. +// +// Returns: +// YES is parameter is retrieved successfully. NO if parameter doesn't exist. +// +- (BOOL)getParameterNamed:(EventParamName)name + type:(EventParamType)type + size:(ByteCount)size + data:(void *)data { + OSStatus status = GetEventParameter(event_, name, type, + NULL, size, NULL, data); + return status == noErr; +} + + +// Gets a the size of a parameter from an event. +// +// Arguments: +// name - the parameter name. +// type - the parameter type. +// +// Returns: +// The size of the buffer required to hold the parameter. 0 if parameter +// doesn't exist. +// +- (ByteCount)sizeOfParameterNamed:(EventParamName)name + type:(EventParamType)type { + ByteCount size = 0; + verify_noerr(GetEventParameter(event_, name, type, NULL, 0, &size, NULL)); + return size; +} + +@end + +@implementation GTMCarbonEvent (GTMCarbonEventGettersAndSetters) +GTM_PARAM_TEMPLATE_DEFN(UInt32) +GTM_PARAM_TEMPLATE_DEFN(EventHotKeyID) +@end + +UInt32 GTMCocoaToCarbonKeyModifiers(NSUInteger inCocoaModifiers) { + UInt32 carbModifiers = 0; + if (inCocoaModifiers & NSAlphaShiftKeyMask) carbModifiers |= alphaLock; + if (inCocoaModifiers & NSShiftKeyMask) carbModifiers |= shiftKey; + if (inCocoaModifiers & NSControlKeyMask) carbModifiers |= controlKey; + if (inCocoaModifiers & NSAlternateKeyMask) carbModifiers |= optionKey; + if (inCocoaModifiers & NSCommandKeyMask) carbModifiers |= cmdKey; + return carbModifiers; +} + +NSUInteger GTMCarbonToCocoaKeyModifiers(UInt32 inCarbonModifiers) { + NSUInteger nsModifiers = 0; + if (inCarbonModifiers & alphaLock) nsModifiers |= NSAlphaShiftKeyMask; + if (inCarbonModifiers & shiftKey) nsModifiers |= NSShiftKeyMask; + if (inCarbonModifiers & controlKey) nsModifiers |= NSControlKeyMask; + if (inCarbonModifiers & optionKey) nsModifiers |= NSAlternateKeyMask; + if (inCarbonModifiers & cmdKey) nsModifiers |= NSCommandKeyMask; + return nsModifiers; +} + +const OSType kGTMCarbonFrameworkSignature = 'GTM '; + +@implementation GTMCarbonEventHandler + +// Does our delegate respond to eventHandler:receivedEvent:handler: +// +// Returns: +// YES if delegate responds to eventHandler:receivedEvent:handler: +- (BOOL) delegateRespondsToHandleEvent { + return delegateRespondsToHandleEvent_; +} + +// Registers the event handler to listen for |events|. +// +// Arguments: +// events - an array of EventTypeSpec. The events to register for. +// count - the number of EventTypeSpecs in events. +// +- (void)registerForEvents:(const EventTypeSpec *)events count:(size_t)count { + verify_noerr(AddEventTypesToHandler([self eventHandler], count, events)); +} + +// Causes the event handler to stop listening for |events|. +// +// Arguments: +// events - an array of EventTypeSpec. The events to register for. +// count - the number of EventTypeSpecs in events. +// +- (void)unregisterForEvents:(const EventTypeSpec *)events count:(size_t)count { + verify_noerr(RemoveEventTypesFromHandler([self eventHandler], count, events)); +} + +// To be overridden by subclasses to respond to events. All subclasses should +// call [super handleEvent:handler:] if they don't handle the event themselves. +// +// Arguments: +// event - the event to be handled +// handler - the call ref in case you want to call CallNextEventHandler +// in your method +// Returns: +// OSStatus - usually either noErr or eventNotHandledErr +// +- (OSStatus)handleEvent:(GTMCarbonEvent *)event + handler:(EventHandlerCallRef)handler { + OSStatus status = eventNotHandledErr; + require(event, CantUseParams); + require(handler, CantUseParams); + require([event event], CantUseParams); + status = CallNextEventHandler(handler, [event event]); +CantUseParams: + return status; +} + +// To be overridden by subclasses to return the event target for the class. +// GTMCarbonEventHandler's implementation returns NULL. +// +// Returns: +// The event target ref. +// +- (EventTargetRef)eventTarget { + // Defaults implementation needs to be overridden + return NULL; +} + +// C callback for our registered EventHandlerUPP. +// +// Arguments: +// inHandler - handler given to us from Carbon Event system +// inEvent - the event we are handling +// inUserData - refcon that we gave to the carbon event system. Is a +// GTMCarbonEventHandler in disguise. +// Returns: +// status of event handler +// +static OSStatus EventHandler(EventHandlerCallRef inHandler, + EventRef inEvent, + void *inUserData) { + GTMCarbonEvent *event = [GTMCarbonEvent eventWithEvent:inEvent]; + GTMCarbonEventHandler *handler= (GTMCarbonEventHandler *)inUserData; + check([handler isKindOfClass:[GTMCarbonEventHandler class]]); + + // First check to see if our delegate cares about this event. If the delegate + // handles it (i.e responds to it and does not return eventNotHandledErr) we + // do not pass it on to default handling. + OSStatus status = eventNotHandledErr; + if ([handler delegateRespondsToHandleEvent]) { + status = [[handler delegate] gtm_eventHandler:handler + receivedEvent:event + handler:inHandler]; + } + if (status == eventNotHandledErr) { + status = [handler handleEvent:event handler:inHandler]; + } + return status; +} + +// Gets the underlying EventHandlerRef for that this class wraps. +// +// Returns: +// The EventHandlerRef this class wraps. +// +- (EventHandlerRef)eventHandler { + if (!eventHandler_) { + static EventHandlerUPP sHandlerProc = NULL; + if ( sHandlerProc == NULL ) { + sHandlerProc = NewEventHandlerUPP(EventHandler); + } + verify_noerr(InstallEventHandler([self eventTarget], + sHandlerProc, 0, + NULL, self, &eventHandler_)); + } + return eventHandler_; +} + +// Gets the delegate for the handler +// +// Returns: +// the delegate +- (id)delegate { + return delegate_; +} + +// Sets the delegate for the handler and caches whether it responds to +// the eventHandler:receivedEvent:handler: selector for performance purposes. +// +// Arguments: +// delegate - the delegate for the handler +- (void)setDelegate:(id)delegate { + delegate_ = delegate; + SEL selector = @selector(gtm_eventHandler:receivedEvent:handler:); + delegateRespondsToHandleEvent_ = [delegate respondsToSelector:selector]; +} + +@end + +@implementation GTMCarbonEventMonitorHandler + +GTMOBJECT_SINGLETON_BOILERPLATE(GTMCarbonEventMonitorHandler, + sharedEventMonitorHandler); + +- (EventTargetRef)eventTarget { + return GetEventMonitorTarget(); +} + +@end + +@implementation GTMCarbonEventDispatcherHandler + +GTMOBJECT_SINGLETON_BOILERPLATE(GTMCarbonEventDispatcherHandler, + sharedEventDispatcherHandler); + +// Register for the events we handle, and set up the dictionaries we need +// to keep track of the hotkeys and commands that we handle. +// Returns: +// GTMCarbonApplication or nil on failure +- (id)init { + if ((self = [super init])) { + static EventTypeSpec events[] = { + { kEventClassKeyboard, kEventHotKeyPressed }, + { kEventClassKeyboard, kEventHotKeyReleased }, + }; + [self registerForEvents:events count:GetEventTypeCount(events)]; + hotkeys_ = [[NSMutableDictionary alloc] initWithCapacity:0]; + } + return self; +} + +// COV_NF_START +// Singleton, we never get released. Just here for completeness. +- (void)dealloc { + [hotkeys_ release]; + [super dealloc]; +} +// COV_NF_END + +- (EventTargetRef)eventTarget { + return GetEventDispatcherTarget(); +} + +// Registers a hotkey. When the hotkey is executed by the user, target will be +// called with selector. +// Arguments: +// keyCode - the virtual keycode of the hotkey +// cocoaModifiers - the modifiers that need to be used with |keyCode|. NB +// that these are cocoa modifiers, so NSCommandKeyMask etc. +// target - instance that will get |action| called when the hotkey fires +// action - the method to call on |target| when the hotkey fires +// onKeyDown - is YES, the hotkey fires on the keydown (usual) otherwise +// it fires on the key up. +// Returns: +// a EventHotKeyRef that you can use with other Carbon functions, or for +// unregistering the hotkey. Note that all hotkeys are unregistered +// automatically when an app quits. Will be NULL on failure. +- (EventHotKeyRef)registerHotKey:(NSUInteger)keyCode + modifiers:(NSUInteger)cocoaModifiers + target:(id)target + action:(SEL)selector + whenPressed:(BOOL)onKeyDown { + static UInt32 sCurrentID = 0; + + EventHotKeyRef theRef = NULL; + EventHotKeyID keyID; + keyID.signature = kGTMCarbonFrameworkSignature; + keyID.id = ++sCurrentID; + GTMCarbonHotKey *newKey = [[[GTMCarbonHotKey alloc] initWithHotKey:keyID + target:target + action:selector + whenPressed:onKeyDown] + autorelease]; + require(newKey, CantCreateKey); + require_noerr(RegisterEventHotKey((UInt32)keyCode, + GTMCocoaToCarbonKeyModifiers(cocoaModifiers), + keyID, + [self eventTarget], + 0, + &theRef), CantRegisterHotkey); + + + [hotkeys_ setObject:newKey forKey:[NSValue valueWithPointer:theRef]]; +CantCreateKey: +CantRegisterHotkey: + return theRef; +} + +// Unregisters a hotkey previously registered with registerHotKey. +// Arguments: +// keyRef - the EventHotKeyRef to unregister +- (void)unregisterHotKey:(EventHotKeyRef)keyRef { + NSValue *key = [NSValue valueWithPointer:keyRef]; + check([hotkeys_ objectForKey:key] != nil); + [hotkeys_ removeObjectForKey:key]; + verify_noerr(UnregisterEventHotKey(keyRef)); +} + +// A hotkey has been hit. See if it is one of ours, and if so fire it. +// Arguments: +// event - the hotkey even that was received +// Returns: +// Yes if handled. +- (BOOL)handleHotKeyEvent:(GTMCarbonEvent *)event { + EventHotKeyID keyID; + BOOL handled = [event getEventHotKeyIDParameterNamed:kEventParamDirectObject + data:&keyID]; + if (handled) { + GTMCarbonHotKey *hotkey; + GTM_FOREACH_OBJECT(hotkey, [hotkeys_ allValues]) { + if ([hotkey matchesHotKeyID:keyID]) { + EventKind kind = [event eventKind]; + BOOL onKeyDown = [hotkey onKeyDown]; + if ((kind == kEventHotKeyPressed && onKeyDown) || + (kind == kEventHotKeyReleased && !onKeyDown)) { + handled = [hotkey sendAction:self]; + } + break; + } + } + } + return handled; +} + +// Currently we handle hotkey and command events here. If we get one of them +// we dispatch them off to the handlers above. Otherwise we just call up to +// super. +// Arguments: +// event - the event to check +// handler - the handler call ref +// Returns: +// OSStatus +- (OSStatus)handleEvent:(GTMCarbonEvent *)event + handler:(EventHandlerCallRef)handler { + OSStatus theStatus = eventNotHandledErr; + if ([event eventClass] == kEventClassKeyboard) { + EventKind kind = [event eventKind]; + if (kind == kEventHotKeyPressed || kind == kEventHotKeyReleased) { + theStatus = [self handleHotKeyEvent:event] ? noErr : eventNotHandledErr; + } + } + // We didn't handle it, maybe somebody upstairs will. + if (theStatus == eventNotHandledErr) { + theStatus = [super handleEvent:event handler:handler]; + } + return theStatus; +} + +@end + +@implementation GTMCarbonHotKey + +// Init a HotKey record. In debug version make sure that the selector we are +// passed matches what we expect. ( +// Arguments: +// keyID - id of the hotkey +// target - object we are going to call when the hotkey is hit +// action - selector we are going to call on target +// whenPressed - do we do it on key down or key up? +// Returns: +// a hotkey record, or nil on failure +- (id)initWithHotKey:(EventHotKeyID)keyID + target:(id)target + action:(SEL)selector + whenPressed:(BOOL)onKeyDown { + if ((self = [super init])) { + if(!target || !selector) { + [self release]; + return nil; + } + id_ = keyID; + target_ = [target retain]; + selector_ = selector; + onKeyDown_ = onKeyDown; + GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(target, + selector, + @encode(void), + @encode(id), + NULL); + } + return self; +} + +- (void)dealloc { + [target_ release]; + [super dealloc]; +} + +// Does this record match key |keyID| +// Arguments: +// keyID - the id to match against +// Returns: +// Yes if we match this key id +- (BOOL)matchesHotKeyID:(EventHotKeyID)keyID { + return (id_.signature == keyID.signature) && (id_.id == keyID.id); +} + +- (BOOL)sendAction:(id)sender { + BOOL handled = NO; + @try { + [target_ performSelector:selector_ withObject:sender]; + handled = YES; + } + @catch (NSException * e) { + handled = NO; + _GTMDevLog(@"Exception fired in hotkey: %@ (%@)", [e name], [e reason]); + } // COV_NF_LINE + return handled; +} + +- (BOOL)onKeyDown { + return onKeyDown_; +} + +@end + + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEventTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEventTest.m new file mode 100644 index 00000000..f7b4d54f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMCarbonEventTest.m @@ -0,0 +1,367 @@ +// +// GTMCarbonEventTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMCarbonEvent.h" +#import "GTMUnitTestingUtilities.h" +#import "GTMUnitTestDevLog.h" + +@interface GTMCarbonEventTest : GTMTestCase { + @private + GTMCarbonEvent *event_; +} +@end + +@interface GTMCarbonEventHandlerTest : GTMTestCase { + @private + GTMCarbonEventHandler *handler_; +} +@end + +@interface GTMCarbonEventMonitorHandlerTest : GTMTestCase +@end + +@interface GTMCarbonEventDispatcherHandlerTest : GTMTestCase { + @private + BOOL hotKeyHit_; +} +@end + +static const UInt32 kTestClass = 'foo '; +static const UInt32 kTestKind = 'bar '; +static const UInt32 kTestParameterName = 'baz '; +static const UInt32 kTestBadParameterName = 'bom '; +static const UInt32 kTestParameterValue = 'bam '; + +@implementation GTMCarbonEventTest +- (void)setUp { + event_ = [[GTMCarbonEvent eventWithClass:kTestClass kind:kTestKind] retain]; +} + +- (void)tearDown { + [event_ release]; +} + +- (void)testCopy { + GTMCarbonEvent *event2 = [[event_ copy] autorelease]; + STAssertNotNil(event2, nil); +} + +- (void)testEventWithClassAndKind { + STAssertEquals([event_ eventClass], kTestClass, nil); + STAssertEquals([event_ eventKind], kTestKind, nil); +} + +- (void)testEventWithEvent { + GTMCarbonEvent *event2 = [GTMCarbonEvent eventWithEvent:[event_ event]]; + STAssertEquals([event2 event], [event_ event], nil); +} + +- (void)testCurrentEvent { + EventRef eventRef = GetCurrentEvent(); + GTMCarbonEvent *event = [GTMCarbonEvent currentEvent]; + STAssertEquals([event event], eventRef, nil); +} + +- (void)testEventClass { + [self testEventWithClassAndKind]; +} + +- (void)testEventKind { + [self testEventWithClassAndKind]; +} + +- (void)testSetTime { + EventTime eventTime = [event_ time]; + STAssertNotEquals(eventTime, kEventDurationNoWait, nil); + STAssertNotEquals(eventTime, kEventDurationForever, nil); + [event_ setTime:kEventDurationForever]; + EventTime testTime = [event_ time]; + STAssertEquals(testTime, kEventDurationForever, nil); + [event_ setTime:eventTime]; + STAssertEquals([event_ time], eventTime, nil); +} + +- (void)testTime { + [self testSetTime]; +} + +- (void)testEvent { + [self testEventWithEvent]; +} + +- (void)testSetParameterNamed { + UInt32 theData = kTestParameterValue; + [event_ setUInt32ParameterNamed:kTestParameterName data:&theData]; + theData = 0; + STAssertEquals([event_ sizeOfParameterNamed:kTestParameterName + type:typeUInt32], + sizeof(UInt32), nil); + STAssertTrue([event_ getUInt32ParameterNamed:kTestParameterName + data:&theData], nil); + STAssertEquals(theData, kTestParameterValue, nil); +} + +- (void)testGetParameterNamed { + [self testSetParameterNamed]; + UInt32 theData = kTestParameterValue; + STAssertFalse([event_ getUInt32ParameterNamed:kTestBadParameterName + data:&theData], nil); + STAssertFalse([event_ getUInt32ParameterNamed:kTestBadParameterName + data:NULL], nil); + +} + +- (void)testSizeOfParameterNamed { + [self testSetParameterNamed]; +} + +- (void)testHasParameterNamed { + [self testSetParameterNamed]; +} + +- (OSStatus)gtm_eventHandler:(GTMCarbonEventHandler *)sender + receivedEvent:(GTMCarbonEvent *)event + handler:(EventHandlerCallRef)handler { + OSStatus status = eventNotHandledErr; + if ([event eventClass] == kTestClass && [event eventKind] == kTestKind) { + status = noErr; + } + return status; +} + +- (void)testSendToTarget { + EventTypeSpec types = { kTestClass, kTestKind }; + GTMCarbonEventDispatcherHandler *handler + = [[GTMCarbonEventDispatcherHandler sharedEventDispatcherHandler] + autorelease]; + [handler registerForEvents:&types count:1]; + OSStatus status = [event_ sendToTarget:handler options:0]; + STAssertErr(status, eventNotHandledErr, @"status: %ld", status); + [handler setDelegate:self]; + status = [event_ sendToTarget:handler options:0]; + STAssertNoErr(status, @"status: %ld", status); + [handler unregisterForEvents:&types count:1]; +} + +- (void)testPostToQueue { + EventQueueRef eventQueue = GetMainEventQueue(); + [event_ postToMainQueue]; + OSStatus status = [event_ postToQueue:eventQueue + priority:kEventPriorityStandard]; + STAssertErr(status, eventAlreadyPostedErr, @"status: %ld", status); + EventTypeSpec types = { kTestClass, kTestKind }; + status = FlushEventsMatchingListFromQueue(eventQueue, 1, &types); + STAssertNoErr(status, @"status: %ld", status); + + eventQueue = GetCurrentEventQueue(); + [event_ postToCurrentQueue]; + status = [event_ postToQueue:eventQueue priority:kEventPriorityStandard]; + STAssertErr(status, eventAlreadyPostedErr, @"status: %ld", status); + status = FlushEventsMatchingListFromQueue(eventQueue, 1, &types); + STAssertNoErr(status, @"status: %ld", status); +} + +- (void)testPostToMainQueue { + [self testPostToQueue]; +} + +- (void)testPostToCurrentQueue { + STAssertEquals(GetCurrentEventQueue(), GetMainEventQueue(), nil); + [self testPostToMainQueue]; +} + +- (void)testDescription { + NSString *descString + = [NSString stringWithFormat:@"GTMCarbonEvent 'foo ' %d", kTestKind]; + STAssertEqualObjects([event_ description], descString, nil); +} +@end + +@implementation GTMCarbonEventHandlerTest + +- (void)setUp { + handler_ = [[GTMCarbonEventHandler alloc] init]; +} + +- (void)tearDown { + [handler_ release]; +} + +- (void)testEventTarget { + STAssertNULL([handler_ eventTarget], nil); +} + +- (void)testEventHandler { + [GTMUnitTestDevLogDebug expectPattern: + @"DebugAssert: GoogleToolboxForMac: event CantUseParams .*"]; + STAssertErr([handler_ handleEvent:nil handler:nil], eventNotHandledErr, nil); +} + +- (void)testDelegate { + [handler_ setDelegate:self]; + STAssertEqualObjects([handler_ delegate], self, nil); + [handler_ setDelegate:nil]; + STAssertNil([handler_ delegate], nil); +} + + +- (void)testSetDelegate { + [self testDelegate]; +} + +@end + +@implementation GTMCarbonEventMonitorHandlerTest + +- (void)testEventHandler { + GTMCarbonEventMonitorHandler *monitor + = [GTMCarbonEventMonitorHandler sharedEventMonitorHandler]; + STAssertEquals([monitor eventTarget], GetEventMonitorTarget(), nil); +} + +@end + +@implementation GTMCarbonEventDispatcherHandlerTest + +- (void)testEventHandler { + GTMCarbonEventDispatcherHandler *dispatcher + = [GTMCarbonEventDispatcherHandler sharedEventDispatcherHandler]; + STAssertEquals([dispatcher eventTarget], GetEventDispatcherTarget(), nil); +} + +- (void)hitHotKey:(id)sender { + hotKeyHit_ = YES; + [NSApp stop:self]; +} + +- (void)hitExceptionalHotKey:(id)sender { + [NSException raise:@"foo" format:@"bar"]; +} + +- (void)testRegisterHotKeyModifiersTargetActionWhenPressed { + + // This test can't be run if the screen saver is active because the security + // agent blocks us from sending events via remote operations + if (![GTMUnitTestingUtilities isScreenSaverActive]) { + GTMCarbonEventDispatcherHandler *dispatcher + = [GTMCarbonEventDispatcherHandler sharedEventDispatcherHandler]; + STAssertNotNil(dispatcher, @"Unable to acquire singleton"); + UInt32 keyMods = (NSShiftKeyMask | NSControlKeyMask + | NSAlternateKeyMask | NSCommandKeyMask); + EventHotKeyRef hotKey; + [GTMUnitTestDevLogDebug expectPattern:@"DebugAssert: GoogleToolboxForMac: " + @"newKey CantCreateKey .*"]; + STAssertNULL([dispatcher registerHotKey:0x5 + modifiers:keyMods + target:nil + action:nil + whenPressed:YES], + @"Shouldn't have created hotkey"); +#if DEBUG + // This tests debug selector validation, so we only can do it in debug. + [GTMUnitTestDevLogDebug expectPattern:@"RecordedNSAssert in " + @"GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments - " + @"\"GTMCarbonEventDispatcherHandlerTest\" selector \"badSelector:\" is " + @"unimplemented or misnamed \\(.*/GTMDebugSelectorValidation.h:[0-9]*\\)"]; + STAssertThrowsSpecificNamed([dispatcher registerHotKey:0x5 + modifiers:keyMods + target:self + action:@selector(badSelector:) + whenPressed:YES], + NSException, NSInternalInconsistencyException, + @"Shouldn't have created hotkey"); +#endif + hotKey = [dispatcher registerHotKey:0x5 + modifiers:keyMods + target:self + action:@selector(hitHotKey:) + whenPressed:YES]; + STAssertNotNULL(hotKey, @"Unable to create hotkey"); + + hotKeyHit_ = NO; + + // Post the hotkey combo to the event queue. If everything is working + // correctly hitHotKey: should get called, and hotKeyHit_ will be set for + // us. We run the event loop for a set amount of time waiting for this to + // happen. + [GTMUnitTestingUtilities postTypeCharacterEvent:'g' modifiers:keyMods]; + NSDate* future = [NSDate dateWithTimeIntervalSinceNow:1.0f]; + [GTMUnitTestingUtilities runUntilDate:future]; + STAssertTrue(hotKeyHit_, @"Hot key never got fired."); + [dispatcher unregisterHotKey:hotKey]; + } +} + +- (void)testRegisterHotKeyModifiersTargetActionWhenPressedException { + + // This test can't be run if the screen saver is active because the security + // agent blocks us from sending events via remote operations + if (![GTMUnitTestingUtilities isScreenSaverActive]) { + GTMCarbonEventDispatcherHandler *dispatcher + = [GTMCarbonEventDispatcherHandler sharedEventDispatcherHandler]; + STAssertNotNil(dispatcher, @"Unable to acquire singleton"); + UInt32 keyMods = (NSShiftKeyMask | NSControlKeyMask + | NSAlternateKeyMask | NSCommandKeyMask); + EventHotKeyRef hotKey = [dispatcher registerHotKey:0x5 + modifiers:keyMods + target:self + action:@selector(hitExceptionalHotKey:) + whenPressed:YES]; + STAssertTrue(hotKey != nil, @"Unable to create hotkey"); + + // Post the hotkey combo to the event queue. If everything is working correctly + // hitHotKey: should get called, and hotKeyHit_ will be set for us. + // We run the event loop for a set amount of time waiting for this to happen. + [GTMUnitTestingUtilities postTypeCharacterEvent:'g' modifiers:keyMods]; + NSDate* future = [NSDate dateWithTimeIntervalSinceNow:1.0f]; + [GTMUnitTestDevLog expectString:@"Exception fired in hotkey: foo (bar)"]; + [GTMUnitTestingUtilities runUntilDate:future]; + [dispatcher unregisterHotKey:hotKey]; + } +} + +- (void)testKeyModifiers { + struct { + NSUInteger cocoaKey_; + UInt32 carbonKey_; + } keyMap[] = { + { NSAlphaShiftKeyMask, alphaLock}, + { NSShiftKeyMask, shiftKey}, + { NSControlKeyMask, controlKey}, + { NSAlternateKeyMask, optionKey}, + { NSCommandKeyMask, cmdKey}, + }; + size_t combos = pow(2, sizeof(keyMap) / sizeof(keyMap[0])); + for (size_t i = 0; i < combos; i++) { + NSUInteger cocoaMods = 0; + UInt32 carbonMods = 0; + for (size_t j = 0; j < 32 && j < sizeof(keyMap) / sizeof(keyMap[0]); j++) { + if (i & 1 << j) { + cocoaMods |= keyMap[j].cocoaKey_; + carbonMods |= keyMap[j].carbonKey_; + } + } + STAssertEquals(GTMCocoaToCarbonKeyModifiers(cocoaMods), carbonMods, nil); + STAssertEquals(GTMCarbonToCocoaKeyModifiers(carbonMods), cocoaMods, nil); + } +} + + +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMDelegatingTableColumn.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMDelegatingTableColumn.h new file mode 100644 index 00000000..63abf203 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMDelegatingTableColumn.h @@ -0,0 +1,35 @@ +// +// GTMDelegatingTableColumn.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +// NOTE: If you're using the 10.5 SDK, just use the new delegate method: +// tableView:dataCellForTableColumn:row: + +@interface GTMDelegatingTableColumn : NSTableColumn +// no instance state or new method, it will just invoke the tableview's delegate +// w/ the method below. +@end + +// the method delegated to +@interface NSObject (GTMDelegatingTableColumnDelegate) +- (id)gtm_tableView:(NSTableView *)tableView + dataCellForTableColumn:(NSTableColumn *)tableColumn + row:(NSInteger)row; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMDelegatingTableColumn.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMDelegatingTableColumn.m new file mode 100644 index 00000000..0bd23714 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMDelegatingTableColumn.m @@ -0,0 +1,42 @@ +// +// GTMDelegatingTableColumn.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDelegatingTableColumn.h" + +@implementation GTMDelegatingTableColumn +- (id)dataCellForRow:(NSInteger)row { + id dataCell = nil; + id delegate = [[self tableView] delegate]; + BOOL sendSuper = YES; + if (delegate) { + if ([delegate respondsToSelector:@selector(gtm_tableView:dataCellForTableColumn:row:)]) { + + dataCell = [delegate gtm_tableView:[self tableView] + dataCellForTableColumn:self + row:row]; + sendSuper = NO; + } else { + _GTMDevLog(@"tableView delegate didn't implement gtm_tableView:dataCellForTableColumn:row:"); + } + } + if (sendSuper) { + dataCell = [super dataCellForRow:row]; + } + return dataCell; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMGetURLHandler.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMGetURLHandler.m new file mode 100644 index 00000000..dcac2922 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMGetURLHandler.m @@ -0,0 +1,310 @@ +// +// GTMGetURLHandler.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Add this class to your app to have get URL handled almost automatically for +// you. For each entry in your CFBundleURLTypes dictionaries, add a new +// key/object pair of GTMBundleURLClass/the name of the class you want +// to have handle the scheme(s). +// Then have that class respond to the class method: +// + (BOOL)gtm_openURL:(NSURL*)url +// and voila, it will just work. +// Note that in Debug mode we will do extensive testing to make sure that this +// is all hooked up correctly, and will spew out to the console if we +// find anything amiss. +// +// Example plist entry +// ... +// +// CFBundleURLTypes +// +// +// CFBundleURLName +// Google Suggestion URL +// GTMBundleURLClass +// GoogleSuggestURLHandler +// CFBundleURLSchemes +// +// googlesuggest +// googlesuggestextreme +// +// +// +// +// +// Example implementation +// @interface GoogleSuggestURLHandler +// @end +// @implementation GoogleSuggestURLHandler +// + (BOOL)gtm_openURL:(NSURL*)url { +// NSLog(@"%@", url); +// } +// @end + +#import +#import "GTMGarbageCollection.h" +#import "GTMNSAppleEventDescriptor+Foundation.h" +#import "GTMMethodCheck.h" + +static NSString *const kGTMBundleURLClassKey = @"GTMBundleURLClass"; +// A variety of constants Apple really should have defined somewhere to +// allow the compiler to find your typos. +static NSString *const kGTMCFBundleURLSchemesKey = @"CFBundleURLSchemes"; +static NSString *const kGTMCFBundleURLNameKey = @"CFBundleURLName"; +static NSString *const kGTMCFBundleTypeRoleKey = @"CFBundleTypeRole"; +static NSString *const kGTMCFBundleURLTypesKey = @"CFBundleURLTypes"; +static NSString *const kGTMCFBundleViewerRole = @"Viewer"; +static NSString *const kGTMCFBundleEditorRole = @"Editor"; + +// Set this macro elsewhere is you want to force the +// bundle checks on/off. They are nice for debugging +// problems, but shouldn't be required in a release version +// unless you are paranoid about your users messing with your +// Info.plist +#ifndef GTM_CHECK_BUNDLE_URL_CLASSES +#define GTM_CHECK_BUNDLE_URL_CLASSES DEBUG +#endif // GTM_CHECK_BUNDLE_URL_CLASSES + +@protocol GTMGetURLHandlerProtocol ++ (BOOL)gtm_openURL:(NSURL*)url; +@end + +@interface GTMGetURLHandler : NSObject { + NSArray *urlTypes_; +} +- (id)initWithTypes:(NSArray*)urlTypes; +- (void)getUrl:(NSAppleEventDescriptor *)event +withReplyEvent:(NSAppleEventDescriptor *)replyEvent; +- (void)addError:(OSStatus)error + withDescription:(NSString*)string + toDescriptor:(NSAppleEventDescriptor *)desc; ++ (id)handlerForBundle:(NSBundle *)bundle; ++ (void)getUrl:(NSAppleEventDescriptor *)event +withReplyEvent:(NSAppleEventDescriptor *)replyEvent; +@end + +@implementation GTMGetURLHandler +GTM_METHOD_CHECK(NSNumber, gtm_appleEventDescriptor); +GTM_METHOD_CHECK(NSString, gtm_appleEventDescriptor); + ++ (void)load { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSAppleEventManager *man = [NSAppleEventManager sharedAppleEventManager]; + [man setEventHandler:self + andSelector:@selector(getUrl:withReplyEvent:) + forEventClass:kInternetEventClass + andEventID:kAEGetURL]; + [pool release]; +} + ++ (void)getUrl:(NSAppleEventDescriptor *)event +withReplyEvent:(NSAppleEventDescriptor *)replyEvent { + static GTMGetURLHandler *sHandler = nil; + if (!sHandler) { + NSBundle *bundle = [NSBundle mainBundle]; + sHandler = [GTMGetURLHandler handlerForBundle:bundle]; + if (sHandler) { + [sHandler retain]; + GTMNSMakeUncollectable(sHandler); + } + } + [sHandler getUrl:event withReplyEvent:replyEvent]; +} + ++ (id)handlerForBundle:(NSBundle *)bundle { + GTMGetURLHandler *handler = nil; + NSArray *urlTypes + = [bundle objectForInfoDictionaryKey:kGTMCFBundleURLTypesKey]; + if (urlTypes) { + handler = [[[GTMGetURLHandler alloc] initWithTypes:urlTypes] autorelease]; + } else { + // COV_NF_START + // Hard to test it if we don't have it. + _GTMDevLog(@"If you don't have CFBundleURLTypes in your plist, you may want" + @" to remove GTMGetURLHandler.m from your project"); + // COV_NF_END + } + return handler; +} + +- (id)initWithTypes:(NSArray*)urlTypes { + if ((self = [super init])) { + urlTypes_ = [urlTypes retain]; +#if GTM_CHECK_BUNDLE_URL_CLASSES + // Some debug handling to check to make sure we can handle the + // classes properly. We check here instead of at init in case some of the + // handlers are being handled by plugins or other imported code that are + // loaded after we have been initialized. + NSDictionary *urlType; + GTM_FOREACH_OBJECT(urlType, urlTypes_) { + NSString *className = [urlType objectForKey:kGTMBundleURLClassKey]; + if ([className length]) { + Class cls = NSClassFromString(className); + if (cls) { + if (![cls respondsToSelector:@selector(gtm_openURL:)]) { + _GTMDevLog(@"Class %@ for URL handler %@ " + @"(URL schemes: %@) doesn't respond to openURL:", + className, + [urlType objectForKey:kGTMCFBundleURLNameKey], + [urlType objectForKey:kGTMCFBundleURLSchemesKey]); + } + } else { + _GTMDevLog(@"Unable to get class %@ for URL handler %@ " + @"(URL schemes: %@)", + className, + [urlType objectForKey:kGTMCFBundleURLNameKey], + [urlType objectForKey:kGTMCFBundleURLSchemesKey]); + } + } else { + NSString *role = [urlType objectForKey:kGTMCFBundleTypeRoleKey]; + if ([role caseInsensitiveCompare:kGTMCFBundleViewerRole] == NSOrderedSame || + [role caseInsensitiveCompare:kGTMCFBundleEditorRole] == NSOrderedSame) { + _GTMDevLog(@"Missing %@ for URL handler %@ " + @"(URL schemes: %@)", + kGTMBundleURLClassKey, + [urlType objectForKey:kGTMCFBundleURLNameKey], + [urlType objectForKey:kGTMCFBundleURLSchemesKey]); + } + } + } +#endif // GTM_CHECK_BUNDLE_URL_CLASSES + } + return self; +} + +// COV_NF_START +// Singleton is never dealloc'd +- (void)dealloc { + [urlTypes_ release]; + [super dealloc]; +} +// COV_NF_END + + +- (NSURL*)extractURLFromEvent:(NSAppleEventDescriptor*)event + withReplyEvent:(NSAppleEventDescriptor *)replyEvent { + NSAppleEventDescriptor *desc + = [event paramDescriptorForKeyword:keyDirectObject]; + NSString *urlstring = [desc stringValue]; + NSURL *url = [NSURL URLWithString:urlstring]; + if (!url) { + // COV_NF_START + // Can't convince the OS to give me a bad URL + [self addError:errAECoercionFail + withDescription:@"Unable to extract url from key direct object." + toDescriptor:replyEvent]; + // COV_NF_END + } + return url; +} + +- (Class)getClassForScheme:(NSString *)scheme + withReplyEvent:(NSAppleEventDescriptor*)replyEvent { + NSDictionary *urlType; + Class cls = nil; + NSString *typeScheme = nil; + GTM_FOREACH_OBJECT(urlType, urlTypes_) { + NSArray *schemes = [urlType objectForKey:kGTMCFBundleURLSchemesKey]; + NSString *aScheme; + GTM_FOREACH_OBJECT(aScheme, schemes) { + if ([aScheme caseInsensitiveCompare:scheme] == NSOrderedSame) { + typeScheme = aScheme; + break; + } + } + if (typeScheme) { + break; + } + } + if (typeScheme) { + NSString *class = [urlType objectForKey:kGTMBundleURLClassKey]; + if (class) { + cls = NSClassFromString(class); + } + if (!cls) { + NSString *errorString + = [NSString stringWithFormat:@"Unable to instantiate class for " + @"%@:%@ for scheme:%@.", + kGTMBundleURLClassKey, class, typeScheme]; + [self addError:errAECorruptData + withDescription:errorString + toDescriptor:replyEvent]; + } else { + if (![cls respondsToSelector:@selector(gtm_openURL:)]) { + NSString *errorString + = [NSString stringWithFormat:@"Class %@:%@ for scheme:%@ does not" + @"respond to gtm_openURL:", + kGTMBundleURLClassKey, class, typeScheme]; + [self addError:errAECorruptData + withDescription:errorString + toDescriptor:replyEvent]; + cls = Nil; + } + } + } else { + // COV_NF_START + // Don't know how to force an URL that we don't respond to upon ourselves. + NSString *errorString + = [NSString stringWithFormat:@"Unable to find handler for scheme %@.", + scheme]; + [self addError:errAECorruptData + withDescription:errorString + toDescriptor:replyEvent]; + // COV_NF_END + + } + return cls; +} + +- (void)getUrl:(NSAppleEventDescriptor *)event +withReplyEvent:(NSAppleEventDescriptor *)replyEvent { + NSURL *url = [self extractURLFromEvent:event withReplyEvent:replyEvent]; + if (!url) { + return; + } + NSString *scheme = [url scheme]; + Class cls = [self getClassForScheme:scheme withReplyEvent:replyEvent]; + if (!cls) { + return; + } + BOOL wasGood = [cls gtm_openURL:url]; + if (!wasGood) { + NSString *errorString + = [NSString stringWithFormat:@"[%@ gtm_openURL:] failed to handle %@", + NSStringFromClass(cls), url]; + [self addError:errAEEventNotHandled + withDescription:errorString + toDescriptor:replyEvent]; + } +} + +- (void)addError:(OSStatus)error + withDescription:(NSString*)string + toDescriptor:(NSAppleEventDescriptor *)desc { + NSAppleEventDescriptor *errorDesc = nil; + if (error != noErr) { + NSNumber *errNum = [NSNumber numberWithLong:error]; + errorDesc = [errNum gtm_appleEventDescriptor]; + [desc setParamDescriptor:errorDesc forKeyword:keyErrorNumber]; + } + if (string) { + errorDesc = [string gtm_appleEventDescriptor]; + [desc setParamDescriptor:errorDesc forKeyword:keyErrorString]; + } +} +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMGetURLHandlerTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMGetURLHandlerTest.m new file mode 100644 index 00000000..ba0be7d6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMGetURLHandlerTest.m @@ -0,0 +1,84 @@ +// GTMGetURLHandlerTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMUnitTestingUtilities.h" +#import "GTMUnitTestDevLog.h" + +static BOOL sURLHandlerWasHit; + +@interface GTMGetURLHandlerBadClassWarning : NSObject +@end + +@implementation GTMGetURLHandlerBadClassWarning : NSObject +@end + +@interface GTMGetURLHandlerTest : GTMTestCase +@end + +@implementation GTMGetURLHandlerTest +- (BOOL)openURLString:(NSString *)url { + ProcessSerialNumber psn = { 0, kCurrentProcess }; + NSAppleEventDescriptor *currentProcess + = [NSAppleEventDescriptor descriptorWithDescriptorType:typeProcessSerialNumber + bytes:&psn + length:sizeof(ProcessSerialNumber)]; + NSAppleEventDescriptor *event + = [NSAppleEventDescriptor appleEventWithEventClass:kInternetEventClass + eventID:kAEGetURL + targetDescriptor:currentProcess + returnID:kAutoGenerateReturnID + transactionID:kAnyTransactionID]; + NSAppleEventDescriptor *keyDesc + = [NSAppleEventDescriptor descriptorWithString:url]; + [event setParamDescriptor:keyDesc forKeyword:keyDirectObject]; + OSStatus err = AESendMessage([event aeDesc], NULL, kAEWaitReply, 60); + return err == noErr ? YES : NO; +} + ++ (BOOL)gtm_openURL:(NSURL*)url { + sURLHandlerWasHit = !sURLHandlerWasHit; + return sURLHandlerWasHit; +} + +- (void)testURLCall { + sURLHandlerWasHit = NO; + + [GTMUnitTestDevLogDebug expectPattern:@"Class GTMGetURLHandlerBadClassWarning " + @"for URL handler GTMGetURLHandlerBadClassURL .*"]; + [GTMUnitTestDevLogDebug expectPattern:@"Unable to get class " + @"GTMGetURLHandlerMissingClassWarning for URL handler " + @"GTMGetURLHandlerMissingClassURL .*"]; + [GTMUnitTestDevLogDebug expectPattern:@"Missing GTMBundleURLClass for URL handler " + @"GTMGetURLHandlerMissingHandlerURL .*"]; + STAssertTrue([self openURLString:@"gtmgeturlhandlertest://test.foo"], nil); + STAssertTrue(sURLHandlerWasHit, @"URL handler not called"); + + STAssertTrue([self openURLString:@"gtmgeturlhandlertest://test.foo"], nil); + STAssertFalse(sURLHandlerWasHit, @"URL handler not called 2"); + + // test the two URL schemes with bad entries + STAssertTrue([self openURLString:@"gtmgeturlhandlerbadclasstest://test.foo"], + nil); + + STAssertTrue([self openURLString:@"gtmgeturlhandlermissingclasstest://test.foo"], + nil); + + STAssertTrue([self openURLString:@"gtmgeturlhandlermissinghandlerurl://test.foo"], + nil); +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextField.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextField.h new file mode 100644 index 00000000..4177f496 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextField.h @@ -0,0 +1,127 @@ +// +// GTMHotKeyTextField.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Text field for capturing hot key entry. This is intended to be similar to the +// Apple key editor in their Keyboard pref pane. + +// NOTE: There are strings that need to be localized to use this field. See the +// code in stringForKeycode the the keys. The keys are all the English versions +// so you'll get reasonable things if you don't have a strings file. + +#import +#import "GTMDefines.h" + +// Dictionary key for hot key configuration information modifier flags. +// NSNumber of a unsigned int. Modifier flags are stored using Cocoa constants +// (same as NSEvent) you will need to translate them to Carbon modifier flags +// for use with RegisterEventHotKey() +#define kGTMHotKeyModifierFlagsKey @"Modifiers" + +// Dictionary key for hot key configuration of virtual key code. NSNumber of +// unsigned int. For double-modifier hotkeys (see below) this value is ignored. +#define kGTMHotKeyKeyCodeKey @"KeyCode" + +// Dictionary key for hot key configuration of double-modifier tap. NSNumber +// BOOL value. Double-tap modifier keys cannot be used with +// RegisterEventHotKey(), you must implement your own Carbon event handler. +#define kGTMHotKeyDoubledModifierKey @"DoubleModifier" + +// Custom text field class used for hot key entry. In order to use this class +// you will need to configure your window's delegate, to return the related +// field editor. +// +// Sample window delegate method: +// +// -(id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)anObject { +// +// if ([anObject isKindOfClass:[GTMHotKeyTextField class]]) { +// return [GTMHotKeyFieldEditor sharedHotKeyFieldEditor]; +// } else { +// return nil; // Window will use the AppKit shared editor +// } +// +// } +// +// +// Other notes: +// - Though you are free to implement control:textShouldEndEditing: in your +// delegate its return is always ignored. The field always accepts only +// one hotkey keystroke before editing ends. +// - The "value" binding of this control is to the dictionary describing the +// hotkey. At this time binding options are not supported. +// - The field does not attempt to consume all hotkeys. Hotkeys which are +// already bound in Apple prefs or other applications will have their +// normal effect. +// + +@interface GTMHotKeyTextField : NSTextField { + @private + NSDictionary *hotKeyDict_; + // Bindings + NSObject *boundObject_; + NSString *boundKeyPath_; +} + +// Set/Get the hot key dictionary for the field. See above for key names. +- (void)setHotKeyValue:(NSDictionary *)hotKey; +- (NSDictionary *)hotKeyValue; + +// Convert Cocoa modifier flags (-[NSEvent modifierFlags]) into a string for +// display. Modifiers are represented in the string in the same order they would +// appear in the Menu Manager. +// +// Args: +// flags: -[NSEvent modifierFlags] +// +// Returns: +// Autoreleased NSString +// ++ (NSString *)stringForModifierFlags:(unsigned int)flags; + +// Convert a keycode into a string that would result from typing the keycode in +// the current keyboard layout. This may be one or more characters. +// +// Args: +// keycode: Virtual keycode such as one obtained from NSEvent +// useGlyph: In many cases the glyphs are confusing, and a string is clearer. +// However, if you want to display in a menu item, use must +// have a glyph. Set useGlyph to FALSE to get localized strings +// which are better for UI display in places other than menus. +// bundle: Localization bundle to use for localizable key names +// +// Returns: +// Autoreleased NSString +// ++ (NSString *)stringForKeycode:(UInt16)keycode + useGlyph:(BOOL)useGlyph + resourceBundle:(NSBundle *)bundle; + +@end + +// Custom field editor for use with hotkey entry fields (GTMHotKeyTextField). +// See the GTMHotKeyTextField for instructions on using from the window +// delegate. +@interface GTMHotKeyFieldEditor : NSTextView { + @private + NSDictionary *hotKeyDict_; // strong +} + +// Get the shared field editor for all hot key fields ++ (GTMHotKeyFieldEditor *)sharedHotKeyFieldEditor; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextField.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextField.m new file mode 100644 index 00000000..65737434 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextField.m @@ -0,0 +1,1024 @@ +// GTMHotKeyTextField.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMHotKeyTextField.h" + +#import +#import "GTMSystemVersion.h" +#import "GTMObjectSingleton.h" +#import "GTMNSObject+KeyValueObserving.h" + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +typedef struct __TISInputSource* TISInputSourceRef; +static TISInputSourceRef(*GTM_TISCopyCurrentKeyboardLayoutInputSource)(void) = NULL; +static void * (*GTM_TISGetInputSourceProperty)(TISInputSourceRef inputSource, + CFStringRef propertyKey) = NULL; +static CFStringRef kGTM_TISPropertyUnicodeKeyLayoutData = NULL; +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + + +@interface GTMHotKeyTextField (PrivateMethods) +- (void)setupBinding:(id)bound withPath:(NSString *)path; +- (void)updateDisplayedPrettyString; ++ (BOOL)isValidHotKey:(NSDictionary *)hotKey; ++ (NSString *)displayStringForHotKey:(NSDictionary *)hotKey; +@end + +@interface GTMHotKeyFieldEditor (PrivateMethods) +- (NSDictionary *)hotKeyDictionary; +- (void)setHotKeyDictionary:(NSDictionary *)hotKey; +- (BOOL)shouldBypassEvent:(NSEvent *)theEvent; +- (void)processEventToHotKeyAndString:(NSEvent *)theEvent; +- (void)windowResigned:(NSNotification *)notification; +- (NSDictionary *)hotKeyDictionaryForEvent:(NSEvent *)event; +@end + +@implementation GTMHotKeyTextField + +#if GTM_SUPPORT_GC +- (void)finalize { + if (boundObject_ && boundKeyPath_) { + [boundObject_ gtm_removeObserver:self + forKeyPath:boundKeyPath_ + selector:@selector(hotKeyValueChanged:)]; + } + [super finalize]; +} +#endif + +- (void)dealloc { + + if (boundObject_ && boundKeyPath_) { + [boundObject_ gtm_removeObserver:self + forKeyPath:boundKeyPath_ + selector:@selector(hotKeyValueChanged:)]; + } + [boundObject_ release]; + [boundKeyPath_ release]; + [hotKeyDict_ release]; + [super dealloc]; + +} + +#pragma mark Bindings + + +- (void)bind:(NSString *)binding toObject:(id)observableController + withKeyPath:(NSString *)keyPath + options:(NSDictionary *)options { + + if ([binding isEqualToString:NSValueBinding]) { + // Update to our new binding + [self setupBinding:observableController withPath:keyPath]; + // TODO: Should deal with the bind options + } + [super bind:binding + toObject:observableController + withKeyPath:keyPath + options:options]; + +} + +- (void)unbind:(NSString *)binding { + + // Clean up value on unbind + if ([binding isEqualToString:NSValueBinding]) { + if (boundObject_ && boundKeyPath_) { + [boundObject_ gtm_removeObserver:self + forKeyPath:boundKeyPath_ + selector:@selector(hotKeyValueChanged:)]; + } + [boundObject_ release]; + boundObject_ = nil; + [boundKeyPath_ release]; + boundKeyPath_ = nil; + } + [super unbind:binding]; + +} + +- (void)hotKeyValueChanged:(GTMKeyValueChangeNotification *)note { + NSDictionary *change = [note change]; + // Our binding has changed, update + id changedValue = [change objectForKey:NSKeyValueChangeNewKey]; + // NSUserDefaultsController does not appear to pass on the new object and, + // perhaps other controllers may not, so if we get a nil or NSNull back + // here let's directly retrieve the hotKeyDict_ from the object. + if (!changedValue || changedValue == [NSNull null]) { + id object = [note object]; + NSString *keyPath = [note keyPath]; + changedValue = [object valueForKeyPath:keyPath]; + } + [hotKeyDict_ autorelease]; + hotKeyDict_ = [changedValue copy]; + [self updateDisplayedPrettyString]; +} + + +// Private convenience method for attaching to a new binding +- (void)setupBinding:(id)bound withPath:(NSString *)path { + + // Release previous + if (boundObject_ && boundKeyPath_) { + [boundObject_ gtm_removeObserver:self + forKeyPath:boundKeyPath_ + selector:@selector(hotKeyValueChanged:)]; + } + [boundObject_ release]; + [boundKeyPath_ release]; + // Set new + boundObject_ = [bound retain]; + boundKeyPath_ = [path copy]; + // Make ourself an observer + [boundObject_ gtm_addObserver:self + forKeyPath:boundKeyPath_ + selector:@selector(hotKeyValueChanged:) + userInfo:nil + options:NSKeyValueObservingOptionNew]; + // Pull in any current value + [hotKeyDict_ autorelease]; + hotKeyDict_ = [[boundObject_ valueForKeyPath:boundKeyPath_] copy]; + // Update the display string + [self updateDisplayedPrettyString]; + +} + +#pragma mark Defeating NSControl + +- (double)doubleValue { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return 0.0; + +} + +- (void)setDoubleValue:(double)value { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return; + +} + +- (float)floatValue { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return 0.0f; + +} + +- (void)setFloatValue:(float)value { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return; + +} + +- (int)intValue { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return 0; + +} + +- (void)setIntValue:(int)value { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return; + +} + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +- (NSInteger)integerValue { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return 0; + +} + +- (void)setIntegerValue:(NSInteger)value { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return; + +} + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +- (id)objectValue { + + return [self hotKeyValue]; + +} + +- (void)setObjectValue:(id)object { + + [self setHotKeyValue:object]; + +} + +- (NSString *)stringValue { + + return [[self class] displayStringForHotKey:hotKeyDict_]; + +} + +- (void)setStringValue:(NSString *)string { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields want dictionaries, not strings."); + return; + +} + +- (NSAttributedString *)attributedStringValue { + + NSString *prettyString = [self stringValue]; + if (!prettyString) return nil; + return [[[NSAttributedString alloc] initWithString:prettyString] autorelease]; + +} + +- (void)setAttributedStringValue:(NSAttributedString *)string { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields want dictionaries, not strings."); + return; + +} + +- (void)takeDoubleValueFrom:(id)sender { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return; + +} + +- (void)takeFloatValueFrom:(id)sender { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return; + +} + +- (void)takeIntValueFrom:(id)sender { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't take numbers."); + return; + +} + +- (void)takeObjectValueFrom:(id)sender { + + // Defeating NSControl + _GTMDevAssert(NO, + @"Hot key fields want dictionaries via bindings, not from controls."); + return; + +} + +- (void)takeStringValueFrom:(id)sender { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields want dictionaries, not strings."); + return; + +} + +- (id)formatter { + + return nil; + +} + +- (void)setFormatter:(NSFormatter *)newFormatter { + + // Defeating NSControl + _GTMDevAssert(NO, @"Hot key fields don't accept formatters."); + return; + +} + +#pragma mark Hot Key Support + ++ (BOOL)isValidHotKey:(NSDictionary *)hotKeyDict { + if (!hotKeyDict || + ![hotKeyDict isKindOfClass:[NSDictionary class]] || + ![hotKeyDict objectForKey:kGTMHotKeyModifierFlagsKey] || + ![hotKeyDict objectForKey:kGTMHotKeyKeyCodeKey] || + ![hotKeyDict objectForKey:kGTMHotKeyDoubledModifierKey]) { + return NO; + } + return YES; +} + +- (void)setHotKeyValue:(NSDictionary *)hotKey { + + // Sanity only if set, nil is OK + if (hotKey && ![[self class] isValidHotKey:hotKey]) { + return; + } + + // If we are bound we want to round trip through that interface + if (boundObject_ && boundKeyPath_) { + // If the change is accepted this will call us back as an observer + [boundObject_ setValue:hotKey forKeyPath:boundKeyPath_]; + return; + } + + // Otherwise we directly update ourself + [hotKeyDict_ autorelease]; + hotKeyDict_ = [hotKey copy]; + [self updateDisplayedPrettyString]; + +} + +- (NSDictionary *)hotKeyValue { + + return hotKeyDict_; + +} + +// Private method to update the displayed text of the field with the +// user-readable representation. +- (void)updateDisplayedPrettyString { + + // Basic validation + if (![[self class] isValidHotKey:hotKeyDict_]) { + [super setStringValue:@""]; + return; + } + + // Pretty string + NSString *prettyString = [[self class] displayStringForHotKey:hotKeyDict_]; + if (!prettyString) { + prettyString = @""; + } + [super setStringValue:prettyString]; + +} + ++ (NSString *)displayStringForHotKey:(NSDictionary *)hotKeyDict { + + if (!hotKeyDict) return nil; + + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + + // Modifiers + unsigned int flags + = [[hotKeyDict objectForKey:kGTMHotKeyModifierFlagsKey] unsignedIntValue]; + NSString *mods = [GTMHotKeyTextField stringForModifierFlags:flags]; + if (!mods || ![mods length]) return nil; + // Handle double modifier case + if ([[hotKeyDict objectForKey:kGTMHotKeyDoubledModifierKey] boolValue]) { + return [NSString stringWithFormat:@"%@ + %@", mods, mods]; + } + // Keycode + unsigned int keycode + = [[hotKeyDict objectForKey:kGTMHotKeyKeyCodeKey] unsignedIntValue]; + NSString *keystroke = [GTMHotKeyTextField stringForKeycode:keycode + useGlyph:NO + resourceBundle:bundle]; + if (!keystroke || ![keystroke length]) return nil; + return [NSString stringWithFormat:@"%@%@", mods, keystroke]; + +} + + +#pragma mark Field Editor Callbacks + +- (BOOL)textShouldBeginEditing:(GTMHotKeyFieldEditor *)fieldEditor { + + // Sanity + if (![fieldEditor isKindOfClass:[GTMHotKeyFieldEditor class]]) { + _GTMDevLog(@"Field editor not appropriate for field, check window delegate"); + return NO; + } + + // We don't call super from here, because we are defeating default behavior + // as a result we have to call the delegate ourself. + id myDelegate = [self delegate]; + SEL selector = @selector(control:textShouldBeginEditing:); + if ([myDelegate respondsToSelector:selector]) { + if (![myDelegate control:self textShouldBeginEditing:fieldEditor]) return NO; + } + + // Update the field editor internal hotkey representation + [fieldEditor setHotKeyDictionary:hotKeyDict_]; // OK if its nil + return YES; + +} + +- (void)textDidChange:(NSNotification *)notification { + + // Sanity + GTMHotKeyFieldEditor *fieldEditor = [notification object]; + if (![fieldEditor isKindOfClass:[GTMHotKeyFieldEditor class]]) { + _GTMDevLog(@"Field editor not appropriate for field, check window delegate"); + return; + } + + // When the field changes we want to read in the current hotkey value so + // bindings can validate + [self setHotKeyValue:[fieldEditor hotKeyDictionary]]; + + // Let super handle the notifications + [super textDidChange:notification]; + +} + +- (BOOL)textShouldEndEditing:(GTMHotKeyFieldEditor *)fieldEditor { + + // Sanity + if (![fieldEditor isKindOfClass:[GTMHotKeyFieldEditor class]]) { + _GTMDevLog(@"Field editor not appropriate for field, check window delegate"); + return NO; + } + + // Again we are defeating default behavior so we have to do delegate handling + // ourself. In this case our goal is simply to prevent the superclass from + // doing its own KVO, but we can also skip [[self cell] isEntryAcceptable:]. + // We'll also ignore the delegate control:textShouldEndEditing:. The field + // editor is done whether they like it or not. + id myDelegate = [self delegate]; + SEL selector = @selector(control:textShouldEndEditing:); + if ([myDelegate respondsToSelector:selector]) { + [myDelegate control:self textShouldEndEditing:fieldEditor]; + } + + // The end is always allowed, so set new value + [self setHotKeyValue:[fieldEditor hotKeyDictionary]]; + + return YES; + +} + +#pragma mark Class methods building strings for use w/in the UI. + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ++ (void)initialize { + if (!GTM_TISCopyCurrentKeyboardLayoutInputSource + && [GTMSystemVersion isLeopardOrGreater]) { + CFBundleRef hiToolbox + = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.HIToolbox")); + if (hiToolbox) { + kGTM_TISPropertyUnicodeKeyLayoutData + = *(CFStringRef*)CFBundleGetDataPointerForName(hiToolbox, + CFSTR("kTISPropertyUnicodeKeyLayoutData")); + GTM_TISCopyCurrentKeyboardLayoutInputSource + = CFBundleGetFunctionPointerForName(hiToolbox, + CFSTR("TISCopyCurrentKeyboardLayoutInputSource")); + GTM_TISGetInputSourceProperty + = CFBundleGetFunctionPointerForName(hiToolbox, + CFSTR("TISGetInputSourceProperty")); + } + } +} +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + +#pragma mark Useful String Class Methods + +// These are not in a category on NSString because this class could be used +// within multiple preference panes at the same time. If we put it in a category +// it would require setting up some magic so that the categories didn't conflict +// between the multiple pref panes. By putting it in the class, you can just +// #define the class name to something else, and then you won't have any +// conflicts. + ++ (NSString *)stringForModifierFlags:(unsigned int)flags { + + UniChar modChars[4]; // We only look for 4 flags + unsigned int charCount = 0; + // These are in the same order as the menu manager shows them + if (flags & NSControlKeyMask) modChars[charCount++] = kControlUnicode; + if (flags & NSAlternateKeyMask) modChars[charCount++] = kOptionUnicode; + if (flags & NSShiftKeyMask) modChars[charCount++] = kShiftUnicode; + if (flags & NSCommandKeyMask) modChars[charCount++] = kCommandUnicode; + if (charCount == 0) return nil; + return [NSString stringWithCharacters:modChars length:charCount]; + +} + ++ (NSString *)stringForKeycode:(UInt16)keycode + useGlyph:(BOOL)useGlyph + resourceBundle:(NSBundle *)bundle { + + // Some keys never move in any layout (to the best of our knowledge at least) + // so we can hard map them. + UniChar key = 0; + NSString *localizedKey = nil; + + switch (keycode) { + + // Of the hard mapped keys some can be represented with pretty and obvioous + // Unicode or simple strings without localization. + + // Arrow keys + case 123: key = NSLeftArrowFunctionKey; break; + case 124: key = NSRightArrowFunctionKey; break; + case 125: key = NSDownArrowFunctionKey; break; + case 126: key = NSUpArrowFunctionKey; break; + case 122: key = NSF1FunctionKey; break; + case 120: key = NSF2FunctionKey; break; + case 99: key = NSF3FunctionKey; break; + case 118: key = NSF4FunctionKey; break; + case 96: key = NSF5FunctionKey; break; + case 97: key = NSF6FunctionKey; break; + case 98: key = NSF7FunctionKey; break; + case 100: key = NSF8FunctionKey; break; + case 101: key = NSF9FunctionKey; break; + case 109: key = NSF10FunctionKey; break; + case 103: key = NSF11FunctionKey; break; + case 111: key = NSF12FunctionKey; break; + case 105: key = NSF13FunctionKey; break; + case 107: key = NSF14FunctionKey; break; + case 113: key = NSF15FunctionKey; break; + case 106: key = NSF16FunctionKey; break; + // Forward delete is a terrible name so we'll use the glyph Apple puts on + // their current keyboards + case 117: key = 0x2326; break; + + // Now we have keys that can be hard coded but don't have good glyph + // representations. Sure, the Apple menu manager has glyphs for them, but + // an informal poll of Google developers shows no one really knows what + // they mean, so its probably a good idea to use strings. Unfortunately + // this also means localization (*sigh*). We'll use the real English + // strings here as keys so that even if localization is missed we'll do OK + // in output. + + // Whitespace + case 36: key = '\r'; localizedKey = @"Return"; break; + case 76: key = 0x3; localizedKey = @"Enter"; break; + case 48: key = 0x9; localizedKey = @"Tab"; break; + case 49: key = 0xA0; localizedKey = @"Space"; break; + // Control keys + case 51: key = 0x8; localizedKey = @"Delete"; break; + case 71: key = NSClearDisplayFunctionKey; localizedKey = @"Clear"; break; + case 53: key = 0x1B; localizedKey = @"Esc"; break; + case 115: key = NSHomeFunctionKey; localizedKey = @"Home"; break; + case 116: key = NSPageUpFunctionKey; localizedKey = @"Page Up"; break; + case 119: key = NSEndFunctionKey; localizedKey = @"End"; break; + case 121: key = NSPageDownFunctionKey; localizedKey = @"Page Down"; break; + case 114: key = NSHelpFunctionKey; localizedKey = @"Help"; break; + // Keypad keys + // There is no good way we could find to glyph these. We tried a variety + // of Unicode glyphs, and the menu manager wouldn't take them. We tried + // subscript numbers, circled numbers and superscript numbers with no + // luck. It may be a bit confusing to the user, but we're happy to hear + // any suggestions. + case 65: key = '.'; localizedKey = @"Keypad ."; break; + case 67: key = '*'; localizedKey = @"Keypad *"; break; + case 69: key = '+'; localizedKey = @"Keypad +"; break; + case 75: key = '/'; localizedKey = @"Keypad /"; break; + case 78: key = '-'; localizedKey = @"Keypad -"; break; + case 81: key = '='; localizedKey = @"Keypad ="; break; + case 82: key = '0'; localizedKey = @"Keypad 0"; break; + case 83: key = '1'; localizedKey = @"Keypad 1"; break; + case 84: key = '2'; localizedKey = @"Keypad 2"; break; + case 85: key = '3'; localizedKey = @"Keypad 3"; break; + case 86: key = '4'; localizedKey = @"Keypad 4"; break; + case 87: key = '5'; localizedKey = @"Keypad 5"; break; + case 88: key = '6'; localizedKey = @"Keypad 6"; break; + case 89: key = '7'; localizedKey = @"Keypad 7"; break; + case 91: key = '8'; localizedKey = @"Keypad 8"; break; + case 92: key = '9'; localizedKey = @"Keypad 9"; break; + + } + + // If they asked for strings, and we have one return it. Otherwise, return + // any key we've picked. + if (!useGlyph && localizedKey) { + return NSLocalizedStringFromTableInBundle(localizedKey, @"KeyCode", + bundle, @""); + } else if (key != 0) { + return [NSString stringWithFormat:@"%C", key]; + } + + // Everything else should be printable so look it up in the current keyboard + UCKeyboardLayout *uchrData = NULL; + + OSStatus err = noErr; +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + // layout + KeyboardLayoutRef currentLayout = NULL; + // Get the layout kind + SInt32 currentLayoutKind = -1; + if ([GTMSystemVersion isLeopardOrGreater] + && kGTM_TISPropertyUnicodeKeyLayoutData + && GTM_TISGetInputSourceProperty + && GTM_TISCopyCurrentKeyboardLayoutInputSource) { + // On Leopard we use the new improved TIS interfaces which work for input + // sources as well as keyboard layouts. + TISInputSourceRef inputSource + = GTM_TISCopyCurrentKeyboardLayoutInputSource(); + if (inputSource) { + CFDataRef uchrDataRef + = GTM_TISGetInputSourceProperty(inputSource, + kGTM_TISPropertyUnicodeKeyLayoutData); + if(uchrDataRef) { + uchrData = (UCKeyboardLayout*)CFDataGetBytePtr(uchrDataRef); + } + CFRelease(inputSource); + } + } else { + // Tiger we use keyboard layouts as it's the best we can officially do. + err = KLGetCurrentKeyboardLayout(¤tLayout); + if (err != noErr) { // COV_NF_START + _GTMDevLog(@"failed to fetch the keyboard layout, err=%d", err); + return nil; + } // COV_NF_END + + err = KLGetKeyboardLayoutProperty(currentLayout, + kKLKind, + (const void **)¤tLayoutKind); + if (err != noErr) { // COV_NF_START + _GTMDevLog(@"failed to fetch the keyboard layout kind property, err=%d", + err); + return nil; + } // COV_NF_END + + if (currentLayoutKind != kKLKCHRKind) { + err = KLGetKeyboardLayoutProperty(currentLayout, + kKLuchrData, + (const void **)&uchrData); + if (err != noErr) { // COV_NF_START + _GTMDevLog(@"failed to fetch the keyboard layout uchar data, err=%d", + err); + return nil; + } // COV_NF_END + } + } +#else + TISInputSourceRef inputSource = TISCopyCurrentKeyboardLayoutInputSource(); + if (inputSource) { + CFDataRef uchrDataRef + = TISGetInputSourceProperty(inputSource, kTISPropertyUnicodeKeyLayoutData); + if(uchrDataRef) { + uchrData = (UCKeyboardLayout*)CFDataGetBytePtr(uchrDataRef); + } + CFRelease(inputSource); + } +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + + NSString *keystrokeString = nil; + if (uchrData) { + // uchr layout data is available, this is our preference + UniCharCount uchrCharLength = 0; + UniChar uchrChars[256] = { 0 }; + UInt32 uchrDeadKeyState = 0; + err = UCKeyTranslate(uchrData, + keycode, + kUCKeyActionDisplay, + 0, // No modifiers + LMGetKbdType(), + kUCKeyTranslateNoDeadKeysMask, + &uchrDeadKeyState, + sizeof(uchrChars) / sizeof(UniChar), + &uchrCharLength, + uchrChars); + if (err != noErr) { + // COV_NF_START + _GTMDevLog(@"failed to translate the keycode, err=%d", err); + return nil; + // COV_NF_END + } + if (uchrCharLength < 1) return nil; + keystrokeString = [NSString stringWithCharacters:uchrChars + length:uchrCharLength]; + } +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + else if (currentLayoutKind == kKLKCHRKind) { + // Only KCHR layout data is available, go old school + void *KCHRData = NULL; + err = KLGetKeyboardLayoutProperty(currentLayout, kKLKCHRData, + (const void **)&KCHRData); + if (err != noErr) { // COV_NF_START + _GTMDevLog(@"failed to fetch the keyboard layout uchar data, err=%d", + err); + return nil; + } // COV_NF_END + // Turn into character code + UInt32 keyTranslateState = 0; + UInt32 twoKCHRChars = KeyTranslate(KCHRData, keycode, &keyTranslateState); + if (!twoKCHRChars) return nil; + // Unpack the fields + char firstChar = (char)((twoKCHRChars & 0x00FF0000) >> 16); + char secondChar = (char)(twoKCHRChars & 0x000000FF); + // May have one or two characters + if (firstChar && secondChar) { + NSString *str1 + = [[[NSString alloc] initWithBytes:&firstChar + length:1 + encoding:NSMacOSRomanStringEncoding] autorelease]; + NSString *str2 + = [[[NSString alloc] initWithBytes:&secondChar + length:1 + encoding:NSMacOSRomanStringEncoding] autorelease]; + keystrokeString = [NSString stringWithFormat:@"%@%@", + [str1 uppercaseString], + [str2 uppercaseString]]; + } else { + keystrokeString = [[[NSString alloc] initWithBytes:&secondChar + length:1 + encoding:NSMacOSRomanStringEncoding] autorelease]; + [keystrokeString uppercaseString]; + } + } +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + + // Sanity we got a stroke + if (!keystrokeString || ![keystrokeString length]) return nil; + + // Sanity check the keystroke string for unprintable characters + NSMutableCharacterSet *validChars = + [[[NSMutableCharacterSet alloc] init] autorelease]; + + [validChars formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]]; + [validChars formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; + [validChars formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]]; + for (unsigned int i = 0; i < [keystrokeString length]; i++) { + if (![validChars characterIsMember:[keystrokeString characterAtIndex:i]]) { + return nil; + } + } + + if (!useGlyph) { + // menus want glyphs in the original lowercase forms, so we only upper this + // if we aren't using it as a glyph. + keystrokeString = [keystrokeString uppercaseString]; + } + + return keystrokeString; + +} + +@end + +@implementation GTMHotKeyFieldEditor + +GTMOBJECT_SINGLETON_BOILERPLATE(GTMHotKeyFieldEditor, sharedHotKeyFieldEditor) + +- (id)init { + + self = [super init]; + if (!self) return nil; + [self setFieldEditor:YES]; // We are a field editor + + return self; + +} + +- (void)dealloc { + + [hotKeyDict_ release]; + [super dealloc]; + +} + +- (NSArray *)acceptableDragTypes { + + // Don't take drags + return [NSArray array]; + +} + +- (NSArray *)readablePasteboardTypes { + + // No pasting + return [NSArray array]; + +} + +- (NSArray *)writablePasteboardTypes { + + // No copying + return [NSArray array]; + +} + +- (BOOL)becomeFirstResponder { + + // We need to lose focus any time the window is not key + NSNotificationCenter *dc = [NSNotificationCenter defaultCenter]; + [dc addObserver:self + selector:@selector(windowResigned:) + name:NSWindowDidResignKeyNotification + object:[self window]]; + return [super becomeFirstResponder]; + +} + +- (BOOL)resignFirstResponder { + + // No longer interested in window resign + [[NSNotificationCenter defaultCenter] removeObserver:self]; + return [super resignFirstResponder]; + +} + +// Private method we use to get out of global hotkey capture when the window +// is no longer front +- (void)windowResigned:(NSNotification *)notification { + + // Lose our focus + [[self window] makeFirstResponder:[self window]]; + +} + +- (BOOL)shouldDrawInsertionPoint { + + // Show an insertion point, because we'll kill our own focus after + // each entry + return YES; + +} + +- (NSRange)selectionRangeForProposedRange:(NSRange)proposedSelRange + granularity:(NSSelectionGranularity)granularity { + + // Always select everything + return NSMakeRange(0, [[self textStorage] length]); + +} + +- (void)keyDown:(NSEvent *)theEvent { + + if ([self shouldBypassEvent:theEvent]) { + [super keyDown:theEvent]; + } else { + // Try to eat the event + [self processEventToHotKeyAndString:theEvent]; + } + +} + +- (BOOL)performKeyEquivalent:(NSEvent *)theEvent { + + if ([self shouldBypassEvent:theEvent]) { + return [super performKeyEquivalent:theEvent]; + } else { + // We always eat these key strokes while we have focus + [self processEventToHotKeyAndString:theEvent]; + return YES; + } + +} + +// Private do method that tell us to ignore certain events +- (BOOL)shouldBypassEvent:(NSEvent *)theEvent { + + UInt16 keyCode = [theEvent keyCode]; + NSUInteger modifierFlags + = [theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask; + + // Ignore all events containing tabs. They have special meaning to fields + // and some (Cmd Tab variants) are always consumed by the Dock, so users + // just shouldn't be able to use them. + if (keyCode == 48) { // Tab + // Just to be extra clear if the user is trying to use Dock hotkeys beep + // at them + if ((modifierFlags == NSCommandKeyMask) || + (modifierFlags == (NSCommandKeyMask | NSShiftKeyMask))) { + NSBeep(); + } + return YES; + } + + // Don't eat Cmd-Q. Users could have it as a hotkey, but its more likely + // they're trying to quit + if ((keyCode == 12) && (modifierFlags == NSCommandKeyMask)) { + return YES; + } + // Same for Cmd-W, user is probably trying to close the window + if ((keyCode == 13) && (modifierFlags == NSCommandKeyMask)) { + return YES; + } + + return NO; + +} + +// Private method that turns events into strings and dictionaries for our +// hotkey plumbing. +- (void)processEventToHotKeyAndString:(NSEvent *)theEvent { + + // Construct a dictionary of the event as a hotkey pref + NSDictionary *newHotKey = [self hotKeyDictionaryForEvent:theEvent]; + if (!newHotKey) { + NSBeep(); + return; // No action, but don't give up focus + } + NSString *prettyString = [GTMHotKeyTextField displayStringForHotKey:newHotKey]; + if (!prettyString) { + NSBeep(); + return; + } + + // Replacement range + NSRange replaceRange = NSMakeRange(0, [[self textStorage] length]); + + // Ask for permission to replace + if (![self shouldChangeTextInRange:replaceRange + replacementString:prettyString]) { + // If replacement was disallowed, change nothing, including hotKeyDict_ + NSBeep(); + return; + } + + // Replacement was allowed, update + [hotKeyDict_ autorelease]; + hotKeyDict_ = [newHotKey retain]; + + // Set string on self, allowing super to handle attribute copying + [self setString:prettyString]; + + // Finish the change + [self didChangeText]; + + // Force editing to end. This sends focus off into space slightly, but + // its better than constantly capturing user events. This is exactly + // like the Apple editor in their Keyboard pref pane. + [[[self delegate] cell] endEditing:self]; + +} + +- (NSDictionary *)hotKeyDictionary { + + return hotKeyDict_; + +} + +- (void)setHotKeyDictionary:(NSDictionary *)hotKey { + + [hotKeyDict_ autorelease]; + hotKeyDict_ = [hotKey copy]; + // Update content + NSString *prettyString = nil; + if (hotKeyDict_) { + prettyString = [GTMHotKeyTextField displayStringForHotKey:hotKey]; + } + if (!prettyString) { + prettyString = @""; + } + [self setString:prettyString]; + +} + +- (NSDictionary *)hotKeyDictionaryForEvent:(NSEvent *)event{ + + if (!event) return nil; + + // Check event + NSUInteger flags = [event modifierFlags]; + UInt16 keycode = [event keyCode]; + // If the event has no modifiers do nothing + NSUInteger allModifiers = (NSCommandKeyMask | NSAlternateKeyMask | + NSControlKeyMask | NSShiftKeyMask); + if (!(flags & allModifiers)) return nil; + // If the event has high bits in keycode do nothing + if (keycode & 0xFF00) return nil; + + // Clean the flags to only contain things we care about + UInt32 cleanFlags = 0; + if (flags & NSCommandKeyMask) cleanFlags |= NSCommandKeyMask; + if (flags & NSAlternateKeyMask) cleanFlags |= NSAlternateKeyMask; + if (flags & NSControlKeyMask) cleanFlags |= NSControlKeyMask; + if (flags & NSShiftKeyMask) cleanFlags |= NSShiftKeyMask; + + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:NO], + kGTMHotKeyDoubledModifierKey, + [NSNumber numberWithUnsignedInt:keycode], + kGTMHotKeyKeyCodeKey, + [NSNumber numberWithUnsignedInt:cleanFlags], + kGTMHotKeyModifierFlagsKey, + nil]; + +} +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextFieldTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextFieldTest.m new file mode 100644 index 00000000..ee1bfc2b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMHotKeyTextFieldTest.m @@ -0,0 +1,204 @@ +// GTMHotKeyTextFieldTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMHotKeyTextField.h" + +#import "GTMSenTestCase.h" + +@interface GTMHotKeyTextField (PrivateMethods) +// Private methods which we want to access to test ++ (BOOL)isValidHotKey:(NSDictionary *)hotKey; ++ (NSString *)displayStringForHotKey:(NSDictionary *)hotKey; +@end + +@interface GTMHotKeyTextFieldTest : GTMTestCase +@end + +@implementation GTMHotKeyTextFieldTest + +- (void)testStringForModifierFlags { + + // Make sure only the flags we expect generate things in their strings + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:NSAlphaShiftKeyMask] length], + (NSUInteger)0, nil); + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:NSShiftKeyMask] length], + (NSUInteger)1, nil); + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:NSControlKeyMask] length], + (NSUInteger)1, nil); + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:NSAlternateKeyMask] length], + (NSUInteger)1, nil); + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:NSCommandKeyMask] length], + (NSUInteger)1, nil); + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:NSNumericPadKeyMask] length], + (NSUInteger)0, nil); + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:NSHelpKeyMask] length], + (NSUInteger)0, nil); + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:NSFunctionKeyMask] length], + (NSUInteger)0, nil); + + // And some quick checks combining flags to make sure the string gets longer + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:(NSShiftKeyMask | + NSAlternateKeyMask)] length], + (NSUInteger)2, nil); + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:(NSShiftKeyMask | + NSAlternateKeyMask | + NSCommandKeyMask)] length], + (NSUInteger)3, nil); + STAssertEquals([[GTMHotKeyTextField stringForModifierFlags:(NSShiftKeyMask | + NSAlternateKeyMask | + NSCommandKeyMask | + NSControlKeyMask)] length], + (NSUInteger)4, nil); + +} + +- (void)testStringForKeycode_useGlyph_resourceBundle { + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + STAssertNotNil(bundle, @"failed to get our bundle?"); + NSString *str; + + // We need a better test, but for now, we'll just loop through things we know + // we handle. + + // TODO: we need to force the pre leopard code path during tests. + + UInt16 testData[] = { + 123, 124, 125, 126, 122, 120, 99, 118, 96, 97, 98, 100, 101, 109, 103, 111, + 105, 107, 113, 106, 117, 36, 76, 48, 49, 51, 71, 53, 115, 116, 119, 121, + 114, 65, 67, 69, 75, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 92, + }; + for (int useGlyph = 0 ; useGlyph < 2 ; ++useGlyph) { + for (size_t i = 0; i < (sizeof(testData) / sizeof(UInt16)); ++i) { + UInt16 keycode = testData[i]; + + str = [GTMHotKeyTextField stringForKeycode:keycode + useGlyph:useGlyph + resourceBundle:bundle]; + STAssertNotNil(str, + @"failed to get a string for keycode %u (useGlyph:%@)", + keycode, (useGlyph ? @"YES" : @"NO")); + STAssertGreaterThan([str length], (NSUInteger)0, + @"got an empty string for keycode %u (useGlyph:%@)", + keycode, (useGlyph ? @"YES" : @"NO")); + } + } +} + +- (void)testGTMHotKeyPrettyString { + NSDictionary *hkDict; + + hkDict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:NO], + kGTMHotKeyDoubledModifierKey, + [NSNumber numberWithUnsignedInt:114], + kGTMHotKeyKeyCodeKey, + [NSNumber numberWithUnsignedInt:NSCommandKeyMask], + kGTMHotKeyModifierFlagsKey, + nil]; + STAssertNotNil(hkDict, nil); + STAssertNotNil([GTMHotKeyTextField displayStringForHotKey:hkDict], nil); + + hkDict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithUnsignedInt:114], + kGTMHotKeyKeyCodeKey, + [NSNumber numberWithUnsignedInt:NSCommandKeyMask], + kGTMHotKeyModifierFlagsKey, + nil]; + STAssertNotNil(hkDict, nil); + STAssertNotNil([GTMHotKeyTextField displayStringForHotKey:hkDict], nil); + + hkDict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:NO], + kGTMHotKeyDoubledModifierKey, + [NSNumber numberWithUnsignedInt:NSCommandKeyMask], + kGTMHotKeyModifierFlagsKey, + nil]; + STAssertNotNil(hkDict, nil); + STAssertNotNil([GTMHotKeyTextField displayStringForHotKey:hkDict], nil); + + hkDict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:NO], + kGTMHotKeyDoubledModifierKey, + [NSNumber numberWithUnsignedInt:114], + kGTMHotKeyKeyCodeKey, + nil]; + STAssertNotNil(hkDict, nil); + STAssertNil([GTMHotKeyTextField displayStringForHotKey:hkDict], nil); + + hkDict = [NSDictionary dictionary]; + STAssertNotNil(hkDict, nil); + STAssertNil([GTMHotKeyTextField displayStringForHotKey:hkDict], nil); + + STAssertNil([GTMHotKeyTextField displayStringForHotKey:nil], nil); + +} + +- (void)testGTMHotKeyDictionaryAppearsValid { + NSDictionary *hkDict; + + hkDict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:NO], + kGTMHotKeyDoubledModifierKey, + [NSNumber numberWithUnsignedInt:114], + kGTMHotKeyKeyCodeKey, + [NSNumber numberWithUnsignedInt:NSCommandKeyMask], + kGTMHotKeyModifierFlagsKey, + nil]; + STAssertNotNil(hkDict, nil); + STAssertTrue([GTMHotKeyTextField isValidHotKey:hkDict], nil); + + hkDict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithUnsignedInt:114], + kGTMHotKeyKeyCodeKey, + [NSNumber numberWithUnsignedInt:NSCommandKeyMask], + kGTMHotKeyModifierFlagsKey, + nil]; + STAssertNotNil(hkDict, nil); + STAssertFalse([GTMHotKeyTextField isValidHotKey:hkDict], nil); + + hkDict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:NO], + kGTMHotKeyDoubledModifierKey, + [NSNumber numberWithUnsignedInt:NSCommandKeyMask], + kGTMHotKeyModifierFlagsKey, + nil]; + STAssertNotNil(hkDict, nil); + STAssertFalse([GTMHotKeyTextField isValidHotKey:hkDict], nil); + + hkDict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:NO], + kGTMHotKeyDoubledModifierKey, + [NSNumber numberWithUnsignedInt:114], + kGTMHotKeyKeyCodeKey, + nil]; + STAssertNotNil(hkDict, nil); + STAssertFalse([GTMHotKeyTextField isValidHotKey:hkDict], nil); + + hkDict = [NSDictionary dictionary]; + STAssertNotNil(hkDict, nil); + STAssertFalse([GTMHotKeyTextField isValidHotKey:hkDict], nil); + + STAssertFalse([GTMHotKeyTextField isValidHotKey:nil], nil); + + // Make sure it doesn't choke w/ an object of the wrong time (since the dicts + // have to be saved/reloaded. + hkDict = (id)[NSString string]; + STAssertNotNil(hkDict, nil); + STAssertFalse([GTMHotKeyTextField isValidHotKey:hkDict], nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindow.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindow.h new file mode 100644 index 00000000..0a7759f5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindow.h @@ -0,0 +1,60 @@ +// +// GTMLargeTypeWindow.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +// GTMLargeTypeWindow displays a block of text in a large panel window much +// like Address Book displays phone numbers. It will also display an image +// so you can pop up "alerts" similar to the way BBEdit does when you attempt +// to do a find and find nothing. It will fade in and out appropriately when +// ordered forward or backward. +// A typical fire-and-forget type usage would be: +// GTMLargeTypeWindow *window +// = [[[GTMLargeTypeWindow alloc] initWithString:@"Foo"] autorelease]; +// [window makeKeyAndOrderFront:nil]; + +// NB This class appears to have a problem with GC on 10.5.6 and below. +// Radar 6137322 CIFilter crashing when run with GC enabled +// This appears to be an Apple bug with GC. +// We do a copy animation that causes things to crash, but only with GC +// on. Currently I have left this enabled in GTMLargeTypeWindow pending +// info from Apple on the bug. It's hard to reproduce, and only appears +// at this time on our test machines. +// Dual-Core Intel Xeon with ATI Radeon X1300 + +// Amount of time to fade the window in or out +const NSTimeInterval kGTMLargeTypeWindowFadeTime; + +@interface GTMLargeTypeWindow : NSPanel +// Creates a display window with |string| displayed. +// Formats |string| as best as possible to fill the screen. +- (id)initWithString:(NSString *)string; +// Creates a display window with |attrString| displayed. +// Expects you to format it as you want it to appear. +- (id)initWithAttributedString:(NSAttributedString *)attrString; +// Creates a display window with |image| displayed. +// Make sure you set the image size to what you want +- (id)initWithImage:(NSImage*)image; +// Creates a display window with |view| displayed. +- (id)initWithContentView:(NSView *)view; + +// Copy the text out of the window if appropriate. This is normally called +// as part of the responder chain so that the user can copy the displayed text +// using cmd-c. +- (void)copy:(id)sender; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindow.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindow.m new file mode 100644 index 00000000..97847aaa --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindow.m @@ -0,0 +1,366 @@ +// +// GTMLargeTypeWindow.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +#import "GTMLargeTypeWindow.h" +#import "GTMGeometryUtils.h" +#import "GTMNSBezierPath+RoundRect.h" +#import "GTMMethodCheck.h" + +// Amount of time to fade the window in or out +const NSTimeInterval kGTMLargeTypeWindowFadeTime = 0.333; + +// How far to inset the text from the edge of the window +static const CGFloat kEdgeInset = 16.0; + +// Give us an alpha value for our backing window +static const CGFloat kTwoThirdsAlpha = 0.66; + +@interface GTMLargeTypeCopyAnimation : NSAnimation +@end + +@interface GTMLargeTypeBackgroundView : NSView { + CIFilter *transition_; + GTMLargeTypeCopyAnimation *animation_; +} +- (void)animateCopy; +@end + +@interface GTMLargeTypeWindow (GTMLargeTypeWindowPrivate) ++ (CGFloat)displayWidth; +- (void)animateWithEffect:(NSString*)effect; +@end + +@implementation GTMLargeTypeWindow + +- (id)initWithString:(NSString *)string { + if ([string length] == 0) { + _GTMDevLog(@"GTMLargeTypeWindow got an empty string"); + [self release]; + return nil; + } + CGFloat displayWidth = [[self class] displayWidth]; + NSMutableAttributedString *attrString + = [[[NSMutableAttributedString alloc] initWithString:string] autorelease]; + + NSRange fullRange = NSMakeRange(0, [string length]); + [attrString addAttribute:NSForegroundColorAttributeName + value:[NSColor whiteColor] + range:fullRange]; + + NSMutableParagraphStyle *style + = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease]; + [style setAlignment:NSCenterTextAlignment]; + [attrString addAttribute:NSParagraphStyleAttributeName + value:style + range:fullRange]; + + NSShadow *textShadow = [[[NSShadow alloc] init] autorelease]; + [textShadow setShadowOffset:NSMakeSize( 5, -5 )]; + [textShadow setShadowBlurRadius:10]; + [textShadow setShadowColor:[NSColor colorWithCalibratedWhite:0 + alpha:kTwoThirdsAlpha]]; + [attrString addAttribute:NSShadowAttributeName + value:textShadow + range:fullRange]; + + // Try and find a size that fits without iterating too many times. + // We start going 50 pixels at a time, then 10, then 1 + int size = -26; // start at 24 (-26 + 50) + int offsets[] = { 50, 10, 1 }; + NSSize bigSize = NSMakeSize(MAXFLOAT, MAXFLOAT); + NSStringDrawingOptions options = (NSStringDrawingUsesDeviceMetrics | + NSStringDrawingOneShot); + for (size_t i = 0; i < sizeof(offsets) / sizeof(int); ++i) { + for(size = size + offsets[i]; size >= 24 && size < 300; size += offsets[i]) { + NSFont *font = [NSFont boldSystemFontOfSize:size] ; + [attrString addAttribute:NSFontAttributeName + value:font + range:fullRange]; + NSRect textSize = [attrString boundingRectWithSize:bigSize + options:options]; + NSSize maxAdvanceSize = [font maximumAdvancement]; + if (textSize.size.width + maxAdvanceSize.width > displayWidth) { + size = size - offsets[i]; + break; + } + } + } + + // Bounds check our values + if (size > 300) { + size = 300; + } else if (size < 24) { + size = 24; + } + [attrString addAttribute:NSFontAttributeName + value:[NSFont boldSystemFontOfSize:size] + range:fullRange]; + return [self initWithAttributedString:attrString]; +} + +- (id)initWithAttributedString:(NSAttributedString *)attrString { + if ([attrString length] == 0) { + _GTMDevLog(@"GTMLargeTypeWindow got an empty string"); + [self release]; + return nil; + } + CGFloat displayWidth =[[self class] displayWidth]; + NSRect frame = NSMakeRect(0, 0, displayWidth, 0); + NSTextView *textView = [[[NSTextView alloc] initWithFrame:frame] autorelease]; + [textView setEditable:NO]; + [textView setSelectable:NO]; + [textView setDrawsBackground:NO]; + [[textView textStorage] setAttributedString:attrString]; + [textView sizeToFit]; + + return [self initWithContentView:textView]; +} + +- (id)initWithImage:(NSImage*)image { + if (!image) { + _GTMDevLog(@"GTMLargeTypeWindow got an empty image"); + [self release]; + return nil; + } + NSRect rect = GTMNSRectOfSize([image size]); + NSImageView *imageView + = [[[NSImageView alloc] initWithFrame:rect] autorelease]; + [imageView setImage:image]; + return [self initWithContentView:imageView]; +} + +- (id)initWithContentView:(NSView *)view { + NSRect bounds = NSZeroRect; + if (view) { + bounds = [view bounds]; + } + if (!view || bounds.size.height <= 0 || bounds.size.width <= 0) { + _GTMDevLog(@"GTMLargeTypeWindow got an empty view"); + [self release]; + return nil; + } + NSRect screenRect = [[NSScreen mainScreen] frame]; + NSRect windowRect = GTMNSAlignRectangles([view frame], + screenRect, + GTMRectAlignCenter); + windowRect = NSInsetRect(windowRect, -kEdgeInset, -kEdgeInset); + windowRect = NSIntegralRect(windowRect); + NSUInteger mask = NSBorderlessWindowMask | NSNonactivatingPanelMask; + self = [super initWithContentRect:windowRect + styleMask:mask + backing:NSBackingStoreBuffered + defer:NO]; + if (self) { + [self setFrame:GTMNSAlignRectangles(windowRect, + screenRect, + GTMRectAlignCenter) + display:YES]; + [self setBackgroundColor:[NSColor clearColor]]; + [self setOpaque:NO]; + [self setLevel:NSFloatingWindowLevel]; + [self setHidesOnDeactivate:NO]; + + GTMLargeTypeBackgroundView *content + = [[[GTMLargeTypeBackgroundView alloc] initWithFrame:NSZeroRect] + autorelease]; + [self setHasShadow:YES]; + [self setContentView:content]; + [self setAlphaValue:0]; + [self setIgnoresMouseEvents:YES]; + [view setFrame:GTMNSAlignRectangles([view frame], + [content frame], + GTMRectAlignCenter)]; + [content addSubview:view]; + [self setInitialFirstResponder:view]; + } + return self; +} + +- (void)copy:(id)sender { + id firstResponder = [self initialFirstResponder]; + if ([firstResponder respondsToSelector:@selector(textStorage)]) { + NSPasteboard *pb = [NSPasteboard generalPasteboard]; + [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; + [pb setString:[[firstResponder textStorage] string] + forType:NSStringPboardType]; + } + + // Give the user some feedback that a copy has occurred + [(GTMLargeTypeBackgroundView*)[self contentView] animateCopy]; +} + +- (BOOL)canBecomeKeyWindow { + return YES; +} + +- (BOOL)performKeyEquivalent:(NSEvent *)theEvent { + NSString *chars = [theEvent charactersIgnoringModifiers]; + NSUInteger flags = ([theEvent modifierFlags] & + NSDeviceIndependentModifierFlagsMask); + BOOL isValid = (flags == NSCommandKeyMask) && [chars isEqualToString:@"c"]; + if (isValid) { + [self copy:self]; + } + return isValid; +} + +- (void)keyDown:(NSEvent *)theEvent { + [self close]; +} + +- (void)resignKeyWindow { + [super resignKeyWindow]; + if([self isVisible]) { + [self close]; + } +} + +- (void)makeKeyAndOrderFront:(id)sender { + [super makeKeyAndOrderFront:sender]; + [self animateWithEffect:NSViewAnimationFadeInEffect]; +} + +- (void)orderFront:(id)sender { + [super orderFront:sender]; + [self animateWithEffect:NSViewAnimationFadeInEffect]; +} + +- (void)orderOut:(id)sender { + [self animateWithEffect:NSViewAnimationFadeOutEffect]; + [super orderOut:sender]; +} + ++ (CGFloat)displayWidth { + NSRect screenRect = [[NSScreen mainScreen] frame]; + // This is just a rough calculation to make us fill a good proportion + // of the main screen. + return NSWidth( screenRect ) * 11.0 / 12.0 - 2.0 * kEdgeInset; +} + +- (void)animateWithEffect:(NSString*)effect { + NSDictionary *fadeIn = [NSDictionary dictionaryWithObjectsAndKeys: + self, NSViewAnimationTargetKey, + effect, NSViewAnimationEffectKey, + nil]; + NSArray *animation = [NSArray arrayWithObject:fadeIn]; + NSViewAnimation *viewAnim + = [[[NSViewAnimation alloc] initWithViewAnimations:animation] autorelease]; + [viewAnim setDuration:kGTMLargeTypeWindowFadeTime]; + [viewAnim setAnimationBlockingMode:NSAnimationBlocking]; + [viewAnim startAnimation]; +} +@end + +@implementation GTMLargeTypeBackgroundView +GTM_METHOD_CHECK(NSBezierPath, gtm_appendBezierPathWithRoundRect:cornerRadius:); + +- (void)dealloc { + // If we get released while animating, we'd better clean up. + [animation_ stopAnimation]; + [animation_ release]; + [transition_ release]; + [super dealloc]; +} + +- (BOOL)isOpaque { + return NO; +} + +- (void)drawRect:(NSRect)rect { + rect = [self bounds]; + NSBezierPath *roundRect = [NSBezierPath bezierPath]; + CGFloat minRadius = MIN(NSWidth(rect), NSHeight(rect)) * 0.5f; + + [roundRect gtm_appendBezierPathWithRoundRect:rect + cornerRadius:MIN(minRadius, 32)]; + [roundRect addClip]; + if (transition_) { + NSNumber *val = [NSNumber numberWithFloat:[animation_ currentValue]]; + [transition_ setValue:val forKey:@"inputTime"]; + CIImage *outputCIImage = [transition_ valueForKey:@"outputImage"]; + [outputCIImage drawInRect:rect + fromRect:rect + operation:NSCompositeSourceOver + fraction:1.0]; + } else { + [[NSColor colorWithDeviceWhite:0 alpha:kTwoThirdsAlpha] set]; + + NSRectFill(rect); + } +} + +- (void)animateCopy { + // This does a photocopy swipe to show folks that their copy has succceeded + // Store off a copy of our background + NSRect bounds = [self bounds]; + NSBitmapImageRep *rep = [self bitmapImageRepForCachingDisplayInRect:bounds]; + NSGraphicsContext *context = [NSGraphicsContext graphicsContextWithBitmapImageRep:rep]; + [NSGraphicsContext saveGraphicsState]; + [NSGraphicsContext setCurrentContext:context]; + [self drawRect:bounds]; + [NSGraphicsContext restoreGraphicsState]; + CIVector *extent = [CIVector vectorWithX:bounds.origin.x + Y:bounds.origin.y + Z:bounds.size.width + W:bounds.size.height]; + CIFilter *transition = [CIFilter filterWithName:@"CICopyMachineTransition"]; + [transition setDefaults]; + [transition setValue:extent + forKey:@"inputExtent"]; + CIImage *image = [[CIImage alloc] initWithBitmapImageRep:rep]; + + [transition setValue:image forKey:@"inputImage"]; + [transition setValue:image forKey:@"inputTargetImage"]; + [transition setValue:[NSNumber numberWithInt:0] + forKey:@"inputTime"]; + [transition valueForKey:@"outputImage"]; + [image release]; + transition_ = [transition retain]; + animation_ = [[GTMLargeTypeCopyAnimation alloc] initWithDuration:0.5 + animationCurve:NSAnimationLinear]; + [animation_ setFrameRate:0.0f]; + [animation_ setDelegate:self]; + [animation_ setAnimationBlockingMode:NSAnimationBlocking]; + [animation_ startAnimation]; +} + +- (void)animationDidEnd:(NSAnimation*)animation { + [animation_ release]; + animation_ = nil; + [transition_ release]; + transition_ = nil; + [self display]; +} + +- (float)animation:(NSAnimation*)animation + valueForProgress:(NSAnimationProgress)progress { + // This gives us half the copy animation, so we don't swing back + // Don't want too much gratuitous effect + // 0.6 is required by experimentation. 0.5 doesn't do it + return progress * 0.6f; +} +@end + +@implementation GTMLargeTypeCopyAnimation +- (void)setCurrentProgress:(NSAnimationProgress)progress { + [super setCurrentProgress:progress]; + [[self delegate] display]; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindowTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindowTest.m new file mode 100644 index 00000000..65ea1013 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLargeTypeWindowTest.m @@ -0,0 +1,198 @@ +// +// GTMLargeTypeWindowTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMLargeTypeWindow.h" +#import "GTMNSObject+UnitTesting.h" +#import "GTMUnitTestDevLog.h" +#import "GTMGarbageCollection.h" +#import "GTMSystemVersion.h" + +NSString *const kLongTextBlock = + @"`Twas brillig, and the slithy toves " + "Did gyre and gimble in the wabe: " + "all mimsy were the borogoves, " + "and the mome raths outgrabe. " + "Beware the Jabberwock, my son! " + "The jaws that bite, the claws that catch! " + "Beware the Jubjub bird, and shun " + "the frumious Bandersnatch! " + "He took his vorpal sword in hand: " + "long time the manxome foe he sought -- " + "so rested he by the Tumtum tree, " + "and stood awhile in thought. " + "And, as in uffish thought he stood, " + "the Jabberwock, with eyes of flame, " + "came whiffling through the tulgey wood, " + "and burbled as it came! " + "One, two! One, two! And through and through " + "the vorpal blade went snicker-snack! " + "He left it dead, and with its head " + "he went galumphing back. " + "And, has thou slain the Jabberwock? " + "Come to my arms, my beamish boy! " + "O frabjous day! Callooh! Callay! " + "He chortled in his joy."; + +NSString *const kMediumTextBlock = @"For the Snark was a Boojum, you see."; + +NSString *const kShortTextBlock = @"Short"; + +@interface GTMLargeTypeWindowTest : GTMTestCase +@end + +@implementation GTMLargeTypeWindowTest +- (BOOL)shouldDoAnimateCopy { + // NOTE: Animated copy tests are disabled when GC is on. + // See the comment/warning in the GTMLargeTypeWindow.h for more details, + // but we disable them to avoid the tests failing (crashing) when it's Apple's + // bug. Please bump the system check as appropriate when new systems are + // tested. Currently broken on 10.5.6 and below. + // Radar 6137322 CIFilter crashing when run with GC enabled + SInt32 major, minor, bugfix; + [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugfix]; + if (!(GTMIsGarbageCollectionEnabled() + && major <= 10 && minor <= 5 && bugfix <= 6)) { + return YES; + } else { + NSLog(@"--- animated copy not run because of GC incompatibilites ---"); + return NO; + } +} + +- (void)testLargeTypeWindowIllegalInits { + [GTMUnitTestDevLog expectString:@"GTMLargeTypeWindow got an empty string"]; + GTMLargeTypeWindow *window = [[[GTMLargeTypeWindow alloc] + initWithString:@""] autorelease]; + STAssertNil(window, nil); + + [GTMUnitTestDevLog expectString:@"GTMLargeTypeWindow got an empty string"]; + window = [[[GTMLargeTypeWindow alloc] initWithString:nil] autorelease]; + STAssertNil(window, nil); + + [GTMUnitTestDevLog expectString:@"GTMLargeTypeWindow got an empty string"]; + NSAttributedString *attrString = [[[NSAttributedString alloc] + initWithString:@""] autorelease]; + window = [[[GTMLargeTypeWindow alloc] + initWithAttributedString:attrString] autorelease]; + STAssertNil(window, nil); + + [GTMUnitTestDevLog expectString:@"GTMLargeTypeWindow got an empty string"]; + window = [[[GTMLargeTypeWindow alloc] + initWithAttributedString:nil] autorelease]; + STAssertNil(window, nil); + + [GTMUnitTestDevLog expectString:@"GTMLargeTypeWindow got an empty view"]; + window = [[[GTMLargeTypeWindow alloc] initWithContentView:nil] autorelease]; + STAssertNil(window, nil); + + [GTMUnitTestDevLog expectString:@"GTMLargeTypeWindow got an empty image"]; + window = [[[GTMLargeTypeWindow alloc] initWithImage:nil] autorelease]; + STAssertNil(window, nil); +} + +- (void)testLargeTypeWindowMediumText { + GTMLargeTypeWindow *window = [[[GTMLargeTypeWindow alloc] + initWithString:kMediumTextBlock] autorelease]; + STAssertNotNil(window, nil); + STAssertTrue([window canBecomeKeyWindow], nil); + [window makeKeyAndOrderFront:nil]; + NSDate *endDate + = [NSDate dateWithTimeIntervalSinceNow:kGTMLargeTypeWindowFadeTime]; + [[NSRunLoop currentRunLoop] runUntilDate:endDate]; + GTMAssertObjectStateEqualToStateNamed(window, + @"GTMLargeTypeWindowMediumTextTest", + nil); + if ([self shouldDoAnimateCopy]) { + [window copy:nil]; + NSPasteboard *pb = [NSPasteboard generalPasteboard]; + NSString *pbString = [pb stringForType:NSStringPboardType]; + STAssertEqualObjects(pbString, kMediumTextBlock, nil); + } + [window keyDown:nil]; +} + +- (void)testLargeTypeWindowShortText { + GTMLargeTypeWindow *window = [[[GTMLargeTypeWindow alloc] + initWithString:kShortTextBlock] autorelease]; + STAssertNotNil(window, nil); + STAssertTrue([window canBecomeKeyWindow], nil); + [window makeKeyAndOrderFront:nil]; + NSDate *endDate + = [NSDate dateWithTimeIntervalSinceNow:kGTMLargeTypeWindowFadeTime]; + [[NSRunLoop currentRunLoop] runUntilDate:endDate]; + GTMAssertObjectStateEqualToStateNamed(window, + @"GTMLargeTypeWindowShortTextTest", + nil); + if ([self shouldDoAnimateCopy]) { + [window copy:nil]; + NSPasteboard *pb = [NSPasteboard generalPasteboard]; + NSString *pbString = [pb stringForType:NSStringPboardType]; + STAssertEqualObjects(pbString, kShortTextBlock, nil); + } + [window resignKeyWindow]; +} + +- (void)testLargeTypeWindowLongText { + GTMLargeTypeWindow *window = [[[GTMLargeTypeWindow alloc] + initWithString:kLongTextBlock] autorelease]; + STAssertNotNil(window, nil); + [window orderFront:nil]; + NSDate *endDate + = [NSDate dateWithTimeIntervalSinceNow:kGTMLargeTypeWindowFadeTime]; + [[NSRunLoop currentRunLoop] runUntilDate:endDate]; + // Can't do state for long text as it will wrap differently on different + // sized screens. + GTMAssertObjectStateEqualToStateNamed(window, + @"GTMLargeTypeWindowLongTextTest", + nil); + if ([self shouldDoAnimateCopy]) { + [window copy:nil]; + NSPasteboard *pb = [NSPasteboard generalPasteboard]; + NSString *pbString = [pb stringForType:NSStringPboardType]; + STAssertEqualObjects(pbString, kLongTextBlock, nil); + } + [window keyDown:nil]; +} + +- (void)testLargeTypeWindowImageText { + NSImage *image = [NSApp applicationIconImage]; + GTMLargeTypeWindow *window = [[[GTMLargeTypeWindow alloc] + initWithImage:image] autorelease]; + STAssertNotNil(window, nil); + [window makeKeyAndOrderFront:nil]; + NSDate *endDate + = [NSDate dateWithTimeIntervalSinceNow:kGTMLargeTypeWindowFadeTime]; + [[NSRunLoop currentRunLoop] runUntilDate:endDate]; + GTMAssertObjectStateEqualToStateNamed(window, + @"GTMLargeTypeWindowImageTest", + nil); + NSString *testString = @"TestString"; + NSPasteboard *pb = [NSPasteboard generalPasteboard]; + [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; + [pb setString:testString forType:NSStringPboardType]; + if ([self shouldDoAnimateCopy]) { + [window copy:nil]; + // Pasteboard should not change for an image + NSString *pbString = [pb stringForType:NSStringPboardType]; + STAssertEqualObjects(pbString, testString, nil); + } + [window resignKeyWindow]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShading.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShading.h new file mode 100644 index 00000000..d85a4eb9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShading.h @@ -0,0 +1,76 @@ +// +// GTMLinearRGBShading.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMShading.h" +#import "GTMCalculatedRange.h" + +/// A shading that does returns smooth linear values for RGB. +// +/// Thus if you create a shading from 0.0->red to 1.0->blue you will get +/// \verbatim +/// - 0.5->purple +/// - 0.75->eggplant +/// - 0.25->magenta +/// \endverbatim + +@interface GTMLinearRGBShading : GTMCalculatedRange { +@private + CGFunctionRef function_; // function used to calculated shading (STRONG) + CGColorSpaceRef colorSpace_; // colorspace used for shading (STRONG) + BOOL isCalibrated_; // are we using calibrated or device RGB. + CGFloat colorValue_[4]; // the RGBA color values +} + +/// Generate a shading with color |begin| at position 0.0 and color |end| at 1.0. +// +// Args: +// begin: color at beginning of range +// end: color at end of range +// colorSpaceName: name of colorspace to draw into must be either +// NSCalibratedRGBColorSpace or NSDeviceRGBColorSpace +// +// Returns: +// a GTMLinearRGBShading ++ (id)shadingFromColor:(NSColor *)begin toColor:(NSColor *)end + fromSpaceNamed:(NSString*)colorSpaceName; + +/// Generate a shading with a collection of colors at various positions. +// +// Args: +// colors: a C style array containg the colors we are adding +// colorSpaceName: name of colorspace to draw into must be either +// NSCalibratedRGBColorSpace or NSDeviceRGBColorSpace +// positions: a C style array containg the positions we want to +// add the colors at +// numberOfColors: how many colors/positions we are adding +// +// Returns: +// a GTMLinearRGBShading ++ (id)shadingWithColors:(NSColor **)colors + fromSpaceNamed:(NSString*)colorSpaceName + atPositions:(CGFloat *)positions + count:(NSUInteger)numberOfColors; + +/// Designated initializer +// Args: +// colorSpaceName - name of the colorspace to use must be either +// NSCalibratedRGBColorSpace or NSDeviceRGBColorSpace +- (id)initWithColorSpaceName:(NSString*)colorSpaceName; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShading.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShading.m new file mode 100644 index 00000000..9434186c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShading.m @@ -0,0 +1,204 @@ +// +// GTMLinearRGBShading.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMLinearRGBShading.h" +#import "GTMDefines.h" + +// Carbon callback function required for CoreGraphics +static void cShadeFunction(void *info, const CGFloat *inPos, CGFloat *outVals); + +@implementation GTMLinearRGBShading ++ (id)shadingFromColor:(NSColor *)begin toColor:(NSColor *)end + fromSpaceNamed:(NSString*)colorSpaceName { + NSColor *theColors[] = { begin, end }; + CGFloat thePositions[] = { 0.0, 1.0 }; + return [[self class] shadingWithColors:theColors + fromSpaceNamed:colorSpaceName + atPositions:thePositions + count:(sizeof(thePositions)/sizeof(CGFloat))]; +} + ++ (id)shadingWithColors:(NSColor **)colors fromSpaceNamed:(NSString*)colorSpaceName + atPositions:(CGFloat *)positions count:(NSUInteger)count { + + GTMLinearRGBShading *theShading = [[[[self class] alloc] initWithColorSpaceName:colorSpaceName] autorelease]; + for (NSUInteger i = 0; i < count; ++i) { + [theShading insertStop:colors[i] atPosition:positions[i]]; + } + return theShading; +} + +- (id)initWithColorSpaceName:(NSString*)colorSpaceName { + if ((self = [super init])) { + if ([colorSpaceName isEqualToString:NSDeviceRGBColorSpace]) { + isCalibrated_ = NO; + } else if ([colorSpaceName isEqualToString:NSCalibratedRGBColorSpace]) { + isCalibrated_ = YES; + } + else { + [self release]; + self = nil; + } + } + return self; +} + +#if GTM_SUPPORT_GC +- (void)finalize { + if (nil != function_) { + CGFunctionRelease(function_); + } + if (nil != colorSpace_) { + CGColorSpaceRelease(colorSpace_); + } + [super finalize]; +} +#endif + +- (void)dealloc { + if (nil != function_) { + CGFunctionRelease(function_); + } + if (nil != colorSpace_) { + CGColorSpaceRelease(colorSpace_); + } + [super dealloc]; +} + + +- (void)insertStop:(id)item atPosition:(CGFloat)position { + NSString *colorSpaceName = isCalibrated_ ? NSCalibratedRGBColorSpace : NSDeviceRGBColorSpace; + NSColor *tempColor = [item colorUsingColorSpaceName: colorSpaceName]; + if (nil != tempColor) { + [super insertStop:tempColor atPosition:position]; + } +} + +// Calculate a linear value based on our stops +- (id)valueAtPosition:(CGFloat)position { + NSUInteger positionIndex = 0; + NSUInteger colorCount = [self stopCount]; + CGFloat stop1Position = 0.0; + NSColor *stop1Color = [self stopAtIndex:positionIndex position:&stop1Position]; + positionIndex += 1; + CGFloat stop2Position = 0.0; + NSColor *stop2Color = nil; + if (colorCount > 1) { + stop2Color = [self stopAtIndex:positionIndex position:&stop2Position]; + positionIndex += 1; + } else { + // if we only have one value, that's what we return + stop2Position = stop1Position; + stop2Color = stop1Color; + } + + while (positionIndex < colorCount && stop2Position < position) { + stop1Color = stop2Color; + stop1Position = stop2Position; + stop2Color = [self stopAtIndex:positionIndex position:&stop2Position]; + positionIndex += 1; + } + + if (position <= stop1Position) { + // if we are less than our lowest position, return our first color + [stop1Color getRed:&colorValue_[0] green:&colorValue_[1] + blue:&colorValue_[2] alpha:&colorValue_[3]]; + } else if (position >= stop2Position) { + // likewise if we are greater than our highest position, return the last color + [stop2Color getRed:&colorValue_[0] green:&colorValue_[1] + blue:&colorValue_[2] alpha:&colorValue_[3]]; + } else { + // otherwise interpolate between the two + position = (position - stop1Position) / (stop2Position - stop1Position); + CGFloat red1, red2, green1, green2, blue1, blue2, alpha1, alpha2; + [stop1Color getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1]; + [stop2Color getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2]; + + colorValue_[0] = (red2 - red1) * position + red1; + colorValue_[1] = (green2 - green1) * position + green1; + colorValue_[2] = (blue2 - blue1) * position + blue1; + colorValue_[3] = (alpha2 - alpha1) * position + alpha1; + } + + // Yes, I am casting a CGFloat[] to an id to pass it by the compiler. This + // significantly improves performance though as I avoid creating an NSColor + // for every scanline which later has to be cleaned up in an autorelease pool + // somewhere. Causes guardmalloc to run significantly faster. + return (id)colorValue_; +} + +// +// switch from C to obj-C. The callback to a shader is a c function +// but we want to call our objective c object to do all the +// calculations for us. We have passed our function our +// GTMLinearRGBShading as an obj-c object in the |info| so +// we just turn around and ask it to calculate our value based +// on |inPos| and then stick the results back in |outVals| +// +// Args: +// info: is the GTMLinearRGBShading as an +// obj-C object. +// inPos: the position to calculate values for. This is a pointer to +// a single float value +// outVals: where we store our return values. Since we are calculating +// an RGBA color, this is a pointer to an array of four float values +// ranging from 0.0 to 1.0 +// +// +static void cShadeFunction(void *info, const CGFloat *inPos, CGFloat *outVals) { + id object = (id)info; + CGFloat *colorValue = (CGFloat*)[object valueAtPosition:*inPos]; + outVals[0] = colorValue[0]; + outVals[1] = colorValue[1]; + outVals[2] = colorValue[2]; + outVals[3] = colorValue[3]; +} + +- (CGFunctionRef) shadeFunction { + // lazily create the function as necessary + if (nil == function_) { + // We have to go to carbon here, and create the CGFunction. Note that this + // diposed if necessary in the dealloc call. + const CGFunctionCallbacks shadeFunctionCallbacks = { 0, &cShadeFunction, NULL }; + + // TODO: this code assumes that we have a range from 0.0 to 1.0 + // which may not be true according to the stops that the user has given us. + // In general you have stops at 0.0 and 1.0, so this will do for right now + // but may be an issue in the future. + const CGFloat inRange[2] = { 0.0, 1.0 }; + const CGFloat outRange[8] = { 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0 }; + function_ = CGFunctionCreate(self, + sizeof(inRange) / (sizeof(CGFloat) * 2), inRange, + sizeof(outRange) / (sizeof(CGFloat) * 2), outRange, + &shadeFunctionCallbacks); + } + return function_; +} + +- (CGColorSpaceRef)colorSpace { + // lazily create the colorspace as necessary + if (nil == colorSpace_) { + if (isCalibrated_) { + colorSpace_ = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); + } else { + colorSpace_ = CGColorSpaceCreateDeviceRGB(); + } + } + return colorSpace_; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShadingTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShadingTest.m new file mode 100644 index 00000000..38802e60 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLinearRGBShadingTest.m @@ -0,0 +1,132 @@ +// +// GTMLinearRGBShadingTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMSenTestCase.h" +#import "GTMLinearRGBShading.h" + +@interface GTMLinearRGBShadingTest : GTMTestCase +@end + +@implementation GTMLinearRGBShadingTest +- (void)testShadingFrom { + // Create a shading from red to blue, and check if 50% is purple + NSColor *red = [NSColor redColor]; + NSColor *blue = [NSColor blueColor]; + NSColor *purple = [NSColor purpleColor]; + GTMLinearRGBShading *theShading = + [GTMLinearRGBShading shadingFromColor:red + toColor:blue + fromSpaceNamed:NSCalibratedRGBColorSpace]; + STAssertNotNil(theShading,nil); + STAssertEquals([theShading stopCount], (NSUInteger)2, nil); + CGFloat *theColor = (CGFloat*)[theShading valueAtPosition: 0.5]; + STAssertEqualsWithAccuracy(theColor[0], [purple redComponent], 0.001, nil); + STAssertEqualsWithAccuracy(theColor[1], [purple greenComponent], 0.001, nil); + STAssertEqualsWithAccuracy(theColor[2], [purple blueComponent], 0.001, nil); + STAssertEqualsWithAccuracy(theColor[3], [purple alphaComponent], 0.001, nil); +} + +- (void)testShadingWith { + // Create a shading with kColorCount colors and make sure all the values are there. + enum { kColorCount = 100 }; + NSColor *theColors[kColorCount]; + CGFloat thePositions[kColorCount]; + const CGFloat kColorIncrement = 1.0 / kColorCount; + for (NSUInteger i = 0; i < kColorCount; i++) { + CGFloat newValue = kColorIncrement * i; + thePositions[i] = newValue; + theColors[i] = [NSColor colorWithCalibratedRed:newValue + green:newValue + blue:newValue + alpha:newValue]; + } + GTMLinearRGBShading *theShading = + [GTMLinearRGBShading shadingWithColors:theColors + fromSpaceNamed:NSCalibratedRGBColorSpace + atPositions:thePositions + count:kColorCount]; + for (NSUInteger i = 0; i < kColorCount; i++) { + CGFloat newValue = kColorIncrement * i; + CGFloat *theColor = (CGFloat*)[theShading valueAtPosition:newValue]; + STAssertEqualsWithAccuracy(theColor[0], newValue, 0.001, nil); + STAssertEqualsWithAccuracy(theColor[1], newValue, 0.001, nil); + STAssertEqualsWithAccuracy(theColor[2], newValue, 0.001, nil); + STAssertEqualsWithAccuracy(theColor[3], newValue, 0.001, nil); + } + // Create a shading with 1 color to test that special handling + NSColor *purple = [NSColor purpleColor]; + NSColor *singleColor[1] = { purple }; + CGFloat singlePosition[1] = { 0.5 }; + theShading = + [GTMLinearRGBShading shadingWithColors:singleColor + fromSpaceNamed:NSCalibratedRGBColorSpace + atPositions:singlePosition + count:1]; + // test over a range to make sure we always get the same color + for (NSUInteger i = 0; i < kColorCount; i++) { + CGFloat newValue = kColorIncrement * i; + CGFloat *theColor = (CGFloat*)[theShading valueAtPosition:newValue]; + STAssertEqualsWithAccuracy(theColor[0], [purple redComponent], 0.001, nil); + STAssertEqualsWithAccuracy(theColor[1], [purple greenComponent], 0.001, nil); + STAssertEqualsWithAccuracy(theColor[2], [purple blueComponent], 0.001, nil); + STAssertEqualsWithAccuracy(theColor[3], [purple alphaComponent], 0.001, nil); + } +} + +- (void)testShadeFunction { + GTMLinearRGBShading *theShading = + [GTMLinearRGBShading shadingWithColors:nil + fromSpaceNamed:NSCalibratedRGBColorSpace + atPositions:nil + count:0]; + CGFunctionRef theFunction = [theShading shadeFunction]; + STAssertNotNULL(theFunction, nil); + STAssertEquals(CFGetTypeID(theFunction), CGFunctionGetTypeID(), nil); +} + +- (void)testColorSpace { + // Calibrated RGB + GTMLinearRGBShading *theShading = + [GTMLinearRGBShading shadingWithColors:nil + fromSpaceNamed:NSCalibratedRGBColorSpace + atPositions:nil + count:0]; + CGColorSpaceRef theColorSpace = [theShading colorSpace]; + STAssertNotNULL(theColorSpace, nil); + STAssertEquals(CFGetTypeID(theColorSpace), CGColorSpaceGetTypeID(), nil); + + // Device RGB + theShading = + [GTMLinearRGBShading shadingWithColors:nil + fromSpaceNamed:NSDeviceRGBColorSpace + atPositions:nil + count:0]; + theColorSpace = [theShading colorSpace]; + STAssertNotNULL(theColorSpace, nil); + STAssertEquals(CFGetTypeID(theColorSpace), CGColorSpaceGetTypeID(), nil); + + // Device CMYK (not supported) + theShading = + [GTMLinearRGBShading shadingWithColors:nil + fromSpaceNamed:NSDeviceCMYKColorSpace + atPositions:nil + count:0]; + STAssertNULL(theShading, nil); +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItems.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItems.h new file mode 100644 index 00000000..b4375b4c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItems.h @@ -0,0 +1,88 @@ +// +// GTMLoginItems.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +/// Login items key constants, used as keys in |+loginItems| +// +// Item name +GTM_EXTERN NSString * const kGTMLoginItemsNameKey; +// Item path +GTM_EXTERN NSString * const kGTMLoginItemsPathKey; +// Hidden (NSNumber bool) +GTM_EXTERN NSString * const kGTMLoginItemsHiddenKey; + +/// GTMLoginItems +// +/// A helper class to manipulate the user's Login Items. +@interface GTMLoginItems : NSObject + +/// Obtain a complete list of all login items. +// +// Returns: +// Autoreleased array of dictionaries keyed with kGTMLoginItemsPathKey, etc. +// ++ (NSArray *)loginItems:(NSError **)errorInfo; + +/// Check if the given path is in the current user's Login Items +// +// Args: +// path: path to the application +// +// Returns: +// YES if the path is in the Login Items +// ++ (BOOL)pathInLoginItems:(NSString *)path; + +/// Check if the given name is in the current user's Login Items +// +// Args: +// name: name to the application +// +// Returns: +// YES if the name is in the Login Items +// ++ (BOOL)itemWithNameInLoginItems:(NSString *)name; + +/// Add the given path to the current user's Login Items. Does nothing if the +/// path is already there. +// +// Args: +// path: path to add +// hide: Set to YES to have the item launch hidden +// ++ (void)addPathToLoginItems:(NSString *)path hide:(BOOL)hide; + +/// Remove the given path from the current user's Login Items. Does nothing if +/// the path is not there. +// +// Args: +// path: the path to remove +// ++ (void)removePathFromLoginItems:(NSString *)path; + +/// Remove the given item name from the current user's Login Items. Does nothing +/// if no item with that name is present. +// +// Args: +// name: name of the item to remove +// ++ (void)removeItemWithNameFromLoginItems:(NSString *)name; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItems.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItems.m new file mode 100644 index 00000000..f124ef50 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItems.m @@ -0,0 +1,193 @@ +// +// GTMLoginItems.m +// Based on AELoginItems from DTS. +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMLoginItems.h" +#import "GTMDefines.h" + +#include + +// Exposed constants +NSString * const kGTMLoginItemsNameKey = @"Name"; +NSString * const kGTMLoginItemsPathKey = @"Path"; +NSString * const kGTMLoginItemsHiddenKey = @"Hide"; + +@interface GTMLoginItems (PrivateMethods) ++ (NSInteger)indexOfLoginItemWithValue:(id)value + forKey:(NSString *)key + loginItems:(NSArray *)items; ++ (BOOL)compileAndRunScript:(NSString *)script + withError:(NSError **)errorInfo; +@end + +@implementation GTMLoginItems (PrivateMethods) + ++ (NSInteger)indexOfLoginItemWithValue:(id)value + forKey:(NSString *)key + loginItems:(NSArray *)items { + if (!value || !key || !items) return NSNotFound; + NSDictionary *item = nil; + NSInteger found = -1; + GTM_FOREACH_OBJECT(item, items) { + ++found; + id itemValue = [item objectForKey:key]; + if (itemValue && [itemValue isEqual:value]) { + return found; + } + } + return NSNotFound; +} + ++ (BOOL)compileAndRunScript:(NSString *)script + withError:(NSError **)errorInfo { + if ([script length] == 0) { + // COV_NF_START - no real way to test this + if (errorInfo) + *errorInfo = [NSError errorWithDomain:@"GTMLoginItems" code:-90 userInfo:nil]; + return NO; + // COV_NF_END + } + NSAppleScript *query = [[[NSAppleScript alloc] initWithSource:script] autorelease]; + NSDictionary *errDict = nil; + if ( ![query compileAndReturnError:&errDict]) { + // COV_NF_START - no real way to test this + if (errorInfo) + *errorInfo = [NSError errorWithDomain:@"GTMLoginItems" code:-91 userInfo:errDict]; + return NO; + // COV_NF_END + } + NSAppleEventDescriptor *scriptResult = [query executeAndReturnError:&errDict]; + if (!scriptResult) { + // COV_NF_START - no real way to test this + if (errorInfo) + *errorInfo = [NSError errorWithDomain:@"GTMLoginItems" code:-92 userInfo:errDict]; + return NO; + // COV_NF_END + } + // we don't process the result + return YES; +} + +@end + +@implementation GTMLoginItems + ++ (NSArray*)loginItems:(NSError **)errorInfo { + NSDictionary *errDict = nil; + // get the script compiled and saved off + static NSAppleScript *query = nil; + if (!query) { + NSString *querySource = @"tell application \"System Events\" to get properties of login items"; + query = [[NSAppleScript alloc] initWithSource:querySource]; + if ( ![query compileAndReturnError:&errDict]) { + // COV_NF_START - no real way to test this + if (errorInfo) + *errorInfo = [NSError errorWithDomain:@"GTMLoginItems" code:-1 userInfo:errDict]; + [query release]; + query = nil; + return nil; + // COV_NF_END + } + } + // run the script + NSAppleEventDescriptor *scriptResult = [query executeAndReturnError:&errDict]; + if (!scriptResult) { + // COV_NF_START - no real way to test this + if (errorInfo) + *errorInfo = [NSError errorWithDomain:@"GTMLoginItems" code:-2 userInfo:errDict]; + return nil; + // COV_NF_END + } + // build our results + NSMutableArray *result = [NSMutableArray array]; + NSInteger count = [scriptResult numberOfItems]; + for (NSInteger i = 0; i < count; ++i) { + NSAppleEventDescriptor *aeItem = [scriptResult descriptorAtIndex:i+1]; + NSAppleEventDescriptor *hidn = [aeItem descriptorForKeyword:kAEHidden]; + NSAppleEventDescriptor *nam = [aeItem descriptorForKeyword:pName]; + NSAppleEventDescriptor *ppth = [aeItem descriptorForKeyword:'ppth']; + NSMutableDictionary *item = [NSMutableDictionary dictionary]; + if (hidn && [hidn booleanValue]) { + [item setObject:[NSNumber numberWithBool:YES] forKey:kGTMLoginItemsHiddenKey]; + } + if (nam) { + NSString *name = [nam stringValue]; + if (name) { + [item setObject:name forKey:kGTMLoginItemsNameKey]; + } + } + if (ppth) { + NSString *path = [ppth stringValue]; + if (path) { + [item setObject:path forKey:kGTMLoginItemsPathKey]; + } + } + [result addObject:item]; + } + + return result; +} + ++ (BOOL)pathInLoginItems:(NSString *)path { + NSArray *loginItems = [self loginItems:nil]; + NSInteger itemIndex = [self indexOfLoginItemWithValue:path + forKey:kGTMLoginItemsPathKey + loginItems:loginItems]; + return (itemIndex != NSNotFound) ? YES : NO; +} + ++ (BOOL)itemWithNameInLoginItems:(NSString *)name { + NSArray *loginItems = [self loginItems:nil]; + NSInteger itemIndex = [self indexOfLoginItemWithValue:name + forKey:kGTMLoginItemsNameKey + loginItems:loginItems]; + return (itemIndex != NSNotFound) ? YES : NO; +} + ++ (void)addPathToLoginItems:(NSString*)path hide:(BOOL)hide { + if (!path) return; + // make sure it isn't already there + if ([self pathInLoginItems:path]) return; + // now append it + NSString *scriptSource = + [NSString stringWithFormat: + @"tell application \"System Events\" to make new login item with properties { path:\"%s\", hidden:%s } at end", + [path UTF8String], + (hide ? "yes" : "no")]; + [self compileAndRunScript:scriptSource withError:nil]; +} + ++ (void)removePathFromLoginItems:(NSString*)path { + if ([path length] == 0) return; + NSString *scriptSource = + [NSString stringWithFormat: + @"tell application \"System Events\" to delete (login items whose path is \"%s\")", + [path UTF8String]]; + [self compileAndRunScript:scriptSource withError:nil]; +} + ++ (void)removeItemWithNameFromLoginItems:(NSString *)name { + if ([name length] == 0) return; + NSString *scriptSource = + [NSString stringWithFormat: + @"tell application \"System Events\" to delete (login items whose name is \"%s\")", + [name UTF8String]]; + [self compileAndRunScript:scriptSource withError:nil]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItemsTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItemsTest.m new file mode 100644 index 00000000..50b74820 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMLoginItemsTest.m @@ -0,0 +1,137 @@ +// +// GTMLoginItemsTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMSenTestCase.h" +#import "GTMLoginItems.h" + + // we don't really run this test because if someone had it in some automated + // tests, then if something did fail, it could leave things in the login items + // on the computer which could be a nasty surprise. +#define MODIFICATION_TESTS_ENABLED 0 + + +@interface GTMLoginItemsTest : GTMTestCase +@end + +static BOOL ItemsListHasPath(NSArray *items, NSString *path) { + NSDictionary *item = nil; + GTM_FOREACH_OBJECT(item, items) { + NSString *itemPath = [item objectForKey:kGTMLoginItemsPathKey]; + if (itemPath && [itemPath isEqual:path]) { + return YES; + } + } + return NO; +} + +@implementation GTMLoginItemsTest + +- (void)testNoModification { + + NSError *error = nil; + NSString *bogusAppPath = @"/Applications/AppThatDoesNotExist.app"; + NSString *bogusAppName = @"AppThatDoesNotExist"; + + // fetch the starting values + NSArray *initialItems = [GTMLoginItems loginItems:&error]; + STAssertNotNil(initialItems, @"shouldn't be nil (%@)", error); + STAssertFalse(ItemsListHasPath(initialItems, bogusAppPath), + @"bogusApp shouldn't be in list to start for test (%@)", initialItems); + + // check by path + STAssertFalse([GTMLoginItems pathInLoginItems:bogusAppPath], nil); + + // check by name + STAssertFalse([GTMLoginItems itemWithNameInLoginItems:bogusAppName], nil); + + // remove it by path + [GTMLoginItems removePathFromLoginItems:bogusAppPath]; + NSArray *curItems = [GTMLoginItems loginItems:nil]; + STAssertEqualObjects(initialItems, curItems, nil); + + // remove it by name + [GTMLoginItems removeItemWithNameFromLoginItems:bogusAppName]; + curItems = [GTMLoginItems loginItems:nil]; + STAssertEqualObjects(initialItems, curItems, nil); + +} + +- (void)testModification { + +#if MODIFICATION_TESTS_ENABLED + + NSError *error = nil; + NSString *textEditPath = @"/Applications/TextEdit.app"; + NSString *textEditName = @"TextEdit"; + + // fetch the starting values + NSArray *initialItems = [GTMLoginItems loginItems:&error]; + STAssertNotNil(initialItems, @"shouldn't be nil (%@)", error); + STAssertFalse(ItemsListHasPath(initialItems, textEditPath), + @"textedit shouldn't be in list to start for test (%@)", initialItems); + + // add textedit + [GTMLoginItems addPathToLoginItems:textEditPath hide:NO]; + NSArray *curItems = [GTMLoginItems loginItems:nil]; + STAssertNotEqualObjects(initialItems, curItems, nil); + + // check by path + STAssertTrue([GTMLoginItems pathInLoginItems:textEditPath], nil); + + // check by name + STAssertTrue([GTMLoginItems itemWithNameInLoginItems:textEditName], nil); + + // remove it by path + [GTMLoginItems removePathFromLoginItems:textEditPath]; + curItems = [GTMLoginItems loginItems:nil]; + STAssertEqualObjects(initialItems, curItems, nil); + + // check by path + STAssertFalse([GTMLoginItems pathInLoginItems:textEditPath], nil); + + // check by name + STAssertFalse([GTMLoginItems itemWithNameInLoginItems:textEditName], nil); + + // add textedit + [GTMLoginItems addPathToLoginItems:textEditPath hide:NO]; + curItems = [GTMLoginItems loginItems:nil]; + STAssertNotEqualObjects(initialItems, curItems, nil); + + // check by path + STAssertTrue([GTMLoginItems pathInLoginItems:textEditPath], nil); + + // check by name + STAssertTrue([GTMLoginItems itemWithNameInLoginItems:textEditName], nil); + + // remove it by name + [GTMLoginItems removeItemWithNameFromLoginItems:textEditName]; + curItems = [GTMLoginItems loginItems:nil]; + STAssertEqualObjects(initialItems, curItems, nil); + + // check by path + STAssertFalse([GTMLoginItems pathInLoginItems:textEditPath], nil); + + // check by name + STAssertFalse([GTMLoginItems itemWithNameInLoginItems:textEditName], nil); + +#endif // MODIFICATION_TESTS_ENABLED + +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPath.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPath.h new file mode 100644 index 00000000..a1b022ed --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPath.h @@ -0,0 +1,33 @@ +// +// GTMNSBezierPath+CGPath.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +/// Category for extracting a CGPathRef from a NSBezierPath +@interface NSBezierPath (GTMBezierPathCGPathAdditions) + +/// Extract a CGPathRef from a NSBezierPath. +// +// Args: +// +// Returns: +// Converted autoreleased CGPathRef. +// nil if failure. +- (CGPathRef)gtm_CGPath; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPath.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPath.m new file mode 100644 index 00000000..3624d9eb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPath.m @@ -0,0 +1,70 @@ +// +// GTMNSBezierPath+CGPath.m +// +// Category for extracting a CGPathRef from a NSBezierPath +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// +#import "GTMNSBezierPath+CGPath.h" +#import "GTMDefines.h" +#import "GTMGarbageCollection.h" + +@implementation NSBezierPath (GTMBezierPathCGPathAdditions) + +// Extract a CGPathRef from a NSBezierPath. +// +// Args: +// +// Returns: +// Converted CGPathRef. +// nil if failure. +- (CGPathRef)gtm_CGPath { + CGMutablePathRef thePath = CGPathCreateMutable(); + if (!thePath) return nil; + + NSInteger elementCount = [self elementCount]; + + // The maximum number of points is 3 for a NSCurveToBezierPathElement. + // (controlPoint1, controlPoint2, and endPoint) + NSPoint controlPoints[3]; + + for (NSInteger i = 0; i < elementCount; i++) { + switch ([self elementAtIndex:i associatedPoints:controlPoints]) { + case NSMoveToBezierPathElement: + CGPathMoveToPoint(thePath, &CGAffineTransformIdentity, + controlPoints[0].x, controlPoints[0].y); + break; + case NSLineToBezierPathElement: + CGPathAddLineToPoint(thePath, &CGAffineTransformIdentity, + controlPoints[0].x, controlPoints[0].y); + break; + case NSCurveToBezierPathElement: + CGPathAddCurveToPoint(thePath, &CGAffineTransformIdentity, + controlPoints[0].x, controlPoints[0].y, + controlPoints[1].x, controlPoints[1].y, + controlPoints[2].x, controlPoints[2].y); + break; + case NSClosePathBezierPathElement: + CGPathCloseSubpath(thePath); + break; + default: // COV_NF_START + _GTMDevLog(@"Unknown element at [NSBezierPath (GTMBezierPathCGPathAdditions) cgPath]"); + break; // COV_NF_END + }; + } + return (CGPathRef)GTMCFAutorelease(thePath); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPathTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPathTest.m new file mode 100644 index 00000000..3c99a19c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+CGPathTest.m @@ -0,0 +1,75 @@ +// +// GTMNSBezierPath+CGPathTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +#import +#import "GTMNSBezierPath+CGPath.h" +#import "GTMAppKit+UnitTesting.h" +#import "GTMSenTestCase.h" + +@interface GTMNSBezierPath_CGPathTest : GTMTestCase +@end + +@implementation GTMNSBezierPath_CGPathTest + +- (void)testCGPath { + GTMAssertDrawingEqualToImageNamed(self, + NSMakeSize(100, 100), + @"GTMNSBezierPath+CGPathTest", + nil, nil); +} + + +// Draws all of our tests so that we can compare this to our stored image file. +- (void)gtm_unitTestViewDrawRect:(NSRect)rect contextInfo:(void*)contextInfo{ + NSBezierPath *thePath = [NSBezierPath bezierPath]; + NSPoint theStart = NSMakePoint(20.0, 20.0); + + // Test moveto/lineto + [thePath moveToPoint: theStart]; + for (NSUInteger i = 0; i < 10; ++i) { + NSPoint theNewPoint = NSMakePoint(i * 5, i * 10); + [thePath lineToPoint: theNewPoint]; + theNewPoint = NSMakePoint(i * 2, i * 6); + [thePath moveToPoint: theNewPoint]; + } + + // Test moveto/curveto + for (NSUInteger i = 0; i < 10; ++i) { + NSPoint startPoint = NSMakePoint(5.0, 50.0); + NSPoint endPoint = NSMakePoint(55.0, 50.0); + NSPoint controlPoint1 = NSMakePoint(17.5, 50.0 + 5.0 * i); + NSPoint controlPoint2 = NSMakePoint(42.5, 50.0 - 5.0 * i); + [thePath moveToPoint:startPoint]; + [thePath curveToPoint:endPoint controlPoint1:controlPoint1 controlPoint2:controlPoint2]; + } + // test close + [thePath closePath]; + + CGPathRef cgPath = [thePath gtm_CGPath]; + STAssertNotNULL(cgPath, @"Nil CGPath"); + + CGContextRef cgContext = [[NSGraphicsContext currentContext] graphicsPort]; + STAssertNotNULL(cgContext, @"Nil cgContext"); + + CGContextAddPath(cgContext, cgPath); + CGContextStrokePath(cgContext); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRect.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRect.h new file mode 100644 index 00000000..b0b48de5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRect.h @@ -0,0 +1,48 @@ +// +// GTMNSBezierPath+RoundRect.h +// +// Category for adding utility functions for creating +// round rectangles. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +/// Category for adding utility functions for creating round rectangles. +@interface NSBezierPath (GMBezierPathRoundRectAdditions) + +/// Inscribe a round rectangle inside of rectangle |rect| with a corner radius of |radius| +// +// Args: +// rect: outer rectangle to inscribe into +// radius: radius of the corners. |radius| is clamped internally +// to be no larger than the smaller of half |rect|'s width or height +// +// Returns: +// Auto released NSBezierPath ++ (NSBezierPath *)gtm_bezierPathWithRoundRect:(NSRect)rect + cornerRadius:(CGFloat)radius; + +/// Adds a path which is a round rectangle inscribed inside of rectangle |rect| with a corner radius of |radius| +// +// Args: +// rect: outer rectangle to inscribe into +// radius: radius of the corners. |radius| is clamped internally +// to be no larger than the smaller of half |rect|'s width or height +- (void)gtm_appendBezierPathWithRoundRect:(NSRect)rect + cornerRadius:(CGFloat)radius; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRect.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRect.m new file mode 100644 index 00000000..d4e5050d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRect.m @@ -0,0 +1,68 @@ +// +// GTMNSBezierPath+RoundRect.h +// +// Category for adding utility functions for creating +// round rectangles. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSBezierPath+RoundRect.h" + +@implementation NSBezierPath (GTMBezierPathRoundRectAdditions) + + ++ (NSBezierPath *)gtm_bezierPathWithRoundRect:(NSRect)rect + cornerRadius:(CGFloat)radius { + NSBezierPath *bezier = [NSBezierPath bezierPath]; + [bezier gtm_appendBezierPathWithRoundRect:rect cornerRadius:radius]; + return bezier; +} + + +- (void)gtm_appendBezierPathWithRoundRect:(NSRect)rect + cornerRadius:(CGFloat)radius { + if (!NSIsEmptyRect(rect)) { + if (radius > 0.0) { + // Clamp radius to be no larger than half the rect's width or height. + radius = MIN(radius, 0.5 * MIN(rect.size.width, rect.size.height)); + + NSPoint topLeft = NSMakePoint(NSMinX(rect), NSMaxY(rect)); + NSPoint topRight = NSMakePoint(NSMaxX(rect), NSMaxY(rect)); + NSPoint bottomRight = NSMakePoint(NSMaxX(rect), NSMinY(rect)); + + [self moveToPoint:NSMakePoint(NSMidX(rect), NSMaxY(rect))]; + [self appendBezierPathWithArcFromPoint:topLeft + toPoint:rect.origin + radius:radius]; + [self appendBezierPathWithArcFromPoint:rect.origin + toPoint:bottomRight + radius:radius]; + [self appendBezierPathWithArcFromPoint:bottomRight + toPoint:topRight + radius:radius]; + [self appendBezierPathWithArcFromPoint:topRight + toPoint:topLeft + radius:radius]; + [self closePath]; + } else { + // When radius <= 0.0, use plain rectangle. + [self appendBezierPathWithRect:rect]; + } + } +} + + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRectTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRectTest.m new file mode 100644 index 00000000..5bdf3a38 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+RoundRectTest.m @@ -0,0 +1,102 @@ +// +// GTMNSBezierPath+RoundRectTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +#import +#import "GTMNSBezierPath+RoundRect.h" +#import "GTMAppKit+UnitTesting.h" + +@interface GTMNSBezierPath_RoundRectTest : GTMTestCase +@end + +@implementation GTMNSBezierPath_RoundRectTest + +- (void)testRoundRects { + GTMAssertDrawingEqualToImageNamed(self, NSMakeSize(490, 430), + @"GTMNSBezierPath+RoundRectTest", nil, nil); +} + +// Draws all of our tests so that we can compare this to our stored TIFF file. +- (void)gtm_unitTestViewDrawRect:(NSRect)rect contextInfo:(void*)contextInfo{ + NSRect theRects[] = { + NSMakeRect(0.0, 10.0, 0.0, 0.0), //Empty Rect test + NSMakeRect(50.0, 10.0, 30.0, 30.0), //Square Test + NSMakeRect(100.0, 10.0, 1.0, 2.0), //Small Test + NSMakeRect(120.0, 10.0, 15.0, 20.0), //Medium Test + NSMakeRect(140.0, 10.0, 150.0, 30.0), //Large Test + NSMakeRect(300.0, 10.0, 150.0, 30.0) //Large Test 2 (for different radius) + }; + const NSUInteger theRectCount = sizeof(theRects) / sizeof(NSRect); + + // Line Width Tests + CGFloat theLineWidths[] = { 0.5, 50.0, 2.0 }; + const NSUInteger theLineWidthCount = sizeof(theLineWidths) / sizeof(CGFloat); + NSUInteger i,j; + + for (i = 0; i < theLineWidthCount; ++i) { + for (j = 0; j < theRectCount; ++j) { + CGFloat cornerRadius = ( (j < (theRectCount - 1)) ? 20.0 : 0.0 ); + NSBezierPath *roundRect = [NSBezierPath gtm_bezierPathWithRoundRect:theRects[j] + cornerRadius:cornerRadius]; + [roundRect setLineWidth: theLineWidths[i]]; + [roundRect stroke]; + CGFloat newWidth = 35.0; + if (i < theLineWidthCount - 1) { + newWidth += theLineWidths[i + 1] + theLineWidths[i]; + } + theRects[j].origin.y += newWidth; + } + } + + // Fill test + NSColor *theColors[] = { + [NSColor colorWithCalibratedRed:1.0 green:0.0 blue:0.0 alpha:1.0], + [NSColor colorWithCalibratedRed:0.2 green:0.4 blue:0.6 alpha:0.4] + }; + const NSUInteger theColorCount = sizeof(theColors)/sizeof(NSColor); + + for (i = 0; i < theColorCount; ++i) { + for (j = 0; j < theRectCount; ++j) { + CGFloat cornerRadius = ( (j < (theRectCount - 1)) ? 10.0 : 0.0 ); + NSBezierPath *roundRect = [NSBezierPath gtm_bezierPathWithRoundRect:theRects[j] + cornerRadius:cornerRadius]; + [theColors[i] setFill]; + [roundRect fill]; + theRects[j].origin.y += 35.0; + } + } + + // Flatness test + CGFloat theFlatness[] = {0.0, 0.1, 1.0, 10.0}; + const NSUInteger theFlatnessCount = sizeof(theFlatness)/sizeof(CGFloat); + + for (i = 0; i < theFlatnessCount; i++) { + for (j = 0; j < theRectCount; ++j) { + CGFloat cornerRadius = ( (j < (theRectCount - 1)) ? 6.0 : 0.0 ); + NSBezierPath *roundRect = [NSBezierPath gtm_bezierPathWithRoundRect:theRects[j] + cornerRadius:cornerRadius]; + [roundRect setFlatness:theFlatness[i]]; + [roundRect stroke]; + theRects[j].origin.y += 35.0; + } + } +} + + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+Shading.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+Shading.h new file mode 100644 index 00000000..5d687282 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+Shading.h @@ -0,0 +1,121 @@ +// +// GTMNSBezierPath+Shading.h +// +// Category for radial and axial stroke and fill functions for NSBezierPaths +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +@protocol GTMShading; + +// +/// Category for radial and axial stroke and fill functions for NSBezierPaths +// +@interface NSBezierPath (GTMBezierPathShadingAdditions) + +/// Stroke the path axially with a color blend defined by |shading|. +// +/// The fill will extend from |fromPoint| to |toPoint| and will extend +/// indefinitely perpendicular to the axis of the line defined by the +/// two points. You can extend beyond the |fromPoint|/|toPoint by setting +/// |extendingStart|/|extendingEnd| respectively. +// +// Args: +// fromPoint: point to start the shading at +// toPoint: point to end the shading at +// extendingStart: should we extend the shading before |fromPoint| using +// the first color in our shading? +// extendingEnd: should we extend the shading after |toPoint| using the +// last color in our shading? +// shading: the shading to use to take our colors from. +// +- (void)gtm_strokeAxiallyFrom:(NSPoint)fromPoint to:(NSPoint)toPoint + extendingStart:(BOOL)extendingStart extendingEnd:(BOOL)extendingEnd + shading:(id)shading; + +/// Stroke the path radially with a color blend defined by |shading|. +// +/// The fill will extend from the circle with center |fromPoint| +/// and radius |fromRadius| to the circle with center |toPoint| +/// with radius |toRadius|. +/// You can extend beyond the |fromPoint|/|toPoint| by setting +/// |extendingStart|/|extendingEnd| respectively. +// +// Args: +// fromPoint: center of the circle to start the shading at +// fromRadius: radius of the circle to start the shading at +// toPoint: center of the circle to to end the shading at +// toRadius: raidus of the circle to end the shading at +// extendingStart: should we extend the shading before |fromPoint| using +// the first color in our shading? +// extendingEnd: should we extend the shading after |toPoint| using the +// last color in our shading? +// shading: the shading to use to take our colors from. +// +- (void)gtm_strokeRadiallyFrom:(NSPoint)fromPoint fromRadius:(CGFloat)fromRadius + to:(NSPoint)toPoint toRadius:(CGFloat)toRadius + extendingStart:(BOOL)extendingStart extendingEnd:(BOOL)extendingEnd + shading:(id)shading; + +/// Fill the path radially with a color blend defined by |shading|. +// +/// The fill will extend from the circle with center |fromPoint| +/// and radius |fromRadius| to the circle with center |toPoint| +/// with radius |toRadius|. +/// You can extend beyond the |fromPoint|/|toPoint by setting +/// |extendingStart|/|extendingEnd| respectively. +// +// Args: +// fromPoint: center of the circle to start the shading at +// fromRadius: radius of the circle to start the shading at +// toPoint: center of the circle to to end the shading at +// toRadius: radius of the circle to end the shading at +// extendingStart: should we extend the shading before |fromPoint| using +// the first color in our shading? +// extendingEnd: should we extend the shading after |toPoint| using the +// last color in our shading? +// shading: the shading to use to take our colors from. +// +- (void)gtm_fillAxiallyFrom:(NSPoint)fromPoint to:(NSPoint)toPoint + extendingStart:(BOOL)extendingStart extendingEnd:(BOOL)extendingEnd + shading:(id)shading; + +/// Fill the path radially with a color blend defined by |shading|. +// +/// The fill will extend from the circle with center |fromPoint| +/// and radius |fromRadius| to the circle with center |toPoint| +/// with radius |toRadius|. +/// You can extend beyond the |fromPoint|/|toPoint by setting +/// |extendingStart|/|extendingEnd| respectively. +// +// Args: +// fromPoint: center of the circle to start the shading at +// fromRadius: radius of the circle to start the shading at +// toPoint: center of the circle to to end the shading at +// toRadius: radius of the circle to end the shading at +// extendingStart: should we extend the shading before |fromPoint| using +// the first color in our shading? +// extendingEnd: should we extend the shading after |toPoint| using the +// last color in our shading? +// shading: the shading to use to take our colors from. +// +- (void)gtm_fillRadiallyFrom:(NSPoint)fromPoint fromRadius:(CGFloat)fromRadius + to:(NSPoint)toPoint toRadius:(CGFloat)toRadius + extendingStart:(BOOL)extendingStart extendingEnd:(BOOL)extendingEnd + shading:(id)shading; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+Shading.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+Shading.m new file mode 100644 index 00000000..d4c1ddd3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+Shading.m @@ -0,0 +1,216 @@ +// +// GTMNSBezierPath+Shading.m +// +// Category for radial and axial stroke and fill functions for NSBezierPaths +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSBezierPath+Shading.h" +#import "GTMNSBezierPath+CGPath.h" +#import "GTMShading.h" +#import "GTMGeometryUtils.h" +#import "GTMMethodCheck.h" + +@interface NSBezierPath (GTMBezierPathShadingAdditionsPrivate) +// Fills a CGPathRef either axially or radially with the given shading. +// +// Args: +// path: path to fill +// axially: if YES fill axially, otherwise fill radially +// asStroke: if YES, clip to the stroke of the path, otherwise +// clip to the fill +// from: where to shade from +// fromRadius: in a radial fill, the radius of the from circle +// to: where to shade to +// toRadius: in a radial fill, the radius of the to circle +// extendingStart: if true, extend the fill with the first color of the shade +// beyond |from| away from |to| +// extendingEnd: if true, extend the fill with the last color of the shade +// beyond |to| away from |from| +// shading: the shading to use for the fill +// +- (void)gtm_fillCGPath:(CGPathRef)path + axially:(BOOL)axially + asStroke:(BOOL)asStroke + from:(NSPoint)fromPoint fromRadius:(CGFloat)fromRadius + to:(NSPoint)toPoint toRadius:(CGFloat)toRadius + extendingStart:(BOOL)extendingStart extendingEnd:(BOOL)extendingEnd + shading:(id)shading; + +// Returns the point which is the projection of a line from point |pointA| +// to |pointB| by length +// +// Args: +// pointA: first point +// pointB: second point +// length: distance to project beyond |pointB| which is in line with +// |pointA| and |pointB| +// +// Returns: +// the projected point +- (NSPoint)gtm_projectLineFrom:(NSPoint)pointA + to:(NSPoint)pointB + by:(CGFloat)length; +@end + + +@implementation NSBezierPath (GTMBezierPathAdditionsPrivate) + +- (void)gtm_fillCGPath:(CGPathRef)path + axially:(BOOL)axially asStroke:(BOOL)asStroke + from:(NSPoint)fromPoint fromRadius:(CGFloat)fromRadius + to:(NSPoint)toPoint toRadius:(CGFloat)toRadius + extendingStart:(BOOL)extendingStart extendingEnd:(BOOL)extendingEnd + shading:(id)shading { + CGFunctionRef shadingFunction = [shading shadeFunction]; + if (nil != shadingFunction) { + CGContextRef currentContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; + if (nil != currentContext) { + CGContextSaveGState(currentContext); + CGFloat lineWidth = [self lineWidth]; + CGContextSetLineWidth(currentContext, lineWidth); + if (asStroke) { + // if we are using the stroke, we offset the from and to points + // by half the stroke width away from the center of the stroke. + // Otherwise we tend to end up with fills that only cover half of the + // because users set the start and end points based on the center + // of the stroke. + CGFloat halfWidth = lineWidth * 0.5; + fromPoint = [self gtm_projectLineFrom:toPoint to:fromPoint by:halfWidth]; + toPoint = [self gtm_projectLineFrom:fromPoint to:toPoint by:-halfWidth]; + } + CGColorSpaceRef colorspace = [shading colorSpace]; + if (nil != colorspace) { + CGPoint toCGPoint = GTMNSPointToCGPoint(toPoint); + CGPoint fromCGPoint = GTMNSPointToCGPoint(fromPoint); + CGShadingRef myCGShading; + if(axially) { + myCGShading = CGShadingCreateAxial(colorspace, fromCGPoint, + toCGPoint, shadingFunction, + extendingStart == YES, + extendingEnd == YES); + } + else { + myCGShading = CGShadingCreateRadial(colorspace, fromCGPoint, fromRadius, + toCGPoint, toRadius, shadingFunction, + extendingStart == YES, + extendingEnd == YES); + } + + if (nil != myCGShading) { + CGContextAddPath(currentContext,path); + if(asStroke) { + CGContextReplacePathWithStrokedPath(currentContext); + } + CGContextClip(currentContext); + CGContextDrawShading(currentContext, myCGShading); + CGShadingRelease(myCGShading); + } + } + CGContextRestoreGState(currentContext); + } + } +} + + +- (NSPoint)gtm_projectLineFrom:(NSPoint)pointA + to:(NSPoint)pointB + by:(CGFloat)length { + NSPoint newPoint = pointB; + CGFloat x = (pointB.x - pointA.x); + CGFloat y = (pointB.y - pointA.y); + if (fpclassify(x) == FP_ZERO) { + newPoint.y += length; + } else if (fpclassify(y) == FP_ZERO) { + newPoint.x += length; + } else { +#if CGFLOAT_IS_DOUBLE + CGFloat angle = atan(y / x); + newPoint.x += sin(angle) * length; + newPoint.y += cos(angle) * length; +#else + CGFloat angle = atanf(y / x); + newPoint.x += sinf(angle) * length; + newPoint.y += cosf(angle) * length; +#endif + } + return newPoint; +} + +@end + + +@implementation NSBezierPath (GTMBezierPathShadingAdditions) +GTM_METHOD_CHECK(NSBezierPath, gtm_CGPath); + +- (void)gtm_strokeAxiallyFrom:(NSPoint)fromPoint to:(NSPoint)toPoint + extendingStart:(BOOL)extendingStart extendingEnd:(BOOL)extendingEnd + shading:(id)shading { + CGPathRef thePath = [self gtm_CGPath]; + if (nil != thePath) { + [self gtm_fillCGPath:thePath axially:YES asStroke:YES + from:fromPoint fromRadius:(CGFloat)0.0 + to:toPoint toRadius:(CGFloat)0.0 + extendingStart:extendingStart extendingEnd:extendingEnd + shading:shading]; + } +} + + +- (void)gtm_strokeRadiallyFrom:(NSPoint)fromPoint fromRadius:(CGFloat)fromRadius + to:(NSPoint)toPoint toRadius:(CGFloat)toRadius + extendingStart:(BOOL)extendingStart extendingEnd:(BOOL)extendingEnd + shading:(id)shading { + CGPathRef thePath = [self gtm_CGPath]; + if (nil != thePath) { + [self gtm_fillCGPath:thePath axially:NO asStroke:YES + from:fromPoint fromRadius:fromRadius + to:toPoint toRadius:toRadius + extendingStart:extendingStart extendingEnd:extendingEnd + shading:shading]; + } +} + + +- (void)gtm_fillAxiallyFrom:(NSPoint)fromPoint to:(NSPoint)toPoint + extendingStart:(BOOL)extendingStart extendingEnd:(BOOL)extendingEnd + shading:(id)shading { + CGPathRef thePath = [self gtm_CGPath]; + if (nil != thePath) { + [self gtm_fillCGPath:thePath axially:YES asStroke:NO + from:fromPoint fromRadius:(CGFloat)0.0 + to:toPoint toRadius:(CGFloat)0.0 + extendingStart:extendingStart extendingEnd:extendingEnd + shading:shading]; + } +} + + +- (void)gtm_fillRadiallyFrom:(NSPoint)fromPoint fromRadius:(CGFloat)fromRadius + to:(NSPoint)toPoint toRadius:(CGFloat)toRadius + extendingStart:(BOOL)extendingStart extendingEnd:(BOOL)extendingEnd + shading:(id)shading { + CGPathRef thePath = [self gtm_CGPath]; + if (nil != thePath) { + [self gtm_fillCGPath:thePath axially:NO asStroke:NO + from:fromPoint fromRadius:fromRadius + to:toPoint toRadius:toRadius + extendingStart:extendingStart extendingEnd:extendingEnd + shading:shading]; + } +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+ShadingTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+ShadingTest.m new file mode 100644 index 00000000..a9dfbefa --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSBezierPath+ShadingTest.m @@ -0,0 +1,177 @@ +// +// GTMNSBezierPath+ShadingTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +#import + +#import "GTMLinearRGBShading.h" +#import "GTMAppKit+UnitTesting.h" +#import "GTMNSBezierPath+Shading.h" + +@interface GTMNSBezierPath_ShadingTest : GTMTestCase +@end + +@implementation GTMNSBezierPath_ShadingTest + +- (void)testShadings { + GTMAssertDrawingEqualToImageNamed(self, + NSMakeSize(310, 410), + @"GTMNSBezierPath+ShadingTest", nil, nil); +} + +- (void)gtm_unitTestViewDrawRect:(NSRect)rect contextInfo:(void*)contextInfo { + + NSColor *theColorArray[] = { [NSColor blueColor], + [NSColor redColor], [NSColor yellowColor], + [NSColor blueColor], [NSColor greenColor], + [NSColor redColor] }; + CGFloat theFloatArray[] = { 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 }; + + GTMLinearRGBShading *shading = + [GTMLinearRGBShading shadingWithColors:theColorArray + fromSpaceNamed:NSCalibratedRGBColorSpace + atPositions:theFloatArray + count:sizeof(theFloatArray)/sizeof(CGFloat)]; + NSBezierPath *shadedPath; + + // axial stroke rect - diagonal fill + NSRect axialStrokeRect = NSMakeRect(10.0f, 10.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:axialStrokeRect]; + [shadedPath setLineWidth: 10.0f]; + NSPoint startPoint = NSMakePoint(axialStrokeRect.origin.x + 20.0f, + axialStrokeRect.origin.y + 20.0f); + NSPoint endPoint = NSMakePoint(axialStrokeRect.origin.x + axialStrokeRect.size.width - 20.0f, + axialStrokeRect.origin.y + axialStrokeRect.size.height - 20.0f); + [shadedPath gtm_strokeAxiallyFrom:startPoint to:endPoint extendingStart:YES extendingEnd:YES shading:shading]; + + // axial stroke rect - v line fill + axialStrokeRect = NSMakeRect(110.0f, 10.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:axialStrokeRect]; + [shadedPath setLineWidth: 10.0f]; + startPoint = NSMakePoint(axialStrokeRect.origin.x + axialStrokeRect.size.width / 2.0f, + axialStrokeRect.origin.y + 20.0f); + endPoint = NSMakePoint(axialStrokeRect.origin.x + axialStrokeRect.size.width / 2.0f, + axialStrokeRect.origin.y + axialStrokeRect.size.height - 20.0f); + [shadedPath gtm_strokeAxiallyFrom:startPoint to:endPoint extendingStart:YES extendingEnd:YES shading:shading]; + + // axial stroke rect - h line fill + axialStrokeRect = NSMakeRect(210.0f, 10.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:axialStrokeRect]; + [shadedPath setLineWidth: 10.0f]; + startPoint = NSMakePoint(axialStrokeRect.origin.x + 20.0f, + axialStrokeRect.origin.y + axialStrokeRect.size.height / 2.0f); + endPoint = NSMakePoint(axialStrokeRect.origin.x + axialStrokeRect.size.width - 20.0f, + axialStrokeRect.origin.y + axialStrokeRect.size.height / 2.0f); + [shadedPath gtm_strokeAxiallyFrom:startPoint to:endPoint extendingStart:YES extendingEnd:YES shading:shading]; + + // axial fill rect - diagonal fill + NSRect axialFillRect = NSMakeRect(10.0f, 110.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:axialFillRect]; + startPoint = NSMakePoint(axialFillRect.origin.x + 20.0f, + axialFillRect.origin.y + 20.0f); + endPoint = NSMakePoint(axialFillRect.origin.x + axialFillRect.size.width - 20.0f, + axialFillRect.origin.y + axialFillRect.size.height - 20.0f); + [shadedPath gtm_fillAxiallyFrom:startPoint to:endPoint extendingStart:YES extendingEnd:YES shading:shading]; + + // axial fill rect - v line fill + axialFillRect = NSMakeRect(110.0f, 110.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:axialFillRect]; + startPoint = NSMakePoint(axialFillRect.origin.x + axialFillRect.size.width / 2.0f, + axialFillRect.origin.y + 20.0f); + endPoint = NSMakePoint(axialFillRect.origin.x + axialFillRect.size.width / 2.0f, + axialFillRect.origin.y + axialFillRect.size.height - 20.0f); + [shadedPath gtm_fillAxiallyFrom:startPoint to:endPoint extendingStart:YES extendingEnd:YES shading:shading]; + + // axial fill rect - h line fill + axialFillRect = NSMakeRect(210.0f, 110.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:axialFillRect]; + startPoint = NSMakePoint(axialFillRect.origin.x + 20.0f, + axialFillRect.origin.y + axialFillRect.size.height / 2.0f); + endPoint = NSMakePoint(axialFillRect.origin.x + axialFillRect.size.width - 20.0f, + axialFillRect.origin.y + axialFillRect.size.height / 2.0f); + [shadedPath gtm_fillAxiallyFrom:startPoint to:endPoint extendingStart:YES extendingEnd:YES shading:shading]; + + // radial stroke rect - diagonal fill + NSRect radialStrokeRect = NSMakeRect(10.0f, 210.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:radialStrokeRect]; + startPoint = NSMakePoint(radialStrokeRect.origin.x + 20.0f, + radialStrokeRect.origin.y + 20.0f); + endPoint = NSMakePoint(radialStrokeRect.origin.x + radialStrokeRect.size.width - 20.0f, + radialStrokeRect.origin.y + radialStrokeRect.size.height - 20.0f); + [shadedPath gtm_strokeRadiallyFrom:startPoint fromRadius:60.0f + to:endPoint toRadius:20.0f + extendingStart:YES extendingEnd:YES shading:shading]; + + // radial stroke rect - v line fill + radialStrokeRect = NSMakeRect(110.0f, 210.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:radialStrokeRect]; + startPoint = NSMakePoint(radialStrokeRect.origin.x + radialStrokeRect.size.width / 2.0f, + radialStrokeRect.origin.y + 20.0f); + endPoint = NSMakePoint(radialStrokeRect.origin.x + radialStrokeRect.size.width / 2.0f, + radialStrokeRect.origin.y + radialStrokeRect.size.height - 20.0f); + [shadedPath gtm_strokeRadiallyFrom:startPoint fromRadius:60.0f + to:endPoint toRadius:20.0f + extendingStart:YES extendingEnd:YES shading:shading]; + + // radial stroke rect - h line fill + radialStrokeRect = NSMakeRect(210.0f, 210.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:radialStrokeRect]; + startPoint = NSMakePoint(radialStrokeRect.origin.x + 20.0f, + radialStrokeRect.origin.y + radialStrokeRect.size.height / 2.0f); + endPoint = NSMakePoint(radialStrokeRect.origin.x + radialStrokeRect.size.width - 20.0f, + radialStrokeRect.origin.y + radialStrokeRect.size.height / 2.0f); + [shadedPath gtm_strokeRadiallyFrom:startPoint fromRadius:60.0f + to:endPoint toRadius:20.0f + extendingStart:YES extendingEnd:YES shading:shading]; + + // radial fill rect - diagonal fill + NSRect radialFillRect = NSMakeRect(10.0f, 310.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:radialFillRect]; + startPoint = NSMakePoint(radialFillRect.origin.x + 20.0f, + radialFillRect.origin.y + 20.0f); + endPoint = NSMakePoint(radialFillRect.origin.x + radialFillRect.size.width - 20.0f, + radialFillRect.origin.y + radialFillRect.size.height - 20.0f); + [shadedPath gtm_fillRadiallyFrom:startPoint fromRadius:10.0f + to:endPoint toRadius:20.0f + extendingStart:YES extendingEnd:YES shading:shading]; + + // radial fill rect - v line fill + radialFillRect = NSMakeRect(110.0f, 310.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:radialFillRect]; + startPoint = NSMakePoint(radialFillRect.origin.x + radialFillRect.size.width / 2.0f, + radialFillRect.origin.y + 20.0f); + endPoint = NSMakePoint(radialFillRect.origin.x + radialFillRect.size.width / 2.0f, + radialFillRect.origin.y + radialFillRect.size.height - 20.0f); + [shadedPath gtm_fillRadiallyFrom:startPoint fromRadius:10.0f + to:endPoint toRadius:20.0f + extendingStart:YES extendingEnd:YES shading:shading]; + + // radial fill rect - h line fill + radialFillRect = NSMakeRect(210.0f, 310.0f, 90.0f, 90.0f); + shadedPath = [NSBezierPath bezierPathWithRect:radialFillRect]; + startPoint = NSMakePoint(radialFillRect.origin.x + 20.0f, + radialFillRect.origin.y + radialFillRect.size.height / 2.0f); + endPoint = NSMakePoint(radialFillRect.origin.x + radialFillRect.size.width - 20.0f, + radialFillRect.origin.y + radialFillRect.size.height / 2.0f); + [shadedPath gtm_fillRadiallyFrom:startPoint fromRadius:10.0f + to:endPoint toRadius:20.0f + extendingStart:YES extendingEnd:YES shading:shading]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+Luminance.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+Luminance.h new file mode 100644 index 00000000..c1501cdc --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+Luminance.h @@ -0,0 +1,65 @@ +// +// GTMNSColor+Luminance.h +// +// Copyright 2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" +#import + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +enum { + GTMColorationBaseHighlight, + GTMColorationBaseMidtone, + GTMColorationBaseShadow, + GTMColorationBasePenumbra, + GTMColorationLightHighlight, + GTMColorationLightMidtone, + GTMColorationLightShadow, + GTMColorationLightPenumbra, + GTMColorationDarkHighlight, + GTMColorationDarkMidtone, + GTMColorationDarkShadow, + GTMColorationDarkPenumbra +}; +typedef NSUInteger GTMColorationUse; + +@interface NSColorSpace (GTMNSColorSpaceLuminanceHelpers) ++ (NSColorSpace *)gtm_labColorSpace; +@end + +@interface NSColor (GTMLuminanceAdditions) +- (CGFloat)gtm_luminance; + +// Create a color modified by lightening or darkening it (-1.0 to 1.0) +- (NSColor *)gtm_colorByAdjustingLuminance:(CGFloat)luminance; + +// Create a color modified by lightening or darkening it (-1.0 to 1.0) +- (NSColor *)gtm_colorByAdjustingLuminance:(CGFloat)luminance + saturation:(CGFloat)saturation; + +// Returns a color adjusted for a specific usage +- (NSColor *)gtm_colorAdjustedFor:(GTMColorationUse)use; +- (NSColor *)gtm_colorAdjustedFor:(GTMColorationUse)use faded:(BOOL)fade; + +// Returns whether the color is in the dark half of the spectrum +- (BOOL)gtm_isDarkColor; + +// Returns a color that is legible on this color. (Nothing to do with textColor) +- (NSColor *)gtm_legibleTextColor; +@end + +#endif diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+Luminance.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+Luminance.m new file mode 100644 index 00000000..5b10dbe6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+Luminance.m @@ -0,0 +1,153 @@ +// +// GTMNSColor+Luminance.m +// +// Copyright 2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +#import "GTMNSColor+Luminance.h" + +static const CGFloat kGTMLuminanceDarkCutoff = 0.6; + +@implementation NSColorSpace (GTMNSColorSpaceLuminanceHelpers) + +// TODO(alcor): we may want to keep one of these around for performance reasons ++ (NSColorSpace *)gtm_labColorSpace { + // Observer= 2°, Illuminant= D65 + // TODO(alcor): these should come from ColorSync + CGFloat whitePoint[3] = {0.95047, 1.0, 1.08883}; + CGFloat blackPoint[3] = {0, 0, 0}; + CGFloat range[4] = {-127, 127, -127, 127}; + CGColorSpaceRef cs = CGColorSpaceCreateLab(whitePoint, blackPoint, range); + NSColorSpace *space = nil; + if (cs) { + space = [[[NSColorSpace alloc] initWithCGColorSpace:cs] autorelease]; + CGColorSpaceRelease(cs); + } + return space; +} +@end + +@implementation NSColor (GTMLuminance) + +- (NSColor *)labColor { + return [self colorUsingColorSpace:[NSColorSpace gtm_labColorSpace]]; +} + +- (CGFloat)gtm_luminance { + CGFloat lab[4]; + lab[0] = 0.0; + [[self labColor] getComponents:lab]; + return lab[0] / 100.0; +} + +- (NSColor *)gtm_colorByAdjustingLuminance:(CGFloat)luminance + saturation:(CGFloat)saturation { + CGFloat lab[4]; + [[self labColor] getComponents:lab]; + lab[0] *= 1.0 + luminance; + // If luminance is greater than 100, we desaturate it so that we don't get + // wild colors coming out of the forumula + if (lab[0] > 100) { + CGFloat clipping = lab[0] - 100; + CGFloat desaturation = (50.0 - clipping) / 50.0; + saturation = MIN(saturation, desaturation); + } + lab[1] *= saturation; + lab[2] *= saturation; + return [NSColor colorWithColorSpace:[NSColorSpace gtm_labColorSpace] + components:lab + count:sizeof(lab) / sizeof(lab[0])]; +} + +- (NSColor *)gtm_colorByAdjustingLuminance:(CGFloat)luminance { + return [self gtm_colorByAdjustingLuminance:luminance saturation:1.0]; +} + +// TODO(alcor): these constants are largely made up, come up with a consistent +// set of values or at least guidelines +- (NSColor *)gtm_colorAdjustedFor:(GTMColorationUse)use { + NSColor *color = nil; + switch (use) { + case GTMColorationBaseHighlight: + color = [self gtm_colorByAdjustingLuminance:0.15]; + break; + case GTMColorationBaseMidtone: + color = self; + break; + case GTMColorationBaseShadow: + color = [self gtm_colorByAdjustingLuminance:-0.15]; + break; + case GTMColorationBasePenumbra: + color = [self gtm_colorByAdjustingLuminance:-0.10]; + break; + case GTMColorationLightHighlight: + color = [self gtm_colorByAdjustingLuminance:0.25]; + color = [color blendedColorWithFraction:0.9 ofColor:[NSColor whiteColor]]; + break; + case GTMColorationLightMidtone: + color = [self blendedColorWithFraction:0.8 ofColor:[NSColor whiteColor]]; + break; + case GTMColorationLightShadow: + color = [self blendedColorWithFraction:0.7 ofColor:[NSColor whiteColor]]; + color = [color gtm_colorByAdjustingLuminance:-0.02]; + break; + case GTMColorationLightPenumbra: + color = [self blendedColorWithFraction:0.8 ofColor:[NSColor whiteColor]]; + color = [color gtm_colorByAdjustingLuminance:-0.01]; + break; + case GTMColorationDarkHighlight: + color = [self gtm_colorByAdjustingLuminance:-0.20]; + break; + case GTMColorationDarkMidtone: + color = [self gtm_colorByAdjustingLuminance:-0.25]; + break; + case GTMColorationDarkShadow: + color = [self gtm_colorByAdjustingLuminance:-0.30 saturation:1.4]; + break; + case GTMColorationDarkPenumbra: + color = [self gtm_colorByAdjustingLuminance:-0.25]; + break; + default: + _GTMDevLog(@"Invalid Coloration Use %d", use); + color = self; + break; + } + return color; +} +const CGFloat kDefaultFade = 0.3; + +- (NSColor *)gtm_colorAdjustedFor:(GTMColorationUse)use faded:(BOOL)fade { + NSColor *color = [self gtm_colorAdjustedFor:use]; + if (fade) { + CGFloat luminance = [color gtm_luminance]; + color = [color gtm_colorByAdjustingLuminance: + kDefaultFade * (1.0 - luminance) + saturation:kDefaultFade]; + } + return color; +} + +- (BOOL)gtm_isDarkColor { + return [self gtm_luminance] < kGTMLuminanceDarkCutoff; +} + +- (NSColor *)gtm_legibleTextColor { + return [self gtm_isDarkColor] ? [NSColor whiteColor] : [NSColor blackColor]; +} + +@end +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+LuminanceTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+LuminanceTest.m new file mode 100644 index 00000000..82eb0145 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSColor+LuminanceTest.m @@ -0,0 +1,72 @@ +// +// GTMNSColor+LuminanceTest.m +// +// Copyright 2006-2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +#import "GTMSenTestCase.h" +#import "GTMNSColor+Luminance.h" + +@interface GTMNSColor_LuminanceTest : GTMTestCase +@end + +@implementation GTMNSColor_LuminanceTest + +- (void)testLuminance { + NSColor *midtone = [NSColor blueColor]; + NSColor *darker = [midtone gtm_colorAdjustedFor:GTMColorationBaseShadow]; + NSColor *lighter = [midtone gtm_colorAdjustedFor:GTMColorationBaseHighlight]; + NSColor *lightest = [midtone gtm_colorAdjustedFor:GTMColorationLightHighlight]; + NSColor *darkest = [midtone gtm_colorAdjustedFor:GTMColorationDarkShadow]; + + // The relationships of the other values are not set, so we don't test them yet + STAssertGreaterThanOrEqual([lightest gtm_luminance], + [lighter gtm_luminance], nil); + STAssertGreaterThanOrEqual([lighter gtm_luminance], + [midtone gtm_luminance], nil); + STAssertGreaterThanOrEqual([midtone gtm_luminance], + [darker gtm_luminance], nil); + STAssertGreaterThanOrEqual([darker gtm_luminance], + [darkest gtm_luminance], nil); + STAssertGreaterThanOrEqual([[NSColor whiteColor] gtm_luminance], + (CGFloat)0.95, nil); + STAssertGreaterThanOrEqual([[NSColor yellowColor] gtm_luminance], + (CGFloat)0.90, nil); + STAssertEqualsWithAccuracy([[NSColor blueColor] gtm_luminance], + (CGFloat)0.35, 0.10, nil); + STAssertEqualsWithAccuracy([[NSColor redColor] gtm_luminance], + (CGFloat)0.50, 0.10, nil); + STAssertLessThanOrEqual([[NSColor blackColor] gtm_luminance], + (CGFloat)0.30, nil); + STAssertTrue([[NSColor blackColor] gtm_isDarkColor], nil); + STAssertTrue([[NSColor blueColor] gtm_isDarkColor], nil); + STAssertTrue([[NSColor redColor] gtm_isDarkColor], nil); + STAssertTrue(![[NSColor whiteColor] gtm_isDarkColor], nil); + STAssertTrue(![[NSColor yellowColor] gtm_isDarkColor], nil); + STAssertGreaterThanOrEqual([[[NSColor blackColor] gtm_legibleTextColor] + gtm_luminance], + [[NSColor grayColor] gtm_luminance], nil); + STAssertLessThanOrEqual([[[NSColor whiteColor] gtm_legibleTextColor] + gtm_luminance], + [[NSColor grayColor] gtm_luminance], nil); +} + +@end + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+Scaling.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+Scaling.h new file mode 100644 index 00000000..7d485771 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+Scaling.h @@ -0,0 +1,51 @@ +// +// GTMNSImage+Scaling.h +// +// Scales NSImages to a variety of sizes for drawing +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + + +#import +#import "GTMDefines.h" + +@interface NSImage (GTMNSImageScaling) + +// Return an existing representation of a size +- (NSImageRep *)gtm_representationOfSize:(NSSize)size; + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6 +// Return the exact or next largest representation for a size +// If you are on SnowLeopard use +// -[NSImage bestRepresentationForRect:context:hints:] +- (NSImageRep *)gtm_bestRepresentationForSize:(NSSize)size; +#endif + +// Create a new represetation for a given size +- (BOOL)gtm_createRepresentationOfSize:(NSSize)size; + +// Create 32 and 16px reps +- (BOOL)gtm_createIconRepresentations; + +// Remove reps larger than a given size and create a new rep if needed +- (void)gtm_shrinkToSize:(NSSize)size; + +// Remove reps larger than a given size +- (void)gtm_removeRepresentationsLargerThanSize:(NSSize)size; + +// Return a dup shrunk to a given size +- (NSImage *)gtm_duplicateOfSize:(NSSize)size; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+Scaling.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+Scaling.m new file mode 100644 index 00000000..8283b298 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+Scaling.m @@ -0,0 +1,183 @@ +// +// GTMNSImage+Scaling.m +// +// Scales NSImages to a variety of sizes for drawing +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSImage+Scaling.h" +#import "GTMGeometryUtils.h" + +@implementation NSImage (GTMNSImageScaling) + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6 +// If you are on SnowLeopard use +// -[NSImage bestRepresentationForRect:context:hints:] +- (NSImageRep *)gtm_bestRepresentationForSize:(NSSize)size { + NSImageRep *bestRep = [self gtm_representationOfSize:size]; + if (bestRep) { + return bestRep; + } + NSArray *reps = [self representations]; + + CGFloat repDistance = CGFLOAT_MAX; + + NSImageRep *thisRep; + GTM_FOREACH_OBJECT(thisRep, reps) { + CGFloat thisDistance; + thisDistance = MIN(size.width - [thisRep size].width, + size.height - [thisRep size].height); + + if (repDistance < 0 && thisDistance > 0) continue; + if (ABS(thisDistance) < ABS(repDistance) + || (thisDistance < 0 && repDistance > 0)) { + repDistance = thisDistance; + bestRep = thisRep; + } + } + + if (!bestRep) { + bestRep = [self bestRepresentationForDevice:nil]; + } + + return bestRep; +} +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6 + +- (NSImageRep *)gtm_representationOfSize:(NSSize)size { + NSArray *reps = [self representations]; + + NSImageRep *thisRep; + GTM_FOREACH_OBJECT(thisRep, reps) { + if (NSEqualSizes([thisRep size], size)) { + return thisRep; + } + } + return nil; +} + +- (BOOL)gtm_createIconRepresentations { + [self setFlipped:NO]; + [self gtm_createRepresentationOfSize:NSMakeSize(16, 16)]; + [self gtm_createRepresentationOfSize:NSMakeSize(32, 32)]; + [self setScalesWhenResized:NO]; + return YES; +} + +- (BOOL)gtm_createRepresentationOfSize:(NSSize)size { + if ([self gtm_representationOfSize:size]) { + return NO; + } + + NSBitmapImageRep *bestRep; +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6 + bestRep = (NSBitmapImageRep *)[self gtm_bestRepresentationForSize:size]; +#else + bestRep + = (NSBitmapImageRep *)[self bestRepresentationForRect:GTMNSRectOfSize(size) + context:nil + hints:nil]; +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6 + + NSRect drawRect = GTMNSScaleRectToRect(GTMNSRectOfSize([bestRep size]), + GTMNSRectOfSize(size), + GTMScaleProportionally, + GTMRectAlignCenter); + + if ([bestRep respondsToSelector:@selector(CGImage)]) { + CGImageRef imageRef = (CGImageRef)[bestRep performSelector:@selector(CGImage)]; + + CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB(); + if (!cspace) return NO; + + CGContextRef smallContext = + CGBitmapContextCreate(NULL, + size.width, + size.height, + 8, // bits per component + size.width * 4, // bytes per pixel + cspace, + kCGBitmapByteOrder32Host + | kCGImageAlphaPremultipliedLast); + CFRelease(cspace); + + if (!smallContext) return NO; + + + CGContextDrawImage(smallContext, GTMNSRectToCGRect(drawRect), imageRef); + + CGImageRef smallImage = CGBitmapContextCreateImage(smallContext); + + if (smallImage) { + NSBitmapImageRep *cgRep = + [[[NSBitmapImageRep alloc] initWithCGImage:smallImage] autorelease]; + [self addRepresentation:cgRep]; + CGImageRelease(smallImage); + } else { + CGContextRelease(smallContext); + return NO; + } + CGContextRelease(smallContext); + return YES; + } else { + // This functionality is here to allow it to work under Tiger + // It can probably only be called safely from the main thread + NSImage* scaledImage = [[NSImage alloc] initWithSize:size]; + [scaledImage lockFocus]; + NSGraphicsContext *graphicsContext = [NSGraphicsContext currentContext]; + [graphicsContext setImageInterpolation:NSImageInterpolationHigh]; + [graphicsContext setShouldAntialias:YES]; + [bestRep drawInRect:drawRect]; + NSBitmapImageRep* iconRep = + [[[NSBitmapImageRep alloc] initWithFocusedViewRect: + NSMakeRect(0, 0, size.width, size.height)] autorelease]; + [scaledImage unlockFocus]; + [scaledImage release]; + [self addRepresentation:iconRep]; + return YES; + } + return NO; +} + +- (void)gtm_removeRepresentationsLargerThanSize:(NSSize)size { + NSMutableArray *repsToRemove = [NSMutableArray array]; + NSImageRep *thisRep; + // Remove them in a second loop so we don't change things will doing the + // initial loop. + GTM_FOREACH_OBJECT(thisRep, [self representations]) { + if ([thisRep size].width > size.width + && [thisRep size].height > size.height) { + [repsToRemove addObject:thisRep]; + } + } + GTM_FOREACH_OBJECT(thisRep, repsToRemove) { + [self removeRepresentation:thisRep]; + } +} + +- (NSImage *)gtm_duplicateOfSize:(NSSize)size { + NSImage *duplicate = [[self copy] autorelease]; + [duplicate gtm_shrinkToSize:size]; + [duplicate setFlipped:NO]; + return duplicate; +} + +- (void)gtm_shrinkToSize:(NSSize)size { + [self gtm_createRepresentationOfSize:size]; + [self setSize:size]; + [self gtm_removeRepresentationsLargerThanSize:size]; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+ScalingTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+ScalingTest.m new file mode 100644 index 00000000..5679b7c2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSImage+ScalingTest.m @@ -0,0 +1,64 @@ +// +// GTMNSImage+ScalingTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +#import "GTMSenTestCase.h" + +#import "GTMNSImage+Scaling.h" +#import "GTMGeometryUtils.h" + +@interface GTMNSImage_ScalingTest : GTMTestCase +@end + +@implementation GTMNSImage_ScalingTest + +- (void)testScaling { + NSImage *testImage = [NSImage imageNamed:@"NSApplicationIcon"]; + + NSImageRep *rep = nil; + NSRect bestRepRect = NSMakeRect(0, 0, 99, 99); + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + rep = [testImage bestRepresentationForRect:bestRepRect + context:nil + hints:nil]; +#else + rep = [testImage gtm_bestRepresentationForSize:bestRepRect.size]; +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + + STAssertTrue(NSEqualSizes([rep size], NSMakeSize(128, 128)), nil); + + [testImage gtm_createIconRepresentations]; + STAssertNotNil([testImage gtm_representationOfSize:NSMakeSize(16, 16)], nil); + STAssertNotNil([testImage gtm_representationOfSize:NSMakeSize(32, 32)], nil); + + NSImage *duplicate = [testImage gtm_duplicateOfSize: NSMakeSize(48, 48)]; + bestRepRect = NSMakeRect(0, 0, 50, 50); +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + rep = [duplicate bestRepresentationForRect:bestRepRect + context:nil + hints:nil]; +#else + rep = [duplicate gtm_bestRepresentationForSize:bestRepRect.size]; +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + STAssertTrue(NSEqualSizes([rep size], NSMakeSize(48, 48)), nil); + +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+Running.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+Running.h new file mode 100644 index 00000000..483833fa --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+Running.h @@ -0,0 +1,92 @@ +// +// GTMNSWorkspace+Running.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +// Process Dictionary keys +// +// NOTE: According to ProcessInformationCopyDictionary, the following may not be +// in the dictionary depending on the type of process: +// kGTMWorkspaceRunningParentPSN, kGTMWorkspaceRunningFileType, +// kGTMWorkspaceRunningFileCreator, kGTMWorkspaceRunningPID, +// kGTMWorkspaceRunningBundlePath, kGTMWorkspaceRunningBundleIdentifier, +// kGTMWorkspaceRunningBundleName, kGTMWorkspaceRunningBundleExecutable, +// And experience says the follow might also not be there: +// kGTMWorkspaceRunningIsHidden + +// Make sure to use numberToProcessSerialNumber: on the return values +// of these keys to get valid PSNs on both Leopard and Tiger. +// Numeric types come back as a NSNumber. +GTM_EXTERN NSString *const kGTMWorkspaceRunningPSN; // long long +GTM_EXTERN NSString *const kGTMWorkspaceRunningParentPSN; // long long + +GTM_EXTERN NSString *const kGTMWorkspaceRunningFlavor; // SInt32 +GTM_EXTERN NSString *const kGTMWorkspaceRunningAttributes; // SInt32 +GTM_EXTERN NSString *const kGTMWorkspaceRunningFileType; // NSString +GTM_EXTERN NSString *const kGTMWorkspaceRunningFileCreator; // NSString +GTM_EXTERN NSString *const kGTMWorkspaceRunningPID; // long +GTM_EXTERN NSString *const kGTMWorkspaceRunningLSBackgroundOnly; // bool +GTM_EXTERN NSString *const kGTMWorkspaceRunningLSUIElement; // bool +GTM_EXTERN NSString *const kGTMWorkspaceRunningIsHidden; // bool +GTM_EXTERN NSString *const kGTMWorkspaceRunningCheckedIn; // bool +GTM_EXTERN NSString *const kGTMWorkspaceRunningLSUIPresentationMode; // Short +GTM_EXTERN NSString *const kGTMWorkspaceRunningBundlePath; // NSString +GTM_EXTERN NSString *const kGTMWorkspaceRunningBundleVersion; // NSString +// The docs for ProcessInformationCopyDictionary say we should use the constants +// instead of the raw string values, so map our values to those keys. +#define kGTMWorkspaceRunningBundleIdentifier (NSString*)kCFBundleIdentifierKey // NSString +#define kGTMWorkspaceRunningBundleName (NSString*)kCFBundleNameKey // NSString +#define kGTMWorkspaceRunningBundleExecutable (NSString*)kCFBundleExecutableKey // NSString + +// A category for getting information about other running processes +@interface NSWorkspace (GTMWorkspaceRunningAdditions) + +// Returns a YES/NO if a process w/ the given identifier is running +- (BOOL)gtm_isAppWithIdentifierRunning:(NSString *)identifier; + +// Returns a dictionary with info for our process. +//See Process Dictionary Keys above for values +- (NSDictionary *)gtm_processInfoDictionary; + +// Returns a dictionary with info for the active process. +// See Process Dictionary Keys above for values +- (NSDictionary *)gtm_processInfoDictionaryForActiveApp; + +// Returns a dictionary with info for the process. +//See Process Dictionary Keys above for values +- (NSDictionary *)gtm_processInfoDictionaryForPID:(pid_t)pid; + +// Returns a dictionary with info for the process. +// See Process Dictionary Keys above for values +- (NSDictionary *)gtm_processInfoDictionaryForPSN:(const ProcessSerialNumberPtr)psn; + +// Returns true if we were launched as a login item. +- (BOOL)gtm_wasLaunchedAsLoginItem; + +// Returns true if we were launched by a given bundleid +- (BOOL)gtm_wasLaunchedByProcess:(NSString*)bundleid; + +// Returns true if the PSN was found for the running app with bundleID +- (BOOL)gtm_processSerialNumber:(ProcessSerialNumber*)outPSN + withBundleID:(NSString*)bundleID; + +// Converts PSNs stored in NSNumbers to real PSNs +- (ProcessSerialNumber)gtm_numberToProcessSerialNumber:(NSNumber*)number; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+Running.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+Running.m new file mode 100644 index 00000000..973ad22b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+Running.m @@ -0,0 +1,173 @@ +// +// GTMNSWorkspace+Running.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSWorkspace+Running.h" +#import +#import +#import "GTMGarbageCollection.h" +#import "GTMSystemVersion.h" + +NSString *const kGTMWorkspaceRunningPSN = @"PSN"; +NSString *const kGTMWorkspaceRunningFlavor = @"Flavor"; +NSString *const kGTMWorkspaceRunningAttributes = @"Attributes"; +NSString *const kGTMWorkspaceRunningParentPSN = @"ParentPSN"; +NSString *const kGTMWorkspaceRunningFileType = @"FileType"; +NSString *const kGTMWorkspaceRunningFileCreator = @"FileCreator"; +NSString *const kGTMWorkspaceRunningPID = @"pid"; +NSString *const kGTMWorkspaceRunningLSBackgroundOnly = @"LSBackgroundOnly"; +NSString *const kGTMWorkspaceRunningLSUIElement = @"LSUIElement"; +NSString *const kGTMWorkspaceRunningIsHidden = @"IsHiddenAttr"; +NSString *const kGTMWorkspaceRunningCheckedIn = @"IsCheckedInAttr"; +NSString *const kGTMWorkspaceRunningLSUIPresentationMode + = @"LSUIPresentationMode"; +NSString *const kGTMWorkspaceRunningBundlePath = @"BundlePath"; +NSString *const kGTMWorkspaceRunningBundleVersion = @"CFBundleVersion"; + +@implementation NSWorkspace (GTMWorkspaceRunningAdditions) + +/// Returns a YES/NO if a process w/ the given identifier is running +- (BOOL)gtm_isAppWithIdentifierRunning:(NSString *)identifier { + if ([identifier length] == 0) return NO; + NSArray *launchedApps = [self launchedApplications]; + NSArray *buildIDs + = [launchedApps valueForKey:@"NSApplicationBundleIdentifier"]; + return [buildIDs containsObject:identifier]; +} + +- (NSDictionary *)gtm_processInfoDictionaryForPID:(pid_t)pid { + NSDictionary *dict = nil; + ProcessSerialNumber psn; + if (GetProcessForPID(pid, &psn) == noErr) { + dict = [self gtm_processInfoDictionaryForPSN:&psn]; + } + return dict; +} + +- (NSDictionary *)gtm_processInfoDictionaryForPSN:(ProcessSerialNumberPtr)psn { + NSDictionary *dict = nil; + if (psn) { + CFDictionaryRef cfDict + = ProcessInformationCopyDictionary(psn, + kProcessDictionaryIncludeAllInformationMask); + dict = GTMCFAutorelease(cfDict); + } + return dict; +} + +- (NSDictionary *)gtm_processInfoDictionary { + NSDictionary *dict = nil; + ProcessSerialNumber selfNumber; + if (MacGetCurrentProcess(&selfNumber) == noErr) { + dict = [self gtm_processInfoDictionaryForPSN:&selfNumber]; + } + return dict; +} + +- (NSDictionary *)gtm_processInfoDictionaryForActiveApp { + NSDictionary *processDict = nil; + ProcessSerialNumber psn; + OSStatus status = GetFrontProcess(&psn); + if (status == noErr) { + processDict = [self gtm_processInfoDictionaryForPSN:&psn]; + } + return processDict; +} + +- (BOOL)gtm_wasLaunchedAsLoginItem { + // If the launching process was 'loginwindow', we were launched as a login + // item + return [self gtm_wasLaunchedByProcess:@"com.apple.loginwindow"]; +} + +- (BOOL)gtm_wasLaunchedByProcess:(NSString*)bundleid { + BOOL wasLaunchedByProcess = NO; + NSDictionary *processInfo = [self gtm_processInfoDictionary]; + if (processInfo) { + NSNumber *processNumber + = [processInfo objectForKey:kGTMWorkspaceRunningParentPSN]; + ProcessSerialNumber parentPSN + = [self gtm_numberToProcessSerialNumber:processNumber]; + NSDictionary *parentProcessInfo + = [self gtm_processInfoDictionaryForPSN:&parentPSN]; + NSString *parentBundle + = [parentProcessInfo objectForKey:kGTMWorkspaceRunningBundleIdentifier]; + wasLaunchedByProcess + = [parentBundle isEqualToString:bundleid]; + } + return wasLaunchedByProcess; +} + +- (BOOL)gtm_processSerialNumber:(ProcessSerialNumber*)outPSN + withBundleID:(NSString*)bundleID { + if (!outPSN || [bundleID length] == 0) { + return NO; + } + + NSArray *apps = [self launchedApplications]; + + NSEnumerator *enumerator = [apps objectEnumerator]; + NSDictionary *dict; + + while ((dict = [enumerator nextObject])) { + NSString *nextID = [dict objectForKey:@"NSApplicationBundleIdentifier"]; + + if ([nextID isEqualToString:bundleID]) { + NSNumber *psn + = [dict objectForKey:@"NSApplicationProcessSerialNumberLow"]; + outPSN->lowLongOfPSN = [psn unsignedIntValue]; + + psn = [dict objectForKey:@"NSApplicationProcessSerialNumberHigh"]; + outPSN->highLongOfPSN = [psn unsignedIntValue]; + + return YES; + } + } + + return NO; +} + +- (ProcessSerialNumber)gtm_numberToProcessSerialNumber:(NSNumber*)number { + // There is a bug in Tiger where they were packing ProcessSerialNumbers + // incorrectly into the longlong that they stored in the dictionary. + // This fixes it. + ProcessSerialNumber outPSN = { kNoProcess, kNoProcess}; + if (number) { + long long temp = [number longLongValue]; + UInt32 hi = (UInt32)((temp >> 32) & 0x00000000FFFFFFFFLL); + UInt32 lo = (UInt32)((temp >> 0) & 0x00000000FFFFFFFFLL); +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + outPSN.highLongOfPSN = hi; + outPSN.lowLongOfPSN = lo; +#else // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + if ([GTMSystemVersion isLeopardOrGreater]) { + outPSN.highLongOfPSN = hi; + outPSN.lowLongOfPSN = lo; + } else { +#if TARGET_RT_BIG_ENDIAN + outPSN.highLongOfPSN = hi; + outPSN.lowLongOfPSN = lo; +#else + outPSN.highLongOfPSN = lo; + outPSN.lowLongOfPSN = hi; +#endif // TARGET_RT_BIG_ENDIAN + } +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + } + return outPSN; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+RunningTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+RunningTest.m new file mode 100644 index 00000000..4c9af6c5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMNSWorkspace+RunningTest.m @@ -0,0 +1,78 @@ +// +// GTMNSWorkspace+RunningTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSWorkspace+Running.h" +#import + +@interface GTMNSWorkspace_RunningTest : GTMTestCase +@end + +@implementation GTMNSWorkspace_RunningTest + +- (void)testBasics { + NSWorkspace *ws = [NSWorkspace sharedWorkspace]; + STAssertTrue([ws gtm_isAppWithIdentifierRunning:@"com.apple.finder"], nil); + STAssertFalse([ws gtm_isAppWithIdentifierRunning:@"com.google.nothing"], nil); + + NSDictionary *processInfo = [ws gtm_processInfoDictionary]; + STAssertNotNil(processInfo, nil); + + BOOL wasLaunchedAsLoginItem = [ws gtm_wasLaunchedAsLoginItem]; + STAssertFalse(wasLaunchedAsLoginItem, nil); + + pid_t pid = getpid(); + NSDictionary *processInfo2 = [ws gtm_processInfoDictionaryForPID:pid]; + STAssertNotNil(processInfo2, nil); + STAssertEqualObjects(processInfo, processInfo2, nil); + + ProcessSerialNumber num = { 0, 0 }; + BOOL gotPSN = [ws gtm_processSerialNumber:&num + withBundleID:@"com.apple.finder"]; + STAssertTrue(gotPSN, nil); + STAssertGreaterThan(num.highLongOfPSN + num.lowLongOfPSN, (UInt32)0, nil); + gotPSN = [ws gtm_processSerialNumber:&num + withBundleID:@"bad.bundle.id"]; + STAssertFalse(gotPSN, nil); + + gotPSN = [ws gtm_processSerialNumber:NULL + withBundleID:nil]; + STAssertFalse(gotPSN, nil); + + processInfo = [ws gtm_processInfoDictionaryForActiveApp]; + STAssertNotNil(processInfo, nil); + + // Only check the keys that have to be there + NSString *const keys[] = { + kGTMWorkspaceRunningPSN, + kGTMWorkspaceRunningFlavor, kGTMWorkspaceRunningAttributes, + kGTMWorkspaceRunningLSBackgroundOnly, + kGTMWorkspaceRunningLSUIElement, + kGTMWorkspaceRunningCheckedIn, + kGTMWorkspaceRunningBundleVersion, + kGTMWorkspaceRunningLSUIPresentationMode, + + }; + for (size_t i = 0; i < sizeof(keys) / sizeof(NSString *); ++i) { + NSString *const key = keys[i]; + STAssertNotNil([processInfo objectForKey:key], + @"Couldn't get %@ from %@", key, processInfo); + } +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMShading.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMShading.h new file mode 100644 index 00000000..27e163ea --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMShading.h @@ -0,0 +1,41 @@ +// +// GTMShading.h +// +// A protocol for an object that can be used as a shader. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +/// \cond Protocols + +@protocol GTMShading +// Returns the shadefunction for using in a shader. +// This shadefunction shoud never be released. It is owned by the implementor +// of the GTMShading protocol. +// +// Returns: +// a shading function. +- (CGFunctionRef)shadeFunction; + +// Returns the colorSpace for using in a shader. +// This colorSpace shoud never be released. It is owned by the implementor +// of the GTMShading protocol. +// +// Returns: +// a color space. +- (CGColorSpaceRef)colorSpace; +@end + +/// \endcond diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMTheme.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMTheme.h new file mode 100644 index 00000000..5f4700e3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMTheme.h @@ -0,0 +1,78 @@ +// +// GTMTheme.h +// +// Copyright 2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" +#import + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +// Sent whenever the theme changes. Object => GTMTheme that changed +GTM_EXTERN NSString *kGTMThemeDidChangeNotification; + +enum { + GTMThemeStyleTabBarSelected, + GTMThemeStyleTabBarDeselected, + GTMThemeStyleWindow, + GTMThemeStyleToolBar, + GTMThemeStyleToolBarButton, + GTMThemeStyleToolBarButtonPressed, + GTMThemeStyleBookmarksBar, +}; +typedef NSUInteger GTMThemeStyle; + +// GTMTheme provides a range of values for procedural drawing of UI elements +// based on interpolation of a single background color + +@interface GTMTheme : NSObject { + @private + NSColor *backgroundColor_; // bound to user defaults + NSImage *backgroundImage_; // bound to user defaults + NSMutableDictionary *values_; // cached values +} + +// Access the global theme. By default this is bound to user defaults ++ (GTMTheme *)defaultTheme; ++ (void)setDefaultTheme:(GTMTheme *)theme; + +// returns base theme color +- (NSColor *)backgroundColor; + +// base background color +- (NSImage *)backgroundImage; + +// NSColor (or pattern color) for the background of the window +- (NSColor *)windowBackgroundColor:(BOOL)active; + +// NSGradient for specific usage, active indicates whether the window is key +- (NSGradient *)gradientForStyle:(GTMThemeStyle)style active:(BOOL)active; + +// Outline color for stroke, active indicates whether the window is key +- (NSColor *)strokeColorForStyle:(GTMThemeStyle)style active:(BOOL)active; + +// Indicates whether luminance is dark or light +- (BOOL)styleIsDark:(GTMThemeStyle)style active:(BOOL)active; + +// Background style for this style and state +- (NSBackgroundStyle)interiorBackgroundStyleForStyle:(GTMThemeStyle)style + active:(BOOL)active; + +// NSColor version of the gradient (for window backgrounds, etc) +- (NSColor *)patternColorForStyle:(GTMThemeStyle)style active:(BOOL)active; +@end + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMTheme.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMTheme.m new file mode 100644 index 00000000..aa7c9be0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMTheme.m @@ -0,0 +1,390 @@ +// +// GTMTheme.m +// +// Copyright 2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +#import "GTMTheme.h" +#import "GTMNSColor+Luminance.h" + +static GTMTheme *gGTMDefaultTheme = nil; +NSString *kGTMThemeDidChangeNotification = @"kGTMThemeDidChangeNotification"; + +@interface GTMTheme () +- (void)bindToUserDefaults; +- (void)sendChangeNotification; +@end + +@implementation GTMTheme + ++ (void)setDefaultTheme:(GTMTheme *)theme { + if (gGTMDefaultTheme != theme) { + [gGTMDefaultTheme release]; + gGTMDefaultTheme = [theme retain]; + [gGTMDefaultTheme sendChangeNotification]; + } +} + ++ (GTMTheme *)defaultTheme { + @synchronized (self) { + if (!gGTMDefaultTheme) { + gGTMDefaultTheme = [[self alloc] init]; + [gGTMDefaultTheme bindToUserDefaults]; + } + } + return gGTMDefaultTheme; +} + +- (void)bindToUserDefaults { + NSUserDefaultsController * controller + = [NSUserDefaultsController sharedUserDefaultsController]; + [self bind:@"backgroundColor" + toObject:controller + withKeyPath:@"values.GTMThemeBackgroundColor" + options:[NSDictionary dictionaryWithObjectsAndKeys: + NSUnarchiveFromDataTransformerName, + NSValueTransformerNameBindingOption, + nil]]; + + [self bind:@"backgroundImage" + toObject:controller + withKeyPath:@"values.GTMThemeBackgroundImageData" + options:[NSDictionary dictionaryWithObjectsAndKeys: + NSUnarchiveFromDataTransformerName, + NSValueTransformerNameBindingOption, + nil]]; +} + +- (id)init { + self = [super init]; + if (self != nil) { + values_ = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (void)finalize { + [self unbind:@"backgroundColor"]; + [self unbind:@"backgroundImage"]; + [super finalize]; +} + +- (void)dealloc { + [self unbind:@"backgroundColor"]; + [self unbind:@"backgroundImage"]; + [values_ release]; + [super dealloc]; +} + +- (void)sendChangeNotification { + [[NSNotificationCenter defaultCenter] + postNotificationName:kGTMThemeDidChangeNotification + object:self]; +} + +- (id)keyForSelector:(SEL)selector + style:(GTMThemeStyle)style + active:(BOOL)active { + return [NSString stringWithFormat:@"%p.%d.%d", selector, style, active]; +} + +- (id)valueForSelector:(SEL)selector + style:(GTMThemeStyle)style + active:(BOOL)active { + id value = [values_ objectForKey: + [self keyForSelector:selector style:style active:active]]; + return value; +} + +- (void)cacheValue:(id)value + forSelector:(SEL)selector + style:(GTMThemeStyle)style + active:(BOOL)active { + id key = [self keyForSelector:selector style:style active:active]; + if (key && value) [values_ setObject:value forKey:key]; +} + +- (void)setBackgroundColor:(NSColor *)value { + if (backgroundColor_ != value) { + [backgroundColor_ release]; + backgroundColor_ = [value retain]; + [values_ removeAllObjects]; + [self sendChangeNotification]; + } +} +- (NSColor *)backgroundColor { + // For nil, we return a color that works with a normal textured window + if (!backgroundColor_) + return [NSColor colorWithCalibratedWhite:0.75 alpha:1.0]; + return backgroundColor_; +} + +- (void)setBackgroundImage:(NSImage *)value { + if (backgroundImage_ != value) { + [backgroundImage_ release]; + backgroundImage_ = [value retain]; + [self sendChangeNotification]; + } +} + +- (NSColor *)windowBackgroundColor:(BOOL)active { + NSColor *color = nil; + if (backgroundImage_) { + // TODO(alcor): dim images when disabled + color = [NSColor colorWithPatternImage:backgroundImage_]; + } else if (backgroundColor_) { + color = [self patternColorForStyle:GTMThemeStyleWindow active:active]; + } + return color; +} + +- (NSImage *)backgroundImage { + return backgroundImage_; +} + +- (NSBackgroundStyle)interiorBackgroundStyleForStyle:(GTMThemeStyle)style + active:(BOOL)active { + id value = [self valueForSelector:_cmd style:style active:active]; + if (value) return [value intValue]; + + NSGradient *gradient = [self gradientForStyle:style active:active]; + NSColor *color = [gradient interpolatedColorAtLocation:0.5]; + BOOL dark = [color gtm_isDarkColor]; + value = [NSNumber numberWithInt: dark ? NSBackgroundStyleLowered + : NSBackgroundStyleRaised]; + [self cacheValue:value forSelector:_cmd style:style active:active]; + return [value intValue]; +} + +- (BOOL)styleIsDark:(GTMThemeStyle)style active:(BOOL)active { + id value = [self valueForSelector:_cmd style:style active:active]; + if (value) return [value boolValue]; + + if (style == GTMThemeStyleToolBarButtonPressed) { + value = [NSNumber numberWithBool:YES]; + } else { + value = [NSNumber numberWithBool:[[self backgroundColor] gtm_isDarkColor]]; + } + [self cacheValue:value forSelector:_cmd style:style active:active]; + return [value boolValue]; +} + +- (NSColor *)patternColorForStyle:(GTMThemeStyle)style active:(BOOL)active { + NSColor *color = [self valueForSelector:_cmd style:style active:active]; + if (color) return color; + + NSGradient *gradient = [self gradientForStyle:style active:active]; + if (gradient) { + // create a gradient image for the background + CGRect r = CGRectZero; + // TODO(alcor): figure out a better way to get an image that is the right + // size + r.size = CGSizeMake(4, 36); + size_t bytesPerRow = 4 * r.size.width; + + CGColorSpaceRef space = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); + CGContextRef context = CGBitmapContextCreate(NULL, + r.size.width, + r.size.height, + 8, + bytesPerRow, + space, + kCGImageAlphaPremultipliedFirst); + CGColorSpaceRelease(space); + NSGraphicsContext *nsContext + = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:YES]; + [NSGraphicsContext saveGraphicsState]; + [NSGraphicsContext setCurrentContext:nsContext]; + [gradient drawInRect:NSMakeRect(0, 0, r.size.width, r.size.height) + angle:270]; + [NSGraphicsContext restoreGraphicsState]; + + CGImageRef cgImage = CGBitmapContextCreateImage(context); + CGContextRelease(context); + NSBitmapImageRep *rep = nil; + if (cgImage) { + rep = [[[NSBitmapImageRep alloc] initWithCGImage:cgImage] + autorelease]; + CGImageRelease(cgImage); + } + + NSImage *image = [[[NSImage alloc] initWithSize:NSSizeFromCGSize(r.size)] + autorelease]; + [image addRepresentation:rep]; + + color = [NSColor colorWithPatternImage:image]; + } + [self cacheValue:color forSelector:_cmd style:style active:active]; + return color; +} + +- (NSGradient *)gradientForStyle:(GTMThemeStyle)style active:(BOOL)active { + NSGradient *gradient = [self valueForSelector:_cmd style:style active:active]; + if (gradient) return gradient; + + BOOL useDarkColors = backgroundImage_ != nil || style == GTMThemeStyleWindow; + + NSUInteger uses[4]; + if (useDarkColors) { + uses[0] = GTMColorationBaseHighlight; + uses[1] = GTMColorationBaseMidtone; + uses[2] = GTMColorationBaseShadow; + uses[3] = GTMColorationBasePenumbra; + } else { + uses[0] = GTMColorationLightHighlight; + uses[1] = GTMColorationLightMidtone; + uses[2] = GTMColorationLightShadow; + uses[3] = GTMColorationLightPenumbra; + } + NSColor *backgroundColor = [self backgroundColor]; + switch (style) { + case GTMThemeStyleTabBarDeselected: { + NSColor *startColor = [[backgroundColor gtm_colorAdjustedFor:uses[2] + faded:!active] + colorWithAlphaComponent:0.667]; + NSColor *endColor = [[backgroundColor gtm_colorAdjustedFor:uses[2] + faded:!active] + colorWithAlphaComponent:0.667]; + + gradient = [[[NSGradient alloc] initWithStartingColor:startColor + endingColor:endColor] + autorelease]; + break; + } + case GTMThemeStyleTabBarSelected: { + NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[0] + faded:!active]; + NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[1] + faded:!active]; + gradient = [[[NSGradient alloc] initWithStartingColor:startColor + endingColor:endColor] + autorelease]; + break; + } + case GTMThemeStyleWindow: { + CGFloat luminance = [backgroundColor gtm_luminance]; + + // Adjust luminance so it never hits black + if (luminance < 0.5) { + CGFloat adjustment = (0.5 - luminance) / 1.5; + backgroundColor + = [backgroundColor gtm_colorByAdjustingLuminance:adjustment]; + } + NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[1] + faded:!active]; + NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[2] + faded:!active]; + + + if (!active) { + startColor = [startColor gtm_colorByAdjustingLuminance:0.1 + saturation:0.5]; + endColor = [endColor gtm_colorByAdjustingLuminance:0.1 + saturation:0.5]; + + } + gradient = [[[NSGradient alloc] initWithStartingColor:startColor + endingColor:endColor] + autorelease]; + break; + } + case GTMThemeStyleToolBar: { + NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[1] + faded:!active]; + NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[2] + faded:!active]; + gradient = [[[NSGradient alloc] initWithStartingColor:startColor + endingColor:endColor] + autorelease]; + break; + } + case GTMThemeStyleToolBarButton: { + NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[0] + faded:!active]; + NSColor *midColor = [backgroundColor gtm_colorAdjustedFor:uses[1] + faded:!active]; + NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[2] + faded:!active]; + NSColor *glowColor = [backgroundColor gtm_colorAdjustedFor:uses[3] + faded:!active]; + + gradient = [[[NSGradient alloc] initWithColorsAndLocations: + startColor, 0.0, + midColor, 0.5, + endColor, 0.9, + glowColor, 1.0, + nil] autorelease]; + break; + } + case GTMThemeStyleToolBarButtonPressed: { + NSColor *startColor = [backgroundColor + gtm_colorAdjustedFor:GTMColorationBaseShadow + faded:!active]; + NSColor *endColor = [backgroundColor + gtm_colorAdjustedFor:GTMColorationBaseMidtone + faded:!active]; + gradient = [[[NSGradient alloc] initWithStartingColor:startColor + endingColor:endColor] + autorelease]; + break; + } + case GTMThemeStyleBookmarksBar: { + NSColor *startColor = [backgroundColor gtm_colorAdjustedFor:uses[2] + faded:!active]; + NSColor *endColor = [backgroundColor gtm_colorAdjustedFor:uses[3] + faded:!active]; + + gradient = [[[NSGradient alloc] initWithStartingColor:startColor + endingColor:endColor] + autorelease]; + + break; + } + default: + _GTMDevLog(@"Unexpected style: %d", style); + break; + } + + [self cacheValue:gradient forSelector:_cmd style:style active:active]; + return gradient; +} + +- (NSColor *)strokeColorForStyle:(GTMThemeStyle)style active:(BOOL)active { + NSColor *color = [self valueForSelector:_cmd style:style active:active]; + if (color) return color; + NSColor *backgroundColor = [self backgroundColor]; + switch (style) { + case GTMThemeStyleToolBarButton: + color = [[backgroundColor gtm_colorAdjustedFor:GTMColorationDarkShadow + faded:!active] + colorWithAlphaComponent:0.3]; + break; + case GTMThemeStyleToolBar: + case GTMThemeStyleBookmarksBar: + default: + color = [[self backgroundColor] gtm_colorAdjustedFor:GTMColorationBaseShadow + faded:!active]; + break; + } + + [self cacheValue:color forSelector:_cmd style:style active:active]; + return color; +} + +@end + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMThemeTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMThemeTest.m new file mode 100644 index 00000000..3e37c1fe --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/AppKit/GTMThemeTest.m @@ -0,0 +1,67 @@ +// +// GTMThemeTest.m +// +// Copyright 2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +#import "GTMSenTestCase.h" +#import "GTMTheme.h" + +@interface GTMThemeTest : GTMTestCase +@end + +@implementation GTMThemeTest + +- (void)testTheming { + GTMTheme *theme = [GTMTheme defaultTheme]; + + // When there are no values, use window default colors + STAssertEqualObjects([theme backgroundColor], + [NSColor colorWithCalibratedWhite:0.75 alpha:1.0], nil); + STAssertNil([theme windowBackgroundColor:YES], nil); + STAssertNil([theme backgroundImage], nil); + + NSColor *color = [NSColor redColor]; + NSData *colorData = [NSArchiver archivedDataWithRootObject:color]; + [[NSUserDefaults standardUserDefaults] setObject:colorData + forKey:@"GTMThemeBackgroundColor"]; + + STAssertNotNil([theme windowBackgroundColor:YES], nil); + STAssertNotNil([theme patternColorForStyle:GTMThemeStyleToolBar + active:YES], nil); + STAssertNotNil([theme strokeColorForStyle:GTMThemeStyleToolBar + active:YES], nil); + STAssertNotNil([theme gradientForStyle:GTMThemeStyleToolBar + active:YES], nil); + + STAssertEqualObjects([theme backgroundColor], + color, nil); + + // TODO(alcor): add more of these cases once the constants are more concrete + STAssertEquals([theme interiorBackgroundStyleForStyle:GTMThemeStyleToolBar + active:YES], + (NSBackgroundStyle)NSBackgroundStyleRaised, nil); + + [[NSUserDefaults standardUserDefaults] removeObjectForKey: + @"GTMThemeBackgroundColor"]; +} + +@end + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/BuildScripts/BuildAllSDKs.sh b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/BuildScripts/BuildAllSDKs.sh new file mode 100644 index 00000000..32a867d4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/BuildScripts/BuildAllSDKs.sh @@ -0,0 +1,116 @@ +#!/bin/sh +# BuildAllSDKs.sh +# +# This script builds the Tiger, Leopard, SnowLeopard and iPhone versions of the +# requested target in the current basic config (debug, release, debug-gcov). +# +# Copyright 2006-2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy +# of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +GTM_PROJECT_TARGET="$1" +GTMIPHONE_PROJECT_TARGET="$2" +STARTING_TARGET="${TARGET_NAME}" +SCRIPT_APP="${TMPDIR}DoBuild.app" + +REQUESTED_BUILD_STYLE=$(echo "${BUILD_STYLE}" | sed -E "s/(.*OrLater-)?(.*)/\2/") +# See if we were told to clean instead of build. +PROJECT_ACTION="build" +if [ "${ACTION}" == "clean" ]; then + PROJECT_ACTION="clean" +fi + +# get available SDKs and PLATFORMS +AVAILABLE_MACOS_SDKS=`eval ls ${DEVELOPER_SDK_DIR}` +AVAILABLE_PLATFORMS=`eval ls ${DEVELOPER_DIR}/Platforms` + +# build up our GTMiPhone parts +GTMIPHONE_OPEN_EXTRAS="" +GTMIPHONE_BUILD_EXTRAS="" +if [ "${GTMIPHONE_PROJECT_TARGET}" != "" ]; then + GTMIPHONE_OPEN_EXTRAS=" + if \"${AVAILABLE_PLATFORMS}\" contains \"iPhoneSimulator.platform\" then + -- make sure both project files are open + open posix file \"${SRCROOT}/GTM.xcodeproj\" + open posix file \"${SRCROOT}/GTMiPhone.xcodeproj\" + end if" + GTMIPHONE_BUILD_EXTRAS=" + if \"${AVAILABLE_PLATFORMS}\" contains \"iPhoneSimulator.platform\" then + with timeout of 9999 seconds + tell project \"GTMiPhone\" + -- do the GTMiPhone build + ${PROJECT_ACTION} using build configuration \"${REQUESTED_BUILD_STYLE}\" + set active target to target \"${STARTING_TARGET}\" + end tell + end timeout + end if" +fi + +# build up our GTM AppleScript +OUR_BUILD_SCRIPT="on run + tell application \"Xcode\" + activate + ${GTMIPHONE_OPEN_EXTRAS} + if \"${AVAILABLE_PLATFORMS}\" contains \"MacOSX.platform\" then + tell project \"GTM\" + -- wait for build to finish + set x to 0 + repeat while currently building + delay 0.5 + set x to x + 1 + if x > 6 then + display alert \"GTM is still building, can't start.\" + return + end if + end repeat + -- do the GTM builds + with timeout of 9999 seconds + if \"{$AVAILABLE_MACOS_SDKS}\" contains \"MacOSX10.4u.sdk\" then + set active target to target \"${GTM_PROJECT_TARGET}\" + set buildResult to ${PROJECT_ACTION} using build configuration \"TigerOrLater-${REQUESTED_BUILD_STYLE}\" + set active target to target \"${STARTING_TARGET}\" + if buildResult is not equal to \"Build succeeded\" then + return + end if + end if + if \"{$AVAILABLE_MACOS_SDKS}\" contains \"MacOSX10.5.sdk\" then + set active target to target \"${GTM_PROJECT_TARGET}\" + set buildResult to ${PROJECT_ACTION} using build configuration \"LeopardOrLater-${REQUESTED_BUILD_STYLE}\" + set active target to target \"${STARTING_TARGET}\" + if buildResult is not equal to \"Build succeeded\" then + return + end if + end if + if \"{$AVAILABLE_MACOS_SDKS}\" contains \"MacOSX10.6.sdk\" then + set active target to target \"${GTM_PROJECT_TARGET}\" + set buildResult to ${PROJECT_ACTION} using build configuration \"SnowLeopardOrLater-${REQUESTED_BUILD_STYLE}\" + set active target to target \"${STARTING_TARGET}\" + if buildResult is not equal to \"Build succeeded\" then + return + end if + end if + end timeout + end tell + end if + ${GTMIPHONE_BUILD_EXTRAS} + end tell +end run" + +# Xcode won't actually let us spawn this and run it w/ osascript because it +# watches and waits for everything we have spawned to exit before the build is +# considered done, so instead we compile this to a script app, and then use +# open to invoke it, there by escaping our little sandbox. +# xcode defeats this: ( echo "${OUR_BUILD_SCRIPT}" | osascript - & ) +rm -rf "${SCRIPT_APP}" +echo "${OUR_BUILD_SCRIPT}" | osacompile -o "${SCRIPT_APP}" -x +open "${SCRIPT_APP}" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/BuildingAndUsing.txt b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/BuildingAndUsing.txt new file mode 100644 index 00000000..67bbd797 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/BuildingAndUsing.txt @@ -0,0 +1,18 @@ +The GTM project provides a Framework target and Unit Testing targets. + +Unit Testing Targets - + +These targets are there to make sure all of GTM is working, and reflect the +hierarchy of the source tree. + +Building the "All UnitTests" target will build all of the unittests for the +current configuration included in the GTM package. We require that "All +UnitTests" builds cleanly before we will accept any code submissions. + +Framework Target - + +These targets are there to make it easy for anyone to quickly add GTM sources +to their own project to start using it or playing around with it. However, +the intent is for a developer to manually add the sources to their project in +the end to reduce the total size of their product (since they only have to +include the parts of GTM they need). diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/COPYING b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/COPYING new file mode 100644 index 00000000..a95e82aa --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/COPYING @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2007 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugSelectorValidation.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugSelectorValidation.h new file mode 100644 index 00000000..19d8b8eb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugSelectorValidation.h @@ -0,0 +1,100 @@ +// +// GTMDebugSelectorValidation.h +// +// This file should only be included within an implimation file. In any +// function that takes an object and selector to invoke, you should call: +// +// GTMAssertSelectorNilOrImplementedWithArguments(obj, sel, @encode(arg1type), ..., NULL) +// or +// GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(obj, sel, @encode(returnType), @encode(arg1type), ..., NULL) +// +// This will then validate that the selector is defined and using the right +// type(s), this can help catch errors much earlier then waiting for the +// selector to actually fire (and in the case of error selectors, might never +// really be tested until in the field). +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#if DEBUG + +#import +#import "GTMDefines.h" + +static void GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(id obj, SEL sel, const char *retType, ...) { + + // verify that the object's selector is implemented with the proper + // number and type of arguments + va_list argList; + va_start(argList, retType); + + if (obj && sel) { + // check that the selector is implemented + _GTMDevAssert([obj respondsToSelector:sel], + @"\"%@\" selector \"%@\" is unimplemented or misnamed", + NSStringFromClass([obj class]), + NSStringFromSelector(sel)); + + const char *expectedArgType; + NSUInteger argCount = 2; // skip self and _cmd + NSMethodSignature *sig = [obj methodSignatureForSelector:sel]; + + // check that each expected argument is present and of the correct type + while ((expectedArgType = va_arg(argList, const char*)) != 0) { + + if ([sig numberOfArguments] > argCount) { + const char *foundArgType = [sig getArgumentTypeAtIndex:argCount]; + + _GTMDevAssert(0 == strncmp(foundArgType, expectedArgType, strlen(expectedArgType)), + @"\"%@\" selector \"%@\" argument %d should be type %s", + NSStringFromClass([obj class]), + NSStringFromSelector(sel), + (argCount - 2), + expectedArgType); + } + argCount++; + } + + // check that the proper number of arguments are present in the selector + _GTMDevAssert(argCount == [sig numberOfArguments], + @"\"%@\" selector \"%@\" should have %d arguments", + NSStringFromClass([obj class]), + NSStringFromSelector(sel), + (argCount - 2)); + + // if asked, validate the return type + if (retType && (strcmp("gtm_skip_return_test", retType) != 0)) { + const char *foundRetType = [sig methodReturnType]; + _GTMDevAssert(0 == strncmp(foundRetType, retType, strlen(retType)), + @"\"%@\" selector \"%@\" return type should be type %s", + NSStringFromClass([obj class]), + NSStringFromSelector(sel), + retType); + } + } + + va_end(argList); +} + +#define GTMAssertSelectorNilOrImplementedWithArguments(obj, sel, ...) \ + GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments((obj), (sel), "gtm_skip_return_test", __VA_ARGS__) + +#else // DEBUG + +// make it go away if not debug +#define GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(obj, sel, retType, ...) do { } while (0) +#define GTMAssertSelectorNilOrImplementedWithArguments(obj, sel, ...) do { } while (0) + +#endif // DEBUG diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidation.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidation.h new file mode 100644 index 00000000..0636159c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidation.h @@ -0,0 +1,55 @@ +// +// GTMDebugThreadValidation.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#if DEBUG +#import "GTMDefines.h" +#import + +// GTMAssertRunningOnMainThread will allow you to verify that you are +// currently running on the main thread. This can be useful for checking +// under DEBUG to make sure that code that requires being run on the main thread +// is doing so. Use the GTMAssertRunningOnMainThread macro, don't use +// the _GTMAssertRunningOnMainThread or _GTMIsRunningOnMainThread +// helper functions. + +// On Leopard and above we can just use NSThread functionality. +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +BOOL _GTMIsRunningOnMainThread(void); +#else // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +#import +GTM_INLINE BOOL _GTMIsRunningOnMainThread(void) { + return [NSThread isMainThread]; +} +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + +GTM_INLINE void _GTMAssertRunningOnMainThread(const char *func, + const char *file, + int lineNum) { + _GTMDevAssert(_GTMIsRunningOnMainThread(), + @"%s not being run on main thread (%s - %d)", + func, file, lineNum); +} + +#define GTMAssertRunningOnMainThread() \ + (_GTMAssertRunningOnMainThread(__func__, __FILE__, __LINE__)) + +#else // DEBUG + +#define GTMAssertRunningOnMainThread() do { } while (0) + +#endif // DEBUG diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidation.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidation.m new file mode 100644 index 00000000..5889cd88 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidation.m @@ -0,0 +1,38 @@ +// +// GTMDebugThreadValidation.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + + +#if DEBUG && MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + +#import "GTMDebugThreadValidation.h" + +static NSThread *gGTMMainThread = nil; + +static __attribute__((constructor)) void _GTMInitThread(void) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + gGTMMainThread = [NSThread currentThread]; + [gGTMMainThread retain]; + [pool release]; +} + + +BOOL _GTMIsRunningOnMainThread(void) { + return [[NSThread currentThread] isEqual:gGTMMainThread]; +} + +#endif // DEBUG && MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidationTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidationTest.m new file mode 100644 index 00000000..66bd51b7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMDebugThreadValidationTest.m @@ -0,0 +1,110 @@ +// +// GTMDebugThreadValidationTest.m +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMDebugThreadValidation.h" + +// GTMDebugThreadValidation only happens on debug builds +#if DEBUG + +@interface GTMDebugThreadValidationTest : GTMTestCase +@end + +// A cheap flag for knowing when our thread has run + +static volatile BOOL gGTMDebugThreadValidationTestDone = NO; + +// This is an assertion handler that just records that an assertion has fired. +@interface GTMDebugThreadValidationCheckAssertionHandler : NSAssertionHandler { + @private + BOOL handledAssertion_; +} +- (void)handleFailureInMethod:(SEL)selector + object:(id)object + file:(NSString *)fileName + lineNumber:(NSInteger)line + description:(NSString *)format,...; + +- (void)handleFailureInFunction:(NSString *)functionName + file:(NSString *)fileName + lineNumber:(NSInteger)line + description:(NSString *)format,...; +- (BOOL)didHandleAssertion; +@end + +@implementation GTMDebugThreadValidationTest +- (void)testOnMainThread { + STAssertNoThrow(GTMAssertRunningOnMainThread(), nil); +} + +- (void)threadFunc:(NSMutableString *)result { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + // We'll insert our own assertion handler that will get called on the assert + // so that we don't have to worry about the log, and exception being thrown. + GTMDebugThreadValidationCheckAssertionHandler *handler = + [[[GTMDebugThreadValidationCheckAssertionHandler alloc] init] autorelease]; + NSMutableDictionary *threadDictionary + = [[NSThread currentThread] threadDictionary]; + [threadDictionary setObject:handler forKey:@"NSAssertionHandler"]; + GTMAssertRunningOnMainThread(); + if ([handler didHandleAssertion]) { + [result setString:@"ASSERTED"]; + } + [threadDictionary removeObjectForKey:@"NSAssertionHandler"]; + gGTMDebugThreadValidationTestDone = YES; + [pool release]; +} + +- (void)testOnOtherThread { + NSMutableString *result = [NSMutableString string]; + gGTMDebugThreadValidationTestDone = NO; + [NSThread detachNewThreadSelector:@selector(threadFunc:) + toTarget:self + withObject:result]; + NSRunLoop *loop = [NSRunLoop currentRunLoop]; + + while (!gGTMDebugThreadValidationTestDone) { + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0.01]; + [loop runUntilDate:date]; + } + STAssertEqualStrings(result, @"ASSERTED", @"GTMAssertRunningOnMainThread did " + @"not assert while running on another thread"); +} +@end + +@implementation GTMDebugThreadValidationCheckAssertionHandler + +- (void)handleFailureInMethod:(SEL)selector + object:(id)object + file:(NSString *)fileName + lineNumber:(NSInteger)line + description:(NSString *)format,... { + handledAssertion_ = YES; +} + +- (void)handleFailureInFunction:(NSString *)functionName + file:(NSString *)fileName + lineNumber:(NSInteger)line + description:(NSString *)format,... { + handledAssertion_ = YES; +} + +- (BOOL)didHandleAssertion { + return handledAssertion_; +} +@end +#endif // DEBUG diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheck.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheck.h new file mode 100644 index 00000000..7b0919b0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheck.h @@ -0,0 +1,88 @@ +// +// GTMMethodCheck.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import +#import + +/// A macro for enforcing debug time checks to make sure all required methods are linked in +// +// When using categories, it can be very easy to forget to include the +// implementation of a category. +// Let's say you had a class foo that depended on method bar of class baz, and +// method bar was implemented as a member of a category. +// You could add the following code: +// @implementation foo +// GTM_METHOD_CHECK(baz, bar) +// @end +// and the code would check to make sure baz was implemented just before main +// was called. This works for both dynamic libraries, and executables. +// +// Classes (or one of their superclasses) being checked must conform to the +// NSObject protocol. We will check this, and spit out a warning if a class does +// not conform to NSObject. +// +// This is not compiled into release builds. + +#ifdef DEBUG + +#ifdef __cplusplus +extern "C" { +#endif + +// If you get an error for GTMMethodCheckMethodChecker not being defined, +// you need to link in GTMMethodCheck.m. We keep it hidden so that we can have +// it living in several separate images without conflict. +// Functions with the ((constructor)) attribute are called after all +loads +// have been called. See "Initializing Objective-C Classes" in +// http://developer.apple.com/documentation/DeveloperTools/Conceptual/DynamicLibraries/Articles/DynamicLibraryDesignGuidelines.html#//apple_ref/doc/uid/TP40002013-DontLinkElementID_20 + +__attribute__ ((constructor, visibility("hidden"))) void GTMMethodCheckMethodChecker(void); + +#ifdef __cplusplus +}; +#endif + +// This is the "magic". +// A) we need a multi layer define here so that the stupid preprocessor +// expands __LINE__ out the way we want it. We need LINE so that each of +// out GTM_METHOD_CHECKs generates a unique class method for the class. +#define GTM_METHOD_CHECK(class, method) GTM_METHOD_CHECK_INNER(class, method, __LINE__) +#define GTM_METHOD_CHECK_INNER(class, method, line) GTM_METHOD_CHECK_INNER_INNER(class, method, line) + +// B) Create up a class method called xxGMethodCheckMethod+class+line that the +// GTMMethodCheckMethodChecker function can look for and call. We +// look for GTMMethodCheckMethodChecker to enforce linkage of +// GTMMethodCheck.m. +#define GTM_METHOD_CHECK_INNER_INNER(class, method, line) \ ++ (void)xxGTMMethodCheckMethod ## class ## line { \ + void (*addr)() = GTMMethodCheckMethodChecker; \ + if (addr && ![class instancesRespondToSelector:@selector(method)] \ + && ![class respondsToSelector:@selector(method)]) { \ + fprintf(stderr, "%s:%d: error: We need method '%s' to be linked in for class '%s'\n", \ + __FILE__, line, #method, #class); \ + exit(EX_SOFTWARE); \ + } \ +} + +#else // !DEBUG + +// Do nothing in release. +#define GTM_METHOD_CHECK(class, method) + +#endif // DEBUG diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheck.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheck.m new file mode 100644 index 00000000..2f88dc36 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheck.m @@ -0,0 +1,163 @@ +// +// GTMMethodCheck.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Don't want any of this in release builds +#ifdef DEBUG +#import "GTMDefines.h" +#import "GTMMethodCheck.h" +#import "GTMObjC2Runtime.h" +#import + +// Checks to see if the cls passed in (or one of it's superclasses) conforms +// to NSObject protocol. Inheriting from NSObject is the easiest way to do this +// but not all classes (i.e. NSProxy) inherit from NSObject. Also, some classes +// inherit from Object instead of NSObject which is fine, and we'll count as +// conforming to NSObject for our needs. +static BOOL ConformsToNSObjectProtocol(Class cls) { + // If we get nil, obviously doesn't conform. + if (!cls) return NO; + const char *className = class_getName(cls); + if (!className) return NO; + + // We're going to assume that all Apple classes will work + // (and aren't being checked) + // Note to apple: why doesn't obj-c have real namespaces instead of two + // letter hacks? If you name your own classes starting with NS this won't + // work for you. + // Some classes (like _NSZombie) start with _NS. + // On Leopard we have to look for CFObject as well. + // On iPhone we check Object as well + if ((strncmp(className, "NS", 2) == 0) + || (strncmp(className, "_NS", 3) == 0) + || (strcmp(className, "CFObject") == 0) +#if GTM_IPHONE_SDK + || (strcmp(className, "Object") == 0) +#endif + ) { + return YES; + } + +// iPhone SDK does not define the |Object| class, so we instead test for the +// |NSObject| class. +#if GTM_IPHONE_SDK + // Iterate through all the protocols |cls| supports looking for NSObject. + if (cls == [NSObject class] + || class_conformsToProtocol(cls, @protocol(NSObject))) { + return YES; + } +#else + // Iterate through all the protocols |cls| supports looking for NSObject. + if (cls == [Object class] + || class_conformsToProtocol(cls, @protocol(NSObject))) { + return YES; + } +#endif + + // Recursively check the superclasses. + return ConformsToNSObjectProtocol(class_getSuperclass(cls)); +} + +void GTMMethodCheckMethodChecker(void) { + // Run through all the classes looking for class methods that are + // prefixed with xxGMMethodCheckMethod. If it finds one, it calls it. + // See GTMMethodCheck.h to see what it does. + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + int numClasses = 0; + int newNumClasses = objc_getClassList(NULL, 0); + int i; + Class *classes = NULL; + while (numClasses < newNumClasses) { + numClasses = newNumClasses; + classes = realloc(classes, sizeof(Class) * numClasses); + _GTMDevAssert(classes, @"Unable to allocate memory for classes"); + newNumClasses = objc_getClassList(classes, numClasses); + } + for (i = 0; i < numClasses && classes; ++i) { + Class cls = classes[i]; + + // Since we are directly calling objc_msgSend, we need to conform to + // @protocol(NSObject), or else we will tumble into a _objc_msgForward + // recursive loop when we try and call a function by name. + if (!ConformsToNSObjectProtocol(cls)) { + // COV_NF_START + _GTMDevLog(@"GTMMethodCheckMethodChecker: Class %s does not conform to " + "@protocol(NSObject), so won't be checked", + class_getName(cls)); + continue; + // COV_NF_END + } + // Since we are looking for a class method (+xxGMMethodCheckMethod...) + // we need to query the isa pointer to see what methods it support, but + // send the method (if it's supported) to the class itself. + unsigned int count; + Class metaClass = objc_getMetaClass(class_getName(cls)); + Method *methods = class_copyMethodList(metaClass, &count); + unsigned int j; + for (j = 0; j < count; ++j) { + SEL selector = method_getName(methods[j]); + const char *name = sel_getName(selector); + if (strstr(name, "xxGTMMethodCheckMethod") == name) { + // Check to make sure that the method we are checking comes + // from the same image that we are in. Since GTMMethodCheckMethodChecker + // is not exported, we should always find the copy in our local + // image. We compare the address of it's image with the address of + // the image which implements the method we want to check. If + // they match we continue. This does two things: + // a) minimizes the amount of calls we make to the xxxGTMMethodCheck + // methods. They should only be called once. + // b) prevents initializers for various classes being called too early + Dl_info methodCheckerInfo; + if (!dladdr(GTMMethodCheckMethodChecker, + &methodCheckerInfo)) { + // COV_NF_START + // Don't know how to force this case in a unittest. + // Certainly hope we never see it. + _GTMDevLog(@"GTMMethodCheckMethodChecker: Unable to get dladdr info " + "for GTMMethodCheckMethodChecker while introspecting +[%@ %@]]", + class_getName(cls), name); + continue; + // COV_NF_END + } + Dl_info methodInfo; + if (!dladdr(method_getImplementation(methods[j]), + &methodInfo)) { + // COV_NF_START + // Don't know how to force this case in a unittest + // Certainly hope we never see it. + _GTMDevLog(@"GTMMethodCheckMethodChecker: Unable to get dladdr info " + "for %@ while introspecting +[%@ %@]]", name, + class_getName(cls), name); + continue; + // COV_NF_END + } + if (methodCheckerInfo.dli_fbase == methodInfo.dli_fbase) { + objc_msgSend(cls, selector); + } + } + } + if (methods) { + free(methods); + } + } + if (classes) { + free(classes); + } + [pool release]; +} + +#endif // DEBUG diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheckTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheckTest.m new file mode 100644 index 00000000..974dfafd --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/DebugUtils/GTMMethodCheckTest.m @@ -0,0 +1,53 @@ +// +// GTMMethodCheckTest.m +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMMethodCheck.h" + +static BOOL gTestCheckVar = NO; + +@interface GTMMethodCheckTest : GTMTestCase ++ (void)GTMMethodCheckTestClassMethod; +@end + +@implementation GTMMethodCheckTest +GTM_METHOD_CHECK(GTMMethodCheckTest, GTMMethodCheckTestMethod); +GTM_METHOD_CHECK(GTMMethodCheckTest, GTMMethodCheckTestClassMethod); + +- (void)GTMMethodCheckTestMethod { +} + ++ (void)GTMMethodCheckTestClassMethod { +} + ++ (void)xxGTMMethodCheckMethodTestCheck { + // This gets called because of its special name by GMMethodCheck + // Look at the Macros in GMMethodCheck.h for details. + gTestCheckVar = YES; +} + +- (void)testGTMMethodCheck { +#ifdef DEBUG + // GTMMethodCheck only runs in debug + STAssertTrue(gTestCheckVar, @"Should be true"); +#endif + + // Next two calls just verify our code coverage + [self GTMMethodCheckTestMethod]; + [[self class] GTMMethodCheckTestClassMethod]; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListener.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListener.h new file mode 100644 index 00000000..e8657279 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListener.h @@ -0,0 +1,222 @@ +// +// GTMAbstractDOListener.h +// +// Copyright 2006-2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// +#import + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +@class GTMReceivePortDelegate; +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + +// Abstract base class for DO "listeners". +// A class that needs to vend itself over DO should subclass this abstract +// class. This class takes care of certain things like creating a new thread +// to handle requests, setting request/reply timeouts, and ensuring the vended +// object only gets requests that comply with the specified protocol. +// +// Subclassers will want to use the +// GTM_ABSTRACTDOLISTENER_SUBCLASS_THREADMAIN_IMPL macro for easier debugging +// of stack traces. Please read it's description below. +// +@interface GTMAbstractDOListener : NSObject { + @protected + NSString *registeredName_; + __weak Protocol *protocol_; + NSConnection *connection_; + BOOL isRunningInNewThread_; + BOOL shouldShutdown_; + NSTimeInterval requestTimeout_; + NSTimeInterval replyTimeout_; + NSPort *port_; + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + GTMReceivePortDelegate *receivePortDelegate_; // Strong (only used on Tiger) +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +} + +// Returns a set of all live instances of GTMAbstractDOListener subclasses. +// If no listeners have been created, this will return an empty array--not nil. +// +// TODO: Remove this method +// ++ (NSArray *)allListeners; + +// Initializer. This actually calls +// initWithRegisteredName:protocol:port with [NSMachPort port] as the port. +// +// Args: +// name - the name that the object will register under +// proto - the protocol that this object (self) should conform to +// +- (id)initWithRegisteredName:(NSString *)name protocol:(Protocol *)proto; + +// The designated initializer. +// +// Args: +// name - the name used to register the port. While not necessarily required +// for an NSSocketPort this class still requires it. +// proto - the protocol that this object (self) should conform to +// port - the port to be used when creating the NSConnection. If a NSMachPort +// is being used then initWithRegisteredName:protocol is recommended. +// Otherwise the port must be allocted by the caller. +// +- (id)initWithRegisteredName:(NSString *)name + protocol:(Protocol *)proto + port:(NSPort *)port; + +// Returns the name that this server will register with the +// mach port name sever. This is the name of the port that this class +// will "listen" on when -runInNewThread is called. +// +// Returns: +// The registered name as a string +// +- (NSString *)registeredName; + +// Sets the registered name to use when listening over DO. This only makes +// sense to be called before -runInNewThread has been called, because +// -runInNewThread will listen on this "registered name", so setting it +// afterwards would do nothing. +// +// Args: +// name - the name to register under. May not be nil. +// +- (void)setRegisteredName:(NSString *)name; + +// Get/set the request timeout interval. If set to a value less than 0, +// the default DO connection timeout will be used (maximum possible value). +// +- (NSTimeInterval)requestTimeout; +- (void)setRequestTimeout:(NSTimeInterval)timeout; + +// Get/set the reply timeout interval. If set to a value less than 0, +// the default DO connection timeout will be used (maximum possible value). +// +- (NSTimeInterval)replyTimeout; +- (void)setReplyTimeout:(NSTimeInterval)timeout; + +// Returns the listeners associated NSConnection. May be nil if no connection +// has been setup yet. +// +- (NSConnection *)connection; + +// Starts the DO system listening using the current thread and current runloop. +// It only makes sense to call this method -OR- -runInNewThread, but not both. +// Returns YES if it was able to startup the DO listener, NO otherwise. +// +- (BOOL)runInCurrentThread; + +// Starts the DO system listening, and creates a new thread to handle the DO +// connections. It only makes sense to call this method -OR- +// -runInCurrentThread, but not both. +// if |errObject| is non nil, it will be used along with |selector| and +// |argument| to signal that the startup of the listener in the new thread +// failed. The actual selector will be invoked back on the main thread so +// it does not have to be thread safe. +// The most basic way to call this method is as follows: +// [listener runInNewThreadWithErrorTarget:nil +// selector:NULL +// withObjectArgument:nil]; +// +// Note: Using the example above you will not know if the listener failed to +// startup due to some error. +// +- (void)runInNewThreadWithErrorTarget:(id)errObject + selector:(SEL)selector + withObjectArgument:(id)argument; + +// Shuts down the connection. If it was running in a new thread, that thread +// should exit (within about 10 seconds). This call does not block. +// +// NOTE: This method is called in -dealloc, so if -runInNewThread had previously +// been called, -dealloc will return *before* the thread actually exits. This +// can be a problem as "self" may be gone before the thread exits. This is a +// bug and needs to be fixed. Currently, to be safe, only call -shutdown if +// -runInCurrentThread had previously been called. +// +- (void)shutdown; + +@end + + +// Methods that subclasses may implement to vary the behavior of this abstract +// class. +// +@interface GTMAbstractDOListener (GTMAbstractDOListenerSubclassMethods) + +// Called by the -runIn* methods. In the case where a new thread is being used, +// this method is called on the new thread. The default implementation of this +// method just returns YES, but subclasses can override it to do subclass +// specific initialization. If this method returns NO, the -runIn* method that +// called it will fail with an error. +// +// Returns: +// YES if the -runIn* method should continue successfully, NO if the it should +// fail. +// +- (BOOL)doRunInitialization; + +// Called as the "main" for the thread spun off by GTMAbstractDOListener. +// Not really for use by subclassers, except to use the +// GTMABSTRACTDOLISTENER_SUBCLASS_THREADMAIN_IMPL macro defined below. +// +// This method runs forever in a new thread. This method actually starts the +// DO connection listening. +// +- (void)threadMain:(NSInvocation *)failureCallback; + +@end + +// GTMAbstractDOListeners used to be hard to debug because crashes in their +// stacks looked like this: +// +// #0 0x90009cd7 in mach_msg_trap () +// #1 0x90009c38 in mach_msg () +// #2 0x9082d2b3 in CFRunLoopRunSpecific () +// #3 0x9082cace in CFRunLoopRunInMode () +// #4 0x9282ad3a in -[NSRunLoop runMode:beforeDate:] () +// #5 0x928788e4 in -[NSRunLoop runUntilDate:] () +// #6 0x00052696 in -[GTMAbstractDOListener(GTMAbstractDOListenerSubclassMethods) threadMain:] ... +// #7 0x927f52e0 in forkThreadForFunction () +// #8 0x90024227 in _pthread_body () +// +// and there was no good way to figure out what thread had the problem because +// they all originated from +// -[GTMAbstractDOListener(GTMAbstractDOListenerSubclassMethods) threadMain:] +// +// If you add GTMABSTRACTDOLISTENER_SUBCLASS_THREADMAIN_IMPL to the impl of your +// subclass you will get a stack that looks like this: +// #0 0x90009cd7 in mach_msg_trap () +// #1 0x90009c38 in mach_msg () +// #2 0x9082d2b3 in CFRunLoopRunSpecific () +// #3 0x9082cace in CFRunLoopRunInMode () +// #4 0x9282ad3a in -[NSRunLoop runMode:beforeDate:] () +// #5 0x928788e4 in -[NSRunLoop runUntilDate:] () +// #6 0x00052696 in -[GTMAbstractDOListener(GTMAbstractDOListenerSubclassMethods) threadMain:] ... +// #7 0x0004b35c in -[GDStatsListener threadMain:] +// #8 0x927f52e0 in forkThreadForFunction () #9 0x90024227 in _pthread_body () +// +// so we can see that this was the GDStatsListener thread that failed. +// It will look something like this +// @implemetation MySubclassOfGTMAbstractDOListenerSubclassMethods +// GTM_ABSTRACTDOLISTENER_SUBCLASS_THREADMAIN_IMPL +// .... +// @end + +#define GTM_ABSTRACTDOLISTENER_SUBCLASS_THREADMAIN_IMPL \ + - (void)threadMain:(NSInvocation *)failureCallback { \ + [super threadMain:failureCallback]; \ + } diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListener.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListener.m new file mode 100644 index 00000000..772960bb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListener.m @@ -0,0 +1,438 @@ +// +// GTMAbstractDOListener.m +// +// Copyright 2006-2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMAbstractDOListener.h" +#import "GTMSystemVersion.h" +#import + +// Hack workaround suggested by DTS for the DO deadlock bug. Basically, this +// class intercepts the delegate role for DO's receive port (which is an +// NSMachPort). When -handlePortMessage: is called, it verifies that the send +// and receive ports are not nil, then forwards the message on to the original +// delegate. If the ports are nil, then the resulting NSConnection would +// eventually cause us to deadlock. In this case, it simply ignores the +// message. This is only need on Tiger. +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +@interface GTMReceivePortDelegate : NSObject { + __weak id delegate_; +} +- (id)initWithDelegate:(id)delegate; +- (void)handlePortMessage:(NSPortMessage *)message; +@end +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + +@interface GTMAbstractDOListener (PrivateMethods) +- (BOOL)startListening; +- (void)stopListening; + +// Returns a description of the port based on the type of port. +- (NSString *)portDescription; + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +// Uses the GTMReceivePortDelegate hack (see comments above) if we're on Tiger. +- (void)hackaroundTigerDOWedgeBug:(NSConnection *)conn; +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +@end + +// Static global set that holds a pointer to all instances of +// GTMAbstractDOListener subclasses. +// +static NSMutableSet *gAllListeners = nil; + +@implementation GTMAbstractDOListener + ++ (void)initialize { + if (self == [GTMAbstractDOListener class]) { + // We create the set using CFSetCreateMutable because we don't + // want to retain things in this set. If we retained things in the + // set we would never be able to dealloc ourselves because we + // add "self" to this set in it's init routine would cause an + // extra retain to be added to it. + gAllListeners = (NSMutableSet*)CFSetCreateMutable(NULL, 0, NULL); + } +} + ++ (NSArray *)allListeners { + // We return an NSArray instead of an NSSet here because NSArrays look nicer + // when displayed as %@ + NSArray *allListeners = nil; + + @synchronized (gAllListeners) { + allListeners = [gAllListeners allObjects]; + } + return allListeners; +} + +- (id)init { + return [self initWithRegisteredName:nil protocol:NULL]; +} + +- (id)initWithRegisteredName:(NSString *)name protocol:(Protocol *)proto { + return [self initWithRegisteredName:name + protocol:proto + port:[NSMachPort port]]; +} + +- (id)initWithRegisteredName:(NSString *)name + protocol:(Protocol *)proto + port:(NSPort *)port { + self = [super init]; + if (!self) { + return nil; + } + + if ((!proto) || (!port) || (!name)) { + if (!proto) { + _GTMDevLog(@"Failed to create a listener, a protocol must be specified"); + } + + if (!port) { + _GTMDevLog(@"Failed to create a listener, a port must be specified"); + } + + if (!name) { + _GTMDevLog(@"Failed to create a listener, a name must be specified"); + } + + [self release]; + return nil; + } + + registeredName_ = [name copy]; + protocol_ = proto; // Can't retain protocols + port_ = [port retain]; + + requestTimeout_ = -1; + replyTimeout_ = -1; + + _GTMDevAssert(gAllListeners, @"gAllListeners is not nil"); + @synchronized (gAllListeners) { + [gAllListeners addObject:self]; + } + + return self; +} + +- (void)dealloc { + _GTMDevAssert(gAllListeners, @"gAllListeners is not nil"); + @synchronized (gAllListeners) { + [gAllListeners removeObject:self]; + } + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + [receivePortDelegate_ release]; +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + + [self shutdown]; + [port_ release]; + [registeredName_ release]; + [super dealloc]; +} + + +#pragma mark Getters and Setters + +- (NSString *)registeredName { + return registeredName_; +} + +- (void)setRegisteredName:(NSString *)name { + if (!name) { + return; + } + [registeredName_ autorelease]; + registeredName_ = [name copy]; +} + +- (NSTimeInterval)requestTimeout { + return requestTimeout_; +} + +- (void)setRequestTimeout:(NSTimeInterval)timeout { + requestTimeout_ = timeout; +} + +- (NSTimeInterval)replyTimeout { + return replyTimeout_; +} + +- (void)setReplyTimeout:(NSTimeInterval)timeout { + replyTimeout_ = timeout; +} + +- (NSConnection *)connection { + return connection_; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@<%p> { name=\"%@\", %@ }", + [self class], self, registeredName_, [self portDescription]]; +} + +#pragma mark "Run" methods + +- (BOOL)runInCurrentThread { + return [self startListening]; +} + +- (void)runInNewThreadWithErrorTarget:(id)errObject + selector:(SEL)selector + withObjectArgument:(id)argument { + NSInvocation *invocation = nil; + + _GTMDevAssert(((errObject != nil && selector != NULL) || + (!errObject && !selector)), @"errObject and selector must " + @"both be nil or not nil"); + + // create an invocation we can use if things fail + if (errObject) { + NSMethodSignature *signature = + [errObject methodSignatureForSelector:selector]; + invocation = [NSInvocation invocationWithMethodSignature:signature]; + [invocation setSelector:selector]; + [invocation setTarget:errObject]; + + // If the selector they passed in takes an arg (i.e., it has at least one + // colon in the selector name), then set the first user-specified arg to be + // the |argument| they specified. The first two args are self and _cmd. + if ([signature numberOfArguments] > 2) { + [invocation setArgument:&argument atIndex:2]; + } + + [invocation retainArguments]; + } + + shouldShutdown_ = NO; + [NSThread detachNewThreadSelector:@selector(threadMain:) + toTarget:self + withObject:invocation]; +} + +- (void)shutdown { + // If we're not running in a new thread (then we're running in the "current" + // thread), tear down the NSConnection here. If we are running in a new + // thread we just set the shouldShutdown_ flag, and the thread will teardown + // the NSConnection itself. + if (!isRunningInNewThread_) { + [self stopListening]; + } else { + shouldShutdown_ = YES; + } +} + +@end + +@implementation GTMAbstractDOListener (PrivateMethods) + +- (BOOL)startListening { + BOOL result = NO; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + connection_ = [[NSConnection alloc] initWithReceivePort:port_ sendPort:nil]; + + NSProtocolChecker *checker = + [NSProtocolChecker protocolCheckerWithTarget:self + protocol:protocol_]; + + if (requestTimeout_ >= 0) { + [connection_ setRequestTimeout:requestTimeout_]; + } + + if (replyTimeout_ >= 0) { + [connection_ setReplyTimeout:replyTimeout_]; + } + + // Set the connection's root object to be the protocol checker so that only + // methods listed in the protocol_ are available via DO. + [connection_ setRootObject:checker]; + + // Allow subclasses to be the connection delegate + [connection_ setDelegate:self]; + + // Because of radar 5493309 we need to do this. [NSConnection registeredName:] + // returns NO when the connection is created using an NSSocketPort under + // Leopard. + // + // The recommendation from Apple was to use the command: + // [NSConnection registerName:withNameServer:]. + NSPortNameServer *server; + if ([port_ isKindOfClass:[NSSocketPort class]]) { + server = [NSSocketPortNameServer sharedInstance]; + } else { + server = [NSPortNameServer systemDefaultPortNameServer]; + } + + BOOL registered = [connection_ registerName:registeredName_ + withNameServer:server]; + + if (registeredName_ && registered) { +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + [self hackaroundTigerDOWedgeBug:connection_]; +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + + result = YES; + + _GTMDevLog(@"listening on %@ with name '%@'", [self portDescription], + registeredName_); + } else { + _GTMDevLog(@"failed to register %@ with %@", connection_, registeredName_); + } + + // we're good, so call the overrideable initializer + if (result) { + // Call the virtual "runIn*" initializer + result = [self doRunInitialization]; + } + + [pool drain]; + + return result; +} + +- (void)stopListening { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [connection_ invalidate]; + [connection_ release]; + connection_ = nil; + [pool drain]; +} + +- (NSString *)portDescription { + NSString *portDescription; + if ([port_ isKindOfClass:[NSMachPort class]]) { + portDescription = [NSString stringWithFormat:@"mach_port=%#x", + [(NSMachPort *)port_ machPort]]; + } else { + portDescription = [NSString stringWithFormat:@"port=%@", + [port_ description]]; + } + return portDescription; +} + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +- (void)hackaroundTigerDOWedgeBug:(NSConnection *)conn { + if ([GTMSystemVersion isTiger]) { + NSPort *receivePort = [conn receivePort]; + if ([receivePort isKindOfClass:[NSMachPort class]]) { + id portDelegate = [receivePort delegate]; + receivePortDelegate_ = + [[GTMReceivePortDelegate alloc] initWithDelegate:portDelegate]; + [receivePort setDelegate:receivePortDelegate_]; + } + } +} +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + +@end + +@implementation GTMAbstractDOListener (GTMAbstractDOListenerSubclassMethods) + +- (BOOL)doRunInitialization { + return YES; +} + +// +// -threadMain: +// + +// +- (void)threadMain:(NSInvocation *)failureCallback { + isRunningInNewThread_ = YES; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + // register + if ([self startListening]) { + // spin + for (;;) { // Run forever + + // check if we were asked to shutdown + if (shouldShutdown_) { + break; + } + + NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init]; + // Wrap our runloop in case we get an exception from DO + @try { + NSDate *waitDate = [NSDate dateWithTimeIntervalSinceNow:10]; + [[NSRunLoop currentRunLoop] runUntilDate:waitDate]; + } @catch (id e) { + _GTMDevLog(@"Listener '%@' caught exception: %@", registeredName_, e); + } + [localPool drain]; + } + } else { + // failed, if we had something to invoke, call it on the main thread + if (failureCallback) { + [failureCallback performSelectorOnMainThread:@selector(invoke) + withObject:nil + waitUntilDone:NO]; + } + } + + [self stopListening]; + [pool drain]; + + isRunningInNewThread_ = NO; +} + +@end + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +@implementation GTMReceivePortDelegate + +- (id)initWithDelegate:(id)delegate { + if ((self = [super init])) { + delegate_ = delegate; // delegates aren't retained + } + return self; +} + +- (void)handlePortMessage:(NSPortMessage *)message { + NSPort *receivePort = [message receivePort]; + NSPort *sendPort = [message sendPort]; + + // If we don't have a sensible send or receive port, just act like + // the message never arrived. Otherwise, hand it off to the original + // delegate (which is the NSMachPort itself). + if (receivePort == nil || sendPort == nil || [receivePort isEqual:sendPort]) { + _GTMDevLog(@"Dropping port message destined for itself to avoid DO wedge."); + } else { + // Uncomment for super-duper verbose DO message forward logging + // _GTMDevLog(@"--> Forwarding message %@ to delegate %@", + // message, delegate_); + [delegate_ handlePortMessage:message]; + } + + // If processing the message caused us to drop no longer being the delegate, + // set us back. Due to interactions between NSConnection and NSMachPort, + // it's possible for the NSMachPort's delegate to get set back to its + // original value. If that happens, we set it back to the value we want. + if ([delegate_ delegate] != self) { + if ([delegate_ delegate] == delegate_) { + _GTMDevLog(@"Restoring DO delegate to %@", self); + [delegate_ setDelegate:self]; + } else { + _GTMDevLog(@"GMReceivePortDelegate replaced with %@", + [delegate_ delegate]); + } + } +} +@end +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListenerTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListenerTest.m new file mode 100644 index 00000000..6076724a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMAbstractDOListenerTest.m @@ -0,0 +1,61 @@ +// +// GTMAbstractDOListenerTest.m +// +// Copyright 2006-2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMAbstractDOListener.h" + +// Needed for GTMIsGarbageCollectionEnabled +#import "GTMGarbageCollection.h" + +@interface GTMAbstractDOListenerTest : GTMTestCase +@end + +// TODO: we need to add more tests for this class. Examples: send messages and +// send messages that are in the protocol. + +@implementation GTMAbstractDOListenerTest + +- (void)testAbstractDOListenerRelease { + NSUInteger listenerCount = [[GTMAbstractDOListener allListeners] count]; + GTMAbstractDOListener *listener = + [[GTMAbstractDOListener alloc] initWithRegisteredName:@"FOO" + protocol:@protocol(NSObject) + port:[NSPort port]]; + STAssertNotNil(listener, nil); + + // We throw an autorelease pool here because allStores does a couple of + // autoreleased retains on us which would screws up our retain count + // numbers. + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + STAssertEquals([[GTMAbstractDOListener allListeners] count], + listenerCount + 1, nil); + [pool drain]; + + if (!GTMIsGarbageCollectionEnabled()) { + // Not much point with GC on. + STAssertEquals([listener retainCount], (NSUInteger)1, nil); + } + + [listener release]; + if (!GTMIsGarbageCollectionEnabled()) { + STAssertEquals([[GTMAbstractDOListener allListeners] count], listenerCount, + nil); + } +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64.h new file mode 100644 index 00000000..169b1c3c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64.h @@ -0,0 +1,183 @@ +// +// GTMBase64.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +// GTMBase64 +// +/// Helper for handling Base64 and WebSafeBase64 encodings +// +/// The webSafe methods use different character set and also the results aren't +/// always padded to a multiple of 4 characters. This is done so the resulting +/// data can be used in urls and url query arguments without needing any +/// encoding. You must use the webSafe* methods together, the data does not +/// interop with the RFC methods. +// +@interface GTMBase64 : NSObject + +// +// Standard Base64 (RFC) handling +// + +// encodeData: +// +/// Base64 encodes contents of the NSData object. +// +/// Returns: +/// A new autoreleased NSData with the encoded payload. nil for any error. +// ++(NSData *)encodeData:(NSData *)data; + +// decodeData: +// +/// Base64 decodes contents of the NSData object. +// +/// Returns: +/// A new autoreleased NSData with the decoded payload. nil for any error. +// ++(NSData *)decodeData:(NSData *)data; + +// encodeBytes:length: +// +/// Base64 encodes the data pointed at by |bytes|. +// +/// Returns: +/// A new autoreleased NSData with the encoded payload. nil for any error. +// ++(NSData *)encodeBytes:(const void *)bytes length:(NSUInteger)length; + +// decodeBytes:length: +// +/// Base64 decodes the data pointed at by |bytes|. +// +/// Returns: +/// A new autoreleased NSData with the encoded payload. nil for any error. +// ++(NSData *)decodeBytes:(const void *)bytes length:(NSUInteger)length; + +// stringByEncodingData: +// +/// Base64 encodes contents of the NSData object. +// +/// Returns: +/// A new autoreleased NSString with the encoded payload. nil for any error. +// ++(NSString *)stringByEncodingData:(NSData *)data; + +// stringByEncodingBytes:length: +// +/// Base64 encodes the data pointed at by |bytes|. +// +/// Returns: +/// A new autoreleased NSString with the encoded payload. nil for any error. +// ++(NSString *)stringByEncodingBytes:(const void *)bytes length:(NSUInteger)length; + +// decodeString: +// +/// Base64 decodes contents of the NSString. +// +/// Returns: +/// A new autoreleased NSData with the decoded payload. nil for any error. +// ++(NSData *)decodeString:(NSString *)string; + +// +// Modified Base64 encoding so the results can go onto urls. +// +// The changes are in the characters generated and also allows the result to +// not be padded to a multiple of 4. +// Must use the matching call to encode/decode, won't interop with the +// RFC versions. +// + +// webSafeEncodeData:padded: +// +/// WebSafe Base64 encodes contents of the NSData object. If |padded| is YES +/// then padding characters are added so the result length is a multiple of 4. +// +/// Returns: +/// A new autoreleased NSData with the encoded payload. nil for any error. +// ++(NSData *)webSafeEncodeData:(NSData *)data + padded:(BOOL)padded; + +// webSafeDecodeData: +// +/// WebSafe Base64 decodes contents of the NSData object. +// +/// Returns: +/// A new autoreleased NSData with the decoded payload. nil for any error. +// ++(NSData *)webSafeDecodeData:(NSData *)data; + +// webSafeEncodeBytes:length:padded: +// +/// WebSafe Base64 encodes the data pointed at by |bytes|. If |padded| is YES +/// then padding characters are added so the result length is a multiple of 4. +// +/// Returns: +/// A new autoreleased NSData with the encoded payload. nil for any error. +// ++(NSData *)webSafeEncodeBytes:(const void *)bytes + length:(NSUInteger)length + padded:(BOOL)padded; + +// webSafeDecodeBytes:length: +// +/// WebSafe Base64 decodes the data pointed at by |bytes|. +// +/// Returns: +/// A new autoreleased NSData with the encoded payload. nil for any error. +// ++(NSData *)webSafeDecodeBytes:(const void *)bytes length:(NSUInteger)length; + +// stringByWebSafeEncodingData:padded: +// +/// WebSafe Base64 encodes contents of the NSData object. If |padded| is YES +/// then padding characters are added so the result length is a multiple of 4. +// +/// Returns: +/// A new autoreleased NSString with the encoded payload. nil for any error. +// ++(NSString *)stringByWebSafeEncodingData:(NSData *)data + padded:(BOOL)padded; + +// stringByWebSafeEncodingBytes:length:padded: +// +/// WebSafe Base64 encodes the data pointed at by |bytes|. If |padded| is YES +/// then padding characters are added so the result length is a multiple of 4. +// +/// Returns: +/// A new autoreleased NSString with the encoded payload. nil for any error. +// ++(NSString *)stringByWebSafeEncodingBytes:(const void *)bytes + length:(NSUInteger)length + padded:(BOOL)padded; + +// webSafeDecodeString: +// +/// WebSafe Base64 decodes contents of the NSString. +// +/// Returns: +/// A new autoreleased NSData with the decoded payload. nil for any error. +// ++(NSData *)webSafeDecodeString:(NSString *)string; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64.m new file mode 100644 index 00000000..9f9ffbfc --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64.m @@ -0,0 +1,694 @@ +// +// GTMBase64.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMBase64.h" +#import "GTMDefines.h" + +static const char *kBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static const char *kWebSafeBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; +static const char kBase64PaddingChar = '='; +static const char kBase64InvalidChar = 99; + +static const char kBase64DecodeChars[] = { + // This array was generated by the following code: + // #include + // #include + // #include + // main() + // { + // static const char Base64[] = + // "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + // char *pos; + // int idx, i, j; + // printf(" "); + // for (i = 0; i < 255; i += 8) { + // for (j = i; j < i + 8; j++) { + // pos = strchr(Base64, j); + // if ((pos == NULL) || (j == 0)) + // idx = 99; + // else + // idx = pos - Base64; + // if (idx == 99) + // printf(" %2d, ", idx); + // else + // printf(" %2d/*%c*/,", idx, j); + // } + // printf("\n "); + // } + // } + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 62/*+*/, 99, 99, 99, 63/*/ */, + 52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/, + 60/*8*/, 61/*9*/, 99, 99, 99, 99, 99, 99, + 99, 0/*A*/, 1/*B*/, 2/*C*/, 3/*D*/, 4/*E*/, 5/*F*/, 6/*G*/, + 7/*H*/, 8/*I*/, 9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/, + 15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/, + 23/*X*/, 24/*Y*/, 25/*Z*/, 99, 99, 99, 99, 99, + 99, 26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/, + 33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/, + 41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/, + 49/*x*/, 50/*y*/, 51/*z*/, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 +}; + +static const char kWebSafeBase64DecodeChars[] = { + // This array was generated by the following code: + // #include + // #include + // #include + // main() + // { + // static const char Base64[] = + // "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + // char *pos; + // int idx, i, j; + // printf(" "); + // for (i = 0; i < 255; i += 8) { + // for (j = i; j < i + 8; j++) { + // pos = strchr(Base64, j); + // if ((pos == NULL) || (j == 0)) + // idx = 99; + // else + // idx = pos - Base64; + // if (idx == 99) + // printf(" %2d, ", idx); + // else + // printf(" %2d/*%c*/,", idx, j); + // } + // printf("\n "); + // } + // } + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 62/*-*/, 99, 99, + 52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/, + 60/*8*/, 61/*9*/, 99, 99, 99, 99, 99, 99, + 99, 0/*A*/, 1/*B*/, 2/*C*/, 3/*D*/, 4/*E*/, 5/*F*/, 6/*G*/, + 7/*H*/, 8/*I*/, 9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/, + 15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/, + 23/*X*/, 24/*Y*/, 25/*Z*/, 99, 99, 99, 99, 63/*_*/, + 99, 26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/, + 33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/, + 41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/, + 49/*x*/, 50/*y*/, 51/*z*/, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 +}; + + +// Tests a character to see if it's a whitespace character. +// +// Returns: +// YES if the character is a whitespace character. +// NO if the character is not a whitespace character. +// +GTM_INLINE BOOL IsSpace(unsigned char c) { + // we use our own mapping here because we don't want anything w/ locale + // support. + static BOOL kSpaces[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // 0-9 + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 10-19 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20-29 + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 30-39 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40-49 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 50-59 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60-69 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 70-79 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80-89 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 90-99 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 100-109 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 110-119 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 120-129 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 130-139 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 140-149 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 150-159 + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160-169 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 170-179 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 180-189 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 190-199 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 200-209 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 210-219 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 220-229 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 230-239 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 240-249 + 0, 0, 0, 0, 0, 1, // 250-255 + }; + return kSpaces[c]; +} + +// Calculate how long the data will be once it's base64 encoded. +// +// Returns: +// The guessed encoded length for a source length +// +GTM_INLINE NSUInteger CalcEncodedLength(NSUInteger srcLen, BOOL padded) { + NSUInteger intermediate_result = 8 * srcLen + 5; + NSUInteger len = intermediate_result / 6; + if (padded) { + len = ((len + 3) / 4) * 4; + } + return len; +} + +// Tries to calculate how long the data will be once it's base64 decoded. +// Unlike the above, this is always an upperbound, since the source data +// could have spaces and might end with the padding characters on them. +// +// Returns: +// The guessed decoded length for a source length +// +GTM_INLINE NSUInteger GuessDecodedLength(NSUInteger srcLen) { + return (srcLen + 3) / 4 * 3; +} + + +@interface GTMBase64 (PrivateMethods) + ++(NSData *)baseEncode:(const void *)bytes + length:(NSUInteger)length + charset:(const char *)charset + padded:(BOOL)padded; + ++(NSData *)baseDecode:(const void *)bytes + length:(NSUInteger)length + charset:(const char*)charset + requirePadding:(BOOL)requirePadding; + ++(NSUInteger)baseEncode:(const char *)srcBytes + srcLen:(NSUInteger)srcLen + destBytes:(char *)destBytes + destLen:(NSUInteger)destLen + charset:(const char *)charset + padded:(BOOL)padded; + ++(NSUInteger)baseDecode:(const char *)srcBytes + srcLen:(NSUInteger)srcLen + destBytes:(char *)destBytes + destLen:(NSUInteger)destLen + charset:(const char *)charset + requirePadding:(BOOL)requirePadding; + +@end + + +@implementation GTMBase64 + +// +// Standard Base64 (RFC) handling +// + ++(NSData *)encodeData:(NSData *)data { + return [self baseEncode:[data bytes] + length:[data length] + charset:kBase64EncodeChars + padded:YES]; +} + ++(NSData *)decodeData:(NSData *)data { + return [self baseDecode:[data bytes] + length:[data length] + charset:kBase64DecodeChars + requirePadding:YES]; +} + ++(NSData *)encodeBytes:(const void *)bytes length:(NSUInteger)length { + return [self baseEncode:bytes + length:length + charset:kBase64EncodeChars + padded:YES]; +} + ++(NSData *)decodeBytes:(const void *)bytes length:(NSUInteger)length { + return [self baseDecode:bytes + length:length + charset:kBase64DecodeChars + requirePadding:YES]; +} + ++(NSString *)stringByEncodingData:(NSData *)data { + NSString *result = nil; + NSData *converted = [self baseEncode:[data bytes] + length:[data length] + charset:kBase64EncodeChars + padded:YES]; + if (converted) { + result = [[[NSString alloc] initWithData:converted + encoding:NSASCIIStringEncoding] autorelease]; + } + return result; +} + ++(NSString *)stringByEncodingBytes:(const void *)bytes length:(NSUInteger)length { + NSString *result = nil; + NSData *converted = [self baseEncode:bytes + length:length + charset:kBase64EncodeChars + padded:YES]; + if (converted) { + result = [[[NSString alloc] initWithData:converted + encoding:NSASCIIStringEncoding] autorelease]; + } + return result; +} + ++(NSData *)decodeString:(NSString *)string { + NSData *result = nil; + NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding]; + if (data) { + result = [self baseDecode:[data bytes] + length:[data length] + charset:kBase64DecodeChars + requirePadding:YES]; + } + return result; +} + +// +// Modified Base64 encoding so the results can go onto urls. +// +// The changes are in the characters generated and also the result isn't +// padded to a multiple of 4. +// Must use the matching call to encode/decode, won't interop with the +// RFC versions. +// + ++(NSData *)webSafeEncodeData:(NSData *)data + padded:(BOOL)padded { + return [self baseEncode:[data bytes] + length:[data length] + charset:kWebSafeBase64EncodeChars + padded:padded]; +} + ++(NSData *)webSafeDecodeData:(NSData *)data { + return [self baseDecode:[data bytes] + length:[data length] + charset:kWebSafeBase64DecodeChars + requirePadding:NO]; +} + ++(NSData *)webSafeEncodeBytes:(const void *)bytes + length:(NSUInteger)length + padded:(BOOL)padded { + return [self baseEncode:bytes + length:length + charset:kWebSafeBase64EncodeChars + padded:padded]; +} + ++(NSData *)webSafeDecodeBytes:(const void *)bytes length:(NSUInteger)length { + return [self baseDecode:bytes + length:length + charset:kWebSafeBase64DecodeChars + requirePadding:NO]; +} + ++(NSString *)stringByWebSafeEncodingData:(NSData *)data + padded:(BOOL)padded { + NSString *result = nil; + NSData *converted = [self baseEncode:[data bytes] + length:[data length] + charset:kWebSafeBase64EncodeChars + padded:padded]; + if (converted) { + result = [[[NSString alloc] initWithData:converted + encoding:NSASCIIStringEncoding] autorelease]; + } + return result; +} + ++(NSString *)stringByWebSafeEncodingBytes:(const void *)bytes + length:(NSUInteger)length + padded:(BOOL)padded { + NSString *result = nil; + NSData *converted = [self baseEncode:bytes + length:length + charset:kWebSafeBase64EncodeChars + padded:padded]; + if (converted) { + result = [[[NSString alloc] initWithData:converted + encoding:NSASCIIStringEncoding] autorelease]; + } + return result; +} + ++(NSData *)webSafeDecodeString:(NSString *)string { + NSData *result = nil; + NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding]; + if (data) { + result = [self baseDecode:[data bytes] + length:[data length] + charset:kWebSafeBase64DecodeChars + requirePadding:NO]; + } + return result; +} + +@end + +@implementation GTMBase64 (PrivateMethods) + +// +// baseEncode:length:charset:padded: +// +// Does the common lifting of creating the dest NSData. it creates & sizes the +// data for the results. |charset| is the characters to use for the encoding +// of the data. |padding| controls if the encoded data should be padded to a +// multiple of 4. +// +// Returns: +// an autorelease NSData with the encoded data, nil if any error. +// ++(NSData *)baseEncode:(const void *)bytes + length:(NSUInteger)length + charset:(const char *)charset + padded:(BOOL)padded { + // how big could it be? + NSUInteger maxLength = CalcEncodedLength(length, padded); + // make space + NSMutableData *result = [NSMutableData data]; + [result setLength:maxLength]; + // do it + NSUInteger finalLength = [self baseEncode:bytes + srcLen:length + destBytes:[result mutableBytes] + destLen:[result length] + charset:charset + padded:padded]; + if (finalLength) { + _GTMDevAssert(finalLength == maxLength, @"how did we calc the length wrong?"); + } else { + // shouldn't happen, this means we ran out of space + result = nil; + } + return result; +} + +// +// baseDecode:length:charset:requirePadding: +// +// Does the common lifting of creating the dest NSData. it creates & sizes the +// data for the results. |charset| is the characters to use for the decoding +// of the data. +// +// Returns: +// an autorelease NSData with the decoded data, nil if any error. +// +// ++(NSData *)baseDecode:(const void *)bytes + length:(NSUInteger)length + charset:(const char *)charset + requirePadding:(BOOL)requirePadding { + // could try to calculate what it will end up as + NSUInteger maxLength = GuessDecodedLength(length); + // make space + NSMutableData *result = [NSMutableData data]; + [result setLength:maxLength]; + // do it + NSUInteger finalLength = [self baseDecode:bytes + srcLen:length + destBytes:[result mutableBytes] + destLen:[result length] + charset:charset + requirePadding:requirePadding]; + if (finalLength) { + if (finalLength != maxLength) { + // resize down to how big it was + [result setLength:finalLength]; + } + } else { + // either an error in the args, or we ran out of space + result = nil; + } + return result; +} + +// +// baseEncode:srcLen:destBytes:destLen:charset:padded: +// +// Encodes the buffer into the larger. returns the length of the encoded +// data, or zero for an error. +// |charset| is the characters to use for the encoding +// |padded| tells if the result should be padded to a multiple of 4. +// +// Returns: +// the length of the encoded data. zero if any error. +// ++(NSUInteger)baseEncode:(const char *)srcBytes + srcLen:(NSUInteger)srcLen + destBytes:(char *)destBytes + destLen:(NSUInteger)destLen + charset:(const char *)charset + padded:(BOOL)padded { + if (!srcLen || !destLen || !srcBytes || !destBytes) { + return 0; + } + + char *curDest = destBytes; + const unsigned char *curSrc = (const unsigned char *)(srcBytes); + + // Three bytes of data encodes to four characters of cyphertext. + // So we can pump through three-byte chunks atomically. + while (srcLen > 2) { + // space? + _GTMDevAssert(destLen >= 4, @"our calc for encoded length was wrong"); + curDest[0] = charset[curSrc[0] >> 2]; + curDest[1] = charset[((curSrc[0] & 0x03) << 4) + (curSrc[1] >> 4)]; + curDest[2] = charset[((curSrc[1] & 0x0f) << 2) + (curSrc[2] >> 6)]; + curDest[3] = charset[curSrc[2] & 0x3f]; + + curDest += 4; + curSrc += 3; + srcLen -= 3; + destLen -= 4; + } + + // now deal with the tail (<=2 bytes) + switch (srcLen) { + case 0: + // Nothing left; nothing more to do. + break; + case 1: + // One byte left: this encodes to two characters, and (optionally) + // two pad characters to round out the four-character cypherblock. + _GTMDevAssert(destLen >= 2, @"our calc for encoded length was wrong"); + curDest[0] = charset[curSrc[0] >> 2]; + curDest[1] = charset[(curSrc[0] & 0x03) << 4]; + curDest += 2; + destLen -= 2; + if (padded) { + _GTMDevAssert(destLen >= 2, @"our calc for encoded length was wrong"); + curDest[0] = kBase64PaddingChar; + curDest[1] = kBase64PaddingChar; + curDest += 2; + } + break; + case 2: + // Two bytes left: this encodes to three characters, and (optionally) + // one pad character to round out the four-character cypherblock. + _GTMDevAssert(destLen >= 3, @"our calc for encoded length was wrong"); + curDest[0] = charset[curSrc[0] >> 2]; + curDest[1] = charset[((curSrc[0] & 0x03) << 4) + (curSrc[1] >> 4)]; + curDest[2] = charset[(curSrc[1] & 0x0f) << 2]; + curDest += 3; + destLen -= 3; + if (padded) { + _GTMDevAssert(destLen >= 1, @"our calc for encoded length was wrong"); + curDest[0] = kBase64PaddingChar; + curDest += 1; + } + break; + } + // return the length + return (curDest - destBytes); +} + +// +// baseDecode:srcLen:destBytes:destLen:charset:requirePadding: +// +// Decodes the buffer into the larger. returns the length of the decoded +// data, or zero for an error. +// |charset| is the character decoding buffer to use +// +// Returns: +// the length of the encoded data. zero if any error. +// ++(NSUInteger)baseDecode:(const char *)srcBytes + srcLen:(NSUInteger)srcLen + destBytes:(char *)destBytes + destLen:(NSUInteger)destLen + charset:(const char *)charset + requirePadding:(BOOL)requirePadding { + if (!srcLen || !destLen || !srcBytes || !destBytes) { + return 0; + } + + int decode; + NSUInteger destIndex = 0; + int state = 0; + char ch = 0; + while (srcLen-- && (ch = *srcBytes++) != 0) { + if (IsSpace(ch)) // Skip whitespace + continue; + + if (ch == kBase64PaddingChar) + break; + + decode = charset[(unsigned int)ch]; + if (decode == kBase64InvalidChar) + return 0; + + // Four cyphertext characters decode to three bytes. + // Therefore we can be in one of four states. + switch (state) { + case 0: + // We're at the beginning of a four-character cyphertext block. + // This sets the high six bits of the first byte of the + // plaintext block. + _GTMDevAssert(destIndex < destLen, @"our calc for decoded length was wrong"); + destBytes[destIndex] = decode << 2; + state = 1; + break; + case 1: + // We're one character into a four-character cyphertext block. + // This sets the low two bits of the first plaintext byte, + // and the high four bits of the second plaintext byte. + _GTMDevAssert((destIndex+1) < destLen, @"our calc for decoded length was wrong"); + destBytes[destIndex] |= decode >> 4; + destBytes[destIndex+1] = (decode & 0x0f) << 4; + destIndex++; + state = 2; + break; + case 2: + // We're two characters into a four-character cyphertext block. + // This sets the low four bits of the second plaintext + // byte, and the high two bits of the third plaintext byte. + // However, if this is the end of data, and those two + // bits are zero, it could be that those two bits are + // leftovers from the encoding of data that had a length + // of two mod three. + _GTMDevAssert((destIndex+1) < destLen, @"our calc for decoded length was wrong"); + destBytes[destIndex] |= decode >> 2; + destBytes[destIndex+1] = (decode & 0x03) << 6; + destIndex++; + state = 3; + break; + case 3: + // We're at the last character of a four-character cyphertext block. + // This sets the low six bits of the third plaintext byte. + _GTMDevAssert(destIndex < destLen, @"our calc for decoded length was wrong"); + destBytes[destIndex] |= decode; + destIndex++; + state = 0; + break; + } + } + + // We are done decoding Base-64 chars. Let's see if we ended + // on a byte boundary, and/or with erroneous trailing characters. + if (ch == kBase64PaddingChar) { // We got a pad char + if ((state == 0) || (state == 1)) { + return 0; // Invalid '=' in first or second position + } + if (srcLen == 0) { + if (state == 2) { // We run out of input but we still need another '=' + return 0; + } + // Otherwise, we are in state 3 and only need this '=' + } else { + if (state == 2) { // need another '=' + while ((ch = *srcBytes++) && (srcLen-- > 0)) { + if (!IsSpace(ch)) + break; + } + if (ch != kBase64PaddingChar) { + return 0; + } + } + // state = 1 or 2, check if all remain padding is space + while ((ch = *srcBytes++) && (srcLen-- > 0)) { + if (!IsSpace(ch)) { + return 0; + } + } + } + } else { + // We ended by seeing the end of the string. + + if (requirePadding) { + // If we require padding, then anything but state 0 is an error. + if (state != 0) { + return 0; + } + } else { + // Make sure we have no partial bytes lying around. Note that we do not + // require trailing '=', so states 2 and 3 are okay too. + if (state == 1) { + return 0; + } + } + } + + // If then next piece of output was valid and got written to it means we got a + // very carefully crafted input that appeared valid but contains some trailing + // bits past the real length, so just toss the thing. + if ((destIndex < destLen) && + (destBytes[destIndex] != 0)) { + return 0; + } + + return destIndex; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64Test.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64Test.m new file mode 100644 index 00000000..084ea1e0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMBase64Test.m @@ -0,0 +1,437 @@ +// +// GTMBase64Test.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMBase64.h" +#include // for randiom/srandomdev + +static void FillWithRandom(char *data, NSUInteger len) { + char *max = data + len; + for ( ; data < max ; ++data) { + *data = random() & 0xFF; + } +} + +static BOOL NoEqualChar(NSData *data) { + const char *scan = [data bytes]; + const char *max = scan + [data length]; + for ( ; scan < max ; ++scan) { + if (*scan == '=') { + return NO; + } + } + return YES; +} + +@interface GTMBase64Test : GTMTestCase +@end + +@implementation GTMBase64Test + +- (void)setUp { + // seed random from /dev/random + srandomdev(); +} + +- (void)testBase64 { + // generate a range of sizes w/ random content + for (int x = 1 ; x < 1024 ; ++x) { + NSMutableData *data = [NSMutableData data]; + STAssertNotNil(data, @"failed to alloc data block"); + + [data setLength:x]; + FillWithRandom([data mutableBytes], [data length]); + + // w/ *Bytes apis + NSData *encoded = [GTMBase64 encodeBytes:[data bytes] length:[data length]]; + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Bytes apis should be a multiple of 4"); + NSData *dataPrime = [GTMBase64 decodeBytes:[encoded bytes] + length:[encoded length]]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip via *Bytes apis"); + + // w/ *Data apis + encoded = [GTMBase64 encodeData:data]; + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Data apis should be a multiple of 4"); + dataPrime = [GTMBase64 decodeData:encoded]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip via *Data apis"); + + // Bytes to String and back + NSString *encodedString = [GTMBase64 stringByEncodingBytes:[data bytes] + length:[data length]]; + STAssertEquals(([encodedString length] % 4), (NSUInteger)0, + @"encoded size for Bytes to Strings should be a multiple of 4"); + dataPrime = [GTMBase64 decodeString:encodedString]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip for Bytes to Strings"); + + // Data to String and back + encodedString = [GTMBase64 stringByEncodingData:data]; + STAssertEquals(([encodedString length] % 4), (NSUInteger)0, + @"encoded size for Data to Strings should be a multiple of 4"); + dataPrime = [GTMBase64 decodeString:encodedString]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip for Bytes to Strings"); + } + + { + // now test all byte values + NSMutableData *data = [NSMutableData data]; + STAssertNotNil(data, @"failed to alloc data block"); + + [data setLength:256]; + unsigned char *scan = (unsigned char*)[data mutableBytes]; + for (int x = 0 ; x <= 255 ; ++x) { + *scan++ = x; + } + + // w/ *Bytes apis + NSData *encoded = [GTMBase64 encodeBytes:[data bytes] length:[data length]]; + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Bytes apis should be a multiple of 4"); + NSData *dataPrime = [GTMBase64 decodeBytes:[encoded bytes] + length:[encoded length]]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip via *Bytes apis"); + + // w/ *Data apis + encoded = [GTMBase64 encodeData:data]; + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Data apis should be a multiple of 4"); + dataPrime = [GTMBase64 decodeData:encoded]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip via *Data apis"); + + // Bytes to String and back + NSString *encodedString = [GTMBase64 stringByEncodingBytes:[data bytes] + length:[data length]]; + STAssertEquals(([encodedString length] % 4), (NSUInteger)0, + @"encoded size for Bytes to Strings should be a multiple of 4"); + dataPrime = [GTMBase64 decodeString:encodedString]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip for Bytes to Strings"); + + // Data to String and back + encodedString = [GTMBase64 stringByEncodingData:data]; + STAssertEquals(([encodedString length] % 4), (NSUInteger)0, + @"encoded size for Data to Strings should be a multiple of 4"); + dataPrime = [GTMBase64 decodeString:encodedString]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip for Data to Strings"); + } + + { + // test w/ a mix of spacing characters + + // generate some data, encode it, and add spaces + NSMutableData *data = [NSMutableData data]; + STAssertNotNil(data, @"failed to alloc data block"); + + [data setLength:253]; // should get some padding chars on the end + FillWithRandom([data mutableBytes], [data length]); + + NSString *encodedString = [GTMBase64 stringByEncodingData:data]; + NSMutableString *encodedAndSpaced = + [[encodedString mutableCopy] autorelease]; + + NSString *spaces[] = { @"\t", @"\n", @"\r", @" " }; + const NSUInteger numSpaces = sizeof(spaces) / sizeof(NSString*); + for (int x = 0 ; x < 512 ; ++x) { + NSUInteger offset = random() % ([encodedAndSpaced length] + 1); + [encodedAndSpaced insertString:spaces[random() % numSpaces] + atIndex:offset]; + } + + // we'll need it as data for apis + NSData *encodedAsData = + [encodedAndSpaced dataUsingEncoding:NSASCIIStringEncoding]; + STAssertNotNil(encodedAsData, @"failed to extract from string"); + STAssertEquals([encodedAsData length], [encodedAndSpaced length], + @"lengths for encoded string and data didn't match?"); + + // all the decode modes + NSData *dataPrime = [GTMBase64 decodeData:encodedAsData]; + STAssertEqualObjects(data, dataPrime, + @"failed Data decode w/ spaces"); + dataPrime = [GTMBase64 decodeBytes:[encodedAsData bytes] + length:[encodedAsData length]]; + STAssertEqualObjects(data, dataPrime, + @"failed Bytes decode w/ spaces"); + dataPrime = [GTMBase64 decodeString:encodedAndSpaced]; + STAssertEqualObjects(data, dataPrime, + @"failed String decode w/ spaces"); + } +} + +- (void)testWebSafeBase64 { + // loop to test w/ and w/o padding + for (int paddedLoop = 0; paddedLoop < 2 ; ++paddedLoop) { + BOOL padded = (paddedLoop == 1); + + // generate a range of sizes w/ random content + for (int x = 1 ; x < 1024 ; ++x) { + NSMutableData *data = [NSMutableData data]; + STAssertNotNil(data, @"failed to alloc data block"); + + [data setLength:x]; + FillWithRandom([data mutableBytes], [data length]); + + // w/ *Bytes apis + NSData *encoded = [GTMBase64 webSafeEncodeBytes:[data bytes] + length:[data length] + padded:padded]; + if (padded) { + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Bytes apis should be a multiple of 4"); + } else { + STAssertTrue(NoEqualChar(encoded), + @"encoded via *Bytes apis had a base64 padding char"); + } + NSData *dataPrime = [GTMBase64 webSafeDecodeBytes:[encoded bytes] + length:[encoded length]]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip via *Bytes apis"); + + // w/ *Data apis + encoded = [GTMBase64 webSafeEncodeData:data padded:padded]; + if (padded) { + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Data apis should be a multiple of 4"); + } else { + STAssertTrue(NoEqualChar(encoded), + @"encoded via *Data apis had a base64 padding char"); + } + dataPrime = [GTMBase64 webSafeDecodeData:encoded]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip via *Data apis"); + + // Bytes to String and back + NSString *encodedString = + [GTMBase64 stringByWebSafeEncodingBytes:[data bytes] + length:[data length] + padded:padded]; + if (padded) { + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Bytes apis should be a multiple of 4"); + } else { + STAssertTrue(NoEqualChar(encoded), + @"encoded via Bytes to Strings had a base64 padding char"); + } + dataPrime = [GTMBase64 webSafeDecodeString:encodedString]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip for Bytes to Strings"); + + // Data to String and back + encodedString = + [GTMBase64 stringByWebSafeEncodingData:data padded:padded]; + if (padded) { + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Data apis should be a multiple of 4"); + } else { + STAssertTrue(NoEqualChar(encoded), + @"encoded via Data to Strings had a base64 padding char"); + } + dataPrime = [GTMBase64 webSafeDecodeString:encodedString]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip for Data to Strings"); + } + + { + // now test all byte values + NSMutableData *data = [NSMutableData data]; + STAssertNotNil(data, @"failed to alloc data block"); + + [data setLength:256]; + unsigned char *scan = (unsigned char*)[data mutableBytes]; + for (int x = 0 ; x <= 255 ; ++x) { + *scan++ = x; + } + + // w/ *Bytes apis + NSData *encoded = + [GTMBase64 webSafeEncodeBytes:[data bytes] + length:[data length] + padded:padded]; + if (padded) { + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Bytes apis should be a multiple of 4"); + } else { + STAssertTrue(NoEqualChar(encoded), + @"encoded via *Bytes apis had a base64 padding char"); + } + NSData *dataPrime = [GTMBase64 webSafeDecodeBytes:[encoded bytes] + length:[encoded length]]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip via *Bytes apis"); + + // w/ *Data apis + encoded = [GTMBase64 webSafeEncodeData:data padded:padded]; + if (padded) { + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Data apis should be a multiple of 4"); + } else { + STAssertTrue(NoEqualChar(encoded), + @"encoded via *Data apis had a base64 padding char"); + } + dataPrime = [GTMBase64 webSafeDecodeData:encoded]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip via *Data apis"); + + // Bytes to String and back + NSString *encodedString = + [GTMBase64 stringByWebSafeEncodingBytes:[data bytes] + length:[data length] + padded:padded]; + if (padded) { + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Bytes apis should be a multiple of 4"); + } else { + STAssertTrue(NoEqualChar(encoded), + @"encoded via Bytes to Strings had a base64 padding char"); + } + dataPrime = [GTMBase64 webSafeDecodeString:encodedString]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip for Bytes to Strings"); + + // Data to String and back + encodedString = + [GTMBase64 stringByWebSafeEncodingData:data padded:padded]; + if (padded) { + STAssertEquals(([encoded length] % 4), (NSUInteger)0, + @"encoded size via *Data apis should be a multiple of 4"); + } else { + STAssertTrue(NoEqualChar(encoded), + @"encoded via Data to Strings had a base64 padding char"); + } + dataPrime = [GTMBase64 webSafeDecodeString:encodedString]; + STAssertEqualObjects(data, dataPrime, + @"failed to round trip for Data to Strings"); + } + + { + // test w/ a mix of spacing characters + + // generate some data, encode it, and add spaces + NSMutableData *data = [NSMutableData data]; + STAssertNotNil(data, @"failed to alloc data block"); + + [data setLength:253]; // should get some padding chars on the end + FillWithRandom([data mutableBytes], [data length]); + + NSString *encodedString = [GTMBase64 stringByWebSafeEncodingData:data + padded:padded]; + NSMutableString *encodedAndSpaced = + [[encodedString mutableCopy] autorelease]; + + NSString *spaces[] = { @"\t", @"\n", @"\r", @" " }; + const NSUInteger numSpaces = sizeof(spaces) / sizeof(NSString*); + for (int x = 0 ; x < 512 ; ++x) { + NSUInteger offset = random() % ([encodedAndSpaced length] + 1); + [encodedAndSpaced insertString:spaces[random() % numSpaces] + atIndex:offset]; + } + + // we'll need it as data for apis + NSData *encodedAsData = + [encodedAndSpaced dataUsingEncoding:NSASCIIStringEncoding]; + STAssertNotNil(encodedAsData, @"failed to extract from string"); + STAssertEquals([encodedAsData length], [encodedAndSpaced length], + @"lengths for encoded string and data didn't match?"); + + // all the decode modes + NSData *dataPrime = [GTMBase64 webSafeDecodeData:encodedAsData]; + STAssertEqualObjects(data, dataPrime, + @"failed Data decode w/ spaces"); + dataPrime = [GTMBase64 webSafeDecodeBytes:[encodedAsData bytes] + length:[encodedAsData length]]; + STAssertEqualObjects(data, dataPrime, + @"failed Bytes decode w/ spaces"); + dataPrime = [GTMBase64 webSafeDecodeString:encodedAndSpaced]; + STAssertEqualObjects(data, dataPrime, + @"failed String decode w/ spaces"); + } + } // paddedLoop +} + +- (void)testErrors { + const int something = 0; + NSString *nonAscString = [NSString stringWithUTF8String:"This test ©™®๒०᠐٧"]; + + STAssertNil([GTMBase64 encodeData:nil], @"it worked?"); + STAssertNil([GTMBase64 decodeData:nil], @"it worked?"); + STAssertNil([GTMBase64 encodeBytes:NULL length:10], @"it worked?"); + STAssertNil([GTMBase64 encodeBytes:&something length:0], @"it worked?"); + STAssertNil([GTMBase64 decodeBytes:NULL length:10], @"it worked?"); + STAssertNil([GTMBase64 decodeBytes:&something length:0], @"it worked?"); + STAssertNil([GTMBase64 stringByEncodingData:nil], @"it worked?"); + STAssertNil([GTMBase64 stringByEncodingBytes:NULL length:10], @"it worked?"); + STAssertNil([GTMBase64 stringByEncodingBytes:&something length:0], @"it worked?"); + STAssertNil([GTMBase64 decodeString:nil], @"it worked?"); + // test some pads at the end that aren't right + STAssertNil([GTMBase64 decodeString:@"=="], @"it worked?"); // just pads + STAssertNil([GTMBase64 decodeString:@"vw="], @"it worked?"); // missing pad (in state 2) + STAssertNil([GTMBase64 decodeString:@"vw"], @"it worked?"); // missing pad (in state 2) + STAssertNil([GTMBase64 decodeString:@"NNw"], @"it worked?"); // missing pad (in state 3) + STAssertNil([GTMBase64 decodeString:@"vw=v"], @"it worked?"); // missing pad, has something else + STAssertNil([GTMBase64 decodeString:@"v="], @"it worked?"); // missing a needed char, has pad instead + STAssertNil([GTMBase64 decodeString:@"v"], @"it worked?"); // missing a needed char + STAssertNil([GTMBase64 decodeString:@"vw== vw"], @"it worked?"); + STAssertNil([GTMBase64 decodeString:nonAscString], @"it worked?"); + STAssertNil([GTMBase64 decodeString:@"@@@not valid###"], @"it worked?"); + // carefully crafted bad input to make sure we don't overwalk + STAssertNil([GTMBase64 decodeString:@"WD=="], @"it worked?"); + + STAssertNil([GTMBase64 webSafeEncodeData:nil padded:YES], @"it worked?"); + STAssertNil([GTMBase64 webSafeDecodeData:nil], @"it worked?"); + STAssertNil([GTMBase64 webSafeEncodeBytes:NULL length:10 padded:YES], + @"it worked?"); + STAssertNil([GTMBase64 webSafeEncodeBytes:&something length:0 padded:YES], + @"it worked?"); + STAssertNil([GTMBase64 webSafeDecodeBytes:NULL length:10], @"it worked?"); + STAssertNil([GTMBase64 webSafeDecodeBytes:&something length:0], @"it worked?"); + STAssertNil([GTMBase64 stringByWebSafeEncodingData:nil padded:YES], + @"it worked?"); + STAssertNil([GTMBase64 stringByWebSafeEncodingBytes:NULL + length:10 + padded:YES], + @"it worked?"); + STAssertNil([GTMBase64 stringByWebSafeEncodingBytes:&something + length:0 + padded:YES], + @"it worked?"); + STAssertNil([GTMBase64 webSafeDecodeString:nil], @"it worked?"); + // test some pads at the end that aren't right + STAssertNil([GTMBase64 webSafeDecodeString:@"=="], @"it worked?"); // just pad chars + STAssertNil([GTMBase64 webSafeDecodeString:@"aw="], @"it worked?"); // missing pad + STAssertNil([GTMBase64 webSafeDecodeString:@"aw=a"], @"it worked?"); // missing pad, has something else + STAssertNil([GTMBase64 webSafeDecodeString:@"a"], @"it worked?"); // missing a needed char + STAssertNil([GTMBase64 webSafeDecodeString:@"a="], @"it worked?"); // missing a needed char, has pad instead + STAssertNil([GTMBase64 webSafeDecodeString:@"aw== a"], @"it worked?"); // missing pad + STAssertNil([GTMBase64 webSafeDecodeString:nonAscString], @"it worked?"); + STAssertNil([GTMBase64 webSafeDecodeString:@"@@@not valid###"], @"it worked?"); + // carefully crafted bad input to make sure we don't overwalk + STAssertNil([GTMBase64 webSafeDecodeString:@"WD=="], @"it worked?"); + + // make sure our local helper is working right + STAssertFalse(NoEqualChar([NSData dataWithBytes:"aa=zz" length:5]), @""); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRange.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRange.h new file mode 100644 index 00000000..5710da61 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRange.h @@ -0,0 +1,102 @@ +// +// GTMCalculatedRange.h +// +// This is a collection that allows you to calculate a value based on +// defined stops in a range. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +/// Allows you to calculate a value based on defined stops in a range. +// +/// For example if you have a range from 0.0 to 1.0 where the stop +/// located at 0.0 is red and the stop located at 1.0 is blue, +/// the value based on the position 0.5 would come out as purple assuming +/// that the valueAtPosition function calculates a purely linear mapping between +/// the stops at 0.0 and 1.0. Stops have indices and are sorted from lowest to +/// highest. The example above would have 2 stops. Stop 0 would be red and stop +/// 1 would be blue. +/// +/// Subclasses of GTMCalculatedRange are expected to override the valueAtPosition: +/// method to return a value based on the position passed in, and the stops +/// that are currently set in the range. Stops do not necessarily have to +/// be the same type as the values that are calculated, but normally they are. +@interface GTMCalculatedRange : NSObject { + NSMutableArray *storage_; +} + +// Adds a stop to the range at |position|. If there is already a stop +// at position |position| it is replaced. +// +// Args: +// item: the object to place at |position|. +// position: the position in the range to put |item|. +// +- (void)insertStop:(id)item atPosition:(CGFloat)position; + +// Removes a stop from the range at |position|. +// +// Args: +// position: the position in the range to remove |item|. +// +// Returns: +// YES if there is a stop at |position| that has been removed +// NO if there is not a stop at the |position| +- (BOOL)removeStopAtPosition:(CGFloat)position; + +// Removes stop |index| from the range. Stops are ordered +// based on position where index of x < index of y if position +// of x < position of y. +// +// Args: +// item: the object to place at |position|. +// position: the position in the range to put |item|. +// +- (void)removeStopAtIndex:(NSUInteger)index; + +// Returns the number of stops in the range. +// +// Returns: +// number of stops +- (NSUInteger)stopCount; + +// Returns the value at position |position|. +// This function should be overridden by subclasses to calculate a +// value for any given range. +// The default implementation returns a value if there happens to be +// a stop for the given position. Otherwise it returns nil. +// +// Args: +// position: the position to calculate a value for. +// +// Returns: +// value for position +- (id)valueAtPosition:(CGFloat)position; + +// Returns the |index|'th stop and position in the set. +// Throws an exception if out of range. +// +// Args: +// index: the index of the stop +// outPosition: a pointer to a value to be filled in with a position. +// this can be NULL, in which case no position is returned. +// +// Returns: +// the stop at the index. +- (id)stopAtIndex:(NSUInteger)index position:(CGFloat*)outPosition; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRange.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRange.m new file mode 100644 index 00000000..5ab491d8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRange.m @@ -0,0 +1,148 @@ +// +// GTMCalculatedRange.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMCalculatedRange.h" + +// Our internal storage type. It keeps track of an item and it's +// position. +@interface GTMCalculatedRangeStopPrivate : NSObject { + id item_; // the item (STRONG) + CGFloat position_; // +} ++ (id)stopWithObject:(id)item position:(CGFloat)inPosition; +- (id)initWithObject:(id)item position:(CGFloat)inPosition; +- (id)item; +- (CGFloat)position; +@end + +GTM_INLINE BOOL FPEqual(CGFloat a, CGFloat b) { + return (fpclassify(a - b) == FP_ZERO); +} + +@implementation GTMCalculatedRangeStopPrivate ++ (id)stopWithObject:(id)item position:(CGFloat)inPosition { + return [[[[self class] alloc] initWithObject:item position:inPosition] autorelease]; +} + +- (id)initWithObject:(id)item position:(CGFloat)inPosition { + self = [super init]; + if (self != nil) { + item_ = [item retain]; + position_ = inPosition; + } + return self; +} + +- (void)dealloc { + [item_ release]; + [super dealloc]; +} + +- (id)item { + return item_; +} + +- (CGFloat)position { + return position_; +} + +- (NSString *)description { + return [NSString stringWithFormat: @"%f %@", position_, item_]; +} +@end + +@implementation GTMCalculatedRange +- (id)init { + self = [super init]; + if (self != nil) { + storage_ = [[NSMutableArray arrayWithCapacity:0] retain]; + } + return self; +} +- (void)dealloc { + [storage_ release]; + [super dealloc]; +} + +- (void)insertStop:(id)item atPosition:(CGFloat)position { + NSUInteger positionIndex = 0; + GTMCalculatedRangeStopPrivate *theStop; + GTM_FOREACH_OBJECT(theStop, storage_) { + if ([theStop position] < position) { + positionIndex += 1; + } + else if (FPEqual([theStop position], position)) { + // remove and stop the enum since we just modified the object + [storage_ removeObjectAtIndex:positionIndex]; + break; + } + } + [storage_ insertObject:[GTMCalculatedRangeStopPrivate stopWithObject:item position:position] + atIndex:positionIndex]; +} + +- (BOOL)removeStopAtPosition:(CGFloat)position { + NSUInteger positionIndex = 0; + BOOL foundStop = NO; + GTMCalculatedRangeStopPrivate *theStop; + GTM_FOREACH_OBJECT(theStop, storage_) { + if (FPEqual([theStop position], position)) { + break; + } else { + positionIndex += 1; + } + } + if (nil != theStop) { + [self removeStopAtIndex:positionIndex]; + foundStop = YES; + } + return foundStop; +} + +- (void)removeStopAtIndex:(NSUInteger)positionIndex { + [storage_ removeObjectAtIndex:positionIndex]; +} + +- (NSUInteger)stopCount { + return [storage_ count]; +} + +- (id)stopAtIndex:(NSUInteger)positionIndex position:(CGFloat*)outPosition { + GTMCalculatedRangeStopPrivate *theStop = [storage_ objectAtIndex:positionIndex]; + if (nil != outPosition) { + *outPosition = [theStop position]; + } + return [theStop item]; +} + +- (id)valueAtPosition:(CGFloat)position { + id theValue = nil; + GTMCalculatedRangeStopPrivate *theStop; + GTM_FOREACH_OBJECT(theStop, storage_) { + if (FPEqual([theStop position], position)) { + theValue = [theStop item]; + break; + } + } + return theValue; +} + +- (NSString *)description { + return [storage_ description]; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRangeTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRangeTest.m new file mode 100644 index 00000000..1790072a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMCalculatedRangeTest.m @@ -0,0 +1,101 @@ +// +// GTMCalculatedRangeTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMCalculatedRange.h" +#import "GTMSenTestCase.h" + +@interface GTMCalculatedRangeTest : GTMTestCase { + GTMCalculatedRange *range_; +} +@end + +@implementation GTMCalculatedRangeTest +NSString *kStrings[] = { @"Fee", @"Fi", @"Fo", @"Fum" }; +const NSUInteger kStringCount = sizeof(kStrings) / sizeof(NSString*); +const CGFloat kOddPosition = 0.14159265f; +const CGFloat kExistingPosition = 0.5f; +const NSUInteger kExisitingIndex = 2; + +- (void)setUp { + range_ = [[GTMCalculatedRange alloc] init]; + for(NSUInteger i = kStringCount; i > 0; --i) { + [range_ insertStop:kStrings[kStringCount - i] atPosition: 1.0f / i]; + } +} + +- (void)tearDown { + [range_ release]; +} + +- (void)testInsertStop { + // new position + NSString *theString = @"I smell the blood of an Englishman!"; + [range_ insertStop:theString atPosition:kOddPosition]; + STAssertEquals([range_ stopCount], kStringCount + 1, @"Stop count was bad"); + NSString *getString = [range_ valueAtPosition:kOddPosition]; + STAssertNotNil(getString, @"String was bad"); + STAssertEquals(theString, getString, @"Stops weren't equal"); + // existing position + NSString *theStringTake2 = @"I smell the blood of an Englishman! Take 2"; + [range_ insertStop:theStringTake2 atPosition:kOddPosition]; + STAssertEquals([range_ stopCount], kStringCount + 1, @"Stop count was bad"); + getString = [range_ valueAtPosition:kOddPosition]; + STAssertNotNil(getString, @"String was bad"); + STAssertEquals(theStringTake2, getString, @"Stops weren't equal"); + STAssertNotEquals(theString, getString, @"Should be the new value"); + STAssertNotEqualObjects(theString, getString, @"Should be the new value"); +} + +- (void)testRemoveStopAtPosition { + STAssertFalse([range_ removeStopAtPosition: kOddPosition], @"Was able to remove non-existant stop"); + STAssertTrue([range_ removeStopAtPosition: kExistingPosition], @"Was unable to remove good stop"); + STAssertEquals([range_ stopCount], kStringCount - 1, @"Removing stop should adjust stop count"); +} + +- (void)testRemoveStopAtIndex { + STAssertThrows([range_ removeStopAtIndex: kStringCount], @"Was able to remove non-existant stop"); + STAssertNoThrow([range_ removeStopAtIndex: kStringCount - 1], @"Was unable to remove good stop"); + STAssertEquals([range_ stopCount], kStringCount - 1, @"Removing stop should adjust stop count"); +} + +- (void)testStopCount { + STAssertEquals([range_ stopCount], kStringCount, @"Bad stop count"); +} + +- (void)testValueAtPosition { + STAssertEqualObjects([range_ valueAtPosition: kExistingPosition], kStrings[kExisitingIndex], nil); + STAssertNotEqualObjects([range_ valueAtPosition: kExistingPosition], kStrings[kStringCount - 1], nil); + STAssertNil([range_ valueAtPosition: kOddPosition], nil); +} + +- (void)testStopAtIndex { + CGFloat thePosition; + + STAssertEqualObjects([range_ stopAtIndex:kStringCount - 1 position:nil], kStrings[kStringCount - 1], nil); + STAssertEqualObjects([range_ stopAtIndex:kExisitingIndex position:&thePosition], kStrings[kExisitingIndex], nil); + STAssertEquals(thePosition, kExistingPosition, nil); + STAssertNotEqualObjects([range_ stopAtIndex:kStringCount - 1 position:nil], kStrings[2], nil); + STAssertThrows([range_ stopAtIndex:kStringCount position:nil], nil); +} + +- (void)testDescription { + // we expect a description of atleast a few chars + STAssertGreaterThan([[range_ description] length], (NSUInteger)10, nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlines.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlines.h new file mode 100644 index 00000000..ce30db99 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlines.h @@ -0,0 +1,53 @@ +// +// GTMExceptionalInlines.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +// This file exists because when you have full warnings on you can run into +// troubles with functions that Apple has inlined that have structures or +// local variables defined in them. +// You only see this warning if you have -Wuninitialized turned on, +// and you will only see them in release mode. -Wno-unitialized turns them +// off, but you also lose all the good warnings that come with -Wuninitialized. +// If you have the inline versions of any of the functions below in a +// @syncronized, or @try block, you will get +// warning: variable 'r' might be clobbered by 'longjmp' or 'vfork' +// By moving this local vars "out of line" you fix the problem. +// These functions do nothing more than act as "out of line" calls to the +// functions they are masking to avoid the warning. +// If you run into others, feel free to add them. + +// Please only use these to avoid the warning above. Use the Apple defined +// functions where possible. + +FOUNDATION_EXPORT NSRange GTMNSMakeRange(NSUInteger loc, NSUInteger len); +FOUNDATION_EXPORT CFRange GTMCFRangeMake(NSUInteger loc, NSUInteger len); + +FOUNDATION_EXPORT CGPoint GTMCGPointMake(CGFloat x, CGFloat y); +FOUNDATION_EXPORT CGSize GTMCGSizeMake(CGFloat width, CGFloat height); +FOUNDATION_EXPORT CGRect GTMCGRectMake(CGFloat x, CGFloat y, + CGFloat width, CGFloat height); + +#if !GTM_IPHONE_SDK +// iPhone does not have NSTypes defined, only CGTypes. So no NSRect, NSPoint etc. +FOUNDATION_EXPORT NSPoint GTMNSMakePoint(CGFloat x, CGFloat y); +FOUNDATION_EXPORT NSSize GTMNSMakeSize(CGFloat w, CGFloat h); +FOUNDATION_EXPORT NSRect GTMNSMakeRect(CGFloat x, CGFloat y, + CGFloat w, CGFloat h); +#endif diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlines.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlines.m new file mode 100644 index 00000000..d803ea9d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlines.m @@ -0,0 +1,56 @@ +// +// GTMExceptionalInlines.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMExceptionalInlines.h" + +NSRange GTMNSMakeRange(NSUInteger loc, NSUInteger len) { + return NSMakeRange(loc, len); +} + +CFRange GTMCFRangeMake(NSUInteger loc, NSUInteger len) { + return CFRangeMake(loc, len); +} + +CGPoint GTMCGPointMake(CGFloat x, CGFloat y) { + return CGPointMake(x, y); +} + +CGSize GTMCGSizeMake(CGFloat width, CGFloat height) { + return CGSizeMake(width, height); +} + +CGRect GTMCGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) { + return CGRectMake(x, y, width, height); +} + +#if !GTM_IPHONE_SDK +// iPhone does not have NSTypes defined, only CGTypes. So no NSRect, NSPoint etc. + +NSPoint GTMNSMakePoint(CGFloat x, CGFloat y) { + return NSMakePoint(x, y); +} + +NSSize GTMNSMakeSize(CGFloat w, CGFloat h) { + return NSMakeSize(w, h); +} + +NSRect GTMNSMakeRect(CGFloat x, CGFloat y, CGFloat w, CGFloat h) { + return NSMakeRect(x, y, w, h); +} + +#endif diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlinesTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlinesTest.m new file mode 100644 index 00000000..61422362 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMExceptionalInlinesTest.m @@ -0,0 +1,71 @@ +// +// GTMExceptionalInlinesTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMExceptionalInlines.h" + +@interface GTMExceptionalInlinesTest : GTMTestCase +@end + +@implementation GTMExceptionalInlinesTest +- (void)testExceptionalInlines { + // Numbers chosen basically at random. + NSUInteger loc = 5; + NSUInteger len = 10; + CGFloat x = 22.5; + CGFloat y = 40.2; + CGFloat h = 21.6; + CGFloat w = 54.2; + + NSRange range1 = GTMNSMakeRange(loc, len); + NSRange range2 = NSMakeRange(loc, len); + STAssertTrue(NSEqualRanges(range1, range2), nil); + + CFRange cfrange1 = GTMCFRangeMake(loc, len); + CFRange cfrange2 = CFRangeMake(loc, len); + STAssertEquals(cfrange1.length, cfrange2.length, nil); + STAssertEquals(cfrange1.location, cfrange2.location, nil); + + + CGPoint cgpoint1 = GTMCGPointMake(x, y); + CGPoint cgpoint2 = CGPointMake(x, y); + STAssertTrue(CGPointEqualToPoint(cgpoint1, cgpoint2), nil); + + CGSize cgsize1 = GTMCGSizeMake(x, y); + CGSize cgsize2 = CGSizeMake(x, y); + STAssertTrue(CGSizeEqualToSize(cgsize1, cgsize2), nil); + + CGRect cgrect1 = GTMCGRectMake(x, y, w, h); + CGRect cgrect2 = CGRectMake(x, y, w, h); + STAssertTrue(CGRectEqualToRect(cgrect1, cgrect2), nil); + +#if !GTM_IPHONE_SDK + NSPoint point1 = GTMNSMakePoint(x, y); + NSPoint point2 = NSMakePoint(x, y); + STAssertTrue(NSEqualPoints(point1, point2), nil); + + NSSize size1 = GTMNSMakeSize(w, h); + NSSize size2 = NSMakeSize(w, h); + STAssertTrue(NSEqualSizes(size1, size2), nil); + + NSRect rect1 = GTMNSMakeRect(x, y, w, h); + NSRect rect2 = NSMakeRect(x, y, w, h); + STAssertTrue(NSEqualRects(rect1, rect2), nil); +#endif +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueue.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueue.h new file mode 100644 index 00000000..a81d433e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueue.h @@ -0,0 +1,78 @@ +// +// GTMFileSystemKQueue.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +#import // for kqueue() and kevent and the NOTE_* constants + +// Event constants +enum { + kGTMFileSystemKQueueDeleteEvent = NOTE_DELETE, + kGTMFileSystemKQueueWriteEvent = NOTE_WRITE, + kGTMFileSystemKQueueExtendEvent = NOTE_EXTEND, + kGTMFileSystemKQueueAttributeChangeEvent = NOTE_ATTRIB, + kGTMFileSystemKQueueLinkChangeEvent = NOTE_LINK, + kGTMFileSystemKQueueRenameEvent = NOTE_RENAME, + kGTMFileSystemKQueueRevokeEvent = NOTE_REVOKE, + kGTMFileSystemKQueueAllEvents = NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | + NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | + NOTE_REVOKE, +}; +typedef unsigned int GTMFileSystemKQueueEvents; + +// GTMFileSystemKQueue. +// +// This is a very simple, easy-to-use class for registering handlers that get +// called when a events happen to a given file system path. +// +// The default runloop for the first path kqueued is used for notification +// delivery, so keep that in mind when you're using this class. This class +// explicitly does not handle arbitrary runloops and threading. +// +@interface GTMFileSystemKQueue : NSObject { + @private + NSString *path_; + int fd_; + GTMFileSystemKQueueEvents events_; + BOOL acrossReplace_; + __weak id target_; + SEL action_; +} + +// |path| is the full path to monitor. |events| is a combination of events +// listed above that you want notification of. |acrossReplace| will cause this +// object to reattach when a the file is deleted & recreated or moved out of the +// way and a new one put in place. |selector| should be of the signature: +// - (void)fileSystemKQueue:(GTMFileSystemKQueue *)fskq +// events:(GTMFileSystemKQueueEvents)events; +// where the events can be one or more of the events listed above ORed together. +// +// NOTE: |acrossReplace| is not fool proof. If the file is renamed/deleted, +// then the object will make one attempt at the time it gets the rename/delete +// to reopen the file. If the new file has not been created, no more action is +// taken. To handle the file coming into existance later, you need to monitor +// the directory in some other way. +- (id)initWithPath:(NSString *)path + forEvents:(GTMFileSystemKQueueEvents)events + acrossReplace:(BOOL)acrossReplace + target:(id)target + action:(SEL)action; + +- (NSString *)path; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueue.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueue.m new file mode 100644 index 00000000..ad516f70 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueue.m @@ -0,0 +1,259 @@ +// +// GTMFileSystemKQueue.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMFileSystemKQueue.h" +#import +#import "GTMDefines.h" +#import "GTMDebugSelectorValidation.h" + + +// File descriptor for the kqueue that will hold all of our file system events. +static int gFileSystemKQueueFileDescriptor = 0; + +// A wrapper around the kqueue file descriptor so we can put it into a +// runloop. +static CFSocketRef gRunLoopSocket = NULL; + + +@interface GTMFileSystemKQueue (PrivateMethods) +- (void)notify:(GTMFileSystemKQueueEvents)eventFFlags; +- (void)addFileDescriptorMonitor:(int)fd; +- (int)registerWithKQueue; +- (void)unregisterWithKQueue; +@end + + +@implementation GTMFileSystemKQueue + +-(id)init { + // Folks shouldn't call init directly, so they get what they deserve. + _GTMDevLog(@"Don't call init, use " + @"initWithPath:forEvents:acrossReplace:target:action:"); + return [self initWithPath:nil forEvents:0 acrossReplace:NO + target:nil action:nil]; +} + + +- (id)initWithPath:(NSString *)path + forEvents:(GTMFileSystemKQueueEvents)events + acrossReplace:(BOOL)acrossReplace + target:(id)target + action:(SEL)action { + + if ((self = [super init])) { + + fd_ = -1; + path_ = [path copy]; + events_ = events; + acrossReplace_ = acrossReplace; + + target_ = target; // Don't retain since target will most likely retain us. + action_ = action; + if ([path_ length] == 0 || !events_ || !target_ || !action_) { + [self release]; + return nil; + } + + // Make sure it imples what we expect + GTMAssertSelectorNilOrImplementedWithArguments(target_, + action_, + @encode(GTMFileSystemKQueue*), + @encode(GTMFileSystemKQueueEvents), + NULL); + + fd_ = [self registerWithKQueue]; + if (fd_ < 0) { + [self release]; + return nil; + } + } + return self; +} + +#if GTM_SUPPORT_GC +- (void)finalize { + [self unregisterWithKQueue]; + + [super finalize]; +} +#endif + +- (void)dealloc { + [self unregisterWithKQueue]; + [path_ release]; + + [super dealloc]; +} + +- (NSString *)path { + return path_; +} + +// Cribbed from Advanced Mac OS X Programming. +static void SocketCallBack(CFSocketRef socketref, CFSocketCallBackType type, + CFDataRef address, const void *data, void *info) { + // We're using CFRunLoop calls here. Even when used on the main thread, they + // don't trigger the draining of the main application's autorelease pool that + // NSRunLoop provides. If we're used in a UI-less app, this means that + // autoreleased objects would never go away, so we provide our own pool here. + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + struct kevent event; + + if (kevent(gFileSystemKQueueFileDescriptor, NULL, 0, &event, 1, NULL) == -1) { + _GTMDevLog(@"could not pick up kqueue event. Errno %d", errno); // COV_NF_LINE + } else { + GTMFileSystemKQueue *fskq = (GTMFileSystemKQueue *)event.udata; + [fskq notify:event.fflags]; + } + + [pool drain]; +} + +// Cribbed from Advanced Mac OS X Programming +- (void)addFileDescriptorMonitor:(int)fd { + _GTMDevAssert(gRunLoopSocket == NULL, @"socket should be NULL at this point"); + + CFSocketContext context = { 0, NULL, NULL, NULL, NULL }; + gRunLoopSocket = CFSocketCreateWithNative(kCFAllocatorDefault, + fd, + kCFSocketReadCallBack, + SocketCallBack, + &context); + if (gRunLoopSocket == NULL) { + _GTMDevLog(@"could not CFSocketCreateWithNative"); // COV_NF_LINE + goto bailout; // COV_NF_LINE + } + + CFRunLoopSourceRef rls; + rls = CFSocketCreateRunLoopSource(NULL, gRunLoopSocket, 0); + if (rls == NULL) { + _GTMDevLog(@"could not create a run loop source"); // COV_NF_LINE + goto bailout; // COV_NF_LINE + } + + CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, + kCFRunLoopDefaultMode); + CFRelease(rls); + + bailout: + return; + +} + +// Returns the FD we got in registering +- (int)registerWithKQueue { + + // Make sure we have our kqueue. + if (gFileSystemKQueueFileDescriptor == 0) { + gFileSystemKQueueFileDescriptor = kqueue(); + + if (gFileSystemKQueueFileDescriptor == -1) { + // COV_NF_START + _GTMDevLog(@"could not make filesystem kqueue. Errno %d", errno); + return -1; + // COV_NF_END + } + + // Add the kqueue file descriptor to the runloop. + [self addFileDescriptorMonitor:gFileSystemKQueueFileDescriptor]; + } + + int newFD = open([path_ fileSystemRepresentation], O_EVTONLY, 0); + if (newFD >= 0) { + + // Add a new event for the file. + struct kevent filter; + EV_SET(&filter, newFD, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, + events_, 0, self); + + const struct timespec noWait = { 0, 0 }; + if (kevent(gFileSystemKQueueFileDescriptor, &filter, 1, NULL, 0, &noWait) == -1) { + // COV_NF_START + _GTMDevLog(@"could not add event for path %@. Errno %d", path_, errno); + close(newFD); + newFD = -1; + // COV_NF_END + } + } + + return newFD; +} + +- (void)unregisterWithKQueue { + // Short-circuit cases where we didn't actually register a kqueue event. + if (fd_ < 0) return; + + struct kevent filter; + EV_SET(&filter, fd_, EVFILT_VNODE, EV_DELETE, 0, 0, self); + + const struct timespec noWait = { 0, 0 }; + if (kevent(gFileSystemKQueueFileDescriptor, &filter, 1, NULL, 0, &noWait) != 0) { + _GTMDevLog(@"could not remove event for path %@. Errno %d", path_, errno); // COV_NF_LINE + } + + // Now close the file down + close(fd_); + fd_ = -1; +} + + +- (void)notify:(GTMFileSystemKQueueEvents)eventFFlags { + + // Some notifications get a little bit of overhead first + + if (eventFFlags & NOTE_REVOKE) { + // COV_NF_START - no good way to do this in a unittest + // Assume revoke means unmount and give up + [self unregisterWithKQueue]; + // COV_NF_END + } + + if (eventFFlags & NOTE_DELETE) { + [self unregisterWithKQueue]; + if (acrossReplace_) { + fd_ = [self registerWithKQueue]; + } + } + + if (eventFFlags & NOTE_RENAME) { + // If we're doing it across replace, we move to the new fd for the new file + // that might have come onto the path. if we aren't doing accross replace, + // nothing to do, just stay on the file. + if (acrossReplace_) { + int newFD = [self registerWithKQueue]; + if (newFD >= 0) { + [self unregisterWithKQueue]; + fd_ = newFD; + } + } + } + + // Now, fire the selector + NSMethodSignature *methodSig = [target_ methodSignatureForSelector:action_]; + _GTMDevAssert(methodSig != nil, @"failed to get the signature?"); + NSInvocation *invocation + = [NSInvocation invocationWithMethodSignature:methodSig]; + [invocation setTarget:target_]; + [invocation setSelector:action_]; + [invocation setArgument:self atIndex:2]; + [invocation setArgument:&eventFFlags atIndex:3]; + [invocation invoke]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueueTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueueTest.m new file mode 100644 index 00000000..c2ded100 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFileSystemKQueueTest.m @@ -0,0 +1,394 @@ +// +// GTMFileSystemKQueueTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMFileSystemKQueue.h" +#import "GTMUnitTestDevLog.h" + +@interface GTMFileSystemKQueueTest : GTMTestCase { + @private + NSString *testPath_; + NSString *testPath2_; +} +@end + + +// Helper class to serve as callback target of the kqueue test +@interface GTMFSKQTestHelper : NSObject { + @private + int writes_, renames_, deletes_; +} +@end + +@implementation GTMFSKQTestHelper + +- (void)callbackForQueue:(GTMFileSystemKQueue *)queue + events:(GTMFileSystemKQueueEvents)event { + if (event & kGTMFileSystemKQueueWriteEvent) { + ++writes_; + } + if (event & kGTMFileSystemKQueueDeleteEvent) { + ++deletes_; + } + if (event & kGTMFileSystemKQueueRenameEvent) { + ++renames_; + } +} +- (int)totals { + return writes_ + renames_ + deletes_; +} +- (int)writes { + return writes_; +} +- (int)renames { + return renames_; +} +- (int)deletes { + return deletes_; +} +@end + + +@implementation GTMFileSystemKQueueTest + +- (void)setUp { + NSString *temp = NSTemporaryDirectory(); + testPath_ + = [[temp stringByAppendingPathComponent: + @"GTMFileSystemKQueueTest.testfile"] retain]; + testPath2_ = [[testPath_ stringByAppendingPathExtension:@"2"] retain]; + + // make sure the files aren't in the way of the test + NSFileManager *fm = [NSFileManager defaultManager]; + [fm removeFileAtPath:testPath_ handler:nil]; + [fm removeFileAtPath:testPath2_ handler:nil]; +} + +- (void)tearDown { + // make sure we clean up the files from a failed test + NSFileManager *fm = [NSFileManager defaultManager]; + [fm removeFileAtPath:testPath_ handler:nil]; + [fm removeFileAtPath:testPath2_ handler:nil]; + + [testPath_ release]; + testPath_ = nil; + [testPath2_ release]; + testPath2_ = nil; +} + +- (void)testInit { + GTMFileSystemKQueue *testKQ; + GTMFSKQTestHelper *helper = [[[GTMFSKQTestHelper alloc] init] autorelease]; + STAssertNotNil(helper, nil); + + // init should fail + [GTMUnitTestDevLog expectString:@"Don't call init, use " + @"initWithPath:forEvents:acrossReplace:target:action:"]; + testKQ = [[[GTMFileSystemKQueue alloc] init] autorelease]; + STAssertNil(testKQ, nil); + + // no path + testKQ + = [[[GTMFileSystemKQueue alloc] initWithPath:nil + forEvents:kGTMFileSystemKQueueAllEvents + acrossReplace:YES + target:helper + action:@selector(callbackForQueue:events:)] autorelease]; + STAssertNil(testKQ, nil); + + // not events + testKQ + = [[[GTMFileSystemKQueue alloc] initWithPath:@"/var/log/system.log" + forEvents:0 + acrossReplace:YES + target:helper + action:@selector(callbackForQueue:events:)] autorelease]; + STAssertNil(testKQ, nil); + + // no target + testKQ + = [[[GTMFileSystemKQueue alloc] initWithPath:@"/var/log/system.log" + forEvents:kGTMFileSystemKQueueAllEvents + acrossReplace:YES + target:nil + action:@selector(callbackForQueue:events:)] autorelease]; + STAssertNil(testKQ, nil); + + // no handler + testKQ + = [[[GTMFileSystemKQueue alloc] initWithPath:@"/var/log/system.log" + forEvents:0 + acrossReplace:YES + target:helper + action:nil] autorelease]; + STAssertNil(testKQ, nil); + + + // path that doesn't exist + testKQ + = [[[GTMFileSystemKQueue alloc] initWithPath:@"/path/that/does/not/exist" + forEvents:kGTMFileSystemKQueueAllEvents + acrossReplace:YES + target:helper + action:@selector(callbackForQueue:events:)] autorelease]; + STAssertNil(testKQ, nil); +} + +- (void)spinForEvents:(GTMFSKQTestHelper *)helper { + // Spin the runloop for a second so that the helper callbacks fire + unsigned int attempts = 0; + int initialTotals = [helper totals]; + while (([helper totals] == initialTotals) && (attempts < 10)) { // Try for up to 2s + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]]; + attempts++; + } +} + +- (void)testWriteAndDelete { + + NSFileManager *fm = [NSFileManager defaultManager]; + GTMFSKQTestHelper *helper = [[[GTMFSKQTestHelper alloc] init] autorelease]; + STAssertNotNil(helper, nil); + + STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil); + NSFileHandle *testFH = [NSFileHandle fileHandleForWritingAtPath:testPath_]; + STAssertNotNil(testFH, nil); + + // Start monitoring the file + GTMFileSystemKQueue *testKQ + = [[GTMFileSystemKQueue alloc] initWithPath:testPath_ + forEvents:kGTMFileSystemKQueueAllEvents + acrossReplace:YES + target:helper + action:@selector(callbackForQueue:events:)]; + STAssertNotNil(testKQ, nil); + STAssertEqualObjects([testKQ path], testPath_, nil); + + // Write to the file + [testFH writeData:[@"doh!" dataUsingEncoding:NSUnicodeStringEncoding]]; + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 1, nil); + + // Close and delete + [testFH closeFile]; + STAssertTrue([fm removeFileAtPath:testPath_ handler:nil], nil); + + [self spinForEvents:helper]; + STAssertEquals([helper totals], 2, nil); + + // Clean up the kqueue + [testKQ release]; + testKQ = nil; + + STAssertEquals([helper writes], 1, nil); + STAssertEquals([helper deletes], 1, nil); + STAssertEquals([helper renames], 0, nil); +} + +- (void)testWriteAndDeleteAndWrite { + + // One will pass YES to |acrossReplace|, the other will pass NO. + + NSFileManager *fm = [NSFileManager defaultManager]; + GTMFSKQTestHelper *helper = [[[GTMFSKQTestHelper alloc] init] autorelease]; + STAssertNotNil(helper, nil); + GTMFSKQTestHelper *helper2 = [[[GTMFSKQTestHelper alloc] init] autorelease]; + STAssertNotNil(helper, nil); + + // Create a temp file path + STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil); + NSFileHandle *testFH = [NSFileHandle fileHandleForWritingAtPath:testPath_]; + STAssertNotNil(testFH, nil); + + // Start monitoring the file + GTMFileSystemKQueue *testKQ + = [[GTMFileSystemKQueue alloc] initWithPath:testPath_ + forEvents:kGTMFileSystemKQueueAllEvents + acrossReplace:YES + target:helper + action:@selector(callbackForQueue:events:)]; + STAssertNotNil(testKQ, nil); + STAssertEqualObjects([testKQ path], testPath_, nil); + GTMFileSystemKQueue *testKQ2 + = [[GTMFileSystemKQueue alloc] initWithPath:testPath_ + forEvents:kGTMFileSystemKQueueAllEvents + acrossReplace:NO + target:helper2 + action:@selector(callbackForQueue:events:)]; + STAssertNotNil(testKQ2, nil); + STAssertEqualObjects([testKQ2 path], testPath_, nil); + + // Write to the file + [testFH writeData:[@"doh!" dataUsingEncoding:NSUnicodeStringEncoding]]; + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 1, nil); + STAssertEquals([helper2 totals], 1, nil); + + // Close and delete + [testFH closeFile]; + STAssertTrue([fm removeFileAtPath:testPath_ handler:nil], nil); + + // Recreate + STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil); + testFH = [NSFileHandle fileHandleForWritingAtPath:testPath_]; + STAssertNotNil(testFH, nil); + [testFH writeData:[@"ha!" dataUsingEncoding:NSUnicodeStringEncoding]]; + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 2, nil); + STAssertEquals([helper2 totals], 2, nil); + + // Write to it again + [testFH writeData:[@"continued..." dataUsingEncoding:NSUnicodeStringEncoding]]; + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 3, nil); + STAssertEquals([helper2 totals], 2, nil); + + // Close and delete + [testFH closeFile]; + STAssertTrue([fm removeFileAtPath:testPath_ handler:nil], nil); + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 4, nil); + STAssertEquals([helper2 totals], 2, nil); + + // Clean up the kqueue + [testKQ release]; + testKQ = nil; + [testKQ2 release]; + testKQ2 = nil; + + STAssertEquals([helper writes], 2, nil); + STAssertEquals([helper deletes], 2, nil); + STAssertEquals([helper renames], 0, nil); + STAssertEquals([helper2 writes], 1, nil); + STAssertEquals([helper2 deletes], 1, nil); + STAssertEquals([helper2 renames], 0, nil); +} + +- (void)testWriteAndRenameAndWrite { + + // One will pass YES to |acrossReplace|, the other will pass NO. + + NSFileManager *fm = [NSFileManager defaultManager]; + GTMFSKQTestHelper *helper = [[[GTMFSKQTestHelper alloc] init] autorelease]; + STAssertNotNil(helper, nil); + GTMFSKQTestHelper *helper2 = [[[GTMFSKQTestHelper alloc] init] autorelease]; + STAssertNotNil(helper2, nil); + + // Create a temp file path + STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil); + NSFileHandle *testFH = [NSFileHandle fileHandleForWritingAtPath:testPath_]; + STAssertNotNil(testFH, nil); + + // Start monitoring the file + GTMFileSystemKQueue *testKQ + = [[GTMFileSystemKQueue alloc] initWithPath:testPath_ + forEvents:kGTMFileSystemKQueueAllEvents + acrossReplace:YES + target:helper + action:@selector(callbackForQueue:events:)]; + STAssertNotNil(testKQ, nil); + STAssertEqualObjects([testKQ path], testPath_, nil); + GTMFileSystemKQueue *testKQ2 + = [[GTMFileSystemKQueue alloc] initWithPath:testPath_ + forEvents:kGTMFileSystemKQueueAllEvents + acrossReplace:NO + target:helper2 + action:@selector(callbackForQueue:events:)]; + STAssertNotNil(testKQ2, nil); + STAssertEqualObjects([testKQ2 path], testPath_, nil); + + // Write to the file + [testFH writeData:[@"doh!" dataUsingEncoding:NSUnicodeStringEncoding]]; + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 1, nil); + STAssertEquals([helper2 totals], 1, nil); + + // Move it and create the file again + STAssertTrue([fm movePath:testPath_ toPath:testPath2_ handler:nil], nil); + STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil); + NSFileHandle *testFHPrime + = [NSFileHandle fileHandleForWritingAtPath:testPath_]; + STAssertNotNil(testFHPrime, nil); + [testFHPrime writeData:[@"eh?" dataUsingEncoding:NSUnicodeStringEncoding]]; + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 2, nil); + STAssertEquals([helper2 totals], 2, nil); + + // Write to the new file + [testFHPrime writeData:[@"continue..." dataUsingEncoding:NSUnicodeStringEncoding]]; + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 3, nil); + STAssertEquals([helper2 totals], 2, nil); + + // Write to the old file + [testFH writeData:[@"continue old..." dataUsingEncoding:NSUnicodeStringEncoding]]; + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 3, nil); + STAssertEquals([helper2 totals], 3, nil); + + // and now close old + [testFH closeFile]; + STAssertTrue([fm removeFileAtPath:testPath2_ handler:nil], nil); + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 3, nil); + STAssertEquals([helper2 totals], 4, nil); + + // and now close new + [testFHPrime closeFile]; + STAssertTrue([fm removeFileAtPath:testPath_ handler:nil], nil); + + // Spin the runloop for a second so that the helper callbacks fire + [self spinForEvents:helper]; + STAssertEquals([helper totals], 4, nil); + STAssertEquals([helper2 totals], 4, nil); + + // Clean up the kqueue + [testKQ release]; + testKQ = nil; + [testKQ2 release]; + testKQ2 = nil; + + STAssertEquals([helper writes], 2, nil); + STAssertEquals([helper deletes], 1, nil); + STAssertEquals([helper renames], 1, nil); + STAssertEquals([helper2 writes], 2, nil); + STAssertEquals([helper2 deletes], 1, nil); + STAssertEquals([helper2 renames], 1, nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCode.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCode.h new file mode 100644 index 00000000..90853b54 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCode.h @@ -0,0 +1,51 @@ +// +// GTMFourCharCode +// Wrapper for FourCharCodes +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +// FourCharCodes are OSTypes, ResTypes etc. This class wraps them if +// you need to store them in dictionaries etc. +@interface GTMFourCharCode : NSObject { + FourCharCode code_; +} + +// returns a string for a FourCharCode ++ (id)stringWithFourCharCode:(FourCharCode)code; + +// String must be 4 chars or less, or you will get nil back. ++ (id)fourCharCodeWithString:(NSString*)string; ++ (id)fourCharCodeWithFourCharCode:(FourCharCode)code; + +// String must be 4 chars or less, or you will get nil back. +- (id)initWithString:(NSString*)string; + +// Designated Initializer +- (id)initWithFourCharCode:(FourCharCode)code; + +// Returns 'APPL' for "APPL" +- (FourCharCode)fourCharCode; + +// For FourCharCode of 'APPL' returns "APPL". For 1 returns "\0\0\0\1" +- (NSString*)stringValue; + +// For FourCharCode of "APPL" returns an NSNumber with 1095782476 (0x4150504C). +// For 1 returns 1. +- (NSNumber*)numberValue; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCode.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCode.m new file mode 100644 index 00000000..f5a08bff --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCode.m @@ -0,0 +1,98 @@ +// +// GTMFourCharCode.m +// Wrapper for FourCharCodes +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" +#import "GTMFourCharCode.h" +#import "GTMGarbageCollection.h" +#import + +@implementation GTMFourCharCode + ++ (id)stringWithFourCharCode:(FourCharCode)code { + return GTMCFAutorelease(UTCreateStringForOSType(code)); +} + ++ (id)fourCharCodeWithString:(NSString*)string { + return [[[self alloc] initWithString:string] autorelease]; +} + ++ (id)fourCharCodeWithFourCharCode:(FourCharCode)code { + return [[[self alloc] initWithFourCharCode:code] autorelease]; +} + +- (id)initWithString:(NSString*)string { + NSUInteger length = [string length]; + if (length == 0 || length > 4) { + [self release]; + return nil; + } else { + return [self initWithFourCharCode:UTGetOSTypeFromString((CFStringRef)string)]; + } +} + +- (id)initWithFourCharCode:(FourCharCode)code { + if ((self = [super init])) { + code_ = code; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + if ((self = [super init])) { + code_ = [aDecoder decodeInt32ForKey:@"FourCharCode"]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeInt32:code_ forKey:@"FourCharCode"]; +} + +- (id)copyWithZone:(NSZone *)zone { + return [[[self class] alloc] initWithFourCharCode:code_]; +} + +- (BOOL)isEqual:(id)object { + return [object isKindOfClass:[self class]] && [object fourCharCode] == code_; +} + +- (NSUInteger)hash { + return (NSUInteger)code_; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ - %@ (0x%X)", + [self class], + [self stringValue], + code_]; +} + +- (FourCharCode)fourCharCode { + return code_; +} + +- (NSString*)stringValue { + return GTMCFAutorelease(UTCreateStringForOSType(code_)); +} + +- (NSNumber*)numberValue { + return [NSNumber numberWithUnsignedInt:code_]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCodeTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCodeTest.m new file mode 100644 index 00000000..f91b8f2b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMFourCharCodeTest.m @@ -0,0 +1,82 @@ +// +// GTMFourCharCodeTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMFourCharCode.h" + +@interface GTMFourCharCodeTest : GTMTestCase +@end + +@implementation GTMFourCharCodeTest + +const FourCharCode kGTMHighMacOSRomanCode = 0xA5A8A9AA; // '•®©™' + +- (void)testFourCharCode { + GTMFourCharCode *fcc = [GTMFourCharCode fourCharCodeWithString:@"APPL"]; + STAssertNotNil(fcc, nil); + STAssertEqualObjects([fcc stringValue], @"APPL", nil); + STAssertEqualObjects([fcc numberValue], [NSNumber numberWithUnsignedInt:'APPL'], nil); + STAssertEquals([fcc fourCharCode], (FourCharCode)'APPL', nil); + + STAssertEqualObjects([fcc description], @"GTMFourCharCode - APPL (0x4150504C)", nil); + STAssertEquals([fcc hash], (NSUInteger)'APPL', nil); + + GTMFourCharCode *fcc2 = [GTMFourCharCode fourCharCodeWithFourCharCode:kGTMHighMacOSRomanCode]; + STAssertNotNil(fcc2, nil); + STAssertEqualObjects([fcc2 stringValue], @"•®©™", nil); + STAssertEqualObjects([fcc2 numberValue], [NSNumber numberWithUnsignedInt:kGTMHighMacOSRomanCode], nil); + STAssertEquals([fcc2 fourCharCode], (FourCharCode)kGTMHighMacOSRomanCode, nil); + + STAssertNotEqualObjects(fcc, fcc2, nil); + + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:fcc]; + STAssertNotNil(data, nil); + fcc2 = (GTMFourCharCode*)[NSKeyedUnarchiver unarchiveObjectWithData:data]; + STAssertNotNil(fcc2, nil); + STAssertEqualObjects(fcc, fcc2, nil); + + fcc = [[[GTMFourCharCode alloc] initWithFourCharCode:'\?\?\?\?'] autorelease]; + STAssertNotNil(fcc, nil); + STAssertEqualObjects([fcc stringValue], @"????", nil); + STAssertEqualObjects([fcc numberValue], [NSNumber numberWithUnsignedInt:'\?\?\?\?'], nil); + STAssertEquals([fcc fourCharCode], (FourCharCode)'\?\?\?\?', nil); + + fcc = [[[GTMFourCharCode alloc] initWithString:@"????"] autorelease]; + STAssertNotNil(fcc, nil); + STAssertEqualObjects([fcc stringValue], @"????", nil); + STAssertEqualObjects([fcc numberValue], [NSNumber numberWithUnsignedInt:'\?\?\?\?'], nil); + STAssertEquals([fcc fourCharCode], (FourCharCode)'\?\?\?\?', nil); + + fcc = [GTMFourCharCode fourCharCodeWithFourCharCode:1]; + STAssertNotNil(fcc, nil); + STAssertEqualObjects([fcc stringValue], @"\0\0\0\1", nil); + STAssertEqualObjects([fcc numberValue], [NSNumber numberWithUnsignedInt:1], nil); + STAssertEquals([fcc fourCharCode], (FourCharCode)1, nil); + + + fcc = [GTMFourCharCode fourCharCodeWithString:@"BADDSTRING"]; + STAssertNil(fcc, nil); +} + +- (void)testStringWithCode { + STAssertEqualObjects([GTMFourCharCode stringWithFourCharCode:'APPL'], @"APPL", nil); + STAssertEqualObjects([GTMFourCharCode stringWithFourCharCode:1], @"\0\0\0\1", nil); + STAssertEqualObjects([GTMFourCharCode stringWithFourCharCode:kGTMHighMacOSRomanCode], @"•®©™", nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGarbageCollection.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGarbageCollection.h new file mode 100644 index 00000000..93d4efab --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGarbageCollection.h @@ -0,0 +1,72 @@ +// +// GTMGarbageCollection.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +#import "GTMDefines.h" + +// This allows us to easily move our code from GC to non GC. +// They are no-ops unless we are require Leopard or above. +// See +// http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/index.html +// and +// http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html#//apple_ref/doc/uid/TP40006687-SW1 +// for details. + +#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) && !GTM_IPHONE_SDK +// General use would be to call this through GTMCFAutorelease +// but there may be a reason the you want to make something collectable +// but not autoreleased, especially in pure GC code where you don't +// want to bother with the nop autorelease. Done as a define instead of an +// inline so that tools like Clang's scan-build don't report code as leaking. +#define GTMNSMakeCollectable(cf) ((id)NSMakeCollectable(cf)) + +// GTMNSMakeUncollectable is for global maps, etc. that we don't +// want released ever. You should still retain these in non-gc code. +GTM_INLINE void GTMNSMakeUncollectable(id object) { + [[NSGarbageCollector defaultCollector] disableCollectorForPointer:object]; +} + +// Hopefully no code really needs this, but GTMIsGarbageCollectionEnabled is +// a common way to check at runtime if GC is on. +// There are some places where GC doesn't work w/ things w/in Apple's +// frameworks, so this is here so GTM unittests and detect it, and not run +// individual tests to work around bugs in Apple's frameworks. +GTM_INLINE BOOL GTMIsGarbageCollectionEnabled(void) { + return ([NSGarbageCollector defaultCollector] != nil); +} + +#else + +#define GTMNSMakeCollectable(cf) ((id)(cf)) + +GTM_INLINE void GTMNSMakeUncollectable(id object) { +} + +GTM_INLINE BOOL GTMIsGarbageCollectionEnabled(void) { + return NO; +} + +#endif + +// GTMCFAutorelease makes a CF object collectable in GC mode, or adds it +// to the autorelease pool in non-GC mode. Either way it is taken care +// of. Done as a define instead of an inline so that tools like Clang's +// scan-build don't report code as leaking. +#define GTMCFAutorelease(cf) ([GTMNSMakeCollectable(cf) autorelease]) + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtils.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtils.h new file mode 100644 index 00000000..c3d6b1af --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtils.h @@ -0,0 +1,452 @@ +// +// GTMGeometryUtils.h +// +// Utilities for geometrical utilities such as conversions +// between different types. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +enum { + GTMScaleProportionally = 0, // Fit proportionally + GTMScaleToFit, // Forced fit (distort if necessary) + GTMScaleNone, // Don't scale (clip) + GTMScaleToFillProportionally = 101 // Scale proportionally to fill area +}; +typedef NSUInteger GTMScaling; + +enum { + GTMRectAlignCenter = 0, + GTMRectAlignTop, + GTMRectAlignTopLeft, + GTMRectAlignTopRight, + GTMRectAlignLeft, + GTMRectAlignBottom, + GTMRectAlignBottomLeft, + GTMRectAlignBottomRight, + GTMRectAlignRight +}; +typedef NSUInteger GTMRectAlignment; + +#pragma mark - +#pragma mark CG - Point On Rect +/// Return middle of min X side of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// point located in the middle of min X side of rect +GTM_INLINE CGPoint GTMCGMidMinX(CGRect rect) { + return CGPointMake(CGRectGetMinX(rect), CGRectGetMidY(rect)); +} + +/// Return middle of max X side of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// point located in the middle of max X side of rect +GTM_INLINE CGPoint GTMCGMidMaxX(CGRect rect) { + return CGPointMake(CGRectGetMaxX(rect), CGRectGetMidY(rect)); +} + +/// Return middle of max Y side of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// point located in the middle of max Y side of rect +GTM_INLINE CGPoint GTMCGMidMaxY(CGRect rect) { + return CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); +} + +/// Return middle of min Y side of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// point located in the middle of min Y side of rect +GTM_INLINE CGPoint GTMCGMidMinY(CGRect rect) { + return CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); +} + +/// Return center of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// point located in the center of rect +GTM_INLINE CGPoint GTMCGCenter(CGRect rect) { + return CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect)); +} + +#pragma mark - +#pragma mark CG - Rect-Size Conversion + +/// Return size of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// size of rectangle +GTM_INLINE CGSize GTMCGRectSize(CGRect rect) { + return CGSizeMake(CGRectGetWidth(rect), CGRectGetHeight(rect)); +} + +/// Return rectangle of size +// +// Args: +// size - size +// +// Returns: +// rectangle of size (origin 0,0) +GTM_INLINE CGRect GTMCGRectOfSize(CGSize size) { + return CGRectMake(0.0f, 0.0f, size.width, size.height); +} + +#pragma mark - +#pragma mark CG - Rect Scaling and Alignment + +/// Scales an CGRect +// +// Args: +// inRect: Rect to scale +// xScale: fraction to scale (1.0 is 100%) +// yScale: fraction to scale (1.0 is 100%) +// +// Returns: +// Converted Rect +GTM_INLINE CGRect GTMCGRectScale(CGRect inRect, CGFloat xScale, CGFloat yScale) { + return CGRectMake(inRect.origin.x, inRect.origin.y, + inRect.size.width * xScale, inRect.size.height * yScale); +} + + +/// Align rectangles +// +// Args: +// alignee - rect to be aligned +// aligner - rect to be aligned from +// alignment - way to align the rectangles +CGRect GTMCGAlignRectangles(CGRect alignee, CGRect aligner, + GTMRectAlignment alignment); +/// Scale rectangle +// +// Args: +// scalee - rect to be scaled +// size - size to scale to +// scaling - way to scale the rectangle +CGRect GTMCGScaleRectangleToSize(CGRect scalee, CGSize size, + GTMScaling scaling); + +#pragma mark - +#pragma mark CG - Miscellaneous + +/// Calculate the distance between two points. +// +// Args: +// pt1 first point +// pt2 second point +// +// Returns: +// Distance +GTM_INLINE CGFloat GTMCGDistanceBetweenPoints(CGPoint pt1, CGPoint pt2) { + CGFloat dX = pt1.x - pt2.x; + CGFloat dY = pt1.y - pt2.y; +#if CGFLOAT_IS_DOUBLE + return sqrt(dX * dX + dY * dY); +#else + return sqrtf(dX * dX + dY * dY); +#endif +} + +#if !GTM_IPHONE_SDK +// iPhone does not have NSTypes defined, only CGTypes. So no NSRect, NSPoint etc. + +#pragma mark - +// All of the conversion routines below are basically copied from the +// NSGeometry header in the 10.5 sdk. + +#pragma mark NS <-> CG Point Conversion + +/// Quickly convert from a CGPoint to a NSPoint. +// +/// CGPoints are relative to 0,0 in lower left; +/// NSPoints are relative to 0,0 in lower left +// +// Args: +// inPoint: CGPoint to convert +// +// Returns: +// Converted NSPoint +GTM_INLINE NSPoint GTMCGPointToNSPoint(CGPoint inPoint) { + _GTMCompileAssert(sizeof(NSPoint) == sizeof(CGPoint), NSPoint_and_CGPoint_must_be_the_same_size); + union convertUnion {NSPoint ns; CGPoint cg;}; + return ((union convertUnion *)&inPoint)->ns; +} + +/// Quickly convert from a NSPoint to a CGPoint. +// +/// CGPoints are relative to 0,0 in lower left; +/// NSPoints are relative to 0,0 in lower left +// +// Args: +// inPoint: NSPoint to convert +// +// Returns: +// Converted CGPoint +GTM_INLINE CGPoint GTMNSPointToCGPoint(NSPoint inPoint) { + _GTMCompileAssert(sizeof(NSPoint) == sizeof(CGPoint), NSPoint_and_CGPoint_must_be_the_same_size); + union convertUnion {NSPoint ns; CGPoint cg;}; + return ((union convertUnion *)&inPoint)->cg; +} + +#pragma mark - +#pragma mark NS <-> CG Rect Conversion + +/// Convert from a CGRect to a NSRect. +// +/// NSRect are relative to 0,0 in lower left; +/// CGRect are relative to 0,0 in lower left +// +// Args: +// inRect: CGRect to convert +// +// Returns: +// Converted NSRect +GTM_INLINE NSRect GTMCGRectToNSRect(CGRect inRect) { + _GTMCompileAssert(sizeof(NSRect) == sizeof(CGRect), NSRect_and_CGRect_must_be_the_same_size); + union convertUnion {NSRect ns; CGRect cg;}; + return ((union convertUnion *)&inRect)->ns; +} + +/// Convert from a NSRect to a CGRect. +// +/// NSRect are relative to 0,0 in lower left; +/// CGRect are relative to 0,0 in lower left +// +// Args: +// inRect: NSRect to convert +// +// Returns: +// Converted CGRect +GTM_INLINE CGRect GTMNSRectToCGRect(NSRect inRect) { + _GTMCompileAssert(sizeof(NSRect) == sizeof(CGRect), NSRect_and_CGRect_must_be_the_same_size); + union convertUnion {NSRect ns; CGRect cg;}; + return ((union convertUnion *)&inRect)->cg; +} + + +#pragma mark - +#pragma mark NS <-> CG Size Conversion + +/// Convert from a CGSize to an NSSize. +// +// Args: +// inSize: CGSize to convert +// +// Returns: +// Converted NSSize +GTM_INLINE NSSize GTMCGSizeToNSSize(CGSize inSize) { + _GTMCompileAssert(sizeof(NSSize) == sizeof(CGSize), NSSize_and_CGSize_must_be_the_same_size); + union convertUnion {NSSize ns; CGSize cg;}; + return ((union convertUnion *)&inSize)->ns; +} + +/// Convert from a NSSize to a CGSize. +// +// Args: +// inSize: NSSize to convert +// +// Returns: +// Converted CGSize +GTM_INLINE CGSize GTMNSSizeToCGSize(NSSize inSize) { + _GTMCompileAssert(sizeof(NSSize) == sizeof(CGSize), NSSize_and_CGSize_must_be_the_same_size); + union convertUnion {NSSize ns; CGSize cg;}; + return ((union convertUnion *)&inSize)->cg; +} + +#pragma mark - +#pragma mark NS - Point On Rect + +/// Return middle of min X side of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// point located in the middle of min X side of rect +GTM_INLINE NSPoint GTMNSMidMinX(NSRect rect) { + return NSMakePoint(NSMinX(rect), NSMidY(rect)); +} + +/// Return middle of max X side of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// point located in the middle of max X side of rect +GTM_INLINE NSPoint GTMNSMidMaxX(NSRect rect) { + return NSMakePoint(NSMaxX(rect), NSMidY(rect)); +} + +/// Return middle of max Y side of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// point located in the middle of max Y side of rect +GTM_INLINE NSPoint GTMNSMidMaxY(NSRect rect) { + return NSMakePoint(NSMidX(rect), NSMaxY(rect)); +} + +/// Return middle of min Y side of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// point located in the middle of min Y side of rect +GTM_INLINE NSPoint GTMNSMidMinY(NSRect rect) { + return NSMakePoint(NSMidX(rect), NSMinY(rect)); +} + +/// Return center of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// point located in the center of rect +GTM_INLINE NSPoint GTMNSCenter(NSRect rect) { + return NSMakePoint(NSMidX(rect), NSMidY(rect)); +} + +#pragma mark - +#pragma mark NS - Rect-Size Conversion + +/// Return size of rectangle +// +// Args: +// rect - rectangle +// +// Returns: +// size of rectangle +GTM_INLINE NSSize GTMNSRectSize(NSRect rect) { + return NSMakeSize(NSWidth(rect), NSHeight(rect)); +} + +/// Return rectangle of size +// +// Args: +// size - size +// +// Returns: +// rectangle of size (origin 0,0) +GTM_INLINE NSRect GTMNSRectOfSize(NSSize size) { + return NSMakeRect(0.0f, 0.0f, size.width, size.height); +} + +#pragma mark - +#pragma mark NS - Rect Scaling and Alignment + +/// Scales an NSRect +// +// Args: +// inRect: Rect to scale +// xScale: fraction to scale (1.0 is 100%) +// yScale: fraction to scale (1.0 is 100%) +// +// Returns: +// Converted Rect +GTM_INLINE NSRect GTMNSRectScale(NSRect inRect, CGFloat xScale, CGFloat yScale) { + return NSMakeRect(inRect.origin.x, inRect.origin.y, + inRect.size.width * xScale, inRect.size.height * yScale); +} + +/// Align rectangles +// +// Args: +// alignee - rect to be aligned +// aligner - rect to be aligned from +GTM_INLINE NSRect GTMNSAlignRectangles(NSRect alignee, NSRect aligner, + GTMRectAlignment alignment) { + return GTMCGRectToNSRect(GTMCGAlignRectangles(GTMNSRectToCGRect(alignee), + GTMNSRectToCGRect(aligner), + alignment)); +} + +/// Align a rectangle to another +// +// Args: +// scalee - rect to be scaled +// scaler - rect to scale to +// scaling - way to scale the rectangle +// alignment - way to align the scaled rectangle +GTM_INLINE NSRect GTMNSScaleRectToRect(NSRect scalee, + NSRect scaler, + GTMScaling scaling, + GTMRectAlignment alignment) { + + return GTMCGRectToNSRect( + GTMCGAlignRectangles( + GTMCGScaleRectangleToSize(GTMNSRectToCGRect(scalee), + GTMNSSizeToCGSize(scaler.size), + scaling), + GTMNSRectToCGRect(scaler), + alignment)); +} + +/// Scale rectangle +// +// Args: +// scalee - rect to be scaled +// size - size to scale to +// scaling - way to scale the rectangle +GTM_INLINE NSRect GTMNSScaleRectangleToSize(NSRect scalee, NSSize size, + GTMScaling scaling) { + return GTMCGRectToNSRect(GTMCGScaleRectangleToSize(GTMNSRectToCGRect(scalee), + GTMNSSizeToCGSize(size), + scaling)); +} + +#pragma mark - +#pragma mark NS - Miscellaneous + +/// Calculate the distance between two points. +// +// Args: +// pt1 first point +// pt2 second point +// +// Returns: +// Distance +GTM_INLINE CGFloat GTMNSDistanceBetweenPoints(NSPoint pt1, NSPoint pt2) { + return GTMCGDistanceBetweenPoints(GTMNSPointToCGPoint(pt1), + GTMNSPointToCGPoint(pt2)); +} + +#endif // !GTM_IPHONE_SDK diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtils.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtils.m new file mode 100644 index 00000000..07de80c3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtils.m @@ -0,0 +1,108 @@ +// +// GTMGeometryUtils.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMGeometryUtils.h" + +/// Align rectangles +// +// Args: +// alignee - rect to be aligned +// aligner - rect to be aligned to +// alignment - alignment to be applied to alignee based on aligner + +CGRect GTMCGAlignRectangles(CGRect alignee, CGRect aligner, GTMRectAlignment alignment) { + switch (alignment) { + case GTMRectAlignTop: + alignee.origin.x = aligner.origin.x + (CGRectGetWidth(aligner) * .5f - CGRectGetWidth(alignee) * .5f); + alignee.origin.y = aligner.origin.y + CGRectGetHeight(aligner) - CGRectGetHeight(alignee); + break; + + case GTMRectAlignTopLeft: + alignee.origin.x = aligner.origin.x; + alignee.origin.y = aligner.origin.y + CGRectGetHeight(aligner) - CGRectGetHeight(alignee); + break; + + case GTMRectAlignTopRight: + alignee.origin.x = aligner.origin.x + CGRectGetWidth(aligner) - CGRectGetWidth(alignee); + alignee.origin.y = aligner.origin.y + CGRectGetHeight(aligner) - CGRectGetHeight(alignee); + break; + + case GTMRectAlignLeft: + alignee.origin.x = aligner.origin.x; + alignee.origin.y = aligner.origin.y + (CGRectGetHeight(aligner) * .5f - CGRectGetHeight(alignee) * .5f); + break; + + case GTMRectAlignBottomLeft: + alignee.origin.x = aligner.origin.x; + alignee.origin.y = aligner.origin.y; + break; + + case GTMRectAlignBottom: + alignee.origin.x = aligner.origin.x + (CGRectGetWidth(aligner) * .5f - CGRectGetWidth(alignee) * .5f); + alignee.origin.y = aligner.origin.y; + break; + + case GTMRectAlignBottomRight: + alignee.origin.x = aligner.origin.x + CGRectGetWidth(aligner) - CGRectGetWidth(alignee); + alignee.origin.y = aligner.origin.y; + break; + + case GTMRectAlignRight: + alignee.origin.x = aligner.origin.x + CGRectGetWidth(aligner) - CGRectGetWidth(alignee); + alignee.origin.y = aligner.origin.y + (CGRectGetHeight(aligner) * .5f - CGRectGetHeight(alignee) * .5f); + break; + + default: + case GTMRectAlignCenter: + alignee.origin.x = aligner.origin.x + (CGRectGetWidth(aligner) * .5f - CGRectGetWidth(alignee) * .5f); + alignee.origin.y = aligner.origin.y + (CGRectGetHeight(aligner) * .5f - CGRectGetHeight(alignee) * .5f); + break; + } + return alignee; +} + +CGRect GTMCGScaleRectangleToSize(CGRect scalee, CGSize size, GTMScaling scaling) { + switch (scaling) { + + case GTMScaleToFillProportionally: + case GTMScaleProportionally: { + CGFloat height = CGRectGetHeight(scalee); + CGFloat width = CGRectGetWidth(scalee); + if (isnormal(height) && isnormal(width) && + (height > size.height || width > size.width)) { + CGFloat horiz = size.width / width; + CGFloat vert = size.height / height; + BOOL expand = (scaling == GTMScaleToFillProportionally); + // We use the smaller scale unless expand is true. In that case, larger. + CGFloat newScale = ((horiz < vert) ^ expand) ? horiz : vert; + scalee = GTMCGRectScale(scalee, newScale, newScale); + } + break; + } + + case GTMScaleToFit: + scalee.size = size; + break; + + case GTMScaleNone: + default: + // Do nothing + break; + } + return scalee; +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtilsTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtilsTest.m new file mode 100644 index 00000000..38b86fbd --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMGeometryUtilsTest.m @@ -0,0 +1,331 @@ +// +// GTMGeometryUtilsTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMGeometryUtils.h" + +@interface GTMGeometryUtilsTest : GTMTestCase +@end + +@implementation GTMGeometryUtilsTest + +#if !GTM_IPHONE_SDK +- (void)testGTMCGPointToNSPoint { + CGPoint cgPoint = CGPointMake(15.1,6.2); + NSPoint nsPoint = GTMCGPointToNSPoint(cgPoint); + STAssertTrue(CGPointEqualToPoint(*(CGPoint*)&nsPoint, cgPoint), nil); +} + +- (void)testGTMNSPointToCGPoint { + NSPoint nsPoint = NSMakePoint(10.2,1.5); + CGPoint cgPoint = GTMNSPointToCGPoint(nsPoint); + STAssertTrue(CGPointEqualToPoint(cgPoint, *(CGPoint*)&nsPoint), nil); +} + +- (void)testGTMCGRectToNSRect { + CGRect cgRect = CGRectMake(1.5,2.4,10.6,11.7); + NSRect nsRect = GTMCGRectToNSRect(cgRect); + STAssertTrue(CGRectEqualToRect(cgRect, *(CGRect*)&nsRect), nil); +} + +- (void)testGTMNSRectToCGRect { + NSRect nsRect = NSMakeRect(4.6,3.2,22.1,45.0); + CGRect cgRect = GTMNSRectToCGRect(nsRect); + STAssertTrue(CGRectEqualToRect(cgRect, *(CGRect*)&nsRect), nil); +} + +- (void)testGTMCGSizeToNSSize { + CGSize cgSize = {5,6}; + NSSize nsSize = GTMCGSizeToNSSize(cgSize); + STAssertTrue(CGSizeEqualToSize(cgSize, *(CGSize*)&nsSize), nil); +} + +- (void)testGTMNSSizeToCGSize { + NSSize nsSize = {22,15}; + CGSize cgSize = GTMNSSizeToCGSize(nsSize); + STAssertTrue(CGSizeEqualToSize(cgSize, *(CGSize*)&nsSize), nil); +} + +- (void)testGTMNSPointsOnRect { + NSRect rect = NSMakeRect(0, 0, 2, 2); + + NSPoint point = GTMNSMidMinX(rect); + STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(point.x, (CGFloat)0.0, (CGFloat)0.01, nil); + + point = GTMNSMidMaxX(rect); + STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(point.x, (CGFloat)2.0, (CGFloat)0.01, nil); + + point = GTMNSMidMaxY(rect); + STAssertEqualsWithAccuracy(point.y, (CGFloat)2.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil); + + point = GTMNSMidMinY(rect); + STAssertEqualsWithAccuracy(point.y, (CGFloat)0.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil); + + point = GTMNSCenter(rect); + STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil); +} + +- (void)testGTMNSRectSize { + NSSize nsSize = GTMNSRectSize(NSMakeRect(1, 1, 10, 5)); + STAssertEqualsWithAccuracy(nsSize.width, (CGFloat)10.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(nsSize.height, (CGFloat)5.0, (CGFloat)0.01, nil); +} + +- (void)testGTMNSRectOfSize { + NSRect outRect = GTMNSRectOfSize(NSMakeSize(10, 5)); + NSRect expectedRect = NSMakeRect(0, 0, 10, 5); + STAssertEquals(outRect, expectedRect, nil); +} + +- (void)testGTMNSAlignRectangles { + typedef struct { + NSPoint expectedOrigin; + GTMRectAlignment alignment; + } TestData; + + TestData data[] = { + { {1,2}, GTMRectAlignTop }, + { {0,2}, GTMRectAlignTopLeft }, + { {2,2}, GTMRectAlignTopRight }, + { {0,1}, GTMRectAlignLeft }, + { {1,0}, GTMRectAlignBottom }, + { {0,0}, GTMRectAlignBottomLeft }, + { {2,0}, GTMRectAlignBottomRight }, + { {2,1}, GTMRectAlignRight }, + { {1,1}, GTMRectAlignCenter }, + }; + + NSRect rect1 = NSMakeRect(0, 0, 4, 4); + NSRect rect2 = NSMakeRect(0, 0, 2, 2); + + NSRect expectedRect; + expectedRect.size = NSMakeSize(2, 2); + + for (size_t i = 0; i < sizeof(data) / sizeof(TestData); i++) { + expectedRect.origin = data[i].expectedOrigin; + NSRect outRect = GTMNSAlignRectangles(rect2, rect1, data[i].alignment); + STAssertEquals(outRect, expectedRect, nil); + } +} + +- (void)testGTMNSScaleRectangleToSize { + NSRect rect = NSMakeRect(0.0f, 0.0f, 10.0f, 10.0f); + typedef struct { + NSSize size_; + NSSize newSize_; + } Test; + Test tests[] = { + { { 5.0, 10.0 }, { 5.0, 5.0 } }, + { { 10.0, 5.0 }, { 5.0, 5.0 } }, + { { 10.0, 10.0 }, { 10.0, 10.0 } }, + { { 11.0, 11.0, }, { 10.0, 10.0 } }, + { { 5.0, 2.0 }, { 2.0, 2.0 } }, + { { 2.0, 5.0 }, { 2.0, 2.0 } }, + { { 2.0, 2.0 }, { 2.0, 2.0 } }, + { { 0.0, 10.0 }, { 0.0, 0.0 } } + }; + + for (size_t i = 0; i < sizeof(tests) / sizeof(Test); ++i) { + NSRect result = GTMNSScaleRectangleToSize(rect, tests[i].size_, + GTMScaleProportionally); + STAssertEquals(result, GTMNSRectOfSize(tests[i].newSize_), @"failed on test %zd", i); + } + + NSRect result = GTMNSScaleRectangleToSize(NSZeroRect, tests[0].size_, + GTMScaleProportionally); + STAssertEquals(result, NSZeroRect, nil); + + result = GTMNSScaleRectangleToSize(rect, tests[0].size_, + GTMScaleToFit); + STAssertEquals(result, GTMNSRectOfSize(tests[0].size_), nil); + + result = GTMNSScaleRectangleToSize(rect, tests[0].size_, + GTMScaleNone); + STAssertEquals(result, rect, nil); +} + + +- (void)testGTMNSScaleRectToRect { + typedef struct { + NSRect expectedRect; + GTMScaling scaling; + GTMRectAlignment alignment; + } TestData; + + NSRect rect1 = NSMakeRect(0, 0, 4, 4); + NSRect rect2 = NSMakeRect(0, 0, 2, 1); + + TestData data[] = { + { NSMakeRect(2, 3, 2, 1), GTMScaleToFillProportionally, GTMRectAlignTopRight }, + { NSMakeRect(0, 0, 4, 4), GTMScaleToFit, GTMRectAlignCenter }, + { NSMakeRect(1, 1.5, 2, 1), GTMScaleNone, GTMRectAlignCenter }, + { NSMakeRect(1, 0, 2, 1), GTMScaleProportionally, GTMRectAlignBottom }, + }; + + for (size_t i = 0; i < sizeof(data) / sizeof(TestData); i++) { + NSRect outRect = GTMNSScaleRectToRect(rect2, rect1, data[i].scaling, data[i].alignment); + STAssertEquals(outRect, data[i].expectedRect, nil); + } +} + + +- (void)testGTMNSDistanceBetweenPoints { + NSPoint pt1 = NSMakePoint(0, 0); + NSPoint pt2 = NSMakePoint(3, 4); + STAssertEquals(GTMNSDistanceBetweenPoints(pt1, pt2), (CGFloat)5.0, nil); + STAssertEquals(GTMNSDistanceBetweenPoints(pt2, pt1), (CGFloat)5.0, nil); + pt1 = NSMakePoint(1, 1); + pt2 = NSMakePoint(1, 1); + STAssertEquals(GTMNSDistanceBetweenPoints(pt1, pt2), (CGFloat)0.0, nil); +} + +- (void)testGTMNSRectScaling { + NSRect rect = NSMakeRect(1.0f, 2.0f, 5.0f, 10.0f); + NSRect rect2 = NSMakeRect((CGFloat)1.0, (CGFloat)2.0, (CGFloat)1.0, (CGFloat)12.0); + STAssertEquals(GTMNSRectScale(rect, (CGFloat)0.2, (CGFloat)1.2), + rect2, nil); +} + +#endif // !GTM_IPHONE_SDK + +- (void)testGTMCGDistanceBetweenPoints { + CGPoint pt1 = CGPointMake(0, 0); + CGPoint pt2 = CGPointMake(3, 4); + STAssertEquals(GTMCGDistanceBetweenPoints(pt1, pt2), (CGFloat)5.0, nil); + STAssertEquals(GTMCGDistanceBetweenPoints(pt2, pt1), (CGFloat)5.0, nil); + pt1 = CGPointMake(1, 1); + pt2 = CGPointMake(1, 1); + STAssertEquals(GTMCGDistanceBetweenPoints(pt1, pt2), (CGFloat)0.0, nil); +} + +- (void)testGTMCGAlignRectangles { + typedef struct { + CGPoint expectedOrigin; + GTMRectAlignment alignment; + } TestData; + + TestData data[] = { + { {1,2}, GTMRectAlignTop }, + { {0,2}, GTMRectAlignTopLeft }, + { {2,2}, GTMRectAlignTopRight }, + { {0,1}, GTMRectAlignLeft }, + { {1,0}, GTMRectAlignBottom }, + { {0,0}, GTMRectAlignBottomLeft }, + { {2,0}, GTMRectAlignBottomRight }, + { {2,1}, GTMRectAlignRight }, + { {1,1}, GTMRectAlignCenter }, + }; + + CGRect rect1 = CGRectMake(0, 0, 4, 4); + CGRect rect2 = CGRectMake(0, 0, 2, 2); + + CGRect expectedRect; + expectedRect.size = CGSizeMake(2, 2); + + for (size_t i = 0; i < sizeof(data) / sizeof(TestData); i++) { + expectedRect.origin = data[i].expectedOrigin; + CGRect outRect = GTMCGAlignRectangles(rect2, rect1, data[i].alignment); + STAssertEquals(outRect, expectedRect, nil); + } +} + +- (void)testGTMCGPointsOnRect { + CGRect rect = CGRectMake(0, 0, 2, 2); + + CGPoint point = GTMCGMidMinX(rect); + STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(point.x, (CGFloat)0.0, (CGFloat)0.01, nil); + + point = GTMCGMidMaxX(rect); + STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(point.x, (CGFloat)2.0, (CGFloat)0.01, nil); + + point = GTMCGMidMaxY(rect); + STAssertEqualsWithAccuracy(point.y, (CGFloat)2.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil); + + point = GTMCGMidMinY(rect); + STAssertEqualsWithAccuracy(point.y, (CGFloat)0.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil); + + point = GTMCGCenter(rect); + STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil); +} + +- (void)testGTMCGRectSize { + CGSize cgSize = GTMCGRectSize(CGRectMake(1, 1, 10, 5)); + STAssertEqualsWithAccuracy(cgSize.width, (CGFloat)10.0, (CGFloat)0.01, nil); + STAssertEqualsWithAccuracy(cgSize.height, (CGFloat)5.0, (CGFloat)0.01, nil); +} + +- (void)testGTMCGRectOfSize { + CGRect outRect = GTMCGRectOfSize(CGSizeMake(10, 5)); + CGRect expectedRect = CGRectMake(0, 0, 10, 5); + STAssertEquals(outRect, expectedRect, nil); +} + +- (void)testGTMCGRectScaling { + CGRect rect = CGRectMake(1.0f, 2.0f, 5.0f, 10.0f); + CGRect rect2 = CGRectMake((CGFloat)1.0, (CGFloat)2.0, (CGFloat)1.0, (CGFloat)12.0); + STAssertEquals(GTMCGRectScale(rect, (CGFloat)0.2, (CGFloat)1.2), + rect2, nil); +} + +- (void)testGTMCGScaleRectangleToSize { + CGRect rect = CGRectMake(0.0f, 0.0f, 10.0f, 10.0f); + typedef struct { + CGSize size_; + CGSize newSize_; + } Test; + Test tests[] = { + { { 5.0, 10.0 }, { 5.0, 5.0 } }, + { { 10.0, 5.0 }, { 5.0, 5.0 } }, + { { 10.0, 10.0 }, { 10.0, 10.0 } }, + { { 11.0, 11.0, }, { 10.0, 10.0 } }, + { { 5.0, 2.0 }, { 2.0, 2.0 } }, + { { 2.0, 5.0 }, { 2.0, 2.0 } }, + { { 2.0, 2.0 }, { 2.0, 2.0 } }, + { { 0.0, 10.0 }, { 0.0, 0.0 } } + }; + + for (size_t i = 0; i < sizeof(tests) / sizeof(Test); ++i) { + CGRect result = GTMCGScaleRectangleToSize(rect, tests[i].size_, + GTMScaleProportionally); + STAssertEquals(result, GTMCGRectOfSize(tests[i].newSize_), @"failed on test %zd", i); + } + + CGRect result = GTMCGScaleRectangleToSize(CGRectZero, tests[0].size_, + GTMScaleProportionally); + STAssertEquals(result, CGRectZero, nil); + + result = GTMCGScaleRectangleToSize(rect, tests[0].size_, + GTMScaleToFit); + STAssertEquals(result, GTMCGRectOfSize(tests[0].size_), nil); + + result = GTMCGScaleRectangleToSize(rect, tests[0].size_, + GTMScaleNone); + STAssertEquals(result, rect, nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPFetcher.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPFetcher.h new file mode 100644 index 00000000..7377d1c3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPFetcher.h @@ -0,0 +1,22 @@ +// +// GTMHTTPFetcher.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// This class is no more. If you want something like it's functionality, look +// at using the version in the Objective-C GData Client +// (http://code.google.com/p/gdata-objectivec-client/). It provides the same +// functionality and will continue to be maintained. diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServer.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServer.h new file mode 100644 index 00000000..0caa1492 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServer.h @@ -0,0 +1,137 @@ +// +// GTMHTTPServer.h +// +// This is a *very* *simple* webserver that can be built into something, it is +// not meant to stand up a site, it sends all requests to its delegate for +// processing on the main thread. It does not support pipelining, etc. It's +// great for places where you need a simple webserver to unittest some code +// that hits a server. +// +// NOTE: there are several TODOs left in here as markers for things that could +// be done if one wanted to add more to this class. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// +// Based a little on HTTPServer, part of the CocoaHTTPServer sample code +// http://developer.apple.com/samplecode/CocoaHTTPServer/index.html +// + +#import +#import "GTMDefines.h" + +#if GTM_IPHONE_SDK +#import +#endif // GTM_IPHONE_SDK + +// Global contants needed for errors from start + +#undef _EXTERN +#undef _INITIALIZE_AS +#ifdef GTMHTTPSERVER_DEFINE_GLOBALS +#define _EXTERN +#define _INITIALIZE_AS(x) =x +#else +#define _EXTERN GTM_EXTERN +#define _INITIALIZE_AS(x) +#endif + +_EXTERN NSString* kGTMHTTPServerErrorDomain _INITIALIZE_AS(@"com.google.mactoolbox.HTTPServerDomain"); +enum { + kGTMHTTPServerSocketCreateFailedError = -100, + kGTMHTTPServerBindFailedError = -101, + kGTMHTTPServerListenFailedError = -102, + kGTMHTTPServerHandleCreateFailedError = -103, +}; + +@class GTMHTTPRequestMessage, GTMHTTPResponseMessage; + +// ---------------------------------------------------------------------------- + +// See comment at top of file for the intened use of this class. +@interface GTMHTTPServer : NSObject { + @private + __weak id delegate_; + uint16_t port_; + BOOL localhostOnly_; + NSFileHandle *listenHandle_; + NSMutableArray *connections_; +} + +// The delegate must support the httpServer:handleRequest: method in +// NSObject(GTMHTTPServerDeletateMethods) below. +- (id)initWithDelegate:(id)delegate; + +- (id)delegate; + +// Passing port zero will let one get assigned. +- (uint16_t)port; +- (void)setPort:(uint16_t)port; + +// Receive connections on the localHost loopback address only or on all +// interfaces for this machine. The default is to only listen on localhost. +- (BOOL)localhostOnly; +- (void)setLocalhostOnly:(BOOL)yesno; + +// Start/Stop the web server. If there is an error starting up the server, |NO| +// is returned, and the specific startup failure can be returned in |error| (see +// above for the error domain and error codes). If the server is started, |YES| +// is returned and the server's delegate is called for any requests that come +// in. +- (BOOL)start:(NSError **)error; +- (void)stop; + +// returns the number of requests currently active in the server (i.e.-being +// read in, sent replies). +- (NSUInteger)activeRequestCount; + +@end + +@interface NSObject (GTMHTTPServerDeletateMethods) +- (GTMHTTPResponseMessage *)httpServer:(GTMHTTPServer *)server + handleRequest:(GTMHTTPRequestMessage *)request; +@end + +// ---------------------------------------------------------------------------- + +// Encapsulates an http request, one of these is sent to the server's delegate +// for each request. +@interface GTMHTTPRequestMessage : NSObject { + @private + CFHTTPMessageRef message_; +} +- (NSString *)version; +- (NSURL *)URL; +- (NSString *)method; +- (NSData *)body; +- (NSDictionary *)allHeaderFieldValues; +@end + +// ---------------------------------------------------------------------------- + +// Encapsulates an http response, the server's delegate should return one for +// each request received. +@interface GTMHTTPResponseMessage : NSObject { + @private + CFHTTPMessageRef message_; +} ++ (id)responseWithHTMLString:(NSString *)htmlString; ++ (id)responseWithBody:(NSData *)body + contentType:(NSString *)contentType + statusCode:(int)statusCode; ++ (id)emptyResponseWithCode:(int)statusCode; +// TODO: class method for redirections? +// TODO: add helper for expire/no-cache +- (void)setValue:(NSString*)value forHeaderField:(NSString*)headerField; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServer.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServer.m new file mode 100644 index 00000000..4a7a859c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServer.m @@ -0,0 +1,595 @@ +// +// GTMHTTPServer.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// +// Based a little on HTTPServer, part of the CocoaHTTPServer sample code +// http://developer.apple.com/samplecode/CocoaHTTPServer/index.html +// + +#import +#import +#import + +#define GTMHTTPSERVER_DEFINE_GLOBALS +#import "GTMHTTPServer.h" +#import "GTMDebugSelectorValidation.h" +#import "GTMGarbageCollection.h" +#import "GTMDefines.h" + +@interface GTMHTTPServer (PrivateMethods) +- (void)acceptedConnectionNotification:(NSNotification *)notification; +- (NSMutableDictionary *)connectionWithFileHandle:(NSFileHandle *)fileHandle; +- (void)dataAvailableNotification:(NSNotification *)notification; +- (NSMutableDictionary *)lookupConnection:(NSFileHandle *)fileHandle; +- (void)closeConnection:(NSMutableDictionary *)connDict; +- (void)sendResponseOnNewThread:(NSMutableDictionary *)connDict; +- (void)sentResponse:(NSMutableDictionary *)connDict; +@end + +// keys for our connection dictionaries +static NSString *kFileHandle = @"FileHandle"; +static NSString *kRequest = @"Request"; +static NSString *kResponse = @"Response"; + +@interface GTMHTTPRequestMessage (PrivateHelpers) +- (BOOL)isHeaderComplete; +- (BOOL)appendData:(NSData *)data; +- (NSString *)headerFieldValueForKey:(NSString *)key; +- (UInt32)contentLength; +- (void)setBody:(NSData *)body; +@end + +@interface GTMHTTPResponseMessage (PrivateMethods) +- (id)initWithBody:(NSData *)body + contentType:(NSString *)contentType + statusCode:(int)statusCode; +- (NSData*)serializedData; +@end + +@implementation GTMHTTPServer + +- (id)init { + return [self initWithDelegate:nil]; +} + +- (id)initWithDelegate:(id)delegate { + self = [super init]; + if (self) { + if (!delegate) { + _GTMDevLog(@"missing delegate"); + [self release]; + return nil; + } + delegate_ = delegate; + GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(delegate_, + @selector(httpServer:handleRequest:), + // return type + @encode(GTMHTTPResponseMessage *), + // args + @encode(GTMHTTPServer *), + @encode(GTMHTTPRequestMessage *), + NULL); + localhostOnly_ = YES; + connections_ = [[NSMutableArray alloc] init]; + } + return self; +} + +- (void)dealloc { + [self stop]; + [connections_ release]; + [super dealloc]; +} + +#if GTM_SUPPORT_GC +- (void)finalize { + [self stop]; + [super finalize]; +} +#endif + +- (id)delegate { + return delegate_; +} + +- (uint16_t)port { + return port_; +} + +- (void)setPort:(uint16_t)port { + port_ = port; +} + +- (BOOL)localhostOnly { + return localhostOnly_; +} + +- (void)setLocalhostOnly:(BOOL)yesno { + localhostOnly_ = yesno; +} + +- (BOOL)start:(NSError **)error { + _GTMDevAssert(listenHandle_ == nil, + @"start called when we already have a listenHandle_"); + + if (error) *error = NULL; + + NSInteger startFailureCode = 0; + int fd = socket(AF_INET, SOCK_STREAM, 0); + if (fd <= 0) { + // COV_NF_START - we'd need to use up *all* sockets to test this? + startFailureCode = kGTMHTTPServerSocketCreateFailedError; + goto startFailed; + // COV_NF_END + } + + // enable address reuse quicker after we are done w/ our socket + int yes = 1; + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, + (void *)&yes, (socklen_t)sizeof(yes)) != 0) { + _GTMDevLog(@"failed to mark the socket as reusable"); // COV_NF_LINE + } + + // bind + struct sockaddr_in addr; + bzero(&addr, sizeof(addr)); + addr.sin_len = sizeof(addr); + addr.sin_family = AF_INET; + addr.sin_port = htons(port_); + if (localhostOnly_) { + addr.sin_addr.s_addr = htonl(0x7F000001); + } else { + // COV_NF_START - testing this could cause a leopard firewall prompt during tests. + addr.sin_addr.s_addr = htonl(INADDR_ANY); + // COV_NF_END + } + if (bind(fd, (struct sockaddr*)(&addr), (socklen_t)sizeof(addr)) != 0) { + startFailureCode = kGTMHTTPServerBindFailedError; + goto startFailed; + } + + // collect the port back out + if (port_ == 0) { + socklen_t len = (socklen_t)sizeof(addr); + if (getsockname(fd, (struct sockaddr*)(&addr), &len) == 0) { + port_ = ntohs(addr.sin_port); + } + } + + // tell it to listen for connections + if (listen(fd, 5) != 0) { + // COV_NF_START + startFailureCode = kGTMHTTPServerListenFailedError; + goto startFailed; + // COV_NF_END + } + + // now use a filehandle to accept connections + listenHandle_ = + [[NSFileHandle alloc] initWithFileDescriptor:fd closeOnDealloc:YES]; + if (listenHandle_ == nil) { + // COV_NF_START - we'd need to run out of memory to test this? + startFailureCode = kGTMHTTPServerHandleCreateFailedError; + goto startFailed; + // COV_NF_END + } + + // setup notifications for connects + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + [center addObserver:self + selector:@selector(acceptedConnectionNotification:) + name:NSFileHandleConnectionAcceptedNotification + object:listenHandle_]; + [listenHandle_ acceptConnectionInBackgroundAndNotify]; + + // TODO: maybe hit the delegate incase it wants to register w/ NSNetService, + // or just know we're up and running? + + return YES; + +startFailed: + if (error) { + *error = [[[NSError alloc] initWithDomain:kGTMHTTPServerErrorDomain + code:startFailureCode + userInfo:nil] autorelease]; + } + if (fd > 0) { + close(fd); + } + return NO; +} + +- (void)stop { + if (listenHandle_) { + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + [center removeObserver:self + name:NSFileHandleConnectionAcceptedNotification + object:listenHandle_]; + [listenHandle_ release]; + listenHandle_ = nil; + // TODO: maybe hit the delegate in case it wants to unregister w/ + // NSNetService, or just know we've stopped running? + } + [connections_ removeAllObjects]; +} + +- (NSUInteger)activeRequestCount { + return [connections_ count]; +} + +- (NSString *)description { + NSString *result = + [NSString stringWithFormat:@"%@<%p>{ port=%d localHostOnly=%@ status=%@ }", + [self class], self, port_, (localhostOnly_ ? @"YES" : @"NO"), + (listenHandle_ != nil ? @"Started" : @"Stopped") ]; + return result; +} + + +@end + +@implementation GTMHTTPServer (PrivateMethods) + +- (void)acceptedConnectionNotification:(NSNotification *)notification { + NSDictionary *userInfo = [notification userInfo]; + NSFileHandle *newConnection = + [userInfo objectForKey:NSFileHandleNotificationFileHandleItem]; + _GTMDevAssert(newConnection != nil, + @"failed to get the connection in the notification: %@", + notification); + + // make sure we accept more... + [listenHandle_ acceptConnectionInBackgroundAndNotify]; + + // TODO: could let the delegate look at the address, before we start working + // on it. + + NSMutableDictionary *connDict = + [self connectionWithFileHandle:newConnection]; + [connections_ addObject:connDict]; +} + +- (NSMutableDictionary *)connectionWithFileHandle:(NSFileHandle *)fileHandle { + NSMutableDictionary *result = [NSMutableDictionary dictionary]; + + [result setObject:fileHandle forKey:kFileHandle]; + + GTMHTTPRequestMessage *request = + [[[GTMHTTPRequestMessage alloc] init] autorelease]; + [result setObject:request forKey:kRequest]; + + // setup for data notifications + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + [center addObserver:self + selector:@selector(dataAvailableNotification:) + name:NSFileHandleReadCompletionNotification + object:fileHandle]; + [fileHandle readInBackgroundAndNotify]; + + return result; +} + +- (void)dataAvailableNotification:(NSNotification *)notification { + NSFileHandle *connectionHandle = [notification object]; + NSMutableDictionary *connDict = [self lookupConnection:connectionHandle]; + if (connDict == nil) return; // we are no longer tracking this one + + NSDictionary *userInfo = [notification userInfo]; + NSData *readData = [userInfo objectForKey:NSFileHandleNotificationDataItem]; + if ([readData length] == 0) { + // remote side closed + [self closeConnection:connDict]; + return; + } + + // Like Apple's sample, we just keep adding data until we get a full header + // and any referenced body. + + GTMHTTPRequestMessage *request = [connDict objectForKey:kRequest]; + [request appendData:readData]; + + // Is the header complete yet? + if (![request isHeaderComplete]) { + // more data... + [connectionHandle readInBackgroundAndNotify]; + return; + } + + // Do we have all the body? + UInt32 contentLength = [request contentLength]; + NSData *body = [request body]; + NSUInteger bodyLength = [body length]; + if (contentLength > bodyLength) { + // need more data... + [connectionHandle readInBackgroundAndNotify]; + return; + } + + if (contentLength < bodyLength) { + // We got extra (probably someone trying to pipeline on us), trim + // and let the extra data go... + NSData *newBody = [NSData dataWithBytes:[body bytes] + length:contentLength]; + [request setBody:newBody]; + _GTMDevLog(@"Got %lu extra bytes on http request, ignoring them", + (unsigned long)(bodyLength - contentLength)); + } + + GTMHTTPResponseMessage *response = nil; + @try { + // Off to the delegate + response = [delegate_ httpServer:self handleRequest:request]; + } @catch (NSException *e) { + _GTMDevLog(@"Exception trying to handle http request: %@", e); + } // COV_NF_LINE - radar 5851992 only reachable w/ an uncaught exception which isn't testable + + if (!response) { + [self closeConnection:connDict]; + return; + } + + // We don't support connection reuse, so we add (force) the header to close + // every connection. + [response setValue:@"close" forHeaderField:@"Connection"]; + + // spawn thread to send reply (since we do a blocking send) + [connDict setObject:response forKey:kResponse]; + [NSThread detachNewThreadSelector:@selector(sendResponseOnNewThread:) + toTarget:self + withObject:connDict]; +} + +- (NSMutableDictionary *)lookupConnection:(NSFileHandle *)fileHandle { + NSMutableDictionary *result = nil; + NSUInteger max = [connections_ count]; + for (NSUInteger x = 0; x < max; ++x) { + NSMutableDictionary *connDict = [connections_ objectAtIndex:x]; + if (fileHandle == [connDict objectForKey:kFileHandle]) { + result = connDict; + break; + } + } + return result; +} + +- (void)closeConnection:(NSMutableDictionary *)connDict { + // remove the notification + NSFileHandle *connectionHandle = [connDict objectForKey:kFileHandle]; + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + [center removeObserver:self + name:NSFileHandleReadCompletionNotification + object:connectionHandle]; + // in a non GC world, we're fine just letting the connect get closed when + // the object is release when it comes out of connections_, but in a GC world + // it won't get cleaned up + [connectionHandle closeFile]; + + // remove it from the list + [connections_ removeObject:connDict]; +} + +- (void)sendResponseOnNewThread:(NSMutableDictionary *)connDict { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + @try { + GTMHTTPResponseMessage *response = [connDict objectForKey:kResponse]; + NSFileHandle *connectionHandle = [connDict objectForKey:kFileHandle]; + NSData *serialized = [response serializedData]; + [connectionHandle writeData:serialized]; + } @catch (NSException *e) { // COV_NF_START - causing an exception here is to hard in a test + // TODO: let the delegate know about the exception (but do it on the main + // thread) + _GTMDevLog(@"exception while sending reply: %@", e); + } // COV_NF_END + + // back to the main thread to close things down + [self performSelectorOnMainThread:@selector(sentResponse:) + withObject:connDict + waitUntilDone:NO]; + + [pool release]; +} + +- (void)sentResponse:(NSMutableDictionary *)connDict { + // make sure we're still tracking this connection (in case server was stopped) + NSFileHandle *connection = [connDict objectForKey:kFileHandle]; + NSMutableDictionary *connDict2 = [self lookupConnection:connection]; + if (connDict != connDict2) return; + + // TODO: message the delegate that it was sent + + // close it down + [self closeConnection:connDict]; +} + +@end + +#pragma mark - + +@implementation GTMHTTPRequestMessage + +- (id)init { + self = [super init]; + if (self) { + message_ = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, YES); + } + return self; +} + +- (void)dealloc { + if (message_) { + CFRelease(message_); + } + [super dealloc]; +} + +- (NSString *)version { + return GTMCFAutorelease(CFHTTPMessageCopyVersion(message_)); +} + +- (NSURL *)URL { + return GTMCFAutorelease(CFHTTPMessageCopyRequestURL(message_)); +} + +- (NSString *)method { + return GTMCFAutorelease(CFHTTPMessageCopyRequestMethod(message_)); +} + +- (NSData *)body { + return GTMCFAutorelease(CFHTTPMessageCopyBody(message_)); +} + +- (NSDictionary *)allHeaderFieldValues { + return GTMCFAutorelease(CFHTTPMessageCopyAllHeaderFields(message_)); +} + +- (NSString *)description { + CFStringRef desc = CFCopyDescription(message_); + NSString *result = + [NSString stringWithFormat:@"%@<%p>{ message=%@ }", [self class], self, desc]; + CFRelease(desc); + return result; +} + +@end + +@implementation GTMHTTPRequestMessage (PrivateHelpers) + +- (BOOL)isHeaderComplete { + return CFHTTPMessageIsHeaderComplete(message_) ? YES : NO; +} + +- (BOOL)appendData:(NSData *)data { + return CFHTTPMessageAppendBytes(message_, + [data bytes], [data length]) ? YES : NO; +} + +- (NSString *)headerFieldValueForKey:(NSString *)key { + CFStringRef value = NULL; + if (key) { + value = CFHTTPMessageCopyHeaderFieldValue(message_, (CFStringRef)key); + } + return GTMCFAutorelease(value); +} + +- (UInt32)contentLength { + return [[self headerFieldValueForKey:@"Content-Length"] intValue]; +} + +- (void)setBody:(NSData *)body { + if (!body) { + body = [NSData data]; // COV_NF_LINE - can only happen in we fail to make the new data object + } + CFHTTPMessageSetBody(message_, (CFDataRef)body); +} + +@end + +#pragma mark - + +@implementation GTMHTTPResponseMessage + +- (id)init { + return [self initWithBody:nil contentType:nil statusCode:0]; +} + +- (void)dealloc { + if (message_) { + CFRelease(message_); + } + [super dealloc]; +} + ++ (id)responseWithHTMLString:(NSString *)htmlString { + return [self responseWithBody:[htmlString dataUsingEncoding:NSUTF8StringEncoding] + contentType:@"text/html; charset=UTF-8" + statusCode:200]; +} + ++ (id)responseWithBody:(NSData *)body + contentType:(NSString *)contentType + statusCode:(int)statusCode { + return [[[[self class] alloc] initWithBody:body + contentType:contentType + statusCode:statusCode] autorelease]; +} + ++ (id)emptyResponseWithCode:(int)statusCode { + return [[[[self class] alloc] initWithBody:nil + contentType:nil + statusCode:statusCode] autorelease]; +} + +- (void)setValue:(NSString*)value forHeaderField:(NSString*)headerField { + if ([headerField length] == 0) return; + if (value == nil) { + value = @""; + } + CFHTTPMessageSetHeaderFieldValue(message_, + (CFStringRef)headerField, (CFStringRef)value); +} + +- (NSString *)description { + CFStringRef desc = CFCopyDescription(message_); + NSString *result = + [NSString stringWithFormat:@"%@<%p>{ message=%@ }", [self class], self, desc]; + CFRelease(desc); + return result; +} + +@end + +@implementation GTMHTTPResponseMessage (PrivateMethods) + +- (id)initWithBody:(NSData *)body + contentType:(NSString *)contentType + statusCode:(int)statusCode { + self = [super init]; + if (self) { + if ((statusCode < 100) || (statusCode > 599)) { + [self release]; + return nil; + } + message_ = CFHTTPMessageCreateResponse(kCFAllocatorDefault, + statusCode, NULL, + kCFHTTPVersion1_0); + if (!message_) { + // COV_NF_START + [self release]; + return nil; + // COV_NF_END + } + NSUInteger bodyLength = 0; + if (body) { + bodyLength = [body length]; + CFHTTPMessageSetBody(message_, (CFDataRef)body); + } + if ([contentType length] == 0) { + contentType = @"text/html"; + } + NSString *bodyLenStr = + [NSString stringWithFormat:@"%lu", (unsigned long)bodyLength]; + [self setValue:bodyLenStr forHeaderField:@"Content-Length"]; + [self setValue:contentType forHeaderField:@"Content-Type"]; + } + return self; +} + +- (NSData *)serializedData { + return GTMCFAutorelease(CFHTTPMessageCopySerializedMessage(message_)); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServerTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServerTest.m new file mode 100644 index 00000000..fd962afc --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMHTTPServerTest.m @@ -0,0 +1,574 @@ +// +// GTMHTTPServerTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import +#import +#import "GTMSenTestCase.h" +#import "GTMUnitTestDevLog.h" +#import "GTMHTTPServer.h" +#import "GTMRegex.h" + +@interface GTMHTTPServerTest : GTMTestCase { + NSData *fetchedData_; +} +@end + +@interface GTMHTTPServerTest (PrivateMethods) +- (NSData *)fetchFromPort:(unsigned short)port + payload:(NSString *)payload + chunkSize:(NSUInteger)chunkSize; +- (NSFileHandle *)fileHandleSendingToPort:(unsigned short)port + payload:(NSString *)payload + chunkSize:(NSUInteger)chunkSize; +- (void)readFinished:(NSNotification *)notification; +@end + +// helper class +@interface TestServerDelegate : NSObject { + NSMutableArray *requests_; + NSMutableArray *responses_; +} ++ (id)testServerDelegate; +- (NSUInteger)requestCount; +- (GTMHTTPRequestMessage *)popRequest; +- (void)pushResponse:(GTMHTTPResponseMessage *)message; +@end + +// helper that throws while handling its request +@interface TestThrowingServerDelegate : TestServerDelegate +- (GTMHTTPResponseMessage *)httpServer:(GTMHTTPServer *)server + handleRequest:(GTMHTTPRequestMessage *)request; +@end + +// The timings used for waiting for replies +const NSTimeInterval kGiveUpInterval = 5.0; +const NSTimeInterval kRunLoopInterval = 0.01; + +// the size we break writes up into to test the reading code and how long to +// wait between writes. +const NSUInteger kSendChunkSize = 12; +const NSTimeInterval kSendChunkInterval = 0.05; + +// ---------------------------------------------------------------------------- + +@implementation GTMHTTPServerTest + +- (void)testInit { + // bad delegates + [GTMUnitTestDevLog expectString:@"missing delegate"]; + STAssertNil([[GTMHTTPServer alloc] init], nil); + [GTMUnitTestDevLog expectString:@"missing delegate"]; + STAssertNil([[GTMHTTPServer alloc] initWithDelegate:nil], nil); + + TestServerDelegate *delegate = [TestServerDelegate testServerDelegate]; + STAssertNotNil(delegate, nil); + GTMHTTPServer *server = + [[[GTMHTTPServer alloc] initWithDelegate:delegate] autorelease]; + STAssertNotNil(server, nil); + + // some attributes + + STAssertTrue([server delegate] == delegate, nil); + + [server setLocalhostOnly:NO]; + STAssertFalse([server localhostOnly], nil); + [server setLocalhostOnly:YES]; + STAssertTrue([server localhostOnly], nil); + + STAssertEquals([server port], (uint16_t)0, nil); + [server setPort:8080]; + STAssertEquals([server port], (uint16_t)8080, nil); + [server setPort:80]; + STAssertEquals([server port], (uint16_t)80, nil); + + // description (atleast 10 chars) + STAssertGreaterThan([[server description] length], (NSUInteger)10, nil); +} + +- (void)testStartStop { + TestServerDelegate *delegate1 = [TestServerDelegate testServerDelegate]; + STAssertNotNil(delegate1, nil); + GTMHTTPServer *server1 = + [[[GTMHTTPServer alloc] initWithDelegate:delegate1] autorelease]; + STAssertNotNil(server1, nil); + NSError *error = nil; + STAssertTrue([server1 start:&error], @"failed to start (error=%@)", error); + STAssertNil(error, @"error: %@", error); + STAssertGreaterThanOrEqual([server1 port], (uint16_t)1024, + @"how'd we get a reserved port?"); + + TestServerDelegate *delegate2 = [TestServerDelegate testServerDelegate]; + STAssertNotNil(delegate2, nil); + GTMHTTPServer *server2 = + [[[GTMHTTPServer alloc] initWithDelegate:delegate2] autorelease]; + STAssertNotNil(server2, nil); + + // try the reserved port + [server2 setPort:666]; + error = nil; + STAssertFalse([server2 start:&error], nil); + STAssertNotNil(error, nil); + STAssertEqualObjects([error domain], kGTMHTTPServerErrorDomain, nil); + STAssertEquals([error code], (NSInteger)kGTMHTTPServerBindFailedError, + @"port should have been reserved"); + + // try the same port + [server2 setPort:[server1 port]]; + error = nil; + STAssertFalse([server2 start:&error], nil); + STAssertNotNil(error, nil); + STAssertEqualObjects([error domain], kGTMHTTPServerErrorDomain, nil); + STAssertEquals([error code], (NSInteger)kGTMHTTPServerBindFailedError, + @"port should have been in use"); + + // try a random port again so we really start (prove two can run at once) + [server2 setPort:0]; + error = nil; + STAssertTrue([server2 start:&error], @"failed to start (error=%@)", error); + STAssertNil(error, @"error: %@", error); + + // shut them down + [server1 stop]; + [server2 stop]; +} + +- (void)testRequests { + TestServerDelegate *delegate = [TestServerDelegate testServerDelegate]; + STAssertNotNil(delegate, nil); + GTMHTTPServer *server = + [[[GTMHTTPServer alloc] initWithDelegate:delegate] autorelease]; + STAssertNotNil(server, nil); + NSError *error = nil; + STAssertTrue([server start:&error], @"failed to start (error=%@)", error); + STAssertNil(error, @"error: %@", error); + + // a request to test all the fields of a request object + + NSString *payload = + @"PUT /some/server/path HTTP/1.0\r\n" + @"Content-Length: 16\r\n" + @"Custom-Header: Custom_Value\r\n" + @"\r\n" + @"this is the body"; + NSData *reply = + [self fetchFromPort:[server port] payload:payload chunkSize:kSendChunkSize]; + STAssertNotNil(reply, nil); + + GTMHTTPRequestMessage *request = [delegate popRequest]; + STAssertEqualObjects([request version], @"HTTP/1.0", nil); + STAssertEqualObjects([[request URL] absoluteString], @"/some/server/path", nil); + STAssertEqualObjects([request method], @"PUT", nil); + STAssertEqualObjects([request body], + [@"this is the body" dataUsingEncoding:NSUTF8StringEncoding], + nil); + NSDictionary *allHeaders = [request allHeaderFieldValues]; + STAssertNotNil(allHeaders, nil); + STAssertEquals([allHeaders count], (NSUInteger)2, nil); + STAssertEqualObjects([allHeaders objectForKey:@"Content-Length"], + @"16", nil); + STAssertEqualObjects([allHeaders objectForKey:@"Custom-Header"], + @"Custom_Value", nil); + STAssertGreaterThan([[request description] length], (NSUInteger)10, nil); + + // test different request types (in simple form) + + typedef struct { + NSString *method; + NSString *url; + } TestData; + + TestData data[] = { + { @"GET", @"/foo/bar" }, + { @"HEAD", @"/foo/baz" }, + { @"POST", @"/foo" }, + { @"PUT", @"/foo/spam" }, + { @"DELETE", @"/fooby/doo" }, + { @"TRACE", @"/something.html" }, + { @"CONNECT", @"/spam" }, + { @"OPTIONS", @"/wee/doggies" }, + }; + + for (size_t i = 0; i < sizeof(data) / sizeof(TestData); i++) { + payload = [NSString stringWithFormat:@"%@ %@ HTTP/1.0\r\n\r\n", + data[i].method, data[i].url]; + STAssertNotNil(payload, nil); + reply = [self fetchFromPort:[server port] + payload:payload + chunkSize:kSendChunkSize]; + STAssertNotNil(reply, // just want a reply in this test + @"failed of method %@", data[i].method); + request = [delegate popRequest]; + STAssertEqualObjects([[request URL] absoluteString], data[i].url, + @"urls didn't match for index %d", i); + STAssertEqualObjects([request method], data[i].method, + @"methods didn't match for index %d", i); + } + + [server stop]; +} + +- (void)testResponses { + + // some quick init tests for invalid things + STAssertNil([[GTMHTTPResponseMessage alloc] init], nil); + STAssertNil([GTMHTTPResponseMessage responseWithBody:nil + contentType:nil + statusCode:99], + nil); + STAssertNil([GTMHTTPResponseMessage responseWithBody:nil + contentType:nil + statusCode:602], + nil); + + TestServerDelegate *delegate = [TestServerDelegate testServerDelegate]; + STAssertNotNil(delegate, nil); + GTMHTTPServer *server = + [[[GTMHTTPServer alloc] initWithDelegate:delegate] autorelease]; + STAssertNotNil(server, nil); + NSError *error = nil; + STAssertTrue([server start:&error], @"failed to start (error=%@)", error); + STAssertNil(error, @"error: %@", error); + + // test the html helper + + GTMHTTPResponseMessage *expectedResponse = + [GTMHTTPResponseMessage responseWithHTMLString:@"Success!"]; + STAssertNotNil(expectedResponse, nil); + STAssertGreaterThan([[expectedResponse description] length], + (NSUInteger)0, nil); + [delegate pushResponse:expectedResponse]; + NSData *responseData = [self fetchFromPort:[server port] + payload:@"GET /foo HTTP/1.0\r\n\r\n" + chunkSize:kSendChunkSize]; + STAssertNotNil(responseData, nil); + NSString *responseString = + [[[NSString alloc] initWithData:responseData + encoding:NSUTF8StringEncoding] autorelease]; + STAssertNotNil(responseString, nil); + STAssertTrue([responseString hasPrefix:@"HTTP/1.0 200 OK"], nil); + STAssertTrue([responseString hasSuffix:@"Success!"], @"should end w/ our data"); + STAssertNotEquals([responseString rangeOfString:@"Content-Length: 8"].location, + (NSUInteger)NSNotFound, nil); + STAssertNotEquals([responseString rangeOfString:@"Content-Type: text/html; charset=UTF-8"].location, + (NSUInteger)NSNotFound, nil); + + // test the plain code response + + expectedResponse = [GTMHTTPResponseMessage emptyResponseWithCode:299]; + STAssertNotNil(expectedResponse, nil); + STAssertGreaterThan([[expectedResponse description] length], + (NSUInteger)0, nil); + [delegate pushResponse:expectedResponse]; + responseData = [self fetchFromPort:[server port] + payload:@"GET /foo HTTP/1.0\r\n\r\n" + chunkSize:kSendChunkSize]; + STAssertNotNil(responseData, nil); + responseString = + [[[NSString alloc] initWithData:responseData + encoding:NSUTF8StringEncoding] autorelease]; + STAssertNotNil(responseString, nil); + STAssertTrue([responseString hasPrefix:@"HTTP/1.0 299 "], nil); + STAssertNotEquals([responseString rangeOfString:@"Content-Length: 0"].location, + (NSUInteger)NSNotFound, nil); + STAssertNotEquals([responseString rangeOfString:@"Content-Type: text/html"].location, + (NSUInteger)NSNotFound, nil); + + // test the general api w/ extra header add + + expectedResponse = + [GTMHTTPResponseMessage responseWithBody:[@"FOO" dataUsingEncoding:NSUTF8StringEncoding] + contentType:@"some/type" + statusCode:298]; + STAssertNotNil(expectedResponse, nil); + STAssertGreaterThan([[expectedResponse description] length], + (NSUInteger)0, nil); + [expectedResponse setValue:@"Custom_Value" + forHeaderField:@"Custom-Header"]; + [expectedResponse setValue:nil + forHeaderField:@"Custom-Header2"]; + [delegate pushResponse:expectedResponse]; + responseData = [self fetchFromPort:[server port] + payload:@"GET /foo HTTP/1.0\r\n\r\n" + chunkSize:kSendChunkSize]; + STAssertNotNil(responseData, nil); + responseString = + [[[NSString alloc] initWithData:responseData + encoding:NSUTF8StringEncoding] autorelease]; + STAssertNotNil(responseString, nil); + STAssertTrue([responseString hasPrefix:@"HTTP/1.0 298"], nil); + STAssertTrue([responseString hasSuffix:@"FOO"], @"should end w/ our data"); + STAssertNotEquals([responseString rangeOfString:@"Content-Length: 3"].location, + (NSUInteger)NSNotFound, nil); + STAssertNotEquals([responseString rangeOfString:@"Content-Type: some/type"].location, + (NSUInteger)NSNotFound, nil); + STAssertNotEquals([responseString rangeOfString:@"Custom-Header: Custom_Value"].location, + (NSUInteger)NSNotFound, nil); + STAssertNotEquals([responseString rangeOfString:@"Custom-Header2: "].location, + (NSUInteger)NSNotFound, nil); + + [server stop]; +} + +- (void)testRequstEdgeCases { + // test all the odd things about requests + + TestServerDelegate *delegate = [TestServerDelegate testServerDelegate]; + STAssertNotNil(delegate, nil); + GTMHTTPServer *server = + [[[GTMHTTPServer alloc] initWithDelegate:delegate] autorelease]; + STAssertNotNil(server, nil); + NSError *error = nil; + STAssertTrue([server start:&error], @"failed to start (error=%@)", error); + STAssertNil(error, @"error: %@", error); + + // extra data (ie-pipelining) + + NSString *payload = + @"GET /some/server/path HTTP/1.0\r\n" + @"\r\n" + @"GET /some/server/path/too HTTP/1.0\r\n" + @"\r\n"; + // don't chunk this, we want to make sure both requests get to our server + [GTMUnitTestDevLog expectString:@"Got 38 extra bytes on http request, " + "ignoring them"]; + NSData *reply = + [self fetchFromPort:[server port] payload:payload chunkSize:0]; + STAssertNotNil(reply, nil); + STAssertEquals([delegate requestCount], (NSUInteger)1, nil); + + // close w/o full request + { + // local pool so we can force our handle to close + NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init]; + NSFileHandle *handle = + [self fileHandleSendingToPort:[server port] + payload:@"GET /some/server/path HTTP/" + chunkSize:kSendChunkSize]; + STAssertNotNil(handle, nil); + // spin the run loop so reads the start of the request + NSDate* loopIntervalDate = + [NSDate dateWithTimeIntervalSinceNow:kRunLoopInterval]; + [[NSRunLoop currentRunLoop] runUntilDate:loopIntervalDate]; + // make sure we see the request at this point + STAssertEquals([server activeRequestCount], (NSUInteger)1, + @"should have started the request by now"); + // force the connection closed and drop the pool to get all the cleanup to + // happen. + [handle closeFile]; + [localPool drain]; + // spin the run loop so it should see the close + loopIntervalDate = [NSDate dateWithTimeIntervalSinceNow:kRunLoopInterval]; + [[NSRunLoop currentRunLoop] runUntilDate:loopIntervalDate]; + // make sure we didn't get a request (1 is from test before) and make sure + // we don't have some in flight. + STAssertEquals([delegate requestCount], (NSUInteger)1, + @"shouldn't have gotten another request"); + STAssertEquals([server activeRequestCount], (NSUInteger)0, + @"should have cleaned up the pending connection"); + } + +} + +- (void)testExceptionDuringRequest { + + TestServerDelegate *delegate = [TestThrowingServerDelegate testServerDelegate]; + STAssertNotNil(delegate, nil); + GTMHTTPServer *server = + [[[GTMHTTPServer alloc] initWithDelegate:delegate] autorelease]; + STAssertNotNil(server, nil); + NSError *error = nil; + STAssertTrue([server start:&error], @"failed to start (error=%@)", error); + STAssertNil(error, @"error: %@", error); + [GTMUnitTestDevLog expectString:@"Exception trying to handle http request: " + "To test our handling"]; + NSData *responseData = [self fetchFromPort:[server port] + payload:@"GET /foo HTTP/1.0\r\n\r\n" + chunkSize:kSendChunkSize]; + STAssertNotNil(responseData, nil); + STAssertEquals([responseData length], (NSUInteger)0, nil); + STAssertEquals([delegate requestCount], (NSUInteger)1, nil); + STAssertEquals([server activeRequestCount], (NSUInteger)0, nil); +} + +@end + +// ---------------------------------------------------------------------------- + +@implementation GTMHTTPServerTest (PrivateMethods) + +- (NSData *)fetchFromPort:(unsigned short)port + payload:(NSString *)payload + chunkSize:(NSUInteger)chunkSize { + fetchedData_ = nil; + + NSFileHandle *handle = [self fileHandleSendingToPort:port + payload:payload + chunkSize:chunkSize]; + + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + [center addObserver:self + selector:@selector(readFinished:) + name:NSFileHandleReadToEndOfFileCompletionNotification + object:handle]; + [handle readToEndOfFileInBackgroundAndNotify]; + + // wait for our reply + NSDate* giveUpDate = [NSDate dateWithTimeIntervalSinceNow:kGiveUpInterval]; + while (!fetchedData_ && [giveUpDate timeIntervalSinceNow] > 0) { + NSDate* loopIntervalDate = + [NSDate dateWithTimeIntervalSinceNow:kRunLoopInterval]; + [[NSRunLoop currentRunLoop] runUntilDate:loopIntervalDate]; + } + + [center removeObserver:self + name:NSFileHandleReadToEndOfFileCompletionNotification + object:handle]; + + NSData *result = [fetchedData_ autorelease]; + fetchedData_ = nil; + return result; +} + +- (NSFileHandle *)fileHandleSendingToPort:(unsigned short)port + payload:(NSString *)payload + chunkSize:(NSUInteger)chunkSize { + int fd = socket(AF_INET, SOCK_STREAM, 0); + STAssertGreaterThan(fd, 0, @"failed to create socket"); + + struct sockaddr_in addr; + bzero(&addr, sizeof(addr)); + addr.sin_len = sizeof(addr); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = htonl(0x7F000001); + int connectResult = + connect(fd, (struct sockaddr*)(&addr), (socklen_t)sizeof(addr)); + STAssertEquals(connectResult, 0, nil); + + NSFileHandle *handle = + [[[NSFileHandle alloc] initWithFileDescriptor:fd + closeOnDealloc:YES] autorelease]; + STAssertNotNil(handle, nil); + + NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding]; + + // we can send in one block or in chunked mode + if (chunkSize > 0) { + // we don't write the data in one large block, instead of write it out + // in bits to help test the data collection code. + NSUInteger length = [payloadData length]; + for (NSUInteger x = 0 ; x < length ; x += chunkSize) { + NSUInteger dataChunkSize = length - x; + if (dataChunkSize > chunkSize) { + dataChunkSize = chunkSize; + } + NSData *dataChunk + = [payloadData subdataWithRange:NSMakeRange(x, dataChunkSize)]; + [handle writeData:dataChunk]; + // delay after all but the last chunk to give it time to be read. + if ((x + chunkSize) < length) { + NSDate* loopIntervalDate = + [NSDate dateWithTimeIntervalSinceNow:kSendChunkInterval]; + [[NSRunLoop currentRunLoop] runUntilDate:loopIntervalDate]; + } + } + } else { + [handle writeData:payloadData]; + } + + return handle; +} + +- (void)readFinished:(NSNotification *)notification { + NSDictionary *userInfo = [notification userInfo]; + fetchedData_ = + [[userInfo objectForKey:NSFileHandleNotificationDataItem] retain]; +} + +@end + +// ---------------------------------------------------------------------------- + +@implementation TestServerDelegate + +- (id)init { + self = [super init]; + if (self) { + requests_ = [[NSMutableArray alloc] init]; + responses_ = [[NSMutableArray alloc] init]; + } + return self; +} + +- (void)dealloc { + [requests_ release]; + [responses_ release]; + [super dealloc]; +} + ++ (id)testServerDelegate { + return [[[[self class] alloc] init] autorelease]; +} + +- (NSUInteger)requestCount { + return [requests_ count]; +} + +- (GTMHTTPRequestMessage *)popRequest { + GTMHTTPRequestMessage *result = [[[requests_ lastObject] retain] autorelease]; + [requests_ removeLastObject]; + return result; +} + +- (void)pushResponse:(GTMHTTPResponseMessage *)message { + [responses_ addObject:message]; +} + +- (GTMHTTPResponseMessage *)httpServer:(GTMHTTPServer *)server + handleRequest:(GTMHTTPRequestMessage *)request { + [requests_ addObject:request]; + + GTMHTTPResponseMessage *result = nil; + if ([responses_ count] > 0) { + result = [[[responses_ lastObject] retain] autorelease]; + [responses_ removeLastObject]; + } else { + result = [GTMHTTPResponseMessage responseWithHTMLString:@"success"]; + } + return result; +} + +@end + +// ---------------------------------------------------------------------------- + +@implementation TestThrowingServerDelegate + +- (GTMHTTPResponseMessage *)httpServer:(GTMHTTPServer *)server + handleRequest:(GTMHTTPRequestMessage *)request { + // let the base do its normal work for counts, etc. + [super httpServer:server handleRequest:request]; + NSException *exception = + [NSException exceptionWithName:@"InternalTestingException" + reason:@"To test our handling" + userInfo:nil]; + @throw exception; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxy.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxy.h new file mode 100644 index 00000000..2e2a7487 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxy.h @@ -0,0 +1,46 @@ +// +// GTMLightweightProxy.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +// +// GTMLightweightProxy +// +// An object which does nothing but stand in for another object and forward +// messages (other than basic NSObject messages) to it, suitable for breaking +// retain cycles. It does *not* retain the represented object, so the +// represented object must be set to nil when that object is deallocated. +// +// Messages sent to a GTMLightweightProxy with no represented object set will +// be silently discarded. +// +@interface GTMLightweightProxy : NSProxy { + @private + __weak id representedObject_; +} + +// Initializes the object to represent |object|. +- (id)initWithRepresentedObject:(id)object; + +// Gets the object that the proxy represents. +- (id)representedObject; + +// Changes the proxy to represent |object| +- (void)setRepresentedObject:(id)object; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxy.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxy.m new file mode 100644 index 00000000..c00e44bd --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxy.m @@ -0,0 +1,114 @@ +// +// GTMLightweightProxy.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMLightweightProxy.h" +#import "GTMDefines.h" + +@implementation GTMLightweightProxy + +- (id)initWithRepresentedObject:(id)object { + // it's weak, we don't retain + representedObject_ = object; + return self; +} + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 +#if GTM_SUPPORT_GC +// -[NSProxy finalize] is only in 10.5 or later +- (void)finalize { + representedObject_ = nil; + [super finalize]; +} +#endif +#endif + +- (void)dealloc { + // it's weak, we don't release + representedObject_ = nil; + [super dealloc]; +} + +- (id)representedObject { + // Use a local variable to avoid a bogus compiler warning. + id repObject = nil; + @synchronized(self) { + // Even though we don't retain this object, we hang it on the lifetime + // of the calling threads pool so it's lifetime is safe for at least that + // long. + repObject = [representedObject_ retain]; + } + return [repObject autorelease]; +} + +- (void)setRepresentedObject:(id)object { + @synchronized(self) { + representedObject_ = object; + } +} + +// Passes any unhandled method to the represented object if it responds to that +// method. +- (void)forwardInvocation:(NSInvocation*)invocation { + id target = [self representedObject]; + // Silently discard all messages when there's no represented object + if (!target) + return; + + SEL aSelector = [invocation selector]; + if ([target respondsToSelector:aSelector]) + [invocation invokeWithTarget:target]; +} + +// Gets the represented object's method signature for |selector|; necessary for +// forwardInvocation. +- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { + id target = [self representedObject]; + if (target) { + return [target methodSignatureForSelector:selector]; + } else { + // Apple's underlying forwarding code crashes if we return nil here. + // Since we are not going to use the invocation being constructed + // if there's no representedObject, a random valid NSMethodSignature is fine. + return [NSObject methodSignatureForSelector:@selector(alloc)]; + } +} + +// Prevents exceptions from unknown selectors if there is no represented +// object, and makes the exception come from the right place if there is one. +- (void)doesNotRecognizeSelector:(SEL)selector { + id target = [self representedObject]; + if (target) + [target doesNotRecognizeSelector:selector]; +} + +// Checks the represented object's selectors to allow clients of the proxy to +// do respondsToSelector: tests. +- (BOOL)respondsToSelector:(SEL)selector { + if ([super respondsToSelector:selector] || + selector == @selector(initWithRepresentedObject:) || + selector == @selector(representedObject) || + selector == @selector(setRepresentedObject:)) + { + return YES; + } + + id target = [self representedObject]; + return target && [target respondsToSelector:selector]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxyTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxyTest.m new file mode 100644 index 00000000..e50a9dc2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLightweightProxyTest.m @@ -0,0 +1,85 @@ +// +// GTMLightweightProxyTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMLightweightProxy.h" + +@interface GTMLightweightProxyTest : GTMTestCase +- (BOOL)returnYes; +@end + +// Declare a non-existent method that we can call without compiler warnings. +@interface GTMLightweightProxyTest (GTMLightweightProxyTestMadeUpMethodDeclaration) +- (void)someMadeUpMethod; +@end + +@implementation GTMLightweightProxyTest + +- (void)testProxy { + id proxy + = [[[GTMLightweightProxy alloc] initWithRepresentedObject:self] autorelease]; + STAssertEqualObjects(self, [proxy representedObject], + @"Represented object setup failed"); + + // Check that it identifies itself as a proxy. + STAssertTrue([proxy isProxy], @"Should identify as a proxy"); + // Check that it passes class requests on + STAssertTrue([proxy isMemberOfClass:[self class]], + @"Should pass class requests through"); + + // Check that it claims to respond to its selectors. + STAssertTrue([proxy respondsToSelector:@selector(initWithRepresentedObject:)], + @"Claims not to respond to initWithRepresentedObject:"); + STAssertTrue([proxy respondsToSelector:@selector(representedObject)], + @"Claims not to respond to representedObject:"); + STAssertTrue([proxy respondsToSelector:@selector(setRepresentedObject:)], + @"Claims not to respond to setRepresentedObject:"); + // Check that it responds to its represented object's selectors + STAssertTrue([proxy respondsToSelector:@selector(returnYes)], + @"Claims not to respond to returnYes"); + // ... but not to made up selectors. + STAssertThrows([proxy someMadeUpMethod], + @"Calling a bogus method should throw"); + + // Check that callthrough works. + STAssertTrue([proxy returnYes], + @"Calling through to the represented object failed"); + + // Check that nilling out the represented object works. + [proxy setRepresentedObject:nil]; + STAssertTrue([proxy respondsToSelector:@selector(setRepresentedObject:)], + @"Claims not to respond to setRepresentedObject: after nilling" + @" out represented object"); + STAssertFalse([proxy respondsToSelector:@selector(returnYes)], + @"Claims to respond to returnYes after nilling out represented" + @" object"); + // Calling through once the represented object is nil should fail silently + STAssertNoThrow([proxy returnYes], + @"Calling through without a represented object should fail" + @" silently"); + // ... even when they are made up. + STAssertNoThrow([proxy someMadeUpMethod], + @"Calling a bogus method on a nilled proxy should not throw"); +} + +// Simple method to test calling through the proxy. +- (BOOL)returnYes { + return YES; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASL.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASL.h new file mode 100644 index 00000000..689a0d95 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASL.h @@ -0,0 +1,87 @@ +// +// GTMLogger+ASL.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import +#import "GTMLogger.h" + + +// GTMLogger (GTMLoggerASLAdditions) +// +// Adds a convenience creation method that allows you to get a standard +// GTMLogger object that is configured to write to ASL (Apple System Log) using +// the GTMLogASLWriter (declared below). +// +@interface GTMLogger (GTMLoggerASLAdditions) + +// Returns a new autoreleased GTMLogger instance that will log to ASL, using +// the GTMLogStandardFormatter, and the GTMLogLevelFilter filter. ++ (id)standardLoggerWithASL; + +@end + + +@class GTMLoggerASLClient; + +// GTMLogASLWriter +// +// A GTMLogWriter implementation that will send log messages to ASL (Apple +// System Log facility). To use with GTMLogger simply set the "writer" for a +// GTMLogger to be an instance of this class. The following example sets the +// shared system logger to lot to ASL. +// +// [[GTMLogger sharedLogger] setWriter:[GTMLogASLWriter aslWriter]]; +// GTMLoggerInfo(@"Hi"); // This is sent to ASL +// +// See GTMLogger.h for more details and a higher-level view. +// +@interface GTMLogASLWriter : NSObject { + @private + __weak Class aslClientClass_; +} + +// Returns an autoreleased GTMLogASLWriter instance that uses an instance of +// GTMLoggerASLClient. ++ (id)aslWriter; + +// Designated initializer. Uses instances of the specified |clientClass| to talk +// to the ASL system. This method is typically only useful for testing. Users +// should generally NOT use this method to get an instance. Instead, simply use +// the +aslWriter method to obtain an instance. +- (id)initWithClientClass:(Class)clientClass; + +@end // GTMLogASLWriter + + +// Helper class used by GTMLogASLWriter to create an ASL client and write to the +// ASL log. This class is need to make management/cleanup of the aslclient work +// in a multithreaded environment. You'll need one of these GTMLoggerASLClient +// per thread (this is automatically handled by GTMLogASLWriter). +// +// This class should rarely (if EVER) be used directly. It's designed to be used +// internally by GTMLogASLWriter, and by some unit tests. It should not be +// used externally. +@interface GTMLoggerASLClient : NSObject { + @private + aslclient client_; +} + +// Sends the given string to ASL at the specified ASL log |level|. +- (void)log:(NSString *)msg level:(int)level; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASL.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASL.m new file mode 100644 index 00000000..90ea7e57 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASL.m @@ -0,0 +1,126 @@ +// +// GTMLogger+ASL.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMLogger+ASL.h" +#import "GTMDefines.h" + + +@implementation GTMLogger (GTMLoggerASLAdditions) + ++ (id)standardLoggerWithASL { + id me = [self standardLogger]; + [me setWriter:[[[GTMLogASLWriter alloc] init] autorelease]]; + [me setFormatter:[[[GTMLogBasicFormatter alloc] init] autorelease]]; + return me; +} + +@end + + +@implementation GTMLogASLWriter + ++ (id)aslWriter { + return [[[self alloc] init] autorelease]; +} + +- (id)init { + return [self initWithClientClass:nil]; +} + +- (id)initWithClientClass:(Class)clientClass { + if ((self = [super init])) { + aslClientClass_ = clientClass; + if (aslClientClass_ == nil) { + aslClientClass_ = [GTMLoggerASLClient class]; + } + } + return self; +} + +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level { + static NSString *const kASLClientKey = @"GTMLoggerASLClientKey"; + + // Lookup the ASL client in the thread-local storage dictionary + NSMutableDictionary *tls = [[NSThread currentThread] threadDictionary]; + GTMLoggerASLClient *client = [tls objectForKey:kASLClientKey]; + + // If the ASL client wasn't found (e.g., the first call from this thread), + // then create it and store it in the thread-local storage dictionary + if (client == nil) { + client = [[[aslClientClass_ alloc] init] autorelease]; + [tls setObject:client forKey:kASLClientKey]; + } + + // Map the GTMLoggerLevel level to an ASL level. + int aslLevel = ASL_LEVEL_INFO; + switch (level) { + case kGTMLoggerLevelUnknown: + case kGTMLoggerLevelDebug: + case kGTMLoggerLevelInfo: + aslLevel = ASL_LEVEL_NOTICE; + break; + case kGTMLoggerLevelError: + aslLevel = ASL_LEVEL_ERR; + break; + case kGTMLoggerLevelAssert: + aslLevel = ASL_LEVEL_ALERT; + break; + } + + [client log:msg level:aslLevel]; +} + +@end // GTMLogASLWriter + + +@implementation GTMLoggerASLClient + +- (id)init { + if ((self = [super init])) { + client_ = asl_open(NULL, NULL, 0); + if (client_ == nil) { + // COV_NF_START - no real way to test this + [self release]; + return nil; + // COV_NF_END + } + } + return self; +} + +- (void)dealloc { + if (client_) asl_close(client_); + [super dealloc]; +} + +#if GTM_SUPPORT_GC +- (void)finalize { + if (client_) asl_close(client_); + [super finalize]; +} +#endif + +// We don't test this one line because we don't want to pollute actual system +// logs with test messages. +// COV_NF_START +- (void)log:(NSString *)msg level:(int)level { + asl_log(client_, NULL, level, "%s", [msg UTF8String]); +} +// COV_NF_END + +@end // GTMLoggerASLClient diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASLTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASLTest.m new file mode 100644 index 00000000..cd324843 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger+ASLTest.m @@ -0,0 +1,90 @@ +// +// GTMLogger+ASLTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMLogger+ASL.h" +#import "GTMSenTestCase.h" + +@interface DummyASLClient : GTMLoggerASLClient +@end + +static NSMutableArray *gDummyLog; // weak + +@implementation DummyASLClient + +- (void)log:(NSString *)msg level:(int)level { + NSString *line = [msg stringByAppendingFormat:@"@%d", level]; + [gDummyLog addObject:line]; +} + +@end + + +@interface GTMLogger_ASLTest : GTMTestCase +@end + +@implementation GTMLogger_ASLTest + +- (void)testCreation { + GTMLogger *aslLogger = [GTMLogger standardLoggerWithASL]; + STAssertNotNil(aslLogger, nil); + + GTMLogASLWriter *writer = [GTMLogASLWriter aslWriter]; + STAssertNotNil(writer, nil); +} + +- (void)testLogWriter { + gDummyLog = [[[NSMutableArray alloc] init] autorelease]; + GTMLogASLWriter *writer = [[[GTMLogASLWriter alloc] + initWithClientClass:[DummyASLClient class]] + autorelease]; + + + STAssertNotNil(writer, nil); + STAssertTrue([gDummyLog count] == 0, nil); + + // Log some messages + [writer logMessage:@"unknown" level:kGTMLoggerLevelUnknown]; + [writer logMessage:@"debug" level:kGTMLoggerLevelDebug]; + [writer logMessage:@"info" level:kGTMLoggerLevelInfo]; + [writer logMessage:@"error" level:kGTMLoggerLevelError]; + [writer logMessage:@"assert" level:kGTMLoggerLevelAssert]; + + // Inspect the logged message to make sure they were logged correctly. The + // dummy writer will save the messages w/ @level concatenated. The "level" + // will be the ASL level, not the GTMLogger level. GTMLogASLWriter will log + // all + NSArray *expected = [NSArray arrayWithObjects: + @"unknown@5", + @"debug@5", + @"info@5", + @"error@3", + @"assert@1", + nil]; + + STAssertEqualObjects(gDummyLog, expected, nil); + + gDummyLog = nil; +} + +- (void)testASLClient { + GTMLoggerASLClient *client = [[GTMLoggerASLClient alloc] init]; + STAssertNotNil(client, nil); + [client release]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger.h new file mode 100644 index 00000000..1626b1b6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger.h @@ -0,0 +1,458 @@ +// +// GTMLogger.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Key Abstractions +// ---------------- +// +// This file declares multiple classes and protocols that are used by the +// GTMLogger logging system. The 4 main abstractions used in this file are the +// following: +// +// * logger (GTMLogger) - The main logging class that users interact with. It +// has methods for logging at different levels and uses a log writer, a log +// formatter, and a log filter to get the job done. +// +// * log writer (GTMLogWriter) - Writes a given string to some log file, where +// a "log file" can be a physical file on disk, a POST over HTTP to some URL, +// or even some in-memory structure (e.g., a ring buffer). +// +// * log formatter (GTMLogFormatter) - Given a format string and arguments as +// a va_list, returns a single formatted NSString. A "formatted string" could +// be a string with the date prepended, a string with values in a CSV format, +// or even a string of XML. +// +// * log filter (GTMLogFilter) - Given a formatted log message as an NSString +// and the level at which the message is to be logged, this class will decide +// whether the given message should be logged or not. This is a flexible way +// to filter out messages logged at a certain level, messages that contain +// certain text, or filter nothing out at all. This gives the caller the +// flexibility to dynamically enable debug logging in Release builds. +// +// This file also declares some classes to handle the common log writer, log +// formatter, and log filter cases. Callers can also create their own writers, +// formatters, and filters and they can even build them on top of the ones +// declared here. Keep in mind that your custom writer/formatter/filter may be +// called from multiple threads, so it must be thread-safe. + +#import + +// Predeclaration of used protocols that are declared later in this file. +@protocol GTMLogWriter, GTMLogFormatter, GTMLogFilter; + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 +#define CHECK_FORMAT_NSSTRING(a, b) __attribute__((format(__NSString__, a, b))) +#else +#define CHECK_FORMAT_NSSTRING(a, b) +#endif + +// GTMLogger +// +// GTMLogger is the primary user-facing class for an object-oriented logging +// system. It is built on the concept of log formatters (GTMLogFormatter), log +// writers (GTMLogWriter), and log filters (GTMLogFilter). When a message is +// sent to a GTMLogger to log a message, the message is formatted using the log +// formatter, then the log filter is consulted to see if the message should be +// logged, and if so, the message is sent to the log writer to be written out. +// +// GTMLogger is intended to be a flexible and thread-safe logging solution. Its +// flexibility comes from the fact that GTMLogger instances can be customized +// with user defined formatters, filters, and writers. And these writers, +// filters, and formatters can be combined, stacked, and customized in arbitrary +// ways to suit the needs at hand. For example, multiple writers can be used at +// the same time, and a GTMLogger instance can even be used as another +// GTMLogger's writer. This allows for arbitrarily deep logging trees. +// +// A standard GTMLogger uses a writer that sends messages to standard out, a +// formatter that smacks a timestamp and a few other bits of interesting +// information on the message, and a filter that filters out debug messages from +// release builds. Using the standard log settings, a log message will look like +// the following: +// +// 2007-12-30 10:29:24.177 myapp[4588/0xa07d0f60] [lvl=1] foo= +// +// The output contains the date and time of the log message, the name of the +// process followed by its process ID/thread ID, the log level at which the +// message was logged (in the previous example the level was 1: +// kGTMLoggerLevelDebug), and finally, the user-specified log message itself (in +// this case, the log message was @"foo=%@", foo). +// +// Multiple instances of GTMLogger can be created, each configured their own +// way. Though GTMLogger is not a singleton (in the GoF sense), it does provide +// access to a shared (i.e., globally accessible) GTMLogger instance. This makes +// it convenient for all code in a process to use the same GTMLogger instance. +// The shared GTMLogger instance can also be configured in an arbitrary, and +// these configuration changes will affect all code that logs through the shared +// instance. + +// +// Log Levels +// ---------- +// GTMLogger has 3 different log levels: Debug, Info, and Error. GTMLogger +// doesn't take any special action based on the log level; it simply forwards +// this information on to formatters, filters, and writers, each of which may +// optionally take action based on the level. Since log level filtering is +// performed at runtime, log messages are typically not filtered out at compile +// time. The exception to this rule is that calls to the GTMLoggerDebug() macro +// *ARE* filtered out of non-DEBUG builds. This is to be backwards compatible +// with behavior that many developers are currently used to. Note that this +// means that GTMLoggerDebug(@"hi") will be compiled out of Release builds, but +// [[GTMLogger sharedLogger] logDebug:@"hi"] will NOT be compiled out. +// +// Standard loggers are created with the GTMLogLevelFilter log filter, which +// filters out certain log messages based on log level, and some other settings. +// +// In addition to the -logDebug:, -logInfo:, and -logError: methods defined on +// GTMLogger itself, there are also C macros that make usage of the shared +// GTMLogger instance very convenient. These macros are: +// +// GTMLoggerDebug(...) +// GTMLoggerInfo(...) +// GTMLoggerError(...) +// +// Again, a notable feature of these macros is that GTMLogDebug() calls *will be +// compiled out of non-DEBUG builds*. +// +// Standard Loggers +// ---------------- +// GTMLogger has the concept of "standard loggers". A standard logger is simply +// a logger that is pre-configured with some standard/common writer, formatter, +// and filter combination. Standard loggers are created using the creation +// methods beginning with "standard". The alternative to a standard logger is a +// regular logger, which will send messages to stdout, with no special +// formatting, and no filtering. +// +// How do I use GTMLogger? +// ---------------------- +// The typical way you will want to use GTMLogger is to simply use the +// GTMLogger*() macros for logging from code. That way we can easily make +// changes to the GTMLogger class and simply update the macros accordingly. Only +// your application startup code (perhaps, somewhere in main()) should use the +// GTMLogger class directly in order to configure the shared logger, which all +// of the code using the macros will be using. Again, this is just the typical +// situation. +// +// To be complete, there are cases where you may want to use GTMLogger directly, +// or even create separate GTMLogger instances for some reason. That's fine, +// too. +// +// Examples +// -------- +// The following show some common GTMLogger use cases. +// +// 1. You want to log something as simply as possible. Also, this call will only +// appear in debug builds. In non-DEBUG builds it will be completely removed. +// +// GTMLoggerDebug(@"foo = %@", foo); +// +// 2. The previous example is similar to the following. The major difference is +// that the previous call (example 1) will be compiled out of Release builds +// but this statement will not be compiled out. +// +// [[GTMLogger sharedLogger] logDebug:@"foo = %@", foo]; +// +// 3. Send all logging output from the shared logger to a file. We do this by +// creating an NSFileHandle for writing associated with a file, and setting +// that file handle as the logger's writer. +// +// NSFileHandle *f = [NSFileHandle fileHandleForWritingAtPath:@"/tmp/f.log" +// create:YES]; +// [[GTMLogger sharedLogger] setWriter:f]; +// GTMLoggerError(@"hi"); // This will be sent to /tmp/f.log +// +// 4. Create a new GTMLogger that will log to a file. This example differs from +// the previous one because here we create a new GTMLogger that is different +// from the shared logger. +// +// GTMLogger *logger = [GTMLogger standardLoggerWithPath:@"/tmp/temp.log"]; +// [logger logInfo:@"hi temp log file"]; +// +// 5. Create a logger that writes to stdout and does NOT do any formatting to +// the log message. This might be useful, for example, when writing a help +// screen for a command-line tool to standard output. +// +// GTMLogger *logger = [GTMLogger logger]; +// [logger logInfo:@"%@ version 0.1 usage", progName]; +// +// 6. Send log output to stdout AND to a log file. The trick here is that +// NSArrays function as composite log writers, which means when an array is +// set as the log writer, it forwards all logging messages to all of its +// contained GTMLogWriters. +// +// // Create array of GTMLogWriters +// NSArray *writers = [NSArray arrayWithObjects: +// [NSFileHandle fileHandleForWritingAtPath:@"/tmp/f.log" create:YES], +// [NSFileHandle fileHandleWithStandardOutput], nil]; +// +// GTMLogger *logger = [GTMLogger standardLogger]; +// [logger setWriter:writers]; +// [logger logInfo:@"hi"]; // Output goes to stdout and /tmp/f.log +// +// For futher details on log writers, formatters, and filters, see the +// documentation below. +// +// NOTE: GTMLogger is application level logging. By default it does nothing +// with _GTMDevLog/_GTMDevAssert (see GTMDefines.h). An application can choose +// to bridge _GTMDevLog/_GTMDevAssert to GTMLogger by providing macro +// definitions in its prefix header (see GTMDefines.h for how one would do +// that). +// +@interface GTMLogger : NSObject { + @private + id writer_; + id formatter_; + id filter_; +} + +// +// Accessors for the shared logger instance +// + +// Returns a shared/global standard GTMLogger instance. Callers should typically +// use this method to get a GTMLogger instance, unless they explicitly want +// their own instance to configure for their own needs. This is the only method +// that returns a shared instance; all the rest return new GTMLogger instances. ++ (id)sharedLogger; + +// Sets the shared logger instance to |logger|. Future calls to +sharedLogger +// will return |logger| instead. ++ (void)setSharedLogger:(GTMLogger *)logger; + +// +// Creation methods +// + +// Returns a new autoreleased GTMLogger instance that will log to stdout, using +// the GTMLogStandardFormatter, and the GTMLogLevelFilter filter. ++ (id)standardLogger; + +// Same as +standardLogger, but logs to stderr. ++ (id)standardLoggerWithStderr; + +// Returns a new standard GTMLogger instance with a log writer that will +// write to the file at |path|, and will use the GTMLogStandardFormatter and +// GTMLogLevelFilter classes. If |path| does not exist, it will be created. ++ (id)standardLoggerWithPath:(NSString *)path; + +// Returns an autoreleased GTMLogger instance that will use the specified +// |writer|, |formatter|, and |filter|. ++ (id)loggerWithWriter:(id)writer + formatter:(id)formatter + filter:(id)filter; + +// Returns an autoreleased GTMLogger instance that logs to stdout, with the +// basic formatter, and no filter. The returned logger differs from the logger +// returned by +standardLogger because this one does not do any filtering and +// does not do any special log formatting; this is the difference between a +// "regular" logger and a "standard" logger. ++ (id)logger; + +// Designated initializer. This method returns a GTMLogger initialized with the +// specified |writer|, |formatter|, and |filter|. See the setter methods below +// for what values will be used if nil is passed for a parameter. +- (id)initWithWriter:(id)writer + formatter:(id)formatter + filter:(id)filter; + +// +// Logging methods +// + +// Logs a message at the debug level (kGTMLoggerLevelDebug). +- (void)logDebug:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2); +// Logs a message at the info level (kGTMLoggerLevelInfo). +- (void)logInfo:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2); +// Logs a message at the error level (kGTMLoggerLevelError). +- (void)logError:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2); +// Logs a message at the assert level (kGTMLoggerLevelAssert). +- (void)logAssert:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2); + + +// +// Accessors +// + +// Accessor methods for the log writer. If the log writer is set to nil, +// [NSFileHandle fileHandleWithStandardOutput] is used. +- (id)writer; +- (void)setWriter:(id)writer; + +// Accessor methods for the log formatter. If the log formatter is set to nil, +// GTMLogBasicFormatter is used. This formatter will format log messages in a +// plain printf style. +- (id)formatter; +- (void)setFormatter:(id)formatter; + +// Accessor methods for the log filter. If the log filter is set to nil, +// GTMLogNoFilter is used, which allows all log messages through. +- (id)filter; +- (void)setFilter:(id)filter; + +@end // GTMLogger + + +// Helper functions that are used by the convenience GTMLogger*() macros that +// enable the logging of function names. +@interface GTMLogger (GTMLoggerMacroHelpers) +- (void)logFuncDebug:(const char *)func msg:(NSString *)fmt, ... + CHECK_FORMAT_NSSTRING(2, 3); +- (void)logFuncInfo:(const char *)func msg:(NSString *)fmt, ... + CHECK_FORMAT_NSSTRING(2, 3); +- (void)logFuncError:(const char *)func msg:(NSString *)fmt, ... + CHECK_FORMAT_NSSTRING(2, 3); +- (void)logFuncAssert:(const char *)func msg:(NSString *)fmt, ... + CHECK_FORMAT_NSSTRING(2, 3); +@end // GTMLoggerMacroHelpers + + +// Convenience macros that log to the shared GTMLogger instance. These macros +// are how users should typically log to GTMLogger. Notice that GTMLoggerDebug() +// calls will be compiled out of non-Debug builds. +#define GTMLoggerDebug(...) \ + [[GTMLogger sharedLogger] logFuncDebug:__func__ msg:__VA_ARGS__] +#define GTMLoggerInfo(...) \ + [[GTMLogger sharedLogger] logFuncInfo:__func__ msg:__VA_ARGS__] +#define GTMLoggerError(...) \ + [[GTMLogger sharedLogger] logFuncError:__func__ msg:__VA_ARGS__] +#define GTMLoggerAssert(...) \ + [[GTMLogger sharedLogger] logFuncAssert:__func__ msg:__VA_ARGS__] + +// If we're not in a debug build, remove the GTMLoggerDebug statements. This +// makes calls to GTMLoggerDebug "compile out" of Release builds +#ifndef DEBUG +#undef GTMLoggerDebug +#define GTMLoggerDebug(...) do {} while(0) +#endif + +// Log levels. +typedef enum { + kGTMLoggerLevelUnknown, + kGTMLoggerLevelDebug, + kGTMLoggerLevelInfo, + kGTMLoggerLevelError, + kGTMLoggerLevelAssert, +} GTMLoggerLevel; + + +// +// Log Writers +// + +// Protocol to be implemented by a GTMLogWriter instance. +@protocol GTMLogWriter +// Writes the given log message to where the log writer is configured to write. +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level; +@end // GTMLogWriter + + +// Simple category on NSFileHandle that makes NSFileHandles valid log writers. +// This is convenient because something like, say, +fileHandleWithStandardError +// now becomes a valid log writer. Log messages are written to the file handle +// with a newline appended. +@interface NSFileHandle (GTMFileHandleLogWriter) +// Opens the file at |path| in append mode, and creates the file with |mode| +// if it didn't previously exist. ++ (id)fileHandleForLoggingAtPath:(NSString *)path mode:(mode_t)mode; +@end // NSFileHandle + + +// This category makes NSArray a GTMLogWriter that can be composed of other +// GTMLogWriters. This is the classic Composite GoF design pattern. When the +// GTMLogWriter -logMessage:level: message is sent to the array, the array +// forwards the message to all of its elements that implement the GTMLogWriter +// protocol. +// +// This is useful in situations where you would like to send log output to +// multiple log writers at the same time. Simply create an NSArray of the log +// writers you wish to use, then set the array as the "writer" for your +// GTMLogger instance. +@interface NSArray (GTMArrayCompositeLogWriter) +@end // GTMArrayCompositeLogWriter + + +// This category adapts the GTMLogger interface so that it can be used as a log +// writer; it's an "adapter" in the GoF Adapter pattern sense. +// +// This is useful when you want to configure a logger to log to a specific +// writer with a specific formatter and/or filter. But you want to also compose +// that with a different log writer that may have its own formatter and/or +// filter. +@interface GTMLogger (GTMLoggerLogWriter) +@end // GTMLoggerLogWriter + + +// +// Log Formatters +// + +// Protocol to be implemented by a GTMLogFormatter instance. +@protocol GTMLogFormatter +// Returns a formatted string using the format specified in |fmt| and the va +// args specified in |args|. +- (NSString *)stringForFunc:(NSString *)func + withFormat:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level; +@end // GTMLogFormatter + + +// A basic log formatter that formats a string the same way that NSLog (or +// printf) would. It does not do anything fancy, nor does it add any data of its +// own. +@interface GTMLogBasicFormatter : NSObject +@end // GTMLogBasicFormatter + + +// A log formatter that formats the log string like the basic formatter, but +// also prepends a timestamp and some basic process info to the message, as +// shown in the following sample output. +// 2007-12-30 10:29:24.177 myapp[4588/0xa07d0f60] [lvl=1] log mesage here +@interface GTMLogStandardFormatter : GTMLogBasicFormatter { + @private + NSDateFormatter *dateFormatter_; // yyyy-MM-dd HH:mm:ss.SSS + NSString *pname_; + pid_t pid_; +} +@end // GTMLogStandardFormatter + + +// +// Log Filters +// + +// Protocol to be imlemented by a GTMLogFilter instance. +@protocol GTMLogFilter +// Returns YES if |msg| at |level| should be filtered out; NO otherwise. +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level; +@end // GTMLogFilter + + +// A log filter that filters messages at the kGTMLoggerLevelDebug level out of +// non-debug builds. Messages at the kGTMLoggerLevelInfo level are also filtered +// out of non-debug builds unless GTMVerboseLogging is set in the environment or +// the processes's defaults. Messages at the kGTMLoggerLevelError level are +// never filtered. +@interface GTMLogLevelFilter : NSObject +@end // GTMLogLevelFilter + + +// A simple log filter that does NOT filter anything out; +// -filterAllowsMessage:level will always return YES. This can be a convenient +// way to enable debug-level logging in release builds (if you so desire). +@interface GTMLogNoFilter : NSObject +@end // GTMLogNoFilter + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger.m new file mode 100644 index 00000000..de941d2e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLogger.m @@ -0,0 +1,445 @@ +// +// GTMLogger.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMLogger.h" +#import "GTMGarbageCollection.h" +#import +#import +#import +#import + + +// Define a trivial assertion macro to avoid dependencies +#ifdef DEBUG + #define GTMLOGGER_ASSERT(expr) assert(expr) +#else + #define GTMLOGGER_ASSERT(expr) +#endif + + +@interface GTMLogger (PrivateMethods) + +- (void)logInternalFunc:(const char *)func + format:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level; + +@end + + +// Reference to the shared GTMLogger instance. This is not a singleton, it's +// just an easy reference to one shared instance. +static GTMLogger *gSharedLogger = nil; + + +@implementation GTMLogger + +// Returns a pointer to the shared logger instance. If none exists, a standard +// logger is created and returned. ++ (id)sharedLogger { + @synchronized(self) { + if (gSharedLogger == nil) { + gSharedLogger = [[self standardLogger] retain]; + } + GTMLOGGER_ASSERT(gSharedLogger != nil); + } + return [[gSharedLogger retain] autorelease]; +} + ++ (void)setSharedLogger:(GTMLogger *)logger { + @synchronized(self) { + [gSharedLogger autorelease]; + gSharedLogger = [logger retain]; + } +} + ++ (id)standardLogger { + id writer = [NSFileHandle fileHandleWithStandardOutput]; + id fr = [[[GTMLogStandardFormatter alloc] init] autorelease]; + id filter = [[[GTMLogLevelFilter alloc] init] autorelease]; + return [self loggerWithWriter:writer formatter:fr filter:filter]; +} + ++ (id)standardLoggerWithStderr { + id me = [self standardLogger]; + [me setWriter:[NSFileHandle fileHandleWithStandardError]]; + return me; +} + ++ (id)standardLoggerWithPath:(NSString *)path { + NSFileHandle *fh = [NSFileHandle fileHandleForLoggingAtPath:path mode:0644]; + if (fh == nil) return nil; + id me = [self standardLogger]; + [me setWriter:fh]; + return me; +} + ++ (id)loggerWithWriter:(id)writer + formatter:(id)formatter + filter:(id)filter { + return [[[self alloc] initWithWriter:writer + formatter:formatter + filter:filter] autorelease]; +} + ++ (id)logger { + return [[[self alloc] init] autorelease]; +} + +- (id)init { + return [self initWithWriter:nil formatter:nil filter:nil]; +} + +- (id)initWithWriter:(id)writer + formatter:(id)formatter + filter:(id)filter { + if ((self = [super init])) { + [self setWriter:writer]; + [self setFormatter:formatter]; + [self setFilter:filter]; + GTMLOGGER_ASSERT(formatter_ != nil); + GTMLOGGER_ASSERT(filter_ != nil); + GTMLOGGER_ASSERT(writer_ != nil); + } + return self; +} + +- (void)dealloc { + GTMLOGGER_ASSERT(writer_ != nil); + GTMLOGGER_ASSERT(formatter_ != nil); + GTMLOGGER_ASSERT(filter_ != nil); + [writer_ release]; + [formatter_ release]; + [filter_ release]; + [super dealloc]; +} + +- (id)writer { + GTMLOGGER_ASSERT(writer_ != nil); + return [[writer_ retain] autorelease]; +} + +- (void)setWriter:(id)writer { + @synchronized(self) { + [writer_ autorelease]; + if (writer == nil) + writer_ = [[NSFileHandle fileHandleWithStandardOutput] retain]; + else + writer_ = [writer retain]; + } + GTMLOGGER_ASSERT(writer_ != nil); +} + +- (id)formatter { + GTMLOGGER_ASSERT(formatter_ != nil); + return [[formatter_ retain] autorelease]; +} + +- (void)setFormatter:(id)formatter { + @synchronized(self) { + [formatter_ autorelease]; + if (formatter == nil) + formatter_ = [[GTMLogBasicFormatter alloc] init]; + else + formatter_ = [formatter retain]; + } + GTMLOGGER_ASSERT(formatter_ != nil); +} + +- (id)filter { + GTMLOGGER_ASSERT(filter_ != nil); + return [[filter_ retain] autorelease]; +} + +- (void)setFilter:(id)filter { + @synchronized(self) { + [filter_ autorelease]; + if (filter == nil) + filter_ = [[GTMLogNoFilter alloc] init]; + else + filter_ = [filter retain]; + } + GTMLOGGER_ASSERT(filter_ != nil); +} + +- (void)logDebug:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelDebug]; + va_end(args); +} + +- (void)logInfo:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelInfo]; + va_end(args); +} + +- (void)logError:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelError]; + va_end(args); +} + +- (void)logAssert:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelAssert]; + va_end(args); +} + +@end // GTMLogger + + +@implementation GTMLogger (GTMLoggerMacroHelpers) + +- (void)logFuncDebug:(const char *)func msg:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelDebug]; + va_end(args); +} + +- (void)logFuncInfo:(const char *)func msg:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelInfo]; + va_end(args); +} + +- (void)logFuncError:(const char *)func msg:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelError]; + va_end(args); +} + +- (void)logFuncAssert:(const char *)func msg:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelAssert]; + va_end(args); +} + +@end // GTMLoggerMacroHelpers + + +@implementation GTMLogger (PrivateMethods) + +- (void)logInternalFunc:(const char *)func + format:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level { + GTMLOGGER_ASSERT(formatter_ != nil); + GTMLOGGER_ASSERT(filter_ != nil); + GTMLOGGER_ASSERT(writer_ != nil); + + NSString *fname = func ? [NSString stringWithUTF8String:func] : nil; + NSString *msg = [formatter_ stringForFunc:fname + withFormat:fmt + valist:args + level:level]; + if (msg && [filter_ filterAllowsMessage:msg level:level]) + [writer_ logMessage:msg level:level]; +} + +@end // PrivateMethods + + +@implementation NSFileHandle (GTMFileHandleLogWriter) + ++ (id)fileHandleForLoggingAtPath:(NSString *)path mode:(mode_t)mode { + int fd = -1; + if (path) { + int flags = O_WRONLY | O_APPEND | O_CREAT; + fd = open([path fileSystemRepresentation], flags, mode); + } + if (fd == -1) return nil; + return [[[self alloc] initWithFileDescriptor:fd + closeOnDealloc:YES] autorelease]; +} + +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level { + @synchronized(self) { + NSString *line = [NSString stringWithFormat:@"%@\n", msg]; + [self writeData:[line dataUsingEncoding:NSUTF8StringEncoding]]; + } +} + +@end // GTMFileHandleLogWriter + + +@implementation NSArray (GTMArrayCompositeLogWriter) + +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level { + @synchronized(self) { + id child = nil; + GTM_FOREACH_OBJECT(child, self) { + if ([child conformsToProtocol:@protocol(GTMLogWriter)]) + [child logMessage:msg level:level]; + } + } +} + +@end // GTMArrayCompositeLogWriter + + +@implementation GTMLogger (GTMLoggerLogWriter) + +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level { + switch (level) { + case kGTMLoggerLevelDebug: + [self logDebug:@"%@", msg]; + break; + case kGTMLoggerLevelInfo: + [self logInfo:@"%@", msg]; + break; + case kGTMLoggerLevelError: + [self logError:@"%@", msg]; + break; + case kGTMLoggerLevelAssert: + [self logAssert:@"%@", msg]; + break; + default: + // Ignore the message. + break; + } +} + +@end // GTMLoggerLogWriter + + +@implementation GTMLogBasicFormatter + +- (NSString *)stringForFunc:(NSString *)func + withFormat:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level { + // Performance note: since we always have to create a new NSString from the + // returned CFStringRef, we may want to do a quick check here to see if |fmt| + // contains a '%', and if not, simply return 'fmt'. + CFStringRef cfmsg = NULL; + cfmsg = CFStringCreateWithFormatAndArguments(kCFAllocatorDefault, + NULL, // format options + (CFStringRef)fmt, + args); + return GTMCFAutorelease(cfmsg); +} + +@end // GTMLogBasicFormatter + + +@implementation GTMLogStandardFormatter + +- (id)init { + if ((self = [super init])) { + dateFormatter_ = [[NSDateFormatter alloc] init]; + [dateFormatter_ setFormatterBehavior:NSDateFormatterBehavior10_4]; + [dateFormatter_ setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"]; + pname_ = [[[NSProcessInfo processInfo] processName] copy]; + pid_ = [[NSProcessInfo processInfo] processIdentifier]; + } + return self; +} + +- (void)dealloc { + [dateFormatter_ release]; + [pname_ release]; + [super dealloc]; +} + +- (NSString *)stringForFunc:(NSString *)func + withFormat:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level { + GTMLOGGER_ASSERT(dateFormatter_ != nil); + NSString *tstamp = nil; + @synchronized (dateFormatter_) { + tstamp = [dateFormatter_ stringFromDate:[NSDate date]]; + } + return [NSString stringWithFormat:@"%@ %@[%d/%p] [lvl=%d] %@ %@", + tstamp, pname_, pid_, pthread_self(), + level, (func ? func : @"(no func)"), + [super stringForFunc:func withFormat:fmt valist:args level:level]]; +} + +@end // GTMLogStandardFormatter + + +@implementation GTMLogLevelFilter + +// Check the environment and the user preferences for the GTMVerboseLogging key +// to see if verbose logging has been enabled. The environment variable will +// override the defaults setting, so check the environment first. +// COV_NF_START +static BOOL IsVerboseLoggingEnabled(void) { + static NSString *const kVerboseLoggingKey = @"GTMVerboseLogging"; + static char *env = NULL; + if (env == NULL) + env = getenv([kVerboseLoggingKey UTF8String]); + + if (env && env[0]) { + return (strtol(env, NULL, 10) != 0); + } + + return [[NSUserDefaults standardUserDefaults] boolForKey:kVerboseLoggingKey]; +} +// COV_NF_END + +// In DEBUG builds, log everything. If we're not in a debug build we'll assume +// that we're in a Release build. +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level { +#if DEBUG + return YES; +#endif + + BOOL allow = YES; + + switch (level) { + case kGTMLoggerLevelDebug: + allow = NO; + break; + case kGTMLoggerLevelInfo: + allow = (IsVerboseLoggingEnabled() == YES); + break; + case kGTMLoggerLevelError: + allow = YES; + break; + case kGTMLoggerLevelAssert: + allow = YES; + break; + default: + allow = YES; + break; + } + + return allow; +} + +@end // GTMLogLevelFilter + + +@implementation GTMLogNoFilter + +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level { + return YES; // Allow everything through +} + +@end // GTMLogNoFilter diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriter.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriter.h new file mode 100644 index 00000000..30e58ffa --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriter.h @@ -0,0 +1,97 @@ +// +// GTMLoggerRingBufferWriter.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMLogger.h" +#import "GTMDefines.h" + +typedef struct GTMRingBufferPair GTMRingBufferPair; + +// GTMLoggerRingBufferWriter is a GTMLogWriter that accumulates logged Info +// and Debug messages (when they're not compiled out in a release build) +// into a ring buffer. If an Error or Assert message is +// logged, all of the previously logged messages (up to the size of the +// buffer) are then logged. At that point the buffer resets itself. +// +// How to use: +// +// * Create a logger writer that you want to use to do the ultimate writing, +// such as to stdErr, or a log file, or an NSArray that aggregates other +// writers. +// id someWriter = ... +// +// * Make a new ring buffer with this writer, along with the buffer's +// capacity (which must be >= 1): +// rbw = +// [GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:32 +// writer:someWriter]; +// +// * Set your logger's writer to be the ring buffer writer: +// [[GTMLogger sharedLogger] setWriter:rbw]; +// +// Note that this writer is at the end of the GTMLogger food chain, where the +// default filter removes Info messages in Release mode (Debug messages are +// compiled out). You can pass nil to GTMLogger's -setFilter to have it pass +// along all the messages. +// +@interface GTMLoggerRingBufferWriter : NSObject { + @private + id writer_; + GTMRingBufferPair *buffer_; + NSUInteger capacity_; + NSUInteger nextIndex_; // Index of the next element of |buffer_| to fill. + NSUInteger totalLogged_; // This > 0 and |nextIndex_| == 0 means we've wrapped. +} + +// Returns an autoreleased ring buffer writer. If |writer| is nil, +// then nil is returned. ++ (id)ringBufferWriterWithCapacity:(NSUInteger)capacity + writer:(id)loggerWriter; + +// Designated initializer. If |writer| is nil, then nil is returned. +// If you just use -init, nil will be returned. +- (id)initWithCapacity:(NSUInteger)capacity + writer:(id)loggerWriter; + +// How many messages will be logged before older messages get dropped +// on the floor. +- (NSUInteger)capacity; + +// The log writer that will get the buffered log messages if/when they +// need to be displayed. +- (id)writer; + +// How many log messages are currently in the buffer. +- (NSUInteger)count; + +// How many have been dropped on the floor since creation, or the last +// reset. +- (NSUInteger)droppedLogCount; + +// The total number of messages processed since creation, or the last +// reset. +- (NSUInteger)totalLogged; + +// Purge the contents and reset the counters. +- (void)reset; + +// Print out the contents without resetting anything. +// Contents are automatically printed and reset when an error-level +// message comes through. +- (void)dumpContents; + +@end // GTMLoggerRingBufferWriter diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriter.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriter.m new file mode 100644 index 00000000..4a8c7c6e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriter.m @@ -0,0 +1,248 @@ +// +// GTMLoggerRingBufferWriter.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMLoggerRingBufferWriter.h" + +// Holds a message and a level. +struct GTMRingBufferPair { + // Explicitly using CFStringRef instead of NSString because in a GC world, the + // NSString will be collected because there is no way for the GC to know that + // there is a strong reference to the NSString in this data structure. By + // using a CFStringRef we can CFRetain it, and avoid the problem. + CFStringRef logMessage_; + GTMLoggerLevel level_; +}; + + +// There are two operations that involve iterating over the buffer +// contents and doing Something to them. This is a callback function +// that is called for every pair living in the buffer. +typedef void (GTMRingBufferPairCallback)(GTMLoggerRingBufferWriter *rbw, + GTMRingBufferPair *pair); + + +@interface GTMLoggerRingBufferWriter (PrivateMethods) + +// Add the message and level to the ring buffer. +- (void)addMessage:(NSString *)message level:(GTMLoggerLevel)level; + +// Walk the buffer invoking the callback. +- (void)iterateBufferWithCallback:(GTMRingBufferPairCallback)callback; + +@end // PrivateMethods + + +@implementation GTMLoggerRingBufferWriter + ++ (id)ringBufferWriterWithCapacity:(NSUInteger)capacity + writer:(id)writer { + GTMLoggerRingBufferWriter *rbw = + [[[self alloc] initWithCapacity:capacity + writer:writer] autorelease]; + return rbw; + +} // ringBufferWriterWithCapacity + + +- (id)initWithCapacity:(NSUInteger)capacity + writer:(id)writer { + if ((self = [super init])) { + writer_ = [writer retain]; + capacity_ = capacity; + + buffer_ = (GTMRingBufferPair *)calloc(capacity_, sizeof(GTMRingBufferPair)); + + nextIndex_ = 0; + + if (capacity_ == 0 || !buffer_ || !writer_) { + [self release]; + self = nil; + } + } + return self; + +} // initWithCapacity + + +- (id)init { + return [self initWithCapacity:0 writer:nil]; +} // init + + +- (void)dealloc { + [self reset]; + + [writer_ release]; + if (buffer_) { + free(buffer_); + } + + [super dealloc]; + +} // dealloc + + +- (NSUInteger)capacity { + return capacity_; +} // capacity + + +- (id)writer { + return writer_; +} // writer + + +- (NSUInteger)count { + NSUInteger count = 0; + @synchronized(self) { + if ((nextIndex_ == 0 && totalLogged_ > 0) + || totalLogged_ >= capacity_) { + // We've wrapped around + count = capacity_; + } else { + count = nextIndex_; + } + } + + return count; + +} // count + + +- (NSUInteger)droppedLogCount { + NSUInteger droppedCount = 0; + + @synchronized(self) { + if (capacity_ > totalLogged_) { + droppedCount = 0; + } else { + droppedCount = totalLogged_ - capacity_; + } + } + + return droppedCount; + +} // droppedLogCount + + +- (NSUInteger)totalLogged { + return totalLogged_; +} // totalLogged + + +// Assumes caller will do any necessary synchronization. +// This walks over the buffer, taking into account any wrap-around, +// and calls the callback on each pair. +- (void)iterateBufferWithCallback:(GTMRingBufferPairCallback)callback { + GTMRingBufferPair *scan, *stop; + + // If we've wrapped around, print out the ring buffer from |nextIndex_| + // to the end. + if (totalLogged_ >= capacity_) { + scan = buffer_ + nextIndex_; + stop = buffer_ + capacity_; + while (scan < stop) { + callback(self, scan); + ++scan; + } + } + + // And then print from the beginning to right before |nextIndex_| + scan = buffer_; + stop = buffer_ + nextIndex_; + while (scan < stop) { + callback(self, scan); + ++scan; + } + +} // iterateBufferWithCallback + + +// Used when resetting the buffer. This frees the string and zeros out +// the structure. +static void ResetCallback(GTMLoggerRingBufferWriter *rbw, + GTMRingBufferPair *pair) { + if (pair->logMessage_) { + CFRelease(pair->logMessage_); + } + pair->logMessage_ = nil; + pair->level_ = kGTMLoggerLevelUnknown; +} // ResetCallback + + +// Reset the contents. +- (void)reset { + @synchronized(self) { + [self iterateBufferWithCallback:ResetCallback]; + nextIndex_ = 0; + totalLogged_ = 0; + } + +} // reset + + +// Go ahead and log the stored backlog, writing it through the +// ring buffer's |writer_|. +static void PrintContentsCallback(GTMLoggerRingBufferWriter *rbw, + GTMRingBufferPair *pair) { + [[rbw writer] logMessage:(NSString*)pair->logMessage_ level:pair->level_]; +} // PrintContentsCallback + + +- (void)dumpContents { + @synchronized(self) { + [self iterateBufferWithCallback:PrintContentsCallback]; + } +} // printContents + + +// Assumes caller will do any necessary synchronization. +- (void)addMessage:(NSString *)message level:(GTMLoggerLevel)level { + NSUInteger newIndex = nextIndex_; + nextIndex_ = (nextIndex_ + 1) % capacity_; + + ++totalLogged_; + + // Now store the goodies. + GTMRingBufferPair *pair = buffer_ + newIndex; + if (pair->logMessage_) { + CFRelease(pair->logMessage_); + pair->logMessage_ = nil; + } + if (message) { + pair->logMessage_ = CFStringCreateCopy(kCFAllocatorDefault, (CFStringRef)message); + } + pair->level_ = level; + +} // addMessage + + +// From the GTMLogWriter protocol. +- (void)logMessage:(NSString *)message level:(GTMLoggerLevel)level { + @synchronized(self) { + [self addMessage:(NSString*)message level:level]; + + if (level >= kGTMLoggerLevelError) { + [self dumpContents]; + [self reset]; + } + } + +} // logMessage + +@end // GTMLoggerRingBufferWriter diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriterTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriterTest.m new file mode 100644 index 00000000..1c5d72b1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerRingBufferWriterTest.m @@ -0,0 +1,363 @@ +// +// GTMLoggerRingBufferWriterTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMLoggerRingBufferWriter.h" +#import "GTMLogger.h" +#import "GTMUnitTestDevLog.h" + +// -------------------------------------------------- +// CountingWriter keeps a count of the number of times it has been +// told to write something, and also keeps track of what it was +// asked to log. + +@interface CountingWriter : NSObject { + @private + NSMutableArray *loggedContents_; +} + +- (NSUInteger)count; +- (NSArray *)loggedContents; +- (void)reset; + +@end // CountingWriter + +@implementation CountingWriter +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level { + if (!loggedContents_) { + loggedContents_ = [[NSMutableArray alloc] init]; + } + [loggedContents_ addObject:msg]; +} // logMessage + +- (void)dealloc { + [loggedContents_ release]; + [super dealloc]; +} // dealloc + +- (void)reset { + [loggedContents_ release]; + loggedContents_ = nil; +} // reset + +- (NSUInteger)count { + return [loggedContents_ count]; +} // count + +- (NSArray *)loggedContents { + return loggedContents_; +} // loggedContents + +@end // CountingWriter + + +@interface GTMLoggerRingBufferWriterTest : GTMTestCase { + @private + GTMLogger *logger_; + CountingWriter *countingWriter_; +} +@end // GTMLoggerRingBufferWriterTest + + +// -------------------------------------------------- + +@implementation GTMLoggerRingBufferWriterTest + +// Utilty to compare the set of messages captured by a CountingWriter +// with an array of expected messages. The messages are expected to +// be in the same order in both places. + +- (void)compareWriter:(CountingWriter *)writer + withExpectedLogging:(NSArray *)expected + line:(int)line { + NSArray *loggedContents = [writer loggedContents]; + + STAssertEquals([expected count], [loggedContents count], + @"count mismatch from line %d", line); + + for (unsigned int i = 0; i < [expected count]; i++) { + STAssertEqualObjects([expected objectAtIndex:i], + [loggedContents objectAtIndex:i], + @"logging mistmatch at index %d from line %d", + i, line); + } + +} // compareWithExpectedLogging + + +- (void)setUp { + countingWriter_ = [[CountingWriter alloc] init]; + logger_ = [[GTMLogger alloc] init]; +} // setUp + + +- (void)tearDown { + [countingWriter_ release]; + [logger_ release]; +} // tearDown + + +- (void)testCreation { + + // Make sure initializers work. + GTMLoggerRingBufferWriter *writer = + [GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:32 + writer:countingWriter_]; + STAssertEquals([writer capacity], (NSUInteger)32, nil); + STAssertTrue([writer writer] == countingWriter_, nil); + STAssertEquals([writer count], (NSUInteger)0, nil); + STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil); + STAssertEquals([writer totalLogged], (NSUInteger)0, nil); + + // Try with invalid arguments. Should always get nil back. + writer = + [GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:0 + writer:countingWriter_]; + STAssertNil(writer, nil); + + writer = [GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:32 + writer:nil]; + STAssertNil(writer, nil); + + writer = [[GTMLoggerRingBufferWriter alloc] init]; + STAssertNil(writer, nil); + +} // testCreation + + +- (void)testLogging { + GTMLoggerRingBufferWriter *writer = + [GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:4 + writer:countingWriter_]; + [logger_ setWriter:writer]; + + // Shouldn't do anything if there are no contents. + [writer dumpContents]; + STAssertEquals([writer count], (NSUInteger)0, nil); + STAssertEquals([countingWriter_ count], (NSUInteger)0, nil); + + // Log a single item. Make sure the counts are accurate. + [logger_ logDebug:@"oop"]; + STAssertEquals([writer count], (NSUInteger)1, nil); + STAssertEquals([writer totalLogged], (NSUInteger)1, nil); + STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil); + STAssertEquals([countingWriter_ count], (NSUInteger)0, nil); + + // Log a second item. Also make sure counts are accurate. + [logger_ logDebug:@"ack"]; + STAssertEquals([writer count], (NSUInteger)2, nil); + STAssertEquals([writer totalLogged], (NSUInteger)2, nil); + STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil); + STAssertEquals([countingWriter_ count], (NSUInteger)0, nil); + + // Print them, and make sure the countingWriter sees the right stuff. + [writer dumpContents]; + STAssertEquals([countingWriter_ count], (NSUInteger)2, nil); + STAssertEquals([writer count], (NSUInteger)2, nil); // Should not be zeroed. + STAssertEquals([writer totalLogged], (NSUInteger)2, nil); + + [self compareWriter:countingWriter_ + withExpectedLogging:[NSArray arrayWithObjects:@"oop",@"ack", nil] + line:__LINE__]; + + + // Wipe the slates clean. + [writer reset]; + [countingWriter_ reset]; + STAssertEquals([writer count], (NSUInteger)0, nil); + STAssertEquals([writer totalLogged], (NSUInteger)0, nil); + + // An error log level should print the buffer and empty it. + [logger_ logDebug:@"oop"]; + [logger_ logInfo:@"ack"]; + STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil); + STAssertEquals([writer totalLogged], (NSUInteger)2, nil); + + [logger_ logError:@"blargh"]; + STAssertEquals([countingWriter_ count], (NSUInteger)3, nil); + STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil); + + [self compareWriter:countingWriter_ + withExpectedLogging:[NSArray arrayWithObjects:@"oop", @"ack", + @"blargh", nil] + line:__LINE__]; + + + // An assert log level should do the same. This also fills the + // buffer to its limit without wrapping. + [countingWriter_ reset]; + [logger_ logDebug:@"oop"]; + [logger_ logInfo:@"ack"]; + [logger_ logDebug:@"blargh"]; + STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil); + STAssertEquals([writer count], (NSUInteger)3, nil); + STAssertEquals([writer totalLogged], (NSUInteger)3, nil); + + [logger_ logAssert:@"ouch"]; + STAssertEquals([countingWriter_ count], (NSUInteger)4, nil); + STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil); + [self compareWriter:countingWriter_ + withExpectedLogging:[NSArray arrayWithObjects:@"oop", @"ack", + @"blargh", @"ouch", nil] + line:__LINE__]; + + + // Try with exactly one wrap around. + [countingWriter_ reset]; + [logger_ logInfo:@"ack"]; + [logger_ logDebug:@"oop"]; + [logger_ logDebug:@"blargh"]; + [logger_ logDebug:@"flong"]; // Fills buffer + STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil); + STAssertEquals([writer count], (NSUInteger)4, nil); + + [logger_ logAssert:@"ouch"]; // should drop "ack" + STAssertEquals([countingWriter_ count], (NSUInteger)4, nil); + + [self compareWriter:countingWriter_ + withExpectedLogging:[NSArray arrayWithObjects:@"oop", @"blargh", + @"flong", @"ouch", nil] + line:__LINE__]; + + + // Try with more than one wrap around. + [countingWriter_ reset]; + [logger_ logInfo:@"ack"]; + [logger_ logDebug:@"oop"]; + [logger_ logDebug:@"blargh"]; + [logger_ logDebug:@"flong"]; // Fills buffer + [logger_ logDebug:@"bloogie"]; // should drop "ack" + STAssertEquals([writer droppedLogCount], (NSUInteger)1, nil); + STAssertEquals([writer count], (NSUInteger)4, nil); + + [logger_ logAssert:@"ouch"]; // should drop "oop" + STAssertEquals([countingWriter_ count], (NSUInteger)4, nil); + + [self compareWriter:countingWriter_ + withExpectedLogging:[NSArray arrayWithObjects:@"blargh", + @"flong", @"bloogie", @"ouch", nil] + line:__LINE__]; +} // testBasics + + +- (void)testCornerCases { + // make sure we work with small buffer sizes. + + GTMLoggerRingBufferWriter *writer = + [GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:1 + writer:countingWriter_]; + [logger_ setWriter:writer]; + + [logger_ logInfo:@"ack"]; + STAssertEquals([countingWriter_ count], (NSUInteger)0, nil); + STAssertEquals([writer count], (NSUInteger)1, nil); + [writer dumpContents]; + STAssertEquals([countingWriter_ count], (NSUInteger)1, nil); + + [self compareWriter:countingWriter_ + withExpectedLogging:[NSArray arrayWithObjects:@"ack", nil] + line:__LINE__]; + + [logger_ logDebug:@"oop"]; // should drop "ack" + STAssertEquals([writer count], (NSUInteger)1, nil); + STAssertEquals([writer droppedLogCount], (NSUInteger)1, nil); + + [countingWriter_ reset]; + [logger_ logError:@"snoogy"]; // should drop "oop" + STAssertEquals([countingWriter_ count], (NSUInteger)1, nil); + + [self compareWriter:countingWriter_ + withExpectedLogging:[NSArray arrayWithObjects:@"snoogy", nil] + line:__LINE__]; + +} // testCornerCases + + + +// Run 10 threads, all logging through the same logger. + +static volatile NSUInteger gStoppedThreads = 0; // Total number that have stopped. + +- (void)bangMe:(id)info { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + GTMLogger *logger = (GTMLogger *)info; + + // Log a string. + for (int i = 0; i < 27; i++) { + [logger logDebug:@"oop"]; + } + + // log another string which should push the first string out. + // if we see any "oop"s in the logger output, then we know it got + // confused. + for (int i = 0; i < 15; i++) { + [logger logDebug:@"ack"]; + } + + [pool release]; + @synchronized ([self class]) { + gStoppedThreads++; + } + +} // bangMe + + +- (void)testThreading { + const NSUInteger kThreadCount = 10; + const NSUInteger kCapacity = 10; + + GTMLoggerRingBufferWriter *writer = + [GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:kCapacity + writer:countingWriter_]; + [logger_ setWriter:writer]; + + for (NSUInteger i = 0; i < kThreadCount; i++) { + [NSThread detachNewThreadSelector:@selector(bangMe:) + toTarget:self + withObject:logger_]; + } + + // The threads are running, so wait for them all to finish. + while (1) { + NSDate *quick = [NSDate dateWithTimeIntervalSinceNow:0.2]; + [[NSRunLoop currentRunLoop] runUntilDate:quick]; + @synchronized ([self class]) { + if (gStoppedThreads == kThreadCount) break; + } + } + + // Now make sure we get back what's expected. + STAssertEquals([writer count], kThreadCount, nil); + STAssertEquals([countingWriter_ count], (NSUInteger)0, nil); // Nothing should be logged + STAssertEquals([writer totalLogged], (NSUInteger)420, nil); + + [logger_ logError:@"bork"]; + STAssertEquals([countingWriter_ count], kCapacity, nil); + + NSArray *expected = [NSArray arrayWithObjects: + @"ack", @"ack", @"ack", @"ack", @"ack", + @"ack", @"ack", @"ack", @"ack", @"bork", + nil]; + [self compareWriter:countingWriter_ + withExpectedLogging:expected + line:__LINE__]; + +} // testThreading + +@end // GTMLoggerRingBufferWriterTest diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerTest.m new file mode 100644 index 00000000..86ced5ef --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMLoggerTest.m @@ -0,0 +1,451 @@ +// +// GTMLoggerTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMLogger.h" +#import "GTMRegex.h" +#import "GTMSenTestCase.h" + + +// A test writer that stores log messages in an array for easy retrieval. +@interface ArrayWriter : NSObject { + @private + NSMutableArray *messages_; +} +- (NSArray *)messages; +- (void)clear; +@end +@implementation ArrayWriter +- (id)init { + if ((self = [super init])) { + messages_ = [[NSMutableArray alloc] init]; + } + return self; +} +- (void)dealloc { + [messages_ release]; + [super dealloc]; +} +- (NSArray *)messages { + return messages_; +} +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level { + [messages_ addObject:msg]; +} +- (void)clear { + [messages_ removeAllObjects]; +} +@end // ArrayWriter + + +// A formatter for testing that prepends the word DUMB to log messages, along +// with the log level number. +@interface DumbFormatter : GTMLogBasicFormatter +@end +@implementation DumbFormatter +- (NSString *)stringForFunc:(NSString *)func + withFormat:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level { + return [NSString stringWithFormat:@"DUMB [%d] %@", level, + [super stringForFunc:nil withFormat:fmt valist:args level:level]]; +} +@end // DumbFormatter + + +// A test filter that ignores messages with the string "ignore". +@interface IgnoreFilter : NSObject +@end +@implementation IgnoreFilter +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level { + NSRange range = [msg rangeOfString:@"ignore"]; + return (range.location == NSNotFound); +} +@end // IgnoreFilter + +// +// Begin test harness +// + +@interface GTMLoggerTest : GTMTestCase { + @private + NSString *path_; +} +@end + +@implementation GTMLoggerTest + +- (void)setUp { + path_ = [[NSTemporaryDirectory() stringByAppendingPathComponent: + @"GTMLoggerUnitTest.log"] retain]; + STAssertNotNil(path_, nil); + // Make sure we're cleaned up from the last run +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + [[NSFileManager defaultManager] removeFileAtPath:path_ handler:nil]; +#else + [[NSFileManager defaultManager] removeItemAtPath:path_ error:NULL]; +#endif +} + +- (void)tearDown { + STAssertNotNil(path_, nil); +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + [[NSFileManager defaultManager] removeFileAtPath:path_ handler:nil]; +#else + [[NSFileManager defaultManager] removeItemAtPath:path_ error:NULL]; +#endif + [path_ release]; + path_ = nil; +} + +- (void)testCreation { + GTMLogger *logger1 = nil, *logger2 = nil; + + logger1 = [GTMLogger sharedLogger]; + logger2 = [GTMLogger sharedLogger]; + + STAssertTrue(logger1 == logger2, nil); + + STAssertNotNil([logger1 writer], nil); + STAssertNotNil([logger1 formatter], nil); + STAssertNotNil([logger1 filter], nil); + + // Get a new instance; not the shared instance + logger2 = [GTMLogger standardLogger]; + + STAssertTrue(logger1 != logger2, nil); + STAssertNotNil([logger2 writer], nil); + STAssertNotNil([logger2 formatter], nil); + STAssertNotNil([logger2 filter], nil); + + // Set the new instance to be the shared logger. + [GTMLogger setSharedLogger:logger2]; + STAssertTrue(logger2 == [GTMLogger sharedLogger], nil); + STAssertTrue(logger1 != [GTMLogger sharedLogger], nil); + + // Set the shared logger to nil, which should reset it to a new "standard" + // logger. + [GTMLogger setSharedLogger:nil]; + STAssertNotNil([GTMLogger sharedLogger], nil); + STAssertTrue(logger2 != [GTMLogger sharedLogger], nil); + STAssertTrue(logger1 != [GTMLogger sharedLogger], nil); + + GTMLogger *logger = [GTMLogger logger]; + STAssertNotNil(logger, nil); + + logger = [GTMLogger standardLoggerWithStderr]; + STAssertNotNil(logger, nil); + + logger = [GTMLogger standardLoggerWithPath:path_]; + STAssertNotNil(logger, nil); +} + +- (void)testAccessors { + GTMLogger *logger = [GTMLogger standardLogger]; + STAssertNotNil(logger, nil); + + STAssertNotNil([logger writer], nil); + STAssertNotNil([logger formatter], nil); + STAssertNotNil([logger filter], nil); + + [logger setWriter:nil]; + [logger setFormatter:nil]; + [logger setFilter:nil]; + + // These attributes should NOT be nil. They should be set to their defaults. + STAssertNotNil([logger writer], nil); + STAssertNotNil([logger formatter], nil); + STAssertNotNil([logger filter], nil); +} + +- (void)testLogger { + ArrayWriter *writer = [[[ArrayWriter alloc] init] autorelease]; + IgnoreFilter *filter = [[[IgnoreFilter alloc] init] autorelease]; + + // We actually only need the array writer instance for this unit test to pass, + // but we combine that writer with a stdout writer for two reasons: + // + // 1. To test the NSArray composite writer object + // 2. To make debugging easier by sending output to stdout + // + // We also include in the array an object that is not a GTMLogWriter to make + // sure that we don't crash when presented with an array of non-GTMLogWriters. + NSArray *writers = [NSArray arrayWithObjects:writer, + [NSFileHandle fileHandleWithStandardOutput], + @"blah", nil]; + + GTMLogger *logger = [GTMLogger loggerWithWriter:writers + formatter:nil // basic formatter + filter:filter]; + + STAssertNotNil(logger, nil); + + // Log a few messages to test with + [logger logInfo:@"hi"]; + [logger logDebug:@"foo"]; + [logger logError:@"blah"]; + [logger logAssert:@"baz"]; + + // Makes sure the messages got logged + NSArray *messages = [writer messages]; + STAssertNotNil(messages, nil); + STAssertEquals([messages count], (NSUInteger)4, nil); + STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil); + STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil); + STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil); + STAssertEqualObjects([messages objectAtIndex:3], @"baz", nil); + + // Log a message that should be ignored, and make sure it did NOT get logged + [logger logInfo:@"please ignore this"]; + messages = [writer messages]; + STAssertNotNil(messages, nil); + STAssertEquals([messages count], (NSUInteger)4, nil); + STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil); + STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil); + STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil); + STAssertEqualObjects([messages objectAtIndex:3], @"baz", nil); + + // Change the formatter to our "dumb formatter" + id formatter = [[[DumbFormatter alloc] init] autorelease]; + [logger setFormatter:formatter]; + + [logger logInfo:@"bleh"]; + messages = [writer messages]; + STAssertNotNil(messages, nil); + STAssertEquals([messages count], (NSUInteger)5, nil); // Message count should increase + // The previously logged messages should not change + STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil); + STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil); + STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil); + STAssertEqualObjects([messages objectAtIndex:3], @"baz", nil); + STAssertEqualObjects([messages objectAtIndex:4], @"DUMB [2] bleh", nil); +} + +- (void)testConvenienceMacros { + ArrayWriter *writer = [[[ArrayWriter alloc] init] autorelease]; + NSArray *writers = [NSArray arrayWithObjects:writer, + [NSFileHandle fileHandleWithStandardOutput], nil]; + + [[GTMLogger sharedLogger] setWriter:writers]; + + // Here we log a message using a convenience macro, which should log the + // message along with the name of the function it was called from. Here we + // test to make sure the logged message does indeed contain the name of the + // current function "testConvenienceMacros". + GTMLoggerError(@"test ========================"); + STAssertEquals([[writer messages] count], (NSUInteger)1, nil); + NSRange rangeOfFuncName = + [[[writer messages] objectAtIndex:0] rangeOfString:@"testConvenienceMacros"]; + STAssertTrue(rangeOfFuncName.location != NSNotFound, nil); + [writer clear]; + + [[GTMLogger sharedLogger] setFormatter:nil]; + + GTMLoggerInfo(@"test %d", 1); + GTMLoggerDebug(@"test %d", 2); + GTMLoggerError(@"test %d", 3); + GTMLoggerAssert(@"test %d", 4); + + NSArray *messages = [writer messages]; + STAssertNotNil(messages, nil); + +#ifdef DEBUG + STAssertEquals([messages count], (NSUInteger)4, nil); + STAssertEqualObjects([messages objectAtIndex:0], @"test 1", nil); + STAssertEqualObjects([messages objectAtIndex:1], @"test 2", nil); + STAssertEqualObjects([messages objectAtIndex:2], @"test 3", nil); + STAssertEqualObjects([messages objectAtIndex:3], @"test 4", nil); +#else + // In Release builds, only the Error and Assert messages will be logged + STAssertEquals([messages count], (NSUInteger)2, nil); + STAssertEqualObjects([messages objectAtIndex:0], @"test 3", nil); + STAssertEqualObjects([messages objectAtIndex:1], @"test 4", nil); +#endif + +} + +- (void)testFileHandleWriter { + NSFileHandle *fh = nil; + + fh = [NSFileHandle fileHandleForWritingAtPath:path_]; + STAssertNil(fh, nil); + + fh = [NSFileHandle fileHandleForLoggingAtPath:path_ mode:0644]; + STAssertNotNil(fh, nil); + + [fh logMessage:@"test 0" level:kGTMLoggerLevelUnknown]; + [fh logMessage:@"test 1" level:kGTMLoggerLevelDebug]; + [fh logMessage:@"test 2" level:kGTMLoggerLevelInfo]; + [fh logMessage:@"test 3" level:kGTMLoggerLevelError]; + [fh logMessage:@"test 4" level:kGTMLoggerLevelAssert]; + [fh closeFile]; + + NSString *contents = [NSString stringWithContentsOfFile:path_]; + + STAssertEqualObjects(@"test 0\ntest 1\ntest 2\ntest 3\ntest 4\n", contents, nil); +} + +- (void)testLoggerAdapterWriter { + ArrayWriter *writer = [[[ArrayWriter alloc] init] autorelease]; + STAssertNotNil(writer, nil); + + GTMLogger *sublogger = [GTMLogger loggerWithWriter:writer + formatter:nil + filter:nil]; + STAssertNotNil(sublogger, nil); + + GTMLogger *logger = [GTMLogger loggerWithWriter:sublogger + formatter:nil + filter:nil]; + + STAssertNotNil(logger, nil); + + // Log a few messages to test with + [logger logInfo:@"hi"]; + [logger logDebug:@"foo"]; + [logger logError:@"blah"]; + [logger logAssert:@"assert"]; + + // Makes sure the messages got logged + NSArray *messages = [writer messages]; + STAssertNotNil(messages, nil); + STAssertEquals([messages count], (NSUInteger)4, nil); + STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil); + STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil); + STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil); + STAssertEqualObjects([messages objectAtIndex:3], @"assert", nil); +} + +// Helper method to help testing GTMLogFormatters +- (NSString *)stringFromFormatter:(id)formatter + level:(GTMLoggerLevel)level + format:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + NSString *msg = [formatter stringForFunc:nil + withFormat:fmt + valist:args + level:level]; + va_end(args); + return msg; +} + +- (void)testBasicFormatter { + id fmtr = [[[GTMLogBasicFormatter alloc] init] autorelease]; + STAssertNotNil(fmtr, nil); + NSString *msg = nil; + + msg = [self stringFromFormatter:fmtr + level:kGTMLoggerLevelDebug + format:@"test"]; + STAssertEqualObjects(msg, @"test", nil); + + msg = [self stringFromFormatter:fmtr + level:kGTMLoggerLevelDebug + format:@"test %d", 1]; + STAssertEqualObjects(msg, @"test 1", nil); + + msg = [self stringFromFormatter:fmtr + level:kGTMLoggerLevelDebug + format:@"test %@", @"foo"]; + STAssertEqualObjects(msg, @"test foo", nil); + + msg = [self stringFromFormatter:fmtr + level:kGTMLoggerLevelDebug + format:@""]; + STAssertEqualObjects(msg, @"", nil); + + msg = [self stringFromFormatter:fmtr + level:kGTMLoggerLevelDebug + format:@" ", 1]; + STAssertEqualObjects(msg, @" ", nil); +} + +- (void)testStandardFormatter { + id fmtr = [[[GTMLogStandardFormatter alloc] init] autorelease]; + STAssertNotNil(fmtr, nil); + + // E.g. 2008-01-04 09:16:26.906 otest[5567/0xa07d0f60] [lvl=1] (no func) test + NSString * kFormatBasePattern = + @"[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3} ((otest)|(GTMiPhoneTest))\\[[0-9]+/0x[0-9a-f]+\\] \\[lvl=[0-3]\\] \\(no func\\) "; + NSString *msg = nil; + + msg = [self stringFromFormatter:fmtr + level:kGTMLoggerLevelDebug + format:@"test"]; + STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test"]], nil); + + msg = [self stringFromFormatter:fmtr + level:kGTMLoggerLevelError + format:@"test %d", 1]; + STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test 1"]], nil); + + + msg = [self stringFromFormatter:fmtr + level:kGTMLoggerLevelInfo + format:@"test %@", @"hi"]; + STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test hi"]], nil); + + + msg = [self stringFromFormatter:fmtr + level:kGTMLoggerLevelUnknown + format:@"test"]; + STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test"]], nil); +} + +- (void)testNoFilter { + id filter = [[[GTMLogNoFilter alloc] init] autorelease]; + STAssertNotNil(filter, nil); + + STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown], nil); + STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug], nil); + STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo], nil); + STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError], nil); + STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert], nil); + STAssertTrue([filter filterAllowsMessage:@"" level:kGTMLoggerLevelDebug], nil); + STAssertTrue([filter filterAllowsMessage:nil level:kGTMLoggerLevelDebug], nil); +} + +- (void)testFileHandleCreation { + NSFileHandle *fh = nil; + + fh = [NSFileHandle fileHandleForLoggingAtPath:nil mode:0644]; + STAssertNil(fh, nil); + + fh = [NSFileHandle fileHandleForLoggingAtPath:path_ mode:0644]; + STAssertNotNil(fh, nil); + + [fh logMessage:@"test 1" level:kGTMLoggerLevelInfo]; + [fh logMessage:@"test 2" level:kGTMLoggerLevelInfo]; + [fh logMessage:@"test 3" level:kGTMLoggerLevelInfo]; + [fh closeFile]; + + // Re-open file and make sure our log messages get appended + fh = [NSFileHandle fileHandleForLoggingAtPath:path_ mode:0644]; + STAssertNotNil(fh, nil); + + [fh logMessage:@"test 4" level:kGTMLoggerLevelInfo]; + [fh logMessage:@"test 5" level:kGTMLoggerLevelInfo]; + [fh logMessage:@"test 6" level:kGTMLoggerLevelInfo]; + [fh closeFile]; + + NSString *contents = [NSString stringWithContentsOfFile:path_]; + STAssertNotNil(contents, nil); + STAssertEqualObjects(@"test 1\ntest 2\ntest 3\ntest 4\ntest 5\ntest 6\n", contents, nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEvent+HandlerTest.applescript b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEvent+HandlerTest.applescript new file mode 100644 index 00000000..377d7338 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEvent+HandlerTest.applescript @@ -0,0 +1,60 @@ +-- +-- Copyright 2008 Google Inc. +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); you may not +-- use this file except in compliance with the License. You may obtain a copy +-- of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +-- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +-- License for the specific language governing permissions and limitations under +-- the License. +-- + +script parentTestScript + property parentTestScriptProperty : 6 + on parentTestScriptFunc() + return "parent" + end parentTestScriptFunc +end script + +script testScript + property parent : parentTestScript + property testScriptProperty : 5 + on testScriptFunc() + return "child" + end testScriptFunc + on open foo + end open +end script + +property foo : 1 + +on test() +end test + +on testReturnOne() + return 1 +end testReturnOne + +on testReturnParam(param) + return param +end testReturnParam + +on testAddParams(param1, param2) + return param1 + param2 +end testAddParams + +on testAdd of a onto b given otherValue:d + return a + b + d +end testAdd + +on testGetScript() + return testScript +end testGetScript + +on print +end print diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Foundation.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Foundation.h new file mode 100644 index 00000000..fe3e1f02 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Foundation.h @@ -0,0 +1,100 @@ +// +// GTMNSAppleEventDescriptor+Foundation.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" +#import "GTMFourCharCode.h" + +// A category for dealing with NSAppleEventDescriptors and NSArrays. +@interface NSAppleEventDescriptor (GTMAppleEventDescriptorArrayAdditions) +// Used to register the types you know how to convert into +// NSAppleEventDescriptors. +// See examples in GTMNSAppleEventDescriptor+Foundation. +// Args: +// selector - selector to call for any of the types in |types| +// -(NSAppleEventDesc *)selector_name; +// types - an std c array of types of length |count| +// count - number of types in |types| ++ (void)gtm_registerSelector:(SEL)selector + forTypes:(DescType*)types + count:(NSUInteger)count; + +// Returns an NSObject for any NSAppleEventDescriptor +// Uses types registerd by registerSelector:forTypes:count: to determine +// what type of object to create. If it doesn't know a type, it attempts +// to return [self stringValue]. +- (id)gtm_objectValue; + +// Return an NSArray for an AEList +// Returns nil on failure. +- (NSArray*)gtm_arrayValue; + +// Return an NSDictionary for an AERecord +// Returns nil on failure. +- (NSDictionary*)gtm_dictionaryValue; + +// Return an NSNull for a desc of typeNull +// Returns nil on failure. +- (NSNull*)gtm_nullValue; + +// Return a NSAppleEventDescriptor for a double value. ++ (NSAppleEventDescriptor*)gtm_descriptorWithDouble:(double)real; + +// Return a NSAppleEventDescriptor for a float value. ++ (NSAppleEventDescriptor*)gtm_descriptorWithFloat:(float)real; + +// Return a NSAppleEventDescriptor for a CGFloat value. ++ (NSAppleEventDescriptor*)gtm_descriptorWithCGFloat:(CGFloat)real; + +// Attempt to extract a double value. Returns NAN on error. +- (double)gtm_doubleValue; + +// Attempt to extract a float value. Returns NAN on error. +- (float)gtm_floatValue; + +// Attempt to extract a CGFloat value. Returns NAN on error. +- (CGFloat)gtm_cgFloatValue; + +// Attempt to extract a NSNumber. Returns nil on error. +- (NSNumber*)gtm_numberValue; + +@end + +@interface NSObject (GTMAppleEventDescriptorObjectAdditions) +// A informal protocol that objects can override to return appleEventDescriptors +// for their type. The default is to return [self description] rolled up +// in an NSAppleEventDescriptor. Built in support for: +// NSArray, NSDictionary, NSNull, NSString, NSNumber and NSProcessInfo +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor; +@end + +@interface NSAppleEventDescriptor (GTMAppleEventDescriptorAdditions) +// Allows you to send events. +// Returns YES if send was successful. +- (BOOL)gtm_sendEventWithMode:(AESendMode)mode + timeOut:(NSTimeInterval)timeout + reply:(NSAppleEventDescriptor**)reply; +@end + +@interface GTMFourCharCode (GTMAppleEventDescriptorObjectAdditions) + +// if you call gtm_appleEventDescriptor on GTMFourCharCode it will be of +// type typeType. If you need something different (like typeProperty) this +// allows you to define the type you want. +- (NSAppleEventDescriptor*)gtm_appleEventDescriptorOfType:(DescType)type; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Foundation.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Foundation.m new file mode 100644 index 00000000..b3556074 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Foundation.m @@ -0,0 +1,536 @@ +// +// GTMNSAppleEventDescriptor+Foundation.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSAppleEventDescriptor+Foundation.h" +#import "GTMDebugSelectorValidation.h" +#import // Needed Solely For keyASUserRecordFields + +// Map of types to selectors. +static NSMutableDictionary *gTypeMap = nil; + +@implementation NSAppleEventDescriptor (GTMAppleEventDescriptorArrayAdditions) + ++ (void)gtm_registerSelector:(SEL)selector + forTypes:(DescType*)types + count:(NSUInteger)count { + if (selector && types && count > 0) { +#if DEBUG + NSAppleEventDescriptor *desc + = [[[NSAppleEventDescriptor alloc] initListDescriptor] autorelease]; + GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(desc, + selector, + @encode(id), + NULL); +#endif + @synchronized(self) { + if (!gTypeMap) { + gTypeMap = [[NSMutableDictionary alloc] init]; + } + NSString *selString = NSStringFromSelector(selector); + for (NSUInteger i = 0; i < count; ++i) { + NSNumber *key = [NSNumber numberWithUnsignedInt:types[i]]; + NSString *exists = [gTypeMap objectForKey:key]; + if (exists) { + _GTMDevLog(@"%@ being replaced with %@ exists for type: %@", + exists, selString, key); + } + [gTypeMap setObject:selString forKey:key]; + } + } + } +} + +- (id)gtm_objectValue { + id value = nil; + + // Check our registered types to see if we have anything + if (gTypeMap) { + @synchronized(gTypeMap) { + DescType type = [self descriptorType]; + NSNumber *key = [NSNumber numberWithUnsignedInt:type]; + NSString *selectorString = [gTypeMap objectForKey:key]; + if (selectorString) { + SEL selector = NSSelectorFromString(selectorString); + value = [self performSelector:selector]; + } else { + value = [self stringValue]; + } + } + } + return value; +} + +- (NSArray*)gtm_arrayValue { + NSUInteger count = [self numberOfItems]; + NSAppleEventDescriptor *workingDesc = self; + if (count == 0) { + // Create a list to work with. + workingDesc = [self coerceToDescriptorType:typeAEList]; + count = [workingDesc numberOfItems]; + } + NSMutableArray *items = [NSMutableArray arrayWithCapacity:count]; + for (NSUInteger i = 1; i <= count; ++i) { + NSAppleEventDescriptor *desc = [workingDesc descriptorAtIndex:i]; + id value = [desc gtm_objectValue]; + if (!value) { + _GTMDevLog(@"Unknown type of descriptor %@", [desc description]); + return nil; + } + [items addObject:value]; + } + return items; +} + +- (NSDictionary*)gtm_dictionaryValue { + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + NSAppleEventDescriptor *userRecord = [self descriptorForKeyword:keyASUserRecordFields]; + if (userRecord) { + NSArray *userItems = [userRecord gtm_arrayValue]; + NSString *key = nil; + NSString *item; + GTM_FOREACH_OBJECT(item, userItems) { + if (key) { + // Save the pair and reset our state + [dictionary setObject:item forKey:key]; + key = nil; + } else { + // Save it for the next pair + key = item; + } + } + if (key) { + _GTMDevLog(@"Got a key %@ with no value in %@", key, userItems); + return nil; + } + } else { + NSUInteger count = [self numberOfItems]; + for (NSUInteger i = 1; i <= count; ++i) { + AEKeyword key = [self keywordForDescriptorAtIndex:i]; + NSAppleEventDescriptor *desc = [self descriptorForKeyword:key]; + id value = [desc gtm_objectValue]; + if (!value) { + _GTMDevLog(@"Unknown type of descriptor %@", [desc description]); + return nil; + } + [dictionary setObject:value + forKey:[GTMFourCharCode fourCharCodeWithFourCharCode:key]]; + } + } + return dictionary; +} + +- (NSNull*)gtm_nullValue { + return [NSNull null]; +} + ++ (NSAppleEventDescriptor*)gtm_descriptorWithDouble:(double)real { + return [NSAppleEventDescriptor descriptorWithDescriptorType:typeIEEE64BitFloatingPoint + bytes:&real + length:sizeof(real)]; +} + ++ (NSAppleEventDescriptor*)gtm_descriptorWithFloat:(float)real { + return [NSAppleEventDescriptor descriptorWithDescriptorType:typeIEEE32BitFloatingPoint + bytes:&real + length:sizeof(real)]; +} + + ++ (NSAppleEventDescriptor*)gtm_descriptorWithCGFloat:(CGFloat)real { +#if CGFLOAT_IS_DOUBLE + return [self gtm_descriptorWithDouble:real]; +#else + return [self gtm_descriptorWithFloat:real]; +#endif +} + +- (double)gtm_doubleValue { + double value = NAN; + NSNumber *number = [self gtm_numberValue]; + if (number) { + value = [number doubleValue]; + } + return value; +} + +- (float)gtm_floatValue { + float value = NAN; + NSNumber *number = [self gtm_numberValue]; + if (number) { + value = [number floatValue]; + } + return value; +} + +- (CGFloat)gtm_cgFloatValue { +#if CGFLOAT_IS_DOUBLE + return [self gtm_doubleValue]; +#else + return [self gtm_floatValue]; +#endif +} + +- (NSNumber*)gtm_numberValue { + typedef struct { + DescType type; + SEL selector; + } TypeSelectorMap; + TypeSelectorMap typeSelectorMap[] = { + { typeFalse, @selector(numberWithBool:) }, + { typeTrue, @selector(numberWithBool:) }, + { typeBoolean, @selector(numberWithBool:) }, + { typeSInt16, @selector(numberWithShort:) }, + { typeSInt32, @selector(numberWithInt:) }, + { typeUInt32, @selector(numberWithUnsignedInt:) }, + { typeSInt64, @selector(numberWithLongLong:) }, + { typeIEEE32BitFloatingPoint, @selector(numberWithFloat:) }, + { typeIEEE64BitFloatingPoint, @selector(numberWithDouble:) } + }; + DescType type = [self descriptorType]; + SEL selector = nil; + for (size_t i = 0; i < sizeof(typeSelectorMap) / sizeof(TypeSelectorMap); ++i) { + if (type == typeSelectorMap[i].type) { + selector = typeSelectorMap[i].selector; + break; + } + } + NSAppleEventDescriptor *desc = self; + if (!selector) { + // COV_NF_START - Don't know how to force this in a unittest + _GTMDevLog(@"Didn't get a valid selector?"); + desc = [self coerceToDescriptorType:typeIEEE64BitFloatingPoint]; + selector = @selector(numberWithDouble:); + // COV_NF_END + } + NSData *descData = [desc data]; + const void *bytes = [descData bytes]; + if (!bytes) { + // COV_NF_START - Don't know how to force this in a unittest + _GTMDevLog(@"Unable to get bytes from %@", desc); + return nil; + // COV_NF_END + } + Class numberClass = [NSNumber class]; + NSMethodSignature *signature = [numberClass methodSignatureForSelector:selector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + [invocation setSelector:selector]; + [invocation setArgument:(void*)bytes atIndex:2]; + [invocation setTarget:numberClass]; + [invocation invoke]; + NSNumber *value = nil; + [invocation getReturnValue:&value]; + return value; +} + +- (GTMFourCharCode*)gtm_fourCharCodeValue { + return [GTMFourCharCode fourCharCodeWithFourCharCode:[self typeCodeValue]]; +} + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + return self; +} + +@end + +@implementation NSObject (GTMAppleEventDescriptorObjectAdditions) +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + return [NSAppleEventDescriptor descriptorWithString:[self description]]; +} +@end + +@implementation NSArray (GTMAppleEventDescriptorObjectAdditions) + ++ (void)load { + DescType types[] = { + typeAEList, + }; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_arrayValue) + forTypes:types + count:sizeof(types)/sizeof(DescType)]; + [pool release]; +} + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + NSAppleEventDescriptor *desc = [NSAppleEventDescriptor listDescriptor]; + NSUInteger count = [self count]; + for (NSUInteger i = 1; i <= count; ++i) { + id item = [self objectAtIndex:i-1]; + NSAppleEventDescriptor *itemDesc = [item gtm_appleEventDescriptor]; + if (!itemDesc) { + _GTMDevLog(@"Unable to create Apple Event Descriptor for %@", [self description]); + return nil; + } + [desc insertDescriptor:itemDesc atIndex:i]; + } + return desc; +} +@end + +@implementation NSDictionary (GTMAppleEventDescriptorObjectAdditions) + ++ (void)load { + DescType types[] = { + typeAERecord, + }; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_dictionaryValue) + forTypes:types + count:sizeof(types)/sizeof(DescType)]; + [pool release]; +} + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + Class keyClass = nil; + id key = nil; + GTM_FOREACH_KEY(key, self) { + if (!keyClass) { + if ([key isKindOfClass:[GTMFourCharCode class]]) { + keyClass = [GTMFourCharCode class]; + } else if ([key isKindOfClass:[NSString class]]) { + keyClass = [NSString class]; + } else { + _GTMDevLog(@"Keys must be of type NSString or GTMFourCharCode: %@", key); + return nil; + } + } + if (![key isKindOfClass:keyClass]) { + _GTMDevLog(@"Keys must be homogenous (first key was of type %@) " + "and of type NSString or GTMFourCharCode: %@", keyClass, key); + return nil; + } + } + NSAppleEventDescriptor *desc = [NSAppleEventDescriptor recordDescriptor]; + if ([keyClass isEqual:[NSString class]]) { + NSMutableArray *array = [NSMutableArray arrayWithCapacity:[self count] * 2]; + GTM_FOREACH_KEY(key, self) { + [array addObject:key]; + [array addObject:[self objectForKey:key]]; + } + NSAppleEventDescriptor *userRecord = [array gtm_appleEventDescriptor]; + if (!userRecord) { + return nil; + } + [desc setDescriptor:userRecord forKeyword:keyASUserRecordFields]; + } else { + GTM_FOREACH_KEY(key, self) { + id value = [self objectForKey:key]; + NSAppleEventDescriptor *valDesc = [value gtm_appleEventDescriptor]; + if (!valDesc) { + return nil; + } + [desc setDescriptor:valDesc forKeyword:[key fourCharCode]]; + } + } + return desc; +} + +@end + +@implementation NSNull (GTMAppleEventDescriptorObjectAdditions) ++ (void)load { + DescType types[] = { + typeNull + }; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_nullValue) + forTypes:types + count:sizeof(types)/sizeof(DescType)]; + [pool release]; +} + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + return [NSAppleEventDescriptor nullDescriptor]; +} +@end + +@implementation NSString (GTMAppleEventDescriptorObjectAdditions) + ++ (void)load { + DescType types[] = { + typeUTF16ExternalRepresentation, + typeUnicodeText, + typeUTF8Text, + typeCString, + typePString, + typeChar, + typeIntlText }; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [NSAppleEventDescriptor gtm_registerSelector:@selector(stringValue) + forTypes:types + count:sizeof(types)/sizeof(DescType)]; + [pool release]; +} + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + return [NSAppleEventDescriptor descriptorWithString:self]; +} +@end + +@implementation NSNumber (GTMAppleEventDescriptorObjectAdditions) + ++ (void)load { + DescType types[] = { + typeTrue, + typeFalse, + typeBoolean, + typeSInt16, + typeSInt32, + typeUInt32, + typeSInt64, + typeIEEE32BitFloatingPoint, + typeIEEE64BitFloatingPoint }; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_numberValue) + forTypes:types + count:sizeof(types)/sizeof(DescType)]; + [pool release]; +} + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + const char *type = [self objCType]; + if (!type || strlen(type) != 1) return nil; + + DescType desiredType = typeNull; + NSAppleEventDescriptor *desc = nil; + switch (type[0]) { + // COV_NF_START + // I can't seem to convince objcType to return something of this type + case 'B': + desc = [NSAppleEventDescriptor descriptorWithBoolean:[self boolValue]]; + break; + // COV_NF_END + + case 'c': + case 'C': + case 's': + case 'S': + desiredType = typeSInt16; + break; + + case 'i': + case 'l': + desiredType = typeSInt32; + break; + + // COV_NF_START + // I can't seem to convince objcType to return something of this type + case 'I': + case 'L': + desiredType = typeUInt32; + break; + // COV_NF_END + + case 'q': + case 'Q': + desiredType = typeSInt64; + break; + + case 'f': + desiredType = typeIEEE32BitFloatingPoint; + break; + + case 'd': + default: + desiredType = typeIEEE64BitFloatingPoint; + break; + } + + if (!desc) { + desc = [NSAppleEventDescriptor gtm_descriptorWithDouble:[self doubleValue]]; + if (desc && desiredType != typeIEEE64BitFloatingPoint) { + desc = [desc coerceToDescriptorType:desiredType]; + } + } + return desc; +} + +@end + +@implementation NSProcessInfo (GTMAppleEventDescriptorObjectAdditions) + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + ProcessSerialNumber psn = { 0, kCurrentProcess }; + return [NSAppleEventDescriptor descriptorWithDescriptorType:typeProcessSerialNumber + bytes:&psn + length:sizeof(ProcessSerialNumber)]; +} + +@end + +@implementation GTMFourCharCode (GTMAppleEventDescriptorObjectAdditions) + ++ (void)load { + DescType types[] = { + typeType, + typeKeyword, + typeApplSignature, + typeEnumerated, + }; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_fourCharCodeValue) + forTypes:types + count:sizeof(types)/sizeof(DescType)]; + [pool release]; +} + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + return [self gtm_appleEventDescriptorOfType:typeType]; +} + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptorOfType:(DescType)type { + FourCharCode code = [self fourCharCode]; + return [NSAppleEventDescriptor descriptorWithDescriptorType:type + bytes:&code + length:sizeof(code)]; +} +@end + +@implementation NSAppleEventDescriptor (GTMAppleEventDescriptorAdditions) + +- (BOOL)gtm_sendEventWithMode:(AESendMode)mode + timeOut:(NSTimeInterval)timeout + reply:(NSAppleEventDescriptor**)reply { + BOOL isGood = YES; + AppleEvent replyEvent = { typeNull, NULL }; + OSStatus err = AESendMessage([self aeDesc], &replyEvent, mode, timeout * 60); + NSAppleEventDescriptor *replyDesc + = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&replyEvent] autorelease]; + if (err) { + isGood = NO; + _GTMDevLog(@"Unable to send message: %@ %d", self, err); + } + if (isGood) { + NSAppleEventDescriptor *errorDesc = [replyDesc descriptorForKeyword:keyErrorNumber]; + if (errorDesc && [errorDesc int32Value]) { + isGood = NO; + } + } + if (reply) { + *reply = replyDesc; + } + return isGood; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+FoundationTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+FoundationTest.m new file mode 100644 index 00000000..f346e992 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+FoundationTest.m @@ -0,0 +1,643 @@ +// +// GTMNSAppleEventDescriptor+FoundationTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import +#import "GTMNSAppleEventDescriptor+Foundation.h" +#import "GTMFourCharCode.h" +#import "GTMUnitTestDevLog.h" + +@interface GTMNSAppleEventDescriptor_TestObject : NSObject +@end + +@implementation GTMNSAppleEventDescriptor_TestObject + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + return nil; +} + +@end + +@interface GTMNSAppleEventDescriptor_FoundationTest : GTMTestCase { + BOOL gotEvent_; +} +- (void)handleEvent:(NSAppleEventDescriptor*)event + withReply:(NSAppleEventDescriptor*)reply; +- (void)handleEvent:(NSAppleEventDescriptor*)event + withError:(NSAppleEventDescriptor*)reply; + +@end + +@implementation GTMNSAppleEventDescriptor_FoundationTest +- (void)testRegisterSelectorForTypesCount { + // Weird edge casey stuff. + // + (void)registerSelector:(SEL)selector + // forTypes:(DescType*)types count:(int)count + // is tested heavily by the other NSAppleEventDescriptor+foo categories. + DescType type; + [NSAppleEventDescriptor gtm_registerSelector:nil + forTypes:&type count:1]; + [NSAppleEventDescriptor gtm_registerSelector:@selector(initListDescriptor) + forTypes:nil count:1]; + [NSAppleEventDescriptor gtm_registerSelector:@selector(initListDescriptor) + forTypes:&type count:0]; + // Test the duplicate case + [NSAppleEventDescriptor gtm_registerSelector:@selector(initListDescriptor) + forTypes:&type count:1]; + [GTMUnitTestDevLog expectPattern:@"initListDescriptor being replaced with " + "initListDescriptor exists for type: [0-9]+"]; + [NSAppleEventDescriptor gtm_registerSelector:@selector(initListDescriptor) + forTypes:&type count:1]; +} + +- (void)testObjectValue { + // - (void)testObjectValue is tested heavily by the other + // NSAppleEventDescriptor+foo categories. + long data = 1; + // v@#f is just a bogus descriptor type that we don't recognize. + NSAppleEventDescriptor *desc + = [NSAppleEventDescriptor descriptorWithDescriptorType:'v@#f' + bytes:&data + length:sizeof(data)]; + id value = [desc gtm_objectValue]; + STAssertNil(value, nil); +} + +- (void)testAppleEventDescriptor { + // - (NSAppleEventDescriptor*)appleEventDescriptor is tested heavily by the + // other NSAppleEventDescriptor+foo categories. + NSAppleEventDescriptor *desc = [self gtm_appleEventDescriptor]; + STAssertNotNil(desc, nil); + STAssertEquals([desc descriptorType], (DescType)typeUnicodeText, nil); +} + +- (void)testDescriptorWithArrayAndArrayValue { + // Test empty array + NSAppleEventDescriptor *desc = [[NSArray array] gtm_appleEventDescriptor]; + STAssertNotNil(desc, nil); + STAssertEquals([desc numberOfItems], (NSInteger)0, nil); + + // Complex array + NSArray *array = [NSArray arrayWithObjects: + [NSNumber numberWithInt:4], + @"foo", + [NSNumber numberWithInt:2], + @"bar", + [NSArray arrayWithObjects: + @"bam", + [NSArray arrayWithObject:[NSNumber numberWithFloat:4.2f]], + nil], + nil]; + STAssertNotNil(array, nil); + desc = [array gtm_appleEventDescriptor]; + STAssertNotNil(desc, nil); + NSArray *array2 = [desc gtm_objectValue]; + STAssertNotNil(array2, nil); + NSArray *array3 = [desc gtm_arrayValue]; + STAssertNotNil(array3, nil); + STAssertTrue([array isEqualToArray:array2], + @"array: %@\narray2: %@\ndesc: %@", + [array description], [array2 description], [desc description]); + STAssertTrue([array2 isEqualToArray:array3], + @"array: %@\narray2: %@\ndesc: %@", + [array description], [array2 description], [desc description]); + + // Test a single object + array = [NSArray arrayWithObject:@"foo"]; + desc = [NSAppleEventDescriptor descriptorWithString:@"foo"]; + STAssertNotNil(desc, nil); + array2 = [desc gtm_arrayValue]; + STAssertTrue([array isEqualToArray:array2], + @"array: %@\narray2: %@\ndesc: %@", + [array description], [array2 description], [desc description]); + + // Something that doesn't know how to register itself. + GTMNSAppleEventDescriptor_TestObject *obj + = [[[GTMNSAppleEventDescriptor_TestObject alloc] init] autorelease]; + [GTMUnitTestDevLog expectPattern:@"Unable to create Apple Event Descriptor for .*"]; + desc = [[NSArray arrayWithObject:obj] gtm_appleEventDescriptor]; + STAssertNil(desc, @"Should be nil"); + + // A list containing something we don't know how to deal with + desc = [NSAppleEventDescriptor listDescriptor]; + NSAppleEventDescriptor *desc2 + = [NSAppleEventDescriptor descriptorWithDescriptorType:'@!@#' + bytes:&desc + length:sizeof(desc)]; + [GTMUnitTestDevLog expectPattern:@"Unknown type of descriptor " + ""]; + [desc insertDescriptor:desc2 atIndex:0]; + array = [desc gtm_objectValue]; + STAssertEquals([array count], (NSUInteger)0, @"Should have 0 items"); +} + +- (void)testDescriptorWithDictionaryAndDictionaryValue { + // Test empty dictionary + NSAppleEventDescriptor *desc + = [[NSDictionary dictionary] gtm_appleEventDescriptor]; + STAssertNotNil(desc, nil); + STAssertEquals([desc numberOfItems], (NSInteger)0, nil); + + // Complex dictionary + NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: + @"fooobject", + @"fookey", + @"barobject", + @"barkey", + [NSDictionary dictionaryWithObjectsAndKeys: + @"january", + [GTMFourCharCode fourCharCodeWithFourCharCode:cJanuary], + @"february", + [GTMFourCharCode fourCharCodeWithFourCharCode:cFebruary], + nil], + @"dictkey", + nil]; + STAssertNotNil(dictionary, nil); + desc = [dictionary gtm_appleEventDescriptor]; + STAssertNotNil(desc, nil); + NSDictionary *dictionary2 = [desc gtm_objectValue]; + STAssertNotNil(dictionary2, nil); + NSDictionary *dictionary3 = [desc gtm_dictionaryValue]; + STAssertNotNil(dictionary3, nil); + STAssertEqualObjects(dictionary, dictionary2, + @"desc: %@", [desc description]); + STAssertEqualObjects(dictionary2, dictionary3, + @"desc: %@", [desc description]); + + // Something that doesn't know how to register itself. + GTMNSAppleEventDescriptor_TestObject *obj + = [[[GTMNSAppleEventDescriptor_TestObject alloc] init] autorelease]; + [GTMUnitTestDevLog expectPattern:@"Unable to create Apple Event Descriptor for .*"]; + desc = [[NSDictionary dictionaryWithObject:obj + forKey:@"foo"] gtm_appleEventDescriptor]; + STAssertNil(desc, @"Should be nil"); + + GTMFourCharCode *fcc = [GTMFourCharCode fourCharCodeWithFourCharCode:cJanuary]; + desc = [[NSDictionary dictionaryWithObject:obj + forKey:fcc] gtm_appleEventDescriptor]; + STAssertNil(desc, @"Should be nil"); + + // A list containing something we don't know how to deal with + desc = [NSAppleEventDescriptor recordDescriptor]; + NSAppleEventDescriptor *desc2 + = [NSAppleEventDescriptor descriptorWithDescriptorType:'@!@#' + bytes:&desc + length:sizeof(desc)]; + [desc setDescriptor:desc2 forKeyword:cJanuary]; + [GTMUnitTestDevLog expectPattern:@"Unknown type of descriptor " + ""]; + dictionary = [desc gtm_objectValue]; + STAssertEquals([dictionary count], (NSUInteger)0, @"Should have 0 items"); + + // A bad dictionary + dictionary = [NSDictionary dictionaryWithObjectsAndKeys: + @"foo", + [GTMFourCharCode fourCharCodeWithFourCharCode:'APPL'], + @"bam", + @"bar", + nil]; + STAssertNotNil(dictionary, nil); + // I cannot use expectString here to the exact string because interestingly + // dictionaries in 64 bit enumerate in a different order from dictionaries + // on 32 bit. This is the closest pattern I can match. + [GTMUnitTestDevLog expectPattern:@"Keys must be homogenous .*"]; + desc = [dictionary gtm_appleEventDescriptor]; + STAssertNil(desc, nil); + + // Another bad dictionary + dictionary = [NSDictionary dictionaryWithObjectsAndKeys: + @"foo", + [NSNumber numberWithInt:4], + @"bam", + @"bar", + nil]; + STAssertNotNil(dictionary, nil); + // I cannot use expectString here to the exact string because interestingly + // dictionaries in 64 bit enumerate in a different order from dictionaries + // on 32 bit. This is the closest pattern I can match. + [GTMUnitTestDevLog expectPattern:@"Keys must be .*"]; + desc = [dictionary gtm_appleEventDescriptor]; + STAssertNil(desc, nil); + + // A bad descriptor + desc = [NSAppleEventDescriptor recordDescriptor]; + STAssertNotNil(desc, @""); + NSArray *array = [NSArray arrayWithObjects:@"foo", @"bar", @"bam", nil]; + STAssertNotNil(array, @""); + NSAppleEventDescriptor *userRecord = [array gtm_appleEventDescriptor]; + STAssertNotNil(userRecord, @""); + [desc setDescriptor:userRecord forKeyword:keyASUserRecordFields]; + [GTMUnitTestDevLog expectPattern:@"Got a key bam with no value in \\(.*"]; + dictionary = [desc gtm_objectValue]; + STAssertNil(dictionary, @"Should be nil"); +} + +- (void)testDescriptorWithNull { + // Test Null + NSNull *null = [NSNull null]; + NSAppleEventDescriptor *desc = [null gtm_appleEventDescriptor]; + STAssertNotNil(desc, nil); + NSNull *null2 = [desc gtm_objectValue]; + STAssertNotNil(null2, nil); + NSNull *null3 = [desc gtm_nullValue]; + STAssertNotNil(null2, nil); + STAssertEqualObjects(null, null2, + @"null: %@\null2: %@\ndesc: %@", + [null description], [null2 description], + [desc description]); + STAssertEqualObjects(null, null3, + @"null: %@\null3: %@\ndesc: %@", + [null description], [null3 description], + [desc description]); +} + +- (void)testDescriptorWithString { + // Test empty String + NSAppleEventDescriptor *desc = [[NSString string] gtm_appleEventDescriptor]; + STAssertNotNil(desc, nil); + + // Test String + NSString *string = @"Ratatouille!"; + desc = [string gtm_appleEventDescriptor]; + STAssertNotNil(desc, nil); + NSString *string2 = [desc gtm_objectValue]; + STAssertNotNil(string2, nil); + STAssertEqualObjects(string, string2, + @"string: %@\nstring: %@\ndesc: %@", + [string description], [string2 description], [desc description]); + +} + +- (void)testDescriptorWithNumberAndNumberValue { + // There's really no good way to make this into a loop sadly due + // to me having to pass a pointer of bytes to NSInvocation as an argument. + // I want the compiler to convert my int to the appropriate type. + + NSNumber *original = [NSNumber numberWithBool:YES]; + STAssertNotNil(original, @"Value: YES"); + NSAppleEventDescriptor *desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: YES"); + id returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: YES"); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: YES"); + STAssertEqualObjects(original, returned, @"Value: YES"); + desc = [desc coerceToDescriptorType:typeBoolean]; + NSNumber *number = [desc gtm_numberValue]; + STAssertEqualObjects(number, original, @"Value: YES"); + + original = [NSNumber numberWithBool:NO]; + STAssertNotNil(original, @"Value: NO"); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: NO"); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: NO"); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: NO"); + STAssertEqualObjects(original, returned, @"Value: NO"); + + sranddev(); + double value = rand(); + + original = [NSNumber numberWithChar:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = rand(); + original = [NSNumber numberWithUnsignedChar:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = rand(); + original = [NSNumber numberWithShort:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = rand(); + original = [NSNumber numberWithUnsignedShort:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = rand(); + original = [NSNumber numberWithInt:(int)value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = rand(); + original = [NSNumber numberWithUnsignedInt:(unsigned int)value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = rand(); + original = [NSNumber numberWithLong:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = rand(); + original = [NSNumber numberWithUnsignedLong:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = rand(); + original = [NSNumber numberWithLongLong:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = rand(); + original = [NSNumber numberWithUnsignedLongLong:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + float floatA = rand(); + float floatB = rand(); + value = floatA / floatB; + original = [NSNumber numberWithFloat:(float)value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + double doubleA = rand(); + double doubleB = rand(); + value = doubleA / doubleB; + original = [NSNumber numberWithDouble:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = rand(); + original = [NSNumber numberWithBool:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = NAN; + original = [NSNumber numberWithDouble:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = INFINITY; + original = [NSNumber numberWithDouble:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = -0.0; + original = [NSNumber numberWithDouble:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); + + value = -INFINITY; + original = [NSNumber numberWithDouble:value]; + STAssertNotNil(original, @"Value: %g", value); + desc = [original gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Value: %g", value); + returned = [desc gtm_objectValue]; + STAssertNotNil(returned, @"Value: %g", value); + STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value); + STAssertEqualObjects(original, returned, @"Value: %g", value); +} + +- (void)testDescriptorWithDoubleAndDoubleValue { + sranddev(); + for (int i = 0; i < 1000; ++i) { + double value1 = rand(); + double value2 = rand(); + double value = value1 / value2; + NSAppleEventDescriptor *desc + = [NSAppleEventDescriptor gtm_descriptorWithDouble:value]; + STAssertNotNil(desc, @"Value: %g", value); + double returnedValue = [desc gtm_doubleValue]; + STAssertEquals(value, returnedValue, @"Value: %g", value); + } + + double specialCases[] = { 0.0f, __DBL_MIN__, __DBL_EPSILON__, INFINITY, NAN }; + for (size_t i = 0; i < sizeof(specialCases) / sizeof(double); ++i) { + double value = specialCases[i]; + NSAppleEventDescriptor *desc + = [NSAppleEventDescriptor gtm_descriptorWithDouble:value]; + STAssertNotNil(desc, @"Value: %g", value); + double returnedValue = [desc gtm_doubleValue]; + STAssertEquals(value, returnedValue, @"Value: %g", value); + } +} + +- (void)testDescriptorWithFloatAndFloatValue { + sranddev(); + for (int i = 0; i < 1000; ++i) { + float value1 = rand(); + float value2 = rand(); + float value = value1 / value2; + NSAppleEventDescriptor *desc + = [NSAppleEventDescriptor gtm_descriptorWithFloat:value]; + STAssertNotNil(desc, @"Value: %f", value); + float returnedValue = [desc gtm_floatValue]; + STAssertEquals(value, returnedValue, @"Value: %f", value); + } + + float specialCases[] = { 0.0f, FLT_MIN, FLT_MAX, FLT_EPSILON, INFINITY, NAN }; + for (size_t i = 0; i < sizeof(specialCases) / sizeof(float); ++i) { + float value = specialCases[i]; + NSAppleEventDescriptor *desc + = [NSAppleEventDescriptor gtm_descriptorWithFloat:value]; + STAssertNotNil(desc, @"Value: %f", value); + float returnedValue = [desc gtm_floatValue]; + STAssertEquals(value, returnedValue, @"Value: %f", value); + } +} + +- (void)testDescriptorWithCGFloatAndCGFloatValue { + sranddev(); + for (int i = 0; i < 1000; ++i) { + CGFloat value1 = rand(); + CGFloat value2 = rand(); + CGFloat value = value1 / value2; + NSAppleEventDescriptor *desc + = [NSAppleEventDescriptor gtm_descriptorWithCGFloat:value]; + STAssertNotNil(desc, @"Value: %g", (double)value); + CGFloat returnedValue = [desc gtm_cgFloatValue]; + STAssertEquals(value, returnedValue, @"Value: %g", (double)value); + } + + CGFloat specialCases[] = { 0.0f, CGFLOAT_MIN, CGFLOAT_MAX, NAN }; + for (size_t i = 0; i < sizeof(specialCases) / sizeof(CGFloat); ++i) { + CGFloat value = specialCases[i]; + NSAppleEventDescriptor *desc + = [NSAppleEventDescriptor gtm_descriptorWithCGFloat:value]; + STAssertNotNil(desc, @"Value: %g", (double)value); + CGFloat returnedValue = [desc gtm_cgFloatValue]; + STAssertEquals(value, returnedValue, @"Value: %g", (double)value); + } +} + +- (void)testDescriptorWithGTMFourCharCode { + GTMFourCharCode *fcc = [GTMFourCharCode fourCharCodeWithFourCharCode:'APPL']; + STAssertNotNil(fcc, nil); + NSAppleEventDescriptor *desc = [fcc gtm_appleEventDescriptor]; + STAssertNotNil(desc, nil); + GTMFourCharCode *fcc2 = [desc gtm_objectValue]; + STAssertNotNil(fcc2, nil); + STAssertEqualObjects(fcc, fcc2, nil); + STAssertEquals([desc descriptorType], (DescType)typeType, nil); + desc = [fcc gtm_appleEventDescriptorOfType:typeKeyword]; + STAssertNotNil(desc, nil); + fcc2 = [desc gtm_objectValue]; + STAssertNotNil(fcc2, nil); + STAssertEqualObjects(fcc, fcc2, nil); + STAssertEquals([desc descriptorType], (DescType)typeKeyword, nil); +} + +- (void)testDescriptorWithDescriptor { + NSAppleEventDescriptor *desc + = [NSAppleEventDescriptor descriptorWithString:@"foo"]; + NSAppleEventDescriptor *desc2 = [desc gtm_appleEventDescriptor]; + STAssertEqualObjects(desc, desc2, nil); +} + +- (void)handleEvent:(NSAppleEventDescriptor*)event + withReply:(NSAppleEventDescriptor*)reply { + gotEvent_ = YES; + NSAppleEventDescriptor *answer = [NSAppleEventDescriptor descriptorWithInt32:1]; + [reply setDescriptor:answer forKeyword:keyDirectObject]; +} + +- (void)handleEvent:(NSAppleEventDescriptor*)event + withError:(NSAppleEventDescriptor*)error { + gotEvent_ = YES; + NSAppleEventDescriptor *answer = [NSAppleEventDescriptor descriptorWithInt32:1]; + [error setDescriptor:answer forKeyword:keyErrorNumber]; +} + +- (void)testSend { + const AEEventClass eventClass = 'Fooz'; + const AEEventID eventID = 'Ball'; + NSAppleEventManager *mgr = [NSAppleEventManager sharedAppleEventManager]; + [mgr setEventHandler:self + andSelector:@selector(handleEvent:withReply:) + forEventClass:eventClass + andEventID:'Ball']; + NSAppleEventDescriptor *currentProcess + = [[NSProcessInfo processInfo] gtm_appleEventDescriptor]; + NSAppleEventDescriptor *event + = [NSAppleEventDescriptor appleEventWithEventClass:eventClass + eventID:eventID + targetDescriptor:currentProcess + returnID:kAutoGenerateReturnID + transactionID:kAnyTransactionID]; + gotEvent_ = NO; + NSAppleEventDescriptor *reply; + BOOL goodEvent = [event gtm_sendEventWithMode:kAEWaitReply timeOut:60 reply:&reply]; + [mgr removeEventHandlerForEventClass:eventClass andEventID:eventID]; + STAssertTrue(goodEvent, @"bad event?"); + STAssertTrue(gotEvent_, @"Handler not called"); + NSAppleEventDescriptor *value = [reply descriptorForKeyword:keyDirectObject]; + STAssertEquals([value int32Value], (SInt32)1, @"didn't get reply"); + + + gotEvent_ = NO; + [GTMUnitTestDevLog expectString:@"Unable to send message: " + " -1708"]; + goodEvent = [event gtm_sendEventWithMode:kAEWaitReply timeOut:60 reply:&reply]; + STAssertFalse(goodEvent, @"good event?"); + STAssertFalse(gotEvent_, @"Handler called?"); + + [mgr setEventHandler:self + andSelector:@selector(handleEvent:withError:) + forEventClass:eventClass + andEventID:eventID]; + gotEvent_ = NO; + goodEvent = [event gtm_sendEventWithMode:kAEWaitReply timeOut:60 reply:&reply]; + STAssertFalse(goodEvent, @"good event?"); + STAssertTrue(gotEvent_, @"Handler not called?"); + [mgr removeEventHandlerForEventClass:eventClass andEventID:eventID]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Handler.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Handler.h new file mode 100644 index 00000000..f2ac8800 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Handler.h @@ -0,0 +1,40 @@ +// +// GTMNSAppleEventDescriptor+Handler.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +@interface NSAppleEventDescriptor (GTMAppleEventDescriptorHandlerAdditions) ++ (id)gtm_descriptorWithPositionalHandler:(NSString*)handler + parametersArray:(NSArray*)params; ++ (id)gtm_descriptorWithPositionalHandler:(NSString*)handler + parametersDescriptor:(NSAppleEventDescriptor*)params; ++ (id)gtm_descriptorWithLabeledHandler:(NSString*)handler + labels:(AEKeyword*)labels + parameters:(id*)params + count:(NSUInteger)count; + +- (id)gtm_initWithPositionalHandler:(NSString*)handler + parametersArray:(NSArray*)params; +- (id)gtm_initWithPositionalHandler:(NSString*)handler + parametersDescriptor:(NSAppleEventDescriptor*)params; +- (id)gtm_initWithLabeledHandler:(NSString*)handler + labels:(AEKeyword*)labels + parameters:(id*)params + count:(NSUInteger)count; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Handler.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Handler.m new file mode 100644 index 00000000..76b6e858 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+Handler.m @@ -0,0 +1,130 @@ +// +// GTMNSAppleEventDescriptor+Handler.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSAppleEventDescriptor+Handler.h" +#import "GTMNSAppleEventDescriptor+Foundation.h" +#import "GTMMethodCheck.h" +#import + +@implementation NSAppleEventDescriptor (GTMAppleEventDescriptorHandlerAdditions) +GTM_METHOD_CHECK(NSProcessInfo, gtm_appleEventDescriptor); + ++ (id)gtm_descriptorWithPositionalHandler:(NSString*)handler + parametersArray:(NSArray*)params { + return [[[self alloc] gtm_initWithPositionalHandler:handler + parametersArray:params] autorelease]; +} + ++ (id)gtm_descriptorWithPositionalHandler:(NSString*)handler + parametersDescriptor:(NSAppleEventDescriptor*)params { + return [[[self alloc] gtm_initWithPositionalHandler:handler + parametersDescriptor:params] autorelease]; +} + ++ (id)gtm_descriptorWithLabeledHandler:(NSString*)handler + labels:(AEKeyword*)labels + parameters:(id*)params + count:(NSUInteger)count { + return [[[self alloc] gtm_initWithLabeledHandler:handler + labels:labels + parameters:params + count:count] autorelease]; +} + +- (id)gtm_initWithPositionalHandler:(NSString*)handler + parametersArray:(NSArray*)params { + return [self gtm_initWithPositionalHandler:handler + parametersDescriptor:[params gtm_appleEventDescriptor]]; +} + +- (id)gtm_initWithPositionalHandler:(NSString*)handler + parametersDescriptor:(NSAppleEventDescriptor*)params { + if ((self = [self initWithEventClass:kASAppleScriptSuite + eventID:kASSubroutineEvent + targetDescriptor:[[NSProcessInfo processInfo] gtm_appleEventDescriptor] + returnID:kAutoGenerateReturnID + transactionID:kAnyTransactionID])) { + // Create an NSAppleEventDescriptor with the method handler. Note that the + // name must be lowercase (even if it is uppercase in AppleScript). + // http://developer.apple.com/qa/qa2001/qa1111.html + // has details. + handler = [handler lowercaseString]; + if (!handler) { + [self release]; + return nil; + } + NSAppleEventDescriptor *handlerDesc + = [NSAppleEventDescriptor descriptorWithString:handler]; + [self setParamDescriptor:handlerDesc forKeyword:keyASSubroutineName]; + if (params) { + [self setParamDescriptor:params forKeyword:keyDirectObject]; + } + } + return self; +} + + +- (id)gtm_initWithLabeledHandler:(NSString*)handler + labels:(AEKeyword*)labels + parameters:(id*)params + count:(NSUInteger)count { + if ((self = [self initWithEventClass:kASAppleScriptSuite + eventID:kASSubroutineEvent + targetDescriptor:[[NSProcessInfo processInfo] gtm_appleEventDescriptor] + returnID:kAutoGenerateReturnID + transactionID:kAnyTransactionID])) { + if (!handler) { + [self release]; + return nil; + } + // Create an NSAppleEventDescriptor with the method handler. Note that the + // name must be lowercase (even if it is uppercase in AppleScript). + NSAppleEventDescriptor *handlerDesc + = [NSAppleEventDescriptor descriptorWithString:[handler lowercaseString]]; + [self setParamDescriptor:handlerDesc forKeyword:keyASSubroutineName]; + for (NSUInteger i = 0; i < count; i++) { + NSAppleEventDescriptor *paramDesc = [params[i] gtm_appleEventDescriptor]; + if(labels[i] == keyASPrepositionGiven) { + if (![params[i] isKindOfClass:[NSDictionary class]]) { + _GTMDevLog(@"Must pass in dictionary for keyASPrepositionGiven " + "(got %@)", params[i]); + [self release]; + self = nil; + break; + } + NSAppleEventDescriptor *userDesc + = [paramDesc descriptorForKeyword:keyASUserRecordFields]; + if (!userDesc) { + _GTMDevLog(@"Dictionary for keyASPrepositionGiven must be a user " + "record field dictionary (got %@)", params[i]); + [self release]; + self = nil; + break; + } + [self setParamDescriptor:userDesc + forKeyword:keyASUserRecordFields]; + } else { + [self setParamDescriptor:paramDesc + forKeyword:labels[i]]; + } + } + } + return self; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+HandlerTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+HandlerTest.m new file mode 100644 index 00000000..a137d8a8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleEventDescriptor+HandlerTest.m @@ -0,0 +1,70 @@ +// +// GTNNSAppleEventDescriptor+HandlerTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMSenTestCase.h" +#import "GTMNSAppleEventDescriptor+Foundation.h" +#import "GTMNSAppleEventDescriptor+Handler.h" +#import "GTMUnitTestDevLog.h" + +@interface GTMNSAppleEventDescriptor_HandlerTest : GTMTestCase +@end + +@implementation GTMNSAppleEventDescriptor_HandlerTest +// Most of this gets tested by the NSAppleScript+Handler tests. +- (void)testPositionalHandlers { + NSAppleEventDescriptor *desc + = [NSAppleEventDescriptor gtm_descriptorWithPositionalHandler:nil + parametersArray:[NSArray array]]; + STAssertNil(desc, @"got a desc?"); + + desc = [NSAppleEventDescriptor gtm_descriptorWithPositionalHandler:@"happy" + parametersDescriptor:nil]; + STAssertNotNil(desc, @"didn't get a desc?"); + + desc = [NSAppleEventDescriptor gtm_descriptorWithLabeledHandler:nil + labels:nil + parameters:nil + count:0]; + STAssertNil(desc, @"got a desc?"); + + AEKeyword keys[] = { keyASPrepositionGiven }; + NSString *string = @"foo"; + [GTMUnitTestDevLog expectString:@"Must pass in dictionary for " + "keyASPrepositionGiven (got foo)"]; + desc = [NSAppleEventDescriptor gtm_descriptorWithLabeledHandler:@"happy" + labels:keys + parameters:&string + count:1]; + STAssertNil(desc, @"got a desc?"); + + NSDictionary *dict = [NSDictionary dictionaryWithObject:@"bart" + forKey:[NSNumber numberWithInt:4]]; + [GTMUnitTestDevLog expectString:@"Keys must be of type NSString or " + "GTMFourCharCode: 4"]; + [GTMUnitTestDevLog expectPattern:@"Dictionary for keyASPrepositionGiven must " + "be a user record field dictionary \\(got .*"]; + desc = [NSAppleEventDescriptor gtm_descriptorWithLabeledHandler:@"happy" + labels:keys + parameters:&dict + count:1]; + STAssertNil(desc, @"got a desc?"); + +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+Handler.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+Handler.h new file mode 100644 index 00000000..65f57c56 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+Handler.h @@ -0,0 +1,126 @@ +// +// GTMNSAppleScript+Handler.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +// :::WARNING::: NSAppleScript and Garbage Collect (GC) +// +// As of 10.5.6 (and below) Apple has bugs in NSAppleScript when running with +// GC; ie-things crash that have nothing to do w/ this or your code. See +// http://rails.wincent.com/issues/640 for a good amount of detail about the +// problems and simple cases that show it. + +// A category for calling handlers in NSAppleScript + +enum { + // Data type is OSAID. These will generally be representing + // scripts. + typeGTMOSAID = 'GTMO' +}; + +@interface NSAppleScript(GTMAppleScriptHandlerAdditions) +// Allows us to call a specific handler in an AppleScript. +// parameters are passed in left-right order 0-n. +// +// Args: +// handler - name of the handler to call in the Applescript +// params - the parameters to pass to the handler +// error - in non-nil returns any error that may have occurred. +// +// Returns: +// The result of the handler being called. nil on failure. +- (NSAppleEventDescriptor*)gtm_executePositionalHandler:(NSString*)handler + parameters:(NSArray*)params + error:(NSDictionary**)error; + + +// Allows us to call a specific labeled handler in an AppleScript. +// Parameters for a labeled handler can be in any order, as long as the +// order of the params array corresponds to the order of the labels array +// such that labels are associated with their correct parameter values. +// +// Args: +// handler - name of the handler to call in the Applescript +// labels - the labels to associate with the parameters +// params - the parameters to pass to the handler +// count - number of labels/parameters +// error - in non-nil returns any error that may have occurred. +// +// Returns: +// The result of the handler being called. nil on failure. +- (NSAppleEventDescriptor*)gtm_executeLabeledHandler:(NSString*)handler + labels:(AEKeyword*)labels + parameters:(id*)params + count:(NSUInteger)count + error:(NSDictionary **)error; + +// Same as executeAppleEvent:error: except that it handles return values of +// script correctly. Return values containing scripts will have the +// typeGTMOSAID. Calling gtm_objectValue on a NSAppleEventDescriptor of +// typeGTMOSAID will resolve correctly to a script value. We don't use +// typeScript because that actually copies the script instead of returning the +// actual value. Therefore if you called executeAppleEvent:error: (instead of +// the GTM version) to execute an event that returns a script, you will +// get a completely new Applescript, instead of the actual script you wanted. If +// you are working with script information, use gtm_executeAppleEvent:error +// instead of executeAppleEvent:error: to avoid the problem. +- (NSAppleEventDescriptor *)gtm_executeAppleEvent:(NSAppleEventDescriptor *)event + error:(NSDictionary **)error; + +// The set of all handlers that are defined in this script and its parents. +// Remember that handlers that are defined in an sdef will have their +// eventclass/eventid as their handler instead of the name seen in the script. +// So: +// on open(a) +// blah +// end open +// won't be "open" it will be "aevtodoc". +- (NSSet*)gtm_handlers; + +// The set of all properties that are defined in this script and its parents. +// Note that properties can be strings or GTMNSFourCharCodes, so expect both +// coming back in the set. +- (NSSet*)gtm_properties; + +// Return a value for a property. Will look up the inheritence tree. +// Property must be an NSString or a GTMFourCharCode. +- (id)gtm_valueForProperty:(id)property; + +// Return a value for a property by type (eg pASParent). Will look up the +// inheritence tree +- (id)gtm_valueForPropertyEnum:(DescType)property; + +// Set a script property value. Returns YES/NO on success/failure. +// Property must be of kind NSString or GTMFourCharCode. +// If addingDefinition is YES, it will add a definition to the script +// if the value doesn't exist in the script or one of it's parents. +- (BOOL)gtm_setValue:(id)value + forProperty:(id)property + addingDefinition:(BOOL)adding; + +// Set a value for a property by type (eg pASParent). See note above +// for gtm_setValue:forProperty. +- (BOOL)gtm_setValue:(id)value + forPropertyEnum:(DescType)property + addingDefinition:(BOOL)adding; + +// Return YES if the script has an open documents (odoc) handler +// Does not require script compilation, so it's a fast check. +- (BOOL)gtm_hasOpenDocumentsHandler; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+Handler.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+Handler.m new file mode 100644 index 00000000..8c236495 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+Handler.m @@ -0,0 +1,518 @@ +// +// GTMNSAppleScript+Handler.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMNSAppleScript+Handler.h" +#import "GTMNSAppleEventDescriptor+Foundation.h" +#import "GTMNSAppleEventDescriptor+Handler.h" +#import "GTMFourCharCode.h" +#import "GTMMethodCheck.h" +#import "GTMDebugThreadValidation.h" + +// Some private methods that we need to call +@interface NSAppleScript (NSPrivate) ++ (ComponentInstance)_defaultScriptingComponent; +- (OSAID) _compiledScriptID; +- (id)_initWithData:(NSData*)data error:(NSDictionary**)error; +- (id)_initWithScriptIDNoCopy:(OSAID)osaID; ++ (id)_infoForOSAError:(OSAError)error; +@end + +@interface NSMethodSignature (NSPrivate) ++ (id)signatureWithObjCTypes:(const char *)fp8; +@end + +// Our own private interfaces. +@interface NSAppleScript (GTMAppleScriptHandlerAdditionsPrivate) + +// Return an descriptor for a property. Properties are only supposed to be +// of type NSString or GTMFourCharCode. GTMFourCharCode's need special handling +// as they must be turned into NSAppleEventDescriptors of typeProperty. +- (NSAppleEventDescriptor*)gtm_descriptorForPropertyValue:(id)property; + +// Return an NSAppleEventDescriptor for a given property. +// |property| must be kind of class GTMFourCharCode +- (NSAppleEventDescriptor*)gtm_valueDescriptorForProperty:(id)property; + +// Utility routine for extracting multiple values in scripts and their +// parents. +- (NSSet*)gtm_allValuesUsingSelector:(SEL)selector; + +// Utility routine for extracting the handlers for a specific script without +// referring to parent scripts. +- (NSSet*)gtm_scriptHandlers; + +// Utility routine for extracting the properties for a specific script without +// referring to parent scripts. +- (NSSet*)gtm_scriptProperties; + +// Handles creating an NSAppleEventDescriptor from an OSAID +- (NSAppleEventDescriptor*)descForScriptID:(OSAID)scriptID + component:(ComponentInstance)component; + +// Utility methods for converting between real and generic OSAIDs. +- (OSAID)gtm_genericID:(OSAID)osaID forComponent:(ComponentInstance)component; +- (OSAID)gtm_realIDAndComponent:(ComponentInstance*)component; +@end + +@implementation NSAppleScript(GTMAppleScriptHandlerAdditions) +GTM_METHOD_CHECK(NSAppleEventDescriptor, gtm_descriptorWithPositionalHandler:parametersArray:); +GTM_METHOD_CHECK(NSAppleEventDescriptor, gtm_descriptorWithLabeledHandler:labels:parameters:count:); +GTM_METHOD_CHECK(NSAppleEventDescriptor, gtm_registerSelector:forTypes:count:); + ++ (void)load { + DescType types[] = { + typeScript + }; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_scriptValue) + forTypes:types + count:sizeof(types)/sizeof(DescType)]; + + DescType types2[] = { + 'evnt' // No type code for this one + }; + + [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_eventValue) + forTypes:types2 + count:sizeof(types2)/sizeof(DescType)]; + + DescType types3[] = { + typeGTMOSAID + }; + + [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_osaIDValue) + forTypes:types3 + count:sizeof(types3)/sizeof(DescType)]; + [pool release]; +} + +- (NSAppleEventDescriptor *)gtm_executeAppleEvent:(NSAppleEventDescriptor *)event + error:(NSDictionary **)error { + GTMAssertRunningOnMainThread(); + if (![self isCompiled]) { + if (![self compileAndReturnError:error]) { + return nil; + } + } + NSAppleEventDescriptor *desc = nil; + ComponentInstance component; + OSAID scriptID = [self gtm_realIDAndComponent:&component]; + OSAID valueID; + OSAError err = OSAExecuteEvent(component, [event aeDesc], scriptID, + kOSAModeNull, &valueID); + if (err == noErr) { + // descForScriptID:component: is what sets this apart from the + // standard executeAppelEvent:error: in that it handles + // taking script results and turning them into AEDescs of typeGTMOSAID + // instead of typeScript. + desc = [self descForScriptID:valueID component:component]; + } + if (err && error) { + *error = [NSAppleScript _infoForOSAError:err]; + } + return desc; +} + +- (NSAppleEventDescriptor*)gtm_executePositionalHandler:(NSString*)handler + parameters:(NSArray*)params + error:(NSDictionary**)error { + NSAppleEventDescriptor *event + = [NSAppleEventDescriptor gtm_descriptorWithPositionalHandler:handler + parametersArray:params]; + return [self gtm_executeAppleEvent:event error:error]; +} + +- (NSAppleEventDescriptor*)gtm_executeLabeledHandler:(NSString*)handler + labels:(AEKeyword*)labels + parameters:(id*)params + count:(NSUInteger)count + error:(NSDictionary **)error { + NSAppleEventDescriptor *event + = [NSAppleEventDescriptor gtm_descriptorWithLabeledHandler:handler + labels:labels + parameters:params + count:count]; + return [self gtm_executeAppleEvent:event error:error]; +} + +- (NSSet*)gtm_handlers { + return [self gtm_allValuesUsingSelector:@selector(gtm_scriptHandlers)]; +} + +- (NSSet*)gtm_properties { + return [self gtm_allValuesUsingSelector:@selector(gtm_scriptProperties)]; +} + +// Set a value for a property by type (eg pASTopLevelScript) +- (BOOL)gtm_setValue:(id)value + forPropertyEnum:(DescType)property + addingDefinition:(BOOL)adding { + GTMFourCharCode *fcc + = [GTMFourCharCode fourCharCodeWithFourCharCode:property]; + return [self gtm_setValue:value forProperty:fcc addingDefinition:adding]; +} + +- (BOOL)gtm_setValue:(id)value + forProperty:(id)property + addingDefinition:(BOOL)adding{ + OSAError error = paramErr; + BOOL wasGood = NO; + NSAppleEventDescriptor *propertyName + = [self gtm_descriptorForPropertyValue:property]; + NSAppleEventDescriptor *desc = [value gtm_appleEventDescriptor]; + if (propertyName && desc) { + NSAppleScript *script = self; + OSAID valueID = kOSANullScript; + ComponentInstance component; + OSAID scriptID = [script gtm_realIDAndComponent:&component]; + error = OSACoerceFromDesc(component, + [desc aeDesc], + kOSAModeNull, + &valueID); + if (error == noErr) { + error = OSASetProperty(component, + adding ? kOSAModeNull : kOSAModeDontDefine, + scriptID, + [propertyName aeDesc], + valueID); + if (error == noErr) { + wasGood = YES; + } + } + } + if (!wasGood) { + _GTMDevLog(@"Unable to setValue:%@ forProperty:%@ from %@ (%d)", + value, property, self, error); + } + return wasGood; +} + +- (id)gtm_valueForProperty:(id)property { + return [[self gtm_valueDescriptorForProperty:property] gtm_objectValue]; +} + +- (id)gtm_valueForPropertyEnum:(DescType)property { + GTMFourCharCode *fcc = [GTMFourCharCode fourCharCodeWithFourCharCode:property]; + return [self gtm_valueForProperty:fcc]; +} + +- (NSAppleEventDescriptor*)gtm_appleEventDescriptor { + ComponentInstance component; + OSAID osaID = [self gtm_realIDAndComponent:&component]; + AEDesc result = { typeNull, NULL }; + NSAppleEventDescriptor *desc = nil; + OSAError error = OSACoerceToDesc(component, + osaID, + typeScript, + kOSAModeNull, + &result); + if (error == noErr) { + desc = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&result] + autorelease]; + } else { + _GTMDevLog(@"Unable to coerce script %d", error); + } + return desc; +} + +- (BOOL)gtm_hasOpenDocumentsHandler { + ComponentInstance component; + OSAID osaID = [self gtm_realIDAndComponent:&component]; + long value = 0; + OSAError error = OSAGetScriptInfo(component, + osaID, + kASHasOpenHandler, + &value); + if (error) { + _GTMDevLog(@"Unable to get script info about open handler %d", error); + value = 0; + } + return value != 0; +} + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { + NSMethodSignature *signature = [super methodSignatureForSelector:aSelector]; + if (!signature) { + NSMutableString *types = [NSMutableString stringWithString:@"@@:"]; + NSString *selName = NSStringFromSelector(aSelector); + NSArray *selArray = [selName componentsSeparatedByString:@":"]; + NSUInteger count = [selArray count]; + for (NSUInteger i = 1; i < count; i++) { + [types appendString:@"@"]; + } + signature = [NSMethodSignature signatureWithObjCTypes:[types UTF8String]]; + } + return signature; +} + +- (void)forwardInvocation:(NSInvocation *)invocation { + SEL sel = [invocation selector]; + NSMutableString *handlerName + = [NSMutableString stringWithString:NSStringFromSelector(sel)]; + NSUInteger handlerOrigLength = [handlerName length]; + [handlerName replaceOccurrencesOfString:@":" + withString:@"" + options:0 + range:NSMakeRange(0,handlerOrigLength)]; + NSUInteger argCount = handlerOrigLength - [handlerName length]; + NSMutableArray *args = [NSMutableArray arrayWithCapacity:argCount]; + for (NSUInteger i = 0; i < argCount; ++i) { + id arg; + // +2 to ignore _sel and _cmd + [invocation getArgument:&arg atIndex:i + 2]; + [args addObject:arg]; + } + NSDictionary *error = nil; + NSAppleEventDescriptor *desc = [self gtm_executePositionalHandler:handlerName + parameters:args + error:&error]; + if ([[invocation methodSignature] methodReturnLength] > 0) { + id returnValue = [desc gtm_objectValue]; + [invocation setReturnValue:&returnValue]; + } +} +@end + +@implementation NSAppleScript (GTMAppleScriptHandlerAdditionsPrivate) + +- (NSAppleEventDescriptor*)gtm_descriptorForPropertyValue:(id)property { + NSAppleEventDescriptor *propDesc = nil; + if ([property isKindOfClass:[GTMFourCharCode class]]) { + propDesc = [property gtm_appleEventDescriptorOfType:typeProperty]; + } else if ([property isKindOfClass:[NSString class]]) { + propDesc = [property gtm_appleEventDescriptor]; + } + return propDesc; +} + +- (NSAppleEventDescriptor*)gtm_valueDescriptorForProperty:(id)property { + GTMAssertRunningOnMainThread(); + OSAError error = paramErr; + NSAppleEventDescriptor *desc = nil; + NSAppleEventDescriptor *propertyName + = [self gtm_descriptorForPropertyValue:property]; + if (propertyName) { + ComponentInstance component; + OSAID scriptID = [self gtm_realIDAndComponent:&component]; + OSAID valueID = kOSANullScript; + error = OSAGetProperty(component, + kOSAModeNull, + scriptID, + [propertyName aeDesc], + &valueID); + if (error == noErr) { + desc = [self descForScriptID:valueID component:component]; + } + } + if (error) { + _GTMDevLog(@"Unable to get valueForProperty:%@ from %@ (%d)", + property, self, error); + } + return desc; +} + +- (NSSet*)gtm_allValuesUsingSelector:(SEL)selector { + NSMutableSet *resultSet = [NSMutableSet set]; + NSAppleEventDescriptor *scriptDesc = [self gtm_appleEventDescriptor]; + NSMutableSet *scriptDescsWeveSeen = [NSMutableSet set]; + GTMFourCharCode *fcc = [GTMFourCharCode fourCharCodeWithFourCharCode:pASParent]; + Class appleScriptClass = [NSAppleScript class]; + while (scriptDesc) { + NSAppleScript *script = [scriptDesc gtm_objectValue]; + if ([script isKindOfClass:appleScriptClass]) { + NSData *data = [scriptDesc data]; + if (!data || [scriptDescsWeveSeen containsObject:data]) { + break; + } else { + [scriptDescsWeveSeen addObject:data]; + } + NSSet *newSet = [script performSelector:selector]; + [resultSet unionSet:newSet]; + scriptDesc = [script gtm_valueDescriptorForProperty:fcc]; + } else { + break; + } + } + return resultSet; +} + +- (NSSet*)gtm_scriptHandlers { + GTMAssertRunningOnMainThread(); + AEDescList names = { typeNull, NULL }; + NSArray *array = nil; + ComponentInstance component; + OSAID osaID = [self gtm_realIDAndComponent:&component]; + OSAError error = OSAGetHandlerNames(component, kOSAModeNull, osaID, &names); + if (error == noErr) { + NSAppleEventDescriptor *desc + = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&names] + autorelease]; + array = [desc gtm_objectValue]; + } + if (error != noErr) { + _GTMDevLog(@"Error getting handlers: %d", error); // COV_NF_LINE + } + return [NSSet setWithArray:array]; +} + +- (NSSet*)gtm_scriptProperties { + GTMAssertRunningOnMainThread(); + AEDescList names = { typeNull, NULL }; + NSArray *array = nil; + ComponentInstance component; + OSAID osaID = [self gtm_realIDAndComponent:&component]; + OSAError error = OSAGetPropertyNames(component, kOSAModeNull, osaID, &names); + if (error == noErr) { + NSAppleEventDescriptor *desc + = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&names] + autorelease]; + array = [desc gtm_objectValue]; + } + if (error != noErr) { + _GTMDevLog(@"Error getting properties: %d", error); // COV_NF_LINE + } + return [NSSet setWithArray:array]; +} + +- (OSAID)gtm_genericID:(OSAID)osaID forComponent:(ComponentInstance)component { + GTMAssertRunningOnMainThread(); + ComponentInstance genericComponent = [NSAppleScript _defaultScriptingComponent]; + OSAID exactID = osaID; + OSAError error = OSARealToGenericID(genericComponent, &exactID, component); + if (error != noErr) { + _GTMDevLog(@"Unable to get real id script: %@ %d", self, error); // COV_NF_LINE + exactID = kOSANullScript; // COV_NF_LINE + } + return exactID; +} + +- (NSAppleEventDescriptor*)descForScriptID:(OSAID)osaID + component:(ComponentInstance)component { + GTMAssertRunningOnMainThread(); + NSAppleEventDescriptor *desc = nil; + // If we have a script, return a typeGTMOSAID, otherwise convert it to + // it's default AEDesc using OSACoerceToDesc with typeWildCard. + long value = 0; + OSAError err = noErr; + if (osaID == 0) { + desc = [NSAppleEventDescriptor nullDescriptor]; + } else { + err = OSAGetScriptInfo(component, + osaID, + kOSAScriptBestType, + &value); + if (err == noErr) { + if (value == typeScript) { + osaID = [self gtm_genericID:osaID forComponent:component]; + desc = [NSAppleEventDescriptor descriptorWithDescriptorType:typeGTMOSAID + bytes:&osaID + length:sizeof(osaID)]; + } else { + AEDesc aeDesc; + err = OSACoerceToDesc(component, + osaID, + typeWildCard, + kOSAModeNull, + &aeDesc); + if (err == noErr) { + desc = [[[NSAppleEventDescriptor alloc] + initWithAEDescNoCopy:&aeDesc] autorelease]; + } + } + } + } + if (err != noErr) { + _GTMDevLog(@"Unable to create desc for id:%d (%d)", osaID, err); // COV_NF_LINE + } + return desc; +} + +- (OSAID)gtm_realIDAndComponent:(ComponentInstance*)component { + GTMAssertRunningOnMainThread(); + if (![self isCompiled]) { + NSDictionary *error; + if (![self compileAndReturnError:&error]) { + _GTMDevLog(@"Unable to compile script: %@ %@", self, error); + return kOSANullScript; + } + } + OSAID genericID = [self _compiledScriptID]; + ComponentInstance genericComponent = [NSAppleScript _defaultScriptingComponent]; + OSAError error = OSAGenericToRealID(genericComponent, &genericID, component); + if (error != noErr) { + _GTMDevLog(@"Unable to get real id script: %@ %d", self, error); // COV_NF_LINE + genericID = kOSANullScript; // COV_NF_LINE + } + return genericID; +} + +@end + +// Private methods for dealing with Scripts/Events and NSAppleEventDescriptors +@interface NSAppleEventDescriptor (GTMAppleEventDescriptorScriptAdditions) + +// Return an NSAppleScript for a desc of typeScript. This will create a new +// Applescript that is a copy of the script that you want. +// Returns nil on failure. +- (NSAppleScript*)gtm_scriptValue; + +// Return an NSAppleScript for a desc of typeGTMOSAID. This will not copy the +// script, but will create an NSAppleScript wrapping the script represented +// by the OSAID. +// Returns nil on failure. +- (NSAppleScript*)gtm_osaIDValue; + +// Return a NSString with [eventClass][eventID] for typeEvent 'evnt' +- (NSString*)gtm_eventValue; +@end + + +@implementation NSAppleEventDescriptor (GMAppleEventDescriptorScriptAdditions) + +- (NSAppleScript*)gtm_scriptValue { + NSDictionary *error; + NSAppleScript *script = [[[NSAppleScript alloc] _initWithData:[self data] + error:&error] autorelease]; + if (!script) { + _GTMDevLog(@"Unable to create script: %@", error); // COV_NF_LINE + } + return script; +} + +- (NSAppleScript*)gtm_osaIDValue { + _GTMDevAssert([[self data] length] == sizeof(OSAID), nil); + OSAID osaID = *(const OSAID*)[[self data] bytes]; + return [[[NSAppleScript alloc] _initWithScriptIDNoCopy:osaID] autorelease]; +} + +- (NSString*)gtm_eventValue { + struct AEEventRecordStruct { + AEEventClass eventClass; + AEEventID eventID; + }; + NSData *data = [self data]; + const struct AEEventRecordStruct *record + = (const struct AEEventRecordStruct*)[data bytes]; + NSString *eClass = [GTMFourCharCode stringWithFourCharCode:record->eventClass]; + NSString *eID = [GTMFourCharCode stringWithFourCharCode:record->eventID]; + return [eClass stringByAppendingString:eID]; +} +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+HandlerTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+HandlerTest.m new file mode 100644 index 00000000..44d0a0c6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSAppleScript+HandlerTest.m @@ -0,0 +1,506 @@ +// +// GTMNSAppleScript+HandlerTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import +#import "GTMNSAppleScript+Handler.h" +#import "GTMNSAppleEventDescriptor+Foundation.h" +#import "GTMUnitTestDevLog.h" +#import "GTMGarbageCollection.h" +#import "GTMSystemVersion.h" +#import "GTMFourCharCode.h" + +@interface GTMNSAppleScript_HandlerTest : GTMTestCase { + NSAppleScript *script_; +} +@end + +@implementation GTMNSAppleScript_HandlerTest +- (void)invokeTest { + // NOTE: These tests are disabled in GC is on. See the comment/warning in the + // GTMNSAppleScript+Handler.h for more details, but we disable them to avoid + // the tests failing (crashing) when it's Apple's bug. Please bump the system + // check as appropriate when new systems are tested. Currently broken on + // 10.5.6 and below. Radar 6126682. + SInt32 major, minor, bugfix; + [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugfix]; + if (!(GTMIsGarbageCollectionEnabled() + && major <= 10 && minor <= 5 && bugfix <= 6)) { + [super invokeTest]; + } else { + NSLog(@"--- %@ NOT run because of GC incompatibilites ---", [self name]); + } +} + +- (void)setUp { + NSBundle *bundle + = [NSBundle bundleForClass:[GTMNSAppleScript_HandlerTest class]]; + STAssertNotNil(bundle, nil); + NSString *path = [bundle pathForResource:@"GTMNSAppleEvent+HandlerTest" + ofType:@"scpt" + inDirectory:@"Scripts"]; + STAssertNotNil(path, [bundle description]); + NSDictionary *error = nil; + script_ + = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] + error:&error]; + STAssertNotNil(script_, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); +} + +- (void)tearDown { + [script_ release]; + script_ = nil; +} + +- (void)testExecuteAppleEvent { + NSString *source = @"on test()\nreturn 1\nend test"; + NSAppleScript *script + = [[[NSAppleScript alloc] initWithSource:source] autorelease]; + STAssertNotNil(script, nil); + NSDictionary *error = nil; + NSAppleEventDescriptor *desc = [script gtm_executePositionalHandler:@"test" + parameters:nil + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc gtm_objectValue], [NSNumber numberWithInt:1], nil); + + // bogus script + source = @"adf872345ba asdf asdf gr"; + script = [[[NSAppleScript alloc] initWithSource:source] autorelease]; + STAssertNotNil(script, nil); + desc = [script gtm_executePositionalHandler:@"test" + parameters:nil + error:&error]; + STAssertNil(desc, nil); + STAssertNotNil(error, @"Error should not be nil"); +} + +- (void)testHandlerNoParamsNoReturn { + NSDictionary *error = nil; + NSAppleEventDescriptor *desc = [script_ gtm_executePositionalHandler:@"test" + parameters:nil + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeNull, nil); + desc = [script_ gtm_executePositionalHandler:@"test" + parameters:[NSArray array] + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeNull, nil); + + //Applescript doesn't appear to get upset about extra params + desc = [script_ gtm_executePositionalHandler:@"test" + parameters:[NSArray arrayWithObject:@"foo"] + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeNull, nil); +} + +- (void)testHandlerNoParamsWithReturn { + NSDictionary *error = nil; + NSAppleEventDescriptor *desc + = [script_ gtm_executePositionalHandler:@"testReturnOne" + parameters:nil + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil); + STAssertEquals([desc int32Value], (SInt32)1, nil); + desc = [script_ gtm_executePositionalHandler:@"testReturnOne" + parameters:[NSArray array] + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil); + STAssertEquals([desc int32Value], (SInt32)1, nil); + + //Applescript doesn't appear to get upset about extra params + desc = [script_ gtm_executePositionalHandler:@"testReturnOne" + parameters:[NSArray arrayWithObject:@"foo"] + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil); + STAssertEquals([desc int32Value], (SInt32)1, nil); +} + +- (void)testHandlerOneParamWithReturn { + NSDictionary *error = nil; + // Note case change in executeHandler call + NSAppleEventDescriptor *desc + = [script_ gtm_executePositionalHandler:@"testreturnParam" + parameters:nil + error:&error]; + STAssertNil(desc, @"Desc should by nil %@", desc); + STAssertNotNil(error, nil); + error = nil; + + desc = [script_ gtm_executePositionalHandler:@"testReturnParam" + parameters:[NSArray array] + error:&error]; + STAssertNil(desc, @"Desc should by nil %@", desc); + STAssertNotNil(error, nil); + error = nil; + + desc = [script_ gtm_executePositionalHandler:@"testReturnParam" + parameters:[NSArray arrayWithObject:@"foo"] + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeUnicodeText, nil); + STAssertEqualObjects([desc gtm_objectValue], @"foo", nil); +} + +- (void)testHandlerTwoParamsWithReturn { + NSDictionary *error = nil; + // Note case change in executeHandler call + // Test case and empty params + NSAppleEventDescriptor *desc + = [script_ gtm_executePositionalHandler:@"testADDPArams" + parameters:nil + error:&error]; + STAssertNil(desc, @"Desc should by nil %@", desc); + STAssertNotNil(error, nil); + + // Test empty params + error = nil; + desc = [script_ gtm_executePositionalHandler:@"testAddParams" + parameters:[NSArray array] + error:&error]; + STAssertNil(desc, @"Desc should by nil %@", desc); + STAssertNotNil(error, nil); + + error = nil; + NSArray *args = [NSArray arrayWithObjects: + [NSNumber numberWithInt:1], + [NSNumber numberWithInt:2], + nil]; + desc = [script_ gtm_executePositionalHandler:@"testAddParams" + parameters:args + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil); + STAssertEquals([desc int32Value], (SInt32)3, nil); + + // Test bad params + error = nil; + args = [NSArray arrayWithObjects: + @"foo", + @"bar", + nil]; + desc = [script_ gtm_executePositionalHandler:@"testAddParams" + parameters:args + error:&error]; + STAssertNil(desc, @"Desc should by nil %@", desc); + STAssertNotNil(error, nil); + + // Test too many params. Currently Applescript allows this so it should pass + error = nil; + args = [NSArray arrayWithObjects: + [NSNumber numberWithInt:1], + [NSNumber numberWithInt:2], + [NSNumber numberWithInt:3], + nil]; + desc = [script_ gtm_executePositionalHandler:@"testAddParams" + parameters:args + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil); + STAssertEquals([desc int32Value], (SInt32)3, nil);} + +- (void)testLabeledHandler { + NSDictionary *error = nil; + AEKeyword labels[] = { keyDirectObject, + keyASPrepositionOnto, + keyASPrepositionGiven }; + id params[3]; + params[0] = [NSNumber numberWithInt:1]; + params[1] = [NSNumber numberWithInt:3]; + params[2] = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:4] + forKey:@"othervalue"]; + + NSAppleEventDescriptor *desc + = [script_ gtm_executeLabeledHandler:@"testAdd" + labels:labels + parameters:params + count:sizeof(params) / sizeof(id) + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil); + STAssertEquals([desc int32Value], (SInt32)8, nil); + + // Test too many params. Currently Applescript allows this so it should pass + AEKeyword labels2[] = { keyDirectObject, + keyASPrepositionOnto, + keyASPrepositionBetween, + keyASPrepositionGiven }; + id params2[4]; + params2[0] = [NSNumber numberWithInt:1]; + params2[1] = [NSNumber numberWithInt:3]; + params2[2] = [NSNumber numberWithInt:5]; + params2[3] = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:4] + forKey:@"othervalue"]; + + error = nil; + desc = [script_ gtm_executeLabeledHandler:@"testAdd" + labels:labels2 + parameters:params2 + count:sizeof(params2) / sizeof(id) + error:&error]; + STAssertNotNil(desc, [error description]); + STAssertNil(error, @"Error should be nil. Error = %@", [error description]); + STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil); + STAssertEquals([desc int32Value], (SInt32)8, nil);} + +- (void)testHandlers { + NSSet *handlers = [script_ gtm_handlers]; + NSSet *expected = [NSSet setWithObjects: + @"aevtpdoc", + @"test", + @"testreturnone", + @"testreturnparam", + @"testaddparams", + @"testadd", + @"testgetscript", + nil]; + if ([GTMSystemVersion isBuildEqualTo:kGTMSystemBuild10_6_0_WWDC]) { + // Workaround for bug in SnowLeopard + // rdar://66688601 OSAGetHandlersNames returns names in camelcase instead + // of smallcaps. + handlers = [handlers valueForKey:@"lowercaseString"]; + } + STAssertEqualObjects(handlers, expected, @"Unexpected handlers?"); +} + +- (void)testInheritedHandlers { + NSDictionary *error = nil; + NSAppleEventDescriptor *desc + = [script_ gtm_executePositionalHandler:@"testGetScript" + parameters:nil + error:&error]; + STAssertNil(error, nil); + STAssertNotNil(desc, nil); + NSAppleScript *script = [desc gtm_objectValue]; + STAssertTrue([script isKindOfClass:[NSAppleScript class]], nil); + error = nil; + desc = [script gtm_executePositionalHandler:@"parentTestScriptFunc" + parameters:nil error:&error]; + STAssertNil(error, nil); + STAssertNotNil(desc, nil); + NSString *value = [desc gtm_objectValue]; + STAssertEqualObjects(value, @"parent", nil); +} + +- (void)testProperties { + NSDictionary *error = nil; + NSAppleEventDescriptor *desc + = [script_ gtm_executePositionalHandler:@"testGetScript" + parameters:nil + error:&error]; + STAssertNil(error, nil); + STAssertNotNil(desc, nil); + NSAppleScript *script = [desc gtm_objectValue]; + STAssertTrue([script isKindOfClass:[NSAppleScript class]], nil); + + NSSet *properties = [script gtm_properties]; + NSSet *expected + = [NSSet setWithObjects: + @"testscriptproperty", + @"parenttestscriptproperty", + @"foo", + @"testscript", + @"parenttestscript", + @"asdscriptuniqueidentifier", + [GTMFourCharCode fourCharCodeWithFourCharCode:pVersion], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASPrintDepth], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASTopLevelScript], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASResult], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASMinutes], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASDays], + // No constant for linefeed in the 10.5 sdk + // Radar 6132775 Need a constant for the Applescript Property 'lnfd' + [GTMFourCharCode fourCharCodeWithFourCharCode:'lnfd'], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASPi], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASReturn], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASSpace], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASPrintLength], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASQuote], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASWeeks], + [GTMFourCharCode fourCharCodeWithFourCharCode:pTextItemDelimiters], + // Applescript properties should be pASSeconds, but + // on 10.5.4/10.5.5 it is actually using cSeconds. + // Radar 6132696 Applescript root level property is cSeconds + // instead of pASSeconds + [GTMFourCharCode fourCharCodeWithFourCharCode:cSeconds], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASHours], + [GTMFourCharCode fourCharCodeWithFourCharCode:pASTab], + nil]; + if ([GTMSystemVersion isBuildEqualTo:kGTMSystemBuild10_6_0_WWDC]) { + // Workaround for bug in SnowLeopard + // rdar://6289077 OSAGetPropertyNames returns names in camelcase instead + // of lowercase. + properties = [properties valueForKey:@"lowercaseString"]; + } + STAssertEqualObjects(properties, expected, @"Unexpected properties?"); + id value = [script gtm_valueForProperty:@"testScriptProperty"]; + STAssertEqualObjects(value, [NSNumber numberWithInt:5], @"bad property?"); + BOOL goodSet = [script gtm_setValue:@"bar" + forProperty:@"foo" + addingDefinition:NO]; + STAssertTrue(goodSet, @"Couldn't set property"); + + // Test local set + value = [script gtm_valueForProperty:@"foo"]; + STAssertEqualObjects(value, @"bar", @"bad property?"); + + // Test inherited set + value = [script_ gtm_valueForProperty:@"foo"]; + STAssertEqualObjects(value, @"bar", @"bad property?"); + + [GTMUnitTestDevLog expectPattern:@"Unable to setValue:bar forProperty:" + "\\(null\\) from \\(-50\\)"]; + goodSet = [script gtm_setValue:@"bar" + forProperty:nil + addingDefinition:NO]; + STAssertFalse(goodSet, @"Set property?"); + + [GTMUnitTestDevLog expectPattern:@"Unable to setValue:bar forProperty:3" + " from \\(-50\\)"]; + goodSet = [script gtm_setValue:@"bar" + forProperty:[NSNumber numberWithInt:3] + addingDefinition:YES]; + STAssertFalse(goodSet, @"Set property?"); + + + [GTMUnitTestDevLog expectPattern:@"Unable to get valueForProperty:gargle " + "from \\(-1753\\)"]; + value = [script gtm_valueForProperty:@"gargle"]; + STAssertNil(value, @"Property named gargle?"); + + goodSet = [script_ gtm_setValue:@"wow" + forProperty:@"addedProperty" + addingDefinition:YES]; + STAssertTrue(goodSet, @"Unable to addProperty"); + + value = [script gtm_valueForProperty:@"addedProperty"]; + STAssertNotNil(value, nil); + STAssertEqualObjects(value, @"wow", nil); + + // http://www.straightdope.com/classics/a3_341.html + NSNumber *newPI = [NSNumber numberWithInt:3]; + goodSet = [script gtm_setValue:newPI + forPropertyEnum:pASPi + addingDefinition:NO]; + STAssertTrue(goodSet, @"Unable to set property"); + value = [script_ gtm_valueForPropertyEnum:pASPi]; + STAssertNotNil(value, nil); + STAssertEqualObjects(value, newPI, @"bad property"); +} + +- (void)testFailures { + NSDictionary *error = nil; + NSAppleEventDescriptor *desc + = [script_ gtm_executePositionalHandler:@"noSuchTest" + parameters:nil + error:&error]; + STAssertNil(desc, nil); + STAssertNotNil(error, nil); + + // Test with empty handler name + error = nil; + desc = [script_ gtm_executePositionalHandler:@"" + parameters:[NSArray array] + error:&error]; + STAssertNil(desc, nil); + STAssertNotNil(error, nil); + + // Test with nil handler + error = nil; + desc = [script_ gtm_executePositionalHandler:nil + parameters:[NSArray array] + error:&error]; + STAssertNil(desc, nil); + STAssertNotNil(error, nil); + + // Test with nil handler and nil error + desc = [script_ gtm_executePositionalHandler:nil + parameters:nil + error:nil]; + STAssertNil(desc, nil); + + // Test with a bad script + NSAppleScript *script + = [[[NSAppleScript alloc] initWithSource:@"david hasselhoff"] autorelease]; + [GTMUnitTestDevLog expectPattern:@"Unable to compile script: .*"]; + [GTMUnitTestDevLog expectString:@"Unable to coerce script -2147450879"]; + NSSet *handlers = [script gtm_handlers]; + STAssertEquals([handlers count], (NSUInteger)0, @"Should have no handlers"); + [GTMUnitTestDevLog expectPattern:@"Unable to compile script: .*"]; + [GTMUnitTestDevLog expectString:@"Unable to coerce script -2147450879"]; + NSSet *properties = [script gtm_properties]; + STAssertEquals([properties count], + (NSUInteger)0, + @"Should have no properties"); + [GTMUnitTestDevLog expectPattern:@"Unable to compile script: .*"]; + [GTMUnitTestDevLog expectString:@"Unable to get script info about " + @"open handler -2147450879"]; + STAssertFalse([script gtm_hasOpenDocumentsHandler], + @"Has an opendoc handler?"); +} + +- (void)testScriptDescriptors { + NSAppleEventDescriptor *desc = [script_ gtm_appleEventDescriptor]; + STAssertNotNil(desc, @"Couldn't make a script desc"); + NSAppleScript *script = [desc gtm_objectValue]; + STAssertNotNil(script, @"Couldn't get a script back"); + NSSet *handlers = [script gtm_handlers]; + STAssertNotNil(handlers, @"Couldn't get handlers"); +} + +- (void)testOpenHandler { + STAssertFalse([script_ gtm_hasOpenDocumentsHandler], nil); + id script = [script_ gtm_valueForProperty:@"testscript"]; + STAssertNotNil(script, nil); + STAssertTrue([script gtm_hasOpenDocumentsHandler], nil); +} + + +@protocol ScriptInterface +- (id)test; +- (id)testReturnParam:(id)param; +- (id)testAddParams:(id)param1 :(id)param2; +@end + +- (void)testForwarding { + id foo = (id)script_; + [foo test]; + NSNumber *val = [foo testReturnParam:[NSNumber numberWithInt:2]]; + STAssertEquals([val intValue], 2, @"should be 2"); + val = [foo testAddParams:[NSNumber numberWithInt:2] + :[NSNumber numberWithInt:3]]; + STAssertEquals([val intValue], 5, @"should be 5"); +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+Merge.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+Merge.h new file mode 100644 index 00000000..8140f804 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+Merge.h @@ -0,0 +1,47 @@ +// +// GTMNSArray+Merge.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +// Extension to NSArray to allow merging of arrays. +// +@interface NSArray (GTMNSArrayMergingAdditions) + +// Merge our array with |newArray| by sorting each array then merging the +// two arrays. If |merger| is provided then call that method on any old +// items that compare as equal to a new item, passing the new item as +// the only argument. If |merger| is not provided, then insert new items +// in front of matching old items. If neither array has any items then +// nil is returned. +// +// The signature of the |merger| is: +// - (id)merge:(id)newItem; +// +// Returns a new, sorted array. +- (NSArray *)gtm_mergeArray:(NSArray *)newArray + mergeSelector:(SEL)merger; + +// Same as above, only |comparer| is used to sort/compare the objects, just like +// -[NSArray sortedArrayUsingSelector]. If |comparer| is nil, nil is returned. +- (NSArray *)gtm_mergeArray:(NSArray *)newArray + compareSelector:(SEL)comparer + mergeSelector:(SEL)merger; + +@end + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+Merge.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+Merge.m new file mode 100644 index 00000000..5bf07c8f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+Merge.m @@ -0,0 +1,111 @@ +// +// GTMNSArray+Merge.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. +// + +#import "GTMNSArray+Merge.h" + +#import "GTMDefines.h" + +#if GTM_IPHONE_SDK +#import +#else // GTM_IPHONE_SDK +#import +#endif // GTM_IPHONE_SDK + +@implementation NSArray (GTMNSArrayMergingAdditions) + +- (NSArray *)gtm_mergeArray:(NSArray *)newArray + mergeSelector:(SEL)merger { + return [self gtm_mergeArray:newArray + compareSelector:@selector(compare:) + mergeSelector:merger]; +} + +- (NSArray *)gtm_mergeArray:(NSArray *)newArray + compareSelector:(SEL)comparer + mergeSelector:(SEL)merger { + // must have a compare selector + if (!comparer) return nil; + + // Sort and merge the contents of |self| with |newArray|. + NSArray *sortedMergedArray = nil; + if ([self count] && [newArray count]) { + NSMutableArray *mergingArray = [NSMutableArray arrayWithArray:self]; + [mergingArray sortUsingSelector:comparer]; + NSArray *sortedNewArray + = [newArray sortedArrayUsingSelector:comparer]; + + NSUInteger oldIndex = 0; + NSUInteger oldCount = [mergingArray count]; + id oldItem = (oldIndex < oldCount) + ? [mergingArray objectAtIndex:0] + : nil; + + id newItem = nil; + GTM_FOREACH_OBJECT(newItem, sortedNewArray) { + BOOL stillLooking = YES; + while (oldIndex < oldCount && stillLooking) { + // We must take care here, since Intel leaves junk in high bytes of + // return register for predicates that return BOOL. + // For details see: + // http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/chapter_5_section_23.html + // and + // http://www.red-sweater.com/blog/320/abusing-objective-c-with-class#comment-83187 + NSComparisonResult result + = ((NSComparisonResult (*)(id, SEL, id))objc_msgSend)(newItem, comparer, oldItem); + if (result == NSOrderedSame && merger) { + // It's a match! + id repItem = [oldItem performSelector:merger + withObject:newItem]; + [mergingArray replaceObjectAtIndex:oldIndex + withObject:repItem]; + ++oldIndex; + oldItem = (oldIndex < oldCount) + ? [mergingArray objectAtIndex:oldIndex] + : nil; + stillLooking = NO; + } else if (result == NSOrderedAscending + || (result == NSOrderedSame && !merger)) { + // This is either a new item and belongs right here, or it's + // a match to an existing item but we're not merging. + [mergingArray insertObject:newItem + atIndex:oldIndex]; + ++oldIndex; + ++oldCount; + stillLooking = NO; + } else { + ++oldIndex; + oldItem = (oldIndex < oldCount) + ? [mergingArray objectAtIndex:oldIndex] + : nil; + } + } + if (stillLooking) { + // Once we get here, the rest of the new items get appended. + [mergingArray addObject:newItem]; + } + } + sortedMergedArray = mergingArray; + } else if ([self count]) { + sortedMergedArray = [self sortedArrayUsingSelector:comparer]; + } else if ([newArray count]) { + sortedMergedArray = [newArray sortedArrayUsingSelector:comparer]; + } + return sortedMergedArray; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+MergeTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+MergeTest.m new file mode 100644 index 00000000..0d8eb81f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSArray+MergeTest.m @@ -0,0 +1,219 @@ +// +// GTMNSArray+MergeTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSArray+Merge.h" + +@interface GTMNSArray_MergeTest : GTMTestCase +@end + + +@interface NSString (GTMStringMergingTestAdditions) + +- (NSString *)mergeString:(NSString *)stringB; + +@end + + +@implementation GTMNSArray_MergeTest + +- (void)testMergingTwoEmptyArrays { + NSArray *emptyArrayA = [NSArray array]; + NSArray *emptyArrayB = [NSArray array]; + NSArray *mergedArray = [emptyArrayA gtm_mergeArray:emptyArrayB + mergeSelector:nil]; + STAssertNil(mergedArray, + @"merge of two empty arrays with no merger should render nil"); +} + +- (void)testMergingTwoEmptyArraysWithMerger { + NSArray *emptyArrayA = [NSArray array]; + NSArray *emptyArrayB = [NSArray array]; + NSArray *mergedArray + = [emptyArrayA gtm_mergeArray:emptyArrayB + mergeSelector:@selector(mergeString:)]; + STAssertNil(mergedArray, + @"merge of two empty arrays with merger should render nil"); +} + +- (void)testMergingEmptyWithNilArray { + NSArray *emptyArrayA = [NSArray array]; + NSArray *nilArrayB = nil; + NSArray *mergedArray = [emptyArrayA gtm_mergeArray:nilArrayB + mergeSelector:nil]; + STAssertNil(mergedArray, + @"merge of empty with nil array with no merger should render nil"); +} + +- (void)testMergingEmptyWithNilArrayWithMerger { + NSArray *emptyArrayA = [NSArray array]; + NSArray *nilArrayB = nil; + NSArray *mergedArray + = [emptyArrayA gtm_mergeArray:nilArrayB + mergeSelector:@selector(mergeObject:)]; + STAssertNil(mergedArray, + @"merge of empty with nil array with merger should render nil"); +} + +- (void)testMergingTwoOneItemArraysThatDontMatch { + NSArray *arrayA = [NSArray arrayWithObject:@"abc.def"]; + NSArray *arrayB = [NSArray arrayWithObject:@"abc.ghi"]; + NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB + mergeSelector:nil]; + STAssertNotNil(mergedArray, + @"merge of two non empty arrays with no merger should render " + @"an array"); + STAssertEquals([mergedArray count], (NSUInteger)2, + @"merged array should have two items"); + STAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def", nil); + STAssertEqualObjects([mergedArray objectAtIndex:1], @"abc.ghi", nil); +} + +- (void)testMergingTwoOneItemArraysThatDontMatchWithMerger { + NSArray *arrayA = [NSArray arrayWithObject:@"abc.def"]; + NSArray *arrayB = [NSArray arrayWithObject:@"abc.ghi"]; + NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB + mergeSelector:@selector(mergeString:)]; + STAssertNotNil(mergedArray, + @"merge of two non empty arrays with merger should render " + @"an array"); + STAssertEquals([mergedArray count], (NSUInteger)2, + @"merged array should have two items"); + STAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def", nil); + STAssertEqualObjects([mergedArray objectAtIndex:1], @"abc.ghi", nil); +} + +- (void)testMergingTwoOneItemArraysThatMatch { + NSArray *arrayA = [NSArray arrayWithObject:@"abc.def"]; + NSArray *arrayB = [NSArray arrayWithObject:@"abc.def"]; + NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB + mergeSelector:nil]; + STAssertNotNil(mergedArray, + @"merge of two matching arrays with no merger should render " + @"an array"); + STAssertEquals([mergedArray count], (NSUInteger)2, + @"merged array with no merger should have two items"); + STAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def", nil); + STAssertEqualObjects([mergedArray objectAtIndex:1], @"abc.def", nil); +} + +- (void)testMergingTwoOneItemArraysThatMatchWithMerger { + NSArray *arrayA = [NSArray arrayWithObject:@"abc.def"]; + NSArray *arrayB = [NSArray arrayWithObject:@"abc.def"]; + NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB + mergeSelector:@selector(mergeString:)]; + STAssertNotNil(mergedArray, + @"merge of two matching arrays with merger should render " + @"an array"); + STAssertEquals([mergedArray count], (NSUInteger)1, + @"merged array with merger should have one items"); + STAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def", nil); +} + +- (void)testMergingMultipleItemArray { + NSArray *arrayA = [NSArray arrayWithObjects: + @"Kansas", + @"Arkansas", + @"Wisconson", + @"South Carolina", + nil]; + NSArray *arrayB = [NSArray arrayWithObjects: + @"South Carolina", + @"Quebec", + @"British Columbia", + @"Arkansas", + @"South Hamptom", + nil]; + NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB + mergeSelector:nil]; + STAssertNotNil(mergedArray, + @"merge of two non empty arrays with no merger should render " + @"an array"); + STAssertEquals([mergedArray count], (NSUInteger)9, + @"merged array should have 9 items"); +} + +- (void)testMergingMultipleItemArrayWithMerger { + NSArray *arrayA = [NSArray arrayWithObjects: + @"Kansas", + @"Arkansas", + @"Wisconson", + @"South Carolina", + nil]; + NSArray *arrayB = [NSArray arrayWithObjects: + @"South Carolina", + @"Quebec", + @"British Columbia", + @"Arkansas", + @"South Hamptom", + nil]; + NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB + mergeSelector:@selector(mergeString:)]; + STAssertNotNil(mergedArray, + @"merge of two non empty arrays with merger should render " + @"an array"); + STAssertEquals([mergedArray count], (NSUInteger)7, + @"merged array should have 7 items"); +} + +- (void)testMergeWithEmptyArrays { + NSArray *arrayA = [NSArray arrayWithObjects:@"xyz", @"abc", @"mno", nil]; + NSArray *arrayB = [NSArray array]; + NSArray *expected = [NSArray arrayWithObjects:@"abc", @"mno", @"xyz", nil]; + STAssertNotNil(arrayA, nil); + STAssertNotNil(arrayB, nil); + STAssertNotNil(expected, nil); + NSArray *mergedArray; + + // no merger + mergedArray = [arrayA gtm_mergeArray:arrayB + mergeSelector:nil]; + STAssertNotNil(mergedArray, nil); + STAssertEqualObjects(mergedArray, expected, nil); + + // w/ merger + mergedArray = [arrayA gtm_mergeArray:arrayB + mergeSelector:@selector(mergeString:)]; + STAssertNotNil(mergedArray, nil); + STAssertEqualObjects(mergedArray, expected, nil); + + // no merger and array args reversed + mergedArray = [arrayB gtm_mergeArray:arrayA + mergeSelector:nil]; + STAssertNotNil(mergedArray, nil); + STAssertEqualObjects(mergedArray, expected, nil); + + // w/ merger and array args reversed + mergedArray = [arrayB gtm_mergeArray:arrayA + mergeSelector:@selector(mergeString:)]; + STAssertNotNil(mergedArray, nil); + STAssertEqualObjects(mergedArray, expected, nil); + +} + +@end + + +@implementation NSString (GTMStringMergingTestAdditions) + +- (NSString *)mergeString:(NSString *)stringB { + return stringB; +} + +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlib.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlib.h new file mode 100644 index 00000000..df31d24c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlib.h @@ -0,0 +1,84 @@ +// +// GTMNSData+zlib.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +/// Helpers for dealing w/ zlib inflate/deflate calls. +@interface NSData (GTMZLibAdditions) + +/// Return an autoreleased NSData w/ the result of gzipping the bytes. +// +// Uses the default compression level. ++ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes + length:(NSUInteger)length; + +/// Return an autoreleased NSData w/ the result of gzipping the payload of |data|. +// +// Uses the default compression level. ++ (NSData *)gtm_dataByGzippingData:(NSData *)data; + +/// Return an autoreleased NSData w/ the result of gzipping the bytes using |level| compression level. +// +// |level| can be 1-9, any other values will be clipped to that range. ++ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes + length:(NSUInteger)length + compressionLevel:(int)level; + +/// Return an autoreleased NSData w/ the result of gzipping the payload of |data| using |level| compression level. ++ (NSData *)gtm_dataByGzippingData:(NSData *)data + compressionLevel:(int)level; + +// NOTE: deflate is *NOT* gzip. deflate is a "zlib" stream. pick which one +// you really want to create. (the inflate api will handle either) + +/// Return an autoreleased NSData w/ the result of deflating the bytes. +// +// Uses the default compression level. ++ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes + length:(NSUInteger)length; + +/// Return an autoreleased NSData w/ the result of deflating the payload of |data|. +// +// Uses the default compression level. ++ (NSData *)gtm_dataByDeflatingData:(NSData *)data; + +/// Return an autoreleased NSData w/ the result of deflating the bytes using |level| compression level. +// +// |level| can be 1-9, any other values will be clipped to that range. ++ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes + length:(NSUInteger)length + compressionLevel:(int)level; + +/// Return an autoreleased NSData w/ the result of deflating the payload of |data| using |level| compression level. ++ (NSData *)gtm_dataByDeflatingData:(NSData *)data + compressionLevel:(int)level; + + +/// Return an autoreleased NSData w/ the result of decompressing the bytes. +// +// The bytes to decompress can be zlib or gzip payloads. ++ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes + length:(NSUInteger)length; + +/// Return an autoreleased NSData w/ the result of decompressing the payload of |data|. +// +// The data to decompress can be zlib or gzip payloads. ++ (NSData *)gtm_dataByInflatingData:(NSData *)data; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlib.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlib.m new file mode 100644 index 00000000..8ba1ddca --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlib.m @@ -0,0 +1,267 @@ +// +// GTMNSData+zlib.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSData+zlib.h" +#import +#import "GTMDefines.h" + +#define kChunkSize 1024 + +@interface NSData (GTMZlibAdditionsPrivate) ++ (NSData *)gtm_dataByCompressingBytes:(const void *)bytes + length:(NSUInteger)length + compressionLevel:(int)level + useGzip:(BOOL)useGzip; +@end + +@implementation NSData (GTMZlibAdditionsPrivate) ++ (NSData *)gtm_dataByCompressingBytes:(const void *)bytes + length:(NSUInteger)length + compressionLevel:(int)level + useGzip:(BOOL)useGzip { + if (!bytes || !length) { + return nil; + } + + // TODO: support 64bit inputs + // avail_in is a uInt, so if length > UINT_MAX we actually need to loop + // feeding the data until we've gotten it all in. not supporting this + // at the moment. + _GTMDevAssert(length <= UINT_MAX, @"Currently don't support >32bit lengths"); + + if (level == Z_DEFAULT_COMPRESSION) { + // the default value is actually outside the range, so we have to let it + // through specifically. + } else if (level < Z_BEST_SPEED) { + level = Z_BEST_SPEED; + } else if (level > Z_BEST_COMPRESSION) { + level = Z_BEST_COMPRESSION; + } + + z_stream strm; + bzero(&strm, sizeof(z_stream)); + + int windowBits = 15; // the default + int memLevel = 8; // the default + if (useGzip) { + windowBits += 16; // enable gzip header instead of zlib header + } + int retCode; + if ((retCode = deflateInit2(&strm, level, Z_DEFLATED, windowBits, + memLevel, Z_DEFAULT_STRATEGY)) != Z_OK) { + // COV_NF_START - no real way to force this in a unittest (we guard all args) + _GTMDevLog(@"Failed to init for deflate w/ level %d, error %d", + level, retCode); + return nil; + // COV_NF_END + } + + // hint the size at 1/4 the input size + NSMutableData *result = [NSMutableData dataWithCapacity:(length/4)]; + unsigned char output[kChunkSize]; + + // setup the input + strm.avail_in = (unsigned int)length; + strm.next_in = (unsigned char*)bytes; + + // loop to collect the data + do { + // update what we're passing in + strm.avail_out = kChunkSize; + strm.next_out = output; + retCode = deflate(&strm, Z_FINISH); + if ((retCode != Z_OK) && (retCode != Z_STREAM_END)) { + // COV_NF_START - no real way to force this in a unittest + // (in inflate, we can feed bogus/truncated data to test, but an error + // here would be some internal issue w/in zlib, and there isn't any real + // way to test it) + _GTMDevLog(@"Error trying to deflate some of the payload, error %d", + retCode); + deflateEnd(&strm); + return nil; + // COV_NF_END + } + // collect what we got + unsigned gotBack = kChunkSize - strm.avail_out; + if (gotBack > 0) { + [result appendBytes:output length:gotBack]; + } + + } while (retCode == Z_OK); + + // if the loop exits, we used all input and the stream ended + _GTMDevAssert(strm.avail_in == 0, + @"thought we finished deflate w/o using all input, %u bytes left", + strm.avail_in); + _GTMDevAssert(retCode == Z_STREAM_END, + @"thought we finished deflate w/o getting a result of stream end, code %d", + retCode); + + // clean up + deflateEnd(&strm); + + return result; +} // gtm_dataByCompressingBytes:length:compressionLevel:useGzip: + + +@end + + +@implementation NSData (GTMZLibAdditions) + ++ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes + length:(NSUInteger)length { + return [self gtm_dataByCompressingBytes:bytes + length:length + compressionLevel:Z_DEFAULT_COMPRESSION + useGzip:YES]; +} // gtm_dataByGzippingBytes:length: + ++ (NSData *)gtm_dataByGzippingData:(NSData *)data { + return [self gtm_dataByCompressingBytes:[data bytes] + length:[data length] + compressionLevel:Z_DEFAULT_COMPRESSION + useGzip:YES]; +} // gtm_dataByGzippingData: + ++ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes + length:(NSUInteger)length + compressionLevel:(int)level { + return [self gtm_dataByCompressingBytes:bytes + length:length + compressionLevel:level + useGzip:YES]; +} // gtm_dataByGzippingBytes:length:level: + ++ (NSData *)gtm_dataByGzippingData:(NSData *)data + compressionLevel:(int)level { + return [self gtm_dataByCompressingBytes:[data bytes] + length:[data length] + compressionLevel:level + useGzip:YES]; +} // gtm_dataByGzippingData:level: + ++ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes + length:(NSUInteger)length { + return [self gtm_dataByCompressingBytes:bytes + length:length + compressionLevel:Z_DEFAULT_COMPRESSION + useGzip:NO]; +} // gtm_dataByDeflatingBytes:length: + ++ (NSData *)gtm_dataByDeflatingData:(NSData *)data { + return [self gtm_dataByCompressingBytes:[data bytes] + length:[data length] + compressionLevel:Z_DEFAULT_COMPRESSION + useGzip:NO]; +} // gtm_dataByDeflatingData: + ++ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes + length:(NSUInteger)length + compressionLevel:(int)level { + return [self gtm_dataByCompressingBytes:bytes + length:length + compressionLevel:level + useGzip:NO]; +} // gtm_dataByDeflatingBytes:length:level: + ++ (NSData *)gtm_dataByDeflatingData:(NSData *)data + compressionLevel:(int)level { + return [self gtm_dataByCompressingBytes:[data bytes] + length:[data length] + compressionLevel:level + useGzip:NO]; +} // gtm_dataByDeflatingData:level: + ++ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes + length:(NSUInteger)length { + if (!bytes || !length) { + return nil; + } + + // TODO: support 64bit inputs + // avail_in is a uInt, so if length > UINT_MAX we actually need to loop + // feeding the data until we've gotten it all in. not supporting this + // at the moment. + _GTMDevAssert(length <= UINT_MAX, @"Currently don't support >32bit lengths"); + + z_stream strm; + bzero(&strm, sizeof(z_stream)); + + // setup the input + strm.avail_in = (unsigned int)length; + strm.next_in = (unsigned char*)bytes; + + int windowBits = 15; // 15 to enable any window size + windowBits += 32; // and +32 to enable zlib or gzip header detection. + int retCode; + if ((retCode = inflateInit2(&strm, windowBits)) != Z_OK) { + // COV_NF_START - no real way to force this in a unittest (we guard all args) + _GTMDevLog(@"Failed to init for inflate, error %d", retCode); + return nil; + // COV_NF_END + } + + // hint the size at 4x the input size + NSMutableData *result = [NSMutableData dataWithCapacity:(length*4)]; + unsigned char output[kChunkSize]; + + // loop to collect the data + do { + // update what we're passing in + strm.avail_out = kChunkSize; + strm.next_out = output; + retCode = inflate(&strm, Z_NO_FLUSH); + if ((retCode != Z_OK) && (retCode != Z_STREAM_END)) { + _GTMDevLog(@"Error trying to inflate some of the payload, error %d", + retCode); + inflateEnd(&strm); + return nil; + } + // collect what we got + unsigned gotBack = kChunkSize - strm.avail_out; + if (gotBack > 0) { + [result appendBytes:output length:gotBack]; + } + + } while (retCode == Z_OK); + + // make sure there wasn't more data tacked onto the end of a valid compressed + // stream. + if (strm.avail_in != 0) { + _GTMDevLog(@"thought we finished inflate w/o using all input, %u bytes left", + strm.avail_in); + result = nil; + } + // the only way out of the loop was by hitting the end of the stream + _GTMDevAssert(retCode == Z_STREAM_END, + @"thought we finished inflate w/o getting a result of stream end, code %d", + retCode); + + // clean up + inflateEnd(&strm); + + return result; +} // gtm_dataByInflatingBytes:length: + ++ (NSData *)gtm_dataByInflatingData:(NSData *)data { + return [self gtm_dataByInflatingBytes:[data bytes] + length:[data length]]; +} // gtm_dataByInflatingData: + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlibTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlibTest.m new file mode 100644 index 00000000..0d868864 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSData+zlibTest.m @@ -0,0 +1,360 @@ +// +// GTMNSData+zlibTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMUnitTestDevLog.h" +#import "GTMNSData+zlib.h" +#import // for randiom/srandomdev +#import + +@interface GTMNSData_zlibTest : GTMTestCase +@end + +// NOTE: we don't need to test the actually compressor/inflation (we're using +// zlib, it works), we just need to test our wrapper. So we can use canned +// data, etc. (and yes, when using random data, things once failed because +// we generated a random block of data that was valid compressed data?!) + +static unsigned char randomDataLarge[] = { + // openssl rand -rand /dev/random 512 | xxd -i + 0xe1, 0xa6, 0xe2, 0xa2, 0x0b, 0xf7, 0x8d, 0x6b, 0x31, 0xfe, 0xaa, 0x64, + 0x50, 0xbe, 0x52, 0x7e, 0x83, 0x74, 0x00, 0x8f, 0x62, 0x96, 0xc7, 0xe9, + 0x20, 0x59, 0x78, 0xc6, 0xea, 0x10, 0xd5, 0xdb, 0x3f, 0x6b, 0x13, 0xd9, + 0x44, 0x18, 0x24, 0x17, 0x63, 0xc8, 0x74, 0xa5, 0x37, 0x6c, 0x9c, 0x00, + 0xe5, 0xcf, 0x0a, 0xdf, 0xb9, 0x66, 0xb1, 0xbd, 0x04, 0x8f, 0x55, 0x9e, + 0xb0, 0x24, 0x4e, 0xf0, 0xc4, 0x69, 0x2c, 0x1f, 0x63, 0x9f, 0x41, 0xa8, + 0x89, 0x9b, 0x98, 0x00, 0xb6, 0x78, 0xf7, 0xe4, 0x4c, 0x72, 0x14, 0x84, + 0xaa, 0x3d, 0xc1, 0x42, 0x9f, 0x12, 0x85, 0xdd, 0x16, 0x8b, 0x8f, 0x67, + 0xe0, 0x26, 0x5b, 0x5e, 0xaa, 0xe7, 0xd3, 0x67, 0xfe, 0x21, 0x77, 0xa6, + 0x52, 0xde, 0x33, 0x8b, 0x96, 0x49, 0x6a, 0xd6, 0x58, 0x58, 0x36, 0x00, + 0x23, 0xd2, 0x45, 0x13, 0x9f, 0xd9, 0xc7, 0x2d, 0x55, 0x12, 0xb4, 0xfe, + 0x53, 0x27, 0x1f, 0x14, 0x71, 0x9b, 0x7e, 0xcc, 0x5e, 0x8c, 0x59, 0xef, + 0x80, 0xac, 0x89, 0xf4, 0x45, 0x8d, 0x98, 0x6d, 0x97, 0xfd, 0x53, 0x5f, + 0x19, 0xd6, 0x11, 0xf7, 0xcb, 0x5d, 0xca, 0xab, 0xe1, 0x01, 0xf1, 0xe9, + 0x1f, 0x1f, 0xf3, 0x53, 0x76, 0xa2, 0x59, 0x8e, 0xb3, 0x91, 0xff, 0xe8, + 0x1b, 0xc0, 0xc0, 0xda, 0xdd, 0x93, 0xb5, 0x9d, 0x62, 0x13, 0xb8, 0x07, + 0xf2, 0xf5, 0xb9, 0x4b, 0xe1, 0x09, 0xed, 0xdb, 0xe6, 0xd9, 0x2d, 0xc4, + 0x0d, 0xb6, 0xbd, 0xfc, 0xdb, 0x5c, 0xcc, 0xf6, 0x53, 0x4e, 0x01, 0xa4, + 0x03, 0x95, 0x4a, 0xa4, 0xaa, 0x4f, 0x45, 0xaf, 0xbf, 0xf1, 0x7e, 0x60, + 0x1d, 0x86, 0x93, 0x65, 0x7b, 0x24, 0x0c, 0x09, 0xe0, 0xd1, 0xd8, 0x60, + 0xd9, 0xd9, 0x55, 0x2a, 0xec, 0xd5, 0xdc, 0xd0, 0xc6, 0x5e, 0x2c, 0x22, + 0xf5, 0x19, 0x0b, 0xc3, 0xa1, 0x38, 0x11, 0x67, 0x6f, 0x6c, 0x0e, 0x34, + 0x44, 0x83, 0xee, 0xd3, 0xf2, 0x4b, 0x7b, 0x03, 0x68, 0xfe, 0xc5, 0x76, + 0xb2, 0x2e, 0x26, 0xeb, 0x1f, 0x66, 0x02, 0xa4, 0xd9, 0xda, 0x28, 0x3a, + 0xc3, 0x94, 0x03, 0xe8, 0x29, 0x7e, 0xfe, 0x3d, 0xc8, 0xc1, 0x0a, 0x74, + 0xc7, 0xaf, 0xa6, 0x84, 0x86, 0x85, 0xc3, 0x8c, 0x00, 0x38, 0xd4, 0xb5, + 0xb2, 0xe0, 0xf0, 0xc4, 0x8d, 0x10, 0x0d, 0xf1, 0xcd, 0x05, 0xdb, 0xd0, + 0xcf, 0x17, 0x4f, 0xa8, 0xe5, 0xf0, 0x53, 0x55, 0x62, 0xc7, 0x55, 0xe5, + 0xbe, 0x18, 0x2f, 0xda, 0x48, 0xf1, 0xaa, 0x85, 0x46, 0x80, 0x15, 0x70, + 0x82, 0xd2, 0xa6, 0xb0, 0x3d, 0x31, 0xb5, 0xcc, 0x23, 0x95, 0x5e, 0x15, + 0x35, 0x32, 0xd0, 0x86, 0xd1, 0x6e, 0x2d, 0xc0, 0xfe, 0x45, 0xae, 0x28, + 0x24, 0xa7, 0x14, 0xf4, 0xe9, 0xb5, 0x6f, 0xac, 0x25, 0xf9, 0x88, 0xf6, + 0x60, 0x5d, 0x6b, 0x5c, 0xf2, 0x38, 0xe8, 0xdc, 0xbd, 0xa6, 0x13, 0xc0, + 0xa4, 0xc8, 0xe9, 0x7a, 0xc6, 0xb6, 0x88, 0x26, 0x98, 0x9f, 0xe3, 0x9a, + 0xd9, 0x5b, 0xd4, 0xd0, 0x02, 0x1f, 0x55, 0x30, 0xbe, 0xde, 0x9c, 0xd1, + 0x53, 0x93, 0x72, 0xe6, 0x19, 0x79, 0xe9, 0xf1, 0x70, 0x78, 0x92, 0x31, + 0xf6, 0x17, 0xc0, 0xdd, 0x99, 0xc8, 0x97, 0x67, 0xdc, 0xf6, 0x67, 0x6b, + 0x9b, 0x1c, 0x90, 0xea, 0x1a, 0x9e, 0x26, 0x68, 0xc2, 0x13, 0x94, 0x3a, + 0x3e, 0x73, 0x61, 0x4e, 0x37, 0xa8, 0xa1, 0xfa, 0xf8, 0x22, 0xdd, 0x20, + 0x40, 0xc6, 0x52, 0x27, 0x47, 0x1a, 0x79, 0xfa, 0x40, 0xa6, 0x62, 0x6b, + 0xe6, 0xc7, 0x67, 0xb7, 0xa8, 0x2d, 0xd1, 0x9f, 0x17, 0xb8, 0x77, 0x5e, + 0x97, 0x1e, 0x92, 0xd7, 0xd2, 0x25, 0x04, 0x92, 0xf9, 0x41, 0x70, 0x93, + 0xe1, 0x13, 0x07, 0x94, 0x8e, 0x0b, 0x82, 0x98 +}; + +static unsigned char randomDataSmall[] = { + // openssl rand -rand /dev/random 24 | xxd -i + 0xd1, 0xec, 0x35, 0xc3, 0xa0, 0x4c, 0x73, 0x37, 0x2f, 0x5a, 0x12, 0x44, + 0xee, 0xe4, 0x22, 0x07, 0x29, 0xa8, 0x4a, 0xde, 0xc8, 0xbb, 0xe7, 0xdb +}; + + +static BOOL HasGzipHeader(NSData *data) { + // very simple check + const unsigned char *bytes = [data bytes]; + return ([data length] > 2) && + ((bytes[0] == 0x1f) && (bytes[1] == 0x8b)); +} + + +@implementation GTMNSData_zlibTest + +- (void)testBoundryValues { + // build some test data + NSData *data = [NSData dataWithBytes:randomDataLarge + length:sizeof(randomDataLarge)]; + STAssertNotNil(data, @"failed to alloc data block"); + + // bogus args to start + STAssertNil([NSData gtm_dataByDeflatingData:nil], nil); + STAssertNil([NSData gtm_dataByDeflatingBytes:nil length:666], nil); + STAssertNil([NSData gtm_dataByDeflatingBytes:[data bytes] length:0], nil); + STAssertNil([NSData gtm_dataByGzippingData:nil], nil); + STAssertNil([NSData gtm_dataByGzippingBytes:nil length:666], nil); + STAssertNil([NSData gtm_dataByGzippingBytes:[data bytes] length:0], nil); + STAssertNil([NSData gtm_dataByInflatingData:nil], nil); + STAssertNil([NSData gtm_dataByInflatingBytes:nil length:666], nil); + STAssertNil([NSData gtm_dataByInflatingBytes:[data bytes] length:0], nil); + + // test deflate w/ compression levels out of range + NSData *deflated = [NSData gtm_dataByDeflatingData:data + compressionLevel:-4]; + STAssertNotNil(deflated, nil); + STAssertFalse(HasGzipHeader(deflated), nil); + NSData *dataPrime = [NSData gtm_dataByInflatingData:deflated]; + STAssertNotNil(dataPrime, nil); + STAssertEqualObjects(data, dataPrime, nil); + deflated = [NSData gtm_dataByDeflatingData:data + compressionLevel:20]; + STAssertNotNil(deflated, nil); + STAssertFalse(HasGzipHeader(deflated), nil); + dataPrime = [NSData gtm_dataByInflatingData:deflated]; + STAssertNotNil(dataPrime, nil); + STAssertEqualObjects(data, dataPrime, nil); + + // test gzip w/ compression levels out of range + NSData *gzipped = [NSData gtm_dataByGzippingData:data + compressionLevel:-4]; + STAssertNotNil(gzipped, nil); + STAssertTrue(HasGzipHeader(gzipped), nil); + dataPrime = [NSData gtm_dataByInflatingData:gzipped]; + STAssertNotNil(dataPrime, nil); + STAssertEqualObjects(data, dataPrime, nil); + gzipped = [NSData gtm_dataByGzippingData:data + compressionLevel:20]; + STAssertNotNil(gzipped, nil); + STAssertTrue(HasGzipHeader(gzipped), nil); + dataPrime = [NSData gtm_dataByInflatingData:gzipped]; + STAssertNotNil(dataPrime, nil); + STAssertEqualObjects(data, dataPrime, nil); + + // test non-compressed data data itself + [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the " + "payload, error -3"]; + STAssertNil([NSData gtm_dataByInflatingData:data], nil); + + // test deflated data runs that end before they are done + [GTMUnitTestDevLog expect:([deflated length] / 11) + 1 + casesOfString:@"Error trying to inflate some of the payload, " + "error -5"]; + for (NSUInteger x = 1 ; x < [deflated length] ; x += 11) { + STAssertNil([NSData gtm_dataByInflatingBytes:[deflated bytes] + length:x], nil); + } + + // test gzipped data runs that end before they are done + [GTMUnitTestDevLog expect:([gzipped length] / 11) + 1 + casesOfString:@"Error trying to inflate some of the payload, " + "error -5"]; + for (NSUInteger x = 1 ; x < [gzipped length] ; x += 11) { + STAssertNil([NSData gtm_dataByInflatingBytes:[gzipped bytes] + length:x], nil); + } + + // test extra data before the deflated/gzipped data (just to make sure we + // don't seek to the "real" data) + NSMutableData *prefixedDeflated = + [NSMutableData dataWithBytes:randomDataSmall length:sizeof(randomDataSmall)]; + STAssertNotNil(prefixedDeflated, @"failed to alloc data block"); + [prefixedDeflated appendData:deflated]; + [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the " + "payload, error -3"]; + STAssertNil([NSData gtm_dataByInflatingData:prefixedDeflated], nil); + [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the " + "payload, error -3"]; + STAssertNil([NSData gtm_dataByInflatingBytes:[prefixedDeflated bytes] + length:[prefixedDeflated length]], + nil); + NSMutableData *prefixedGzipped = + [NSMutableData dataWithBytes:randomDataSmall length:sizeof(randomDataSmall)]; + STAssertNotNil(prefixedDeflated, @"failed to alloc data block"); + [prefixedGzipped appendData:gzipped]; + [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the " + "payload, error -3"]; + STAssertNil([NSData gtm_dataByInflatingData:prefixedGzipped], nil); + [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the " + "payload, error -3"]; + STAssertNil([NSData gtm_dataByInflatingBytes:[prefixedGzipped bytes] + length:[prefixedGzipped length]], + nil); + + // test extra data after the deflated/gzipped data (just to make sure we + // don't ignore some of the data) + NSMutableData *suffixedDeflated = [NSMutableData data]; + STAssertNotNil(suffixedDeflated, @"failed to alloc data block"); + [suffixedDeflated appendData:deflated]; + [suffixedDeflated appendBytes:[data bytes] length:20]; + [GTMUnitTestDevLog expectString:@"thought we finished inflate w/o using " + "all input, 20 bytes left"]; + STAssertNil([NSData gtm_dataByInflatingData:suffixedDeflated], nil); + [GTMUnitTestDevLog expectString:@"thought we finished inflate w/o using " + "all input, 20 bytes left"]; + STAssertNil([NSData gtm_dataByInflatingBytes:[suffixedDeflated bytes] + length:[suffixedDeflated length]], + nil); + NSMutableData *suffixedGZipped = [NSMutableData data]; + STAssertNotNil(suffixedGZipped, @"failed to alloc data block"); + [suffixedGZipped appendData:gzipped]; + [suffixedGZipped appendBytes:[data bytes] length:20]; + [GTMUnitTestDevLog expectString:@"thought we finished inflate w/o using " + "all input, 20 bytes left"]; + STAssertNil([NSData gtm_dataByInflatingData:suffixedGZipped], nil); + [GTMUnitTestDevLog expectString:@"thought we finished inflate w/o using " + "all input, 20 bytes left"]; + STAssertNil([NSData gtm_dataByInflatingBytes:[suffixedGZipped bytes] + length:[suffixedGZipped length]], + nil); +} + +- (void)testInflateDeflate { + NSData *data = [NSData dataWithBytes:randomDataLarge + length:sizeof(randomDataLarge)]; + STAssertNotNil(data, @"failed to alloc data block"); + + // w/ *Bytes apis, default level + NSData *deflated = [NSData gtm_dataByDeflatingBytes:[data bytes] + length:[data length]]; + STAssertNotNil(deflated, @"failed to deflate data block"); + STAssertGreaterThan([deflated length], + (NSUInteger)0, @"failed to deflate data block"); + STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data"); + NSData *dataPrime = [NSData gtm_dataByInflatingBytes:[deflated bytes] + length:[deflated length]]; + STAssertNotNil(dataPrime, @"failed to inflate data block"); + STAssertGreaterThan([dataPrime length], + (NSUInteger)0, @"failed to inflate data block"); + STAssertEqualObjects(data, + dataPrime, @"failed to round trip via *Bytes apis"); + + // w/ *Data apis, default level + deflated = [NSData gtm_dataByDeflatingData:data]; + STAssertNotNil(deflated, @"failed to deflate data block"); + STAssertGreaterThan([deflated length], + (NSUInteger)0, @"failed to deflate data block"); + STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data"); + dataPrime = [NSData gtm_dataByInflatingData:deflated]; + STAssertNotNil(dataPrime, @"failed to inflate data block"); + STAssertGreaterThan([dataPrime length], + (NSUInteger)0, @"failed to inflate data block"); + STAssertEqualObjects(data, + dataPrime, @"failed to round trip via *Data apis"); + + // loop over the compression levels + for (int level = 1 ; level < 9 ; ++level) { + // w/ *Bytes apis, using our level + deflated = [NSData gtm_dataByDeflatingBytes:[data bytes] + length:[data length] + compressionLevel:level]; + STAssertNotNil(deflated, @"failed to deflate data block"); + STAssertGreaterThan([deflated length], + (NSUInteger)0, @"failed to deflate data block"); + STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data"); + dataPrime = [NSData gtm_dataByInflatingBytes:[deflated bytes] + length:[deflated length]]; + STAssertNotNil(dataPrime, @"failed to inflate data block"); + STAssertGreaterThan([dataPrime length], + (NSUInteger)0, @"failed to inflate data block"); + STAssertEqualObjects(data, + dataPrime, @"failed to round trip via *Bytes apis"); + + // w/ *Data apis, using our level + deflated = [NSData gtm_dataByDeflatingData:data compressionLevel:level]; + STAssertNotNil(deflated, @"failed to deflate data block"); + STAssertGreaterThan([deflated length], + (NSUInteger)0, @"failed to deflate data block"); + STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data"); + dataPrime = [NSData gtm_dataByInflatingData:deflated]; + STAssertNotNil(dataPrime, @"failed to inflate data block"); + STAssertGreaterThan([dataPrime length], + (NSUInteger)0, @"failed to inflate data block"); + STAssertEqualObjects(data, + dataPrime, @"failed to round trip via *Data apis"); + } +} + +- (void)testInflateGzip { + NSData *data = [NSData dataWithBytes:randomDataLarge + length:sizeof(randomDataLarge)]; + STAssertNotNil(data, @"failed to alloc data block"); + + // w/ *Bytes apis, default level + NSData *gzipped = [NSData gtm_dataByGzippingBytes:[data bytes] + length:[data length]]; + STAssertNotNil(gzipped, @"failed to gzip data block"); + STAssertGreaterThan([gzipped length], + (NSUInteger)0, @"failed to gzip data block"); + STAssertTrue(HasGzipHeader(gzipped), + @"doesn't have gzip header on gzipped data"); + NSData *dataPrime = [NSData gtm_dataByInflatingBytes:[gzipped bytes] + length:[gzipped length]]; + STAssertNotNil(dataPrime, @"failed to inflate data block"); + STAssertGreaterThan([dataPrime length], + (NSUInteger)0, @"failed to inflate data block"); + STAssertEqualObjects(data, + dataPrime, @"failed to round trip via *Bytes apis"); + + // w/ *Data apis, default level + gzipped = [NSData gtm_dataByGzippingData:data]; + STAssertNotNil(gzipped, @"failed to gzip data block"); + STAssertGreaterThan([gzipped length], + (NSUInteger)0, @"failed to gzip data block"); + STAssertTrue(HasGzipHeader(gzipped), + @"doesn't have gzip header on gzipped data"); + dataPrime = [NSData gtm_dataByInflatingData:gzipped]; + STAssertNotNil(dataPrime, @"failed to inflate data block"); + STAssertGreaterThan([dataPrime length], + (NSUInteger)0, @"failed to inflate data block"); + STAssertEqualObjects(data, dataPrime, + @"failed to round trip via *Data apis"); + + // loop over the compression levels + for (int level = 1 ; level < 9 ; ++level) { + // w/ *Bytes apis, using our level + gzipped = [NSData gtm_dataByGzippingBytes:[data bytes] + length:[data length] + compressionLevel:level]; + STAssertNotNil(gzipped, @"failed to gzip data block"); + STAssertGreaterThan([gzipped length], + (NSUInteger)0, @"failed to gzip data block"); + STAssertTrue(HasGzipHeader(gzipped), + @"doesn't have gzip header on gzipped data"); + dataPrime = [NSData gtm_dataByInflatingBytes:[gzipped bytes] + length:[gzipped length]]; + STAssertNotNil(dataPrime, @"failed to inflate data block"); + STAssertGreaterThan([dataPrime length], + (NSUInteger)0, @"failed to inflate data block"); + STAssertEqualObjects(data, dataPrime, + @"failed to round trip via *Bytes apis"); + + // w/ *Data apis, using our level + gzipped = [NSData gtm_dataByGzippingData:data compressionLevel:level]; + STAssertNotNil(gzipped, @"failed to gzip data block"); + STAssertGreaterThan([gzipped length], + (NSUInteger)0, @"failed to gzip data block"); + STAssertTrue(HasGzipHeader(gzipped), + @"doesn't have gzip header on gzipped data"); + dataPrime = [NSData gtm_dataByInflatingData:gzipped]; + STAssertNotNil(dataPrime, @"failed to inflate data block"); + STAssertGreaterThan([dataPrime length], + (NSUInteger)0, @"failed to inflate data block"); + STAssertEqualObjects(data, + dataPrime, @"failed to round trip via *Data apis"); + } +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArguments.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArguments.h new file mode 100644 index 00000000..4bc896d0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArguments.h @@ -0,0 +1,30 @@ +// +// GTMNSDictionary+URLArguments.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +/// Utility for building a URL or POST argument string. +@interface NSDictionary (GTMNSDictionaryURLArgumentsAdditions) + +/// Gets a string representation of the dictionary in the form +/// key1=value1&key2&value2&...&keyN=valueN, suitable for use as either +/// URL arguments (after a '?') or POST body. Keys and values will be escaped +/// automatically, so should be unescaped in the dictionary. +- (NSString *)gtm_httpArgumentsString; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArguments.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArguments.m new file mode 100644 index 00000000..89610e48 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArguments.m @@ -0,0 +1,40 @@ +// +// GTMNSDictionary+URLArguments.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSDictionary+URLArguments.h" +#import "GTMNSString+URLArguments.h" +#import "GTMMethodCheck.h" +#import "GTMDefines.h" + +@implementation NSDictionary (GTMNSDictionaryURLArgumentsAdditions) + +GTM_METHOD_CHECK(NSString, gtm_stringByEscapingForURLArgument); + +- (NSString *)gtm_httpArgumentsString { + NSMutableArray* arguments = [NSMutableArray arrayWithCapacity:[self count]]; + NSString* key; + GTM_FOREACH_KEY(key, self) { + [arguments addObject:[NSString stringWithFormat:@"%@=%@", + [key gtm_stringByEscapingForURLArgument], + [[[self objectForKey:key] description] gtm_stringByEscapingForURLArgument]]]; + } + + return [arguments componentsJoinedByString:@"&"]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArgumentsTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArgumentsTest.m new file mode 100644 index 00000000..f01519e4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSDictionary+URLArgumentsTest.m @@ -0,0 +1,54 @@ +// +// GTMNSDictionary+URLArgumentsTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSDictionary+URLArguments.h" +#import "GTMDefines.h" + +@interface GTMNSDictionary_URLArgumentsTest : GTMTestCase +@end + +@implementation GTMNSDictionary_URLArgumentsTest + +- (void)testArgumentsString { + STAssertEqualObjects([[NSDictionary dictionary] gtm_httpArgumentsString], @"", + @"- empty dictionary should give an empty string"); + STAssertEqualObjects([[NSDictionary dictionaryWithObject:@"123" forKey:@"abc"] gtm_httpArgumentsString], + @"abc=123", + @"- simple one-pair dictionary should work"); + NSDictionary* arguments = [NSDictionary dictionaryWithObjectsAndKeys: + @"1+1!=3 & 2*6/3=4", @"complex", + @"specialkey", @"a+b", + nil]; + NSString* argumentString = [arguments gtm_httpArgumentsString]; + // check for individual pieces since order is not guaranteed + NSString* component1 = @"a%2Bb=specialkey"; + NSString* component2 = @"complex=1%2B1%21%3D3%20%26%202%2A6%2F3%3D4"; + STAssertNotEquals([argumentString rangeOfString:component1].location, (NSUInteger)NSNotFound, + @"- '%@' not found in '%@'", component1, argumentString); + STAssertNotEquals([argumentString rangeOfString:component2].location, (NSUInteger)NSNotFound, + @"- '%@' not found in '%@'", component2, argumentString); + STAssertNotEquals([argumentString rangeOfString:@"&"].location, (NSUInteger)NSNotFound, + @"- special characters should be escaped"); + STAssertNotEquals([argumentString characterAtIndex:0], (unichar)'&', + @"- there should be no & at the beginning of the string"); + STAssertNotEquals([argumentString characterAtIndex:([argumentString length] - 1)], (unichar)'&', + @"- there should be no & at the end of the string"); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+Filter.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+Filter.h new file mode 100644 index 00000000..8e10d937 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+Filter.h @@ -0,0 +1,53 @@ +// +// GTMNSEnumerator+Filter.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +/// A generic category for methods that allow us to filter enumeratable +/// containers, inspired by C++ Standard Library's use of iterators. +/// Like in C++, these assume the underlying container is not modified during +/// the lifetime of the iterator. +/// +@interface NSEnumerator (GTMEnumeratorFilterAdditions) + +/// @argument predicate - the function return BOOL. will be applied to each element +/// @argument argument - optional argument to pass to predicate +/// @returns an enumerator that contains only elements where [element sel:argument] is true +- (NSEnumerator *)gtm_filteredEnumeratorByMakingEachObjectPerformSelector:(SEL)predicate + withObject:(id)argument; + +/// @argument selector - the function return a transformed object. will be applied to each element +/// @argument argument - optional argument to pass to transformer +/// @returns an enumerator that contains the transformed elements +- (NSEnumerator *)gtm_enumeratorByMakingEachObjectPerformSelector:(SEL)selector + withObject:(id)argument; + +/// @argument target - receiver for each method +/// @argument predicate - as in, [target predicate: [self nextObject]], return a BOOL +/// @returns an enumerator that contains only elements where [element sel:argument] is true +- (NSEnumerator *)gtm_filteredEnumeratorByTarget:(id)target + performOnEachSelector:(SEL)predicate; + +/// @argument target - receiver for each method +/// @argument sel - as in, [target selector: [self nextObject]], return a transformed object +/// @returns an enumerator that contains the transformed elements +- (NSEnumerator *)gtm_enumeratorByTarget:(id)target + performOnEachSelector:(SEL)selector; + +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+Filter.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+Filter.m new file mode 100644 index 00000000..51d56f8b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+Filter.m @@ -0,0 +1,179 @@ +// +// GTMNSEnumerator+Filter.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSEnumerator+Filter.h" +#import "GTMDebugSelectorValidation.h" +#import "GTMDefines.h" +#if GTM_IPHONE_SDK +#import +#import +#else +#import +#endif + +// a private subclass of NSEnumerator that does all the work. +// public interface just returns one of these. +// This top level class contains all the additional boilerplate. Specific +// behavior is in the subclasses. +@interface GTMEnumeratorPrivateBase : NSEnumerator { + @protected + NSEnumerator *base_; // STRONG + SEL operation_; // either a predicate or a transform depending on context. + id other_; // STRONG, may be nil +} +@end + +@interface GTMEnumeratorPrivateBase (SubclassesMustProvide) +- (BOOL)filterObject:(id)obj returning:(id *)resultp; +@end + +@implementation GTMEnumeratorPrivateBase +- (id)initWithBase:(NSEnumerator *)base + sel:(SEL)filter + object:(id)optionalOther { + self = [super init]; + if (self) { + + // someone would have to subclass or directly create an object of this + // class, and this class is private to this impl. + _GTMDevAssert(base, @"can't initWithBase: a nil base enumerator"); + base_ = [base retain]; + operation_ = filter; + other_ = [optionalOther retain]; + } + return self; +} + +// we don't provide an init because this base class is private to this +// impl, and no one would be able to create it (if they do, they get whatever +// they happens...). + +- (void)dealloc { + [base_ release]; + [other_ release]; + [super dealloc]; +} + +- (id)nextObject { + for (id obj = [base_ nextObject]; obj; obj = [base_ nextObject]) { + id result = nil; + if ([self filterObject:obj returning:&result]) { + return result; + } + } + return nil; +} +@end + +// a transformer, for each item in the enumerator, returns a f(item). +@interface GTMEnumeratorTransformer : GTMEnumeratorPrivateBase +@end +@implementation GTMEnumeratorTransformer +- (BOOL)filterObject:(id)obj returning:(id *)resultp { + *resultp = [obj performSelector:operation_ withObject:other_]; + return nil != *resultp; +} +@end + +// a transformer, for each item in the enumerator, returns a f(item). +// a target transformer swaps the target and the argument. +@interface GTMEnumeratorTargetTransformer : GTMEnumeratorPrivateBase +@end +@implementation GTMEnumeratorTargetTransformer +- (BOOL)filterObject:(id)obj returning:(id *)resultp { + *resultp = [other_ performSelector:operation_ withObject:obj]; + return nil != *resultp; +} +@end + +// a filter, for each item in the enumerator, if(f(item)) { returns item. } +@interface GTMEnumeratorFilter : GTMEnumeratorPrivateBase +@end +@implementation GTMEnumeratorFilter +// We must take care here, since Intel leaves junk in high bytes of return register +// for predicates that return BOOL. +// For details see: +// http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/chapter_5_section_23.html +// and +// http://www.red-sweater.com/blog/320/abusing-objective-c-with-class#comment-83187 +- (BOOL)filterObject:(id)obj returning:(id *)resultp { + *resultp = obj; + return ((BOOL (*)(id, SEL, id))objc_msgSend)(obj, operation_, other_); +} +@end + +// a target filter, for each item in the enumerator, if(f(item)) { returns item. } +// a target transformer swaps the target and the argument. +@interface GTMEnumeratorTargetFilter : GTMEnumeratorPrivateBase +@end +@implementation GTMEnumeratorTargetFilter +// We must take care here, since Intel leaves junk in high bytes of return register +// for predicates that return BOOL. +// For details see: +// http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/chapter_5_section_23.html +// and +// http://www.red-sweater.com/blog/320/abusing-objective-c-with-class#comment-83187 +- (BOOL)filterObject:(id)obj returning:(id *)resultp { + *resultp = obj; + return ((BOOL (*)(id, SEL, id))objc_msgSend)(other_, operation_, obj); +} +@end + +@implementation NSEnumerator (GTMEnumeratorFilterAdditions) + +- (NSEnumerator *)gtm_filteredEnumeratorByMakingEachObjectPerformSelector:(SEL)selector + withObject:(id)argument { + return [[[GTMEnumeratorFilter alloc] initWithBase:self + sel:selector + object:argument] autorelease]; +} + +- (NSEnumerator *)gtm_enumeratorByMakingEachObjectPerformSelector:(SEL)selector + withObject:(id)argument { + return [[[GTMEnumeratorTransformer alloc] initWithBase:self + sel:selector + object:argument] autorelease]; +} + + +- (NSEnumerator *)gtm_filteredEnumeratorByTarget:(id)target + performOnEachSelector:(SEL)selector { + // make sure the object impls this selector taking an object as an arg. + GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(target, selector, + @encode(BOOL), + @encode(id), + NULL); + return [[[GTMEnumeratorTargetFilter alloc] initWithBase:self + sel:selector + object:target] autorelease]; +} + +- (NSEnumerator *)gtm_enumeratorByTarget:(id)target + performOnEachSelector:(SEL)selector { + // make sure the object impls this selector taking an object as an arg. + GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(target, selector, + @encode(id), + @encode(id), + NULL); + return [[[GTMEnumeratorTargetTransformer alloc] initWithBase:self + sel:selector + object:target] autorelease]; +} + +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+FilterTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+FilterTest.m new file mode 100644 index 00000000..ef0d9556 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSEnumerator+FilterTest.m @@ -0,0 +1,133 @@ +// +// GTMNSEnumerator+FilterTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSEnumerator+Filter.h" + +@interface GTMNSEnumerator_FilterTest : GTMTestCase +@end + +@implementation GTMNSEnumerator_FilterTest + +- (void)testEnumeratorByMakingEachObjectPerformSelector { + // test w/ a set of strings + NSSet *numbers = [NSSet setWithObjects: @"1", @"2", @"3", nil]; + NSEnumerator *e = [[numbers objectEnumerator] + gtm_enumeratorByMakingEachObjectPerformSelector:@selector(stringByAppendingString:) + withObject:@" "]; + NSMutableSet *trailingSpaces = [NSMutableSet set]; + id obj; + while (nil != (obj = [e nextObject])) { + [trailingSpaces addObject:obj]; + } + NSSet *trailingSpacesGood = [NSSet setWithObjects: @"1 ", @"2 ", @"3 ", nil]; + STAssertEqualObjects(trailingSpaces, trailingSpacesGood, @""); + + // test an empty set + NSSet *empty = [NSSet set]; + e = [[empty objectEnumerator] + gtm_enumeratorByMakingEachObjectPerformSelector:@selector(stringByAppendingString:) + withObject:@" "]; + STAssertNil([e nextObject], + @"shouldn't have gotten anything from first advance of enumerator"); +} + +- (void)testFilteredEnumeratorByMakingEachObjectPerformSelector { + // test with a dict of strings + NSDictionary *testDict = [NSDictionary dictionaryWithObjectsAndKeys: + @"foo", @"1", + @"bar", @"2", + @"foobar", @"3", + nil]; + // test those that have prefixes + NSEnumerator *e = [[testDict objectEnumerator] + gtm_filteredEnumeratorByMakingEachObjectPerformSelector:@selector(hasPrefix:) + withObject:@"foo"]; + // since the dictionary iterates in any order, compare as sets + NSSet *filteredValues = [NSSet setWithArray:[e allObjects]]; + NSSet *expectedValues = [NSSet setWithObjects:@"foo", @"foobar", nil]; + STAssertEqualObjects(filteredValues, expectedValues, @""); + + // test an empty set + NSSet *empty = [NSSet set]; + e = [[empty objectEnumerator] + gtm_filteredEnumeratorByMakingEachObjectPerformSelector:@selector(hasPrefix:) + withObject:@"foo"]; + STAssertNil([e nextObject], + @"shouldn't have gotten anything from first advance of enumerator"); + + // test an set that will filter out + NSSet *filterAway = [NSSet setWithObjects:@"bar", @"baz", nil]; + e = [[filterAway objectEnumerator] + gtm_filteredEnumeratorByMakingEachObjectPerformSelector:@selector(hasPrefix:) + withObject:@"foo"]; + STAssertNil([e nextObject], + @"shouldn't have gotten anything from first advance of enumerator"); +} + +- (void)testEnumeratorByTargetPerformOnEachSelector { + // test w/ a set of strings + NSSet *numbers = [NSSet setWithObjects: @"1", @"2", @"3", nil]; + NSString *target = @"foo"; + NSEnumerator *e = [[numbers objectEnumerator] + gtm_enumeratorByTarget:target + performOnEachSelector:@selector(stringByAppendingString:)]; + // since the set iterates in any order, compare as sets + NSSet *collectedValues = [NSSet setWithArray:[e allObjects]]; + NSSet *expectedValues = [NSSet setWithObjects:@"foo1", @"foo2", @"foo3", nil]; + STAssertEqualObjects(collectedValues, expectedValues, @""); + + // test an empty set + NSSet *empty = [NSSet set]; + e = [[empty objectEnumerator] + gtm_enumeratorByTarget:target + performOnEachSelector:@selector(stringByAppendingString:)]; + STAssertNil([e nextObject], + @"shouldn't have gotten anything from first advance of enumerator"); +} + +- (void)testFilteredEnumeratorByTargetPerformOnEachSelector { + // test w/ a set of strings + NSSet *numbers = [NSSet setWithObjects:@"1", @"2", @"3", @"4", nil]; + NSSet *target = [NSSet setWithObjects:@"2", @"4", @"6", nil]; + NSEnumerator *e = [[numbers objectEnumerator] + gtm_filteredEnumeratorByTarget:target + performOnEachSelector:@selector(containsObject:)]; + // since the set iterates in any order, compare as sets + NSSet *filteredValues = [NSSet setWithArray:[e allObjects]]; + NSSet *expectedValues = [NSSet setWithObjects:@"2", @"4", nil]; + STAssertEqualObjects(filteredValues, expectedValues, @""); + + // test an empty set + NSSet *empty = [NSSet set]; + e = [[empty objectEnumerator] + gtm_filteredEnumeratorByTarget:target + performOnEachSelector:@selector(containsObject:)]; + STAssertNil([e nextObject], + @"shouldn't have gotten anything from first advance of enumerator"); + + // test an set that will filter out + NSSet *filterAway = [NSSet setWithObjects:@"bar", @"baz", nil]; + e = [[filterAway objectEnumerator] + gtm_filteredEnumeratorByTarget:target + performOnEachSelector:@selector(containsObject:)]; + STAssertNil([e nextObject], + @"shouldn't have gotten anything from first advance of enumerator"); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Carbon.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Carbon.h new file mode 100644 index 00000000..86215eaf --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Carbon.h @@ -0,0 +1,60 @@ +// +// GTMNSFileManager+Carbon.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + + +// A few useful methods for dealing with paths and carbon structures +@interface NSFileManager (GTMFileManagerCarbonAdditions) + +// Converts a path to an alias +// Args: +// path - the path to convert +// +// Returns: +// An alias wrapped up in an autoreleased NSData. Nil on failure. +// +- (NSData *)gtm_aliasDataForPath:(NSString *)path; + +// Converts an alias to a path +// Args: +// alias - an alias wrapped up in an NSData +// +// Returns: +// The path. Nil on failure. +// +- (NSString *)gtm_pathFromAliasData:(NSData *)alias; + +// Converts a path to an FSRef * +// Args: +// path - the path to convert +// +// Returns: +// An autoreleased FSRef *. Nil on failure. +// +- (FSRef *)gtm_FSRefForPath:(NSString *)path; + +// Converts an FSRef to a path +// Args: +// fsRef - the FSRef to convert +// +// Returns: +// The path. Nil on failure. +// +- (NSString *)gtm_pathFromFSRef:(FSRef *)fsRef; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Carbon.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Carbon.m new file mode 100644 index 00000000..4f8ba8bd --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Carbon.m @@ -0,0 +1,99 @@ +// +// GTMNSFileManager+Carbon.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSFileManager+Carbon.h" +#import +#import +#import "GTMDefines.h" + +@implementation NSFileManager (GTMFileManagerCarbonAdditions) + +- (NSData *)gtm_aliasDataForPath:(NSString *)path { + NSData *data = nil; + FSRef ref; + AliasHandle alias = NULL; + + require_quiet([path length], CantUseParams); + require_noerr(FSPathMakeRef((UInt8 *)[path fileSystemRepresentation], + &ref, NULL), CantMakeRef); + require_noerr(FSNewAlias(NULL, &ref, &alias), CantMakeAlias); + + Size length = GetAliasSize(alias); + data = [NSData dataWithBytes:*alias length:length]; + + DisposeHandle((Handle)alias); + +CantMakeAlias: +CantMakeRef: +CantUseParams: + return data; +} + +- (NSString *)gtm_pathFromAliasData:(NSData *)data { + NSString *path = nil; + require_quiet(data, CantUseParams); + + AliasHandle alias; + const void *bytes = [data bytes]; + NSUInteger length = [data length]; + require_noerr(PtrToHand(bytes, (Handle *)&alias, length), CantMakeHandle); + + FSRef ref; + Boolean wasChanged; + // we don't use a require here because it is quite legitimate for an alias + // resolve to fail. + if (FSResolveAlias(NULL, alias, &ref, &wasChanged) == noErr) { + path = [self gtm_pathFromFSRef:&ref]; + } + DisposeHandle((Handle)alias); +CantMakeHandle: +CantUseParams: + return path; +} + +- (FSRef *)gtm_FSRefForPath:(NSString *)path { + FSRef* fsRef = NULL; + require_quiet([path length], CantUseParams); + NSMutableData *fsRefData = [NSMutableData dataWithLength:sizeof(FSRef)]; + require(fsRefData, CantAllocateFSRef); + fsRef = (FSRef*)[fsRefData mutableBytes]; + Boolean isDir = FALSE; + const UInt8 *filePath = (const UInt8 *)[path fileSystemRepresentation]; + require_noerr_action(FSPathMakeRef(filePath, fsRef, &isDir), + CantMakeRef, fsRef = NULL); +CantMakeRef: +CantAllocateFSRef: +CantUseParams: + return fsRef; +} + +- (NSString *)gtm_pathFromFSRef:(FSRef *)fsRef { + NSString *nsPath = nil; + require_quiet(fsRef, CantUseParams); + + char path[MAXPATHLEN]; + require_noerr(FSRefMakePath(fsRef, (UInt8 *)path, MAXPATHLEN), CantMakePath); + nsPath = [self stringWithFileSystemRepresentation:path length:strlen(path)]; + nsPath = [nsPath stringByStandardizingPath]; + +CantMakePath: +CantUseParams: + return nsPath; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+CarbonTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+CarbonTest.m new file mode 100644 index 00000000..76692b0e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+CarbonTest.m @@ -0,0 +1,69 @@ +// +// GTMNSFileManager+CarbonTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSFileManager+Carbon.h" +#import "GTMUnitTestDevLog.h" +#import + +@interface GTMNSFileManager_CarbonTest : GTMTestCase +@end + +@implementation GTMNSFileManager_CarbonTest + +- (void)testAliasPathFSRefConversion { + NSString *path = NSHomeDirectory(); + STAssertNotNil(path, nil); + NSFileManager *fileManager = [NSFileManager defaultManager]; + FSRef *fsRef = [fileManager gtm_FSRefForPath:path]; + STAssertNotNULL(fsRef, nil); + AliasHandle alias; + STAssertNoErr(FSNewAlias(nil, fsRef, &alias), nil); + STAssertNotNULL(alias, nil); + NSData *aliasData = [NSData dataWithBytes:*alias + length:GetAliasSize(alias)]; + STAssertNotNil(aliasData, nil); + NSString *path2 = [fileManager gtm_pathFromAliasData:aliasData]; + STAssertEqualObjects(path, path2, nil); + NSData *aliasData2 = [fileManager gtm_aliasDataForPath:path2]; + STAssertNotNil(aliasData2, nil); + NSString *path3 = [fileManager gtm_pathFromAliasData:aliasData2]; + STAssertEqualObjects(path2, path3, nil); + NSString *path4 = [fileManager gtm_pathFromFSRef:fsRef]; + STAssertEqualObjects(path, path4, nil); + + // Failure cases + [GTMUnitTestDevLogDebug expectPattern:@"DebugAssert: " + @"GoogleToolboxForMac: FSPathMakeRef.*"]; + STAssertNULL([fileManager gtm_FSRefForPath:@"/ptah/taht/dosent/esixt/"], + nil); + + STAssertNULL([fileManager gtm_FSRefForPath:@""], nil); + STAssertNULL([fileManager gtm_FSRefForPath:nil], nil); + STAssertNil([fileManager gtm_pathFromFSRef:nil], nil); + STAssertNil([fileManager gtm_pathFromAliasData:nil], nil); + STAssertNil([fileManager gtm_pathFromAliasData:[NSData data]], nil); + + [GTMUnitTestDevLogDebug expectPattern:@"DebugAssert: " + @"GoogleToolboxForMac: FSPathMakeRef.*"]; + STAssertNil([fileManager gtm_aliasDataForPath:@"/ptah/taht/dosent/esixt/"], nil); + STAssertNil([fileManager gtm_aliasDataForPath:@""], nil); + STAssertNil([fileManager gtm_aliasDataForPath:nil], nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Path.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Path.h new file mode 100644 index 00000000..f3772154 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Path.h @@ -0,0 +1,75 @@ +// +// GTMNSFileManager+Path.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + + +/// A few useful methods for dealing with paths. +@interface NSFileManager (GMFileManagerPathAdditions) + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +/// For the Unix-y at heart, this is "mkdir -p". It tries to create +/// the directory specified by |path|, and any intervening directories that +/// are needed. Each directory that is created is created with |attributes| +/// (see other NSFileManager doco for the details on |attributes|). +/// +/// If you are building for 10.5 or later, you should just use the new api: +/// createDirectoryAtPath:withIntermediateDirectories:attributes:error: +/// +/// Also if you need more control over the creation of paths and their +/// attributes, look into using GTMPath. +/// +/// Args: +/// path - the path of the directory to create. +/// attributes - these are defined in the "Constants" section of Apple's +/// NSFileManager doco +/// +/// Returns: +/// YES if |path| exists or was able to be created successfully +/// NO otherwise +/// +- (BOOL)gtm_createFullPathToDirectory:(NSString *)path + attributes:(NSDictionary *)attributes; + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +/// Return an the paths for all resources in |directoryPath| that have the +/// |extension| file extension. +/// +/// Args: +/// extension - the file extension (excluding the leading ".") to match. +/// If nil, all files are matched. +/// directoryPath - the directory to look in. NOTE: Subdirectories are NOT +/// traversed. +/// +/// Returns: +/// An NSArray of absolute file paths that have |extension|. nil is returned +/// if |directoryPath| doesn't exist or can't be opened, and returns an empty +/// array if |directoryPath| is empty. ".", "..", and resource forks are never returned. +/// +- (NSArray *)gtm_filePathsWithExtension:(NSString *)extension + inDirectory:(NSString *)directoryPath; + +/// Same as -filePathsWithExtension:inDirectory: except |extensions| is an +/// NSArray of extensions to match. +/// +- (NSArray *)gtm_filePathsWithExtensions:(NSArray *)extensions + inDirectory:(NSString *)directoryPath; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Path.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Path.m new file mode 100644 index 00000000..195cd9ee --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+Path.m @@ -0,0 +1,101 @@ +// +// GTMNSFileManager+Path.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSFileManager+Path.h" +#import "GTMDefines.h" + +@implementation NSFileManager (GMFileManagerPathAdditions) + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +- (BOOL)gtm_createFullPathToDirectory:(NSString *)path + attributes:(NSDictionary *)attributes { + if (!path) return NO; + + BOOL isDir; + BOOL exists = [self fileExistsAtPath:path isDirectory:&isDir]; + + // Quick check for the case where we have nothing to do. + if (exists && isDir) + return YES; + + NSString *actualPath = @"/"; + NSString *directory; + + GTM_FOREACH_OBJECT(directory, [path pathComponents]) { + actualPath = [actualPath stringByAppendingPathComponent:directory]; + + if ([self fileExistsAtPath:actualPath isDirectory:&isDir] && isDir) { + continue; + } else if ([self createDirectoryAtPath:actualPath attributes:attributes]) { + continue; + } else { + return NO; + } + } + + return YES; +} + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +- (NSArray *)gtm_filePathsWithExtension:(NSString *)extension + inDirectory:(NSString *)directoryPath { + NSArray *extensions = nil; + + // Treat no extension and an empty extension as the user requesting all files + if (extension != nil && ![extension isEqualToString:@""]) + extensions = [NSArray arrayWithObject:extension]; + + return [self gtm_filePathsWithExtensions:extensions + inDirectory:directoryPath]; +} + +- (NSArray *)gtm_filePathsWithExtensions:(NSArray *)extensions + inDirectory:(NSString *)directoryPath { + if (directoryPath == nil) + return nil; + + // |basenames| will contain only the matching file names, not their full paths. + NSArray *basenames = [self directoryContentsAtPath:directoryPath]; + + // Check if dir doesn't exist or couldn't be opened. + if (basenames == nil) + return nil; + + // Check if dir is empty. + if ([basenames count] == 0) + return basenames; + + NSMutableArray *paths = [NSMutableArray arrayWithCapacity:[basenames count]]; + NSString *basename; + + // Convert all the |basenames| to full paths. + GTM_FOREACH_OBJECT(basename, basenames) { + NSString *fullPath = [directoryPath stringByAppendingPathComponent:basename]; + [paths addObject:fullPath]; + } + + // Check if caller wants all files, regardless of extension. + if (extensions == nil || [extensions count] == 0) + return paths; + + return [paths pathsMatchingExtensions:extensions]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+PathTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+PathTest.m new file mode 100644 index 00000000..db40c68d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSFileManager+PathTest.m @@ -0,0 +1,249 @@ +// +// GTMNSFileManager+PathTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSFileManager+Path.h" + +@interface GTMNSFileManager_PathTest : GTMTestCase { + NSString *baseDir_; +} +@end + +@implementation GTMNSFileManager_PathTest + +- (void)setUp { + // make a directory to scribble in + baseDir_ = + [[NSTemporaryDirectory() + stringByAppendingPathComponent:@"GTMNSFileManager_PathTest"] retain]; + if (baseDir_) { + NSFileManager *fm = [NSFileManager defaultManager]; + if (![fm fileExistsAtPath:baseDir_] && + ![fm createDirectoryAtPath:baseDir_ attributes:nil]) { + // COV_NF_START + // if the dir exists or we failed to create it, drop the baseDir_ + [baseDir_ release]; + baseDir_ = nil; + // COV_NF_END + } + } +} + +- (void)tearDown { + if (baseDir_) { + // clean up our directory + NSFileManager *fm = [NSFileManager defaultManager]; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + NSError *error = nil; + [fm removeItemAtPath:baseDir_ error:&error]; + STAssertNil(error, + @"Unable to delete %@: %@", baseDir_, [error description]); +#else + [fm removeFileAtPath:baseDir_ handler:nil]; +#endif + + [baseDir_ release]; + baseDir_ = nil; + } +} + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +- (void)testCreateFullPathToDirectoryAttributes { + STAssertNotNil(baseDir_, @"setUp failed"); + + NSString *testPath = + [baseDir_ stringByAppendingPathComponent:@"/foo/bar/baz"]; + STAssertNotNil(testPath, nil); + NSFileManager *fm = [NSFileManager defaultManager]; + + STAssertFalse([fm fileExistsAtPath:testPath], + @"You must delete '%@' before running this test", testPath); + + STAssertFalse([fm gtm_createFullPathToDirectory:nil attributes:nil], + @"didn't fail on nil input"); + + STAssertTrue([fm gtm_createFullPathToDirectory:testPath attributes:nil], + @"Failed to create nested testPath"); + STAssertTrue([fm gtm_createFullPathToDirectory:testPath attributes:nil], + @"Failed to succeed on second create of testPath"); + + NSString *pathToFail = [@"/etc" stringByAppendingPathComponent:testPath]; + STAssertFalse([fm gtm_createFullPathToDirectory:pathToFail attributes:nil], + @"We were allowed to create a dir in '/etc'?!"); + + STAssertFalse([fm gtm_createFullPathToDirectory:nil attributes:nil], + @"Should have failed when passed (nil)"); +} + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +- (void)testfilePathsWithExtensionsInDirectory { + STAssertNotNil(baseDir_, @"setUp failed"); + + NSFileManager *fm = [NSFileManager defaultManager]; + NSString *bogusPath = @"/some/place/that/does/not/exist"; + + // -------------------------------------------------------------------------- + // test fail cases first + + // single + STAssertNil([fm gtm_filePathsWithExtension:nil inDirectory:nil], + @"shouldn't have gotten anything for nil dir"); + STAssertNil([fm gtm_filePathsWithExtension:@"txt" inDirectory:nil], + @"shouldn't have gotten anything for nil dir"); + STAssertNil([fm gtm_filePathsWithExtension:@"txt" inDirectory:bogusPath], + @"shouldn't have gotten anything for a bogus dir"); + // array + STAssertNil([fm gtm_filePathsWithExtensions:nil inDirectory:nil], + @"shouldn't have gotten anything for nil dir"); + STAssertNil([fm gtm_filePathsWithExtensions:[NSArray array] inDirectory:nil], + @"shouldn't have gotten anything for nil dir"); + STAssertNil([fm gtm_filePathsWithExtensions:[NSArray arrayWithObject:@"txt"] + inDirectory:nil], + @"shouldn't have gotten anything for nil dir"); + STAssertNil([fm gtm_filePathsWithExtensions:[NSArray arrayWithObject:@"txt"] + inDirectory:bogusPath], + @"shouldn't have gotten anything for a bogus dir"); + + // -------------------------------------------------------------------------- + // create some test data + + NSString *testDirs[] = { + @"", @"/foo", // mave a subdir to make sure we don't match w/in it + }; + NSString *testFiles[] = { + @"a.txt", @"b.txt", @"c.rtf", @"d.m", + }; + + for (size_t i = 0; i < sizeof(testDirs) / sizeof(NSString*); i++) { + NSString *testDir = nil; + if ([testDirs[i] length]) { + testDir = [baseDir_ stringByAppendingPathComponent:testDirs[i]]; + STAssertTrue([fm createDirectoryAtPath:testDir attributes:nil], nil); + } else { + testDir = baseDir_; + } + for (size_t j = 0; j < sizeof(testFiles) / sizeof(NSString*); j++) { + NSString *testFile = [testDir stringByAppendingPathComponent:testFiles[j]]; + STAssertTrue([@"test" writeToFile:testFile atomically:YES], nil); + } + } + + // build set of the top level items + NSMutableArray *allFiles = [NSMutableArray array]; + for (size_t i = 0; i < sizeof(testDirs) / sizeof(NSString*); i++) { + if ([testDirs[i] length]) { + NSString *testDir = [baseDir_ stringByAppendingPathComponent:testDirs[i]]; + [allFiles addObject:testDir]; + } + } + for (size_t j = 0; j < sizeof(testFiles) / sizeof(NSString*); j++) { + NSString *testFile = [baseDir_ stringByAppendingPathComponent:testFiles[j]]; + [allFiles addObject:testFile]; + } + + NSArray *matches = nil; + NSArray *expectedMatches = nil; + NSArray *extensions = nil; + + // NOTE: we do all compares w/ sets so order doesn't matter + + // -------------------------------------------------------------------------- + // test match all + + // single + matches = [fm gtm_filePathsWithExtension:nil inDirectory:baseDir_]; + STAssertEqualObjects([NSSet setWithArray:matches], + [NSSet setWithArray:allFiles], + @"didn't get all files for nil extension"); + matches = [fm gtm_filePathsWithExtension:@"" inDirectory:baseDir_]; + STAssertEqualObjects([NSSet setWithArray:matches], + [NSSet setWithArray:allFiles], + @"didn't get all files for nil extension"); + // array + matches = [fm gtm_filePathsWithExtensions:nil inDirectory:baseDir_]; + STAssertEqualObjects([NSSet setWithArray:matches], + [NSSet setWithArray:allFiles], + @"didn't get all files for nil extension"); + matches = [fm gtm_filePathsWithExtensions:[NSArray array] + inDirectory:baseDir_]; + STAssertEqualObjects([NSSet setWithArray:matches], + [NSSet setWithArray:allFiles], + @"didn't get all files for nil extension"); + + // -------------------------------------------------------------------------- + // test match something + + // single + extensions = [NSArray arrayWithObject:@"txt"]; + matches = [fm gtm_filePathsWithExtension:@"txt" inDirectory:baseDir_]; + expectedMatches = [allFiles pathsMatchingExtensions:extensions]; + STAssertEqualObjects([NSSet setWithArray:matches], + [NSSet setWithArray:expectedMatches], + @"didn't get expected files"); + // array + matches = [fm gtm_filePathsWithExtensions:extensions inDirectory:baseDir_]; + expectedMatches = [allFiles pathsMatchingExtensions:extensions]; + STAssertEqualObjects([NSSet setWithArray:matches], + [NSSet setWithArray:expectedMatches], + @"didn't get expected files"); + extensions = [NSArray arrayWithObjects:@"txt", @"rtf", @"xyz", nil]; + matches = [fm gtm_filePathsWithExtensions:extensions inDirectory:baseDir_]; + expectedMatches = [allFiles pathsMatchingExtensions:extensions]; + STAssertEqualObjects([NSSet setWithArray:matches], + [NSSet setWithArray:expectedMatches], + @"didn't get expected files"); + + // -------------------------------------------------------------------------- + // test match nothing + + // single + extensions = [NSArray arrayWithObject:@"xyz"]; + matches = [fm gtm_filePathsWithExtension:@"xyz" inDirectory:baseDir_]; + expectedMatches = [allFiles pathsMatchingExtensions:extensions]; + STAssertEqualObjects([NSSet setWithArray:matches], + [NSSet setWithArray:expectedMatches], + @"didn't get expected files"); + // array + matches = [fm gtm_filePathsWithExtensions:extensions inDirectory:baseDir_]; + expectedMatches = [allFiles pathsMatchingExtensions:extensions]; + STAssertEqualObjects([NSSet setWithArray:matches], + [NSSet setWithArray:expectedMatches], + @"didn't get expected files"); + + // -------------------------------------------------------------------------- + // test match an empty dir + + // create the empty dir + NSString *emptyDir = [baseDir_ stringByAppendingPathComponent:@"emptyDir"]; + STAssertTrue([fm createDirectoryAtPath:emptyDir attributes:nil], nil); + + // single + matches = [fm gtm_filePathsWithExtension:@"txt" inDirectory:emptyDir]; + STAssertEqualObjects([NSSet setWithArray:matches], [NSSet set], + @"expected empty dir"); + // array + matches = [fm gtm_filePathsWithExtensions:[NSArray arrayWithObject:@"txt"] + inDirectory:emptyDir]; + STAssertEqualObjects([NSSet setWithArray:matches], [NSSet set], + @"expected empty dir"); + +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObserving.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObserving.h new file mode 100644 index 00000000..de11aeb7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObserving.h @@ -0,0 +1,70 @@ +// +// GTMNSObject+KeyValueObserving.h +// +// Copyright 2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// +// MAKVONotificationCenter.h +// MAKVONotificationCenter +// +// Created by Michael Ash on 10/15/08. +// + +// This code is based on code by Michael Ash. +// Please see his excellent writeup at +// http://www.mikeash.com/?page=pyblog/key-value-observing-done-right.html +// You may also be interested in this writeup: +// http://www.dribin.org/dave/blog/archives/2008/09/24/proper_kvo_usage/ +// and the discussion on cocoa-dev that is linked to at the end of it. + +#import + +// If you read the articles above you will see that doing KVO correctly +// is actually pretty tricky, and that Apple's documentation may not be +// completely clear as to how things should be used. Use the methods below +// to make things a little easier instead of the stock addObserver, +// removeObserver methods. +// Selector should have the following signature: +// - (void)observeNotification:(GTMKeyValueChangeNotification *)notification +@interface NSObject (GTMKeyValueObservingAdditions) + +// Use this instead of [NSObject addObserver:forKeyPath:options:context:] +- (void)gtm_addObserver:(id)observer + forKeyPath:(NSString *)keyPath + selector:(SEL)selector + userInfo:(id)userInfo + options:(NSKeyValueObservingOptions)options; +// Use this instead of [NSObject removeObserver:forKeyPath:] +- (void)gtm_removeObserver:(id)observer + forKeyPath:(NSString *)keyPath + selector:(SEL)selector; +@end + +// This is the class that is sent to your notification selector as an +// argument. +@interface GTMKeyValueChangeNotification : NSObject { + @private + NSString *keyPath_; + id object_; + id userInfo_; + NSDictionary *change_; +} + +- (NSString *)keyPath; +- (id)object; +- (id)userInfo; +- (NSDictionary *)change; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObserving.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObserving.m new file mode 100644 index 00000000..dc6883d5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObserving.m @@ -0,0 +1,350 @@ +// +// GTMNSObject+KeyValueObserving.h +// +// Copyright 2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// +// MAKVONotificationCenter.m +// MAKVONotificationCenter +// +// Created by Michael Ash on 10/15/08. +// + +// This code is based on code by Michael Ash. +// See comment in header. + +#import "GTMNSObject+KeyValueObserving.h" + +#import +#import "GTMDefines.h" +#import "GTMDebugSelectorValidation.h" +#import "GTMObjC2Runtime.h" + +// A singleton that works as a dispatch center for KVO +// -[NSObject observeValueForKeyPath:ofObject:change:context:] and turns them +// into selector dispatches. It stores a collection of +// GTMKeyValueObservingHelpers, and keys them via the key generated by +// -dictionaryKeyForObserver:ofObject:forKeyPath:selector. +@interface GTMKeyValueObservingCenter : NSObject { +@private + NSMutableDictionary *observerHelpers_; +} + ++ (id)defaultCenter; + +- (void)addObserver:(id)observer + ofObject:(id)target + forKeyPath:(NSString *)keyPath + selector:(SEL)selector + userInfo:(id)userInfo + options:(NSKeyValueObservingOptions)options; +- (void)removeObserver:(id)observer + ofObject:(id)target + forKeyPath:(NSString *)keyPath + selector:(SEL)selector; +- (id)dictionaryKeyForObserver:(id)observer + ofObject:(id)target + forKeyPath:(NSString *)keyPath + selector:(SEL)selector; +@end + +@interface GTMKeyValueObservingHelper : NSObject { + @private + __weak id observer_; + SEL selector_; + id userInfo_; + id target_; + NSString* keyPath_; +} + +- (id)initWithObserver:(id)observer + object:(id)target + keyPath:(NSString *)keyPath + selector:(SEL)selector + userInfo:(id)userInfo + options:(NSKeyValueObservingOptions)options; +- (void)deregister; + +@end + +@interface GTMKeyValueChangeNotification () +- (id)initWithKeyPath:(NSString *)keyPath ofObject:(id)object + userInfo:(id)userInfo change:(NSDictionary *)change; +@end + +@implementation GTMKeyValueObservingHelper + +// For info how and why we use these statics: +// http://lists.apple.com/archives/cocoa-dev/2006/Jul/msg01038.html +static char GTMKeyValueObservingHelperContextData; +static char* GTMKeyValueObservingHelperContext + = >MKeyValueObservingHelperContextData; + +- (id)initWithObserver:(id)observer + object:(id)target + keyPath:(NSString *)keyPath + selector:(SEL)selector + userInfo:(id)userInfo + options:(NSKeyValueObservingOptions)options { + if((self = [super init])) { + observer_ = observer; + selector_ = selector; + userInfo_ = [userInfo retain]; + + target_ = target; + keyPath_ = [keyPath retain]; + + [target addObserver:self + forKeyPath:keyPath + options:options + context:GTMKeyValueObservingHelperContext]; + } + return self; +} + +- (void)dealloc { + [userInfo_ release]; + [keyPath_ release]; + [super dealloc]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context { + if(context == GTMKeyValueObservingHelperContext) { + GTMKeyValueChangeNotification *notification + = [[GTMKeyValueChangeNotification alloc] initWithKeyPath:keyPath + ofObject:object + userInfo:userInfo_ + change:change]; + [observer_ performSelector:selector_ withObject:notification]; + [notification release]; + } else { + // COV_NF_START + // There's no way this should ever be called. + // If it is, the call will go up to NSObject which will assert. + [super observeValueForKeyPath:keyPath + ofObject:object + change:change + context:context]; + // COV_NF_END + } +} + +- (void)deregister { + [target_ removeObserver:self forKeyPath:keyPath_]; +} + +@end + +@implementation GTMKeyValueObservingCenter + ++ (id)defaultCenter { + static GTMKeyValueObservingCenter *center = nil; + if(!center) { + // do a bit of clever atomic setting to make this thread safe + // if two threads try to set simultaneously, one will fail + // and the other will set things up so that the failing thread + // gets the shared center + GTMKeyValueObservingCenter *newCenter = [[self alloc] init]; + if(!objc_atomicCompareAndSwapGlobalBarrier(nil, + newCenter, + (void *)¢er)) { + [newCenter release]; // COV_NF_LINE no guarantee we'll hit this line + } + } + return center; +} + +- (id)init { + if((self = [super init])) { + observerHelpers_ = [[NSMutableDictionary alloc] init]; + } + return self; +} + +// COV_NF_START +// Singletons don't get deallocated +- (void)dealloc { + [observerHelpers_ release]; + [super dealloc]; +} +// COV_NF_END + +- (id)dictionaryKeyForObserver:(id)observer + ofObject:(id)target + forKeyPath:(NSString *)keyPath + selector:(SEL)selector { + NSString *key = [NSString stringWithFormat:@"%p:%p:%@:%p", + observer, target, keyPath, selector]; + return key; +} + +- (void)addObserver:(id)observer + ofObject:(id)target + forKeyPath:(NSString *)keyPath + selector:(SEL)selector + userInfo:(id)userInfo + options:(NSKeyValueObservingOptions)options { + GTMKeyValueObservingHelper *helper + = [[GTMKeyValueObservingHelper alloc] initWithObserver:observer + object:target + keyPath:keyPath + selector:selector + userInfo:userInfo + options:options]; + id key = [self dictionaryKeyForObserver:observer + ofObject:target + forKeyPath:keyPath + selector:selector]; + @synchronized(self) { +#if DEBUG + GTMKeyValueObservingHelper *oldHelper = [observerHelpers_ objectForKey:key]; + if (oldHelper) { + _GTMDevLog(@"%@ already observing %@ forKeyPath %@", + observer, target, keyPath); + } +#endif // DEBUG + [observerHelpers_ setObject:helper forKey:key]; + } + [helper release]; +} + +- (void)removeObserver:(id)observer + ofObject:(id)target + forKeyPath:(NSString *)keyPath + selector:(SEL)selector { + id key = [self dictionaryKeyForObserver:observer + ofObject:target + forKeyPath:keyPath + selector:selector]; + GTMKeyValueObservingHelper *helper = nil; + @synchronized(self) { + helper = [[observerHelpers_ objectForKey:key] retain]; +#if DEBUG + if (!helper) { + _GTMDevLog(@"%@ was not observing %@ with keypath %@", + observer, target, keyPath); + } +#endif // DEBUG + [observerHelpers_ removeObjectForKey:key]; + } + [helper deregister]; + [helper release]; +} + +@end + +@implementation NSObject (GTMKeyValueObservingAdditions) + +- (void)gtm_addObserver:(id)observer + forKeyPath:(NSString *)keyPath + selector:(SEL)selector + userInfo:(id)userInfo + options:(NSKeyValueObservingOptions)options { + _GTMDevAssert(observer && [keyPath length] && selector, + @"Missing observer, keyPath, or selector"); + GTMKeyValueObservingCenter *center + = [GTMKeyValueObservingCenter defaultCenter]; + GTMAssertSelectorNilOrImplementedWithArguments(observer, + selector, + @encode(GTMKeyValueChangeNotification *), + NULL); + [center addObserver:observer + ofObject:self + forKeyPath:keyPath + selector:selector + userInfo:userInfo + options:options]; +} + +- (void)gtm_removeObserver:(id)observer + forKeyPath:(NSString *)keyPath + selector:(SEL)selector { + _GTMDevAssert(observer && [keyPath length] && selector, + @"Missing observer, keyPath, or selector"); + GTMKeyValueObservingCenter *center + = [GTMKeyValueObservingCenter defaultCenter]; + GTMAssertSelectorNilOrImplementedWithArguments(observer, + selector, + @encode(GTMKeyValueChangeNotification *), + NULL); + [center removeObserver:observer + ofObject:self + forKeyPath:keyPath + selector:selector]; +} + +@end + + +@implementation GTMKeyValueChangeNotification + +- (id)initWithKeyPath:(NSString *)keyPath ofObject:(id)object + userInfo:(id)userInfo change:(NSDictionary *)change { + if ((self = [super init])) { + keyPath_ = [keyPath copy]; + object_ = [object retain]; + userInfo_ = [userInfo retain]; + change_ = [change retain]; + } + return self; +} + +- (void)dealloc { + [keyPath_ release]; + [object_ release]; + [userInfo_ release]; + [change_ release]; + [super dealloc]; +} + +- (id)copyWithZone:(NSZone *)zone { + return [[[self class] allocWithZone:zone] initWithKeyPath:keyPath_ + ofObject:object_ + userInfo:userInfo_ + change:change_]; +} + +- (BOOL)isEqual:(id)object { + return ([keyPath_ isEqualToString:[object keyPath]] + && [object_ isEqual:[object object]] + && [userInfo_ isEqual:[object userInfo]] + && [change_ isEqual:[object change]]); +} + +- (NSUInteger)hash { + return [keyPath_ hash] + [object_ hash] + [userInfo_ hash] + [change_ hash]; +} + +- (NSString *)keyPath { + return keyPath_; +} + +- (id)object { + return object_; +} + +- (id)userInfo { + return userInfo_; +} + +- (NSDictionary *)change { + return change_; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObservingTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObservingTest.m new file mode 100644 index 00000000..b97f7ff7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSObject+KeyValueObservingTest.m @@ -0,0 +1,106 @@ +// +// GTMNSObject+KeyValueObservingTest.m +// +// Copyright 2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// +// Tester.m +// MAKVONotificationCenter +// +// Created by Michael Ash on 10/15/08. +// + +// This code is based on code by Michael Ash. +// See comment in header. + +#import "GTMSenTestCase.h" +#import "GTMNSObject+KeyValueObserving.h" +#import "GTMDefines.h" +#import "GTMUnitTestDevLog.h" + +@interface GTMNSObject_KeyValueObservingTest : GTMTestCase { + int32_t count_; + NSMutableDictionary *dict_; + __weak NSString *expectedValue_; +} +@end + +@implementation GTMNSObject_KeyValueObservingTest +- (void)setUp { + dict_ = [[NSMutableDictionary alloc] initWithObjectsAndKeys: + @"foo", @"key", + nil]; +} + +- (void)tearDown { + [dict_ release]; +} + +- (void)testSingleChange { + [dict_ gtm_addObserver:self + forKeyPath:@"key" + selector:@selector(observeValueChange:) + userInfo:@"userInfo" + options:NSKeyValueObservingOptionNew]; + expectedValue_ = @"bar"; + [dict_ setObject:expectedValue_ forKey:@"key"]; + STAssertEquals(count_, (int32_t)1, nil); + [dict_ gtm_removeObserver:self + forKeyPath:@"key" + selector:@selector(observeValueChange:)]; + [dict_ setObject:@"foo" forKey:@"key"]; + STAssertEquals(count_, (int32_t)1, nil); +} + +- (void)testRemoving { + [GTMUnitTestDevLogDebug expectPattern:@"-\\[GTMNSObject_KeyValueObservingTest" + @" testRemoving\\] was not observing.*"]; + + [dict_ gtm_removeObserver:self + forKeyPath:@"key" + selector:@selector(observeValueChange:)]; +} + +- (void)testAdding { + [dict_ gtm_addObserver:self + forKeyPath:@"key" + selector:@selector(observeValueChange:) + userInfo:@"userInfo" + options:NSKeyValueObservingOptionNew]; + [GTMUnitTestDevLogDebug expectPattern:@"-\\[GTMNSObject_KeyValueObservingTest" + @" testAdding\\] already observing.*"]; + [dict_ gtm_addObserver:self + forKeyPath:@"key" + selector:@selector(observeValueChange:) + userInfo:@"userInfo" + options:NSKeyValueObservingOptionNew]; +} + +- (void)observeValueChange:(GTMKeyValueChangeNotification *)notification { + STAssertEqualObjects([notification userInfo], @"userInfo", nil); + STAssertEqualObjects([notification keyPath], @"key", nil); + STAssertEqualObjects([notification object], dict_, nil); + NSDictionary *change = [notification change]; + NSString *value = [change objectForKey:NSKeyValueChangeNewKey]; + STAssertEqualObjects(value, expectedValue_, nil); + ++count_; + + GTMKeyValueChangeNotification *copy = [[notification copy] autorelease]; + STAssertEqualObjects(notification, copy, nil); + STAssertEquals([notification hash], [copy hash], nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolder.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolder.h new file mode 100644 index 00000000..1b4d362f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolder.h @@ -0,0 +1,55 @@ +// +// GTMNSString+FindFolder.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +@interface NSString (GTMStringFindFolderAdditions) + +// Create a path to a folder located with FindFolder +// +// Args: +// theFolderType: one of the folder types in Folders.h +// (kPreferencesFolderType, etc) +// theDomain: one of the domains in Folders.h (kLocalDomain, kUserDomain, etc) +// doCreate: create the folder if it does not already exist +// +// Returns: +// full path to folder, or nil if the folder doesn't exist or can't be created +// ++ (NSString *)gtm_stringWithPathForFolder:(OSType)theFolderType + inDomain:(short)theDomain + doCreate:(BOOL)doCreate; + +// Create a path to a folder inside a folder located with FindFolder +// +// Args: +// theFolderType: one of the folder types in Folders.h +// (kPreferencesFolderType, etc) +// subfolderName: name of directory inside the Apple folder to be located or created +// theDomain: one of the domains in Folders.h (kLocalDomain, kUserDomain, etc) +// doCreate: create the folder if it does not already exist +// +// Returns: +// full path to subdirectory, or nil if the folder doesn't exist or can't be created +// ++ (NSString *)gtm_stringWithPathForFolder:(OSType)theFolderType + subfolderName:(NSString *)subfolderName + inDomain:(short)theDomain + doCreate:(BOOL)doCreate; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolder.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolder.m new file mode 100644 index 00000000..3a44174f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolder.m @@ -0,0 +1,78 @@ +// +// GTMNSString+FindFolder.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSString+FindFolder.h" +#import "GTMGarbageCollection.h" + +@implementation NSString (GTMStringFindFolderAdditions) + ++ (NSString *)gtm_stringWithPathForFolder:(OSType)theFolderType + inDomain:(short)theDomain + doCreate:(BOOL)doCreate { + + NSString* folderPath = nil; + FSRef folderRef; + + OSErr err = FSFindFolder(theDomain, theFolderType, doCreate, &folderRef); + if (err == noErr) { + + CFURLRef folderURL = CFURLCreateFromFSRef(kCFAllocatorSystemDefault, + &folderRef); + if (folderURL) { + folderPath = GTMCFAutorelease(CFURLCopyFileSystemPath(folderURL, + kCFURLPOSIXPathStyle)); + CFRelease(folderURL); + } + } + return folderPath; +} + ++ (NSString *)gtm_stringWithPathForFolder:(OSType)theFolderType + subfolderName:(NSString *)subfolderName + inDomain:(short)theDomain + doCreate:(BOOL)doCreate { + NSString *resultPath = nil; + NSString *subdirPath = nil; + NSString *parentFolderPath = [self gtm_stringWithPathForFolder:theFolderType + inDomain:theDomain + doCreate:doCreate]; + if (parentFolderPath) { + + // find the path to the subdirectory + subdirPath = [parentFolderPath stringByAppendingPathComponent:subfolderName]; + + NSFileManager* fileMgr = [NSFileManager defaultManager]; + BOOL isDir = NO; + if ([fileMgr fileExistsAtPath:subdirPath isDirectory:&isDir] && isDir) { + // it already exists + resultPath = subdirPath; + } else if (doCreate) { + + // create the subdirectory with the parent folder's attributes + NSDictionary* attrs = [fileMgr fileAttributesAtPath:parentFolderPath + traverseLink:YES]; + if ([fileMgr createDirectoryAtPath:subdirPath + attributes:attrs]) { + resultPath = subdirPath; + } + } + } + return resultPath; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolderTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolderTest.m new file mode 100644 index 00000000..66fd329e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+FindFolderTest.m @@ -0,0 +1,77 @@ +// +// GTMNSString+FindFolderTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSString+FindFolder.h" + +@interface GTMNSString_FindFolderTest : GTMTestCase +@end + +@implementation GTMNSString_FindFolderTest + +- (void)testStringWithPathForFolder { + // for gtm_stringWithPathForFolder:inDomain:doCreate: + // the parameters all get passed through to FSFindFolder so there's no point testing + // other combinations; our semantics will match FSFindFolder's + NSString *prefsPath = [NSString gtm_stringWithPathForFolder:kPreferencesFolderType + inDomain:kUserDomain + doCreate:NO]; + NSString *realPrefsPath = [@"~/Library/Preferences" stringByExpandingTildeInPath]; + STAssertEqualObjects(realPrefsPath, prefsPath, @"Found incorrect prefs path"); + + + // test the subfolder method; it should return nil if we pass NO and the + // subfolder doesn't already exist + + NSString *googCacheNoCreatePath = [NSString gtm_stringWithPathForFolder:kCachedDataFolderType + subfolderName:@"GTMUnitTestDuzntExist" + inDomain:kUserDomain + doCreate:NO]; + STAssertNil(googCacheNoCreatePath, @"Should not exist: %@", googCacheNoCreatePath); + + // test creating ~/Library/Cache/GTMUnitTestCreated + + NSString *folderName = @"GTMUnitTestCreated"; + NSString *gtmCachePath = [NSString gtm_stringWithPathForFolder:kCachedDataFolderType + subfolderName:folderName + inDomain:kUserDomain + doCreate:YES]; + NSString *testPath = [NSString gtm_stringWithPathForFolder:kCachedDataFolderType + inDomain:kUserDomain + doCreate:NO]; + NSString *testPathAppended = [testPath stringByAppendingPathComponent:folderName]; + STAssertEqualObjects(gtmCachePath, testPathAppended, @"Unexpected path name"); + + NSFileManager* fileMgr = [NSFileManager defaultManager]; + BOOL isDir = NO; + BOOL pathExists = [fileMgr fileExistsAtPath:gtmCachePath isDirectory:&isDir] && isDir; + STAssertTrue(pathExists, @"Path %@ is not existing like it should", gtmCachePath); + + // test finding it again w/o having to create it + NSString *gtmCachePath2 = [NSString gtm_stringWithPathForFolder:kCachedDataFolderType + subfolderName:folderName + inDomain:kUserDomain + doCreate:NO]; + STAssertEqualObjects(gtmCachePath2, gtmCachePath, nil); + + BOOL didRemove = [fileMgr removeFileAtPath:gtmCachePath + handler:nil]; + STAssertTrue(didRemove, @"Error removing %@", gtmCachePath); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTML.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTML.h new file mode 100644 index 00000000..1273cc3b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTML.h @@ -0,0 +1,66 @@ +// +// GTMNSString+HTML.h +// Dealing with NSStrings that contain HTML +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +/// Utilities for NSStrings containing HTML +@interface NSString (GTMNSStringHTMLAdditions) + +/// Get a string where internal characters that need escaping for HTML are escaped +// +/// For example, '&' become '&'. This will only cover characters from table +/// A.2.2 of http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters +/// which is what you want for a unicode encoded webpage. If you have a ascii +/// or non-encoded webpage, please use stringByEscapingAsciiHTML which will +/// encode all characters. +/// +/// For obvious reasons this call is only safe once. +// +// Returns: +// Autoreleased NSString +// +- (NSString *)gtm_stringByEscapingForHTML; + +/// Get a string where internal characters that need escaping for HTML are escaped +// +/// For example, '&' become '&' +/// All non-mapped characters (unicode that don't have a &keyword; mapping) +/// will be converted to the appropriate &#xxx; value. If your webpage is +/// unicode encoded (UTF16 or UTF8) use stringByEscapingHTML instead as it is +/// faster, and produces less bloated and more readable HTML (as long as you +/// are using a unicode compliant HTML reader). +/// +/// For obvious reasons this call is only safe once. +// +// Returns: +// Autoreleased NSString +// +- (NSString *)gtm_stringByEscapingForAsciiHTML; + +/// Get a string where internal characters that are escaped for HTML are unescaped +// +/// For example, '&' becomes '&' +/// Handles and 2 cases as well +/// +// Returns: +// Autoreleased NSString +// +- (NSString *)gtm_stringByUnescapingFromHTML; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTML.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTML.m new file mode 100644 index 00000000..6853df07 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTML.m @@ -0,0 +1,522 @@ +// +// GTMNSString+HTML.m +// Dealing with NSStrings that contain HTML +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" +#import "GTMNSString+HTML.h" + +typedef struct { + NSString *escapeSequence; + unichar uchar; +} HTMLEscapeMap; + +// Taken from http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters +// Ordered by uchar lowest to highest for bsearching +static HTMLEscapeMap gAsciiHTMLEscapeMap[] = { + // A.2.2. Special characters + { @""", 34 }, + { @"&", 38 }, + { @"'", 39 }, + { @"<", 60 }, + { @">", 62 }, + + // A.2.1. Latin-1 characters + { @" ", 160 }, + { @"¡", 161 }, + { @"¢", 162 }, + { @"£", 163 }, + { @"¤", 164 }, + { @"¥", 165 }, + { @"¦", 166 }, + { @"§", 167 }, + { @"¨", 168 }, + { @"©", 169 }, + { @"ª", 170 }, + { @"«", 171 }, + { @"¬", 172 }, + { @"­", 173 }, + { @"®", 174 }, + { @"¯", 175 }, + { @"°", 176 }, + { @"±", 177 }, + { @"²", 178 }, + { @"³", 179 }, + { @"´", 180 }, + { @"µ", 181 }, + { @"¶", 182 }, + { @"·", 183 }, + { @"¸", 184 }, + { @"¹", 185 }, + { @"º", 186 }, + { @"»", 187 }, + { @"¼", 188 }, + { @"½", 189 }, + { @"¾", 190 }, + { @"¿", 191 }, + { @"À", 192 }, + { @"Á", 193 }, + { @"Â", 194 }, + { @"Ã", 195 }, + { @"Ä", 196 }, + { @"Å", 197 }, + { @"Æ", 198 }, + { @"Ç", 199 }, + { @"È", 200 }, + { @"É", 201 }, + { @"Ê", 202 }, + { @"Ë", 203 }, + { @"Ì", 204 }, + { @"Í", 205 }, + { @"Î", 206 }, + { @"Ï", 207 }, + { @"Ð", 208 }, + { @"Ñ", 209 }, + { @"Ò", 210 }, + { @"Ó", 211 }, + { @"Ô", 212 }, + { @"Õ", 213 }, + { @"Ö", 214 }, + { @"×", 215 }, + { @"Ø", 216 }, + { @"Ù", 217 }, + { @"Ú", 218 }, + { @"Û", 219 }, + { @"Ü", 220 }, + { @"Ý", 221 }, + { @"Þ", 222 }, + { @"ß", 223 }, + { @"à", 224 }, + { @"á", 225 }, + { @"â", 226 }, + { @"ã", 227 }, + { @"ä", 228 }, + { @"å", 229 }, + { @"æ", 230 }, + { @"ç", 231 }, + { @"è", 232 }, + { @"é", 233 }, + { @"ê", 234 }, + { @"ë", 235 }, + { @"ì", 236 }, + { @"í", 237 }, + { @"î", 238 }, + { @"ï", 239 }, + { @"ð", 240 }, + { @"ñ", 241 }, + { @"ò", 242 }, + { @"ó", 243 }, + { @"ô", 244 }, + { @"õ", 245 }, + { @"ö", 246 }, + { @"÷", 247 }, + { @"ø", 248 }, + { @"ù", 249 }, + { @"ú", 250 }, + { @"û", 251 }, + { @"ü", 252 }, + { @"ý", 253 }, + { @"þ", 254 }, + { @"ÿ", 255 }, + + // A.2.2. Special characters cont'd + { @"Œ", 338 }, + { @"œ", 339 }, + { @"Š", 352 }, + { @"š", 353 }, + { @"Ÿ", 376 }, + + // A.2.3. Symbols + { @"ƒ", 402 }, + + // A.2.2. Special characters cont'd + { @"ˆ", 710 }, + { @"˜", 732 }, + + // A.2.3. Symbols cont'd + { @"Α", 913 }, + { @"Β", 914 }, + { @"Γ", 915 }, + { @"Δ", 916 }, + { @"Ε", 917 }, + { @"Ζ", 918 }, + { @"Η", 919 }, + { @"Θ", 920 }, + { @"Ι", 921 }, + { @"Κ", 922 }, + { @"Λ", 923 }, + { @"Μ", 924 }, + { @"Ν", 925 }, + { @"Ξ", 926 }, + { @"Ο", 927 }, + { @"Π", 928 }, + { @"Ρ", 929 }, + { @"Σ", 931 }, + { @"Τ", 932 }, + { @"Υ", 933 }, + { @"Φ", 934 }, + { @"Χ", 935 }, + { @"Ψ", 936 }, + { @"Ω", 937 }, + { @"α", 945 }, + { @"β", 946 }, + { @"γ", 947 }, + { @"δ", 948 }, + { @"ε", 949 }, + { @"ζ", 950 }, + { @"η", 951 }, + { @"θ", 952 }, + { @"ι", 953 }, + { @"κ", 954 }, + { @"λ", 955 }, + { @"μ", 956 }, + { @"ν", 957 }, + { @"ξ", 958 }, + { @"ο", 959 }, + { @"π", 960 }, + { @"ρ", 961 }, + { @"ς", 962 }, + { @"σ", 963 }, + { @"τ", 964 }, + { @"υ", 965 }, + { @"φ", 966 }, + { @"χ", 967 }, + { @"ψ", 968 }, + { @"ω", 969 }, + { @"ϑ", 977 }, + { @"ϒ", 978 }, + { @"ϖ", 982 }, + + // A.2.2. Special characters cont'd + { @" ", 8194 }, + { @" ", 8195 }, + { @" ", 8201 }, + { @"‌", 8204 }, + { @"‍", 8205 }, + { @"‎", 8206 }, + { @"‏", 8207 }, + { @"–", 8211 }, + { @"—", 8212 }, + { @"‘", 8216 }, + { @"’", 8217 }, + { @"‚", 8218 }, + { @"“", 8220 }, + { @"”", 8221 }, + { @"„", 8222 }, + { @"†", 8224 }, + { @"‡", 8225 }, + // A.2.3. Symbols cont'd + { @"•", 8226 }, + { @"…", 8230 }, + + // A.2.2. Special characters cont'd + { @"‰", 8240 }, + + // A.2.3. Symbols cont'd + { @"′", 8242 }, + { @"″", 8243 }, + + // A.2.2. Special characters cont'd + { @"‹", 8249 }, + { @"›", 8250 }, + + // A.2.3. Symbols cont'd + { @"‾", 8254 }, + { @"⁄", 8260 }, + + // A.2.2. Special characters cont'd + { @"€", 8364 }, + + // A.2.3. Symbols cont'd + { @"ℑ", 8465 }, + { @"℘", 8472 }, + { @"ℜ", 8476 }, + { @"™", 8482 }, + { @"ℵ", 8501 }, + { @"←", 8592 }, + { @"↑", 8593 }, + { @"→", 8594 }, + { @"↓", 8595 }, + { @"↔", 8596 }, + { @"↵", 8629 }, + { @"⇐", 8656 }, + { @"⇑", 8657 }, + { @"⇒", 8658 }, + { @"⇓", 8659 }, + { @"⇔", 8660 }, + { @"∀", 8704 }, + { @"∂", 8706 }, + { @"∃", 8707 }, + { @"∅", 8709 }, + { @"∇", 8711 }, + { @"∈", 8712 }, + { @"∉", 8713 }, + { @"∋", 8715 }, + { @"∏", 8719 }, + { @"∑", 8721 }, + { @"−", 8722 }, + { @"∗", 8727 }, + { @"√", 8730 }, + { @"∝", 8733 }, + { @"∞", 8734 }, + { @"∠", 8736 }, + { @"∧", 8743 }, + { @"∨", 8744 }, + { @"∩", 8745 }, + { @"∪", 8746 }, + { @"∫", 8747 }, + { @"∴", 8756 }, + { @"∼", 8764 }, + { @"≅", 8773 }, + { @"≈", 8776 }, + { @"≠", 8800 }, + { @"≡", 8801 }, + { @"≤", 8804 }, + { @"≥", 8805 }, + { @"⊂", 8834 }, + { @"⊃", 8835 }, + { @"⊄", 8836 }, + { @"⊆", 8838 }, + { @"⊇", 8839 }, + { @"⊕", 8853 }, + { @"⊗", 8855 }, + { @"⊥", 8869 }, + { @"⋅", 8901 }, + { @"⌈", 8968 }, + { @"⌉", 8969 }, + { @"⌊", 8970 }, + { @"⌋", 8971 }, + { @"⟨", 9001 }, + { @"⟩", 9002 }, + { @"◊", 9674 }, + { @"♠", 9824 }, + { @"♣", 9827 }, + { @"♥", 9829 }, + { @"♦", 9830 } +}; + +// Taken from http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters +// This is table A.2.2 Special Characters +static HTMLEscapeMap gUnicodeHTMLEscapeMap[] = { + // C0 Controls and Basic Latin + { @""", 34 }, + { @"&", 38 }, + { @"'", 39 }, + { @"<", 60 }, + { @">", 62 }, + + // Latin Extended-A + { @"Œ", 338 }, + { @"œ", 339 }, + { @"Š", 352 }, + { @"š", 353 }, + { @"Ÿ", 376 }, + + // Spacing Modifier Letters + { @"ˆ", 710 }, + { @"˜", 732 }, + + // General Punctuation + { @" ", 8194 }, + { @" ", 8195 }, + { @" ", 8201 }, + { @"‌", 8204 }, + { @"‍", 8205 }, + { @"‎", 8206 }, + { @"‏", 8207 }, + { @"–", 8211 }, + { @"—", 8212 }, + { @"‘", 8216 }, + { @"’", 8217 }, + { @"‚", 8218 }, + { @"“", 8220 }, + { @"”", 8221 }, + { @"„", 8222 }, + { @"†", 8224 }, + { @"‡", 8225 }, + { @"‰", 8240 }, + { @"‹", 8249 }, + { @"›", 8250 }, + { @"€", 8364 }, +}; + + +// Utility function for Bsearching table above +static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) { + const unichar *uchar = (const unichar*)ucharVoid; + const HTMLEscapeMap *map = (const HTMLEscapeMap*)mapVoid; + int val; + if (*uchar > map->uchar) { + val = 1; + } else if (*uchar < map->uchar) { + val = -1; + } else { + val = 0; + } + return val; +} + +@implementation NSString (GTMNSStringHTMLAdditions) + +- (NSString *)gtm_stringByEscapingHTMLUsingTable:(HTMLEscapeMap*)table + ofSize:(NSUInteger)size + escapingUnicode:(BOOL)escapeUnicode { + NSUInteger length = [self length]; + if (!length) { + return self; + } + + NSMutableString *finalString = [NSMutableString string]; + NSMutableData *data2 = [NSMutableData dataWithCapacity:sizeof(unichar) * length]; + + // this block is common between GTMNSString+HTML and GTMNSString+XML but + // it's so short that it isn't really worth trying to share. + const unichar *buffer = CFStringGetCharactersPtr((CFStringRef)self); + if (!buffer) { + // We want this buffer to be autoreleased. + NSMutableData *data = [NSMutableData dataWithLength:length * sizeof(UniChar)]; + if (!data) { + // COV_NF_START - Memory fail case + _GTMDevLog(@"couldn't alloc buffer"); + return nil; + // COV_NF_END + } + [self getCharacters:[data mutableBytes]]; + buffer = [data bytes]; + } + + if (!buffer || !data2) { + // COV_NF_START + _GTMDevLog(@"Unable to allocate buffer or data2"); + return nil; + // COV_NF_END + } + + unichar *buffer2 = (unichar *)[data2 mutableBytes]; + + NSUInteger buffer2Length = 0; + + for (NSUInteger i = 0; i < length; ++i) { + HTMLEscapeMap *val = bsearch(&buffer[i], table, + size / sizeof(HTMLEscapeMap), + sizeof(HTMLEscapeMap), EscapeMapCompare); + if (val || (escapeUnicode && buffer[i] > 127)) { + if (buffer2Length) { + CFStringAppendCharacters((CFMutableStringRef)finalString, + buffer2, + buffer2Length); + buffer2Length = 0; + } + if (val) { + [finalString appendString:val->escapeSequence]; + } + else { + _GTMDevAssert(escapeUnicode && buffer[i] > 127, @"Illegal Character"); + [finalString appendFormat:@"&#%d;", buffer[i]]; + } + } else { + buffer2[buffer2Length] = buffer[i]; + buffer2Length += 1; + } + } + if (buffer2Length) { + CFStringAppendCharacters((CFMutableStringRef)finalString, + buffer2, + buffer2Length); + } + return finalString; +} + +- (NSString *)gtm_stringByEscapingForHTML { + return [self gtm_stringByEscapingHTMLUsingTable:gUnicodeHTMLEscapeMap + ofSize:sizeof(gUnicodeHTMLEscapeMap) + escapingUnicode:NO]; +} // gtm_stringByEscapingHTML + +- (NSString *)gtm_stringByEscapingForAsciiHTML { + return [self gtm_stringByEscapingHTMLUsingTable:gAsciiHTMLEscapeMap + ofSize:sizeof(gAsciiHTMLEscapeMap) + escapingUnicode:YES]; +} // gtm_stringByEscapingAsciiHTML + +- (NSString *)gtm_stringByUnescapingFromHTML { + NSRange range = NSMakeRange(0, [self length]); + NSRange subrange = [self rangeOfString:@"&" options:NSBackwardsSearch range:range]; + + // if no ampersands, we've got a quick way out + if (subrange.length == 0) return self; + NSMutableString *finalString = [NSMutableString stringWithString:self]; + do { + NSRange semiColonRange = NSMakeRange(subrange.location, NSMaxRange(range) - subrange.location); + semiColonRange = [self rangeOfString:@";" options:0 range:semiColonRange]; + range = NSMakeRange(0, subrange.location); + // if we don't find a semicolon in the range, we don't have a sequence + if (semiColonRange.location == NSNotFound) { + continue; + } + NSRange escapeRange = NSMakeRange(subrange.location, semiColonRange.location - subrange.location + 1); + NSString *escapeString = [self substringWithRange:escapeRange]; + NSUInteger length = [escapeString length]; + // a squence must be longer than 3 (<) and less than 11 (ϑ) + if (length > 3 && length < 11) { + if ([escapeString characterAtIndex:1] == '#') { + unichar char2 = [escapeString characterAtIndex:2]; + if (char2 == 'x' || char2 == 'X') { + // Hex escape squences £ + NSString *hexSequence = [escapeString substringWithRange:NSMakeRange(3, length - 4)]; + NSScanner *scanner = [NSScanner scannerWithString:hexSequence]; + unsigned value; + if ([scanner scanHexInt:&value] && + value < USHRT_MAX && + value > 0 + && [scanner scanLocation] == length - 4) { + unichar uchar = value; + NSString *charString = [NSString stringWithCharacters:&uchar length:1]; + [finalString replaceCharactersInRange:escapeRange withString:charString]; + } + + } else { + // Decimal Sequences { + NSString *numberSequence = [escapeString substringWithRange:NSMakeRange(2, length - 3)]; + NSScanner *scanner = [NSScanner scannerWithString:numberSequence]; + int value; + if ([scanner scanInt:&value] && + value < USHRT_MAX && + value > 0 + && [scanner scanLocation] == length - 3) { + unichar uchar = value; + NSString *charString = [NSString stringWithCharacters:&uchar length:1]; + [finalString replaceCharactersInRange:escapeRange withString:charString]; + } + } + } else { + // "standard" sequences + for (unsigned i = 0; i < sizeof(gAsciiHTMLEscapeMap) / sizeof(HTMLEscapeMap); ++i) { + if ([escapeString isEqualToString:gAsciiHTMLEscapeMap[i].escapeSequence]) { + [finalString replaceCharactersInRange:escapeRange withString:[NSString stringWithCharacters:&gAsciiHTMLEscapeMap[i].uchar length:1]]; + break; + } + } + } + } + } while ((subrange = [self rangeOfString:@"&" options:NSBackwardsSearch range:range]).length != 0); + return finalString; +} // gtm_stringByUnescapingHTML + + + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTMLTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTMLTest.m new file mode 100644 index 00000000..1c7baf01 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+HTMLTest.m @@ -0,0 +1,242 @@ +// +// GTMNSString+HTMLTest.m +// +// Copyright 2005-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSString+HTML.h" + +@interface GTMNSString_HTMLTest : GTMTestCase +@end + +@implementation GTMNSString_HTMLTest + +- (void)testStringByEscapingHTML { + unichar chars[] = + { 34, 38, 39, 60, 62, 338, 339, 352, 353, 376, 710, 732, + 8194, 8195, 8201, 8204, 8205, 8206, 8207, 8211, 8212, 8216, 8217, 8218, + 8220, 8221, 8222, 8224, 8225, 8240, 8249, 8250, 8364, }; + + NSString *string1 = [NSString stringWithCharacters:chars + length:sizeof(chars) / sizeof(unichar)]; + NSString *string2 = + @""&'<>ŒœŠšŸ" + "ˆ˜   ‌‍‎‏–" + "—‘’‚“”„†‡" + "‰‹›€"; + + STAssertEqualObjects([string1 gtm_stringByEscapingForHTML], + string2, + @"HTML escaping failed"); + + STAssertEqualObjects([@"" gtm_stringByEscapingForHTML], + @"<this & that>", + @"HTML escaping failed"); + NSString *string = [NSString stringWithUTF8String:"パン・&ド・カンパーニュ"]; + NSString *escapeStr = [NSString stringWithUTF8String:"パン・&ド・カンパーニュ"]; + STAssertEqualObjects([string gtm_stringByEscapingForHTML], + escapeStr, + @"HTML escaping failed"); + + string = [NSString stringWithUTF8String:"abcا1ب<تdef&"]; + STAssertEqualObjects([string gtm_stringByEscapingForHTML], + [NSString stringWithUTF8String:"abcا1ب<تdef&"], + @"HTML escaping failed"); + + // test empty string + STAssertEqualObjects([@"" gtm_stringByEscapingForHTML], @"", nil); +} // testStringByEscapingHTML + +- (void)testStringByEscapingAsciiHTML { + unichar chars[] = + { 34, 38, 39, 60, 62, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 338, 339, 352, 353, 376, + 402, 710, 732, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, + 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 965, 966, 967, 968, 969, 977, 978, 982, 8194, 8195, 8201, 8204, + 8205, 8206, 8207, 8211, 8212, 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, + 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8254, 8260, 8364, 8472, 8465, 8476, + 8482, 8501, 8592, 8593, 8594, 8595, 8596, 8629, 8656, 8657, 8658, 8659, 8660, + 8704, 8706, 8707, 8709, 8711, 8712, 8713, 8715, 8719, 8721, 8722, 8727, 8730, + 8733, 8734, 8736, 8743, 8744, 8745, 8746, 8747, 8756, 8764, 8773, 8776, 8800, + 8801, 8804, 8805, 8834, 8835, 8836, 8838, 8839, 8853, 8855, 8869, 8901, 8968, + 8969, 8970, 8971, 9001, 9002, 9674, 9824, 9827, 9829, 9830 }; + + NSString *string1 = [NSString stringWithCharacters:chars + length:sizeof(chars) / sizeof(unichar)]; + NSString *string2 = + @""&'<> ¡¢£¤¥" + "¦§¨©ª«¬­®¯°" + "±²³´µ¶·¸¹" + "º»¼½¾¿ÀÁ" + "ÂÃÄÅÆÇÈÉ" + "ÊËÌÍÎÏÐÑÒ" + "ÓÔÕÖ×ØÙÚ" + "ÛÜÝÞßàáâã" + "äåæçèéêëì" + "íîïðñòóôõ" + "ö÷øùúûüýþ" + "ÿŒœŠšŸƒˆ˜" + "ΑΒΓΔΕΖΗΘΙ" + "ΚΛΜΝΞΟΠΡΣΤ" + "ΥΦΧΨΩαβγδ" + "εζηθικλμνξ" + "οπρςστυφχψ" + "ωϑϒϖ   ‌‍" + "‎‏–—‘’‚“”" + "„†‡•…‰′″" + "‹›‾⁄€℘ℑℜ™" + "ℵ←↑→↓↔↵⇐⇑⇒" + "⇓⇔∀∂∃∅∇∈∉∋" + "∏∑−∗√∝∞∠∧∨" + "∩∪∫∴∼≅≈≠≡≤≥" + "⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈" + "⌉⌊⌋⟨⟩◊♠♣♥" + "♦"; + + STAssertEqualObjects([string1 gtm_stringByEscapingForAsciiHTML], + string2, + @"HTML escaping failed"); + + STAssertEqualObjects([@"" gtm_stringByEscapingForAsciiHTML], + @"<this & that>", + @"HTML escaping failed"); + NSString *string = [NSString stringWithUTF8String:"パン・ド・カンパーニュ"]; + STAssertEqualObjects([string gtm_stringByEscapingForAsciiHTML], + @"パン・ド・カ" + "ンパーニュ", + @"HTML escaping failed"); + + // Mix in some right - to left + string = [NSString stringWithUTF8String:"abcا1ب<تdef&"]; + STAssertEqualObjects([string gtm_stringByEscapingForAsciiHTML], + @"abcا1ب<تdef&", + @"HTML escaping failed"); +} // stringByEscapingAsciiHTML + +- (void)testStringByUnescapingHTML { + NSString *string1 = + @""&'<> ¡¢£¤¥" + "¦§¨©ª«¬­®¯°" + "±²³´µ¶·¸¹" + "º»¼½¾¿ÀÁ" + "ÂÃÄÅÆÇÈÉ" + "ÊËÌÍÎÏÐÑÒ" + "ÓÔÕÖ×ØÙÚ" + "ÛÜÝÞßàáâã" + "äåæçèéêëì" + "íîïðñòóôõ" + "ö÷øùúûüýþ" + "ÿŒœŠšŸƒˆ˜" + "ΑΒΓΔΕΖΗΘΙ" + "ΚΛΜΝΞΟΠΡΣΤ" + "ΥΦΧΨΩαβγδ" + "εζηθικλμνξ" + "οπρςστυφχψ" + "ωϑϒϖ   ‌‍" + "‎‏–—‘’‚“”" + "„†‡•…‰′″" + "‹›‾⁄€℘ℑℜ™" + "ℵ←↑→↓↔↵⇐⇑⇒" + "⇓⇔∀∂∃∅∇∈∉∋" + "∏∑−∗√∝∞∠∧∨" + "∩∪∫∴∼≅≈≠≡≤≥" + "⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈" + "⌉⌊⌋⟨⟩◊♠♣♥" + "♦"; + + unichar chars[] = + { 34, 38, 39, 60, 62, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 338, 339, 352, 353, 376, + 402, 710, 732, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, + 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 965, 966, 967, 968, 969, 977, 978, 982, 8194, 8195, 8201, 8204, + 8205, 8206, 8207, 8211, 8212, 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, + 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8254, 8260, 8364, 8472, 8465, 8476, + 8482, 8501, 8592, 8593, 8594, 8595, 8596, 8629, 8656, 8657, 8658, 8659, 8660, + 8704, 8706, 8707, 8709, 8711, 8712, 8713, 8715, 8719, 8721, 8722, 8727, 8730, + 8733, 8734, 8736, 8743, 8744, 8745, 8746, 8747, 8756, 8764, 8773, 8776, 8800, + 8801, 8804, 8805, 8834, 8835, 8836, 8838, 8839, 8853, 8855, 8869, 8901, 8968, + 8969, 8970, 8971, 9001, 9002, 9674, 9824, 9827, 9829, 9830 }; + + NSString *string2 = [NSString stringWithCharacters:chars + length:sizeof(chars) / sizeof(unichar)]; + STAssertEqualObjects([string1 gtm_stringByUnescapingFromHTML], + string2, + @"HTML unescaping failed"); + + STAssertEqualObjects([@"ABC" gtm_stringByUnescapingFromHTML], + @"ABC", @"HTML unescaping failed"); + + STAssertEqualObjects([@"" gtm_stringByUnescapingFromHTML], + @"", @"HTML unescaping failed"); + + STAssertEqualObjects([@"A&Bang;C" gtm_stringByUnescapingFromHTML], + @"A&Bang;C", @"HTML unescaping failed"); + + STAssertEqualObjects([@"A&Bang;C" gtm_stringByUnescapingFromHTML], + @"A&Bang;C", @"HTML unescaping failed"); + + STAssertEqualObjects([@"A&Bang;C" gtm_stringByUnescapingFromHTML], + @"A&Bang;C", @"HTML unescaping failed"); + + STAssertEqualObjects([@"AA;" gtm_stringByUnescapingFromHTML], + @"AA;", @"HTML unescaping failed"); + + STAssertEqualObjects([@"&" gtm_stringByUnescapingFromHTML], + @"&", @"HTML unescaping failed"); + + STAssertEqualObjects([@"&;" gtm_stringByUnescapingFromHTML], + @"&;", @"HTML unescaping failed"); + + STAssertEqualObjects([@"&x;" gtm_stringByUnescapingFromHTML], + @"&x;", @"HTML unescaping failed"); + + STAssertEqualObjects([@"&X;" gtm_stringByUnescapingFromHTML], + @"&X;", @"HTML unescaping failed"); + + STAssertEqualObjects([@";" gtm_stringByUnescapingFromHTML], + @";", @"HTML unescaping failed"); + + STAssertEqualObjects([@"<this & that>" gtm_stringByUnescapingFromHTML], + @"", @"HTML unescaping failed"); + + +} // testStringByUnescapingHTML + +- (void)testStringRoundtrippingEscapedHTML { + NSString *string = [NSString stringWithUTF8String:"This test ©™®๒०᠐٧"]; + STAssertEqualObjects(string, + [[string gtm_stringByEscapingForHTML] gtm_stringByUnescapingFromHTML], + @"HTML Roundtripping failed"); + string = [NSString stringWithUTF8String:"This test ©™®๒०᠐٧"]; + STAssertEqualObjects(string, + [[string gtm_stringByEscapingForAsciiHTML] gtm_stringByUnescapingFromHTML], + @"HTML Roundtripping failed"); +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+Replace.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+Replace.h new file mode 100644 index 00000000..71a98c5f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+Replace.h @@ -0,0 +1,45 @@ +// +// GTMNSString+Replace.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +/// Give easy search-n-replace functionality to NSString. +@interface NSString (GTMStringReplaceAdditions) + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 +// 10.5 has stringByReplacingOccurrencesOfString:withString:, use that directly. + +/// Returns a new autoreleased string by replacing all occurrences of +// |oldString| with |newString| (case sensitive). If |oldString| is nil or +// @"" nothing is done and |self| is returned. If |newString| is nil, it's +// treated as if |newString| were the empty string, thus effectively +// deleting all occurrences of |oldString| from |self|. +// +// Args: +// target - the NSString to search for +// replacement - the NSString to replace |oldString| with +// +// Returns: +// A new autoreleased NSString +// +- (NSString *)gtm_stringByReplacingString:(NSString *)target + withString:(NSString *)replacement; + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+Replace.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+Replace.m new file mode 100644 index 00000000..ddaad5ed --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+Replace.m @@ -0,0 +1,53 @@ +// +// GTMNSString+Replace.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSString+Replace.h" + + +@implementation NSString (GTMStringReplaceAdditions) + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 +// 10.5 has stringByReplacingOccurrencesOfString:withString:, use that directly. + +- (NSString *)gtm_stringByReplacingString:(NSString *)target + withString:(NSString *)replacement { + // If |target| was nil, then do nothing and return |self| + // + // We do the retain+autorelease dance here because of this use case: + // NSString *s1 = [[NSString alloc] init...]; + // NSString *s2 = [s1 stringByReplacingString:@"foo" withString:@"bar"]; + // [s1 release]; // |s2| still needs to be valid after this line + if (!target) + return [[self retain] autorelease]; + + // If |replacement| is nil we want it to be treated as if @"" was specified + // ... effectively removing |target| from self + if (!replacement) + replacement = @""; + + NSMutableString *result = [[self mutableCopy] autorelease]; + [result replaceOccurrencesOfString:target + withString:replacement + options:0 + range:NSMakeRange(0, [result length])]; + return result; +} + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+ReplaceTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+ReplaceTest.m new file mode 100644 index 00000000..4561af66 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+ReplaceTest.m @@ -0,0 +1,59 @@ +// +// GTMNSString+ReplaceTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSString+Replace.h" + +@interface GTMNSString_ReplaceTest : GTMTestCase +@end + +@implementation GTMNSString_ReplaceTest + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +- (void)testStringByReplacingStringWithString { + NSString *testString = @"a bc debc gh"; + NSString *result; + + result = [testString gtm_stringByReplacingString:@"bc" withString:@"BC"]; + STAssertEqualObjects(@"a BC deBC gh", result, + @"'bc' wasn't replaced with 'BC'"); + + result = [testString gtm_stringByReplacingString:@"bc" withString:@""]; + STAssertEqualObjects(@"a de gh", result, @"'bc' wasn't replaced with ''"); + + result = [testString gtm_stringByReplacingString:@"bc" withString:nil]; + STAssertEqualObjects(@"a de gh", result, @"'bc' wasn't replaced with (nil)"); + + result = [testString gtm_stringByReplacingString:@" " withString:@"S"]; + STAssertEqualObjects(@"aSbcSdebcSgh", result, @"' ' wasn't replaced with 'S'"); + + result = [testString gtm_stringByReplacingString:nil withString:@"blah"]; + STAssertEqualObjects(testString, result, @"(nil) wasn't replaced with 'blah'"); + + result = [testString gtm_stringByReplacingString:nil withString:nil]; + STAssertEqualObjects(testString, result, @"(nil) wasn't replaced with (nil)"); + + result = [testString gtm_stringByReplacingString:@"" withString:@"X"]; + STAssertEqualObjects(testString, result, + @"replacing '' with anything should yield the original string"); +} + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.h new file mode 100644 index 00000000..d4c7e09a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.h @@ -0,0 +1,41 @@ +// +// GTMNSString+URLArguments.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +/// Utilities for encoding and decoding URL arguments. +@interface NSString (GTMNSStringURLArgumentsAdditions) + +/// Returns a string that is escaped properly to be a URL argument. +// +/// This differs from stringByAddingPercentEscapesUsingEncoding: in that it +/// will escape all the reserved characters (per RFC 3986 +/// ) which +/// stringByAddingPercentEscapesUsingEncoding would leave. +/// +/// This will also escape '%', so this should not be used on a string that has +/// already been escaped unless double-escaping is the desired result. +- (NSString*)gtm_stringByEscapingForURLArgument; + +/// Returns the unescaped version of a URL argument +// +/// This has the same behavior as stringByReplacingPercentEscapesUsingEncoding:, +/// except that it will also convert '+' to space. +- (NSString*)gtm_stringByUnescapingFromURLArgument; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.m new file mode 100644 index 00000000..46d2c99e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.m @@ -0,0 +1,45 @@ +// +// GTMNSString+URLArguments.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSString+URLArguments.h" +#import "GTMGarbageCollection.h" + +@implementation NSString (GTMNSStringURLArgumentsAdditions) + +- (NSString*)gtm_stringByEscapingForURLArgument { + // Encode all the reserved characters, per RFC 3986 + // () + CFStringRef escaped = + CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, + (CFStringRef)self, + NULL, + (CFStringRef)@"!*'();:@&=+$,/?%#[]", + kCFStringEncodingUTF8); + return GTMCFAutorelease(escaped); +} + +- (NSString*)gtm_stringByUnescapingFromURLArgument { + NSMutableString *resultString = [NSMutableString stringWithString:self]; + [resultString replaceOccurrencesOfString:@"+" + withString:@" " + options:NSLiteralSearch + range:NSMakeRange(0, [resultString length])]; + return [resultString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArgumentsTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArgumentsTest.m new file mode 100644 index 00000000..90a5a813 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+URLArgumentsTest.m @@ -0,0 +1,94 @@ +// +// GTMNSString+URLArgumentsTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMNSString+URLArguments.h" + +@interface GTMNSString_URLArgumentsTest : GTMTestCase +@end + +@implementation GTMNSString_URLArgumentsTest + + +- (void)testEscaping { + // should be done already by the basic code + STAssertEqualObjects([@"this that" gtm_stringByEscapingForURLArgument], @"this%20that", @"- space should be escaped"); + STAssertEqualObjects([@"this\"that" gtm_stringByEscapingForURLArgument], @"this%22that", @"- double quote should be escaped"); + // make sure our additions are handled + STAssertEqualObjects([@"this!that" gtm_stringByEscapingForURLArgument], @"this%21that", @"- exclamation mark should be escaped"); + STAssertEqualObjects([@"this*that" gtm_stringByEscapingForURLArgument], @"this%2Athat", @"- asterisk should be escaped"); + STAssertEqualObjects([@"this'that" gtm_stringByEscapingForURLArgument], @"this%27that", @"- single quote should be escaped"); + STAssertEqualObjects([@"this(that" gtm_stringByEscapingForURLArgument], @"this%28that", @"- left paren should be escaped"); + STAssertEqualObjects([@"this)that" gtm_stringByEscapingForURLArgument], @"this%29that", @"- right paren should be escaped"); + STAssertEqualObjects([@"this;that" gtm_stringByEscapingForURLArgument], @"this%3Bthat", @"- semi-colon should be escaped"); + STAssertEqualObjects([@"this:that" gtm_stringByEscapingForURLArgument], @"this%3Athat", @"- colon should be escaped"); + STAssertEqualObjects([@"this@that" gtm_stringByEscapingForURLArgument], @"this%40that", @"- at sign should be escaped"); + STAssertEqualObjects([@"this&that" gtm_stringByEscapingForURLArgument], @"this%26that", @"- ampersand should be escaped"); + STAssertEqualObjects([@"this=that" gtm_stringByEscapingForURLArgument], @"this%3Dthat", @"- equals should be escaped"); + STAssertEqualObjects([@"this+that" gtm_stringByEscapingForURLArgument], @"this%2Bthat", @"- plus should be escaped"); + STAssertEqualObjects([@"this$that" gtm_stringByEscapingForURLArgument], @"this%24that", @"- dollar-sign should be escaped"); + STAssertEqualObjects([@"this,that" gtm_stringByEscapingForURLArgument], @"this%2Cthat", @"- comma should be escaped"); + STAssertEqualObjects([@"this/that" gtm_stringByEscapingForURLArgument], @"this%2Fthat", @"- slash should be escaped"); + STAssertEqualObjects([@"this?that" gtm_stringByEscapingForURLArgument], @"this%3Fthat", @"- question mark should be escaped"); + STAssertEqualObjects([@"this%that" gtm_stringByEscapingForURLArgument], @"this%25that", @"- percent should be escaped"); + STAssertEqualObjects([@"this#that" gtm_stringByEscapingForURLArgument], @"this%23that", @"- pound should be escaped"); + STAssertEqualObjects([@"this[that" gtm_stringByEscapingForURLArgument], @"this%5Bthat", @"- left bracket should be escaped"); + STAssertEqualObjects([@"this]that" gtm_stringByEscapingForURLArgument], @"this%5Dthat", @"- right bracket should be escaped"); + // make sure plus and space are handled in the right order + STAssertEqualObjects([@"this that+the other" gtm_stringByEscapingForURLArgument], @"this%20that%2Bthe%20other", @"- pluses and spaces should be different"); + // high char test + NSString *tester = [NSString stringWithUTF8String:"caf\xC3\xA9"]; + STAssertNotNil(tester, @"failed to create from utf8 run"); + STAssertEqualObjects([tester gtm_stringByEscapingForURLArgument], @"caf%C3%A9", @"- high chars should work"); +} + +- (void)testUnescaping { + // should be done already by the basic code + STAssertEqualObjects([@"this%20that" gtm_stringByUnescapingFromURLArgument], @"this that", @"- space should be unescaped"); + STAssertEqualObjects([@"this%22that" gtm_stringByUnescapingFromURLArgument], @"this\"that", @"- double quote should be unescaped"); + // make sure our additions are handled + STAssertEqualObjects([@"this%21that" gtm_stringByUnescapingFromURLArgument], @"this!that", @"- exclamation mark should be unescaped"); + STAssertEqualObjects([@"this%2Athat" gtm_stringByUnescapingFromURLArgument], @"this*that", @"- asterisk should be unescaped"); + STAssertEqualObjects([@"this%27that" gtm_stringByUnescapingFromURLArgument], @"this'that", @"- single quote should be unescaped"); + STAssertEqualObjects([@"this%28that" gtm_stringByUnescapingFromURLArgument], @"this(that", @"- left paren should be unescaped"); + STAssertEqualObjects([@"this%29that" gtm_stringByUnescapingFromURLArgument], @"this)that", @"- right paren should be unescaped"); + STAssertEqualObjects([@"this%3Bthat" gtm_stringByUnescapingFromURLArgument], @"this;that", @"- semi-colon should be unescaped"); + STAssertEqualObjects([@"this%3Athat" gtm_stringByUnescapingFromURLArgument], @"this:that", @"- colon should be unescaped"); + STAssertEqualObjects([@"this%40that" gtm_stringByUnescapingFromURLArgument], @"this@that", @"- at sign should be unescaped"); + STAssertEqualObjects([@"this%26that" gtm_stringByUnescapingFromURLArgument], @"this&that", @"- ampersand should be unescaped"); + STAssertEqualObjects([@"this%3Dthat" gtm_stringByUnescapingFromURLArgument], @"this=that", @"- equals should be unescaped"); + STAssertEqualObjects([@"this%2Bthat" gtm_stringByUnescapingFromURLArgument], @"this+that", @"- plus should be unescaped"); + STAssertEqualObjects([@"this%24that" gtm_stringByUnescapingFromURLArgument], @"this$that", @"- dollar-sign should be unescaped"); + STAssertEqualObjects([@"this%2Cthat" gtm_stringByUnescapingFromURLArgument], @"this,that", @"- comma should be unescaped"); + STAssertEqualObjects([@"this%2Fthat" gtm_stringByUnescapingFromURLArgument], @"this/that", @"- slash should be unescaped"); + STAssertEqualObjects([@"this%3Fthat" gtm_stringByUnescapingFromURLArgument], @"this?that", @"- question mark should be unescaped"); + STAssertEqualObjects([@"this%25that" gtm_stringByUnescapingFromURLArgument], @"this%that", @"- percent should be unescaped"); + STAssertEqualObjects([@"this%23that" gtm_stringByUnescapingFromURLArgument], @"this#that", @"- pound should be unescaped"); + STAssertEqualObjects([@"this%5Bthat" gtm_stringByUnescapingFromURLArgument], @"this[that", @"- left bracket should be unescaped"); + STAssertEqualObjects([@"this%5Dthat" gtm_stringByUnescapingFromURLArgument], @"this]that", @"- right bracket should be unescaped"); + // make sure a plus come back out as a space + STAssertEqualObjects([[NSString stringWithString:@"this+that"] gtm_stringByUnescapingFromURLArgument], @"this that", @"- plus should be unescaped"); + // make sure plus and %2B are handled in the right order + STAssertEqualObjects([@"this+that%2Bthe%20other" gtm_stringByUnescapingFromURLArgument], @"this that+the other", @"- pluses and spaces should be different"); + // high char test + NSString *tester = [NSString stringWithUTF8String:"caf\xC3\xA9"]; + STAssertNotNil(tester, @"failed to create from utf8 run"); + STAssertEqualObjects([[NSString stringWithString:@"caf%C3%A9"] gtm_stringByUnescapingFromURLArgument], tester, @"- high chars should work"); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XML.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XML.h new file mode 100644 index 00000000..6ef54d71 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XML.h @@ -0,0 +1,51 @@ +// +// GTMNSString+XML.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +/// Utilities for NSStrings containing XML +@interface NSString (GTMNSStringXMLAdditions) + +/// Get a string where characters that need escaping for XML are escaped and invalid characters removed +// +/// This call escapes '&', '<, '>', '\'', '"' per the xml spec and removes all +/// invalid characters as defined by Section 2.2 of the xml spec. +/// +/// For obvious reasons this call is only safe once. +// +// Returns: +// Autoreleased NSString +// +- (NSString *)gtm_stringBySanitizingAndEscapingForXML; + +/// Get a string where characters that invalid characters per the XML spec have been removed +// +/// This call removes all invalid characters as defined by Section 2.2 of the +/// xml spec. If you are writing XML yourself, you probably was to use the +/// above api (gtm_stringBySanitizingAndEscapingForXML) so any entities also +/// get escaped. +// +// Returns: +// Autoreleased NSString +// +- (NSString *)gtm_stringBySanitizingToXMLSpec; + +// There is no stringByUnescapingFromXML because the XML parser will do this. +// The above api is here just incase you need to create XML yourself. + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XML.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XML.m new file mode 100644 index 00000000..0e16ddba --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XML.m @@ -0,0 +1,182 @@ +// +// GTMNSString+XML.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" +#import "GTMNSString+XML.h" +#import "GTMGarbageCollection.h" + +enum { + kGTMXMLCharModeEncodeQUOT = 0, + kGTMXMLCharModeEncodeAMP = 1, + kGTMXMLCharModeEncodeAPOS = 2, + kGTMXMLCharModeEncodeLT = 3, + kGTMXMLCharModeEncodeGT = 4, + kGTMXMLCharModeValid = 99, + kGTMXMLCharModeInvalid = 100, +}; +typedef NSUInteger GTMXMLCharMode; + +static NSString *gXMLEntityList[] = { + // this must match the above order + @""", + @"&", + @"'", + @"<", + @">", +}; + +GTM_INLINE GTMXMLCharMode XMLModeForUnichar(UniChar c) { + + // Per XML spec Section 2.2 Characters + // ( http://www.w3.org/TR/REC-xml/#charsets ) + // + // Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | + // [#x10000-#x10FFFF] + + if (c <= 0xd7ff) { + if (c >= 0x20) { + switch (c) { + case 34: + return kGTMXMLCharModeEncodeQUOT; + case 38: + return kGTMXMLCharModeEncodeAMP; + case 39: + return kGTMXMLCharModeEncodeAPOS; + case 60: + return kGTMXMLCharModeEncodeLT; + case 62: + return kGTMXMLCharModeEncodeGT; + default: + return kGTMXMLCharModeValid; + } + } else { + if (c == '\n') + return kGTMXMLCharModeValid; + if (c == '\r') + return kGTMXMLCharModeValid; + if (c == '\t') + return kGTMXMLCharModeValid; + return kGTMXMLCharModeInvalid; + } + } + + if (c < 0xE000) + return kGTMXMLCharModeInvalid; + + if (c <= 0xFFFD) + return kGTMXMLCharModeValid; + + // UniChar can't have the following values + // if (c < 0x10000) + // return kGTMXMLCharModeInvalid; + // if (c <= 0x10FFFF) + // return kGTMXMLCharModeValid; + + return kGTMXMLCharModeInvalid; +} // XMLModeForUnichar + + +static NSString *AutoreleasedCloneForXML(NSString *src, BOOL escaping) { + // + // NOTE: + // We don't use CFXMLCreateStringByEscapingEntities because it's busted in + // 10.3 (http://lists.apple.com/archives/Cocoa-dev/2004/Nov/msg00059.html) and + // it doesn't do anything about the chars that are actually invalid per the + // xml spec. + // + + // we can't use the CF call here because it leaves the invalid chars + // in the string. + NSUInteger length = [src length]; + if (!length) { + return src; + } + + NSMutableString *finalString = [NSMutableString string]; + + // this block is common between GTMNSString+HTML and GTMNSString+XML but + // it's so short that it isn't really worth trying to share. + const UniChar *buffer = CFStringGetCharactersPtr((CFStringRef)src); + if (!buffer) { + // We want this buffer to be autoreleased. + NSMutableData *data = [NSMutableData dataWithLength:length * sizeof(UniChar)]; + if (!data) { + // COV_NF_START - Memory fail case + _GTMDevLog(@"couldn't alloc buffer"); + return nil; + // COV_NF_END + } + [src getCharacters:[data mutableBytes]]; + buffer = [data bytes]; + } + + const UniChar *goodRun = buffer; + NSUInteger goodRunLength = 0; + + for (NSUInteger i = 0; i < length; ++i) { + + GTMXMLCharMode cMode = XMLModeForUnichar(buffer[i]); + + // valid chars go as is, and if we aren't doing entities, then + // everything goes as is. + if ((cMode == kGTMXMLCharModeValid) || + (!escaping && (cMode != kGTMXMLCharModeInvalid))) { + // goes as is + goodRunLength += 1; + } else { + // it's something we have to encode or something invalid + + // start by adding what we already collected (if anything) + if (goodRunLength) { + CFStringAppendCharacters((CFMutableStringRef)finalString, + goodRun, + goodRunLength); + goodRunLength = 0; + } + + // if it wasn't invalid, add the encoded version + if (cMode != kGTMXMLCharModeInvalid) { + // add this encoded + [finalString appendString:gXMLEntityList[cMode]]; + } + + // update goodRun to point to the next UniChar + goodRun = buffer + i + 1; + } + } + + // anything left to add? + if (goodRunLength) { + CFStringAppendCharacters((CFMutableStringRef)finalString, + goodRun, + goodRunLength); + } + return finalString; +} // AutoreleasedCloneForXML + +@implementation NSString (GTMNSStringXMLAdditions) + +- (NSString *)gtm_stringBySanitizingAndEscapingForXML { + return AutoreleasedCloneForXML(self, YES); +} // gtm_stringBySanitizingAndEscapingForXML + +- (NSString *)gtm_stringBySanitizingToXMLSpec { + return AutoreleasedCloneForXML(self, NO); +} // gtm_stringBySanitizingToXMLSpec + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XMLTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XMLTest.m new file mode 100644 index 00000000..4788690f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMNSString+XMLTest.m @@ -0,0 +1,93 @@ +// +// GTMNSString+XMLTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + + +#import "GTMSenTestCase.h" +#import "GTMNSString+XML.h" + + +@interface GTMNSString_XMLTest : GTMTestCase +@end + +@implementation GTMNSString_XMLTest + +- (void)testStringBySanitizingAndEscapingForXML { + // test the substitutions cases + UniChar chars[] = { + 'z', 0, 'z', 1, 'z', 4, 'z', 5, 'z', 34, 'z', 38, 'z', 39, 'z', + 60, 'z', 62, 'z', ' ', 'z', 0xd800, 'z', 0xDFFF, 'z', 0xE000, + 'z', 0xFFFE, 'z', 0xFFFF, 'z', '\n', 'z', '\r', 'z', '\t', 'z' }; + + NSString *string1 = [NSString stringWithCharacters:chars + length:sizeof(chars) / sizeof(UniChar)]; + NSString *string2 = + [NSString stringWithFormat:@"zzzzz"z&z'z<z>z zzz%Czzz\nz\rz\tz", + 0xE000]; + + STAssertEqualObjects([string1 gtm_stringBySanitizingAndEscapingForXML], + string2, + @"Sanitize and Escape for XML failed"); + + // force the backing store of the NSString to test extraction paths + char ascBuffer[] = "a\01bcde\nf"; + NSString *ascString = + [[[NSString alloc] initWithBytesNoCopy:ascBuffer + length:sizeof(ascBuffer) / sizeof(char) + encoding:NSASCIIStringEncoding + freeWhenDone:NO] autorelease]; + STAssertEqualObjects([ascString gtm_stringBySanitizingAndEscapingForXML], + @"abcde\nf", + @"Sanitize and Escape for XML from asc buffer failed"); + + // test empty string + STAssertEqualObjects([@"" gtm_stringBySanitizingAndEscapingForXML], @"", nil); +} + +- (void)testStringBySanitizingToXMLSpec { + // test the substitutions cases + UniChar chars[] = { + 'z', 0, 'z', 1, 'z', 4, 'z', 5, 'z', 34, 'z', 38, 'z', 39, 'z', + 60, 'z', 62, 'z', ' ', 'z', 0xd800, 'z', 0xDFFF, 'z', 0xE000, + 'z', 0xFFFE, 'z', 0xFFFF, 'z', '\n', 'z', '\r', 'z', '\t', 'z' }; + + NSString *string1 = [NSString stringWithCharacters:chars + length:sizeof(chars) / sizeof(UniChar)]; + NSString *string2 = + [NSString stringWithFormat:@"zzzzz\"z&z'zz zzz%Czzz\nz\rz\tz", + 0xE000]; + + STAssertEqualObjects([string1 gtm_stringBySanitizingToXMLSpec], + string2, + @"Sanitize for XML failed"); + + // force the backing store of the NSString to test extraction paths + char ascBuffer[] = "a\01bcde\nf"; + NSString *ascString = + [[[NSString alloc] initWithBytesNoCopy:ascBuffer + length:sizeof(ascBuffer) / sizeof(char) + encoding:NSASCIIStringEncoding + freeWhenDone:NO] autorelease]; + STAssertEqualObjects([ascString gtm_stringBySanitizingToXMLSpec], + @"abcde\nf", + @"Sanitize and Escape for XML from asc buffer failed"); + + // test empty string + STAssertEqualObjects([@"" gtm_stringBySanitizingToXMLSpec], @"", nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2Runtime.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2Runtime.h new file mode 100644 index 00000000..2c258419 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2Runtime.h @@ -0,0 +1,106 @@ +// +// GTMObjC2Runtime.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +// These functions exist for code that we want to compile on both the < 10.5 +// sdks and on the >= 10.5 sdks without warnings. It basically reimplements +// certain parts of the objc2 runtime in terms of the objc1 runtime. It is not +// a complete implementation as I've only implemented the routines I know we +// use. Feel free to add more as necessary. +// These functions are not documented because they conform to the documentation +// for the ObjC2 Runtime. + +#if OBJC_API_VERSION >= 2 // Only have optional and req'd keywords in ObjC2. +#define AT_OPTIONAL @optional +#define AT_REQUIRED @required +#else +#define AT_OPTIONAL +#define AT_REQUIRED +#endif + +// The file objc-runtime.h was moved to runtime.h and in Leopard, objc-runtime.h +// was just a wrapper around runtime.h. For the iPhone SDK, this objc-runtime.h +// is removed in the iPhoneOS2.0 SDK. +// +// The |Object| class was removed in the iPhone2.0 SDK too. +#if GTM_IPHONE_SDK +#import +#else +#import +#import +#endif + +#import + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 +#import "objc/Protocol.h" + +OBJC_EXPORT Class object_getClass(id obj); +OBJC_EXPORT const char *class_getName(Class cls); +OBJC_EXPORT BOOL class_conformsToProtocol(Class cls, Protocol *protocol); +OBJC_EXPORT Class class_getSuperclass(Class cls); +OBJC_EXPORT Method *class_copyMethodList(Class cls, unsigned int *outCount); +OBJC_EXPORT SEL method_getName(Method m); +OBJC_EXPORT void method_exchangeImplementations(Method m1, Method m2); +OBJC_EXPORT IMP method_getImplementation(Method method); +OBJC_EXPORT IMP method_setImplementation(Method method, IMP imp); +OBJC_EXPORT struct objc_method_description protocol_getMethodDescription(Protocol *p, + SEL aSel, + BOOL isRequiredMethod, + BOOL isInstanceMethod); + +// If building for 10.4 but using the 10.5 SDK, don't include these. +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 +// atomics +// On Leopard these are GC aware +// Intentionally did not include the non-barrier versions, because I couldn't +// come up with a case personally where you wouldn't want to use the +// barrier versions. +GTM_INLINE bool OSAtomicCompareAndSwapPtrBarrier(void *predicate, + void *replacement, + volatile void *theValue) { +#if defined(__LP64__) && __LP64__ + return OSAtomicCompareAndSwap64Barrier((int64_t)predicate, + (int64_t)replacement, + (int64_t *)theValue); +#else // defined(__LP64__) && __LP64__ + return OSAtomicCompareAndSwap32Barrier((int32_t)predicate, + (int32_t)replacement, + (int32_t *)theValue); +#endif // defined(__LP64__) && __LP64__ +} + +GTM_INLINE BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate, + id replacement, + volatile id *objectLocation) { + return OSAtomicCompareAndSwapPtrBarrier(predicate, + replacement, + objectLocation); +} +GTM_INLINE BOOL objc_atomicCompareAndSwapInstanceVariableBarrier(id predicate, + id replacement, + volatile id *objectLocation) { + return OSAtomicCompareAndSwapPtrBarrier(predicate, + replacement, + objectLocation); +} +#endif + +#endif // OBJC2_UNAVAILABLE diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2Runtime.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2Runtime.m new file mode 100644 index 00000000..98356549 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2Runtime.m @@ -0,0 +1,156 @@ +// +// GTMObjC2Runtime.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMObjC2Runtime.h" + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 +#import +#import + +Class object_getClass(id obj) { + if (!obj) return NULL; + return obj->isa; +} + +const char *class_getName(Class cls) { + if (!cls) return "nil"; + return cls->name; +} + +BOOL class_conformsToProtocol(Class cls, Protocol *protocol) { + // We intentionally don't check cls as it crashes on Leopard so we want + // to crash on Tiger as well. + // I logged + // Radar 5572978 class_conformsToProtocol crashes when arg1 is passed as nil + // because it seems odd that this API won't accept nil for cls considering + // all the other apis will accept nil args. + // If this does get fixed, remember to enable the unit tests. + if (!protocol) return NO; + + struct objc_protocol_list *protos; + for (protos = cls->protocols; protos != NULL; protos = protos->next) { + for (long i = 0; i < protos->count; i++) { + if ([protos->list[i] conformsTo:protocol]) { + return YES; + } + } + } + return NO; +} + +Class class_getSuperclass(Class cls) { + if (!cls) return NULL; + return cls->super_class; +} + +Method *class_copyMethodList(Class cls, unsigned int *outCount) { + if (!cls) return NULL; + + unsigned int count = 0; + void *iterator = NULL; + struct objc_method_list *mlist; + Method *methods = NULL; + if (outCount) *outCount = 0; + + while ( (mlist = class_nextMethodList(cls, &iterator)) ) { + if (mlist->method_count == 0) continue; + methods = (Method *)realloc(methods, + sizeof(Method) * (count + mlist->method_count + 1)); + if (!methods) { + //Memory alloc failed, so what can we do? + return NULL; // COV_NF_LINE + } + for (int i = 0; i < mlist->method_count; i++) { + methods[i + count] = &mlist->method_list[i]; + } + count += mlist->method_count; + } + + // List must be NULL terminated + if (methods) { + methods[count] = NULL; + } + if (outCount) *outCount = count; + return methods; +} + +SEL method_getName(Method method) { + if (!method) return NULL; + return method->method_name; +} + +IMP method_getImplementation(Method method) { + if (!method) return NULL; + return method->method_imp; +} + +IMP method_setImplementation(Method method, IMP imp) { + // We intentionally don't test method for nil. + // Leopard fails here, so should we. + // I logged this as Radar: + // 5572981 method_setImplementation crashes if you pass nil for the + // method arg (arg 1) + // because it seems odd that this API won't accept nil for method considering + // all the other apis will accept nil args. + // If this does get fixed, remember to enable the unit tests. + // This method works differently on SnowLeopard than + // on Leopard. If you pass in a nil for IMP on SnowLeopard + // it doesn't change anything. On Leopard it will. Since + // attempting to change a sel to nil is probably an error + // we follow the SnowLeopard way of doing things. + IMP oldImp = NULL; + if (imp) { + oldImp = method->method_imp; + method->method_imp = imp; + } + return oldImp; +} + +void method_exchangeImplementations(Method m1, Method m2) { + if (m1 == m2) return; + if (!m1 || !m2) return; + IMP imp2 = method_getImplementation(m2); + IMP imp1 = method_setImplementation(m1, imp2); + method_setImplementation(m2, imp1); +} + +struct objc_method_description protocol_getMethodDescription(Protocol *p, + SEL aSel, + BOOL isRequiredMethod, + BOOL isInstanceMethod) { + struct objc_method_description *descPtr = NULL; + // No such thing as required in ObjC1. + if (isInstanceMethod) { + descPtr = [p descriptionForInstanceMethod:aSel]; + } else { + descPtr = [p descriptionForClassMethod:aSel]; + } + + struct objc_method_description desc; + if (descPtr) { + desc = *descPtr; + } else { + bzero(&desc, sizeof(desc)); + } + return desc; +} + + +#endif + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2RuntimeTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2RuntimeTest.m new file mode 100644 index 00000000..7344a0f8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjC2RuntimeTest.m @@ -0,0 +1,424 @@ +// +// GTMObjC2RuntimeTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMObjC2Runtime.h" +#import "GTMSenTestCase.h" +#import "GTMSystemVersion.h" + + + +#import + +@protocol GTMObjC2Runtime_TestProtocol +@end + +@protocol GTMObjC2Runtime_Test2Protocol +AT_OPTIONAL +- (NSString*)optional; +AT_REQUIRED +- (NSString*)required; +AT_OPTIONAL ++ (NSString*)class_optional; +AT_REQUIRED ++ (NSString*)class_required; +@end + +@interface GTMObjC2RuntimeTest : GTMTestCase { + Class cls_; +} +@end + +@interface GTMObjC2Runtime_TestClass : NSObject +- (NSString*)kwyjibo; + +@end + +@interface GTMObjC2Runtime_TestClass (GMObjC2Runtime_TestClassCategory) +- (NSString*)eatMyShorts; +@end + +@implementation GTMObjC2Runtime_TestClass + ++ (NSString*)dontHaveACow { + return @"dontHaveACow"; +} + +- (NSString*)kwyjibo { + return @"kwyjibo"; +} +@end + +@implementation GTMObjC2Runtime_TestClass (GMObjC2Runtime_TestClassCategory) +- (NSString*)eatMyShorts { + return @"eatMyShorts"; +} + ++ (NSString*)brokeHisBrain { + return @"brokeHisBrain"; +} + +@end + +@interface GTMObjC2NotificationWatcher : NSObject +@end + +@implementation GTMObjC2NotificationWatcher +- (id)init { + if ((self = [super init])) { + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + // We release ourselves when we are notified. + [self retain]; + [nc addObserver:self + selector:@selector(startedTest:) + name:SenTestSuiteDidStartNotification + object:nil]; + + } + return self; +} + +- (void)startedTest:(NSNotification *)notification { + // Logs if we are testing on Tiger or Leopard runtime. + NSString *testName = [(SenTest*)[[notification object] test] name]; + NSString *className = NSStringFromClass([GTMObjC2RuntimeTest class]); + if ([testName isEqualToString:className]) { + NSString *runtimeString; +#ifndef OBJC2_UNAVAILABLE + runtimeString = @"ObjC1"; +#else + runtimeString = @"ObjC2"; +#endif + NSLog(@"Running GTMObjC2RuntimeTests using %@ runtime.", runtimeString); + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc removeObserver:self]; + [self autorelease]; + } +} +@end + +@implementation GTMObjC2RuntimeTest + ++ (void)initialize { + // This allows us to track which runtime we are actually testing. + [[[GTMObjC2NotificationWatcher alloc] init] autorelease]; +} + +- (void)setUp { + cls_ = [[GTMObjC2Runtime_TestClass class] retain]; +} + +- (void)tearDown { + [cls_ release]; +} + +- (void)test_object_getClass { + // Nil Checks + STAssertNil(object_getClass(nil), nil); + + // Standard use check + GTMObjC2Runtime_TestClass *test = [[[cls_ alloc] init] autorelease]; + Class cls = object_getClass(test); + STAssertEqualObjects(cls, cls_, nil); +} + +- (void)test_class_getName { + // Nil Checks + const char *name = class_getName(nil); + STAssertEqualCStrings(name, "nil", nil); + + // Standard use check + STAssertEqualCStrings(class_getName(cls_), "GTMObjC2Runtime_TestClass", nil); +} + +- (void)test_class_conformsToProtocol { + // Nil Checks + STAssertFalse(class_conformsToProtocol(cls_, @protocol(NSObject)), nil); + STAssertFalse(class_conformsToProtocol(cls_, nil), nil); + // The following two tests intentionally commented out as they fail on + // Leopard with a crash, so we fail on Tiger intentionally as well. + // STAssertFalse(class_conformsToProtocol(nil, @protocol(NSObject)), nil); + // STAssertFalse(class_conformsToProtocol(nil, nil), nil); + + // Standard use check + STAssertTrue(class_conformsToProtocol(cls_, + @protocol(GTMObjC2Runtime_TestProtocol)), + nil); +} + +- (void)test_class_getSuperclass { + // Nil Checks + STAssertNil(class_getSuperclass(nil), nil); + + // Standard use check + STAssertEqualObjects(class_getSuperclass(cls_), [NSObject class], nil); +} + +- (void)test_class_copyMethodList { + // Nil Checks + Method *list = class_copyMethodList(nil, nil); + STAssertNULL(list, nil); + + // Standard use check + list = class_copyMethodList(cls_, nil); + STAssertNotNULL(list, nil); + free(list); + unsigned int count = 0; + list = class_copyMethodList(cls_, &count); + STAssertNotNULL(list, nil); + STAssertEquals(count, 2U, nil); + STAssertNULL(list[count], nil); + free(list); + + // Now test meta class + count = 0; + list = class_copyMethodList((Class)objc_getMetaClass(class_getName(cls_)), + &count); + STAssertNotNULL(list, nil); + STAssertEquals(count, 2U, nil); + STAssertNULL(list[count], nil); + free(list); +} + +- (void)test_method_getName { + // Nil Checks + STAssertNULL(method_getName(nil), nil); + + // Standard use check + Method *list = class_copyMethodList(cls_, nil); + STAssertNotNULL(list, nil); + const char* selName1 = sel_getName(method_getName(list[0])); + const char* selName2 = sel_getName(@selector(kwyjibo)); + const char* selName3 = sel_getName(@selector(eatMyShorts)); + BOOL isGood = ((strcmp(selName1, selName2)) == 0 || (strcmp(selName1, selName3) == 0)); + STAssertTrue(isGood, nil); + free(list); +} + +- (void)test_method_exchangeImplementations { + // nil checks + method_exchangeImplementations(nil, nil); + + // Standard use check + GTMObjC2Runtime_TestClass *test = [[GTMObjC2Runtime_TestClass alloc] init]; + STAssertNotNil(test, nil); + + // Get initial values + NSString *val1 = [test kwyjibo]; + STAssertNotNil(val1, nil); + NSString *val2 = [test eatMyShorts]; + STAssertNotNil(val2, nil); + NSString *val3 = [GTMObjC2Runtime_TestClass dontHaveACow]; + STAssertNotNil(val3, nil); + NSString *val4 = [GTMObjC2Runtime_TestClass brokeHisBrain]; + STAssertNotNil(val4, nil); + + // exchange the imps + Method *list = class_copyMethodList(cls_, nil); + STAssertNotNULL(list, nil); + method_exchangeImplementations(list[0], list[1]); + + // test against initial values + NSString *val5 = [test kwyjibo]; + STAssertNotNil(val5, nil); + NSString *val6 = [test eatMyShorts]; + STAssertNotNil(val6, nil); + STAssertEqualStrings(val1, val6, nil); + STAssertEqualStrings(val2, val5, nil); + + // Check that other methods not affected + STAssertEqualStrings([GTMObjC2Runtime_TestClass dontHaveACow], val3, nil); + STAssertEqualStrings([GTMObjC2Runtime_TestClass brokeHisBrain], val4, nil); + + // exchange the imps back + method_exchangeImplementations(list[0], list[1]); + + // and test against initial values again + NSString *val7 = [test kwyjibo]; + STAssertNotNil(val7, nil); + NSString *val8 = [test eatMyShorts]; + STAssertNotNil(val8, nil); + STAssertEqualStrings(val1, val7, nil); + STAssertEqualStrings(val2, val8, nil); + + method_exchangeImplementations(list[0], nil); + method_exchangeImplementations(nil, list[0]); + + val7 = [test kwyjibo]; + STAssertNotNil(val7, nil); + val8 = [test eatMyShorts]; + STAssertNotNil(val8, nil); + STAssertEqualStrings(val1, val7, nil); + STAssertEqualStrings(val2, val8, nil); + + free(list); + [test release]; +} + +- (void)test_method_getImplementation { + // Nil Checks + STAssertNULL(method_getImplementation(nil), nil); + + // Standard use check + Method *list = class_copyMethodList(cls_, nil); + STAssertNotNULL(list, nil); + STAssertNotNULL(method_getImplementation(list[0]), nil); + free(list); +} + +- (void)test_method_setImplementation { + // Standard use check + GTMObjC2Runtime_TestClass *test = [[GTMObjC2Runtime_TestClass alloc] init]; + Method *list = class_copyMethodList(cls_, nil); + + // Get initial value + NSString *str1 = objc_msgSend(test, method_getName(list[0])); + STAssertNotNil(str1, nil); + + // set the imp to something else + IMP oldImp = method_setImplementation(list[0], method_getImplementation(list[1])); + STAssertNotNULL(oldImp, nil); + + // make sure they are different + NSString *str2 = objc_msgSend(test,method_getName(list[0])); + STAssertNotNil(str2, nil); + STAssertNotEqualStrings(str1, str2, nil); + + // reset the imp + IMP newImp = method_setImplementation(list[0], oldImp); + STAssertNotEquals(oldImp, newImp, nil); + + // test nils + // Apparently it was a bug that we could call setImplementation with a nil + // so we now test to make sure that setting to nil works as expected on + // all systems. +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + // Built for less then leopard gives us the behaviors we defined... + // (doesn't take nil) + IMP nullImp = method_setImplementation(list[0], nil); + STAssertNULL(nullImp, nil); + IMP testImp = method_setImplementation(list[0], newImp); + STAssertEquals(testImp, oldImp, nil); +#else + // Built for leopard or later means we get the os runtime behavior... + if ([GTMSystemVersion isLeopard]) { + // (takes nil) + oldImp = method_setImplementation(list[0], nil); + STAssertNotNULL(oldImp, nil); + newImp = method_setImplementation(list[0], oldImp); + STAssertNULL(newImp, nil); + } else { + // (doesn't take nil) + IMP nullImp = method_setImplementation(list[0], nil); + STAssertNULL(nullImp, nil); + IMP testImp = method_setImplementation(list[0], newImp); + STAssertEquals(testImp, oldImp, nil); + } +#endif + + // This case intentionally not tested. Passing nil to method_setImplementation + // on Leopard crashes. It does on Tiger as well. Half works on SnowLeopard. + // We made our Tiger implementation the same as the SnowLeopard + // implementation. + // Logged as radar 5572981. + if (![GTMSystemVersion isLeopard]) { + STAssertNULL(method_setImplementation(nil, nil), nil); + } + if ([GTMSystemVersion isBuildGreaterThan:kGTMSystemBuild10_6_0_WWDC]) { + STAssertNULL(method_setImplementation(nil, newImp), nil); + } + + [test release]; + free(list); +} + +- (void)test_protocol_getMethodDescription { + // Check nil cases + struct objc_method_description desc = protocol_getMethodDescription(nil, nil, + YES, YES); + STAssertNULL(desc.name, nil); + desc = protocol_getMethodDescription(nil, @selector(optional), YES, YES); + STAssertNULL(desc.name, nil); + desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol), + nil, YES, YES); + STAssertNULL(desc.name, nil); + + // Instance Methods + // Check Required case. Only OBJC2 supports required. + desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol), + @selector(optional), YES, YES); +#if OBJC_API_VERSION >= 2 + STAssertNULL(desc.name, nil); +#else + STAssertNotNULL(desc.name, nil); +#endif + + // Check Required case. Only OBJC2 supports required. + desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol), + @selector(required), YES, YES); + + STAssertNotNULL(desc.name, nil); + + // Check Optional case. Only OBJC2 supports optional. + desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol), + @selector(optional), NO, YES); + + STAssertNotNULL(desc.name, nil); + + // Check Optional case. Only OBJC2 supports optional. + desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol), + @selector(required), NO, YES); +#if OBJC_API_VERSION >= 2 + STAssertNULL(desc.name, nil); +#else + STAssertNotNULL(desc.name, nil); +#endif + + // Class Methods + // Check Required case. Only OBJC2 supports required. + desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol), + @selector(class_optional), YES, NO); +#if OBJC_API_VERSION >= 2 + STAssertNULL(desc.name, nil); +#else + STAssertNotNULL(desc.name, nil); +#endif + + // Check Required case. Only OBJC2 supports required. + desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol), + @selector(class_required), YES, NO); + + STAssertNotNULL(desc.name, nil); + + // Check Optional case. Only OBJC2 supports optional. + desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol), + @selector(class_optional), NO, NO); + + STAssertNotNULL(desc.name, nil); + + // Check Optional case. Only OBJC2 supports optional. + desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol), + @selector(class_required), NO, NO); +#if OBJC_API_VERSION >= 2 + STAssertNULL(desc.name, nil); +#else + STAssertNotNULL(desc.name, nil); +#endif + +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjectSingleton.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjectSingleton.h new file mode 100644 index 00000000..4763b687 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMObjectSingleton.h @@ -0,0 +1,71 @@ +// +// GTMObjectSingleton.h +// Macro to implement methods for a singleton +// +// Copyright 2005-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" + +/// This macro implements the various methods needed to make a safe singleton. +// +/// This Singleton pattern was taken from: +/// http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_10.html +/// +/// Sample usage: +/// +/// GTMOBJECT_SINGLETON_BOILERPLATE(SomeUsefulManager, sharedSomeUsefulManager) +/// (with no trailing semicolon) +/// +#define GTMOBJECT_SINGLETON_BOILERPLATE(_object_name_, _shared_obj_name_) \ +static _object_name_ *z##_shared_obj_name_ = nil; \ ++ (_object_name_ *)_shared_obj_name_ { \ + @synchronized(self) { \ + if (z##_shared_obj_name_ == nil) { \ + /* Note that 'self' may not be the same as _object_name_ */ \ + /* first assignment done in allocWithZone but we must reassign in case init fails */ \ + z##_shared_obj_name_ = [[self alloc] init]; \ + _GTMDevAssert((z##_shared_obj_name_ != nil), @"didn't catch singleton allocation"); \ + } \ + } \ + return z##_shared_obj_name_; \ +} \ ++ (id)allocWithZone:(NSZone *)zone { \ + @synchronized(self) { \ + if (z##_shared_obj_name_ == nil) { \ + z##_shared_obj_name_ = [super allocWithZone:zone]; \ + return z##_shared_obj_name_; \ + } \ + } \ + \ + /* We can't return the shared instance, because it's been init'd */ \ + _GTMDevAssert(NO, @"use the singleton API, not alloc+init"); \ + return nil; \ +} \ +- (id)retain { \ + return self; \ +} \ +- (NSUInteger)retainCount { \ + return NSUIntegerMax; \ +} \ +- (void)release { \ +} \ +- (id)autorelease { \ + return self; \ +} \ +- (id)copyWithZone:(NSZone *)zone { \ + return self; \ +} \ + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPath.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPath.h new file mode 100644 index 00000000..6ac2347d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPath.h @@ -0,0 +1,132 @@ +// +// GTMPath.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + + +// GTMPath +// +// This class represents a single, absolute file system path. The represented +// path must exist at the time of creation. This class also allows you to easily +// create new paths (or full hierarchies) based on existing GTMPath instances. +// +// Given a GTMPath instance, new files and directories can be created inside +// that path providing the instance refers to a directory. It is an error to try +// to create a file/directory from a GTMPath that represents a file (this should +// be common sense: clearly mkdir /etc/passwd/foo won't work). +// +// === Examples === +// +// 1. This sample creates a GTMPath that references /tmp, then gets the +// attributes for that directory. +// +// GTMPath *tmp = [GTMPath pathWithFullPath:@"/tmp"]; +// NSDictionary *attr = [tmp attributes]; +// +// +// 2. This sample creates a new directory inside /tmp named "foo". +// +// GTMPath *tmp = [GTMPath pathWithFullPath:@"/tmp"]; +// GTMPath *foo = [tmp createDirectoryName:@"foo" mode:0755]; +// +// +// 3. This sample creates a GTMPath instance that represents a user's ~/Library +// folder. +// +// GTMPath *library = [GTMPath pathWithFullPath:@"/Users/bob/Library"]; +// ... +// +// +// 4. This sample creates a directory hierarchy, where each level has its own +// mode. Notice that the return value from these -create* methods is the +// GTMPath that was just created. This allows these creation calls to be +// chained together enabling easy creation of directory hierarchies. +// This is one of the big benefits of this class. +// +// GTMPath *tmp = [GTMPath pathWithFullPath:@"/tmp"]; +// GTMPath *baz = [[[tmp createDirectoryName:@"foo" mode:0755] +// createDirectoryName:@"bar" mode:0756] +// createDirectoryName:@"baz" mode:0757]; +// +@interface GTMPath : NSObject { + @private + NSString *fullPath_; +} + +// Returns a GTMPath instance that represents the full path specified by +// |fullPath|. Note that |fullPath| MUST be an absolute path. ++ (id)pathWithFullPath:(NSString *)fullPath; + +// Returns a GTMPath instance that represents the full path specified by +// |fullPath|. Note that |fullPath| MUST be an absolute path. This method is the +// designated initializer. +- (id)initWithFullPath:(NSString *)fullPath; + +// Returns the name of this GTMPath instance. This is not the full path. It is +// just the component name of this GTMPath instance. This is equivalent to +// the Unix basename(3) function. +- (NSString *)name; + +// Returns this path's parent GTMPath. This method will ONLY (and always) return +// nil when |name| is "/". In otherwords, parent will be nil IFF this GTMPath +// instance represents the root path, because "/" doesn't really have a parent. +- (GTMPath *)parent; + +// Returns YES if this GTMPath represents a directory. +- (BOOL)isDirectory; + +// Returns YES if this GTMPath instance represents the root path "/". +- (BOOL)isRoot; + +// Returns the file system attributes of the path represented by this GTMPath +// instance. See -[NSFileManager fileAttributesAtPath:...] for details. +- (NSDictionary *)attributes; + +// Returns a string representation of the absolute path represented by this +// GTMPath instance. +- (NSString *)fullPath; + +@end + + +// Methods for creating files and directories inside a GTMPath instance. These +// methods are only allowed to be called on GTMPath instances that represent +// directories. See the NSFileManager documentation for details about the +// |attributes| parameters. +@interface GTMPath (GTMPathGeneration) + +// Creates a new directory with the specified mode or attributes inside the +// current GTMPath instance. If the creation is successful, a GTMPath for the +// newly created directory is returned. Otherwise, nil is returned. +- (GTMPath *)createDirectoryName:(NSString *)name mode:(mode_t)mode; +- (GTMPath *)createDirectoryName:(NSString *)name + attributes:(NSDictionary *)attributes; + +// Creates a new file with the specified mode or attributes inside the +// current GTMPath instance. If the creation is successful, a GTMPath for the +// newly created file is returned. Otherwise, nil is returned. |data| is the +// data to put in the file when created. +- (GTMPath *)createFileName:(NSString *)name mode:(mode_t)mode; +- (GTMPath *)createFileName:(NSString *)name + attributes:(NSDictionary *)attributes; +- (GTMPath *)createFileName:(NSString *)name + attributes:(NSDictionary *)attributes + data:(NSData *)data; + +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPath.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPath.m new file mode 100644 index 00000000..28ffad07 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPath.m @@ -0,0 +1,156 @@ +// +// GTMPath.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMPath.h" + + +@implementation GTMPath + ++ (id)pathWithFullPath:(NSString *)fullPath { + return [[[self alloc] initWithFullPath:fullPath] autorelease]; +} + +- (id)init { + return [self initWithFullPath:nil]; +} + +- (id)initWithFullPath:(NSString *)fullPath { + if ((self = [super init])) { + fullPath_ = [fullPath copy]; + if (![fullPath_ isAbsolutePath] || [self attributes] == nil) { + [self release]; + return nil; + } + } + + return self; +} + +- (void)dealloc { + [fullPath_ release]; + [super dealloc]; +} + +- (NSString *)description { + return [self fullPath]; +} + +- (NSString *)name { + return [fullPath_ lastPathComponent]; +} + +- (GTMPath *)parent { + if ([self isRoot]) return nil; + NSString *parentPath = [fullPath_ stringByDeletingLastPathComponent]; + return [[self class] pathWithFullPath:parentPath]; +} + +- (BOOL)isDirectory { + BOOL isDir = NO; + BOOL exists = [[NSFileManager defaultManager] + fileExistsAtPath:fullPath_ isDirectory:&isDir]; + return exists && isDir; +} + +- (BOOL)isRoot { + return [fullPath_ isEqualToString:@"/"]; +} + +- (NSDictionary *)attributes { + return [[NSFileManager defaultManager] + fileAttributesAtPath:fullPath_ + traverseLink:YES]; +} + +- (NSString *)fullPath { + return [[fullPath_ copy] autorelease]; +} + +@end + + +@implementation GTMPath (GTMPathGeneration) + +- (GTMPath *)createDirectoryName:(NSString *)name mode:(mode_t)mode { + NSDictionary *attributes = + [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:mode] + forKey:NSFilePosixPermissions]; + return [self createDirectoryName:name attributes:attributes]; +} + +- (GTMPath *)createDirectoryName:(NSString *)name + attributes:(NSDictionary *)attributes { + if ([name length] == 0) return nil; + + // We first check to see if the requested directory alread exists by trying + // to create a GTMPath from the desired new path string. Only if the path + // doesn't already exist do we attempt to create it. If the path already + // exists, we will end up returning a GTMPath for the pre-existing path. + NSString *newPath = [fullPath_ stringByAppendingPathComponent:name]; + GTMPath *nascentPath = [GTMPath pathWithFullPath:newPath]; + if (nascentPath != nil && ![nascentPath isDirectory]) { + return nil; // Return nil because the path exists, but it's not a dir + } + + if (nascentPath == nil) { + BOOL created = [[NSFileManager defaultManager] + createDirectoryAtPath:newPath + attributes:attributes]; + nascentPath = created ? [GTMPath pathWithFullPath:newPath] : nil; + } + + return nascentPath; +} + +- (GTMPath *)createFileName:(NSString *)name mode:(mode_t)mode { + NSDictionary *attributes = + [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:mode] + forKey:NSFilePosixPermissions]; + return [self createFileName:name attributes:attributes]; +} + +- (GTMPath *)createFileName:(NSString *)name + attributes:(NSDictionary *)attributes { + return [self createFileName:name attributes:attributes data:[NSData data]]; +} + +- (GTMPath *)createFileName:(NSString *)name + attributes:(NSDictionary *)attributes + data:(NSData *)data { + if ([name length] == 0) return nil; + + // See createDirectoryName:attribute: for some high-level notes about what and + // why this method does what it does. + NSString *newPath = [fullPath_ stringByAppendingPathComponent:name]; + GTMPath *nascentPath = [GTMPath pathWithFullPath:newPath]; + if (nascentPath != nil && [nascentPath isDirectory]) { + return nil; // Return nil because the path exists, but it's a dir + } + + if (nascentPath == nil) { + BOOL created = [[NSFileManager defaultManager] + createFileAtPath:newPath + contents:data + attributes:attributes]; + nascentPath = created ? [GTMPath pathWithFullPath:newPath] : nil; + } + + return nascentPath; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPathTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPathTest.m new file mode 100644 index 00000000..211206cb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMPathTest.m @@ -0,0 +1,236 @@ +// +// GTMPathTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMPath.h" +#import "GTMUnitTestDevLog.h" + + +@interface GTMPathTest : GTMTestCase { + @private + NSString *testDirectory_; +} +@end + +@implementation GTMPathTest + +- (void)setUp { + NSString *tmp = NSTemporaryDirectory(); + STAssertNotNil(tmp, nil); + + testDirectory_ = [[tmp stringByAppendingPathComponent:@"GTMPathTest"] retain]; + STAssertNotNil(testDirectory_, nil); + + BOOL created = [[NSFileManager defaultManager] + createDirectoryAtPath:testDirectory_ + attributes:nil]; + STAssertTrue(created, nil); +} + +- (void)tearDown { + // Make sure it's safe to remove this directory before nuking it. + STAssertNotNil(testDirectory_, nil); + STAssertNotEqualObjects(testDirectory_, @"/", nil); +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + [[NSFileManager defaultManager] removeFileAtPath:testDirectory_ handler:nil]; +#else + [[NSFileManager defaultManager] removeItemAtPath:testDirectory_ error:NULL]; +#endif + [testDirectory_ release]; +} + +- (void)testBasicCreation { + GTMPath *path = nil; + + path = [[[GTMPath alloc] init] autorelease]; + STAssertNil(path, nil); + + path = [GTMPath pathWithFullPath:@"/"]; + STAssertNotNil(path, nil); + STAssertNil([path parent], nil); + STAssertTrue([path isRoot], nil); + STAssertTrue([path isDirectory], nil); + STAssertEqualObjects([path name], @"/", nil); + STAssertEqualObjects([path fullPath], @"/", nil); +} + +- (void)testRecursiveInitialization { + GTMPath *path = nil; + + path = [GTMPath pathWithFullPath:nil]; + STAssertNil(path, nil); + + path = [GTMPath pathWithFullPath:@""]; + STAssertNil(path, nil); + + path = [GTMPath pathWithFullPath:@"etc"]; + STAssertNil(path, nil); + + path = [GTMPath pathWithFullPath:@"/"]; + STAssertNotNil(path, nil); + STAssertNil([path parent], nil); + STAssertTrue([path isRoot], nil); + STAssertTrue([path isDirectory], nil); + STAssertEqualObjects([path name], @"/", nil); + STAssertEqualObjects([path fullPath], @"/", nil); + + path = [GTMPath pathWithFullPath:@"/etc"]; + STAssertNotNil(path, nil); + STAssertEqualObjects([path name], @"etc", nil); + STAssertEqualObjects([path fullPath], @"/etc", nil); + STAssertTrue([path isDirectory], nil); + STAssertFalse([path isRoot], nil); + STAssertNotNil([path parent], nil); + STAssertTrue([[path parent] isRoot], nil); + + path = [GTMPath pathWithFullPath:@"/etc/passwd"]; + STAssertNotNil(path, nil); + STAssertEqualObjects([path name], @"passwd", nil); + STAssertEqualObjects([path fullPath], @"/etc/passwd", nil); + STAssertFalse([path isDirectory], nil); + STAssertFalse([path isRoot], nil); + STAssertNotNil([path parent], nil); + STAssertFalse([[path parent] isRoot], nil); + STAssertTrue([[path parent] isDirectory], nil); + STAssertTrue([[[path parent] parent] isRoot], nil); + + STAssertTrue([[path description] length] > 1, nil); +} + +- (void)testCreationWithNonExistentPath { + GTMPath *path = nil; + + path = [GTMPath pathWithFullPath:@" "]; + STAssertNil(path, nil); + + path = [GTMPath pathWithFullPath:@"/abcxyz"]; + STAssertNil(path, nil); + + path = [GTMPath pathWithFullPath:@"/etc/foo"]; + STAssertNil(path, nil); + + path = [GTMPath pathWithFullPath:@"/foo/bar/baz"]; + STAssertNil(path, nil); +} + +- (void)testDirectoryCreation { + GTMPath *tmp = [GTMPath pathWithFullPath:testDirectory_]; + GTMPath *path = nil; + + NSString *fooPath = [[tmp fullPath] stringByAppendingPathComponent:@"foo"]; + path = [GTMPath pathWithFullPath:fooPath]; + STAssertNil(path, nil); + + path = [tmp createDirectoryName:@"foo" mode:0555]; + STAssertNotNil(path, nil); + STAssertEqualObjects([path name], @"foo", nil); + // filePosixPermissions has odd return types in different SDKs, so we use + // STAssertTrue to avoid the macros type checks from choking us. + STAssertTrue([[path attributes] filePosixPermissions] == 0555, nil); + STAssertTrue([path isDirectory], nil); + STAssertFalse([path isRoot], nil); + + // Trying to create a file where a dir already exists should fail + path = [tmp createFileName:@"foo" mode:0555]; + STAssertNil(path, nil); + + // Calling create again should succeed + path = [tmp createDirectoryName:@"foo" mode:0555]; + STAssertNotNil(path, nil); + STAssertEqualObjects([path name], @"foo", nil); + STAssertTrue([[path attributes] filePosixPermissions] == 0555, nil); + STAssertTrue([path isDirectory], nil); + STAssertFalse([path isRoot], nil); + + GTMPath *foo = [GTMPath pathWithFullPath:fooPath]; + STAssertNotNil(foo, nil); + STAssertEqualObjects([path name], @"foo", nil); + STAssertTrue([[path attributes] filePosixPermissions] == 0555, nil); + STAssertTrue([path isDirectory], nil); + STAssertFalse([path isRoot], nil); +} + +- (void)testFileCreation { + GTMPath *tmp = [GTMPath pathWithFullPath:testDirectory_]; + GTMPath *path = nil; + + NSString *fooPath = [[tmp fullPath] stringByAppendingPathComponent:@"foo"]; + path = [GTMPath pathWithFullPath:fooPath]; + STAssertNil(path, nil); + + path = [tmp createFileName:@"foo" mode:0555]; + STAssertNotNil(path, nil); + STAssertEqualObjects([path name], @"foo", nil); + STAssertTrue([[path attributes] filePosixPermissions] == 0555, nil); + STAssertFalse([path isDirectory], nil); + STAssertFalse([path isRoot], nil); + + // Trying to create a dir where a file already exists should fail. + path = [tmp createDirectoryName:@"foo" mode:0555]; + STAssertNil(path, nil); + + // Calling create again should succeed + path = [tmp createFileName:@"foo" mode:0555]; + STAssertNotNil(path, nil); + STAssertEqualObjects([path name], @"foo", nil); + STAssertTrue([[path attributes] filePosixPermissions] == 0555, nil); + STAssertFalse([path isDirectory], nil); + STAssertFalse([path isRoot], nil); + + GTMPath *foo = [GTMPath pathWithFullPath:fooPath]; + STAssertNotNil(foo, nil); + STAssertEqualObjects([path name], @"foo", nil); + STAssertTrue([[path attributes] filePosixPermissions] == 0555, nil); + STAssertFalse([path isDirectory], nil); + STAssertFalse([path isRoot], nil); + + // Make sure we can't create a file/directory rooted off of |foo|, since it's + // not a directory. + path = [foo createFileName:@"bar" mode:0555]; + STAssertNil(path, nil); + path = [foo createDirectoryName:@"bar" mode:0555]; + STAssertNil(path, nil); +} + +- (void)testHierarchyCreation { + GTMPath *tmp = [GTMPath pathWithFullPath:testDirectory_]; + NSString *fooPath = [[tmp fullPath] stringByAppendingPathComponent:@"foo"]; + GTMPath *path = [GTMPath pathWithFullPath:fooPath]; + STAssertNil(path, nil); + + path = [[[tmp createDirectoryName:@"foo" mode:0755] + createDirectoryName:@"bar" mode:0756] + createDirectoryName:@"baz" mode:0757]; + STAssertNotNil(path, nil); + + // Check "baz" + STAssertEqualObjects([path name], @"baz", nil); + STAssertTrue([[path attributes] filePosixPermissions] == 0757, nil); + + // Check "bar" + path = [path parent]; + STAssertEqualObjects([path name], @"bar", nil); + STAssertTrue([[path attributes] filePosixPermissions] == 0756, nil); + + // Check "foo" + path = [path parent]; + STAssertEqualObjects([path name], @"foo", nil); + STAssertTrue([[path attributes] filePosixPermissions] == 0755, nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMProgressMonitorInputStream.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMProgressMonitorInputStream.h new file mode 100644 index 00000000..5f779bc5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMProgressMonitorInputStream.h @@ -0,0 +1,22 @@ +// +// GTMProgressMonitorInputStream.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// This class is no more. If you want something like it's functionality, look +// at using the version in the Objective-C GData Client +// (http://code.google.com/p/gdata-objectivec-client/). It provides the same +// functionality and will continue to be maintained. diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegex.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegex.h new file mode 100644 index 00000000..3ef5604c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegex.h @@ -0,0 +1,379 @@ +// +// GTMRegex.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import +#import "GTMDefines.h" + +/// Options for controlling the behavior of the matches +enum { + + kGTMRegexOptionIgnoreCase = 0x01, + // Ignore case in matching, ie: 'a' matches 'a' or 'A' + + kGTMRegexOptionSupressNewlineSupport = 0x02, + // By default (without this option), regular expressions are implicitly + // processed on a line by line basis, where "lines" are delimited by newline + // characters. In this mode '.' (dot) does NOT match newline characters, and + // '^' and '$' match at the beginning and end of the string as well as + // around newline characters. This behavior matches the default behavior for + // regular expressions in other languages including Perl and Python. For + // example, + // foo.*bar + // would match + // fooAAAbar + // but would NOT match + // fooAAA\nbar + // With the kGTMRegexOptionSupressNewlineSupport option, newlines are treated + // just like any other character which means that '.' will match them. In + // this mode, ^ and $ only match the beginning and end of the input string + // and do NOT match around the newline characters. For example, + // foo.*bar + // would match + // fooAAAbar + // and would also match + // fooAAA\nbar + +}; +typedef NSUInteger GTMRegexOptions; + +/// Global contants needed for errors from consuming patterns + +#undef _EXTERN +#undef _INITIALIZE_AS +#ifdef GTMREGEX_DEFINE_GLOBALS +#define _EXTERN +#define _INITIALIZE_AS(x) =x +#else +#define _EXTERN GTM_EXTERN +#define _INITIALIZE_AS(x) +#endif + +_EXTERN NSString* kGTMRegexErrorDomain _INITIALIZE_AS(@"com.google.mactoolbox.RegexDomain"); + +enum { + kGTMRegexPatternParseFailedError = -100 +}; + +// Keys for the userInfo from a kGTMRegexErrorDomain/kGTMRegexPatternParseFailedError error +_EXTERN NSString* kGTMRegexPatternErrorPattern _INITIALIZE_AS(@"pattern"); +_EXTERN NSString* kGTMRegexPatternErrorErrorString _INITIALIZE_AS(@"patternError"); + +/// Class for doing Extended Regex operations w/ libregex (see re_format(7)). +// +// NOTE: the docs for recomp/regexec make *no* claims about i18n. All work +// within this class is done w/ UTF-8 so Unicode should move through it safely, +// however, the character classes described in re_format(7) might not really +// be unicode "savvy", so use them and this class w/ that in mind. +// +// Example usage: +// +// NSArray *inputArrayOfStrings = ... +// NSArray *matches = [NSMutableArray array]; +// +// GTMRegex *regex = [GTMRegex regexWithPattern:@"foo.*bar"]; +// for (NSString *curStr in inputArrayOfStrings) { +// if ([regex matchesString:curStr]) +// [matches addObject:curStr]; +// } +// .... +// +// ------------- +// +// If you need to include something dynamic in a pattern: +// +// NSString *pattern = +// [NSString stringWithFormat:@"^foo:%@bar", +// [GTMRegex escapedPatternForString:inputStr]]; +// GTMRegex *regex = [GTMRegex regexWithPattern:pattern]; +// .... +// +// ------------- +// +// GTMRegex *regex = [GTMRegex regexWithPattern:@"(foo+)(bar)"]; +// NSString *highlighted = +// [regex stringByReplacingMatchesInString:inputString +// withReplacement:@"\\1\\2"]; +// .... +// +@interface GTMRegex : NSObject { + @private + NSString *pattern_; + GTMRegexOptions options_; + regex_t regexData_; +} + +/// Create a new, autoreleased object w/ the given regex pattern with the default options ++ (id)regexWithPattern:(NSString *)pattern; + +/// Create a new, autoreleased object w/ the given regex pattern and specify the matching options ++ (id)regexWithPattern:(NSString *)pattern options:(GTMRegexOptions)options; + +/// Create a new, autoreleased object w/ the given regex pattern, specify the matching options and receive any error consuming the pattern. ++ (id)regexWithPattern:(NSString *)pattern + options:(GTMRegexOptions)options + withError:(NSError **)outErrorOrNULL; + +/// Returns a new, autoreleased copy of |str| w/ any pattern chars in it escaped so they have no meaning when used w/in a pattern. ++ (NSString *)escapedPatternForString:(NSString *)str; + +/// Initialize a new object w/ the given regex pattern with the default options +- (id)initWithPattern:(NSString *)pattern; + +/// Initialize a new object w/ the given regex pattern and specify the matching options +- (id)initWithPattern:(NSString *)pattern options:(GTMRegexOptions)options; + +/// Initialize a new object w/ the given regex pattern, specify the matching options, and receive any error consuming the pattern. +- (id)initWithPattern:(NSString *)pattern + options:(GTMRegexOptions)options + withError:(NSError **)outErrorOrNULL; + +/// Returns the number of sub patterns in the pattern +// +// Sub Patterns are basically the number of parenthesis blocks w/in the pattern. +// ie: The pattern "foo((bar)|(baz))" has 3 sub patterns. +// +- (NSUInteger)subPatternCount; + +/// Returns YES if the whole string |str| matches the pattern. +- (BOOL)matchesString:(NSString *)str; + +/// Returns a new, autoreleased array of string that contain the subpattern matches for the string. +// +// If the whole string does not match the pattern, nil is returned. +// +// The api follows the conventions of most regex engines, and index 0 (zero) is +// the full match, then the subpatterns are index 1, 2, ... going left to right. +// If the pattern has optional subpatterns, then anything that didn't match +// will have NSNull at that index. +// ie: The pattern "(fo(o+))((bar)|(baz))" has five subpatterns, and when +// applied to the string "foooooobaz" you'd get an array of: +// 0: "foooooobaz" +// 1: "foooooo" +// 2: "ooooo" +// 3: "baz" +// 4: NSNull +// 5: "baz" +// +- (NSArray *)subPatternsOfString:(NSString *)str; + +/// Returns the first match for this pattern in |str|. +- (NSString *)firstSubStringMatchedInString:(NSString *)str; + +/// Returns YES if this pattern some substring of |str|. +- (BOOL)matchesSubStringInString:(NSString *)str; + +/// Returns a new, autoreleased enumerator that will walk segments (GTMRegexStringSegment) of |str| based on the pattern. +// +// This will split the string into "segments" using the given pattern. You get +// both the matches and parts that are inbetween matches. ie-the entire string +// will eventually be returned. +// +// See GTMRegexStringSegment for more infomation and examples. +// +- (NSEnumerator *)segmentEnumeratorForString:(NSString *)str; + +/// Returns a new, autoreleased enumerator that will walk only the matching segments (GTMRegexStringSegment) of |str| based on the pattern. +// +// This extracts the "segments" of the string that used the pattern. So it can +// be used to collect all of the matching substrings from within a string. +// +// See GTMRegexStringSegment for more infomation and examples. +// +- (NSEnumerator *)matchSegmentEnumeratorForString:(NSString *)str; + +/// Returns a new, autoreleased string with all matches of the pattern in |str| replaced with |replacementPattern|. +// +// Replacement uses the SED substitution like syntax w/in |replacementPattern| +// to allow the use of matches in the replacment. The replacement pattern can +// make use of any number of match references by using a backslash followed by +// the match subexpression number (ie-"\2", "\0", ...), see subPatternsOfString: +// for details on the subexpression indexing. +// +// REMINDER: you need to double-slash since the slash has meaning to the +// compiler/preprocessor. ie: "\\0" +// +- (NSString *)stringByReplacingMatchesInString:(NSString *)str + withReplacement:(NSString *)replacementPattern; + +@end + +/// Class returned by the nextObject for the enumerators from GTMRegex +// +// The two enumerators on from GTMRegex return objects of this type. This object +// represents a "piece" of the string the enumerator is walking. It's the apis +// on this object allow you to figure out why each segment was returned and to +// act on it. +// +// The easiest way to under stand this how the enumerators and this class works +// is through and examples :: +// Pattern: "foo+" +// String: "fo bar foobar foofooo baz" +// If you walk this w/ -segmentEnumeratorForString you'll get: +// # nextObjects Calls -isMatch -string +// 1 NO "fo bar " +// 2 YES "foo" +// 3 NO "bar " +// 4 YES "foo" +// 5 YES "fooo" +// 6 NO " baz" +// And if you walk this w/ -matchSegmentEnumeratorForString you'll get: +// # nextObjects Calls -isMatch -string +// 1 YES "foo" +// 2 YES "foo" +// 3 YES "fooo" +// (see the comments on subPatternString for how it works) +// +// Example usage: +// +// NSMutableString processedStr = [NSMutableString string]; +// NSEnumerator *enumerator = +// [inputStr segmentEnumeratorForPattern:@"foo+((ba+r)|(ba+z))"]; +// GTMRegexStringSegment *segment = nil; +// while ((segment = [enumerator nextObject]) != nil) { +// if ([segment isMatch]) { +// if ([segment subPatterString:2] != nil) { +// // matched: "(ba+r)" +// [processStr appendFormat:@"%@", [segment string]]; +// } else { +// // matched: "(ba+z)" +// [processStr appendFormat:@"%@", [segment string]]; +// } +// } else { +// [processStr appendString:[segment string]]; +// } +// } +// // proccessedStr now has all the versions of foobar wrapped in bold tags, +// // and all the versons of foobaz in italics tags. +// // ie: " fooobar foobaaz " ==> " fooobar foobaaz " +// +@interface GTMRegexStringSegment : NSObject { + @private + NSData *utf8StrBuf_; + regmatch_t *regMatches_; // STRONG: ie-we call free + NSUInteger numRegMatches_; + BOOL isMatch_; +} + +/// Returns YES if this segment from from a match of the regex, false if it was a segment between matches. +// +// Use -isMatch to see if the segment from from a match of the pattern or if the +// segment is some text between matches. (NOTE: isMatch is always YES for +// matchSegmentEnumeratorForString) +// +- (BOOL)isMatch; + +/// Returns a new, autoreleased string w/ the full text segment from the original string. +- (NSString *)string; + +/// Returns a new, autoreleased string w/ the |index| sub pattern from this segment of the original string. +// +// This api follows the conventions of most regex engines, and index 0 (zero) is +// the full match, then the subpatterns are index 1, 2, ... going left to right. +// If the pattern has optional subpatterns, then anything that didn't match +// will return nil. +// ie: When using the pattern "(fo(o+))((bar)|(baz))" the following indexes +// fetch these values for a segment where -string is @"foooooobaz": +// 0: "foooooobaz" +// 1: "foooooo" +// 2: "ooooo" +// 3: "baz" +// 4: nil +// 5: "baz" +// +- (NSString *)subPatternString:(NSUInteger)index; + +@end + +/// Some helpers to streamline usage of GTMRegex +// +// Example usage: +// +// if ([inputStr matchesPattern:@"foo.*bar"]) { +// // act on match +// .... +// } +// +// ------------- +// +// NSString *subStr = [inputStr firstSubStringMatchedByPattern:@"^foo:.*$"]; +// if (subStr != nil) { +// // act on subStr +// .... +// } +// +// ------------- +// +// NSArray *headingList = +// [inputStr allSubstringsMatchedByPattern:@"^Heading:.*$"]; +// // act on the list of headings +// .... +// +// ------------- +// +// NSString *highlightedString = +// [inputString stringByReplacingMatchesOfPattern:@"(foo+)(bar)" +// withReplacement:@"\\1\\2"]; +// .... +// +@interface NSString (GTMRegexAdditions) + +/// Returns YES if the full string matches regex |pattern| using the default match options +- (BOOL)gtm_matchesPattern:(NSString *)pattern; + +/// Returns a new, autoreleased array of strings that contain the subpattern matches of |pattern| using the default match options +// +// See [GTMRegex subPatternsOfString:] for information about the returned array. +// +- (NSArray *)gtm_subPatternsOfPattern:(NSString *)pattern; + +/// Returns a new, autoreleased string w/ the first substring that matched the regex |pattern| using the default match options +- (NSString *)gtm_firstSubStringMatchedByPattern:(NSString *)pattern; + +/// Returns YES if a substring string matches regex |pattern| using the default match options +- (BOOL)gtm_subStringMatchesPattern:(NSString *)pattern; + +/// Returns a new, autoreleased array of substrings in the string that match the regex |pattern| using the default match options +// +// Note: if the string has no matches, you get an empty array. +- (NSArray *)gtm_allSubstringsMatchedByPattern:(NSString *)pattern; + +/// Returns a new, autoreleased segment enumerator that will break the string using pattern w/ the default match options +// +// The enumerator returns GTMRegexStringSegment options, see that class for more +// details and examples. +// +- (NSEnumerator *)gtm_segmentEnumeratorForPattern:(NSString *)pattern; + +/// Returns a new, autoreleased segment enumerator that will only return matching segments from the string using pattern w/ the default match options +// +// The enumerator returns GTMRegexStringSegment options, see that class for more +// details and examples. +// +- (NSEnumerator *)gtm_matchSegmentEnumeratorForPattern:(NSString *)pattern; + +/// Returns a new, autoreleased string with all matches for pattern |pattern| are replaced w/ |replacementPattern|. Uses the default match options. +// +// |replacemetPattern| has support for using any subExpression that matched, +// see [GTMRegex stringByReplacingMatchesInString:withReplacement:] above +// for details. +// +- (NSString *)gtm_stringByReplacingMatchesOfPattern:(NSString *)pattern + withReplacement:(NSString *)replacementPattern; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegex.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegex.m new file mode 100644 index 00000000..10272247 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegex.m @@ -0,0 +1,817 @@ +// +// GTMRegex.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#define GTMREGEX_DEFINE_GLOBALS 1 +#import "GTMRegex.h" +#import "GTMDefines.h" + +// This is the pattern to use for walking replacement text when doing +// substitutions. +// +// This pattern may look over-escaped, but remember the compiler will consume +// one layer of slashes, and then we have to escape the slashes for them to be +// seen as we want in the pattern. +static NSString *const kReplacementPattern = + @"((^|[^\\\\])(\\\\\\\\)*)(\\\\([0-9]+))"; +#define kReplacementPatternLeadingTextIndex 1 +#define kReplacementPatternSubpatternNumberIndex 5 + +@interface GTMRegex (PrivateMethods) +- (NSString *)errorMessage:(int)errCode; +- (BOOL)runRegexOnUTF8:(const char*)utf8Str + nmatch:(size_t)nmatch + pmatch:(regmatch_t *)pmatch + flags:(int)flags; +@end + +// private enumerator as impl detail +@interface GTMRegexEnumerator : NSEnumerator { + @private + GTMRegex *regex_; + NSData *utf8StrBuf_; + BOOL allSegments_; + BOOL treatStartOfNewSegmentAsBeginningOfString_; + regoff_t curParseIndex_; + __strong regmatch_t *savedRegMatches_; +} +- (id)initWithRegex:(GTMRegex *)regex + processString:(NSString *)str + allSegments:(BOOL)allSegments; +- (void)treatStartOfNewSegmentAsBeginningOfString:(BOOL)yesNo; +@end + +@interface GTMRegexStringSegment (PrivateMethods) +- (id)initWithUTF8StrBuf:(NSData *)utf8StrBuf + regMatches:(regmatch_t *)regMatches + numRegMatches:(NSUInteger)numRegMatches + isMatch:(BOOL)isMatch; +@end + +@implementation GTMRegex + ++ (id)regexWithPattern:(NSString *)pattern { + return [[[self alloc] initWithPattern:pattern] autorelease]; +} + ++ (id)regexWithPattern:(NSString *)pattern options:(GTMRegexOptions)options { + return [[[self alloc] initWithPattern:pattern + options:options] autorelease]; +} + ++ (id)regexWithPattern:(NSString *)pattern + options:(GTMRegexOptions)options + withError:(NSError **)outErrorOrNULL { + return [[[self alloc] initWithPattern:pattern + options:options + withError:outErrorOrNULL] autorelease]; +} + ++ (NSString *)escapedPatternForString:(NSString *)str { + if (str == nil) + return nil; + + // NOTE: this could be done more efficiently by fetching the whole string into + // a unichar buffer and scanning that, along w/ pushing the data over in + // chunks (when possible). + + NSUInteger len = [str length]; + NSMutableString *result = [NSMutableString stringWithCapacity:len]; + + for (NSUInteger x = 0; x < len; ++x) { + unichar ch = [str characterAtIndex:x]; + switch (ch) { + case '^': + case '.': + case '[': + case '$': + case '(': + case ')': + case '|': + case '*': + case '+': + case '?': + case '{': + case '\\': + [result appendFormat:@"\\%C", ch]; + break; + default: + [result appendFormat:@"%C", ch]; + break; + } + } + + return result; +} + +- (id)init { + return [self initWithPattern:nil]; +} + +- (id)initWithPattern:(NSString *)pattern { + return [self initWithPattern:pattern options:0]; +} + +- (id)initWithPattern:(NSString *)pattern options:(GTMRegexOptions)options { + return [self initWithPattern:pattern options:options withError:nil]; +} + +- (id)initWithPattern:(NSString *)pattern + options:(GTMRegexOptions)options + withError:(NSError **)outErrorOrNULL { + + self = [super init]; + if (!self) return nil; + + if (outErrorOrNULL) *outErrorOrNULL = nil; + + if ([pattern length] == 0) { + [self release]; + return nil; + } + + // figure out the flags + options_ = options; + int flags = REG_EXTENDED; + if (options_ & kGTMRegexOptionIgnoreCase) + flags |= REG_ICASE; + if ((options_ & kGTMRegexOptionSupressNewlineSupport) == 0) + flags |= REG_NEWLINE; + + // even if regcomp failes we need a flags that we did call regcomp so we'll + // call regfree (because the structure can get filled in some to allow better + // error info). we use pattern_ as this flag. + pattern_ = [pattern copy]; + if (!pattern_) { + // COV_NF_START - no real way to force this in a unittest + [self release]; + return nil; + // COV_NF_END + } + + // compile it + int compResult = regcomp(®exData_, [pattern_ UTF8String], flags); + if (compResult != 0) { + NSString *errorStr = [self errorMessage:compResult]; + if (outErrorOrNULL) { + // include the pattern and patternError message in the userInfo. + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys: + pattern_, kGTMRegexPatternErrorPattern, + errorStr, kGTMRegexPatternErrorErrorString, + nil]; + *outErrorOrNULL = [NSError errorWithDomain:kGTMRegexErrorDomain + code:kGTMRegexPatternParseFailedError + userInfo:userInfo]; + } else { + // if caller didn't get us an NSError to fill in, we log the error to help + // debugging. + _GTMDevLog(@"Invalid pattern \"%@\", error: \"%@\"", + pattern_, errorStr); + } + + [self release]; + return nil; + } + + return self; +} + +#if GTM_SUPPORT_GC +- (void)finalize { + // we used pattern_ as our flag that we initialized the regex_t + if (pattern_) { + regfree(®exData_); + [pattern_ release]; + // play it safe and clear it since we use it as a flag for regexData_ + pattern_ = nil; + } + [super finalize]; +} +#endif + +- (void)dealloc { + // we used pattern_ as our flag that we initialized the regex_t + if (pattern_) { + regfree(®exData_); + [pattern_ release]; + // play it safe and clear it since we use it as a flag for regexData_ + pattern_ = nil; + } + [super dealloc]; +} + +- (NSUInteger)subPatternCount { + return regexData_.re_nsub; +} + +- (BOOL)matchesString:(NSString *)str { + regmatch_t regMatch; + if (![self runRegexOnUTF8:[str UTF8String] + nmatch:1 + pmatch:®Match + flags:0]) { + // no match + return NO; + } + + // make sure the match is the full string + return (regMatch.rm_so == 0) && + (regMatch.rm_eo == (regoff_t)[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); +} + +- (NSArray *)subPatternsOfString:(NSString *)str { + NSArray *result = nil; + + NSUInteger count = regexData_.re_nsub + 1; + regmatch_t *regMatches = malloc(sizeof(regmatch_t) * count); + if (!regMatches) + return nil; // COV_NF_LINE - no real way to force this in a unittest + + // wrap it all in a try so we don't leak the malloc + @try { + const char *utf8Str = [str UTF8String]; + if (![self runRegexOnUTF8:utf8Str + nmatch:count + pmatch:regMatches + flags:0]) { + // no match + return nil; + } + + // make sure the match is the full string + if ((regMatches[0].rm_so != 0) || + (regMatches[0].rm_eo != (regoff_t)[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding])) { + // only matched a sub part of the string + return nil; + } + + NSMutableArray *buildResult = [NSMutableArray arrayWithCapacity:count]; + + for (NSUInteger x = 0 ; x < count ; ++x) { + if ((regMatches[x].rm_so == -1) && (regMatches[x].rm_eo == -1)) { + // add NSNull since it wasn't used + [buildResult addObject:[NSNull null]]; + } else { + // fetch the string + const char *base = utf8Str + regMatches[x].rm_so; + regoff_t len = regMatches[x].rm_eo - regMatches[x].rm_so; + NSString *sub = + [[[NSString alloc] initWithBytes:base + length:(NSUInteger)len + encoding:NSUTF8StringEncoding] autorelease]; + [buildResult addObject:sub]; + } + } + + result = buildResult; + } // COV_NF_LINE - radar 5851992 only reachable w/ an uncaught exception which isn't testable + @finally { + free(regMatches); + } + + return result; +} + +- (NSString *)firstSubStringMatchedInString:(NSString *)str { + NSString *result = nil; + + regmatch_t regMatch; + const char *utf8Str = [str UTF8String]; + if ([self runRegexOnUTF8:utf8Str + nmatch:1 + pmatch:®Match + flags:0]) { + // fetch the string + const char *base = utf8Str + regMatch.rm_so; + regoff_t len = regMatch.rm_eo - regMatch.rm_so; + result = + [[[NSString alloc] initWithBytes:base + length:(NSUInteger)len + encoding:NSUTF8StringEncoding] autorelease]; + } + return result; +} + +- (BOOL)matchesSubStringInString:(NSString *)str { + regmatch_t regMatch; + if ([self runRegexOnUTF8:[str UTF8String] + nmatch:1 + pmatch:®Match + flags:0]) { + // don't really care what matched, just report the match + return YES; + } + return NO; +} + +- (NSEnumerator *)segmentEnumeratorForString:(NSString *)str { + return [[[GTMRegexEnumerator alloc] initWithRegex:self + processString:str + allSegments:YES] autorelease]; +} + +- (NSEnumerator *)matchSegmentEnumeratorForString:(NSString *)str { + return [[[GTMRegexEnumerator alloc] initWithRegex:self + processString:str + allSegments:NO] autorelease]; +} + +- (NSString *)stringByReplacingMatchesInString:(NSString *)str + withReplacement:(NSString *)replacementPattern { + if (!str) + return nil; + + // if we have a replacement, we go ahead and crack it now. if the replacement + // is just an empty string (or nil), just use the nil marker. + NSArray *replacements = nil; + if ([replacementPattern length]) { + // don't need newline support, just match the start of the pattern for '^' + GTMRegex *replacementRegex = + [GTMRegex regexWithPattern:kReplacementPattern + options:kGTMRegexOptionSupressNewlineSupport]; +#ifdef DEBUG + if (!replacementRegex) { + _GTMDevLog(@"failed to parse out replacement regex!!!"); // COV_NF_LINE + } +#endif + GTMRegexEnumerator *relacementEnumerator = + [[[GTMRegexEnumerator alloc] initWithRegex:replacementRegex + processString:replacementPattern + allSegments:YES] autorelease]; + // We turn on treatStartOfNewSegmentAsBeginningOfLine for this enumerator. + // As complex as kReplacementPattern is, it can't completely do what we want + // with the normal string walk. The problem is this, backreferences are a + // slash follow by a number ("\0"), but the replacement pattern might + // actually need to use backslashes (they have to be escaped). So if a + // replacement were "\\0", then there is no backreference, instead the + // replacement is a backslash and a zero. Generically this means an even + // number of backslashes are all escapes, and an odd are some number of + // literal backslashes followed by our backreference. Think of it as a "an + // odd number of slashes that comes after a non-backslash character." There + // is no way to rexpress this in re_format(7) extended expressions. Instead + // we look for a non-blackslash or string start followed by an optional even + // number of slashes followed by the backreference; and use the special + // flag; so after each match, we restart claiming it's the start of the + // string. (the problem match w/o this flag is a substition of "\2\1") + [relacementEnumerator treatStartOfNewSegmentAsBeginningOfString:YES]; + // pull them all into an array so we can walk this as many times as needed. + replacements = [relacementEnumerator allObjects]; + if (!replacements) { + // COV_NF_START - no real way to force this in a unittest + _GTMDevLog(@"failed to create the replacements for substitutions"); + return nil; + // COV_NF_END + } + } + + NSMutableString *result = [NSMutableString stringWithCapacity:[str length]]; + + NSEnumerator *enumerator = [self segmentEnumeratorForString:str]; + GTMRegexStringSegment *segment = nil; + while ((segment = [enumerator nextObject]) != nil) { + if (![segment isMatch]) { + // not a match, just move this chunk over + [result appendString:[segment string]]; + } else { + // match... + if (!replacements) { + // no replacements, they want to eat matches, nothing to do + } else { + // spin over the split up replacement + GTMRegexStringSegment *replacementSegment = nil; + GTM_FOREACH_OBJECT(replacementSegment, replacements) { + if (![replacementSegment isMatch]) { + // not a match, raw text to put in + [result appendString:[replacementSegment string]]; + } else { + // match... + + // first goes any leading text + NSString *leading = + [replacementSegment subPatternString:kReplacementPatternLeadingTextIndex]; + if (leading) + [result appendString:leading]; + // then use the subpattern number to find what goes in from the + // original string match. + int subPatternNum = + [[replacementSegment subPatternString:kReplacementPatternSubpatternNumberIndex] intValue]; + NSString *matchSubPatStr = [segment subPatternString:subPatternNum]; + // handle an unused subpattern (ie-nil result) + if (matchSubPatStr) + [result appendString:matchSubPatStr]; + } + } + } + } + } + return result; +} + +- (NSString *)description { + NSMutableString *result = + [NSMutableString stringWithFormat:@"%@<%p> { pattern=\"%@\", rawNumSubPatterns=%zd, options=(", + [self class], self, pattern_, regexData_.re_nsub]; + if (options_) { + if (options_ & kGTMRegexOptionIgnoreCase) + [result appendString:@" IgnoreCase"]; + if ((options_ & kGTMRegexOptionSupressNewlineSupport) == kGTMRegexOptionSupressNewlineSupport) + [result appendString:@" NoNewlineSupport"]; + } else { + [result appendString:@" None(Default)"]; + } + [result appendString:@" ) }"]; + return result; +} + +@end + +@implementation GTMRegex (PrivateMethods) + +- (NSString *)errorMessage:(int)errCode { + NSString *result = @"internal error"; + + // size the buffer we need + size_t len = regerror(errCode, ®exData_, NULL, 0); + char *buffer = (char*)malloc(sizeof(char) * len); + if (buffer) { + // fetch the error + if (len == regerror(errCode, ®exData_, buffer, len)) { + NSString *generatedError = [NSString stringWithUTF8String:buffer]; + if (generatedError) + result = generatedError; + } + free(buffer); + } + return result; +} + +// private helper to run the regex on a block +- (BOOL)runRegexOnUTF8:(const char*)utf8Str + nmatch:(size_t)nmatch + pmatch:(regmatch_t *)pmatch + flags:(int)flags { + if (!utf8Str) + return NO; + + int execResult = regexec(®exData_, utf8Str, nmatch, pmatch, flags); + if (execResult != 0) { +#ifdef DEBUG + if (execResult != REG_NOMATCH) { + // COV_NF_START - no real way to force this in a unittest + NSString *errorStr = [self errorMessage:execResult]; + _GTMDevLog(@"%@: matching string \"%.20s...\", had error: \"%@\"", + self, utf8Str, errorStr); + // COV_NF_END + } +#endif + return NO; + } + return YES; +} + +@end + +@implementation GTMRegexEnumerator + +// we don't block init because the class isn't exported, so no one can +// create one, or if they do, they get whatever happens... + +- (id)initWithRegex:(GTMRegex *)regex + processString:(NSString *)str + allSegments:(BOOL)allSegments { + self = [super init]; + if (!self) return nil; + + // collect args + regex_ = [regex retain]; + utf8StrBuf_ = [[str dataUsingEncoding:NSUTF8StringEncoding] retain]; + allSegments_ = allSegments; + + // arg check + if (!regex_ || !utf8StrBuf_) { + [self release]; + return nil; + } + + // parsing state initialized to zero for us by object creation + + return self; +} + +// Don't need a finalize because savedRegMatches_ is marked __strong +- (void)dealloc { + if (savedRegMatches_) { + free(savedRegMatches_); + savedRegMatches_ = nil; + } + [regex_ release]; + [utf8StrBuf_ release]; + [super dealloc]; +} + +- (void)treatStartOfNewSegmentAsBeginningOfString:(BOOL)yesNo { + // The way regexec works, it assumes the first char it's looking at to the + // start of the string. In normal use, this makes sense; but in this case, + // we're going to walk the entry string splitting it up by our pattern. That + // means for the first call, it is the string start, but for all future calls, + // it is NOT the string start, so we will pass regexec the flag to let it + // know. However, (you knew that was coming), there are some cases where you + // actually want the each pass to be considered as the start of the string + // (usually the cases are where a pattern can't express what's needed w/o + // this). There is no really good way to explain this behavior w/o all this + // text and lot of examples, so for now this is not in the public api, and + // just here. (Hint: see what w/in this file uses this for why we have it) + treatStartOfNewSegmentAsBeginningOfString_ = yesNo; +} + +- (id)nextObject { + + GTMRegexStringSegment *result = nil; + regmatch_t *nextMatches = nil; + BOOL isMatch = NO; + + // we do all this w/in a try, so if something throws, the memory we malloced + // will still get cleaned up + @try { + + // if we have a saved match, use that... + if (savedRegMatches_) { + nextMatches = savedRegMatches_; + savedRegMatches_ = nil; + isMatch = YES; // if we have something saved, it was a pattern match + } + // have we reached the end? + else if (curParseIndex_ >= (regoff_t)[utf8StrBuf_ length]) { + // done, do nothing, we'll return nil + } + // do the search. + else { + + // alloc the match structure (extra space for the zero (full) match) + size_t matchBufSize = ([regex_ subPatternCount] + 1) * sizeof(regmatch_t); + nextMatches = malloc(matchBufSize); + if (!nextMatches) + return nil; // COV_NF_LINE - no real way to force this in a unittest + + // setup our range to work on + nextMatches[0].rm_so = curParseIndex_; + nextMatches[0].rm_eo = [utf8StrBuf_ length]; + + // figure out our flags + int flags = REG_STARTEND; + if ((!treatStartOfNewSegmentAsBeginningOfString_) && + (curParseIndex_ != 0)) { + // see -treatStartOfNewSegmentAsBeginningOfString: for why we have + // this check here. + flags |= REG_NOTBOL; + } + + // call for the match + if ([regex_ runRegexOnUTF8:[utf8StrBuf_ bytes] + nmatch:([regex_ subPatternCount] + 1) + pmatch:nextMatches + flags:flags]) { + // match + + if (allSegments_ && + (nextMatches[0].rm_so != curParseIndex_)) { + // we should return all segments (not just matches), and there was + // something before this match. So safe off this match for later + // and create a range for this. + + savedRegMatches_ = nextMatches; + nextMatches = malloc(matchBufSize); + if (!nextMatches) + return nil; // COV_NF_LINE - no real way to force this in a unittest + + isMatch = NO; + // mark everything but the zero slot w/ not used + for (NSUInteger x = [regex_ subPatternCount]; x > 0; --x) { + nextMatches[x].rm_so = nextMatches[x].rm_eo = -1; + } + nextMatches[0].rm_so = curParseIndex_; + nextMatches[0].rm_eo = savedRegMatches_[0].rm_so; + + // advance our marker + curParseIndex_ = savedRegMatches_[0].rm_eo; + + } else { + // we only return matches or are pointed at a match + + // no real work to do, just fall through to return to return the + // current match. + isMatch = YES; + + // advance our marker + curParseIndex_ = nextMatches[0].rm_eo; + } + + } else { + // no match + + // should we return the last non matching segment? + if (allSegments_) { + isMatch = NO; + // mark everything but the zero slot w/ not used + for (NSUInteger x = [regex_ subPatternCount]; x > 0; --x) { + nextMatches[x].rm_so = nextMatches[x].rm_eo = -1; + } + nextMatches[0].rm_so = curParseIndex_; + nextMatches[0].rm_eo = [utf8StrBuf_ length]; + } else { + // drop match set, we don't want it + free(nextMatches); + nextMatches = nil; + } + + // advance our marker since we're done + curParseIndex_ = [utf8StrBuf_ length]; + + } + } + + // create the segment to return + if (nextMatches) { + result = + [[[GTMRegexStringSegment alloc] initWithUTF8StrBuf:utf8StrBuf_ + regMatches:nextMatches + numRegMatches:[regex_ subPatternCount] + isMatch:isMatch] autorelease]; + nextMatches = nil; + } + } @catch (id e) { // COV_NF_START - no real way to force this in a test + _GTMDevLog(@"Exceptions while trying to advance enumeration (%@)", e); + // if we still have something in our temp, free it + if (nextMatches) + free(nextMatches); + } // COV_NF_END + + return result; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@<%p> { regex=\"%@\", allSegments=%s, string=\"%.20s...\" }", + [self class], self, + regex_, + (allSegments_ ? "YES" : "NO"), + [utf8StrBuf_ bytes]]; +} + +@end + +@implementation GTMRegexStringSegment + +- (id)init { + // make sure init is never called, the class in in the header so someone + // could try to create it by mistake. + // Call super init and release so we don't leak + [[super init] autorelease]; + [self doesNotRecognizeSelector:_cmd]; + return nil; // COV_NF_LINE - return is just here to keep gcc happy +} + +- (void)dealloc { + if (regMatches_) { + free(regMatches_); + regMatches_ = nil; + } + [utf8StrBuf_ release]; + [super dealloc]; +} + +- (BOOL)isMatch { + return isMatch_; +} + +- (NSString *)string { + // fetch match zero + return [self subPatternString:0]; +} + +- (NSString *)subPatternString:(NSUInteger)patternIndex { + if (patternIndex > numRegMatches_) + return nil; + + // pick off when it wasn't found + if ((regMatches_[patternIndex].rm_so == -1) && + (regMatches_[patternIndex].rm_eo == -1)) + return nil; + + // fetch the string + const char *base = (const char*)[utf8StrBuf_ bytes] + + regMatches_[patternIndex].rm_so; + regoff_t len = regMatches_[patternIndex].rm_eo + - regMatches_[patternIndex].rm_so; + return [[[NSString alloc] initWithBytes:base + length:(NSUInteger)len + encoding:NSUTF8StringEncoding] autorelease]; +} + +- (NSString *)description { + NSMutableString *result = + [NSMutableString stringWithFormat:@"%@<%p> { isMatch=\"%s\", subPatterns=(", + [self class], self, (isMatch_ ? "YES" : "NO")]; + for (NSUInteger x = 0; x <= numRegMatches_; ++x) { + NSString *format = @", \"%.*s\""; + if (x == 0) + format = @" \"%.*s\""; + + [result appendFormat:format, + (int)(regMatches_[x].rm_eo - regMatches_[x].rm_so), + (((const char*)[utf8StrBuf_ bytes]) + regMatches_[x].rm_so)]; + } + [result appendString:@" ) }"]; + + return result; +} + +@end + +@implementation GTMRegexStringSegment (PrivateMethods) + +- (id)initWithUTF8StrBuf:(NSData *)utf8StrBuf + regMatches:(regmatch_t *)regMatches + numRegMatches:(NSUInteger)numRegMatches + isMatch:(BOOL)isMatch { + self = [super init]; + if (!self) return nil; + + utf8StrBuf_ = [utf8StrBuf retain]; + regMatches_ = regMatches; + numRegMatches_ = numRegMatches; + isMatch_ = isMatch; + + // check the args + if (!utf8StrBuf_ || !regMatches_) { + // COV_NF_START + // this could only happen something messed w/ our internal state. + [self release]; + return nil; + // COV_NF_END + } + + return self; +} + +@end + +@implementation NSString (GTMRegexAdditions) + +- (BOOL)gtm_matchesPattern:(NSString *)pattern { + GTMRegex *regex = [GTMRegex regexWithPattern:pattern]; + return [regex matchesString:self]; +} + +- (NSArray *)gtm_subPatternsOfPattern:(NSString *)pattern { + GTMRegex *regex = [GTMRegex regexWithPattern:pattern]; + return [regex subPatternsOfString:self]; +} + +- (NSString *)gtm_firstSubStringMatchedByPattern:(NSString *)pattern { + GTMRegex *regex = [GTMRegex regexWithPattern:pattern]; + return [regex firstSubStringMatchedInString:self]; +} + +- (BOOL)gtm_subStringMatchesPattern:(NSString *)pattern { + GTMRegex *regex = [GTMRegex regexWithPattern:pattern]; + return [regex matchesSubStringInString:self]; +} + +- (NSArray *)gtm_allSubstringsMatchedByPattern:(NSString *)pattern { + NSEnumerator *enumerator = [self gtm_matchSegmentEnumeratorForPattern:pattern]; + NSArray *allSegments = [enumerator allObjects]; + return [allSegments valueForKey:@"string"]; +} + +- (NSEnumerator *)gtm_segmentEnumeratorForPattern:(NSString *)pattern { + GTMRegex *regex = [GTMRegex regexWithPattern:pattern]; + return [regex segmentEnumeratorForString:self]; +} + +- (NSEnumerator *)gtm_matchSegmentEnumeratorForPattern:(NSString *)pattern { + GTMRegex *regex = [GTMRegex regexWithPattern:pattern]; + return [regex matchSegmentEnumeratorForString:self]; +} + +- (NSString *)gtm_stringByReplacingMatchesOfPattern:(NSString *)pattern + withReplacement:(NSString *)replacementPattern { + GTMRegex *regex = [GTMRegex regexWithPattern:pattern]; + return [regex stringByReplacingMatchesInString:self + withReplacement:replacementPattern]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegexTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegexTest.m new file mode 100644 index 00000000..6f41d600 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMRegexTest.m @@ -0,0 +1,1245 @@ +// +// GTMRegexTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMRegex.h" +#import "GTMUnitTestDevLog.h" + +// +// NOTE: +// +// We don't really test any of the pattern matching since that's testing +// libregex, we just want to test our wrapper. +// + +@interface GTMRegexTest : GTMTestCase +@end + +@interface NSString_GTMRegexAdditions : GTMTestCase +@end + +@implementation GTMRegexTest + +- (void)testEscapedPatternForString { + STAssertEqualStrings([GTMRegex escapedPatternForString:@"abcdefghijklmnopqrstuvwxyz0123456789"], + @"abcdefghijklmnopqrstuvwxyz0123456789", + nil); + STAssertEqualStrings([GTMRegex escapedPatternForString:@"^.[$()|*+?{\\"], + @"\\^\\.\\[\\$\\(\\)\\|\\*\\+\\?\\{\\\\", + nil); + STAssertEqualStrings([GTMRegex escapedPatternForString:@"a^b.c[d$e(f)g|h*i+j?k{l\\m"], + @"a\\^b\\.c\\[d\\$e\\(f\\)g\\|h\\*i\\+j\\?k\\{l\\\\m", + nil); + + STAssertNil([GTMRegex escapedPatternForString:nil], nil); + STAssertEqualStrings([GTMRegex escapedPatternForString:@""], @"", nil); +} + + +- (void)testInit { + + // fail cases + STAssertNil([[[GTMRegex alloc] init] autorelease], nil); + STAssertNil([[[GTMRegex alloc] initWithPattern:nil] autorelease], nil); + STAssertNil([[[GTMRegex alloc] initWithPattern:nil + options:kGTMRegexOptionIgnoreCase] autorelease], nil); + [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""]; + STAssertNil([[[GTMRegex alloc] initWithPattern:@"(."] autorelease], nil); + [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""]; + STAssertNil([[[GTMRegex alloc] initWithPattern:@"(." + options:kGTMRegexOptionIgnoreCase] autorelease], nil); + // fail cases w/ error param + NSError *error = nil; + STAssertNil([[[GTMRegex alloc] initWithPattern:nil + options:kGTMRegexOptionIgnoreCase + withError:&error] autorelease], nil); + STAssertNil(error, @"no pattern, shouldn't get error object"); + STAssertNil([[[GTMRegex alloc] initWithPattern:@"(." + options:kGTMRegexOptionIgnoreCase + withError:&error] autorelease], nil); + STAssertNotNil(error, nil); + STAssertEqualObjects([error domain], kGTMRegexErrorDomain, nil); + STAssertEquals([error code], (NSInteger)kGTMRegexPatternParseFailedError, nil); + NSDictionary *userInfo = [error userInfo]; + STAssertNotNil(userInfo, @"failed to get userInfo from error"); + STAssertEqualObjects([userInfo objectForKey:kGTMRegexPatternErrorPattern], @"(.", nil); + STAssertNotNil([userInfo objectForKey:kGTMRegexPatternErrorErrorString], nil); + + // basic pattern w/ options + STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"] autorelease], nil); + STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)" + options:0] autorelease], nil); + STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)" + options:kGTMRegexOptionIgnoreCase] autorelease], nil); + error = nil; + STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)" + options:kGTMRegexOptionIgnoreCase + withError:&error] autorelease], nil); + STAssertNil(error, @"shouldn't have been any error"); + + // fail cases (helper) + STAssertNil([GTMRegex regexWithPattern:nil], nil); + STAssertNil([GTMRegex regexWithPattern:nil + options:0], nil); + [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""]; + STAssertNil([GTMRegex regexWithPattern:@"(."], nil); + [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""]; + STAssertNil([GTMRegex regexWithPattern:@"(." + options:0], nil); + // fail cases (helper) w/ error param + STAssertNil([GTMRegex regexWithPattern:nil + options:kGTMRegexOptionIgnoreCase + withError:&error], nil); + STAssertNil(error, @"no pattern, shouldn't get error object"); + STAssertNil([GTMRegex regexWithPattern:@"(." + options:kGTMRegexOptionIgnoreCase + withError:&error], nil); + STAssertNotNil(error, nil); + STAssertEqualObjects([error domain], kGTMRegexErrorDomain, nil); + STAssertEquals([error code], (NSInteger)kGTMRegexPatternParseFailedError, nil); + userInfo = [error userInfo]; + STAssertNotNil(userInfo, @"failed to get userInfo from error"); + STAssertEqualObjects([userInfo objectForKey:kGTMRegexPatternErrorPattern], @"(.", nil); + STAssertNotNil([userInfo objectForKey:kGTMRegexPatternErrorErrorString], nil); + + // basic pattern w/ options (helper) + STAssertNotNil([GTMRegex regexWithPattern:@"(.*)"], nil); + STAssertNotNil([GTMRegex regexWithPattern:@"(.*)" + options:0], nil); + STAssertNotNil([GTMRegex regexWithPattern:@"(.*)" + options:kGTMRegexOptionIgnoreCase], nil); + error = nil; + STAssertNotNil([GTMRegex regexWithPattern:@"(.*)" + options:kGTMRegexOptionIgnoreCase + withError:&error], nil); + STAssertNil(error, @"shouldn't have been any error"); + + // not really a test on GTMRegex, but make sure we block attempts to directly + // alloc/init a GTMRegexStringSegment. + STAssertThrowsSpecificNamed([[[GTMRegexStringSegment alloc] init] autorelease], + NSException, NSInvalidArgumentException, + @"shouldn't have been able to alloc/init a GTMRegexStringSegment"); +} + +- (void)testOptions { + + NSString *testString = @"aaa AAA\nbbb BBB\n aaa aAa\n bbb BbB"; + + // default options + GTMRegex *regex = [GTMRegex regexWithPattern:@"a+"]; + STAssertNotNil(regex, nil); + NSEnumerator *enumerator = [regex segmentEnumeratorForString:testString]; + STAssertNotNil(enumerator, nil); + // "aaa" + GTMRegexStringSegment *seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa", nil); + // " AAA\nbbb BBB\n " + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @" AAA\nbbb BBB\n ", nil); + // "aaa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa", nil); + // " " + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @" ", nil); + // "a" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"a", nil); + // "A" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"A", nil); + // "a" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"a", nil); + // "\n bbb BbB" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"\n bbb BbB", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // kGTMRegexOptionIgnoreCase + regex = [GTMRegex regexWithPattern:@"a+" options:kGTMRegexOptionIgnoreCase]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:testString]; + STAssertNotNil(enumerator, nil); + // "aaa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa", nil); + // " " + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @" ", nil); + // "AAA" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"AAA", nil); + // "\nbbb BBB\n " + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"\nbbb BBB\n ", nil); + // "aaa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa", nil); + // " " + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @" ", nil); + // "aAa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aAa", nil); + // "\n bbb BbB" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"\n bbb BbB", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // defaults w/ '^' + regex = [GTMRegex regexWithPattern:@"^a+"]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:testString]; + STAssertNotNil(enumerator, nil); + // "aaa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa", nil); + // " AAA\nbbb BBB\n aaa aAa\n bbb BbB" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @" AAA\nbbb BBB\n aaa aAa\n bbb BbB", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // defaults w/ '$' + regex = [GTMRegex regexWithPattern:@"B+$"]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:testString]; + STAssertNotNil(enumerator, nil); + // "aaa AAA\nbbb " + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa AAA\nbbb ", nil); + // "BBB" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"BBB", nil); + // "\n aaa aAa\n bbb Bb" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"\n aaa aAa\n bbb Bb", nil); + // "B" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"B", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // kGTMRegexOptionIgnoreCase w/ '$' + regex = [GTMRegex regexWithPattern:@"B+$" + options:kGTMRegexOptionIgnoreCase]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:testString]; + STAssertNotNil(enumerator, nil); + // "aaa AAA\nbbb " + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa AAA\nbbb ", nil); + // "BBB" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"BBB", nil); + // "\n aaa aAa\n bbb " + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"\n aaa aAa\n bbb ", nil); + // "BbB" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"BbB", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test w/ kGTMRegexOptionSupressNewlineSupport and \n in the string + regex = [GTMRegex regexWithPattern:@"a.*b" options:kGTMRegexOptionSupressNewlineSupport]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:testString]; + STAssertNotNil(enumerator, nil); + // "aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb", nil); + // "B" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"B", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test w/o kGTMRegexOptionSupressNewlineSupport and \n in the string + // (this is no match since it '.' can't match the '\n') + regex = [GTMRegex regexWithPattern:@"a.*b"]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:testString]; + STAssertNotNil(enumerator, nil); + // "aaa AAA\nbbb BBB\n aaa aAa\n bbb BbB" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb BbB", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // kGTMRegexOptionSupressNewlineSupport w/ '^' + regex = [GTMRegex regexWithPattern:@"^a+" options:kGTMRegexOptionSupressNewlineSupport]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:testString]; + STAssertNotNil(enumerator, nil); + // "aaa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa", nil); + // " AAA\nbbb BBB\n aaa aAa\n bbb BbB" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @" AAA\nbbb BBB\n aaa aAa\n bbb BbB", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // kGTMRegexOptionSupressNewlineSupport w/ '$' + regex = [GTMRegex regexWithPattern:@"B+$" options:kGTMRegexOptionSupressNewlineSupport]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:testString]; + STAssertNotNil(enumerator, nil); + // "aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb", nil); + // "B" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"B", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); +} + +- (void)testSubPatternCount { + STAssertEquals((NSUInteger)0, [[GTMRegex regexWithPattern:@".*"] subPatternCount], nil); + STAssertEquals((NSUInteger)1, [[GTMRegex regexWithPattern:@"(.*)"] subPatternCount], nil); + STAssertEquals((NSUInteger)1, [[GTMRegex regexWithPattern:@"[fo]*(.*)[bar]*"] subPatternCount], nil); + STAssertEquals((NSUInteger)3, [[GTMRegex regexWithPattern:@"([fo]*)(.*)([bar]*)"] subPatternCount], nil); + STAssertEquals((NSUInteger)7, [[GTMRegex regexWithPattern:@"(([bar]*)|([fo]*))(.*)(([bar]*)|([fo]*))"] subPatternCount], nil); +} + +- (void)testMatchesString { + // simple pattern + GTMRegex *regex = [GTMRegex regexWithPattern:@"foo.*bar"]; + STAssertNotNil(regex, nil); + STAssertTrue([regex matchesString:@"foobar"], nil); + STAssertTrue([regex matchesString:@"foobydoo spambar"], nil); + STAssertFalse([regex matchesString:@"zzfoobarzz"], nil); + STAssertFalse([regex matchesString:@"zzfoobydoo spambarzz"], nil); + STAssertFalse([regex matchesString:@"abcdef"], nil); + STAssertFalse([regex matchesString:@""], nil); + STAssertFalse([regex matchesString:nil], nil); + // pattern w/ sub patterns + regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"]; + STAssertNotNil(regex, nil); + STAssertTrue([regex matchesString:@"foobar"], nil); + STAssertTrue([regex matchesString:@"foobydoo spambar"], nil); + STAssertFalse([regex matchesString:@"zzfoobarzz"], nil); + STAssertFalse([regex matchesString:@"zzfoobydoo spambarzz"], nil); + STAssertFalse([regex matchesString:@"abcdef"], nil); + STAssertFalse([regex matchesString:@""], nil); + STAssertFalse([regex matchesString:nil], nil); +} + +- (void)testSubPatternsOfString { + GTMRegex *regex = [GTMRegex regexWithPattern:@"(fo(o+))((bar)|(baz))"]; + STAssertNotNil(regex, nil); + STAssertEquals((NSUInteger)5, [regex subPatternCount], nil); + NSArray *subPatterns = [regex subPatternsOfString:@"foooooobaz"]; + STAssertNotNil(subPatterns, nil); + STAssertEquals((NSUInteger)6, [subPatterns count], nil); + STAssertEqualStrings(@"foooooobaz", [subPatterns objectAtIndex:0], nil); + STAssertEqualStrings(@"foooooo", [subPatterns objectAtIndex:1], nil); + STAssertEqualStrings(@"ooooo", [subPatterns objectAtIndex:2], nil); + STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:3], nil); + STAssertEqualObjects([NSNull null], [subPatterns objectAtIndex:4], nil); + STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:5], nil); + + // not there + subPatterns = [regex subPatternsOfString:@"aaa"]; + STAssertNil(subPatterns, nil); + + // not extra stuff on either end + subPatterns = [regex subPatternsOfString:@"ZZZfoooooobaz"]; + STAssertNil(subPatterns, nil); + subPatterns = [regex subPatternsOfString:@"foooooobazZZZ"]; + STAssertNil(subPatterns, nil); + subPatterns = [regex subPatternsOfString:@"ZZZfoooooobazZZZ"]; + STAssertNil(subPatterns, nil); +} + +- (void)testFirstSubStringMatchedInString { + // simple pattern + GTMRegex *regex = [GTMRegex regexWithPattern:@"foo.*bar"]; + STAssertNotNil(regex, nil); + STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobar"], + @"foobar", nil); + STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobydoo spambar"], + @"foobydoo spambar", nil); + STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobarzz"], + @"foobar", nil); + STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobydoo spambarzz"], + @"foobydoo spambar", nil); + STAssertNil([regex firstSubStringMatchedInString:@"abcdef"], nil); + STAssertNil([regex firstSubStringMatchedInString:@""], nil); + // pattern w/ sub patterns + regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"]; + STAssertNotNil(regex, nil); + STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobar"], + @"foobar", nil); + STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobydoo spambar"], + @"foobydoo spambar", nil); + STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobarzz"], + @"foobar", nil); + STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobydoo spambarzz"], + @"foobydoo spambar", nil); + STAssertNil([regex firstSubStringMatchedInString:@"abcdef"], nil); + STAssertNil([regex firstSubStringMatchedInString:@""], nil); +} + +- (void)testMatchesSubStringInString { + // simple pattern + GTMRegex *regex = [GTMRegex regexWithPattern:@"foo.*bar"]; + STAssertNotNil(regex, nil); + STAssertTrue([regex matchesSubStringInString:@"foobar"], nil); + STAssertTrue([regex matchesSubStringInString:@"foobydoo spambar"], nil); + STAssertTrue([regex matchesSubStringInString:@"zzfoobarzz"], nil); + STAssertTrue([regex matchesSubStringInString:@"zzfoobydoo spambarzz"], nil); + STAssertFalse([regex matchesSubStringInString:@"abcdef"], nil); + STAssertFalse([regex matchesSubStringInString:@""], nil); + // pattern w/ sub patterns + regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"]; + STAssertNotNil(regex, nil); + STAssertTrue([regex matchesSubStringInString:@"foobar"], nil); + STAssertTrue([regex matchesSubStringInString:@"foobydoo spambar"], nil); + STAssertTrue([regex matchesSubStringInString:@"zzfoobarzz"], nil); + STAssertTrue([regex matchesSubStringInString:@"zzfoobydoo spambarzz"], nil); + STAssertFalse([regex matchesSubStringInString:@"abcdef"], nil); + STAssertFalse([regex matchesSubStringInString:@""], nil); +} + +- (void)testSegmentEnumeratorForString { + GTMRegex *regex = [GTMRegex regexWithPattern:@"foo+ba+r"]; + STAssertNotNil(regex, nil); + + // test odd input + NSEnumerator *enumerator = [regex segmentEnumeratorForString:@""]; + STAssertNotNil(enumerator, nil); + enumerator = [regex segmentEnumeratorForString:nil]; + STAssertNil(enumerator, nil); + + // on w/ the normal tests + enumerator = [regex segmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"]; + STAssertNotNil(enumerator, nil); + // "a" + GTMRegexStringSegment *seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"a", nil); + // "foobar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + // "b" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"b", nil); + // "fooobaar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"fooobaar", nil); + // "foobar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + // "zz" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"zz", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test no match + enumerator = [regex segmentEnumeratorForString:@"aaa"]; + STAssertNotNil(enumerator, nil); + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa", nil); + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test only match + enumerator = [regex segmentEnumeratorForString:@"foobar"]; + STAssertNotNil(enumerator, nil); + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // now test the saved sub segments + regex = [GTMRegex regexWithPattern:@"(foo)((bar)|(baz))"]; + STAssertNotNil(regex, nil); + STAssertEquals((NSUInteger)4, [regex subPatternCount], nil); + enumerator = [regex segmentEnumeratorForString:@"foobarxxfoobaz"]; + STAssertNotNil(enumerator, nil); + // "foobar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + STAssertEqualStrings([seg subPatternString:0], @"foobar", nil); + STAssertEqualStrings([seg subPatternString:1], @"foo", nil); + STAssertEqualStrings([seg subPatternString:2], @"bar", nil); + STAssertEqualStrings([seg subPatternString:3], @"bar", nil); + STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)" + STAssertNil([seg subPatternString:5], nil); + // "xx" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"xx", nil); + STAssertEqualStrings([seg subPatternString:0], @"xx", nil); + STAssertNil([seg subPatternString:1], nil); + // "foobaz" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobaz", nil); + STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil); + STAssertEqualStrings([seg subPatternString:1], @"foo", nil); + STAssertEqualStrings([seg subPatternString:2], @"baz", nil); + STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)" + STAssertEqualStrings([seg subPatternString:4], @"baz", nil); + STAssertNil([seg subPatternString:5], nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test all objects + regex = [GTMRegex regexWithPattern:@"foo+ba+r"]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"]; + STAssertNotNil(enumerator, nil); + NSArray *allSegments = [enumerator allObjects]; + STAssertNotNil(allSegments, nil); + STAssertEquals((NSUInteger)6, [allSegments count], nil); + + // test we are getting the flags right for newline + regex = [GTMRegex regexWithPattern:@"^a"]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:@"aa\naa"]; + STAssertNotNil(enumerator, nil); + // "a" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"a", nil); + // "a\n" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"a\n", nil); + // "a" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"a", nil); + // "a" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"a", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test we are getting the flags right for newline, part 2 + regex = [GTMRegex regexWithPattern:@"^a*$"]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:@"aa\naa\nbb\naa"]; + STAssertNotNil(enumerator, nil); + // "aa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aa", nil); + // "\n" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"\n", nil); + // "aa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aa", nil); + // "\nbb\n" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"\nbb\n", nil); + // "aa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aa", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // make sure the enum cleans up if not walked to the end + regex = [GTMRegex regexWithPattern:@"b+"]; + STAssertNotNil(regex, nil); + enumerator = [regex segmentEnumeratorForString:@"aabbcc"]; + STAssertNotNil(enumerator, nil); + // "aa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aa", nil); + // and done w/o walking the rest +} + +- (void)testMatchSegmentEnumeratorForString { + GTMRegex *regex = [GTMRegex regexWithPattern:@"foo+ba+r"]; + STAssertNotNil(regex, nil); + + // test odd input + NSEnumerator *enumerator = [regex matchSegmentEnumeratorForString:@""]; + STAssertNotNil(enumerator, nil); + enumerator = [regex matchSegmentEnumeratorForString:nil]; + STAssertNil(enumerator, nil); + + // on w/ the normal tests + enumerator = [regex matchSegmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"]; + STAssertNotNil(enumerator, nil); + // "a" - skipped + // "foobar" + GTMRegexStringSegment *seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + // "b" - skipped + // "fooobaar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"fooobaar", nil); + // "foobar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + // "zz" - skipped + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test no match + enumerator = [regex matchSegmentEnumeratorForString:@"aaa"]; + STAssertNotNil(enumerator, nil); + seg = [enumerator nextObject]; + STAssertNil(seg, nil); // should have gotten nothing + + // test only match + enumerator = [regex matchSegmentEnumeratorForString:@"foobar"]; + STAssertNotNil(enumerator, nil); + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // now test the saved sub segments + regex = [GTMRegex regexWithPattern:@"(foo)((bar)|(baz))"]; + STAssertNotNil(regex, nil); + STAssertEquals((NSUInteger)4, [regex subPatternCount], nil); + enumerator = [regex matchSegmentEnumeratorForString:@"foobarxxfoobaz"]; + STAssertNotNil(enumerator, nil); + // "foobar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + STAssertEqualStrings([seg subPatternString:0], @"foobar", nil); + STAssertEqualStrings([seg subPatternString:1], @"foo", nil); + STAssertEqualStrings([seg subPatternString:2], @"bar", nil); + STAssertEqualStrings([seg subPatternString:3], @"bar", nil); + STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)" + STAssertNil([seg subPatternString:5], nil); + // "xx" - skipped + // "foobaz" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobaz", nil); + STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil); + STAssertEqualStrings([seg subPatternString:1], @"foo", nil); + STAssertEqualStrings([seg subPatternString:2], @"baz", nil); + STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)" + STAssertEqualStrings([seg subPatternString:4], @"baz", nil); + STAssertNil([seg subPatternString:5], nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test all objects + regex = [GTMRegex regexWithPattern:@"foo+ba+r"]; + STAssertNotNil(regex, nil); + enumerator = [regex matchSegmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"]; + STAssertNotNil(enumerator, nil); + NSArray *allSegments = [enumerator allObjects]; + STAssertNotNil(allSegments, nil); + STAssertEquals((NSUInteger)3, [allSegments count], nil); + + // test we are getting the flags right for newline + regex = [GTMRegex regexWithPattern:@"^a"]; + STAssertNotNil(regex, nil); + enumerator = [regex matchSegmentEnumeratorForString:@"aa\naa"]; + STAssertNotNil(enumerator, nil); + // "a" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"a", nil); + // "a\n" - skipped + // "a" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"a", nil); + // "a" - skipped + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test we are getting the flags right for newline, part 2 + regex = [GTMRegex regexWithPattern:@"^a*$"]; + STAssertNotNil(regex, nil); + enumerator = [regex matchSegmentEnumeratorForString:@"aa\naa\nbb\naa"]; + STAssertNotNil(enumerator, nil); + // "aa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aa", nil); + // "\n" - skipped + // "aa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aa", nil); + // "\nbb\n" - skipped + // "aa" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aa", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); +} + +- (void)testStringByReplacingMatchesInStringWithReplacement { + GTMRegex *regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"]; + STAssertNotNil(regex, nil); + // the basics + STAssertEqualStrings(@"weeZbarZbydoo spamZfooZdoggies", + [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies" + withReplacement:@"Z\\3Z\\2Z\\1Z"], + nil); + // nil/empty replacement + STAssertEqualStrings(@"weedoggies", + [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies" + withReplacement:nil], + nil); + STAssertEqualStrings(@"weedoggies", + [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies" + withReplacement:@""], + nil); + STAssertEqualStrings(@"", + [regex stringByReplacingMatchesInString:@"" + withReplacement:@"abc"], + nil); + STAssertNil([regex stringByReplacingMatchesInString:nil + withReplacement:@"abc"], + nil); + // use optional and invale subexpression parts to confirm that works + regex = [GTMRegex regexWithPattern:@"(fo(o+))((bar)|(baz))"]; + STAssertNotNil(regex, nil); + STAssertEqualStrings(@"aaa baz bar bar foo baz aaa", + [regex stringByReplacingMatchesInString:@"aaa foooooobaz fooobar bar foo baz aaa" + withReplacement:@"\\4\\5"], + nil); + STAssertEqualStrings(@"aaa ZZZ ZZZ bar foo baz aaa", + [regex stringByReplacingMatchesInString:@"aaa foooooobaz fooobar bar foo baz aaa" + withReplacement:@"Z\\10Z\\12Z"], + nil); + // test slashes in replacement that aren't part of the subpattern reference + regex = [GTMRegex regexWithPattern:@"a+"]; + STAssertNotNil(regex, nil); + STAssertEqualStrings(@"z\\\\0 \\\\a \\\\\\\\0z", + [regex stringByReplacingMatchesInString:@"zaz" + withReplacement:@"\\\\0 \\\\\\0 \\\\\\\\0"], + nil); + STAssertEqualStrings(@"z\\\\a \\\\\\\\0 \\\\\\\\az", + [regex stringByReplacingMatchesInString:@"zaz" + withReplacement:@"\\\\\\0 \\\\\\\\0 \\\\\\\\\\0"], + nil); + STAssertEqualStrings(@"z\\\\\\\\0 \\\\\\\\a \\\\\\\\\\\\0z", + [regex stringByReplacingMatchesInString:@"zaz" + withReplacement:@"\\\\\\\\0 \\\\\\\\\\0 \\\\\\\\\\\\0"], + nil); +} + +- (void)testDescriptions { + // default options + GTMRegex *regex = [GTMRegex regexWithPattern:@"a+"]; + STAssertNotNil(regex, nil); + STAssertGreaterThan([[regex description] length], (NSUInteger)10, + @"failed to get a reasonable description for regex"); + // enumerator + NSEnumerator *enumerator = [regex segmentEnumeratorForString:@"aaabbbccc"]; + STAssertNotNil(enumerator, nil); + STAssertGreaterThan([[enumerator description] length], (NSUInteger)10, + @"failed to get a reasonable description for regex enumerator"); + // string segment + GTMRegexStringSegment *seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertGreaterThan([[seg description] length], (NSUInteger)10, + @"failed to get a reasonable description for regex string segment"); + // regex w/ other options + regex = [GTMRegex regexWithPattern:@"a+" + options:(kGTMRegexOptionIgnoreCase | kGTMRegexOptionSupressNewlineSupport)]; + STAssertNotNil(regex, nil); + STAssertGreaterThan([[regex description] length], (NSUInteger)10, + @"failed to get a reasonable description for regex w/ options"); +} + +@end + +@implementation NSString_GTMRegexAdditions +// Only partial tests to test that the call get through correctly since the +// above really tests them. + +- (void)testMatchesPattern { + // simple pattern + STAssertTrue([@"foobar" gtm_matchesPattern:@"foo.*bar"], nil); + STAssertTrue([@"foobydoo spambar" gtm_matchesPattern:@"foo.*bar"], nil); + STAssertFalse([@"zzfoobarzz" gtm_matchesPattern:@"foo.*bar"], nil); + STAssertFalse([@"zzfoobydoo spambarzz" gtm_matchesPattern:@"foo.*bar"], nil); + STAssertFalse([@"abcdef" gtm_matchesPattern:@"foo.*bar"], nil); + STAssertFalse([@"" gtm_matchesPattern:@"foo.*bar"], nil); + // pattern w/ sub patterns + STAssertTrue([@"foobar" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil); + STAssertTrue([@"foobydoo spambar" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil); + STAssertFalse([@"zzfoobarzz" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil); + STAssertFalse([@"zzfoobydoo spambarzz" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil); + STAssertFalse([@"abcdef" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil); + STAssertFalse([@"" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil); +} + +- (void)testSubPatternsOfPattern { + NSArray *subPatterns = [@"foooooobaz" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"]; + STAssertNotNil(subPatterns, nil); + STAssertEquals((NSUInteger)6, [subPatterns count], nil); + STAssertEqualStrings(@"foooooobaz", [subPatterns objectAtIndex:0], nil); + STAssertEqualStrings(@"foooooo", [subPatterns objectAtIndex:1], nil); + STAssertEqualStrings(@"ooooo", [subPatterns objectAtIndex:2], nil); + STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:3], nil); + STAssertEqualObjects([NSNull null], [subPatterns objectAtIndex:4], nil); + STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:5], nil); + + // not there + subPatterns = [@"aaa" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"]; + STAssertNil(subPatterns, nil); + + // not extra stuff on either end + subPatterns = [@"ZZZfoooooobaz" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"]; + STAssertNil(subPatterns, nil); + subPatterns = [@"foooooobazZZZ" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"]; + STAssertNil(subPatterns, nil); + subPatterns = [@"ZZZfoooooobazZZZ" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"]; + STAssertNil(subPatterns, nil); +} + +- (void)testFirstSubStringMatchedByPattern { + // simple pattern + STAssertEqualStrings([@"foobar" gtm_firstSubStringMatchedByPattern:@"foo.*bar"], + @"foobar", nil); + STAssertEqualStrings([@"foobydoo spambar" gtm_firstSubStringMatchedByPattern:@"foo.*bar"], + @"foobydoo spambar", nil); + STAssertEqualStrings([@"zzfoobarzz" gtm_firstSubStringMatchedByPattern:@"foo.*bar"], + @"foobar", nil); + STAssertEqualStrings([@"zzfoobydoo spambarzz" gtm_firstSubStringMatchedByPattern:@"foo.*bar"], + @"foobydoo spambar", nil); + STAssertNil([@"abcdef" gtm_firstSubStringMatchedByPattern:@"foo.*bar"], nil); + STAssertNil([@"" gtm_firstSubStringMatchedByPattern:@"foo.*bar"], nil); + // pattern w/ sub patterns + STAssertEqualStrings([@"foobar" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"], + @"foobar", nil); + STAssertEqualStrings([@"foobydoo spambar" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"], + @"foobydoo spambar", nil); + STAssertEqualStrings([@"zzfoobarzz" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"], + @"foobar", nil); + STAssertEqualStrings([@"zzfoobydoo spambarzz" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"], + @"foobydoo spambar", nil); + STAssertNil([@"abcdef" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"], nil); + STAssertNil([@"" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"], nil); +} + +- (void)testSubStringMatchesPattern { + // simple pattern + STAssertTrue([@"foobar" gtm_subStringMatchesPattern:@"foo.*bar"], nil); + STAssertTrue([@"foobydoo spambar" gtm_subStringMatchesPattern:@"foo.*bar"], nil); + STAssertTrue([@"zzfoobarzz" gtm_subStringMatchesPattern:@"foo.*bar"], nil); + STAssertTrue([@"zzfoobydoo spambarzz" gtm_subStringMatchesPattern:@"foo.*bar"], nil); + STAssertFalse([@"abcdef" gtm_subStringMatchesPattern:@"foo.*bar"], nil); + STAssertFalse([@"" gtm_subStringMatchesPattern:@"foo.*bar"], nil); + // pattern w/ sub patterns + STAssertTrue([@"foobar" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil); + STAssertTrue([@"foobydoo spambar" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil); + STAssertTrue([@"zzfoobarzz" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil); + STAssertTrue([@"zzfoobydoo spambarzz" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil); + STAssertFalse([@"abcdef" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil); + STAssertFalse([@"" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil); +} + +- (void)testSegmentEnumeratorForPattern { + NSEnumerator *enumerator = + [@"afoobarbfooobaarfoobarzz" gtm_segmentEnumeratorForPattern:@"foo+ba+r"]; + STAssertNotNil(enumerator, nil); + // "a" + GTMRegexStringSegment *seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"a", nil); + // "foobar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + // "b" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"b", nil); + // "fooobaar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"fooobaar", nil); + // "foobar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + // "zz" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"zz", nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test no match + enumerator = [@"aaa" gtm_segmentEnumeratorForPattern:@"foo+ba+r"]; + STAssertNotNil(enumerator, nil); + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"aaa", nil); + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test only match + enumerator = [@"foobar" gtm_segmentEnumeratorForPattern:@"foo+ba+r"]; + STAssertNotNil(enumerator, nil); + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // now test the saved sub segments + enumerator = + [@"foobarxxfoobaz" gtm_segmentEnumeratorForPattern:@"(foo)((bar)|(baz))"]; + STAssertNotNil(enumerator, nil); + // "foobar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + STAssertEqualStrings([seg subPatternString:0], @"foobar", nil); + STAssertEqualStrings([seg subPatternString:1], @"foo", nil); + STAssertEqualStrings([seg subPatternString:2], @"bar", nil); + STAssertEqualStrings([seg subPatternString:3], @"bar", nil); + STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)" + STAssertNil([seg subPatternString:5], nil); + // "xx" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertFalse([seg isMatch], nil); + STAssertEqualStrings([seg string], @"xx", nil); + STAssertEqualStrings([seg subPatternString:0], @"xx", nil); + STAssertNil([seg subPatternString:1], nil); + // "foobaz" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobaz", nil); + STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil); + STAssertEqualStrings([seg subPatternString:1], @"foo", nil); + STAssertEqualStrings([seg subPatternString:2], @"baz", nil); + STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)" + STAssertEqualStrings([seg subPatternString:4], @"baz", nil); + STAssertNil([seg subPatternString:5], nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test all objects + enumerator = [@"afoobarbfooobaarfoobarzz" gtm_segmentEnumeratorForPattern:@"foo+ba+r"]; + STAssertNotNil(enumerator, nil); + NSArray *allSegments = [enumerator allObjects]; + STAssertNotNil(allSegments, nil); + STAssertEquals((NSUInteger)6, [allSegments count], nil); +} + +- (void)testMatchSegmentEnumeratorForPattern { + NSEnumerator *enumerator = + [@"afoobarbfooobaarfoobarzz" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"]; + STAssertNotNil(enumerator, nil); + // "a" - skipped + // "foobar" + GTMRegexStringSegment *seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + // "b" - skipped + // "fooobaar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"fooobaar", nil); + // "foobar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + // "zz" - skipped + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test no match + enumerator = [@"aaa" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"]; + STAssertNotNil(enumerator, nil); + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test only match + enumerator = [@"foobar" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"]; + STAssertNotNil(enumerator, nil); + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // now test the saved sub segments + enumerator = + [@"foobarxxfoobaz" gtm_matchSegmentEnumeratorForPattern:@"(foo)((bar)|(baz))"]; + STAssertNotNil(enumerator, nil); + // "foobar" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobar", nil); + STAssertEqualStrings([seg subPatternString:0], @"foobar", nil); + STAssertEqualStrings([seg subPatternString:1], @"foo", nil); + STAssertEqualStrings([seg subPatternString:2], @"bar", nil); + STAssertEqualStrings([seg subPatternString:3], @"bar", nil); + STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)" + STAssertNil([seg subPatternString:5], nil); + // "xx" - skipped + // "foobaz" + seg = [enumerator nextObject]; + STAssertNotNil(seg, nil); + STAssertTrue([seg isMatch], nil); + STAssertEqualStrings([seg string], @"foobaz", nil); + STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil); + STAssertEqualStrings([seg subPatternString:1], @"foo", nil); + STAssertEqualStrings([seg subPatternString:2], @"baz", nil); + STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)" + STAssertEqualStrings([seg subPatternString:4], @"baz", nil); + STAssertNil([seg subPatternString:5], nil); + // (end) + seg = [enumerator nextObject]; + STAssertNil(seg, nil); + + // test all objects + enumerator = [@"afoobarbfooobaarfoobarzz" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"]; + STAssertNotNil(enumerator, nil); + NSArray *allSegments = [enumerator allObjects]; + STAssertNotNil(allSegments, nil); + STAssertEquals((NSUInteger)3, [allSegments count], nil); +} + +- (void)testAllSubstringsMatchedByPattern { + NSArray *segments = + [@"afoobarbfooobaarfoobarzz" gtm_allSubstringsMatchedByPattern:@"foo+ba+r"]; + STAssertNotNil(segments, nil); + STAssertEquals((NSUInteger)3, [segments count], nil); + STAssertEqualStrings([segments objectAtIndex:0], @"foobar", nil); + STAssertEqualStrings([segments objectAtIndex:1], @"fooobaar", nil); + STAssertEqualStrings([segments objectAtIndex:2], @"foobar", nil); + + // test no match + segments = [@"aaa" gtm_allSubstringsMatchedByPattern:@"foo+ba+r"]; + STAssertNotNil(segments, nil); + STAssertEquals((NSUInteger)0, [segments count], nil); + + // test only match + segments = [@"foobar" gtm_allSubstringsMatchedByPattern:@"foo+ba+r"]; + STAssertNotNil(segments, nil); + STAssertEquals((NSUInteger)1, [segments count], nil); + STAssertEqualStrings([segments objectAtIndex:0], @"foobar", nil); +} + +- (void)testStringByReplacingMatchesOfPatternWithReplacement { + // the basics + STAssertEqualStrings(@"weeZbarZbydoo spamZfooZdoggies", + [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)" + withReplacement:@"Z\\3Z\\2Z\\1Z"], + nil); + // nil/empty replacement + STAssertEqualStrings(@"weedoggies", + [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)" + withReplacement:nil], + nil); + STAssertEqualStrings(@"weedoggies", + [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)" + withReplacement:@""], + nil); + STAssertEqualStrings(@"", + [@"" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)" + withReplacement:@"abc"], + nil); + // use optional and invale subexpression parts to confirm that works + STAssertEqualStrings(@"aaa baz bar bar foo baz aaa", + [@"aaa foooooobaz fooobar bar foo baz aaa" gtm_stringByReplacingMatchesOfPattern:@"(fo(o+))((bar)|(baz))" + withReplacement:@"\\4\\5"], + nil); + STAssertEqualStrings(@"aaa ZZZ ZZZ bar foo baz aaa", + [@"aaa foooooobaz fooobar bar foo baz aaa" gtm_stringByReplacingMatchesOfPattern:@"(fo(o+))((bar)|(baz))" + withReplacement:@"Z\\10Z\\12Z"], + nil); + // test slashes in replacement that aren't part of the subpattern reference + STAssertEqualStrings(@"z\\\\0 \\\\a \\\\\\\\0z", + [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+" + withReplacement:@"\\\\0 \\\\\\0 \\\\\\\\0"], + nil); + STAssertEqualStrings(@"z\\\\a \\\\\\\\0 \\\\\\\\az", + [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+" + withReplacement:@"\\\\\\0 \\\\\\\\0 \\\\\\\\\\0"], + nil); + STAssertEqualStrings(@"z\\\\\\\\0 \\\\\\\\a \\\\\\\\\\\\0z", + [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+" + withReplacement:@"\\\\\\\\0 \\\\\\\\\\0 \\\\\\\\\\\\0"], + nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLite.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLite.h new file mode 100644 index 00000000..0697d5aa --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLite.h @@ -0,0 +1,713 @@ +// +// GTMSQLite.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// +// +// This class is a convenience wrapper for SQLite storage with +// release/retain semantics. In its most basic form, that is all this +// class offers. You have the option of activating "CFAdditions" on +// init which patches or overrides the following SQLite functionality: +// +// - Strings you pass through the API layer will always be converted +// to precomposed UTF-8 with compatibility mapping +// (kCFStringNormalizationFormKC). This is done in an attempt to +// make SQLite correctly handle string equality for composed +// character sequences. This change applies only to +// NSStrings/CFStrings passed through the GTMSQLiteDatabase or +// GTMSQLiteStatement. Direct access to the database using the +// underlying sqlite3_* handles is not affected. +// +// - The SQL UPPER/LOWER functions are replaced with CFString-based +// implementations which (unlike SQLite's native implementation) +// handle case conversion outside the ASCII range. These +// implementations seem to be 20-30% slower than the SQLite +// implementations but may be worth it for accuracy. +// +// - The SQLite "NOCASE" collation is replaced with a CFString-based +// collation that is case insensitive but still uses literal +// comparison (composition-sensitive). +// +// - Additional collation sequences can be created by using these keywords +// separated by underscores. Each option corresponds to a CFStringCompareFlags +// option. +// NOCASE (kCFCompareCaseInsensitive) +// NONLITERAL (kCFCompareNonliteral) +// LOCALIZED (kCFCompareLocalized) +// NUMERIC (kCFCompareNumerically) + +// These additional options are available when linking with the 10.5 SDK: +// NODIACRITIC (kCFCompareDiacriticInsensitive) +// WIDTHINSENSITIVE (kCFCompareWidthInsensitive) +// +// Ordering of the above options can be changed by adding "REVERSE". +// +// Thus, for a case-insensitive, width-insensitive, composition-insensitive +// comparison that ignores diacritical marks and sorts in reverse use: +// +// NOCASE_NONLITERAL_NODIACRITIC_WIDTHINSENSITIVE_REVERSE +// +// - SQL LIKE and GLOB commands are implemented with CFString/CFCharacterSet +// comparisons. As with the other CF additions, this gives us better handling +// of case and composed character sequences. However, whereever reasonable, +// SQLite semantics have been retained. Specific notes: +// +// * LIKE is case insensitive and uses non-literal comparison +// (kCFCompareNonliteral) by default. It is possible to modify this +// behavior using the accessor methods. You must use those methods +// instead of the SQLite "PRAGMA case_sensitive_like" in order for them +// to interact properly with our CFString implementations. +// +// * ESCAPE clauses to LIKE are honored, but the escape character must +// be expressable as a single UniChar (UTF16). The escaped characters in +// LIKE only escape the following UniChar, not a composed character +// sequence. This is not viewed as a limitation since the use of ESCAPE +// is typically only for characters with meaning to SQL LIKE ('%', '_') +// all of which can be expressed as a single UniChar. +// +// * GLOB is by default case sensitive but non-literal. Again, accessor +// methods are available to change this behavior. +// +// * Single character pattern matches ('_' for LIKE, '?' for GLOB) will +// always consume a full composed character sequence. +// +// * As with the standard SQLite implementation, character set comparisons +// are only available for GLOB. +// +// * Character set comparisons are always literal and case sensitive and do +// not take into account composed character sequences. Essentially +// character sets should always be expressed as a set of single UniChars +// or ranges between single UniChars. +// + +// SQLite is preinstalled on 10.4 only. As long as we're using the OS version +// of the library, limit ourself to Tiger+ +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4 +#error SQLite support is Tiger or later +#endif + +#import +#import + +/// Wrapper for SQLite with release/retain semantics and CFString convenience features +@interface GTMSQLiteDatabase : NSObject { + @protected + sqlite3 *db_; // strong + NSString *path_; // strong + int timeoutMS_; + BOOL hasCFAdditions_; + CFOptionFlags likeOptions_; + CFOptionFlags globOptions_; + NSMutableArray *userArgDataPool_; // strong +} + +// Get the numeric version number of the SQLite library (compiled in value +// for SQLITE_VERSION_NUMBER). +// +// Returns: +// Integer version number +// ++ (int)sqliteVersionNumber; + +// Get the string version number of the SQLite library. +// +// Returns: +// Autoreleased NSString version string +// ++ (NSString *)sqliteVersionString; + +// Create and open a database instance on a file-based database. +// +// Args: +// path: Path to the database. If it does not exist an empty database +// will be created. +// withCFAdditions: If true, the SQLite database will include CFString +// based string functions and collation sequences. See +// the class header for information on these differences +// and performance impact. +// err: Result code from SQLite. If nil is returned by this function +// check the result code for the error. If NULL no result code is +// reported. +// +- (id)initWithPath:(NSString *)path + withCFAdditions:(BOOL)additions + utf8:(BOOL)useUTF8 + errorCode:(int *)err; + +// Create and open a memory-based database. Memory-based databases +// cannot be shared amongst threads, and each instance is unique. See +// SQLite documentation for details. +// +// For argument details see [... initWithPath:withCFAdditions:errorCode:] +// +- (id)initInMemoryWithCFAdditions:(BOOL)additions + utf8:(BOOL)useUTF8 + errorCode:(int *)err; + +// Get the underlying SQLite database handle. In general you should +// never do this, if you do use this be careful with how you compose +// and decompse strings you pass to the database. +// +// Returns: +// sqlite3 pointer +// +- (sqlite3 *)sqlite3DB; + +// Enable/Disable the database synchronous mode. Disabling +// synchronous mode results in much faster insert throughput at the +// cost of safety. See the SQlite documentation for details. +// +// Args: +// enable: Boolean flag to determine mode. +// +- (void)synchronousMode:(BOOL)enable; + +// Check if this database instance has our CFString functions and collation +// sequences (see top of file for details). +// +// Returns: +// YES if the GTMSQLiteDatabase instance has our CF additions +// +- (BOOL)hasCFAdditions; + +// Set comparison options for the "LIKE" operator for databases with +// our CF addtions active. +// +// Args: +// options: CFStringCompareFlags value. Note that a limited list +// of options are supported. For example one cannot +// use kCFCompareBackwards as an option. +// +- (void)setLikeComparisonOptions:(CFOptionFlags)options; + +// Get current comparison options for the "LIKE" operator in a database +// with our CF additions active. +// +// Returns: +// Current comparison options or zero if CF additions are inactive. +// +- (CFOptionFlags)likeComparisonOptions; + +// Set comparison options for the "GLOB" operator for databases with +// our CF addtions active. +// +// Args: +// options: CFStringCompareFlags value. Note that a limited list +// of options are supported. For example one cannot +// use kCFCompareBackwards as an option. +// +- (void)setGlobComparisonOptions:(CFOptionFlags)options; + +// Get current comparison options for the "GLOB" operator in a database +// with our CF additions active. +// +// Returns: +// Current comparison options or zero if CF additions are inactive. +// +- (CFOptionFlags)globComparisonOptions; + +// Obtain the last error code from the database +// +// Returns: +// SQLite error code, if no error is pending returns SQLITE_OK +// +- (int)lastErrorCode; + +// Obtain an error string for the last error from the database +// +// Returns: +// Autoreleased NSString error message +// +- (NSString *)lastErrorString; + +// Obtain a count of rows added, mmodified or deleted by the most recent +// statement. See sqlite3_changes() for details and limitations. +// +// Returns: +// Row count +// +- (int)lastChangeCount; + +// Obtain a count of rows added, mmodified or deleted since the database +// was opened. See sqlite3_total_changes() for details and limitations. +// +// Returns: +// Row count +// +- (int)totalChangeCount; + +// Obtain the last insert row ID +// +// Returns: +// 64-bit row ID +// +- (unsigned long long)lastInsertRowID; + +// Interrupt any currently running database operations as soon as possible. +// Running operations will receive a SQLITE_INTERRUPT and will need to +// handle it correctly (this is the callers problem to deal with). +// +- (void)interrupt; + +// Set the timeout value in milliseconds. This is a database global affecting +// all running and future statements. +// +// Args: +// timeoutMS: Integer count in ms SQLite will wait for the database to +// unlock before giving up and returning SQLITE_BUSY. A value +// of 0 or less means the database always returns immediately. +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)setBusyTimeoutMS:(int)timeoutMS; + +// Get the current busy timeout in milliseconds. +// +// Returns: +// Current database busy timeout value in ms, 0 or less means no timeout. +// +- (int)busyTimeoutMS; + +// Execute a string containing one or more SQL statements. No returned data +// is available, use GTMSQLiteStatement for that usage. +// +// Args: +// sql: Raw SQL statement to prepare. It is the caller's responsibility +// to properly escape the SQL. +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)executeSQL:(NSString *)sql; + +// Convenience method to start a deferred transaction (most common case). +// +// Returns: +// YES if the transaction started successfully +// +- (BOOL)beginDeferredTransaction; + +// Convenience method to roll back a transaction. +// +// Returns: +// YES if the transaction rolled back successfully +// +- (BOOL)rollback; + +// Convenience method to commit a transaction. +// +// Returns: +// YES if the transaction committed successfully +// +- (BOOL)commit; + +@end + +// Wrapper class for SQLite statements with retain/release semantics. +// Attempts to behave like an NSEnumerator, however you should bind +// your values before beginning enumeration and unlike NSEnumerator, +// a reset is supported. +// +// The GTMSQLiteDatabase class has options to modify some SQL +// functions and force particular string representations. This class +// honors the database preferences for those options. See the +// GTMSQLiteDatabase header for details. + +/// Wrapper class for SQLite statements with retain/release +/// semantics. +@interface GTMSQLiteStatement : NSObject { + +@protected + sqlite3_stmt *statement_; + BOOL hasCFAdditions_; +} + +#pragma mark Creation, Access and Finalization + +// Create an autoreleased prepared statement, see initWithSQL: for arguments. +// +// NOTE: Even though this object is autoreleased you MUST call +// [finalizeStatement] on this when your done. See the init for explanation. +// +// Returns: +// Autoreleased GTMSQLiteStatement +// ++ (id)statementWithSQL:(NSString *)sql + inDatabase:(GTMSQLiteDatabase *)gtmdb + errorCode:(int *)err; + +// Designated initializer, create a prepared statement. Positional and named +// parameters are supported, see the SQLite documentation. +// +// NOTE: Although this object will clean up its statement when deallocated, +// you are REQUIRED to "finalize" the statement when you are +// through with it. Failing to do this will prevent the database from allowing +// new transactions or queries. In other words, leaving an instance on the +// autorelease pool unfinalized may interfere with other database usage if any +// caller sharing the database uses transactions. +// +// Args: +// sql: Raw SQL statement to prepare. It is the caller's responsibility +// to properly escape the SQL and make sure that the SQL contains +// only _one_ statement. Additional statements are silently ignored. +// db: The GTMSQLiteDatabase (not retained) +// err: Result code from SQLite. If nil is returned by this function +// check the result code for the error. If NULL no result code is +// reported. +// +- (id)initWithSQL:(NSString *)sql + inDatabase:(GTMSQLiteDatabase *)gtmdb + errorCode:(int *)err; + +// Get the underlying SQLite statement handle. In general you should never +// do this, if you do use this be careful with how you compose and +// decompse strings you pass to the database. +// +// Returns: +// sqlite3_stmt pointer +// +- (sqlite3_stmt *)sqlite3Statement; + +// Finalize the statement, allowing other transactions to start on the database +// This method MUST be called when you are done with a statement. Failure to +// do so means that the database will not be torn down properly when it's +// retain count drops to 0 or GC collects it. +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)finalizeStatement; + +#pragma mark Parameters and Binding + +// Get the number of parameters that can be bound in the prepared statement. +// +// Returns: +// Integer count of parameters or -1 on error +// +- (int)parameterCount; + +// Get the position of a parameter with a given name. +// +// Args: +// paramName: String name of the parameter, including any leading punctuation +// (see SQLite docs) +// +// Returns: +// 1-based parameter position index or -1 on error +// +- (int)positionOfParameterNamed:(NSString *)paramName; + +// Get the name of a parameter at a particular index. +// +// Args: +// position: Parameter position (1-based index) +// +// Returns: +// Autoreleased string name of the parameter, including any leading +// punctuation (see SQLite docs) or nil on error. +// +- (NSString *)nameOfParameterAtPosition:(int)position; + +// Bind a NULL at a given position +// +// Args: +// position: Parameter position (1-based index) +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)bindSQLNullAtPosition:(int)position; + +// Bind a blob parameter at a given position index to a raw pointer and +// length. The data will be copied by SQLite +// +// Args: +// position: Parameter position (1-based index) +// bytes: Raw pointer to the data to copy/bind +// length: Number of bytes in the blob +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)bindBlobAtPosition:(int)position bytes:(void *)bytes length:(int)length; + +// Bind an NSData as a blob at a given position. The data will be copied +// by SQLite. +// +// Args: +// position: Parameter position (1-based index) +// data: NSData to convert to blob +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)bindBlobAtPosition:(int)position data:(NSData *)data; + +// Bind a double at the given position (for floats convert to double). +// +// Args: +// position: Parameter position (1-based index) +// value: Double to bind +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)bindDoubleAtPosition:(int)position value:(double)value; + +// Bind an NSNumber as a double value at the given position. +// +// Args: +// position: Parameter position (1-based index) +// number: NSNumber to bind +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)bindNumberAsDoubleAtPosition:(int)position number:(NSNumber *)number; + +// Bind a 32-bit integer at the given position. +// +// Args: +// position: Parameter position (1-based index) +// value: Integer to bind +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)bindInt32AtPosition:(int)position value:(int)value; + +// Bind an NSNumber as a 32-bit integer value at the given position. +// +// Args: +// position: Parameter position (1-based index) +// number: NSNumber to bind +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)bindNumberAsInt32AtPosition:(int)position number:(NSNumber *)number; + +// Bind a 64-bit integer at the given position. +// +// Args: +// position: Parameter position (1-based index) +// value: Int64 value to bind +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)bindLongLongAtPosition:(int)position value:(long long)value; + +// Bind an NSNumber as a 64-bit integer value at the given position. +// +// Args: +// position: Parameter position (1-based index) +// number: NSNumber to bind +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)bindNumberAsLongLongAtPosition:(int)position number:(NSNumber *)number; + +// Bind a string at the given position. +// +// Args: +// position: Parameter position (1-based index) +// string: String to bind (string will be converted to UTF8 and copied). +// NOTE: For bindings it is not necessary for you to SQL escape +// your strings. +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)bindStringAtPosition:(int)position string:(NSString *)string; + +#pragma mark Results + +// Get the number of result columns per row this statement will generate. +// +// Returns: +// Column count, 0 if no columns will be returned ("UPDATE.." etc.), +// -1 on error. +// +- (int)resultColumnCount; + +// Get the name of result colument at a given index. +// +// Args: +// position: Column position (0-based index) +// +// Returns: +// Autoreleased NSString column name or nil if no column exists at that +// position or error. +// +- (NSString *)resultColumnNameAtPosition:(int)position; + +// Get the number of data values in the current row of this statement. +// Generally this will be the same as resultColumnCount:, except when row +// iteration is done (see SQLite docs for sqlite3_data_count()). +// +// Returns: +// Data count or 0 if no data will be returned, -1 on error. +// +- (int)rowDataCount; + +// Get the SQLite type constant for a column in a row. Note that because +// SQLite does not enforce column type restrictions the type of a particular +// column in a row may not match the declared type of the column. +// +// Args: +// position: Column position (0-based index) +// +// Returns: +// SQLite data type constant (i.e. SQLITE_INTEGER, SQLITE_FLOAT, etc.) or +// -1 on error. +// +- (int)resultColumnTypeAtPosition:(int)position; + +// Get the data for a result row blob column as an NSData +// +// Args: +// position: Column position (0-based index) +// +// Returns: +// Autoreleased NSData, nil on error +// +- (NSData *)resultBlobDataAtPosition:(int)position; + +// Get the data for a result row blob column as a double +// +// Args: +// position: Column position (0-based index) +// +// Returns: +// Double value +// +- (double)resultDoubleAtPosition:(int)position; + +// Get the data for a result row blob column as an integer +// +// Args: +// position: Column position (0-based index) +// +// Returns: +// Integer value +// +- (int)resultInt32AtPosition:(int)position; + +// Get the data for a result row blob column as a long long +// +// Args: +// position: Column position (0-based index) +// +// Returns: +// Long long value +// +- (long long)resultLongLongAtPosition:(int)position; + +// Get the data for a result row blob column as an NSNumber +// +// Args: +// position: Column position (0-based index) +// +// Returns: +// Autoreleased NSNumber value or nil on error +// +- (NSNumber *)resultNumberAtPosition:(int)position; + +// Get the data for a result row blob column as an NSString +// +// Args: +// position: Column position (0-based index) +// +// Returns: +// Autoreleased NSString value or nil on error +// +- (NSString *)resultStringAtPosition:(int)position; + +// Get a Foundation object (NSData, NSNumber, NSString, NSNull) for the column, +// autodetecting the most appropriate representation. +// +// Args: +// position: Column position (0-based index) +// +// Returns: +// Autoreleased Foundation type, nil on error +// +- (id)resultFoundationObjectAtPosition:(int)position; + +// Get an array of Foundation objects for the row in query column order. +// +// Returns: +// Autoreleased array of Foundation types or nil if there is no +// data in the row or error +// +- (NSArray *)resultRowArray; + +// Get a dictionary of Foundation objects for the row keyed by column name. +// +// Returns: +// Autoreleased dictionary of Foundation types or nil if there is no +// data in the row or error. +// +- (NSDictionary *)resultRowDictionary; + +#pragma mark Rows + +// Step the statement forward one row, potentially spinning forever till +// the row can be located (if database is SQLITE_BUSY). +// +// Returns: +// SQLite result code, SQLITE_ROW if a row was found or SQLITE_DONE if +// no further rows match the statement. +// +- (int)stepRow; + +// Step the statement forward one row, waiting at most the currrent database +// busy timeout (see [GTMSQLiteDatabase setBusyTimeoutMS]). +// +// Returns: +// SQLite result code, SQLITE_ROW if a row was found or SQLITE_DONE if +// no further rows match the statement. If SQLITE_BUSY is returned the +// database did not unlock during the timeout. +// +- (int)stepRowWithTimeout; + +// Reset the statement starting again at the first row +// +// Returns: +// SQLite result code, SQLITE_OK on no error +// +- (int)reset; + +// Check if the SQLite parser recognizes the receiver as one or more valid +// SQLite statements. +// +// Returns: +// YES if the string is a complete and valid SQLite statement +// ++ (BOOL)isCompleteStatement:(NSString *)string; + +// Quote and escape the receiver for SQL. +// Example: "This is wild! It's fun!" +// Becomes: "'This is wild! It''s fun!'" +// +// Returns: +// Autoreleased NSString ++ (NSString *)quoteAndEscapeString:(NSString *)string; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLite.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLite.m new file mode 100644 index 00000000..0225ff54 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLite.m @@ -0,0 +1,2012 @@ +// +// GTMSQLite.m +// +// Convenience wrapper for SQLite storage see the header for details. +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + + +#import +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +#import +#endif +#import "GTMSQLite.h" +#import "GTMMethodCheck.h" +#import "GTMDefines.h" +#include +#import "GTMGarbageCollection.h" + +typedef struct { + BOOL upperCase; + int textRep; +} UpperLowerUserArgs; + +typedef struct { + BOOL reverse; + CFOptionFlags compareOptions; + int textRep; +} CollateUserArgs; + +typedef struct { + CFOptionFlags *compareOptionPtr; + int textRep; +} LikeGlobUserArgs; + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +// While we want to be compatible with Tiger, some operations are more +// efficient when implemented with Leopard APIs. We look those up dynamically. +// CFStringCreateWithBytesNoCopy +static const char* const kCFStringCreateWithBytesNoCopySymbolName = + "CFStringCreateWithBytesNoCopy"; + +typedef CFStringRef (*CFStringCreateWithBytesNoCopyPtrType)(CFAllocatorRef, + const UInt8 *, + CFIndex, + CFStringEncoding, + Boolean, + CFAllocatorRef); +static CFStringCreateWithBytesNoCopyPtrType gCFStringCreateWithBytesNoCopySymbol = NULL; +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + +// Helper inline for SQLite text type to CF endcoding +GTM_INLINE CFStringEncoding SqliteTextEncodingToCFStringEncoding(int enc) { + // Default should never happen, but assume UTF 8 + CFStringEncoding encoding = kCFStringEncodingUTF8; + _GTMDevAssert(enc == SQLITE_UTF16BE || + enc == SQLITE_UTF16LE, + @"Passed in encoding was not a UTF16 encoding"); + switch(enc) { + case SQLITE_UTF16BE: + encoding = kCFStringEncodingUTF16BE; + break; + case SQLITE_UTF16LE: + encoding = kCFStringEncodingUTF16LE; + break; + } + return encoding; +} + +// Helper inline for filtering CFStringCompareFlags +GTM_INLINE CFOptionFlags FilteredStringCompareFlags(CFOptionFlags inOptions) { + CFOptionFlags outOptions = 0; + if (inOptions & kCFCompareCaseInsensitive) { + outOptions |= kCFCompareCaseInsensitive; + } + if (inOptions & kCFCompareNonliteral) outOptions |= kCFCompareNonliteral; + if (inOptions & kCFCompareLocalized) outOptions |= kCFCompareLocalized; + if (inOptions & kCFCompareNumerically) outOptions |= kCFCompareNumerically; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + if (inOptions & kCFCompareDiacriticInsensitive) { + outOptions |= kCFCompareDiacriticInsensitive; + } + if (inOptions & kCFCompareWidthInsensitive) { + outOptions |= kCFCompareWidthInsensitive; + } +#endif + return outOptions; +} + +// Function prototypes for our custom implementations of UPPER/LOWER using +// CFString so that we handle Unicode and localization more cleanly than +// native SQLite. +static void UpperLower8(sqlite3_context *context, + int argc, + sqlite3_value **argv); +static void UpperLower16(sqlite3_context *context, + int argc, + sqlite3_value **argv); + +// Function prototypes for CFString-based collation sequences +static void CollateNeeded(void *userContext, sqlite3 *db, + int textRep, const char *name); +static int Collate8(void *userContext, int length1, const void *str1, + int length2, const void *str2); +static int Collate16(void *userContext, int length1, const void *str1, + int length2, const void *str2); + +// Function prototypes for CFString LIKE and GLOB +static void Like8(sqlite3_context *context, int argc, sqlite3_value **argv); +static void Like16(sqlite3_context *context, int argc, sqlite3_value **argv); +static void Glob8(sqlite3_context *context, int argc, sqlite3_value **argv); +static void Glob16(sqlite3_context *context, int argc, sqlite3_value **argv); + +// The CFLocale of the current user at process start +static CFLocaleRef gCurrentLocale = NULL; + +// Private methods +@interface GTMSQLiteDatabase (PrivateMethods) + +- (int)installCFAdditions; +- (void)collationArgumentRetain:(NSData *)collationArgs; +// Convenience method to clean up resources. Called from both +// dealloc & finalize +// +- (void)cleanupDB; +@end + +@implementation GTMSQLiteDatabase + ++ (void)initialize { + // Need the locale for some CFString enhancements + gCurrentLocale = CFLocaleCopyCurrent(); + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + // Compiling pre-Leopard try to find some symbols dynamically + gCFStringCreateWithBytesNoCopySymbol = + (CFStringCreateWithBytesNoCopyPtrType)dlsym( + RTLD_DEFAULT, + kCFStringCreateWithBytesNoCopySymbolName); +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +} + ++ (int)sqliteVersionNumber { + return sqlite3_libversion_number(); +} + ++ (NSString *)sqliteVersionString { + return [NSString stringWithUTF8String:sqlite3_libversion()]; +} + +- (id)initWithPath:(NSString *)path + withCFAdditions:(BOOL)additions + utf8:(BOOL)useUTF8 + errorCode:(int *)err { + int rc = SQLITE_INTERNAL; + + if ((self = [super init])) { + path_ = [path copy]; + if (useUTF8) { + rc = sqlite3_open([path_ fileSystemRepresentation], &db_); + } else { + CFStringEncoding cfEncoding; +#if TARGET_RT_BIG_ENDIAN + cfEncoding = kCFStringEncodingUTF16BE; +#else + cfEncoding = kCFStringEncodingUTF16LE; +#endif + NSStringEncoding nsEncoding + = CFStringConvertEncodingToNSStringEncoding(cfEncoding); + NSData *data = [path dataUsingEncoding:nsEncoding]; + // Using -[NSString cStringUsingEncoding] causes sqlite3_open16 + // to fail because it expects 2 null-terminating bytes and + // cStringUsingEncoding only has 1 + NSMutableData *mutable = [NSMutableData dataWithData:data]; + [mutable increaseLengthBy:2]; + rc = sqlite3_open16([mutable bytes], &db_); + } + + if ((rc == SQLITE_OK) && db_) { + if (additions) { + userArgDataPool_ = [[NSMutableArray array] retain]; + if (!userArgDataPool_) { + // Leave *err as internal err + // COV_NF_START - not sure how to fail Cocoa initializers + [self release]; + return nil; + // COV_NF_END + } + rc = [self installCFAdditions]; + } + } + + if (err) *err = rc; + + if (rc != SQLITE_OK) { + // COV_NF_START + [self release]; + self = nil; + // COV_NF_END + } + } + + return self; +} + +- (id)initInMemoryWithCFAdditions:(BOOL)additions + utf8:(BOOL)useUTF8 + errorCode:(int *)err { + return [self initWithPath:@":memory:" + withCFAdditions:additions + utf8:useUTF8 + errorCode:err]; +} + +#if GTM_SUPPORT_GC +- (void)finalize { + [self cleanupDB]; + [super finalize]; +} +#endif + +- (void)dealloc { + [self cleanupDB]; + [super dealloc]; +} + +- (void)cleanupDB { + if (db_) { + int rc = sqlite3_close(db_); + if (rc != SQLITE_OK) { + _GTMDevLog(@"Unable to close \"%@\", error code: %d\r" + @"Did you forget to call -[GTMSQLiteStatement" + @" finalizeStatement] on one of your statements?", + self, rc); + } + } + [path_ release]; + [userArgDataPool_ release]; +} + +// Private method to install our custom CoreFoundation additions to SQLite +// behavior +- (int)installCFAdditions { + int rc = SQLITE_OK; + // Install our custom functions for improved text handling + // UPPER/LOWER + const struct { + const char *sqlName; + UpperLowerUserArgs userArgs; + void *function; + } customUpperLower[] = { + { "upper", { YES, SQLITE_UTF8 }, &UpperLower8 }, + { "upper", { YES, SQLITE_UTF16 }, &UpperLower16 }, + { "upper", { YES, SQLITE_UTF16BE }, &UpperLower16 }, + { "upper", { YES, SQLITE_UTF16LE }, &UpperLower16 }, + { "lower", { NO, SQLITE_UTF8 }, &UpperLower8 }, + { "lower", { NO, SQLITE_UTF16 }, &UpperLower16 }, + { "lower", { NO, SQLITE_UTF16BE }, &UpperLower16 }, + { "lower", { NO, SQLITE_UTF16LE }, &UpperLower16 }, + }; + + for (size_t i = 0; + i < (sizeof(customUpperLower) / sizeof(customUpperLower[0])); + i++) { + rc = sqlite3_create_function(db_, + customUpperLower[i].sqlName, + 1, + customUpperLower[i].userArgs.textRep, + (void *)&customUpperLower[i].userArgs, + customUpperLower[i].function, + NULL, + NULL); + if (rc != SQLITE_OK) + return rc; // COV_NF_LINE because sqlite3_create_function is + // called with input defined at compile-time + } + + // Fixed collation sequences + const struct { + const char *sqlName; + CollateUserArgs userArgs; + void *function; + } customCollationSequence[] = { + { "nocase", { NO, kCFCompareCaseInsensitive, SQLITE_UTF8 }, &Collate8 }, + { "nocase", { NO, kCFCompareCaseInsensitive, SQLITE_UTF16 }, &Collate16 }, + { "nocase", { NO, kCFCompareCaseInsensitive, SQLITE_UTF16BE }, &Collate16 }, + { "nocase", { NO, kCFCompareCaseInsensitive, SQLITE_UTF16LE }, &Collate16 }, + }; + + for (size_t i = 0; + i < (sizeof(customCollationSequence) / sizeof(customCollationSequence[0])); + i++) { + rc = sqlite3_create_collation(db_, + customCollationSequence[i].sqlName, + customCollationSequence[i].userArgs.textRep, + (void *)&customCollationSequence[i].userArgs, + customCollationSequence[i].function); + if (rc != SQLITE_OK) + return rc; // COV_NF_LINE because the input to + // sqlite3_create_collation is set at compile time + } + + // Install handler for dynamic collation sequences + const struct { + const char *sqlName; + int numArgs; + int textRep; + void *function; + } customLike[] = { + { "like", 2, SQLITE_UTF8, &Like8 }, + { "like", 2, SQLITE_UTF16, &Like16 }, + { "like", 2, SQLITE_UTF16BE, &Like16 }, + { "like", 2, SQLITE_UTF16LE, &Like16 }, + { "like", 3, SQLITE_UTF8, &Like8 }, + { "like", 3, SQLITE_UTF16, &Like16 }, + { "like", 3, SQLITE_UTF16BE, &Like16 }, + { "like", 3, SQLITE_UTF16LE, &Like16 }, + }; + + rc = sqlite3_collation_needed(db_, self, &CollateNeeded); + if (rc != SQLITE_OK) + return rc; // COV_NF_LINE because input to + // sqlite3_collation_needed is static + + // Start LIKE as case-insensitive and non-literal + // (sqlite defaults LIKE to case-insensitive) + likeOptions_ = kCFCompareCaseInsensitive | kCFCompareNonliteral; + for (size_t i = 0; i < (sizeof(customLike) / sizeof(customLike[0])); i++) { + // Each implementation gets its own user args + NSMutableData *argsData + = [NSMutableData dataWithLength:sizeof(LikeGlobUserArgs)]; + if (!argsData) return SQLITE_INTERNAL; + [userArgDataPool_ addObject:argsData]; + LikeGlobUserArgs *args = (LikeGlobUserArgs *)[argsData bytes]; + args->compareOptionPtr = &likeOptions_; + args->textRep = customLike[i].textRep; + rc = sqlite3_create_function(db_, + customLike[i].sqlName, + customLike[i].numArgs, + customLike[i].textRep, + args, + customLike[i].function, + NULL, + NULL); + if (rc != SQLITE_OK) + return rc; // COV_NF_LINE because input to + // sqlite3_create_function is static + } + + // Start GLOB just non-literal but case-sensitive (same as SQLite defaults) + const struct { + const char *sqlName; + int textRep; + void *function; + } customGlob[] = { + { "glob", SQLITE_UTF8, &Glob8 }, + { "glob", SQLITE_UTF16, &Glob16 }, + { "glob", SQLITE_UTF16BE, &Glob16 }, + { "glob", SQLITE_UTF16LE, &Glob16 }, + }; + + globOptions_ = kCFCompareNonliteral; + for (size_t i = 0; i < (sizeof(customGlob) / sizeof(customGlob[0])); i++) { + // Each implementation gets its own user args + NSMutableData *argsData + = [NSMutableData dataWithLength:sizeof(LikeGlobUserArgs)]; + if (!argsData) return SQLITE_INTERNAL; + [userArgDataPool_ addObject:argsData]; + LikeGlobUserArgs *args = (LikeGlobUserArgs *)[argsData bytes]; + args->compareOptionPtr = &globOptions_; + args->textRep = customGlob[i].textRep; + rc = sqlite3_create_function(db_, + customGlob[i].sqlName, + 2, + customGlob[i].textRep, + args, + customGlob[i].function, + NULL, + NULL); + if (rc != SQLITE_OK) + return rc; // COV_NF_LINE because input to + // sqlite3_create_function is static + } + + hasCFAdditions_ = YES; + return SQLITE_OK; +} + +// Private method used by collation creation callback +- (void)collationArgumentRetain:(NSData *)collationArgs { + [userArgDataPool_ addObject:collationArgs]; +} + +- (sqlite3 *)sqlite3DB { + return db_; +} + +- (void)synchronousMode:(BOOL)enable { + if (enable) { + [self executeSQL:@"PRAGMA synchronous = NORMAL;"]; + [self executeSQL:@"PRAGMA fullfsync = 1;"]; + } else { + [self executeSQL:@"PRAGMA fullfsync = 0;"]; + [self executeSQL:@"PRAGMA synchronous = OFF;"]; + } +} + +- (BOOL)hasCFAdditions { + return hasCFAdditions_; +} + +- (void)setLikeComparisonOptions:(CFOptionFlags)options { + if (hasCFAdditions_) + likeOptions_ = FilteredStringCompareFlags(options); +} + +- (CFOptionFlags)likeComparisonOptions { + CFOptionFlags flags = 0; + if (hasCFAdditions_) + flags = likeOptions_; + return flags; +} + +- (void)setGlobComparisonOptions:(CFOptionFlags)options { + if (hasCFAdditions_) + globOptions_ = FilteredStringCompareFlags(options); +} + +- (CFOptionFlags)globComparisonOptions { + CFOptionFlags globOptions = 0; + if (hasCFAdditions_) + globOptions = globOptions_; + return globOptions; +} + +- (int)lastErrorCode { + return sqlite3_errcode(db_); +} + +- (NSString *)lastErrorString { + const char *errMsg = sqlite3_errmsg(db_); + if (!errMsg) return nil; + return [NSString stringWithCString:errMsg encoding:NSUTF8StringEncoding]; +} + +- (int)lastChangeCount { + return sqlite3_changes(db_); +} + +- (int)totalChangeCount { + return sqlite3_total_changes(db_); +} + +- (unsigned long long)lastInsertRowID { + return sqlite3_last_insert_rowid(db_); +} + +- (void)interrupt { + sqlite3_interrupt(db_); +} + +- (int)setBusyTimeoutMS:(int)timeoutMS { + int rc = sqlite3_busy_timeout(db_, timeoutMS); + if (rc == SQLITE_OK) { + timeoutMS_ = timeoutMS; + } + return rc; +} + +- (int)busyTimeoutMS { + return timeoutMS_; +} + +- (int)executeSQL:(NSString *)sql { + int rc; + // Sanity + if (!sql) { + rc = SQLITE_MISUSE; // Reasonable return for this case + } else { + if (hasCFAdditions_) { + rc = sqlite3_exec(db_, + [[sql precomposedStringWithCanonicalMapping] + UTF8String], + NULL, NULL, NULL); + } else { + rc = sqlite3_exec(db_, [sql UTF8String], NULL, NULL, NULL); + } + } + return rc; +} + +- (BOOL)beginDeferredTransaction { + int err; + err = [self executeSQL:@"BEGIN DEFERRED TRANSACTION;"]; + return (err == SQLITE_OK) ? YES : NO; +} + +- (BOOL)rollback { + int err = [self executeSQL:@"ROLLBACK TRANSACTION;"]; + return (err == SQLITE_OK) ? YES : NO; +} + +- (BOOL)commit { + int err = [self executeSQL:@"COMMIT TRANSACTION;"]; + return (err == SQLITE_OK) ? YES : NO; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p - %@>", + [self class], self, path_]; +} +@end + + +#pragma mark Upper/Lower + +// Private helper to handle upper/lower conversions for UTF8 +static void UpperLower8(sqlite3_context *context, int argc, sqlite3_value **argv) { + // Args + if ((argc < 1) || (sqlite3_value_type(argv[0]) == SQLITE_NULL)) { + // COV_NF_START + sqlite3_result_error(context, "LOWER/UPPER CF implementation got bad args", + -1); + return; + // COV_NF_END + } + const char *sqlText8 = (void *)sqlite3_value_text(argv[0]); + if (!sqlText8) { + // COV_NF_START + sqlite3_result_error(context, "LOWER/UPPER CF implementation no input UTF8", + -1); + return; + // COV_NF_END + } + + // Get user data + UpperLowerUserArgs *userArgs = sqlite3_user_data(context); + if (!userArgs) { + // COV_NF_START + sqlite3_result_error(context, "LOWER/UPPER CF implementation no user args", + -1); + return; + // COV_NF_END + } + + _GTMDevAssert(userArgs->textRep == SQLITE_UTF8, + @"Received non UTF8 encoding in UpperLower8"); + + // Worker string, must be mutable for case conversion so order our calls + // to only copy once + CFMutableStringRef workerString = + CFStringCreateMutable(kCFAllocatorDefault, 0); + GTMCFAutorelease(workerString); + if (!workerString) { + // COV_NF_START + sqlite3_result_error(context, + "LOWER/UPPER CF implementation failed " \ + "to allocate CFMutableStringRef", -1); + return; + // COV_NF_END + } + CFStringAppendCString(workerString, sqlText8, kCFStringEncodingUTF8); + + // Perform the upper/lower + if (userArgs->upperCase) { + CFStringUppercase(workerString, gCurrentLocale); + } else { + CFStringLowercase(workerString, gCurrentLocale); + } + + // Convert to our canonical composition + CFStringNormalize(workerString, kCFStringNormalizationFormC); + + // Get the bytes we will return, using the more efficient accessor if we can + const char *returnString = CFStringGetCStringPtr(workerString, + kCFStringEncodingUTF8); + if (returnString) { + // COV_NF_START + // Direct buffer, but have SQLite copy it + sqlite3_result_text(context, returnString, -1, SQLITE_TRANSIENT); + // COV_NF_END + } else { + // Need to get a copy + CFIndex workerLength = CFStringGetLength(workerString); + CFIndex bufferSize = + CFStringGetMaximumSizeForEncoding(workerLength, + kCFStringEncodingUTF8); + void *returnBuffer = malloc(bufferSize); + if (!returnBuffer) { + // COV_NF_START + sqlite3_result_error(context, + "LOWER/UPPER failed to allocate return buffer", -1); + return; + // COV_NF_END + } + CFIndex convertedBytes = 0; + CFIndex convertedChars = CFStringGetBytes(workerString, + CFRangeMake(0, workerLength), + kCFStringEncodingUTF8, + 0, + false, + returnBuffer, + bufferSize, + &convertedBytes); + if (convertedChars != workerLength) { + // COV_NF_START + free(returnBuffer); + sqlite3_result_error(context, + "CFStringGetBytes() failed to " \ + "convert all characters", -1); + // COV_NF_END + } else { + // Set the result, letting SQLite take ownership and using free() as + // the destructor + // We cast the 3rd parameter to an int because sqlite3 doesn't appear + // to support 64-bit mode. + sqlite3_result_text(context, returnBuffer, (int)convertedBytes, &free); + } + } +} + +// Private helper to handle upper/lower conversions for UTF16 variants +static void UpperLower16(sqlite3_context *context, + int argc, sqlite3_value **argv) { + // Args + if ((argc < 1) || (sqlite3_value_type(argv[0]) == SQLITE_NULL)) { + // COV_NF_START + sqlite3_result_error(context, "LOWER/UPPER CF implementation got bad args", -1); + return; + // COV_NF_END + } + + // For UTF16 variants we want our working string to be in native-endian + // UTF16. This gives us the fewest number of copies (since SQLite converts + // in-place). There is no advantage to breaking out the string construction + // to use UTF16BE or UTF16LE because all that does is move the conversion + // work into the CFString constructor, so just use simple code. + int sqlText16ByteCount = sqlite3_value_bytes16(argv[0]); + const UniChar *sqlText16 = (void *)sqlite3_value_text16(argv[0]); + if (!sqlText16ByteCount || !sqlText16) { + // COV_NF_START + sqlite3_result_error(context, + "LOWER/UPPER CF implementation no input UTF16", -1); + return; + // COV_NF_END + } + + // Get user data + UpperLowerUserArgs *userArgs = sqlite3_user_data(context); + if (!userArgs) { + // COV_NF_START + sqlite3_result_error(context, "LOWER/UPPER CF implementation no user args", -1); + return; + // COV_NF_END + } + CFStringEncoding encoding = SqliteTextEncodingToCFStringEncoding(userArgs->textRep); + + // Mutable worker for upper/lower + CFMutableStringRef workerString = CFStringCreateMutable(kCFAllocatorDefault, 0); + GTMCFAutorelease(workerString); + if (!workerString) { + // COV_NF_START + sqlite3_result_error(context, + "LOWER/UPPER CF implementation failed " \ + "to allocate CFMutableStringRef", -1); + return; + // COV_NF_END + } + CFStringAppendCharacters(workerString, sqlText16, + sqlText16ByteCount / sizeof(UniChar)); + // Perform the upper/lower + if (userArgs->upperCase) { + CFStringUppercase(workerString, gCurrentLocale); + } else { + CFStringLowercase(workerString, gCurrentLocale); + } + // Convert to our canonical composition + CFStringNormalize(workerString, kCFStringNormalizationFormC); + + // Length after normalization matters + CFIndex workerLength = CFStringGetLength(workerString); + + // If we can give direct byte access use it + const UniChar *returnString = CFStringGetCharactersPtr(workerString); + if (returnString) { + // COV_NF_START details of whether cfstringgetcharactersptr returns + // a buffer or NULL are internal; not something we can depend on. + // When building for Leopard+, CFIndex is a 64-bit type, which is + // why we cast it to an int when we call the sqlite api. + _GTMDevAssert((workerLength * sizeof(UniChar) <= INT_MAX), + @"sqlite methods do not support buffers greater " + @"than 32 bit sizes"); + // Direct access to the internal buffer, hand it to sqlite for copy and + // conversion + sqlite3_result_text16(context, returnString, + (int)(workerLength * sizeof(UniChar)), + SQLITE_TRANSIENT); + // COV_NF_END + } else { + // Need to get a copy since we can't get direct access + CFIndex bufferSize = CFStringGetMaximumSizeForEncoding(workerLength, + encoding); + void *returnBuffer = malloc(bufferSize); + if (!returnBuffer) { + // COV_NF_START + sqlite3_result_error(context, + "LOWER/UPPER CF implementation failed " \ + "to allocate return buffer", -1); + return; + // COV_NF_END + } + CFIndex convertedBytes = 0; + CFIndex convertedChars = CFStringGetBytes(workerString, + CFRangeMake(0, workerLength), + encoding, + 0, + false, + returnBuffer, + bufferSize, + &convertedBytes); + if (convertedChars != workerLength) { + // COV_NF_START + free(returnBuffer); + sqlite3_result_error(context, + "LOWER/UPPER CF implementation CFStringGetBytes() " \ + "failed to convert all characters", -1); + // COV_NF_END + } else { + // When building for Leopard+, CFIndex is a 64-bit type, but + // sqlite3's functions all take ints. Assert the error for dev + // builds and cast down. + _GTMDevAssert((convertedBytes <= INT_MAX), + @"sqlite methods do not support buffers greater " + @"than 32-bit sizes"); + int convertedBytesForSQLite = (int)convertedBytes; + // Set the result, letting SQLite take ownership and using free() as + // the destructor. For output since we're copying out the bytes anyway + // we might as well use the preferred encoding of the original call. + _GTMDevAssert(userArgs->textRep == SQLITE_UTF16BE || + userArgs->textRep == SQLITE_UTF16LE, + @"Received non UTF8 encoding in UpperLower8"); + switch (userArgs->textRep) { + case SQLITE_UTF16BE: + sqlite3_result_text16be(context, returnBuffer, + convertedBytesForSQLite, &free); + break; + case SQLITE_UTF16LE: + sqlite3_result_text16le(context, returnBuffer, + convertedBytesForSQLite, &free); + break; + default: + // COV_NF_START no way to tell sqlite to not use utf8 or utf16? + sqlite3_result_error(context, + "LOWER/UPPER CF implementation " \ + "had unhandled encoding", -1); + // COV_NF_END + } + } + } +} + + +#pragma mark Collations + +static void CollateNeeded(void *userContext, sqlite3 *db, int textRep, + const char *name) { + // Cast + GTMSQLiteDatabase *gtmdb = (GTMSQLiteDatabase *)userContext; + _GTMDevAssert(gtmdb, @"Invalid database parameter from sqlite"); + + // Create space for the collation args + NSMutableData *collationArgsData = + [NSMutableData dataWithLength:sizeof(CollateUserArgs)]; + CollateUserArgs *userArgs = (CollateUserArgs *)[collationArgsData bytes]; + bzero(userArgs, sizeof(CollateUserArgs)); + userArgs->textRep = textRep; + + // Parse the name into the flags we need + NSString *collationName = + [[NSString stringWithUTF8String:name] lowercaseString]; + NSArray *collationComponents = + [collationName componentsSeparatedByString:@"_"]; + NSString *collationFlag = nil; + BOOL atLeastOneValidFlag = NO; + GTM_FOREACH_OBJECT(collationFlag, collationComponents) { + if ([collationFlag isEqualToString:@"reverse"]) { + userArgs->reverse = YES; + atLeastOneValidFlag = YES; + } else if ([collationFlag isEqualToString:@"nocase"]) { + userArgs->compareOptions |= kCFCompareCaseInsensitive; + atLeastOneValidFlag = YES; + } else if ([collationFlag isEqualToString:@"nonliteral"]) { + userArgs->compareOptions |= kCFCompareNonliteral; + atLeastOneValidFlag = YES; + } else if ([collationFlag isEqualToString:@"localized"]) { + userArgs->compareOptions |= kCFCompareLocalized; + atLeastOneValidFlag = YES; + } else if ([collationFlag isEqualToString:@"numeric"]) { + userArgs->compareOptions |= kCFCompareNumerically; + atLeastOneValidFlag = YES; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + } else if ([collationFlag isEqualToString:@"nodiacritic"]) { + userArgs->compareOptions |= kCFCompareDiacriticInsensitive; + atLeastOneValidFlag = YES; + } else if ([collationFlag isEqualToString:@"widthinsensitive"]) { + userArgs->compareOptions |= kCFCompareWidthInsensitive; + atLeastOneValidFlag = YES; +#else + } else if (([collationFlag isEqualToString:@"nodiacritic"]) || + ([collationFlag isEqualToString:@"widthinsensitive"])) { + _GTMDevLog(@"GTMSQLiteDatabase 10.5 collating not " + @"available on 10.4 or earlier"); +#endif + } + } + + // No valid tokens means nothing to do + if (!atLeastOneValidFlag) return; + + int err; + // Add the collation + switch (textRep) { + case SQLITE_UTF8: + err = sqlite3_create_collation([gtmdb sqlite3DB], name, + textRep, userArgs, &Collate8); + if (err != SQLITE_OK) return; + break; + case SQLITE_UTF16: + case SQLITE_UTF16BE: + case SQLITE_UTF16LE: + err = sqlite3_create_collation([gtmdb sqlite3DB], name, + textRep, userArgs, &Collate16); + if (err != SQLITE_OK) return; + break; + default: + return; + } + + // Have the db retain our collate function args + [gtmdb collationArgumentRetain:collationArgsData]; +} + +static int Collate8(void *userContext, int length1, const void *str1, + int length2, const void *str2) { + // User args + CollateUserArgs *userArgs = (CollateUserArgs *)userContext; + _GTMDevAssert(userArgs, @"Invalid user arguments from sqlite"); + + // Sanity and zero-lengths + if (!(str1 && str2) || (!length1 && !length2)) { + return kCFCompareEqualTo; // Best we can do and stable sort + } + if (!length1 && length2) { + if (userArgs->reverse) { + return kCFCompareGreaterThan; + } else { + return kCFCompareLessThan; + } + } else if (length1 && !length2) { + if (userArgs->reverse) { + return kCFCompareLessThan; + } else { + return kCFCompareGreaterThan; + } + } + + // We have UTF8 strings with no terminating null, we want to compare + // with as few copies as possible. Leopard introduced a no-copy string + // creation function, we'll use it when we can but we want to stay compatible + // with Tiger. + CFStringRef string1 = NULL, string2 = NULL; +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + if (gCFStringCreateWithBytesNoCopySymbol) { + string1 = gCFStringCreateWithBytesNoCopySymbol(kCFAllocatorDefault, + str1, + length1, + kCFStringEncodingUTF8, + false, + kCFAllocatorNull); + string2 = gCFStringCreateWithBytesNoCopySymbol(kCFAllocatorDefault, + str2, + length2, + kCFStringEncodingUTF8, + false, + kCFAllocatorNull); + } else { + // Have to use the copy-based variants + string1 = CFStringCreateWithBytes(kCFAllocatorDefault, + str1, + length1, + kCFStringEncodingUTF8, + false); + string2 = CFStringCreateWithBytes(kCFAllocatorDefault, + str2, + length2, + kCFStringEncodingUTF8, + false); + } +#else // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + string1 = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, + str1, + length1, + kCFStringEncodingUTF8, + false, + kCFAllocatorNull); + string2 = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, + str2, + length2, + kCFStringEncodingUTF8, + false, + kCFAllocatorNull); +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + GTMCFAutorelease(string1); + GTMCFAutorelease(string2); + // Allocation failures can't really be sanely handled from a collator + int sqliteResult; + if (!(string1 && string2)) { + // COV_NF_START + sqliteResult = (int)kCFCompareEqualTo; + // COV_NF_END + } else { + // Compare + // We have to cast to int because SQLite takes functions that + // return an int, but when compiling for Leopard+, + // CFComparisonResult is a signed long, but on Tiger it's an int + CFComparisonResult result; + result = CFStringCompare(string1, + string2, + userArgs->compareOptions); + sqliteResult = (int)result; + // Reverse + if (userArgs->reverse && sqliteResult) { + sqliteResult = -sqliteResult; + } + + } + return sqliteResult; +} + +static int Collate16(void *userContext, int length1, const void *str1, + int length2, const void *str2) { + // User args + CollateUserArgs *userArgs = (CollateUserArgs *)userContext; + _GTMDevAssert(userArgs, @"Invalid user arguments from sqlite"); + + // Sanity and zero-lengths + if (!(str1 && str2) || (!length1 && !length2)) { + return kCFCompareEqualTo; // Best we can do and stable sort + } + if (!length1 && length2) { + if (userArgs->reverse) { + return kCFCompareGreaterThan; + } else { + return kCFCompareLessThan; + } + } else if (length1 && !length2) { + if (userArgs->reverse) { + return kCFCompareLessThan; + } else { + return kCFCompareGreaterThan; + } + } + + // Target encoding + CFStringEncoding encoding = + SqliteTextEncodingToCFStringEncoding(userArgs->textRep); + + // We have UTF16 strings, we want to compare with as few copies as + // possible. Since endianness matters we want to use no-copy + // variants where possible and copy (and endian convert) only when + // we must. + CFStringRef string1 = NULL, string2 = NULL; + if ((userArgs->textRep == SQLITE_UTF16) || +#if TARGET_RT_BIG_ENDIAN + (userArgs->textRep == SQLITE_UTF16BE) +#else + (userArgs->textRep == SQLITE_UTF16LE) +#endif + ) { + string1 = CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, + str1, + length1 / sizeof(UniChar), + kCFAllocatorNull); + string2 = CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, + str2, + length2 / sizeof(UniChar), + kCFAllocatorNull); + } else { + // No point in using the "no copy" version of the call here. If the + // bytes were in the native order we'd be in the other part of this + // conditional, so we know we have to copy the string to endian convert + // it. + string1 = CFStringCreateWithBytes(kCFAllocatorDefault, + str1, + length1, + encoding, + false); + string2 = CFStringCreateWithBytes(kCFAllocatorDefault, + str2, + length2, + encoding, + false); + } + + GTMCFAutorelease(string1); + GTMCFAutorelease(string2); + int sqliteResult; + // Allocation failures can't really be sanely handled from a collator + if (!(string1 && string2)) { + // COV_NF_START + sqliteResult = (int)kCFCompareEqualTo; + // COV_NF_END + } else { + // Compare + // We cast the return value to an int because CFComparisonResult + // is a long in Leopard+ builds. I have no idea why we need + // 64-bits for a 3-value enum, but that's how it is... + CFComparisonResult result; + result = CFStringCompare(string1, + string2, + userArgs->compareOptions); + + sqliteResult = (int)result; + //Reverse + if (userArgs->reverse && sqliteResult) { + sqliteResult = -sqliteResult; + } + } + + return sqliteResult; +} + + +#pragma mark Like/Glob + +// Private helper to handle LIKE and GLOB with different encodings. This +// is essentially a reimplementation of patternCompare() in func.c of the +// SQLite sources. +static void LikeGlobCompare(sqlite3_context *context, + CFStringRef pattern, + CFStringRef targetString, + UniChar matchAll, + UniChar matchOne, + UniChar escape, + BOOL setSupport, + CFOptionFlags compareOptions) { + // Setup for pattern walk + CFIndex patternLength = CFStringGetLength(pattern); + CFStringInlineBuffer patternBuffer; + CFStringInitInlineBuffer(pattern, + &patternBuffer, + CFRangeMake(0, patternLength)); + UniChar patternChar; + CFIndex patternIndex = 0; + CFIndex targetStringLength = CFStringGetLength(targetString); + CFIndex targetStringIndex = 0; + BOOL isAnchored = YES; + + size_t dataSize = patternLength * sizeof(UniChar); + NSMutableData *tempData = [NSMutableData dataWithLength:dataSize]; + // Temp string buffer can be no larger than the whole pattern + UniChar *findBuffer = [tempData mutableBytes]; + if (!findBuffer) { + // COV_NF_START + sqlite3_result_error(context, + "LIKE or GLOB CF implementation failed to " \ + "allocate temporary buffer", -1); + return; + // COV_NF_END + } + + // We'll use a mutable string we can just reset as we wish + CFMutableStringRef findString = + CFStringCreateMutableWithExternalCharactersNoCopy(kCFAllocatorDefault, + NULL, + 0, + 0, + kCFAllocatorNull); + GTMCFAutorelease(findString); + if (!findString) { + // COV_NF_START + sqlite3_result_error(context, + "LIKE or GLOB CF implementation failed to " \ + "allocate temporary CFString", -1); + return; + // COV_NF_END + } + // Walk the pattern + while (patternIndex < patternLength) { + patternChar = CFStringGetCharacterFromInlineBuffer(&patternBuffer, + patternIndex); + // Match all character has no effect other than to unanchor the search + if (patternChar == matchAll) { + isAnchored = NO; + patternIndex++; + continue; + } + // Match one character pushes the string index forward by one composed + // character + if (patternChar == matchOne) { + // If this single char match would walk us off the end of the string + // we're already done, no match + if (targetStringIndex >= targetStringLength) { + sqlite3_result_int(context, 0); + return; + } + // There's still room in the string, so move the string index forward one + // composed character and go back around. + CFRange nextCharRange = + CFStringGetRangeOfComposedCharactersAtIndex(targetString, + targetStringIndex); + targetStringIndex = nextCharRange.location + nextCharRange.length; + patternIndex++; + continue; + } + // Character set matches require the parsing of the character set + if (setSupport && (patternChar == 0x5B)) { // "[" + // A character set must match one character, if there's not at least one + // character left in the string, don't bother + if (targetStringIndex >= targetStringLength) { + sqlite3_result_int(context, 0); + return; + } + // There's at least one character, try to match the remainder of the + // string using a CFCharacterSet + CFMutableCharacterSetRef charSet + = CFCharacterSetCreateMutable(kCFAllocatorDefault); + GTMCFAutorelease(charSet); + if (!charSet) { + // COV_NF_START + sqlite3_result_error(context, + "LIKE or GLOB CF implementation failed to " \ + "allocate temporary CFMutableCharacterSet", -1); + return; + // COV_NF_END + } + + BOOL invert = NO; + // Walk one character forward + patternIndex++; + if (patternIndex >= patternLength) { + // Oops, out of room + sqlite3_result_error(context, + "LIKE or GLOB CF implementation found " \ + "unclosed character set", -1); + return; + } + // First character after pattern open is special-case + patternChar = CFStringGetCharacterFromInlineBuffer(&patternBuffer, + patternIndex); + if (patternChar == 0x5E) { // "^" + invert = YES; + // Bump forward one character, can still be an unescaped "]" after + // negation + patternIndex++; + if (patternIndex >= patternLength) { + // Oops, out of room + sqlite3_result_error(context, + "LIKE or GLOB CF implementation found " \ + "unclosed character set after negation", -1); + return; + } + patternChar = CFStringGetCharacterFromInlineBuffer(&patternBuffer, + patternIndex); + } + // First char in set or first char in negation can be a literal "]" not + // considered a close + if (patternChar == 0x5D) { // "]" + CFCharacterSetAddCharactersInRange(charSet, + CFRangeMake(patternChar, 1)); + patternIndex++; + if (patternIndex >= patternLength) { + // Oops, out of room + sqlite3_result_error(context, + "LIKE or GLOB CF implementation found " \ + "unclosed character set after escaped ]", -1); + return; + } + patternChar = CFStringGetCharacterFromInlineBuffer(&patternBuffer, + patternIndex); + } + while ((patternIndex < patternLength) && + patternChar && + (patternChar != 0x5D)) { // "]" + // Check for possible character range, for this to be true we + // must have a hyphen at the next position and at least 3 + // characters of room (for hyphen, range end, and set + // close). Hyphens at the end without a trailing range are + // treated as literals + if (((patternLength - patternIndex) >= 3) && + // Second char must be "-" + (CFStringGetCharacterFromInlineBuffer(&patternBuffer, + // 0x2D is "-" + patternIndex + 1) == 0x2D) && + // And third char must be anything other than set close in + // case the hyphen is at the end of the set and needs to + // be treated as a literal + (CFStringGetCharacterFromInlineBuffer(&patternBuffer, + patternIndex + 2) + != 0x5D)) { // "]" + // Get the range close + UniChar rangeClose = + CFStringGetCharacterFromInlineBuffer(&patternBuffer, + patternIndex + 2); + // Add the whole range + int rangeLen = rangeClose - patternChar + 1; + CFCharacterSetAddCharactersInRange(charSet, + CFRangeMake(patternChar, + rangeLen)); + // Move past the end of the range + patternIndex += 3; + } else { + // Single Raw character + CFCharacterSetAddCharactersInRange(charSet, + CFRangeMake(patternChar, 1)); + patternIndex++; + } + // Load next char for loop + if (patternIndex < patternLength) { + patternChar = + CFStringGetCharacterFromInlineBuffer(&patternBuffer, patternIndex); + } else { + patternChar = 0; + } + } + // Check for closure + if (patternChar != 0x5D) { // "]" + sqlite3_result_error(context, + "LIKE or GLOB CF implementation found " \ + "unclosed character set", -1); + return; + } else { + // Increment past the end of the set + patternIndex++; + } + // Invert the set if needed + if (invert) CFCharacterSetInvert(charSet); + // Do the search + CFOptionFlags findOptions = 0; + if (isAnchored) findOptions |= kCFCompareAnchored; + CFRange foundRange; + unsigned long rangeLen = targetStringLength - targetStringIndex; + BOOL found = CFStringFindCharacterFromSet(targetString, + charSet, + CFRangeMake(targetStringIndex, + rangeLen), + findOptions, + &foundRange); + // If no match then the whole pattern fails + if (!found) { + sqlite3_result_int(context, 0); + return; + } + // If we did match then we need to push the string index to the + // character past the end of the match and then go back around + // the loop. + targetStringIndex = foundRange.location + foundRange.length; + // At this point patternIndex is either at the end of the + // string, or at the next special character which will be picked + // up and handled at the top of the loop. We do, however, need + // to reset the anchor status + isAnchored = YES; + // End of character sets, back around + continue; + } + // Otherwise the pattern character is a normal or escaped + // character we should consume and match with normal string + // matching + CFIndex findBufferIndex = 0; + while ((patternIndex < patternLength) && patternChar && + !((patternChar == matchAll) || (patternChar == matchOne) || + (setSupport && (patternChar == 0x5B)))) { // "[" + if (patternChar == escape) { + // No matter what the character follows the escape copy it to the + // buffer + patternIndex++; + if (patternIndex >= patternLength) { + // COV_NF_START + // Oops, escape came at end of pattern, that's an error + sqlite3_result_error(context, + "LIKE or GLOB CF implementation found " \ + "escape character at end of pattern", -1); + return; + // COV_NF_END + } + patternChar = CFStringGetCharacterFromInlineBuffer(&patternBuffer, + patternIndex); + } + // At this point the patternChar is either the escaped character or the + // original normal character + findBuffer[findBufferIndex++] = patternChar; + // Set up for next loop + patternIndex++; + if (patternIndex < patternLength) { + patternChar = CFStringGetCharacterFromInlineBuffer(&patternBuffer, + patternIndex); + } else { + patternChar = 0; + } + } + // On loop exit we have a string ready for comparision, if that + // string is too long then it can't be a match. + if (findBufferIndex > (targetStringLength - targetStringIndex)) { + sqlite3_result_int(context, 0); + return; + } + + // We actually need to do a comparison + CFOptionFlags findOptions = compareOptions; + if (isAnchored) findOptions |= kCFCompareAnchored; + CFStringSetExternalCharactersNoCopy(findString, + findBuffer, + findBufferIndex, + findBufferIndex); + CFRange foundRange; + unsigned long rangeLen = targetStringLength - targetStringIndex; + BOOL found = CFStringFindWithOptions(targetString, + findString, + CFRangeMake(targetStringIndex, + rangeLen), + findOptions, + &foundRange); + // If no match then the whole pattern fails + if (!found) { + sqlite3_result_int(context, 0); + return; + } + // If we did match then we need to push the string index to the + // character past the end of the match and then go back around the + // loop. + targetStringIndex = foundRange.location + foundRange.length; + // At this point patternIndex is either at the end of the string, + // or at the next special character which will be picked up and + // handled at the top of the loop. We do, however, need to reset + // the anchor status + isAnchored = YES; + } + // On loop exit all pattern characters have been considered. If we're still + // alive it means that we've matched the entire pattern, except for trailing + // wildcards, we need to handle that case. + if (isAnchored) { + // If we're still anchored there was no trailing matchAll, in which case + // we have to have run to exactly the end of the string + if (targetStringIndex == targetStringLength) { + sqlite3_result_int(context, 1); + } else { + sqlite3_result_int(context, 0); + } + } else { + // If we're not anchored any remaining characters are OK + sqlite3_result_int(context, 1); + } +} + +static void Like8(sqlite3_context *context, int argc, sqlite3_value **argv) { + // Get our LIKE options + LikeGlobUserArgs *likeArgs = sqlite3_user_data(context); + if (!likeArgs) { + // COV_NF_START + sqlite3_result_error(context, "LIKE CF implementation no user args", -1); + return; + // COV_NF_END + } + + // Read the strings + const char *pattern = (const char *)sqlite3_value_text(argv[0]); + const char *target = (const char *)sqlite3_value_text(argv[1]); + if (!pattern || !target) { + // COV_NF_START + sqlite3_result_error(context, + "LIKE CF implementation missing pattern or value", -1); + return; + // COV_NF_END + } + CFStringRef patternString = + CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, + pattern, + kCFStringEncodingUTF8, + kCFAllocatorNull); + CFStringRef targetString = + CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, + target, + kCFStringEncodingUTF8, + kCFAllocatorNull); + GTMCFAutorelease(patternString); + GTMCFAutorelease(targetString); + if (!(patternString && targetString)) { + // COV_NF_START + sqlite3_result_error(context, + "LIKE CF implementation failed " \ + "to allocate CFStrings", -1); + return; + // COV_NF_END + } + + UniChar escapeChar = 0; + // If there is a third argument it is the escape character + if (argc == 3) { + const char *escape = (const char *)sqlite3_value_text(argv[2]); + if (!escape) { + sqlite3_result_error(context, + "LIKE CF implementation missing " \ + "escape character", -1); + return; + } + CFStringRef escapeString = + CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, + escape, + kCFStringEncodingUTF8, + kCFAllocatorNull); + GTMCFAutorelease(escapeString); + if (!escapeString) { + // COV_NF_START + sqlite3_result_error(context, + "LIKE CF implementation failed to " \ + "allocate CFString for ESCAPE", -1); + return; + // COV_NF_END + } + if (CFStringGetLength(escapeString) != 1) { + sqlite3_result_error(context, + "CF implementation ESCAPE expression " \ + "must be single character", -1); + return; + } + escapeChar = CFStringGetCharacterAtIndex(escapeString, 0); + } + + // Do the compare + LikeGlobCompare(context, + patternString, + targetString, + 0x25, // % + 0x5F, // _ + escapeChar, + NO, // LIKE does not support character sets + *(likeArgs->compareOptionPtr)); +} + +static void Like16(sqlite3_context *context, int argc, sqlite3_value **argv) { + // Get our LIKE options + LikeGlobUserArgs *likeArgs = sqlite3_user_data(context); + if (!likeArgs) { + // COV_NF_START - sql parser chokes if we feed any input + // that could trigger this + sqlite3_result_error(context, "LIKE CF implementation no user args", -1); + return; + // COV_NF_END + } + + // For UTF16 variants we want our working string to be in native-endian + // UTF16. This gives us the fewest number of copies (since SQLite converts + // in-place). There is no advantage to breaking out the string construction + // to use UTF16BE or UTF16LE because all that does is move the conversion + // work into the CFString constructor, so just use simple code. + int patternByteCount = sqlite3_value_bytes16(argv[0]); + const UniChar *patternText = (void *)sqlite3_value_text16(argv[0]); + int targetByteCount = sqlite3_value_bytes16(argv[1]); + const UniChar *targetText = (void *)sqlite3_value_text16(argv[1]); + if (!patternByteCount || !patternText || !targetByteCount || !targetText) { + // COV_NF_START + sqlite3_result_error(context, + "LIKE CF implementation missing pattern or value", -1); + return; + // COV_NF_END + } + CFStringRef patternString = + CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, + patternText, + patternByteCount / sizeof(UniChar), + kCFAllocatorNull); + CFStringRef targetString = + CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, + targetText, + targetByteCount / sizeof(UniChar), + kCFAllocatorNull); + GTMCFAutorelease(patternString); + GTMCFAutorelease(targetString); + if (!(patternString && targetString)) { + // COV_NF_START + sqlite3_result_error(context, + "LIKE CF implementation failed " \ + "to allocate CFStrings", -1); + return; + // COV_NF_END + } + + // If there is a third argument it is the escape character, force a + // UTF8 conversion for simplicity + UniChar escapeChar = 0; + if (argc == 3) { + const char *escape = (const char *)sqlite3_value_text(argv[2]); + if (!escape) { + sqlite3_result_error(context, + "LIKE CF implementation " \ + "missing escape character", -1); + return; + } + CFStringRef escapeString = + CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, + escape, + kCFStringEncodingUTF8, + kCFAllocatorNull); + GTMCFAutorelease(escapeString); + if (!escapeString) { + // COV_NF_START + sqlite3_result_error(context, + "LIKE CF implementation failed to " \ + "allocate CFString for ESCAPE", -1); + return; + // COV_NF_END + } + if (CFStringGetLength(escapeString) != 1) { + sqlite3_result_error(context, + "CF implementation ESCAPE expression " \ + "must be single character", -1); + return; + } + escapeChar = CFStringGetCharacterAtIndex(escapeString, 0); + } + + // Do the compare + LikeGlobCompare(context, + patternString, + targetString, + 0x25, // % + 0x5F, // _ + escapeChar, + NO, // LIKE does not support character sets + *(likeArgs->compareOptionPtr)); +} + +static void Glob8(sqlite3_context *context, int argc, sqlite3_value **argv) { + // Get our GLOB options + LikeGlobUserArgs *globArgs = sqlite3_user_data(context); + if (!globArgs) { + // COV_NF_START + sqlite3_result_error(context, "GLOB CF implementation no user args", -1); + return; + // COV_NF_END + } + + // Read the strings + const char *pattern = (const char *)sqlite3_value_text(argv[0]); + const char *target = (const char *)sqlite3_value_text(argv[1]); + if (!pattern || !target) { + // COV_NF_START + sqlite3_result_error(context, + "GLOB CF implementation missing " \ + "pattern or value", -1); + return; + // COV_NF_END + } + CFStringRef patternString = + CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, + pattern, + kCFStringEncodingUTF8, + kCFAllocatorNull); + CFStringRef targetString = + CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, + target, + kCFStringEncodingUTF8, + kCFAllocatorNull); + GTMCFAutorelease(patternString); + GTMCFAutorelease(targetString); + + if (!(patternString && targetString)) { + // COV_NF_START + sqlite3_result_error(context, + "GLOB CF implementation failed to " \ + "allocate CFStrings", -1); + // COV_NF_END + } else { + // Do the compare + LikeGlobCompare(context, + patternString, + targetString, + 0x2A, // * + 0x3F, // ? + 0, // GLOB does not support escape characters + YES, // GLOB supports character sets + *(globArgs->compareOptionPtr)); + } +} + +static void Glob16(sqlite3_context *context, int argc, sqlite3_value **argv) { + // Get our GLOB options + LikeGlobUserArgs *globArgs = sqlite3_user_data(context); + if (!globArgs) { + // COV_NF_START + sqlite3_result_error(context, "GLOB CF implementation no user args", -1); + return; + // COV_NF_END + } + + // For UTF16 variants we want our working string to be in + // native-endian UTF16. This gives us the fewest number of copies + // (since SQLite converts in-place). There is no advantage to + // breaking out the string construction to use UTF16BE or UTF16LE + // because all that does is move the conversion work into the + // CFString constructor, so just use simple code. + int patternByteCount = sqlite3_value_bytes16(argv[0]); + const UniChar *patternText = (void *)sqlite3_value_text16(argv[0]); + int targetByteCount = sqlite3_value_bytes16(argv[1]); + const UniChar *targetText = (void *)sqlite3_value_text16(argv[1]); + if (!patternByteCount || !patternText || !targetByteCount || !targetText) { + // COV_NF_START + sqlite3_result_error(context, + "GLOB CF implementation missing pattern or value", -1); + return; + // COV_NF_END + } + CFStringRef patternString = + CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, + patternText, + patternByteCount / sizeof(UniChar), + kCFAllocatorNull); + CFStringRef targetString = + CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, + targetText, + targetByteCount / sizeof(UniChar), + kCFAllocatorNull); + GTMCFAutorelease(patternString); + GTMCFAutorelease(targetString); + if (!(patternString && targetString)) { + // COV_NF_START + sqlite3_result_error(context, + "GLOB CF implementation failed to "\ + "allocate CFStrings", -1); + // COV_NF_END + } else { + // Do the compare + LikeGlobCompare(context, + patternString, + targetString, + 0x2A, // * + 0x3F, // ? + 0, // GLOB does not support escape characters + YES, // GLOB supports character sets + *(globArgs->compareOptionPtr)); + } +} + +// ----------------------------------------------------------------------------- + +@implementation GTMSQLiteStatement + +#pragma mark Creation, Access and Finalization + ++ (id)statementWithSQL:(NSString *)sql + inDatabase:(GTMSQLiteDatabase *)gtmdb + errorCode:(int *)err { + return [[[GTMSQLiteStatement alloc] initWithSQL:sql + inDatabase:gtmdb + errorCode:err] + autorelease]; +} + +- (id)initWithSQL:(NSString *)sql + inDatabase:(GTMSQLiteDatabase *)gtmdb + errorCode:(int *)err { + int rc; + id obj; + if ((self = [super init])) { + // Sanity + obj = self; + if (sql && gtmdb) { + // Find out if the database is using our CF extensions + hasCFAdditions_ = [gtmdb hasCFAdditions]; + + // Prepare + if (hasCFAdditions_) { + sql = [sql precomposedStringWithCanonicalMapping]; + } + if (sql) { + rc = sqlite3_prepare([gtmdb sqlite3DB], + [sql UTF8String], + -1, + &statement_, + NULL); + if (rc != SQLITE_OK) { + [self release]; + obj = nil; + } + } else { + // COV_NF_START + rc = SQLITE_INTERNAL; + [self release]; + obj = nil; + // COV_NF_END + } + } else { + rc = SQLITE_MISUSE; + [self release]; + obj = nil; + } + } else { + // COV_NF_START + rc = SQLITE_INTERNAL; + obj = nil; + // COV_NF_END + } + if (err) *err = rc; + return obj; +} + +#if GTM_SUPPORT_GC +- (void)finalize { + if (statement_) { + _GTMDevLog(@"-[GTMSQLiteStatement finalizeStatement] must be called when" + @" statement is no longer needed"); + } + [super finalize]; +} +#endif + +- (void)dealloc { + if (statement_) { + _GTMDevLog(@"-[GTMSQLiteStatement finalizeStatement] must be called when" + @" statement is no longer needed"); + } + [super dealloc]; +} + +- (sqlite3_stmt *)sqlite3Statement { + return statement_; +} + +- (int)finalizeStatement { + if (!statement_) return SQLITE_MISUSE; + int rc = sqlite3_finalize(statement_); + statement_ = NULL; + return rc; +} + +#pragma mark Parameters and Binding + +- (int)parameterCount { + if (!statement_) return -1; + return sqlite3_bind_parameter_count(statement_); +} + +- (int)positionOfParameterNamed:(NSString *)paramName { + if (!statement_) return -1; + if (hasCFAdditions_) { + NSString *cleanedString = + [paramName precomposedStringWithCanonicalMapping]; + if (!cleanedString) return -1; + return sqlite3_bind_parameter_index(statement_, [cleanedString UTF8String]); + } else { + return sqlite3_bind_parameter_index(statement_, [paramName UTF8String]); + } +} + +- (NSString *)nameOfParameterAtPosition:(int)position { + if ((position < 1) || !statement_) return nil; + const char *name = sqlite3_bind_parameter_name(statement_, position); + if (!name) return nil; + NSString *nameString = [NSString stringWithUTF8String:name]; + if (hasCFAdditions_) { + return [nameString precomposedStringWithCanonicalMapping]; + } else { + return nameString; + } +} + +- (int)bindSQLNullAtPosition:(int)position { + if (!statement_) return SQLITE_MISUSE; + return sqlite3_bind_null(statement_, position); +} + +- (int)bindBlobAtPosition:(int)position bytes:(void *)bytes length:(int)length { + if (!statement_ || !bytes || !length) return SQLITE_MISUSE; + return sqlite3_bind_blob(statement_, + position, + bytes, + length, + SQLITE_TRANSIENT); +} + +- (int)bindBlobAtPosition:(int)position data:(NSData *)data { + if (!statement_ || !data || !position) return SQLITE_MISUSE; + int blobLength = (int)[data length]; + _GTMDevAssert((blobLength < INT_MAX), + @"sqlite methods do not support data lengths " + @"exceeding 32 bit sizes"); + return [self bindBlobAtPosition:position + bytes:(void *)[data bytes] + length:blobLength]; +} + +- (int)bindDoubleAtPosition:(int)position value:(double)value { + if (!statement_) return SQLITE_MISUSE; + return sqlite3_bind_double(statement_, position, value); +} + +- (int)bindNumberAsDoubleAtPosition:(int)position number:(NSNumber *)number { + if (!number || !statement_) return SQLITE_MISUSE; + return sqlite3_bind_double(statement_, position, [number doubleValue]); +} + +- (int)bindInt32AtPosition:(int)position value:(int)value { + if (!statement_) return SQLITE_MISUSE; + return sqlite3_bind_int(statement_, position, value); +} + +- (int)bindNumberAsInt32AtPosition:(int)position number:(NSNumber *)number { + if (!number || !statement_) return SQLITE_MISUSE; + return sqlite3_bind_int(statement_, position, [number intValue]); +} + +- (int)bindLongLongAtPosition:(int)position value:(long long)value { + if (!statement_) return SQLITE_MISUSE; + return sqlite3_bind_int64(statement_, position, value); +} + +- (int)bindNumberAsLongLongAtPosition:(int)position number:(NSNumber *)number { + if (!number || !statement_) return SQLITE_MISUSE; + return sqlite3_bind_int64(statement_, position, [number longLongValue]); +} + +- (int)bindStringAtPosition:(int)position string:(NSString *)string { + if (!string || !statement_) return SQLITE_MISUSE; + if (hasCFAdditions_) { + string = [string precomposedStringWithCanonicalMapping]; + if (!string) return SQLITE_INTERNAL; + } + return sqlite3_bind_text(statement_, + position, + [string UTF8String], + -1, + SQLITE_TRANSIENT); +} + +#pragma mark Results + +- (int)resultColumnCount { + if (!statement_) return -1; + return sqlite3_column_count(statement_); +} + +- (NSString *)resultColumnNameAtPosition:(int)position { + if (!statement_) return nil; + const char *name = sqlite3_column_name(statement_, position); + if (!name) return nil; + NSString *nameString = [NSString stringWithUTF8String:name]; + if (hasCFAdditions_) { + return [nameString precomposedStringWithCanonicalMapping]; + } else { + return nameString; + } +} + +- (int)rowDataCount { + if (!statement_) return -1; + return sqlite3_data_count(statement_); +} + +- (int)resultColumnTypeAtPosition:(int)position { + if (!statement_) return -1; + return sqlite3_column_type(statement_, position); +} + +- (NSData *)resultBlobDataAtPosition:(int)position { + if (!statement_) return nil; + const void *bytes = sqlite3_column_blob(statement_, position); + int length = sqlite3_column_bytes(statement_, position); + if (!(bytes && length)) return nil; + return [NSData dataWithBytes:bytes length:length]; +} + +- (double)resultDoubleAtPosition:(int)position { + if (!statement_) return 0; + return sqlite3_column_double(statement_, position); +} + +- (int)resultInt32AtPosition:(int)position { + if (!statement_) return 0; + return sqlite3_column_int(statement_, position); +} + +- (long long)resultLongLongAtPosition:(int)position { + if (!statement_) return 0; + return sqlite3_column_int64(statement_, position); +} + +- (NSNumber *)resultNumberAtPosition:(int)position { + if (!statement_) return nil; + int type = [self resultColumnTypeAtPosition:position]; + if (type == SQLITE_FLOAT) { + // Special case for floats + return [NSNumber numberWithDouble:[self resultDoubleAtPosition:position]]; + } else { + // Everything else is cast to int + long long result = [self resultLongLongAtPosition:position]; + return [NSNumber numberWithLongLong:result]; + } +} + +- (NSString *)resultStringAtPosition:(int)position { + if (!statement_) return nil; + const char *text = (const char *)sqlite3_column_text(statement_, position); + if (!text) return nil; + NSString *result = [NSString stringWithUTF8String:text]; + if (hasCFAdditions_) { + return [result precomposedStringWithCanonicalMapping]; + } else { + return result; + } +} + +- (id)resultFoundationObjectAtPosition:(int)position { + if (!statement_) return nil; + int type = [self resultColumnTypeAtPosition:position]; + id result = nil; + switch (type) { + case SQLITE_INTEGER: + case SQLITE_FLOAT: + result = [self resultNumberAtPosition:position]; + break; + case SQLITE_TEXT: + result = [self resultStringAtPosition:position]; + break; + case SQLITE_BLOB: + result = [self resultBlobDataAtPosition:position]; + break; + case SQLITE_NULL: + result = [NSNull null]; + break; + } + return result; +} + +- (NSArray *)resultRowArray { + int count = [self rowDataCount]; + if (count < 1) return nil; + + NSMutableArray *finalArray = [NSMutableArray array]; + for (int i = 0; i < count; i++) { + id coldata = [self resultFoundationObjectAtPosition:i]; + if (!coldata) return nil; // Oops + [finalArray addObject:coldata]; + } + + if (![finalArray count]) return nil; + return finalArray; +} + +- (NSDictionary *)resultRowDictionary { + int count = [self rowDataCount]; + if (count < 1) return nil; + + NSMutableDictionary *finalDict = [NSMutableDictionary dictionary]; + for (int i = 0; i < count; i++) { + id coldata = [self resultFoundationObjectAtPosition:i]; + NSString *colname = [self resultColumnNameAtPosition:i]; + if (!(coldata && colname)) continue; + [finalDict setObject:coldata forKey:colname]; + } + if (![finalDict count]) return nil; + return finalDict; +} + +#pragma mark Rows + +- (int)stepRow { + int rc = SQLITE_BUSY; + while (rc == SQLITE_BUSY) { + rc = [self stepRowWithTimeout]; + } + return rc; +} + +- (int)stepRowWithTimeout { + if (!statement_) return SQLITE_MISUSE; + return sqlite3_step(statement_); +} + +- (int)reset { + if (!statement_) return SQLITE_MISUSE; + return sqlite3_reset(statement_); +} + ++ (BOOL)isCompleteStatement:(NSString *)statement { + BOOL isComplete = NO; + if (statement) { + isComplete = (sqlite3_complete([statement UTF8String]) ? YES : NO); + } + return isComplete; +} + ++ (NSString*)quoteAndEscapeString:(NSString *)string { + char *quoted = sqlite3_mprintf("'%q'", [string UTF8String]); + if (!quoted) return nil; + NSString *quotedString = [NSString stringWithUTF8String:quoted]; + sqlite3_free(quoted); + return quotedString; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLiteTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLiteTest.m new file mode 100644 index 00000000..5d683c0f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSQLiteTest.m @@ -0,0 +1,1813 @@ +// +// GTMSQLiteTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + + +#import "GTMSQLite.h" +#import "GTMSenTestCase.h" +#import "GTMUnitTestDevLog.h" +#import "GTMGarbageCollection.h" + +@interface GTMSQLiteTest : GTMTestCase +@end + +// This variable is used by a custom upper function that we set in a +// SQLite database to indicate that the custom function was +// successfully called. It has to be a global rather than instance +// variable because the custom upper function is not an instance function +static BOOL customUpperFunctionCalled = NO; + +@interface GTMSQLiteStatementTest : GTMTestCase +@end + +// Prototype for LIKE/GLOB test helper +static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql); + +@implementation GTMSQLiteTest + +// Test cases for change counting +- (void)testTransactionAPI { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + err = [db executeSQL:@"CREATE TABLE foo (bar TEXT COLLATE NOCASE_NONLITERAL);"]; + STAssertEquals(err, SQLITE_OK, @"Failed to create table"); + + int changeCount = [db lastChangeCount]; + STAssertEquals(changeCount, 0, + @"Change count was not 0 after creating database/table!"); + + err = [db executeSQL:@"insert into foo (bar) values ('blah!');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + changeCount = [db lastChangeCount]; + STAssertEquals(changeCount, 1, @"Change count was not 1!"); + + // Test last row id! + unsigned long long lastRowId; + lastRowId = [db lastInsertRowID]; + STAssertEquals(lastRowId, (unsigned long long)1L, + @"First row in database was not 1?"); + + // Test setting busy and retrieving it! + int busyTimeout = 10000; + err = [db setBusyTimeoutMS:busyTimeout]; + STAssertEquals(err, SQLITE_OK, @"Error setting busy timeout"); + + int retrievedBusyTimeout; + retrievedBusyTimeout = [db busyTimeoutMS]; + STAssertEquals(retrievedBusyTimeout, busyTimeout, + @"Retrieved busy time out was not equal to what we set it" + @" to!"); + + BOOL xactOpSucceeded; + + xactOpSucceeded = [db beginDeferredTransaction]; + STAssertTrue(xactOpSucceeded, @"beginDeferredTransaction failed!"); + + err = [db executeSQL:@"insert into foo (bar) values ('blah!');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + changeCount = [db lastChangeCount]; + STAssertEquals(changeCount, 1, + @"Change count didn't stay the same" + @"when inserting during transaction"); + + xactOpSucceeded = [db rollback]; + STAssertTrue(xactOpSucceeded, @"could not rollback!"); + + changeCount = [db lastChangeCount]; + STAssertEquals(changeCount, 1, @"Change count isn't 1 after rollback :-("); + + xactOpSucceeded = [db beginDeferredTransaction]; + STAssertTrue(xactOpSucceeded, @"beginDeferredTransaction failed!"); + + for (unsigned int i = 0; i < 100; i++) { + err = [db executeSQL:@"insert into foo (bar) values ('blah!');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + } + + xactOpSucceeded = [db commit]; + STAssertTrue(xactOpSucceeded, @"could not commit!"); + + changeCount = [db totalChangeCount]; + STAssertEquals(changeCount, 102, @"Change count isn't 102 after commit :-("); +} + +- (void)testSQLiteWithoutCFAdditions { + int err; + GTMSQLiteDatabase *dbNoCFAdditions = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:NO + utf8:YES + errorCode:&err] + autorelease]; + + STAssertNotNil(dbNoCFAdditions, @"Failed to create DB"); + STAssertEquals(err, SQLITE_OK, @"Failed to create DB"); + + err = [dbNoCFAdditions executeSQL:nil]; + STAssertEquals(err, SQLITE_MISUSE, @"Nil SQL did not return error"); + + err = [dbNoCFAdditions executeSQL:@"SELECT UPPER('Fred');"]; + STAssertEquals(err, SQLITE_OK, @"Nil SQL did not return error"); +} + +- (void)testSynchronousAPI { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + [db synchronousMode:YES]; + [db synchronousMode:NO]; +} + +- (void)testEmptyStringsCollation { + int err; + GTMSQLiteDatabase *db8 = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + STAssertNotNil(db8, @"Failed to create DB"); + STAssertEquals(err, SQLITE_OK, @"Failed to create DB"); + + GTMSQLiteDatabase *db16 = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:NO + errorCode:&err] + autorelease]; + + STAssertNotNil(db16, @"Failed to create DB"); + STAssertEquals(err, SQLITE_OK, @"Failed to create DB"); + + NSArray *databases = [NSArray arrayWithObjects:db8, db16, nil]; + GTMSQLiteDatabase *db; + GTM_FOREACH_OBJECT(db, databases) { + err = [db executeSQL: + @"CREATE TABLE foo (bar TEXT COLLATE NOCASE_NONLITERAL," + @" barrev text collate reverse);"]; + + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for collation test"); + // Create blank rows to test matching inside collation functions + err = [db executeSQL:@"insert into foo (bar, barrev) values ('','');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + // Insert one row we want to match + err = [db executeSQL: + @"INSERT INTO foo (bar, barrev) VALUES " + @"('teststring','teststring');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + NSString *matchString = @"foobar"; + GTMSQLiteStatement *statement = + [GTMSQLiteStatement statementWithSQL:[NSString stringWithFormat: + @"SELECT bar FROM foo WHERE bar == '%@';", matchString] + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + [statement stepRow]; + [statement finalizeStatement]; + + statement = + [GTMSQLiteStatement statementWithSQL:[NSString stringWithFormat: + @"SELECT bar FROM foo WHERE barrev == '%@' order by barrev;", matchString] + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + [statement stepRow]; + + [statement finalizeStatement]; + + statement = + [GTMSQLiteStatement statementWithSQL:[NSString stringWithFormat: + @"SELECT bar FROM foo WHERE bar == '';"] + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + [statement stepRow]; + [statement finalizeStatement]; + + statement = + [GTMSQLiteStatement statementWithSQL:[NSString stringWithFormat: + @"SELECT bar FROM foo WHERE barrev == '' order by barrev;"] + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + [statement stepRow]; + [statement finalizeStatement]; + } +} + +- (void)testUTF16Database { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:NO + errorCode:&err] + autorelease]; + + STAssertNotNil(db, @"Failed to create DB"); + STAssertEquals(err, SQLITE_OK, @"Failed to create DB"); + + err = [db executeSQL:@"CREATE TABLE foo (bar TEXT COLLATE NOCASE_NONLITERAL);"]; + STAssertEquals(err, SQLITE_OK, @"Failed to create table for collation test"); + + // Insert one row we want to match + err = [db executeSQL:[NSString stringWithFormat: + @"INSERT INTO foo (bar) VALUES ('%@');", + [NSString stringWithCString:"Frédéric" encoding:NSUTF8StringEncoding]]]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + // Create blank rows to test matching inside collation functions + err = [db executeSQL:@"insert into foo (bar) values ('');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + err = [db executeSQL:@"insert into foo (bar) values ('');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + // Loop over a few things all of which should match + NSArray *testArray = [NSArray arrayWithObjects: + [NSString stringWithCString:"Frédéric" + encoding:NSUTF8StringEncoding], + [NSString stringWithCString:"frédéric" + encoding:NSUTF8StringEncoding], + [NSString stringWithCString:"FRÉDÉRIC" + encoding:NSUTF8StringEncoding], + nil]; + NSString *testString = nil; + GTM_FOREACH_OBJECT(testString, testArray) { + GTMSQLiteStatement *statement = + [GTMSQLiteStatement statementWithSQL:[NSString stringWithFormat: + @"SELECT bar FROM foo WHERE bar == '%@';", testString] + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + int count = 0; + while ([statement stepRow] == SQLITE_ROW) { + count++; + } + STAssertEquals(count, 1, @"Wrong number of collated rows for \"%@\"", + testString); + [statement finalizeStatement]; + } + + GTMSQLiteStatement *statement = + [GTMSQLiteStatement statementWithSQL:@"select * from foo;" + inDatabase:db + errorCode:&err]; + + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + + while ([statement stepRow] == SQLITE_ROW) ; + [statement finalizeStatement]; + +} + +- (void)testUpperLower { + + // Test our custom UPPER/LOWER implementation, need a database and statement + // to do it. + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + STAssertNotNil(db, @"Failed to create DB"); + STAssertEquals(err, SQLITE_OK, @"Failed to create DB"); + GTMSQLiteStatement *statement = nil; + + // Test simple ASCII + statement = [GTMSQLiteStatement statementWithSQL:@"SELECT LOWER('Fred');" + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"Failed to step row"); + STAssertEqualObjects([statement resultStringAtPosition:0], + @"fred", + @"LOWER failed for ASCII string"); + [statement finalizeStatement]; + + statement = [GTMSQLiteStatement statementWithSQL:@"SELECT UPPER('Fred');" + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"Failed to step row"); + STAssertEqualObjects([statement resultStringAtPosition:0], + @"FRED", + @"UPPER failed for ASCII string"); + + [statement finalizeStatement]; + // Test UTF-8, have to do some dancing to make the compiler take + // UTF8 literals + NSString *utfNormalString = + [NSString stringWithCString:"Frédéric" + encoding:NSUTF8StringEncoding]; + NSString *utfLowerString = + [NSString stringWithCString:"frédéric" + encoding:NSUTF8StringEncoding]; + NSString *utfUpperString = + [NSString stringWithCString:"FRÉDÉRIC" encoding:NSUTF8StringEncoding]; + + statement = + [GTMSQLiteStatement statementWithSQL: + [NSString stringWithFormat:@"SELECT LOWER('%@');", utfNormalString] + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"Failed to step row"); + STAssertEqualObjects([statement resultStringAtPosition:0], + utfLowerString, + @"UPPER failed for UTF8 string"); + [statement finalizeStatement]; + + statement = + [GTMSQLiteStatement statementWithSQL: + [NSString stringWithFormat:@"SELECT UPPER('%@');", utfNormalString] + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"Failed to step row"); + STAssertEqualObjects([statement resultStringAtPosition:0], + utfUpperString, + @"UPPER failed for UTF8 string"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, @"Should be done"); + [statement finalizeStatement]; +} + +- (void)testUpperLower16 { + + // Test our custom UPPER/LOWER implementation, need a database and + // statement to do it. + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:NO + errorCode:&err] + autorelease]; + STAssertNotNil(db, @"Failed to create DB"); + STAssertEquals(err, SQLITE_OK, @"Failed to create DB"); + GTMSQLiteStatement *statement = nil; + + // Test simple ASCII + statement = [GTMSQLiteStatement statementWithSQL:@"SELECT LOWER('Fred');" + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"Failed to step row"); + STAssertEqualObjects([statement resultStringAtPosition:0], + @"fred", + @"LOWER failed for ASCII string"); + [statement finalizeStatement]; + + statement = [GTMSQLiteStatement statementWithSQL:@"SELECT UPPER('Fred');" + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"Failed to step row"); + STAssertEqualObjects([statement resultStringAtPosition:0], + @"FRED", + @"UPPER failed for ASCII string"); + [statement finalizeStatement]; +} + +typedef struct { + BOOL upperCase; + int textRep; +} UpperLowerUserArgs; + +static void TestUpperLower16Impl(sqlite3_context *context, + int argc, sqlite3_value **argv); + +- (void)testUTF16DatabasesAreReallyUTF16 { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:NO + errorCode:&err] + autorelease]; + + const struct { + const char *sqlName; + UpperLowerUserArgs userArgs; + void *function; + } customUpperLower[] = { + { "upper", { YES, SQLITE_UTF16 }, &TestUpperLower16Impl }, + { "upper", { YES, SQLITE_UTF16BE }, &TestUpperLower16Impl }, + { "upper", { YES, SQLITE_UTF16LE }, &TestUpperLower16Impl } + }; + + + sqlite3 *sqldb = [db sqlite3DB]; + int rc; + for (size_t i = 0; + i < (sizeof(customUpperLower) / sizeof(customUpperLower[0])); + i++) { + rc = sqlite3_create_function(sqldb, + customUpperLower[i].sqlName, + 1, + customUpperLower[i].userArgs.textRep, + (void *)&customUpperLower[i].userArgs, + customUpperLower[i].function, + NULL, + NULL); + STAssertEquals(rc, SQLITE_OK, + @"Failed to register upper function" + @"with SQLite db"); + } + + customUpperFunctionCalled = NO; + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:@"SELECT UPPER('Fred');" + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"Failed to step row"); + STAssertTrue(customUpperFunctionCalled, + @"Custom upper function was not called!"); + [statement finalizeStatement]; +} + +- (void)testLikeComparisonOptions { + int err; + + GTMSQLiteDatabase *db8 = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] autorelease]; + + GTMSQLiteDatabase *db16 = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:NO + errorCode:&err] autorelease]; + + NSArray *databases = [NSArray arrayWithObjects:db8, db16, nil]; + GTMSQLiteDatabase *db; + GTM_FOREACH_OBJECT(db, databases) { + CFOptionFlags c = 0, oldFlags; + + oldFlags = [db likeComparisonOptions]; + + // We'll do a case sensitivity test by making comparison options + // case insensitive + [db setLikeComparisonOptions:c]; + + STAssertTrue([db likeComparisonOptions] == 0, + @"LIKE Comparison options setter/getter does not work!"); + + NSString *createString = nil; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + createString = @"CREATE TABLE foo (bar NODIACRITIC_WIDTHINSENSITIVE TEXT);"; +#else + createString = @"CREATE TABLE foo (bar TEXT);"; +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + + err = [db executeSQL:createString]; + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for like comparison options test"); + + err = [db executeSQL:@"insert into foo values('test like test');"]; + STAssertEquals(err, SQLITE_OK, + @"Failed to create row for like comparison options test"); + + GTMSQLiteStatement *statement = + [GTMSQLiteStatement statementWithSQL:@"select * from foo where bar like '%LIKE%'" + inDatabase:db + errorCode:&err]; + + STAssertNotNil(statement, @"failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, @"failed to retrieve row!"); + + // Now change it back to case insensitive and rerun the same query + c |= kCFCompareCaseInsensitive; + [db setLikeComparisonOptions:c]; + err = [statement reset]; + STAssertEquals(err, SQLITE_OK, @"failed to reset select statement"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"failed to retrieve row!"); + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + // Now try adding in 10.5 only flags + c |= (kCFCompareDiacriticInsensitive | kCFCompareWidthInsensitive); + [db setLikeComparisonOptions:c]; + // Make a new statement + [statement finalizeStatement]; + statement = + [GTMSQLiteStatement statementWithSQL:@"select * from foo where bar like '%LIKE%'" + inDatabase:db + errorCode:&err]; + + STAssertNotNil(statement, @"failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"failed to create statement"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"failed to retrieve row!"); +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + + // Now reset comparison options + [db setLikeComparisonOptions:oldFlags]; + + [statement finalizeStatement]; + } +} + +- (void)testGlobComparisonOptions { + int err; + GTMSQLiteDatabase *db = [[[GTMSQLiteDatabase alloc] + initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] autorelease]; + + CFOptionFlags c = 0, oldFlags; + + oldFlags = [db globComparisonOptions]; + + [db setGlobComparisonOptions:c]; + + STAssertTrue([db globComparisonOptions] == 0, + @"GLOB Comparison options setter/getter does not work!"); + + err = [db executeSQL:@"CREATE TABLE foo (bar TEXT);"]; + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for glob comparison options test"); + + err = [db executeSQL:@"insert into foo values('test like test');"]; + STAssertEquals(err, SQLITE_OK, + @"Failed to create row for glob comparison options test"); + + GTMSQLiteStatement *statement = + [GTMSQLiteStatement statementWithSQL:@"select * from foo where bar GLOB 'TEST*'" + inDatabase:db + errorCode:&err]; + + STAssertNotNil(statement, @"failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, @"failed to retrieve row!"); + + // Now change it back to case insensitive and rerun the same query + c |= kCFCompareCaseInsensitive; + [db setGlobComparisonOptions:c]; + err = [statement reset]; + STAssertEquals(err, SQLITE_OK, @"failed to reset select statement"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"failed to retrieve row!"); + + [statement finalizeStatement]; + + // Now reset comparison options + [db setGlobComparisonOptions:oldFlags]; +} + +- (void)testCFStringReverseCollation { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] autorelease]; + + err = [db executeSQL:@"CREATE table foo_reverse (bar TEXT COLLATE REVERSE);"]; + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for reverse collation test"); + + err = [db executeSQL:@"insert into foo_reverse values('a2');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + err = [db executeSQL:@"insert into foo_reverse values('b1');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + GTMSQLiteStatement *statement = + [GTMSQLiteStatement statementWithSQL:@"SELECT bar from foo_reverse order by bar" + inDatabase:db + errorCode:&err]; + + STAssertNotNil(statement, @"failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"failed to advance row"); + NSString *oneRow = [statement resultStringAtPosition:0]; + + STAssertEqualStrings(oneRow, @"b1", @"b did not come first!"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"failed to advance row!"); + + STAssertEquals(err, [db lastErrorCode], + @"lastErrorCode API did not match what last API returned!"); + // Calling lastErrorCode resets API error, so the next string will not indicate any error + STAssertEqualStrings(@"not an error", [db lastErrorString], + @"lastErrorString API did not match expected string!"); + + oneRow = [statement resultStringAtPosition:0]; + STAssertEqualStrings(oneRow, @"a2", @"a did not come second!"); + + [statement finalizeStatement]; +} + +- (void)testCFStringNumericCollation { + int err; + GTMSQLiteDatabase *db = [[[GTMSQLiteDatabase alloc] + initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] autorelease]; + + err = [db executeSQL: + @"CREATE table numeric_test_table " + @"(numeric_sort TEXT COLLATE NUMERIC, lexographic_sort TEXT);"]; + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for numeric collation test"); + + err = [db executeSQL:@"insert into numeric_test_table values('4','17');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + err = [db executeSQL:@"insert into numeric_test_table values('17','4');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + GTMSQLiteStatement *statement = + [GTMSQLiteStatement statementWithSQL:@"SELECT numeric_sort from numeric_test_table order by numeric_sort" + inDatabase:db + errorCode:&err]; + + STAssertNotNil(statement, @"failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"failed to advance row"); + NSString *oneRow = [statement resultStringAtPosition:0]; + + STAssertEqualStrings(oneRow, @"4", @"4 did not come first!"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"failed to advance row!"); + + oneRow = [statement resultStringAtPosition:0]; + STAssertEqualStrings(oneRow, @"17", @"17 did not come second!"); + + [statement finalizeStatement]; + + statement = + [GTMSQLiteStatement statementWithSQL: + @"SELECT lexographic_sort from numeric_test_table " + @"order by lexographic_sort" + inDatabase:db + errorCode:&err]; + + STAssertNotNil(statement, @"failed to create statement for lexographic sort"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"failed to advance row"); + oneRow = [statement resultStringAtPosition:0]; + + STAssertEqualStrings(oneRow, @"17", @"17 did not come first!"); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, @"failed to advance row!"); + + oneRow = [statement resultStringAtPosition:0]; + STAssertEqualStrings(oneRow, @"4", @"4 did not come second!"); + + [statement finalizeStatement]; +} + +- (void)testCFStringCollation { + + // Test just one case of the collations, they all exercise largely the + // same code + int err; + GTMSQLiteDatabase *db = + [[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err]; + STAssertNotNil(db, @"Failed to create DB"); + STAssertEquals(err, SQLITE_OK, @"Failed to create DB"); + + err = [db executeSQL: + @"CREATE TABLE foo (bar TEXT COLLATE NOCASE_NONLITERAL_LOCALIZED);"]; + STAssertEquals(err, SQLITE_OK, @"Failed to create table for collation test"); + + // Insert one row we want to match + err = [db executeSQL:[NSString stringWithFormat: + @"INSERT INTO foo (bar) VALUES ('%@');", + [NSString stringWithCString:"Frédéric" encoding:NSUTF8StringEncoding]]]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL"); + + // Loop over a few things all of which should match + NSArray *testArray = [NSArray arrayWithObjects: + [NSString stringWithCString:"Frédéric" + encoding:NSUTF8StringEncoding], + [NSString stringWithCString:"frédéric" + encoding:NSUTF8StringEncoding], + [NSString stringWithCString:"FRÉDÉRIC" + encoding:NSUTF8StringEncoding], + nil]; + + NSString *testString = nil; + GTM_FOREACH_OBJECT(testString, testArray) { + GTMSQLiteStatement *statement = + [GTMSQLiteStatement statementWithSQL:[NSString stringWithFormat: + @"SELECT bar FROM foo WHERE bar == '%@';", testString] + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + int count = 0; + while ([statement stepRow] == SQLITE_ROW) { + count++; + } + STAssertEquals(count, 1, @"Wrong number of collated rows for \"%@\"", + testString); + [statement finalizeStatement]; + } + + // Force a release to test the statement cleanup + [db release]; + +} + +- (void)testDiacriticAndWidthInsensitiveCollations { + // Diacritic & width insensitive collations are not supported + // on Tiger, so most of the test is Leopard or later +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] autorelease]; + STAssertNotNil(db, @"Failed to create DB"); + STAssertEquals(err, SQLITE_OK, @"Failed to create DB"); + + NSString *tableSQL = + @"CREATE TABLE FOOBAR (collated TEXT COLLATE NODIACRITIC_WIDTHINSENSITIVE, " + @" noncollated TEXT);"; + + err = [db executeSQL:tableSQL]; + STAssertEquals(err, SQLITE_OK, @"error creating table"); + + NSString *testStringValue = [NSString stringWithCString:"Frédéric" + encoding:NSUTF8StringEncoding]; + // Insert one row we want to match + err = [db executeSQL:[NSString stringWithFormat: + @"INSERT INTO FOOBAR (collated, noncollated) " + @"VALUES ('%@','%@');", + testStringValue, testStringValue]]; + + GTMSQLiteStatement *statement = + [GTMSQLiteStatement statementWithSQL: + [NSString stringWithFormat:@"SELECT noncollated FROM foobar" + @" WHERE noncollated == 'Frederic';"] + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + // Make sure the comparison query didn't return a row because + // we're doing a comparison on the row without the collation + STAssertEquals([statement stepRow], SQLITE_DONE, + @"Comparison with diacritics did not succeed"); + + [statement finalizeStatement]; + + statement = + [GTMSQLiteStatement statementWithSQL: + [NSString stringWithFormat:@"SELECT collated FROM foobar" + @" WHERE collated == 'Frederic';"] + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + STAssertEquals([statement stepRow], SQLITE_ROW, + @"Comparison ignoring diacritics did not succeed"); + [statement finalizeStatement]; +#else + // On Tiger just make sure it causes the dev log. + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] autorelease]; + STAssertNotNil(db, @"Failed to create DB"); + STAssertEquals(err, SQLITE_OK, @"Failed to create DB"); + + NSString *tableSQL = + @"CREATE TABLE FOOBAR (collated TEXT" + @" COLLATE NODIACRITIC_WIDTHINSENSITIVE_NOCASE," + @" noncollated TEXT);"; + + // Expect one log for each unsupported flag + [GTMUnitTestDevLog expect:2 + casesOfString:@"GTMSQLiteDatabase 10.5 collating not available " + @"on 10.4 or earlier"]; + err = [db executeSQL:tableSQL]; + STAssertEquals(err, SQLITE_OK, @"error creating table"); + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 +} + +- (void)testCFStringLikeGlob { + + // Test cases drawn from SQLite test case source + int err; + GTMSQLiteDatabase *db8 = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + STAssertNotNil(db8, @"Failed to create database"); + STAssertEquals(err, SQLITE_OK, @"Failed to create database"); + + GTMSQLiteDatabase *db16 = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:NO + errorCode:&err] + autorelease]; + + STAssertNotNil(db16, @"Failed to create database"); + STAssertEquals(err, SQLITE_OK, @"Failed to create database"); + + NSArray *databases = [NSArray arrayWithObjects:db8, db16, nil]; + GTMSQLiteDatabase *db; + GTM_FOREACH_OBJECT(db, databases) { + err = [db executeSQL:@"CREATE TABLE t1 (x TEXT);"]; + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for LIKE/GLOB test"); + + // Insert data set + err = [db executeSQL:@"INSERT INTO t1 VALUES ('a');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('ab');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('abc');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('abcd');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('acd');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('abd');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('bc');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('bcd');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('xyz');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('ABC');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('CDE');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + err = [db executeSQL:@"INSERT INTO t1 VALUES ('ABC abc xyz');"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + + // Section 1, case tests + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"ABC", @"abc", nil]), + @"Fail on LIKE test 1.1"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x GLOB 'abc' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", nil]), + @"Fail on LIKE test 1.2"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'ABC' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"ABC", @"abc", nil]), + @"Fail on LIKE test 1.3"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"ABC", @"ABC abc xyz", @"abc", @"abcd", nil]), + @"Fail on LIKE test 3.1"); + [db setLikeComparisonOptions:(kCFCompareNonliteral)]; + err = [db executeSQL:@"CREATE INDEX i1 ON t1(x);"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 3.3"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'a_c' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", nil]), + @"Fail on LIKE test 3.5"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'ab%d' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abcd", @"abd", nil]), + @"Fail on LIKE test 3.7"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'a_c%' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 3.9"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE '%bcd' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abcd", @"bcd", nil]), + @"Fail on LIKE test 3.11"); + [db setLikeComparisonOptions:(kCFCompareNonliteral | kCFCompareCaseInsensitive)]; + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"ABC", @"ABC abc xyz", @"abc", @"abcd", nil]), + @"Fail on LIKE test 3.13"); + [db setLikeComparisonOptions:(kCFCompareNonliteral)]; + err = [db executeSQL:@"DROP INDEX i1;"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 3.15"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 3.17"); + err = [db executeSQL:@"CREATE INDEX i1 ON t1(x);"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 3.19"); + [db setLikeComparisonOptions:(kCFCompareNonliteral)]; + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 3.21"); + [db setLikeComparisonOptions:(kCFCompareNonliteral | + kCFCompareCaseInsensitive)]; + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x GLOB 'a[bc]d' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abd", @"acd", nil]), + @"Fail on LIKE test 3.23"); + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x from t1 where x GLOB 'a[^xyz]d' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abd", @"acd", nil]), + @"Fail on glob inverted character set test 3.24"); + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x from t1 where x GLOB 'a[^' ORDER BY 1;"), + ([NSArray array]), + @"Fail on glob inverted character set test 3.25"); + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x from t1 where x GLOB 'a['"), + ([NSArray array]), + @"Unclosed glob character set did not return empty result set 3.26"); + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x from t1 where x GLOB 'a[^]'"), + ([NSArray array]), + @"Unclosed glob inverted character set did not return empty " + @"result set 3.27"); + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x from t1 where x GLOB 'a[^]c]d'"), + ([NSArray arrayWithObjects:@"abd", nil]), + @"Glob character set with inverted set not matching ] did not " + @"return right rows 3.28"); + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x from t1 where x GLOB 'a[bcdefg'"), + ([NSArray array]), + @"Unclosed glob character set did not return empty result set 3.29"); + + // Section 4 + [db setLikeComparisonOptions:(kCFCompareNonliteral)]; + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 4.1"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE +x LIKE 'abc%' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 4.2"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE ('ab' || 'c%') ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 4.3"); + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x from t1 where x LIKE 'a[xyz]\%' ESCAPE ''"), + ([NSArray array]), + @"0-Character escape clause did not return empty set 4.4"); + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x from t1 where x LIKE " + @"'a[xyz]\%' ESCAPE NULL"), + ([NSArray array]), + @"Null escape did not return empty set 4.5"); + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x from t1 where x LIKE 'a[xyz]\\%' " + @"ESCAPE '\\'"), + ([NSArray array]), + @"Literal percent match using ESCAPE clause did not return empty result " + @"set 4.6"); + + + // Section 5 + [db setLikeComparisonOptions:(kCFCompareNonliteral | kCFCompareCaseInsensitive)]; + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"ABC", @"ABC abc xyz", @"abc", @"abcd", nil]), + @"Fail on LIKE test 5.1"); + + err = [db executeSQL:@"CREATE TABLE t2(x COLLATE NOCASE);"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + + err = [db executeSQL:@"INSERT INTO t2 SELECT * FROM t1;"]; + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + + err = [db executeSQL:@"CREATE INDEX i2 ON t2(x COLLATE NOCASE);"]; + + STAssertEquals(err, SQLITE_OK, @"Failed to execute sql"); + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t2 WHERE x LIKE 'abc%' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"ABC", @"ABC abc xyz", @"abcd", nil]), + @"Fail on LIKE test 5.3"); + + [db setLikeComparisonOptions:(kCFCompareNonliteral)]; + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t2 WHERE x LIKE 'abc%' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 5.5"); + + [db setLikeComparisonOptions:(kCFCompareNonliteral | kCFCompareCaseInsensitive)]; + + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t2 WHERE x GLOB 'abc*' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abc", @"abcd", nil]), + @"Fail on LIKE test 5.5"); + + // Non standard tests not from the SQLite source + STAssertEqualObjects( + LikeGlobTestHelper(db, + @"SELECT x FROM t1 WHERE x GLOB 'a[b-d]d' ORDER BY 1;"), + ([NSArray arrayWithObjects:@"abd", @"acd", nil]), + @"Fail on GLOB with character range"); + } +} + +- (void)testDescription { + int err; + GTMSQLiteDatabase *db8 = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + STAssertNotNil(db8, @"Failed to create database"); + STAssertEquals(err, SQLITE_OK, @"Failed to create database"); + STAssertNotNil([db8 description], nil); +} + +// // From GTMSQLite.m +// CFStringEncoding SqliteTextEncodingToCFStringEncoding(int enc); + +// - (void)testEncodingMappingIsCorrect { +// STAssertTrue(SqliteTextEncodingToCFStringEncoding(SQLITE_UTF8) == +// kCFStringEncodingUTF8, +// @"helper method didn't return right encoding for " +// @"kCFStringEncodingUTF8"); + +// STAssertTrue(SqliteTextEncodingToCFStringEncoding(SQLITE_UTF16BE) +// == kCFStringEncodingUTF16BE, +// @"helper method didn't return right encoding for " +// @"kCFStringEncodingUTF16BE"); + +// STAssertTrue(SqliteTextEncodingToCFStringEncoding(SQLITE_UTF16LE) +// == kCFStringEncodingUTF16LE, +// @"helper method didn't return right encoding for " +// @"kCFStringEncodingUTF16LE"); + +// STAssertTrue(SqliteTextEncodingToCFStringEncoding(9999) +// == kCFStringEncodingUTF8, @"helper method didn't " +// @"return default encoding for invalid input"); +// } + +@end + + +// Helper function for LIKE/GLOB testing +static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) { + + int err; + NSMutableArray *resultArray = [NSMutableArray array]; + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:sql + inDatabase:db + errorCode:&err]; + if (!statement || err != SQLITE_OK) return nil; + while ([statement stepRow] == SQLITE_ROW) { + id result = [statement resultFoundationObjectAtPosition:0]; + if (result) [resultArray addObject:result]; + } + if (err != SQLITE_DONE && err != SQLITE_OK) resultArray = nil; + [statement finalizeStatement]; + + return resultArray; +} + +// ============================================================================= + +@implementation GTMSQLiteStatementTest + +#pragma mark Parameters/binding tests + +- (void)testInitAPI { + int err; + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:nil + inDatabase:nil + errorCode:&err]; + STAssertNil(statement, @"Create statement succeeded with nil SQL string"); + STAssertEquals(err, SQLITE_MISUSE, @"Err was not SQLITE_MISUSE on nil " + @"SQL string"); + + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + statement = [GTMSQLiteStatement statementWithSQL:@"select * from blah" + inDatabase:db + errorCode:&err]; + + STAssertNil(statement, @"Select statement succeeded with invalid table"); + STAssertNotEquals(err, SQLITE_OK, + @"Err was not SQLITE_MISUSE on invalid table"); + + [statement finalizeStatement]; +} + +- (void)testParameterCountAPI { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + NSString *tableCreateSQL = + @"CREATE TABLE foo (tc TEXT," + @"ic integer," + @"rc real," + @"bc blob);"; + + err = [db executeSQL:tableCreateSQL]; + + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for collation test"); + NSString *insert = + @"insert into foo (tc, ic, rc, bc) values (:tc, :ic, :rc, :bc);"; + + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + STAssertEquals([statement parameterCount], 4, + @"Bound parameter count was not 4"); + + [statement sqlite3Statement]; + [statement finalizeStatement]; +} + +- (void)testPositionOfNamedParameterAPI { + int err; + + GTMSQLiteDatabase *dbWithCF = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + GTMSQLiteDatabase *dbWithoutCF = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:NO + utf8:YES + errorCode:&err] + autorelease]; + + NSArray *databases = [NSArray arrayWithObjects:dbWithCF, dbWithoutCF, nil]; + GTMSQLiteDatabase *db; + GTM_FOREACH_OBJECT(db, databases) { + NSString *tableCreateSQL = + @"CREATE TABLE foo (tc TEXT," + @"ic integer," + @"rc real," + @"bc blob);"; + err = [db executeSQL:tableCreateSQL]; + + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for collation test"); + NSString *insert = + @"insert into foo (tc, ic, rc, bc) " + @"values (:tc, :ic, :rc, :bc);"; + + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create statement"); + + NSArray *parameterNames = [NSArray arrayWithObjects:@":tc", + @":ic", + @":rc", + @":bc", nil]; + + for (unsigned int i = 1; i <= [parameterNames count]; i++) { + NSString *paramName = [parameterNames objectAtIndex:i-1]; + // Cast to signed int to avoid type errors from STAssertEquals + STAssertEquals((int)i, + [statement positionOfParameterNamed:paramName], + @"positionOfParameterNamed API did not return correct " + @"results"); + STAssertEqualStrings(paramName, + [statement nameOfParameterAtPosition:i], + @"nameOfParameterAtPosition API did not return " + @"correct name"); + } + [statement finalizeStatement]; + } +} + +- (void)testBindingBlob { + int err; + const int BLOB_COLUMN = 0; + GTMSQLiteDatabase *dbWithCF = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + GTMSQLiteDatabase *dbWithoutCF = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:NO + utf8:YES + errorCode:&err] + autorelease]; + + NSArray *databases = [NSArray arrayWithObjects:dbWithCF, dbWithoutCF, nil]; + GTMSQLiteDatabase *db; + GTM_FOREACH_OBJECT(db, databases) { + // Test strategy is to create a table with 3 columns + // Insert some values, and use the result collection APIs + // to make sure we get the same values back + err = [db executeSQL: + @"CREATE TABLE blobby (bc blob);"]; + + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for BLOB binding test"); + NSString *insert = @"insert into blobby (bc) values (:bc);"; + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create insert statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement"); + + char bytes[] = "DEADBEEF"; + NSUInteger bytesLen = strlen(bytes); + NSData *originalBytes = [NSData dataWithBytes:bytes length:bytesLen]; + + err = [statement bindBlobAtPosition:1 data:originalBytes]; + + STAssertEquals(err, SQLITE_OK, @"error binding BLOB at position 1"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, @"failed to insert BLOB for BLOB test"); + + [statement finalizeStatement]; + + NSString *selectSQL = @"select * from blobby;"; + statement = [GTMSQLiteStatement statementWithSQL:selectSQL + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create select statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create select statement"); + + err = [statement stepRow]; + // Check that we got at least one row back + STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-("); + STAssertEquals([statement resultColumnCount], 1, + @"result had more columns than the table had?"); + + STAssertEqualStrings([statement resultColumnNameAtPosition:BLOB_COLUMN], + @"bc", + @"column name dictionary was not correct"); + + STAssertEquals([statement rowDataCount], + 1, + @"More than one column returned?"); + + STAssertEquals([statement resultColumnTypeAtPosition:BLOB_COLUMN], + SQLITE_BLOB, + @"Query for column 1 of test table was not BLOB!"); + + NSData *returnedbytes = [statement resultBlobDataAtPosition:BLOB_COLUMN]; + STAssertTrue([originalBytes isEqualToData:returnedbytes], + @"Queried data was not equal :-("); + [statement finalizeStatement]; + } +} + +- (void)testBindingNull { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + err = [db executeSQL: + @"CREATE TABLE foo (tc TEXT);"]; + + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for NULL binding test"); + NSString *insert = @"insert into foo (tc) values (:tc);"; + + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create insert statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement"); + + err = [statement bindSQLNullAtPosition:1]; + + STAssertEquals(err, SQLITE_OK, @"error binding NULL at position 1"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, @"failed to insert NULL for Null Binding test"); + + [statement finalizeStatement]; + + NSString *selectSQL = @"select 1 from foo where tc is NULL;"; + statement = [GTMSQLiteStatement statementWithSQL:selectSQL + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create select statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create select statement"); + + err = [statement stepRow]; + // Check that we got at least one row back + STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-("); + [statement finalizeStatement]; +} + +- (void)testBindingDoubles { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + // Test strategy is to create a table with 2 real columns. + // For the first one, we'll use bindDoubleAtPosition + // For the second one, we'll use bindNumberAsDoubleAtPosition + // Then, for verification, we'll use a query that returns + // all rows where the columns are equal + double testVal = 42.42; + NSNumber *doubleValue = [NSNumber numberWithDouble:testVal]; + + err = [db executeSQL: + @"CREATE TABLE realTable (rc1 REAL, rc2 REAL);"]; + + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for double binding test"); + NSString *insert = @"insert into realTable (rc1, rc2) values (:rc1, :rc2);"; + + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create insert statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement"); + + err = [statement bindDoubleAtPosition:1 value:testVal]; + STAssertEquals(err, SQLITE_OK, @"error binding double at position 1"); + + err = [statement bindNumberAsDoubleAtPosition:2 number:doubleValue]; + STAssertEquals(err, SQLITE_OK, + @"error binding number as double at " + @"position 2"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, + @"failed to insert doubles for double " + @"binding test"); + + [statement finalizeStatement]; + + NSString *selectSQL = @"select rc1, rc2 from realTable where rc1 = rc2;"; + statement = [GTMSQLiteStatement statementWithSQL:selectSQL + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create select statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create select statement"); + + err = [statement stepRow]; + // Check that we got at least one row back + STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-("); + double retrievedValue = [statement resultDoubleAtPosition:0]; + STAssertEquals(retrievedValue, testVal, + @"Retrieved double did not equal " + @"original"); + + NSNumber *retrievedNumber = [statement resultNumberAtPosition:1]; + STAssertEqualObjects(retrievedNumber, doubleValue, + @"Retrieved NSNumber object did not equal"); + + [statement finalizeStatement]; +} + +- (void) testResultCollectionAPI { + int err; + GTMSQLiteDatabase *dbWithCF = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + GTMSQLiteDatabase *dbWithoutCF = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:NO + utf8:YES + errorCode:&err] + autorelease]; + + NSArray *databases = [NSArray arrayWithObjects:dbWithCF, dbWithoutCF, nil]; + GTMSQLiteDatabase *db; + GTM_FOREACH_OBJECT(db, databases) { + // Test strategy is to create a table with 3 columns + // Insert some values, and use the result collection APIs + // to make sure we get the same values back + err = [db executeSQL: + @"CREATE TABLE test (a integer, b text, c blob, d text);"]; + + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for result collection test"); + + NSString *insert = + @"insert into test (a, b, c, d) " + @"values (42, 'text text', :bc, null);"; + + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create insert statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement"); + + + char blobChars[] = "DEADBEEF"; + NSUInteger blobLength = strlen(blobChars); + NSData *blobData = [NSData dataWithBytes:blobChars length:blobLength]; + + err = [statement bindBlobAtPosition:1 data:blobData]; + STAssertEquals(err, SQLITE_OK, @"error binding BLOB at position 1"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, + @"failed to insert doubles for double " + @"binding test"); + + NSString *selectSQL = @"select * from test;"; + + [statement finalizeStatement]; + + statement = [GTMSQLiteStatement statementWithSQL:selectSQL + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create select statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create select statement"); + + err = [statement stepRow]; + // Check that we got at least one row back + STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-("); + STAssertNotNil([statement resultRowArray], + @"Failed to retrieve result array"); + STAssertNotNil([statement resultRowDictionary], + @"Failed to retrieve result dictionary"); + [statement finalizeStatement]; + } +} + +- (void) testBindingIntegers { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + // Test strategy is to create a table with 2 real columns. + // For the first one, we'll use bindIntegerAtPosition + // For the second one, we'll use bindNumberAsIntegerAtPosition + // Then, for verification, we'll use a query that returns + // all rows where the columns are equal + int testVal = 42; + NSNumber *intValue = [NSNumber numberWithInt:testVal]; + + err = [db executeSQL: + @"CREATE TABLE integerTable (ic1 integer, ic2 integer);"]; + + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for integer binding test"); + NSString *insert = + @"insert into integerTable (ic1, ic2) values (:ic1, :ic2);"; + + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create insert statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement"); + + err = [statement bindInt32AtPosition:1 value:testVal]; + STAssertEquals(err, SQLITE_OK, @"error binding integer at position 1"); + + err = [statement bindNumberAsInt32AtPosition:2 number:intValue]; + STAssertEquals(err, SQLITE_OK, + @"error binding number as integer at " + @"position 2"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, + @"failed to insert integers for integer " + @"binding test"); + + [statement finalizeStatement]; + + NSString *selectSQL = @"select ic1, ic2 from integerTable where ic1 = ic2;"; + statement = [GTMSQLiteStatement statementWithSQL:selectSQL + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create select statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create select statement"); + + err = [statement stepRow]; + // Check that we got at least one row back + STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-("); + int retrievedValue = [statement resultInt32AtPosition:0]; + STAssertEquals(retrievedValue, testVal, + @"Retrieved integer did not equal " + @"original"); + + NSNumber *retrievedNumber = [statement resultNumberAtPosition:1]; + STAssertEqualObjects(retrievedNumber, intValue, + @"Retrieved NSNumber object did not equal"); + + [statement finalizeStatement]; +} + +- (void) testBindingLongLongs { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + // Test strategy is to create a table with 2 long long columns. + // For the first one, we'll use bindLongLongAtPosition + // For the second one, we'll use bindNumberAsLongLongAtPosition + // Then, for verification, we'll use a query that returns + // all rows where the columns are equal + long long testVal = LLONG_MAX; + NSNumber *longlongValue = [NSNumber numberWithLongLong:testVal]; + + err = [db executeSQL: + @"CREATE TABLE longlongTable (llc1 integer, llc2 integer);"]; + + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for long long binding test"); + NSString *insert = + @"insert into longlongTable (llc1, llc2) " + @"values (:llc1, :llc2);"; + + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create insert statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement"); + + err = [statement bindLongLongAtPosition:1 value:testVal]; + STAssertEquals(err, SQLITE_OK, @"error binding long long at position 1"); + + err = [statement bindNumberAsLongLongAtPosition:2 number:longlongValue]; + STAssertEquals(err, SQLITE_OK, + @"error binding number as long long at " + @"position 2"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, + @"failed to insert long longs for long long " + @"binding test"); + + [statement finalizeStatement]; + + NSString *selectSQL = @"select llc1, llc2 from longlongTable where llc1 = llc2;"; + + statement = [GTMSQLiteStatement statementWithSQL:selectSQL + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create select statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create select statement"); + + err = [statement stepRow]; + // Check that we got at least one row back + STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-("); + long long retrievedValue = [statement resultLongLongAtPosition:0]; + STAssertEquals(retrievedValue, testVal, + @"Retrieved long long did not equal " + @"original"); + + NSNumber *retrievedNumber = [statement resultNumberAtPosition:1]; + STAssertEqualObjects(retrievedNumber, longlongValue, + @"Retrieved NSNumber object did not equal"); + + [statement finalizeStatement]; +} + +- (void) testBindingString { + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + // Test strategy is to create a table with 1 string column + // Then, for verification, we'll use a query that returns + // all rows where the strings are equal + err = [db executeSQL: + @"CREATE TABLE stringTable (sc1 text);"]; + + STAssertEquals(err, SQLITE_OK, + @"Failed to create table for string binding test"); + + NSString *insert = + @"insert into stringTable (sc1) " + @"values (:sc1);"; + + GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create insert statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement"); + + NSString *testVal = @"this is a test string"; + err = [statement bindStringAtPosition:1 string:testVal]; + STAssertEquals(err, SQLITE_OK, @"error binding string at position 1"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, + @"failed to insert string for string binding test"); + + [statement finalizeStatement]; + + NSString *selectSQL = + [NSString stringWithFormat:@"select 1 from stringtable where sc1 = '%@';", + testVal]; + + statement = [GTMSQLiteStatement statementWithSQL:selectSQL + inDatabase:db + errorCode:&err]; + STAssertNotNil(statement, @"Failed to create select statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create select statement"); + + err = [statement stepRow]; + // Check that we got at least one row back + STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-("); + err = [statement stepRow]; + STAssertEquals(err, SQLITE_DONE, @"retrieved more than 1 row from db :-("); + [statement finalizeStatement]; +} + +- (void)testThatNotFinalizingStatementsThrowsAssertion { + // The run-time check is discouraged, but we're using it because the + // same test binary is used for both GC & Non-GC runs + if (!GTMIsGarbageCollectionEnabled()) { + NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init]; + + int err; + GTMSQLiteDatabase *db = + [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES + utf8:YES + errorCode:&err] + autorelease]; + + STAssertNotNil(db, @"Failed to create database"); + + NSString *selectSQL = @"select 1"; + GTMSQLiteStatement *statement; + statement = [GTMSQLiteStatement statementWithSQL:selectSQL + inDatabase:db + errorCode:&err]; + + STAssertNotNil(statement, @"Failed to create select statement"); + STAssertEquals(err, SQLITE_OK, @"Failed to create select statement"); + + err = [statement stepRow]; + STAssertEquals(err, SQLITE_ROW, + @"failed to step row for finalize test"); + + NSString *expectedLog = + @"-[GTMSQLiteStatement finalizeStatement] must be called " + @"when statement is no longer needed"; + + [GTMUnitTestDevLog expectString:expectedLog]; + [GTMUnitTestDevLog expectPattern:@"Unable to close .*"]; + [localPool drain]; + } +} + +- (void)testCompleteSQLString { + NSString *str = @"CREATE TABLE longlongTable (llc1 integer, llc2 integer);"; + BOOL isComplete = [GTMSQLiteStatement isCompleteStatement:str]; + STAssertTrue(isComplete, nil); + isComplete = [GTMSQLiteStatement isCompleteStatement:@""]; + STAssertTrue(isComplete, nil); + isComplete = [GTMSQLiteStatement isCompleteStatement:@"CR"]; + STAssertFalse(isComplete, nil); +} + +- (void)testQuotingSQLString { + NSString *str = @"This is wild! It's fun!"; + NSString *str2 = [GTMSQLiteStatement quoteAndEscapeString:str]; + STAssertEqualObjects(str2, @"'This is wild! It''s fun!'", nil); + str2 = [GTMSQLiteStatement quoteAndEscapeString:@""]; + STAssertEqualObjects(str2, @"''", nil); +} + +- (void)testVersion { + STAssertGreaterThan([GTMSQLiteDatabase sqliteVersionNumber], 0, nil); + STAssertNotNil([GTMSQLiteDatabase sqliteVersionString], nil); +} + +@end + +static void TestUpperLower16Impl(sqlite3_context *context, + int argc, sqlite3_value **argv) { + + customUpperFunctionCalled = YES; +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunner.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunner.h new file mode 100644 index 00000000..226d75b2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunner.h @@ -0,0 +1,134 @@ +// +// GTMScriptRunner.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +/// Encapsulates the interaction with an interpreter for running scripts. +// This class manages the interaction with some command-line interpreter (e.g., +// a shell, perl, python) and allows you to run expressions through the +// interpreter, and even full scripts that reside in files on disk. By default, +// the "/bin/sh" interpreter is used, but others may be explicitly specified. +// This can be a convenient way to run quick shell commands from Cocoa, or even +// interact with other shell tools such as "bc", or even "gdb". +// +// It's important to note that by default commands and scripts will have their +// environments erased before execution. You can control the environment they +// get with the -setEnvironment: method. +// +// The best way to show what this class does is to show some examples. +// +// Examples: +// +// GTMScriptRunner *sr = [GTMScriptRunner runner]; +// NSString *output = [sr run:@"ls -l /dev/null"]; +// /* output == "crw-rw-rw- 1 root wheel 3, 2 Mar 22 10:35 /dev/null" */ +// +// GTMScriptRunner *sr = [GTMScriptRunner runner]; +// NSString *output = [sr runScript:@"/path/to/my/script.sh"]; +// /* output == the standard output from the script*/ +// +// GTMScriptRunner *sr = [GTMScriptRunner runnerWithPerl]; +// NSString *output = [sr run:@"print 'A'x4"]; +// /* output == "AAAA" */ +// +// See the unit test file for more examples. +// +@interface GTMScriptRunner : NSObject { + @private + NSString *interpreter_; + NSArray *interpreterArgs_; + NSDictionary *environment_; + BOOL trimsWhitespace_; +} + +// Convenience methods for returning autoreleased GTMScriptRunner instances, that +// are associated with the specified interpreter. The default interpreter +// (returned from +runner is "/bin/sh"). ++ (GTMScriptRunner *)runner; ++ (GTMScriptRunner *)runnerWithBash; ++ (GTMScriptRunner *)runnerWithPerl; ++ (GTMScriptRunner *)runnerWithPython; + +// Returns an autoreleased GTMScriptRunner instance associated with the specified +// interpreter, and the given args. The specified args are the arguments that +// should be applied to the interpreter itself, not scripts run through the +// interpreter. For example, to start an interpreter using "perl -w", you could +// do: +// [GTMScriptRunner runnerWithInterpreter:@"/usr/bin/perl" +// withArgs:[NSArray arrayWithObject:@"-w"]]; +// ++ (GTMScriptRunner *)runnerWithInterpreter:(NSString *)interp; ++ (GTMScriptRunner *)runnerWithInterpreter:(NSString *)interp + withArgs:(NSArray *)args; + +// Returns a GTMScriptRunner associated with |interp| +- (id)initWithInterpreter:(NSString *)interp; + +// Returns a GTMScriptRunner associated with |interp| and |args| applied to the +// specified interpreter. This method is the designated initializer. +- (id)initWithInterpreter:(NSString *)interp withArgs:(NSArray *)args; + +// Runs the specified command string by sending it through the interpreter's +// standard input. The standard output is returned. The standard error is +// discarded. +- (NSString *)run:(NSString *)cmds; +// Same as the previous method, except the standard error is returned in |err| +// if specified. +- (NSString *)run:(NSString *)cmds standardError:(NSString **)err; + +// Runs the file at |path| using the interpreter. +- (NSString *)runScript:(NSString *)path; +// Runs the file at |path|, passing it |args| as arguments. +- (NSString *)runScript:(NSString *)path withArgs:(NSArray *)args; +// Same as above, except the standard error is returned in |err| if specified. +- (NSString *)runScript:(NSString *)path withArgs:(NSArray *)args + standardError:(NSString **)err; + +// Returns the environment dictionary to use for the inferior process that will +// run the interpreter. A return value of nil means that the interpreter's +// environment should be erased. +- (NSDictionary *)environment; + +// Sets the environment dictionary to use for the interpreter process. See +// NSTask's -setEnvironment: documentation for details about the dictionary. +// Basically, it's just a dict of key/value pairs corresponding to environment +// keys and values. Setting a value of nil means that the environment should be +// erased before running the interpreter. +// +// *** The default is nil. *** +// +// By default, all interpreters will run with a clean environment. If you want +// the interpreter process to inherit your current environment you'll need to +// do the following: +// +// GTMScriptRunner *sr = [GTMScriptRunner runner]; +// [sr setEnvironment:[[NSProcessInfo processInfo] environment]]; +// +// SECURITY NOTE: That said, in general you should NOT do this because an +// attacker can modify the environment that would then get sent to your scripts. +// And if your binary is suid, then you ABSOLUTELY should not do this. +// +- (void)setEnvironment:(NSDictionary *)newEnv; + +// Sets (and returns) whether or not whitespace is automatically trimmed from +// the ends of the returned strings. The default is YES, so trailing newlines +// will be removed. +- (BOOL)trimsWhitespace; +- (void)setTrimsWhitespace:(BOOL)trim; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunner.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunner.m new file mode 100644 index 00000000..fce69156 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunner.m @@ -0,0 +1,254 @@ +// +// GTMScriptRunner.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMScriptRunner.h" +#import "GTMDefines.h" + +static BOOL LaunchNSTaskCatchingExceptions(NSTask *task); + +@interface GTMScriptRunner (PrivateMethods) +- (NSTask *)interpreterTaskWithAdditionalArgs:(NSArray *)args; +@end + +@implementation GTMScriptRunner + ++ (GTMScriptRunner *)runner { + return [[[self alloc] init] autorelease]; +} + ++ (GTMScriptRunner *)runnerWithBash { + return [self runnerWithInterpreter:@"/bin/bash"]; +} + ++ (GTMScriptRunner *)runnerWithPerl { + return [self runnerWithInterpreter:@"/usr/bin/perl"]; +} + ++ (GTMScriptRunner *)runnerWithPython { + return [self runnerWithInterpreter:@"/usr/bin/python"]; +} + ++ (GTMScriptRunner *)runnerWithInterpreter:(NSString *)interp { + return [self runnerWithInterpreter:interp withArgs:nil]; +} + ++ (GTMScriptRunner *)runnerWithInterpreter:(NSString *)interp withArgs:(NSArray *)args { + return [[[self alloc] initWithInterpreter:interp withArgs:args] autorelease]; +} + +- (id)init { + return [self initWithInterpreter:nil]; +} + +- (id)initWithInterpreter:(NSString *)interp { + return [self initWithInterpreter:interp withArgs:nil]; +} + +- (id)initWithInterpreter:(NSString *)interp withArgs:(NSArray *)args { + if ((self = [super init])) { + trimsWhitespace_ = YES; + interpreter_ = [interp copy]; + interpreterArgs_ = [args retain]; + if (!interpreter_) { + interpreter_ = @"/bin/sh"; + } + } + return self; +} + +- (void)dealloc { + [environment_ release]; + [interpreter_ release]; + [interpreterArgs_ release]; + [super dealloc]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@<%p>{ interpreter = '%@', args = %@, environment = %@ }", + [self class], self, interpreter_, interpreterArgs_, environment_]; +} + +- (NSString *)run:(NSString *)cmds { + return [self run:cmds standardError:nil]; +} + +- (NSString *)run:(NSString *)cmds standardError:(NSString **)err { + if (!cmds) return nil; + + NSTask *task = [self interpreterTaskWithAdditionalArgs:nil]; + NSFileHandle *toTask = [[task standardInput] fileHandleForWriting]; + NSFileHandle *fromTask = [[task standardOutput] fileHandleForReading]; + + if (!LaunchNSTaskCatchingExceptions(task)) { + return nil; + } + + [toTask writeData:[cmds dataUsingEncoding:NSUTF8StringEncoding]]; + [toTask closeFile]; + + NSData *outData = [fromTask readDataToEndOfFile]; + NSString *output = [[[NSString alloc] initWithData:outData + encoding:NSUTF8StringEncoding] autorelease]; + + // Handle returning standard error if |err| is not nil + if (err) { + NSFileHandle *stderror = [[task standardError] fileHandleForReading]; + NSData *errData = [stderror readDataToEndOfFile]; + *err = [[[NSString alloc] initWithData:errData + encoding:NSUTF8StringEncoding] autorelease]; + if (trimsWhitespace_) { + *err = [*err stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + + // let folks test for nil instead of @"" + if ([*err length] < 1) { + *err = nil; + } + } + + [task terminate]; + + if (trimsWhitespace_) { + output = [output stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + + // let folks test for nil instead of @"" + if ([output length] < 1) { + output = nil; + } + + return output; +} + +- (NSString *)runScript:(NSString *)path { + return [self runScript:path withArgs:nil]; +} + +- (NSString *)runScript:(NSString *)path withArgs:(NSArray *)args { + return [self runScript:path withArgs:args standardError:nil]; +} + +- (NSString *)runScript:(NSString *)path withArgs:(NSArray *)args standardError:(NSString **)err { + if (!path) return nil; + + NSArray *scriptPlusArgs = [[NSArray arrayWithObject:path] arrayByAddingObjectsFromArray:args]; + NSTask *task = [self interpreterTaskWithAdditionalArgs:scriptPlusArgs]; + NSFileHandle *fromTask = [[task standardOutput] fileHandleForReading]; + + if (!LaunchNSTaskCatchingExceptions(task)) { + return nil; + } + + NSData *outData = [fromTask readDataToEndOfFile]; + NSString *output = [[[NSString alloc] initWithData:outData + encoding:NSUTF8StringEncoding] autorelease]; + + // Handle returning standard error if |err| is not nil + if (err) { + NSFileHandle *stderror = [[task standardError] fileHandleForReading]; + NSData *errData = [stderror readDataToEndOfFile]; + *err = [[[NSString alloc] initWithData:errData + encoding:NSUTF8StringEncoding] autorelease]; + if (trimsWhitespace_) { + *err = [*err stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + + // let folks test for nil instead of @"" + if ([*err length] < 1) { + *err = nil; + } + } + + [task terminate]; + + if (trimsWhitespace_) { + output = [output stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + + // let folks test for nil instead of @"" + if ([output length] < 1) { + output = nil; + } + + return output; +} + +- (NSDictionary *)environment { + return environment_; +} + +- (void)setEnvironment:(NSDictionary *)newEnv { + [environment_ autorelease]; + environment_ = [newEnv retain]; +} + +- (BOOL)trimsWhitespace { + return trimsWhitespace_; +} + +- (void)setTrimsWhitespace:(BOOL)trim { + trimsWhitespace_ = trim; +} + +@end + + +@implementation GTMScriptRunner (PrivateMethods) + +- (NSTask *)interpreterTaskWithAdditionalArgs:(NSArray *)args { + NSTask *task = [[[NSTask alloc] init] autorelease]; + [task setLaunchPath:interpreter_]; + [task setStandardInput:[NSPipe pipe]]; + [task setStandardOutput:[NSPipe pipe]]; + [task setStandardError:[NSPipe pipe]]; + + // If |environment_| is nil, then use an empty dictionary, otherwise use + // environment_ exactly. + [task setEnvironment:(environment_ + ? environment_ + : [NSDictionary dictionary])]; + + // Build args to interpreter. The format is: + // interp [args-to-interp] [script-name [args-to-script]] + NSArray *allArgs = nil; + if (interpreterArgs_) { + allArgs = interpreterArgs_; + } + if (args) { + allArgs = allArgs ? [allArgs arrayByAddingObjectsFromArray:args] : args; + } + if (allArgs){ + [task setArguments:allArgs]; + } + + return task; +} + +@end + +static BOOL LaunchNSTaskCatchingExceptions(NSTask *task) { + BOOL isOK = YES; + @try { + [task launch]; + } @catch (id ex) { + isOK = NO; + _GTMDevLog(@"Failed to launch interpreter '%@' due to: %@", + [task launchPath], ex); + } + return isOK; +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunnerTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunnerTest.m new file mode 100644 index 00000000..3d74b9eb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMScriptRunnerTest.m @@ -0,0 +1,423 @@ +// +// GTMScriptRunnerTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import +#import "GTMSenTestCase.h" +#import "GTMScriptRunner.h" +#import "GTMUnitTestDevLog.h" + +@interface GTMScriptRunnerTest : GTMTestCase { + @private + NSString *shScript_; + NSString *perlScript_; + NSString *shOutputScript_; +} +@end + +@interface GTMScriptRunnerTest (PrivateMethods) +- (void)helperTestBourneShellUsingScriptRunner:(GTMScriptRunner *)sr; +@end + +@implementation GTMScriptRunnerTest + +- (void)setUp { + shScript_ = [NSString stringWithFormat:@"/tmp/script_runner_unittest_%d_%d_sh", geteuid(), getpid()]; + [@"#!/bin/sh\n" + @"i=1\n" + @"if [ -n \"$1\" ]; then\n" + @" i=$1\n" + @"fi\n" + @"echo $i\n" + writeToFile:shScript_ atomically:YES encoding:NSUTF8StringEncoding error:nil]; + + perlScript_ = [NSString stringWithFormat:@"/tmp/script_runner_unittest_%d_%d_pl", geteuid(), getpid()]; + [@"#!/usr/bin/perl\n" + @"use strict;\n" + @"my $i = 1;\n" + @"if (defined $ARGV[0]) {\n" + @" $i = $ARGV[0];\n" + @"}\n" + @"print \"$i\n\"\n" + writeToFile:perlScript_ atomically:YES encoding:NSUTF8StringEncoding error:nil]; + + shOutputScript_ = [NSString stringWithFormat:@"/tmp/script_runner_unittest_err_%d_%d_sh", geteuid(), getpid()]; + [@"#!/bin/sh\n" + @"if [ \"err\" = \"$1\" ]; then\n" + @" echo \" on err \" > /dev/stderr\n" + @"else\n" + @" echo \" on out \"\n" + @"fi\n" + writeToFile:shOutputScript_ atomically:YES encoding:NSUTF8StringEncoding error:nil]; +} + +- (void)tearDown { + const char *path = [shScript_ fileSystemRepresentation]; + if (path) { + unlink(path); + } + path = [perlScript_ fileSystemRepresentation]; + if (path) { + unlink(path); + } + path = [shOutputScript_ fileSystemRepresentation]; + if (path) { + unlink(path); + } +} + +- (void)testShCommands { + GTMScriptRunner *sr = [GTMScriptRunner runner]; + [self helperTestBourneShellUsingScriptRunner:sr]; +} + +- (void)testBashCommands { + GTMScriptRunner *sr = [GTMScriptRunner runnerWithBash]; + [self helperTestBourneShellUsingScriptRunner:sr]; +} + +- (void)testZshCommands { + GTMScriptRunner *sr = [GTMScriptRunner runnerWithInterpreter:@"/bin/zsh"]; + [self helperTestBourneShellUsingScriptRunner:sr]; +} + +- (void)testBcCommands { + GTMScriptRunner *sr = [GTMScriptRunner runnerWithInterpreter:@"/usr/bin/bc" + withArgs:[NSArray arrayWithObject:@"-lq"]]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *output = nil; + + // Simple expression (NOTE that bc requires that commands end with a newline) + output = [sr run:@"1 + 2\n"]; + STAssertEqualObjects(output, @"3", @"output should equal '3'"); + + // Simple expression with variables and multiple statements + output = [sr run:@"i=1; i+2\n"]; + STAssertEqualObjects(output, @"3", @"output should equal '3'"); + + // Simple expression with base conversion + output = [sr run:@"obase=2; 2^5\n"]; + STAssertEqualObjects(output, @"100000", @"output should equal '100000'"); + + // Simple expression with sine and cosine functions + output = [sr run:@"scale=3;s(0)+c(0)\n"]; + STAssertEqualObjects(output, @"1.000", @"output should equal '1.000'"); +} + +- (void)testPerlCommands { + GTMScriptRunner *sr = [GTMScriptRunner runnerWithPerl]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *output = nil; + + // Simple print + output = [sr run:@"print 'hi'"]; + STAssertEqualObjects(output, @"hi", @"output should equal 'hi'"); + + // Simple print x4 + output = [sr run:@"print 'A'x4"]; + STAssertEqualObjects(output, @"AAAA", @"output should equal 'AAAA'"); + + // Simple perl-y stuff + output = [sr run:@"my $i=0; until ($i++==41){} print $i"]; + STAssertEqualObjects(output, @"42", @"output should equal '42'"); +} + +- (void)testPythonCommands { + GTMScriptRunner *sr = [GTMScriptRunner runnerWithPython]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *output = nil; + + // Simple print + output = [sr run:@"print 'hi'"]; + STAssertEqualObjects(output, @"hi", @"output should equal 'hi'"); + + // Simple python expression + output = [sr run:@"print '-'.join(['a', 'b', 'c'])"]; + STAssertEqualObjects(output, @"a-b-c", @"output should equal 'a-b-c'"); +} + +- (void)testBashScript { + GTMScriptRunner *sr = [GTMScriptRunner runnerWithBash]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *output = nil; + + // Simple sh script + output = [sr runScript:shScript_]; + STAssertEqualObjects(output, @"1", @"output should equal '1'"); + + // Simple sh script with 1 command line argument + output = [sr runScript:shScript_ withArgs:[NSArray arrayWithObject:@"2"]]; + STAssertEqualObjects(output, @"2", @"output should equal '2'"); +} + +- (void)testPerlScript { + GTMScriptRunner *sr = [GTMScriptRunner runnerWithPerl]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *output = nil; + + // Simple Perl script + output = [sr runScript:perlScript_]; + STAssertEqualObjects(output, @"1", @"output should equal '1'"); + + // Simple perl script with 1 command line argument + output = [sr runScript:perlScript_ withArgs:[NSArray arrayWithObject:@"2"]]; + STAssertEqualObjects(output, @"2", @"output should equal '2'"); +} + +- (void)testEnvironment { + GTMScriptRunner *sr = [GTMScriptRunner runner]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *output = nil; + NSString *error = nil; + STAssertNil([sr environment], @"should start w/ empty env"); + + output = [sr run:@"/usr/bin/env | wc -l" standardError:&error]; + int numVars = [output intValue]; + STAssertGreaterThan(numVars, 0, + @"numVars should be positive. StdErr %@", error); + // By default the environment is wiped clean, however shells often add a few + // of their own env vars after things have been wiped. For example, sh will + // add about 3 env vars (PWD, _, and SHLVL). + STAssertLessThan(numVars, 5, @"Our env should be almost empty"); + + NSDictionary *newEnv = [NSDictionary dictionaryWithObject:@"bar" + forKey:@"foo"]; + [sr setEnvironment:newEnv]; + output = [sr run:@"/usr/bin/env | wc -l" standardError:&error]; + STAssertEquals([output intValue], numVars + 1, + @"should have one more env var now. StdErr %@", error); + + [sr setEnvironment:nil]; + output = [sr run:@"/usr/bin/env | wc -l" standardError:&error]; + STAssertEquals([output intValue], numVars, + @"should be back down to %d vars. StdErr:%@", numVars, error); + + NSMutableDictionary *currVars + = [[[[NSProcessInfo processInfo] environment] mutableCopy] autorelease]; + + // When debugging a release build _ was not in the processInfo environment + // causing the assert below to fail. Not sure why, but it appeared + // to be harmless, and easy to account for. + [currVars setObject:@"/usr/bin/env" forKey:@"_"]; + [sr setEnvironment:currVars]; + + output = [sr run:@"/usr/bin/env | /usr/bin/sort" standardError:&error]; + NSArray *lineArray = [output componentsSeparatedByString:@"\n"]; + STAssertEquals([lineArray count], [currVars count], + @"StdErr:%@\nCurrentEnvironment:\n%@\nExpected environment:\n%@", + error, output, currVars); +} + +- (void)testDescription { + // make sure description doesn't choke + GTMScriptRunner *sr = [GTMScriptRunner runner]; + STAssertNotNil(sr, @"Script runner must not be nil"); + STAssertGreaterThan([[sr description] length], (NSUInteger)10, + @"expected a description of at least 10 chars"); +} + +- (void)testRunCommandOutputHandling { + // Test whitespace trimming & stdout vs. stderr w/ run command api + + GTMScriptRunner *sr = [GTMScriptRunner runnerWithBash]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *output = nil; + NSString *err = nil; + + // w/o whitespace trimming + { + [sr setTrimsWhitespace:NO]; + STAssertFalse([sr trimsWhitespace], @"setTrimsWhitespace to NO failed"); + + // test stdout + output = [sr run:@"echo \" on out \"" standardError:&err]; + STAssertEqualObjects(output, @" on out \n", @"failed to get stdout output"); + STAssertNil(err, @"stderr should have been empty"); + + // test stderr + output = [sr run:@"echo \" on err \" > /dev/stderr" standardError:&err]; + STAssertNil(output, @"stdout should have been empty"); + STAssertEqualObjects(err, @" on err \n", nil); + } + + // w/ whitespace trimming + { + [sr setTrimsWhitespace:YES]; + STAssertTrue([sr trimsWhitespace], @"setTrimsWhitespace to YES failed"); + + // test stdout + output = [sr run:@"echo \" on out \"" standardError:&err]; + STAssertEqualObjects(output, @"on out", @"failed to get stdout output"); + STAssertNil(err, @"stderr should have been empty"); + + // test stderr + output = [sr run:@"echo \" on err \" > /dev/stderr" standardError:&err]; + STAssertNil(output, @"stdout should have been empty"); + STAssertEqualObjects(err, @"on err", nil); + } +} + +- (void)testScriptOutputHandling { + // Test whitespace trimming & stdout vs. stderr w/ script api + + GTMScriptRunner *sr = [GTMScriptRunner runner]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *output = nil; + NSString *err = nil; + + // w/o whitespace trimming + { + [sr setTrimsWhitespace:NO]; + STAssertFalse([sr trimsWhitespace], @"setTrimsWhitespace to NO failed"); + + // test stdout + output = [sr runScript:shOutputScript_ + withArgs:[NSArray arrayWithObject:@"out"] + standardError:&err]; + STAssertEqualObjects(output, @" on out \n", nil); + STAssertNil(err, @"stderr should have been empty"); + + // test stderr + output = [sr runScript:shOutputScript_ + withArgs:[NSArray arrayWithObject:@"err"] + standardError:&err]; + STAssertNil(output, @"stdout should have been empty"); + STAssertEqualObjects(err, @" on err \n", nil); + } + + // w/ whitespace trimming + { + [sr setTrimsWhitespace:YES]; + STAssertTrue([sr trimsWhitespace], @"setTrimsWhitespace to YES failed"); + + // test stdout + output = [sr runScript:shOutputScript_ + withArgs:[NSArray arrayWithObject:@"out"] + standardError:&err]; + STAssertEqualObjects(output, @"on out", nil); + STAssertNil(err, @"stderr should have been empty"); + + // test stderr + output = [sr runScript:shOutputScript_ + withArgs:[NSArray arrayWithObject:@"err"] + standardError:&err]; + STAssertNil(output, @"stdout should have been empty"); + STAssertEqualObjects(err, @"on err", nil); + } +} + +- (void)testBadRunCommandInput { + GTMScriptRunner *sr = [GTMScriptRunner runner]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *err = nil; + + STAssertNil([sr run:nil standardError:&err], nil); + STAssertNil(err, nil); +} + +- (void)testBadScriptInput { + GTMScriptRunner *sr = [GTMScriptRunner runner]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *err = nil; + + STAssertNil([sr runScript:nil withArgs:nil standardError:&err], nil); + STAssertNil(err, nil); + STAssertNil([sr runScript:@"/path/that/does/not/exists/foo/bar/baz" + withArgs:nil standardError:&err], nil); + STAssertNotNil(err, + @"should have gotten something about the path not existing"); +} + +- (void)testBadCmdInterpreter { + GTMScriptRunner *sr = + [GTMScriptRunner runnerWithInterpreter:@"/path/that/does/not/exists/interpreter"]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *err = nil; + + STAssertNil([sr run:nil standardError:&err], nil); + STAssertNil(err, nil); + [GTMUnitTestDevLog expectString:@"Failed to launch interpreter " + "'/path/that/does/not/exists/interpreter' due to: launch path not accessible"]; + STAssertNil([sr run:@"ls /" standardError:&err], nil); + STAssertNil(err, nil); +} + +- (void)testBadScriptInterpreter { + GTMScriptRunner *sr = + [GTMScriptRunner runnerWithInterpreter:@"/path/that/does/not/exists/interpreter"]; + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *err = nil; + + [GTMUnitTestDevLog expectString:@"Failed to launch interpreter " + "'/path/that/does/not/exists/interpreter' due to: launch path not accessible"]; + STAssertNil([sr runScript:shScript_ withArgs:nil standardError:&err], nil); + STAssertNil(err, nil); + [GTMUnitTestDevLog expectString:@"Failed to launch interpreter " + "'/path/that/does/not/exists/interpreter' due to: launch path not accessible"]; + STAssertNil([sr runScript:@"/path/that/does/not/exists/foo/bar/baz" + withArgs:nil standardError:&err], nil); + STAssertNil(err, nil); +} + + +@end + +@implementation GTMScriptRunnerTest (PrivateMethods) + +- (void)helperTestBourneShellUsingScriptRunner:(GTMScriptRunner *)sr { + STAssertNotNil(sr, @"Script runner must not be nil"); + NSString *output = nil; + + // Simple command + output = [sr run:@"ls /etc/passwd"]; + STAssertEqualObjects(output, @"/etc/passwd", @"output should equal '/etc/passwd'"); + + // Simple command pipe-line + output = [sr run:@"ls /etc/ | grep passwd | tail -1"]; + STAssertEqualObjects(output, @"passwd", @"output should equal 'passwd'"); + + // Simple pipe-line with quotes and awk variables + output = [sr run:@"ps jaxww | awk '{print $2}' | sort -nr | tail -2 | head -1"]; + STAssertEqualObjects(output, @"1", @"output should equal '1'"); + + // Simple shell loop with variables + output = [sr run:@"i=0; while [ $i -lt 100 ]; do i=$((i+1)); done; echo $i"]; + STAssertEqualObjects(output, @"100", @"output should equal '100'"); + + // Simple command with newlines + output = [sr run:@"i=1\necho $i"]; + STAssertEqualObjects(output, @"1", @"output should equal '1'"); + + // Simple full shell script + output = [sr run:@"#!/bin/sh\ni=1\necho $i\n"]; + STAssertEqualObjects(output, @"1", @"output should equal '1'"); + + NSString *err = nil; + + // Test getting standard error with no stdout + output = [sr run:@"ls /etc/does-not-exist" standardError:&err]; + STAssertNil(output, @"output should be nil due to expected error"); + STAssertEqualObjects(err, @"ls: /etc/does-not-exist: No such file or directory", @""); + + // Test getting standard output along with some standard error + output = [sr run:@"ls /etc/does-not-exist /etc/passwd" standardError:&err]; + STAssertEqualObjects(output, @"/etc/passwd", @""); + STAssertEqualObjects(err, @"ls: /etc/does-not-exist: No such file or directory", @""); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandler.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandler.h new file mode 100644 index 00000000..b1c7c2f1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandler.h @@ -0,0 +1,73 @@ +// +// GTMSignalHandler.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +// GTMSignalHandler. +// +// This is a very simple, easy-to-use class for registering handlers that get +// called when a specific signal is delivered. Also handy for ignoring +// inconvenient signals. Ignoring SIGKILL is not support for what should be +// obvious reasons. You can pass nil for target & action to ignore the signal. +// +// Example of how to catch SIGABRT and SIGTERM while ignring SIGWINCH: +// GTMSignalHandler *abrt, *term, *winch; +// abrt = [[GTMSignalHandler alloc] +// initWithSignal:SIGABRT +// target:self +// action:@selector(handleAbort:)]; +// +// term = [[GTMSignalHandler alloc] +// initWithSignal:SIGTERM +// target:self +// action:@selector(handleTerm:)]; +// +// winch = [[GTMSignalHandler alloc] initWithSignal:SIGWINCH +// initWithSignal:SIGWINCH +// target:nil +// action:NULL +// +// -(void)handleTerm:(int)signo { +// .. do stuff .. +// } +// +// Release the handler when you're no longer interested in handling that signal. +// Note that signal(SIG_IGN, signo) is performed on each signal handled by +// objects of this class, and those do not get un-done. +// +// Multiple handlers for the same signal is NOT supported. +// +// kqueue() is used to handle the signals, and the default runloop for the first +// signal handler is used for signal delivery, so keep that in mind when you're +// using this class. This class explicitly does not handle arbitrary runloops +// and threading. +// +@interface GTMSignalHandler : NSObject { + @private + int signo_; + __weak id target_; + SEL action_; +} + +// Returns a retained signal handler object that will invoke |handler| on the +// |target| whenever a signal of number |signo| is delivered to the process. +-(id)initWithSignal:(int)signo + target:(id)target + action:(SEL)action; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandler.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandler.m new file mode 100644 index 00000000..b6cfb706 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandler.m @@ -0,0 +1,210 @@ +// +// GTMSignalHandler.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSignalHandler.h" +#import "GTMDefines.h" + +#import // for kqueue() and kevent +#import "GTMDebugSelectorValidation.h" + +// Simplifying assumption: No more than one handler for a particular signal is +// alive at a time. When the second signal is registered, kqueue just updates +// the info about the first signal, which makes -dealloc time complicated (what +// happens when handler1(SIGUSR1) is released before handler2(SIGUSR1)?). This +// could be solved by having one kqueue per signal, or keeping a list of +// handlers interested in a particular signal, but not really worth it for apps +// that register the handlers at startup and don't change them. + + +// File descriptor for the kqueue that will hold all of our signal events. +static int gSignalKQueueFileDescriptor = 0; + +// A wrapper around the kqueue file descriptor so we can put it into a +// runloop. +static CFSocketRef gRunLoopSocket = NULL; + + +@interface GTMSignalHandler (PrivateMethods) +- (void)notify; +- (void)addFileDescriptorMonitor:(int)fd; +- (void)registerWithKQueue; +- (void)unregisterWithKQueue; +@end + + +@implementation GTMSignalHandler + +-(id)init { + // Folks shouldn't call init directly, so they get what they deserve. + _GTMDevLog(@"Don't call init, use " + @"initWithSignal:target:action:"); + return [self initWithSignal:0 target:nil action:NULL]; +} + +- (id)initWithSignal:(int)signo + target:(id)target + action:(SEL)action { + + if ((self = [super init])) { + + if (signo == 0) { + [self release]; + return nil; + } + + signo_ = signo; + target_ = target; // Don't retain since target will most likely retain us. + action_ = action; + GTMAssertSelectorNilOrImplementedWithArguments(target_, + action_, + @encode(int), + NULL); + + // We're handling this signal via kqueue, so turn off the usual signal + // handling. + signal(signo_, SIG_IGN); + + if (action != NULL) { + [self registerWithKQueue]; + } + } + return self; +} + +#if GTM_SUPPORT_GC +- (void)finalize { + [self unregisterWithKQueue]; + + [super finalize]; + +} +#endif + +- (void)dealloc { + [self unregisterWithKQueue]; + + [super dealloc]; + +} + +// Cribbed from Advanced Mac OS X Programming. +static void SocketCallBack(CFSocketRef socketref, CFSocketCallBackType type, + CFDataRef address, const void *data, void *info) { + // We're using CFRunLoop calls here. Even when used on the main thread, they + // don't trigger the draining of the main application's autorelease pool that + // NSRunLoop provides. If we're used in a UI-less app, this means that + // autoreleased objects would never go away, so we provide our own pool here. + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + struct kevent event; + + if (kevent(gSignalKQueueFileDescriptor, NULL, 0, &event, 1, NULL) == -1) { + _GTMDevLog(@"could not pick up kqueue event. Errno %d", errno); // COV_NF_LINE + } else { + GTMSignalHandler *handler = (GTMSignalHandler *)event.udata; + [handler notify]; + } + + [pool drain]; +} + +// Cribbed from Advanced Mac OS X Programming +- (void)addFileDescriptorMonitor:(int)fd { + CFSocketContext context = { 0, NULL, NULL, NULL, NULL }; + + gRunLoopSocket = CFSocketCreateWithNative(kCFAllocatorDefault, + fd, + kCFSocketReadCallBack, + SocketCallBack, + &context); + if (gRunLoopSocket == NULL) { + _GTMDevLog(@"could not CFSocketCreateWithNative"); // COV_NF_LINE + goto bailout; // COV_NF_LINE + } + + CFRunLoopSourceRef rls; + rls = CFSocketCreateRunLoopSource(NULL, gRunLoopSocket, 0); + if (rls == NULL) { + _GTMDevLog(@"could not create a run loop source"); // COV_NF_LINE + goto bailout; // COV_NF_LINE + } + + CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, + kCFRunLoopDefaultMode); + CFRelease(rls); + + bailout: + return; + +} + +- (void)registerWithKQueue { + + // Make sure we have our kqueue. + if (gSignalKQueueFileDescriptor == 0) { + gSignalKQueueFileDescriptor = kqueue(); + + if (gSignalKQueueFileDescriptor == -1) { + _GTMDevLog(@"could not make signal kqueue. Errno %d", errno); // COV_NF_LINE + return; // COV_NF_LINE + } + + // Add the kqueue file descriptor to the runloop. + [self addFileDescriptorMonitor:gSignalKQueueFileDescriptor]; + } + + // Add a new event for the signal. + struct kevent filter; + EV_SET(&filter, signo_, EVFILT_SIGNAL, EV_ADD | EV_ENABLE | EV_CLEAR, + 0, 0, self); + + const struct timespec noWait = { 0, 0 }; + if (kevent(gSignalKQueueFileDescriptor, &filter, 1, NULL, 0, &noWait) != 0) { + _GTMDevLog(@"could not add event for signal %d. Errno %d", signo_, errno); // COV_NF_LINE + } + +} + +- (void)unregisterWithKQueue { + // Short-circuit cases where we didn't actually register a kqueue event. + if (signo_ == 0) return; + if (action_ == nil) return; + + struct kevent filter; + EV_SET(&filter, signo_, EVFILT_SIGNAL, EV_DELETE, 0, 0, self); + + const struct timespec noWait = { 0, 0 }; + if (kevent(gSignalKQueueFileDescriptor, &filter, 1, NULL, 0, &noWait) != 0) { + _GTMDevLog(@"could not remove event for signal %d. Errno %d", signo_, errno); // COV_NF_LINE + } + +} + +- (void)notify { + // Now, fire the selector + NSMethodSignature *methodSig = [target_ methodSignatureForSelector:action_]; + _GTMDevAssert(methodSig != nil, @"failed to get the signature?"); + NSInvocation *invocation + = [NSInvocation invocationWithMethodSignature:methodSig]; + [invocation setTarget:target_]; + [invocation setSelector:action_]; + [invocation setArgument:&signo_ atIndex:2]; + [invocation invoke]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandlerTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandlerTest.m new file mode 100644 index 00000000..a0019f3c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSignalHandlerTest.m @@ -0,0 +1,143 @@ +// +// GTMSignalHandlerTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMSignalHandler.h" +#import "GTMUnitTestDevLog.h" + +@interface GTMSignalHandlerTest : GTMTestCase +@end + +@interface SignalCounter : NSObject { + @public + int signalCount_; + int lastSeenSignal_; +} +- (int)count; +- (int)lastSeen; +- (void)countSignal:(int)signo; ++ (id)signalCounter; +@end // SignalCounter + +@implementation SignalCounter ++ (id)signalCounter { + return [[[[self class] alloc] init] autorelease]; +} +- (int)count { + return signalCount_; +} +- (int)lastSeen { + return lastSeenSignal_; +} +// Count the number of times this signal handler has fired. +- (void)countSignal:(int)signo { + signalCount_++; + lastSeenSignal_ = signo; +} +@end + +@implementation GTMSignalHandlerTest + +// Spin the run loop so that the kqueue event notifications will get delivered. +- (void)giveSomeLove { + NSDate *endTime = [NSDate dateWithTimeIntervalSinceNow:0.5]; + [[NSRunLoop currentRunLoop] runUntilDate:endTime]; +} + +- (void)testNillage { + GTMSignalHandler *handler; + + // Just an init should return nil. + [GTMUnitTestDevLog expectString:@"Don't call init, use " + @"initWithSignal:target:action:"]; + handler = [[[GTMSignalHandler alloc] init] autorelease]; + STAssertNil(handler, nil); + + // Zero signal should return nil as well. + handler = [[[GTMSignalHandler alloc] + initWithSignal:0 + target:self + action:@selector(nomnomnom:)] autorelease]; + STAssertNil(handler, nil); + +} + +- (void)testSingleHandler { + SignalCounter *counter = [SignalCounter signalCounter]; + STAssertNotNil(counter, nil); + + GTMSignalHandler *handler = [[GTMSignalHandler alloc] + initWithSignal:SIGWINCH + target:counter + action:@selector(countSignal:)]; + STAssertNotNil(handler, nil); + raise(SIGWINCH); + [self giveSomeLove]; + + STAssertEquals([counter count], 1, nil); + STAssertEquals([counter lastSeen], SIGWINCH, nil); + + raise(SIGWINCH); + [self giveSomeLove]; + + STAssertEquals([counter count], 2, nil); + STAssertEquals([counter lastSeen], SIGWINCH, nil); + + // create a second one to make sure we're seding data where we want + SignalCounter *counter2 = [SignalCounter signalCounter]; + STAssertNotNil(counter2, nil); + [[[GTMSignalHandler alloc] initWithSignal:SIGUSR1 + target:counter2 + action:@selector(countSignal:)] autorelease]; + + raise(SIGUSR1); + [self giveSomeLove]; + + STAssertEquals([counter count], 2, nil); + STAssertEquals([counter lastSeen], SIGWINCH, nil); + STAssertEquals([counter2 count], 1, nil); + STAssertEquals([counter2 lastSeen], SIGUSR1, nil); + + [handler release]; + + // The signal is still ignored (so we shouldn't die), but the + // the handler method should not get called. + raise(SIGWINCH); + + STAssertEquals([counter count], 2, nil); + STAssertEquals([counter lastSeen], SIGWINCH, nil); + STAssertEquals([counter2 count], 1, nil); + STAssertEquals([counter2 lastSeen], SIGUSR1, nil); + +} + +- (void)testIgnore { + SignalCounter *counter = [SignalCounter signalCounter]; + STAssertNotNil(counter, nil); + + [[[GTMSignalHandler alloc] initWithSignal:SIGUSR1 + target:counter + action:NULL] autorelease]; + + raise(SIGUSR1); + [self giveSomeLove]; + STAssertEquals([counter count], 0, nil); + +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTrace.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTrace.h new file mode 100644 index 00000000..d8cc6422 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTrace.h @@ -0,0 +1,105 @@ +// +// GTMStackTrace.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#include +#import "GTMDefines.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct GTMAddressDescriptor { + const void *address; // address + const char *symbol; // nearest symbol to address + const char *class_name; // if it is an obj-c method, the method's class + BOOL is_class_method; // if it is an obj-c method, type of method + const char *filename; // file that the method came from. +}; + +// Returns a string containing a nicely formatted stack trace. +// +// This function gets the stack trace for the current thread. It will +// be from the caller of GTMStackTrace upwards to the top the calling stack. +// Typically this function will be used along with some logging, +// as in the following: +// +// MyAppLogger(@"Should never get here:\n%@", GTMStackTrace()); +// +// Here is a sample stack trace returned from this function: +// +// #0 0x00002d92 D () [/Users/me/./StackLog] +// #1 0x00002e45 C () [/Users/me/./StackLog] +// #2 0x00002e53 B () [/Users/me/./StackLog] +// #3 0x00002e61 A () [/Users/me/./StackLog] +// #4 0x00002e6f main () [/Users/me/./StackLog] +// #5 0x00002692 tart () [/Users/me/./StackLog] +// #6 0x000025b9 tart () [/Users/me/./StackLog] +// + +NSString *GTMStackTrace(void); + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 +// Returns a string containing a nicely formatted stack trace from the +// exception. Only available on 10.5 or later, uses +// -[NSException callStackReturnAddresses]. +// +NSString *GTMStackTraceFromException(NSException *e); +#endif + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 +// Returns an array of program counters from the current thread's stack. +// *** You should probably use GTMStackTrace() instead of this function *** +// However, if you actually want all the PCs in "void *" form, then this +// funtion is more convenient. This will include PCs of GTMStaceTrace and +// its inner utility functions that you may want to strip out. +// +// You can use +[NSThread callStackReturnAddresses] in 10.5 or later. +// +// Args: +// outPcs - an array of "void *" pointers to the program counters found on the +// current thread's stack. +// count - the number of entries in the outPcs array +// +// Returns: +// The number of program counters actually added to outPcs. +// +NSUInteger GTMGetStackProgramCounters(void *outPcs[], NSUInteger count); +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +// Returns an array of GTMAddressDescriptors from the current thread's stack. +// *** You should probably use GTMStackTrace() instead of this function *** +// However, if you actually want all the PCs with symbols, this is the way +// to get them. There is no memory allocations done, so no clean up is required +// except for the caller to free outDescs if they allocated it themselves. +// This will include PCs of GTMStaceTrace and its inner utility functions that +// you may want to strip out. +// +// Args: +// outDescs - an array of "struct GTMAddressDescriptor" pointers corresponding +// to the program counters found on the current thread's stack. +// count - the number of entries in the outDescs array +// +// Returns: +// The number of program counters actually added to outPcs. +// +NSUInteger GTMGetStackAddressDescriptors(struct GTMAddressDescriptor outDescs[], + NSUInteger count); + +#ifdef __cplusplus +} +#endif diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTrace.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTrace.m new file mode 100644 index 00000000..05843b50 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTrace.m @@ -0,0 +1,358 @@ +// +// GTMStackTrace.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#include +#include +#include +#include "GTMStackTrace.h" +#include "GTMObjC2Runtime.h" + +struct GTMClassDescription { + const char *class_name; + Method *class_methods; + unsigned int class_method_count; + Method *instance_methods; + unsigned int instance_method_count; +}; + +#pragma mark Private utility functions + +static struct GTMClassDescription *GTMClassDescriptions(NSUInteger *total_count) { + int class_count = objc_getClassList(nil, 0); + struct GTMClassDescription *class_descs + = calloc(class_count, sizeof(struct GTMClassDescription)); + if (class_descs) { + Class *classes = calloc(class_count, sizeof(Class)); + if (classes) { + objc_getClassList(classes, class_count); + for (int i = 0; i < class_count; ++i) { + class_descs[i].class_methods + = class_copyMethodList(object_getClass(classes[i]), + &class_descs[i].class_method_count); + class_descs[i].instance_methods + = class_copyMethodList(classes[i], + &class_descs[i].instance_method_count); + class_descs[i].class_name = class_getName(classes[i]); + } + free(classes); + } else { + // COV_NF_START - Don't know how to force this in a unittest + free(class_descs); + class_count = 0; + // COV_NF_END + } + } + if (total_count) { + *total_count = class_count; + } + return class_descs; +} + +static void GTMFreeClassDescriptions(struct GTMClassDescription *class_descs, + NSUInteger count) { + if (!class_descs) return; + for (NSUInteger i = 0; i < count; ++i) { + if (class_descs[i].instance_methods) { + free(class_descs[i].instance_methods); + } + if (class_descs[i].class_methods) { + free(class_descs[i].class_methods); + } + } + free(class_descs); +} + +static NSUInteger GTMGetStackAddressDescriptorsForAddresses(void *pcs[], + struct GTMAddressDescriptor outDescs[], + NSUInteger count) { + if (count < 1 || !pcs || !outDescs) return 0; + + NSUInteger class_desc_count; + + // Get our obj-c class descriptions. This is expensive, so we do it once + // at the top. We go through this because dladdr doesn't work with + // obj methods. + struct GTMClassDescription *class_descs + = GTMClassDescriptions(&class_desc_count); + + // Iterate through the stack. + for (NSUInteger i = 0; i < count; ++i) { + const char *class_name = NULL; + BOOL is_class_method = NO; + size_t smallest_diff = SIZE_MAX; + struct GTMAddressDescriptor *currDesc = &outDescs[i]; + currDesc->address = pcs[i]; + Method best_method = NULL; + // Iterate through all the classes we know of. + for (NSUInteger j = 0; j < class_desc_count; ++j) { + // First check the class methods. + for (NSUInteger k = 0; k < class_descs[j].class_method_count; ++k) { + IMP imp = method_getImplementation(class_descs[j].class_methods[k]); + if (imp <= (IMP)currDesc->address) { + size_t diff = (size_t)currDesc->address - (size_t)imp; + if (diff < smallest_diff) { + best_method = class_descs[j].class_methods[k]; + class_name = class_descs[j].class_name; + is_class_method = YES; + smallest_diff = diff; + } + } + } + // Then check the instance methods. + for (NSUInteger k = 0; k < class_descs[j].instance_method_count; ++k) { + IMP imp = method_getImplementation(class_descs[j].instance_methods[k]); + if (imp <= (IMP)currDesc->address) { + size_t diff = (size_t)currDesc->address - (size_t)imp; + if (diff < smallest_diff) { + best_method = class_descs[j].instance_methods[k]; + class_name = class_descs[j].class_name; + is_class_method = NO; + smallest_diff = diff; + } + } + } + } + + // If we have one, store it off. + if (best_method) { + currDesc->symbol = sel_getName(method_getName(best_method)); + currDesc->is_class_method = is_class_method; + currDesc->class_name = class_name; + } + Dl_info info = { NULL, NULL, NULL, NULL }; + + // Check to see if the one returned by dladdr is better. + dladdr(currDesc->address, &info); + if ((size_t)currDesc->address - (size_t)info.dli_saddr < smallest_diff) { + currDesc->symbol = info.dli_sname; + currDesc->is_class_method = NO; + currDesc->class_name = NULL; + } + currDesc->filename = info.dli_fname; + } + GTMFreeClassDescriptions(class_descs, class_desc_count); + return count; +} + +static NSString *GTMStackTraceFromAddressDescriptors(struct GTMAddressDescriptor descs[], + NSUInteger count) { + NSMutableString *trace = [NSMutableString string]; + + for (NSUInteger i = 0; i < count; i++) { + // Newline between all the lines + if (i) { + [trace appendString:@"\n"]; + } + if (descs[i].class_name) { + [trace appendFormat:@"#%-2u %#08lx %s[%s %s] (%s)", + i, descs[i].address, + (descs[i].is_class_method ? "+" : "-"), + descs[i].class_name, + (descs[i].symbol ? descs[i].symbol : "??"), + (descs[i].filename ? descs[i].filename : "??")]; + } else { + [trace appendFormat:@"#%-2u %#08lx %s() (%s)", + i, descs[i].address, + (descs[i].symbol ? descs[i].symbol : "??"), + (descs[i].filename ? descs[i].filename : "??")]; + } + } + return trace; +} + +#pragma mark Public functions + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 +// Before 10.5, we have to do this ourselves. 10.5 adds +// +[NSThread callStackReturnAddresses]. + +// Structure representing a small portion of a stack, starting from the saved +// frame pointer, and continuing through the saved program counter. +struct GTMStackFrame { + void *saved_fp; +#if defined (__ppc__) || defined(__ppc64__) + void *padding; +#endif + void *saved_pc; +}; + +// __builtin_frame_address(0) is a gcc builtin that returns a pointer to the +// current frame pointer. We then use the frame pointer to walk the stack +// picking off program counters and other saved frame pointers. This works +// great on i386, but PPC requires a little more work because the PC (or link +// register) isn't always stored on the stack. +// +NSUInteger GTMGetStackProgramCounters(void *outPcs[], NSUInteger count) { + if (!outPcs || (count < 1)) return 0; + + struct GTMStackFrame *fp; +#if defined (__ppc__) || defined(__ppc64__) + outPcs[0] = __builtin_return_address(0); + fp = (struct GTMStackFrame *)__builtin_frame_address(1); +#elif defined (__i386__) || defined(__x86_64__) + fp = (struct GTMStackFrame *)__builtin_frame_address(0); +#else +#error architecture not supported +#endif + + NSUInteger level = 0; + while (level < count) { + if (fp == NULL) { + level--; + break; + } + outPcs[level] = fp->saved_pc; + level++; + fp = (struct GTMStackFrame *)fp->saved_fp; + } + + return level; +} +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +NSUInteger GTMGetStackAddressDescriptors(struct GTMAddressDescriptor outDescs[], + NSUInteger count) { + if (count < 1 || !outDescs) return 0; + NSUInteger result = 0; + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + // Before 10.5, we collect the stack ourselves. + + void **pcs = calloc(count, sizeof(void*)); + if (!pcs) return 0; + + NSUInteger newSize = GTMGetStackProgramCounters(pcs, count); + + result = GTMGetStackAddressDescriptorsForAddresses(pcs, outDescs, newSize); + free(pcs); + +#else // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + // Use +[NSThread callStackReturnAddresses] + + NSArray *addresses = [NSThread callStackReturnAddresses]; + NSUInteger addrCount = [addresses count]; + if (addrCount) { + void **pcs = calloc(addrCount, sizeof(void*)); + if (pcs) { + void **pcsScanner = pcs; + for (NSNumber *address in addresses) { + NSUInteger addr = [address unsignedIntegerValue]; + *pcsScanner = (void *)addr; + ++pcsScanner; + } + if (count < addrCount) { + addrCount = count; + } + // Fill in the desc structures + result = GTMGetStackAddressDescriptorsForAddresses(pcs, outDescs, addrCount); + } + if (pcs) free(pcs); + } +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + + return result; +} + +NSString *GTMStackTrace(void) { + // If we don't have enough frames, return an empty string + NSString *result = @""; + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + // Before 10.5, we collect the stack ourselves. + + // The maximum number of stack frames that we will walk. We limit this so + // that super-duper recursive functions (or bugs) don't send us for an + // infinite loop. + struct GTMAddressDescriptor descs[100]; + size_t depth = sizeof(descs) / sizeof(struct GTMAddressDescriptor); + depth = GTMGetStackAddressDescriptors(descs, depth); + + // Start at the second item so that GTMStackTrace and it's utility calls (of + // which there is currently 1) is not included in the output. + const size_t kTracesToStrip = 2; + if (depth > kTracesToStrip) { + result = GTMStackTraceFromAddressDescriptors(&descs[kTracesToStrip], + (depth - kTracesToStrip)); + } +#else // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + // Use +[NSThread callStackReturnAddresses] + + NSArray *addresses = [NSThread callStackReturnAddresses]; + NSUInteger count = [addresses count]; + if (count) { + void **pcs = calloc(count, sizeof(void*)); + struct GTMAddressDescriptor *descs + = calloc(count, sizeof(struct GTMAddressDescriptor)); + if (pcs && descs) { + void **pcsScanner = pcs; + for (NSNumber *address in addresses) { + NSUInteger addr = [address unsignedIntegerValue]; + *pcsScanner = (void *)addr; + ++pcsScanner; + } + // Fill in the desc structures + count = GTMGetStackAddressDescriptorsForAddresses(pcs, descs, count); + // Build the trace + // We skip 1 frame because the +[NSThread callStackReturnAddresses] will + // start w/ this frame. + const size_t kTracesToStrip = 1; + if (count > kTracesToStrip) { + result = GTMStackTraceFromAddressDescriptors(&descs[kTracesToStrip], + (count - kTracesToStrip)); + } + } + if (pcs) free(pcs); + if (descs) free(descs); + } +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + + return result; +} + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +NSString *GTMStackTraceFromException(NSException *e) { + NSString *trace = @""; + + // collect the addresses + NSArray *addresses = [e callStackReturnAddresses]; + NSUInteger count = [addresses count]; + if (count) { + void **pcs = calloc(count, sizeof(void*)); + struct GTMAddressDescriptor *descs + = calloc(count, sizeof(struct GTMAddressDescriptor)); + if (pcs && descs) { + void **pcsScanner = pcs; + for (NSNumber *address in addresses) { + NSUInteger addr = [address unsignedIntegerValue]; + *pcsScanner = (void *)addr; + ++pcsScanner; + } + // Fill in the desc structures + count = GTMGetStackAddressDescriptorsForAddresses(pcs, descs, count); + // Build the trace + trace = GTMStackTraceFromAddressDescriptors(descs, count); + } + if (pcs) free(pcs); + if (descs) free(descs); + } + + return trace; +} + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTraceTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTraceTest.m new file mode 100644 index 00000000..07391220 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMStackTraceTest.m @@ -0,0 +1,163 @@ +// +// GTMStackTraceTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMStackTrace.h" +#import "GTMSenTestCase.h" + +@interface GTMStackTraceTest : GTMTestCase +@end + +@implementation GTMStackTraceTest ++ (BOOL)classMethodTest { + NSString *stacktrace = GTMStackTrace(); + NSArray *stacklines = [stacktrace componentsSeparatedByString:@"\n"]; + NSString *firstFrame = [stacklines objectAtIndex:0]; + NSRange range = [firstFrame rangeOfString:@"+"]; + return range.location != NSNotFound; +} + +- (void)testStackTraceBasic { + NSString *stacktrace = GTMStackTrace(); + NSArray *stacklines = [stacktrace componentsSeparatedByString:@"\n"]; + + STAssertGreaterThan([stacklines count], (NSUInteger)3, + @"stack trace must have > 3 lines"); + STAssertLessThan([stacklines count], (NSUInteger)25, + @"stack trace must have < 25 lines"); + + NSString *firstFrame = [stacklines objectAtIndex:0]; + NSRange range = [firstFrame rangeOfString:@"testStackTraceBasic"]; + STAssertNotEquals(range.location, (NSUInteger)NSNotFound, + @"First frame should contain testStackTraceBasic," + " stack trace: %@", stacktrace); + range = [firstFrame rangeOfString:@"#0"]; + STAssertNotEquals(range.location, (NSUInteger)NSNotFound, + @"First frame should contain #0, stack trace: %@", + stacktrace); + + range = [firstFrame rangeOfString:@"-"]; + STAssertNotEquals(range.location, (NSUInteger)NSNotFound, + @"First frame should contain - since it's " + @"an instance method: %@", stacktrace); + STAssertTrue([[self class] classMethodTest], @"First frame should contain" + @"+ since it's a class method"); +} + +-(void)testGetStackAddressDescriptors { + struct GTMAddressDescriptor descs[100]; + size_t depth = sizeof(descs) / sizeof(struct GTMAddressDescriptor); + depth = GTMGetStackAddressDescriptors(descs, depth); + // Got atleast 4... + STAssertGreaterThan(depth, (size_t)4, nil); + // All that we got have symbols + for (NSUInteger lp = 0 ; lp < depth ; ++lp) { + STAssertNotNULL(descs[lp].symbol, @"didn't get a symble at depth %lu", lp); + } + + // Do it again, but don't give it enough space (to make sure it handles that) + size_t fullDepth = depth; + STAssertGreaterThan(fullDepth, (size_t)4, nil); + depth -= 2; + depth = GTMGetStackAddressDescriptors(descs, depth); + STAssertLessThan(depth, fullDepth, nil); + // All that we got have symbols + for (NSUInteger lp = 0 ; lp < depth ; ++lp) { + STAssertNotNULL(descs[lp].symbol, @"didn't get a symble at depth %lu", lp); + } + +} + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +- (void)helperThatThrows { + [NSException raise:@"TestException" format:@"TestExceptionDescription"]; +} + +- (void)testStackExceptionTrace { + NSException *exception = nil; + @try { + [self helperThatThrows]; + } + @catch (NSException * e) { + exception = e; + } + STAssertNotNil(exception, nil); + NSString *stacktrace = GTMStackTraceFromException(exception); + NSArray *stacklines = [stacktrace componentsSeparatedByString:@"\n"]; + + STAssertGreaterThan([stacklines count], (NSUInteger)4, + @"stack trace must have > 4 lines"); + STAssertLessThan([stacklines count], (NSUInteger)25, + @"stack trace must have < 25 lines"); + STAssertEquals([stacklines count], + [[exception callStackReturnAddresses] count], + @"stack trace should have the same number of lines as the " + @" array of return addresses. stack trace: %@", stacktrace); + + // we can't look for it on a specific frame because NSException doesn't + // really document how deep the stack will be + NSRange range = [stacktrace rangeOfString:@"testStackExceptionTrace"]; + STAssertNotEquals(range.location, (NSUInteger)NSNotFound, + @"Stack trace should contain testStackExceptionTrace," + " stack trace: %@", stacktrace); +} + +#endif + +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +- (void)testProgramCountersBasic { + void *pcs[10]; + NSUInteger depth = 10; + depth = GTMGetStackProgramCounters(pcs, depth); + + STAssertGreaterThan(depth, (NSUInteger)3, @"stack trace must have > 3 lines"); + STAssertLessThanOrEqual(depth, (NSUInteger)10, + @"stack trace must have < 10 lines"); + + // pcs is an array of program counters from the stack. pcs[0] should match + // the call into GTMGetStackProgramCounters, which is tough for us to check. + // However, we can verify that pcs[1] is equal to our current return address + // for our current function. + void *current_pc = __builtin_return_address(0); + STAssertEquals(pcs[1], current_pc, @"pcs[1] should equal the current PC"); +} + +- (void)testProgramCountersMore { + void *pcs0[0]; + NSUInteger depth0 = 0; + depth0 = GTMGetStackProgramCounters(pcs0, depth0); + STAssertEquals(depth0, (NSUInteger)0, @"stack trace must have 0 lines"); + + void *pcs1[1]; + NSUInteger depth1 = 1; + depth1 = GTMGetStackProgramCounters(pcs1, depth1); + STAssertEquals(depth1, (NSUInteger)1, @"stack trace must have 1 lines"); + + void *pcs2[2]; + NSUInteger depth2 = 2; + depth2 = GTMGetStackProgramCounters(pcs2, depth2); + STAssertEquals(depth2, (NSUInteger)2, @"stack trace must have 2 lines"); + void *current_pc = __builtin_return_address(0); + STAssertEquals(pcs2[1], current_pc, @"pcs[1] should equal the current PC"); +} + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersion.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersion.h new file mode 100644 index 00000000..07580a77 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersion.h @@ -0,0 +1,86 @@ +// +// GTMSystemVersion.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" + +// A class for getting information about what system we are running on +@interface GTMSystemVersion : NSObject + +// Returns the current system version major.minor.bugFix ++ (void)getMajor:(SInt32*)major minor:(SInt32*)minor bugFix:(SInt32*)bugFix; + +// Returns the build number of the OS. Useful when looking for bug fixes +// in new OSes which all have a set system version. +// eg 10.5.5's build number is 9F33. Easy way to check the build number +// is to choose "About this Mac" from the Apple menu and click on the version +// number. ++ (NSString*)build; + ++ (BOOL)isBuildLessThan:(NSString*)build; ++ (BOOL)isBuildLessThanOrEqualTo:(NSString*)build; ++ (BOOL)isBuildGreaterThan:(NSString*)build; ++ (BOOL)isBuildGreaterThanOrEqualTo:(NSString*)build; ++ (BOOL)isBuildEqualTo:(NSString *)build; + +#if GTM_MACOS_SDK +// Returns YES if running on 10.3, NO otherwise. ++ (BOOL)isPanther; + +// Returns YES if running on 10.4, NO otherwise. ++ (BOOL)isTiger; + +// Returns YES if running on 10.5, NO otherwise. ++ (BOOL)isLeopard; + +// Returns YES if running on 10.6, NO otherwise. ++ (BOOL)isSnowLeopard; + +// Returns a YES/NO if the system is 10.3 or better ++ (BOOL)isPantherOrGreater; + +// Returns a YES/NO if the system is 10.4 or better ++ (BOOL)isTigerOrGreater; + +// Returns a YES/NO if the system is 10.5 or better ++ (BOOL)isLeopardOrGreater; + +// Returns a YES/NO if the system is 10.6 or better ++ (BOOL)isSnowLeopardOrGreater; +#endif // GTM_MACOS_SDK + +// Returns one of the achitecture strings below. Note that this is the +// architecture that we are currently running as, not the hardware architecture. ++ (NSString *)runtimeArchitecture; +@end + +// Architecture Strings +// TODO: Should probably break iPhone up into iPhone_ARM and iPhone_Simulator +// but haven't found a need yet. +GTM_EXTERN NSString *const kGTMArch_iPhone; +GTM_EXTERN NSString *const kGTMArch_ppc; +GTM_EXTERN NSString *const kGTMArch_ppc64; +GTM_EXTERN NSString *const kGTMArch_x86_64; +GTM_EXTERN NSString *const kGTMArch_i386; + +// System Build Number constants +GTM_EXTERN NSString *const kGTMSystemBuild10_5_5; +GTM_EXTERN NSString *const kGTMSystemBuild10_6_0_WWDC; +GTM_EXTERN NSString *const kGTMSystemBuild10_6_0_10A190; + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersion.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersion.m new file mode 100644 index 00000000..eb255a67 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersion.m @@ -0,0 +1,232 @@ +// +// GTMSystemVersion.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSystemVersion.h" +#import "GTMGarbageCollection.h" +#if GTM_MACOS_SDK +#import +#endif + +static SInt32 sGTMSystemVersionMajor = 0; +static SInt32 sGTMSystemVersionMinor = 0; +static SInt32 sGTMSystemVersionBugFix = 0; +static NSString *sBuild = nil; + +NSString *const kGTMArch_iPhone = @"iPhone"; +NSString *const kGTMArch_ppc = @"ppc"; +NSString *const kGTMArch_ppc64 = @"ppc64"; +NSString *const kGTMArch_x86_64 = @"x86_64"; +NSString *const kGTMArch_i386 = @"i386"; + +static NSString *const kSystemVersionPlistPath = @"/System/Library/CoreServices/SystemVersion.plist"; + +NSString *const kGTMSystemBuild10_5_5 = @"9F33"; +NSString *const kGTMSystemBuild10_6_0_WWDC = @"10A96"; +NSString *const kGTMSystemBuild10_6_0_10A190 = @"10A190"; + +@implementation GTMSystemVersion ++ (void)initialize { + if (self == [GTMSystemVersion class]) { + // Gestalt is the recommended way of getting the OS version (despite a + // comment to the contrary in the 10.4 headers and docs; see + // ). + // The iPhone doesn't have Gestalt though, so use the plist there. +#if GTM_MACOS_SDK + require_noerr(Gestalt(gestaltSystemVersionMajor, &sGTMSystemVersionMajor), failedGestalt); + require_noerr(Gestalt(gestaltSystemVersionMinor, &sGTMSystemVersionMinor), failedGestalt); + require_noerr(Gestalt(gestaltSystemVersionBugFix, &sGTMSystemVersionBugFix), failedGestalt); + + return; + + failedGestalt: + ; +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_3 + // gestaltSystemVersionMajor et al are only on 10.4 and above, so they + // could fail when running on 10.3. + SInt32 binaryCodedDec; + OSStatus err = err = Gestalt(gestaltSystemVersion, &binaryCodedDec); + _GTMDevAssert(!err, @"Unable to get version from Gestalt"); + + // Note that this code will return x.9.9 for any system rev parts that are + // greater than 9 (i.e., 10.10.10 will be 10.9.9). This shouldn't ever be a + // problem as the code above takes care of 10.4+. + SInt32 msb = (binaryCodedDec & 0x0000F000L) >> 12; + msb *= 10; + SInt32 lsb = (binaryCodedDec & 0x00000F00L) >> 8; + sGTMSystemVersionMajor = msb + lsb; + sGTMSystemVersionMinor = (binaryCodedDec & 0x000000F0L) >> 4; + sGTMSystemVersionBugFix = (binaryCodedDec & 0x0000000FL); +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_3 + +#else // GTM_MACOS_SDK + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSDictionary *systemVersionPlist + = [NSDictionary dictionaryWithContentsOfFile:kSystemVersionPlistPath]; + NSString *version = [systemVersionPlist objectForKey:@"ProductVersion"]; + _GTMDevAssert(version, @"Unable to get version"); + NSArray *versionInfo = [version componentsSeparatedByString:@"."]; + NSUInteger length = [versionInfo count]; + _GTMDevAssert(length > 1 && length < 4, + @"Unparseable version %@", version); + sGTMSystemVersionMajor = [[versionInfo objectAtIndex:0] intValue]; + _GTMDevAssert(sGTMSystemVersionMajor != 0, + @"Unknown version for %@", version); + sGTMSystemVersionMinor = [[versionInfo objectAtIndex:1] intValue]; + if (length == 3) { + sGTMSystemVersionBugFix = [[versionInfo objectAtIndex:2] intValue]; + } + [pool release]; +#endif // GTM_MACOS_SDK + } +} + ++ (void)getMajor:(SInt32*)major minor:(SInt32*)minor bugFix:(SInt32*)bugFix { + if (major) { + *major = sGTMSystemVersionMajor; + } + if (minor) { + *minor = sGTMSystemVersionMinor; + } + if (bugFix) { + *bugFix = sGTMSystemVersionBugFix; + } +} + ++ (NSString*)build { + @synchronized(self) { + // Not cached at initialization time because we don't expect "real" + // software to want this, and it costs a bit to get at startup. + // This will mainly be for unit test cases. + if (!sBuild) { + NSDictionary *systemVersionPlist + = [NSDictionary dictionaryWithContentsOfFile:kSystemVersionPlistPath]; + sBuild = [[systemVersionPlist objectForKey:@"ProductBuildVersion"] retain]; + GTMNSMakeUncollectable(sBuild); + _GTMDevAssert(sBuild, @"Unable to get build version"); + } + } + return sBuild; +} + ++ (BOOL)isBuildLessThan:(NSString*)build { + NSComparisonResult result + = [[self build] compare:build + options:NSNumericSearch | NSCaseInsensitiveSearch]; + return result == NSOrderedAscending; +} + ++ (BOOL)isBuildLessThanOrEqualTo:(NSString*)build { + NSComparisonResult result + = [[self build] compare:build + options:NSNumericSearch | NSCaseInsensitiveSearch]; + return result != NSOrderedDescending; +} + ++ (BOOL)isBuildGreaterThan:(NSString*)build { + NSComparisonResult result + = [[self build] compare:build + options:NSNumericSearch | NSCaseInsensitiveSearch]; + return result == NSOrderedDescending; +} + ++ (BOOL)isBuildGreaterThanOrEqualTo:(NSString*)build { + NSComparisonResult result + = [[self build] compare:build + options:NSNumericSearch | NSCaseInsensitiveSearch]; + return result != NSOrderedAscending; +} + ++ (BOOL)isBuildEqualTo:(NSString *)build { + NSComparisonResult result + = [[self build] compare:build + options:NSNumericSearch | NSCaseInsensitiveSearch]; + return result == NSOrderedSame; +} + +#if GTM_MACOS_SDK ++ (BOOL)isPanther { + return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 3; +} + ++ (BOOL)isTiger { + return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 4; +} + ++ (BOOL)isLeopard { + return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 5; +} + ++ (BOOL)isSnowLeopard { + return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 6; +} + ++ (BOOL)isPantherOrGreater { + return (sGTMSystemVersionMajor > 10) || + (sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 3); +} + ++ (BOOL)isTigerOrGreater { + return (sGTMSystemVersionMajor > 10) || + (sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 4); +} + ++ (BOOL)isLeopardOrGreater { + return (sGTMSystemVersionMajor > 10) || + (sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 5); +} + ++ (BOOL)isSnowLeopardOrGreater { + return (sGTMSystemVersionMajor > 10) || + (sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 6); +} + +#endif // GTM_MACOS_SDK + ++ (NSString *)runtimeArchitecture { + NSString *architecture = nil; +#if GTM_IPHONE_SDK + architecture = kGTMArch_iPhone; +#else // !GTM_IPHONE_SDK + // In reading arch(3) you'd thing this would work: + // + // const NXArchInfo *localInfo = NXGetLocalArchInfo(); + // _GTMDevAssert(localInfo && localInfo->name, @"Couldn't get NXArchInfo"); + // const NXArchInfo *genericInfo = NXGetArchInfoFromCpuType(localInfo->cputype, 0); + // _GTMDevAssert(genericInfo && genericInfo->name, @"Couldn't get generic NXArchInfo"); + // extensions[0] = [NSString stringWithFormat:@".%s", genericInfo->name]; + // + // but on 64bit it returns the same things as on 32bit, so... +#if __POWERPC__ +#if __LP64__ + architecture = kGTMArch_ppc64; +#else // !__LP64__ + architecture = kGTMArch_ppc; +#endif // __LP64__ +#else // !__POWERPC__ +#if __LP64__ + architecture = kGTMArch_x86_64; +#else // !__LP64__ + architecture = kGTMArch_i386; +#endif // __LP64__ +#endif // !__POWERPC__ + +#endif // GTM_IPHONE_SDK + return architecture; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersionTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersionTest.m new file mode 100644 index 00000000..24e6aa51 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMSystemVersionTest.m @@ -0,0 +1,93 @@ +// +// GTMSystemVersionTest.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMSystemVersion.h" + +@interface GTMSystemVersionTest : GTMTestCase +@end + +@implementation GTMSystemVersionTest +- (void)testBasics { + SInt32 major; + SInt32 minor; + SInt32 bugFix; + + [GTMSystemVersion getMajor:NULL minor:NULL bugFix:NULL]; + [GTMSystemVersion getMajor:&major minor:NULL bugFix:NULL]; + [GTMSystemVersion getMajor:NULL minor:&minor bugFix:NULL]; + [GTMSystemVersion getMajor:NULL minor:NULL bugFix:&bugFix]; + [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; +#if GTM_IPHONE_SDK + STAssertTrue(major >= 2 && minor >= 0 && bugFix >= 0, nil); +#else + STAssertTrue(major >= 10 && minor >= 3 && bugFix >= 0, nil); + BOOL isPanther = (major == 10) && (minor == 3); + BOOL isTiger = (major == 10) && (minor == 4); + BOOL isLeopard = (major == 10) && (minor == 5); + BOOL isSnowLeopard = (major == 10) && (minor == 6); + + BOOL isLater = (major > 10) || ((major == 10) && (minor > 6)); + STAssertEquals([GTMSystemVersion isPanther], isPanther, nil); + STAssertEquals([GTMSystemVersion isPantherOrGreater], + (BOOL)(isPanther || isTiger + || isLeopard || isSnowLeopard || isLater), nil); + STAssertEquals([GTMSystemVersion isTiger], isTiger, nil); + STAssertEquals([GTMSystemVersion isTigerOrGreater], + (BOOL)(isTiger || isLeopard || isSnowLeopard || isLater), nil); + STAssertEquals([GTMSystemVersion isLeopard], isLeopard, nil); + STAssertEquals([GTMSystemVersion isLeopardOrGreater], + (BOOL)(isLeopard || isSnowLeopard || isLater), nil); + STAssertEquals([GTMSystemVersion isSnowLeopard], isSnowLeopard, nil); + STAssertEquals([GTMSystemVersion isSnowLeopardOrGreater], + (BOOL)(isSnowLeopard || isLater), nil); +#endif +} + +- (void)testRuntimeArchitecture { + // Not sure how to test this short of recoding it and verifying. + // This at least executes the code for me. + STAssertNotNil([GTMSystemVersion runtimeArchitecture], nil); +} + +- (void)testBuild { + // Not sure how to test this short of coding up a large fragile table. + // This at least executes the code for me. + NSString *systemVersion = [GTMSystemVersion build]; + STAssertNotEquals([systemVersion length], (NSUInteger)0, nil); + + NSString *smallVersion = @"1A00"; + NSString *largeVersion = @"100Z100"; + STAssertTrue([GTMSystemVersion isBuildGreaterThan:smallVersion], nil); + STAssertFalse([GTMSystemVersion isBuildGreaterThan:systemVersion], nil); + STAssertFalse([GTMSystemVersion isBuildGreaterThan:largeVersion], nil); + STAssertTrue([GTMSystemVersion isBuildGreaterThanOrEqualTo:smallVersion], nil); + STAssertTrue([GTMSystemVersion isBuildGreaterThanOrEqualTo:systemVersion], nil); + STAssertFalse([GTMSystemVersion isBuildGreaterThanOrEqualTo:largeVersion], nil); + STAssertFalse([GTMSystemVersion isBuildEqualTo:smallVersion], nil); + STAssertTrue([GTMSystemVersion isBuildEqualTo:systemVersion], nil); + STAssertFalse([GTMSystemVersion isBuildEqualTo:largeVersion], nil); + STAssertFalse([GTMSystemVersion isBuildLessThanOrEqualTo:smallVersion], nil); + STAssertTrue([GTMSystemVersion isBuildLessThanOrEqualTo:systemVersion], nil); + STAssertTrue([GTMSystemVersion isBuildLessThanOrEqualTo:largeVersion], nil); + STAssertFalse([GTMSystemVersion isBuildLessThan:smallVersion], nil); + STAssertFalse([GTMSystemVersion isBuildLessThan:systemVersion], nil); + STAssertTrue([GTMSystemVersion isBuildLessThan:largeVersion], nil); + +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxy.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxy.h new file mode 100644 index 00000000..5dc0a56e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxy.h @@ -0,0 +1,50 @@ +// +// GTMTransientRootPortProxy.h +// +// Copyright 2006-2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMTransientRootProxy.h" + +@interface GTMTransientRootPortProxy : GTMTransientRootProxy { + @private + NSPort *receivePort_; + NSPort *sendPort_; +} + +// Returns an autoreleased instance. See below for details on args. ++ (id)rootProxyWithReceivePort:(NSPort *)receivePort + sendPort:(NSPort *)sendPort + protocol:(Protocol *)protocol + requestTimeout:(NSTimeInterval)requestTimeout + replyTimeout:(NSTimeInterval)replyTimeout; + +// This function will return a GTMTransientRootProxy that is using NSPorts +// for the connection. The |receivePort| and |sendPort| conventions +// follow the same conventions as -[NSConnection initWithReceivePort:sendPort:]. +// Note that due to Radar 6676818 "NSConnection leaks when initialized with nil +// sendPort" that you will leak a connection if you pass in "nil" for your +// sendPort if you are using NSPorts (mach or socket) to communicate between +// threads. The leak occurs on 10.5.6, and SL 10A286. This simple answer +// is just to always use two ports to communicate. Check out the test to see +// how we do cross thread communication. +- (id)initWithReceivePort:(NSPort *)receivePort + sendPort:(NSPort *)sendPort + protocol:(Protocol *)protocol + requestTimeout:(NSTimeInterval)requestTimeout + replyTimeout:(NSTimeInterval)replyTimeout; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxy.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxy.m new file mode 100644 index 00000000..ee9093a1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxy.m @@ -0,0 +1,80 @@ +// +// GTMTransientRootPortProxy.m +// +// Copyright 2006-2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMTransientRootPortProxy.h" +#import "GTMObjC2Runtime.h" + +@interface GTMTransientRootPortProxy (ProtectedMethods) +// Returns an NSConnection for NSPorts. This method overrides the one in +// the GTMTransientRootProxy which allows us to create a connection with a +// NSPort. +// +- (NSConnection *)makeConnection; +@end + + +@implementation GTMTransientRootPortProxy + ++ (id)rootProxyWithReceivePort:(NSPort *)receivePort + sendPort:(NSPort *)sendPort + protocol:(Protocol *)protocol + requestTimeout:(NSTimeInterval)requestTimeout + replyTimeout:(NSTimeInterval)replyTimeout { + return [[[self alloc] initWithReceivePort:receivePort + sendPort:sendPort + protocol:protocol + requestTimeout:requestTimeout + replyTimeout:replyTimeout] autorelease]; +} + +- (id)initWithReceivePort:(NSPort *)receivePort + sendPort:(NSPort *)sendPort + protocol:(Protocol *)protocol + requestTimeout:(NSTimeInterval)requestTimeout + replyTimeout:(NSTimeInterval)replyTimeout { + if ((!sendPort && !receivePort) || !protocol) { + [self release]; + return nil; + } + + requestTimeout_ = requestTimeout; + replyTimeout_ = replyTimeout; + + receivePort_ = [receivePort retain]; + sendPort_ = [sendPort retain]; + + protocol_ = protocol; // Protocols can't be retained + return self; +} + +- (void)dealloc { + [receivePort_ release]; + [sendPort_ release]; + [super dealloc]; +} + +@end + +@implementation GTMTransientRootPortProxy (ProtectedMethods) + +- (NSConnection *)makeConnection { + return [NSConnection connectionWithReceivePort:receivePort_ + sendPort:sendPort_]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxyTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxyTest.m new file mode 100644 index 00000000..a85498f8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootPortProxyTest.m @@ -0,0 +1,182 @@ +// +// GTMTransientRootPortProxyTest.m +// +// Copyright 2006-2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMTransientRootPortProxy.h" + +#define kDefaultTimeout 5.0 + +enum { + kGTMTransientThreadConditionStarting = 777, + kGTMTransientThreadConditionStarted, + kGTMTransientThreadConditionQuitting, + kGTMTransientThreadConditionQuitted +}; + +// === Start off declaring some auxillary data structures === + +// The @protocol that we'll use for testing with. +@protocol DOPortTestProtocol +- (oneway void)doOneWayVoid; +- (bycopy NSString *)doReturnStringBycopy; +@end + +// The "server" we'll use to test the DO connection. This server will implement +// our test protocol, and it will run in a separate thread from the main +// unit testing thread, so the DO requests can be serviced. +@interface DOPortTestServer : NSObject { + @private + NSPort *clientSendPort_; + NSPort *clientReceivePort_; +} +- (void)runThread:(NSConditionLock *)lock; +- (NSPort *)clientSendPort; +- (NSPort *)clientReceivePort; +@end + +@implementation DOPortTestServer + +- (void)runThread:(NSConditionLock *)lock { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSDate *future = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout]; + if(![lock lockWhenCondition:kGTMTransientThreadConditionStarting + beforeDate:future]) { + _GTMDevLog(@"Unable to acquire lock in runThread! This is BAD!"); + [pool drain]; + [NSThread exit]; + } + + clientSendPort_ = [NSPort port]; + clientReceivePort_ = [NSPort port]; + + NSConnection *conn + = [[NSConnection alloc] initWithReceivePort:clientSendPort_ + sendPort:clientReceivePort_]; + [conn setRootObject:self]; + [lock unlockWithCondition:kGTMTransientThreadConditionStarted]; + while (![lock tryLockWhenCondition:kGTMTransientThreadConditionQuitting]) { + NSDate *runUntil = [NSDate dateWithTimeIntervalSinceNow:0.1]; + [[NSRunLoop currentRunLoop] runUntilDate:runUntil]; + } + [conn setRootObject:nil]; + [clientSendPort_ invalidate]; + [clientReceivePort_ invalidate]; + [conn release]; + [pool drain]; + [lock unlockWithCondition:kGTMTransientThreadConditionQuitted]; +} + +- (NSPort *)clientSendPort { + return clientSendPort_; +} + +- (NSPort *)clientReceivePort { + return clientReceivePort_; +} + +- (oneway void)doOneWayVoid { + // Do nothing +} +- (bycopy NSString *)doReturnStringBycopy { + return @"TestString"; +} + +@end + +// === Done with auxillary data structures, now for the main test class === + +@interface GTMTransientRootPortProxyTest : GTMTestCase { + DOPortTestServer *server_; + NSConditionLock *syncLock_; +} + +@end + +@implementation GTMTransientRootPortProxyTest + +- (void)testTransientRootPortProxy { + syncLock_ = [[[NSConditionLock alloc] + initWithCondition:kGTMTransientThreadConditionStarting] + autorelease]; + + // Setup our server. + server_ = [[[DOPortTestServer alloc] init] autorelease]; + [NSThread detachNewThreadSelector:@selector(runThread:) + toTarget:server_ + withObject:syncLock_]; + NSDate *future = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout]; + STAssertTrue([syncLock_ lockWhenCondition:kGTMTransientThreadConditionStarted + beforeDate:future], + @"Unable to start thread"); + [syncLock_ unlockWithCondition:kGTMTransientThreadConditionStarted]; + + NSPort *receivePort = [server_ clientReceivePort]; + NSPort *sendPort = [server_ clientSendPort]; + + GTMTransientRootPortProxy *failProxy = + [GTMTransientRootPortProxy rootProxyWithReceivePort:nil + sendPort:nil + protocol:@protocol(DOPortTestProtocol) + requestTimeout:kDefaultTimeout + replyTimeout:kDefaultTimeout]; + STAssertNil(failProxy, @"should have failed w/o a port"); + failProxy = + [GTMTransientRootPortProxy rootProxyWithReceivePort:receivePort + sendPort:sendPort + protocol:nil + requestTimeout:kDefaultTimeout + replyTimeout:kDefaultTimeout]; + STAssertNil(failProxy, @"should have failed w/o a protocol"); + + GTMTransientRootPortProxy *proxy = + [GTMTransientRootPortProxy rootProxyWithReceivePort:receivePort + sendPort:sendPort + protocol:@protocol(DOPortTestProtocol) + requestTimeout:kDefaultTimeout + replyTimeout:kDefaultTimeout]; + + STAssertEqualObjects([proxy doReturnStringBycopy], + @"TestString", @"proxy should have returned " + @"'TestString'"); + + // Redo the *exact* same test to make sure we can have multiple instances + // in the same app. + proxy = + [GTMTransientRootPortProxy rootProxyWithReceivePort:receivePort + sendPort:sendPort + protocol:@protocol(DOPortTestProtocol) + requestTimeout:kDefaultTimeout + replyTimeout:kDefaultTimeout]; + + STAssertEqualObjects([proxy doReturnStringBycopy], + @"TestString", @"proxy should have returned " + @"'TestString'"); + [syncLock_ tryLockWhenCondition:kGTMTransientThreadConditionStarted]; + [syncLock_ unlockWithCondition:kGTMTransientThreadConditionQuitting]; + + // Wait for the server to shutdown so we clean up nicely. + // The max amount of time we will wait until we abort this test. + NSDate *timeout = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout]; + // The server did not shutdown and we want to capture this as an error + STAssertTrue([syncLock_ lockWhenCondition:kGTMTransientThreadConditionQuitted + beforeDate:timeout], + @"The server did not shutdown gracefully before the timeout."); + [syncLock_ unlockWithCondition:kGTMTransientThreadConditionQuitted]; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxy.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxy.h new file mode 100644 index 00000000..b5aa78af --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxy.h @@ -0,0 +1,113 @@ +// +// GTMTransientRootProxy.h +// +// Copyright 2006-2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +// Handle (re-)connecting to a transient root proxy object via DO. +// +// This class is designed to handle connecting and reconnecting to a Distributed +// Objects root proxy (NSDistantObject* instance). It is a replacement for using +// the NSDistantObject returned from NSConnection, directly. When the DO +// connection is up, messages sent to this class are forwarded to the real +// object (the NSDistantObject); when the DO connection is down, messages sent +// to this class are silently swallowed. You can use the -isConnected method on +// this class to see if the DO connection is up or down. +// +// This class may be useful when you need a DO connection, but the +// server you're connected to may be going up and down. For example, the +// web browser plugins in Google Desktop may need to connect to the Google +// Desktop local webserver, but we'd want the browser plugins to be able to +// gracefully handle the local Google Desktop webserver starting and stopping. +// +// === Example Usage === +// +// Old code: +// +// NSDistantObject *o = +// [NSConnection rootProxyForConnectionWithRegisteredName:@"server" +// host:nil]; +// [o setProtocolForProxy:@protocol(MyProto)]; +// [o someMethodInMyProto]; +// // ... write a bunch of code to handle error conditions +// +// New code: +// +// GTMTransientRootProxy *o = +// [GTMTransientRootProxy rootProxyWithRegisteredName:@"server" +// host:nil +// protocol:@protocol(MyProto) +// requestTimeout:5.0 +// replyTimeout:5.0]; +// [o someMethodInMyProto]; +// +// The 'Old code' requires you to handle all the error conditions that may +// arise when using DO (such as the server crashing, or network going down), +// handle properly tearing down the broken connection, and trying to reconnect +// when the server finally comes back online. The 'New code' handles all of +// those details for you. +// +// Also, when creating a GMTransientRootProxy object, you must tell it the +// @protocol that will be used for communication - this is not optional. And +// in order to quiet compiler warnings, you'll also want to staticly type +// the pointer with the protocol as well. +// +@interface GTMTransientRootProxy : NSProxy { + @protected + __weak Protocol *protocol_; + NSDistantObject *realProxy_; + + NSString *registeredName_; + NSString *host_; + + NSTimeInterval requestTimeout_; + NSTimeInterval replyTimeout_; +} + +// Returns an autoreleased instance ++ (id)rootProxyWithRegisteredName:(NSString *)name + host:(NSString *)host + protocol:(Protocol *)protocol + requestTimeout:(NSTimeInterval)requestTimeout + replyTimeout:(NSTimeInterval)replyTimeout; + +// This function will return a GTMTransientRootProxy that is using Mach ports +// for the connection. The |name| and |host| arguments will be used to lookup +// the correct information to create the Mach port connection. +// +- (id)initWithRegisteredName:(NSString *)name + host:(NSString *)host + protocol:(Protocol *)protocol + requestTimeout:(NSTimeInterval)requestTimeout + replyTimeout:(NSTimeInterval)replyTimeout; + +// Returns YES if the DO connection is up and working, NO otherwise. +// +- (BOOL)isConnected; + +@end + +// Subclass of GTMTransientRootProxy that catches and ignores ALL exceptions. +// This class overrides GTMTransientRootProxy's -forwardInvocation: +// method, and wraps it in a try/catch block, and ignores all exceptions. +// +@interface GTMRootProxyCatchAll : GTMTransientRootProxy + +// Overridden, and ignores all thrown exceptions. +- (void)forwardInvocation:(NSInvocation *)invocation; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxy.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxy.m new file mode 100644 index 00000000..04591d38 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxy.m @@ -0,0 +1,229 @@ +// +// GTMTransientRootProxy.m +// +// Copyright 2006-2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMTransientRootProxy.h" +#import "GTMObjC2Runtime.h" + +// Private methods on NSMethodSignature that we need to call. This method has +// been available since 10.0, but Apple didn't add it to the headers until 10.5 +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +@interface NSMethodSignature (UndeclaredMethods) ++ (NSMethodSignature *)signatureWithObjCTypes:(const char *)types; +@end +#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + +@interface GTMTransientRootProxy (PrivateMethods) +// Returns an NSConnection for NSMacPorts. This method is broken out to allow +// subclasses to override it to generate different types of NSConnections. +- (NSConnection *)makeConnection; + +// Returns the "real" proxy (stored in the realProxy_ ivar) associated with this +// instance. If realProxy_ is nil, then an attempt is made to make a connection +// to create the realProxy_. +// +- (NSDistantObject *)realProxy; + +// "Releases" the realProxy_ ivar, and removes |self| as an observer from +// the NSNotificationCenter. +// +- (void)releaseRealProxy; +@end + +@implementation GTMTransientRootProxy + ++ (id)rootProxyWithRegisteredName:(NSString *)name + host:(NSString *)host + protocol:(Protocol *)protocol + requestTimeout:(NSTimeInterval)requestTimeout + replyTimeout:(NSTimeInterval)replyTimeout { + return [[[self alloc] initWithRegisteredName:name + host:host + protocol:protocol + requestTimeout:requestTimeout + replyTimeout:replyTimeout] autorelease]; +} + +- (id)initWithRegisteredName:(NSString *)name + host:(NSString *)host + protocol:(Protocol *)protocol + requestTimeout:(NSTimeInterval)requestTimeout + replyTimeout:(NSTimeInterval)replyTimeout { + if (!name || !protocol) { + [self release]; + return nil; + } + + requestTimeout_ = requestTimeout; + replyTimeout_ = replyTimeout; + + registeredName_ = [name copy]; + host_ = [host copy]; + + protocol_ = protocol; // Protocols can't be retained + + return self; +} + +- (id)init { + return [self initWithRegisteredName:nil + host:nil + protocol:nil + requestTimeout:0.0 + replyTimeout:0.0]; +} + +- (void)dealloc { + [self releaseRealProxy]; + [registeredName_ release]; + [host_ release]; + [super dealloc]; +} + +- (BOOL)isConnected { + BOOL result = NO; + @synchronized (self) { + result = [[[self realProxy] connectionForProxy] isValid]; + } + return result; +} + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector { + struct objc_method_description mdesc; + mdesc = protocol_getMethodDescription(protocol_, selector, YES, YES); + NSMethodSignature *returnValue = nil; + if (mdesc.types == NULL) { + // COV_NF_START + _GTMDevLog(@"Unable to get the protocol method description. Returning " + @"nil."); + // COV_NF_END + } else { + returnValue = [NSMethodSignature signatureWithObjCTypes:mdesc.types]; + } + return returnValue; +} + +- (void)forwardInvocation:(NSInvocation *)invocation { + @try { + NSDistantObject *target = [self realProxy]; + [invocation invokeWithTarget:target]; + + // We need to catch NSException* here rather than "id" because we need to + // treat |ex| as an NSException when using the -name method. Also, we're + // only looking to catch a few types of exception here, all of which are + // NSException types; the rest we just rethrow. + } @catch (NSException *ex) { + NSString *exName = [ex name]; + // If we catch an exception who's name matches any of the following types, + // it's because the DO connection probably went down. So, we'll just + // release our realProxy_, and attempt to reconnect on the next call. + if ([exName isEqualToString:NSPortTimeoutException] + || [exName isEqualToString:NSInvalidSendPortException] + || [exName isEqualToString:NSInvalidReceivePortException] + || [exName isEqualToString:NSFailedAuthenticationException] + || [exName isEqualToString:NSPortSendException] + || [exName isEqualToString:NSPortReceiveException]) { + [self releaseRealProxy]; // COV_NF_LINE + } else { + // If the exception was any other type (commonly + // NSInvalidArgumentException) then we'll just re-throw it to the caller. + @throw; + } + } // COV_NF_LINE +} + +@end + +@implementation GTMTransientRootProxy (PrivateMethods) + +- (NSConnection *)makeConnection { + return [NSConnection connectionWithRegisteredName:registeredName_ host:host_]; +} + +- (NSDistantObject *)realProxy { + NSDistantObject *returnProxy = nil; + + @synchronized (self) { + // No change so no notification + if (realProxy_) return realProxy_; + + NSConnection *conn = [self makeConnection]; + [conn setRequestTimeout:requestTimeout_]; + [conn setReplyTimeout:replyTimeout_]; + @try { + // Try to get the root proxy for this connection's vended object. + realProxy_ = [conn rootProxy]; + } @catch (id ex) { + // We may fail here if we can't get the root proxy in the amount of time + // specified by the timeout above. This may happen, for example, if the + // server process is stopped (via SIGSTOP). We'll just ignore this, and + // try again at the next message. + [conn invalidate]; + return nil; + } + if (!realProxy_) { + [conn invalidate]; + // Again, no change in connection status + return nil; + } + [realProxy_ retain]; + [realProxy_ setProtocolForProxy:protocol_]; + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self + selector:@selector(connectionDidDie:) + name:NSConnectionDidDieNotification + object:conn]; + // Retain/autorelease so it lives at least the duration of this synchronize + returnProxy = [[realProxy_ retain] autorelease]; + } // @synchronized (self) + + return returnProxy; +} + +- (void)connectionDidDie:(NSNotification *)notification { + [self releaseRealProxy]; +} + +- (void)releaseRealProxy { + BOOL connectionChanged = NO; + @synchronized (self) { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + // Only trigger if we had a proxy before + if (realProxy_) { + connectionChanged = YES; + } + [realProxy_ release]; + realProxy_ = nil; + } +} + +@end + +@implementation GTMRootProxyCatchAll + +- (void)forwardInvocation:(NSInvocation *)invocation { + @try { + [super forwardInvocation:invocation]; + } + @catch (id ex) { + // Log for developers, but basically ignore it. + _GTMDevLog(@"Proxy for invoking %@ has caught and is ignoring exception: %@", + NSStringFromSelector([invocation selector]), ex); + } +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxyTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxyTest.m new file mode 100644 index 00000000..70b69a1b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMTransientRootProxyTest.m @@ -0,0 +1,228 @@ +// +// GMTransientRootProxyTest.m +// +// Copyright 2006-2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMTransientRootProxy.h" +#import "GTMUnitTestDevLog.h" + +#define kDefaultTimeout 5.0 + +// === Start off declaring some auxillary data structures === +static NSString *const kTestServerName = @"gtm_test_server"; +static NSString *const kGTMTransientRootNameKey = @"GTMTransientRootNameKey"; +static NSString *const kGTMTransientRootLockKey = @"GTMTransientRootLockKey"; + +enum { + kGTMTransientThreadConditionStarting = 777, + kGTMTransientThreadConditionStarted, + kGTMTransientThreadConditionQuitting, + kGTMTransientThreadConditionQuitted +}; + +// The @protocol that we'll use for testing with. +@protocol DOTestProtocol +- (oneway void)doOneWayVoid; +- (bycopy NSString *)doReturnStringBycopy; +- (void)throwException; +@end + +// The "server" we'll use to test the DO connection. This server will implement +// our test protocol, and it will run in a separate thread from the main +// unit testing thread, so the DO requests can be serviced. +@interface DOTestServer : NSObject { +} +- (void)runThread:(NSDictionary *)args; +@end + +@implementation DOTestServer + +- (void)runThread:(NSDictionary *)args { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSConditionLock *lock = [args objectForKey:kGTMTransientRootLockKey]; + NSString *serverName = [args objectForKey:kGTMTransientRootNameKey]; + NSDate *future = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout]; + if(![lock lockWhenCondition:kGTMTransientThreadConditionStarting + beforeDate:future]) { + _GTMDevLog(@"Unable to acquire lock in runThread! This is BAD!"); + [pool drain]; + [NSThread exit]; + } + + NSConnection *conn = [NSConnection defaultConnection]; + [conn setRootObject:self]; + if (![conn registerName:serverName]) { + _GTMDevLog(@"Failed to register DO root object with name '%@'", + serverName); + [pool drain]; + [NSThread exit]; + } + [lock unlockWithCondition:kGTMTransientThreadConditionStarted]; + while (![lock tryLockWhenCondition:kGTMTransientThreadConditionQuitting]) { + NSDate* runUntil = [NSDate dateWithTimeIntervalSinceNow:0.1]; + [[NSRunLoop currentRunLoop] runUntilDate:runUntil]; + } + [conn setRootObject:nil]; + [conn registerName:nil]; + [pool drain]; + [lock unlockWithCondition:kGTMTransientThreadConditionQuitted]; +} + +- (oneway void)doOneWayVoid { + // Do nothing +} +- (bycopy NSString *)doReturnStringBycopy { + return @"TestString"; +} + +- (void)throwException { + [NSException raise:@"testingException" format:@"for the unittest"]; +} + +@end + +// === Done with auxillary data structures, now for the main test class === + +@interface GTMTransientRootProxyTest : GTMTestCase { + @private + DOTestServer *server_; + NSConditionLock *syncLock_; +} +@end + +@implementation GTMTransientRootProxyTest + +- (void)testTransientRootProxy { + // Setup our server and create a unqiue server name every time we run + NSTimeInterval timeStamp = [[NSDate date] timeIntervalSinceReferenceDate]; + NSString *serverName = + [NSString stringWithFormat:@"%@_%f", kTestServerName, timeStamp]; + server_ = [[[DOTestServer alloc] init] autorelease]; + syncLock_ = [[[NSConditionLock alloc] + initWithCondition:kGTMTransientThreadConditionStarting] + autorelease]; + NSDictionary *args = [NSDictionary dictionaryWithObjectsAndKeys: + syncLock_, kGTMTransientRootLockKey, + serverName, kGTMTransientRootNameKey, + nil]; + [NSThread detachNewThreadSelector:@selector(runThread:) + toTarget:server_ + withObject:args]; + NSDate *future = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout]; + STAssertTrue([syncLock_ lockWhenCondition:kGTMTransientThreadConditionStarted + beforeDate:future], + @"Unable to start thread"); + [syncLock_ unlockWithCondition:kGTMTransientThreadConditionStarted]; + + GTMTransientRootProxy *failProxy = + [GTMTransientRootProxy rootProxyWithRegisteredName:nil + host:nil + protocol:@protocol(DOTestProtocol) + requestTimeout:kDefaultTimeout + replyTimeout:kDefaultTimeout]; + STAssertNil(failProxy, @"should have failed w/o a name"); + failProxy = + [GTMTransientRootProxy rootProxyWithRegisteredName:serverName + host:nil + protocol:nil + requestTimeout:kDefaultTimeout + replyTimeout:kDefaultTimeout]; + STAssertNil(failProxy, @"should have failed w/o a protocol"); + failProxy = [[[GTMTransientRootProxy alloc] init] autorelease]; + STAssertNil(failProxy, @"should have failed just calling init"); + + GTMTransientRootProxy *proxy = + [GTMTransientRootProxy rootProxyWithRegisteredName:serverName + host:nil + protocol:@protocol(DOTestProtocol) + requestTimeout:kDefaultTimeout + replyTimeout:kDefaultTimeout]; + + STAssertEqualObjects([proxy doReturnStringBycopy], @"TestString", + @"proxy should have returned 'TestString'"); + + // Redo the *exact* same test to make sure we can have multiple instances + // in the same app. + proxy = + [GTMTransientRootProxy rootProxyWithRegisteredName:serverName + host:nil + protocol:@protocol(DOTestProtocol) + requestTimeout:kDefaultTimeout + replyTimeout:kDefaultTimeout]; + STAssertEqualObjects([proxy doReturnStringBycopy], + @"TestString", @"proxy should have returned " + @"'TestString'"); + + // Test the GTMRootProxyCatchAll within this test so we don't have to rebuild + // the server again. + + GTMRootProxyCatchAll *catchProxy = + [GTMRootProxyCatchAll rootProxyWithRegisteredName:serverName + host:nil + protocol:@protocol(DOTestProtocol) + requestTimeout:kDefaultTimeout + replyTimeout:kDefaultTimeout]; + + [GTMUnitTestDevLog expectString:@"Proxy for invoking throwException has " + @"caught and is ignoring exception: [NOTE: this exception originated in " + @"the server.]\nfor the unittest"]; + id e = nil; + @try { + // Has the server throw an exception + [catchProxy throwException]; + } @catch (id ex) { + e = ex; + } + STAssertNil(e, @"The GTMRootProxyCatchAll did not catch the exception: %@.", + e); + + proxy = + [GTMTransientRootProxy rootProxyWithRegisteredName:@"FAKE_SERVER" + host:nil + protocol:@protocol(DOTestProtocol) + requestTimeout:kDefaultTimeout + replyTimeout:kDefaultTimeout]; + STAssertNotNil(proxy, @"proxy shouldn't be nil, even when registered w/ a " + @"fake server"); + STAssertFalse([proxy isConnected], @"the proxy shouldn't be connected due to " + @"the fake server"); + + // Now set up a proxy, and then kill our server. We put a super short time + // out on it, because we are expecting it to fail. + proxy = + [GTMTransientRootProxy rootProxyWithRegisteredName:serverName + host:nil + protocol:@protocol(DOTestProtocol) + requestTimeout:0.01 + replyTimeout:0.01]; + [syncLock_ tryLockWhenCondition:kGTMTransientThreadConditionStarted]; + [syncLock_ unlockWithCondition:kGTMTransientThreadConditionQuitting]; + + // Wait for the server to shutdown so we clean up nicely. + // The max amount of time we will wait until we abort this test. + NSDate *timeout = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout]; + // The server did not shutdown and we want to capture this as an error + STAssertTrue([syncLock_ lockWhenCondition:kGTMTransientThreadConditionQuitted + beforeDate:timeout], + @"The server did not shutdown gracefully before the timeout."); + [syncLock_ unlockWithCondition:kGTMTransientThreadConditionQuitted]; + + // This should fail gracefully because the server is dead. + STAssertNil([proxy doReturnStringBycopy], @"proxy should have returned nil"); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainers.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainers.h new file mode 100644 index 00000000..e53b541b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainers.h @@ -0,0 +1,196 @@ +// +// GTMValidatingContainers.h +// +// Mutable containers that do verification of objects being added to them +// at runtime. Support for arrays, dictionaries and sets. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// GTMValidatingContainers are a set of mutable container classes that allow +// you to have a selector on a target that is called to verify that the objects +// being put into the container are valid. This can be controlled at compile +// time so that you don't take the performance hit in a release build using the +// GTM_CONTAINERS_VALIDATE macro. +// We have supplied validators for simple cases such as kindOfClass or +// conformsToProtocol. See GTMKindOfClassValidator et al. for details. +// +// Example of usage: +// id target = [GTMKindOfClassValidator validateAgainstClass:[NSString class]]; +// SEL selector = @selector(validateObject:forContainer:); +// GTMValidatingArray *array = [GTMValidatingArray validatingArrayWithTarget:target +// selector:selector]; +// [array addObject:@"foo"]; // Will be good +// [array addObject:[NSNumber numberWithInt:2]]; // Will fail +// +// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and +// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens +// when a validation fails. If you implement your own validators, you may want +// to control their internals using the same macros for consistency. +// +// Note that the validating collection types retain their targets. + +#import +#import "GTMDefines.h" + +// By default we only validate containers in debug. If you want to validate +// in release as well, #define GTM_CONTAINERS_VALIDATE in a prefix or build +// settings. +#ifndef GTM_CONTAINERS_VALIDATE +#if DEBUG +#define GTM_CONTAINERS_VALIDATE 1 +#else // DEBUG +#define GTM_CONTAINERS_VALIDATE 0 +#endif // DEBUG +#endif // GTM_CONTAINERS_VALIDATE + +// If GTM_CONTAINERS_VALIDATE is on, and log and assert are both turned off +// (see below), the object that failed validation will just not be added +// to the container. + +// If you don't want log to occur on validation failure define +// GTM_CONTAINERS_VALIDATION_FAILED_LOG to 0 in a prefix or build settings. +#ifndef GTM_CONTAINERS_VALIDATION_FAILED_LOG +#define GTM_CONTAINERS_VALIDATION_FAILED_LOG GTM_CONTAINERS_VALIDATE +#endif // GTM_CONTAINERS_VALIDATION_FAILED_LOG + +// If you don't want an assert to occur on validation failure define +// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT to 0 in a prefix or build settings. +#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT +#define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT GTM_CONTAINERS_VALIDATE +#endif // GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + +// Sometimes you get a container back from somebody else and want to validate +// that it contains what you think it contains. _GTMValidateContainer +// allows you to do exactly that. _GTMValidateContainer... give you specialty +// functions for doing common types of validations. These all inline to nothing +// if GTM_CONTAINERS_VALIDATE is not defined. +#if GTM_CONTAINERS_VALIDATE +void _GTMValidateContainer(id container, id target, SEL selector); +void _GTMValidateContainerContainsKindOfClass(id container, Class cls); +void _GTMValidateContainerContainsMemberOfClass(id container, Class cls); +void _GTMValidateContainerConformsToProtocol(id container, Protocol *prot); +void _GTMValidateContainerItemsRespondToSelector(id container, SEL sel); +#else +GTM_INLINE void _GTMValidateContainer(id container, id target, SEL selector) { +} +GTM_INLINE void _GTMValidateContainerContainsKindOfClass(id container, + Class cls) { +} +GTM_INLINE void _GTMValidateContainerContainsMemberOfClass(id container, + Class cls) { +} +GTM_INLINE void _GTMValidateContainerConformsToProtocol(id container, + Protocol *prot) { +} +GTM_INLINE void _GTMValidateContainerItemsRespondToSelector(id container, + SEL sel) { +} +#endif + + +// See comments near top of file for class description. +@interface GTMValidatingArray : NSMutableArray { +#if GTM_CONTAINERS_VALIDATE + NSMutableArray *embeddedContainer_; + id target_; + SEL selector_; +#endif // #if GTM_CONTAINERS_VALIDATE +} ++ (id)validatingArrayWithTarget:(id)target selector:(SEL)sel; ++ (id)validatingArrayWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel; +- (id)initValidatingWithTarget:(id)target selector:(SEL)sel; +- (id)initValidatingWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel; +@end + +// See comments near top of file for class description. +@interface GTMValidatingDictionary : NSMutableDictionary { +#if GTM_CONTAINERS_VALIDATE + NSMutableDictionary *embeddedContainer_; + id target_; + SEL selector_; +#endif // #if GTM_CONTAINERS_VALIDATE +} ++ (id)validatingDictionaryWithTarget:(id)target selector:(SEL)sel; ++ (id)validatingDictionaryWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel; +- (id)initValidatingWithTarget:(id)target selector:(SEL)sel; +- (id)initValidatingWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel; +@end + +// See comments near top of file for class description. +@interface GTMValidatingSet : NSMutableSet { +#if GTM_CONTAINERS_VALIDATE + NSMutableSet *embeddedContainer_; + id target_; + SEL selector_; +#endif // #if GTM_CONTAINERS_VALIDATE +} ++ (id)validatingSetWithTarget:(id)target selector:(SEL)sel; ++ (id)validatingSetWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel; +- (id)initValidatingWithTarget:(id)target selector:(SEL)sel; +- (id)initValidatingWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel; +@end + +#pragma mark - +#pragma mark Simple Common Validators +// See comments near top of file for examples of how these are used. +@protocol GTMContainerValidatorProtocol +- (BOOL)validateObject:(id)object forContainer:(id)container; +@end + +// Validates that a given object is a kind of class (instance of class or an +// instance of any class that inherits from that class) +@interface GTMKindOfClassValidator : NSObject { + Class cls_; +} ++ (id)validateAgainstClass:(Class)cls; +- (id)initWithClass:(Class)cls; +@end + +// Validates that a given object is a member of class (exact instance of class) +@interface GTMMemberOfClassValidator : NSObject { + Class cls_; +} ++ (id)validateAgainstClass:(Class)cls; +- (id)initWithClass:(Class)cls; +@end + +// Validates that a given object conforms to a protocol +@interface GTMConformsToProtocolValidator : NSObject { + Protocol* prot_; +} ++ (id)validateAgainstProtocol:(Protocol*)prot; +- (id)initWithProtocol:(Protocol*)prot; +@end + +// Validates that a given object responds to a given selector +@interface GTMRespondsToSelectorValidator : NSObject { + SEL sel_; +} ++ (id)validateAgainstSelector:(SEL)sel; +- (id)initWithSelector:(SEL)sel; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainers.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainers.m new file mode 100644 index 00000000..3b313564 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainers.m @@ -0,0 +1,490 @@ +// +// GTMValidatingContainers.m +// +// Mutable containers that do verification of objects being added to them +// at runtime. Support for arrays, dictionaries and sets. +// +// Documentation on subclassing class clusters (which we are doing) is here: +// http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_9.html#//apple_ref/doc/uid/TP40002974-CH4-DontLinkElementID_105 +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMValidatingContainers.h" + +#if GTM_CONTAINERS_VALIDATE + +#import "GTMDebugSelectorValidation.h" +#if GTM_IPHONE_SDK +#import +#import +#else // GTM_IPHONE_SDK +#import +#endif // GTM_IPHONE_SDK + +GTM_INLINE BOOL VerifyObjectWithTargetAndSelectorForContainer(id anObject, + id target, + SEL selector, + id container) { + // We must take care here, since Intel leaves junk in high bytes of return + // register for predicates that return BOOL. + // For details see: + // http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/chapter_5_section_23.html + // and + // http://www.red-sweater.com/blog/320/abusing-objective-c-with-class#comment-83187 + BOOL isGood = ((BOOL (*)(id, SEL, id, id))objc_msgSend)(target, selector, + anObject, container); + if (!isGood) { +#if GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + _GTMDevAssert(isGood, @"%@ failed container verification for %@", + anObject, [container description]); +#endif // GTM_CONTAINERS_VALIDATION_FAILED_LOG +#if GTM_CONTAINERS_VALIDATION_FAILED_LOG + _GTMDevLog(@"%@ failed container verification for %@", anObject, + [container description]); +#endif // GTM_CONTAINERS_VALIDATION_FAILED_LOG + } + return isGood; +} + +GTM_INLINE void VerifySelectorOnTarget(SEL sel, id target) { + GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(target, + sel, + @encode(BOOL), + @encode(id), + @encode(id), + nil); +} + +void _GTMValidateContainerContainsKindOfClass(id container, Class cls) { + GTMKindOfClassValidator *validator; + validator = [GTMKindOfClassValidator validateAgainstClass:cls]; + _GTMValidateContainer(container, + validator, + @selector(validateObject:forContainer:)); +} + +void _GTMValidateContainerContainsMemberOfClass(id container, Class cls) { + GTMMemberOfClassValidator *validator; + validator = [GTMMemberOfClassValidator validateAgainstClass:cls]; + _GTMValidateContainer(container, + validator, + @selector(validateObject:forContainer:)); +} + +void _GTMValidateContainerConformsToProtocol(id container, Protocol* prot) { + GTMConformsToProtocolValidator *validator; + validator = [GTMConformsToProtocolValidator validateAgainstProtocol:prot]; + _GTMValidateContainer(container, + validator, + @selector(validateObject:forContainer:)); +} + +void _GTMValidateContainerItemsRespondToSelector(id container, SEL sel) { + GTMRespondsToSelectorValidator *validator; + validator = [GTMRespondsToSelectorValidator validateAgainstSelector:sel]; + _GTMValidateContainer(container, + validator, + @selector(validateObject:forContainer:)); +} + +void _GTMValidateContainer(id container, id target, SEL selector) { + if ([container respondsToSelector:@selector(objectEnumerator)]) { + NSEnumerator *enumerator = [container objectEnumerator]; + id val; + while ((val = [enumerator nextObject])) { + VerifyObjectWithTargetAndSelectorForContainer(val, + target, + selector, + container); + } + } else { +#if GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + _GTMDevAssert(0, @"container %@ does not respond to -objectEnumerator", + [container description]); +#endif // GTM_CONTAINERS_VALIDATION_FAILED_LOG +#if GTM_CONTAINERS_VALIDATION_FAILED_LOG + _GTMDevLog(@"container does not respont to -objectEnumerator: %@", + [container description]); +#endif // GTM_CONTAINERS_VALIDATION_FAILED_LOG + } +} +#endif // GTM_CONTAINERS_VALIDATE + +@implementation GTMValidatingArray + ++ (id)validatingArrayWithTarget:(id)target selector:(SEL)sel { + return [self validatingArrayWithCapacity:0 target:target selector:sel]; +} + ++ (id)validatingArrayWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel { + return [[[[self class] alloc] initValidatingWithCapacity:0 + target:target + selector:sel] autorelease]; +} + +- (id)initValidatingWithTarget:(id)target selector:(SEL)sel { + return [self initValidatingWithCapacity:0 target:target selector:sel]; +} + +#if GTM_CONTAINERS_VALIDATE +- (id)initValidatingWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel { + if ((self = [super init])) { + embeddedContainer_ = [[NSMutableArray alloc] initWithCapacity:capacity]; + target_ = [target retain]; + selector_ = sel; + VerifySelectorOnTarget(selector_, target_); + } + return self; +} + +- (void)dealloc { + [embeddedContainer_ release]; + [target_ release]; + [super dealloc]; +} + +- (NSUInteger)count { + return [embeddedContainer_ count]; +} + +- (id)objectAtIndex:(NSUInteger)idx { + return [embeddedContainer_ objectAtIndex:idx]; +} + +- (void)addObject:(id)anObject { + if (VerifyObjectWithTargetAndSelectorForContainer(anObject, target_, + selector_, self)) { + [embeddedContainer_ addObject:anObject]; + } +} + +- (void)insertObject:(id)anObject atIndex:(NSUInteger)idx { + if (VerifyObjectWithTargetAndSelectorForContainer(anObject, target_, + selector_, self)) { + [embeddedContainer_ insertObject:anObject atIndex:idx]; + } +} + +- (void)removeLastObject { + [embeddedContainer_ removeLastObject]; +} + +- (void)removeObjectAtIndex:(NSUInteger)idx { + [embeddedContainer_ removeObjectAtIndex:idx]; +} + +- (void)replaceObjectAtIndex:(NSUInteger)idx withObject:(id)anObject { + if (VerifyObjectWithTargetAndSelectorForContainer(anObject, target_, + selector_, self)) { + [embeddedContainer_ replaceObjectAtIndex:idx withObject:anObject]; + } +} + +- (NSString*)description { + return [NSString stringWithFormat:@"%@ - %@", + NSStringFromClass([self class]), + [embeddedContainer_ description]]; +} + +#else // GTM_CONTAINERS_VALIDATE +- (id)initValidatingWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel { + if ((self = [super init])) { + [self release]; + } + return [[NSMutableArray alloc] initWithCapacity:capacity]; +} +#endif // GTM_CONTAINERS_VALIDATE +@end + +@implementation GTMValidatingDictionary ++ (id)validatingDictionaryWithTarget:(id)target selector:(SEL)sel { + return [self validatingDictionaryWithCapacity:0 target:target selector:sel]; +} + ++ (id)validatingDictionaryWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel { + return [[[[self class] alloc] initValidatingWithCapacity:0 + target:target + selector:sel] autorelease]; +} + +- (id)initValidatingWithTarget:(id)target selector:(SEL)sel { + return [self initValidatingWithCapacity:0 target:target selector:sel]; +} + +#if GTM_CONTAINERS_VALIDATE +- (id)initValidatingWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel { + if ((self = [super init])) { + embeddedContainer_ = [[NSMutableDictionary alloc] initWithCapacity:capacity]; + target_ = [target retain]; + selector_ = sel; + VerifySelectorOnTarget(selector_, target_); + } + return self; +} + +- (void)dealloc { + [target_ release]; + [embeddedContainer_ release]; + [super dealloc]; +} + +- (NSUInteger)count { + return [embeddedContainer_ count]; +} + +- (NSEnumerator *)keyEnumerator { + return [embeddedContainer_ keyEnumerator]; +} + +- (id)objectForKey:(id)aKey { + return [embeddedContainer_ objectForKey:aKey]; +} + +- (void)removeObjectForKey:(id)aKey { + [embeddedContainer_ removeObjectForKey:aKey]; +} + +- (void)setObject:(id)anObject forKey:(id)aKey { + if (VerifyObjectWithTargetAndSelectorForContainer(anObject, target_, + selector_, self)) { + [embeddedContainer_ setObject:anObject forKey:aKey]; + } +} + +- (NSString*)description { + return [NSString stringWithFormat:@"%@ - %@", + NSStringFromClass([self class]), + [embeddedContainer_ description]]; +} + +#else // GTM_CONTAINERS_VALIDATE +- (id)initValidatingWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel { + if ((self = [super init])) { + [self release]; + } + return [[NSMutableDictionary alloc] initWithCapacity:capacity]; + +} +#endif // GTM_CONTAINERS_VALIDATE +@end + +@implementation GTMValidatingSet ++ (id)validatingSetWithTarget:(id)target selector:(SEL)sel { + return [self validatingSetWithCapacity:0 target:target selector:sel]; +} + ++ (id)validatingSetWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel { + return [[[[self class] alloc] initValidatingWithCapacity:0 + target:target + selector:sel] autorelease]; +} +- (id)initValidatingWithTarget:(id)target selector:(SEL)sel { + return [self initValidatingWithCapacity:0 target:target selector:sel]; +} + +#if GTM_CONTAINERS_VALIDATE +- (id)initValidatingWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel { + if ((self = [super init])) { + embeddedContainer_ = [[NSMutableSet alloc] initWithCapacity:capacity]; + target_ = [target retain]; + selector_ = sel; + VerifySelectorOnTarget(selector_, target_); + } + return self; +} + +- (void)dealloc { + [target_ release]; + [embeddedContainer_ release]; + [super dealloc]; +} + +- (NSUInteger)count { + return [embeddedContainer_ count]; +} + +- (id)member:(id)object { + return [embeddedContainer_ member:object]; +} + +- (NSEnumerator *)objectEnumerator { + return [embeddedContainer_ objectEnumerator]; +} + +- (void)addObject:(id)object { + if (object && VerifyObjectWithTargetAndSelectorForContainer(object, + target_, + selector_, + self)) { + [embeddedContainer_ addObject:object]; + } +} + +- (void)removeObject:(id)object { + [embeddedContainer_ removeObject:object]; +} + +- (NSString*)description { + return [NSString stringWithFormat:@"%@ - %@", + NSStringFromClass([self class]), + [embeddedContainer_ description]]; +} + +#else // GTM_CONTAINERS_VALIDATE +- (id)initValidatingWithCapacity:(NSUInteger)capacity + target:(id)target + selector:(SEL)sel { + if ((self = [super init])) { + [self release]; + } + return [[NSMutableSet alloc] initWithCapacity:capacity]; +} +#endif // GTM_CONTAINERS_VALIDATE +@end + +#pragma mark - +#pragma mark Simple Common Validators +@implementation GTMKindOfClassValidator ++ (id)validateAgainstClass:(Class)cls { + return [[[[self class] alloc] initWithClass:cls] autorelease]; +} + +- (id)initWithClass:(Class)cls { +#if GTM_CONTAINERS_VALIDATE + if ((self = [super init])) { + if (!cls) { + _GTMDevLog(@"nil class"); + [self release]; + return nil; + } + cls_ = cls; + } + return self; +#else // GTM_CONTAINERS_VALIDATE + if ((self = [super init])) { + [self release]; + } + return nil; +#endif // GTM_CONTAINERS_VALIDATE +} + +- (BOOL)validateObject:(id)object forContainer:(id)container { + return [object isKindOfClass:cls_]; +} +@end + +@implementation GTMMemberOfClassValidator ++ (id)validateAgainstClass:(Class)cls { + return [[[[self class] alloc] initWithClass:cls] autorelease]; +} + +- (id)initWithClass:(Class)cls { +#if GTM_CONTAINERS_VALIDATE + if ((self = [super init])) { + if (!cls) { + _GTMDevLog(@"nil class"); + [self release]; + return nil; + } + cls_ = cls; + } + return self; +#else // GTM_CONTAINERS_VALIDATE + if ((self = [super init])) { + [self release]; + } + return nil; +#endif // GTM_CONTAINERS_VALIDATE +} + +- (BOOL)validateObject:(id)object forContainer:(id)container { + return [object isMemberOfClass:cls_]; +} +@end + +@implementation GTMConformsToProtocolValidator ++ (id)validateAgainstProtocol:(Protocol*)prot { + return [[[[self class] alloc] initWithProtocol:prot] autorelease]; +} + +- (id)initWithProtocol:(Protocol*)prot { +#if GTM_CONTAINERS_VALIDATE + if ((self = [super init])) { + if (!prot) { + _GTMDevLog(@"nil protocol"); + [self release]; + return nil; + } + prot_ = prot; + } + return self; +#else // GTM_CONTAINERS_VALIDATE + if ((self = [super init])) { + [self release]; + } + return nil; +#endif // GTM_CONTAINERS_VALIDATE +} + +- (BOOL)validateObject:(id)object forContainer:(id)container { + return [object conformsToProtocol:prot_]; +} +@end + +@implementation GTMRespondsToSelectorValidator ++ (id)validateAgainstSelector:(SEL)sel { + return [[[[self class] alloc] initWithSelector:sel] autorelease]; +} + +- (id)initWithSelector:(SEL)sel { +#if GTM_CONTAINERS_VALIDATE + if ((self = [super init])) { + if (!sel) { + _GTMDevLog(@"nil selector"); + [self release]; + return nil; + } + sel_ = sel; + } + return self; +#else // GTM_CONTAINERS_VALIDATE + if ((self = [super init])) { + [self release]; + } + return nil; +#endif // GTM_CONTAINERS_VALIDATE +} + +- (BOOL)validateObject:(id)object forContainer:(id)container { + return [object respondsToSelector:sel_]; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainersTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainersTest.m new file mode 100644 index 00000000..f9cc3772 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainersTest.m @@ -0,0 +1,378 @@ +// +// GTMValidatingContainersTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMValidatingContainers.h" +#import "GTMSenTestCase.h" +#import "GTMUnitTestDevLog.h" + +#pragma mark Test Support Declarations +@protocol GTMVCTestProtocol +@end + +@interface GTMVCTestClass : NSObject ++ (id)instance; +@end + +@interface GTMVCTestSubClass : GTMVCTestClass +- (void)foo; +@end + +@interface GTMVCValidatingTests : GTMTestCase { + GTMVCTestClass *testClass_; + GTMVCTestSubClass *testSubClass_; +} +@end + +@interface GTMVCValidatorTests : GTMVCValidatingTests +@end + +@interface GTMVCContainerTests : GTMVCValidatingTests { + GTMConformsToProtocolValidator *validator_; + SEL selector_; +} +@end + +@interface GTMVCArrayTests : GTMVCContainerTests +@end + +@interface GTMVCDictionaryTests : GTMVCContainerTests +@end + +@interface GTMVCSetTests : GTMVCContainerTests +@end + +@interface GTMValidateContainerTests : GTMTestCase +@end + +#pragma mark - +#pragma mark Test Support Definitions + +@implementation GTMVCTestClass ++ (id)instance { + return [[[[self class] alloc] init] autorelease]; +} + +- (NSString*)description { + return NSStringFromClass([self class]); +} +@end + +@implementation GTMVCTestSubClass +- (void)foo { +} +@end + +@implementation GTMVCContainerTests +- (void)setUp { + [super setUp]; + Protocol *prot = @protocol(GTMVCTestProtocol); + validator_ = [[GTMConformsToProtocolValidator alloc] initWithProtocol:prot]; + selector_ = @selector(validateObject:forContainer:); +} + +- (void)tearDown { + [validator_ release]; + [super tearDown]; +} +@end + +@implementation GTMVCValidatingTests + +- (void)setUp { + [super setUp]; + testClass_ = [[GTMVCTestClass alloc] init]; + testSubClass_ = [[GTMVCTestSubClass alloc] init]; +} + +- (void)tearDown { + [testClass_ release]; + [testSubClass_ release]; + [super tearDown]; +} + +@end + +@implementation GTMVCValidatorTests + +- (void)testKindOfClassValidator { +#if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + [GTMUnitTestDevLog expectString:@"nil class"]; + GTMKindOfClassValidator *validator; + validator = [GTMKindOfClassValidator validateAgainstClass:nil]; + STAssertNil(validator, @"should be nil"); + + Class cls = [GTMVCTestClass class]; + validator = [GTMKindOfClassValidator validateAgainstClass:cls]; + STAssertNotNil(validator, @"should be valid"); + + BOOL isGood = [validator validateObject:testClass_ forContainer:nil]; + STAssertTrue(isGood, @"should be validated"); + + isGood = [validator validateObject:testSubClass_ forContainer:nil]; + STAssertTrue(isGood, @"should be validated"); + + isGood = [validator validateObject:[NSNumber numberWithInt:0] + forContainer:nil]; + STAssertFalse(isGood, @"should fail"); +#else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + GTMKindOfClassValidator *validator; + validator = [GTMKindOfClassValidator validateAgainstClass:nil]; + STAssertNil(validator, @"should be nil"); + + Class cls = [GTMVCTestClass class]; + validator = [GTMKindOfClassValidator validateAgainstClass:cls]; + STAssertNil(validator, @"should be nil"); +#endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT +} + +- (void)testMemberOfClassValidator { +#if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + [GTMUnitTestDevLog expectString:@"nil class"]; + GTMMemberOfClassValidator *validator; + validator = [GTMMemberOfClassValidator validateAgainstClass:nil]; + STAssertNil(validator, @"should be nil"); + + Class cls = [GTMVCTestClass class]; + validator = [GTMMemberOfClassValidator validateAgainstClass:cls]; + STAssertNotNil(validator, @"should be valid"); + + BOOL isGood = [validator validateObject:testClass_ forContainer:nil]; + STAssertTrue(isGood, @"should be validated"); + + isGood = [validator validateObject:testSubClass_ forContainer:nil]; + STAssertFalse(isGood, @"should fail"); + + isGood = [validator validateObject:nil forContainer:nil]; + STAssertFalse(isGood, @"should fail"); + + isGood = [validator validateObject:[NSNumber numberWithInt:0] + forContainer:nil]; + STAssertFalse(isGood, @"should fail"); +#else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + GTMMemberOfClassValidator *validator; + validator = [GTMMemberOfClassValidator validateAgainstClass:nil]; + STAssertNil(validator, @"should be nil"); + + Class cls = [GTMVCTestClass class]; + validator = [GTMMemberOfClassValidator validateAgainstClass:cls]; + STAssertNil(validator, @"should be nil"); +#endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT +} + +- (void)testConformsToProtocolValidator { +#if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + [GTMUnitTestDevLog expectString:@"nil protocol"]; + GTMConformsToProtocolValidator *validator; + validator = [GTMConformsToProtocolValidator validateAgainstProtocol:nil]; + STAssertNil(validator, @"should be nil"); + + Protocol *prot = @protocol(GTMVCTestProtocol); + validator = [GTMConformsToProtocolValidator validateAgainstProtocol:prot]; + STAssertNotNil(validator, @"should be valid"); + + BOOL isGood = [validator validateObject:testClass_ forContainer:nil]; + STAssertFalse(isGood, @"should fail"); + + isGood = [validator validateObject:testSubClass_ forContainer:nil]; + STAssertTrue(isGood, @"should succeed"); + + isGood = [validator validateObject:nil forContainer:nil]; + STAssertFalse(isGood, @"should fail"); +#else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + GTMConformsToProtocolValidator *validator; + validator = [GTMConformsToProtocolValidator validateAgainstProtocol:nil]; + STAssertNil(validator, @"should be nil"); + + Protocol *prot = @protocol(GTMVCTestProtocol); + validator = [GTMConformsToProtocolValidator validateAgainstProtocol:prot]; + STAssertNil(validator, @"should be nil"); +#endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT +} + +- (void)testRespondsToSelectorValidator { +#if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + [GTMUnitTestDevLog expectString:@"nil selector"]; + GTMRespondsToSelectorValidator *validator; + validator = [GTMRespondsToSelectorValidator validateAgainstSelector:nil]; + STAssertNil(validator, @"should be nil"); + + SEL sel = @selector(foo); + validator = [GTMRespondsToSelectorValidator validateAgainstSelector:sel]; + STAssertNotNil(validator, @"should be valid"); + + BOOL isGood = [validator validateObject:testClass_ forContainer:nil]; + STAssertFalse(isGood, @"should fail"); + + isGood = [validator validateObject:testSubClass_ forContainer:nil]; + STAssertTrue(isGood, @"should succeed"); + + isGood = [validator validateObject:nil forContainer:nil]; + STAssertFalse(isGood, @"should fail"); +#else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + GTMRespondsToSelectorValidator *validator; + validator = [GTMRespondsToSelectorValidator validateAgainstSelector:nil]; + STAssertNil(validator, @"should be nil"); + + SEL sel = @selector(foo); + validator = [GTMRespondsToSelectorValidator validateAgainstSelector:sel]; + STAssertNil(validator, @"should be nil"); +#endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT +} + + +@end + +@implementation GTMVCArrayTests +- (void)testContainer { + GTMValidatingArray *array; + array = [GTMValidatingArray validatingArrayWithTarget:validator_ + selector:selector_]; + STAssertNotNil(array, @"should be valid"); + + array = [[[GTMValidatingArray alloc] initValidatingWithTarget:validator_ + selector:selector_] autorelease]; + STAssertNotNil(array, @"should be valid"); + + [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingArray .*"]; + [array addObject:testSubClass_]; + [array addObject:testClass_]; + STAssertEquals([array objectAtIndex:0], testSubClass_, @""); + + [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingArray .*"]; + [array insertObject:testClass_ atIndex:0]; + [array insertObject:testSubClass_ atIndex:0]; + [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingArray .*"]; + [array replaceObjectAtIndex:0 withObject:testClass_]; + [array replaceObjectAtIndex:0 withObject:testSubClass_]; + [array removeLastObject]; + [array removeObjectAtIndex:0]; + NSUInteger expectedCount = 0U; +#if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT) + // If we're not validating, we don't expect any logs + [GTMUnitTestDevLog resetExpectedLogs]; + expectedCount = 2U; +#endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT) + STAssertEquals([array count], expectedCount, @"should have no objects left"); + +} +@end + +@implementation GTMVCDictionaryTests +- (void)testContainer { + GTMValidatingDictionary *dictionary; + dictionary = [GTMValidatingDictionary validatingDictionaryWithTarget:validator_ + selector:selector_]; + STAssertNotNil(dictionary, @"should be valid"); + + dictionary = [[[GTMValidatingDictionary alloc] initValidatingWithTarget:validator_ + selector:selector_] autorelease]; + STAssertNotNil(dictionary, @"should be valid"); + + [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingDictionary .*"]; + [dictionary setObject:testClass_ forKey:@"Key1"]; + [dictionary setObject:testSubClass_ forKey:@"Key2"]; + STAssertEquals([dictionary objectForKey:@"Key2"], testSubClass_, @""); + STAssertNotNil([dictionary keyEnumerator], @""); + + [dictionary removeObjectForKey:@"Key2"]; + [dictionary removeObjectForKey:@"Key1"]; + STAssertEquals([dictionary count], (NSUInteger)0, @"should have no objects left"); + + // So we get full code coverage + [testSubClass_ foo]; +#if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT) + // If we're not validating, we don't expect any logs + [GTMUnitTestDevLog resetExpectedLogs]; +#endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT) +} +@end + +@implementation GTMVCSetTests +- (void)testContainer { + GTMValidatingSet *set; + set = [GTMValidatingSet validatingSetWithTarget:validator_ + selector:selector_]; + STAssertNotNil(set, @"should be valid"); + + set = [[[GTMValidatingSet alloc] initValidatingWithTarget:validator_ + selector:selector_] autorelease]; + STAssertNotNil(set, @"should be valid"); + + [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingSet .*"]; + [set addObject:testClass_]; + [set addObject:testSubClass_]; + STAssertEqualObjects([set member:testSubClass_], testSubClass_, @""); + STAssertNotNil([set objectEnumerator], @""); + + [set removeObject:testClass_]; + [set removeObject:testSubClass_]; +#if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT) + // If we're not validating, we don't expect any logs + [GTMUnitTestDevLog resetExpectedLogs]; +#endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT) + STAssertEquals([set count], (NSUInteger)0, @"should have no objects left"); +} +@end + +@implementation GTMValidateContainerTests +- (void)testValidatingContainers { + NSDictionary *homogenousDict = [NSDictionary dictionaryWithObjectsAndKeys: + [GTMVCTestSubClass instance], @"key1", + [GTMVCTestSubClass instance], @"key2", + nil]; + NSDictionary *heterogenousDict = [NSDictionary dictionaryWithObjectsAndKeys: + [GTMVCTestClass instance], @"key1", + [GTMVCTestSubClass instance], @"key2", + nil]; + + // Test bad container + [GTMUnitTestDevLog expectPattern:@"container does not respont to -objectEnumerator: .*"]; + _GTMValidateContainerContainsKindOfClass([NSString string], + [GTMVCTestSubClass class]); + + _GTMValidateContainerContainsKindOfClass(homogenousDict, + [GTMVCTestSubClass class]); + _GTMValidateContainerContainsKindOfClass(heterogenousDict, + [GTMVCTestClass class]); + [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for .*"]; + _GTMValidateContainerContainsKindOfClass(heterogenousDict, + [GTMVCTestSubClass class]); + + _GTMValidateContainerContainsMemberOfClass(homogenousDict, + [GTMVCTestSubClass class]); + [GTMUnitTestDevLog expectPattern:@"GTMVCTestSubClass failed container verification for .*"]; + _GTMValidateContainerContainsMemberOfClass(heterogenousDict, + [GTMVCTestClass class]); + + _GTMValidateContainerConformsToProtocol(homogenousDict, + @protocol(GTMVCTestProtocol)); + [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for .*"]; + _GTMValidateContainerConformsToProtocol(heterogenousDict, + @protocol(GTMVCTestProtocol)); + + _GTMValidateContainerItemsRespondToSelector(homogenousDict, + @selector(foo)); + [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for .*"]; + _GTMValidateContainerItemsRespondToSelector(heterogenousDict, + @selector(foo)); +#if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT) + // If we're not validating, we don't expect any logs + [GTMUnitTestDevLog resetExpectedLogs]; +#endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT) +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTM-Info.plist b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTM-Info.plist new file mode 100644 index 00000000..41b915de --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTM-Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.google.GTM + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTMDefines.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTMDefines.h new file mode 100644 index 00000000..b88193cd --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTMDefines.h @@ -0,0 +1,241 @@ +// +// GTMDefines.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// ============================================================================ + +#include +#include + +// Not all MAC_OS_X_VERSION_10_X macros defined in past SDKs +#ifndef MAC_OS_X_VERSION_10_5 + #define MAC_OS_X_VERSION_10_5 1050 +#endif +#ifndef MAC_OS_X_VERSION_10_6 + #define MAC_OS_X_VERSION_10_6 1060 +#endif + +// ---------------------------------------------------------------------------- +// CPP symbols that can be overridden in a prefix to control how the toolbox +// is compiled. +// ---------------------------------------------------------------------------- + + +// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and +// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens +// when a validation fails. If you implement your own validators, you may want +// to control their internals using the same macros for consistency. +#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + #define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0 +#endif + +// Give ourselves a consistent way to do inlines. Apple's macros even use +// a few different actual definitions, so we're based off of the foundation +// one. +#if !defined(GTM_INLINE) + #if defined (__GNUC__) && (__GNUC__ == 4) + #define GTM_INLINE static __inline__ __attribute__((always_inline)) + #else + #define GTM_INLINE static __inline__ + #endif +#endif + +// Give ourselves a consistent way of doing externs that links up nicely +// when mixing objc and objc++ +#if !defined (GTM_EXTERN) + #if defined __cplusplus + #define GTM_EXTERN extern "C" + #else + #define GTM_EXTERN extern + #endif +#endif + +// Give ourselves a consistent way of exporting things if we have visibility +// set to hidden. +#if !defined (GTM_EXPORT) + #define GTM_EXPORT __attribute__((visibility("default"))) +#endif + +// _GTMDevLog & _GTMDevAssert +// +// _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for +// developer level errors. This implementation simply macros to NSLog/NSAssert. +// It is not intended to be a general logging/reporting system. +// +// Please see http://code.google.com/p/google-toolbox-for-mac/wiki/DevLogNAssert +// for a little more background on the usage of these macros. +// +// _GTMDevLog log some error/problem in debug builds +// _GTMDevAssert assert if conditon isn't met w/in a method/function +// in all builds. +// +// To replace this system, just provide different macro definitions in your +// prefix header. Remember, any implementation you provide *must* be thread +// safe since this could be called by anything in what ever situtation it has +// been placed in. +// + +// We only define the simple macros if nothing else has defined this. +#ifndef _GTMDevLog + +#ifdef DEBUG + #define _GTMDevLog(...) NSLog(__VA_ARGS__) +#else + #define _GTMDevLog(...) do { } while (0) +#endif + +#endif // _GTMDevLog + +// Declared here so that it can easily be used for logging tracking if +// necessary. See GTMUnitTestDevLog.h for details. +@class NSString; +GTM_EXTERN void _GTMUnitTestDevLog(NSString *format, ...); + +#ifndef _GTMDevAssert +// we directly invoke the NSAssert handler so we can pass on the varargs +// (NSAssert doesn't have a macro we can use that takes varargs) +#if !defined(NS_BLOCK_ASSERTIONS) + #define _GTMDevAssert(condition, ...) \ + do { \ + if (!(condition)) { \ + [[NSAssertionHandler currentHandler] \ + handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \ + file:[NSString stringWithUTF8String:__FILE__] \ + lineNumber:__LINE__ \ + description:__VA_ARGS__]; \ + } \ + } while(0) +#else // !defined(NS_BLOCK_ASSERTIONS) + #define _GTMDevAssert(condition, ...) do { } while (0) +#endif // !defined(NS_BLOCK_ASSERTIONS) + +#endif // _GTMDevAssert + +// _GTMCompileAssert +// _GTMCompileAssert is an assert that is meant to fire at compile time if you +// want to check things at compile instead of runtime. For example if you +// want to check that a wchar is 4 bytes instead of 2 you would use +// _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X) +// Note that the second "arg" is not in quotes, and must be a valid processor +// symbol in it's own right (no spaces, punctuation etc). + +// Wrapping this in an #ifndef allows external groups to define their own +// compile time assert scheme. +#ifndef _GTMCompileAssert + // We got this technique from here: + // http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html + + #define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg + #define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg) + #define _GTMCompileAssert(test, msg) \ + typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ] +#endif // _GTMCompileAssert + +// Macro to allow fast enumeration when building for 10.5 or later, and +// reliance on NSEnumerator for 10.4. Remember, NSDictionary w/ FastEnumeration +// does keys, so pick the right thing, nothing is done on the FastEnumeration +// side to be sure you're getting what you wanted. +#ifndef GTM_FOREACH_OBJECT + #if TARGET_OS_IPHONE || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) + #define GTM_FOREACH_OBJECT(element, collection) \ + for (element in collection) + #define GTM_FOREACH_KEY(element, collection) \ + for (element in collection) + #else + #define GTM_FOREACH_OBJECT(element, collection) \ + for (NSEnumerator * _ ## element ## _enum = [collection objectEnumerator]; \ + (element = [_ ## element ## _enum nextObject]) != nil; ) + #define GTM_FOREACH_KEY(element, collection) \ + for (NSEnumerator * _ ## element ## _enum = [collection keyEnumerator]; \ + (element = [_ ## element ## _enum nextObject]) != nil; ) + #endif +#endif + +// ============================================================================ + +// ---------------------------------------------------------------------------- +// CPP symbols defined based on the project settings so the GTM code has +// simple things to test against w/o scattering the knowledge of project +// setting through all the code. +// ---------------------------------------------------------------------------- + +// Provide a single constant CPP symbol that all of GTM uses for ifdefing +// iPhone code. +#if TARGET_OS_IPHONE // iPhone SDK + // For iPhone specific stuff + #define GTM_IPHONE_SDK 1 + #if TARGET_IPHONE_SIMULATOR + #define GTM_IPHONE_SIMULATOR 1 + #else + #define GTM_IPHONE_DEVICE 1 + #endif // TARGET_IPHONE_SIMULATOR +#else + // For MacOS specific stuff + #define GTM_MACOS_SDK 1 +#endif + +// Provide a symbol to include/exclude extra code for GC support. (This mainly +// just controls the inclusion of finalize methods). +#ifndef GTM_SUPPORT_GC + #if GTM_IPHONE_SDK + // iPhone never needs GC + #define GTM_SUPPORT_GC 0 + #else + // We can't find a symbol to tell if GC is supported/required, so best we + // do on Mac targets is include it if we're on 10.5 or later. + #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 + #define GTM_SUPPORT_GC 0 + #else + #define GTM_SUPPORT_GC 1 + #endif + #endif +#endif + +// To simplify support for 64bit (and Leopard in general), we provide the type +// defines for non Leopard SDKs +#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 + // NSInteger/NSUInteger and Max/Mins + #ifndef NSINTEGER_DEFINED + #if __LP64__ || NS_BUILD_32_LIKE_64 + typedef long NSInteger; + typedef unsigned long NSUInteger; + #else + typedef int NSInteger; + typedef unsigned int NSUInteger; + #endif + #define NSIntegerMax LONG_MAX + #define NSIntegerMin LONG_MIN + #define NSUIntegerMax ULONG_MAX + #define NSINTEGER_DEFINED 1 + #endif // NSINTEGER_DEFINED + // CGFloat + #ifndef CGFLOAT_DEFINED + #if defined(__LP64__) && __LP64__ + // This really is an untested path (64bit on Tiger?) + typedef double CGFloat; + #define CGFLOAT_MIN DBL_MIN + #define CGFLOAT_MAX DBL_MAX + #define CGFLOAT_IS_DOUBLE 1 + #else /* !defined(__LP64__) || !__LP64__ */ + typedef float CGFloat; + #define CGFLOAT_MIN FLT_MIN + #define CGFLOAT_MAX FLT_MAX + #define CGFLOAT_IS_DOUBLE 0 + #endif /* !defined(__LP64__) || !__LP64__ */ + #define CGFLOAT_DEFINED 1 + #endif // CGFLOAT_DEFINED +#endif // MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTM_Prefix.pch b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTM_Prefix.pch new file mode 100644 index 00000000..a7c0011a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTM_Prefix.pch @@ -0,0 +1,37 @@ +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// We don't require a prefix to use any GTM code, so this prefix is just to +// speed up the basic compiles of *all* of the GTM projects/targets. + +// We don't want to drag GTMDefines into the prefix so we make sure each file +// that directly needs it includes it, so we just use the iphone test directly +// instead of our GTM_IPHONE_SDK symbol. +#ifdef __OBJC__ + #include + #if TARGET_OS_IPHONE // iPhone SDK + #import + #import + #else + #import + #endif + // This turns on unit test logging so that we can track unittests if we are + // doing them. See GTMUnitTestDevLog.h for details. + // (_GTMUnitTestDevLog comes from GTMDevLogUnitTestingBridge.m) + #define _GTMDevLog _GTMUnitTestDevLog +#endif + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTMiPhone-Info.plist b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTMiPhone-Info.plist new file mode 100644 index 00000000..68982241 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/GTMiPhone-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.google.GTMiPhone + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/ReleaseNotes.txt b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/ReleaseNotes.txt new file mode 100644 index 00000000..7e76a234 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/ReleaseNotes.txt @@ -0,0 +1,399 @@ +Google Toolbox for Mac Release Notes + +Project site: http://code.google.com/p/google-toolbox-for-mac/ +Discussion group: http://groups.google.com/group/google-toolbox-for-mac + + +Release ?.?.? +Changes since 1.5.1 + +- Added GTMNSArray+Merge for merging one array into another with or without + a custom merging function, returning a new array with the merged contents. + +- Added GTMSignalHandler for simple signal handling (via kqueue/runloop). This + has gotten an api tweak, so some code that started using it will need + updating. Initial landing had a bug where it could leak memory due to + how CFRunLoops work, now fixed. + +- Fixed up GTMIPhoneUnitTestDelegate to be pickier about which tests it runs + +- Added GTMNSString+URLArguments to GTMiPhone + +- Added GTMHTTPFetcher and GTMHTTPServer to GTMiPhone + +- Made sure that build would work with iPhone device attached, and that all + tests run directly on the phone. + +- Added GTMValidatingContainers which are a set of mutable container classes + that allow you to have a selector on a target that is called to verify that + the objects being put into the container are valid. This can be controlled + at compile time so that you don't take the performance hit in a release build. + +- Added GTMPath, which represents an existing absolute path on the file system. + It also makes it very easy to contruct new paths in the file system as well + as whole directory hierarchies. + +- Added GTMNSString+Replace for a common replacement need. + +- Added NSString+FindFolder for two commen helpers for building paths to common + locations. + +- Added GTMLargeTypeWindow for doing display windows similar to Address Book + Large Type display for phone numbers. + +- Removed GTMNSWorkspace+ScreenSaver as it has always been a little dodgy due + to it's dependencies on undocumented frameworks, and the ScreenSaver + framework doesn't play nicely in GC mode. + +- Added property methods to GTMHTTPFetcher. These are convenient alternatives + to storing an NSDictionary in the userData. + +- Renamed GTMDevLog.m to GTMDevLogUnitTestingBridge.m and added some more + comments where it comes into play to hopefully make it more clear that it + isn't needed in most cases. + +- Fixed a potential GTMHTTPFetcher crash on failed authentication. + +- Added a obj-c logging package, GTMLogger, for applications that want an + application level logging system. See GTMLogger.h, GTMLogger+ASL.h, and + GTMLoggerRingBufferWriter.h for what the basic system and two optional + additions can do. + +- Added GTMNSMakeUncollectable for forcing objects to survive in a GC world. + +- Added GTMCFAutorelease to make the [GTMNSMakeCollectable(cfFoo) autorelease] + simpler and clearer, it's now just GTMCFAutorelease(cfFoo), and works in + both GC and non-GC world. + +- Added GTMIsGarbageCollectionEnabled to GTMGarbageCollection.h. See the note + there for it's usage. + +- Disabled the unittests for things on top of NSAppleScript in a GC world since + Apple has bugs and it can crash. See the unittest for a note about it. + +- GTMStackTrace now can figure out ObjC symbols. Downside it is now ObjC only. + +- GTMFourCharCode can now be used with NSAppleEventDescriptors easily. + typeType, typeKeyword, typeApplSignature, and typeEnumerated all get + turned into GTMFourCharCodes. + +- Fixed up crash in GTMLoggerRingBufferWriter when used with GC on. + +- Significant updates to GTMNSAppleScript+Handler allowing you to + list all handlers and properties (including inherited) and cleans up + several errors in how scripting was being handled. + +- Added GTMGetURLHandler class that gives you a very easy way of supporting + Get URL events just by adding a key to your plists, and adding a single + method to your class. See GTMGetURLHandler.m for more details. + +- Added XcodeProject, AppleScript, and InterfaceBuilder Spotlight Plugins. + Allows you to index .xcodeproj, .scpt, .scptd, .xib, .nib, and + .aib files. See Readmes beside individual projects in SpotlightPlugins. + +- Added GTMExceptionalInlines for dealing with cases where you get + warning: variable 'r' might be clobbered by 'longjmp' or 'vfork' + when using certain Apple inlined functions in @synchronized/@try blocks. + +- Updated to Xcode 3.1 so the GTM and iPhone project have the same baseline. + The code should work in other version of xcode, but the projects and + xcconfig files now use 3.1 features. + +- Added GTMABAddressBook which is a cocoa wrapper for the 'C' AddressBook + APIs on the iPhone. + +- Added several set environment variable statements to RunIPhoneUnitTest.sh + to encourage bugs to come out of the woodwork. + +- Added GTMTestTimer.h for doing high fidelity timings. + +- Added ability to control using zombies to iPhone unit test script. It can be + controlled by the GTM_DISABLE_ZOMBIES environment variable + +- Added ability to control termination to iPhone unit test script. It can be + controlled by the GTM_DISABLE_TERMINATION environment variable + +- Fixed several leaks found with leak checking enabled. + +- Updated the iPhone xcconfigs to support the different OS versions. + +- GTM_INLINE will make sure a function gets inlined, and provides a consistent + way for all GTM code to do it. + +- Added GTMDebugThreadValidation to allow you to enforce the fact that your + code must run in the main thread in DEBUG builds. + +- Updated some internals of the iPhone unittesting so it doesn't double print + the test descriptions, file names, or lines numbers of a test failure line. + Also includes the test names in the error output. + +- Changed the xcconfigs so that know it's easier to set different settings at + the different levels and not accidentally overwrite settings set at lower + levels in the "settings collapse". Also tightened up warnings significantly. + +- Changed how gtm_unitTestExposedBindingsTestValues works. If you have an + implementation of gtm_unitTestExposedBindingsTestValues in your own code + you will need to update to the new way of calling. See implementations in + GTMNSObject+BindingUnitTesting.m for details. + +- Added support for grabbing the build number for a particular OS in + GTMSystemVersion and easily comparing it to known build numbers, and switched + some types from in GTMSystemVersion from "int" to SInt32 to make 64 bit work + better. + +- Added support for SnowLeopard (10A96). We build cleanly with the 10.6 SDKs and + all radar checks were updated accordingly. Build All script was also updated + to build on SnowLeopard if you have the SDK available. + +- Turned off building ppc64 GTM because the SnowLeopard SDK currently + doesn't have ppc64 support, so SenTestCase isn't defined. This makes it + impossible to build the ppc64 10.5 config on SnowLeopard. We have left the + setting in the xcconfig for those of you who need it, but have disabled + it in the GTM project settings. + +- Turned on stack smashing protection on the debug builds for all Leopard + and above. + +- Added ability to easily do leak checking by defining the GTM_ENABLE_LEAKS + environment variable. It isn't on by default because several of Apple's + frameworks leak. You can work around these false positives by using the + GTM_LEAKS_SYMBOLS_TO_IGNORE environment variable. Also if you turn on leaks + make sure to turn off zombies by defining the GTM_DISABLE_ZOMBIES variable, + otherwise every memory allocation you do will look like a leak. + +- Added has ability to check if a script has an open handler to + GTMNSAppleScript+Handler. + +- GTMStackTrace support for building a trace from the call stack in an + NSException (for 10.5+ and iPhone). + +- GTMStackTrace works on 10.5+ (and iPhone) using NSThread to build the call + stack. + +- GTMLightweightProxy for breaking retain cycles. + +- Added GTM_EXTERN that makes it easier to mix and match objc and objc++ code. + +- Added GTMHotKeysTextField for display and editing of hot key settings. + +- Added GTMCarbonEvent for dealing with Carbon Events and HotKeys in a ObjC + like way. + +- Backported the Atomic Barrier Swap functions for Objective C back to Tiger. + +- Added a variety of new functions to GTMUnitTestingUtilities for checking + if the screensaver is in the way, waiting on user events, and generating + keystrokes. + +- If you are using any Carbon routines that log (DebugStr, AssertMacros.h) and + use GTMUnitTestDevLog, the log routines now go through _GTMDevLog so that + they can be caught in GTMUnitTestDevLog and verified like any _GTMDevLog calls + you may make. For an example of this in action see GTMCarbonEventTest.m. + Since we have turned this on, we have turned off using _debug frameworks + from the RunUnitTests.sh because it was reporting a pile of uninteresting + issues that were interfering with unittests. + +- Added GTMFileSystemKQueue. It provides a simple wrapper for kqueuing + something in the file system and tracking changes to it. Initial landing + had a bug where it could leak memory due to how CFRunLoops work, now fixed. + +- RunIPhoneUnitTest.sh now cleans up the user home directory and creates + a documents directory within it, used when requesting a NSDocumentDirectory. + +- Added GTMNSFileManager+Carbon which contains routines for path <-> Alias + conversion and path <-> FSRef conversion. + +- Added GTM_EXPORT as a standard way of exporting symbols. + +- Added GTMUnitTestDevLogDebug which extends GTMUnitTestDevLog to only look + for the messages in debug builds, to make it easier to validate messages + that are only present in debug builds. + +- Added GTM_SUPPORT_GC for controlling the inclusion of GC related code. + +- If you are using GTMUnitTestDevLog, it also tries to capture logs from + NSAssert. + +- Added GTM_FOREACH_OBJECT/GTM_FOREACH_KEY that uses NSEnumerator and + objectEnumerator/keyEnumerator on 10.4, but on 10.5+/iPhone uses + FastEnumeration. + +- GTMNSWorkspace+Running gives a variety of ways of determining the attributes + of running processes. + +- If the iPhone unittesting support is exiting when done, it now properly sets + the exit code based on test success/failure. + +- Added GTMNSObject+KeyValueObserving to make it easier on folks to do KVO + "correctly". Based on some excellent code by Michael Ash. + http://www.mikeash.com/?page=pyblog/key-value-observing-done-right.html + This has been added for iPhone and OS X. + +- Fixed up GTMSenTestCase on iPhone so that it has a description that matches + that of OCUnit. + +- Added GTMAbstractDOListener, GTMTransientRootProxy, and + GTMTransientRootPortProxy. These classes can be used to simplify the + use of distributed objects. GTMAbstractDOListener can be used to handle + connections from any type of port. GTMTransientRootProxy is designed for + using named connections while GTMTransientRootPortProxy is for connections + with supplied NSPorts. + +- Finally dropped GTMHTTPFetcher and GTMProgressMonitorInputStream, GData + versions now pretty much line up w/ these, so rather then both projects + maintaing them, we've dropped them and point folks at the gdata versions + which can be used independent of the rest of GData. + +- Changed gtm_createCGPath to gtm_cgPath in GTMNSBezier+CGPath. The path + returned is now autoreleased so you don't need to worry about releasing it. + +- Made some changes to the GTMNSObject+UnitTesting APIs. Specifically renamed + gtm_createUnitTestImage to gtm_unitTestImage. The value it returns is now + autoreleased, so no need to release it. Also change + gtm_createUnitTestBitmapOfSize:withData: to a C function. + +- Cleaned up GTM so that it passes the Clang checker without any warnings. + +- Added GTMLuminance for working with colors in HSL space easily. + +- Added GTMTheme for doing product wide theme modifications. + +- The Run*UnitTest.sh script now support an env var to have them delete the + current target/configs *.gcda files to avoid coverage data warning when you + edit source. + + +Release 1.5.1 +Changes since 1.5.0 +16-June-2008 + +- Fixed building tiger gcov w/ a directory path that contains a space. + + +Release 1.5.0 +Changes since 1.0.0 +13-June-2008 + +- Updated the project to Xcode 3. This is the only supported Xcode version + for the project. The code can build against the Tiger or Leopard SDKs, and + developers can pull individual files into a Xcode 2.x project and things + should work just fine. + +- Fixed up the prefix header of the project and prefix handing in the Unittest + Xcode Config. (thanks schafdog) + +- Fixed error in handling default compression for NSData+zlib + +- Changed name on API in NSString+XML and added another api to make this a + litte more clear. (thanks Kent) + +- GTMRegex + - Found and fixed a bug in the enumerators that was causing them to + incorrectly walk a string when using '^' in an expression. + - Added helpers for substring tests and unittests for the new apis. + - Added initializer that takes an outError to allow the collection of any + pattern parsing error message (in case the pattern came from a user and + complete error information is needed to message the user). + +- Added GTMScriptRunner for spawning scripts. + +- Added GTMNSFileManager+Path for two small helpers. + +- Added GTMNSWorkspace+ScreenSaver + +- Added GTMNSString+Data + +- added a common header (GTMDefines) for any common defines so the conditionals + are all in one place + +- Support for things compiling against the iPhone SDK + - Everything in the GTMiPhone project works in the iPhone + - Added iPhone xcconfig files + - Added iPhone unittests (See below) + +- More work on the UI unittests + - support pretty much any part of a UI + - support for CALayers + - full support for the iPhone + - the iPhone uses the same macro set at OCUnit, but has its own runtime + for running tests. + - extended capabilities of UIUnitTesting to be more flexible and give better + error reporting for states. + +- Renamed the actual framework to "GoogleToolboxForMac.framework" (it should + have matched the project on code.google.com from the start) + +- added a Debug-gcov target that will product debug bits w/ code coverage + support to check unittests, etc. + +- GTMDebugSelectorValidation to provide something to include in class impls + to get validation of object/selector pair(s) being implemented so you don't + have to wait for a runtime invocation failures. (especially useful for + things that take a success and failure selector so one doesn't always get + called) + +- added _GTMDevLog (really in GTMDefines) that are a set of macros that can be + used for logging. This allows any project to redefine them to direct logging + into its runtime needs. + +- Moved GTMGeometryUtils into Foundation from AppKit + +- Removed several HI* calls from GTMGeometryUtils as Carbon UI in general is + deprecated. + +- Xcode configs + - changed the layout to make it a little easier to tell how to use them. + - added Leopard or later configs + +- Unittest coverage greatly increased + +- Added RunMacOSUnitTests shell script. We run this script for starting up our + unittests because it turns on a variety of "enhancements" (such as zombies, + scribbling etc) to encourage our unittests to fail for us. + + https://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?bundleID=19915 + +- Remove NSColor+Theme and NSWorkspace+Theme as they are no longer needed for + testing things for unittests, instead GTMUnitTestingUtilities.m(Lines 64-79) + force the user settable things to ensure tests are consistent. + +- Added GTMBase64. + +- Added GTMHTTPFetcher and GTMProgressMonitorInputStream. + +- Moved the data files for unittests into subdirectories call TestData to + help make it a little easier to find files w/in the main directories. + +- GTMDelegatingTableColumn get an overhaul to match the 10.5 sdk so it's closer + to a dropin for previous sdks. + +- Added a lot of functionality to NSAppleEventDescriptor and NSAppleScript + allowing you to easily call labeled and positional handlers in an AppleScript, + get/set properties and get NSAppleEventDescriptors for most basic datatypes. + +- Added GTMFourCharCode for wrapping FourCharCodes in an ObjC object. Mainly for + use by the NSAppleEventDescriptor code, and also useful for storing them + in ObjC collection classes. + +- Added GTMStackTrace. + +- Added NSString+URLArguments and NSDictionary+URLArguments + +- Added GTMHTTPServer as a simple server but mainly for use in unittesting. + +- Added _GTMCompileAssert for doing compile time assertions to GTMDefines.h + +- Added GTMUnitTestDevLog and GTMTestCase for logging and tracking logs while + running unittests to verify what is being logged is what you expect. All + unittests should now inherit from GTMTestCase instead of SenTestCase to take + advantage of the new log tracking. See GTMUnitTestDevLog.h for details. + +- Extracted GTMIPhoneUnitTestDelegate from GTMIPhoneUnitTestMain.m to its own + file. Tests can now be run from another application. + + +Release 1.0.0 +14-January-2008 + +- Initial public release. Includes some simple utils, xcode configs, and + some support for doing unit tests of graphical things. diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/English.lproj/InfoPlist.strings b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..41ade49ed991c06601dd19ce13e40db11c9ea0da GIT binary patch literal 452 zcmb7=y9&ZU6hx=?D}t4Z_^Jf4P{9X?g@S#|Lq$zO5(WKu_3TCjA&o5A+1#BwGk0Il zwimn^*PO8#oQa^;vGD47AaSF&6)PXD@IzwaGBfH&a%t&i%H9F H{&Ri literal 0 HcmV?d00001 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/GetMetadataForFile.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/GetMetadataForFile.m new file mode 100644 index 00000000..d635f405 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/GetMetadataForFile.m @@ -0,0 +1,121 @@ +// +// GetMetadataForFile.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import + +static BOOL ImportScriptBundle(NSMutableDictionary *attributes, + NSString *path) { + NSBundle *scriptBundle = [NSBundle bundleWithPath:path]; + NSString *descriptionPath = [scriptBundle pathForResource:@"description" + ofType:@"rtfd"]; + NSAttributedString *attrString = nil; + if (descriptionPath) { + attrString = [[[NSAttributedString alloc] initWithPath:descriptionPath + documentAttributes:NULL] autorelease]; + } + BOOL wasGood = NO; + if (attrString) { + NSString *description = [attrString string]; + [attributes setObject:description forKey:(NSString*)kMDItemDescription]; + wasGood = YES; + } + + NSArray *scripts = [scriptBundle pathsForResourcesOfType:@"scpt" + inDirectory:@"Scripts"]; + NSEnumerator *scriptEnum = [scripts objectEnumerator]; + NSString *scriptPath; + NSMutableArray *scriptSources = [NSMutableArray array]; + while ((scriptPath = [scriptEnum nextObject])) { + NSURL *scriptURL = [NSURL fileURLWithPath:scriptPath]; + NSDictionary *error; + NSAppleScript *script + = [[[NSAppleScript alloc] initWithContentsOfURL:scriptURL + error:&error] + autorelease]; + NSString *scriptSource = [script source]; + if (scriptSource) { + [scriptSources addObject:scriptSource]; + } + } + if ([scriptSources count]) { + NSString *source = [scriptSources componentsJoinedByString:@"\n"]; + [attributes setObject:source forKey:(NSString*)kMDItemTextContent]; + wasGood = YES; + } + return wasGood; +} + +static BOOL ImportScript(NSMutableDictionary *attributes, + NSString *path) { + NSURL *fileURL = [NSURL fileURLWithPath:path]; + FSRef ref; + BOOL wasGood = NO; + if (CFURLGetFSRef((CFURLRef)fileURL, &ref)) { + ResFileRefNum resFile = FSOpenResFile(&ref, fsRdPerm); + if (resFile) { + const ResID kScriptDescriptionResID = 1128; + ResFileRefNum curResFile = CurResFile(); + UseResFile(resFile); + Handle res = Get1Resource('TEXT', kScriptDescriptionResID); + if (res) { + NSString *descString + = [[[NSString alloc]initWithBytes:(char*)(*res) + length:GetHandleSize(res) + encoding:NSMacOSRomanStringEncoding] autorelease]; + ReleaseResource(res); + if (descString) { + [attributes setObject:descString forKey:(NSString*)kMDItemDescription]; + wasGood = YES; + } + } + UseResFile(curResFile); + CloseResFile(resFile); + } + + NSDictionary *error; + NSAppleScript *script = [[[NSAppleScript alloc] initWithContentsOfURL:fileURL + error:&error] + autorelease]; + NSString *scriptSource = [script source]; + if (scriptSource) { + [attributes setObject:scriptSource forKey:(NSString*)kMDItemTextContent]; + wasGood = YES; + } + } + return wasGood; +} + +// Currently grabs the script description and puts it into kMDItemDescription. +// Grabs the script code and puts it into kMDItemTextContent. +Boolean GetMetadataForFile(void* interface, + CFMutableDictionaryRef cfAttributes, + CFStringRef cfContentTypeUTI, + CFStringRef cfPathToFile) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSMutableDictionary *attributes = (NSMutableDictionary*)cfAttributes; + NSString *pathToFile = (NSString*)cfPathToFile; + BOOL wasGood = NO; + if (UTTypeConformsTo(cfContentTypeUTI, CFSTR("com.apple.applescript.scriptbundle"))) { + wasGood = ImportScriptBundle(attributes, pathToFile); + } else if (UTTypeConformsTo(cfContentTypeUTI, CFSTR("com.apple.applescript.script"))) { + wasGood = ImportScript(attributes, pathToFile); + } + [pool release]; + return wasGood ? TRUE : FALSE; +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/Info.plist b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/Info.plist new file mode 100644 index 00000000..be3c6225 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/Info.plist @@ -0,0 +1,74 @@ + + + + + UTImportedTypeDeclarations + + + UTTypeIdentifier + com.apple.applescript.scriptbundle + UTTypeReferenceURL + http://www.apple.com/applescript/ + UTTypeDescription + Script Bundle + UTTypeConformsTo + + com.apple.package + public.composite-content + public.data + + UTTypeTagSpecification + + public.filename-extension + + scptd + + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeRole + MDImporter + LSItemContentTypes + + com.apple.applescript.script + com.apple.applescript.scriptbundle + + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleName + ${PRODUCT_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.google.spotlightimporter.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleVersion + 1.0 + CFPlugInDynamicRegisterFunction + + CFPlugInDynamicRegistration + NO + CFPlugInFactories + + B498BAB3-7887-4E93-862A-19E74809248D0 + MetadataImporterPluginFactory + + CFPlugInTypes + + 8B08C4BF-415B-11D8-B3F9-0003936726FC + + B498BAB3-7887-4E93-862A-19E74809248D0 + + + CFPlugInUnloadFunction + + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/PluginID.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/PluginID.h new file mode 100644 index 00000000..955a476f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/PluginID.h @@ -0,0 +1,19 @@ +// +// PluginID.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#define PLUGIN_ID "B498BAB3-7887-4E93-862A-19E74809248D0" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/ReadMe.rtf b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/ReadMe.rtf new file mode 100644 index 00000000..ee2fa250 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/ReadMe.rtf @@ -0,0 +1,38 @@ +{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf330 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\vieww10980\viewh11300\viewkind0 +\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 AppleScript Spotlight Plugin\ +\ +Copyright 2008 Google Inc.\ +\ +Licensed under the Apache License, Version 2.0 (the "License"); you may not\ +use this file except in compliance with the License. You may obtain a copy\ +of the License at\ +\ +http://www.apache.org/licenses/LICENSE-2.0\ + \ +Unless required by applicable law or agreed to in writing, software\ +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\ +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\ +License for the specific language governing permissions and limitations under\ +the License.\ +\ +-----------------------\ +\ +This is a spotlight importer for AppleScripts.\ +It imports the description and the code of an AppleScript to make them easily searchable.\ +\ +To install the spotlight plugin, please copy it into /Applications/AppleScript/Script Editor/Contents/Library/Spotlight.\ +\ +If you are wondering why we just don't copy this one into /Library/Spotlight or ~/Library/Spotlight it is due to the fact that on 10.5 the UTIs declared by Spotlight importers don't seem to be recognized unless they are in an application's /Library/Spotlight directory. There isn't a UTI for AppleScript bundle files (.scptd) so we declare one in the importer. If the importer isn't located in an application's /Library/Spotlight directory, you won't be able to import .scptd files.\ +\ +Radars logged:\ +6160646 UTIs declared in Spotlight Importers in Library/Spotlight not recognized\ +6160685 Need UTI for AppleScript script bundle\ +6160707 UTCoreTypes.h needs to be updated\ +\ +It is part of the Google Toolbox For Mac project\ +http://code.google.com/p/google-toolbox-for-mac/} \ No newline at end of file diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/schema.xml b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/schema.xml new file mode 100644 index 00000000..d057fd74 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/AppleScript/schema.xml @@ -0,0 +1,38 @@ + + + + + + + + kMDItemDescription + + + + + + + kMDItemDescription + + + + + + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Common/main.c b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Common/main.c new file mode 100644 index 00000000..16eecacf --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Common/main.c @@ -0,0 +1,204 @@ +// +// main.c +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#include +#include +#include +#include "PluginID.h" + +// ----------------------------------------------------------------------------- +// constants +// ----------------------------------------------------------------------------- + + + +// +// Below is the generic glue code for all plug-ins. +// +// You should not have to modify this code aside from changing +// names if you decide to change the names defined in the Info.plist +// + +// ----------------------------------------------------------------------------- +// typedefs +// ----------------------------------------------------------------------------- + +// The import function to be implemented in GetMetadataForFile.c +Boolean GetMetadataForFile(void *thisInterface, + CFMutableDictionaryRef attributes, + CFStringRef contentTypeUTI, + CFStringRef pathToFile); + +// The layout for an instance of MetaDataImporterPlugIn +typedef struct __MetadataImporterPluginType { + MDImporterInterfaceStruct *conduitInterface; + CFUUIDRef factoryID; + UInt32 refCount; +} MetadataImporterPluginType; + +// ----------------------------------------------------------------------------- +// prototypes +// ----------------------------------------------------------------------------- +// Forward declaration for the IUnknown implementation. +// + +MetadataImporterPluginType* AllocMetadataImporterPluginType(CFUUIDRef inFactoryID); +void DeallocMetadataImporterPluginType(MetadataImporterPluginType *instance); +void* MetadataImporterPluginFactory(CFAllocatorRef allocator, CFUUIDRef typeID); +static ULONG MetadataImporterPluginAddRef(void *instance); +static ULONG MetadataImporterPluginRelease(void *instance); +static HRESULT MetadataImporterQueryInterface(void *instance, REFIID iid, LPVOID *ppv); +// ----------------------------------------------------------------------------- +// testInterfaceFtbl definition +// ----------------------------------------------------------------------------- +// The TestInterface function table. +// + +static MDImporterInterfaceStruct testInterfaceFtbl = { + NULL, + MetadataImporterQueryInterface, + MetadataImporterPluginAddRef, + MetadataImporterPluginRelease, + GetMetadataForFile +}; + + +// ----------------------------------------------------------------------------- +// AllocMetadataImporterPluginType +// ----------------------------------------------------------------------------- +// Utility function that allocates a new instance. +// You can do some initial setup for the importer here if you wish +// like allocating globals etc... +// +MetadataImporterPluginType *AllocMetadataImporterPluginType(CFUUIDRef inFactoryID) { + MetadataImporterPluginType *theNewInstance + = (MetadataImporterPluginType *)malloc(sizeof(MetadataImporterPluginType)); + memset(theNewInstance, 0, sizeof(MetadataImporterPluginType)); + + // Point to the function table + theNewInstance->conduitInterface = &testInterfaceFtbl; + + // Retain and keep an open instance refcount for each factory. + theNewInstance->factoryID = CFRetain(inFactoryID); + CFPlugInAddInstanceForFactory(inFactoryID); + + // This function returns the IUnknown interface so set the refCount to one. + theNewInstance->refCount = 1; + return theNewInstance; +} + +// ----------------------------------------------------------------------------- +// DeallocXcodeProjectSpotlightPluginMDImporterPluginType +// ----------------------------------------------------------------------------- +// Utility function that deallocates the instance when +// the refCount goes to zero. +// In the current implementation importer interfaces are never deallocated +// but implement this as this might change in the future +// +void DeallocMetadataImporterPluginType(MetadataImporterPluginType *instance) { + CFUUIDRef theFactoryID = instance->factoryID; + free(instance); + if (theFactoryID) { + CFPlugInRemoveInstanceForFactory(theFactoryID); + CFRelease(theFactoryID); + } +} + +// ----------------------------------------------------------------------------- +// MetadataImporterQueryInterface +// ----------------------------------------------------------------------------- +// Implementation of the IUnknown QueryInterface function. +// +HRESULT MetadataImporterQueryInterface(void *instance, REFIID iid, LPVOID *ppv) { + CFUUIDRef interfaceID = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault, iid); + MetadataImporterPluginType *plugin = ((MetadataImporterPluginType*)instance); + HRESULT result = E_INVALIDARG; + if (interfaceID) { + if (CFEqual(interfaceID, kMDImporterInterfaceID)) { + // If the Right interface was requested, bump the ref count, + // set the ppv parameter equal to the instance, and + // return good status. + plugin->conduitInterface->AddRef(instance); + *ppv = instance; + result = S_OK; + } else { + if (CFEqual(interfaceID, IUnknownUUID)) { + // If the IUnknown interface was requested, same as above. + plugin->conduitInterface->AddRef(instance); + *ppv = instance; + result = S_OK; + } else { + // Requested interface unknown, bail with error. + *ppv = NULL; + result = E_NOINTERFACE; + } + } + CFRelease(interfaceID); + } + return result; +} + +// ----------------------------------------------------------------------------- +// MetadataImporterPluginAddRef +// ----------------------------------------------------------------------------- +// Implementation of reference counting for this type. Whenever an interface +// is requested, bump the refCount for the instance. NOTE: returning the +// refcount is a convention but is not required so don't rely on it. +// +ULONG MetadataImporterPluginAddRef(void *instance) { + MetadataImporterPluginType *plugin = ((MetadataImporterPluginType*)instance); + plugin->refCount += 1; + return plugin->refCount; +} + +// ----------------------------------------------------------------------------- +// SampleCMPluginRelease +// ----------------------------------------------------------------------------- +// When an interface is released, decrement the refCount. +// If the refCount goes to zero, deallocate the instance. +// +ULONG MetadataImporterPluginRelease(void *instance) { + ULONG refCount = 0; + MetadataImporterPluginType *plugin = ((MetadataImporterPluginType*)instance); + plugin->refCount -= 1; + if (plugin->refCount == 0) { + DeallocMetadataImporterPluginType(plugin); + refCount = 0; + } else { + refCount = (plugin)->refCount; + } + return refCount; +} + +// ----------------------------------------------------------------------------- +// XcodeProjectSpotlightPluginMDImporterPluginFactory +// ----------------------------------------------------------------------------- +// Implementation of the factory function for this type. +// +void *MetadataImporterPluginFactory(CFAllocatorRef allocator, CFUUIDRef typeID) { + // If correct type is being requested, allocate an + //instance of TestType and return the IUnknown interface. + MetadataImporterPluginType *result = NULL; + if (CFEqual(typeID, kMDImporterTypeID)){ + CFUUIDRef uuid = CFUUIDCreateFromString(kCFAllocatorDefault, CFSTR(PLUGIN_ID)); + result = AllocMetadataImporterPluginType(uuid); + CFRelease(uuid); + } + // If the requested type is incorrect, return NULL. + return result; +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/ApplescriptInstallerPost.sh b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/ApplescriptInstallerPost.sh new file mode 100644 index 00000000..f58c5b03 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/ApplescriptInstallerPost.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy +# of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# + +su ${USER} -c "/usr/bin/mdimport -r '/Applications/AppleScript/Script Editor.app/Contents/Library/Spotlight/AppleScript.mdimporter'" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/ApplescriptInstallerPreflight.sh b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/ApplescriptInstallerPreflight.sh new file mode 100644 index 00000000..65ff80d7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/ApplescriptInstallerPreflight.sh @@ -0,0 +1,19 @@ +#!/bin/sh +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy +# of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# + +# Set up the spotlight importer directory for Script Editor. + +mkdir -m 775 -p "/Applications/AppleScript/Script Editor.app/Contents/Library/Spotlight" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/InterfaceBuilderInstallerPost.sh b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/InterfaceBuilderInstallerPost.sh new file mode 100644 index 00000000..2850a6c4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/InterfaceBuilderInstallerPost.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy +# of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# + +su ${USER} -c "/usr/bin/mdimport -r '/Library/Spotlight/InterfaceBuilder.mdimporter'" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/License.rtf b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/License.rtf new file mode 100644 index 00000000..33fbacf0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/License.rtf @@ -0,0 +1,13 @@ +{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\margl1440\margr1440\vieww9000\viewh8400\viewkind0 +\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 Copyright 2008 {\field{\*\fldinst{HYPERLINK "http://www.google.com"}}{\fldrslt Google Inc.}}\ +\ +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\ +\ +{\field{\*\fldinst{HYPERLINK "http://www.apache.org/licenses/LICENSE-2.0"}}{\fldrslt http://www.apache.org/licenses/LICENSE-2.0}}\ + \ +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.} \ No newline at end of file diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/Welcome.rtf b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/Welcome.rtf new file mode 100644 index 00000000..74f8854d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/Welcome.rtf @@ -0,0 +1,11 @@ +{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\margl1440\margr1440\vieww9000\viewh8400\viewkind0 +\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 Finding source can be difficult. These are importers to help you index your various source files. Included in the package are importers for Xcode projects, AppleScript files, and Interface Builder files.\ +\ +These importers are part of the Google Toolbox For Mac project. Check it out at:\ +\ +{\field{\*\fldinst{HYPERLINK "http://code.google.com/p/google-toolbox-for-mac/"}}{\fldrslt http://code.google.com/p/google-toolbox-for-mac/}}} \ No newline at end of file diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/XcodeProjectInstallerPost.sh b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/XcodeProjectInstallerPost.sh new file mode 100644 index 00000000..db9bfdb2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/Installer/XcodeProjectInstallerPost.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy +# of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# + +su ${USER} -c "/usr/bin/mdimport -r '/Library/Spotlight/XcodeProject.mdimporter'" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/English.lproj/InfoPlist.strings b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..b15089414e9333701f89d727017a0f2e5f6cfa6b GIT binary patch literal 480 zcmb7=OAoZ@M_f{mN8)@2^&YYS1o%?*W z)sUmPQU&sL&`x(n3aMR*na)&FB}9i9^PTY*lecuT`m=JXd(=0pYN)LW&q!kpbwM4X zi{xp`REB!>wb`SRaY~{Mdj`B!b=d9_`z3oOOy?hpvS~w@+cRQ31!RU}2SsSB#={Z% zg2uS~b?dwdnsi3!PIxnn8$1}dHMZ7?T_|1k$R?;#`o?K-M*$uR2MfGUAvi*lXo +#import "GTMGarbageCollection.h" + +static BOOL AddStringsToTextContent(NSSet *stringSet, + NSMutableDictionary *attributes) { + BOOL wasGood = NO; + if ([stringSet count]) { + NSString *allStrings = [[stringSet allObjects] componentsJoinedByString:@"\n"]; + NSString *oldContent = [attributes objectForKey:(NSString*)kMDItemTextContent]; + if (oldContent) { + allStrings = [NSString stringWithFormat:@"%@\n%@", allStrings, oldContent]; + } + [attributes setObject:allStrings forKey:(NSString*)kMDItemTextContent]; + wasGood = YES; + } + return wasGood; +} + +static BOOL ExtractClasses(NSDictionary *ibToolData, + NSMutableDictionary *attributes) { + NSString *classesKey = @"com.apple.ibtool.document.classes"; + NSDictionary *classes = [ibToolData objectForKey:classesKey]; + NSMutableSet *classSet = [NSMutableSet set]; + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + NSArray *classPrefixesToIgnore + = [ud objectForKey:@"classPrefixesToIgnore"]; + if (!classPrefixesToIgnore) { + classPrefixesToIgnore = [NSArray arrayWithObjects: + @"IB", + @"FirstResponder", + @"NS", + @"Web", + nil]; + [ud setObject:classPrefixesToIgnore forKey:@"classPrefixesToIgnore"]; + [ud synchronize]; + } + NSDictionary *entry; + NSEnumerator *entryEnum = [classes objectEnumerator]; + while ((entry = [entryEnum nextObject])) { + NSString *classStr = [entry objectForKey:@"class"]; + if (classStr) { + NSString *prefix; + NSEnumerator *classPrefixesToIgnoreEnum + = [classPrefixesToIgnore objectEnumerator]; + while (classStr && (prefix = [classPrefixesToIgnoreEnum nextObject])) { + if ([classStr hasPrefix:prefix]) { + classStr = nil; + } + } + if (classStr) { + [classSet addObject:classStr]; + } + } + } + return AddStringsToTextContent(classSet, attributes); +} + +static BOOL ExtractLocalizableStrings(NSDictionary *ibToolData, + NSMutableDictionary *attributes) { + NSString *localStrKey = @"com.apple.ibtool.document.localizable-strings"; + NSDictionary *strings = [ibToolData objectForKey:localStrKey]; + NSMutableSet *stringSet = [NSMutableSet set]; + NSDictionary *entry; + NSEnumerator *entryEnum = [strings objectEnumerator]; + while ((entry = [entryEnum nextObject])) { + NSEnumerator *stringEnum = [entry objectEnumerator]; + NSString *string; + while ((string = [stringEnum nextObject])) { + [stringSet addObject:string]; + } + } + return AddStringsToTextContent(stringSet, attributes); +} + +static BOOL ExtractConnections(NSDictionary *ibToolData, + NSMutableDictionary *attributes) { + NSString *connectionsKey = @"com.apple.ibtool.document.connections"; + NSDictionary *connections = [ibToolData objectForKey:connectionsKey]; + NSMutableSet *connectionsSet = [NSMutableSet set]; + NSDictionary *entry; + NSEnumerator *entryEnum = [connections objectEnumerator]; + while ((entry = [entryEnum nextObject])) { + NSString *typeStr = [entry objectForKey:@"type"]; + NSString *value = nil; + if (typeStr) { + if ([typeStr isEqualToString:@"IBBindingConnection"]) { + value = [entry objectForKey:@"keypath"]; + } else if ([typeStr isEqualToString:@"IBCocoaOutletConnection"] || + [typeStr isEqualToString:@"IBCocoaActionConnection"]) { + value = [entry objectForKey:@"label"]; + } + if (value) { + [connectionsSet addObject:value]; + } + } + } + return AddStringsToTextContent(connectionsSet, attributes); +} + +static NSString *FindIBTool(void) { + NSString *result = nil; + + NSString *possiblePaths[] = { + @"/usr/bin/ibtool", + @"/Developer/usr/bin/ibtool", + }; + + NSFileManager *fm = [NSFileManager defaultManager]; + BOOL isDir; + for (size_t i = 0; i < (sizeof(possiblePaths) / sizeof(NSString*)); ++i) { + if ([fm fileExistsAtPath:possiblePaths[i] isDirectory:&isDir] && + !isDir) { + result = possiblePaths[i]; + break; + } + } + + return result; +} + +static NSData *CommandOutput(NSString *cmd) { + NSMutableData *result = [NSMutableData data]; + + // NOTE: we use popen/pclose in here instead of NSTask because NSTask uses + // a delayed selector to clean up the process it spawns, so since we have + // no runloop it gets ungly trying to clean up the zombie process. + + FILE *fp; + char buffer[2048]; + size_t len; + if((fp = popen([cmd UTF8String], "r"))) { + // spool it all in + while ((len = fread(buffer, 1, sizeof(buffer), fp)) > 0) { + [result appendBytes:buffer length:len]; + } + // make sure we get a clean exit status + if (pclose(fp) != 0) { + result = nil; + } + } + return result; +} + +static BOOL ImportIBFile(NSMutableDictionary *attributes, + NSString *pathToFile) { + BOOL wasGood = NO; + NSString *ibtoolPath = FindIBTool(); + if (ibtoolPath) { + NSString *cmdString + = @"%@ --classes --localizable-strings --connections \"%@\""; + NSString *cmd = [NSString stringWithFormat:cmdString, ibtoolPath, pathToFile]; + NSData *data = CommandOutput(cmd); + if (data) { + NSDictionary *results + = GTMCFAutorelease(CFPropertyListCreateFromXMLData(NULL, + (CFDataRef)data , + kCFPropertyListImmutable, + NULL)); + if (results && [results isKindOfClass:[NSDictionary class]]) { + wasGood = ExtractClasses(results, attributes); + wasGood |= ExtractLocalizableStrings(results, attributes); + wasGood |= ExtractConnections(results, attributes); + } + } + } + + return wasGood; +} + +// Grabs all of the classes, localizable strings, bindings, outlets +// and actions and sticks them into kMDItemTextContent. +Boolean GetMetadataForFile(void* interface, + CFMutableDictionaryRef cfAttributes, + CFStringRef contentTypeUTI, + CFStringRef cfPathToFile) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSMutableDictionary *attributes = (NSMutableDictionary*)cfAttributes; + NSString *pathToFile = (NSString*)cfPathToFile; + BOOL wasGood = NO; + if (UTTypeConformsTo(contentTypeUTI, + CFSTR("com.apple.interfacebuilder.document")) + || UTTypeConformsTo(contentTypeUTI, + CFSTR("com.apple.interfacebuilder.document.cocoa")) + || UTTypeConformsTo(contentTypeUTI, + CFSTR("com.apple.interfacebuilder.document.carbon"))) { + wasGood = ImportIBFile(attributes, pathToFile); + } + [pool release]; + return wasGood == NO ? FALSE : TRUE; +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/Info.plist b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/Info.plist new file mode 100644 index 00000000..8412ec04 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/Info.plist @@ -0,0 +1,51 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeRole + MDImporter + LSItemContentTypes + + com.apple.interfacebuilder.document.cocoa + com.apple.interfacebuilder.document.carbon + com.apple.interfacebuilder.document + + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleName + ${PRODUCT_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.google.spotlightimporter.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleVersion + 1.0 + CFPlugInDynamicRegisterFunction + + CFPlugInDynamicRegistration + NO + CFPlugInFactories + + 556C7CA3-979B-44B2-BF4A-EADD88AFE0D9 + MetadataImporterPluginFactory + + CFPlugInTypes + + 8B08C4BF-415B-11D8-B3F9-0003936726FC + + 556C7CA3-979B-44B2-BF4A-EADD88AFE0D9 + + + CFPlugInUnloadFunction + + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/PluginID.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/PluginID.h new file mode 100644 index 00000000..c89c0913 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/PluginID.h @@ -0,0 +1,19 @@ +// +// PluginID.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#define PLUGIN_ID "556C7CA3-979B-44B2-BF4A-EADD88AFE0D9" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/ReadMe.rtf b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/ReadMe.rtf new file mode 100644 index 00000000..16cd43d2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/ReadMe.rtf @@ -0,0 +1,34 @@ +{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf330 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 InterfaceBuilder Spotlight Plugin\ +\ +Copyright 2008 Google Inc.\ +\ +Licensed under the Apache License, Version 2.0 (the "License"); you may not\ +use this file except in compliance with the License. You may obtain a copy\ +of the License at\ +\ +http://www.apache.org/licenses/LICENSE-2.0\ + \ +Unless required by applicable law or agreed to in writing, software\ +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\ +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\ +License for the specific language governing permissions and limitations under\ +the License.\ +\ +-----------------------\ +\ +This is a spotlight importer for nibs and xibs.\ +Makes it easy for you to search nibs and xibs for classes they use.\ +Class names, bindings, outlets, actions and localizable strings are added \ +to the text content attribute.\ +\ +To install the spotlight plugin, please copy it into /Library/Spotlight or ~/Library/Spotlight.\ +\ +This spotlight plugin requires Xcode 3 or better (specifically ibtool).\ +\ +It is part of the Google Toolbox For Mac project\ +http://code.google.com/p/google-toolbox-for-mac/} \ No newline at end of file diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/TestData/XibCarbonTest.xib b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/TestData/XibCarbonTest.xib new file mode 100644 index 00000000..aea96ba6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/TestData/XibCarbonTest.xib @@ -0,0 +1,3106 @@ + + + + 1050 + 9E17 + 672 + 949.33 + 352.00 + + YES + + + + + YES + com.apple.InterfaceBuilder.CarbonPlugin + + + YES + + Menu + + YES + + + TestLocalizedString + + 1048576 + 2147483647 + + NSMenuCheckmark + 1623195648 + + + NSMenuMixedState + 1623195648 + + submenuAction: + + TestLocalizedString + + YES + + + About NewApplication + + 2147483647 + + + About NewApplication + + + + + + + + + + + + + + + + + + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + UHJlZmVyZW5jZXPigKY + , + 1048576 + 2147483647 + + + UHJlZmVyZW5jZXPigKY + , + + + + + + + + + + + + + + + + + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + YES + + Services + + + + + + + + + Services + + + + + + + + + + + + + + + + + + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + Hide NewApplication + h + 1048576 + 2147483647 + + + Hide NewApplication + h + + + + + + + + + + + + + + + + + + + + + + Hide Others + h + 1572864 + 2147483647 + + + Hide Others + h + + + + + + + + + + + + + + + + + + + + + + Show All + + 1048576 + 2147483647 + + + Show All + + + + + + + + + + + + + + + + + + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + Quit NewApplication + q + 1048576 + 2147483647 + + + Quit NewApplication + q + + + + + + + + + + + + + + + + + + + + + + _NSAppleMenu + + TestLocalizedString + + + + + + + + + TestLocalizedString + + + + + + + + + + + + + + + + + + + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + YES + + + New + n + 1048576 + 2147483647 + + + New + n + + + + + + + + + + + + + + + + + + + + + + T3BlbuKApg + o + 1048576 + 2147483647 + + + T3BlbuKApg + o + + + + + + + + + + + + + + + + + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + YES + + + Clear Menu + + 1048576 + 2147483647 + + + Clear Menu + + + + + + + + + + + + + + + + + + + + + + Open Recent + + + + + + + + + Open Recent + + + + + + + + + + + + + + + + + + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + Close + w + 1048576 + 2147483647 + + + Close + w + + + + + + + + + + + + + + + + + + + + + + Save + s + 1048576 + 2147483647 + + + Save + s + + + + + + + + + + + + + + + + + + + + + + U2F2ZSBBc+KApg + S + 1179648 + 2147483647 + + + U2F2ZSBBc+KApg + S + + + + + + + + + + + + + + + + + + + + + + Revert to Saved + + 2147483647 + + + Revert to Saved + + + + + + + + + + + + + + + + + + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + UGFnZSBTZXR1cOKApg + P + 1179648 + 2147483647 + + + UGFnZSBTZXR1cOKApg + P + + + + + + + + + + + + + + + + + + + + + + UHJpbnTigKY + p + 1048576 + 2147483647 + + + UHJpbnTigKY + p + + + + + + + + + + + + + + + + + + + + + File + + + + + + + + + File + + + + + + + + + + + + + + + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + YES + + + Undo + z + 1048576 + 2147483647 + + + Undo + z + + + + + + + + + + + + + + + + + + + + + + Redo + Z + 1179648 + 2147483647 + + + Redo + Z + + + + + + + + + + + + + + + + + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + Cut + x + 1048576 + 2147483647 + + + Cut + x + + + + + + + + + + + + + + + + + + + + + + Copy + c + 1048576 + 2147483647 + + + Copy + c + + + + + + + + + + + + + + + + + + + + + + Paste + v + 1048576 + 2147483647 + + + Paste + v + + + + + + + + + + + + + + + + + + + + + + Delete + + 1048576 + 2147483647 + + + Delete + + + + + + + + + + + + + + + + + + + + + + + Select All + a + 1048576 + 2147483647 + + + Select All + a + + + + + + + + + + + + + + + + + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + YES + + + RmluZOKApg + f + 1048576 + 2147483647 + + + 1 + RmluZOKApg + f + + + + + + + + + + + + + + + + + + + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + Find Next + g + + + + + + + + + + + + + + + + + + + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + Find Previous + G + + + + + + + + + + + + + + + + + + + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + Use Selection for Find + e + + + + + + + + + + + + + + + + + + + + + + Jump to Selection + j + 1048576 + 2147483647 + + + Jump to Selection + j + + + + + + + + + + + + + + + + + + + + + Find + + + + + + + + + Find + + + + + + + + + + + + + + + + + + + + + + + Spelling + + 1048576 + 2147483647 + + + submenuAction: + + Spelling + + YES + + + U2hvdyBTcGVsbGluZ+KApg + : + 1048576 + 2147483647 + + + U2hvdyBTcGVsbGluZ+KApg + : + + + + + + + + + + + + + + + + + + + + + + Check Spelling + ; + 1048576 + 2147483647 + + + Check Spelling + ; + + + + + + + + + + + + + + + + + + + + + + Check Spelling as You Type + + 1048576 + 2147483647 + + + Check Spelling as You Type + + + + + + + + + + + + + + + + + + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + Check Grammar With Spelling + + + + + + + + + + + + + + + + + + + + + + Spelling + + + + + + + + + Spelling + + + + + + + + + + + + + + + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + YES + + + Smart Copy Paste + + 1048576 + 2147483647 + + + Smart Copy Paste + + + + + + + + + + + + + + + + + + + + + + + Smart Quotes + + 1048576 + 2147483647 + + + Smart Quotes + + + + + + + + + + + + + + + + + + + + + + + Smart Links + + 1048576 + 2147483647 + + + Smart Links + + + + + + + + + + + + + + + + + + + + + + Substitutions + + + + + + + + + Substitutions + + + + + + + + + + + + + + + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + YES + + + Start Speaking + + 1048576 + 2147483647 + + + Start Speaking + + + + + + + + + + + + + + + + + + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + Stop Speaking + + + + + + + + + + + + + + + + + + + + + + Speech + + + + + + + + + Speech + + + + + + + + + + + + + + + + + + + + + + Edit + + + + + + + + + Edit + + + + + + + + + + + + + + + + + + + + + + + Format + + 1048576 + 2147483647 + + + submenuAction: + + Format + + YES + + + Show Fonts + t + 1048576 + 2147483647 + + + Show Fonts + t + + + + + + + + + + + + + + + + + + + + + + Show Colors + C + 1179648 + 2147483647 + + + Show Colors + C + + + + + + + + + + + + + + + + + + + + + + Format + + + + + + + + + Format + + + + + + + + + + + + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + YES + + + Show Toolbar + t + 1572864 + 2147483647 + + + Show Toolbar + t + + + + + + + + + + + + + + + + + + + + + + Q3VzdG9taXplIFRvb2xiYXLigKY + + 1048576 + 2147483647 + + + Q3VzdG9taXplIFRvb2xiYXLigKY + + + + + + + + + + + + + + + + + + + + + + View + + + + + + + + + View + + + + + + + + + + + + + + + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + YES + + + Minimize + m + 1048576 + 2147483647 + + + Minimize + m + + + + + + + + + + + + + + + + + + + + + + Zoom + + 1048576 + 2147483647 + + + Zoom + + + + + + + + + + + + + + + + + + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + Bring All to Front + + + + + + + + + + + + + + + + + + + + + + + _NSWindowsMenu + + Window + + + + + + + + + Window + + + + + + + + + + + + + + + + + + + + + + + Help + + 1048576 + 2147483647 + + + submenuAction: + + Help + + YES + + + NewApplication Help + ? + 1048576 + 2147483647 + + + NewApplication Help + ? + + + + + + + + + + + + + + + + + + + + + + _NSWindowsMenu + + Help + + + + + + + + + Help + + + + + + + + + + + + + + + + + + + + + + + _NSMainMenu + + Menu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Window + + + 256 + {480, 360} + + + + + + + + + + + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + YES + + + + + {{300, 300}, {480, 360}} + {{0, 48}, {1920, 1129}} + + + YES + + + + + + YES + + + + YES + + 0 + + YES + + + + + + 316 + + + YES + + + + Window + + + 317 + + + + + 399 + + + YES + + + + + + + + + + MainMenu + + + 400 + + + YES + + + + + + 401 + + + YES + + + + + + 402 + + + YES + + + + + + 403 + + + YES + + + + + + 404 + + + YES + + + + + + 405 + + + YES + + + + + + 406 + + + YES + + + + + + 407 + + + YES + + + + + + + + + + + + + + + + 408 + + + YES + + + + + + 409 + + + + + 410 + + + + + 411 + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + YES + + + + + + 420 + + + + + 421 + + + YES + + + + + + + + + + + + + + + + + + 422 + + + YES + + + + + + 423 + + + YES + + + + + + 424 + + + YES + + + + + + 425 + + + + + 426 + + + + + 427 + + + YES + + + + + + 428 + + + + + 429 + + + + + 430 + + + + + 431 + + + + + 432 + + + + + 433 + + + + + 434 + + + + + 435 + + + YES + + + + + + + + + 436 + + + + + 437 + + + + + 438 + + + + + 439 + + + + + 440 + + + YES + + + + + + + + + + 441 + + + + + 442 + + + + + 443 + + + + + 444 + + + + + 445 + + + + + 446 + + + YES + + + + + + + 447 + + + + + 448 + + + + + 449 + + + YES + + + + + + + + 450 + + + + + 451 + + + + + 452 + + + + + 453 + + + YES + + + + + + + + + 454 + + + + + 455 + + + + + 456 + + + + + 457 + + + + + 458 + + + YES + + + + + + + + + + + + + + + + 459 + + + + + 460 + + + + + 461 + + + + + 462 + + + + + 463 + + + YES + + + + + + 464 + + + + + 465 + + + + + 466 + + + + + 467 + + + + + 468 + + + + + 469 + + + + + 470 + + + + + 471 + + + YES + + + + + + 472 + + + + + 473 + + + YES + + + + + + + 474 + + + + + 475 + + + + + 476 + + + YES + + + + + + + 477 + + + + + 478 + + + + + + + YES + + YES + 316.IBEditorWindowLastContentRect + 316.IBPluginDependency + 316.IBWindowTemplateEditedContentRect + 316.editorWindowContentRectSynchronizationRect + 317.IBPluginDependency + 399.IBEditorWindowLastContentRect + 399.IBPluginDependency + 399.editorWindowContentRectSynchronizationRect + 400.IBPluginDependency + 401.IBPluginDependency + 402.IBPluginDependency + 403.IBPluginDependency + 404.IBPluginDependency + 405.IBPluginDependency + 406.IBPluginDependency + 407.IBPluginDependency + 407.editorWindowContentRectSynchronizationRect + 408.IBPluginDependency + 409.IBPluginDependency + 410.IBPluginDependency + 411.IBPluginDependency + 412.IBPluginDependency + 413.IBPluginDependency + 414.IBPluginDependency + 415.IBPluginDependency + 416.IBPluginDependency + 417.IBPluginDependency + 418.IBPluginDependency + 419.IBPluginDependency + 419.editorWindowContentRectSynchronizationRect + 420.IBPluginDependency + 421.IBPluginDependency + 421.editorWindowContentRectSynchronizationRect + 422.IBPluginDependency + 423.IBPluginDependency + 424.IBPluginDependency + 425.IBPluginDependency + 426.IBPluginDependency + 427.IBPluginDependency + 428.IBPluginDependency + 429.IBPluginDependency + 430.IBPluginDependency + 431.IBPluginDependency + 432.IBPluginDependency + 433.IBPluginDependency + 434.IBPluginDependency + 435.IBPluginDependency + 435.editorWindowContentRectSynchronizationRect + 436.IBPluginDependency + 437.IBPluginDependency + 438.IBPluginDependency + 439.IBPluginDependency + 440.IBPluginDependency + 440.editorWindowContentRectSynchronizationRect + 441.IBPluginDependency + 442.IBPluginDependency + 443.IBPluginDependency + 444.IBPluginDependency + 445.IBPluginDependency + 446.IBPluginDependency + 446.editorWindowContentRectSynchronizationRect + 447.IBPluginDependency + 448.IBPluginDependency + 449.IBPluginDependency + 449.editorWindowContentRectSynchronizationRect + 450.IBPluginDependency + 451.IBPluginDependency + 452.IBPluginDependency + 453.IBPluginDependency + 453.editorWindowContentRectSynchronizationRect + 454.IBPluginDependency + 455.IBPluginDependency + 456.IBPluginDependency + 457.IBPluginDependency + 458.IBEditorWindowLastContentRect + 458.IBPluginDependency + 458.editorWindowContentRectSynchronizationRect + 459.IBPluginDependency + 460.IBPluginDependency + 461.IBPluginDependency + 462.IBPluginDependency + 463.IBPluginDependency + 464.IBPluginDependency + 465.IBPluginDependency + 466.IBPluginDependency + 467.IBPluginDependency + 468.IBPluginDependency + 469.IBPluginDependency + 470.IBPluginDependency + 470.editorWindowContentRectSynchronizationRect + 471.IBPluginDependency + 471.editorWindowContentRectSynchronizationRect + 472.IBPluginDependency + 473.IBPluginDependency + 473.editorWindowContentRectSynchronizationRect + 474.IBPluginDependency + 475.IBPluginDependency + 476.IBPluginDependency + 476.editorWindowContentRectSynchronizationRect + 477.IBPluginDependency + 478.IBPluginDependency + + + YES + {{247, 233}, {480, 360}} + com.apple.InterfaceBuilder.CarbonPlugin + {{247, 233}, {480, 360}} + {{325, 394}, {480, 360}} + com.apple.InterfaceBuilder.CarbonPlugin + {{21, 803}, {507, 20}} + com.apple.InterfaceBuilder.CarbonPlugin + {{325, 836}, {478, 20}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{159, 779}, {199, 203}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{358, 919}, {146, 23}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{511, 593}, {181, 243}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{692, 573}, {275, 83}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{382, 719}, {241, 103}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{382, 719}, {167, 43}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{382, 719}, {188, 63}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{361, 909}, {197, 73}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{33, 620}, {245, 183}} + com.apple.InterfaceBuilder.CarbonPlugin + {{27, 799}, {245, 183}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{272, 916}, {64, 6}} + com.apple.InterfaceBuilder.CarbonPlugin + {{432, 959}, {216, 23}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{311, 939}, {234, 43}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + {{555, 793}, {176, 43}} + com.apple.InterfaceBuilder.CarbonPlugin + com.apple.InterfaceBuilder.CarbonPlugin + + + + YES + + YES + + + YES + + + + + YES + + YES + + + YES + + + + 478 + + + 0 + + 3 + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/TestData/XibCocoaTest.xib b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/TestData/XibCocoaTest.xib new file mode 100644 index 00000000..e2119bc8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/InterfaceBuilder/TestData/XibCocoaTest.xib @@ -0,0 +1,3075 @@ + + + + 1050 + 9E17 + 672 + 949.33 + 352.00 + + YES + + + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + NSApplication + + + FirstResponder + + + NSApplication + + + NSFontManager + + + AMainMenu + + YES + + + TestLocalizedString + + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + TestLocalizedString + + YES + + + About NewApplication + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + UHJlZmVyZW5jZXPigKY + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Services + + 2147483647 + + + submenuAction: + + Services + + YES + + _NSServicesMenu + + + + + YES + YES + + + 2147483647 + + + + + + Hide NewApplication + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Quit NewApplication + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 2147483647 + + + submenuAction: + + File + + YES + + + New + n + 1048576 + 2147483647 + + + + + + T3BlbuKApg + o + 1048576 + 2147483647 + + + + + + Open Recent + + 2147483647 + + + submenuAction: + + Open Recent + + YES + + + Clear Menu + + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save + s + 1048576 + 2147483647 + + + + + + U2F2ZSBBc+KApg + S + 1179648 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + UHJpbnTigKY + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 2147483647 + + + submenuAction: + + Edit + + YES + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Delete + + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Find + + 2147483647 + + + submenuAction: + + Find + + YES + + + RmluZOKApg + f + 1048576 + 2147483647 + + + 1 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 2147483647 + + + submenuAction: + + Spelling and Grammar + + YES + + + U2hvdyBTcGVsbGluZ+KApg + : + 1048576 + 2147483647 + + + + + + Check Spelling + ; + 1048576 + 2147483647 + + + + + + Check Spelling While Typing + + 2147483647 + + + + + + Check Grammar With Spelling + + 2147483647 + + + + + + + + + Substitutions + + 2147483647 + + + submenuAction: + + Substitutions + + YES + + + Smart Copy/Paste + + 2147483647 + + + 1 + + + + Smart Quotes + + 2147483647 + + + 2 + + + + Smart Links + + 2147483647 + + + 3 + + + + + + + Speech + + 2147483647 + + + submenuAction: + + Speech + + YES + + + Start Speaking + + 2147483647 + + + + + + Stop Speaking + + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + Format + + YES + + + Font + + 2147483647 + + + submenuAction: + + Font + + YES + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + Kern + + YES + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligature + + 2147483647 + + + submenuAction: + + Ligature + + YES + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + Baseline + + YES + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + Text + + YES + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 2147483647 + + + submenuAction: + + View + + YES + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Q3VzdG9taXplIFRvb2xiYXLigKY + + 2147483647 + + + + + + + + + Window + + 2147483647 + + + submenuAction: + + Window + + YES + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bring All to Front + + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + YES + + + NewApplication Help + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + 15 + 2 + {{196, 240}, {480, 270}} + 603979776 + Window + TestCustomClass + + {3.40282e+38, 3.40282e+38} + + + 256 + + YES + + + 268 + {{66, 214}, {96, 32}} + + YES + + 67239424 + 134217728 + Button + + LucidaGrande + 1.300000e+01 + 1044 + + + -2038284033 + 129 + + + 200 + 25 + + + + {480, 270} + + + {{0, 0}, {1920, 1178}} + {3.40282e+38, 3.40282e+38} + + + + + YES + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + showHelp: + + + + 360 + + + + saveDocument: + + + + 362 + + + + saveDocumentAs: + + + + 363 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 369 + + + + hideOtherApplications: + + + + 370 + + + + unhideAllApplications: + + + + 372 + + + + addFontTrait: + + + + 420 + + + + addFontTrait: + + + + 421 + + + + modifyFont: + + + + 422 + + + + orderFrontFontPanel: + + + + 423 + + + + modifyFont: + + + + 424 + + + + raiseBaseline: + + + + 425 + + + + lowerBaseline: + + + + 426 + + + + copyFont: + + + + 427 + + + + subscript: + + + + 428 + + + + superscript: + + + + 429 + + + + tightenKerning: + + + + 430 + + + + underline: + + + + 431 + + + + orderFrontColorPanel: + + + + 432 + + + + useAllLigatures: + + + + 433 + + + + loosenKerning: + + + + 434 + + + + pasteFont: + + + + 435 + + + + unscript: + + + + 436 + + + + useStandardKerning: + + + + 437 + + + + useStandardLigatures: + + + + 438 + + + + turnOffLigatures: + + + + 439 + + + + turnOffKerning: + + + + 440 + + + + alignLeft: + + + + 441 + + + + alignJustified: + + + + 442 + + + + copyRuler: + + + + 443 + + + + alignCenter: + + + + 444 + + + + toggleRuler: + + + + 445 + + + + alignRight: + + + + 446 + + + + pasteRuler: + + + + 447 + + + + terminate: + + + + 448 + + + + visible: testBinding + + + + + + visible: testBinding + visible + testBinding + 2 + + + 459 + + + + testAction: + + + + 462 + + + + + YES + + 0 + + YES + + + + + + -2 + + + RmlsZSdzIE93bmVyA + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + YES + + + + + + + + + + Main Menu + + + 19 + + + YES + + + + + + 56 + + + YES + + + + + + 103 + + + YES + + + + + + 217 + + + YES + + + + + + 83 + + + YES + + + + + + 81 + + + YES + + + + + + + + + + + + + + + + 75 + + + + + 80 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + YES + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + YES + + + + + + 126 + + + + + 205 + + + YES + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + YES + + + + + + 216 + + + YES + + + + + + 200 + + + YES + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + YES + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 106 + + + YES + + + + + + 111 + + + + + 57 + + + YES + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + YES + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + YES + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + YES + + + + + + 296 + + + YES + + + + + + + 297 + + + + + 298 + + + + + 211 + + + YES + + + + + + 212 + + + YES + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + YES + + + + + + 349 + + + YES + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 367 + + + YES + + + + + + 368 + + + YES + + + + + + 373 + + + + + 375 + + + YES + + + + + + 376 + + + YES + + + + + + + 377 + + + YES + + + + + + 378 + + + YES + + + + + + 379 + + + YES + + + + + + + + + + + + + 380 + + + + + 381 + + + + + 382 + + + + + 383 + + + + + 384 + + + + + 385 + + + + + 386 + + + + + 387 + + + + + 388 + + + YES + + + + + + + + + + + + + + + + + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + 397 + + + YES + + + + + + 398 + + + YES + + + + + + 399 + + + YES + + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + 405 + + + YES + + + + + + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + 411 + + + YES + + + + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + YES + + + + + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 460 + + + YES + + + + + + 461 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 103.IBPluginDependency + 103.ImportedFromIB2 + 106.IBEditorWindowLastContentRect + 106.IBPluginDependency + 106.ImportedFromIB2 + 106.editorWindowContentRectSynchronizationRect + 111.IBPluginDependency + 111.ImportedFromIB2 + 112.IBPluginDependency + 112.ImportedFromIB2 + 124.IBPluginDependency + 124.ImportedFromIB2 + 125.IBEditorWindowLastContentRect + 125.IBPluginDependency + 125.ImportedFromIB2 + 125.editorWindowContentRectSynchronizationRect + 126.IBPluginDependency + 126.ImportedFromIB2 + 129.IBPluginDependency + 129.ImportedFromIB2 + 130.IBEditorWindowLastContentRect + 130.IBPluginDependency + 130.ImportedFromIB2 + 130.editorWindowContentRectSynchronizationRect + 131.IBPluginDependency + 131.ImportedFromIB2 + 134.IBPluginDependency + 134.ImportedFromIB2 + 136.IBPluginDependency + 136.ImportedFromIB2 + 143.IBPluginDependency + 143.ImportedFromIB2 + 144.IBPluginDependency + 144.ImportedFromIB2 + 145.IBPluginDependency + 145.ImportedFromIB2 + 149.IBPluginDependency + 149.ImportedFromIB2 + 150.IBPluginDependency + 150.ImportedFromIB2 + 19.IBPluginDependency + 19.ImportedFromIB2 + 195.IBPluginDependency + 195.ImportedFromIB2 + 196.IBPluginDependency + 196.ImportedFromIB2 + 197.IBPluginDependency + 197.ImportedFromIB2 + 198.IBPluginDependency + 198.ImportedFromIB2 + 199.IBPluginDependency + 199.ImportedFromIB2 + 200.IBEditorWindowLastContentRect + 200.IBPluginDependency + 200.ImportedFromIB2 + 200.editorWindowContentRectSynchronizationRect + 201.IBPluginDependency + 201.ImportedFromIB2 + 202.IBPluginDependency + 202.ImportedFromIB2 + 203.IBPluginDependency + 203.ImportedFromIB2 + 204.IBPluginDependency + 204.ImportedFromIB2 + 205.IBEditorWindowLastContentRect + 205.IBPluginDependency + 205.ImportedFromIB2 + 205.editorWindowContentRectSynchronizationRect + 206.IBPluginDependency + 206.ImportedFromIB2 + 207.IBPluginDependency + 207.ImportedFromIB2 + 208.IBPluginDependency + 208.ImportedFromIB2 + 209.IBPluginDependency + 209.ImportedFromIB2 + 210.IBPluginDependency + 210.ImportedFromIB2 + 211.IBPluginDependency + 211.ImportedFromIB2 + 212.IBEditorWindowLastContentRect + 212.IBPluginDependency + 212.ImportedFromIB2 + 212.editorWindowContentRectSynchronizationRect + 213.IBPluginDependency + 213.ImportedFromIB2 + 214.IBPluginDependency + 214.ImportedFromIB2 + 215.IBPluginDependency + 215.ImportedFromIB2 + 216.IBPluginDependency + 216.ImportedFromIB2 + 217.IBPluginDependency + 217.ImportedFromIB2 + 218.IBPluginDependency + 218.ImportedFromIB2 + 219.IBPluginDependency + 219.ImportedFromIB2 + 220.IBEditorWindowLastContentRect + 220.IBPluginDependency + 220.ImportedFromIB2 + 220.editorWindowContentRectSynchronizationRect + 221.IBPluginDependency + 221.ImportedFromIB2 + 23.IBPluginDependency + 23.ImportedFromIB2 + 236.IBPluginDependency + 236.ImportedFromIB2 + 239.IBPluginDependency + 239.ImportedFromIB2 + 24.IBEditorWindowLastContentRect + 24.IBPluginDependency + 24.ImportedFromIB2 + 24.editorWindowContentRectSynchronizationRect + 29.IBEditorWindowLastContentRect + 29.IBPluginDependency + 29.ImportedFromIB2 + 29.WindowOrigin + 29.editorWindowContentRectSynchronizationRect + 295.IBPluginDependency + 296.IBEditorWindowLastContentRect + 296.IBPluginDependency + 296.editorWindowContentRectSynchronizationRect + 297.IBPluginDependency + 298.IBPluginDependency + 346.IBPluginDependency + 346.ImportedFromIB2 + 348.IBPluginDependency + 348.ImportedFromIB2 + 349.IBEditorWindowLastContentRect + 349.IBPluginDependency + 349.ImportedFromIB2 + 349.editorWindowContentRectSynchronizationRect + 350.IBPluginDependency + 350.ImportedFromIB2 + 351.IBPluginDependency + 351.ImportedFromIB2 + 354.IBPluginDependency + 354.ImportedFromIB2 + 367.IBEditorWindowLastContentRect + 367.IBPluginDependency + 367.IBWindowTemplateEditedContentRect + 367.NSWindowTemplate.visibleAtLaunch + 367.editorWindowContentRectSynchronizationRect + 368.IBPluginDependency + 375.IBPluginDependency + 376.IBPluginDependency + 377.IBPluginDependency + 378.IBPluginDependency + 379.IBPluginDependency + 380.IBPluginDependency + 381.IBPluginDependency + 382.IBPluginDependency + 383.IBPluginDependency + 384.IBPluginDependency + 385.IBPluginDependency + 386.IBPluginDependency + 387.IBPluginDependency + 388.IBPluginDependency + 389.IBPluginDependency + 390.IBPluginDependency + 391.IBPluginDependency + 392.IBPluginDependency + 393.IBPluginDependency + 394.IBPluginDependency + 395.IBPluginDependency + 396.IBPluginDependency + 397.IBPluginDependency + 398.IBPluginDependency + 399.IBPluginDependency + 400.IBPluginDependency + 401.IBPluginDependency + 402.IBPluginDependency + 403.IBPluginDependency + 404.IBPluginDependency + 405.IBPluginDependency + 406.IBPluginDependency + 407.IBPluginDependency + 408.IBPluginDependency + 409.IBPluginDependency + 410.IBPluginDependency + 411.IBPluginDependency + 412.IBPluginDependency + 413.IBPluginDependency + 414.IBPluginDependency + 415.IBPluginDependency + 416.IBPluginDependency + 417.IBPluginDependency + 418.IBPluginDependency + 419.IBPluginDependency + 460.IBPluginDependency + 461.IBPluginDependency + 5.IBPluginDependency + 5.ImportedFromIB2 + 56.IBPluginDependency + 56.ImportedFromIB2 + 57.IBEditorWindowLastContentRect + 57.IBPluginDependency + 57.ImportedFromIB2 + 57.editorWindowContentRectSynchronizationRect + 58.IBPluginDependency + 58.ImportedFromIB2 + 72.IBPluginDependency + 72.ImportedFromIB2 + 73.IBPluginDependency + 73.ImportedFromIB2 + 74.IBPluginDependency + 74.ImportedFromIB2 + 75.IBPluginDependency + 75.ImportedFromIB2 + 77.IBPluginDependency + 77.ImportedFromIB2 + 78.IBPluginDependency + 78.ImportedFromIB2 + 79.IBPluginDependency + 79.ImportedFromIB2 + 80.IBPluginDependency + 80.ImportedFromIB2 + 81.IBEditorWindowLastContentRect + 81.IBPluginDependency + 81.ImportedFromIB2 + 81.editorWindowContentRectSynchronizationRect + 82.IBPluginDependency + 82.ImportedFromIB2 + 83.IBPluginDependency + 83.ImportedFromIB2 + 92.IBPluginDependency + 92.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + {{518, 723}, {216, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{596, 852}, {216, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{617, 609}, {132, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{522, 812}, {146, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{531, 606}, {64, 6}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{436, 809}, {64, 6}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{530, 483}, {275, 83}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {275, 83}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{287, 503}, {243, 243}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{197, 734}, {243, 243}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{530, 483}, {153, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {167, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{530, 483}, {241, 103}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {241, 103}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{447, 673}, {197, 73}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{525, 802}, {197, 73}} + {{101, 746}, {507, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + {74, 862} + {{11, 977}, {478, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + {{397, 703}, {234, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + {{475, 832}, {234, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{530, 483}, {177, 63}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{440, 714}, {177, 63}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{490, 307}, {480, 270}} + com.apple.InterfaceBuilder.CocoaPlugin + {{490, 307}, {480, 270}} + + {{11, 666}, {480, 270}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{113, 563}, {245, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{23, 794}, {245, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{418, 469}, {199, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{323, 672}, {199, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + YES + + + YES + + + + + YES + + YES + + + YES + + + + 462 + + + + YES + + FirstResponder + NSObject + + testAction: + id + + + IBUserSource + + + + + + 0 + + 3 + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/English.lproj/InfoPlist.strings b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..7f81cad945a1abf774b17eb4993e09d6fd026a2c GIT binary patch literal 472 zcmb7=-wVNT6vfZ8zhZepGCV1Hp|Fxf$?MGgw(r_d{PFl~lcK$7ZTIfpbI(2JJ|DI! zvNV#BCs#-9beFFcwJR}FOvNZ5TEsP9hrcy>O<{_Ub*6d%eM?al*(&h#)K^y*&?|7h zX4*0pfu4Uc&!|Lf3ABNy!&_7X_Byeh!!uy|{85oNy}*lMtFH;nMtd?ZRq5!2>P$uA z?$@RD-dv^A0~g{c(Y8T*;<5x!nb<^KT`jT!C__JSnBB%hd!~Gh=OGt3aoIpq5H6}* PEmL$Jf95`~^WWwd +static BOOL ImportProjectFile(NSMutableDictionary *attributes, + NSString *pathToFile) { + pathToFile = [pathToFile stringByAppendingPathComponent:@"project.pbxproj"]; + NSMutableSet *filenames = [[[NSMutableSet alloc] init] autorelease]; + NSMutableSet *comments = [[[NSMutableSet alloc] init] autorelease]; + BOOL wasGood = NO; + NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:pathToFile]; + if (dict) { + NSDictionary *objects = [dict objectForKey:@"objects"]; + if (objects) { + NSEnumerator *objEnumerator = [objects objectEnumerator]; + NSDictionary *object; + while ((object = [objEnumerator nextObject])) { + NSString *isaType = [object objectForKey:@"isa"]; + if ([isaType caseInsensitiveCompare:@"PBXFileReference"] == NSOrderedSame) { + NSString *path = [object objectForKey:@"path"]; + if (path) { + [filenames addObject:[path lastPathComponent]]; + } + } else if ([isaType caseInsensitiveCompare:@"PBXNativeTarget"] == NSOrderedSame) { + NSString *name = [object objectForKey:@"name"]; + if (name) { + [filenames addObject:name]; + } + name = [object objectForKey:@"productName"]; + if (name) { + [filenames addObject:name]; + } + } + NSString *comment = [object objectForKey:@"comments"]; + if (comment) { + [comments addObject:comment]; + } + } + } + } + if ([filenames count]) { + NSString *description = [[filenames allObjects] componentsJoinedByString:@"\n"]; + [attributes setObject:description forKey:(NSString*)kMDItemDescription]; + wasGood = YES; + } + if ([comments count]) { + NSString *comment = [[comments allObjects] componentsJoinedByString:@"\n"]; + [attributes setObject:comment forKey:(NSString*)kMDItemComment]; + wasGood = YES; + } + return wasGood; +} + +// Currently grabs all the filenames, target names, and product names +// and sticks them into kMDItemDescription. +// It also grabs all of the comments and sticks them into kMDItemComment. +Boolean GetMetadataForFile(void* interface, + CFMutableDictionaryRef cfAttributes, + CFStringRef contentTypeUTI, + CFStringRef cfPathToFile) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSMutableDictionary *attributes = (NSMutableDictionary*)cfAttributes; + NSString *pathToFile = (NSString*)cfPathToFile; + BOOL wasGood = NO; + if (UTTypeConformsTo(contentTypeUTI, CFSTR("com.apple.xcode.project"))) { + wasGood = ImportProjectFile(attributes, pathToFile); + } + [pool release]; + return wasGood == NO ? FALSE : TRUE; +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/Info.plist b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/Info.plist new file mode 100644 index 00000000..def1f7f7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeRole + MDImporter + LSItemContentTypes + + com.apple.xcode.project + + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleName + ${PRODUCT_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.google.spotlightimporter.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleVersion + 1.0 + CFPlugInDynamicRegisterFunction + + CFPlugInDynamicRegistration + NO + CFPlugInFactories + + 1CDB2B3C-CD6F-407D-9217-230E6DED8B00 + MetadataImporterPluginFactory + + CFPlugInTypes + + 8B08C4BF-415B-11D8-B3F9-0003936726FC + + 1CDB2B3C-CD6F-407D-9217-230E6DED8B00 + + + CFPlugInUnloadFunction + + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/PluginID.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/PluginID.h new file mode 100644 index 00000000..69c7a279 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/PluginID.h @@ -0,0 +1,19 @@ +// +// PluginID.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#define PLUGIN_ID "1CDB2B3C-CD6F-407D-9217-230E6DED8B00" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/ReadMe.rtf b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/ReadMe.rtf new file mode 100644 index 00000000..bd2eb697 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/ReadMe.rtf @@ -0,0 +1,31 @@ +{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf330 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 XcodeProject Spotlight Plugin\ +\ +Copyright 2008 Google Inc.\ +\ +Licensed under the Apache License, Version 2.0 (the "License"); you may not\ +use this file except in compliance with the License. You may obtain a copy\ +of the License at\ +\ +http://www.apache.org/licenses/LICENSE-2.0\ + \ +Unless required by applicable law or agreed to in writing, software\ +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\ +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\ +License for the specific language governing permissions and limitations under\ +the License.\ +\ +-----------------------\ +\ +This is a spotlight importer for Xcode Projects. \ +Makes it easy for you to search xcode project for specific files they include\ +or text in the project comments.\ +\ +To install the spotlight plugin, please copy it into /Library/Spotlight or ~/Library/Spotlight.\ +\ +It is part of the Google Toolbox For Mac project\ +http://code.google.com/p/google-toolbox-for-mac/} \ No newline at end of file diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/schema.xml b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/schema.xml new file mode 100644 index 00000000..cd3f3f7c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/SpotlightPlugins/XcodeProject/schema.xml @@ -0,0 +1,31 @@ + + + + + + + + kMDItemComment kMDItemDescription + + + + + + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/TigerGcov/libgcov_readme.html b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/TigerGcov/libgcov_readme.html new file mode 100644 index 00000000..fc381a70 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/TigerGcov/libgcov_readme.html @@ -0,0 +1,11 @@ + + + + libgcov_readme.html + + + + + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTest-Info.plist b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTest-Info.plist new file mode 100644 index 00000000..71daf7db --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTest-Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.google.${PRODUCT_NAME} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMAppKit+UnitTesting.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMAppKit+UnitTesting.h new file mode 100644 index 00000000..016da7e6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMAppKit+UnitTesting.h @@ -0,0 +1,144 @@ +// +// GTMAppKit+UnitTesting.m +// +// Categories for making unit testing of graphics/UI easier. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMNSObject+UnitTesting.h" + +// Categories for making unit testing of graphics/UI easier. +// Allows you to take a state/images of instances of AppKit classes. +// See GTMNSObject+UnitTesting.h for details. + +@interface NSApplication (GTMUnitTestingAdditions) +@end + +@interface NSWindow (GTMUnitTestingAdditions) +@end + +@interface NSControl (GTMUnitTestingAdditions) +@end + +@interface NSTextField (GTMUnitTestingAdditions) +@end + +@interface NSCell (GTMUnitTestingAdditions) +@end + +@interface NSImage (GTMUnitTestingAdditions) +@end + +@interface NSMenu (GTMUnitTestingAdditions) +@end + +@interface NSMenuItem (GTMUnitTestingAdditions) +@end + +@protocol GTMUnitTestViewDrawer; + +// Fails when the |a1|'s drawing in an area |a2| does not equal the image file named |a3|. +// See the description of the -gtm_pathForImageNamed method +// to understand how |a3| is found and written out. +// See the description of the GTMUnitTestView for a better idea +// how the view works. +// Implemented as a macro to match the rest of the SenTest macros. +// +// Args: +// a1: The object that implements the GTMUnitTestViewDrawer protocol +// that is doing the drawing. +// a2: The size of the drawing +// a3: The name of the image file to check against. +// Do not include the extension +// a4: contextInfo to pass to drawer +// description: A format string as in the printf() function. +// Can be nil or an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +// + +#define GTMAssertDrawingEqualToImageNamed(a1, a2, a3, a4, description, ...) \ + do { \ + id a1Drawer = (a1); \ + NSSize a2Size = (a2); \ + NSString* a3String = (a3); \ + void *a4ContextInfo = (a4); \ + NSRect frame = NSMakeRect(0, 0, a2Size.width, a2Size.height); \ + GTMUnitTestView *view = [[[GTMUnitTestView alloc] initWithFrame:frame drawer:a1Drawer contextInfo:a4ContextInfo] autorelease]; \ + GTMAssertObjectImageEqualToImageNamed(view, a3String, STComposeString(description, ##__VA_ARGS__)); \ + } while(0) + +// Category for making unit testing of graphics/UI easier. + +// Allows you to take a state of a view. Supports both image and state. +// See NSObject+UnitTesting.h for details. +@interface NSView (GTMUnitTestingAdditions) +// Returns whether unitTestEncodeState should recurse into subviews +// +// If you have "Full keyboard access" in the +// Keyboard & Mouse > Keyboard Shortcuts preferences pane set to "Text boxes +// and Lists only" that Apple adds a set of subviews to NSTextFields. So in the +// case of NSTextFields we don't want to recurse into their subviews. There may +// be other cases like this, so instead of specializing unitTestEncodeState: to +// look for NSTextFields, NSTextFields will just not allow us to recurse into +// their subviews. +// +// Returns: +// should unitTestEncodeState pick up subview state. +- (BOOL)gtm_shouldEncodeStateForSubviews; + +@end + +// A view that allows you to delegate out drawing using the formal +// GTMUnitTestViewDelegate protocol +// This is useful when writing up unit tests for visual elements. +// Your test will often end up looking like this: +// - (void)testFoo { +// GTMAssertDrawingEqualToFile(self, NSMakeSize(200, 200), @"Foo", nil, nil); +// } +// and your testSuite will also implement the unitTestViewDrawRect method to do +// it's actual drawing. The above creates a view of size 200x200 that draws +// it's content using |self|'s unitTestViewDrawRect method and compares it to +// the contents of the file Foo.tif to make sure it's valid +@interface GTMUnitTestView : NSView { + @private + id drawer_; // delegate for doing drawing (STRONG) + void* contextInfo_; // info passed in by user for them to use when drawing +} + +// Create a GTMUnitTestView. +// +// Args: +// rect: the area to draw. +// drawer: the object that will do the drawing via the GTMUnitTestViewDrawer +// protocol +// contextInfo: +- (id)initWithFrame:(NSRect)frame drawer:(id)drawer contextInfo:(void*)contextInfo; +@end + +/// \cond Protocols + +// Formal protocol for doing unit testing of views. See description of +// GTMUnitTestView for details. +@protocol GTMUnitTestViewDrawer + +// Draw the view. Equivalent to drawRect on a standard NSView. +// +// Args: +// rect: the area to draw. +- (void)gtm_unitTestViewDrawRect:(NSRect)rect contextInfo:(void*)contextInfo; +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMAppKit+UnitTesting.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMAppKit+UnitTesting.m new file mode 100644 index 00000000..c35d07d8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMAppKit+UnitTesting.m @@ -0,0 +1,341 @@ +// +// GTMAppKit+UnitTesting.m +// +// Categories for making unit testing of graphics/UI easier. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" +#import "GTMAppKit+UnitTesting.h" +#import "GTMGeometryUtils.h" +#import "GTMMethodCheck.h" +#import "GTMGarbageCollection.h" + +#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 + #define ENCODE_NSINTEGER(coder, i, key) [(coder) encodeInt:(i) forKey:(key)] +#else + #define ENCODE_NSINTEGER(coder, i, key) [(coder) encodeInteger:(i) forKey:(key)] +#endif + +@implementation NSApplication (GMUnitTestingAdditions) +GTM_METHOD_CHECK(NSObject, gtm_unitTestEncodeState:); + +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + [super gtm_unitTestEncodeState:inCoder]; + ENCODE_NSINTEGER(inCoder, [[self mainWindow] windowNumber], @"ApplicationMainWindow"); + + // Descend down into the windows allowing them to store their state + NSWindow *window = nil; + int i = 0; + GTM_FOREACH_OBJECT(window, [self windows]) { + if ([window isVisible]) { + // Only record visible windows because invisible windows may be closing on us + // This appears to happen differently in 64 bit vs 32 bit, and items + // in the window may hold an extra retain count for a while until the + // event loop is spun. To avoid all this, we just don't record non + // visible windows. + // See rdar://5851458 for details. + [inCoder encodeObject:window forKey:[NSString stringWithFormat:@"Window %d", i]]; + i = i + 1; + } + } + + // and encode the menu bar + NSMenu *mainMenu = [self mainMenu]; + if (mainMenu) { + [inCoder encodeObject:mainMenu forKey:@"MenuBar"]; + } +} +@end + +@implementation NSWindow (GMUnitTestingAdditions) + +- (CGImageRef)gtm_unitTestImage { + return [[[self contentView] superview] gtm_unitTestImage]; +} + +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + [super gtm_unitTestEncodeState:inCoder]; + [inCoder encodeObject:[self title] forKey:@"WindowTitle"]; + [inCoder encodeBool:[self isVisible] forKey:@"WindowIsVisible"]; + // Do not record if window is key, because users running unit tests + // and clicking around to other apps, could change this mid test causing + // issues. + // [inCoder encodeBool:[self isKeyWindow] forKey:@"WindowIsKey"]; + [inCoder encodeBool:[self isMainWindow] forKey:@"WindowIsMain"]; + [inCoder encodeObject:[self contentView] forKey:@"WindowContent"]; +} + +@end + +@implementation NSControl (GTMUnitTestingAdditions) + +// Encodes the state of an object in a manner suitable for comparing +// against a master state file so we can determine whether the +// object is in a suitable state. +// +// Arguments: +// inCoder - the coder to encode our state into +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + [super gtm_unitTestEncodeState:inCoder]; + [inCoder encodeObject:[self class] forKey:@"ControlType"]; + [inCoder encodeObject:[self objectValue] forKey:@"ControlValue"]; + [inCoder encodeObject:[self selectedCell] forKey:@"ControlSelectedCell"]; + ENCODE_NSINTEGER(inCoder, [self tag], @"ControlTag"); + [inCoder encodeBool:[self isEnabled] forKey:@"ControlIsEnabled"]; +} + +@end + +@implementation NSTextField (GTMUnitTestingAdditions) + +- (BOOL)gtm_shouldEncodeStateForSubviews { + return NO; +} + +@end + +@implementation NSCell (GTMUnitTestingAdditions) + +// Encodes the state of an object in a manner suitable for comparing +// against a master state file so we can determine whether the +// object is in a suitable state. +// +// Arguments: +// inCoder - the coder to encode our state into +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + [super gtm_unitTestEncodeState:inCoder]; + BOOL isImageCell = NO; + if ([self hasValidObjectValue]) { + id val = [self objectValue]; + [inCoder encodeObject:val forKey:@"CellValue"]; + isImageCell = [val isKindOfClass:[NSImage class]]; + } + if (!isImageCell) { + // Image cells have a title that includes addresses that aren't going + // to be constant, so we don't encode them. All the info we need + // is going to be in the CellValue encoding. + [inCoder encodeObject:[self title] forKey:@"CellTitle"]; + } + ENCODE_NSINTEGER(inCoder, [self state], @"CellState"); + ENCODE_NSINTEGER(inCoder, [self tag], @"CellTag"); +} + +@end + +@implementation NSImage (GTMUnitTestingAdditions) + +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + [super gtm_unitTestEncodeState:inCoder]; + [inCoder encodeObject:NSStringFromSize([self size]) forKey:@"ImageSize"]; + [inCoder encodeObject:[self name] forKey:@"ImageName"]; +} + +- (CGImageRef)gtm_unitTestImage { + // Create up a context + NSSize size = [self size]; + NSRect rect = GTMNSRectOfSize(size); + CGSize cgSize = GTMNSSizeToCGSize(size); + CGContextRef contextRef = GTMCreateUnitTestBitmapContextOfSizeWithData(cgSize, + NULL); + NSGraphicsContext *bitmapContext + = [NSGraphicsContext graphicsContextWithGraphicsPort:contextRef flipped:NO]; + _GTMDevAssert(bitmapContext, @"Couldn't create ns bitmap context"); + + [NSGraphicsContext saveGraphicsState]; + [NSGraphicsContext setCurrentContext:bitmapContext]; + [self drawInRect:rect fromRect:rect operation:NSCompositeCopy fraction:1.0]; + + CGImageRef image = CGBitmapContextCreateImage(contextRef); + CFRelease(contextRef); + [NSGraphicsContext restoreGraphicsState]; + return (CGImageRef)GTMCFAutorelease(image); +} + +@end + +@implementation NSMenu (GTMUnitTestingAdditions) + +// Encodes the state of an object in a manner suitable for comparing +// against a master state file so we can determine whether the +// object is in a suitable state. +// +// Arguments: +// inCoder - the coder to encode our state into +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + [super gtm_unitTestEncodeState:inCoder]; + // Hack here to work around + // rdar://5881796 Application menu item title wrong when accessed programatically + // which causes us to have different results on x86_64 vs x386. + // Hack is braced intentionally. We don't record the title of the + // "application" menu or it's menu title because they are wrong on 32 bit. + // They appear to work right on 64bit. + { + NSMenu *mainMenu = [NSApp mainMenu]; + NSMenu *appleMenu = [[mainMenu itemAtIndex:0] submenu]; + if (![self isEqual:appleMenu]) { + [inCoder encodeObject:[self title] forKey:@"MenuTitle"]; + } + } + // Descend down into the menuitems allowing them to store their state + NSMenuItem *menuItem = nil; + int i = 0; + GTM_FOREACH_OBJECT(menuItem, [self itemArray]) { + [inCoder encodeObject:menuItem + forKey:[NSString stringWithFormat:@"MenuItem %d", i]]; + ++i; + } +} + +@end + +@implementation NSMenuItem (GTMUnitTestingAdditions) + +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + [super gtm_unitTestEncodeState:inCoder]; + // Hack here to work around + // rdar://5881796 Application menu item title wrong when accessed programatically + // which causes us to have different results on x86_64 vs x386. + // See comment above. + { + NSMenu *mainMenu = [NSApp mainMenu]; + NSMenuItem *appleMenuItem = [mainMenu itemAtIndex:0]; + if (![self isEqual:appleMenuItem]) { + [inCoder encodeObject:[self title] forKey:@"MenuItemTitle"]; + } + } + [inCoder encodeObject:[self keyEquivalent] forKey:@"MenuItemKeyEquivalent"]; + [inCoder encodeBool:[self isSeparatorItem] forKey:@"MenuItemIsSeparator"]; + ENCODE_NSINTEGER(inCoder, [self state], @"MenuItemState"); + [inCoder encodeBool:[self isEnabled] forKey:@"MenuItemIsEnabled"]; + [inCoder encodeBool:[self isAlternate] forKey:@"MenuItemIsAlternate"]; + [inCoder encodeObject:[self toolTip] forKey:@"MenuItemTooltip"]; + ENCODE_NSINTEGER(inCoder, [self tag], @"MenuItemTag"); + ENCODE_NSINTEGER(inCoder, [self indentationLevel], @"MenuItemIndentationLevel"); + + // Do our submenu if neccessary + if ([self hasSubmenu]) { + [inCoder encodeObject:[self submenu] forKey:@"MenuItemSubmenu"]; + } +} + +@end + +// A view that allows you to delegate out drawing using the formal +// GTMUnitTestViewDelegate protocol above. This is useful when writing up unit +// tests for visual elements. +// Your test will often end up looking like this: +// - (void)testFoo { +// GTMAssertDrawingEqualToFile(self, NSMakeSize(200, 200), @"Foo", nil, nil); +// } +// and your testSuite will also implement the unitTestViewDrawRect method to do +// it's actual drawing. The above creates a view of size 200x200 that draws +// it's content using |self|'s unitTestViewDrawRect method and compares it to +// the contents of the file Foo.tif to make sure it's valid +@implementation GTMUnitTestView + +- (id)initWithFrame:(NSRect)frame + drawer:(id)drawer + contextInfo:(void*)contextInfo { + self = [super initWithFrame:frame]; + if (self != nil) { + drawer_ = [drawer retain]; + contextInfo_ = contextInfo; + } + return self; +} + +- (void)dealloc { + [drawer_ release]; + [super dealloc]; +} + + +- (void)drawRect:(NSRect)rect { + [drawer_ gtm_unitTestViewDrawRect:rect contextInfo:contextInfo_]; +} + + +@end + +@implementation NSView (GTMUnitTestingAdditions) + +// Returns an image containing a representation of the object +// suitable for use in comparing against a master image. +// Does all of it's drawing with smoothfonts and antialiasing off +// to avoid issues with font smoothing settings and antialias differences +// between ppc and x86. +// +// Returns: +// an image of the object +- (CGImageRef)gtm_unitTestImage { + // Create up a context + NSRect bounds = [self bounds]; + CGSize cgSize = GTMNSSizeToCGSize(bounds.size); + CGContextRef contextRef = GTMCreateUnitTestBitmapContextOfSizeWithData(cgSize, + NULL); + NSGraphicsContext *bitmapContext + = [NSGraphicsContext graphicsContextWithGraphicsPort:contextRef flipped:NO]; + _GTMDevAssert(bitmapContext, @"Couldn't create ns bitmap context"); + + // Save our state and turn off font smoothing and antialias. + CGContextSaveGState(contextRef); + CGContextSetShouldSmoothFonts(contextRef, false); + CGContextSetShouldAntialias(contextRef, false); + [self displayRectIgnoringOpacity:bounds inContext:bitmapContext]; + + CGImageRef image = CGBitmapContextCreateImage(contextRef); + CFRelease(contextRef); + return (CGImageRef)GTMCFAutorelease(image); +} + +// Returns whether gtm_unitTestEncodeState should recurse into subviews +// of a particular view. +// If you have "Full keyboard access" in the +// Keyboard & Mouse > Keyboard Shortcuts preferences pane set to "Text boxes +// and Lists only" that Apple adds a set of subviews to NSTextFields. So in the +// case of NSTextFields we don't want to recurse into their subviews. There may +// be other cases like this, so instead of specializing gtm_unitTestEncodeState: to +// look for NSTextFields, NSTextFields will just not allow us to recurse into +// their subviews. +// +// Returns: +// should gtm_unitTestEncodeState pick up subview state. +- (BOOL)gtm_shouldEncodeStateForSubviews { + return YES; +} + +// Encodes the state of an object in a manner suitable for comparing +// against a master state file so we can determine whether the +// object is in a suitable state. +// +// Arguments: +// inCoder - the coder to encode our state into +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + [super gtm_unitTestEncodeState:inCoder]; + [inCoder encodeBool:[self isHidden] forKey:@"ViewIsHidden"]; + if ([self gtm_shouldEncodeStateForSubviews]) { + NSView *subview = nil; + int i = 0; + GTM_FOREACH_OBJECT(subview, [self subviews]) { + [inCoder encodeObject:subview forKey:[NSString stringWithFormat:@"ViewSubView %d", i]]; + i = i + 1; + } + } +} + +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMCALayer+UnitTesting.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMCALayer+UnitTesting.h new file mode 100644 index 00000000..b757ba91 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMCALayer+UnitTesting.h @@ -0,0 +1,46 @@ +// +// GTMCALayer+UnitTesting.h +// +// Code for making unit testing of graphics/UI easier. Generally you +// will only want to look at the macros: +// GTMAssertDrawingEqualToFile +// GTMAssertViewRepEqualToFile +// and the protocol GTMUnitTestCALayerDrawer. When using these routines +// make sure you are using device colors and not calibrated/generic colors +// or else your test graphics WILL NOT match across devices/graphics cards. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMNSObject+UnitTesting.h" + +// Category for making unit testing of graphics/UI easier. + +// Allows you to take a state of a view. Supports both image and state. +// See GTMNSObject+UnitTesting.h for details. +@interface CALayer (GTMUnitTestingAdditions) +// Returns whether gtm_unitTestEncodeState should recurse into sublayers +// +// Returns: +// should gtm_unitTestEncodeState pick up sublayer state. +- (BOOL)gtm_shouldEncodeStateForSublayers; +@end + +@interface NSObject (GTMCALayerUnitTestingDelegateMethods) +// Delegate method that allows a delegate for a layer to +// decide whether we should recurse +- (BOOL)gtm_shouldEncodeStateForSublayersOfLayer:(CALayer*)layer; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMCALayer+UnitTesting.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMCALayer+UnitTesting.m new file mode 100644 index 00000000..3ffa209e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMCALayer+UnitTesting.m @@ -0,0 +1,90 @@ +// +// GTMCALayer+UnitTesting.m +// +// Category for making unit testing of graphics/UI easier. +// Allows you to save a view out to a image file, and compare a view +// with a previously stored representation to make sure it hasn't changed. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMCALayer+UnitTesting.h" +#import "GTMGarbageCollection.h" + +@implementation CALayer (GTMUnitTestingAdditions) + +// Returns an image containing a representation of the object +// suitable for use in comparing against a master image. +// NB this means that all colors should be from "NSDevice" color space +// Does all of it's drawing with smoothfonts and antialiasing off +// to avoid issues with font smoothing settings and antialias differences +// between ppc and x86. +// +// Returns: +// an image of the object +- (CGImageRef)gtm_unitTestImage { + CGRect bounds = [self bounds]; + CGSize size = CGSizeMake(CGRectGetWidth(bounds), CGRectGetHeight(bounds)); + CGContextRef context = GTMCreateUnitTestBitmapContextOfSizeWithData(size, + NULL); + _GTMDevAssert(context, @"Couldn't create context"); + + // iPhone renders are flipped + CGAffineTransform transform = CGAffineTransformMakeTranslation(0, size.height); + transform = CGAffineTransformScale(transform, 1.0, -1.0); + CGContextConcatCTM(context, transform); + + [self renderInContext:context]; + CGImageRef image = CGBitmapContextCreateImage(context); + CFRelease(context); + return (CGImageRef)GTMCFAutorelease(image); +} + +// Encodes the state of an object in a manner suitable for comparing +// against a master state file so we can determine whether the +// object is in a suitable state. +// +// Arguments: +// inCoder - the coder to encode our state into +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + [super gtm_unitTestEncodeState:inCoder]; + [inCoder encodeBool:[self isHidden] forKey:@"LayerIsHidden"]; + [inCoder encodeBool:[self isDoubleSided] forKey:@"LayerIsDoublesided"]; + [inCoder encodeBool:[self isOpaque] forKey:@"LayerIsOpaque"]; + [inCoder encodeFloat:[self opacity] forKey:@"LayerOpacity"]; + // TODO: There is a ton more we can add here. What are we interested in? + if ([self gtm_shouldEncodeStateForSublayers]) { + int i = 0; + for (CALayer *subLayer in [self sublayers]) { + [inCoder encodeObject:subLayer + forKey:[NSString stringWithFormat:@"CALayerSubLayer %d", i]]; + i = i + 1; + } + } +} + +// Returns whether gtm_unitTestEncodeState should recurse into sublayers +// +// Returns: +// should gtm_unitTestEncodeState pick up sublayer state. +- (BOOL)gtm_shouldEncodeStateForSublayers { + BOOL value = YES; + if([self.delegate respondsToSelector:@selector(gtm_shouldEncodeStateForSublayersOfLayer:)]) { + value = [self.delegate gtm_shouldEncodeStateForSublayersOfLayer:self]; + } + return value; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMDevLogUnitTestingBridge.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMDevLogUnitTestingBridge.m new file mode 100644 index 00000000..3d2b84d0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMDevLogUnitTestingBridge.m @@ -0,0 +1,44 @@ +// +// GTMDevLogUnitTestingBridge.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#include "GTMUnitTestDevLog.h" + +// +// NOTE: Odds are this file should not be included in your project. It is +// only needed for some enhanced unit testing. +// +// By adding: +// #define _GTMDevLog _GTMUnitTestDevLog +// to your prefix header (like the GTM Framework does), this function then +// works to forward logging messages to the GTMUnitTestDevLog class to +// allow logging validation during unittest, otherwise the messages go to +// NSLog like normal. +// +// See GTMUnitTestDevLog.h for more information on checking logs in unittests. +// +void _GTMUnitTestDevLog(NSString *format, ...) { + Class devLogClass = NSClassFromString(@"GTMUnitTestDevLog"); + va_list argList; + va_start(argList, format); + if (devLogClass) { + [devLogClass log:format args:argList]; + } else { + NSLogv(format, argList); // COV_NF_LINE the class is in all our unittest setups + } + va_end(argList); +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.h new file mode 100644 index 00000000..4583b5d8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.h @@ -0,0 +1,38 @@ +// +// GTMIPhoneUnitTestDelegate.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +// Application delegate that runs all test methods in registered classes +// extending SenTestCase. The application is terminated afterwards. +// You can also run the tests directly from your application by invoking +// runTests and clean up, restore data, etc. before the application +// terminates. +@interface GTMIPhoneUnitTestDelegate : NSObject { + @private + NSUInteger totalFailures_; + NSUInteger totalSuccesses_; +} +// Runs through all the registered classes and runs test methods on any +// that are subclasses of SenTestCase. Prints results and run time to +// the default output. +- (void)runTests; +// Fetch the number of successes or failures from the last runTests. +- (NSUInteger)totalSuccesses; +- (NSUInteger)totalFailures; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.m new file mode 100644 index 00000000..39de1f56 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.m @@ -0,0 +1,206 @@ +// +// GTMIPhoneUnitTestDelegate.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMIPhoneUnitTestDelegate.h" + +#import "GTMDefines.h" +#if !GTM_IPHONE_SDK +#error GTMIPhoneUnitTestDelegate for iPhone only +#endif +#import +#import +#import +#import "GTMSenTestCase.h" + +// Used for sorting methods below +static int MethodSort(const void *a, const void *b) { + const char *nameA = sel_getName(method_getName(*(Method*)a)); + const char *nameB = sel_getName(method_getName(*(Method*)b)); + return strcmp(nameA, nameB); +} + +// Return YES if class is subclass (1 or more generations) of SenTestCase +static BOOL IsTestFixture(Class aClass) { + BOOL iscase = NO; + Class testCaseClass = [SenTestCase class]; + Class superclass; + for (superclass = aClass; + !iscase && superclass; + superclass = class_getSuperclass(superclass)) { + iscase = superclass == testCaseClass ? YES : NO; + } + return iscase; +} + +@implementation GTMIPhoneUnitTestDelegate + +// Run through all the registered classes and run test methods on any +// that are subclasses of SenTestCase. Terminate the application upon +// test completion. +- (void)applicationDidFinishLaunching:(UIApplication *)application { + [self runTests]; + + if (!getenv("GTM_DISABLE_TERMINATION")) { + // To help using xcodebuild, make the exit status 0/1 to signal the tests + // success/failure. + int exitStatus = (([self totalFailures] == 0U) ? 0 : 1); + exit(exitStatus); + } +} + +// Run through all the registered classes and run test methods on any +// that are subclasses of SenTestCase. Print results and run time to +// the default output. +- (void)runTests { + int count = objc_getClassList(NULL, 0); + NSMutableData *classData + = [NSMutableData dataWithLength:sizeof(Class) * count]; + Class *classes = (Class*)[classData mutableBytes]; + _GTMDevAssert(classes, @"Couldn't allocate class list"); + objc_getClassList(classes, count); + totalFailures_ = 0; + totalSuccesses_ = 0; + NSString *suiteName = [[NSBundle mainBundle] bundlePath]; + NSDate *suiteStartDate = [NSDate date]; + NSString *suiteStartString + = [NSString stringWithFormat:@"Test Suite '%@' started at %@\n", + suiteName, suiteStartDate]; + fputs([suiteStartString UTF8String], stderr); + fflush(stderr); + for (int i = 0; i < count; ++i) { + Class currClass = classes[i]; + if (IsTestFixture(currClass)) { + NSDate *fixtureStartDate = [NSDate date]; + NSString *fixtureName = NSStringFromClass(currClass); + NSString *fixtureStartString + = [NSString stringWithFormat:@"Test Suite '%@' started at %@\n", + fixtureName, fixtureStartDate]; + int fixtureSuccesses = 0; + int fixtureFailures = 0; + fputs([fixtureStartString UTF8String], stderr); + fflush(stderr); + id testcase = [[currClass alloc] init]; + _GTMDevAssert(testcase, @"Unable to instantiate Test Suite: '%@'\n", + fixtureName); + unsigned int methodCount; + Method *methods = class_copyMethodList(currClass, &methodCount); + if (!methods) { + // If the class contains no methods, head on to the next class + NSString *output = [NSString stringWithFormat:@"Test Suite '%@' " + @"finished at %@.\nExecuted 0 tests, with 0 " + @"failures (0 unexpected) in 0 (0) seconds\n", + fixtureName, fixtureStartDate]; + + fputs([output UTF8String], stderr); + continue; + } + // This handles disposing of methods for us even if an + // exception should fly. + [NSData dataWithBytesNoCopy:methods + length:sizeof(Method) * methodCount]; + // Sort our methods so they are called in Alphabetical order just + // because we can. + qsort(methods, methodCount, sizeof(Method), MethodSort); + for (size_t j = 0; j < methodCount; ++j) { + Method currMethod = methods[j]; + SEL sel = method_getName(currMethod); + char *returnType = NULL; + const char *name = sel_getName(sel); + // If it starts with test, takes 2 args (target and sel) and returns + // void run it. + if (strstr(name, "test") == name) { + returnType = method_copyReturnType(currMethod); + if (returnType) { + // This handles disposing of returnType for us even if an + // exception should fly. Length +1 for the terminator, not that + // the length really matters here, as we never reference inside + // the data block. + [NSData dataWithBytesNoCopy:returnType + length:strlen(returnType) + 1]; + } + } + if (returnType // True if name starts with "test" + && strcmp(returnType, @encode(void)) == 0 + && method_getNumberOfArguments(currMethod) == 2) { + BOOL failed = NO; + NSDate *caseStartDate = [NSDate date]; + @try { + [testcase performTest:sel]; + } @catch (NSException *exception) { + failed = YES; + } + if (failed) { + fixtureFailures += 1; + } else { + fixtureSuccesses += 1; + } + NSTimeInterval caseEndTime + = [[NSDate date] timeIntervalSinceDate:caseStartDate]; + NSString *caseEndString + = [NSString stringWithFormat:@"Test Case '-[%@ %s]' %@ (%0.3f " + @"seconds).\n", + fixtureName, name, + failed ? @"failed" : @"passed", + caseEndTime]; + fputs([caseEndString UTF8String], stderr); + fflush(stderr); + } + } + [testcase release]; + NSDate *fixtureEndDate = [NSDate date]; + NSTimeInterval fixtureEndTime + = [fixtureEndDate timeIntervalSinceDate:fixtureStartDate]; + NSString *fixtureEndString + = [NSString stringWithFormat:@"Test Suite '%@' finished at %@.\n" + @"Executed %d tests, with %d failures (%d " + @"unexpected) in %0.3f (%0.3f) seconds\n\n", + fixtureName, fixtureEndDate, + fixtureSuccesses + fixtureFailures, + fixtureFailures, fixtureFailures, + fixtureEndTime, fixtureEndTime]; + + fputs([fixtureEndString UTF8String], stderr); + fflush(stderr); + totalSuccesses_ += fixtureSuccesses; + totalFailures_ += fixtureFailures; + } + } + NSDate *suiteEndDate = [NSDate date]; + NSTimeInterval suiteEndTime + = [suiteEndDate timeIntervalSinceDate:suiteStartDate]; + NSString *suiteEndString + = [NSString stringWithFormat:@"Test Suite '%@' finished at %@.\n" + @"Executed %d tests, with %d failures (%d " + @"unexpected) in %0.3f (%0.3f) seconds\n\n", + suiteName, suiteEndDate, + totalSuccesses_ + totalFailures_, + totalFailures_, totalFailures_, + suiteEndTime, suiteEndTime]; + fputs([suiteEndString UTF8String], stderr); + fflush(stderr); +} + +- (NSUInteger)totalSuccesses { + return totalSuccesses_; +} + +- (NSUInteger)totalFailures { + return totalFailures_; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestMain.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestMain.m new file mode 100644 index 00000000..2a0a70d2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestMain.m @@ -0,0 +1,33 @@ +// +// GTMIPhoneUnitTestMain.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" +#if !GTM_IPHONE_SDK + #error GTMIPhoneUnitTestMain for iPhone only +#endif +#import + +// Creates an application that runs all tests from classes extending +// SenTestCase, outputs results and test run time, and terminates right +// afterwards. +int main(int argc, char *argv[]) { + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + int retVal = UIApplicationMain(argc, argv, nil, @"GTMIPhoneUnitTestDelegate"); + [pool release]; + return retVal; +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+BindingUnitTesting.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+BindingUnitTesting.h new file mode 100644 index 00000000..55c3dfe9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+BindingUnitTesting.h @@ -0,0 +1,120 @@ +// +// GTMNSObject+BindingUnitTesting.h +// +// Utilities for doing advanced unittesting with object bindings. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#include + +// Utility functions for GTMTestExposedBindings Macro. Don't use it directly +// but use the macro below instead +BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object, + NSArray **errors); + +// Tests the setters and getters for exposed bindings +// For objects that expose bindings, this tests them for you, saving you from +// having to write a whole pile of set/get test code if you add binding support. +// You will need to implement valueClassForBinding: for your bindings, +// and you may possibly want to implement unitTestExposedBindingsToIgnore +// and unitTestExposedBindingsTestValues. See descriptions of those +// methods below for details. +// Implemented as a macro to match the rest of the SenTest macros. +// +// Args: +// a1: The object to be checked. +// description: A format string as in the printf() function. +// Can be nil or an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +// +#define GTMTestExposedBindings(a1, description, ...) \ +do { \ + NSObject *a1Object = (a1); \ + NSArray *errors = nil; \ + BOOL isGood = GTMDoExposedBindingsFunctionCorrectly(a1Object, &errors); \ + if (!isGood) { \ + NSString *failString; \ + GTM_FOREACH_OBJECT(failString, errors) { \ + if (description) { \ + STFail(@"%@: %@", failString, STComposeString(description, ##__VA_ARGS__)); \ + } else { \ + STFail(@"%@", failString); \ + } \ + } \ + } \ +} while(0) + +// Utility class for setting up Binding Tests. Basically a pair of a value to +// set a binding to, followed by the expected return value. +// See description of gtm_unitTestExposedBindingsTestValues: below +// for example of usage. +@interface GTMBindingUnitTestData : NSObject { + @private + id valueToSet_; + id expectedValue_; +} + ++ (id)testWithIdentityValue:(id)value; ++ (id)testWithValue:(id)value expecting:(id)expecting; +- (id)initWithValue:(id)value expecting:(id)expecting; +- (id)valueToSet; +- (id)expectedValue; +@end + +@interface NSObject (GTMBindingUnitTestingAdditions) +// Allows you to ignore certain bindings when running GTMTestExposedBindings +// If you have bindings you want to ignore, add them to the array returned +// by this method. The standard way to implement this would be: +// - (NSMutableArray*)unitTestExposedBindingsToIgnore { +// NSMutableArray *array = [super unitTestExposedBindingsToIgnore]; +// [array addObject:@"bindingToIgnore1"]; +// ... +// return array; +// } +// The NSObject implementation by default will ignore NSFontBoldBinding, +// NSFontFamilyNameBinding, NSFontItalicBinding, NSFontNameBinding and +// NSFontSizeBinding if your exposed bindings contains NSFontBinding because +// the NSFont*Bindings are NOT KVC/KVO compliant. +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore; + +// Allows you to set up test values for your different bindings. +// if you have certain values you want to test against your bindings, add +// them to the array returned by this method. The array is an array of +// GTMBindingUnitTestData. +// The standard way to implement this would be: +// - (NSMutableArray*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding { +// NSMutableArray *dict = [super unitTestExposedBindingsTestValues:binding]; +// if ([binding isEqualToString:@"myBinding"]) { +// MySpecialBindingValueSet *value +// = [[[MySpecialBindingValueSet alloc] init] autorelease]; +// [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; +// ... +// else if ([binding isEqualToString:@"myBinding2"]) { +// ... +// } +// return array; +// } +// The NSObject implementation handles many of the default bindings, and +// gives you a reasonable set of test values to start. +// See the implementation for the current list of bindings, and values that we +// set for those bindings. +- (NSMutableArray*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding; + +// A special version of isEqualTo to test whether two binding values are equal +// by default it calls directly to isEqualTo: but can be overridden for special +// cases (like NSImages) where the standard isEqualTo: isn't sufficient. +- (BOOL)gtm_unitTestIsEqualTo:(id)value; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+BindingUnitTesting.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+BindingUnitTesting.m new file mode 100644 index 00000000..d064a479 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+BindingUnitTesting.m @@ -0,0 +1,568 @@ +// +// GTMNSObject+BindingUnitTesting.m +// +// An informal protocol for doing advanced binding unittesting with objects. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" +#import "GTMNSObject+BindingUnitTesting.h" +#import "GTMSystemVersion.h" + +BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object, + NSArray **errors) { + NSMutableArray *errorArray = [NSMutableArray array]; + if (errors) { + *errors = nil; + } + NSArray *bindings = [object exposedBindings]; + if ([bindings count]) { + NSArray *bindingsToIgnore = [object gtm_unitTestExposedBindingsToIgnore]; + NSString *bindingKey; + GTM_FOREACH_OBJECT(bindingKey, bindings) { + if (![bindingsToIgnore containsObject:bindingKey]) { + Class theClass = [object valueClassForBinding:bindingKey]; + if (!theClass) { + NSString *error + = [NSString stringWithFormat:@"%@ should have valueClassForBinding '%@'", + object, bindingKey]; + [errorArray addObject:error]; + continue; + } + @try { + @try { + [object valueForKey:bindingKey]; + } + @catch (NSException *e) { + _GTMDevLog(@"%@ is not key value coding compliant for key %@", + object, bindingKey); + continue; + } // COV_NF_LINE - compiler bug + NSArray *testValues + = [object gtm_unitTestExposedBindingsTestValues:bindingKey]; + GTMBindingUnitTestData *testData; + GTM_FOREACH_OBJECT(testData, testValues) { + id valueToSet = [testData valueToSet]; + [object setValue:valueToSet forKey:bindingKey]; + id valueReceived = [object valueForKey:bindingKey]; + id desiredValue = [testData expectedValue]; + if (![desiredValue gtm_unitTestIsEqualTo:valueReceived]) { + NSString *error + = [NSString stringWithFormat:@"%@ unequal to expected %@ for binding '%@'", + valueReceived, desiredValue, bindingKey]; + [errorArray addObject:error]; + continue; + } + } + } + @catch(NSException *e) { + NSString *error + = [NSString stringWithFormat:@"%@:%@-> Binding %@", + [e name], [e reason], bindingKey]; + [errorArray addObject:error]; + } // COV_NF_LINE - compiler bug + } + } + } else { + NSString *error = + [NSString stringWithFormat:@"%@ does not have any exposed bindings", + object]; + [errorArray addObject:error]; + } + if (errors) { + *errors = errorArray; + } + return [errorArray count] == 0; +} + +@implementation GTMBindingUnitTestData ++ (id)testWithIdentityValue:(id)value { + return [self testWithValue:value expecting:value]; +} + ++ (id)testWithValue:(id)value expecting:(id)expecting { + return [[[self alloc] initWithValue:value expecting:expecting] autorelease]; +} + +- (id)initWithValue:(id)value expecting:(id)expecting { + if ((self = [super init])) { + valueToSet_ = [value retain]; + expectedValue_ = [expecting retain]; + } + return self; +} + +- (BOOL)isEqual:(id)object { + BOOL isEqual = [object isMemberOfClass:[self class]]; + if (isEqual) { + id objValue = [object valueToSet]; + id objExpect = [object expectedValue]; + isEqual = (((valueToSet_ == objValue) || ([valueToSet_ isEqual:objValue])) + && ((expectedValue_ == objExpect) || ([expectedValue_ isEqual:objExpect]))); + } + return isEqual; +} + +- (NSUInteger)hash { + return [valueToSet_ hash] + [expectedValue_ hash]; +} + +- (void)dealloc { + [valueToSet_ release]; + [expectedValue_ release]; + [super dealloc]; +} + +- (id)valueToSet { + return valueToSet_; +} + +- (id)expectedValue { + return expectedValue_; +} +@end + +@implementation NSObject (GTMBindingUnitTestingAdditions) + +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [NSMutableArray arrayWithObject:NSValueBinding]; + if ([[self exposedBindings] containsObject:NSFontBinding]) { + NSString *fontBindings[] = { NSFontBoldBinding, NSFontFamilyNameBinding, + NSFontItalicBinding, NSFontNameBinding, NSFontSizeBinding }; + for (size_t i = 0; i < sizeof(fontBindings) / sizeof(NSString*); ++i) { + [array addObject:fontBindings[i]]; + } + } + return array; +} + +- (NSMutableArray*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding { + + NSMutableArray *array = [NSMutableArray array]; + id value = [self valueForKey:binding]; + + // Always test identity if possible + if (value) { + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } + + // Now some default test values for a variety of bindings to make + // sure that we cover all the bases and save other people writing lots of + // duplicate test code. + + // If anybody can think of more to add, please go nuts. + if ([binding isEqualToString:NSAlignmentBinding]) { + value = [NSNumber numberWithInt:NSLeftTextAlignment]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithInt:NSRightTextAlignment]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithInt:NSCenterTextAlignment]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithInt:NSJustifiedTextAlignment]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithInt:NSNaturalTextAlignment]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + NSNumber *valueToSet = [NSNumber numberWithInt:500]; + [array addObject:[GTMBindingUnitTestData testWithValue:valueToSet + expecting:value]]; + valueToSet = [NSNumber numberWithInt:-1]; + [array addObject:[GTMBindingUnitTestData testWithValue:valueToSet + expecting:value]]; + } else if ([binding isEqualToString:NSAlternateImageBinding] || + [binding isEqualToString:NSImageBinding] || + [binding isEqualToString:NSMixedStateImageBinding] || + [binding isEqualToString:NSOffStateImageBinding] || + [binding isEqualToString:NSOnStateImageBinding]) { + // This handles all image bindings + value = [NSImage imageNamed:@"NSApplicationIcon"]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else if ([binding isEqualToString:NSAnimateBinding] || + [binding isEqualToString:NSDocumentEditedBinding] || + [binding isEqualToString:NSEditableBinding] || + [binding isEqualToString:NSEnabledBinding] || + [binding isEqualToString:NSHiddenBinding] || + [binding isEqualToString:NSVisibleBinding] || + [binding isEqualToString:NSIsIndeterminateBinding] || + // NSTranparentBinding 10.5 only + [binding isEqualToString:@"transparent"]) { + // This handles all bool value bindings + value = [NSNumber numberWithBool:YES]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithBool:NO]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else if ([binding isEqualToString:NSAlternateTitleBinding] || + [binding isEqualToString:NSHeaderTitleBinding] || + [binding isEqualToString:NSLabelBinding] || + [binding isEqualToString:NSTitleBinding] || + [binding isEqualToString:NSToolTipBinding]) { + // This handles all string value bindings + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@"happy"]]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@""]]; + + // Test some non-ascii roman text + char a_not_alpha[] = { 'A', 0xE2, 0x89, 0xA2, 0xCE, 0x91, '.', 0x00 }; + value = [NSString stringWithUTF8String:a_not_alpha]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + // Test some korean + char hangugo[] = { 0xED, 0x95, 0x9C, 0xEA, 0xB5, + 0xAD, 0xEC, 0x96, 0xB4, 0x00 }; + value = [NSString stringWithUTF8String:hangugo]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + // Test some japanese + char nihongo[] = { 0xE6, 0x97, 0xA5, 0xE6, 0x9C, + 0xAC, 0xE8, 0xAA, 0x9E, 0x00 }; + value = [NSString stringWithUTF8String:nihongo]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + // Test some arabic + char arabic[] = { 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x83, 0xd8, 0xa7, 0x00 }; + value = [NSString stringWithUTF8String:arabic]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else if ([binding isEqualToString:NSRepresentedFilenameBinding]) { + // This handles all path bindings + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@"/happy"]]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@"/"]]; + + // Test some non-ascii roman text + char a_not_alpha[] = { '/', 'A', 0xE2, 0x89, 0xA2, 0xCE, 0x91, '.', 0x00 }; + value = [NSString stringWithUTF8String:a_not_alpha]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + // Test some korean + char hangugo[] = { '/', 0xED, 0x95, 0x9C, 0xEA, 0xB5, + 0xAD, 0xEC, 0x96, 0xB4, 0x00 }; + value = [NSString stringWithUTF8String:hangugo]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + // Test some japanese + char nihongo[] = { '/', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, + 0xAC, 0xE8, 0xAA, 0x9E, 0x00 }; + value = [NSString stringWithUTF8String:nihongo]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + // Test some arabic + char arabic[] = { '/', 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x83, 0xd8, 0xa7, 0x00 }; + value = [NSString stringWithUTF8String:arabic]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else if ([binding isEqualToString:NSMaximumRecentsBinding]) { + value = [NSNumber numberWithInt:0]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithInt:-1]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithInt:INT16_MAX]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithInt:INT16_MIN]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else if ([binding isEqualToString:NSRowHeightBinding]) { + NSNumber *valueOne = [NSNumber numberWithInt:1]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:valueOne]]; + value = [NSNumber numberWithInt:0]; + id value2 = [NSNumber numberWithInt:INT16_MIN]; + // Row height no longer accepts <= 0 values on SnowLeopard + // which is a good thing. + if ([GTMSystemVersion isSnowLeopardOrGreater]) { + [array addObject:[GTMBindingUnitTestData testWithValue:value + expecting:valueOne]]; + + [array addObject:[GTMBindingUnitTestData testWithValue:value2 + expecting:valueOne]]; + } else { + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value2]]; + } + value = [NSNumber numberWithInt:INT16_MAX]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else if ([binding isEqualToString:NSMaxValueBinding] || + [binding isEqualToString:NSMaxWidthBinding] || + [binding isEqualToString:NSMinValueBinding] || + [binding isEqualToString:NSMinWidthBinding] || + [binding isEqualToString:NSContentWidthBinding] || + [binding isEqualToString:NSContentHeightBinding] || + [binding isEqualToString:NSWidthBinding] || + [binding isEqualToString:NSAnimationDelayBinding]) { + // NSAnimationDelay is deprecated on SnowLeopard. We continue to test it + // to make sure it doesn't get broken. + + // This handles all float value bindings + value = [NSNumber numberWithFloat:0]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithFloat:FLT_MAX]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithFloat:-FLT_MAX]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithFloat:FLT_MIN]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithFloat:-FLT_MIN]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithFloat:FLT_EPSILON]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSNumber numberWithFloat:-FLT_EPSILON]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else if ([binding isEqualToString:NSTextColorBinding]) { + // This handles all color value bindings + value = [NSColor colorWithCalibratedWhite:1.0 alpha:1.0]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSColor colorWithCalibratedWhite:1.0 alpha:0.0]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSColor colorWithCalibratedWhite:1.0 alpha:0.5]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSColor colorWithCalibratedRed:0.5 green:0.5 blue:0.5 alpha:0.5]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSColor colorWithDeviceCyan:0.25 magenta:0.25 yellow:0.25 + black:0.25 alpha:0.25]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else if ([binding isEqualToString:NSFontBinding]) { + // This handles all font value bindings + value = [NSFont boldSystemFontOfSize:[NSFont systemFontSize]]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSFont toolTipsFontOfSize:[NSFont smallSystemFontSize]]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + value = [NSFont labelFontOfSize:144.0]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else if ([binding isEqualToString:NSRecentSearchesBinding] || + [binding isEqualToString:NSSortDescriptorsBinding]) { + // This handles all array value bindings + value = [NSArray array]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else if ([binding isEqualToString:NSTargetBinding]) { + value = [NSNull null]; + [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; + } else { + _GTMDevLog(@"Skipped Binding: %@ for %@", binding, self); // COV_NF_LINE + } + return array; +} + +- (BOOL)gtm_unitTestIsEqualTo:(id)value { + return [self isEqualTo:value]; +} + +@end + +#pragma mark - +#pragma mark All the special AppKit Bindings issues below + +@interface NSImage (GTMBindingUnitTestingAdditions) +@end + +@implementation NSImage (GTMBindingUnitTestingAdditions) +- (BOOL)gtm_unitTestIsEqualTo:(id)value { + // NSImage just does pointer equality in the default isEqualTo implementation + // we need something a little more heavy duty that actually compares the + // images internally. + return [[self TIFFRepresentation] isEqualTo:[value TIFFRepresentation]]; +} +@end + +@interface NSScroller (GTMBindingUnitTestingAdditions) +@end + +@implementation NSScroller (GTMBindingUnitTestingAdditions) +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; + SInt32 major, minor, bugFix; + [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; + if (major <= 10 && minor <= 5 && bugFix <= 5) { + // rdar://5849154 - NSScroller exposes binding with no value + // class for NSValueBinding + [array addObject:NSValueBinding]; + } + if ([GTMSystemVersion isBuildLessThanOrEqualTo:kGTMSystemBuild10_6_0_WWDC]) { + // Broken on SnowLeopard WWDC and below + // rdar://5849236 - NSScroller exposes binding for NSFontBinding + [array addObject:NSFontBinding]; + } + return array; +} +@end + +@interface NSTextField (GTMBindingUnitTestingAdditions) +@end + +@implementation NSTextField (GTMBindingUnitTestingAdditions) + +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; + // Not KVC Compliant + for (int i = 0; i < 10; i++) { + [array addObject:[NSString stringWithFormat:@"displayPatternValue%d", i]]; + } + return array; +} + +- (NSMutableArray *)gtm_unitTestExposedBindingsTestValues:(NSString*)binding { + NSMutableArray *array = [super gtm_unitTestExposedBindingsTestValues:binding]; + if ([binding isEqualToString:NSAlignmentBinding]) { + if ([GTMSystemVersion isBuildLessThanOrEqualTo:kGTMSystemBuild10_6_0_WWDC]) { + // rdar://5851487 - If NSAlignmentBinding for a NSTextField is set to -1 + // and then got it returns 7 + NSNumber *textAlignment = [NSNumber numberWithInt:NSNaturalTextAlignment]; + GTMBindingUnitTestData *dataToRemove = + [GTMBindingUnitTestData testWithValue:[NSNumber numberWithInt:-1] + expecting:textAlignment]; + [array removeObject:dataToRemove]; + GTMBindingUnitTestData *dataToAdd = + [GTMBindingUnitTestData testWithValue:[NSNumber numberWithInt:-1] + expecting:[NSNumber numberWithInt:7]]; + [array addObject:dataToAdd]; + } + } + return array; +} +@end + +@interface NSSearchField (GTMBindingUnitTestingAdditions) +@end + +@implementation NSSearchField (GTMBindingUnitTestingAdditions) + +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; + SInt32 major, minor, bugFix; + [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; + if (major <= 10 && minor <= 5 && bugFix <= 6) { + // rdar://5851491 - Setting NSAlignmentBinding of search field to + // NSCenterTextAlignment broken + // Broken on 10.5.6 and below. + [array addObject:NSAlignmentBinding]; + } + // Not KVC Compliant + [array addObject:NSPredicateBinding]; + return array; +} + +@end + +@interface NSWindow (GTMBindingUnitTestingAdditions) +@end + +@implementation NSWindow (GTMBindingUnitTestingAdditions) + +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; + // Not KVC Compliant + [array addObject:NSContentWidthBinding]; + [array addObject:NSContentHeightBinding]; + for (int i = 0; i < 10; i++) { + [array addObject:[NSString stringWithFormat:@"displayPatternTitle%d", i]]; + } + return array; +} + +@end + +@interface NSBox (GTMBindingUnitTestingAdditions) +@end + +@implementation NSBox (GTMBindingUnitTestingAdditions) + +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; + // Not KVC Compliant + for (int i = 0; i < 10; i++) { + [array addObject:[NSString stringWithFormat:@"displayPatternTitle%d", i]]; + } + return array; +} + +@end + +@interface NSTableView (GTMBindingUnitTestingAdditions) +@end + +@implementation NSTableView (GTMBindingUnitTestingAdditions) + +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; + if ([GTMSystemVersion isBuildLessThanOrEqualTo:kGTMSystemBuild10_6_0_WWDC]) { + // rdar://6288332 - NSTableView does not respond to NSFontBinding + // Broken on 10.5, and SnowLeopard WWDC + [array addObject:NSFontBinding]; + } + // Not KVC Compliant + [array addObject:NSContentBinding]; + [array addObject:NSDoubleClickTargetBinding]; + [array addObject:NSDoubleClickArgumentBinding]; + [array addObject:NSSelectionIndexesBinding]; + return array; +} + +@end + +@interface NSTextView (GTMBindingUnitTestingAdditions) +@end + +@implementation NSTextView (GTMBindingUnitTestingAdditions) + +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; + if ([GTMSystemVersion isBuildLessThanOrEqualTo:kGTMSystemBuild10_6_0_WWDC]) { + //rdar://5849335 - NSTextView only partially KVC compliant for key + // NSAttributedStringBinding + [array addObject:NSAttributedStringBinding]; + } + // Not KVC Compliant + [array addObject:NSDataBinding]; + [array addObject:NSValueURLBinding]; + [array addObject:NSValuePathBinding]; + return array; +} + +@end + +@interface NSTabView (GTMBindingUnitTestingAdditions) +@end + +@implementation NSTabView (GTMBindingUnitTestingAdditions) + +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; + if ([GTMSystemVersion isBuildLessThanOrEqualTo:kGTMSystemBuild10_6_0_WWDC]) { + // rdar://5849248 - NSTabView exposes binding with no value class + // for NSSelectedIdentifierBinding + [array addObject:NSSelectedIdentifierBinding]; + } + // Not KVC Compliant + [array addObject:NSSelectedIndexBinding]; + [array addObject:NSSelectedLabelBinding]; + return array; +} + +@end + +@interface NSButton (GTMBindingUnitTestingAdditions) +@end + +@implementation NSButton (GTMBindingUnitTestingAdditions) + +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; + // Not KVC Compliant + [array addObject:NSArgumentBinding]; + return array; +} + +@end + +@interface NSProgressIndicator (GTMBindingUnitTestingAdditions) +@end + +@implementation NSProgressIndicator (GTMBindingUnitTestingAdditions) + +- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { + NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; + // Not KVC Compliant + [array addObject:NSAnimateBinding]; + return array; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+UnitTesting.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+UnitTesting.h new file mode 100644 index 00000000..37eae5bf --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+UnitTesting.h @@ -0,0 +1,417 @@ +// +// GTMNSObject+UnitTesting.h +// +// Utilities for doing advanced unittesting with objects. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMDefines.h" +#import + +#if GTM_MACOS_SDK +#import +#elif GTM_IPHONE_SDK +#import +#endif + +#import "GTMSenTestCase.h" + +// Utility functions for GTMAssert* Macros. Don't use them directly +// but use the macros below instead +BOOL GTMIsObjectImageEqualToImageNamed(id object, + NSString *filename, + NSString **error); +BOOL GTMIsObjectStateEqualToStateNamed(id object, + NSString *filename, + NSString **error); + +// Fails when image of |a1| does not equal image in image file named |a2| +// +// Generates a failure when the unittest image of |a1| is not equal to the +// image stored in the image file named |a2|, or |a2| does not exist in the +// executable code's bundle. +// If |a2| does not exist in the executable code's bundle, we save a image +// representation of |a1| in the save directory with name |a2|. This can then +// be included in the bundle as the master to test against. +// If |a2| != |a1|, we save a image representation of |a1| in the save +// directory named |a2|_Failed and a file named |a2|_Failed_Diff showing the +// diff in red so that we can see what has changed. +// See pathForImageNamed to see how name is searched for. +// The save directory is specified by +gtm_setUnitTestSaveToDirectory, and is +// the desktop by default. +// Implemented as a macro to match the rest of the SenTest macros. +// +// Args: +// a1: The object to be checked. Must implement the -createUnitTestImage method. +// a2: The name of the image file to check against. +// Do not include the extension +// description: A format string as in the printf() function. +// Can be nil or an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +// +#define GTMAssertObjectImageEqualToImageNamed(a1, a2, description, ...) \ +do { \ + id a1Object = (a1); \ + NSString* a2String = (a2); \ + NSString *failString = nil; \ + BOOL isGood = GTMIsObjectImageEqualToImageNamed(a1Object, a2String, &failString); \ + if (!isGood) { \ + if (description) { \ + STFail(@"%@: %@", failString, STComposeString(description, ##__VA_ARGS__)); \ + } else { \ + STFail(@"%@", failString); \ + } \ + } \ +} while(0) + +// Fails when state of |a1| does not equal state in file |a2| +// +// Generates a failure when the unittest state of |a1| is not equal to the +// state stored in the state file named |a2|, or |a2| does not exist in the +// executable code's bundle. +// If |a2| does not exist in the executable code's bundle, we save a state +// representation of |a1| in the save directiry with name |a2|. This can then +// be included in the bundle as the master to test against. +// If |a2| != |a1|, we save a state representation of |a1| in the save +// directory with name |a2|_Failed so that we can compare the two files to see +// what has changed. +// The save directory is specified by +gtm_setUnitTestSaveToDirectory, and is +// the desktop by default. +// Implemented as a macro to match the rest of the SenTest macros. +// +// Args: +// a1: The object to be checked. Must implement the -createUnitTestImage method. +// a2: The name of the state file to check against. +// Do not include the extension +// description: A format string as in the printf() function. +// Can be nil or an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +// +#define GTMAssertObjectStateEqualToStateNamed(a1, a2, description, ...) \ +do { \ + id a1Object = (a1); \ + NSString* a2String = (a2); \ + NSString *failString = nil; \ + BOOL isGood = GTMIsObjectStateEqualToStateNamed(a1Object, a2String, &failString); \ + if (!isGood) { \ + if (description) { \ + STFail(@"%@: %@", failString, STComposeString(description, ##__VA_ARGS__)); \ + } else { \ + STFail(@"%@", failString); \ + } \ + } \ +} while(0); + +// test both GTMAssertObjectImageEqualToImageNamed and GTMAssertObjectStateEqualToStateNamed +// +// Combines the above two macros into a single ubermacro for comparing +// both state and image. When only the best will do... +#define GTMAssertObjectEqualToStateAndImageNamed(a1, a2, description, ...) \ +do { \ + GTMAssertObjectImageEqualToImageNamed(a1, a2, description, ##__VA_ARGS__); \ + GTMAssertObjectStateEqualToStateNamed(a1, a2, description, ##__VA_ARGS__); \ +} while (0) + +// Create a CGBitmapContextRef appropriate for using in creating a unit test +// image. If data is non-NULL, returns the buffer that the bitmap is +// using for it's underlying storage. You must free this buffer using +// free. If data is NULL, uses it's own internal storage. +// Defined as a C function instead of an obj-c method because you have to +// release the CGContextRef that is returned. +// +// Returns: +// an CGContextRef of the object. Caller must release + +CGContextRef GTMCreateUnitTestBitmapContextOfSizeWithData(CGSize size, + unsigned char **data); + +// GTMUnitTestingImaging protocol is for objects which need to save their +// image for using with the unit testing categories +@protocol GTMUnitTestingImaging +// Create a CGImageRef containing a representation suitable for use in +// comparing against a master image. +// +// Returns: +// an CGImageRef of the object. +- (CGImageRef)gtm_unitTestImage; +@end + +// GTMUnitTestingEncoding protocol is for objects which need to save their +// "state" for using with the unit testing categories +@protocol GTMUnitTestingEncoding +// Encodes the state of an object in a manner suitable for comparing +// against a master state file so we can determine whether the +// object is in a suitable state. Encode data in the coder in the same +// manner that you would encode data in any other Keyed NSCoder subclass. +// +// Arguments: +// inCoder - the coder to encode our state into +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder; +@end + +// Category for saving and comparing object state and image for unit tests +// +// The GTMUnitTestAdditions category gives object the ability to store their +// state for use in unittesting in two different manners. +// 1) Objects can elect to save their "image" that we can compare at +// runtime to an image file to make sure that the representation hasn't +// changed. All views and Windows can save their image. In the case of Windows, +// they are "bluescreened" so that any transparent areas can be compared between +// machines. +// 2) Objects can elect to save their "state". State is the attributes that we +// want to verify when running unit tests. Applications, Windows, Views, +// Controls and Cells currently return a variety of state information. If you +// want to customize the state information that a particular object returns, you +// can do it via the GTMUnitTestingEncodedObjectNotification. Items that have +// delegates (Applications/Windows) can also have their delegates return state +// information if appropriate via the unitTestEncoderDidEncode:inCoder: delegate +// method. +// To compare state/image in your unit tests, you can use the three macros above +// GTMAssertObjectStateEqualToStateNamed, GTMAssertObjectImageEqualToImageNamed and +// GTMAssertObjectEqualToStateAndImageNamed. +@interface NSObject (GTMUnitTestingAdditions) +// Allows you to control where the unit test utilities save any files +// (image or state) that they create on your behalf. By default they +// will save to the desktop. ++ (void)gtm_setUnitTestSaveToDirectory:(NSString*)path; ++ (NSString *)gtm_getUnitTestSaveToDirectory; + +// Checks to see that system settings are valid for doing an image comparison. +// Most of these are set by our unit test app. See the unit test app main.m +// for details. +// +// Returns: +// YES if we can do image comparisons for this object type. +- (BOOL)gtm_areSystemSettingsValidForDoingImage; + +// Return the type of image to work with. Only valid types on the iPhone +// are kUTTypeJPEG and kUTTypePNG. MacOS supports several more. +- (CFStringRef)gtm_imageUTI; + +// Return the extension to be used for saving unittest images +// +// Returns +// An extension (e.g. "png") +- (NSString*)gtm_imageExtension; + +// Return image data in the format expected for gtm_imageExtension +// So for a "png" extension I would expect "png" data +// +// Returns +// NSData for image +- (NSData*)gtm_imageDataForImage:(CGImageRef)image; + +// Save the unitTestImage to a image file with name +// |name|.arch.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension +// in the save folder (desktop by default) +// +// Args: +// name: The name for the image file you would like saved. +// +// Returns: +// YES if the file was successfully saved. +// +- (BOOL)gtm_saveToImageNamed:(NSString*)name; + +// Save unitTestImage of |self| to an image file at path |path|. +// All non-drawn areas will be transparent. +// +// Args: +// name: The name for the image file you would like saved. +// +// Returns: +// YES if the file was successfully saved. +// +- (BOOL)gtm_saveToImageAt:(NSString*)path; + +// Compares unitTestImage of |self| to the image located at |path| +// +// Args: +// path: the path to the image file you want to compare against. +// If diff is non-nil, it will contain an auto-released diff of the images. +// +// Returns: +// YES if they are equal, NO is they are not +// If diff is non-nil, it will contain a diff of the images. Must +// be released by caller. +// +- (BOOL)gtm_compareWithImageAt:(NSString*)path diffImage:(CGImageRef*)diff; + +// Find the path for a image by name in your bundle. +// Searches for the following: +// "name.arch.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension" +// "name.OSVersionMajor.OSVersionMinor.OSVersionBugfix.arch.extension" +// "name.arch.OSVersionMajor.OSVersionMinor.extension" +// "name.OSVersionMajor.OSVersionMinor.arch.extension" +// "name.arch.OSVersionMajor.extension" +// "name.OSVersionMajor.arch.extension" +// "name.arch.extension" +// "name.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension" +// "name.OSVersionMajor.OSVersionMinorextension" +// "name.OSVersionMajor.extension" +// "name.extension" +// Do not include the extension on your name. +// +// Args: +// name: The name for the image file you would like to find. +// +// Returns: +// the path if the image exists in your bundle +// or nil if no image to be found +// +- (NSString *)gtm_pathForImageNamed:(NSString*)name; + +// Generates a CGImageRef from the image at |path| +// Args: +// path: The path to the image. +// +// Returns: +// An autoreleased CGImageRef own, or nil if no image at path +- (CGImageRef)gtm_imageWithContentsOfFile:(NSString*)path; + +// Generates a path for a image in the save directory, which is desktop +// by default. +// Path will be: +// SaveDir/|name|.arch.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension +// +// Args: +// name: The name for the image file you would like to generate a path for. +// +// Returns: +// the path +// +- (NSString *)gtm_saveToPathForImageNamed:(NSString*)name; + +// Gives us a representation of unitTestImage of |self|. +// +// Returns: +// a representation if successful +// nil if failed +// +- (NSData *)gtm_imageRepresentation; + +// Return the extension to be used for saving unittest states +// +// Returns +// An extension (e.g. "gtmUTState") +- (NSString*)gtm_stateExtension; + +// Save the encoded unit test state to a state file with name +// |name|.arch.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension +// in the save folder (desktop by default) +// +// Args: +// name: The name for the state file you would like saved. +// +// Returns: +// YES if the file was successfully saved. +// +- (BOOL)gtm_saveToStateNamed:(NSString*)name; + +// Save encoded unit test state of |self| to a state file at path |path|. +// +// Args: +// name: The name for the state file you would like saved. +// +// Returns: +// YES if the file was successfully saved. +// +- (BOOL)gtm_saveToStateAt:(NSString*)path; + +// Compares encoded unit test state of |self| to the state file located at |path| +// +// Args: +// path: the path to the state file you want to compare against. +// +// Returns: +// YES if they are equal, NO is they are not +// +- (BOOL)gtm_compareWithStateAt:(NSString*)path; + + +// Find the path for a state by name in your bundle. +// Searches for: +// "name.arch.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension" +// "name.OSVersionMajor.OSVersionMinor.OSVersionBugfix.arch.extension" +// "name.arch.OSVersionMajor.OSVersionMinor.extension" +// "name.OSVersionMajor.OSVersionMinor.arch.extension" +// "name.arch.OSVersionMajor.extension" +// "name.OSVersionMajor.arch.extension" +// "name.arch.extension" +// "name.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension" +// "name.OSVersionMajor.OSVersionMinor.extension" +// "name.OSVersionMajor.extension" +// "name.extension" +// Do not include the extension on your name. +// +// Args: +// name: The name for the state file you would like to find. +// +// Returns: +// the path if the state exists in your bundle +// or nil if no state to be found +// +- (NSString *)gtm_pathForStateNamed:(NSString*)name; + +// Generates a path for a state in the save directory, which is desktop +// by default. +// Path will be: +// SaveDir/|name|.arch.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension +// +// Args: +// name: The name for the state file you would like to generate a path for. +// +// Returns: +// the path +// +- (NSString *)gtm_saveToPathForStateNamed:(NSString*)name; + +// Gives us the encoded unit test state for |self| +// +// Returns: +// the encoded state if successful +// nil if failed +// +- (NSDictionary *)gtm_stateRepresentation; + +// Encodes the state of an object in a manner suitable for comparing +// against a master state file so we can determine whether the +// object is in a suitable state. Encode data in the coder in the same +// manner that you would encode data in any other Keyed NSCoder subclass. +// +// Arguments: +// inCoder - the coder to encode our state into +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder; +@end + +// Informal protocol for delegates that wanst to be able to add state info +// when state info is collected for their "owned" objects +@interface NSObject (GTMUnitTestingEncodingAdditions) +// Delegate function for unit test objects that have delegates. Delegates have +// the option of encoding more data into the coder to store their state for +// unittest usage. +- (void)gtm_unitTestEncoderWillEncode:(id)sender inCoder:(NSCoder*)inCoder; +@end + +// Whenever an object is encoded by the unit test encoder, it send out a +// notification so that objects who want to add data to the encoded objects unit +// test state can do so. The Coder will be in the userInfo dictionary for the +// notification under the GTMUnitTestingEncoderKey key. +GTM_EXTERN NSString *const GTMUnitTestingEncodedObjectNotification; + +// Key for finding the encoder in the userInfo dictionary for +// GTMUnitTestingEncodedObjectNotification notifications. +GTM_EXTERN NSString *const GTMUnitTestingEncoderKey; diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+UnitTesting.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+UnitTesting.m new file mode 100644 index 00000000..cc6a7ea4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMNSObject+UnitTesting.m @@ -0,0 +1,982 @@ +// +// GTMNSObject+UnitTesting.m +// +// An informal protocol for doing advanced unittesting with objects. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSObject+UnitTesting.h" +#import "GTMSystemVersion.h" +#import "GTMGarbageCollection.h" + +#if GTM_IPHONE_SDK +#import +#else +#import +#endif + +NSString *const GTMUnitTestingEncodedObjectNotification + = @"GTMUnitTestingEncodedObjectNotification"; +NSString *const GTMUnitTestingEncoderKey = @"GTMUnitTestingEncoderKey"; + +#if GTM_IPHONE_SDK +// No UTIs on iPhone. Only two we need. +const CFStringRef kUTTypePNG = CFSTR("public.png"); +const CFStringRef kUTTypeJPEG = CFSTR("public.jpeg"); +#endif + +// This class exists so that we can locate our bundle using [NSBundle +// bundleForClass:]. We don't use [NSBundle mainBundle] because when we are +// being run as a unit test, we aren't the mainBundle +@interface GTMUnitTestingAdditionsBundleFinder : NSObject { + // Nothing here +} +// or here +@end + +@implementation GTMUnitTestingAdditionsBundleFinder +// Nothing here. We're just interested in the name for finding our bundle. +@end + +BOOL GTMIsObjectImageEqualToImageNamed(id object, + NSString* filename, + NSString **error) { + NSString *failString = nil; + if (error) { + *error = nil; + } + BOOL isGood = [object respondsToSelector:@selector(gtm_unitTestImage)]; + if (isGood) { + if ([object gtm_areSystemSettingsValidForDoingImage]) { + NSString *aPath = [object gtm_pathForImageNamed:filename]; + CGImageRef diff = nil; + isGood = aPath != nil; + if (isGood) { + isGood = [object gtm_compareWithImageAt:aPath diffImage:&diff]; + } + if (!isGood) { + if (aPath) { + filename = [filename stringByAppendingString:@"_Failed"]; + } + BOOL aSaved = [object gtm_saveToImageNamed:filename]; + NSString *fileNameWithExtension + = [NSString stringWithFormat:@"%@.%@", + filename, [object gtm_imageExtension]]; + NSString *fullSavePath = [object gtm_saveToPathForImageNamed:filename]; + if (NO == aSaved) { + if (!aPath) { + failString = [NSString stringWithFormat:@"File %@ did not exist in " + @"bundle. Tried to save as %@ and failed.", + fileNameWithExtension, fullSavePath]; + } else { + failString = [NSString stringWithFormat:@"Object image different " + @"than file %@. Tried to save as %@ and failed.", + aPath, fullSavePath]; + } + } else { + if (!aPath) { + failString = [NSString stringWithFormat:@"File %@ did not exist in " + @" bundle. Saved to %@", fileNameWithExtension, + fullSavePath]; + } else { + NSString *diffPath = [filename stringByAppendingString:@"_Diff"]; + diffPath = [object gtm_saveToPathForImageNamed:diffPath]; + NSData *data = nil; + if (diff) { + data = [object gtm_imageDataForImage:diff]; + } + if ([data writeToFile:diffPath atomically:YES]) { + failString = [NSString stringWithFormat:@"Object image different " + @"than file %@. Saved image to %@. " + @"Saved diff to %@", + aPath, fullSavePath, diffPath]; + } else { + failString = [NSString stringWithFormat:@"Object image different " + @"than file %@. Saved image to %@. Unable to save " + @"diff. Most likely the image and diff are " + @"different sizes.", + aPath, fullSavePath]; + } + } + } + } + CGImageRelease(diff); + } else { + failString = @"systemSettings not valid for taking image"; // COV_NF_LINE + } + } else { + failString = @"Object does not conform to GTMUnitTestingImaging protocol"; + } + if (error) { + *error = failString; + } + return isGood; +} + +BOOL GTMIsObjectStateEqualToStateNamed(id object, + NSString* filename, + NSString **error) { + NSString *failString = nil; + if (error) { + *error = nil; + } + BOOL isGood = [object conformsToProtocol:@protocol(GTMUnitTestingEncoding)]; + if (isGood) { + NSString *aPath = [object gtm_pathForStateNamed:filename]; + isGood = aPath != nil; + if (isGood) { + isGood = [object gtm_compareWithStateAt:aPath]; + } + if (!isGood) { + if (aPath) { + filename = [filename stringByAppendingString:@"_Failed"]; + } + BOOL aSaved = [object gtm_saveToStateNamed:filename]; + NSString *fileNameWithExtension = [NSString stringWithFormat:@"%@.%@", + filename, [object gtm_stateExtension]]; + NSString *fullSavePath = [object gtm_saveToPathForStateNamed:filename]; + if (NO == aSaved) { + if (!aPath) { + failString = [NSString stringWithFormat:@"File %@ did not exist in " + @"bundle. Tried to save as %@ and failed.", + fileNameWithExtension, fullSavePath]; + } else { + failString = [NSString stringWithFormat:@"Object state different " + @"than file %@. Tried to save as %@ and failed.", + aPath, fullSavePath]; + } + } else { + if (!aPath) { + failString = [NSString stringWithFormat:@"File %@ did not exist in " + @ "bundle. Saved to %@", fileNameWithExtension, + fullSavePath]; + } else { + failString = [NSString stringWithFormat:@"Object state different " + @"than file %@. Saved to %@", aPath, fullSavePath]; + } + } + } + } else { + failString = @"Object does not conform to GTMUnitTestingEncoding protocol"; + } + if (error) { + *error = failString; + } + return isGood; +} + +CGContextRef GTMCreateUnitTestBitmapContextOfSizeWithData(CGSize size, + unsigned char **data) { + CGContextRef context = NULL; + size_t height = size.height; + size_t width = size.width; + size_t bytesPerRow = width * 4; + size_t bitsPerComponent = 8; + CGColorSpaceRef cs = NULL; +#if GTM_IPHONE_SDK + cs = CGColorSpaceCreateDeviceRGB(); +#else + cs = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); +#endif + _GTMDevAssert(cs, @"Couldn't create colorspace"); + CGBitmapInfo info + = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault; + if (data) { + *data = (unsigned char*)calloc(bytesPerRow, height); + _GTMDevAssert(*data, @"Couldn't create bitmap"); + } + context = CGBitmapContextCreate(data ? *data : NULL, width, height, + bitsPerComponent, bytesPerRow, cs, info); + _GTMDevAssert(context, @"Couldn't create an context"); + if (!data) { + CGContextClearRect(context, CGRectMake(0, 0, size.width, size.height)); + } + CGContextSetRenderingIntent(context, kCGRenderingIntentRelativeColorimetric); + CGContextSetInterpolationQuality(context, kCGInterpolationNone); + CGContextSetShouldAntialias(context, NO); + CGContextSetAllowsAntialiasing(context, NO); + CGContextSetShouldSmoothFonts(context, NO); + CGColorSpaceRelease(cs); + return context; +} + +@interface NSObject (GTMUnitTestingAdditionsPrivate) +/// Find the path for a file named name.extension in your bundle. +// Searches for the following: +// "name.extension", +// "name.arch.extension", +// "name.arch.OSVersionMajor.extension" +// "name.arch.OSVersionMajor.OSVersionMinor.extension" +// "name.arch.OSVersionMajor.OSVersionMinor.OSVersion.bugfix.extension" +// "name.arch.OSVersionMajor.extension" +// "name.OSVersionMajor.arch.extension" +// "name.OSVersionMajor.OSVersionMinor.arch.extension" +// "name.OSVersionMajor.OSVersionMinor.OSVersion.bugfix.arch.extension" +// "name.OSVersionMajor.extension" +// "name.OSVersionMajor.OSVersionMinor.extension" +// "name.OSVersionMajor.OSVersionMinor.OSVersion.bugfix.extension" +// Do not include the ".extension" extension on your name. +// +// Args: +// name: The name for the file you would like to find. +// extension: the extension for the file you would like to find +// +// Returns: +// the path if the file exists in your bundle +// or nil if no file is found +// +- (NSString *)gtm_pathForFileNamed:(NSString*)name + extension:(NSString*)extension; +- (NSString *)gtm_saveToPathForFileNamed:(NSString*)name + extension:(NSString*)extension; +- (CGImageRef)gtm_unitTestImage; +// Returns nil if there is no override +- (NSString *)gtm_getOverrideDefaultUnitTestSaveToDirectory; +@end + +// This is a keyed coder for storing unit test state data. It is used only by +// the GTMUnitTestingAdditions category. Most of the work is done in +// encodeObject:forKey:. +@interface GTMUnitTestingKeyedCoder : NSCoder { + NSMutableDictionary *dictionary_; // storage for data (STRONG) +} + +// get the data stored in coder. +// +// Returns: +// NSDictionary with currently stored data. +- (NSDictionary*)dictionary; +@end + +// Small utility function for checking to see if a is b +/- 1. +GTM_INLINE BOOL almostEqual(unsigned char a, unsigned char b) { + unsigned char diff = a > b ? a - b : b - a; + BOOL notEqual = diff < 2; + return notEqual; +} + +@implementation GTMUnitTestingKeyedCoder + +// Set up storage for coder. Stores type and version. +// Version 1 +// +// Returns: +// self +- (id)init { + self = [super init]; + if (self != nil) { + dictionary_ = [[NSMutableDictionary alloc] initWithCapacity:2]; + [dictionary_ setObject:@"GTMUnitTestingArchive" forKey:@"$GTMArchive"]; + + // Version number can be changed here. + [dictionary_ setObject:[NSNumber numberWithInt:1] forKey:@"$GTMVersion"]; + } + return self; +} + +// Standard dealloc +- (void)dealloc { + [dictionary_ release]; + [super dealloc]; +} + +// Utility function for checking for a key value. We don't want duplicate keys +// in any of our dictionaries as we may be writing over data stored by previous +// objects. +// +// Arguments: +// key - key to check for in dictionary +- (void)checkForKey:(NSString*)key { + _GTMDevAssert(![dictionary_ objectForKey:key], + @"Key already exists for %@", key); +} + +// Key routine for the encoder. We store objects in our dictionary based on +// their key. As we encode objects we send out notifications to let other +// classes doing tests add their specific data to the base types. If we can't +// encode the object (it doesn't support gtm_unitTestEncodeState) and we don't +// get any info back from the notifier, we attempt to store it's description. +// +// Arguments: +// objv - object to be encoded +// key - key to encode it with +// +- (void)encodeObject:(id)objv forKey:(NSString *)key { + // Sanity checks + if (!objv) return; + [self checkForKey:key]; + + // Set up a new dictionary for the current object + NSMutableDictionary *curDictionary = dictionary_; + dictionary_ = [[NSMutableDictionary alloc] initWithCapacity:0]; + + // If objv responds to gtm_unitTestEncodeState get it to record + // its data. + if ([objv respondsToSelector:@selector(gtm_unitTestEncodeState:)]) { + [objv gtm_unitTestEncodeState:self]; + } + + // We then send out a notification to let other folks + // add data for this object + NSDictionary *notificationDict + = [NSDictionary dictionaryWithObject:self forKey:GTMUnitTestingEncoderKey]; + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc postNotificationName:GTMUnitTestingEncodedObjectNotification + object:objv + userInfo:notificationDict]; + + // If we got anything from the object, or from the notification, store it in + // our dictionary. Otherwise store the description. + if ([dictionary_ count] > 0) { + [curDictionary setObject:dictionary_ forKey:key]; + } else { + NSString *description = [objv description]; + // If description has a pointer value in it, we don't want to store it + // as the pointer value can change from run to run + if (description && [description rangeOfString:@"0x"].length == 0) { + [curDictionary setObject:description forKey:key]; + } else { + _GTMDevAssert(NO, @"Unable to encode forKey: %@", key); // COV_NF_LINE + } + } + [dictionary_ release]; + dictionary_ = curDictionary; +} + +// Basic encoding methods for POD types. +// +// Arguments: +// *v - value to encode +// key - key to encode it in + +- (void)encodeBool:(BOOL)boolv forKey:(NSString *)key { + [self checkForKey:key]; + [dictionary_ setObject:[NSNumber numberWithBool:boolv] forKey:key]; +} + +- (void)encodeInt:(int)intv forKey:(NSString *)key { + [self checkForKey:key]; + [dictionary_ setObject:[NSNumber numberWithInt:intv] forKey:key]; +} + +- (void)encodeInt32:(int32_t)intv forKey:(NSString *)key { + [self checkForKey:key]; + [dictionary_ setObject:[NSNumber numberWithLong:intv] forKey:key]; +} + +- (void)encodeInt64:(int64_t)intv forKey:(NSString *)key { + [self checkForKey:key]; + [dictionary_ setObject:[NSNumber numberWithLongLong:intv] forKey:key]; +} + +- (void)encodeFloat:(float)realv forKey:(NSString *)key { + [self checkForKey:key]; + [dictionary_ setObject:[NSNumber numberWithFloat:realv] forKey:key]; +} + +- (void)encodeDouble:(double)realv forKey:(NSString *)key { + [self checkForKey:key]; + [dictionary_ setObject:[NSNumber numberWithDouble:realv] forKey:key]; +} + +- (void)encodeBytes:(const uint8_t *)bytesp + length:(unsigned)lenv + forKey:(NSString *)key { + [self checkForKey:key]; + [dictionary_ setObject:[NSData dataWithBytes:bytesp + length:lenv] + forKey:key]; +} + +// Get our storage back as an NSDictionary +// +// Returns: +// NSDictionary containing our encoded info +-(NSDictionary*)dictionary { + return [[dictionary_ retain] autorelease]; +} + +@end + +static NSString *gGTMUnitTestSaveToDirectory = nil; + +@implementation NSObject (GTMUnitTestingAdditions) + ++ (void)gtm_setUnitTestSaveToDirectory:(NSString*)path { + @synchronized([self class]) { + [gGTMUnitTestSaveToDirectory autorelease]; + gGTMUnitTestSaveToDirectory = [path copy]; + } +} + ++ (NSString *)gtm_getUnitTestSaveToDirectory { + NSString *result = nil; + @synchronized([self class]) { + if (!gGTMUnitTestSaveToDirectory) { +#if GTM_IPHONE_SDK + // Developer build, use their home directory Desktop. + gGTMUnitTestSaveToDirectory + = [[[[[NSHomeDirectory() stringByDeletingLastPathComponent] + stringByDeletingLastPathComponent] + stringByDeletingLastPathComponent] + stringByDeletingLastPathComponent] + stringByAppendingPathComponent:@"Desktop"]; +#else + NSArray *desktopDirs + = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, + NSUserDomainMask, + YES); + gGTMUnitTestSaveToDirectory = [desktopDirs objectAtIndex:0]; +#endif + // Did we get overridden? + NSString *override = [self gtm_getOverrideDefaultUnitTestSaveToDirectory]; + if (override) { + gGTMUnitTestSaveToDirectory = override; + } + [gGTMUnitTestSaveToDirectory retain]; + } + result = gGTMUnitTestSaveToDirectory; + } + + return result; +} + +// Return nil if there is no override +- (NSString *)gtm_getOverrideDefaultUnitTestSaveToDirectory { + NSString *result = nil; + + // If we have an environment variable that ends in "BUILD_NUMBER" odds are + // we're on an automated build system, so use the build products dir as an + // override instead of writing on the desktop. + NSDictionary *env = [[NSProcessInfo processInfo] environment]; + NSString *key; + GTM_FOREACH_KEY(key, env) { + if ([key hasSuffix:@"BUILD_NUMBER"]) { + break; + } + } + if (key) { + result = [env objectForKey:@"BUILT_PRODUCTS_DIR"]; + } + + if (result && [result length] == 0) { + result = nil; + } + return result; +} + +/// Find the path for a file named name.extension in your bundle. +// Searches for the following: +// "name.extension", +// "name.arch.extension", +// "name.arch.OSVersionMajor.extension" +// "name.arch.OSVersionMajor.OSVersionMinor.extension" +// "name.arch.OSVersionMajor.OSVersionMinor.OSVersion.bugfix.extension" +// "name.arch.OSVersionMajor.extension" +// "name.OSVersionMajor.arch.extension" +// "name.OSVersionMajor.OSVersionMinor.arch.extension" +// "name.OSVersionMajor.OSVersionMinor.OSVersion.bugfix.arch.extension" +// "name.OSVersionMajor.extension" +// "name.OSVersionMajor.OSVersionMinor.extension" +// "name.OSVersionMajor.OSVersionMinor.OSVersion.bugfix.extension" +// Do not include the ".extension" extension on your name. +// +// Args: +// name: The name for the file you would like to find. +// extension: the extension for the file you would like to find +// +// Returns: +// the path if the file exists in your bundle +// or nil if no file is found +// +- (NSString *)gtm_pathForFileNamed:(NSString*)name + extension:(NSString*)extension { + NSString *thePath = nil; + Class bundleClass = [GTMUnitTestingAdditionsBundleFinder class]; + NSBundle *myBundle = [NSBundle bundleForClass:bundleClass]; + _GTMDevAssert(myBundle, + @"Couldn't find bundle for class: %@ searching for file:%@.%@", + NSStringFromClass(bundleClass), name, extension); + // System Version + SInt32 major, minor, bugFix; + [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; + NSString *systemVersions[4]; + systemVersions[0] = [NSString stringWithFormat:@".%d.%d.%d", + major, minor, bugFix]; + systemVersions[1] = [NSString stringWithFormat:@".%d.%d", major, minor]; + systemVersions[2] = [NSString stringWithFormat:@".%d", major]; + systemVersions[3] = @""; + NSString *extensions[2]; + extensions[0] + = [NSString stringWithFormat:@".%@", + [GTMSystemVersion runtimeArchitecture]]; + extensions[1] = @""; + + size_t i, j; + // Note that we are searching for the most exact match first. + for (i = 0; + !thePath && i < sizeof(extensions) / sizeof(*extensions); + ++i) { + for (j = 0; + !thePath && j < sizeof(systemVersions) / sizeof(*systemVersions); + j++) { + NSString *fullName = [NSString stringWithFormat:@"%@%@%@", + name, extensions[i], systemVersions[j]]; + thePath = [myBundle pathForResource:fullName ofType:extension]; + if (thePath) break; + fullName = [NSString stringWithFormat:@"%@%@%@", + name, systemVersions[j], extensions[i]]; + thePath = [myBundle pathForResource:fullName ofType:extension]; + } + } + + return thePath; +} + +- (NSString *)gtm_saveToPathForFileNamed:(NSString*)name + extension:(NSString*)extension { + NSString *systemArchitecture = [GTMSystemVersion runtimeArchitecture]; + + SInt32 major, minor, bugFix; + [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; + + NSString *fullName = [NSString stringWithFormat:@"%@.%@.%d.%d.%d", + name, systemArchitecture, major, minor, bugFix]; + + NSString *basePath = [[self class] gtm_getUnitTestSaveToDirectory]; + return [[basePath stringByAppendingPathComponent:fullName] + stringByAppendingPathExtension:extension]; +} + +#pragma mark UnitTestImage + +// Checks to see that system settings are valid for doing an image comparison. +// To be overridden by subclasses. +// Returns: +// YES if we can do image comparisons for this object type. +- (BOOL)gtm_areSystemSettingsValidForDoingImage { + return YES; +} + +- (CFStringRef)gtm_imageUTI { +#if GTM_IPHONE_SDK + return kUTTypePNG; +#else + // Currently can't use PNG on Leopard. (10.5.2) + // Radar:5844618 PNG importer/exporter in ImageIO is lossy + return kUTTypeTIFF; +#endif +} + +// Return the extension to be used for saving unittest images +// +// Returns +// An extension (e.g. "png") +- (NSString*)gtm_imageExtension { + CFStringRef uti = [self gtm_imageUTI]; +#if GTM_IPHONE_SDK + if (CFEqual(uti, kUTTypePNG)) { + return @"png"; + } else if (CFEqual(uti, kUTTypeJPEG)) { + return @"jpg"; + } else { + _GTMDevAssert(NO, @"Illegal UTI for iPhone"); + } + return nil; +#else + CFStringRef extension + = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassFilenameExtension); + _GTMDevAssert(extension, @"No extension for uti: %@", uti); + + return GTMCFAutorelease(extension); +#endif +} + +// Return image data in the format expected for gtm_imageExtension +// So for a "png" extension I would expect "png" data +// +// Returns +// NSData for image +- (NSData*)gtm_imageDataForImage:(CGImageRef)image { + NSData *data = nil; +#if GTM_IPHONE_SDK + // iPhone support + UIImage *uiImage = [UIImage imageWithCGImage:image]; + CFStringRef uti = [self gtm_imageUTI]; + if (CFEqual(uti, kUTTypePNG)) { + data = UIImagePNGRepresentation(uiImage); + } else if (CFEqual(uti, kUTTypeJPEG)) { + data = UIImageJPEGRepresentation(uiImage, 1.0f); + } else { + _GTMDevAssert(NO, @"Illegal UTI for iPhone"); + } +#else + data = [NSMutableData data]; + CGImageDestinationRef dest + = CGImageDestinationCreateWithData((CFMutableDataRef)data, + [self gtm_imageUTI], + 1, + NULL); + // LZW Compression for TIFF + NSDictionary *tiffDict + = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt:NSTIFFCompressionLZW], + (const NSString*)kCGImagePropertyTIFFCompression, + nil]; + NSDictionary *destProps + = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithFloat:1.0f], + (const NSString*)kCGImageDestinationLossyCompressionQuality, + tiffDict, + (const NSString*)kCGImagePropertyTIFFDictionary, + nil]; + CGImageDestinationAddImage(dest, image, (CFDictionaryRef)destProps); + CGImageDestinationFinalize(dest); + CFRelease(dest); +#endif + return data; + +} + +// Save the unitTestImage to an image file with name |name| at +// ~/Desktop/|name|.extension. +// +// Note: When running under Pulse automation output is redirected to the +// Pulse base directory. +// +// Args: +// name: The name for the image file you would like saved. +// +// Returns: +// YES if the file was successfully saved. +// +- (BOOL)gtm_saveToImageNamed:(NSString*)name { + NSString *newPath = [self gtm_saveToPathForImageNamed:name]; + return [self gtm_saveToImageAt:newPath]; +} + +// Save unitTestImage of |self| to an image file at path |path|. +// +// Args: +// name: The name for the image file you would like saved. +// +// Returns: +// YES if the file was successfully saved. +// +- (BOOL)gtm_saveToImageAt:(NSString*)path { + if (!path) return NO; + NSData *data = [self gtm_imageRepresentation]; + return [data writeToFile:path atomically:YES]; +} + +// Generates a CGImageRef from the image at |path| +// Args: +// path: The path to the image. +// +// Returns: +// A CGImageRef that you own, or nil if no image at path +- (CGImageRef)gtm_imageWithContentsOfFile:(NSString*)path { + CGImageRef imageRef = nil; +#if GTM_IPHONE_SDK + UIImage *image = [UIImage imageWithContentsOfFile:path]; + if (image) { + imageRef = CGImageRetain(image.CGImage); + } +#else + CFURLRef url = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)path, + kCFURLPOSIXPathStyle, NO); + if (url) { + CGImageSourceRef imageSource = CGImageSourceCreateWithURL(url, NULL); + CFRelease(url); + if (imageSource) { + imageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); + CFRelease(imageSource); + } + } +#endif + return (CGImageRef)GTMCFAutorelease(imageRef); +} + +/// Compares unitTestImage of |self| to the image located at |path| +// +// Args: +// path: the path to the image file you want to compare against. +// If diff is non-nil, it will contain an auto-released diff of the images. +// +// Returns: +// YES if they are equal, NO is they are not +// If diff is non-nil, it will contain an auto-released diff of the images. +// +- (BOOL)gtm_compareWithImageAt:(NSString*)path diffImage:(CGImageRef*)diff { + BOOL answer = NO; + if (diff) { + *diff = nil; + } + CGImageRef fileRep = [self gtm_imageWithContentsOfFile:path]; + _GTMDevAssert(fileRep, @"Unable to create imagerep from %@", path); + + CGImageRef imageRep = [self gtm_unitTestImage]; + _GTMDevAssert(imageRep, @"Unable to create imagerep for %@", self); + + size_t fileHeight = CGImageGetHeight(fileRep); + size_t fileWidth = CGImageGetWidth(fileRep); + size_t imageHeight = CGImageGetHeight(imageRep); + size_t imageWidth = CGImageGetWidth(imageRep); + if (fileHeight == imageHeight && fileWidth == imageWidth) { + // if all the sizes are equal, run through the bytes and compare + // them for equality. + // Do an initial fast check, if this fails and the caller wants a + // diff, we'll do the slow path and create the diff. The diff path + // could be optimized, but probably not necessary at this point. + answer = YES; + + CGSize imageSize = CGSizeMake(fileWidth, fileHeight); + CGRect imageRect = CGRectMake(0, 0, fileWidth, fileHeight); + unsigned char *fileData; + unsigned char *imageData; + CGContextRef fileContext + = GTMCreateUnitTestBitmapContextOfSizeWithData(imageSize, &fileData); + _GTMDevAssert(fileContext, @"Unable to create filecontext"); + CGContextDrawImage(fileContext, imageRect, fileRep); + CGContextRef imageContext + = GTMCreateUnitTestBitmapContextOfSizeWithData(imageSize, &imageData); + _GTMDevAssert(imageContext, @"Unable to create imageContext"); + CGContextDrawImage(imageContext, imageRect, imageRep); + + size_t fileBytesPerRow = CGBitmapContextGetBytesPerRow(fileContext); + size_t imageBytesPerRow = CGBitmapContextGetBytesPerRow(imageContext); + size_t row, col; + + _GTMDevAssert(imageWidth * 4 <= imageBytesPerRow, + @"We expect image data to be 32bit RGBA"); + + for (row = 0; row < fileHeight && answer; row++) { + answer = memcmp(fileData + fileBytesPerRow * row, + imageData + imageBytesPerRow * row, + imageWidth * 4) == 0; + } + if (!answer && diff) { + answer = YES; + unsigned char *diffData; + CGContextRef diffContext + = GTMCreateUnitTestBitmapContextOfSizeWithData(imageSize, &diffData); + _GTMDevAssert(diffContext, @"Can't make diff context"); + size_t diffRowBytes = CGBitmapContextGetBytesPerRow(diffContext); + for (row = 0; row < imageHeight; row++) { + uint32_t *imageRow = (uint32_t*)(imageData + imageBytesPerRow * row); + uint32_t *fileRow = (uint32_t*)(fileData + fileBytesPerRow * row); + uint32_t* diffRow = (uint32_t*)(diffData + diffRowBytes * row); + for (col = 0; col < imageWidth; col++) { + uint32_t imageColor = imageRow[col]; + uint32_t fileColor = fileRow[col]; + + unsigned char imageAlpha = imageColor & 0xF; + unsigned char imageBlue = imageColor >> 8 & 0xF; + unsigned char imageGreen = imageColor >> 16 & 0xF; + unsigned char imageRed = imageColor >> 24 & 0xF; + unsigned char fileAlpha = fileColor & 0xF; + unsigned char fileBlue = fileColor >> 8 & 0xF; + unsigned char fileGreen = fileColor >> 16 & 0xF; + unsigned char fileRed = fileColor >> 24 & 0xF; + + // Check to see if color is almost right. + // No matter how hard I've tried, I've still gotten occasionally + // screwed over by colorspaces not mapping correctly, and small + // sampling errors coming in. This appears to work for most cases. + // Almost equal is defined to check within 1% on all components. + BOOL equal = almostEqual(imageRed, fileRed) && + almostEqual(imageGreen, fileGreen) && + almostEqual(imageBlue, fileBlue) && + almostEqual(imageAlpha, fileAlpha); + answer &= equal; + if (diff) { + uint32_t newColor; + if (equal) { + newColor = (((uint32_t)imageRed) << 24) + + (((uint32_t)imageGreen) << 16) + + (((uint32_t)imageBlue) << 8) + + (((uint32_t)imageAlpha) / 2); + } else { + newColor = 0xFF0000FF; + } + diffRow[col] = newColor; + } + } + } + *diff = CGBitmapContextCreateImage(diffContext); + free(diffData); + CFRelease(diffContext); + } + free(fileData); + CFRelease(fileContext); + free(imageData); + CFRelease(imageContext); + } + return answer; +} + +// Find the path for an image by name in your bundle. +// Do not include the extension on your name. +// +// Args: +// name: The name for the image file you would like to find. +// +// Returns: +// the path if the image exists in your bundle +// or nil if no image to be found +// +- (NSString *)gtm_pathForImageNamed:(NSString*)name { + return [self gtm_pathForFileNamed:name + extension:[self gtm_imageExtension]]; +} + +- (NSString *)gtm_saveToPathForImageNamed:(NSString*)name { + return [self gtm_saveToPathForFileNamed:name + extension:[self gtm_imageExtension]]; +} + +// Gives us a representation of unitTestImage of |self|. +// +// Returns: +// a representation of image if successful +// nil if failed +// +- (NSData *)gtm_imageRepresentation { + CGImageRef imageRep = [self gtm_unitTestImage]; + NSData *data = [self gtm_imageDataForImage:imageRep]; + _GTMDevAssert(data, @"unable to create %@ from %@", + [self gtm_imageExtension], self); + return data; +} + +#pragma mark UnitTestState + +// Return the extension to be used for saving unittest states +// +// Returns +// An extension (e.g. "gtmUTState") +- (NSString*)gtm_stateExtension { + return @"gtmUTState"; +} + +// Save the encoded unit test state to a state file with name |name| at +// ~/Desktop/|name|.extension. +// +// Note: When running under Pulse automation output is redirected to the +// Pulse base directory. +// +// Args: +// name: The name for the state file you would like saved. +// +// Returns: +// YES if the file was successfully saved. +// +- (BOOL)gtm_saveToStateNamed:(NSString*)name { + NSString *newPath = [self gtm_saveToPathForStateNamed:name]; + return [self gtm_saveToStateAt:newPath]; +} + +// Save encoded unit test state of |self| to a state file at path |path|. +// +// Args: +// name: The name for the state file you would like saved. +// +// Returns: +// YES if the file was successfully saved. +// +- (BOOL)gtm_saveToStateAt:(NSString*)path { + if (!path) return NO; + NSDictionary *dictionary = [self gtm_stateRepresentation]; + return [dictionary writeToFile:path atomically:YES]; +} + +// Compares encoded unit test state of |self| to the state file located at +// |path| +// +// Args: +// path: the path to the state file you want to compare against. +// +// Returns: +// YES if they are equal, NO is they are not +// +- (BOOL)gtm_compareWithStateAt:(NSString*)path { + NSDictionary *masterDict = [NSDictionary dictionaryWithContentsOfFile:path]; + _GTMDevAssert(masterDict, @"Unable to create dictionary from %@", path); + NSDictionary *selfDict = [self gtm_stateRepresentation]; + return [selfDict isEqual: masterDict]; +} + +// Find the path for a state by name in your bundle. +// Do not include the extension. +// +// Args: +// name: The name for the state file you would like to find. +// +// Returns: +// the path if the state exists in your bundle +// or nil if no state to be found +// +- (NSString *)gtm_pathForStateNamed:(NSString*)name { + return [self gtm_pathForFileNamed:name extension:[self gtm_stateExtension]]; +} + +- (NSString *)gtm_saveToPathForStateNamed:(NSString*)name { + return [self gtm_saveToPathForFileNamed:name + extension:[self gtm_stateExtension]]; +} + +// Gives us the encoded unit test state |self| +// +// Returns: +// the encoded state if successful +// nil if failed +// +- (NSDictionary *)gtm_stateRepresentation { + NSDictionary *dictionary = nil; + if ([self conformsToProtocol:@protocol(GTMUnitTestingEncoding)]) { + id encoder = (id)self; + GTMUnitTestingKeyedCoder *archiver; + archiver = [[[GTMUnitTestingKeyedCoder alloc] init] autorelease]; + [encoder gtm_unitTestEncodeState:archiver]; + dictionary = [archiver dictionary]; + } + return dictionary; +} + +// Encodes the state of an object in a manner suitable for comparing +// against a master state file so we can determine whether the +// object is in a suitable state. Encode data in the coder in the same +// manner that you would encode data in any other Keyed NSCoder subclass. +// +// Arguments: +// inCoder - the coder to encode our state into +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + // All impls of gtm_unitTestEncodeState + // should be calling [super gtm_unitTestEncodeState] as their first action. + _GTMDevAssert([inCoder isKindOfClass:[GTMUnitTestingKeyedCoder class]], + @"Coder must be of kind GTMUnitTestingKeyedCoder"); + + // If the object has a delegate, give it a chance to respond + if ([self respondsToSelector:@selector(delegate)]) { + id delegate = [self performSelector:@selector(delegate)]; + if (delegate && + [delegate respondsToSelector:@selector(gtm_unitTestEncoderWillEncode:inCoder:)]) { + [delegate gtm_unitTestEncoderWillEncode:self inCoder:inCoder]; + } + } +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMSenTestCase.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMSenTestCase.h new file mode 100644 index 00000000..1d355911 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMSenTestCase.h @@ -0,0 +1,1004 @@ +// +// GTMSenTestCase.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Portions of this file fall under the following license, marked with +// SENTE_BEGIN - SENTE_END +// +// Copyright (c) 1997-2005, Sen:te (Sente SA). All rights reserved. +// +// Use of this source code is governed by the following license: +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL Sente SA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +// OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Note: this license is equivalent to the FreeBSD license. +// +// This notice may not be removed from this file. + +// Some extra test case macros that would have been convenient for SenTestingKit +// to provide. I didn't stick GTM in front of the Macro names, so that they would +// be easy to remember. + +#import "GTMDefines.h" + +#if (!GTM_IPHONE_SDK) +#import +#else +#import +NSString *STComposeString(NSString *, ...); +#endif + +// Generates a failure when a1 != noErr +// Args: +// a1: should be either an OSErr or an OSStatus +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNoErr(a1, description, ...) \ +do { \ + @try {\ + OSStatus a1value = (a1); \ + if (a1value != noErr) { \ + NSString *_expression = [NSString stringWithFormat:@"Expected noErr, got %ld for (%s)", a1value, #a1]; \ + if (description) { \ + _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ + } \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:_expression]]; \ + } \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == noErr fails", #a1] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +// Generates a failure when a1 != a2 +// Args: +// a1: received value. Should be either an OSErr or an OSStatus +// a2: expected value. Should be either an OSErr or an OSStatus +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertErr(a1, a2, description, ...) \ +do { \ + @try {\ + OSStatus a1value = (a1); \ + OSStatus a2value = (a2); \ + if (a1value != a2value) { \ + NSString *_expression = [NSString stringWithFormat:@"Expected %s(%ld) but got %ld for (%s)", #a2, a2value, a1value, #a1]; \ + if (description) { \ + _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ + } \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:_expression]]; \ + } \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s) fails", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + + +// Generates a failure when a1 is NULL +// Args: +// a1: should be a pointer (use STAssertNotNil for an object) +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNotNULL(a1, description, ...) \ +do { \ + @try {\ + const void* a1value = (a1); \ + if (a1value == NULL) { \ + NSString *_expression = [NSString stringWithFormat:@"(%s) != NULL", #a1]; \ + if (description) { \ + _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ + } \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:_expression]]; \ + } \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != NULL fails", #a1] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +// Generates a failure when a1 is not NULL +// Args: +// a1: should be a pointer (use STAssertNil for an object) +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNULL(a1, description, ...) \ +do { \ + @try {\ + const void* a1value = (a1); \ + if (a1value != NULL) { \ + NSString *_expression = [NSString stringWithFormat:@"(%s) == NULL", #a1]; \ + if (description) { \ + _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ + } \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:_expression]]; \ + } \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == NULL fails", #a1] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +// Generates a failure when a1 is equal to a2. This test is for C scalars, +// structs and unions. +// Args: +// a1: argument 1 +// a2: argument 2 +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNotEquals(a1, a2, description, ...) \ +do { \ + @try {\ + if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:[@"Type mismatch -- " stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \ + } else { \ + __typeof__(a1) a1value = (a1); \ + __typeof__(a2) a2value = (a2); \ + NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \ + NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \ + if ([a1encoded isEqualToValue:a2encoded]) { \ + NSString *_expression = [NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2]; \ + if (description) { \ + _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ + } \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:_expression]]; \ + } \ + } \ + } \ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +// Generates a failure when a1 is equal to a2. This test is for objects. +// Args: +// a1: argument 1. object. +// a2: argument 2. object. +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNotEqualObjects(a1, a2, desc, ...) \ +do { \ + @try {\ + id a1value = (a1); \ + id a2value = (a2); \ + if ( (@encode(__typeof__(a1value)) == @encode(id)) && \ + (@encode(__typeof__(a2value)) == @encode(id)) && \ + ![(id)a1value isEqual:(id)a2value] ) continue; \ + NSString *_expression = [NSString stringWithFormat:@"%s('%@') != %s('%@')", #a1, [a1 description], #a2, [a2 description]]; \ + if (desc) { \ + _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(desc, ##__VA_ARGS__)]; \ + } \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:_expression]]; \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(desc, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +// Generates a failure when a1 is not 'op' to a2. This test is for C scalars. +// Args: +// a1: argument 1 +// a2: argument 2 +// op: operation +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertOperation(a1, a2, op, description, ...) \ +do { \ + @try {\ + if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:[@"Type mismatch -- " stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \ + } else { \ + __typeof__(a1) a1value = (a1); \ + __typeof__(a2) a2value = (a2); \ + if (!(a1value op a2value)) { \ + double a1DoubleValue = a1value; \ + double a2DoubleValue = a2value; \ + NSString *_expression = [NSString stringWithFormat:@"%s (%lg) %s %s (%lg)", #a1, a1DoubleValue, #op, #a2, a2DoubleValue]; \ + if (description) { \ + _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \ + } \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:_expression]]; \ + } \ + } \ + } \ + @catch (id anException) {\ + [self failWithException:[NSException \ + failureInRaise:[NSString stringWithFormat:@"(%s) %s (%s)", #a1, #op, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +// Generates a failure when a1 is not > a2. This test is for C scalars. +// Args: +// a1: argument 1 +// a2: argument 2 +// op: operation +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertGreaterThan(a1, a2, description, ...) \ + STAssertOperation(a1, a2, >, description, ##__VA_ARGS__) + +// Generates a failure when a1 is not >= a2. This test is for C scalars. +// Args: +// a1: argument 1 +// a2: argument 2 +// op: operation +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertGreaterThanOrEqual(a1, a2, description, ...) \ + STAssertOperation(a1, a2, >=, description, ##__VA_ARGS__) + +// Generates a failure when a1 is not < a2. This test is for C scalars. +// Args: +// a1: argument 1 +// a2: argument 2 +// op: operation +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertLessThan(a1, a2, description, ...) \ + STAssertOperation(a1, a2, <, description, ##__VA_ARGS__) + +// Generates a failure when a1 is not <= a2. This test is for C scalars. +// Args: +// a1: argument 1 +// a2: argument 2 +// op: operation +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertLessThanOrEqual(a1, a2, description, ...) \ + STAssertOperation(a1, a2, <=, description, ##__VA_ARGS__) + +// Generates a failure when string a1 is not equal to string a2. This call +// differs from STAssertEqualObjects in that strings that are different in +// composition (precomposed vs decomposed) will compare equal if their final +// representation is equal. +// ex O + umlaut decomposed is the same as O + umlaut composed. +// Args: +// a1: string 1 +// a2: string 2 +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertEqualStrings(a1, a2, description, ...) \ +do { \ + @try {\ + id a1value = (a1); \ + id a2value = (a2); \ + if (a1value == a2value) continue; \ + if ([a1value isKindOfClass:[NSString class]] && \ + [a2value isKindOfClass:[NSString class]] && \ + [a1value compare:a2value options:0] == NSOrderedSame) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject: a1value \ + andObject: a2value \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +// Generates a failure when string a1 is equal to string a2. This call +// differs from STAssertEqualObjects in that strings that are different in +// composition (precomposed vs decomposed) will compare equal if their final +// representation is equal. +// ex O + umlaut decomposed is the same as O + umlaut composed. +// Args: +// a1: string 1 +// a2: string 2 +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNotEqualStrings(a1, a2, description, ...) \ +do { \ + @try {\ + id a1value = (a1); \ + id a2value = (a2); \ + if ([a1value isKindOfClass:[NSString class]] && \ + [a2value isKindOfClass:[NSString class]] && \ + [a1value compare:a2value options:0] != NSOrderedSame) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject: a1value \ + andObject: a2value \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +// Generates a failure when c-string a1 is not equal to c-string a2. +// Args: +// a1: string 1 +// a2: string 2 +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertEqualCStrings(a1, a2, description, ...) \ +do { \ + @try {\ + const char* a1value = (a1); \ + const char* a2value = (a2); \ + if (a1value == a2value) continue; \ + if (strcmp(a1value, a2value) == 0) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject: [NSString stringWithUTF8String:a1value] \ + andObject: [NSString stringWithUTF8String:a2value] \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +// Generates a failure when c-string a1 is equal to c-string a2. +// Args: +// a1: string 1 +// a2: string 2 +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNotEqualCStrings(a1, a2, description, ...) \ +do { \ + @try {\ + const char* a1value = (a1); \ + const char* a2value = (a2); \ + if (strcmp(a1value, a2value) != 0) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject: [NSString stringWithUTF8String:a1value] \ + andObject: [NSString stringWithUTF8String:a2value] \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +#if GTM_IPHONE_SDK + +// SENTE_BEGIN +/*" Generates a failure when !{ [a1 isEqualTo:a2] } is false + (or one is nil and the other is not). + _{a1 The object on the left.} + _{a2 The object on the right.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertEqualObjects(a1, a2, description, ...) \ +do { \ + @try {\ + id a1value = (a1); \ + id a2value = (a2); \ + if (a1value == a2value) continue; \ + if ( (@encode(__typeof__(a1value)) == @encode(id)) && \ + (@encode(__typeof__(a2value)) == @encode(id)) && \ + [(id)a1value isEqual: (id)a2value] ) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject: a1value \ + andObject: a2value \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + + +/*" Generates a failure when a1 is not equal to a2. This test is for + C scalars, structs and unions. + _{a1 The argument on the left.} + _{a2 The argument on the right.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertEquals(a1, a2, description, ...) \ +do { \ + @try {\ + if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:[@"Type mismatch -- " stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \ + } else { \ + __typeof__(a1) a1value = (a1); \ + __typeof__(a2) a2value = (a2); \ + NSValue *a1encoded = [NSValue value:&a1value withObjCType: @encode(__typeof__(a1))]; \ + NSValue *a2encoded = [NSValue value:&a2value withObjCType: @encode(__typeof__(a2))]; \ + if (![a1encoded isEqualToValue:a2encoded]) { \ + [self failWithException:[NSException failureInEqualityBetweenValue: a1encoded \ + andValue: a2encoded \ + withAccuracy: nil \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + } \ + } \ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + +#define STAbsoluteDifference(left,right) (MAX(left,right)-MIN(left,right)) + + +/*" Generates a failure when a1 is not equal to a2 within + or - accuracy is false. + This test is for scalars such as floats and doubles where small differences + could make these items not exactly equal, but also works for all scalars. + _{a1 The scalar on the left.} + _{a2 The scalar on the right.} + _{accuracy The maximum difference between a1 and a2 for these values to be + considered equal.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ + +#define STAssertEqualsWithAccuracy(a1, a2, accuracy, description, ...) \ +do { \ + @try {\ + if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:[@"Type mismatch -- " stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \ + } else { \ + __typeof__(a1) a1value = (a1); \ + __typeof__(a2) a2value = (a2); \ + __typeof__(accuracy) accuracyvalue = (accuracy); \ + if (STAbsoluteDifference(a1value, a2value) > accuracyvalue) { \ + NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \ + NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \ + NSValue *accuracyencoded = [NSValue value:&accuracyvalue withObjCType:@encode(__typeof__(accuracy))]; \ + [self failWithException:[NSException failureInEqualityBetweenValue: a1encoded \ + andValue: a2encoded \ + withAccuracy: accuracyencoded \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + } \ + } \ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + + + +/*" Generates a failure unconditionally. + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STFail(description, ...) \ +[self failWithException:[NSException failureInFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]] + + + +/*" Generates a failure when a1 is not nil. + _{a1 An object.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertNil(a1, description, ...) \ +do { \ + @try {\ + id a1value = (a1); \ + if (a1value != nil) { \ + NSString *_a1 = [NSString stringWithUTF8String: #a1]; \ + NSString *_expression = [NSString stringWithFormat:@"((%@) == nil)", _a1]; \ + [self failWithException:[NSException failureInCondition: _expression \ + isTrue: NO \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == nil fails", #a1] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + + +/*" Generates a failure when a1 is nil. + _{a1 An object.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertNotNil(a1, description, ...) \ +do { \ + @try {\ + id a1value = (a1); \ + if (a1value == nil) { \ + NSString *_a1 = [NSString stringWithUTF8String: #a1]; \ + NSString *_expression = [NSString stringWithFormat:@"((%@) != nil)", _a1]; \ + [self failWithException:[NSException failureInCondition: _expression \ + isTrue: NO \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + }\ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != nil fails", #a1] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while(0) + + +/*" Generates a failure when expression evaluates to false. + _{expr The expression that is tested.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertTrue(expr, description, ...) \ +do { \ + BOOL _evaluatedExpression = (expr);\ + if (!_evaluatedExpression) {\ + NSString *_expression = [NSString stringWithUTF8String: #expr];\ + [self failWithException:[NSException failureInCondition: _expression \ + isTrue: NO \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while (0) + + +/*" Generates a failure when expression evaluates to false and in addition will + generate error messages if an exception is encountered. + _{expr The expression that is tested.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertTrueNoThrow(expr, description, ...) \ +do { \ + @try {\ + BOOL _evaluatedExpression = (expr);\ + if (!_evaluatedExpression) {\ + NSString *_expression = [NSString stringWithUTF8String: #expr];\ + [self failWithException:[NSException failureInCondition: _expression \ + isTrue: NO \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + } \ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) ", #expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while (0) + + +/*" Generates a failure when the expression evaluates to true. + _{expr The expression that is tested.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertFalse(expr, description, ...) \ +do { \ + BOOL _evaluatedExpression = (expr);\ + if (_evaluatedExpression) {\ + NSString *_expression = [NSString stringWithUTF8String: #expr];\ + [self failWithException:[NSException failureInCondition: _expression \ + isTrue: YES \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while (0) + + +/*" Generates a failure when the expression evaluates to true and in addition + will generate error messages if an exception is encountered. + _{expr The expression that is tested.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertFalseNoThrow(expr, description, ...) \ +do { \ + @try {\ + BOOL _evaluatedExpression = (expr);\ + if (_evaluatedExpression) {\ + NSString *_expression = [NSString stringWithUTF8String: #expr];\ + [self failWithException:[NSException failureInCondition: _expression \ + isTrue: YES \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + } \ + @catch (id anException) {\ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"!(%s) ", #expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while (0) + + +/*" Generates a failure when expression does not throw an exception. + _{expression The expression that is evaluated.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent. +"*/ +#define STAssertThrows(expr, description, ...) \ +do { \ + @try { \ + (expr);\ + } \ + @catch (id anException) { \ + continue; \ + }\ + [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ + exception: nil \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ +} while (0) + + +/*" Generates a failure when expression does not throw an exception of a + specific class. + _{expression The expression that is evaluated.} + _{specificException The specified class of the exception.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertThrowsSpecific(expr, specificException, description, ...) \ +do { \ + @try { \ + (expr);\ + } \ + @catch (specificException *anException) { \ + continue; \ + }\ + @catch (id anException) {\ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\ + [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ + exception: anException \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ + continue; \ + }\ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\ + [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ + exception: nil \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ +} while (0) + + +/*" Generates a failure when expression does not throw an exception of a + specific class with a specific name. Useful for those frameworks like + AppKit or Foundation that throw generic NSException w/specific names + (NSInvalidArgumentException, etc). + _{expression The expression that is evaluated.} + _{specificException The specified class of the exception.} + _{aName The name of the specified exception.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} + +"*/ +#define STAssertThrowsSpecificNamed(expr, specificException, aName, description, ...) \ +do { \ + @try { \ + (expr);\ + } \ + @catch (specificException *anException) { \ + if ([aName isEqualToString: [anException name]]) continue; \ + NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description);\ + [self failWithException: \ + [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ + exception: anException \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ + continue; \ + }\ + @catch (id anException) {\ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\ + [self failWithException: \ + [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ + exception: anException \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ + continue; \ + }\ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\ + [self failWithException: \ + [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ + exception: nil \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ +} while (0) + + +/*" Generates a failure when expression does throw an exception. + _{expression The expression that is evaluated.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertNoThrow(expr, description, ...) \ +do { \ + @try { \ + (expr);\ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ + exception: anException \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + }\ +} while (0) + + +/*" Generates a failure when expression does throw an exception of the specitied + class. Any other exception is okay (i.e. does not generate a failure). + _{expression The expression that is evaluated.} + _{specificException The specified class of the exception.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertNoThrowSpecific(expr, specificException, description, ...) \ +do { \ + @try { \ + (expr);\ + } \ + @catch (specificException *anException) { \ + [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ + exception: anException \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(description, ##__VA_ARGS__)]]; \ + }\ + @catch (id anythingElse) {\ + ; \ + }\ +} while (0) + + +/*" Generates a failure when expression does throw an exception of a + specific class with a specific name. Useful for those frameworks like + AppKit or Foundation that throw generic NSException w/specific names + (NSInvalidArgumentException, etc). + _{expression The expression that is evaluated.} + _{specificException The specified class of the exception.} + _{aName The name of the specified exception.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} + +"*/ +#define STAssertNoThrowSpecificNamed(expr, specificException, aName, description, ...) \ +do { \ + @try { \ + (expr);\ + } \ + @catch (specificException *anException) { \ + if ([aName isEqualToString: [anException name]]) { \ + NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description);\ + [self failWithException: \ + [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \ + exception: anException \ + inFile: [NSString stringWithUTF8String:__FILE__] \ + atLine: __LINE__ \ + withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \ + } \ + continue; \ + }\ + @catch (id anythingElse) {\ + ; \ + }\ +} while (0) + + + +@interface NSException (GTMSenTestAdditions) ++ (NSException *)failureInFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ...; ++ (NSException *)failureInCondition:(NSString *)condition + isTrue:(BOOL)isTrue + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ...; ++ (NSException *)failureInEqualityBetweenObject:(id)left + andObject:(id)right + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ...; ++ (NSException *)failureInEqualityBetweenValue:(NSValue *)left + andValue:(NSValue *)right + withAccuracy:(NSValue *)accuracy + inFile:(NSString *)filename + atLine:(int) ineNumber + withDescription:(NSString *)formatString, ...; ++ (NSException *)failureInRaise:(NSString *)expression + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ...; ++ (NSException *)failureInRaise:(NSString *)expression + exception:(NSException *)exception + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ...; +@end + +// SENTE_END + +@interface SenTestCase : NSObject { + SEL currentSelector_; +} + +- (void)setUp; +- (void)invokeTest; +- (void)tearDown; +- (void)performTest:(SEL)sel; +- (void)failWithException:(NSException*)exception; +@end + +GTM_EXTERN NSString *const SenTestFailureException; + +GTM_EXTERN NSString *const SenTestFilenameKey; +GTM_EXTERN NSString *const SenTestLineNumberKey; + +#endif // GTM_IPHONE_SDK + +// All unittest cases in GTM should inherit from GTMTestCase. It makes sure +// to set up our logging system correctly to verify logging calls. +// See GTMUnitTestDevLog.h for details +@interface GTMTestCase : SenTestCase +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMSenTestCase.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMSenTestCase.m new file mode 100644 index 00000000..8482c5a6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMSenTestCase.m @@ -0,0 +1,362 @@ +// +// GTMSenTestCase.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import + +#if !GTM_IPHONE_SDK +#import "GTMGarbageCollection.h" +#endif // !GTM_IPHONE_SDK + +#if GTM_IPHONE_SDK +#import + +@interface NSException (GTMSenTestPrivateAdditions) ++ (NSException *)failureInFile:(NSString *)filename + atLine:(int)lineNumber + reason:(NSString *)reason; +@end + +@implementation NSException (GTMSenTestPrivateAdditions) ++ (NSException *)failureInFile:(NSString *)filename + atLine:(int)lineNumber + reason:(NSString *)reason { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:lineNumber], SenTestLineNumberKey, + filename, SenTestFilenameKey, + nil]; + + return [self exceptionWithName:SenTestFailureException + reason:reason + userInfo:userInfo]; +} +@end + +@implementation NSException (GTMSenTestAdditions) + ++ (NSException *)failureInFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason = testDescription; + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + ++ (NSException *)failureInCondition:(NSString *)condition + isTrue:(BOOL)isTrue + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason = [NSString stringWithFormat:@"'%@' should be %s. %@", + condition, isTrue ? "TRUE" : "FALSE", testDescription]; + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + ++ (NSException *)failureInEqualityBetweenObject:(id)left + andObject:(id)right + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason = + [NSString stringWithFormat:@"'%@' should be equal to '%@'. %@", + [left description], [right description], testDescription]; + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + ++ (NSException *)failureInEqualityBetweenValue:(NSValue *)left + andValue:(NSValue *)right + withAccuracy:(NSValue *)accuracy + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason; + if (accuracy) { + reason = + [NSString stringWithFormat:@"'%@' should be equal to '%@'. %@", + left, right, testDescription]; + } else { + reason = + [NSString stringWithFormat:@"'%@' should be equal to '%@' +/-'%@'. %@", + left, right, accuracy, testDescription]; + } + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + ++ (NSException *)failureInRaise:(NSString *)expression + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason = [NSString stringWithFormat:@"'%@' should raise. %@", + expression, testDescription]; + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + ++ (NSException *)failureInRaise:(NSString *)expression + exception:(NSException *)exception + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason; + if ([[exception name] isEqualToString:SenTestFailureException]) { + // it's our exception, assume it has the right description on it. + reason = [exception reason]; + } else { + // not one of our exception, use the exceptions reason and our description + reason = [NSString stringWithFormat:@"'%@' raised '%@'. %@", + expression, [exception reason], testDescription]; + } + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + +@end + +NSString *STComposeString(NSString *formatString, ...) { + NSString *reason = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + reason = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + return reason; +} + +NSString *const SenTestFailureException = @"SenTestFailureException"; +NSString *const SenTestFilenameKey = @"SenTestFilenameKey"; +NSString *const SenTestLineNumberKey = @"SenTestLineNumberKey"; + +@interface SenTestCase (SenTestCasePrivate) +// our method of logging errors ++ (void)printException:(NSException *)exception fromTestName:(NSString *)name; +@end + +@implementation SenTestCase +- (void)failWithException:(NSException*)exception { + [exception raise]; +} + +- (void)setUp { +} + +- (void)performTest:(SEL)sel { + currentSelector_ = sel; + @try { + [self invokeTest]; + } @catch (NSException *exception) { + [[self class] printException:exception + fromTestName:NSStringFromSelector(sel)]; + [exception raise]; + } +} + ++ (void)printException:(NSException *)exception fromTestName:(NSString *)name { + NSDictionary *userInfo = [exception userInfo]; + NSString *filename = [userInfo objectForKey:SenTestFilenameKey]; + NSNumber *lineNumber = [userInfo objectForKey:SenTestLineNumberKey]; + NSString *className = NSStringFromClass([self class]); + if ([filename length] == 0) { + filename = @"Unknown.m"; + } + fprintf(stderr, "%s:%ld: error: -[%s %s] : %s\n", + [filename UTF8String], + (long)[lineNumber integerValue], + [className UTF8String], + [name UTF8String], + [[exception reason] UTF8String]); + fflush(stderr); +} + +- (void)invokeTest { + NSException *e = nil; + @try { + // Wrap things in autorelease pools because they may + // have an STMacro in their dealloc which may get called + // when the pool is cleaned up + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + // We don't log exceptions here, instead we let the person that called + // this log the exception. This ensures they are only logged once but the + // outer layers get the exceptions to report counts, etc. + @try { + [self setUp]; + @try { + [self performSelector:currentSelector_]; + } @catch (NSException *exception) { + e = [exception retain]; + } + [self tearDown]; + } @catch (NSException *exception) { + e = [exception retain]; + } + [pool release]; + } @catch (NSException *exception) { + e = [exception retain]; + } + if (e) { + [e autorelease]; + [e raise]; + } +} + +- (void)tearDown { +} + +- (NSString *)description { + // This matches the description OCUnit would return to you + return [NSString stringWithFormat:@"-[%@ %@]", [self class], + NSStringFromSelector(currentSelector_)]; +} +@end + +#endif // GTM_IPHONE_SDK + +@implementation GTMTestCase : SenTestCase +- (void)invokeTest { + Class devLogClass = NSClassFromString(@"GTMUnitTestDevLog"); + if (devLogClass) { + [devLogClass performSelector:@selector(enableTracking)]; + [devLogClass performSelector:@selector(verifyNoMoreLogsExpected)]; + + } + [super invokeTest]; + if (devLogClass) { + [devLogClass performSelector:@selector(verifyNoMoreLogsExpected)]; + [devLogClass performSelector:@selector(disableTracking)]; + } +} +@end + +// Leak detection +#if !GTM_IPHONE_DEVICE +// Don't want to get leaks on the iPhone Device as the device doesn't +// have 'leaks'. The simulator does though. + +static void _GTMRunLeaks(void) { + // This is an atexit handler. It runs leaks for us to check if we are + // leaking anything in our tests. + const char* cExclusionsEnv = getenv("GTM_LEAKS_SYMBOLS_TO_IGNORE"); + NSMutableString *exclusions = [NSMutableString string]; + if (cExclusionsEnv) { + NSString *exclusionsEnv = [NSString stringWithUTF8String:cExclusionsEnv]; + NSArray *exclusionsArray = [exclusionsEnv componentsSeparatedByString:@","]; + NSString *exclusion; + NSCharacterSet *wcSet = [NSCharacterSet whitespaceCharacterSet]; + GTM_FOREACH_OBJECT(exclusion, exclusionsArray) { + exclusion = [exclusion stringByTrimmingCharactersInSet:wcSet]; + [exclusions appendFormat:@"-exclude \"%@\" ", exclusion]; + } + } + NSString *string + = [NSString stringWithFormat:@"/usr/bin/leaks %@%d" + @"| /usr/bin/sed -e 's/Leak: /Leaks:0: warning: Leak /'", + exclusions, getpid()]; + int ret = system([string UTF8String]); + if (ret) { + fprintf(stderr, "%s:%d: Error: Unable to run leaks. 'system' returned: %d", + __FILE__, __LINE__, ret); + fflush(stderr); + } +} + +static __attribute__((constructor)) void _GTMInstallLeaks(void) { + BOOL checkLeaks = YES; +#if !GTM_IPHONE_SDK + checkLeaks = GTMIsGarbageCollectionEnabled() ? NO : YES; +#endif // !GTM_IPHONE_SDK + if (checkLeaks) { + checkLeaks = getenv("GTM_ENABLE_LEAKS") ? YES : NO; + if (checkLeaks) { + if (checkLeaks) { + fprintf(stderr, "Leak Checking Enabled\n"); + fflush(stderr); + int ret = atexit(&_GTMRunLeaks); + _GTMDevAssert(ret == 0, + @"Unable to install _GTMRunLeaks as an atexit handler (%d)", + errno); + } + } + } +} + +#endif // !GTM_IPHONE_DEVICE diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestHTTPServer.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestHTTPServer.h new file mode 100644 index 00000000..0128718b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestHTTPServer.h @@ -0,0 +1,39 @@ +// +// GTMTestHTTPServer.h +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +@class GTMHTTPServer; + +// This is a HTTP Server that can respond to certain requests that look like +// Google service logins. It takes extra url arguments to tell it what to +// return for testing the code using it. See GTMHTTPFetcherTest for an example +// of its usage. +@interface GTMTestHTTPServer : NSObject { + NSString *docRoot_; + GTMHTTPServer *server_; +} + +// Any url that isn't a specific server request (login, etc.), will be fetched +// off |docRoot| (to allow canned repsonses). +- (id)initWithDocRoot:(NSString *)docRoot; + +// fetch the port the server is running on +- (uint16_t)port; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestHTTPServer.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestHTTPServer.m new file mode 100644 index 00000000..7744b5e9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestHTTPServer.m @@ -0,0 +1,166 @@ +// +// GTMTestHTTPServer.m +// +// Copyright 2007-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMTestHTTPServer.h" +#import "GTMHTTPServer.h" +#import "GTMRegex.h" + +static NSArray *GetSubPatternsOfFirstStringMatchedByPattern(NSString *stringToSearch, + NSString *pattern) { + GTMRegex *regex = [GTMRegex regexWithPattern:pattern]; + NSString *firstMatch = [regex firstSubStringMatchedInString:stringToSearch]; + NSArray *subPatterns = [regex subPatternsOfString:firstMatch]; + return subPatterns; +} + +@implementation GTMTestHTTPServer + +- (id)initWithDocRoot:(NSString *)docRoot { + self = [super init]; + if (self) { + docRoot_ = [docRoot copy]; + server_ = [[GTMHTTPServer alloc] initWithDelegate:self]; + NSError *error = nil; + if ((docRoot == nil) || (![server_ start:&error])) { + _GTMDevLog(@"Failed to start up the webserver (docRoot='%@', error=%@)", + docRoot_, error); + [self release]; + return nil; + } + } + return self; +} + +- (void)dealloc { + [docRoot_ release]; + [server_ release]; + [super dealloc]; +} + +- (uint16_t)port { + return [server_ port]; +} + +- (GTMHTTPResponseMessage *)httpServer:(GTMHTTPServer *)server + handleRequest:(GTMHTTPRequestMessage *)request { + _GTMDevAssert(server == server_, @"how'd we get a different server?!"); + UInt32 resultStatus = 0; + NSData *data = nil; + // clients should treat dates as opaque, generally + NSString *modifiedDate = @"thursday"; + + NSString *postString = @""; + NSData *postData = [request body]; + if ([postData length] > 0) { + postString = [[[NSString alloc] initWithData:postData + encoding:NSUTF8StringEncoding] autorelease]; + } + + NSDictionary *allHeaders = [request allHeaderFieldValues]; + NSString *ifModifiedSince = [allHeaders objectForKey:@"If-Modified-Since"]; + NSString *authorization = [allHeaders objectForKey:@"Authorization"]; + NSString *path = [[request URL] absoluteString]; + + if ([path hasSuffix:@".auth"]) { + if (![authorization isEqualToString:@"GoogleLogin auth=GoodAuthToken"]) { + GTMHTTPResponseMessage *response = + [GTMHTTPResponseMessage emptyResponseWithCode:401]; + return response; + } else { + path = [path substringToIndex:[path length] - 5]; + } + } + + NSString *overrideHeader = [allHeaders objectForKey:@"X-HTTP-Method-Override"]; + NSString *httpCommand = [request method]; + if ([httpCommand isEqualToString:@"POST"] && + [overrideHeader length] > 1) { + httpCommand = overrideHeader; + } + NSArray *searchResult = nil; + if ([path hasSuffix:@"/accounts/ClientLogin"]) { + // it's a sign-in attempt; it's good unless the password is "bad" or + // "captcha" + + // use regular expression to find the password + NSString *password = @""; + searchResult = GetSubPatternsOfFirstStringMatchedByPattern(path, @"Passwd=([^&\n]*)"); + if ([searchResult count] == 2) { + password = [searchResult objectAtIndex:1]; + } + + if ([password isEqualToString:@"bad"]) { + resultStatus = 403; + } else if ([password isEqualToString:@"captcha"]) { + NSString *loginToken = @""; + NSString *loginCaptcha = @""; + + searchResult = GetSubPatternsOfFirstStringMatchedByPattern(postString, @"logintoken=([^&\n]*)"); + if ([searchResult count] == 2) { + loginToken = [searchResult objectAtIndex:1]; + } + + searchResult = GetSubPatternsOfFirstStringMatchedByPattern(postString, @"logincaptcha=([^&\n]*)"); + if ([searchResult count] == 2) { + loginCaptcha = [searchResult objectAtIndex:1]; + } + + if ([loginToken isEqualToString:@"CapToken"] && + [loginCaptcha isEqualToString:@"good"]) { + resultStatus = 200; + } else { + // incorrect captcha token or answer provided + resultStatus = 403; + } + } else { + // valid username/password + resultStatus = 200; + } + } else if ([httpCommand isEqualToString:@"DELETE"]) { + // it's an object delete; read and return empty data + resultStatus = 200; + } else { + // queries that have something like "?status=456" should fail with the + // status code + searchResult = GetSubPatternsOfFirstStringMatchedByPattern(path, @"status=([0-9]+)"); + if ([searchResult count] == 2) { + resultStatus = [[searchResult objectAtIndex:1] intValue]; + } else if ([ifModifiedSince isEqualToString:modifiedDate]) { + resultStatus = 304; + } else { + NSString *docPath = [docRoot_ stringByAppendingPathComponent:path]; + data = [NSData dataWithContentsOfFile:docPath]; + if (data) { + resultStatus = 200; + } else { + resultStatus = 404; + } + } + } + + GTMHTTPResponseMessage *response = + [GTMHTTPResponseMessage responseWithBody:data + contentType:@"text/plain" + statusCode:resultStatus]; + [response setValue:modifiedDate forHeaderField:@"Last-Modified"]; + [response setValue:[NSString stringWithFormat:@"TestCookie=%@", [path lastPathComponent]] + forHeaderField:@"Set-Cookie"]; + return response; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestTimer.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestTimer.h new file mode 100644 index 00000000..6c5fc55c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestTimer.h @@ -0,0 +1,125 @@ +// +// GTMTestTimer.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMDefines.h" +#import + +// GTMTestTimer is done in straight inline C to avoid obj-c calling overhead. +// It is for doing test timings at very high precision. +// Test Timers have standard CoreFoundation Retain/Release rules. +// Test Timers are not thread safe. Test Timers do NOT check their arguments +// for NULL. You will crash if you pass a NULL argument in. + +typedef struct { + mach_timebase_info_data_t time_base_info_; + bool running_; + uint64_t start_; + uint64_t split_; + uint64_t elapsed_; + NSUInteger iterations_; + NSUInteger retainCount_; +} GTMTestTimer; + +// Create a test timer +GTM_INLINE GTMTestTimer *GTMTestTimerCreate(void) { + GTMTestTimer *t = calloc(sizeof(GTMTestTimer), 1); + if (t) { + if (mach_timebase_info(&t->time_base_info_) == KERN_SUCCESS) { + t->retainCount_ = 1; + } else { + // COV_NF_START + free(t); + t = NULL; + // COV_NF_END + } + } + return t; +} + +// Retain a timer +GTM_INLINE void GTMTestTimerRetain(GTMTestTimer *t) { + t->retainCount_ += 1; +} + +// Release a timer. When release count hits zero, we free it. +GTM_INLINE void GTMTestTimerRelease(GTMTestTimer *t) { + t->retainCount_ -= 1; + if (t->retainCount_ == 0) { + free(t); + } +} + +// Starts a timer timing. Specifically starts a new split. If the timer is +// currently running, it resets the start time of the current split. +GTM_INLINE void GTMTestTimerStart(GTMTestTimer *t) { + t->start_ = mach_absolute_time(); + t->running_ = true; +} + +// Stops a timer and returns split time (time from last start) in nanoseconds. +GTM_INLINE uint64_t GTMTestTimerStop(GTMTestTimer *t) { + uint64_t now = mach_absolute_time(); + t->running_ = false; + ++t->iterations_; + t->split_ = now - t->start_; + t->elapsed_ += t->split_; + t->start_ = 0; + return t->split_; +} + +// returns the current timer elapsed time (combined value of all splits, plus +// current split if the timer is running) in nanoseconds. +GTM_INLINE double GTMTestTimerGetNanoseconds(GTMTestTimer *t) { + uint64_t total = t->elapsed_; + if (t->running_) { + total += mach_absolute_time() - t->start_; + } + return (double)(total * t->time_base_info_.numer + / t->time_base_info_.denom); +} + +// Returns the current timer elapsed time (combined value of all splits, plus +// current split if the timer is running) in seconds. +GTM_INLINE double GTMTestTimerGetSeconds(GTMTestTimer *t) { + return GTMTestTimerGetNanoseconds(t) * 0.000000001; +} + +// Returns the current timer elapsed time (combined value of all splits, plus +// current split if the timer is running) in milliseconds. +GTM_INLINE double GTMTestTimerGetMilliseconds(GTMTestTimer *t) { + return GTMTestTimerGetNanoseconds(t) * 0.000001; +} + +// Returns the current timer elapsed time (combined value of all splits, plus +// current split if the timer is running) in microseconds. +GTM_INLINE double GTMTestTimerGetMicroseconds(GTMTestTimer *t) { + return GTMTestTimerGetNanoseconds(t) * 0.001; +} + +// Returns the number of splits (start-stop) cycles recorded. +// GTMTestTimerGetSeconds()/GTMTestTimerGetIterations() gives you an average +// of all your splits. +GTM_INLINE NSUInteger GTMTestTimerGetIterations(GTMTestTimer *t) { + return t->iterations_; +} + +// Returns true if the timer is running. +GTM_INLINE bool GTMTestTimerIsRunning(GTMTestTimer *t) { + return t->running_; +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestTimerTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestTimerTest.m new file mode 100644 index 00000000..86f9d221 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMTestTimerTest.m @@ -0,0 +1,56 @@ +// +// GTMTestTimerTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMTestTimer.h" + +@interface GTMTestTimerTest : GTMTestCase +@end + +@implementation GTMTestTimerTest +- (void)testTimer { + GTMTestTimer *timer = GTMTestTimerCreate(); + STAssertNotNULL(timer, nil); + GTMTestTimerRetain(timer); + GTMTestTimerRelease(timer); + STAssertEqualsWithAccuracy(GTMTestTimerGetSeconds(timer), 0.0, 0.0, nil); + GTMTestTimerStart(timer); + STAssertTrue(GTMTestTimerIsRunning(timer), nil); + NSRunLoop *loop = [NSRunLoop currentRunLoop]; + [loop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + GTMTestTimerStop(timer); + + // We use greater than (and an almost absurd less than) because + // these tests are very dependant on machine load, and we don't want + // automated tests reporting false negatives. + STAssertGreaterThan(GTMTestTimerGetSeconds(timer), 0.1, nil); + STAssertGreaterThan(GTMTestTimerGetMilliseconds(timer), 100.0,nil); + STAssertGreaterThan(GTMTestTimerGetMicroseconds(timer), 100000.0, nil); + + // Check to make sure we're not WAY off the mark (by a factor of 10) + STAssertLessThan(GTMTestTimerGetMicroseconds(timer), 1000000.0, nil); + + [loop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + GTMTestTimerStart(timer); + [loop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + STAssertGreaterThan(GTMTestTimerGetSeconds(timer), 0.2, nil); + GTMTestTimerStop(timer); + STAssertEquals(GTMTestTimerGetIterations(timer), (NSUInteger)2, nil); + GTMTestTimerRelease(timer); +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTesting.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTesting.h new file mode 100644 index 00000000..ee420e94 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTesting.h @@ -0,0 +1,128 @@ +// +// GTMUIKit+UnitTesting.h +// +// Code for making unit testing of graphics/UI easier. Generally you +// will only want to look at the macros: +// GTMAssertDrawingEqualToFile +// GTMAssertViewRepEqualToFile +// and the protocol GTMUnitTestViewDrawer. When using these routines +// make sure you are using device colors and not calibrated/generic colors +// or else your test graphics WILL NOT match across devices/graphics cards. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMNSObject+UnitTesting.h" + +@protocol GTMUnitTestViewDrawer; + +// Fails when the |a1|'s drawing in an area |a2| does not equal the image file named |a3|. +// See the description of the GTMAssertViewRepEqualToFile macro +// to understand how |a3| is found and written out. +// See the description of the GTMUnitTestView for a better idea +// how the view works. +// Implemented as a macro to match the rest of the SenTest macros. +// +// Args: +// a1: The object that implements the GTMUnitTestViewDrawer protocol +// that is doing the drawing. +// a2: The size of the drawing +// a3: The name of the image file to check against. +// Do not include the extension +// a4: contextInfo to pass to drawer +// description: A format string as in the printf() function. +// Can be nil or an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +// + +#define GTMAssertDrawingEqualToFile(a1, a2, a3, a4, description, ...) \ + do { \ + id a1Drawer = (a1); \ + CGSize a2Size = (a2); \ + NSString* a3String = (a3); \ + void *a4ContextInfo = (a4); \ + CGRect frame = CGRectMake(0, 0, a2Size.width, a2Size.height); \ + GTMUnitTestView *view = [[[GTMUnitTestView alloc] initWithFrame:frame drawer:a1Drawer contextInfo:a4ContextInfo] autorelease]; \ + GTMAssertObjectImageEqualToImageNamed(view, a3String, STComposeString(description, ##__VA_ARGS__)); \ + } while(0) + +// Category for making unit testing of graphics/UI easier. + +// Allows you to take a state of a view. Supports both image and state. +// See GTMNSObject+UnitTesting.h for details. +@interface UIView (GTMUnitTestingAdditions) + +// Encodes the state of an object in a manner suitable for comparing against a master state file +// This enables us to determine whether the object is in a suitable state. +// +// Arguments: +// inCoder - the coder to encode our state into +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder; + +// Returns whether gtm_unitTestEncodeState should recurse into subviews +// +// Returns: +// should gtm_unitTestEncodeState pick up subview state. +- (BOOL)gtm_shouldEncodeStateForSubviews; +@end + +// Category to help UIImage testing. UIImage can be tested using +// GTMAssertObjectImageEqualToImageNamed macro, which automatically creates +// result images and diff images in case test fails. +@interface UIImage (GTMUnitTestingAdditions) +@end + +// A view that allows you to delegate out drawing using the formal +// GTMUnitTestViewDelegate protocol +// This is useful when writing up unit tests for visual elements. +// Your test will often end up looking like this: +// - (void)testFoo { +// GTMAssertDrawingEqualToFile(self, CGSizeMake(200, 200), @"Foo", nil, nil); +// } +// and your testSuite will also implement the unitTestViewDrawRect method to do +// it's actual drawing. The above creates a view of size 200x200 that draws +// it's content using |self|'s unitTestViewDrawRect method and compares it to +// the contents of the file Foo.tif to make sure it's valid +@interface GTMUnitTestView : UIView { + @private + id drawer_; // delegate for doing drawing (STRONG) + void* contextInfo_; // info passed in by user for them to use when drawing +} + +// Create a GTMUnitTestView. +// +// Args: +// rect: the area to draw. +// drawer: the object that will do the drawing via the GTMUnitTestViewDrawer +// protocol +// contextInfo: +- (id)initWithFrame:(CGRect)frame drawer:(id)drawer contextInfo:(void*)contextInfo; + +@end + +/// \cond Protocols + +// Formal protocol for doing unit testing of views. See description of +// GTMUnitTestView for details. +@protocol GTMUnitTestViewDrawer + +// Draw the view. Equivalent to drawRect on a standard UIView. +// +// Args: +// rect: the area to draw. +- (void)gtm_unitTestViewDrawRect:(CGRect)rect contextInfo:(void*)contextInfo; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTesting.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTesting.m new file mode 100644 index 00000000..7d3f200e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTesting.m @@ -0,0 +1,122 @@ +// +// GTMUIKit+UnitTesting.m +// +// Category for making unit testing of graphics/UI easier. +// Allows you to save a view out to a image file, and compare a view +// with a previously stored representation to make sure it hasn't changed. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMUIKit+UnitTesting.h" +#import "GTMCALayer+UnitTesting.h" +#import "GTMDefines.h" + +#if !GTM_IPHONE_SDK +#error This file is for iPhone use only +#endif // GTM_IPHONE_SDK + +// A view that allows you to delegate out drawing using the formal +// GTMUnitTestViewDelegate protocol above. This is useful when writing up unit +// tests for visual elements. +// Your test will often end up looking like this: +// - (void)testFoo { +// GTMAssertDrawingEqualToFile(self, CGSizeMake(200, 200), @"Foo", nil, nil); +// } +// and your testSuite will also implement the unitTestViewDrawRect method to do +// it's actual drawing. The above creates a view of size 200x200 that draws +// it's content using |self|'s unitTestViewDrawRect method and compares it to +// the contents of the file Foo.tif to make sure it's valid +@implementation GTMUnitTestView + +- (id)initWithFrame:(CGRect)frame + drawer:(id)drawer + contextInfo:(void*)contextInfo{ + self = [super initWithFrame:frame]; + if (self != nil) { + drawer_ = [drawer retain]; + contextInfo_ = contextInfo; + } + return self; +} + +- (void)dealloc { + [drawer_ release]; + [super dealloc]; +} + +- (void)drawRect:(CGRect)rect { + [drawer_ gtm_unitTestViewDrawRect:rect contextInfo:contextInfo_]; +} + +@end + +@implementation UIView (GTMUnitTestingAdditions) + +// Returns an image containing a representation of the object +// suitable for use in comparing against a master image. +// NB this means that all colors should be from "NSDevice" color space +// Does all of it's drawing with smoothfonts and antialiasing off +// to avoid issues with font smoothing settings and antialias differences +// between ppc and x86. +// +// Returns: +// an image of the object +- (CGImageRef)gtm_unitTestImage { + CALayer* layer = [self layer]; + return [layer gtm_unitTestImage]; +} + +// Encodes the state of an object in a manner suitable for comparing +// against a master state file so we can determine whether the +// object is in a suitable state. +// +// Arguments: +// inCoder - the coder to encode our state into +- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { + [super gtm_unitTestEncodeState:inCoder]; + [inCoder encodeBool:[self isHidden] forKey:@"ViewIsHidden"]; + CALayer* layer = [self layer]; + if (layer) { + [layer gtm_unitTestEncodeState:inCoder]; + } + if ([self gtm_shouldEncodeStateForSubviews]) { + int i = 0; + for (UIView *subview in [self subviews]) { + [inCoder encodeObject:subview + forKey:[NSString stringWithFormat:@"ViewSubView %d", i]]; + i++; + } + } +} + +// Returns whether gtm_unitTestEncodeState should recurse into subviews +// +// Returns: +// should gtm_unitTestEncodeState pick up subview state. +- (BOOL)gtm_shouldEncodeStateForSubviews { + return YES; +} + +- (BOOL)gtm_shouldEncodeStateForSublayersOfLayer:(CALayer*)layer { + return NO; +} +@end + +@implementation UIImage (GTMUnitTestingAdditions) +- (CGImageRef)gtm_unitTestImage { + return [self CGImage]; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTestingTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTestingTest.m new file mode 100644 index 00000000..8b3effae --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIKit+UnitTestingTest.m @@ -0,0 +1,65 @@ +// +// GTMUIKit+UnitTestingTest.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMUIKit+UnitTesting.h" +#import "GTMSenTestCase.h" + +@interface GTMUIView_UnitTestingTest : SenTestCase +@end + +@implementation GTMUIView_UnitTestingTest + +- (void)testDrawing { + GTMAssertDrawingEqualToFile(self, + CGSizeMake(200,200), + @"GTMUIViewUnitTestingTest", + [UIApplication sharedApplication], + nil); +} + +- (void)testState { + UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)] autorelease]; + UIView *subview = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)] autorelease]; + [view addSubview:subview]; + GTMAssertObjectStateEqualToStateNamed(view, @"GTMUIViewUnitTestingTest", nil); +} + +- (void)testUIImage { + NSString* name = @"GTMUIViewUnitTestingTest"; + UIImage* image = + [UIImage imageNamed:[name stringByAppendingPathExtension:@"png"]]; + GTMAssertObjectImageEqualToImageNamed(image, name, nil); +} + +- (void)gtm_unitTestViewDrawRect:(CGRect)rect contextInfo:(void*)contextInfo { + UIApplication *app = [UIApplication sharedApplication]; + STAssertEqualObjects(app, + contextInfo, + @"Should be a UIApplication"); + CGPoint center = CGPointMake(CGRectGetMidX(rect), + CGRectGetMidY(rect)); + rect = CGRectMake(center.x - 50, center.y - 50, 100, 100); + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextAddEllipseInRect(context, rect); + CGContextSetLineWidth(context, 5); + [[UIColor redColor] set]; + CGContextStrokePath(context); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIUnitTestingHarness/Info.plist b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIUnitTestingHarness/Info.plist new file mode 100644 index 00000000..11355f71 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIUnitTestingHarness/Info.plist @@ -0,0 +1,71 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.google.GTMUIUnitTestingHarness + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSMainNibFile + MainMenu + + CFBundleURLTypes + + + CFBundleURLName + GTMUIUnitTestingHarnessURL + CFBundleURLSchemes + + gtmgeturlhandlertest + + GTMBundleURLClass + GTMGetURLHandlerTest + + + CFBundleURLName + GTMGetURLHandlerBadClassURL + CFBundleURLSchemes + + gtmgeturlhandlerbadclasstest + + GTMBundleURLClass + GTMGetURLHandlerBadClassWarning + + + CFBundleURLName + GTMGetURLHandlerMissingClassURL + CFBundleURLSchemes + + gtmgeturlhandlermissingclasstest + + GTMBundleURLClass + GTMGetURLHandlerMissingClassWarning + + + CFBundleURLName + GTMGetURLHandlerMissingHandlerURL + CFBundleURLSchemes + + gtmgeturlhandlermissinghandlerurl + + + + NSPrincipalClass + NSApplication + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIUnitTestingHarness/main.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIUnitTestingHarness/main.m new file mode 100644 index 00000000..8fb364d7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIUnitTestingHarness/main.m @@ -0,0 +1,27 @@ +// +// main.m +// GTMUnitTestingTest +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + + +#import +#import "GTMUnitTestingUtilities.h" + +int main(int argc, char *argv[]) { + [GTMUnitTestingUtilities setUpForUIUnitTestsIfBeingTested]; + return NSApplicationMain(argc, (const char **) argv); +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIViewUnitTestingTest.png b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUIViewUnitTestingTest.png new file mode 100644 index 0000000000000000000000000000000000000000..03fd9f029838d7eb35344dbc56aa814187bf2666 GIT binary patch literal 3214 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 T_{IqLp8>M9a + +// GTMUnitTestDevLog tracks what messages are logged to verify that you only +// log what you expect to log during the running of unittests. This allows you +// to log with impunity from your actual core implementations and still be able +// to find unexpected logs in your output when running unittests. +// In your unittests you tell GTMUnitTestDevLog what messages you expect your +// test to spit out, and it will cause any that don't match to appear as errors +// in your unittest run output. You can match on exact strings or standard +// regexps. +// Set GTM_SHOW_UNITTEST_DEVLOGS in the environment to show the logs that that +// are expected and encountered. Otherwise they aren't display to keep the +// unit test results easier to read. + +@interface GTMUnitTestDevLog : NSObject +// Log a message ++ (void)log:(NSString*)format, ...; ++ (void)log:(NSString*)format args:(va_list)args; + +// Turn tracking on/off ++ (void)enableTracking; ++ (void)disableTracking; ++ (BOOL)isTrackingEnabled; + +// Note that you are expecting a string that has an exact match. No need to +// escape any pattern characters. ++ (void)expectString:(NSString *)format, ...; + +// Note that you are expecting a pattern. Pattern characters that you want +// exact matches on must be escaped. See [GTMRegex escapedPatternForString]. +// Patterns match across newlines (kGTMRegexOptionSupressNewlineSupport) making +// it easier to match output from the descriptions of NS collection types such +// as NSArray and NSDictionary. ++ (void)expectPattern:(NSString *)format, ...; + +// Note that you are expecting exactly 'n' strings ++ (void)expect:(NSUInteger)n casesOfString:(NSString *)format, ...; + +// Note that you are expecting exactly 'n' patterns ++ (void)expect:(NSUInteger)n casesOfPattern:(NSString*)format, ...; ++ (void)expect:(NSUInteger)n casesOfPattern:(NSString*)format args:(va_list)args; + +// Call when you want to verify that you have matched all the logs you expect +// to match. If your unittests inherit from GTMTestcase (like they should) you +// will get this called for free. ++ (void)verifyNoMoreLogsExpected; + +// Resets the expected logs so that you don't have anything expected. +// In general should not be needed, unless you have a variable logging case +// of some sort. ++ (void)resetExpectedLogs; +@end + +// Does the same as GTMUnitTestDevLog, but the logs are only expected in debug. +// ie-the expect requests don't count in release builds. +@interface GTMUnitTestDevLogDebug : GTMUnitTestDevLog +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestDevLog.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestDevLog.m new file mode 100644 index 00000000..f2f9418f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestDevLog.m @@ -0,0 +1,279 @@ +// +// GTMUnitTestDevLog.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMUnitTestDevLog.h" + + +#import "GTMRegex.h" +#import "GTMSenTestCase.h" + +#if !GTM_IPHONE_SDK +// Add support for grabbing messages from Carbon. +#import +static void GTMDevLogDebugAssert(OSType componentSignature, + UInt32 options, + const char *assertionString, + const char *exceptionLabelString, + const char *errorString, + const char *fileName, + long lineNumber, + void *value, + ConstStr255Param outputMsg) { + NSString *outLog = [[[NSString alloc] initWithBytes:&(outputMsg[1]) + length:StrLength(outputMsg) + encoding:NSMacOSRomanStringEncoding] + autorelease]; + _GTMDevLog(@"%@", outLog); // Don't want any percents in outLog honored +} +static inline void GTMInstallDebugAssertOutputHandler(void) { + InstallDebugAssertOutputHandler(GTMDevLogDebugAssert); +} +static inline void GTMUninstallDebugAssertOutputHandler(void) { + InstallDebugAssertOutputHandler(NULL); +} +#else // GTM_IPHONE_SDK +static inline void GTMInstallDebugAssertOutputHandler(void) {}; +static inline void GTMUninstallDebugAssertOutputHandler(void) {}; +#endif // GTM_IPHONE_SDK + +@interface GTMUnttestDevLogAssertionHandler : NSAssertionHandler +@end + +@implementation GTMUnttestDevLogAssertionHandler +- (void)handleFailureInMethod:(SEL)selector + object:(id)object + file:(NSString *)fileName + lineNumber:(NSInteger)line + description:(NSString *)format, ... { + va_list argList; + va_start(argList, format); + NSString *descStr + = [[[NSString alloc] initWithFormat:format arguments:argList] autorelease]; + va_end(argList); + + // You need a format that will be useful in logs, but won't trip up Xcode or + // any other build systems parsing of the output. + NSString *outLog + = [NSString stringWithFormat:@"RecordedNSAssert in %@ - %@ (%@:%ld)", + NSStringFromSelector(selector), + descStr, + fileName, (long)line]; + _GTMDevLog(@"%@", outLog); // Don't want any percents in outLog honored + [NSException raise:NSInternalInconsistencyException + format:@"NSAssert raised"]; +} + +- (void)handleFailureInFunction:(NSString *)functionName + file:(NSString *)fileName + lineNumber:(NSInteger)line + description:(NSString *)format, ... { + va_list argList; + va_start(argList, format); + NSString *descStr + = [[[NSString alloc] initWithFormat:format arguments:argList] autorelease]; + va_end(argList); + + // You need a format that will be useful in logs, but won't trip up Xcode or + // any other build systems parsing of the output. + NSString *outLog + = [NSString stringWithFormat:@"RecordedNSAssert in %@ - %@ (%@:%ld)", + functionName, + descStr, + fileName, (long)line]; + _GTMDevLog(@"%@", outLog); // Don't want any percents in outLog honored + [NSException raise:NSInternalInconsistencyException + format:@"NSAssert raised"]; +} + +@end + +@implementation GTMUnitTestDevLog +// If unittests are ever being run on separate threads, this may need to be +// made a thread local variable. +static BOOL gTrackingEnabled = NO; + ++ (NSMutableArray *)patterns { + static NSMutableArray *patterns = nil; + if (!patterns) { + patterns = [[NSMutableArray array] retain]; + } + return patterns; +} + ++ (BOOL)isTrackingEnabled { + return gTrackingEnabled; +} + ++ (void)enableTracking { + GTMInstallDebugAssertOutputHandler(); + + NSMutableDictionary *threadDictionary + = [[NSThread currentThread] threadDictionary]; + if ([threadDictionary objectForKey:@"NSAssertionHandler"] != nil) { + NSLog(@"Warning: replacing NSAssertionHandler to capture assertions"); + } + + // Install an assertion handler to capture those. + GTMUnttestDevLogAssertionHandler *handler = + [[[GTMUnttestDevLogAssertionHandler alloc] init] autorelease]; + [threadDictionary setObject:handler forKey:@"NSAssertionHandler"]; + + gTrackingEnabled = YES; +} + ++ (void)disableTracking { + GTMUninstallDebugAssertOutputHandler(); + + // Clear our assertion handler back out. + NSMutableDictionary *threadDictionary + = [[NSThread currentThread] threadDictionary]; + [threadDictionary removeObjectForKey:@"NSAssertionHandler"]; + + gTrackingEnabled = NO; +} + ++ (void)log:(NSString*)format, ... { + va_list argList; + va_start(argList, format); + [self log:format args:argList]; + va_end(argList); +} + ++ (void)log:(NSString*)format args:(va_list)args { + if ([self isTrackingEnabled]) { + NSString *logString = [[[NSString alloc] initWithFormat:format + arguments:args] autorelease]; + @synchronized(self) { + NSMutableArray *patterns = [self patterns]; + BOOL logError = [patterns count] == 0 ? YES : NO; + GTMRegex *regex = nil; + if (!logError) { + regex = [[[patterns objectAtIndex:0] retain] autorelease]; + logError = [regex matchesString:logString] ? NO : YES; + [patterns removeObjectAtIndex:0]; + } + if (logError) { + if (regex) { + [NSException raise:SenTestFailureException + format:@"Unexpected log: %@\nExpected: %@", + logString, regex]; + } else { + [NSException raise:SenTestFailureException + format:@"Unexpected log: %@", logString]; + } + } else { + static BOOL envChecked = NO; + static BOOL showExpectedLogs = YES; + if (!envChecked) { + showExpectedLogs = getenv("GTM_SHOW_UNITTEST_DEVLOGS") ? YES : NO; + } + if (showExpectedLogs) { + NSLog(@"Expected Log: %@", logString); + } + } + } + } else { + NSLogv(format, args); + } +} + ++ (void)expectString:(NSString *)format, ... { + va_list argList; + va_start(argList, format); + NSString *string = [[[NSString alloc] initWithFormat:format + arguments:argList] autorelease]; + va_end(argList); + NSString *pattern = [GTMRegex escapedPatternForString:string]; + [self expect:1 casesOfPattern:pattern]; + +} + ++ (void)expectPattern:(NSString *)format, ... { + va_list argList; + va_start(argList, format); + [self expect:1 casesOfPattern:format args:argList]; + va_end(argList); +} + ++ (void)expect:(NSUInteger)n casesOfString:(NSString *)format, ... { + va_list argList; + va_start(argList, format); + NSString *string = [[[NSString alloc] initWithFormat:format + arguments:argList] autorelease]; + va_end(argList); + NSString *pattern = [GTMRegex escapedPatternForString:string]; + [self expect:n casesOfPattern:pattern]; +} + ++ (void)expect:(NSUInteger)n casesOfPattern:(NSString*)format, ... { + va_list argList; + va_start(argList, format); + [self expect:n casesOfPattern:format args:argList]; + va_end(argList); +} + ++ (void)expect:(NSUInteger)n +casesOfPattern:(NSString*)format + args:(va_list)args { + NSString *pattern = [[[NSString alloc] initWithFormat:format + arguments:args] autorelease]; + GTMRegex *regex = [GTMRegex regexWithPattern:pattern + options:kGTMRegexOptionSupressNewlineSupport]; + @synchronized(self) { + NSMutableArray *patterns = [self patterns]; + for (NSUInteger i = 0; i < n; ++i) { + [patterns addObject:regex]; + } + } +} + ++ (void)verifyNoMoreLogsExpected { + @synchronized(self) { + NSMutableArray *patterns = [self patterns]; + if ([patterns count] > 0) { + NSMutableArray *patternsCopy = [[patterns copy] autorelease]; + [self resetExpectedLogs]; + [NSException raise:SenTestFailureException + format:@"Logs still expected %@", patternsCopy]; + } + } +} + ++ (void)resetExpectedLogs { + @synchronized(self) { + NSMutableArray *patterns = [self patterns]; + [patterns removeAllObjects]; + } +} +@end + + +@implementation GTMUnitTestDevLogDebug + ++ (void)expect:(NSUInteger)n +casesOfPattern:(NSString*)format + args:(va_list)args { +#if DEBUG + // In debug, let the base work happen + [super expect:n casesOfPattern:format args:args]; +#else + // nothing when not in debug +#endif +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingBindingTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingBindingTest.m new file mode 100644 index 00000000..19ab5b06 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingBindingTest.m @@ -0,0 +1,116 @@ +// +// GTMUnitTestingBindingTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMUnitTestingTest.h" +#import "GTMNSObject+BindingUnitTesting.h" + +@interface GTMUnitTestingBindingTest : GTMTestCase { + int expectedFailureCount_; +} +@end + +@interface GTMUnitTestingBindingBadClass : NSObject +@end + +@implementation GTMUnitTestingBindingTest + +// Iterates through all of our subviews testing the exposed bindings +- (void)doSubviewBindingTest:(NSView*)view { + NSArray *subviews = [view subviews]; + NSView *subview; + GTM_FOREACH_OBJECT(subview, subviews) { + GTMTestExposedBindings(subview, @"testing %@", subview); + [self doSubviewBindingTest:subview]; + } +} + +- (void)testBindings { + // Get our window to work with and test it's bindings + GTMUnitTestingTestController *testWindowController + = [[GTMUnitTestingTestController alloc] initWithWindowNibName:@"GTMUnitTestingTest"]; + NSWindow *window = [testWindowController window]; + GTMTestExposedBindings(window, @"Window failed binding test"); + [self doSubviewBindingTest:[window contentView]]; + [window close]; + [testWindowController release]; + + // Run a test against something with no bindings. + // We're expecting a failure here. + expectedFailureCount_ = 1; + GTMTestExposedBindings(@"foo", @"testing no bindings"); + STAssertEquals(expectedFailureCount_, 0, @"Didn't get expected failures testing bindings"); + + // Run test against some with bad bindings. + // We're expecting failures here. + expectedFailureCount_ = 4; + GTMUnitTestingBindingBadClass *bad = [[[GTMUnitTestingBindingBadClass alloc] init] autorelease]; + GTMTestExposedBindings(bad, @"testing bad bindings"); + STAssertEquals(expectedFailureCount_, 0, @"Didn't get expected failures testing bad bindings"); +} + +- (void)failWithException:(NSException *)anException { + if (expectedFailureCount_ > 0) { + expectedFailureCount_ -= 1; + } else { + [super failWithException:anException]; // COV_NF_LINE - not expecting exception + } +} + +@end + +// Forces several error cases in our binding tests to test them +@implementation GTMUnitTestingBindingBadClass + +NSString *const kGTMKeyWithNoClass = @"keyWithNoClass"; +NSString *const kGTMKeyWithNoValue = @"keyWithNoValue"; +NSString *const kGTMKeyWeCantSet = @"keyWeCantSet"; +NSString *const kGTMKeyThatIsntEqual = @"keyThatIsntEqual"; + +- (NSArray *)exposedBindings { + return [NSArray arrayWithObjects:kGTMKeyWithNoClass, + kGTMKeyWithNoValue, + kGTMKeyWeCantSet, + kGTMKeyThatIsntEqual, + nil]; +} + +- (NSArray*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding { + GTMBindingUnitTestData *data + = [GTMBindingUnitTestData testWithIdentityValue:kGTMKeyThatIsntEqual]; + return [NSArray arrayWithObject:data]; +} + +- (Class)valueClassForBinding:(NSString*)binding { + return [binding isEqualTo:kGTMKeyWithNoClass] ? nil : [NSString class]; +} + +- (id)valueForKey:(NSString*)binding { + if ([binding isEqualTo:kGTMKeyWithNoValue]) { + [NSException raise:NSUndefinedKeyException format:nil]; + } + return @"foo"; +} + +- (void)setValue:(id)value forKey:(NSString*)binding { + if ([binding isEqualTo:kGTMKeyWeCantSet]) { + [NSException raise:NSUndefinedKeyException format:nil]; + } +} +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingTest.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingTest.h new file mode 100644 index 00000000..ea9521b9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingTest.h @@ -0,0 +1,29 @@ +// +// GTMUnitTestingTest.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import + +// GTMUnitTestingTestController controller so that initWithWindowNibName can +// find the appropriate bundle to load our nib from. See [GTMUnitTestingTest +// -testUnitTestingFramework] for more info +@interface GTMUnitTestingTestController : NSWindowController { + IBOutlet NSTextField *field_; +} + +- (NSTextField *)textField; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingTest.m new file mode 100644 index 00000000..72e68804 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingTest.m @@ -0,0 +1,252 @@ +// +// GTMUnitTestingTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import "GTMUnitTestingTest.h" +#import "GTMAppKit+UnitTesting.h" + +NSString *const kGTMWindowNibName = @"GTMUnitTestingTest"; +NSString *const kGTMWindowSaveFileName = @"GTMUnitTestingWindow"; + +@interface GTMUnitTestingTest : GTMTestCase { + int expectedFailureCount_; +} +@end + +// GTMUnitTestingTest support classes +@interface GTMUnitTestingView : NSObject { + BOOL goodContext_; +} +- (BOOL)hadGoodContext; +@end + +@interface GTMUnitTestingDelegate : NSObject { + BOOL didEncode_; +} +- (BOOL)didEncode; +@end + +@interface GTMUnitTestingProxyTest : NSProxy +@end + +@implementation GTMUnitTestingTest + +// Brings up the window defined in the nib and takes a snapshot of it. +// We use the "empty" GTMUnitTestingTestController controller so that +// initWithWindowNibName can find the appropriate bundle to load our nib from. +// For some reason when running unit tests, with all the injecting going on +// the nib loader can get confused as to where it should load a nib from. +// Having a NSWindowController subclass in the same bundle as the nib seems +// to help the nib loader find the nib, and any custom classes that are attached +// to it. +- (void)testUnitTestingFramework { + // set up our delegates so we can test delegate handling + GTMUnitTestingDelegate *appDelegate = [[GTMUnitTestingDelegate alloc] init]; + [NSApp setDelegate:appDelegate]; + + // Get our window + GTMUnitTestingTestController *testWindowController + = [[GTMUnitTestingTestController alloc] initWithWindowNibName:kGTMWindowNibName]; + NSWindow *window = [testWindowController window]; + // Test the app state. This will cover windows and menus + GTMAssertObjectStateEqualToStateNamed(NSApp, + @"GTMUnitTestingTestApp", + @"Testing the app state"); + + // Test the window image and state + GTMAssertObjectEqualToStateAndImageNamed(window, + kGTMWindowSaveFileName, + @"Testing the window image and state"); + + // Verify that all of our delegate encoders got called + STAssertTrue([appDelegate didEncode], @"app delegate didn't get called?"); + + // Clean up + [NSApp setDelegate:nil]; + [appDelegate release]; + [testWindowController release]; +} + +- (void)testViewUnitTesting { + GTMUnitTestingView *unitTestingView = [[GTMUnitTestingView alloc] init]; + GTMAssertDrawingEqualToImageNamed(unitTestingView, + NSMakeSize(200,200), + @"GTMUnitTestingView", + NSApp, + @"Testing view drawing"); + STAssertTrue([unitTestingView hadGoodContext], @"bad context?"); + [unitTestingView release]; +} + +- (void)testImageUnitTesting { + NSImage *image = [NSImage imageNamed:@"NSApplicationIcon"]; + GTMUnitTestingDelegate *imgDelegate = [[GTMUnitTestingDelegate alloc] init]; + [image setDelegate:imgDelegate]; + GTMAssertObjectEqualToStateAndImageNamed(image, + @"GTMUnitTestingImage", + @"Testing NSImage image and state"); + STAssertTrue([imgDelegate didEncode], @"imgDelegate didn't get called?"); + [image setDelegate:nil]; + [imgDelegate release]; +} + +- (void)testFailures { + NSString *const bogusTestName = @"GTMUnitTestTestingFailTest"; + NSString *tempDir = NSTemporaryDirectory(); + STAssertNotNil(tempDir, @"No Temp Dir?"); + NSString *originalPath = [NSObject gtm_getUnitTestSaveToDirectory]; + STAssertNotNil(originalPath, @"No save dir?"); + [NSObject gtm_setUnitTestSaveToDirectory:tempDir]; + STAssertEqualObjects(tempDir, [NSObject gtm_getUnitTestSaveToDirectory], + @"Save to dir not set?"); + NSString *statePath = [self gtm_saveToPathForStateNamed:bogusTestName]; + STAssertNotNil(statePath, @"no state path?"); + NSString *imagePath = [self gtm_saveToPathForImageNamed:bogusTestName]; + STAssertNotNil(imagePath, @"no image path?"); + GTMUnitTestingTestController *testWindowController + = [[GTMUnitTestingTestController alloc] initWithWindowNibName:kGTMWindowNibName]; + NSWindow *window = [testWindowController window]; + + // Test against a golden master filename that doesn't exist + expectedFailureCount_ = 2; + GTMAssertObjectEqualToStateAndImageNamed(window, + bogusTestName, + @"Creating image and state files"); + STAssertEquals(expectedFailureCount_, 0, + @"Didn't get expected failures creating files"); + + // Change our image and state and verify failures + [[testWindowController textField] setStringValue:@"Foo"]; + expectedFailureCount_ = 2; + GTMAssertObjectEqualToStateAndImageNamed(window, + kGTMWindowSaveFileName, + @"Testing the window image and state"); + STAssertEquals(expectedFailureCount_, 0, + @"Didn't get expected failures testing files"); + + // Now change the size of our image and verify failures + NSRect oldFrame = [window frame]; + NSRect newFrame = oldFrame; + newFrame.size.width += 1; + [window setFrame:newFrame display:YES]; + expectedFailureCount_ = 1; + GTMAssertObjectImageEqualToImageNamed(window, + kGTMWindowSaveFileName, + @"Testing the changed window size"); + [window setFrame:oldFrame display:YES]; + + // Set our unit test save dir to a bogus directory and + // run the tests again. + [NSObject gtm_setUnitTestSaveToDirectory:@"/zim/blatz/foo/bob/bar"]; + expectedFailureCount_ = 2; + GTMAssertObjectEqualToStateAndImageNamed(window, + kGTMWindowSaveFileName, + @"Testing the window image and state"); + STAssertEquals(expectedFailureCount_, 0, + @"Didn't get expected failures testing files"); + expectedFailureCount_ = 2; + GTMAssertObjectEqualToStateAndImageNamed(window, + @"GTMUnitTestingWindowDoesntExist", + @"Testing the window image and state"); + STAssertEquals(expectedFailureCount_, 0, + @"Didn't get expected failures testing files"); + + // Reset our unit test save dir + [NSObject gtm_setUnitTestSaveToDirectory:nil]; + + // Test against something that doesn't have an image + expectedFailureCount_ = 1; + GTMAssertObjectImageEqualToImageNamed(@"a string", + @"GTMStringsDontHaveImages", + @"Testing that strings should fail"); + STAssertEquals(expectedFailureCount_, 0, @"Didn't get expected failures testing files"); + + // Test against something that doesn't implement our support + expectedFailureCount_ = 1; + GTMUnitTestingProxyTest *proxy = [[GTMUnitTestingProxyTest alloc] init]; + GTMAssertObjectStateEqualToStateNamed(proxy, + @"NSProxiesDontDoState", + @"Testing that NSProxy should fail"); + STAssertEquals(expectedFailureCount_, 0, @"Didn't get expected failures testing proxy"); + [proxy release]; + + [window close]; +} + +- (void)failWithException:(NSException *)anException { + if (expectedFailureCount_ > 0) { + expectedFailureCount_ -= 1; + } else { + [super failWithException:anException]; // COV_NF_LINE - not expecting exception + } +} + + +@end + +@implementation GTMUnitTestingTestController +- (NSTextField *)textField { + return field_; +} + +@end + +@implementation GTMUnitTestingDelegate + +- (void)gtm_unitTestEncoderWillEncode:(id)sender inCoder:(NSCoder*)inCoder { + // Test various encodings + [inCoder encodeBool:YES forKey:@"BoolTest"]; + [inCoder encodeInt:1 forKey:@"IntTest"]; + [inCoder encodeInt32:1 forKey:@"Int32Test"]; + [inCoder encodeInt64:1 forKey:@"Int64Test"]; + [inCoder encodeFloat:1.0f forKey:@"FloatTest"]; + [inCoder encodeDouble:1.0 forKey:@"DoubleTest"]; + [inCoder encodeBytes:(const uint8_t*)"BytesTest" length:9 forKey:@"BytesTest"]; + didEncode_ = YES; +} + +- (BOOL)didEncode { + return didEncode_; +} +@end + +@implementation GTMUnitTestingView + +- (void)gtm_unitTestViewDrawRect:(NSRect)rect contextInfo:(void*)contextInfo { + [[NSColor redColor] set]; + NSRectFill(rect); + goodContext_ = [(id)contextInfo isEqualTo:NSApp]; +} + +- (BOOL)hadGoodContext { + return goodContext_; +} +@end + +// GTMUnitTestingProxyTest is for testing the case where we don't conform to +// the GTMUnitTestingEncoding protocol. +@implementation GTMUnitTestingProxyTest +- (id)init { + return self; +} + +- (BOOL)conformsToProtocol:(Protocol *)protocol { + return NO; +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingUtilities.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingUtilities.h new file mode 100644 index 00000000..128a4c4f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingUtilities.h @@ -0,0 +1,91 @@ +// +// GTMUnitTestingUtilities.h +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import +#import + +// Collection of utilities for unit testing +@interface GTMUnitTestingUtilities : NSObject + +// Returns YES if we are currently being unittested. ++ (BOOL)areWeBeingUnitTested; + +// Sets up the user interface so that we can run consistent UI unittests on +// it. This includes setting scroll bar types, setting selection colors +// setting color spaces etc so that everything is consistent across machines. +// This should be called in main, before NSApplicationMain is called. ++ (void)setUpForUIUnitTests; + +// Syntactic sugar combining the above, and wrapping them in an +// NSAutoreleasePool so that your main can look like this: +// int main(int argc, const char *argv[]) { +// [UnitTestingUtilities setUpForUIUnitTestsIfBeingTested]; +// return NSApplicationMain(argc, argv); +// } ++ (void)setUpForUIUnitTestsIfBeingTested; + +// Check if the screen saver is running. Some unit tests don't work when +// the screen saver is active. ++ (BOOL)isScreenSaverActive; + +// Allows for posting either a keydown or a keyup with all the modifiers being +// applied. Passing a 'g' with NSKeyDown and NSShiftKeyMask +// generates two events (a shift key key down and a 'g' key keydown). Make sure +// to balance this with a keyup, or things could get confused. Events get posted +// using the CGRemoteOperation events which means that it gets posted in the +// system event queue. Thus you can affect other applications if your app isn't +// the active app (or in some cases, such as hotkeys, even if it is). +// Arguments: +// type - Event type. Currently accepts NSKeyDown and NSKeyUp +// keyChar - character on the keyboard to type. Make sure it is lower case. +// If you need upper case, pass in the NSShiftKeyMask in the +// modifiers. i.e. to generate "G" pass in 'g' and NSShiftKeyMask. +// to generate "+" pass in '=' and NSShiftKeyMask. +// cocoaModifiers - an int made up of bit masks. Handles NSAlphaShiftKeyMask, +// NSShiftKeyMask, NSControlKeyMask, NSAlternateKeyMask, and +// NSCommandKeyMask ++ (void)postKeyEvent:(NSEventType)type + character:(CGCharCode)keyChar + modifiers:(UInt32)cocoaModifiers; + +// Syntactic sugar for posting a keydown immediately followed by a key up event +// which is often what you really want. +// Arguments: +// keyChar - character on the keyboard to type. Make sure it is lower case. +// If you need upper case, pass in the NSShiftKeyMask in the +// modifiers. i.e. to generate "G" pass in 'g' and NSShiftKeyMask. +// to generate "+" pass in '=' and NSShiftKeyMask. +// cocoaModifiers - an int made up of bit masks. Handles NSAlphaShiftKeyMask, +// NSShiftKeyMask, NSControlKeyMask, NSAlternateKeyMask, and +// NSCommandKeyMask ++ (void)postTypeCharacterEvent:(CGCharCode)keyChar + modifiers:(UInt32)cocoaModifiers; + +// Runs the event loop in NSDefaultRunLoopMode until date. Can be useful for +// testing user interface responses in a controlled timed event loop. For most +// uses using: +// [[NSRunLoop currentRunLoop] runUntilDate:date] +// will do. The only reason you would want to use this is if you were +// using the postKeyEvent:character:modifiers to send events and wanted to +// receive user input. +// Arguments: +// date - end of execution time ++ (void)runUntilDate:(NSDate*)date; + +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingUtilities.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingUtilities.m new file mode 100644 index 00000000..e72a921a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/GTMUnitTestingUtilities.m @@ -0,0 +1,310 @@ +// +// GTMUnitTestingUtilities.m +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMUnitTestingUtilities.h" +#import +#import "GTMDefines.h" +#import "GTMGarbageCollection.h" + +// The Users profile before we change it on them +static CMProfileRef gGTMCurrentColorProfile = NULL; + +// Compares two color profiles +static BOOL GTMAreCMProfilesEqual(CMProfileRef a, CMProfileRef b); +// Stores the user's color profile away, and changes over to generic. +static void GTMSetColorProfileToGenericRGB(); +// Restores the users profile. +static void GTMRestoreColorProfile(void); + +static CGKeyCode GTMKeyCodeForCharCode(CGCharCode charCode); + +@implementation GTMUnitTestingUtilities + +// Returns YES if we are currently being unittested. ++ (BOOL)areWeBeingUnitTested { + BOOL answer = NO; + + // Check to see if the SenTestProbe class is linked in before we call it. + Class SenTestProbeClass = NSClassFromString(@"SenTestProbe"); + if (SenTestProbeClass != Nil) { + // Doing this little dance so we don't actually have to link + // SenTestingKit in + SEL selector = NSSelectorFromString(@"isTesting"); + NSMethodSignature *sig = [SenTestProbeClass methodSignatureForSelector:selector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; + [invocation setSelector:selector]; + [invocation invokeWithTarget:SenTestProbeClass]; + [invocation getReturnValue:&answer]; + } + return answer; +} + +// Sets up the user interface so that we can run consistent UI unittests on it. ++ (void)setUpForUIUnitTests { + // Give some names to undocumented defaults values + const NSInteger MediumFontSmoothing = 2; + const NSInteger BlueTintedAppearance = 1; + + // This sets up some basic values that we want as our defaults for doing pixel + // based user interface tests. These defaults only apply to the unit test app, + // except or the color profile which will be set system wide, and then + // restored when the tests complete. + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + // Scroll arrows together bottom + [defaults setObject:@"DoubleMax" forKey:@"AppleScrollBarVariant"]; + // Smallest font size to CG should perform antialiasing on + [defaults setInteger:4 forKey:@"AppleAntiAliasingThreshold"]; + // Type of smoothing + [defaults setInteger:MediumFontSmoothing forKey:@"AppleFontSmoothing"]; + // Blue aqua + [defaults setInteger:BlueTintedAppearance forKey:@"AppleAquaColorVariant"]; + // Standard highlight colors + [defaults setObject:@"0.709800 0.835300 1.000000" + forKey:@"AppleHighlightColor"]; + [defaults setObject:@"0.500000 0.500000 0.500000" + forKey:@"AppleOtherHighlightColor"]; + // Use english plz + [defaults setObject:[NSArray arrayWithObject:@"en"] forKey:@"AppleLanguages"]; + // How fast should we draw sheets. This speeds up the sheet tests considerably + [defaults setFloat:.001f forKey:@"NSWindowResizeTime"]; + // Switch over the screen profile to "generic rgb". This installs an + // atexit handler to return our profile back when we are done. + GTMSetColorProfileToGenericRGB(); +} + ++ (void)setUpForUIUnitTestsIfBeingTested { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + if ([self areWeBeingUnitTested]) { + [self setUpForUIUnitTests]; + } + [pool release]; +} + ++ (BOOL)isScreenSaverActive { + BOOL answer = NO; + ProcessSerialNumber psn; + if (GetFrontProcess(&psn) == noErr) { + CFDictionaryRef cfProcessInfo + = ProcessInformationCopyDictionary(&psn, + kProcessDictionaryIncludeAllInformationMask); + NSDictionary *processInfo = GTMCFAutorelease(cfProcessInfo); + + NSString *bundlePath = [processInfo objectForKey:@"BundlePath"]; + // ScreenSaverEngine is the frontmost app if the screen saver is actually + // running Security Agent is the frontmost app if the "enter password" + // dialog is showing + NSString *bundleName = [bundlePath lastPathComponent]; + answer = ([bundleName isEqualToString:@"ScreenSaverEngine.app"] + || [bundleName isEqualToString:@"SecurityAgent.app"]); + } + return answer; +} + +// Allows for posting either a keydown or a keyup with all the modifiers being +// applied. Passing a 'g' with NSKeyDown and NSShiftKeyMask +// generates two events (a shift key key down and a 'g' key keydown). Make sure +// to balance this with a keyup, or things could get confused. Events get posted +// using the CGRemoteOperation events which means that it gets posted in the +// system event queue. Thus you can affect other applications if your app isn't +// the active app (or in some cases, such as hotkeys, even if it is). +// Arguments: +// type - Event type. Currently accepts NSKeyDown and NSKeyUp +// keyChar - character on the keyboard to type. Make sure it is lower case. +// If you need upper case, pass in the NSShiftKeyMask in the +// modifiers. i.e. to generate "G" pass in 'g' and NSShiftKeyMask. +// to generate "+" pass in '=' and NSShiftKeyMask. +// cocoaModifiers - an int made up of bit masks. Handles NSAlphaShiftKeyMask, +// NSShiftKeyMask, NSControlKeyMask, NSAlternateKeyMask, and +// NSCommandKeyMask ++ (void)postKeyEvent:(NSEventType)type + character:(CGCharCode)keyChar + modifiers:(UInt32)cocoaModifiers { + require(![self isScreenSaverActive], CantWorkWithScreenSaver); + require(type == NSKeyDown || type == NSKeyUp, CantDoEvent); + CGKeyCode code = GTMKeyCodeForCharCode(keyChar); + verify(code != 256); + CGEventRef event = CGEventCreateKeyboardEvent(NULL, code, type == NSKeyDown); + require(event, CantCreateEvent); + CGEventSetFlags(event, cocoaModifiers); + CGEventPost(kCGSessionEventTap, event); + CFRelease(event); +CantCreateEvent: +CantDoEvent: +CantWorkWithScreenSaver: + return; +} + +// Syntactic sugar for posting a keydown immediately followed by a key up event +// which is often what you really want. +// Arguments: +// keyChar - character on the keyboard to type. Make sure it is lower case. +// If you need upper case, pass in the NSShiftKeyMask in the +// modifiers. i.e. to generate "G" pass in 'g' and NSShiftKeyMask. +// to generate "+" pass in '=' and NSShiftKeyMask. +// cocoaModifiers - an int made up of bit masks. Handles NSAlphaShiftKeyMask, +// NSShiftKeyMask, NSControlKeyMask, NSAlternateKeyMask, and +// NSCommandKeyMask ++ (void)postTypeCharacterEvent:(CGCharCode)keyChar modifiers:(UInt32)cocoaModifiers { + [self postKeyEvent:NSKeyDown character:keyChar modifiers:cocoaModifiers]; + [self postKeyEvent:NSKeyUp character:keyChar modifiers:cocoaModifiers]; +} + +// Runs the event loop in NSDefaultRunLoopMode until date. Can be useful for +// testing user interface responses in a controlled timed event loop. For most +// uses using: +// [[NSRunLoop currentRunLoop] runUntilDate:date] +// will do. The only reason you would want to use this is if you were +// using the postKeyEvent:character:modifiers to send events and wanted to +// receive user input. +// Arguments: +// date - end of execution time ++ (void)runUntilDate:(NSDate*)date { + NSEvent *event; + while ((event = [NSApp nextEventMatchingMask:NSAnyEventMask + untilDate:date + inMode:NSDefaultRunLoopMode + dequeue:YES])) { + [NSApp sendEvent:event]; + } +} + +@end + +BOOL GTMAreCMProfilesEqual(CMProfileRef a, CMProfileRef b) { + BOOL equal = YES; + if (a != b) { + CMProfileMD5 aMD5; + CMProfileMD5 bMD5; + CMError aMD5Err = CMGetProfileMD5(a, aMD5); + CMError bMD5Err = CMGetProfileMD5(b, bMD5); + equal = (!aMD5Err && + !bMD5Err && + !memcmp(aMD5, bMD5, sizeof(CMProfileMD5))) ? YES : NO; + } + return equal; +} + +void GTMRestoreColorProfile(void) { + if (gGTMCurrentColorProfile) { + CGDirectDisplayID displayID = CGMainDisplayID(); + CMError error = CMSetProfileByAVID((UInt32)displayID, + gGTMCurrentColorProfile); + CMCloseProfile(gGTMCurrentColorProfile); + if (error) { + // COV_NF_START + // No way to force this case in a unittest. + _GTMDevLog(@"Failed to restore previous color profile! " + "You may need to open System Preferences : Displays : Color " + "and manually restore your color settings. (Error: %i)", error); + // COV_NF_END + } else { + _GTMDevLog(@"Color profile restored"); + } + gGTMCurrentColorProfile = NULL; + } +} + +void GTMSetColorProfileToGenericRGB(void) { + NSColorSpace *genericSpace = [NSColorSpace genericRGBColorSpace]; + CMProfileRef genericProfile = (CMProfileRef)[genericSpace colorSyncProfile]; + CMProfileRef previousProfile; + CGDirectDisplayID displayID = CGMainDisplayID(); + CMError error = CMGetProfileByAVID((UInt32)displayID, &previousProfile); + if (error) { + // COV_NF_START + // No way to force this case in a unittest. + _GTMDevLog(@"Failed to get current color profile. " + "I will not be able to restore your current profile, thus I'm " + "not changing it. Many unit tests may fail as a result. (Error: %i)", + error); + return; + // COV_NF_END + } + if (GTMAreCMProfilesEqual(genericProfile, previousProfile)) { + CMCloseProfile(previousProfile); + return; + } + CFStringRef previousProfileName; + CFStringRef genericProfileName; + CMCopyProfileDescriptionString(previousProfile, &previousProfileName); + CMCopyProfileDescriptionString(genericProfile, &genericProfileName); + + _GTMDevLog(@"Temporarily changing your system color profile from \"%@\" to \"%@\".", + previousProfileName, genericProfileName); + _GTMDevLog(@"This allows the pixel-based unit-tests to have consistent color " + "values across all machines."); + _GTMDevLog(@"The colors on your screen will change for the duration of the testing."); + + + if ((error = CMSetProfileByAVID((UInt32)displayID, genericProfile))) { + // COV_NF_START + // No way to force this case in a unittest. + _GTMDevLog(@"Failed to set color profile to \"%@\"! Many unit tests will fail as " + "a result. (Error: %i)", genericProfileName, error); + // COV_NF_END + } else { + gGTMCurrentColorProfile = previousProfile; + atexit(GTMRestoreColorProfile); + } + CFRelease(previousProfileName); + CFRelease(genericProfileName); +} + +// Returns a virtual key code for a given charCode. Handles all of the +// NS*FunctionKeys as well. +static CGKeyCode GTMKeyCodeForCharCode(CGCharCode charCode) { + // character map taken from http://classicteck.com/rbarticles/mackeyboard.php + int characters[] = { + 'a', 's', 'd', 'f', 'h', 'g', 'z', 'x', 'c', 'v', 256, 'b', 'q', 'w', + 'e', 'r', 'y', 't', '1', '2', '3', '4', '6', '5', '=', '9', '7', '-', + '8', '0', ']', 'o', 'u', '[', 'i', 'p', '\n', 'l', 'j', '\'', 'k', ';', + '\\', ',', '/', 'n', 'm', '.', '\t', ' ', '`', '\b', 256, '\e' + }; + + // function key map taken from + // file:///Developer/ADC%20Reference%20Library/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSEvent.html + int functionKeys[] = { + // NSUpArrowFunctionKey - NSF12FunctionKey + 126, 125, 123, 124, 122, 120, 99, 118, 96, 97, 98, 100, 101, 109, 103, 111, + // NSF13FunctionKey - NSF28FunctionKey + 105, 107, 113, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + // NSF29FunctionKey - NSScrollLockFunctionKey + 256, 256, 256, 256, 256, 256, 256, 256, 117, 115, 256, 119, 116, 121, 256, 256, + // NSPauseFunctionKey - NSPrevFunctionKey + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + // NSNextFunctionKey - NSModeSwitchFunctionKey + 256, 256, 256, 256, 256, 256, 114, 1 + }; + + CGKeyCode outCode = 0; + + // Look in the function keys + if (charCode >= NSUpArrowFunctionKey && charCode <= NSModeSwitchFunctionKey) { + outCode = functionKeys[charCode - NSUpArrowFunctionKey]; + } else { + // Look in our character map + for (size_t i = 0; i < (sizeof(characters) / sizeof (int)); i++) { + if (characters[i] == charCode) { + outCode = i; + break; + } + } + } + return outCode; +} + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/RunIPhoneUnitTest.sh b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/RunIPhoneUnitTest.sh new file mode 100644 index 00000000..ccf1456c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/RunIPhoneUnitTest.sh @@ -0,0 +1,108 @@ +#!/bin/sh +# RunIPhoneUnitTest.sh +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy +# of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# Runs all unittests through the iPhone simulator. We don't handle running them +# on the device. To run on the device just choose "run". +# Controlling environment variables: +# +# GTM_DISABLE_ZOMBIES - +# Set to a non-zero value to turn on zombie checks. You will probably +# want to turn this off if you enable leaks. +# +# GTM_ENABLE_LEAKS - +# Set to a non-zero value to turn on the leaks check. You will probably want +# to disable zombies, otherwise you will get a lot of false positives. +# +# GTM_DISABLE_TERMINATION +# Set to a non-zero value so that the app doesn't terminate when it's finished +# running tests. This is useful when using it with external tools such +# as Instruments. +# +# GTM_LEAKS_SYMBOLS_TO_IGNORE +# List of comma separated symbols that leaks should ignore. Mainly to control +# leaks in frameworks you don't have control over. +# Search this file for GTM_LEAKS_SYMBOLS_TO_IGNORE to see examples. +# Please feel free to add other symbols as you find them but make sure to +# reference Radars or other bug systems so we can track them. +# +# GTM_REMOVE_GCOV_DATA +# Before starting the test, remove any *.gcda files for the current run so +# you won't get errors when the source file has changed and the data can't +# be merged. +# + +ScriptDir=$(dirname $(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")) +ScriptName=$(basename "$0") +ThisScript="${ScriptDir}/${ScriptName}" + +GTMXcodeNote() { + echo ${ThisScript}:${1}: note: GTM ${2} +} + +if [ "$PLATFORM_NAME" == "iphonesimulator" ]; then + # We kill the iPhone simulator because otherwise we run into issues where + # the unittests fail becuase the simulator is currently running, and + # at this time the iPhone SDK won't allow two simulators running at the same + # time. + /usr/bin/killall "iPhone Simulator" + + if [ $GTM_REMOVE_GCOV_DATA ]; then + if [ "${OBJECT_FILE_DIR}-${CURRENT_VARIANT}" != "-" ]; then + if [ -d "${OBJECT_FILE_DIR}-${CURRENT_VARIANT}" ]; then + GTMXcodeNote ${LINENO} "Removing any .gcda files" + (cd "${OBJECT_FILE_DIR}-${CURRENT_VARIANT}" && \ + find . -type f -name "*.gcda" -print0 | xargs -0 rm -f ) + fi + fi + fi + + export DYLD_ROOT_PATH="$SDKROOT" + export DYLD_FRAMEWORK_PATH="$CONFIGURATION_BUILD_DIR" + export IPHONE_SIMULATOR_ROOT="$SDKROOT" + export CFFIXED_USER_HOME="$TEMP_FILES_DIR/iPhone Simulator User Dir" + + # See http://developer.apple.com/technotes/tn2004/tn2124.html for an + # explanation of these environment variables. + + export MallocScribble=YES + export MallocPreScribble=YES + export MallocGuardEdges=YES + export MallocStackLogging=YES + export NSAutoreleaseFreedObjectCheckEnabled=YES + export OBJC_DEBUG_FRAGILE_SUPERCLASSES=YES + + if [ ! $GTM_DISABLE_ZOMBIES ]; then + GTMXcodeNote ${LINENO} "Enabling zombies" + export CFZombieLevel=3 + export NSZombieEnabled=YES + fi + + # Cleanup user home and documents directory + if [ -d "$CFFIXED_USER_HOME" ]; then + rm -rf "$CFFIXED_USER_HOME" + fi + mkdir "$CFFIXED_USER_HOME" + mkdir "$CFFIXED_USER_HOME/Documents" + + # 6251475 iPhone simulator leaks @ CFHTTPCookieStore shutdown if + # CFFIXED_USER_HOME empty + GTM_LEAKS_SYMBOLS_TO_IGNORE="CFHTTPCookieStore" + + "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" -RegisterForSystemEvents +else + GTMXcodeNote ${LINENO} "Skipping running of unittests for device build." +fi +exit 0 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/RunMacOSUnitTests.sh b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/RunMacOSUnitTests.sh new file mode 100644 index 00000000..87f678f3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/RunMacOSUnitTests.sh @@ -0,0 +1,213 @@ +# +# RunMacOSUnitTests.sh +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy +# of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# Run the unit tests in this test bundle. +# Set up some env variables to make things as likely to crash as possible. +# See http://developer.apple.com/technotes/tn2004/tn2124.html for details. +# + +# Controlling environment variables: +# +# GTM_DISABLE_ZOMBIES - +# Set to a non-zero value to turn on zombie checks. You will probably +# want to turn this off if you enable leaks. +# +# GTM_ENABLE_LEAKS - +# Set to a non-zero value to turn on the leaks check. You will probably want +# to disable zombies, otherwise you will get a lot of false positives. +# +# GTM_NO_DEBUG_FRAMEWORKS - +# Set to zero to prevent the use of the debug versions of system +# libraries/frameworks if you have them installed on your system. The +# frameworks can be found at +# http://connect.apple.com > Downloads > Developer Tools +# (https://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?bundleID=19915) +# +# GTM_LEAKS_SYMBOLS_TO_IGNORE +# List of comma separated symbols that leaks should ignore. Mainly to control +# leaks in frameworks you don't have control over. +# Search this file for GTM_LEAKS_SYMBOLS_TO_IGNORE to see examples. +# Please feel free to add other symbols as you find them but make sure to +# reference Radars or other bug systems so we can track them. +# +# GTM_REMOVE_GCOV_DATA +# Before starting the test, remove any *.gcda files for the current run so +# you won't get errors when the source file has changed and the data can't +# be merged. +# + +ScriptDir=$(dirname $(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")) +ScriptName=$(basename "$0") +ThisScript="${ScriptDir}/${ScriptName}" + +GTMXcodeNote() { + echo ${ThisScript}:${1}: note: GTM ${2} +} + +# The workaround below is due to +# Radar 6248062 otest won't run with MallocHistory enabled under rosetta +# Basically we go through and check what architecture we are running on +# and which architectures we can support +AppendToSymbolsLeaksShouldIgnore() { + if [ "${GTM_LEAKS_SYMBOLS_TO_IGNORE}" = "" ]; then + GTM_LEAKS_SYMBOLS_TO_IGNORE="${1}" + else + GTM_LEAKS_SYMBOLS_TO_IGNORE="${GTM_LEAKS_SYMBOLS_TO_IGNORE}, ${1}" + fi +} + +AppendToLeakTestArchs() { + if [ "${LEAK_TEST_ARCHS}" = "" ]; then + LEAK_TEST_ARCHS="${1}" + else + LEAK_TEST_ARCHS="${LEAK_TEST_ARCHS} ${1}" + fi +} + +AppendToNoLeakTestArchs() { + if [ "${NO_LEAK_TEST_ARCHS}" = "" ]; then + NO_LEAK_TEST_ARCHS="${1}" + else + NO_LEAK_TEST_ARCHS="${NO_LEAK_TEST_ARCHS} ${1}" + fi +} + +UpdateArchitecturesToTest() { + case "${NATIVE_ARCH_ACTUAL}" in + ppc) + if [ "${1}" = "ppc" ]; then + AppendToLeakTestArchs "${1}" + fi + ;; + + ppc64) + if [ "${1}" = "ppc" -o "${1}" = "ppc64" ]; then + AppendToLeakTestArchs "${1}" + fi + ;; + + i386) + if [ "${1}" = "i386" ]; then + AppendToLeakTestArchs "${1}" + elif [ "${1}" = "ppc" ]; then + AppendToNoLeakTestArchs "${1}" + fi + ;; + + x86_64) + if [ "${1}" = "i386" -o "${1}" = "x86_64" ]; then + AppendToLeakTestArchs "${1}" + elif [ "${1}" = "ppc" -o "${1}" = "ppc64" ]; then + AppendToNoLeakTestArchs "${1}" + fi + ;; + + *) + echo "RunMacOSUnitTests.sh Unknown native architecture: ${NATIVE_ARCH_ACTUAL}" + exit 1 + ;; + esac +} + +RunTests() { + if [ "${CURRENT_ARCH}" = "" ]; then + CURRENT_ARCH=`arch` + fi + + if [ "${ONLY_ACTIVE_ARCH}" = "YES" ]; then + ARCHS="${CURRENT_ARCH}" + fi + + if [ "${ARCHS}" = "" ]; then + ARCHS=`arch` + fi + + if [ "${VALID_ARCHS}" = "" ]; then + VALID_ARCHS=`arch` + fi + + if [ "${NATIVE_ARCH_ACTUAL}" = "" ]; then + NATIVE_ARCH_ACTUAL=`arch` + fi + + LEAK_TEST_ARCHS="" + NO_LEAK_TEST_ARCHS="" + + for TEST_ARCH in ${ARCHS}; do + for TEST_VALID_ARCH in ${VALID_ARCHS}; do + if [ "${TEST_VALID_ARCH}" = "${TEST_ARCH}" ]; then + UpdateArchitecturesToTest "${TEST_ARCH}" + fi + done + done + + # These are symbols that leak on OS 10.5.5 + # radar 6247293 NSCollatorElement leaks in +initialize. + AppendToSymbolsLeaksShouldIgnore "+[NSCollatorElement initialize]" + # radar 6247911 The first call to udat_open leaks only on x86_64 + AppendToSymbolsLeaksShouldIgnore "icu::TimeZone::initDefault()" + # radar 6263983 +[IMService allServices] leaks + AppendToSymbolsLeaksShouldIgnore "-[IMServiceAgentImpl allServices]" + # radar 6264034 +[IKSFEffectDescription initialize] Leaks + AppendToSymbolsLeaksShouldIgnore "+[IKSFEffectDescription initialize]" + + # Running leaks on architectures that support leaks. + export MallocStackLogging=YES + export GTM_LEAKS_SYMBOLS_TO_IGNORE="${GTM_LEAKS_SYMBOLS_TO_IGNORE}" + ARCHS="${LEAK_TEST_ARCHS}" + VALID_ARCHS="${LEAK_TEST_ARCHS}" + "${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests" + + # Running leaks on architectures that don't support leaks. + unset MallocStackLogging + unset GTM_ENABLE_LEAKS + ARCHS="${NO_LEAK_TEST_ARCHS}" + VALID_ARCHS="${NO_LEAK_TEST_ARCHS}" + "${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests" +} + +# Jack up some memory stress so we can catch more bugs. +export MallocScribble=YES +export MallocPreScribble=YES +export MallocGuardEdges=YES +export NSAutoreleaseFreedObjectCheckEnabled=YES +export OBJC_DEBUG_FRAGILE_SUPERCLASSES=YES + +if [ ! $GTM_DISABLE_ZOMBIES ]; then + GTMXcodeNote ${LINENO} "Enabling zombies" + # CFZombieLevel disabled because it doesn't play well with the + # security framework + # export CFZombieLevel=3 + export NSZombieEnabled=YES +fi + +if [ $GTM_REMOVE_GCOV_DATA ]; then + if [ "${OBJECT_FILE_DIR}-${CURRENT_VARIANT}" != "-" ]; then + if [ -d "${OBJECT_FILE_DIR}-${CURRENT_VARIANT}" ]; then + GTMXcodeNote ${LINENO} "Removing any .gcda files" + (cd "${OBJECT_FILE_DIR}-${CURRENT_VARIANT}" && \ + find . -type f -name "*.gcda" -print0 | xargs -0 rm -f ) + fi + fi +fi + +# If leaks testing is enabled, we have to go through our convoluted path +# to handle architectures that don't allow us to do leak testing. +if [ $GTM_ENABLE_LEAKS ]; then + RunTests +else + "${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests" +fi diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUIViewUnitTestingTest.gtmUTState b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUIViewUnitTestingTest.gtmUTState new file mode 100644 index 00000000..87ae9e57 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUIViewUnitTestingTest.gtmUTState @@ -0,0 +1,33 @@ + + + + + $GTMArchive + GTMUnitTestingArchive + $GTMVersion + 1 + LayerIsDoublesided + + LayerIsHidden + + LayerIsOpaque + + LayerOpacity + 1 + ViewIsHidden + + ViewSubView 0 + + LayerIsDoublesided + + LayerIsHidden + + LayerIsOpaque + + LayerOpacity + 1 + ViewIsHidden + + + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUIViewUnitTestingTest.png b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUIViewUnitTestingTest.png new file mode 100644 index 0000000000000000000000000000000000000000..03fd9f029838d7eb35344dbc56aa814187bf2666 GIT binary patch literal 3214 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 T_{IqLp8>M9aXj8VZuwOos?oSF|}rI@c-E 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𝔢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 literal 0 HcmV?d00001 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingImage.gtmUTState b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingImage.gtmUTState new file mode 100644 index 00000000..969ddf6b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingImage.gtmUTState @@ -0,0 +1,30 @@ + + + + + $GTMArchive + GTMUnitTestingArchive + $GTMVersion + 1 + BoolTest + + BytesTest + + Qnl0ZXNUZXN0 + + DoubleTest + 1 + FloatTest + 1 + ImageName + NSApplicationIcon + ImageSize + {128, 128} + Int32Test + 1 + Int64Test + 1 + IntTest + 1 + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingImage.tiff b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingImage.tiff new file mode 100644 index 0000000000000000000000000000000000000000..4d082972a6210b808e401b83e582bf8f6efda2ac GIT binary patch literal 67190 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 + + + + $GTMArchive + GTMUnitTestingArchive + $GTMVersion + 1 + ApplicationMainWindow + 0 + BoolTest + + BytesTest + + Qnl0ZXNUZXN0 + + DoubleTest + 1 + FloatTest + 1 + Int32Test + 1 + Int64Test + 1 + IntTest + 1 + MenuBar + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + About NewApplication + + MenuItem 1 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + + + MenuItem 10 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + q + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Quit NewApplication + + MenuItem 2 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + , + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Preferences… + + MenuItem 3 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + + + MenuItem 4 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuTitle + Services + + MenuItemTag + 0 + MenuItemTitle + Services + + MenuItem 5 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + + + MenuItem 6 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + h + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Hide NewApplication + + MenuItem 7 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + h + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Hide Others + + MenuItem 8 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Show All + + MenuItem 9 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + + + + MenuItemTag + 0 + + MenuItem 1 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + n + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + New + + MenuItem 1 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + o + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Open… + + MenuItem 10 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + P + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Page Setup... + MenuItemTooltip + + + MenuItem 11 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + p + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Print… + + MenuItem 2 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Clear Menu + + MenuTitle + Open Recent + + MenuItemTag + 0 + MenuItemTitle + Open Recent + + MenuItem 3 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + + + MenuItem 4 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + w + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Close + + MenuItem 5 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + w + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Close All + + MenuItem 6 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + s + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Save + + MenuItem 7 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + S + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Save As… + + MenuItem 8 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Revert to Saved + + MenuItem 9 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + + + MenuTitle + File + + MenuItemTag + 0 + MenuItemTitle + File + + MenuItem 2 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + z + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Undo + + MenuItem 1 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + Z + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Redo + + MenuItem 10 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + : + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Show Spelling… + + MenuItem 1 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + ; + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Check Spelling + + MenuItem 2 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Check Spelling While Typing + + MenuItem 3 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Check Grammar With Spelling + + MenuTitle + Spelling and Grammar + + MenuItemTag + 0 + MenuItemTitle + Spelling and Grammar + + MenuItem 11 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 1 + MenuItemTitle + Smart Copy/Paste + + MenuItem 1 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 2 + MenuItemTitle + Smart Quotes + + MenuItem 2 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 3 + MenuItemTitle + Smart Links + + MenuTitle + Substitutions + + MenuItemTag + 0 + MenuItemTitle + Substitutions + + MenuItem 12 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Start Speaking + + MenuItem 1 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Stop Speaking + + MenuTitle + Speech + + MenuItemTag + 0 + MenuItemTitle + Speech + + MenuItem 13 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + + + MenuItem 14 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Special Characters… + + MenuItem 2 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + + + MenuItem 3 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + x + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Cut + + MenuItem 4 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + c + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Copy + + MenuItem 5 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + v + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Paste + + MenuItem 6 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Delete + + MenuItem 7 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + a + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Select All + + MenuItem 8 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + + + MenuItem 9 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + f + MenuItemState + 0 + MenuItemTag + 1 + MenuItemTitle + Find… + + MenuItem 1 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + g + MenuItemState + 0 + MenuItemTag + 2 + MenuItemTitle + Find Next + + MenuItem 2 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + G + MenuItemState + 0 + MenuItemTag + 3 + MenuItemTitle + Find Previous + + MenuItem 3 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + e + MenuItemState + 0 + MenuItemTag + 7 + MenuItemTitle + Use Selection for Find + + MenuItem 4 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + j + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Jump to Selection + + MenuTitle + Find + + MenuItemTag + 0 + MenuItemTitle + Find + + MenuTitle + Edit + + MenuItemTag + 0 + MenuItemTitle + Edit + + MenuItem 3 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + t + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Show Fonts + + MenuItem 1 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + C + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Show Colors + + MenuTitle + Format + + MenuItemTag + 0 + MenuItemTitle + Format + + MenuItem 4 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + t + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Show Toolbar + + MenuItem 1 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + Customize Toolbar… + + MenuTitle + View + + MenuItemTag + 0 + MenuItemTitle + View + + MenuItem 5 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + + MenuItemState + 0 + MenuItemSubmenu + + MenuItem 0 + + MenuItemIndentationLevel + 0 + MenuItemIsAlternate + + MenuItemIsEnabled + + MenuItemIsSeparator + + MenuItemKeyEquivalent + ? + MenuItemState + 0 + MenuItemTag + 0 + MenuItemTitle + NewApplication Help + + MenuTitle + Help + + MenuItemTag + 0 + MenuItemTitle + Help + + MenuTitle + AMainMenu + + Window 0 + + WindowContent + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + ViewSubView 0 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSTableView + ViewIsHidden + + + + ViewSubView 1 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSScroller + ViewIsHidden + + + ViewSubView 2 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSScroller + ViewIsHidden + + + ViewSubView 3 + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + + + ViewSubView 4 + + ViewIsHidden + + + + ViewSubView 1 + + ViewIsHidden + + + ViewSubView 10 + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + + + ViewSubView 1 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSScroller + ViewIsHidden + + + ViewSubView 2 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSScroller + ViewIsHidden + + + + ViewSubView 11 + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + + + ViewSubView 2 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 0 + CellTag + 0 + CellTitle + HaHa + CellValue + HaHa + + ControlTag + 0 + ControlType + NSTextField + ControlValue + HaHa + ViewIsHidden + + + ViewSubView 3 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 0 + CellTag + 0 + CellTitle + Still Haven't Found What I'm Searching For + CellValue + Still Haven't Found What I'm Searching For + + ControlTag + 0 + ControlType + NSSearchField + ControlValue + Still Haven't Found What I'm Searching For + ViewIsHidden + + + ViewSubView 4 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 1 + CellTag + 0 + CellTitle + Once upon a time + CellValue + Once upon a time + + ControlTag + 0 + ControlType + NSTextField + ControlValue + Once upon a time + ViewIsHidden + + + ViewSubView 5 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 1 + CellTag + 0 + CellTitle + CheckMate! + CellValue + 1 + + ControlTag + 0 + ControlType + NSButton + ControlValue + 1 + ViewIsHidden + + + ViewSubView 6 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 1 + CellTag + 0 + CellTitle + + CellValue + 50 + + ControlTag + 0 + ControlType + NSSlider + ControlValue + 50 + ViewIsHidden + + + ViewSubView 7 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 0 + CellTag + 0 + CellTitle + Cancel + CellValue + 0 + + ControlTag + 0 + ControlType + NSButton + ControlValue + 0 + ViewIsHidden + + + ViewSubView 8 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSColorWell + ViewIsHidden + + + ViewSubView 9 + + ViewIsHidden + + + + WindowIsMain + + WindowIsVisible + + WindowTitle + Window + + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingView.tiff b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingView.tiff new file mode 100644 index 0000000000000000000000000000000000000000..228df732b8f945647fe366b8f03107860b828ff1 GIT binary patch literal 161670 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 literal 0 HcmV?d00001 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.10.6.0.tiff b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.10.6.0.tiff new file mode 100644 index 0000000000000000000000000000000000000000..60c362af8d49075991528128fff4dd16d65fb138 GIT binary patch literal 21380 zcmc$lRa}){_~rMZ8xGywp>!jM?(UQZr8|W~cZVn;ARr|vKN=1l(vlK_BHb;a!~ExN zuI6s8-plv%#@_2$-?g@e2H*rh{U;pI!yrDyRyt86@zafI8Psgy12#IMrG`9YNs6{Q zty_LlbZN?Vx?;>Z8f;mr_PT9$|5-fGRd>)6D_w9E$=7t$YumbhBVDBJq%Th8mb7F# zYsk58Q}$8IF>zmxn8kovw1$9gz8?8+mwdgki=hNd&V=I^Q&+XBI=dZjir*$x@W=VK)oKis%Dh|r{t*m;>qmK*WB9e40H=^WfZ0%}e=ILSQ+W$`@T*vRhj;J_+BDBxe1Dd`R4kZgEm6+u>n2(`1L~yiDeLx9y z0;q}rP*4n>B}N4+0mvQ=9KACHpb=sK;t@E&X6nJYQzKG<>eP`c%)ki&#Iv+CylJP? zo2IY`#UogmkT{NbWLBO%LnYOvfSr=Ch!k}QX17TWfk7VX3WsYto+&jvM35_cai`p> zpFZNs%@AvlD9mKJQkPKsBq?XgpS)^PgQFD)VF1u236P(zm~(OI%X)Bh1${sxTd@i@#%1oq7IOj)t$w|#hd`z zHh}C&wankVF1x_KJ(o)S!|<^~U?CiG(KXe6?H}Yg8~|ue z^LXASds3@%zBq$J(1$;oTip+PVN9`%5qPJ3ra9rne?EL6X{0c7S-=_O;Y)t5?CAS$ zyjMF?=nM0GHv-_Vl$b4_@3f0pLCo|2;u!)oOHPdiiZu^_8(5HW4FPz$7ytrbc=2>p zo40QeT~}V~`RjBE6wE_m6TbuDi}~F$_^o)zU^(aV4V_-Yz2E(eQtxJr^ojbv#XnK_ z2p|K~<)*cQ0YVRMfVM;pP$Z#@(^yC_n^9DH_6RtE8=lOPq~g#egRgvYdXj?Z?AMu) zz&%#tE+od26ryhbNmQdRXi+NGT+Xi&lb8EO3@vB%jA9f#9t&;nmduH4nI}qZTJ6QK zrl3Eg?Jx$jn@By1$|=y6Wt@=++S0JIdQ*g8*zkrtGq&50%; zvkjQif&esEPKkVnj%mP~ksqWCXRy#SMR}w(Vk9Wbaxj#75@kU16Glbv$(aYuF7k}N;814N&$aq`)GRwr`Qx;$=ZU6gIhlSj096;J!wu@cb641B8$4U>4XfE;r za*hoE!F;2_+4m5=l}14yJnP+KHg1j;d?USA;3GO;3C=bwTt!+@B*9VtiitpXHHU#KdT zNJTWXME=W1+_o3W8uTN9?m`sJPKHPJt1=0hhE^n_CcGb(jnRo%?ZdxYux}pGM=P9@ z&6*f`+S@JZG9>|xdLNY-3z>Itw_FYMVx73GZvVO8QX1)F0Pp)#hAT7DKt;X0<{AaSMPNAeV(# zT`eUnCR~}vHHX&djWy2S^&20$#(Xe*7HLA+Y70D(67+{=|} ze=PRL$~UnQ8{e11JW61obyxJrWTn%ds|LA~+4O8(d>&G5jnp}yd$nFYV~sI*RQt9Y zlD_gg(7nvD-ap}C?fwA<2-v9!vC$&?755nWI(? zRI+9$h5*y z$l3oAVaN3U_l9iXcz!7K=d&JtdumBCwBnUrbsA&Ofai<>OW$fN8mnV`eKTo}x4jEvG@CHOgq+ z&5LSQUW~<;AnvZN-t0)A_0=D$5yUhgAp2wTE?$(Qjnj$3Q?zMjs$3`g23)fvIiQ9MGKjn1)7AzTpL&V;G1UoWs zY;7Yj7!0`VKi)?W4;=Wq##wO?RioB^u#yLTU{pp+hUD8W=$}$+|A_qBv>dZNY6Gg)dF*pTp$CWyaUn@6$qH_avWr@NN(wbXPY zEtpI*lJiAtorFkjWRkq}*Lu5v9IV+2fBD`&fTpK#=MFEnWcN< zm1q>-w55SRQJq=`@$)9l4kP>)^NuX84#WHPPeW%9scd8C4^twO7bo6Ivj^tfXDFZF zsB|pA9uu)wU|m1te%}7odb|DSZ|bN0-DLch<-33Q!{-nGv=*-)|E2CIG5nkAxeGf* z0tj|=2t79%{Dk`gFZL0M-UToGR2BmPl|lu;CgM~Tr?-R$smP8h@-%{=k6m%rs;Dqx z+J;cJLI&O1{8{vAA9+7hDrPavCdT6@lI)T(%Gngy2?L8R^%Bl(xChIB5HoU{B_78x4`B>bFmXF*>i7u^m1mNFGl4kb z_(uJ)sxP_WyX0`i4eiI$kks8ANo7oQ24-%})LBaTd@)qUQkRtU(*$`HOjesxyR3|J z8}*)e7S_@|l8o6P?J*9;^U|%-tSv@u)p#Q=78jO?20|k>MpVwS{Qq*!H-*Mtd9#(( zbiTbnvdY`@=PfPm&TV3}8!zGFV>M66y%2Yr;P@oqkRSP;$kb(`GEm52H7JiL$YYX2 zMZ}TXGan;Ob+QQHesb9^xahq?HrcjzhIFl;E9lwLqnf-3 z;Vg=?p_gkheuGeq{xTtncbsoyJ2UN&Ift}8DGM*^V#HCWXK)|@a-BB`Wa~1)fpxMB zT|Ptaa#ap(k9%V}UvY*`Z?XWl@%YAI~^=PxGgCnuxy%NqRul41`xy}V2`}yjV3?wMD!)-SMsTSPD z3Z`V7-`!e-X93#1OVa|wI+JSi0|d&OoR(M3E3P+$JV86QO&x9s6g*NADUtjYe$V^? zY$3F*i^gWLA4)WHqrNRtg^O$Pq; zWalJ)Xh00Fzr468&W7 z&*)B+@d+(2lvO*MUiT4czsu&ub(?S2Fhp7M!I0F*33Ud})mSJNl*Z;A6Ty zvr2U$`HINzyJ}Nh*Rn9H09Ncs^_;aHU9)-LDKA5k?7=w0MT4b?CEv%$B+Iw;uJ#*$ z&}3t+a2-(7?fxk0Wec}zlDTiT=1_Ut7-@JXtSzu?1{&x7&P;uYBiNt48z8JazxACp zv+PxnO=Zqpo1e9zgK_dJ6Pvbn^dv{)wbT!`cW(U-yAy`#4KDYJ-dOaSLh(cZ4LN`74v;TWleZ1&)mVaWh{pZ8U zcbvyT?+bT~8ILt|wQoL`N)#>ge^P!|tx*>&))blk;Ip|fL)TeTmLig#^$$gl+?4M! z&>FVB|6tvIZPxRub6x!Cpl+9JA?izEC<2^Pb#DOQ;0?&p86f6GKG*(BwHo$lg}zW5 z{_@G+hFSrod)p#F^(fzUAoZg=7XqxHD*-ipzuM5KCoFBV11BwZMOsRKs33>Ew9hx` z^#B4^(*T9Q2SAo!0Msx6z)u7KI@U{xZMdW7jX*t+Vn_ot9&-Rs)B~WSJPoRobO2>8 z=Eq(^*y(>v@&Rd(NjoBN_jwPGdHfE4Njz%BwnvTOl(Eg=2& z8uCkDJEVd6qVL-0g>4!LMji(W#p3|YCm0})Ndr(!Z_DlY0*W&!Z@k86r=Q5#z*8xD zW4>ipsuS3tu_Ca3qXw6VSph1R$+XxX^Pcw{4wpIKt|H7L|^jbrsPhQG74G?E9z?A9b zEbaBqZ0gNT;E< zvcS3+4*{Su%xPZkV3b`H{DIPhXVcAa2+$sz64L{onRx)DqnWnqvY&MeT;U#;sCMxU zvQ0BN&n^yZTN6(8(`d1+020Z!4+2NtIC=E|rE8@{_^2*o1tFtY@T&}g)P}DODBX2z zxN`z8Op!<&Rd~*u3`4&{S9TRnMpsh%M}XR9wT?2^9i(CAFl`(&{NtDFsEulLqc&qn z-ZVhAWQ3t$>+Y`B)zfP1k1v`Ruiz$_=}c(weP(P$X=L}mK{z1(c?t=DxNPMQ5UAOD z0KT)CE{qMpW_#5w!$A+~5MTp2KMf!os(oe_e@uHQROC-q>fZ9^NE@$p9lACH_#STE zi_7G|_YfTb7l#0MJY{BjVZaqUeI7@bGYm4Bh#%5HK1?Pdg;7!N7p1r7Jz z`iVY)fUURsPgsR*%vzqaYkbf{RB{?p z)306>E&dd!s}!Gn2nNRqg0h_p<=Vd|0zh=PaI6 zrhJmQ-#z7fM40z)Kb9nnzh}?Ud=R<1=y9Gm%Va?V#Ux(26aZ}gvia(v=5g$;WIa3Dp6A05k6~^a>nU>7zBNO_|)-em}$xf@0n)@ zXa|qqd}BMzRQ&bRRH(P4`kQybm-Hay2#=i;UqG3WmWTlCFR~b;vYi03R=tek%ay8T z%St$Cy7gfsn;*z4`jbkx-4?rl@j~|@G&y~{ZR*+bzZUDzlUc>0se~YE!~?Owx$t##11a2>Gzo(8P@*9uVHHCn}I;Cr}h2P!AQdf>s-Q z$~{59FQSBd&y)Lcv77KD4&1CVe69^8I+rpHM^Cyo#^w3?nE(E zkk{*Lx*DvH?Ftd;Pon5sK^jOzp<7ih4l0+oB4v_8ik-86k_km;sS3gcSfwDWBUEnA zS+Pw;?iaM8e?x{DR&gj3cPJZA9-_o;5!1vkOVln{`SQ6aP+|{Zh#GNL;9|`06Ezt8M;0EdOjW3C9wCf<7e`ox&N<7&SAa=m z1d&Vy$p7Fg+hwH|a?GR%ikM^s91a(!*E&TZ#YK;jwbpL66Q;qnmxrM&mA?3YK=pj@ zL;&QI-n%8n5P&odBieugOr;|2il-}9fySraAI(n+{)EPRVAyvX!1ZM&TMZ1EBu9Vk z%M&xJ2N`QBNN^w`DtC7X!q(l%Dx}7dwIP6xoEJF{2dLV>@D8oOS}MRf*E9d$s6I)| z8-`Bm11_f(>v&-fPb2OeKz`q`3caZVBEm5Am^r|->cGOwCQszc7}r?hY4MLNd3eh! z(7fAGq+n{-CrGEQgFgW6V0!10Dw!}@`PhFi>kvN!YEm`-NHX{s)XUPqR+IC}+4&Ga zLt&7x4S@EqR;@&K297?C0|b=VfxFC;|3QZXbrw)}oX>+@9-AcyXwnWyhrXbHGzE|b zc7QPm02c`y_*g)@(ADixdy55KahQ01y`iQ*#*Sef&cKOg7|GyHW*Q|_&-x`^JLYpJ zF@@b(R*O#r;i^(CsR`x6`nYt1_7!WWF-gU9M*xm)J_k?)oB)<4{w3&P)@HJN^R;Rk zU+OEN`J;5{DboyI0UXjJH>hK$iZ%_MOQd7WK!vExW_{*S`$jw=q^i;w+{9j?n};al zz!#X{uGU>W|6E=5(08luUSdrEM}On;H1bXmV!?@)@Ua+(N+ghs_1BVF5OI>2$aDhg z3%;gMN!{7-tY#WUT|Aal*Oi>3F85V3Tt3ZDK3A~gPv;-|IrYa9a4rqBEKF}oQxkXi z8?VFXqLBP|A+II)%Mv}UGW0PG=#14~Oc%7ihMGq#tkp5B2poiWz0hMVYdWHg$)w*4)?8~jrb_u; z{`wtZB8Od-{i5zc60Y{;*SDD~4GUB}_HAd>8hp*edF~{`=hUezqiy$9!POF`LmFHb z9oI(sha`^ZLCpUDO^o@{sC^nzqV_jfyrxODUoJNPQarA2w$RM=+w|H5@q3NddUo65 zQ}VBJDLcN!Kw9^LojdYH*YUBg@#-we_9LT!TLHAu;5%vjLFyu(AQt6^Fs=Ek#|*kp z-goaOwYq~PZ{AD?P~p8ix%}t;aA~Pa7MS`M31*B788tic$NhcKqZo9(hHc{$75_~% z0E)UM50Rb5!;x8%Lf^Q=ayv|)kodH{@S}3af4>$}Qk4D78imi3z-jN}h5+tnmRPLz z(G|z`;gywba5RBbUC&$jn|!W~*mR!e7Y6n6@CTjvbWKhLBjP@#Sxv9gb zh3M2{=ANa`6ic0g;>x##LrXJMzoI;CU(eDhw1#6^xybp~%QDF>{y~k$2uf2 zgMZAdFk$8>YO=# z0N8R(j$&JRxeh8f5|IKh^%e#=zb>;7EW5Gnw712G#vE&L`Q2COEv0p2J19+A4-O-;D3=+j_YsQ4(C{3rK;_RF+; zlL|sZMe~eBg_Xhw2cU4`Jo!A#LU;OL?P>750{)~Kn!Zf`WyyzMQ55^QrRdCR3-6)a zgnLV^O_2V*p_`jeY6NM_(~)Ys3RoW}hhkElQgAs2NuGvjhHu{;wf0eE82U|1bU9>R zyyCtuJyqmajmuKu@Z~M0=PVX~@2s&mrjX$%Lx&R7W#Eiz{jp!QQQzr=tV*4u((}4} z8mmxwKTf7xNVh?Zvi9vBLhzH0O)YEKR{N$g3#(S9+wIx^ zPWNdcO^2C$Tyf-_LzG;HPOp4T_S{S^r&uU?*286F`q`B|?z)d`no!M^BOU9%-=`@S z?L1z13hPXUx4;}F-f%ML1twYTspZNV1TFcjEhC1={Ev#@Q3w$;uc7l3T~Is7Zf;@u zyOth2$Z*OKloLQ4W1@>2$?J*Q8|9C@R_*JLq4Bdfz-C1`f+%W4n6iH)DPxmbS(%T2 ztUrqO+|n*K2+!*UM(*UzFLRgMm|C%JU&eu1=Z|_E2B~FHp@&B5JP~exDEdmtaMvDk z>OHzu2E-JstZ^!oy+SbtZXKb^Ax&B5inwEcsH5x;hZN8Ms*i643#N^m8M;gLxkjl0 z+mNGzb>5{Z<74`Tyc6fbqq!cBzKWN3Wqw}U)_w2lgts16;OFZ$GsYiyR8f-^qJ+M4gD zFY9Sec_^_?M`5+iRU`~ck;pC)B$Y15HQ&v&UQ;Jq`(6q|W+>!rT-Ll>ylScEg1t?N zaKqbthjv%<@O@o)1{-c5_^bB?!#cWpMo)3z8J?IoARf|A<+ya8#>UP>}3bl`sebydJA&P7yi9@!YOAj$hESY2K z-@ci2hI)-Z1u`2o<*`JrGq3E)9Gib$g;2gK4!|Mpuy6YA>bLS{Xveo>-Q925r8mJ- zypX_g4)=yNQm);r<$JR3-$Ns@<|IiY{g*P2q-yJK(7L;DOijx)Q zG1x}B)0aQd}Z zpXk^011uSV&nammj{q9Pa3E=dQpty7b=tejaX|@3n|mS(>8sBW|83QTlaJ_9$1{%1 zO1KD(s-P$_tIP)P-wBuNR{+e$&SLJbx~px^{ySU($m)7HLn!J9fGr3o;w1neGh{|c zV}l+*G{4mxM}BBp0-;(6lt;+=)>P&$`5BGU((kG<`k%RVdmRnnd-ek_G~Ef28TMP;PGlF}Y})`<$nebbyg+U zQqzy?7)Lt+>x&(9j^A>UrCm(FMK|c0`K_7A7|chbdTLiZWYXy^IEWK*}bY>?4w*+%>_*{-eD#M`!8E9Y%&*DOJXBVs4H@nYkoLJ`xNh8{pwPtMuNrCe^C`j z?7~td4rZp<|Lst`2upFpdU4YBO2XkJ$>~1y9~lGI_F9Jrd*M~C$Ndgj(W#_nV(V!K z8AsWx#jU9@{Q#8TRrBKQ*fpypDQ(domz?e1T)`m73vl!gRsgji7w})N)_DvaCO?}f z@a!Zb={mRg`=+4S50^t=1ABG@IF!;&HAsynp)kVK9iy-?Md#%LLQ!N97(0z8%k=*pn5NihW{R}*YznPrs5)Gl;F1;f;_r)1zIn%tG2)A z6_{zY8T6pxJY-RoGu0NQBrin)RCR@?$(flDaz=;%Bk@zBe1imlnz8g*!oUy;B{}hT z`b(OqG=t=>xGoIZEXGKW9P}Y4X-cY(nMr36!ip8c)V8G_!8Nnb`&v3ke*H9$!Iha{ zov*{q`Bh|%{l=)dsdUjo;-!3)kCX}lAhRn17=-3&=&u9;>Se(bfYSy~js^i@vSzOJ z33D6m8J9`y-SC73Moy4v)AdpsCMEb|n|aFeyi;_3^7c86auo`QMR|>O!v3UvFFCAy zH%cpAw>XbWXIp5NL@KZBNBn5#e3QOq?T&6T$YC!^oI3E{dkgGvAtk)hG{%SBW zi`U0GOPY09pGLERw`ceh;5$CFwzyVK!Aca1mLwG04T>rfZ)a)VCOZn{l+LE zW{ig6Z$2__eI6&6tD!-z_XFtmM*u0|_L+gSljD3fWAh8|d9#-B*lSI@% zy@WC+9tWJFTeL-MYRv4qaubGZZIzzv5LiFLSH6LyuDz+?6;#5w9enmd%aIC zyc7oA$-gR`$YJ>`TDYNXD#7r5o?&p2iCkm;E)QSH3*I-{BtbH;wXX7b*;41|$yM(DvJ|C<`Mu_M*UjIKYLis#w1a;=7%kX8 zjJ@sHkFo~+!bpCun!i1wY)L@XkOO% zW(W*@unhmTh%YNQ+A^~Jk0n0R_KO6Y6N-d20i{$Y@I%l8@XwbKxxe$No3cJ5%Q^4+ zGWLq*ajxY@_}9Ervyf*hobn;J3zUKc`H=c)!Rr`D{ba0G$cZMzFQ6a1k zCq#x4>PQo(tG1*nnxao%PKw~w4}3qFfgC}RxNV82^@y49i9Makbo?aJpFPx{K)I5M z;yZBp0>POZ?~FJ3%v*{`U$SX4C{zflsX$cwm7-3L0vVe^r;aMUU6Ahs-t^ERUo_M+ z9@@}(an{J2-a-Riq3MTGL(PAkn4s~}Gx4&}9P`o0q0^*a(9Qg1@%;I@VTTlYK&o>> zngM>!TtA<=XV9f%M3SP{_)MSn6Ck)I5=oQ;5AfNAyx^DG^iNpO38LB1nnpjC^I#6b zJUaeJa%dTKdL{eJXO1xr4p|G1j5@CLHcsduWEL0SjXRfhhfKGTrLl#pagltshvb}x z+{>N%z=tz&pwsIx?flg2)gkb(z?xpK;F;xOZLEBzo082~VK(*@r~C73 zda=pO^CKY732y=55r`}oDvB4x$^v`)h3Ef>358u6C3u^R81(QV4SP5`bF_NjbSUugSh8VF_9(Og*I z6UH;oLRm2Cgoh0&y@voq>q!c6FTM%%iBg7FP`=hBD8}i8w*z4I;#)~>y#g%`20Bm?-Od5MF3J_egJml-~e*@;@@c! zJ^lX&nCSe}`=z_CM_ykA2Ieq)=OWPW4^Zp$(|9P;AP6}wdh~VD6?fnE0xMMUVoiX$ z1w)lA0z_}0c5>nTZGS1=aB=!~e{dACi4yky@7`~u#&RY?_&ip+=!etWeMj_oZHN~G zxp>oggMRJvg9S{UcqzLkHwi=k8y|3d3JBJDA$sG0JO~DPZh!tBvh^SkScLldaVkRp z&s6Hpn^k`}T5r8G95o6D;H9Z8Tvtx2wV?N5+{@1Nv2&@e*lW304>A) z7E&NmOO>=)>F#5O)~1?KvE8=+tz<9e|DZvgG0%J}h_+4^J!HfqpN~oZxO=DLE)-rQ z3iy&D=>gtX03`8|tC0L4FP;)lzM>k;zb7h5OgJGEaL9xR99?n?5FJoF1k)xphLNkN zDN7PW(SsVE#3CTVJypTYh9|pQDj+{goXqlnU}A@-p!N?1Rbt~((V3tRFX$(2YI}$F zAH4R5-Nv+4p;5*lu<%m_z(9h3=6%cKK2{N63?LhUv@ptCZ)71SM4;SDw%=8+PvZ@QsM#p+`jGU@D)mpbaTllNC-h))g#Wo7F! z)`!u<>jiNSE7oCH0YZs3{l$2 zeVu-@Iyz=9qMuvK1$?M0&GJayKB**C4GC8lGdO8*fdKxQdhpcr!kWQNi?C9EgsEkD zjeLnL&zk+WunVZt)mzEfHXdZ;O)R)R@5*IA>mit(#H$q#U8D;a}Mf9eu`L~9^r|M3^)kx+O8R(`dXJ6#JxqTu7F{%00L_xQvOQCqqsgp_M6=4k z^s~W;g>*HF??lc>zJHu~jrX(e&qa6cCe8}4J{#0(%vUX&t@1e5l1#Q6nI85Y`1;qW zW3?HzKfXLf4VSsv?lsoGf9WC=-(dJ`h_D0G)+K_VfmCtK#Ei$@<;~kB#qQDN4k^bY zRF@{e@^FpYZm&*-FUL=cmY8o^@?i zBH8m;HojGa^~b8&JMZJ@8R45}duC<@zHWod9SVi}79B>u$5)%3MoDRFE2B>Cs5@Oo zwbumB6TvQBd);J{cNS(p-nc}c_mCa`H9I&7bJ4g%kmDnn=KXbCsKo9S$zUL9?!TA^jfy5mFhoD;hN63;({qD0K8uu9-Py~zvotf{` z_?0dlY%^nJOiL(mlq|F&z-ni(EaDN2=o77&kFP0UhJQRpw>r)Vf9-Qm=fv^V;C6a^ zuUP79L%?X#t1imJmq`lcui_f$IDV_E@y*X`b)ezd)3b;2c_YBvCrw20NP(7Kd-?x) z&X<#JR=l33J7Ypa{w=A2VM`-8%wAh}xXDGU}VQXIBlkL+FRF zZ(3Puy*~}ug<`ay5_D6l{a^ZDW}3ZA@GYMXUewL;QhUG&Abr#5*n1UwH2D9$j%a^) zZ@&AJ+BObg7W1<{ZMQ4BT;}Qd#wuT~i%Olqi(_pF8fZIt!HSOdLE?*yNQ^j7YVLhg z5rBOlPx_%g8jQB~_&E7Cj zRVbz&q8dQE{w->r68o7tK)vArkbgM$PP7*N^#zJiQbyAJROr*e}eZfai_OwFt;U|^!F2- zoY`hbi}1-t{_xK>Yn8kj9MtZ;oCbVS=!l}Zl-B2esGLM)zurC5IzXT$V41)1 zzE_wbQ;C3U^Y6Ong!vYhEjRxZFwR93QP%vBp}hS;AJ{F2_U|5Eey1CN{rHk*e}5{J z<=CGbn->W80Dvu>jJk#9_+s=@#bTvC((RWrGCY*2U(_Ww4F7jbA=!05-Nq#TKU$s? zw;*mwGnp+~`-EeN9)x@0$;m@Lw_3UD-y_LieU>Mg=7FS9FIBexrKg>Vc#WbB1CTBh zn<*5afTFD|T+{wj_BB1YC4l@w1y7a4ID!|LXi@z?q2yVb93=l!N$kIR_zR?H-JgP2 zWniR&KzXVTJ?8$VM<(xRcHW(`v*`}XRJvOr%q74CC@z;;ao zvCR!jPbxL9jcYU)A3z~l;|yns|4ro?`W!p+Yt*@rCrxlE;5v96A(a>0eFHsQ4^Dsa z&%J~AY@nl18$I>g&!b=)%PG9<`zs*z58w!#*f!Bh@7b8=f@ewC$gop+!XlzE!nkgs zBINQX)(tYT0odYSsVO2B2f&H|9Uq=ffKDWk#*B_EN528Q6!tES;|F&bpHnEN4G2aJ zW6asbE5#*+#EoE-x|7SWZ{8v5t&k5`=%$(!Gw3p$552}VAf7w`8Knb6oXHa*3$n>6 z@u^?Pe-qMp&7Y1*)&vK%lOEqKqY%m3HsmodNTK7qkv%o(0x^w#T}C=hy;)otrnv@J*|{DolnqNbq|EmDxPZO0nc;;b zdvTKbxp*qIACh_&=Jiui)%c=D{L8W)jsb}b{bLEB7B2C1io7nUiZ{I;?TcTD)2MW3 z5dJ;r{@qBZ#mBUT=S$pL3(XJTbpc5R3|^)^S?B09Ug0fxHln+%-?J*72d*3HZ=Pbu$ zF5i5BK@x1piy*(7rQ8;@QjYE;RWKlCrQW2G!F_ucGGCkjy1Q>c-t@}Wx6<^R@Lp;_ zT^F3icTd0)BtdXBmW7+qypC<$U2+yWe!e>;olvqy$Tr){DRtiGf`j@mY%ExFk%tU` z$Q1w~^Nx{QNq7_IU!gLw3D8aw#+zR6;%@|o+RS6nbVpDIz$r>b*OuS>(k8vPf_yq* zwOleyydQecc6#4^$8+(JtTTTDAdbI~S(;E-?qqo)c<%d@wT|ES^b!1>h(Z!igPI_a zH4onI*YGp(BC_CYD8}C=BGUBVlh0--!vIqx9N@~Fhpf+UhNvJQJ;~c+d}c7|XgI*? zyWIa-*pUoN5{zO%)S@w_0L~L!g^b(!5q&oNz$F#RMW&ZKXAXqX#0|CLYw630Om=be*esU*XA zwO%qe>U>TLDO*hwm)wv=2#=gJe^*doumQqHCNAY)@=ydeYUWfbyslk8($WKUElWb>*G zCu}#O->n);%BF%ol-h6 z!Fdkbp^pu;FhKJ&;Fo8$Z%LEe<*wkEbii3A-j~$wT~#UrdX2sAA=kdy?vUVAE5x0P z(r$kxC+Fd_$ITHjAruL;D(^b=G545I9JAY{B6b{m6c{p+l#@OEf$PKQa(2*Wqtpw+ zDphIZRiM>?0BE${-Rga7lKJB@XU?93N7&>$1>kjBRL}r1U*}GuuA3lMi>yHwnNxe| zAwQGdtQGKl<Cm$Mdrj4SY8#E#fz*Y@LjUn}9RRXpiE|auuB%`9k(ifbNK$ev9EWMg1C@JuT( zo_F#UuiM$Bb8I{vkCX;ab;!uYX|)!=$2v?$(bY3JGB+I3uw}QfzDgP_>5TLBTkekb zj3rYYXK&fAGhyAA>VH!~A>&Q_mgj)V%;_%W&8jA*)N!s=Dd*Q>fA6T^HY;S+%@5WM zGlmj_k^}@HeuRC;hBFtG$P;`$q9&pEmQnS#YyZ`#oxb?6k}^`+4>llYy=XV{(%yyl zOvy+5rA!)$e{l>C~u_qF_$@r;dw8F8hsU>H=FLTrUqOb|lug9O_ml942qQ76H#-y0O`^b@gJus9_U2Q|jMK=hBK107!D`55wisloDYHAN`ly*@)mdcClw~flWI|YF zlSukF%w#1wWIMTK$9ZTD*@TF$`c`>gta6gnaLM5a$Vm#yDR;{r`1Cyp$%R01q1*l3 zqH;A7a-EWLwmEV>l5z(oaumXHrPA`$vhv&v{nPnUHFEN16!H+E0b)h@Bo+C*y#cwl z{w-Dcu{e28A)Y_wQXv`&I64Yc(b?8jpAXrp4s{hwwg)x^Ki^G>CmAZ_n<`Yz&_rA) z$Um1wF;mz}9`qEHk9w&{ZKKGMJW!t}uWzepygLLD7$SC1OnRl5`%Mw{en|hd;z;|D zC!b=JtKx%)5=OFO{d>g$PbG1|{`76dOCKc{f5ka3%zSU9kRXgwHv)A(rJ6TNtENhE z@09XGm9~P@YqB9$eThfkB0QKFPW!qX%pMqJ{R^F@`llSb?kl!#-~1mi}=Qo#XfvM3t7wfaB@!DJ?aC_jaSOH~2(|nu0 zRF9I|Le9lf9m{6ya65h(Lw!X+eRp0VfHL? z@KCMq{~abO6l32qlr=P#EJ;}=V;eNXj6`A#Mq@BDNU0`STIkx^sB5c~B1?)&xkXtc z4Jwj^s1Sn+dT^!+=b#y8CU-h3+tqE4rvIbWPcuKE>j;>k!jh;U=NTY|X4 zv-LyxVk-up3D&2=hT)96^vIo6gT}b%wvNwTJ?abfo#dnoPd2DG4UW#-&nFk^zUlS# zpzB25c=LI0^scRHk21^O*WWSA+Hm`I=ck^EO$U`8j7-lQJmg)8%hIka6S`({Chd}# z(|1dup~oA9bUyaoyU+L}zT#mrY{gKydNLT?7M1hjtA4katIrYUTLo&DKbsR*PVvP{ z0L><{wDR^u--PUxTyvRi+uOvHl=VuD(Q7AEEZ5+~JjCQV$Ya`gj;N7h+mQc z8x!9ND;&OgvMYAXfg7xdYm+$cgRxi@iyXexPd^WYF@7CL1VGGg=Kx8^^ru7giMVzR zDk+5~VGV!Flx@OlOxQ@o#bn)*>g3f&w!Rq+ z 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 literal 0 HcmV?d00001 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.gtmUTState b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.gtmUTState new file mode 100644 index 00000000..27dd08e7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.gtmUTState @@ -0,0 +1,291 @@ + + + + + $GTMArchive + GTMUnitTestingArchive + $GTMVersion + 1 + WindowContent + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + ViewSubView 0 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSTableView + ViewIsHidden + + + + ViewSubView 1 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSScroller + ViewIsHidden + + + ViewSubView 2 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSScroller + ViewIsHidden + + + ViewSubView 3 + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + + + ViewSubView 4 + + ViewIsHidden + + + + ViewSubView 1 + + ViewIsHidden + + + ViewSubView 10 + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + + + ViewSubView 1 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSScroller + ViewIsHidden + + + ViewSubView 2 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSScroller + ViewIsHidden + + + + ViewSubView 11 + + ViewIsHidden + + ViewSubView 0 + + ViewIsHidden + + + + ViewSubView 2 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 0 + CellTag + 0 + CellTitle + HaHa + CellValue + HaHa + + ControlTag + 0 + ControlType + NSTextField + ControlValue + HaHa + ViewIsHidden + + + ViewSubView 3 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 0 + CellTag + 0 + CellTitle + Still Haven't Found What I'm Searching For + CellValue + Still Haven't Found What I'm Searching For + + ControlTag + 0 + ControlType + NSSearchField + ControlValue + Still Haven't Found What I'm Searching For + ViewIsHidden + + + ViewSubView 4 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 1 + CellTag + 0 + CellTitle + Once upon a time + CellValue + Once upon a time + + ControlTag + 0 + ControlType + NSTextField + ControlValue + Once upon a time + ViewIsHidden + + + ViewSubView 5 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 1 + CellTag + 0 + CellTitle + CheckMate! + CellValue + 1 + + ControlTag + 0 + ControlType + NSButton + ControlValue + 1 + ViewIsHidden + + + ViewSubView 6 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 1 + CellTag + 0 + CellTitle + + CellValue + 50 + + ControlTag + 0 + ControlType + NSSlider + ControlValue + 50 + ViewIsHidden + + + ViewSubView 7 + + ControlIsEnabled + + ControlSelectedCell + + CellState + 0 + CellTag + 0 + CellTitle + Cancel + CellValue + 0 + + ControlTag + 0 + ControlType + NSButton + ControlValue + 0 + ViewIsHidden + + + ViewSubView 8 + + ControlIsEnabled + + ControlTag + 0 + ControlType + NSColorWell + ViewIsHidden + + + ViewSubView 9 + + ViewIsHidden + + + + WindowIsMain + + WindowIsVisible + + WindowTitle + Window + + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.tiff b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/UnitTesting/TestData/GTMUnitTestingWindow.tiff new file mode 100644 index 0000000000000000000000000000000000000000..63f5649261adba8a34af32f9063d881d9bd1659e GIT binary patch literal 21226 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 literal 0 HcmV?d00001 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugLeopardOrLater.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugLeopardOrLater.xcconfig new file mode 100644 index 00000000..b00a6cc5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugLeopardOrLater.xcconfig @@ -0,0 +1,37 @@ +// +// DebugLeopardOrLater.xcconfig +// +// Xcode configuration file for building a Debug configuration of a project +// on Leopard or later. +// +// This is a _Configuration_ Xcode config file for use in the "Based on" popup +// of the project configuration editor. Do _not_ use this as the config base +// and individual Xcode target, there are other configuration files for that +// purpose. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Pull in the general settings +#include "../subconfig/General.xcconfig" + +// Leopard or later +#include "../subconfig/LeopardOrLater.xcconfig" + +// Debug settings +#include "../subconfig/Debug.xcconfig" + +// Merge settings +#include "../subconfig/GTMMerge.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugSnowLeopardOrLater.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugSnowLeopardOrLater.xcconfig new file mode 100644 index 00000000..a0904125 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugSnowLeopardOrLater.xcconfig @@ -0,0 +1,37 @@ +// +// DebugSnowLeopardOrLater.xcconfig +// +// Xcode configuration file for building a Debug configuration of a project +// on SnowLeopard or later. +// +// This is a _Configuration_ Xcode config file for use in the "Based on" popup +// of the project configuration editor. Do _not_ use this as the config base +// and individual Xcode target, there are other configuration files for that +// purpose. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Pull in the general settings +#include "../subconfig/General.xcconfig" + +// SnowLeopard or later +#include "../subconfig/SnowLeopardOrLater.xcconfig" + +// Debug settings +#include "../subconfig/Debug.xcconfig" + +// Merge settings +#include "../subconfig/GTMMerge.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugTigerOrLater.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugTigerOrLater.xcconfig new file mode 100644 index 00000000..34b7b1c8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugTigerOrLater.xcconfig @@ -0,0 +1,37 @@ +// +// DebugTigerOrLater.xcconfig +// +// Xcode configuration file for building a Debug configuration of a project +// on Tiger or later. +// +// This is a _Configuration_ Xcode config file for use in the "Based on" popup +// of the project configuration editor. Do _not_ use this as the config base +// and individual Xcode target, there are other configuration files for that +// purpose. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Pull in the general settings +#include "../subconfig/General.xcconfig" + +// Tiger or later +#include "../subconfig/TigerOrLater.xcconfig" + +// Debug settings +#include "../subconfig/Debug.xcconfig" + +// Merge settings +#include "../subconfig/GTMMerge.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone.xcconfig new file mode 100644 index 00000000..6067fffe --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone.xcconfig @@ -0,0 +1,26 @@ +// +// DebugiPhone.xcconfig +// +// Xcode configuration file for building a Debug configuration of a project +// for iPhone. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +// +// This file is deprecated, please use the version specific one instead. +// + +#include "DebugiPhone20.xcconfig" + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone20.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone20.xcconfig new file mode 100644 index 00000000..7424704e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone20.xcconfig @@ -0,0 +1,37 @@ +// +// DebugiPhone20.xcconfig +// +// Xcode configuration file for building a Debug configuration of a project +// for iPhone OS 2.0. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +// +// This is a _Configuration_ Xcode config file for use in the "Based on" popup +// of the project configuration editor. Do _not_ use this as the config base +// and individual Xcode target, there are other configuration files for that +// purpose. + +// Pull in the general settings +#include "../subconfig/General.xcconfig" + +// iPhone settings +#include "../subconfig/iPhone20.xcconfig" + +// Release settings +#include "../subconfig/Debug.xcconfig" + +// Merge settings +#include "../subconfig/GTMMerge.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone21.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone21.xcconfig new file mode 100644 index 00000000..18c923ad --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/DebugiPhone21.xcconfig @@ -0,0 +1,37 @@ +// +// DebugiPhone21.xcconfig +// +// Xcode configuration file for building a Debug configuration of a project +// for iPhone OS 2.1. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +// +// This is a _Configuration_ Xcode config file for use in the "Based on" popup +// of the project configuration editor. Do _not_ use this as the config base +// and individual Xcode target, there are other configuration files for that +// purpose. + +// Pull in the general settings +#include "../subconfig/General.xcconfig" + +// iPhone settings +#include "../subconfig/iPhone21.xcconfig" + +// Release settings +#include "../subconfig/Debug.xcconfig" + +// Merge settings +#include "../subconfig/GTMMerge.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseLeopardOrLater.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseLeopardOrLater.xcconfig new file mode 100644 index 00000000..31ac835d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseLeopardOrLater.xcconfig @@ -0,0 +1,37 @@ +// +// ReleaseLeopardOrLater.xcconfig +// +// Xcode configuration file for building a Release configuration of a project +// on Leopard or later. +// +// This is a _Configuration_ Xcode config file for use in the "Based on" popup +// of the project configuration editor. Do _not_ use this as the config base +// and individual Xcode target, there are other configuration files for that +// purpose. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Pull in the general settings +#include "../subconfig/General.xcconfig" + +// Leopard or later +#include "../subconfig/LeopardOrLater.xcconfig" + +// Release settings +#include "../subconfig/Release.xcconfig" + +// Merge settings +#include "../subconfig/GTMMerge.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseSnowLeopardOrLater.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseSnowLeopardOrLater.xcconfig new file mode 100644 index 00000000..0d240698 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseSnowLeopardOrLater.xcconfig @@ -0,0 +1,37 @@ +// +// ReleaseSnowLeopardOrLater.xcconfig +// +// Xcode configuration file for building a Release configuration of a project +// on SnowLeopard or later. +// +// This is a _Configuration_ Xcode config file for use in the "Based on" popup +// of the project configuration editor. Do _not_ use this as the config base +// and individual Xcode target, there are other configuration files for that +// purpose. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Pull in the general settings +#include "../subconfig/General.xcconfig" + +// SnowLeopard or later +#include "../subconfig/SnowLeopardOrLater.xcconfig" + +// Release settings +#include "../subconfig/Release.xcconfig" + +// Merge settings +#include "../subconfig/GTMMerge.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseTigerOrLater.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseTigerOrLater.xcconfig new file mode 100644 index 00000000..93019129 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseTigerOrLater.xcconfig @@ -0,0 +1,37 @@ +// +// ReleaseTigerOrLater.xcconfig +// +// Xcode configuration file for building a Release configuration of a project +// on Tiger or later. +// +// This is a _Configuration_ Xcode config file for use in the "Based on" popup +// of the project configuration editor. Do _not_ use this as the config base +// and individual Xcode target, there are other configuration files for that +// purpose. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Pull in the general settings +#include "../subconfig/General.xcconfig" + +// Tiger or later +#include "../subconfig/TigerOrLater.xcconfig" + +// Release settings +#include "../subconfig/Release.xcconfig" + +// Merge settings +#include "../subconfig/GTMMerge.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone.xcconfig new file mode 100644 index 00000000..49c11414 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone.xcconfig @@ -0,0 +1,26 @@ +// +// ReleaseiPhone.xcconfig +// +// Xcode configuration file for building a Release configuration of a project +// for iPhone. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +// +// This file is deprecated, please use the version specific one instead. +// + +#include "ReleaseiPhone20.xcconfig" + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone20.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone20.xcconfig new file mode 100644 index 00000000..8d31ead0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone20.xcconfig @@ -0,0 +1,37 @@ +// +// ReleaseiPhone20.xcconfig +// +// Xcode configuration file for building a Release configuration of a project +// for iPhone OS 2.0. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +// +// This is a _Configuration_ Xcode config file for use in the "Based on" popup +// of the project configuration editor. Do _not_ use this as the config base +// and individual Xcode target, there are other configuration files for that +// purpose. + +// Pull in the general settings +#include "../subconfig/General.xcconfig" + +// iPhone Settings. +#include "../subconfig/iPhone20.xcconfig" + +// Release settings +#include "../subconfig/Release.xcconfig" + +// Merge settings +#include "../subconfig/GTMMerge.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone21.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone21.xcconfig new file mode 100644 index 00000000..8a9a0c3e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Project/ReleaseiPhone21.xcconfig @@ -0,0 +1,37 @@ +// +// ReleaseiPhone21.xcconfig +// +// Xcode configuration file for building a Release configuration of a project +// for iPhone OS 2.1. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +// +// This is a _Configuration_ Xcode config file for use in the "Based on" popup +// of the project configuration editor. Do _not_ use this as the config base +// and individual Xcode target, there are other configuration files for that +// purpose. + +// Pull in the general settings +#include "../subconfig/General.xcconfig" + +// iPhone Settings. +#include "../subconfig/iPhone21.xcconfig" + +// Release settings +#include "../subconfig/Release.xcconfig" + +// Merge settings +#include "../subconfig/GTMMerge.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/DebugUnittest.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/DebugUnittest.xcconfig new file mode 100644 index 00000000..3f4d342f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/DebugUnittest.xcconfig @@ -0,0 +1,29 @@ +// +// DebugUnittest.xcconfig +// +// Xcode configuration file for a debug unittest target. +// +// This is a _Target_ config file, for use in the "Based on" popup of the +// settings dialog for a target. Do not attempt to apply this as the base +// of an Xcode configuration in the project settings dialog. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Unittests are loadable bundles +#include "../subconfig/Unittest.xcconfig" + +// See comments in ReleaseUnittest.xcconfig regarding BUNDLE_LOADER and +// how it should be set if you are running into link errors. \ No newline at end of file diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/LoadableBundle.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/LoadableBundle.xcconfig new file mode 100644 index 00000000..8b824d7c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/LoadableBundle.xcconfig @@ -0,0 +1,30 @@ +// +// LoadableBundle.xcconfig +// +// Xcode configuration file for a loadable bundle target. Usually a Cocoa +// plugin or similar. +// +// This is a _Target_ config file, for use in the "Based on" popup of the +// settings dialog for a target. Do not attempt to apply this as the base +// of an Xcode configuration in the project settings dialog. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Bundles should not have their external symbols stripped. +STRIP_STYLE = non-global + +// Bundles need to be position independent +GCC_DYNAMIC_NO_PIC = NO diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/LoadableBundleGCSupported.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/LoadableBundleGCSupported.xcconfig new file mode 100644 index 00000000..aa8d5a7f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/LoadableBundleGCSupported.xcconfig @@ -0,0 +1,30 @@ +// +// LoadableBundleGCSupported.xcconfig +// +// Xcode configuration file for a loadable bundle target that supports garbage +// collection. Usually a Cocoa plugin or similar. +// +// This is a _Target_ config file, for use in the "Based on" popup of the +// settings dialog for a target. Do not attempt to apply this as the base +// of an Xcode configuration in the project settings dialog. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Include the basic Loadable Bundle config +#include "LoadableBundle.xcconfig" + +// Include the GC flag(s) +#include "../subconfig/GCSupported.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/ReleaseUnittest.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/ReleaseUnittest.xcconfig new file mode 100644 index 00000000..f9a85d35 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/ReleaseUnittest.xcconfig @@ -0,0 +1,37 @@ +// +// ReleaseUnittest.xcconfig +// +// Xcode configuration file for a release unittest target. +// +// This is a _Target_ config file, for use in the "Based on" popup of the +// settings dialog for a target. Do not attempt to apply this as the base +// of an Xcode configuration in the project settings dialog. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Unittests are loadable bundles +#include "../subconfig/Unittest.xcconfig" + +// When running OCUnit tests in Release mode the unittests BUNDLE_LOADER +// is probably stripped (or at least it will be if they are using our +// config files). In that case the Unittest will fail to link because +// the symbols have been removed from the bundle's loader's symbol table. +// This flag tells the unittest to trust that the values will be available +// at runtime (or error out) and not to force an error at link time. +// Do NOT set BUNDLE_LOADER (Bundle Loader) setting in a release unittest target +// because you will run into interesting link issues +// "indirect symbol table entry n past the end of the symbol table" +OTHER_LDFLAGS = $(OTHER_LDFLAGS) -undefined dynamic_lookup diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/SharedLibrary.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/SharedLibrary.xcconfig new file mode 100644 index 00000000..7c37d50b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/SharedLibrary.xcconfig @@ -0,0 +1,29 @@ +// +// SharedLibrary.xcconfig +// +// Xcode configuration file for a shared library target. +// +// This is a _Target_ config file, for use in the "Based on" popup of the +// settings dialog for a target. Do not attempt to apply this as the base +// of an Xcode configuration in the project settings dialog. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Dynamic libs need to be position independent +GCC_DYNAMIC_NO_PIC = NO + +// Dynamic libs should not have their external symbols stripped. +STRIP_STYLE = non-global \ No newline at end of file diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/SharedLibraryGCSupported.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/SharedLibraryGCSupported.xcconfig new file mode 100644 index 00000000..74ab9076 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/SharedLibraryGCSupported.xcconfig @@ -0,0 +1,30 @@ +// +// SharedLibraryGCSupported.xcconfig +// +// Xcode configuration file for a shared library target that support garbage +// collection. +// +// This is a _Target_ config file, for use in the "Based on" popup of the +// settings dialog for a target. Do not attempt to apply this as the base +// of an Xcode configuration in the project settings dialog. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Include the basic Shared Library config +#include "SharedLibrary.xcconfig" + +// Include the GC flag(s) +#include "../subconfig/GCSupported.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/StaticLibrary.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/StaticLibrary.xcconfig new file mode 100644 index 00000000..df1016be --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/StaticLibrary.xcconfig @@ -0,0 +1,30 @@ +// +// StaticLibrary.xcconfig +// +// Xcode configuration file for a static library target. +// +// This is a _Target_ config file, for use in the "Based on" popup of the +// settings dialog for a target. Do not attempt to apply this as the base +// of an Xcode configuration in the project settings dialog. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Static libs can be included in bundles so make them position independent +GCC_DYNAMIC_NO_PIC = NO + +// Static libs should not have their internal globals or external symbols +// stripped. +STRIP_STYLE = debugging diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/StaticLibraryGCSupported.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/StaticLibraryGCSupported.xcconfig new file mode 100644 index 00000000..07ea1d51 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/Target/StaticLibraryGCSupported.xcconfig @@ -0,0 +1,30 @@ +// +// StaticLibraryGCSupported.xcconfig +// +// Xcode configuration file for a static library target that supports garbage +// collection. +// +// This is a _Target_ config file, for use in the "Based on" popup of the +// settings dialog for a target. Do not attempt to apply this as the base +// of an Xcode configuration in the project settings dialog. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Include the basic Static Library config +#include "StaticLibrary.xcconfig" + +// Include the GC flag(s) +#include "../subconfig/GCSupported.xcconfig" diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/CodeCoverage.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/CodeCoverage.xcconfig new file mode 100644 index 00000000..438d5c6a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/CodeCoverage.xcconfig @@ -0,0 +1,25 @@ +// +// CodeCoverage.xcconfig +// +// Xcode configuration file for building executables that need code coverage. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Static Code Coverage +#include "CodeCoverageStatic.xcconfig" + +// Need gcov library +OTHER_LDFLAGS = ${OTHER_LDFLAGS} -lgcov diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/CodeCoverageStatic.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/CodeCoverageStatic.xcconfig new file mode 100644 index 00000000..f6cca92e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/CodeCoverageStatic.xcconfig @@ -0,0 +1,24 @@ +// +// CodeCoverageStatic.xcconfig +// +// Xcode configuration file for building static libs that need code coverage. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + + +// For measuring code coverage +GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES +GCC_GENERATE_TEST_COVERAGE_FILES = YES diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Debug.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Debug.xcconfig new file mode 100644 index 00000000..7d54d612 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Debug.xcconfig @@ -0,0 +1,47 @@ +// +// Debug.xcconfig +// +// General Xcode configuration file for Debug targets. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// No optimization +GCC_OPTIMIZATION_LEVEL = 0 + +// Deployment postprocessing is what triggers Xcode to strip, turn it off +DEPLOYMENT_POSTPROCESSING = NO + +// Dead code stripping off +DEAD_CODE_STRIPPING = NO + +// Debug symbols should be on obviously +GCC_GENERATE_DEBUGGING_SYMBOLS = YES + +// Turn off warnings about uninitialized autos +// can only be done when GCC_OPTIMIZATION_LEVEL is actually optimizing +GCC_WARN_UNINITIALIZED_AUTOS = NO + +// Turns on special C++ STL checks to "encourage" good STL use +GTM_CONFIGURATION_GCC_PREPROCESSOR_DEFINITIONS = _GLIBCXX_DEBUG_PEDANTIC _GLIBCXX_DEBUG _GLIBCPP_CONCEPT_CHECKS DEBUG=1 + +// Turns on stack protection on debug builds for Leopard and above +GTM_CONFIGURATION_OTHER_CFLAGS = -fstack-protector -fstack-protector-all +// Stack protection doesn't exist on Tiger +GTM_CONFIGURATION_OTHER_CFLAGS[sdk=macosx10.4*] = + +// And is really broken on the iPhone Device. Works on simulator though. +// rdar://639430 Xcode generates bad Arm code if -fstack-protector -fstack-protector-all +GTM_CONFIGURATION_OTHER_CFLAGS[sdk=iphoneos*] = diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/GCSupported.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/GCSupported.xcconfig new file mode 100644 index 00000000..74bd027a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/GCSupported.xcconfig @@ -0,0 +1,23 @@ +// +// GCSupported.xcconfig +// +// Xcode configuration file for making a build Garbage Collection enabled. +// Use the *GCSupported specific configs in the Target folder. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// enable garbage collection (but don't require it) +GCC_ENABLE_OBJC_GC = supported diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/GTMMerge.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/GTMMerge.xcconfig new file mode 100644 index 00000000..5ab141e5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/GTMMerge.xcconfig @@ -0,0 +1,42 @@ +// +// GTMMerge.xcconfig +// +// Xcode configuration file that merges other xcconfig settings. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Xcode doesn't allow you to "inherit" settings with includes so you always +// end up overriding settings accidentally. To avoid this, we instead +// allow you to define settings at different levels +// (GENERAL, PLATFORM (iPhone/Mac), CONFIGURATION (Release/Debug) and we merge +// those together here. +// We DO NOT inherit OTHER_CPLUSPLUSFLAGS because OTHER_CPLUSPLUSFLAGS by default +// takes on OTHER_CFLAGS settings, and we don't want those applied to our +// C++ files. OTHER_CFLAGS is the only way to set C specific settings on our +// C files that we don't want to have applied to our C++ files such as +// -Wold-style-definition +// If you would like to add your own custom settings to the base GTM ones +// please use the GTM_HOST_* settings. These are left empty by GTM and are +// for the host app to fill in. For example if you wanted to have stack +// protection turned on for both debug and release builds you could set +// GTM_HOST_OTHER_CFLAGS = -fstack-protector -fstack-protector-all +// in your own settings files, and then include the QSB ones. + +WARNING_CFLAGS = $(inherited) $(GTM_GENERAL_WARNING_CFLAGS) $(GTM_PLATFORM_WARNING_CFLAGS) $(GTM_CONFIGURATION_WARNING_CFLAGS) $(GTM_HOST_WARNING_CFLAGS) +OTHER_CFLAGS = $(inherited) $(GTM_GENERAL_OTHER_CFLAGS) $(GTM_PLATFORM_OTHER_CFLAGS) $(GTM_CONFIGURATION_OTHER_CFLAGS) $(GTM_HOST_OTHER_CFLAGS) +OTHER_CPLUSPLUSFLAGS = $(GTM_GENERAL_OTHER_CPLUSPLUSFLAGS) $(GTM_PLATFORM_OTHER_CPLUSPLUSFLAGS) $(GTM_CONFIGURATION_OTHER_CPLUSPLUSFLAGS) $(GTM_HOST_OTHER_CPLUSPLUSFLAGS) +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(GTM_GENERAL_GCC_PREPROCESSOR_DEFINITIONS) $(GTM_PLATFORM_GCC_PREPROCESSOR_DEFINITIONS) $(GTM_CONFIGURATION_GCC_PREPROCESSOR_DEFINITIONS) $(GTM_HOST_GCC_PREPROCESSOR_DEFINITIONS) +OTHER_LDFLAGS = $(inherited) $(GTM_GENERAL_OTHER_LDFLAGS) $(GTM_PLATFORM_OTHER_LDFLAGS) $(GTM_CONFIGURATION_OTHER_LDFLAGS) $(GTM_HOST_OTHER_LDFLAGS) diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/General.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/General.xcconfig new file mode 100644 index 00000000..dc3e64f5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/General.xcconfig @@ -0,0 +1,172 @@ +// +// General.xcconfig +// +// Xcode configuration file for general build settings applicable to all +// projects and targets. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// NOTE: as of Xcode 3.1, for iPhone development, the two SDKs you can match are: +// SDK_NAME iphoneos2.0 +// SDK_NAME iphoneos2.1 +// SDK_NAME iphonesimulator2.0 +// SDK_NAME iphonesimulator2.1 +// for Mac OS developement, the values are: +// SDK_NAME macosx10.4 +// SDK_NAME macosx10.5 +// SDK_NAME macosx10.6 + +// Build for PPC and Intel (Leopard/SnowLeopard gets 64 bit also) +// Note that you can't build 10.5 with using SenTestingKit on ppc64 with +// SnowLeopard XCode because it doesn't ship with a ppc64 version of +// SenTestingKit. For this reason we are NOT building/testing GTM +// with ppc64 at this time. We override the 10.5 setting in the project +// file to turn it off. +ARCHS[sdk=macosx10.4*] = i386 ppc +ARCHS[sdk=macosx10.5*] = i386 x86_64 ppc ppc64 +ARCHS[sdk=macosx10.6*] = i386 x86_64 ppc + +// Build for arm for iPhone or Intel for the iPhone Simulator +ARCHS[sdk=iphoneos*] = armv6 +ARCHS[sdk=iphonesimulator*] = i386 + +// Build only the active architecture on iphone device targets +ONLY_ACTIVE_ARCH[sdk=iphoneos*] = YES + +// iPhone currently deploys on 10.5 only +MACOSX_DEPLOYMENT_TARGET[sdk=iphone*] = 10.5 + +// We want our pngs compressed when they are copied +COMPRESS_PNG_FILES = YES + +// Zerolink prevents link warnings so turn it off +ZERO_LINK = NO + +// Prebinding considered unhelpful in 10.3 and later +PREBINDING = NO + +// Work around Xcode bugs by using external strip. See: +// http://lists.apple.com/archives/Xcode-users/2006/Feb/msg00050.html +SEPARATE_STRIP = YES + +// Force C99 dialect +GCC_C_LANGUAGE_STANDARD = c99 + +// Obj-C exceptions are needed for @synchronized(self) +GCC_ENABLE_OBJC_EXCEPTIONS = YES + +// not sure why apple defaults this on, but it's pretty risky +ALWAYS_SEARCH_USER_PATHS = NO + +// Turn on position dependent code for most cases (overridden where appropriate) +GCC_DYNAMIC_NO_PIC = YES + +// For ObjC++ we want C++ cdtors called +GCC_OBJC_CALL_CXX_CDTORS = YES + +// Use Obj-C fast dispatch +GCC_FAST_OBJC_DISPATCH = YES + +// Warn on implicit data conversions in 64bit builds +GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64*] = YES + +// Strictest warning policy that we can do +// Options intentionally turned off +// http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html +// -Wsystem-headers - since we can't fix them we are going to assume they're ok +// -Wtraditional - we are compiling with c99, so we don't care about trad +// -Wdeclaration-after-statement - we are compiling with c99 which allows this +// -Wpadded - lots of structures will get padded, so although this warning may +// be useful to show us badly padded structures, it causes to many +// warnings to be on generally. +// -Wunreachable-code - several macros use the do {} while (0) which always +// flags this. e.g. all the ST... macros for unittesting +// -Wredundant-decls - we sometimes use redundant decls to add an attribute +// to a function/method (i.e. +// -Waggregate-return - NSPoint, NSRect etc are often returned as aggregates +// -Wshorten-64-to-32 - this is defined in the 64 bit build settings +// -Wcast-qual - Would love to turn this on, but causes issues when converting +// CFTypes to NSTypes and also has issues with some external +// libraries (notably zlib) +// -Wundef - we conditionalize on TARGET_OS_IPHONE which is only defined +// in the iPhoneSDK making us unable to turn this warning on. +// -Wstrict-prototypes - breaks the GTM_METHOD_CHECK macro +// -Wcast-align - causes a whole pile of problems buildng with iPhoneSDK + +// Objective C warnings +// http://gcc.gnu.org/onlinedocs/gcc/Objective_002dC-and-Objective_002dC_002b_002b-Dialect-Options.html +// -Wassign-intercept - this really is more informational than a warning. +// -Wselector - the system headers define lots of methods with the same selector +// rendering this mostly useless to us +// -Wstrict-selector-match - the system headers define lots of methods with the +// same selector rendering this mostly useless to us +// Not being used currently because of Radar 5978978 +// GTM_GENERAL_WARNING_OBJC_ONLY_FLAGS=-Wundeclared-selector + +// C Only Warnings +GTM_GENERAL_OTHER_CFLAGS = -Wdiv-by-zero -Wbad-function-cast -Wnested-externs -Wold-style-definition + +// C++ Only Warnings +GTM_GENERAL_OTHER_CPLUSPLUSFLAGS = -Wabi -Wctor-dtor-privacy -Wstrict-null-sentinel -Wsign-promo +GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES +GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES +GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES +GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES + +// General C/C++/ObjC/ObjC++ warnings +// These are generally ordered in easiest to hardest to support. +// If you are transitioning, you can turn on the levels one level at a time +// in your project file by editing GTM_GENERAL_WARNING_CFLAGS and only +// including the warning levels that you currently are compiling against. +// GTM should always compile with full warnings. +GTM_GENERAL_WARNING_CFLAGS1 = -Wall -Wendif-labels -Winvalid-pch -Wformat=2 -Wmissing-format-attribute -Wwrite-strings -Wstack-protector -Wstrict-aliasing=2 +GTM_GENERAL_WARNING_CFLAGS2 = -Wpacked -Wmissing-field-initializers +GTM_EXTRA_WARNING_OVERRIDE_CFLAGS = -Wno-unused-parameter -Wno-sign-compare +GTM_GENERAL_WARNING_CFLAGS3 = -Wextra $(GTM_EXTRA_WARNING_OVERRIDE_CFLAGS) -Wpointer-arith -Wdisabled-optimization -Wfloat-equal +GTM_GENERAL_WARNING_CFLAGS = $(GTM_GENERAL_WARNING_CFLAGS1) $(GTM_GENERAL_WARNING_CFLAGS2) $(GTM_GENERAL_WARNING_CFLAGS3) + +// GCC_WARN_UNINITIALIZED_AUTOS is defined in the release/debug xcconfigs. +GCC_WARN_CHECK_SWITCH_STATEMENTS = YES +GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES +GCC_WARN_ABOUT_MISSING_NEWLINE = YES +GCC_TREAT_WARNINGS_AS_ERRORS = YES +GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES +GCC_WARN_ABOUT_RETURN_TYPE = YES +GCC_WARN_MISSING_PARENTHESES = YES +GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES +GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES +GCC_WARN_UNKNOWN_PRAGMAS = YES +GCC_WARN_UNUSED_LABEL = YES +GCC_WARN_UNUSED_FUNCTION = YES +GCC_WARN_UNUSED_VALUE = YES +GCC_WARN_UNUSED_VARIABLE = YES +GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES +// We don't turn on shadow and sign comparisons because too many 3rd party +// libaries don't compile with them turned on (sign compare rarely catches +// errors, but shadow is very useful). +// NOTE: sign compare is also controlled by -Wextra, we we override it above. +// GCC_WARN_SHADOW = YES +// GCC_WARN_SIGN_COMPARE = YES + +GCC_WARN_PEDANTIC = NO +GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO +GCC_WARN_PROTOTYPE_CONVERSION = NO +GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = NO +GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = NO +GCC_WARN_UNUSED_PARAMETER = NO +// Use of Gestalt requires 4 char constants (amongst other things) +GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/LeopardOrLater.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/LeopardOrLater.xcconfig new file mode 100644 index 00000000..c0f75bc8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/LeopardOrLater.xcconfig @@ -0,0 +1,25 @@ +// +// LeopardOrLater.xcconfig +// +// Xcode configuration file for projects targeting 10.5 Leopard or later. These +// settings produce a Universal binary compatible with 10.5 for PPC and Intel. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Default SDK and minimum OS version is 10.5 +SDKROOT = ${DEVELOPER_SDK_DIR}/MacOSX10.5.sdk +MACOSX_DEPLOYMENT_TARGET = 10.5 +GCC_VERSION = 4.0 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Release.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Release.xcconfig new file mode 100644 index 00000000..4c5ad8ac --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Release.xcconfig @@ -0,0 +1,45 @@ +// +// Release.xcconfig +// +// General Xcode configuration file for Release targets. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Optimize for space and size (Apple recommendation) +GCC_OPTIMIZATION_LEVEL = s + +// Deploment postprocessing is what triggers Xcode to strip +DEPLOYMENT_POSTPROCESSING = YES + +// No symbols +GCC_GENERATE_DEBUGGING_SYMBOLS = NO + +// Dead code strip does not affect ObjC code but can help for C +DEAD_CODE_STRIPPING = YES + +// ASSERT going away in release tends to create unused vars. +// init-self can only be turned on when optimizations are on +GTM_CONFIGURATION_WARNING_CFLAGS = -Wno-unused-variable -Winit-self -Wno-extra + +// NDEBUG is used by things like assert.h, so define it for general compat. +GTM_CONFIGURATION_GCC_PREPROCESSOR_DEFINITIONS = NDEBUG=1 + +// Give us warnings about uninitialized autos +// can only be done when GCC_OPTIMIZATION_LEVEL is actually optimizing +GCC_WARN_UNINITIALIZED_AUTOS = YES + +// When we strip we want to strip all symbols in release, but save externals. +STRIP_STYLE = all diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/SnowLeopardOrLater.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/SnowLeopardOrLater.xcconfig new file mode 100644 index 00000000..0a7475e9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/SnowLeopardOrLater.xcconfig @@ -0,0 +1,26 @@ +// +// SnowLeopardOrLater.xcconfig +// +// Xcode configuration file for projects targeting 10.6 SnowLeopard or later. +// These settings produce a Universal binary compatible with 10.6 for +// PPC and Intel. +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Default SDK and minimum OS version is 10.6 +SDKROOT = ${DEVELOPER_SDK_DIR}/MacOSX10.6.sdk +MACOSX_DEPLOYMENT_TARGET = 10.6 +GCC_VERSION = 4.0 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/TigerOrLater.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/TigerOrLater.xcconfig new file mode 100644 index 00000000..bc0f8f45 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/TigerOrLater.xcconfig @@ -0,0 +1,25 @@ +// +// TigerOrLater.xcconfig +// +// Xcode configuration file for projects targeting 10.4 Tiger or later. These +// settings produce a Universal binary compatible with 10.4 for PPC and Intel. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Default SDK and minimum OS version is 10.4 +SDKROOT = $(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk +MACOSX_DEPLOYMENT_TARGET = 10.4 +GCC_VERSION = 4.0 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Unittest.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Unittest.xcconfig new file mode 100644 index 00000000..96121eee --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/Unittest.xcconfig @@ -0,0 +1,33 @@ +// +// Unittest.xcconfig +// +// Xcode configuration file for a basic unittest targets. Use the debug or +// release build specific configs in the Target folder. +// +// Copyright 2006-2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Unittests are loadable bundles +#include "../Target/LoadableBundle.xcconfig" + +// Force C99 dialect with GNU extensions (needed for OCUnit) +GCC_C_LANGUAGE_STANDARD = gnu99 + +// Deploment postprocessing is what triggers Xcode to strip, we don't strip +// unittests +DEPLOYMENT_POSTPROCESSING = NO + +// Most common unittests will be objective-c +WRAPPER_EXTENSION = octest diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/iPhone20.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/iPhone20.xcconfig new file mode 100644 index 00000000..0f92c95b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/iPhone20.xcconfig @@ -0,0 +1,24 @@ +// +// iPhone20.xcconfig +// +// Xcode configuration file for building a Debug target on iPhone OS 2.0 +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +// Set default SDK. +SDKROOT = iphoneos2.0 + +// iPhone currently deploys on 10.5 only +MACOSX_DEPLOYMENT_TARGET = 10.5 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/iPhone21.xcconfig b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/iPhone21.xcconfig new file mode 100644 index 00000000..61c59edb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/subconfig/iPhone21.xcconfig @@ -0,0 +1,24 @@ +// +// iPhone21.xcconfig +// +// Xcode configuration file for building a Debug target on iPhone OS 2.1 +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +// Set default SDK. +SDKROOT = iphoneos2.1 + +// iPhone currently deploys on 10.5 only +MACOSX_DEPLOYMENT_TARGET = 10.5 diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/xcconfigs-readme.txt b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/xcconfigs-readme.txt new file mode 100644 index 00000000..87a6dd7b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/XcodeConfig/xcconfigs-readme.txt @@ -0,0 +1,53 @@ +Xcode Configs are sort of a black art, any time you have a set of rules, you +quickly hit a few exceptions. + +The main goal of using these is as follow: + +Edit your Project level build settings by removing as much as possible, and +then set the per Configuration settings to one of the project xcode config +files w/in the Project subfolder here. This will batch setup the project to +build Debug/Release with a specific SDK. + +If you are building a Shared Library, Loadable Bundle (Framework) or UnitTest +you will need to apply a further Xcode Config file at the target level. You do +this again by clearing most of the settings on the target, and just setting the +build config for that target to be the match from the Target subfolder here. + +To see an example of this, look at CoverStory +(http://code.google.com/p/coverstory) or Vidnik +(http://code.google.com/p/vidnik). + + +The common exception...If you need to have a few targets build w/ different +SDKs, then you hit the most common of the exceptions. For these, you'd need +the top level config not to set some things, the simplest way to do this seems +to be to remove as many of the settings from the project file, and make new +wrapper xcconfig files that inclue both the project level and target level +setting and set them on the targets (yes, this is like the MetroWerks days +where you can quickly explode in a what seems like N^2 (or worse) number of +config files. With a little luck, future versions of Xcode might have some +support to make mixing SDKs easier. + +Remember: When using the configs at any given layer, make sure you set them for +each build configuration you need (not just the active one). + +Many of the build settings are more than just yes/no flags and take +a list of values that you may want to change at different levels. +Xcode doesn't allow you to "inherit" settings with includes so you always +end up overriding settings accidentally. To avoid this, we instead +allow you to define settings at different levels +(GENERAL, PLATFORM (iPhone/Mac), CONFIGURATION (Release/Debug). +We do this by setting a GTM version of the setting (so for OTHER_CFLAGS it's +GTM_XXX_OTHER_CFLAGS where xxx is GENERAL, PLATFORM or CONFIGURATION depending +at what level the flag is set. These are all merged together in the +GTMMerge.xcconfig. Do not modify the base setting (OTHER_CFLAGS) instead modify +the GTM one at the level you want it modified. + +The major place this may affect you is that we have really tightened down on +the warnings. To make it easier for you to move your code onto the new +xcconfig files, we have split the warnings up into three categories, which in +general you can think of as easy, moderate and extreme. If you run into a lot +of warnings when you compile, look at changing the GTM_GENERAL_WARNING_CFLAGS +setting to only include lower levels (eg GTM_GENERAL_WARNING_CFLAGS1) and see +if that makes it easier on you. Look inside General.xcconfig and search for +GTM_GENERAL_WARNING_CFLAGS1 for more info. diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.h b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.h new file mode 100644 index 00000000..828f05aa --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.h @@ -0,0 +1,328 @@ +// +// GTMABAddressBook.h +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// These classes wrap up the iPhone AddressBook 'C' API in a manner very +// similar to that found on Mac OS X. They differ only in that none of these +// routines throws, and some of the types are different as necessitated by +// the APIs that they wrap. These wrappers also protect you from a number +// of issues in the AddressBook API (as of iPhone SDK 2.0/2.1) +// +// Note that there is a strings file that you may want to localize +// (GTMABAddressBook.strings). +// +// If things seem strange, it may be due to one of the following radars: +// 6240394 AddressBook framework constants not initialized until +// ABCreateAddressBook called +// -- CLOSED as designed +// 6208390 Integer and real values don't work in ABMultiValueRefs +// (and this isn't part of the title, but dictionaries don't work +// either) +// 6207605 RecordIDs for people and groups are not unique in AddressBook +// -- CLOSED as designed +// 6204021 kABGroupNameProperty and kABPersonFirstNameProperty have the same +// value +// 6203982 ABPersonCopyLocalizedPropertyName returns name for +// kABGroupNameProperty +// 6203961 ABPersonGetTypeOfProperty returns a type for kABGroupNameProperty +// 6203854 ABMultiValues hash to their address +// 6203836 ABRecords hash to their address +// -- CLOSED behaves correctly +// 6203606 Need CFTypeIDs for AddressBook CFTypes +// 6202868 ABPersonSetImageData should validate image data +// 6202860 Passing nil person into ABGroupAddMember crashes +// -- CLOSED behaves correctly +// 6202827 Passing nil info ABMultiValueAddValueAndLabel causes crash +// -- CLOSED behaves correctly +// 6202807 ABMultiValueInsertValueAndLabelAtIndex allows you to insert values +// past end +// 6201276 Removing a NULL record using ABAddressBookRemoveRecord crashes +// -- CLOSED behaves correctly +// 6201258 Adding a NULL record using ABAddressBookAddRecord crashes +// -- CLOSED behaves correctly +// 6201046 ABRecordSetValue returns true even if you pass in a bad type for a +// value +// 6201005 ABRecordRemoveValue returns true for value that aren't in the record +// -- CLOSED behaves correctly +// 6200703 ABAddressBookAddRecord doesn't add an item to the people array until +// it's saved +// 6200638 ABAddressBookHasUnsavedChanges doesn't work + +#import +#import +#import "GTMDefines.h" + +#if !GTM_IPHONE_SDK +#error This file is for iPhone use only use ABAddressBook on Mac OS X +#endif + +@class GTMABPerson; +@class GTMABGroup; +@class GTMABRecord; + +GTM_EXTERN NSString *const kGTMABUnknownPropertyName; + +// Wrapper for an AddressBook on iPhone +@interface GTMABAddressBook : NSObject { + @private + ABAddressBookRef addressBook_; +} + +// Returns a new instance of an address book. ++ (GTMABAddressBook *)addressBook; + +// Return the address book reference +- (ABAddressBookRef)addressBookRef; + +// Saves changes made since the last save +// Return YES if successful (or there was no change) +- (BOOL)save; + +// Saves changes made since the last save +// Return YES if successful (or there was no change) +- (BOOL)saveAndReturnError:(NSError **)error; + +// Returns YES if there are unsaved changes +// The unsaved changes flag is automatically set when changes are made +// As of iPhone 2.1, this does not work, and will always return NO. +// Radar 6200638: ABAddressBookHasUnsavedChanges doesn't work +- (BOOL)hasUnsavedChanges; + +// Reverts any changes that have been made and resets the unsaved flag +// Be sure to read notes for -hasUnsavedChanges and -people and -groups. +- (void)revert; + +// Returns a GTMABPerson matching an ID +// Returns nil if the record could not be found +- (GTMABPerson *)personForId:(ABRecordID)uniqueId; + +// Returns a GTMABGroup matching an ID +// Returns nil if the record could not be found +- (GTMABGroup *)groupForId:(ABRecordID)uniqueId; + +// Adds a record (ABPerson or ABGroup) to the AddressBook database +// Be sure to read notes for -people and -group. +- (BOOL)addRecord:(GTMABRecord *)record; + +// Removes a record (ABPerson or ABGroup) from the AddressBook database +- (BOOL)removeRecord:(GTMABRecord *)record; + +// Returns an array (GTMABPerson) of all the people in the AddressBook database +// As of iPhone 2.1, this array will not contain new entries until you save +// the address book. +// Radar 6200703: ABAddressBookAddRecord doesn't add an item to the people array +// until it's saved +- (NSArray *)people; + +// Returns an array of all the groups (GTMABGroup) in the AddressBook database +// As of iPhone 2.1, this array will not contain new entries until you save +// the address book. +// Radar 6200703: ABAddressBookAddRecord doesn't add an item to the people array +// until it's saved +- (NSArray *)groups; + +// Returns a localized name for a given label ++ (NSString *)localizedLabel:(CFStringRef)label; + +@end + +// Wrapper for a ABRecord on iPhone. +// A abstract class. Instantiate one of the concrete subclasses, GTMABPerson or +// GTMABGroup. +@interface GTMABRecord : NSObject { + @private + ABRecordRef record_; +} + +// Create a record with a recordRef. +// Since GTMABRecord is an abstract base class, attempting to create one +// of these directly will throw an exception. Use with one of the concrete +// subclasses. ++ (id)recordWithRecord:(ABRecordRef)record; + +// Designated initializer +// Since GTMABRecord is an abstract base class, attempting to create one +// of these directly will throw an exception. Use with one of the concrete +// subclasses. +- (id)initWithRecord:(ABRecordRef)record; + +// Return our recordRef +- (ABRecordRef)recordRef; + +// Return the recordID for the record +- (ABRecordID)recordID; + +// Returns the value of a given property. +// The type of the value depends on the property type. +- (id)valueForProperty:(ABPropertyID)property; + +// Set the value of a given property. +// The type of the value must match the property type. +// Returns YES if value set properly +- (BOOL)setValue:(id)value forProperty:(ABPropertyID)property; + +// Removes the value for the property +// Returns yes if value removed +- (BOOL)removeValueForProperty:(ABPropertyID)property; + +// returns a human friendly name for the record +- (NSString *)compositeName; + +// returns the type of a property ++ (ABPropertyType)typeOfProperty:(ABPropertyID)property; + +// returns a human friendly localized name for a property ++ (NSString *)localizedPropertyName:(ABPropertyID)property; +@end + +// Wrapper for an ABPerson on iPhone +@interface GTMABPerson : GTMABRecord + +// Creates a person with a first name and a last name. ++ (GTMABPerson *)personWithFirstName:(NSString *)first + lastName:(NSString *)last; + +// Sets image data for a person. Data must be to a block of data that +// will create a valid UIImage. +- (BOOL)setImageData:(NSData *)data; + +// Returns the image data. +- (NSData *)imageData; + +// Returns the image for a person +- (UIImage *)image; + +// Sets a the image for a person +- (BOOL)setImage:(UIImage *)image; + +// Returns the format in with names are composited ++ (ABPersonCompositeNameFormat)compositeNameFormat; +@end + +// Wrapper for a ABGroup on iPhone +@interface GTMABGroup : GTMABRecord +// Create a new group named |name| ++ (GTMABGroup *)groupNamed:(NSString *)name; + +// Return an array of members (GTMABPerson) +- (NSArray *)members; + +// Add a member to a group +- (BOOL)addMember:(GTMABPerson *)person; + +// Remove a member from a group +- (BOOL)removeMember:(GTMABPerson *)person; +@end + +// GTMABMultiValue does not supprt NSFastEnumeration because in +// the Apple frameworks it returns identifiers which are already NSStrings. +// In our case identifiers aren't NS types, and it doesn't make sense +// to convert them to NSNumbers just to convert them back so you can +// actually get at the values and labels. +// Instead we supply valueEnumerator and labelEnumerator which you can +// fast enumerate on to get values and labels directly. +@interface GTMABMultiValue : NSObject { + @protected + ABMultiValueRef multiValue_; +} + +// Create a multi value +- (id)initWithMultiValue:(ABMultiValueRef)multiValue; + +// return it's ref +- (ABMultiValueRef)multiValueRef; + +// Returns the number of value/label pairs +- (NSUInteger)count; + +// Returns a value at a given index +// Returns nil if index is out of bounds +- (id)valueAtIndex:(NSUInteger)idx; + +// Returns a label at a given index +// Returns nil if index is out of bounds +- (NSString *)labelAtIndex:(NSUInteger)idx; + +// Returns an identifier at a given index +// Returns kABMultiValueInvalidIdentifier if index is out of bounds +- (ABMultiValueIdentifier)identifierAtIndex:(NSUInteger)idx; + +// Returns the index of a given identifier +// Returns NSNotFound if not found +- (NSUInteger)indexForIdentifier:(ABMultiValueIdentifier)identifier; + +// Type of the contents of this multivalue +- (ABPropertyType)propertyType; + +// Returns the value for a given identifier +// Returns nil if the identifier is not found +- (id)valueForIdentifier:(ABMultiValueIdentifier)identifier; + +// Returns the value for a given identifier +// Returns nil if the identifier is not found +- (NSString *)labelForIdentifier:(ABMultiValueIdentifier)identifier; + +// Returns an enumerator for enumerating through values +- (NSEnumerator *)valueEnumerator; + +// Returns an enumerator for enumerating through labels +- (NSEnumerator *)labelEnumerator; + +@end + +@interface GTMABMutableMultiValue : GTMABMultiValue { + @private + // Use unsigned long here instead of NSUInteger because that's what + // NSFastEnumeration Protocol wants currently (iPhone 2.1) + unsigned long mutations_; +} + +// Create a new mutable multivalue with a given type ++ (id)valueWithPropertyType:(ABPropertyType)type; + +// Create a new mutable multivalue with a given type +- (id)initWithPropertyType:(ABPropertyType)type; + +// Create a new mutable multivalue based on |multiValue| +- (id)initWithMutableMultiValue:(ABMutableMultiValueRef)multiValue; + +// Adds a value with its label +// Returns the identifier if successful, kABMultiValueInvalidIdentifier +// otherwise. +- (ABMultiValueIdentifier)addValue:(id)value withLabel:(CFStringRef)label; + +// Insert a value/label pair at a given index +// Returns the identifier if successful. kABMultiValueInvalidIdentifier +// otherwise +// If index is out of bounds, returns kABMultiValueInvalidIdentifier. +- (ABMultiValueIdentifier)insertValue:(id)value + withLabel:(CFStringRef)label + atIndex:(NSUInteger)index; + +// Removes a value/label pair at a given index +// Returns NO if index out of bounds +- (BOOL)removeValueAndLabelAtIndex:(NSUInteger)index; + +// Replaces a value at a given index +// Returns NO if index out of bounds +- (BOOL)replaceValueAtIndex:(NSUInteger)index withValue:(id)value; + +// Replaces a label at a given index +// Returns NO if index out of bounds +- (BOOL)replaceLabelAtIndex:(NSUInteger)index withLabel:(CFStringRef)label; + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.m new file mode 100644 index 00000000..05dc27f5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.m @@ -0,0 +1,903 @@ +// +// GTMAddressBook.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMABAddressBook.h" +#import "GTMGarbageCollection.h" + +NSString *const kGTMABUnknownPropertyName = @"UNKNOWN_PROPERTY"; + +typedef struct { + ABPropertyType pType; + Class class; +} TypeClassNameMap; + +@interface GTMABMultiValue () +- (unsigned long*)mutations; +@end + +@interface GTMABMutableMultiValue () +// Checks to see if a value is a valid type to be stored in this multivalue +- (BOOL)checkValueType:(id)value; +@end + +@interface GTMABMultiValueEnumerator : NSEnumerator { + @private + __weak ABMultiValueRef ref_; // ref_ cached from enumeree_ + GTMABMultiValue *enumeree_; + unsigned long mutations_; + NSUInteger count_; + NSUInteger index_; + BOOL useLabels_; +} ++ (id)valueEnumeratorFor:(GTMABMultiValue*)enumeree; ++ (id)labelEnumeratorFor:(GTMABMultiValue*)enumeree; +- (id)initWithEnumeree:(GTMABMultiValue*)enumeree useLabels:(BOOL)useLabels; +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state + objects:(id *)stackbuf + count:(NSUInteger)len; +@end + +@implementation GTMABAddressBook ++ (GTMABAddressBook *)addressBook { + return [[[self alloc] init] autorelease]; +} + +- (id)init { + if ((self = [super init])) { + addressBook_ = ABAddressBookCreate(); + if (!addressBook_) { + // COV_NF_START + [self release]; + self = nil; + // COV_NF_END + } + } + return self; +} + +- (void)dealloc { + if (addressBook_) { + CFRelease(addressBook_); + } + [super dealloc]; +} + +- (BOOL)save { + return [self saveAndReturnError:NULL]; +} + +- (BOOL)saveAndReturnError:(NSError **)error { + CFErrorRef cfError = NULL; + bool wasGood = ABAddressBookSave(addressBook_, &cfError); + GTMCFAutorelease(cfError); + if (error) { + *error = (NSError *)cfError; // COV_NF_LINE + } + return wasGood ? YES : NO; +} + +- (BOOL)hasUnsavedChanges { + return ABAddressBookHasUnsavedChanges(addressBook_); +} + +- (void)revert { + ABAddressBookRevert(addressBook_); +} + +- (BOOL)addRecord:(GTMABRecord *)record { + // Note: we check for bad data here because of radar + // 6201258 Adding a NULL record using ABAddressBookAddRecord crashes + if (!record) return NO; + CFErrorRef cfError = NULL; + bool wasGood = ABAddressBookAddRecord(addressBook_, + [record recordRef], &cfError); + if (cfError) { + // COV_NF_START + _GTMDevLog(@"Error in [%@ %@]: %@", + [self class], NSStringFromSelector(_cmd), cfError); + CFRelease(cfError); + // COV_NF_END + } + return wasGood ? YES : NO; +} + +- (BOOL)removeRecord:(GTMABRecord *)record { + // Note: we check for bad data here because of radar + // 6201276 Removing a NULL record using ABAddressBookRemoveRecord crashes + if (!record) return NO; + CFErrorRef cfError = NULL; + bool wasGood = ABAddressBookRemoveRecord(addressBook_, + [record recordRef], &cfError); + if (cfError) { + // COV_NF_START + _GTMDevLog(@"Error in [%@ %@]: %@", + [self class], NSStringFromSelector(_cmd), cfError); + CFRelease(cfError); + // COV_NF_END + } + return wasGood ? YES : NO; +} + +- (NSArray *)people { + NSArray *people + = GTMCFAutorelease(ABAddressBookCopyArrayOfAllPeople(addressBook_)); + NSMutableArray *result = [NSMutableArray arrayWithCapacity:[people count]]; + for (id person in people) { + [result addObject:[GTMABPerson recordWithRecord:person]]; + } + return result; +} + +- (NSArray *)groups { + NSArray *groups + = GTMCFAutorelease(ABAddressBookCopyArrayOfAllGroups(addressBook_)); + NSMutableArray *result = [NSMutableArray arrayWithCapacity:[groups count]]; + for (id group in groups) { + [result addObject:[GTMABGroup recordWithRecord:group]]; + } + return result; +} + +- (ABAddressBookRef)addressBookRef { + return addressBook_; +} + +- (GTMABPerson *)personForId:(ABRecordID)uniqueId { + GTMABPerson *person = nil; + ABRecordRef ref = ABAddressBookGetPersonWithRecordID(addressBook_, uniqueId); + if (ref) { + person = [GTMABPerson recordWithRecord:ref]; + } + return person; +} + +- (GTMABGroup *)groupForId:(ABRecordID)uniqueId { + GTMABGroup *group = nil; + ABRecordRef ref = ABAddressBookGetGroupWithRecordID(addressBook_, uniqueId); + if (ref) { + group = [GTMABGroup recordWithRecord:ref]; + } + return group; +} + ++ (NSString *)localizedLabel:(CFStringRef)label { + return GTMCFAutorelease(ABAddressBookCopyLocalizedLabel(label)); +} + +@end + +@implementation GTMABRecord ++ (id)recordWithRecord:(ABRecordRef)record { + return [[[self alloc] initWithRecord:record] autorelease]; +} + +- (id)initWithRecord:(ABRecordRef)record { + if ((self = [super init])) { + if ([self class] == [GTMABRecord class]) { + [self autorelease]; + [self doesNotRecognizeSelector:_cmd]; + } + if (!record) { + [self release]; + self = nil; + } else { + record_ = CFRetain(record); + } + } + return self; +} + +- (NSUInteger)hash { + // This really isn't completely valid due to + // 6203836 ABRecords hash to their address + // but it's the best we can do without knowing what properties + // are in a record, and we don't have an API for that. + return CFHash(record_); +} + +- (BOOL)isEqual:(id)object { + // This really isn't completely valid due to + // 6203836 ABRecords hash to their address + // but it's the best we can do without knowing what properties + // are in a record, and we don't have an API for that. + return [object respondsToSelector:@selector(recordRef)] + && CFEqual(record_, [object recordRef]); +} + +- (void)dealloc { + if (record_) { + CFRelease(record_); + } + [super dealloc]; +} + +- (ABRecordRef)recordRef { + return record_; +} + +- (ABRecordID)recordID { + return ABRecordGetRecordID(record_); +} + +- (id)valueForProperty:(ABPropertyID)property { + id value = GTMCFAutorelease(ABRecordCopyValue(record_, property)); + if (value) { + if ([[self class] typeOfProperty:property] & kABMultiValueMask) { + value = [[[GTMABMultiValue alloc] initWithMultiValue:value] autorelease]; + } + } + return value; +} + +- (BOOL)setValue:(id)value forProperty:(ABPropertyID)property { + if (!value) return NO; + // We check the type here because of + // Radar 6201046 ABRecordSetValue returns true even if you pass in a bad type + // for a value + TypeClassNameMap fullTypeMap[] = { + { kABStringPropertyType, [NSString class] }, + { kABIntegerPropertyType, [NSNumber class] }, + { kABRealPropertyType, [NSNumber class] }, + { kABDateTimePropertyType, [NSDate class] }, + { kABDictionaryPropertyType, [NSDictionary class] }, + { kABMultiStringPropertyType, [GTMABMultiValue class] }, + { kABMultiRealPropertyType, [GTMABMultiValue class] }, + { kABMultiDateTimePropertyType, [GTMABMultiValue class] }, + { kABMultiDictionaryPropertyType, [GTMABMultiValue class] } + }; + ABPropertyType type = [[self class] typeOfProperty:property]; + BOOL wasFound = NO; + for (size_t i = 0; i < sizeof(fullTypeMap) / sizeof(TypeClassNameMap); ++i) { + if (fullTypeMap[i].pType == type) { + wasFound = YES; + if (![[value class] isSubclassOfClass:fullTypeMap[i].class]) { + return NO; + } + } + } + if (!wasFound) { + return NO; + } + if (type & kABMultiValueMask) { + value = (id)[value multiValueRef]; + } + CFErrorRef cfError = nil; + bool wasGood = ABRecordSetValue(record_, property, (CFTypeRef)value, &cfError); + if (cfError) { + // COV_NF_START + _GTMDevLog(@"Error in [%@ %@]: %@", + [self class], NSStringFromSelector(_cmd), cfError); + CFRelease(cfError); + // COV_NF_END + } + return wasGood ? YES : NO; +} + +- (BOOL)removeValueForProperty:(ABPropertyID)property { + CFErrorRef cfError = nil; + // We check to see if the value is in the property because of: + // Radar 6201005 ABRecordRemoveValue returns true for value that aren't + // in the record + id value = [self valueForProperty:property]; + bool wasGood = value && ABRecordRemoveValue(record_, property, &cfError); + if (cfError) { + // COV_NF_START + _GTMDevLog(@"Error in [%@ %@]: %@", + [self class], NSStringFromSelector(_cmd), cfError); + CFRelease(cfError); + // COV_NF_END + } + return wasGood ? YES : NO; +} + +- (NSString *)compositeName { + return GTMCFAutorelease(ABRecordCopyCompositeName(record_)); +} + +// COV_NF_START +// Both of these methods are to be overridden by their subclasses ++ (ABPropertyType)typeOfProperty:(ABPropertyID)property { + [self doesNotRecognizeSelector:_cmd]; + return kABInvalidPropertyType; +} + ++ (NSString *)localizedPropertyName:(ABPropertyID)property { + [self doesNotRecognizeSelector:_cmd]; + return nil; +} +// COV_NF_END +@end + +@implementation GTMABPerson + ++ (GTMABPerson *)personWithFirstName:(NSString *)first + lastName:(NSString *)last { + GTMABPerson *person = [[[self alloc] init] autorelease]; + if (person) { + BOOL isGood = YES; + if (first) { + isGood = [person setValue:first forProperty:kABPersonFirstNameProperty]; + } + if (isGood && last) { + isGood = [person setValue:last forProperty:kABPersonLastNameProperty]; + } + if (!isGood) { + // COV_NF_START + // Marked as NF because I don't know how to force an error + [person release]; + person = nil; + // COV_NF_END + } + } + return person; +} + +- (id)init { + ABRecordRef person = ABPersonCreate(); + self = [super initWithRecord:person]; + if (person) { + CFRelease(person); + } + return self; +} + +- (BOOL)setImageData:(NSData *)data { + CFErrorRef cfError = NULL; + bool wasGood = NO; + if (!data) { + wasGood = ABPersonRemoveImageData([self recordRef], &cfError); + } else { + // We verify that the data is good because of: + // Radar 6202868 ABPersonSetImageData should validate image data + UIImage *image = [UIImage imageWithData:data]; + wasGood = image && ABPersonSetImageData([self recordRef], + (CFDataRef)data, &cfError); + } + if (cfError) { + // COV_NF_START + _GTMDevLog(@"Error in [%@ %@]: %@", + [self class], NSStringFromSelector(_cmd), cfError); + CFRelease(cfError); + // COV_NF_END + } + return wasGood ? YES : NO; +} + +- (UIImage *)image { + return [UIImage imageWithData:[self imageData]]; +} + +- (BOOL)setImage:(UIImage *)image { + NSData *data = UIImagePNGRepresentation(image); + return [self setImageData:data]; +} + +- (NSData *)imageData { + return GTMCFAutorelease(ABPersonCopyImageData([self recordRef])); +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %@ %@ %d", + [self class], + [self valueForProperty:kABPersonFirstNameProperty], + [self valueForProperty:kABPersonLastNameProperty], + [self recordID]]; +} + ++ (NSString *)localizedPropertyName:(ABPropertyID)property { + return GTMCFAutorelease(ABPersonCopyLocalizedPropertyName(property)); +} + ++ (ABPersonCompositeNameFormat)compositeNameFormat { + return ABPersonGetCompositeNameFormat(); +} + ++ (ABPropertyType)typeOfProperty:(ABPropertyID)property { + return ABPersonGetTypeOfProperty(property); +} +@end + +@implementation GTMABGroup + ++ (GTMABGroup *)groupNamed:(NSString *)name { + GTMABGroup *group = [[[self alloc] init] autorelease]; + if (group) { + if (![group setValue:name forProperty:kABGroupNameProperty]) { + // COV_NF_START + // Can't get setValue to fail for me + [group release]; + group = nil; + // COV_NF_END + } + } + return group; +} + +- (id)init { + ABRecordRef group = ABGroupCreate(); + self = [super initWithRecord:group]; + if (group) { + CFRelease(group); + } + return self; +} + +- (NSArray *)members { + NSArray *people + = GTMCFAutorelease(ABGroupCopyArrayOfAllMembers([self recordRef])); + NSMutableArray *gtmPeople = [NSMutableArray arrayWithCapacity:[people count]]; + for (id person in people) { + [gtmPeople addObject:[GTMABPerson recordWithRecord:(ABRecordRef)person]]; + } + return gtmPeople; +} + +- (BOOL)addMember:(GTMABPerson *)person { + CFErrorRef cfError = nil; + // We check for person because of + // Radar 6202860 Passing nil person into ABGroupAddMember crashes + bool wasGood = person && ABGroupAddMember([self recordRef], + [person recordRef], &cfError); + if (cfError) { + // COV_NF_START + _GTMDevLog(@"Error in [%@ %@]: %@", + [self class], NSStringFromSelector(_cmd), cfError); + CFRelease(cfError); + // COV_NF_END + } + return wasGood ? YES : NO; +} + +- (BOOL)removeMember:(GTMABPerson *)person { + CFErrorRef cfError = nil; + // We check for person because of + // Radar 6202860 Passing nil person into ABGroupAddMember crashes + // (I know this is remove, but it crashes there too) + bool wasGood = person && ABGroupRemoveMember([self recordRef], + [person recordRef], &cfError); + if (cfError) { + // COV_NF_START + _GTMDevLog(@"Error in [%@ %@]: %@", + [self class], NSStringFromSelector(_cmd), cfError); + CFRelease(cfError); + // COV_NF_END + } + return wasGood ? YES : NO; +} + ++ (ABPropertyType)typeOfProperty:(ABPropertyID)property { + ABPropertyType type = kABInvalidPropertyType; + if (property == kABGroupNameProperty) { + type = kABStringPropertyType; + } + return type; +} + ++ (NSString *)localizedPropertyName:(ABPropertyID)property { + NSString *name = kGTMABUnknownPropertyName; + if (property == kABGroupNameProperty) { + name = NSLocalizedStringFromTable(@"Name", + @"GTMABAddressBook", + @"name property"); + } + return name; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %@ %d", + [self class], + [self valueForProperty:kABGroupNameProperty], + [self recordID]]; +} +@end + +@implementation GTMABMultiValue +- (id)init { + // Call super init and release so we don't leak + [[super init] autorelease]; + [self doesNotRecognizeSelector:_cmd]; + return nil; // COV_NF_LINE +} + +- (id)initWithMultiValue:(ABMultiValueRef)multiValue { + if ((self = [super init])) { + if (!multiValue) { + [self release]; + self = nil; + } else { + multiValue_ = CFRetain(multiValue); + } + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + return [[GTMABMultiValue alloc] initWithMultiValue:multiValue_]; +} + +- (id)mutableCopyWithZone:(NSZone *)zone { + return [[GTMABMutableMultiValue alloc] initWithMultiValue:multiValue_]; +} + +- (NSUInteger)hash { + // I'm implementing hash instead of using CFHash(multiValue_) because + // 6203854 ABMultiValues hash to their address + NSUInteger count = [self count]; + NSUInteger hash = 0; + for (NSUInteger i = 0; i < count; ++i) { + NSString *label = [self labelAtIndex:i]; + id value = [self valueAtIndex:i]; + hash += [label hash]; + hash += [value hash]; + } + return hash; +} + +- (BOOL)isEqual:(id)object { + // I'm implementing isEqual instea of using CFEquals(multiValue,...) because + // 6203854 ABMultiValues hash to their address + // and it appears CFEquals just calls through to hash to compare them. + BOOL isEqual = NO; + if ([object respondsToSelector:@selector(multiValueRef)]) { + isEqual = multiValue_ == [object multiValueRef]; + if (!isEqual) { + NSUInteger count = [self count]; + NSUInteger objCount = [object count]; + isEqual = count == objCount; + for (NSUInteger i = 0; isEqual && i < count; ++i) { + NSString *label = [self labelAtIndex:i]; + NSString *objLabel = [object labelAtIndex:i]; + isEqual = [label isEqual:objLabel]; + if (isEqual) { + id value = [self valueAtIndex:i]; + id objValue = [object valueAtIndex:i]; + isEqual = [value isEqual:objValue]; + } + } + } + } + return isEqual; +} + +- (void)dealloc { + if (multiValue_) { + CFRelease(multiValue_); + } + [super dealloc]; +} + +- (ABMultiValueRef)multiValueRef { + return multiValue_; +} + +- (NSUInteger)count { + return ABMultiValueGetCount(multiValue_); +} + +- (id)valueAtIndex:(NSUInteger)idx { + id value = nil; + if (idx < [self count]) { + value = GTMCFAutorelease(ABMultiValueCopyValueAtIndex(multiValue_, idx)); + ABPropertyType type = [self propertyType]; + if (type == kABIntegerPropertyType + || type == kABRealPropertyType + || type == kABDictionaryPropertyType) { + // This is because of + // 6208390 Integer and real values don't work in ABMultiValueRefs + // Apparently they forget to add a ref count on int, real and + // dictionary values in ABMultiValueCopyValueAtIndex, although they do + // remember them for all other types. + // Once they fix this, this will lead to a leak, but I figure the leak + // is better than the crash. Our unittests will test to make sure that + // this is the case, and once we find a system that has this fixed, we + // can conditionalize this code. Look for testRadar6208390 in + // GTMABAddressBookTest.m + // Also, search for 6208390 below and fix the fast enumerator to actually + // be somewhat performant when this is fixed. + [value retain]; + } + } + return value; +} + +- (NSString *)labelAtIndex:(NSUInteger)idx { + NSString *label = nil; + if (idx < [self count]) { + label = GTMCFAutorelease(ABMultiValueCopyLabelAtIndex(multiValue_, idx)); + } + return label; +} + +- (ABMultiValueIdentifier)identifierAtIndex:(NSUInteger)idx { + ABMultiValueIdentifier identifier = kABMultiValueInvalidIdentifier; + if (idx < [self count]) { + identifier = ABMultiValueGetIdentifierAtIndex(multiValue_, idx); + } + return identifier; +} + +- (NSUInteger)indexForIdentifier:(ABMultiValueIdentifier)identifier { + NSUInteger idx = ABMultiValueGetIndexForIdentifier(multiValue_, identifier); + return idx == (NSUInteger)kCFNotFound ? (NSUInteger)NSNotFound : idx; +} + +- (ABPropertyType)propertyType { + return ABMultiValueGetPropertyType(multiValue_); +} + +- (id)valueForIdentifier:(ABMultiValueIdentifier)identifier { + return [self valueAtIndex:[self indexForIdentifier:identifier]]; +} + +- (NSString *)labelForIdentifier:(ABMultiValueIdentifier)identifier { + return [self labelAtIndex:[self indexForIdentifier:identifier]]; +} + +- (unsigned long*)mutations { + // We just need some constant non-zero value here so fast enumeration works. + // Dereferencing self should give us the isa which will stay constant + // over the enumeration. + return (unsigned long*)self; +} + +- (NSEnumerator *)valueEnumerator { + return [GTMABMultiValueEnumerator valueEnumeratorFor:self]; +} + +- (NSEnumerator *)labelEnumerator { + return [GTMABMultiValueEnumerator labelEnumeratorFor:self]; +} + +@end + +@implementation GTMABMutableMultiValue ++ (id)valueWithPropertyType:(ABPropertyType)type { + return [[[self alloc] initWithPropertyType:type] autorelease]; +} + +- (id)initWithPropertyType:(ABPropertyType)type { + ABMutableMultiValueRef ref = nil; + if (type != kABInvalidPropertyType) { + ref = ABMultiValueCreateMutable(type); + } + self = [super initWithMultiValue:ref]; + if (ref) { + CFRelease(ref); + } + return self; +} + +- (id)initWithMultiValue:(ABMultiValueRef)multiValue { + ABMutableMultiValueRef ref = nil; + if (multiValue) { + ref = ABMultiValueCreateMutableCopy(multiValue); + } + self = [super initWithMultiValue:ref]; + if (ref) { + CFRelease(ref); + } + return self; +} + +- (id)initWithMutableMultiValue:(ABMutableMultiValueRef)multiValue { + return [super initWithMultiValue:multiValue]; +} + +- (BOOL)checkValueType:(id)value { + BOOL isGood = NO; + if (value) { + TypeClassNameMap singleValueTypeMap[] = { + { kABStringPropertyType, [NSString class] }, + { kABIntegerPropertyType, [NSNumber class] }, + { kABRealPropertyType, [NSNumber class] }, + { kABDateTimePropertyType, [NSDate class] }, + { kABDictionaryPropertyType, [NSDictionary class] }, + }; + ABPropertyType type = [self propertyType]; + for (size_t i = 0; + i < sizeof(singleValueTypeMap) / sizeof(TypeClassNameMap); ++i) { + if (singleValueTypeMap[i].pType == type) { + if ([[value class] isSubclassOfClass:singleValueTypeMap[i].class]) { + isGood = YES; + break; + } + } + } + } + return isGood; +} + +- (ABMultiValueIdentifier)addValue:(id)value withLabel:(CFStringRef)label { + ABMultiValueIdentifier identifier = kABMultiValueInvalidIdentifier; + // We check label and value here because of + // radar 6202827 Passing nil info ABMultiValueAddValueAndLabel causes crash + if (!label + || ![self checkValueType:value] + || !ABMultiValueAddValueAndLabel(multiValue_, + value, + label, + &identifier)) { + identifier = kABMultiValueInvalidIdentifier; + } else { + mutations_++; + } + return identifier; +} + +- (ABMultiValueIdentifier)insertValue:(id)value + withLabel:(CFStringRef)label + atIndex:(NSUInteger)idx { + ABMultiValueIdentifier identifier = kABMultiValueInvalidIdentifier; + // We perform a check here to ensure that we don't get bitten by + // Radar 6202807 ABMultiValueInsertValueAndLabelAtIndex allows you to insert + // values past end + NSUInteger count = [self count]; + // We check label and value here because of + // radar 6202827 Passing nil info ABMultiValueAddValueAndLabel causes crash + if (idx > count + || !label + || ![self checkValueType:value] + || !ABMultiValueInsertValueAndLabelAtIndex(multiValue_, + value, + label, + idx, + &identifier)) { + identifier = kABMultiValueInvalidIdentifier; + } else { + mutations_++; + } + return identifier; +} + +- (BOOL)removeValueAndLabelAtIndex:(NSUInteger)idx { + BOOL isGood = NO; + NSUInteger count = [self count]; + if (idx < count) { + if (ABMultiValueRemoveValueAndLabelAtIndex(multiValue_, + idx)) { + mutations_++; + isGood = YES; + } + } + return isGood; +} + +- (BOOL)replaceValueAtIndex:(NSUInteger)idx withValue:(id)value { + BOOL isGood = NO; + NSUInteger count = [self count]; + if (idx < count && [self checkValueType:value]) { + if (ABMultiValueReplaceValueAtIndex(multiValue_, + value, idx)) { + mutations_++; + isGood = YES; + } + } + return isGood; +} + +- (BOOL)replaceLabelAtIndex:(NSUInteger)idx withLabel:(CFStringRef)label{ + BOOL isGood = NO; + NSUInteger count = [self count]; + if (idx < count) { + if (ABMultiValueReplaceLabelAtIndex(multiValue_, + label, + idx)) { + mutations_++; + isGood = YES; + } + } + return isGood; +} + +- (unsigned long*)mutations { + return &mutations_; +} +@end + + +@implementation GTMABMultiValueEnumerator + ++ (id)valueEnumeratorFor:(GTMABMultiValue*)enumeree { + return [[[self alloc] initWithEnumeree:enumeree useLabels:NO] autorelease]; +} + ++ (id)labelEnumeratorFor:(GTMABMultiValue*)enumeree { + return [[[self alloc] initWithEnumeree:enumeree useLabels:YES] autorelease]; +} + +- (id)initWithEnumeree:(GTMABMultiValue*)enumeree useLabels:(BOOL)useLabels { + if ((self = [super init])) { + if (enumeree) { + enumeree_ = [enumeree retain]; + useLabels_ = useLabels; + } else { + // COV_NF_START + // Since this is a private class where the enumeree creates us + // there is no way we should ever get here. + [self release]; + self = nil; + // COV_NF_END + } + } + return self; +} + +- (void)dealloc { + [enumeree_ release]; + [super dealloc]; +} + +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state + objects:(id *)stackbuf + count:(NSUInteger)len { + NSUInteger i; + if (!ref_) { + count_ = [enumeree_ count]; + ref_ = [enumeree_ multiValueRef]; + } + + for (i = 0; state->state < count_ && i < len; ++i, ++state->state) { + if (useLabels_) { + stackbuf[i] = GTMCFAutorelease(ABMultiValueCopyLabelAtIndex(ref_, + state->state)); + } else { + // Yes this is slow, but necessary in light of radar 6208390 + // Once this is fixed we can go to something similar to the label + // case which should speed stuff up again. Hopefully anybody who wants + // real performance is willing to move down to the C API anyways. + stackbuf[i] = [enumeree_ valueAtIndex:state->state]; + } + } + + state->itemsPtr = stackbuf; + state->mutationsPtr = [enumeree_ mutations]; + return i; +} + +- (id)nextObject { + id value = nil; + if (!ref_) { + count_ = [enumeree_ count]; + mutations_ = *[enumeree_ mutations]; + ref_ = [enumeree_ multiValueRef]; + + } + if (mutations_ != *[enumeree_ mutations]) { + NSString *reason = [NSString stringWithFormat:@"*** Collection <%@> was " + "mutated while being enumerated", enumeree_]; + [[NSException exceptionWithName:NSGenericException + reason:reason + userInfo:nil] raise]; + } + if (index_ < count_) { + if (useLabels_) { + value = GTMCFAutorelease(ABMultiValueCopyLabelAtIndex(ref_, + index_)); + } else { + // Yes this is slow, but necessary in light of radar 6208390 + // Once this is fixed we can go to something similar to the label + // case which should speed stuff up again. Hopefully anybody who wants + // real performance is willing to move down to the C API anyways. + value = [enumeree_ valueAtIndex:index_]; + } + index_ += 1; + } + return value; +} +@end + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.strings b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMABAddressBook.strings new file mode 100644 index 0000000000000000000000000000000000000000..b5e010e166c841a71bfea1c32719da8d810916ed GIT binary patch literal 1428 zcmai!PmdBo5XI}fpQ1A-O%#kL^r`}UfV04H;yipnax2B)&*k>;wi=*=wmz<;OB4%w!xlYm)I4kitez_5Wo0$ z9P@(pZ|=VaYe}?Nv|thJ*&ZRYYDlb*hrB|U;;9Bp_?$yk zOv)w2s8SU;Z@m+0*wyGYJkYqsJ|(qldmgDiYi91K<+a_|7whwVxzoBqZ^mHvu$E5h zr~q1SKT*1HOLZQ(-r6;)HHN`xr|cZN#z!oa#mu8(e^ktdohCK&QZ{y|I$_P~l$n|+ z?V0#Y@M`*b1e1!@bNzN)9qpzZ&LPB}Q?-L-^lG26%Qs`x+3NeB*gaqk?4$KiXK=vn z0k5w-9aJ6QbK@92W&&FGn0@b&UAKkbvk!db|H$}>RrzR-+!fJDk#_3Ql`9eJ5EU)< zJt_@i_x15ruf{W%bUW2zx~ocaHrL?ibY|fvV+?|-ryFDAl@sQSm|u96%*R> +#import + +@interface UIFont (GTMLineHeight) +- (CGFloat)gtm_lineHeight; +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMUIFont+LineHeight.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMUIFont+LineHeight.m new file mode 100644 index 00000000..74f8a8fe --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMUIFont+LineHeight.m @@ -0,0 +1,25 @@ +// +// GTMUIFont+LineHeight.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMUIFont+LineHeight.h" + +@implementation UIFont (GTMLineHeight) +- (CGFloat)gtm_lineHeight { + return [@"Fake line with gjy" sizeWithFont:self].height; +} +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMUIFont+LineHeightTest.m b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMUIFont+LineHeightTest.m new file mode 100644 index 00000000..8da28eb0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/externals/google-toolbox-for-mac/iPhone/GTMUIFont+LineHeightTest.m @@ -0,0 +1,40 @@ +// +// GTMUIFont+LineHeightTest.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" +#import "GTMUIFont+LineHeight.h" + +@interface GTMUIFontLineHeightTest : GTMTestCase +@end + + +@implementation GTMUIFontLineHeightTest + +- (void)testLineHeight { + UIFont *font = [UIFont systemFontOfSize:[UIFont systemFontSize]]; + STAssertNotNil(font, nil); + STAssertGreaterThanOrEqual([font gtm_lineHeight], (CGFloat)5.0, nil); + + UIFont *fontSmall = [UIFont systemFontOfSize:[UIFont smallSystemFontSize]]; + STAssertNotNil(fontSmall, nil); + STAssertGreaterThanOrEqual([fontSmall gtm_lineHeight], (CGFloat)5.0, nil); + + STAssertGreaterThan([font gtm_lineHeight], [fontSmall gtm_lineHeight], nil); +} + +@end diff --git a/thirdparty/google-breakpad/r318/src/common/mac/file_id.cc b/thirdparty/google-breakpad/r318/src/common/mac/file_id.cc new file mode 100644 index 00000000..ebb8c40e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/file_id.cc @@ -0,0 +1,101 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// file_id.cc: Return a unique identifier for a file +// +// See file_id.h for documentation +// +// Author: Dan Waylonis + +#include +#include +#include + +#include "common/mac/file_id.h" +#include "common/mac/macho_id.h" + +using MacFileUtilities::MachoID; + +namespace google_breakpad { + +FileID::FileID(const char *path) { + strlcpy(path_, path, sizeof(path_)); +} + +bool FileID::FileIdentifier(unsigned char identifier[16]) { + int fd = open(path_, O_RDONLY); + if (fd == -1) + return false; + + MD5_CTX md5; + MD5_Init(&md5); + + // Read 4k x 2 bytes at a time. This is faster than just 4k bytes, but + // doesn't seem to be an unreasonable size for the stack. + unsigned char buffer[4096 * 2]; + size_t buffer_size = sizeof(buffer); + while ((buffer_size = read(fd, buffer, buffer_size) > 0)) { + MD5_Update(&md5, buffer, buffer_size); + } + + close(fd); + MD5_Final(identifier, &md5); + + return true; +} + +bool FileID::MachoIdentifier(int cpu_type, unsigned char identifier[16]) { + MachoID macho(path_); + + if (macho.UUIDCommand(cpu_type, identifier)) + return true; + + return macho.MD5(cpu_type, identifier); +} + +// static +void FileID::ConvertIdentifierToString(const unsigned char identifier[16], + char *buffer, int buffer_length) { + int buffer_idx = 0; + for (int idx = 0; (buffer_idx < buffer_length) && (idx < 16); ++idx) { + int hi = (identifier[idx] >> 4) & 0x0F; + int lo = (identifier[idx]) & 0x0F; + + if (idx == 4 || idx == 6 || idx == 8 || idx == 10) + buffer[buffer_idx++] = '-'; + + buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi; + buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo; + } + + // NULL terminate + buffer[(buffer_idx < buffer_length) ? buffer_idx : buffer_idx - 1] = 0; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/common/mac/file_id.h b/thirdparty/google-breakpad/r318/src/common/mac/file_id.h new file mode 100644 index 00000000..eb06b0d6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/file_id.h @@ -0,0 +1,78 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// file_id.h: Return a unique identifier for a file +// +// Author: Dan Waylonis + +#ifndef COMMON_MAC_FILE_ID_H__ +#define COMMON_MAC_FILE_ID_H__ + +#include + +namespace google_breakpad { + +class FileID { + public: + FileID(const char *path); + ~FileID() {}; + + // Load the identifier for the file path specified in the constructor into + // |identifier|. Return false if the identifier could not be created for the + // file. + // The current implementation will return the MD5 hash of the file's bytes. + bool FileIdentifier(unsigned char identifier[16]); + + // Treat the file as a mach-o file that will contain one or more archicture. + // Accepted values for |cpu_type| (e.g., CPU_TYPE_X86 or CPU_TYPE_POWERPC) + // are listed in /usr/include/mach/machine.h. + // If |cpu_type| is 0, then the native cpu type is used. + // Returns false if opening the file failed or if the |cpu_type| is not + // present in the file. + // Return the unique identifier in |identifier|. + // The current implementation will look for the (in order of priority): + // LC_UUID, LC_ID_DYLIB, or MD5 hash of the given |cpu_type|. + bool MachoIdentifier(int cpu_type, unsigned char identifier[16]); + + // Convert the |identifier| data to a NULL terminated string. The string will + // be formatted as a UUID (e.g., 22F065BB-FC9C-49F7-80FE-26A7CEBD7BCE). + // The |buffer| should be at least 37 bytes long to receive all of the data + // and termination. Shorter buffers will contain truncated data. + static void ConvertIdentifierToString(const unsigned char identifier[16], + char *buffer, int buffer_length); + + private: + // Storage for the path specified + char path_[PATH_MAX]; +}; + +} // namespace google_breakpad + +#endif // COMMON_MAC_FILE_ID_H__ + diff --git a/thirdparty/google-breakpad/r318/src/common/mac/macho_id.cc b/thirdparty/google-breakpad/r318/src/common/mac/macho_id.cc new file mode 100644 index 00000000..160f6ed7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/macho_id.cc @@ -0,0 +1,366 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_id.cc: Functions to gather identifying information from a macho file +// +// See macho_id.h for documentation +// +// Author: Dan Waylonis + +extern "C" { // necessary for Leopard + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +} + +#include "common/mac/macho_id.h" +#include "common/mac/macho_walker.h" +#include "common/mac/macho_utilities.h" + +namespace MacFileUtilities { + +MachoID::MachoID(const char *path) { + strlcpy(path_, path, sizeof(path_)); + file_ = open(path, O_RDONLY); +} + +MachoID::~MachoID() { + if (file_ != -1) + close(file_); +} + +// The CRC info is from http://en.wikipedia.org/wiki/Adler-32 +// With optimizations from http://www.zlib.net/ + +// The largest prime smaller than 65536 +#define MOD_ADLER 65521 +// MAX_BLOCK is the largest n such that 255n(n+1)/2 + (n+1)(MAX_BLOCK-1) <= 2^32-1 +#define MAX_BLOCK 5552 + +void MachoID::UpdateCRC(unsigned char *bytes, size_t size) { +// Unrolled loops for summing +#define DO1(buf,i) {sum1 += (buf)[i]; sum2 += sum1;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + // Split up the crc + uint32_t sum1 = crc_ & 0xFFFF; + uint32_t sum2 = (crc_ >> 16) & 0xFFFF; + + // Do large blocks + while (size >= MAX_BLOCK) { + size -= MAX_BLOCK; + int block_count = MAX_BLOCK / 16; + do { + DO16(bytes); + bytes += 16; + } while (--block_count); + sum1 %= MOD_ADLER; + sum2 %= MOD_ADLER; + } + + // Do remaining bytes + if (size) { + while (size >= 16) { + size -= 16; + DO16(bytes); + bytes += 16; + } + while (size--) { + sum1 += *bytes++; + sum2 += sum1; + } + sum1 %= MOD_ADLER; + sum2 %= MOD_ADLER; + crc_ = (sum2 << 16) | sum1; + } +} + +void MachoID::UpdateMD5(unsigned char *bytes, size_t size) { + MD5_Update(&md5_context_, bytes, size); +} + +void MachoID::UpdateSHA1(unsigned char *bytes, size_t size) { + SHA_Update(&sha1_context_, bytes, size); +} + +void MachoID::Update(MachoWalker *walker, unsigned long offset, size_t size) { + if (!update_function_ || !size) + return; + + // Read up to 4k bytes at a time + unsigned char buffer[4096]; + size_t buffer_size; + off_t file_offset = offset; + while (size > 0) { + if (size > sizeof(buffer)) { + buffer_size = sizeof(buffer); + size -= buffer_size; + } else { + buffer_size = size; + size = 0; + } + + if (!walker->ReadBytes(buffer, buffer_size, file_offset)) + return; + + (this->*update_function_)(buffer, buffer_size); + file_offset += buffer_size; + } +} + +bool MachoID::UUIDCommand(int cpu_type, unsigned char bytes[16]) { + struct breakpad_uuid_command uuid_cmd; + MachoWalker walker(path_, UUIDWalkerCB, &uuid_cmd); + + uuid_cmd.cmd = 0; + if (!walker.WalkHeader(cpu_type)) + return false; + + // If we found the command, we'll have initialized the uuid_command + // structure + if (uuid_cmd.cmd == LC_UUID) { + memcpy(bytes, uuid_cmd.uuid, sizeof(uuid_cmd.uuid)); + return true; + } + + return false; +} + +bool MachoID::IDCommand(int cpu_type, unsigned char identifier[16]) { + struct dylib_command dylib_cmd; + MachoWalker walker(path_, IDWalkerCB, &dylib_cmd); + + dylib_cmd.cmd = 0; + if (!walker.WalkHeader(cpu_type)) + return false; + + // If we found the command, we'll have initialized the dylib_command + // structure + if (dylib_cmd.cmd == LC_ID_DYLIB) { + // Take the hashed filename, version, and compatability version bytes + // to form the first 12 bytes, pad the rest with zeros + + // create a crude hash of the filename to generate the first 4 bytes + identifier[0] = 0; + identifier[1] = 0; + identifier[2] = 0; + identifier[3] = 0; + + for (int j = 0, i = strlen(path_)-1; i >= 0 && path_[i]!='/'; ++j, --i) { + identifier[j%4] += path_[i]; + } + + identifier[4] = (dylib_cmd.dylib.current_version >> 24) & 0xFF; + identifier[5] = (dylib_cmd.dylib.current_version >> 16) & 0xFF; + identifier[6] = (dylib_cmd.dylib.current_version >> 8) & 0xFF; + identifier[7] = dylib_cmd.dylib.current_version & 0xFF; + identifier[8] = (dylib_cmd.dylib.compatibility_version >> 24) & 0xFF; + identifier[9] = (dylib_cmd.dylib.compatibility_version >> 16) & 0xFF; + identifier[10] = (dylib_cmd.dylib.compatibility_version >> 8) & 0xFF; + identifier[11] = dylib_cmd.dylib.compatibility_version & 0xFF; + identifier[12] = (cpu_type >> 24) & 0xFF; + identifier[13] = (cpu_type >> 16) & 0xFF; + identifier[14] = (cpu_type >> 8) & 0xFF; + identifier[15] = cpu_type & 0xFF; + + return true; + } + + return false; +} + +uint32_t MachoID::Adler32(int cpu_type) { + MachoWalker walker(path_, WalkerCB, this); + update_function_ = &MachoID::UpdateCRC; + crc_ = 0; + + if (!walker.WalkHeader(cpu_type)) + return 0; + + return crc_; +} + +bool MachoID::MD5(int cpu_type, unsigned char identifier[16]) { + MachoWalker walker(path_, WalkerCB, this); + update_function_ = &MachoID::UpdateMD5; + + if (MD5_Init(&md5_context_)) { + if (!walker.WalkHeader(cpu_type)) + return false; + + MD5_Final(identifier, &md5_context_); + return true; + } + + return false; +} + +bool MachoID::SHA1(int cpu_type, unsigned char identifier[16]) { + MachoWalker walker(path_, WalkerCB, this); + update_function_ = &MachoID::UpdateSHA1; + + if (SHA_Init(&sha1_context_)) { + if (!walker.WalkHeader(cpu_type)) + return false; + + SHA_Final(identifier, &sha1_context_); + return true; + } + + return false; +} + +// static +bool MachoID::WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset, + bool swap, void *context) { + MachoID *macho_id = (MachoID *)context; + + if (cmd->cmd == LC_SEGMENT) { + struct segment_command seg; + + if (!walker->ReadBytes(&seg, sizeof(seg), offset)) + return false; + + if (swap) + swap_segment_command(&seg, NXHostByteOrder()); + + struct mach_header_64 header; + off_t header_offset; + + if (!walker->CurrentHeader(&header, &header_offset)) + return false; + + // Process segments that have sections: + // (e.g., __TEXT, __DATA, __IMPORT, __OBJC) + offset += sizeof(struct segment_command); + struct section sec; + for (unsigned long i = 0; i < seg.nsects; ++i) { + if (!walker->ReadBytes(&sec, sizeof(sec), offset)) + return false; + + if (swap) + swap_section(&sec, 1, NXHostByteOrder()); + + // sections of type S_ZEROFILL are "virtual" and contain no data + // in the file itself + if ((sec.flags & SECTION_TYPE) != S_ZEROFILL && sec.offset != 0) + macho_id->Update(walker, header_offset + sec.offset, sec.size); + + offset += sizeof(struct section); + } + } else if (cmd->cmd == LC_SEGMENT_64) { + struct segment_command_64 seg64; + + if (!walker->ReadBytes(&seg64, sizeof(seg64), offset)) + return false; + + if (swap) + breakpad_swap_segment_command_64(&seg64, NXHostByteOrder()); + + struct mach_header_64 header; + off_t header_offset; + + if (!walker->CurrentHeader(&header, &header_offset)) + return false; + + // Process segments that have sections: + // (e.g., __TEXT, __DATA, __IMPORT, __OBJC) + offset += sizeof(struct segment_command_64); + struct section_64 sec64; + for (unsigned long i = 0; i < seg64.nsects; ++i) { + if (!walker->ReadBytes(&sec64, sizeof(sec64), offset)) + return false; + + if (swap) + breakpad_swap_section_64(&sec64, 1, NXHostByteOrder()); + + // sections of type S_ZEROFILL are "virtual" and contain no data + // in the file itself + if ((sec64.flags & SECTION_TYPE) != S_ZEROFILL && sec64.offset != 0) + macho_id->Update(walker, header_offset + sec64.offset, sec64.size); + + offset += sizeof(struct section_64); + } + } + + // Continue processing + return true; +} + +// static +bool MachoID::UUIDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset, + bool swap, void *context) { + if (cmd->cmd == LC_UUID) { + struct breakpad_uuid_command *uuid_cmd = + (struct breakpad_uuid_command *)context; + + if (!walker->ReadBytes(uuid_cmd, sizeof(struct breakpad_uuid_command), + offset)) + return false; + + if (swap) + breakpad_swap_uuid_command(uuid_cmd, NXHostByteOrder()); + + return false; + } + + // Continue processing + return true; +} + +// static +bool MachoID::IDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset, + bool swap, void *context) { + if (cmd->cmd == LC_ID_DYLIB) { + struct dylib_command *dylib_cmd = (struct dylib_command *)context; + + if (!walker->ReadBytes(dylib_cmd, sizeof(struct dylib_command), offset)) + return false; + + if (swap) + swap_dylib_command(dylib_cmd, NXHostByteOrder()); + + return false; + } + + // Continue processing + return true; +} + +} // namespace MacFileUtilities diff --git a/thirdparty/google-breakpad/r318/src/common/mac/macho_id.h b/thirdparty/google-breakpad/r318/src/common/mac/macho_id.h new file mode 100644 index 00000000..039bba38 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/macho_id.h @@ -0,0 +1,124 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_id.h: Functions to gather identifying information from a macho file +// +// Author: Dan Waylonis + +#ifndef COMMON_MAC_MACHO_ID_H__ +#define COMMON_MAC_MACHO_ID_H__ + +#include +#include +#include +#include + +namespace MacFileUtilities { + +class MachoWalker; + +class MachoID { + public: + MachoID(const char *path); + ~MachoID(); + + // For the given |cpu_type|, return a UUID from the LC_UUID command. + // Return false if there isn't a LC_UUID command. + bool UUIDCommand(int cpu_type, unsigned char identifier[16]); + + // For the given |cpu_type|, return a UUID from the LC_ID_DYLIB command. + // Return false if there isn't a LC_ID_DYLIB command. + bool IDCommand(int cpu_type, unsigned char identifier[16]); + + // For the given |cpu_type|, return the Adler32 CRC for the mach-o data + // segment(s). + // Return 0 on error (e.g., if the file is not a mach-o file) + uint32_t Adler32(int cpu_type); + + // For the given |cpu_type|, return the MD5 for the mach-o data segment(s). + // Return true on success, false otherwise + bool MD5(int cpu_type, unsigned char identifier[16]); + + // For the given |cpu_type|, return the SHA1 for the mach-o data segment(s). + // Return true on success, false otherwise + bool SHA1(int cpu_type, unsigned char identifier[16]); + + private: + // Signature of class member function to be called with data read from file + typedef void (MachoID::*UpdateFunction)(unsigned char *bytes, size_t size); + + // Update the CRC value by examining |size| |bytes| and applying the algorithm + // to each byte. + void UpdateCRC(unsigned char *bytes, size_t size); + + // Update the MD5 value by examining |size| |bytes| and applying the algorithm + // to each byte. + void UpdateMD5(unsigned char *bytes, size_t size); + + // Update the SHA1 value by examining |size| |bytes| and applying the + // algorithm to each byte. + void UpdateSHA1(unsigned char *bytes, size_t size); + + // Bottleneck for update routines + void Update(MachoWalker *walker, unsigned long offset, size_t size); + + // The callback from the MachoWalker for CRC, MD5, and SHA1 + static bool WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset, + bool swap, void *context); + + // The callback from the MachoWalker for LC_UUID + static bool UUIDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset, + bool swap, void *context); + + // The callback from the MachoWalker for LC_ID_DYLIB + static bool IDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset, + bool swap, void *context); + + // File path + char path_[PATH_MAX]; + + // File descriptor + int file_; + + // The current crc value + uint32_t crc_; + + // The MD5 context + MD5_CTX md5_context_; + + // The SHA1 context + SHA_CTX sha1_context_; + + // The current update to call from the Update callback + UpdateFunction update_function_; +}; + +} // namespace MacFileUtilities + +#endif // COMMON_MAC_MACHO_ID_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/mac/macho_utilities.cc b/thirdparty/google-breakpad/r318/src/common/mac/macho_utilities.cc new file mode 100644 index 00000000..d25de5c8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/macho_utilities.cc @@ -0,0 +1,89 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_utilties.cc: Utilities for dealing with mach-o files +// +// Author: Dave Camp + +#include "common/mac/macho_utilities.h" + +void breakpad_swap_uuid_command(struct breakpad_uuid_command *uc, + enum NXByteOrder target_byte_order) +{ + uc->cmd = NXSwapLong(uc->cmd); + uc->cmdsize = NXSwapLong(uc->cmdsize); +} + +void breakpad_swap_segment_command_64(struct segment_command_64 *sg, + enum NXByteOrder target_byte_order) +{ + sg->cmd = NXSwapLong(sg->cmd); + sg->cmdsize = NXSwapLong(sg->cmdsize); + + sg->vmaddr = NXSwapLongLong(sg->vmaddr); + sg->vmsize = NXSwapLongLong(sg->vmsize); + sg->fileoff = NXSwapLongLong(sg->fileoff); + sg->filesize = NXSwapLongLong(sg->filesize); + + sg->maxprot = NXSwapLong(sg->maxprot); + sg->initprot = NXSwapLong(sg->initprot); + sg->nsects = NXSwapLong(sg->nsects); + sg->flags = NXSwapLong(sg->flags); +} + +void breakpad_swap_mach_header_64(struct mach_header_64 *mh, + enum NXByteOrder target_byte_order) +{ + mh->magic = NXSwapLong(mh->magic); + mh->cputype = NXSwapLong(mh->cputype); + mh->cpusubtype = NXSwapLong(mh->cpusubtype); + mh->filetype = NXSwapLong(mh->filetype); + mh->ncmds = NXSwapLong(mh->ncmds); + mh->sizeofcmds = NXSwapLong(mh->sizeofcmds); + mh->flags = NXSwapLong(mh->flags); + mh->reserved = NXSwapLong(mh->reserved); +} + +void breakpad_swap_section_64(struct section_64 *s, + uint32_t nsects, + enum NXByteOrder target_byte_order) +{ + for (uint32_t i = 0; i < nsects; i++) { + s[i].addr = NXSwapLongLong(s[i].addr); + s[i].size = NXSwapLongLong(s[i].size); + + s[i].offset = NXSwapLong(s[i].offset); + s[i].align = NXSwapLong(s[i].align); + s[i].reloff = NXSwapLong(s[i].reloff); + s[i].nreloc = NXSwapLong(s[i].nreloc); + s[i].flags = NXSwapLong(s[i].flags); + s[i].reserved1 = NXSwapLong(s[i].reserved1); + s[i].reserved2 = NXSwapLong(s[i].reserved2); + } +} diff --git a/thirdparty/google-breakpad/r318/src/common/mac/macho_utilities.h b/thirdparty/google-breakpad/r318/src/common/mac/macho_utilities.h new file mode 100644 index 00000000..f74e93aa --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/macho_utilities.h @@ -0,0 +1,90 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_utilities.h: Utilities for dealing with mach-o files +// +// Author: Dave Camp + +#ifndef COMMON_MAC_MACHO_UTILITIES_H__ +#define COMMON_MAC_MACHO_UTILITIES_H__ + +#include +#include + +/* Some #defines and structs that aren't defined in older SDKs */ +#ifndef CPU_ARCH_ABI64 +# define CPU_ARCH_ABI64 0x01000000 +#endif + +#ifndef CPU_TYPE_X86 +# define CPU_TYPE_X86 CPU_TYPE_I386 +#endif + +#ifndef CPU_TYPE_POWERPC64 +# define CPU_TYPE_POWERPC64 (CPU_TYPE_POWERPC | CPU_ARCH_ABI64) +#endif + +#ifndef LC_UUID +# define LC_UUID 0x1b /* the uuid */ +#endif + +#if TARGET_CPU_X86 +# define BREAKPAD_MACHINE_THREAD_STATE i386_THREAD_STATE +#else +# define BREAKPAD_MACHINE_THREAD_STATE MACHINE_THREAD_STATE +#endif + +// The uuid_command struct/swap routines were added during the 10.4 series. +// Their presence isn't guaranteed. +struct breakpad_uuid_command { + uint32_t cmd; /* LC_UUID */ + uint32_t cmdsize; /* sizeof(struct uuid_command) */ + uint8_t uuid[16]; /* the 128-bit uuid */ +}; + +void breakpad_swap_uuid_command(struct breakpad_uuid_command *uc, + enum NXByteOrder target_byte_order); + +// Older SDKs defines thread_state_data_t as an int[] instead +// of the natural_t[] it should be. +typedef natural_t breakpad_thread_state_data_t[THREAD_STATE_MAX]; + +// The 64-bit swap routines were added during the 10.4 series, their +// presence isn't guaranteed. +void breakpad_swap_segment_command_64(struct segment_command_64 *sg, + enum NXByteOrder target_byte_order); + +void breakpad_swap_mach_header_64(struct mach_header_64 *mh, + enum NXByteOrder target_byte_order); + +void breakpad_swap_section_64(struct section_64 *s, + uint32_t nsects, + enum NXByteOrder target_byte_order); + +#endif diff --git a/thirdparty/google-breakpad/r318/src/common/mac/macho_walker.cc b/thirdparty/google-breakpad/r318/src/common/mac/macho_walker.cc new file mode 100644 index 00000000..dd2c3b39 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/macho_walker.cc @@ -0,0 +1,243 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_walker.cc: Iterate over the load commands in a mach-o file +// +// See macho_walker.h for documentation +// +// Author: Dan Waylonis + +extern "C" { // necessary for Leopard + #include + #include + #include + #include + #include + #include + #include +} + +#include "common/mac/macho_walker.h" +#include "common/mac/macho_utilities.h" + +namespace MacFileUtilities { + +MachoWalker::MachoWalker(const char *path, LoadCommandCallback callback, + void *context) + : callback_(callback), + callback_context_(context) { + file_ = open(path, O_RDONLY); +} + +MachoWalker::~MachoWalker() { + if (file_ != -1) + close(file_); +} + +int MachoWalker::ValidateCPUType(int cpu_type) { + // If the user didn't specify, try to use the local architecture. If that + // fails, use the base type for the executable. + if (cpu_type == 0) { + const NXArchInfo *arch = NXGetLocalArchInfo(); + if (arch) + cpu_type = arch->cputype; + else +#if __ppc__ + cpu_type = CPU_TYPE_POWERPC; +#elif __i386__ + cpu_type = CPU_TYPE_X86; +#else +#error Unknown architecture -- are you on a PDP-11? +#endif + } + + return cpu_type; +} + +bool MachoWalker::WalkHeader(int cpu_type) { + int valid_cpu_type = ValidateCPUType(cpu_type); + off_t offset; + if (FindHeader(valid_cpu_type, offset)) { + if (cpu_type & CPU_ARCH_ABI64) + return WalkHeader64AtOffset(offset); + + return WalkHeaderAtOffset(offset); + } + + return false; +} + +bool MachoWalker::ReadBytes(void *buffer, size_t size, off_t offset) { + return pread(file_, buffer, size, offset) == (ssize_t)size; +} + +bool MachoWalker::CurrentHeader(struct mach_header_64 *header, off_t *offset) { + if (current_header_) { + memcpy(header, current_header_, sizeof(mach_header_64)); + *offset = current_header_offset_; + return true; + } + + return false; +} + +bool MachoWalker::FindHeader(int cpu_type, off_t &offset) { + int valid_cpu_type = ValidateCPUType(cpu_type); + // Read the magic bytes that's common amongst all mach-o files + uint32_t magic; + if (!ReadBytes(&magic, sizeof(magic), 0)) + return false; + + offset = sizeof(magic); + + // Figure out what type of file we've got + bool is_fat = false; + if (magic == FAT_MAGIC || magic == FAT_CIGAM) { + is_fat = true; + } + else if (magic != MH_MAGIC && magic != MH_CIGAM && magic != MH_MAGIC_64 && + magic != MH_CIGAM_64) { + return false; + } + + if (!is_fat) { + // If we don't have a fat header, check if the cpu type matches the single + // header + cpu_type_t header_cpu_type; + if (!ReadBytes(&header_cpu_type, sizeof(header_cpu_type), offset)) + return false; + + if (magic == MH_CIGAM || magic == MH_CIGAM_64) + header_cpu_type = NXSwapInt(header_cpu_type); + + if (valid_cpu_type != header_cpu_type) + return false; + + offset = 0; + return true; + } else { + // Read the fat header and find an appropriate architecture + offset = 0; + struct fat_header fat; + if (!ReadBytes(&fat, sizeof(fat), offset)) + return false; + + if (NXHostByteOrder() != NX_BigEndian) + swap_fat_header(&fat, NXHostByteOrder()); + + offset += sizeof(fat); + + // Search each architecture for the desired one + struct fat_arch arch; + for (uint32_t i = 0; i < fat.nfat_arch; ++i) { + if (!ReadBytes(&arch, sizeof(arch), offset)) + return false; + + if (NXHostByteOrder() != NX_BigEndian) + swap_fat_arch(&arch, 1, NXHostByteOrder()); + + if (arch.cputype == valid_cpu_type) { + offset = arch.offset; + return true; + } + + offset += sizeof(arch); + } + } + + return false; +} + +bool MachoWalker::WalkHeaderAtOffset(off_t offset) { + struct mach_header header; + if (!ReadBytes(&header, sizeof(header), offset)) + return false; + + bool swap = (header.magic == MH_CIGAM); + if (swap) + swap_mach_header(&header, NXHostByteOrder()); + + // Copy the data into the mach_header_64 structure. Since the 32-bit and + // 64-bit only differ in the last field (reserved), this is safe to do. + struct mach_header_64 header64; + memcpy((void *)&header64, (const void *)&header, sizeof(header)); + header64.reserved = 0; + + current_header_ = &header64; + current_header_size_ = sizeof(header); // 32-bit, not 64-bit + current_header_offset_ = offset; + offset += current_header_size_; + bool result = WalkHeaderCore(offset, header.ncmds, swap); + current_header_ = NULL; + current_header_size_ = 0; + current_header_offset_ = 0; + return result; +} + +bool MachoWalker::WalkHeader64AtOffset(off_t offset) { + struct mach_header_64 header; + if (!ReadBytes(&header, sizeof(header), offset)) + return false; + + bool swap = (header.magic == MH_CIGAM_64); + if (swap) + breakpad_swap_mach_header_64(&header, NXHostByteOrder()); + + current_header_ = &header; + current_header_size_ = sizeof(header); + current_header_offset_ = offset; + offset += current_header_size_; + bool result = WalkHeaderCore(offset, header.ncmds, swap); + current_header_ = NULL; + current_header_size_ = 0; + current_header_offset_ = 0; + return result; +} + +bool MachoWalker::WalkHeaderCore(off_t offset, uint32_t number_of_commands, + bool swap) { + for (uint32_t i = 0; i < number_of_commands; ++i) { + struct load_command cmd; + if (!ReadBytes(&cmd, sizeof(cmd), offset)) + return false; + + if (swap) + swap_load_command(&cmd, NXHostByteOrder()); + + // Call the user callback + if (callback_ && !callback_(this, &cmd, offset, swap, callback_context_)) + break; + + offset += cmd.cmdsize; + } + + return true; +} + +} // namespace MacFileUtilities diff --git a/thirdparty/google-breakpad/r318/src/common/mac/macho_walker.h b/thirdparty/google-breakpad/r318/src/common/mac/macho_walker.h new file mode 100644 index 00000000..6445a4f4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/macho_walker.h @@ -0,0 +1,106 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_walker.h: Iterate over the load commands in a mach-o file +// +// Author: Dan Waylonis + +#ifndef COMMON_MAC_MACHO_WALKER_H__ +#define COMMON_MAC_MACHO_WALKER_H__ + +#include +#include + +namespace MacFileUtilities { + +class MachoWalker { + public: + // A callback function executed when a new load command is read. If no + // further processing of load commands is desired, return false. Otherwise, + // return true. + // |cmd| is the current command, and |offset| is the location relative to the + // beginning of the file (not header) where the command was read. If |swap| + // is set, then any command data (other than the returned load_command) should + // be swapped when read + typedef bool (*LoadCommandCallback)(MachoWalker *walker, load_command *cmd, + off_t offset, bool swap, void *context); + + MachoWalker(const char *path, LoadCommandCallback callback, void *context); + MachoWalker(int file_descriptor, LoadCommandCallback callback, void *context); + ~MachoWalker(); + + // Begin walking the header for |cpu_type|. If |cpu_type| is 0, then the + // native cpu type is used. Otherwise, accepted values are listed in + // /usr/include/mach/machine.h (e.g., CPU_TYPE_X86 or CPU_TYPE_POWERPC). + // Returns false if opening the file failed or if the |cpu_type| is not + // present in the file. + bool WalkHeader(int cpu_type); + + // Locate (if any) the header offset for |cpu_type| and return in |offset|. + // Return true if found, false otherwise. + bool FindHeader(int cpu_type, off_t &offset); + + // Read |size| bytes from the opened file at |offset| into |buffer| + bool ReadBytes(void *buffer, size_t size, off_t offset); + + // Return the current header and header offset + bool CurrentHeader(struct mach_header_64 *header, off_t *offset); + + private: + // Validate the |cpu_type| + int ValidateCPUType(int cpu_type); + + // Process an individual header starting at |offset| from the start of the + // file. Return true if successful, false otherwise. + bool WalkHeaderAtOffset(off_t offset); + bool WalkHeader64AtOffset(off_t offset); + + // Bottleneck for walking the load commands + bool WalkHeaderCore(off_t offset, uint32_t number_of_commands, bool swap); + + // File descriptor to the opened file + int file_; + + // User specified callback & context + LoadCommandCallback callback_; + void *callback_context_; + + // Current header, size, and offset. The mach_header_64 is used for both + // 32-bit and 64-bit headers because they only differ in their last field + // (reserved). By adding the |current_header_size_| and the + // |current_header_offset_|, you can determine the offset in the file just + // after the header. + struct mach_header_64 *current_header_; + unsigned long current_header_size_; + off_t current_header_offset_; +}; + +} // namespace MacFileUtilities + +#endif // COMMON_MAC_MACHO_WALKER_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/mac/string_utilities.cc b/thirdparty/google-breakpad/r318/src/common/mac/string_utilities.cc new file mode 100644 index 00000000..bdf3336c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/string_utilities.cc @@ -0,0 +1,84 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "processor/scoped_ptr.h" +#include "common/mac/string_utilities.h" + +namespace MacStringUtils { + +using google_breakpad::scoped_array; + +std::string ConvertToString(CFStringRef str) { + CFIndex length = CFStringGetLength(str); + std::string result; + + if (!length) + return result; + + CFIndex maxUTF8Length = + CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8); + scoped_array buffer(new UInt8[maxUTF8Length + 1]); + CFIndex actualUTF8Length; + CFStringGetBytes(str, CFRangeMake(0, length), kCFStringEncodingUTF8, 0, + false, buffer.get(), maxUTF8Length, &actualUTF8Length); + buffer[actualUTF8Length] = 0; + result.assign((const char *)buffer.get()); + + return result; +} + +unsigned int IntegerValueAtIndex(string &str, unsigned int idx) { + string digits("0123456789"), temp; + unsigned int start = 0; + unsigned int end; + unsigned int found = 0; + unsigned int result = 0; + + for (; found <= idx; ++found) { + end = str.find_first_not_of(digits, start); + + if (end == string::npos) + end = str.size(); + + temp = str.substr(start, end - start); + + if (found == idx) { + result = atoi(temp.c_str()); + } + + start = str.find_first_of(digits, end + 1); + + if (start == string::npos) + break; + } + + return result; +} + +} // namespace MacStringUtils diff --git a/thirdparty/google-breakpad/r318/src/common/mac/string_utilities.h b/thirdparty/google-breakpad/r318/src/common/mac/string_utilities.h new file mode 100644 index 00000000..6d89c834 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/mac/string_utilities.h @@ -0,0 +1,52 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// string_utilities.h: Utilities for strings for Mac platform + +#ifndef COMMON_MAC_STRING_UTILITIES_H__ +#define COMMON_MAC_STRING_UTILITIES_H__ + +#include + +#include + +namespace MacStringUtils { + +using std::string; + +// Convert a CoreFoundation string into a std::string +string ConvertToString(CFStringRef str); + +// Return the idx'th decimal integer in str, separated by non-decimal-digits +// E.g., str = 10.4.8, idx = 1 -> 4 +unsigned int IntegerValueAtIndex(string &str, unsigned int idx); + +} // namespace MacStringUtils + +#endif // COMMON_MAC_STRING_UTILITIES_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/md5.c b/thirdparty/google-breakpad/r318/src/common/md5.c new file mode 100644 index 00000000..7fc198af --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/md5.c @@ -0,0 +1,246 @@ +/* + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +#include + +#include "common/md5.h" + +#ifndef WORDS_BIGENDIAN +#define byteReverse(buf, len) /* Nothing */ +#else +/* + * Note: this code is harmless on little-endian machines. + */ +static void byteReverse(unsigned char *buf, unsigned longs) +{ + u32 t; + do { + t = (u32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(u32 *) buf = t; + buf += 4; + } while (--longs); +} +#endif + +static void MD5Transform(u32 buf[4], u32 const in[16]); + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +void MD5Init(struct MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) +{ + u32 t; + + /* Update bitcount */ + + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((u32) len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if (t) { + unsigned char *p = (unsigned char *) ctx->in + t; + + t = 64 - t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (u32 *) ctx->in); + buf += t; + len -= t; + } + /* Process data in 64-byte chunks */ + + while (len >= 64) { + memcpy(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (u32 *) ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + memcpy(ctx->in, buf, len); +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +void MD5Final(unsigned char digest[16], struct MD5Context *ctx) +{ + unsigned count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (u32 *) ctx->in); + + /* Now fill the next block with 56 bytes */ + memset(ctx->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); + } + byteReverse(ctx->in, 14); + + /* Append length in bits and transform */ + ((u32 *) ctx->in)[14] = ctx->bits[0]; + ((u32 *) ctx->in)[15] = ctx->bits[1]; + + MD5Transform(ctx->buf, (u32 *) ctx->in); + byteReverse((unsigned char *) ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ +} + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void MD5Transform(u32 buf[4], u32 const in[16]) +{ + register u32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} diff --git a/thirdparty/google-breakpad/r318/src/common/md5.h b/thirdparty/google-breakpad/r318/src/common/md5.h new file mode 100644 index 00000000..dbf4893c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/md5.h @@ -0,0 +1,31 @@ +// Copyright 2007 Google Inc. All Rights Reserved. +// Author: liuli@google.com (Liu Li) +#ifndef COMMON_MD5_H__ +#define COMMON_MD5_H__ + +#include + +typedef uint32_t u32; +typedef uint8_t u8; + +struct MD5Context { + u32 buf[4]; + u32 bits[2]; + u8 in[64]; +}; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +void MD5Init(struct MD5Context *ctx); + +void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len); + +void MD5Final(unsigned char digest[16], struct MD5Context *ctx); + +#ifdef __cplusplus +} +#endif + +#endif // COMMON_MD5_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/solaris/dump_symbols.cc b/thirdparty/google-breakpad/r318/src/common/solaris/dump_symbols.cc new file mode 100644 index 00000000..816d744c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/solaris/dump_symbols.cc @@ -0,0 +1,681 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "common/solaris/dump_symbols.h" +#include "common/solaris/file_id.h" +#include "common/solaris/guid_creator.h" +#include "processor/scoped_ptr.h" + +// This namespace contains helper functions. +namespace { + +using std::make_pair; + +#if defined(_LP64) +typedef Elf64_Sym Elf_Sym; +#else +typedef Elf32_Sym Elf_Sym; +#endif + +// Symbol table entry from stabs. Sun CC specific. +struct slist { + // String table index. + unsigned int n_strx; + // Stab type. + unsigned char n_type; + char n_other; + short n_desc; + unsigned long n_value; +}; + +// Symbol table entry +struct SymbolEntry { + // Offset from the start of the file. + GElf_Addr offset; + // Function size. + GElf_Word size; +}; + +// Infomation of a line. +struct LineInfo { + // Offset from start of the function. + // Load from stab symbol. + GElf_Off rva_to_func; + // Offset from base of the loading binary. + GElf_Off rva_to_base; + // Size of the line. + // The first line: equals to rva_to_func. + // The other lines: the difference of rva_to_func of the line and + // rva_to_func of the previous N_SLINE. + uint32_t size; + // Line number. + uint32_t line_num; +}; + +// Information of a function. +struct FuncInfo { + // Name of the function. + const char *name; + // Offset from the base of the loading address. + GElf_Off rva_to_base; + // Virtual address of the function. + // Load from stab symbol. + GElf_Addr addr; + // Size of the function. + // Equal to rva_to_func of the last function line. + uint32_t size; + // Total size of stack parameters. + uint32_t stack_param_size; + // Line information array. + std::vector line_info; +}; + +// Information of a source file. +struct SourceFileInfo { + // Name of the source file. + const char *name; + // Starting address of the source file. + GElf_Addr addr; + // Id of the source file. + int source_id; + // Functions information. + std::vector func_info; +}; + +struct CompareString { + bool operator()(const char *s1, const char *s2) const { + return strcmp(s1, s2) < 0; + } +}; + +typedef std::map SymbolMap; + +// Information of a symbol table. +// This is the root of all types of symbol. +struct SymbolInfo { + std::vector source_file_info; + // Symbols information. + SymbolMap symbol_entries; +}; + +// Stab section name. +const char *kStabName = ".stab"; + +// Stab str section name. +const char *kStabStrName = ".stabstr"; + +// Symtab section name. +const char *kSymtabName = ".symtab"; + +// Strtab section name. +const char *kStrtabName = ".strtab"; + +// Default buffer lenght for demangle. +const int demangleLen = 20000; + +// Offset to the string table. +u_int64_t stringOffset = 0; + +// Update the offset to the start of the string index of the next +// object module for every N_ENDM stabs. +inline void RecalculateOffset(struct slist* cur_list, char *stabstr) { + while ((--cur_list)->n_strx == 0) ; + stringOffset += cur_list->n_strx; + + char *temp = stabstr + stringOffset; + while (*temp != '\0') { + ++stringOffset; + ++temp; + } + // Skip the extra '\0' + ++stringOffset; +} + +// Demangle using demangle library on Solaris. +std::string Demangle(const char *mangled) { + int status = 0; + std::string str(mangled); + char *demangled = (char *)malloc(demangleLen); + + if (!demangled) { + fprintf(stderr, "no enough memory.\n"); + goto out; + } + + if ((status = cplus_demangle(mangled, demangled, demangleLen)) == + DEMANGLE_ESPACE) { + fprintf(stderr, "incorrect demangle.\n"); + goto out; + } + + str = demangled; + free(demangled); + +out: + return str; +} + +bool WriteFormat(int fd, const char *fmt, ...) { + va_list list; + char buffer[4096]; + ssize_t expected, written; + va_start(list, fmt); + vsnprintf(buffer, sizeof(buffer), fmt, list); + expected = strlen(buffer); + written = write(fd, buffer, strlen(buffer)); + va_end(list); + return expected == written; +} + +bool IsValidElf(const GElf_Ehdr *elf_header) { + return memcmp(elf_header, ELFMAG, SELFMAG) == 0; +} + +static bool FindSectionByName(Elf *elf, const char *name, + int shstrndx, + GElf_Shdr *shdr) { + assert(name != NULL); + + if (strlen(name) == 0) + return false; + + Elf_Scn *scn = NULL; + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + if (gelf_getshdr(scn, shdr) == (GElf_Shdr *)0) { + fprintf(stderr, "failed to read section header: %s\n", elf_errmsg(0)); + return false; + } + + const char *section_name = elf_strptr(elf, shstrndx, shdr->sh_name); + if (!section_name) { + fprintf(stderr, "Section name error: %s\n", elf_errmsg(-1)); + continue; + } + + if (strcmp(section_name, name) == 0) + return true; + } + + return false; +} + +// The parameter size is used for FPO-optimized code, and +// this is all tied up with the debugging data for Windows x86. +// Set it to 0 on Solaris. +int LoadStackParamSize(struct slist *list, + struct slist *list_end, + struct FuncInfo *func_info) { + struct slist *cur_list = list; + int step = 1; + while (cur_list < list_end && cur_list->n_type == N_PSYM) { + ++cur_list; + ++step; + } + + func_info->stack_param_size = 0; + return step; +} + +int LoadLineInfo(struct slist *list, + struct slist *list_end, + struct FuncInfo *func_info) { + struct slist *cur_list = list; + do { + // Skip non line information. + while (cur_list < list_end && cur_list->n_type != N_SLINE) { + // Only exit when got another function, or source file, or end stab. + if (cur_list->n_type == N_FUN || cur_list->n_type == N_SO || + cur_list->n_type == N_ENDM) { + return cur_list - list; + } + ++cur_list; + } + struct LineInfo line; + while (cur_list < list_end && cur_list->n_type == N_SLINE) { + line.rva_to_func = cur_list->n_value; + // n_desc is a signed short + line.line_num = (unsigned short)cur_list->n_desc; + func_info->line_info.push_back(line); + ++cur_list; + } + if (cur_list == list_end && cur_list->n_type == N_ENDM) + break; + } while (list < list_end); + + return cur_list - list; +} + +int LoadFuncSymbols(struct slist *list, + struct slist *list_end, + char *stabstr, + GElf_Word base, + struct SourceFileInfo *source_file_info) { + struct slist *cur_list = list; + assert(cur_list->n_type == N_SO); + ++cur_list; + + source_file_info->func_info.clear(); + while (cur_list < list_end) { + // Go until the function symbol. + while (cur_list < list_end && cur_list->n_type != N_FUN) { + if (cur_list->n_type == N_SO) { + return cur_list - list; + } + ++cur_list; + if (cur_list->n_type == N_ENDM) + RecalculateOffset(cur_list, stabstr); + continue; + } + while (cur_list->n_type == N_FUN) { + struct FuncInfo func_info; + memset(&func_info, 0, sizeof(func_info)); + func_info.name = stabstr + cur_list->n_strx + stringOffset; + // The n_value field is always 0 from stab generated by Sun CC. + // TODO(Alfred): Find the correct value. + func_info.addr = cur_list->n_value; + ++cur_list; + if (cur_list->n_type == N_ENDM) + RecalculateOffset(cur_list, stabstr); + if (cur_list->n_type != N_ESYM && cur_list->n_type != N_ISYM && + cur_list->n_type != N_FUN) { + // Stack parameter size. + cur_list += LoadStackParamSize(cur_list, list_end, &func_info); + // Line info. + cur_list += LoadLineInfo(cur_list, list_end, &func_info); + } + if (cur_list < list_end && cur_list->n_type == N_ENDM) + RecalculateOffset(cur_list, stabstr); + // Functions in this module should have address bigger than the module + // starting address. + // + // These two values are always 0 with Sun CC. + // TODO(Alfred): Get the correct value or remove the condition statement. + if (func_info.addr >= source_file_info->addr) { + source_file_info->func_info.push_back(func_info); + } + } + } + return cur_list - list; +} + +// Compute size and rva information based on symbols loaded from stab section. +bool ComputeSizeAndRVA(struct SymbolInfo *symbols) { + std::vector *sorted_files = + &(symbols->source_file_info); + SymbolMap *symbol_entries = &(symbols->symbol_entries); + for (size_t i = 0; i < sorted_files->size(); ++i) { + struct SourceFileInfo &source_file = (*sorted_files)[i]; + std::vector *sorted_functions = &(source_file.func_info); + int func_size = sorted_functions->size(); + + for (size_t j = 0; j < func_size; ++j) { + struct FuncInfo &func_info = (*sorted_functions)[j]; + int line_count = func_info.line_info.size(); + + // Discard the ending part of the name. + std::string func_name(func_info.name); + std::string::size_type last_colon = func_name.find_first_of(':'); + if (last_colon != std::string::npos) + func_name = func_name.substr(0, last_colon); + + // Fine the symbol offset from the loading address and size by name. + SymbolMap::const_iterator it = symbol_entries->find(func_name.c_str()); + if (it->second) { + func_info.rva_to_base = it->second->offset; + func_info.size = (line_count == 0) ? 0 : it->second->size; + } else { + func_info.rva_to_base = 0; + func_info.size = 0; + } + + // Compute function and line size. + for (size_t k = 0; k < line_count; ++k) { + struct LineInfo &line_info = func_info.line_info[k]; + + line_info.rva_to_base = line_info.rva_to_func + func_info.rva_to_base; + if (k == line_count - 1) { + line_info.size = func_info.size - line_info.rva_to_func; + } else { + struct LineInfo &next_line = func_info.line_info[k + 1]; + line_info.size = next_line.rva_to_func - line_info.rva_to_func; + } + } // for each line. + } // for each function. + } // for each source file. + for (SymbolMap::iterator it = symbol_entries->begin(); + it != symbol_entries->end(); ++it) { + free(it->second); + } + return true; +} + +bool LoadAllSymbols(const GElf_Shdr *stab_section, + const GElf_Shdr *stabstr_section, + GElf_Word base, + struct SymbolInfo *symbols) { + if (stab_section == NULL || stabstr_section == NULL) + return false; + + char *stabstr = + reinterpret_cast(stabstr_section->sh_offset + base); + struct slist *lists = + reinterpret_cast(stab_section->sh_offset + base); + int nstab = stab_section->sh_size / sizeof(struct slist); + int source_id = 0; + + // First pass, load all symbols from the object file. + for (int i = 0; i < nstab; ) { + int step = 1; + struct slist *cur_list = lists + i; + if (cur_list->n_type == N_SO) { + // FUNC
      + struct SourceFileInfo source_file_info; + source_file_info.name = stabstr + cur_list->n_strx + stringOffset; + // The n_value field is always 0 from stab generated by Sun CC. + // TODO(Alfred): Find the correct value. + source_file_info.addr = cur_list->n_value; + if (strchr(source_file_info.name, '.')) + source_file_info.source_id = source_id++; + else + source_file_info.source_id = -1; + step = LoadFuncSymbols(cur_list, lists + nstab - 1, stabstr, + base, &source_file_info); + symbols->source_file_info.push_back(source_file_info); + } + i += step; + } + // Second pass, compute the size of functions and lines. + return ComputeSizeAndRVA(symbols); +} + +bool LoadSymbols(Elf *elf, GElf_Ehdr *elf_header, struct SymbolInfo *symbols, + void *obj_base) { + GElf_Word base = reinterpret_cast(obj_base); + + const GElf_Shdr *sections = + reinterpret_cast(elf_header->e_shoff + base); + GElf_Shdr stab_section; + if (!FindSectionByName(elf, kStabName, elf_header->e_shstrndx, + &stab_section)) { + fprintf(stderr, "Stab section not found.\n"); + return false; + } + GElf_Shdr stabstr_section; + if (!FindSectionByName(elf, kStabStrName, elf_header->e_shstrndx, + &stabstr_section)) { + fprintf(stderr, "Stabstr section not found.\n"); + return false; + } + GElf_Shdr symtab_section; + if (!FindSectionByName(elf, kSymtabName, elf_header->e_shstrndx, + &symtab_section)) { + fprintf(stderr, "Symtab section not found.\n"); + return false; + } + GElf_Shdr strtab_section; + if (!FindSectionByName(elf, kStrtabName, elf_header->e_shstrndx, + &strtab_section)) { + fprintf(stderr, "Strtab section not found.\n"); + return false; + } + + Elf_Sym *symbol = (Elf_Sym *)((char *)base + symtab_section.sh_offset); + for (int i = 0; i < symtab_section.sh_size/symtab_section.sh_entsize; ++i) { + struct SymbolEntry *symbol_entry = + (struct SymbolEntry *)malloc(sizeof(struct SymbolEntry)); + const char *name = reinterpret_cast( + strtab_section.sh_offset + (GElf_Word)base + symbol->st_name); + symbol_entry->offset = symbol->st_value; + symbol_entry->size = symbol->st_size; + symbols->symbol_entries.insert(make_pair(name, symbol_entry)); + ++symbol; + } + + + // Load symbols. + return LoadAllSymbols(&stab_section, &stabstr_section, base, symbols); +} + +bool WriteModuleInfo(int fd, GElf_Half arch, const std::string &obj_file) { + const char *arch_name = NULL; + if (arch == EM_386) + arch_name = "x86"; + else if (arch == EM_X86_64) + arch_name = "x86_64"; + else if (arch == EM_SPARC32PLUS) + arch_name = "SPARC_32+"; + else { + printf("Please add more ARCH support\n"); + return false; + } + + unsigned char identifier[16]; + google_breakpad::FileID file_id(obj_file.c_str()); + if (file_id.ElfFileIdentifier(identifier)) { + char identifier_str[40]; + file_id.ConvertIdentifierToString(identifier, + identifier_str, sizeof(identifier_str)); + std::string filename = obj_file; + size_t slash_pos = obj_file.find_last_of("/"); + if (slash_pos != std::string::npos) + filename = obj_file.substr(slash_pos + 1); + return WriteFormat(fd, "MODULE solaris %s %s %s\n", arch_name, + identifier_str, filename.c_str()); + } + return false; +} + +bool WriteSourceFileInfo(int fd, const struct SymbolInfo &symbols) { + for (size_t i = 0; i < symbols.source_file_info.size(); ++i) { + if (symbols.source_file_info[i].source_id != -1) { + const char *name = symbols.source_file_info[i].name; + if (!WriteFormat(fd, "FILE %d %s\n", + symbols.source_file_info[i].source_id, name)) + return false; + } + } + return true; +} + +bool WriteOneFunction(int fd, int source_id, + const struct FuncInfo &func_info){ + // Discard the ending part of the name. + std::string func_name(func_info.name); + std::string::size_type last_colon = func_name.find_last_of(':'); + if (last_colon != std::string::npos) + func_name = func_name.substr(0, last_colon); + func_name = Demangle(func_name.c_str()); + + if (func_info.size <= 0) + return true; + + // rva_to_base could be unsigned long(32 bit) or unsigned long long(64 bit). + if (WriteFormat(fd, "FUNC %llx %x %d %s\n", + (long long)func_info.rva_to_base, + func_info.size, + func_info.stack_param_size, + func_name.c_str())) { + for (size_t i = 0; i < func_info.line_info.size(); ++i) { + const struct LineInfo &line_info = func_info.line_info[i]; + if (line_info.line_num == 0) + return true; + if (!WriteFormat(fd, "%llx %x %d %d\n", + (long long)line_info.rva_to_base, + line_info.size, + line_info.line_num, + source_id)) + return false; + } + return true; + } + return false; +} + +bool WriteFunctionInfo(int fd, const struct SymbolInfo &symbols) { + for (size_t i = 0; i < symbols.source_file_info.size(); ++i) { + const struct SourceFileInfo &file_info = symbols.source_file_info[i]; + for (size_t j = 0; j < file_info.func_info.size(); ++j) { + const struct FuncInfo &func_info = file_info.func_info[j]; + if (!WriteOneFunction(fd, file_info.source_id, func_info)) + return false; + } + } + return true; +} + +bool DumpStabSymbols(int fd, const struct SymbolInfo &symbols) { + return WriteSourceFileInfo(fd, symbols) && + WriteFunctionInfo(fd, symbols); +} + +// +// FDWrapper +// +// Wrapper class to make sure opened file is closed. +// +class FDWrapper { + public: + explicit FDWrapper(int fd) : + fd_(fd) { + } + ~FDWrapper() { + if (fd_ != -1) + close(fd_); + } + int get() { + return fd_; + } + int release() { + int fd = fd_; + fd_ = -1; + return fd; + } + private: + int fd_; +}; + +// +// MmapWrapper +// +// Wrapper class to make sure mapped regions are unmapped. +// +class MmapWrapper { + public: + MmapWrapper(void *mapped_address, size_t mapped_size) : + base_(mapped_address), size_(mapped_size) { + } + ~MmapWrapper() { + if (base_ != NULL) { + assert(size_ > 0); + munmap((char *)base_, size_); + } + } + void release() { + base_ = NULL; + size_ = 0; + } + + private: + void *base_; + size_t size_; +}; + +} // namespace + +namespace google_breakpad { + +class AutoElfEnder { + public: + AutoElfEnder(Elf *elf) : elf_(elf) {} + ~AutoElfEnder() { if (elf_) elf_end(elf_); } + private: + Elf *elf_; +}; + + +bool DumpSymbols::WriteSymbolFile(const std::string &obj_file, int sym_fd) { + if (elf_version(EV_CURRENT) == EV_NONE) { + fprintf(stderr, "elf_version() failed: %s\n", elf_errmsg(0)); + return false; + } + + int obj_fd = open(obj_file.c_str(), O_RDONLY); + if (obj_fd < 0) + return false; + FDWrapper obj_fd_wrapper(obj_fd); + struct stat st; + if (fstat(obj_fd, &st) != 0 && st.st_size <= 0) + return false; + void *obj_base = mmap(NULL, st.st_size, + PROT_READ, MAP_PRIVATE, obj_fd, 0); + if (obj_base == MAP_FAILED)) + return false; + MmapWrapper map_wrapper(obj_base, st.st_size); + GElf_Ehdr elf_header; + Elf *elf = elf_begin(obj_fd, ELF_C_READ, NULL); + AutoElfEnder elfEnder(elf); + + if (gelf_getehdr(elf, &elf_header) == (GElf_Ehdr *)NULL) { + fprintf(stderr, "failed to read elf header: %s\n", elf_errmsg(-1)); + return false; + } + + if (!IsValidElf(&elf_header)) { + fprintf(stderr, "header magic doesn't match\n"); + return false; + } + struct SymbolInfo symbols; + if (!LoadSymbols(elf, &elf_header, &symbols, obj_base)) + return false; + // Write to symbol file. + if (WriteModuleInfo(sym_fd, elf_header.e_machine, obj_file) && + DumpStabSymbols(sym_fd, symbols)) + return true; + + return false; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/common/solaris/dump_symbols.h b/thirdparty/google-breakpad/r318/src/common/solaris/dump_symbols.h new file mode 100644 index 00000000..7f4baadc --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/solaris/dump_symbols.h @@ -0,0 +1,49 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// dump_symbols.cc: Implements a Solaris stab debugging format dumper. +// +// Author: Alfred Peng + +#ifndef COMMON_SOLARIS_DUMP_SYMBOLS_H__ +#define COMMON_SOLARIS_DUMP_SYMBOLS_H__ + +#include + +namespace google_breakpad { + +class DumpSymbols { + public: + bool WriteSymbolFile(const std::string &obj_file, + int sym_fd); +}; + +} // namespace google_breakpad + +#endif // COMMON_SOLARIS_DUMP_SYMBOLS_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/solaris/file_id.cc b/thirdparty/google-breakpad/r318/src/common/solaris/file_id.cc new file mode 100644 index 00000000..643a1462 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/solaris/file_id.cc @@ -0,0 +1,197 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// file_id.cc: Return a unique identifier for a file +// +// See file_id.h for documentation +// +// Author: Alfred Peng + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "common/md5.h" +#include "common/solaris/file_id.h" +#include "common/solaris/message_output.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +class AutoElfEnder { + public: + AutoElfEnder(Elf *elf) : elf_(elf) {} + ~AutoElfEnder() { if (elf_) elf_end(elf_); } + private: + Elf *elf_; +}; + +// Find the text section in elf object file. +// Return the section start address and the size. +static bool FindElfTextSection(int fd, const void *elf_base, + const void **text_start, + int *text_size) { + assert(text_start); + assert(text_size); + + *text_start = NULL; + *text_size = 0; + + if (elf_version(EV_CURRENT) == EV_NONE) { + print_message2(2, "elf_version() failed: %s\n", elf_errmsg(0)); + return false; + } + + GElf_Ehdr elf_header; + lseek(fd, 0L, 0); + Elf *elf = elf_begin(fd, ELF_C_READ, NULL); + AutoElfEnder elfEnder(elf); + + if (gelf_getehdr(elf, &elf_header) == (GElf_Ehdr *)NULL) { + print_message2(2, "failed to read elf header: %s\n", elf_errmsg(-1)); + return false; + } + + if (elf_header.e_ident[EI_MAG0] != ELFMAG0 || + elf_header.e_ident[EI_MAG1] != ELFMAG1 || + elf_header.e_ident[EI_MAG2] != ELFMAG2 || + elf_header.e_ident[EI_MAG3] != ELFMAG3) { + print_message1(2, "header magic doesn't match\n"); + return false; + } + + static const char kTextSectionName[] = ".text"; + const GElf_Shdr *text_section = NULL; + Elf_Scn *scn = NULL; + GElf_Shdr shdr; + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + if (gelf_getshdr(scn, &shdr) == (GElf_Shdr *)0) { + print_message2(2, "failed to read section header: %s\n", elf_errmsg(0)); + return false; + } + + if (shdr.sh_type == SHT_PROGBITS) { + const char *section_name = elf_strptr(elf, elf_header.e_shstrndx, + shdr.sh_name); + if (!section_name) { + print_message2(2, "Section name error: %s\n", elf_errmsg(-1)); + continue; + } + + if (strcmp(section_name, kTextSectionName) == 0) { + text_section = &shdr; + break; + } + } + } + if (text_section != NULL && text_section->sh_size > 0) { + *text_start = (char *)elf_base + text_section->sh_offset; + *text_size = text_section->sh_size; + return true; + } + + return false; +} + +FileID::FileID(const char *path) { + strcpy(path_, path); +} + +class AutoCloser { + public: + AutoCloser(int fd) : fd_(fd) {} + ~AutoCloser() { if (fd_) close(fd_); } + private: + int fd_; +}; + +bool FileID::ElfFileIdentifier(unsigned char identifier[16]) { + int fd = 0; + if ((fd = open(path_, O_RDONLY)) < 0) + return false; + + AutoCloser autocloser(fd); + struct stat st; + if (fstat(fd, &st) != 0 || st.st_size <= 0) + return false; + + void *base = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (base == MAP_FAILED) + return false; + + bool success = false; + const void *text_section = NULL; + int text_size = 0; + + if (FindElfTextSection(fd, base, &text_section, &text_size)) { + MD5Context md5; + MD5Init(&md5); + MD5Update(&md5, (const unsigned char *)text_section, text_size); + MD5Final(identifier, &md5); + success = true; + } + + munmap((char *)base, st.st_size); + return success; +} + +// static +bool FileID::ConvertIdentifierToString(const unsigned char identifier[16], + char *buffer, int buffer_length) { + if (buffer_length < 34) + return false; + + int buffer_idx = 0; + for (int idx = 0; idx < 16; ++idx) { + int hi = (identifier[idx] >> 4) & 0x0F; + int lo = (identifier[idx]) & 0x0F; + + buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi; + buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo; + } + + // Add an extra "0" by the end. + buffer[buffer_idx++] = '0'; + + // NULL terminate + buffer[buffer_idx] = 0; + + return true; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/common/solaris/file_id.h b/thirdparty/google-breakpad/r318/src/common/solaris/file_id.h new file mode 100644 index 00000000..375e8575 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/solaris/file_id.h @@ -0,0 +1,66 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// file_id.h: Return a unique identifier for a file +// +// Author: Alfred Peng + +#ifndef COMMON_SOLARIS_FILE_ID_H__ +#define COMMON_SOLARIS_FILE_ID_H__ + +#include + +namespace google_breakpad { + +class FileID { + public: + FileID(const char *path); + ~FileID() {}; + + // Load the identifier for the elf file path specified in the constructor into + // |identifier|. Return false if the identifier could not be created for the + // file. + // The current implementation will return the MD5 hash of the file's bytes. + bool ElfFileIdentifier(unsigned char identifier[16]); + + // Convert the |identifier| data to a NULL terminated string. The string will + // be formatted as a MDCVInfoPDB70 struct. + // The |buffer| should be at least 34 bytes long to receive all of the data + // and termination. Shorter buffers will return false. + static bool ConvertIdentifierToString(const unsigned char identifier[16], + char *buffer, int buffer_length); + + private: + // Storage for the path specified + char path_[PATH_MAX]; +}; + +} // namespace google_breakpad + +#endif // COMMON_SOLARIS_FILE_ID_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/solaris/guid_creator.cc b/thirdparty/google-breakpad/r318/src/common/solaris/guid_creator.cc new file mode 100644 index 00000000..70940259 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/solaris/guid_creator.cc @@ -0,0 +1,84 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#include +#include + +#include +#include +#include + +#include "common/solaris/guid_creator.h" + +// +// GUIDGenerator +// +// This class is used to generate random GUID. +// Currently use random number to generate a GUID. This should be OK since +// we don't expect crash to happen very offen. +// +class GUIDGenerator { + public: + GUIDGenerator() { + srandom(time(NULL)); + } + + bool CreateGUID(GUID *guid) const { + guid->data1 = random(); + guid->data2 = (u_int16_t)(random()); + guid->data3 = (u_int16_t)(random()); + *reinterpret_cast(&guid->data4[0]) = random(); + *reinterpret_cast(&guid->data4[4]) = random(); + return true; + } +}; + +// Guid generator. +const GUIDGenerator kGuidGenerator; + +bool CreateGUID(GUID *guid) { + return kGuidGenerator.CreateGUID(guid); +}; + +// Parse guid to string. +bool GUIDToString(const GUID *guid, char *buf, int buf_len) { + // Should allow more space the the max length of GUID. + assert(buf_len > kGUIDStringLength); + int num = snprintf(buf, buf_len, kGUIDFormatString, + guid->data1, guid->data2, guid->data3, + *reinterpret_cast(&(guid->data4[0])), + *reinterpret_cast(&(guid->data4[4]))); + if (num != kGUIDStringLength) + return false; + + buf[num] = '\0'; + return true; +} diff --git a/thirdparty/google-breakpad/r318/src/common/solaris/guid_creator.h b/thirdparty/google-breakpad/r318/src/common/solaris/guid_creator.h new file mode 100644 index 00000000..4aee3a1c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/solaris/guid_creator.h @@ -0,0 +1,50 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifndef COMMON_SOLARIS_GUID_CREATOR_H__ +#define COMMON_SOLARIS_GUID_CREATOR_H__ + +#include "google_breakpad/common/minidump_format.h" + +typedef MDGUID GUID; + +// Format string for parsing GUID. +#define kGUIDFormatString "%08x-%04x-%04x-%08x-%08x" +// Length of GUID string. Don't count the ending '\0'. +#define kGUIDStringLength 36 + +// Create a guid. +bool CreateGUID(GUID *guid); + +// Get the string from guid. +bool GUIDToString(const GUID *guid, char *buf, int buf_len); + +#endif // COMMON_SOLARIS_GUID_CREATOR_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/solaris/message_output.h b/thirdparty/google-breakpad/r318/src/common/solaris/message_output.h new file mode 100644 index 00000000..3e3b1d46 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/solaris/message_output.h @@ -0,0 +1,54 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifndef COMMON_SOLARIS_MESSAGE_OUTPUT_H__ +#define COMMON_SOLARIS_MESSAGE_OUTPUT_H__ + +namespace google_breakpad { + +const int MESSAGE_MAX = 1000; + +// Message output macros. +// snprintf doesn't operate heap on Solaris, while printf and fprintf do. +// Use snprintf here to avoid heap allocation. +#define print_message1(std, message) \ + char buffer[MESSAGE_MAX]; \ + int len = snprintf(buffer, MESSAGE_MAX, message); \ + write(std, buffer, len) + +#define print_message2(std, message, para) \ + char buffer[MESSAGE_MAX]; \ + int len = snprintf(buffer, MESSAGE_MAX, message, para); \ + write(std, buffer, len); + +} // namespace google_breakpad + +#endif // COMMON_SOLARIS_MESSAGE_OUTPUT_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/string_conversion.cc b/thirdparty/google-breakpad/r318/src/common/string_conversion.cc new file mode 100644 index 00000000..50054ebc --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/string_conversion.cc @@ -0,0 +1,155 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "common/convert_UTF.h" +#include "processor/scoped_ptr.h" +#include "common/string_conversion.h" +#include + +namespace google_breakpad { + +using std::string; +using std::vector; + +void UTF8ToUTF16(const char *in, vector *out) { + size_t source_length = strlen(in); + const UTF8 *source_ptr = reinterpret_cast(in); + const UTF8 *source_end_ptr = source_ptr + source_length; + // Erase the contents and zero fill to the expected size + out->empty(); + out->insert(out->begin(), source_length, 0); + u_int16_t *target_ptr = &(*out)[0]; + u_int16_t *target_end_ptr = target_ptr + out->capacity() * sizeof(u_int16_t); + ConversionResult result = ConvertUTF8toUTF16(&source_ptr, source_end_ptr, + &target_ptr, target_end_ptr, + strictConversion); + + // Resize to be the size of the # of converted characters + NULL + out->resize(result == conversionOK ? target_ptr - &(*out)[0] + 1: 0); +} + +int UTF8ToUTF16Char(const char *in, int in_length, u_int16_t out[2]) { + const UTF8 *source_ptr = reinterpret_cast(in); + const UTF8 *source_end_ptr = source_ptr + sizeof(char); + u_int16_t *target_ptr = out; + u_int16_t *target_end_ptr = target_ptr + 2 * sizeof(u_int16_t); + out[0] = out[1] = 0; + + // Process one character at a time + while (1) { + ConversionResult result = ConvertUTF8toUTF16(&source_ptr, source_end_ptr, + &target_ptr, target_end_ptr, + strictConversion); + + if (result == conversionOK) + return source_ptr - reinterpret_cast(in); + + // Add another character to the input stream and try again + source_ptr = reinterpret_cast(in); + ++source_end_ptr; + + if (source_end_ptr > reinterpret_cast(in) + in_length) + break; + } + + return 0; +} + +void UTF32ToUTF16(const wchar_t *in, vector *out) { + size_t source_length = wcslen(in); + const UTF32 *source_ptr = reinterpret_cast(in); + const UTF32 *source_end_ptr = source_ptr + source_length; + // Erase the contents and zero fill to the expected size + out->empty(); + out->insert(out->begin(), source_length, 0); + u_int16_t *target_ptr = &(*out)[0]; + u_int16_t *target_end_ptr = target_ptr + out->capacity() * sizeof(u_int16_t); + ConversionResult result = ConvertUTF32toUTF16(&source_ptr, source_end_ptr, + &target_ptr, target_end_ptr, + strictConversion); + + // Resize to be the size of the # of converted characters + NULL + out->resize(result == conversionOK ? target_ptr - &(*out)[0] + 1: 0); +} + +void UTF32ToUTF16Char(wchar_t in, u_int16_t out[2]) { + const UTF32 *source_ptr = reinterpret_cast(&in); + const UTF32 *source_end_ptr = source_ptr + 1; + u_int16_t *target_ptr = out; + u_int16_t *target_end_ptr = target_ptr + 2 * sizeof(u_int16_t); + out[0] = out[1] = 0; + ConversionResult result = ConvertUTF32toUTF16(&source_ptr, source_end_ptr, + &target_ptr, target_end_ptr, + strictConversion); + + if (result != conversionOK) { + out[0] = out[1] = 0; + } +} + +static inline u_int16_t Swap(u_int16_t value) { + return (value >> 8) | (value << 8); +} + +string UTF16ToUTF8(const vector &in, bool swap) { + const UTF16 *source_ptr = &in[0]; + scoped_ptr source_buffer; + + // If we're to swap, we need to make a local copy and swap each byte pair + if (swap) { + int idx = 0; + source_buffer.reset(new u_int16_t[in.size()]); + UTF16 *source_buffer_ptr = source_buffer.get(); + for (vector::const_iterator it = in.begin(); + it != in.end(); ++it, ++idx) + source_buffer_ptr[idx] = Swap(*it); + + source_ptr = source_buffer.get(); + } + + // The maximum expansion would be 4x the size of the input string. + const UTF16 *source_end_ptr = source_ptr + in.size(); + int target_capacity = in.size() * 4; + scoped_array target_buffer(new UTF8[target_capacity]); + UTF8 *target_ptr = target_buffer.get(); + UTF8 *target_end_ptr = target_ptr + target_capacity; + ConversionResult result = ConvertUTF16toUTF8(&source_ptr, source_end_ptr, + &target_ptr, target_end_ptr, + strictConversion); + + if (result == conversionOK) { + const char *targetPtr = reinterpret_cast(target_buffer.get()); + string result(targetPtr); + return result; + } + + return ""; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/common/string_conversion.h b/thirdparty/google-breakpad/r318/src/common/string_conversion.h new file mode 100644 index 00000000..d51f46bb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/string_conversion.h @@ -0,0 +1,66 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// string_conversion.h: Conversion between different UTF-8/16/32 encodings. + +#ifndef COMMON_STRING_CONVERSION_H__ +#define COMMON_STRING_CONVERSION_H__ + +#include +#include +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::vector; + +// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the +// conversion failed, |out| will be zero length. +void UTF8ToUTF16(const char *in, vector *out); + +// Convert at least one character (up to a maximum of |in_length|) from |in| +// to UTF-16 into |out|. Return the number of characters consumed from |in|. +// Any unused characters in |out| will be initialized to 0. No memory will +// be allocated by this routine. +int UTF8ToUTF16Char(const char *in, int in_length, u_int16_t out[2]); + +// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the +// conversion failed, |out| will be zero length. +void UTF32ToUTF16(const wchar_t *in, vector *out); + +// Convert |in| to UTF-16 into |out|. Any unused characters in |out| will be +// initialized to 0. No memory will be allocated by this routine. +void UTF32ToUTF16Char(wchar_t in, u_int16_t out[2]); + +// Convert |in| to UTF-8. If |swap| is true, swap bytes before converting. +std::string UTF16ToUTF8(const vector &in, bool swap); + +} // namespace google_breakpad + +#endif // COMMON_STRING_CONVERSION_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/windows/guid_string.cc b/thirdparty/google-breakpad/r318/src/common/windows/guid_string.cc new file mode 100644 index 00000000..b7f877e6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/windows/guid_string.cc @@ -0,0 +1,76 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// guid_string.cc: Convert GUIDs to strings. +// +// See guid_string.h for documentation. + +#include + +#include "common/windows/string_utils-inl.h" + +#include "common/windows/guid_string.h" + +namespace google_breakpad { + +// static +wstring GUIDString::GUIDToWString(GUID *guid) { + wchar_t guid_string[37]; + swprintf( + guid_string, sizeof(guid_string) / sizeof(guid_string[0]), + L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", + guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], + guid->Data4[3], guid->Data4[4], guid->Data4[5], + guid->Data4[6], guid->Data4[7]); + + // remove when VC++7.1 is no longer supported + guid_string[sizeof(guid_string) / sizeof(guid_string[0]) - 1] = L'\0'; + + return wstring(guid_string); +} + +// static +wstring GUIDString::GUIDToSymbolServerWString(GUID *guid) { + wchar_t guid_string[33]; + swprintf( + guid_string, sizeof(guid_string) / sizeof(guid_string[0]), + L"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X", + guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], + guid->Data4[3], guid->Data4[4], guid->Data4[5], + guid->Data4[6], guid->Data4[7]); + + // remove when VC++7.1 is no longer supported + guid_string[sizeof(guid_string) / sizeof(guid_string[0]) - 1] = L'\0'; + + return wstring(guid_string); +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/common/windows/guid_string.h b/thirdparty/google-breakpad/r318/src/common/windows/guid_string.h new file mode 100644 index 00000000..f8aa8a23 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/windows/guid_string.h @@ -0,0 +1,58 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// guid_string.cc: Convert GUIDs to strings. + +#ifndef COMMON_WINDOWS_GUID_STRING_H__ +#define COMMON_WINDOWS_GUID_STRING_H__ + +#include + +#include + +namespace google_breakpad { + +using std::wstring; + +class GUIDString { + public: + // Converts guid to a string in the format recommended by RFC 4122 and + // returns the string. + static wstring GUIDToWString(GUID *guid); + + // Converts guid to a string formatted as uppercase hexadecimal, with + // no separators, and returns the string. This is the format used for + // symbol server identifiers, although identifiers have an age tacked + // on to the string. + static wstring GUIDToSymbolServerWString(GUID *guid); +}; + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_GUID_STRING_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/windows/http_upload.cc b/thirdparty/google-breakpad/r318/src/common/windows/http_upload.cc new file mode 100644 index 00000000..2f9ffa92 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/windows/http_upload.cc @@ -0,0 +1,393 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +// Disable exception handler warnings. +#pragma warning( disable : 4530 ) + +#include + +#include "common/windows/string_utils-inl.h" + +#include "common/windows/http_upload.h" + +namespace google_breakpad { + +using std::ifstream; +using std::ios; + +static const wchar_t kUserAgent[] = L"Breakpad/1.0 (Windows)"; + +// Helper class which closes an internet handle when it goes away +class HTTPUpload::AutoInternetHandle { + public: + explicit AutoInternetHandle(HINTERNET handle) : handle_(handle) {} + ~AutoInternetHandle() { + if (handle_) { + InternetCloseHandle(handle_); + } + } + + HINTERNET get() { return handle_; } + + private: + HINTERNET handle_; +}; + +// static +bool HTTPUpload::SendRequest(const wstring &url, + const map ¶meters, + const wstring &upload_file, + const wstring &file_part_name, + wstring *response_body, + int *response_code) { + if (response_code) { + *response_code = 0; + } + + // TODO(bryner): support non-ASCII parameter names + if (!CheckParameters(parameters)) { + return false; + } + + // Break up the URL and make sure we can handle it + wchar_t scheme[16], host[256], path[256]; + URL_COMPONENTS components; + memset(&components, 0, sizeof(components)); + components.dwStructSize = sizeof(components); + components.lpszScheme = scheme; + components.dwSchemeLength = sizeof(scheme) / sizeof(scheme[0]); + components.lpszHostName = host; + components.dwHostNameLength = sizeof(host) / sizeof(host[0]); + components.lpszUrlPath = path; + components.dwUrlPathLength = sizeof(path) / sizeof(path[0]); + if (!InternetCrackUrl(url.c_str(), static_cast(url.size()), + 0, &components)) { + return false; + } + bool secure = false; + if (wcscmp(scheme, L"https") == 0) { + secure = true; + } else if (wcscmp(scheme, L"http") != 0) { + return false; + } + + AutoInternetHandle internet(InternetOpen(kUserAgent, + INTERNET_OPEN_TYPE_PRECONFIG, + NULL, // proxy name + NULL, // proxy bypass + 0)); // flags + if (!internet.get()) { + return false; + } + + AutoInternetHandle connection(InternetConnect(internet.get(), + host, + components.nPort, + NULL, // user name + NULL, // password + INTERNET_SERVICE_HTTP, + 0, // flags + NULL)); // context + if (!connection.get()) { + return false; + } + + DWORD http_open_flags = secure ? INTERNET_FLAG_SECURE : 0; + AutoInternetHandle request(HttpOpenRequest(connection.get(), + L"POST", + path, + NULL, // version + NULL, // referer + NULL, // agent type + http_open_flags, + NULL)); // context + if (!request.get()) { + return false; + } + + wstring boundary = GenerateMultipartBoundary(); + wstring content_type_header = GenerateRequestHeader(boundary); + HttpAddRequestHeaders(request.get(), + content_type_header.c_str(), + static_cast(-1), + HTTP_ADDREQ_FLAG_ADD); + + string request_body; + if (!GenerateRequestBody(parameters, upload_file, + file_part_name, boundary, &request_body)) { + return false; + } + + if (!HttpSendRequest(request.get(), NULL, 0, + const_cast(request_body.data()), + static_cast(request_body.size()))) { + return false; + } + + // The server indicates a successful upload with HTTP status 200. + wchar_t http_status[4]; + DWORD http_status_size = sizeof(http_status); + if (!HttpQueryInfo(request.get(), HTTP_QUERY_STATUS_CODE, + static_cast(&http_status), &http_status_size, + 0)) { + return false; + } + + int http_response = wcstol(http_status, NULL, 10); + if (response_code) { + *response_code = http_response; + } + + bool result = (http_response == 200); + + if (result) { + result = ReadResponse(request.get(), response_body); + } + + return result; +} + +// static +bool HTTPUpload::ReadResponse(HINTERNET request, wstring *response) { + bool has_content_length_header = false; + wchar_t content_length[32]; + DWORD content_length_size = sizeof(content_length); + DWORD claimed_size = 0; + string response_body; + + if (HttpQueryInfo(request, HTTP_QUERY_CONTENT_LENGTH, + static_cast(&content_length), + &content_length_size, 0)) { + has_content_length_header = true; + claimed_size = wcstol(content_length, NULL, 10); + response_body.reserve(claimed_size); + } + + + DWORD bytes_available; + DWORD total_read = 0; + bool return_code; + + while ((return_code = InternetQueryDataAvailable(request, &bytes_available, + 0, 0) != 0) && + bytes_available > 0) { + vector response_buffer(bytes_available); + DWORD size_read; + + if ((return_code = InternetReadFile(request, &response_buffer[0], + bytes_available, &size_read) != 0) && + size_read > 0) { + total_read += size_read; + response_body.append(&response_buffer[0], size_read); + } else { + break; + } + } + + bool succeeded = return_code && (!has_content_length_header || + (total_read == claimed_size)); + if (succeeded && response) { + *response = UTF8ToWide(response_body); + } + + return succeeded; +} + +// static +wstring HTTPUpload::GenerateMultipartBoundary() { + // The boundary has 27 '-' characters followed by 16 hex digits + static const wchar_t kBoundaryPrefix[] = L"---------------------------"; + static const int kBoundaryLength = 27 + 16 + 1; + + // Generate some random numbers to fill out the boundary + int r0 = rand(); + int r1 = rand(); + + wchar_t temp[kBoundaryLength]; + swprintf(temp, kBoundaryLength, L"%s%08X%08X", kBoundaryPrefix, r0, r1); + + // remove when VC++7.1 is no longer supported + temp[kBoundaryLength - 1] = L'\0'; + + return wstring(temp); +} + +// static +wstring HTTPUpload::GenerateRequestHeader(const wstring &boundary) { + wstring header = L"Content-Type: multipart/form-data; boundary="; + header += boundary; + return header; +} + +// static +bool HTTPUpload::GenerateRequestBody(const map ¶meters, + const wstring &upload_file, + const wstring &file_part_name, + const wstring &boundary, + string *request_body) { + vector contents; + GetFileContents(upload_file, &contents); + if (contents.empty()) { + return false; + } + + string boundary_str = WideToUTF8(boundary); + if (boundary_str.empty()) { + return false; + } + + request_body->clear(); + + // Append each of the parameter pairs as a form-data part + for (map::const_iterator pos = parameters.begin(); + pos != parameters.end(); ++pos) { + request_body->append("--" + boundary_str + "\r\n"); + request_body->append("Content-Disposition: form-data; name=\"" + + WideToUTF8(pos->first) + "\"\r\n\r\n" + + WideToUTF8(pos->second) + "\r\n"); + } + + // Now append the upload file as a binary (octet-stream) part + string filename_utf8 = WideToUTF8(upload_file); + if (filename_utf8.empty()) { + return false; + } + + string file_part_name_utf8 = WideToUTF8(file_part_name); + if (file_part_name_utf8.empty()) { + return false; + } + + request_body->append("--" + boundary_str + "\r\n"); + request_body->append("Content-Disposition: form-data; " + "name=\"" + file_part_name_utf8 + "\"; " + "filename=\"" + filename_utf8 + "\"\r\n"); + request_body->append("Content-Type: application/octet-stream\r\n"); + request_body->append("\r\n"); + + if (!contents.empty()) { + request_body->append(&(contents[0]), contents.size()); + } + request_body->append("\r\n"); + request_body->append("--" + boundary_str + "--\r\n"); + return true; +} + +// static +void HTTPUpload::GetFileContents(const wstring &filename, + vector *contents) { + // The "open" method on pre-MSVC8 ifstream implementations doesn't accept a + // wchar_t* filename, so use _wfopen directly in that case. For VC8 and + // later, _wfopen has been deprecated in favor of _wfopen_s, which does + // not exist in earlier versions, so let the ifstream open the file itself. +#if _MSC_VER >= 1400 // MSVC 2005/8 + ifstream file; + file.open(filename.c_str(), ios::binary); +#else // _MSC_VER >= 1400 + ifstream file(_wfopen(filename.c_str(), L"rb")); +#endif // _MSC_VER >= 1400 + if (file.is_open()) { + file.seekg(0, ios::end); + int length = file.tellg(); + contents->resize(length); + if (length != 0) { + file.seekg(0, ios::beg); + file.read(&((*contents)[0]), length); + } + file.close(); + } else { + contents->clear(); + } +} + +// static +wstring HTTPUpload::UTF8ToWide(const string &utf8) { + if (utf8.length() == 0) { + return wstring(); + } + + // compute the length of the buffer we'll need + int charcount = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0); + + if (charcount == 0) { + return wstring(); + } + + // convert + wchar_t* buf = new wchar_t[charcount]; + MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, buf, charcount); + wstring result(buf); + delete[] buf; + return result; +} + +// static +string HTTPUpload::WideToUTF8(const wstring &wide) { + if (wide.length() == 0) { + return string(); + } + + // compute the length of the buffer we'll need + int charcount = WideCharToMultiByte(CP_UTF8, 0, wide.c_str(), -1, + NULL, 0, NULL, NULL); + if (charcount == 0) { + return string(); + } + + // convert + char *buf = new char[charcount]; + WideCharToMultiByte(CP_UTF8, 0, wide.c_str(), -1, buf, charcount, + NULL, NULL); + + string result(buf); + delete[] buf; + return result; +} + +// static +bool HTTPUpload::CheckParameters(const map ¶meters) { + for (map::const_iterator pos = parameters.begin(); + pos != parameters.end(); ++pos) { + const wstring &str = pos->first; + if (str.size() == 0) { + return false; // disallow empty parameter names + } + for (unsigned int i = 0; i < str.size(); ++i) { + wchar_t c = str[i]; + if (c < 32 || c == '"' || c > 127) { + return false; + } + } + } + return true; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/common/windows/http_upload.h b/thirdparty/google-breakpad/r318/src/common/windows/http_upload.h new file mode 100644 index 00000000..a1ba7ae1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/windows/http_upload.h @@ -0,0 +1,125 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// HTTPUpload provides a "nice" API to send a multipart HTTP(S) POST +// request using wininet. It currently supports requests that contain +// a set of string parameters (key/value pairs), and a file to upload. + +#ifndef COMMON_WINDOWS_HTTP_UPLOAD_H__ +#define COMMON_WINDOWS_HTTP_UPLOAD_H__ + +#pragma warning( push ) +// Disable exception handler warnings. +#pragma warning( disable : 4530 ) + +#include +#include + +#include +#include +#include + +namespace google_breakpad { + +using std::string; +using std::wstring; +using std::map; +using std::vector; + +class HTTPUpload { + public: + // Sends the given set of parameters, along with the contents of + // upload_file, as a multipart POST request to the given URL. + // file_part_name contains the name of the file part of the request + // (i.e. it corresponds to the name= attribute on an . + // Parameter names must contain only printable ASCII characters, + // and may not contain a quote (") character. + // Only HTTP(S) URLs are currently supported. Returns true on success. + // If the request is successful and response_body is non-NULL, + // the response body will be returned in response_body. + // If response_code is non-NULL, it will be set to the HTTP response code + // received (or 0 if the request failed before getting an HTTP response). + static bool SendRequest(const wstring &url, + const map ¶meters, + const wstring &upload_file, + const wstring &file_part_name, + wstring *response_body, + int *response_code); + + private: + class AutoInternetHandle; + + // Retrieves the HTTP response. If NULL is passed in for response, + // this merely checks (via the return value) that we were successfully + // able to retrieve exactly as many bytes of content in the response as + // were specified in the Content-Length header. + static bool HTTPUpload::ReadResponse(HINTERNET request, wstring* response); + + // Generates a new multipart boundary for a POST request + static wstring GenerateMultipartBoundary(); + + // Generates a HTTP request header for a multipart form submit. + static wstring GenerateRequestHeader(const wstring &boundary); + + // Given a set of parameters, an upload filename, and a file part name, + // generates a multipart request body string with these parameters + // and minidump contents. Returns true on success. + static bool GenerateRequestBody(const map ¶meters, + const wstring &upload_file, + const wstring &file_part_name, + const wstring &boundary, + string *request_body); + + // Fills the supplied vector with the contents of filename. + static void GetFileContents(const wstring &filename, vector *contents); + + // Converts a UTF8 string to UTF16. + static wstring UTF8ToWide(const string &utf8); + + // Converts a UTF16 string to UTF8. + static string WideToUTF8(const wstring &wide); + + // Checks that the given list of parameters has only printable + // ASCII characters in the parameter name, and does not contain + // any quote (") characters. Returns true if so. + static bool CheckParameters(const map ¶meters); + + // No instances of this class should be created. + // Disallow all constructors, destructors, and operator=. + HTTPUpload(); + explicit HTTPUpload(const HTTPUpload &); + void operator=(const HTTPUpload &); + ~HTTPUpload(); +}; + +} // namespace google_breakpad + +#pragma warning( pop ) + +#endif // COMMON_WINDOWS_HTTP_UPLOAD_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/windows/pdb_source_line_writer.cc b/thirdparty/google-breakpad/r318/src/common/windows/pdb_source_line_writer.cc new file mode 100644 index 00000000..0392627f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/windows/pdb_source_line_writer.cc @@ -0,0 +1,800 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include + +#include "common/windows/string_utils-inl.h" + +#include "common/windows/pdb_source_line_writer.h" +#include "common/windows/guid_string.h" + +// This constant may be missing from DbgHelp.h. See the documentation for +// IDiaSymbol::get_undecoratedNameEx. +#ifndef UNDNAME_NO_ECSU +#define UNDNAME_NO_ECSU 0x8000 // Suppresses enum/class/struct/union. +#endif // UNDNAME_NO_ECSU + +namespace google_breakpad { + +PDBSourceLineWriter::PDBSourceLineWriter() : output_(NULL) { +} + +PDBSourceLineWriter::~PDBSourceLineWriter() { +} + +bool PDBSourceLineWriter::Open(const wstring &file, FileFormat format) { + Close(); + + if (FAILED(CoInitialize(NULL))) { + fprintf(stderr, "CoInitialize failed\n"); + return false; + } + + CComPtr data_source; + if (FAILED(data_source.CoCreateInstance(CLSID_DiaSource))) { + fprintf(stderr, "CoCreateInstance CLSID_DiaSource failed " + "(msdia80.dll unregistered?)\n"); + return false; + } + + switch (format) { + case PDB_FILE: + if (FAILED(data_source->loadDataFromPdb(file.c_str()))) { + fprintf(stderr, "loadDataFromPdb failed\n"); + return false; + } + break; + case EXE_FILE: + if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) { + fprintf(stderr, "loadDataForExe failed\n"); + return false; + } + break; + case ANY_FILE: + if (FAILED(data_source->loadDataFromPdb(file.c_str()))) { + if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) { + fprintf(stderr, "loadDataForPdb and loadDataFromExe failed\n"); + return false; + } + } + break; + default: + fprintf(stderr, "Unknown file format\n"); + return false; + } + + if (FAILED(data_source->openSession(&session_))) { + fprintf(stderr, "openSession failed\n"); + } + + return true; +} + +bool PDBSourceLineWriter::PrintLines(IDiaEnumLineNumbers *lines) { + // The line number format is: + // + CComPtr line; + ULONG count; + + while (SUCCEEDED(lines->Next(1, &line, &count)) && count == 1) { + DWORD rva; + if (FAILED(line->get_relativeVirtualAddress(&rva))) { + fprintf(stderr, "failed to get line rva\n"); + return false; + } + + DWORD length; + if (FAILED(line->get_length(&length))) { + fprintf(stderr, "failed to get line code length\n"); + return false; + } + + DWORD source_id; + if (FAILED(line->get_sourceFileId(&source_id))) { + fprintf(stderr, "failed to get line source file id\n"); + return false; + } + + DWORD line_num; + if (FAILED(line->get_lineNumber(&line_num))) { + fprintf(stderr, "failed to get line number\n"); + return false; + } + + fprintf(output_, "%x %x %d %d\n", rva, length, line_num, source_id); + line.Release(); + } + return true; +} + +bool PDBSourceLineWriter::PrintFunction(IDiaSymbol *function) { + // The function format is: + // FUNC
      + DWORD rva; + if (FAILED(function->get_relativeVirtualAddress(&rva))) { + fprintf(stderr, "couldn't get rva\n"); + return false; + } + + ULONGLONG length; + if (FAILED(function->get_length(&length))) { + fprintf(stderr, "failed to get function length\n"); + return false; + } + + if (length == 0) { + // Silently ignore zero-length functions, which can infrequently pop up. + return true; + } + + CComBSTR name; + int stack_param_size; + if (!GetSymbolFunctionName(function, &name, &stack_param_size)) { + return false; + } + + // If the decorated name didn't give the parameter size, try to + // calculate it. + if (stack_param_size < 0) { + stack_param_size = GetFunctionStackParamSize(function); + } + + fprintf(output_, "FUNC %x %" WIN_STRING_FORMAT_LL "x %x %ws\n", + rva, length, stack_param_size, name); + + CComPtr lines; + if (FAILED(session_->findLinesByRVA(rva, DWORD(length), &lines))) { + return false; + } + + if (!PrintLines(lines)) { + return false; + } + return true; +} + +bool PDBSourceLineWriter::PrintSourceFiles() { + CComPtr global; + if (FAILED(session_->get_globalScope(&global))) { + fprintf(stderr, "get_globalScope failed\n"); + return false; + } + + CComPtr compilands; + if (FAILED(global->findChildren(SymTagCompiland, NULL, + nsNone, &compilands))) { + fprintf(stderr, "findChildren failed\n"); + return false; + } + + CComPtr compiland; + ULONG count; + while (SUCCEEDED(compilands->Next(1, &compiland, &count)) && count == 1) { + CComPtr source_files; + if (FAILED(session_->findFile(compiland, NULL, nsNone, &source_files))) { + return false; + } + CComPtr file; + while (SUCCEEDED(source_files->Next(1, &file, &count)) && count == 1) { + DWORD file_id; + if (FAILED(file->get_uniqueId(&file_id))) { + return false; + } + + CComBSTR file_name; + if (FAILED(file->get_fileName(&file_name))) { + return false; + } + + fwprintf(output_, L"FILE %d %s\n", file_id, file_name); + file.Release(); + } + compiland.Release(); + } + return true; +} + +bool PDBSourceLineWriter::PrintFunctions() { + CComPtr symbols; + if (FAILED(session_->getSymbolsByAddr(&symbols))) { + fprintf(stderr, "failed to get symbol enumerator\n"); + return false; + } + + CComPtr symbol; + if (FAILED(symbols->symbolByAddr(1, 0, &symbol))) { + fprintf(stderr, "failed to enumerate symbols\n"); + return false; + } + + DWORD rva_last = 0; + if (FAILED(symbol->get_relativeVirtualAddress(&rva_last))) { + fprintf(stderr, "failed to get symbol rva\n"); + return false; + } + + ULONG count; + do { + DWORD tag; + if (FAILED(symbol->get_symTag(&tag))) { + fprintf(stderr, "failed to get symbol tag\n"); + return false; + } + + // For a given function, DIA seems to give either a symbol with + // SymTagFunction or SymTagPublicSymbol, but not both. This means + // that PDBSourceLineWriter will output either a FUNC or PUBLIC line, + // but not both. + if (tag == SymTagFunction) { + if (!PrintFunction(symbol)) { + return false; + } + } else if (tag == SymTagPublicSymbol) { + if (!PrintCodePublicSymbol(symbol)) { + return false; + } + } + symbol.Release(); + } while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1); + + return true; +} + +bool PDBSourceLineWriter::PrintFrameData() { + // It would be nice if it were possible to output frame data alongside the + // associated function, as is done with line numbers, but the DIA API + // doesn't make it possible to get the frame data in that way. + + CComPtr tables; + if (FAILED(session_->getEnumTables(&tables))) + return false; + + // Pick up the first table that supports IDiaEnumFrameData. + CComPtr frame_data_enum; + CComPtr table; + ULONG count; + while (!frame_data_enum && + SUCCEEDED(tables->Next(1, &table, &count)) && + count == 1) { + table->QueryInterface(_uuidof(IDiaEnumFrameData), + reinterpret_cast(&frame_data_enum)); + table.Release(); + } + if (!frame_data_enum) + return false; + + DWORD last_type = -1; + DWORD last_rva = -1; + DWORD last_code_size = 0; + DWORD last_prolog_size = -1; + + CComPtr frame_data; + while (SUCCEEDED(frame_data_enum->Next(1, &frame_data, &count)) && + count == 1) { + DWORD type; + if (FAILED(frame_data->get_type(&type))) + return false; + + DWORD rva; + if (FAILED(frame_data->get_relativeVirtualAddress(&rva))) + return false; + + DWORD code_size; + if (FAILED(frame_data->get_lengthBlock(&code_size))) + return false; + + DWORD prolog_size; + if (FAILED(frame_data->get_lengthProlog(&prolog_size))) + return false; + + // epliog_size is always 0. + DWORD epilog_size = 0; + + // parameter_size is the size of parameters passed on the stack. If any + // parameters are not passed on the stack (such as in registers), their + // sizes will not be included in parameter_size. + DWORD parameter_size; + if (FAILED(frame_data->get_lengthParams(¶meter_size))) + return false; + + DWORD saved_register_size; + if (FAILED(frame_data->get_lengthSavedRegisters(&saved_register_size))) + return false; + + DWORD local_size; + if (FAILED(frame_data->get_lengthLocals(&local_size))) + return false; + + // get_maxStack can return S_FALSE, just use 0 in that case. + DWORD max_stack_size = 0; + if (FAILED(frame_data->get_maxStack(&max_stack_size))) + return false; + + // get_programString can return S_FALSE, indicating that there is no + // program string. In that case, check whether %ebp is used. + HRESULT program_string_result; + CComBSTR program_string; + if (FAILED(program_string_result = frame_data->get_program( + &program_string))) { + return false; + } + + // get_allocatesBasePointer can return S_FALSE, treat that as though + // %ebp is not used. + BOOL allocates_base_pointer = FALSE; + if (program_string_result != S_OK) { + if (FAILED(frame_data->get_allocatesBasePointer( + &allocates_base_pointer))) { + return false; + } + } + + // Only print out a line if type, rva, code_size, or prolog_size have + // changed from the last line. It is surprisingly common (especially in + // system library PDBs) for DIA to return a series of identical + // IDiaFrameData objects. For kernel32.pdb from Windows XP SP2 on x86, + // this check reduces the size of the dumped symbol file by a third. + if (type != last_type || rva != last_rva || code_size != last_code_size || + prolog_size != last_prolog_size) { + fprintf(output_, "STACK WIN %x %x %x %x %x %x %x %x %x %d ", + type, rva, code_size, prolog_size, epilog_size, + parameter_size, saved_register_size, local_size, max_stack_size, + program_string_result == S_OK); + if (program_string_result == S_OK) { + fprintf(output_, "%ws\n", program_string); + } else { + fprintf(output_, "%d\n", allocates_base_pointer); + } + + last_type = type; + last_rva = rva; + last_code_size = code_size; + last_prolog_size = prolog_size; + } + + frame_data.Release(); + } + + return true; +} + +bool PDBSourceLineWriter::PrintCodePublicSymbol(IDiaSymbol *symbol) { + BOOL is_code; + if (FAILED(symbol->get_code(&is_code))) { + return false; + } + if (!is_code) { + return true; + } + + DWORD rva; + if (FAILED(symbol->get_relativeVirtualAddress(&rva))) { + return false; + } + + CComBSTR name; + int stack_param_size; + if (!GetSymbolFunctionName(symbol, &name, &stack_param_size)) { + return false; + } + + fprintf(output_, "PUBLIC %x %x %ws\n", rva, + stack_param_size > 0 ? stack_param_size : 0, name); + return true; +} + +bool PDBSourceLineWriter::PrintPDBInfo() { + PDBModuleInfo info; + if (!GetModuleInfo(&info)) { + return false; + } + + // Hard-code "windows" for the OS because that's the only thing that makes + // sense for PDB files. (This might not be strictly correct for Windows CE + // support, but we don't care about that at the moment.) + fprintf(output_, "MODULE windows %ws %ws %ws\n", + info.cpu.c_str(), info.debug_identifier.c_str(), + info.debug_file.c_str()); + + return true; +} + +// wcstol_positive_strict is sort of like wcstol, but much stricter. string +// should be a buffer pointing to a null-terminated string containing only +// decimal digits. If the entire string can be converted to an integer +// without overflowing, and there are no non-digit characters before the +// result is set to the value and this function returns true. Otherwise, +// this function returns false. This is an alternative to the strtol, atoi, +// and scanf families, which are not as strict about input and in some cases +// don't provide a good way for the caller to determine if a conversion was +// successful. +static bool wcstol_positive_strict(wchar_t *string, int *result) { + int value = 0; + for (wchar_t *c = string; *c != '\0'; ++c) { + int last_value = value; + value *= 10; + // Detect overflow. + if (value / 10 != last_value || value < 0) { + return false; + } + if (*c < '0' || *c > '9') { + return false; + } + unsigned int c_value = *c - '0'; + last_value = value; + value += c_value; + // Detect overflow. + if (value < last_value) { + return false; + } + // Forbid leading zeroes unless the string is just "0". + if (value == 0 && *(c+1) != '\0') { + return false; + } + } + *result = value; + return true; +} + +// static +bool PDBSourceLineWriter::GetSymbolFunctionName(IDiaSymbol *function, + BSTR *name, + int *stack_param_size) { + *stack_param_size = -1; + const DWORD undecorate_options = UNDNAME_NO_MS_KEYWORDS | + UNDNAME_NO_FUNCTION_RETURNS | + UNDNAME_NO_ALLOCATION_MODEL | + UNDNAME_NO_ALLOCATION_LANGUAGE | + UNDNAME_NO_THISTYPE | + UNDNAME_NO_ACCESS_SPECIFIERS | + UNDNAME_NO_THROW_SIGNATURES | + UNDNAME_NO_MEMBER_TYPE | + UNDNAME_NO_RETURN_UDT_MODEL | + UNDNAME_NO_ECSU; + + // Use get_undecoratedNameEx to get readable C++ names with arguments. + if (function->get_undecoratedNameEx(undecorate_options, name) != S_OK) { + if (function->get_name(name) != S_OK) { + fprintf(stderr, "failed to get function name\n"); + return false; + } + // If a name comes from get_name because no undecorated form existed, + // it's already formatted properly to be used as output. Don't do any + // additional processing. + // + // MSVC7's DIA seems to not undecorate names in as many cases as MSVC8's. + // This will result in calling get_name for some C++ symbols, so + // all of the parameter and return type information may not be included in + // the name string. + } else { + // C++ uses a bogus "void" argument for functions and methods that don't + // take any parameters. Take it out of the undecorated name because it's + // ugly and unnecessary. + const wchar_t *replace_string = L"(void)"; + const size_t replace_length = wcslen(replace_string); + const wchar_t *replacement_string = L"()"; + size_t length = wcslen(*name); + if (length >= replace_length) { + wchar_t *name_end = *name + length - replace_length; + if (wcscmp(name_end, replace_string) == 0) { + WindowsStringUtils::safe_wcscpy(name_end, replace_length, + replacement_string); + length = wcslen(*name); + } + } + + // Undecorate names used for stdcall and fastcall. These names prefix + // the identifier with '_' (stdcall) or '@' (fastcall) and suffix it + // with '@' followed by the number of bytes of parameters, in decimal. + // If such a name is found, take note of the size and undecorate it. + // Only do this for names that aren't C++, which is determined based on + // whether the undecorated name contains any ':' or '(' characters. + if (!wcschr(*name, ':') && !wcschr(*name, '(') && + (*name[0] == '_' || *name[0] == '@')) { + wchar_t *last_at = wcsrchr(*name + 1, '@'); + if (last_at && wcstol_positive_strict(last_at + 1, stack_param_size)) { + // If this function adheres to the fastcall convention, it accepts up + // to the first 8 bytes of parameters in registers (%ecx and %edx). + // We're only interested in the stack space used for parameters, so + // so subtract 8 and don't let the size go below 0. + if (*name[0] == '@') { + if (*stack_param_size > 8) { + *stack_param_size -= 8; + } else { + *stack_param_size = 0; + } + } + + // Undecorate the name by moving it one character to the left in its + // buffer, and terminating it where the last '@' had been. + WindowsStringUtils::safe_wcsncpy(*name, length, + *name + 1, last_at - *name - 1); + } else if (*name[0] == '_') { + // This symbol's name is encoded according to the cdecl rules. The + // name doesn't end in a '@' character followed by a decimal positive + // integer, so it's not a stdcall name. Strip off the leading + // underscore. + WindowsStringUtils::safe_wcsncpy(*name, length, *name + 1, length); + } + } + } + + return true; +} + +// static +int PDBSourceLineWriter::GetFunctionStackParamSize(IDiaSymbol *function) { + // This implementation is highly x86-specific. + + // Gather the symbols corresponding to data. + CComPtr data_children; + if (FAILED(function->findChildren(SymTagData, NULL, nsNone, + &data_children))) { + return 0; + } + + // lowest_base is the lowest %ebp-relative byte offset used for a parameter. + // highest_end is one greater than the highest offset (i.e. base + length). + // Stack parameters are assumed to be contiguous, because in reality, they + // are. + int lowest_base = INT_MAX; + int highest_end = INT_MIN; + + CComPtr child; + DWORD count; + while (SUCCEEDED(data_children->Next(1, &child, &count)) && count == 1) { + // If any operation fails at this point, just proceed to the next child. + // Use the next_child label instead of continue because child needs to + // be released before it's reused. Declare constructable/destructable + // types early to avoid gotos that cross initializations. + CComPtr child_type; + + // DataIsObjectPtr is only used for |this|. Because |this| can be passed + // as a stack parameter, look for it in addition to traditional + // parameters. + DWORD child_kind; + if (FAILED(child->get_dataKind(&child_kind)) || + (child_kind != DataIsParam && child_kind != DataIsObjectPtr)) { + goto next_child; + } + + // Only concentrate on register-relative parameters. Parameters may also + // be enregistered (passed directly in a register), but those don't + // consume any stack space, so they're not of interest. + DWORD child_location_type; + if (FAILED(child->get_locationType(&child_location_type)) || + child_location_type != LocIsRegRel) { + goto next_child; + } + + // Of register-relative parameters, the only ones that make any sense are + // %ebp- or %esp-relative. Note that MSVC's debugging information always + // gives parameters as %ebp-relative even when a function doesn't use a + // traditional frame pointer and stack parameters are accessed relative to + // %esp, so just look for %ebp-relative parameters. If you wanted to + // access parameters, you'd probably want to treat these %ebp-relative + // offsets as if they were relative to %esp before a function's prolog + // executed. + DWORD child_register; + if (FAILED(child->get_registerId(&child_register)) || + child_register != CV_REG_EBP) { + goto next_child; + } + + LONG child_register_offset; + if (FAILED(child->get_offset(&child_register_offset))) { + goto next_child; + } + + // IDiaSymbol::get_type can succeed but still pass back a NULL value. + if (FAILED(child->get_type(&child_type)) || !child_type) { + goto next_child; + } + + ULONGLONG child_length; + if (FAILED(child_type->get_length(&child_length))) { + goto next_child; + } + + int child_end = child_register_offset + static_cast(child_length); + if (child_register_offset < lowest_base) { + lowest_base = child_register_offset; + } + if (child_end > highest_end) { + highest_end = child_end; + } + +next_child: + child.Release(); + } + + int param_size = 0; + // Make sure lowest_base isn't less than 4, because [%esp+4] is the lowest + // possible address to find a stack parameter before executing a function's + // prolog (see above). Some optimizations cause parameter offsets to be + // lower than 4, but we're not concerned with those because we're only + // looking for parameters contained in addresses higher than where the + // return address is stored. + if (lowest_base < 4) { + lowest_base = 4; + } + if (highest_end > lowest_base) { + // All stack parameters are pushed as at least 4-byte quantities. If the + // last type was narrower than 4 bytes, promote it. This assumes that all + // parameters' offsets are 4-byte-aligned, which is always the case. Only + // worry about the last type, because we're not summing the type sizes, + // just looking at the lowest and highest offsets. + int remainder = highest_end % 4; + if (remainder) { + highest_end += 4 - remainder; + } + + param_size = highest_end - lowest_base; + } + + return param_size; +} + +bool PDBSourceLineWriter::WriteMap(FILE *map_file) { + output_ = map_file; + + bool ret = PrintPDBInfo() && + PrintSourceFiles() && + PrintFunctions() && + PrintFrameData(); + + output_ = NULL; + return ret; +} + +void PDBSourceLineWriter::Close() { + session_.Release(); +} + +bool PDBSourceLineWriter::GetModuleInfo(PDBModuleInfo *info) { + if (!info) { + return false; + } + + info->debug_file.clear(); + info->debug_identifier.clear(); + info->cpu.clear(); + + CComPtr global; + if (FAILED(session_->get_globalScope(&global))) { + return false; + } + + // All CPUs in CV_CPU_TYPE_e (cvconst.h) below 0x10 are x86. There's no + // single specific constant to use. + DWORD platform; + if (SUCCEEDED(global->get_platform(&platform)) && platform < 0x10) { + info->cpu = L"x86"; + } else { + // Unexpected, but handle gracefully. + info->cpu = L"unknown"; + } + + // DWORD* and int* are not compatible. This is clean and avoids a cast. + DWORD age; + if (FAILED(global->get_age(&age))) { + return false; + } + + bool uses_guid; + if (!UsesGUID(&uses_guid)) { + return false; + } + + if (uses_guid) { + GUID guid; + if (FAILED(global->get_guid(&guid))) { + return false; + } + + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + wchar_t age_string[9]; + swprintf(age_string, sizeof(age_string) / sizeof(age_string[0]), + L"%x", age); + + // remove when VC++7.1 is no longer supported + age_string[sizeof(age_string) / sizeof(age_string[0]) - 1] = L'\0'; + + info->debug_identifier = GUIDString::GUIDToSymbolServerWString(&guid); + info->debug_identifier.append(age_string); + } else { + DWORD signature; + if (FAILED(global->get_signature(&signature))) { + return false; + } + + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + wchar_t identifier_string[17]; + swprintf(identifier_string, + sizeof(identifier_string) / sizeof(identifier_string[0]), + L"%08X%x", signature, age); + + // remove when VC++7.1 is no longer supported + identifier_string[sizeof(identifier_string) / + sizeof(identifier_string[0]) - 1] = L'\0'; + + info->debug_identifier = identifier_string; + } + + CComBSTR debug_file_string; + if (FAILED(global->get_symbolsFileName(&debug_file_string))) { + return false; + } + info->debug_file = + WindowsStringUtils::GetBaseName(wstring(debug_file_string)); + + return true; +} + +bool PDBSourceLineWriter::UsesGUID(bool *uses_guid) { + if (!uses_guid) + return false; + + CComPtr global; + if (FAILED(session_->get_globalScope(&global))) + return false; + + GUID guid; + if (FAILED(global->get_guid(&guid))) + return false; + + DWORD signature; + if (FAILED(global->get_signature(&signature))) + return false; + + // There are two possibilities for guid: either it's a real 128-bit GUID + // as identified in a code module by a new-style CodeView record, or it's + // a 32-bit signature (timestamp) as identified by an old-style record. + // See MDCVInfoPDB70 and MDCVInfoPDB20 in minidump_format.h. + // + // Because DIA doesn't provide a way to directly determine whether a module + // uses a GUID or a 32-bit signature, this code checks whether the first 32 + // bits of guid are the same as the signature, and if the rest of guid is + // zero. If so, then with a pretty high degree of certainty, there's an + // old-style CodeView record in use. This method will only falsely find an + // an old-style CodeView record if a real 128-bit GUID has its first 32 + // bits set the same as the module's signature (timestamp) and the rest of + // the GUID is set to 0. This is highly unlikely. + + GUID signature_guid = {signature}; // 0-initializes other members + *uses_guid = !IsEqualGUID(guid, signature_guid); + return true; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/common/windows/pdb_source_line_writer.h b/thirdparty/google-breakpad/r318/src/common/windows/pdb_source_line_writer.h new file mode 100644 index 00000000..e91d0737 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/windows/pdb_source_line_writer.h @@ -0,0 +1,163 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// PDBSourceLineWriter uses a pdb file produced by Visual C++ to output +// a line/address map for use with BasicSourceLineResolver. + +#ifndef _PDB_SOURCE_LINE_WRITER_H__ +#define _PDB_SOURCE_LINE_WRITER_H__ + +#include + +#include + +struct IDiaEnumLineNumbers; +struct IDiaSession; +struct IDiaSymbol; + +namespace google_breakpad { + +using std::wstring; + +// A structure that carries information that identifies a pdb file. +struct PDBModuleInfo { + public: + // The basename of the pdb file from which information was loaded. + wstring debug_file; + + // The pdb's identifier. For recent pdb files, the identifier consists + // of the pdb's guid, in uppercase hexadecimal form without any dashes + // or separators, followed immediately by the pdb's age, also in + // uppercase hexadecimal form. For older pdb files which have no guid, + // the identifier is the pdb's 32-bit signature value, in zero-padded + // hexadecimal form, followed immediately by the pdb's age, in lowercase + // hexadecimal form. + wstring debug_identifier; + + // A string identifying the cpu that the pdb is associated with. + // Currently, this may be "x86" or "unknown". + wstring cpu; +}; + +class PDBSourceLineWriter { + public: + enum FileFormat { + PDB_FILE, // a .pdb file containing debug symbols + EXE_FILE, // a .exe or .dll file + ANY_FILE // try PDB_FILE and then EXE_FILE + }; + + explicit PDBSourceLineWriter(); + ~PDBSourceLineWriter(); + + // Opens the given file. For executable files, the corresponding pdb + // file must be available; Open will be if it is not. + // If there is already a pdb file open, it is automatically closed. + // Returns true on success. + bool Open(const wstring &file, FileFormat format); + + // Locates the pdb file for the given executable (exe or dll) file, + // and opens it. If there is already a pdb file open, it is automatically + // closed. Returns true on success. + bool OpenExecutable(const wstring &exe_file); + + // Writes a map file from the current pdb file to the given file stream. + // Returns true on success. + bool WriteMap(FILE *map_file); + + // Closes the current pdb file and its associated resources. + void Close(); + + // Retrieves information about the module's debugging file. Returns + // true on success and false on failure. + bool GetModuleInfo(PDBModuleInfo *info); + + // Sets uses_guid to true if the opened file uses a new-style CodeView + // record with a 128-bit GUID, or false if the opened file uses an old-style + // CodeView record. When no GUID is available, a 32-bit signature should be + // used to identify the module instead. If the information cannot be + // determined, this method returns false. + bool UsesGUID(bool *uses_guid); + + private: + // Outputs the line/address pairs for each line in the enumerator. + // Returns true on success. + bool PrintLines(IDiaEnumLineNumbers *lines); + + // Outputs a function address and name, followed by its source line list. + // Returns true on success. + bool PrintFunction(IDiaSymbol *function); + + // Outputs all functions as described above. Returns true on success. + bool PrintFunctions(); + + // Outputs all of the source files in the session's pdb file. + // Returns true on success. + bool PrintSourceFiles(); + + // Outputs all of the frame information necessary to construct stack + // backtraces in the absence of frame pointers. Returns true on success. + bool PrintFrameData(); + + // Outputs a single public symbol address and name, if the symbol corresponds + // to a code address. Returns true on success. If symbol is does not + // correspond to code, returns true without outputting anything. + bool PrintCodePublicSymbol(IDiaSymbol *symbol); + + // Outputs a line identifying the PDB file that is being dumped, along with + // its uuid and age. + bool PrintPDBInfo(); + + // Returns the function name for a symbol. If possible, the name is + // undecorated. If the symbol's decorated form indicates the size of + // parameters on the stack, this information is returned in stack_param_size. + // Returns true on success. If the symbol doesn't encode parameter size + // information, stack_param_size is set to -1. + static bool GetSymbolFunctionName(IDiaSymbol *function, BSTR *name, + int *stack_param_size); + + // Returns the number of bytes of stack space used for a function's + // parameters. function must have the tag SymTagFunction. In the event of + // a failure, returns 0, which is also a valid number of bytes. + static int GetFunctionStackParamSize(IDiaSymbol *function); + + // The session for the currently-open pdb file. + CComPtr session_; + + // The current output file for this WriteMap invocation. + FILE *output_; + + // Disallow copy ctor and operator= + PDBSourceLineWriter(const PDBSourceLineWriter&); + void operator=(const PDBSourceLineWriter&); +}; + +} // namespace google_breakpad + +#endif // _PDB_SOURCE_LINE_WRITER_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/windows/string_utils-inl.h b/thirdparty/google-breakpad/r318/src/common/windows/string_utils-inl.h new file mode 100644 index 00000000..6f650812 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/windows/string_utils-inl.h @@ -0,0 +1,139 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// string_utils-inl.h: Safer string manipulation on Windows, supporting +// pre-MSVC8 environments. + +#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H__ +#define COMMON_WINDOWS_STRING_UTILS_INL_H__ + +#include +#include + +#include + +// The "ll" printf format size specifier corresponding to |long long| was +// intrudced in MSVC8. Earlier versions did not provide this size specifier, +// but "I64" can be used to print 64-bit types. Don't use "I64" where "ll" +// is available, in the event of oddball systems where |long long| is not +// 64 bits wide. +#if _MSC_VER >= 1400 // MSVC 2005/8 +#define WIN_STRING_FORMAT_LL "ll" +#else // MSC_VER >= 1400 +#define WIN_STRING_FORMAT_LL "I64" +#endif // MSC_VER >= 1400 + +// A nonconforming version of swprintf, without the length argument, was +// included with the CRT prior to MSVC8. Although a conforming version was +// also available via an overload, it is not reliably chosen. _snwprintf +// behaves as a standards-confirming swprintf should, so force the use of +// _snwprintf when using older CRTs. +#if _MSC_VER < 1400 // MSVC 2005/8 +#define swprintf _snwprintf +#else +// For MSVC8 and newer, swprintf_s is the recommended method. Conveniently, +// it takes the same argument list as swprintf. +#define swprintf swprintf_s +#endif // MSC_VER < 1400 + +namespace google_breakpad { + +using std::string; +using std::wstring; + +class WindowsStringUtils { + public: + // Roughly equivalent to MSVC8's wcscpy_s, except pre-MSVC8, this does + // not fail if source is longer than destination_size. The destination + // buffer is always 0-terminated. + static void safe_wcscpy(wchar_t *destination, size_t destination_size, + const wchar_t *source); + + // Roughly equivalent to MSVC8's wcsncpy_s, except that _TRUNCATE cannot + // be passed directly, and pre-MSVC8, this will not fail if source or count + // are longer than destination_size. The destination buffer is always + // 0-terminated. + static void safe_wcsncpy(wchar_t *destination, size_t destination_size, + const wchar_t *source, size_t count); + + // Performs multi-byte to wide character conversion on C++ strings, using + // mbstowcs_s (MSVC8) or mbstowcs (pre-MSVC8). Returns false on failure, + // without setting wcs. + static bool safe_mbstowcs(const string &mbs, wstring *wcs); + + // Returns the base name of a file, e.g. strips off the path. + static wstring GetBaseName(const wstring &filename); + + private: + // Disallow instantiation and other object-based operations. + WindowsStringUtils(); + WindowsStringUtils(const WindowsStringUtils&); + ~WindowsStringUtils(); + void operator=(const WindowsStringUtils&); +}; + +// static +inline void WindowsStringUtils::safe_wcscpy(wchar_t *destination, + size_t destination_size, + const wchar_t *source) { +#if _MSC_VER >= 1400 // MSVC 2005/8 + wcscpy_s(destination, destination_size, source); +#else // _MSC_VER >= 1400 + // Pre-MSVC 2005/8 doesn't have wcscpy_s. Simulate it with wcsncpy. + // wcsncpy doesn't 0-terminate the destination buffer if the source string + // is longer than size. Ensure that the destination is 0-terminated. + wcsncpy(destination, source, destination_size); + if (destination && destination_size) + destination[destination_size - 1] = 0; +#endif // _MSC_VER >= 1400 +} + +// static +inline void WindowsStringUtils::safe_wcsncpy(wchar_t *destination, + size_t destination_size, + const wchar_t *source, + size_t count) { +#if _MSC_VER >= 1400 // MSVC 2005/8 + wcsncpy_s(destination, destination_size, source, count); +#else // _MSC_VER >= 1400 + // Pre-MSVC 2005/8 doesn't have wcsncpy_s. Simulate it with wcsncpy. + // wcsncpy doesn't 0-terminate the destination buffer if the source string + // is longer than size. Ensure that the destination is 0-terminated. + if (destination_size < count) + count = destination_size; + + wcsncpy(destination, source, count); + if (destination && count) + destination[count - 1] = 0; +#endif // _MSC_VER >= 1400 +} + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_STRING_UTILS_INL_H__ diff --git a/thirdparty/google-breakpad/r318/src/common/windows/string_utils.cc b/thirdparty/google-breakpad/r318/src/common/windows/string_utils.cc new file mode 100644 index 00000000..5d464802 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/common/windows/string_utils.cc @@ -0,0 +1,92 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +#include "common/windows/string_utils-inl.h" + +namespace google_breakpad { + +// static +wstring WindowsStringUtils::GetBaseName(const wstring &filename) { + wstring base_name(filename); + size_t slash_pos = base_name.find_last_of(L"/\\"); + if (slash_pos != wstring::npos) { + base_name.erase(0, slash_pos + 1); + } + return base_name; +} + +// static +bool WindowsStringUtils::safe_mbstowcs(const string &mbs, wstring *wcs) { + assert(wcs); + + // First, determine the length of the destination buffer. + size_t wcs_length; + +#if _MSC_VER >= 1400 // MSVC 2005/8 + errno_t err; + if ((err = mbstowcs_s(&wcs_length, NULL, 0, mbs.c_str(), _TRUNCATE)) != 0) { + return false; + } +#else // _MSC_VER >= 1400 + if ((wcs_length = mbstowcs(NULL, mbs.c_str(), mbs.length())) < 0) { + return false; + } + + // Leave space for the 0-terminator. + ++wcs_length; +#endif // _MSC_VER >= 1400 + + // TODO(mmentovai): move scoped_ptr into common and use it for wcs_c. + wchar_t *wcs_c = new wchar_t[wcs_length]; + + // Now, convert. +#if _MSC_VER >= 1400 // MSVC 2005/8 + if ((err = mbstowcs_s(NULL, wcs_c, wcs_length, mbs.c_str(), + _TRUNCATE)) != 0) { + delete[] wcs_c; + return false; + } +#else // _MSC_VER >= 1400 + if (mbstowcs(wcs_c, mbs.c_str(), mbs.length()) < 0) { + delete[] wcs_c; + return false; + } + + // Ensure presence of 0-terminator. + wcs_c[wcs_length - 1] = '\0'; +#endif // _MSC_VER >= 1400 + + *wcs = wcs_c; + delete[] wcs_c; + return true; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/config.h b/thirdparty/google-breakpad/r318/src/config.h new file mode 100644 index 00000000..297bfc19 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/config.h @@ -0,0 +1,56 @@ +/* src/config.h. Generated from config.h.in by configure. */ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Name of package */ +#define PACKAGE "breakpad" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "opensource@google.com" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "breakpad" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "breakpad 0.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "breakpad" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.1" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "0.1" diff --git a/thirdparty/google-breakpad/r318/src/config.h.in b/thirdparty/google-breakpad/r318/src/config.h.in new file mode 100644 index 00000000..6b4c3e48 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/config.h.in @@ -0,0 +1,55 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/breakpad_types.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/breakpad_types.h new file mode 100644 index 00000000..926b47f2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/breakpad_types.h @@ -0,0 +1,83 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* breakpad_types.h: Precise-width types + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file ensures that types u_intN_t are defined for N = 8, 16, 32, and + * 64. Types of precise widths are crucial to the task of writing data + * structures on one platform and reading them on another. + * + * Author: Mark Mentovai */ + +#ifndef GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ +#define GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ + +#ifndef _WIN32 + +#include +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif /* __STDC_FORMAT_MACROS */ +#include + +#if defined(__SUNPRO_CC) || (defined(__GNUC__) && defined(__sun__)) +typedef uint8_t u_int8_t; +typedef uint16_t u_int16_t; +typedef uint32_t u_int32_t; +typedef uint64_t u_int64_t; +#endif + +#else /* !_WIN32 */ + +#include + +typedef unsigned __int8 u_int8_t; +typedef unsigned __int16 u_int16_t; +typedef unsigned __int32 u_int32_t; +typedef unsigned __int64 u_int64_t; + +#endif /* !_WIN32 */ + +typedef struct { + u_int64_t high; + u_int64_t low; +} u_int128_t; + +typedef u_int64_t breakpad_time_t; + +/* Try to get PRIx64 from inttypes.h, but if it's not defined, fall back to + * llx, which is the format string for "long long" - this is a 64-bit + * integral type on many systems. */ +#ifndef PRIx64 +#define PRIx64 "llx" +#endif /* !PRIx64 */ + +#endif /* GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_amd64.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_amd64.h new file mode 100644 index 00000000..75dae7dd --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_amd64.h @@ -0,0 +1,231 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on amd64. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai + * Change to split into its own file: Neal Sidhwaney */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ + + +/* + * AMD64 support, see WINNT.H + */ + +typedef struct { + u_int16_t control_word; + u_int16_t status_word; + u_int8_t tag_word; + u_int8_t reserved1; + u_int16_t error_opcode; + u_int32_t error_offset; + u_int16_t error_selector; + u_int16_t reserved2; + u_int32_t data_offset; + u_int16_t data_selector; + u_int16_t reserved3; + u_int32_t mx_csr; + u_int32_t mx_csr_mask; + u_int128_t float_registers[8]; + u_int128_t xmm_registers[16]; + u_int8_t reserved4[96]; +} MDXmmSaveArea32AMD64; /* XMM_SAVE_AREA32 */ + +#define MD_CONTEXT_AMD64_VR_COUNT 26 + +typedef struct { + /* + * Register parameter home addresses. + */ + u_int64_t p1_home; + u_int64_t p2_home; + u_int64_t p3_home; + u_int64_t p4_home; + u_int64_t p5_home; + u_int64_t p6_home; + + /* The next field determines the layout of the structure, and which parts + * of it are populated */ + u_int32_t context_flags; + u_int32_t mx_csr; + + /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ + u_int16_t cs; + + /* The next 4 registers are included with MD_CONTEXT_AMD64_SEGMENTS */ + u_int16_t ds; + u_int16_t es; + u_int16_t fs; + u_int16_t gs; + + /* The next 2 registers are included with MD_CONTEXT_AMD64_CONTROL */ + u_int16_t ss; + u_int32_t eflags; + + /* The next 6 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */ + u_int64_t dr0; + u_int64_t dr1; + u_int64_t dr2; + u_int64_t dr3; + u_int64_t dr6; + u_int64_t dr7; + + /* The next 4 registers are included with MD_CONTEXT_AMD64_INTEGER */ + u_int64_t rax; + u_int64_t rcx; + u_int64_t rdx; + u_int64_t rbx; + + /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ + u_int64_t rsp; + + /* The next 11 registers are included with MD_CONTEXT_AMD64_INTEGER */ + u_int64_t rbp; + u_int64_t rsi; + u_int64_t rdi; + u_int64_t r8; + u_int64_t r9; + u_int64_t r10; + u_int64_t r11; + u_int64_t r12; + u_int64_t r13; + u_int64_t r14; + u_int64_t r15; + + /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ + u_int64_t rip; + + /* The next set of registers are included with + * MD_CONTEXT_AMD64_FLOATING_POINT + */ + union { + MDXmmSaveArea32AMD64 flt_save; + struct { + u_int128_t header[2]; + u_int128_t legacy[8]; + u_int128_t xmm0; + u_int128_t xmm1; + u_int128_t xmm2; + u_int128_t xmm3; + u_int128_t xmm4; + u_int128_t xmm5; + u_int128_t xmm6; + u_int128_t xmm7; + u_int128_t xmm8; + u_int128_t xmm9; + u_int128_t xmm10; + u_int128_t xmm11; + u_int128_t xmm12; + u_int128_t xmm13; + u_int128_t xmm14; + u_int128_t xmm15; + } sse_registers; + }; + + u_int128_t vector_register[MD_CONTEXT_AMD64_VR_COUNT]; + u_int64_t vector_control; + + /* The next 5 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */ + u_int64_t debug_control; + u_int64_t last_branch_to_rip; + u_int64_t last_branch_from_rip; + u_int64_t last_exception_to_rip; + u_int64_t last_exception_from_rip; + +} MDRawContextAMD64; /* CONTEXT */ + +/* For (MDRawContextAMD64).context_flags. These values indicate the type of + * context stored in the structure. The high 26 bits identify the CPU, the + * low 6 bits identify the type of context saved. */ +#define MD_CONTEXT_AMD64_CONTROL (MD_CONTEXT_AMD64 | 0x00000001) + /* CONTEXT_CONTROL */ +#define MD_CONTEXT_AMD64_INTEGER (MD_CONTEXT_AMD64 | 0x00000002) + /* CONTEXT_INTEGER */ +#define MD_CONTEXT_AMD64_SEGMENTS (MD_CONTEXT_AMD64 | 0x00000004) + /* CONTEXT_SEGMENTS */ +#define MD_CONTEXT_AMD64_FLOATING_POINT (MD_CONTEXT_AMD64 | 0x00000008) + /* CONTEXT_FLOATING_POINT */ +#define MD_CONTEXT_AMD64_DEBUG_REGISTERS (MD_CONTEXT_AMD64 | 0x00000010) + /* CONTEXT_DEBUG_REGISTERS */ +/* WinNT.h refers to CONTEXT_MMX_REGISTERS but doesn't appear to define it + * I think it really means CONTEXT_FLOATING_POINT. + */ + +#define MD_CONTEXT_AMD64_FULL (MD_CONTEXT_AMD64_CONTROL | \ + MD_CONTEXT_AMD64_INTEGER | \ + MD_CONTEXT_AMD64_FLOATING_POINT) + /* CONTEXT_FULL */ + +#define MD_CONTEXT_AMD64_ALL (MD_CONTEXT_AMD64_FULL | \ + MD_CONTEXT_AMD64_SEGMENTS | \ + MD_CONTEXT_X86_DEBUG_REGISTERS) + /* CONTEXT_ALL */ + + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_ppc.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_ppc.h new file mode 100644 index 00000000..038e921a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_ppc.h @@ -0,0 +1,163 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on ppc. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai + * Change to split into its own file: Neal Sidhwaney */ + +/* + * Breakpad minidump extension for PowerPC support. Based on Darwin/Mac OS X' + * mach/ppc/_types.h + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ + +#define MD_FLOATINGSAVEAREA_PPC_FPR_COUNT 32 + +typedef struct { + /* fpregs is a double[32] in mach/ppc/_types.h, but a u_int64_t is used + * here for precise sizing. */ + u_int64_t fpregs[MD_FLOATINGSAVEAREA_PPC_FPR_COUNT]; + u_int32_t fpscr_pad; + u_int32_t fpscr; /* Status/control */ +} MDFloatingSaveAreaPPC; /* Based on ppc_float_state */ + + +#define MD_VECTORSAVEAREA_PPC_VR_COUNT 32 + +typedef struct { + /* Vector registers (including vscr) are 128 bits, but mach/ppc/_types.h + * exposes them as four 32-bit quantities. */ + u_int128_t save_vr[MD_VECTORSAVEAREA_PPC_VR_COUNT]; + u_int128_t save_vscr; /* Status/control */ + u_int32_t save_pad5[4]; + u_int32_t save_vrvalid; /* Identifies which vector registers are saved */ + u_int32_t save_pad6[7]; +} MDVectorSaveAreaPPC; /* ppc_vector_state */ + + +#define MD_CONTEXT_PPC_GPR_COUNT 32 + +/* Use the same 32-bit alignment when accessing this structure from 64-bit code + * as is used natively in 32-bit code. #pragma pack is a MSVC extension + * supported by gcc. */ +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#pragma pack(4) +#else +#pragma pack(push, 4) +#endif + +typedef struct { + /* context_flags is not present in ppc_thread_state, but it aids + * identification of MDRawContextPPC among other raw context types, + * and it guarantees alignment when we get to float_save. */ + u_int32_t context_flags; + + u_int32_t srr0; /* Machine status save/restore: stores pc + * (instruction) */ + u_int32_t srr1; /* Machine status save/restore: stores msr + * (ps, program/machine state) */ + /* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is + * used for brevity. */ + u_int32_t gpr[MD_CONTEXT_PPC_GPR_COUNT]; + u_int32_t cr; /* Condition */ + u_int32_t xer; /* Integer (fiXed-point) exception */ + u_int32_t lr; /* Link */ + u_int32_t ctr; /* Count */ + u_int32_t mq; /* Multiply/Quotient (PPC 601, POWER only) */ + u_int32_t vrsave; /* Vector save */ + + /* float_save and vector_save aren't present in ppc_thread_state, but + * are represented in separate structures that still define a thread's + * context. */ + MDFloatingSaveAreaPPC float_save; + MDVectorSaveAreaPPC vector_save; +} MDRawContextPPC; /* Based on ppc_thread_state */ + +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#pragma pack(0) +#else +#pragma pack(pop) +#endif + +/* For (MDRawContextPPC).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its + * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other + * CPUs. */ +#define MD_CONTEXT_PPC 0x20000000 +#define MD_CONTEXT_PPC_BASE (MD_CONTEXT_PPC | 0x00000001) +#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008) +#define MD_CONTEXT_PPC_VECTOR (MD_CONTEXT_PPC | 0x00000020) + +#define MD_CONTEXT_PPC_FULL MD_CONTEXT_PPC_BASE +#define MD_CONTEXT_PPC_ALL (MD_CONTEXT_PPC_FULL | \ + MD_CONTEXT_PPC_FLOATING_POINT | \ + MD_CONTEXT_PPC_VECTOR) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_ppc64.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_ppc64.h new file mode 100644 index 00000000..a788e5d1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_ppc64.h @@ -0,0 +1,129 @@ +/* Copyright (c) 2008, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on ppc64. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Neal Sidhwaney */ + + +/* + * Breakpad minidump extension for PPC64 support. Based on Darwin/Mac OS X' + * mach/ppc/_types.h + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ + +#include "minidump_cpu_ppc.h" + +// these types are the same in ppc64 & ppc +typedef MDFloatingSaveAreaPPC MDFloatingSaveAreaPPC64; +typedef MDVectorSaveAreaPPC MDVectorSaveAreaPPC64; + +#define MD_CONTEXT_PPC64_GPR_COUNT MD_CONTEXT_PPC_GPR_COUNT + +typedef struct { + /* context_flags is not present in ppc_thread_state, but it aids + * identification of MDRawContextPPC among other raw context types, + * and it guarantees alignment when we get to float_save. */ + u_int64_t context_flags; + + u_int64_t srr0; /* Machine status save/restore: stores pc + * (instruction) */ + u_int64_t srr1; /* Machine status save/restore: stores msr + * (ps, program/machine state) */ + /* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is + * used for brevity. */ + u_int64_t gpr[MD_CONTEXT_PPC64_GPR_COUNT]; + u_int64_t cr; /* Condition */ + u_int64_t xer; /* Integer (fiXed-point) exception */ + u_int64_t lr; /* Link */ + u_int64_t ctr; /* Count */ + u_int64_t vrsave; /* Vector save */ + + /* float_save and vector_save aren't present in ppc_thread_state, but + * are represented in separate structures that still define a thread's + * context. */ + MDFloatingSaveAreaPPC float_save; + MDVectorSaveAreaPPC vector_save; +} MDRawContextPPC64; /* Based on ppc_thread_state */ + +/* For (MDRawContextPPC).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its + * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other + * CPUs. */ +#define MD_CONTEXT_PPC 0x20000000 +#define MD_CONTEXT_PPC_BASE (MD_CONTEXT_PPC | 0x00000001) +#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008) +#define MD_CONTEXT_PPC_VECTOR (MD_CONTEXT_PPC | 0x00000020) + +#define MD_CONTEXT_PPC_FULL MD_CONTEXT_PPC_BASE +#define MD_CONTEXT_PPC_ALL (MD_CONTEXT_PPC_FULL | \ + MD_CONTEXT_PPC_FLOATING_POINT | \ + MD_CONTEXT_PPC_VECTOR) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_sparc.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_sparc.h new file mode 100644 index 00000000..ee95b64e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_sparc.h @@ -0,0 +1,158 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on sparc. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai + * Change to split into its own file: Neal Sidhwaney */ + +/* + * SPARC support, see (solaris)sys/procfs_isa.h also + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ + +#define MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT 32 + +typedef struct { + + /* FPU floating point regs */ + u_int64_t regs[MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT]; + + u_int64_t filler; + u_int64_t fsr; /* FPU status register */ +} MDFloatingSaveAreaSPARC; /* FLOATING_SAVE_AREA */ + +#define MD_CONTEXT_SPARC_GPR_COUNT 32 + +typedef struct { + /* The next field determines the layout of the structure, and which parts + * of it are populated + */ + u_int32_t context_flags; + u_int32_t flag_pad; + /* + * General register access (SPARC). + * Don't confuse definitions here with definitions in . + * Registers are 32 bits for ILP32, 64 bits for LP64. + * SPARC V7/V8 is for 32bit, SPARC V9 is for 64bit + */ + + /* 32 Integer working registers */ + + /* g_r[0-7] global registers(g0-g7) + * g_r[8-15] out registers(o0-o7) + * g_r[16-23] local registers(l0-l7) + * g_r[24-31] in registers(i0-i7) + */ + u_int64_t g_r[MD_CONTEXT_SPARC_GPR_COUNT]; + + /* several control registers */ + + /* Processor State register(PSR) for SPARC V7/V8 + * Condition Code register (CCR) for SPARC V9 + */ + u_int64_t ccr; + + u_int64_t pc; /* Program Counter register (PC) */ + u_int64_t npc; /* Next Program Counter register (nPC) */ + u_int64_t y; /* Y register (Y) */ + + /* Address Space Identifier register (ASI) for SPARC V9 + * WIM for SPARC V7/V8 + */ + u_int64_t asi; + + /* Floating-Point Registers State register (FPRS) for SPARC V9 + * TBR for for SPARC V7/V8 + */ + u_int64_t fprs; + + /* The next field is included with MD_CONTEXT_SPARC_FLOATING_POINT */ + MDFloatingSaveAreaSPARC float_save; + +} MDRawContextSPARC; /* CONTEXT_SPARC */ + +/* For (MDRawContextSPARC).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_SPARC is Breakpad-defined. Its + * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other + * CPUs. */ +#define MD_CONTEXT_SPARC 0x10000000 +#define MD_CONTEXT_SPARC_CONTROL (MD_CONTEXT_SPARC | 0x00000001) +#define MD_CONTEXT_SPARC_INTEGER (MD_CONTEXT_SPARC | 0x00000002) +#define MD_CONTEXT_SAPARC_FLOATING_POINT (MD_CONTEXT_SPARC | 0x00000004) +#define MD_CONTEXT_SAPARC_EXTRA (MD_CONTEXT_SPARC | 0x00000008) + +#define MD_CONTEXT_SPARC_FULL (MD_CONTEXT_SPARC_CONTROL | \ + MD_CONTEXT_SPARC_INTEGER) + +#define MD_CONTEXT_SPARC_ALL (MD_CONTEXT_SPARC_FULL | \ + MD_CONTEXT_SAPARC_FLOATING_POINT | \ + MD_CONTEXT_SAPARC_EXTRA) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_x86.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_x86.h new file mode 100644 index 00000000..4dbc0e9a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_cpu_x86.h @@ -0,0 +1,172 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on x86. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ + +#define MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE 80 + /* SIZE_OF_80387_REGISTERS */ + +typedef struct { + u_int32_t control_word; + u_int32_t status_word; + u_int32_t tag_word; + u_int32_t error_offset; + u_int32_t error_selector; + u_int32_t data_offset; + u_int32_t data_selector; + + /* register_area contains eight 80-bit (x87 "long double") quantities for + * floating-point registers %st0 (%mm0) through %st7 (%mm7). */ + u_int8_t register_area[MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE]; + u_int32_t cr0_npx_state; +} MDFloatingSaveAreaX86; /* FLOATING_SAVE_AREA */ + + +#define MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE 512 + /* MAXIMUM_SUPPORTED_EXTENSION */ + +typedef struct { + /* The next field determines the layout of the structure, and which parts + * of it are populated */ + u_int32_t context_flags; + + /* The next 6 registers are included with MD_CONTEXT_X86_DEBUG_REGISTERS */ + u_int32_t dr0; + u_int32_t dr1; + u_int32_t dr2; + u_int32_t dr3; + u_int32_t dr6; + u_int32_t dr7; + + /* The next field is included with MD_CONTEXT_X86_FLOATING_POINT */ + MDFloatingSaveAreaX86 float_save; + + /* The next 4 registers are included with MD_CONTEXT_X86_SEGMENTS */ + u_int32_t gs; + u_int32_t fs; + u_int32_t es; + u_int32_t ds; + /* The next 6 registers are included with MD_CONTEXT_X86_INTEGER */ + u_int32_t edi; + u_int32_t esi; + u_int32_t ebx; + u_int32_t edx; + u_int32_t ecx; + u_int32_t eax; + + /* The next 6 registers are included with MD_CONTEXT_X86_CONTROL */ + u_int32_t ebp; + u_int32_t eip; + u_int32_t cs; /* WinNT.h says "must be sanitized" */ + u_int32_t eflags; /* WinNT.h says "must be sanitized" */ + u_int32_t esp; + u_int32_t ss; + + /* The next field is included with MD_CONTEXT_X86_EXTENDED_REGISTERS. + * It contains vector (MMX/SSE) registers. It it laid out in the + * format used by the fxsave and fsrstor instructions, so it includes + * a copy of the x87 floating-point registers as well. See FXSAVE in + * "Intel Architecture Software Developer's Manual, Volume 2." */ + u_int8_t extended_registers[ + MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE]; +} MDRawContextX86; /* CONTEXT */ + +/* For (MDRawContextX86).context_flags. These values indicate the type of + * context stored in the structure. The high 26 bits identify the CPU, the + * low 6 bits identify the type of context saved. */ +#define MD_CONTEXT_X86 0x00010000 + /* CONTEXT_i386, CONTEXT_i486: identifies CPU */ +#define MD_CONTEXT_X86_CONTROL (MD_CONTEXT_X86 | 0x00000001) + /* CONTEXT_CONTROL */ +#define MD_CONTEXT_X86_INTEGER (MD_CONTEXT_X86 | 0x00000002) + /* CONTEXT_INTEGER */ +#define MD_CONTEXT_X86_SEGMENTS (MD_CONTEXT_X86 | 0x00000004) + /* CONTEXT_SEGMENTS */ +#define MD_CONTEXT_X86_FLOATING_POINT (MD_CONTEXT_X86 | 0x00000008) + /* CONTEXT_FLOATING_POINT */ +#define MD_CONTEXT_X86_DEBUG_REGISTERS (MD_CONTEXT_X86 | 0x00000010) + /* CONTEXT_DEBUG_REGISTERS */ +#define MD_CONTEXT_X86_EXTENDED_REGISTERS (MD_CONTEXT_X86 | 0x00000020) + /* CONTEXT_EXTENDED_REGISTERS */ + +#define MD_CONTEXT_X86_FULL (MD_CONTEXT_X86_CONTROL | \ + MD_CONTEXT_X86_INTEGER | \ + MD_CONTEXT_X86_SEGMENTS) + /* CONTEXT_FULL */ + +#define MD_CONTEXT_X86_ALL (MD_CONTEXT_X86_FULL | \ + MD_CONTEXT_X86_FLOATING_POINT | \ + MD_CONTEXT_X86_DEBUG_REGISTERS | \ + MD_CONTEXT_X86_EXTENDED_REGISTERS) + /* CONTEXT_ALL */ + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_linux.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_linux.h new file mode 100644 index 00000000..d52c7519 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_linux.h @@ -0,0 +1,85 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_linux.h: A definition of exception codes for + * Linux + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + + +/* For (MDException).exception_code. These values come from bits/signum.h. + */ +typedef enum { + MD_EXCEPTION_CODE_LIN_SIGHUP = 1, /* Hangup (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGINT = 2, /* Interrupt (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGQUIT = 3, /* Quit (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGILL = 4, /* Illegal instruction (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGTRAP = 5, /* Trace trap (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGABRT = 6, /* Abort (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGBUS = 7, /* BUS error (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGFPE = 8, /* Floating-point exception (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGKILL = 9, /* Kill, unblockable (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGUSR1 = 10, /* User-defined signal 1 (POSIX). */ + MD_EXCEPTION_CODE_LIN_SIGSEGV = 11, /* Segmentation violation (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGUSR2 = 12, /* User-defined signal 2 (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGPIPE = 13, /* Broken pipe (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGALRM = 14, /* Alarm clock (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTERM = 15, /* Termination (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGSTKFLT = 16, /* Stack faultd */ + MD_EXCEPTION_CODE_LIN_SIGCHLD = 17, /* Child status has changed (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGCONT = 18, /* Continue (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGSTOP = 19, /* Stop, unblockable (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTSTP = 20, /* Keyboard stop (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTTIN = 21, /* Background read from tty (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTTOU = 22, /* Background write to tty (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGURG = 23, + /* Urgent condition on socket (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGXCPU = 24, /* CPU limit exceeded (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGXFSZ = 25, + /* File size limit exceeded (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGVTALRM = 26, /* Virtual alarm clock (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGPROF = 27, /* Profiling alarm clock (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGWINCH = 28, /* Window size change (4.3 BSD, Sun) */ + MD_EXCEPTION_CODE_LIN_SIGIO = 29, /* I/O now possible (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGPWR = 30, /* Power failure restart (System V) */ + MD_EXCEPTION_CODE_LIN_SIGSYS = 31 /* Bad system call */ +} MDExceptionCodeLinux; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_mac.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_mac.h new file mode 100644 index 00000000..5fba44ca --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_mac.h @@ -0,0 +1,193 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_mac.h: A definition of exception codes for Mac + * OS X + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +/* For (MDException).exception_code. Breakpad minidump extension for Mac OS X + * support. Based on Darwin/Mac OS X' mach/exception_types.h. This is + * what Mac OS X calls an "exception", not a "code". */ +typedef enum { + /* Exception code. The high 16 bits of exception_code contains one of + * these values. */ + MD_EXCEPTION_MAC_BAD_ACCESS = 1, /* code can be a kern_return_t */ + /* EXC_BAD_ACCESS */ + MD_EXCEPTION_MAC_BAD_INSTRUCTION = 2, /* code is CPU-specific */ + /* EXC_BAD_INSTRUCTION */ + MD_EXCEPTION_MAC_ARITHMETIC = 3, /* code is CPU-specific */ + /* EXC_ARITHMETIC */ + MD_EXCEPTION_MAC_EMULATION = 4, /* code is CPU-specific */ + /* EXC_EMULATION */ + MD_EXCEPTION_MAC_SOFTWARE = 5, + /* EXC_SOFTWARE */ + MD_EXCEPTION_MAC_BREAKPOINT = 6, /* code is CPU-specific */ + /* EXC_BREAKPOINT */ + MD_EXCEPTION_MAC_SYSCALL = 7, + /* EXC_SYSCALL */ + MD_EXCEPTION_MAC_MACH_SYSCALL = 8, + /* EXC_MACH_SYSCALL */ + MD_EXCEPTION_MAC_RPC_ALERT = 9 + /* EXC_RPC_ALERT */ +} MDExceptionMac; + +/* For (MDException).exception_flags. Breakpad minidump extension for Mac OS X + * support. Based on Darwin/Mac OS X' mach/ppc/exception.h and + * mach/i386/exception.h. This is what Mac OS X calls a "code". */ +typedef enum { + /* With MD_EXCEPTION_BAD_ACCESS. These are relevant kern_return_t values + * from mach/kern_return.h. */ + MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS = 1, + /* KERN_INVALID_ADDRESS */ + MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE = 2, + /* KERN_PROTECTION_FAILURE */ + MD_EXCEPTION_CODE_MAC_NO_ACCESS = 8, + /* KERN_NO_ACCESS */ + MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE = 9, + /* KERN_MEMORY_FAILURE */ + MD_EXCEPTION_CODE_MAC_MEMORY_ERROR = 10, + /* KERN_MEMORY_ERROR */ + + /* With MD_EXCEPTION_SOFTWARE */ + MD_EXCEPTION_CODE_MAC_BAD_SYSCALL = 0x00010000, /* Mach SIGSYS */ + MD_EXCEPTION_CODE_MAC_BAD_PIPE = 0x00010001, /* Mach SIGPIPE */ + MD_EXCEPTION_CODE_MAC_ABORT = 0x00010002, /* Mach SIGABRT */ + + /* With MD_EXCEPTION_MAC_BAD_ACCESS on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ = 0x0101, + /* EXC_PPC_VM_PROT_READ */ + MD_EXCEPTION_CODE_MAC_PPC_BADSPACE = 0x0102, + /* EXC_PPC_BADSPACE */ + MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED = 0x0103, + /* EXC_PPC_UNALIGNED */ + + /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL = 1, + /* EXC_PPC_INVALID_SYSCALL */ + MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION = 2, + /* EXC_PPC_UNIPL_INST */ + MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION = 3, + /* EXC_PPC_PRIVINST */ + MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER = 4, + /* EXC_PPC_PRIVREG */ + MD_EXCEPTION_CODE_MAC_PPC_TRACE = 5, + /* EXC_PPC_TRACE */ + MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR = 6, + /* EXC_PPC_PERFMON */ + + /* With MD_EXCEPTION_MAC_ARITHMETIC on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW = 1, + /* EXC_PPC_OVERFLOW */ + MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE = 2, + /* EXC_PPC_ZERO_DIVIDE */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT = 3, + /* EXC_FLT_INEXACT */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE = 4, + /* EXC_PPC_FLT_ZERO_DIVIDE */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW = 5, + /* EXC_PPC_FLT_UNDERFLOW */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW = 6, + /* EXC_PPC_FLT_OVERFLOW */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER = 7, + /* EXC_PPC_FLT_NOT_A_NUMBER */ + + /* With MD_EXCEPTION_MAC_EMULATION on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION = 8, + /* EXC_PPC_NOEMULATION */ + MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST = 9, + /* EXC_PPC_ALTIVECASSIST */ + + /* With MD_EXCEPTION_MAC_SOFTWARE on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_TRAP = 0x00000001, /* EXC_PPC_TRAP */ + MD_EXCEPTION_CODE_MAC_PPC_MIGRATE = 0x00010100, /* EXC_PPC_MIGRATE */ + + /* With MD_EXCEPTION_MAC_BREAKPOINT on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT = 1, /* EXC_PPC_BREAKPOINT */ + + /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86, see also x86 interrupt + * values below. */ + MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION = 1, /* EXC_I386_INVOP */ + + /* With MD_EXCEPTION_MAC_ARITHMETIC on x86 */ + MD_EXCEPTION_CODE_MAC_X86_DIV = 1, /* EXC_I386_DIV */ + MD_EXCEPTION_CODE_MAC_X86_INTO = 2, /* EXC_I386_INTO */ + MD_EXCEPTION_CODE_MAC_X86_NOEXT = 3, /* EXC_I386_NOEXT */ + MD_EXCEPTION_CODE_MAC_X86_EXTOVR = 4, /* EXC_I386_EXTOVR */ + MD_EXCEPTION_CODE_MAC_X86_EXTERR = 5, /* EXC_I386_EXTERR */ + MD_EXCEPTION_CODE_MAC_X86_EMERR = 6, /* EXC_I386_EMERR */ + MD_EXCEPTION_CODE_MAC_X86_BOUND = 7, /* EXC_I386_BOUND */ + MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR = 8, /* EXC_I386_SSEEXTERR */ + + /* With MD_EXCEPTION_MAC_BREAKPOINT on x86 */ + MD_EXCEPTION_CODE_MAC_X86_SGL = 1, /* EXC_I386_SGL */ + MD_EXCEPTION_CODE_MAC_X86_BPT = 2, /* EXC_I386_BPT */ + + /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86. These are the raw + * x86 interrupt codes. Most of these are mapped to other Mach + * exceptions and codes, are handled, or should not occur in user space. + * A few of these will do occur with MD_EXCEPTION_MAC_BAD_INSTRUCTION. */ + /* EXC_I386_DIVERR = 0: mapped to EXC_ARITHMETIC/EXC_I386_DIV */ + /* EXC_I386_SGLSTP = 1: mapped to EXC_BREAKPOINT/EXC_I386_SGL */ + /* EXC_I386_NMIFLT = 2: should not occur in user space */ + /* EXC_I386_BPTFLT = 3: mapped to EXC_BREAKPOINT/EXC_I386_BPT */ + /* EXC_I386_INTOFLT = 4: mapped to EXC_ARITHMETIC/EXC_I386_INTO */ + /* EXC_I386_BOUNDFLT = 5: mapped to EXC_ARITHMETIC/EXC_I386_BOUND */ + /* EXC_I386_INVOPFLT = 6: mapped to EXC_BAD_INSTRUCTION/EXC_I386_INVOP */ + /* EXC_I386_NOEXTFLT = 7: should be handled by the kernel */ + /* EXC_I386_DBLFLT = 8: should be handled (if possible) by the kernel */ + /* EXC_I386_EXTOVRFLT = 9: mapped to EXC_BAD_ACCESS/(PROT_READ|PROT_EXEC) */ + MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT = 10, + /* EXC_INVTSSFLT */ + MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT = 11, + /* EXC_SEGNPFLT */ + MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT = 12, + /* EXC_STKFLT */ + MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT = 13, + /* EXC_GPFLT */ + /* EXC_I386_PGFLT = 14: should not occur in user space */ + /* EXC_I386_EXTERRFLT = 16: mapped to EXC_ARITHMETIC/EXC_I386_EXTERR */ + MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT = 17 + /* EXC_ALIGNFLT (for vector operations) */ + /* EXC_I386_ENOEXTFLT = 32: should be handled by the kernel */ + /* EXC_I386_ENDPERR = 33: should not occur */ +} MDExceptionCodeMac; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_OSX_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_solaris.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_solaris.h new file mode 100644 index 00000000..d48632ac --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_solaris.h @@ -0,0 +1,94 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_solaris.h: A definition of exception codes for + * Solaris + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +/* For (MDException).exception_code. These values come from sys/iso/signal_iso.h + */ +typedef enum { + MD_EXCEPTION_CODE_SOL_SIGHUP = 1, /* Hangup */ + MD_EXCEPTION_CODE_SOL_SIGINT = 2, /* interrupt (rubout) */ + MD_EXCEPTION_CODE_SOL_SIGQUIT = 3, /* quit (ASCII FS) */ + MD_EXCEPTION_CODE_SOL_SIGILL = 4, /* illegal instruction (not reset when caught) */ + MD_EXCEPTION_CODE_SOL_SIGTRAP = 5, /* trace trap (not reset when caught) */ + MD_EXCEPTION_CODE_SOL_SIGIOT = 6, /* IOT instruction */ + MD_EXCEPTION_CODE_SOL_SIGABRT = 6, /* used by abort, replace SIGIOT in the future */ + MD_EXCEPTION_CODE_SOL_SIGEMT = 7, /* EMT instruction */ + MD_EXCEPTION_CODE_SOL_SIGFPE = 8, /* floating point exception */ + MD_EXCEPTION_CODE_SOL_SIGKILL = 9, /* kill (cannot be caught or ignored) */ + MD_EXCEPTION_CODE_SOL_SIGBUS = 10, /* bus error */ + MD_EXCEPTION_CODE_SOL_SIGSEGV = 11, /* segmentation violation */ + MD_EXCEPTION_CODE_SOL_SIGSYS = 12, /* bad argument to system call */ + MD_EXCEPTION_CODE_SOL_SIGPIPE = 13, /* write on a pipe with no one to read it */ + MD_EXCEPTION_CODE_SOL_SIGALRM = 14, /* alarm clock */ + MD_EXCEPTION_CODE_SOL_SIGTERM = 15, /* software termination signal from kill */ + MD_EXCEPTION_CODE_SOL_SIGUSR1 = 16, /* user defined signal 1 */ + MD_EXCEPTION_CODE_SOL_SIGUSR2 = 17, /* user defined signal 2 */ + MD_EXCEPTION_CODE_SOL_SIGCLD = 18, /* child status change */ + MD_EXCEPTION_CODE_SOL_SIGCHLD = 18, /* child status change alias (POSIX) */ + MD_EXCEPTION_CODE_SOL_SIGPWR = 19, /* power-fail restart */ + MD_EXCEPTION_CODE_SOL_SIGWINCH = 20, /* window size change */ + MD_EXCEPTION_CODE_SOL_SIGURG = 21, /* urgent socket condition */ + MD_EXCEPTION_CODE_SOL_SIGPOLL = 22, /* pollable event occured */ + MD_EXCEPTION_CODE_SOL_SIGIO = 22, /* socket I/O possible (SIGPOLL alias) */ + MD_EXCEPTION_CODE_SOL_SIGSTOP = 23, /* stop (cannot be caught or ignored) */ + MD_EXCEPTION_CODE_SOL_SIGTSTP = 24, /* user stop requested from tty */ + MD_EXCEPTION_CODE_SOL_SIGCONT = 25, /* stopped process has been continued */ + MD_EXCEPTION_CODE_SOL_SIGTTIN = 26, /* background tty read attempted */ + MD_EXCEPTION_CODE_SOL_SIGTTOU = 27, /* background tty write attempted */ + MD_EXCEPTION_CODE_SOL_SIGVTALRM = 28, /* virtual timer expired */ + MD_EXCEPTION_CODE_SOL_SIGPROF = 29, /* profiling timer expired */ + MD_EXCEPTION_CODE_SOL_SIGXCPU = 30, /* exceeded cpu limit */ + MD_EXCEPTION_CODE_SOL_SIGXFSZ = 31, /* exceeded file size limit */ + MD_EXCEPTION_CODE_SOL_SIGWAITING = 32, /* reserved signal no longer used by threading code */ + MD_EXCEPTION_CODE_SOL_SIGLWP = 33, /* reserved signal no longer used by threading code */ + MD_EXCEPTION_CODE_SOL_SIGFREEZE = 34, /* special signal used by CPR */ + MD_EXCEPTION_CODE_SOL_SIGTHAW = 35, /* special signal used by CPR */ + MD_EXCEPTION_CODE_SOL_SIGCANCEL = 36, /* reserved signal for thread cancellation */ + MD_EXCEPTION_CODE_SOL_SIGLOST = 37, /* resource lost (eg, record-lock lost) */ + MD_EXCEPTION_CODE_SOL_SIGXRES = 38, /* resource control exceeded */ + MD_EXCEPTION_CODE_SOL_SIGJVM1 = 39, /* reserved signal for Java Virtual Machine */ + MD_EXCEPTION_CODE_SOL_SIGJVM2 = 40 /* reserved signal for Java Virtual Machine */ +} MDExceptionCodeSolaris; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_win32.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_win32.h new file mode 100644 index 00000000..7fd4bc4f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_exception_win32.h @@ -0,0 +1,102 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_win32.h: Definitions of exception codes for + * Win32 platform + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + + +/* For (MDException).exception_code. These values come from WinBase.h + * and WinNT.h (names beginning with EXCEPTION_ are in WinBase.h, + * they are STATUS_ in WinNT.h). */ +typedef enum { + MD_EXCEPTION_CODE_WIN_CONTROL_C = 0x40010005, + /* DBG_CONTROL_C */ + MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION = 0x80000001, + /* EXCEPTION_GUARD_PAGE */ + MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT = 0x80000002, + /* EXCEPTION_DATATYPE_MISALIGNMENT */ + MD_EXCEPTION_CODE_WIN_BREAKPOINT = 0x80000003, + /* EXCEPTION_BREAKPOINT */ + MD_EXCEPTION_CODE_WIN_SINGLE_STEP = 0x80000004, + /* EXCEPTION_SINGLE_STEP */ + MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION = 0xc0000005, + /* EXCEPTION_ACCESS_VIOLATION */ + MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR = 0xc0000006, + /* EXCEPTION_IN_PAGE_ERROR */ + MD_EXCEPTION_CODE_WIN_INVALID_HANDLE = 0xc0000008, + /* EXCEPTION_INVALID_HANDLE */ + MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION = 0xc000001d, + /* EXCEPTION_ILLEGAL_INSTRUCTION */ + MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION = 0xc0000025, + /* EXCEPTION_NONCONTINUABLE_EXCEPTION */ + MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION = 0xc0000026, + /* EXCEPTION_INVALID_DISPOSITION */ + MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED = 0xc000008c, + /* EXCEPTION_BOUNDS_EXCEEDED */ + MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND = 0xc000008d, + /* EXCEPTION_FLT_DENORMAL_OPERAND */ + MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO = 0xc000008e, + /* EXCEPTION_FLT_DIVIDE_BY_ZERO */ + MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT = 0xc000008f, + /* EXCEPTION_FLT_INEXACT_RESULT */ + MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION = 0xc0000090, + /* EXCEPTION_FLT_INVALID_OPERATION */ + MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW = 0xc0000091, + /* EXCEPTION_FLT_OVERFLOW */ + MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK = 0xc0000092, + /* EXCEPTION_FLT_STACK_CHECK */ + MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW = 0xc0000093, + /* EXCEPTION_FLT_UNDERFLOW */ + MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO = 0xc0000094, + /* EXCEPTION_INT_DIVIDE_BY_ZERO */ + MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW = 0xc0000095, + /* EXCEPTION_INT_OVERFLOW */ + MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION = 0xc0000096, + /* EXCEPTION_PRIV_INSTRUCTION */ + MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW = 0xc00000fd, + /* EXCEPTION_STACK_OVERFLOW */ + MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK = 0xc0000194 + /* EXCEPTION_POSSIBLE_DEADLOCK */ +} MDExceptionCodeWin; + + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_format.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_format.h new file mode 100644 index 00000000..4d9e767f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_format.h @@ -0,0 +1,721 @@ +/* Copyright (c) 2006, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + + +#if defined(_MSC_VER) +/* Disable "zero-sized array in struct/union" warnings when compiling in + * MSVC. DbgHelp.h does this too. */ +#pragma warning(push) +#pragma warning(disable:4200) +#endif /* _MSC_VER */ + + +/* + * guiddef.h + */ + +typedef struct { + u_int32_t data1; + u_int16_t data2; + u_int16_t data3; + u_int8_t data4[8]; +} MDGUID; /* GUID */ + + +/* + * WinNT.h + */ + +/* Non-x86 CPU identifiers found in the high 26 bits of + * (MDRawContext*).context_flags. These aren't used by Breakpad, but are + * defined here for reference, to avoid assigning values that conflict + * (although some values already conflict). */ +#define MD_CONTEXT_IA64 0x00080000 /* CONTEXT_IA64 */ +#define MD_CONTEXT_AMD64 0x00100000 /* CONTEXT_AMD64 */ +/* Additional values from winnt.h in the Windows CE 5.0 SDK: */ +#define MD_CONTEXT_SHX 0x000000c0 /* CONTEXT_SH4 (Super-H, includes SH3) */ +#define MD_CONTEXT_ARM 0x00000040 /* CONTEXT_ARM (0x40 bit set in SHx?) */ +#define MD_CONTEXT_MIPS 0x00010000 /* CONTEXT_R4000 (same value as x86?) */ +#define MD_CONTEXT_ALPHA 0x00020000 /* CONTEXT_ALPHA */ + +#define MD_CONTEXT_CPU_MASK 0xffffffc0 + + +/* This is a base type for MDRawContextX86 and MDRawContextPPC. This + * structure should never be allocated directly. The actual structure type + * can be determined by examining the context_flags field. */ +typedef struct { + u_int32_t context_flags; +} MDRawContextBase; + +#include "minidump_cpu_sparc.h" +#include "minidump_cpu_x86.h" +#include "minidump_cpu_ppc.h" +#include "minidump_cpu_ppc64.h" +#include "minidump_cpu_amd64.h" + + +/* + * WinVer.h + */ + + +typedef struct { + u_int32_t signature; + u_int32_t struct_version; + u_int32_t file_version_hi; + u_int32_t file_version_lo; + u_int32_t product_version_hi; + u_int32_t product_version_lo; + u_int32_t file_flags_mask; /* Identifies valid bits in fileFlags */ + u_int32_t file_flags; + u_int32_t file_os; + u_int32_t file_type; + u_int32_t file_subtype; + u_int32_t file_date_hi; + u_int32_t file_date_lo; +} MDVSFixedFileInfo; /* VS_FIXEDFILEINFO */ + +/* For (MDVSFixedFileInfo).signature */ +#define MD_VSFIXEDFILEINFO_SIGNATURE 0xfeef04bd + /* VS_FFI_SIGNATURE */ + +/* For (MDVSFixedFileInfo).version */ +#define MD_VSFIXEDFILEINFO_VERSION 0x00010000 + /* VS_FFI_STRUCVERSION */ + +/* For (MDVSFixedFileInfo).file_flags_mask and + * (MDVSFixedFileInfo).file_flags */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG 0x00000001 + /* VS_FF_DEBUG */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRERELEASE 0x00000002 + /* VS_FF_PRERELEASE */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PATCHED 0x00000004 + /* VS_FF_PATCHED */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRIVATEBUILD 0x00000008 + /* VS_FF_PRIVATEBUILD */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_INFOINFERRED 0x00000010 + /* VS_FF_INFOINFERRED */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_SPECIALBUILD 0x00000020 + /* VS_FF_SPECIALBUILD */ + +/* For (MDVSFixedFileInfo).file_os: high 16 bits */ +#define MD_VSFIXEDFILEINFO_FILE_OS_UNKNOWN 0 /* VOS_UNKNOWN */ +#define MD_VSFIXEDFILEINFO_FILE_OS_DOS (1 << 16) /* VOS_DOS */ +#define MD_VSFIXEDFILEINFO_FILE_OS_OS216 (2 << 16) /* VOS_OS216 */ +#define MD_VSFIXEDFILEINFO_FILE_OS_OS232 (3 << 16) /* VOS_OS232 */ +#define MD_VSFIXEDFILEINFO_FILE_OS_NT (4 << 16) /* VOS_NT */ +#define MD_VSFIXEDFILEINFO_FILE_OS_WINCE (5 << 16) /* VOS_WINCE */ +/* Low 16 bits */ +#define MD_VSFIXEDFILEINFO_FILE_OS__BASE 0 /* VOS__BASE */ +#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS16 1 /* VOS__WINDOWS16 */ +#define MD_VSFIXEDFILEINFO_FILE_OS__PM16 2 /* VOS__PM16 */ +#define MD_VSFIXEDFILEINFO_FILE_OS__PM32 3 /* VOS__PM32 */ +#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32 4 /* VOS__WINDOWS32 */ + +/* For (MDVSFixedFileInfo).file_type */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_UNKNOWN 0 /* VFT_UNKNOWN */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_APP 1 /* VFT_APP */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_DLL 2 /* VFT_DLL */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_DRV 3 /* VFT_DLL */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_FONT 4 /* VFT_FONT */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_VXD 5 /* VFT_VXD */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_STATIC_LIB 7 /* VFT_STATIC_LIB */ + +/* For (MDVSFixedFileInfo).file_subtype */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN 0 + /* VFT2_UNKNOWN */ +/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_DRV */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_PRINTER 1 + /* VFT2_DRV_PRINTER */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_KEYBOARD 2 + /* VFT2_DRV_KEYBOARD */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_LANGUAGE 3 + /* VFT2_DRV_LANGUAGE */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_DISPLAY 4 + /* VFT2_DRV_DISPLAY */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_MOUSE 5 + /* VFT2_DRV_MOUSE */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_NETWORK 6 + /* VFT2_DRV_NETWORK */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SYSTEM 7 + /* VFT2_DRV_SYSTEM */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INSTALLABLE 8 + /* VFT2_DRV_INSTALLABLE */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SOUND 9 + /* VFT2_DRV_SOUND */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_COMM 10 + /* VFT2_DRV_COMM */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INPUTMETHOD 11 + /* VFT2_DRV_INPUTMETHOD */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_VERSIONED_PRINTER 12 + /* VFT2_DRV_VERSIONED_PRINTER */ +/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_FONT */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_RASTER 1 + /* VFT2_FONT_RASTER */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_VECTOR 2 + /* VFT2_FONT_VECTOR */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_TRUETYPE 3 + /* VFT2_FONT_TRUETYPE */ + + +/* + * DbgHelp.h + */ + + +/* An MDRVA is an offset into the minidump file. The beginning of the + * MDRawHeader is at offset 0. */ +typedef u_int32_t MDRVA; /* RVA */ + +typedef struct { + u_int32_t data_size; + MDRVA rva; +} MDLocationDescriptor; /* MINIDUMP_LOCATION_DESCRIPTOR */ + + +typedef struct { + /* The base address of the memory range on the host that produced the + * minidump. */ + u_int64_t start_of_memory_range; + + MDLocationDescriptor memory; +} MDMemoryDescriptor; /* MINIDUMP_MEMORY_DESCRIPTOR */ + + +typedef struct { + u_int32_t signature; + u_int32_t version; + u_int32_t stream_count; + MDRVA stream_directory_rva; /* A |stream_count|-sized array of + * MDRawDirectory structures. */ + u_int32_t checksum; /* Can be 0. In fact, that's all that's + * been found in minidump files. */ + u_int32_t time_date_stamp; /* time_t */ + u_int64_t flags; +} MDRawHeader; /* MINIDUMP_HEADER */ + +/* For (MDRawHeader).signature and (MDRawHeader).version. Note that only the + * low 16 bits of (MDRawHeader).version are MD_HEADER_VERSION. Per the + * documentation, the high 16 bits are implementation-specific. */ +#define MD_HEADER_SIGNATURE 0x504d444d /* 'PMDM' */ + /* MINIDUMP_SIGNATURE */ +#define MD_HEADER_VERSION 0x0000a793 /* 42899 */ + /* MINIDUMP_VERSION */ + +/* For (MDRawHeader).flags: */ +typedef enum { + /* MD_NORMAL is the standard type of minidump. It includes full + * streams for the thread list, module list, exception, system info, + * and miscellaneous info. A memory list stream is also present, + * pointing to the same stack memory contained in the thread list, + * as well as a 256-byte region around the instruction address that + * was executing when the exception occurred. Stack memory is from + * 4 bytes below a thread's stack pointer up to the top of the + * memory region encompassing the stack. */ + MD_NORMAL = 0x00000000, + MD_WITH_DATA_SEGS = 0x00000001, + MD_WITH_FULL_MEMORY = 0x00000002, + MD_WITH_HANDLE_DATA = 0x00000004, + MD_FILTER_MEMORY = 0x00000008, + MD_SCAN_MEMORY = 0x00000010, + MD_WITH_UNLOADED_MODULES = 0x00000020, + MD_WITH_INDIRECTLY_REFERENCED_MEMORY = 0x00000040, + MD_FILTER_MODULE_PATHS = 0x00000080, + MD_WITH_PROCESS_THREAD_DATA = 0x00000100, + MD_WITH_PRIVATE_READ_WRITE_MEMORY = 0x00000200, + MD_WITHOUT_OPTIONAL_DATA = 0x00000400, + MD_WITH_FULL_MEMORY_INFO = 0x00000800, + MD_WITH_THREAD_INFO = 0x00001000, + MD_WITH_CODE_SEGS = 0x00002000 +} MDType; /* MINIDUMP_TYPE */ + + +typedef struct { + u_int32_t stream_type; + MDLocationDescriptor location; +} MDRawDirectory; /* MINIDUMP_DIRECTORY */ + +/* For (MDRawDirectory).stream_type */ +typedef enum { + MD_UNUSED_STREAM = 0, + MD_RESERVED_STREAM_0 = 1, + MD_RESERVED_STREAM_1 = 2, + MD_THREAD_LIST_STREAM = 3, /* MDRawThreadList */ + MD_MODULE_LIST_STREAM = 4, /* MDRawModuleList */ + MD_MEMORY_LIST_STREAM = 5, /* MDRawMemoryList */ + MD_EXCEPTION_STREAM = 6, /* MDRawExceptionStream */ + MD_SYSTEM_INFO_STREAM = 7, /* MDRawSystemInfo */ + MD_THREAD_EX_LIST_STREAM = 8, + MD_MEMORY_64_LIST_STREAM = 9, + MD_COMMENT_STREAM_A = 10, + MD_COMMENT_STREAM_W = 11, + MD_HANDLE_DATA_STREAM = 12, + MD_FUNCTION_TABLE_STREAM = 13, + MD_UNLOADED_MODULE_LIST_STREAM = 14, + MD_MISC_INFO_STREAM = 15, /* MDRawMiscInfo */ + MD_LAST_RESERVED_STREAM = 0x0000ffff, + + /* Breakpad extension types. 0x4767 = "Gg" */ + MD_BREAKPAD_INFO_STREAM = 0x47670001, /* MDRawBreakpadInfo */ + MD_ASSERTION_INFO_STREAM = 0x47670002 /* MDRawAssertionInfo */ +} MDStreamType; /* MINIDUMP_STREAM_TYPE */ + + +typedef struct { + u_int32_t length; /* Length of buffer in bytes (not characters), + * excluding 0-terminator */ + u_int16_t buffer[1]; /* UTF-16-encoded, 0-terminated */ +} MDString; /* MINIDUMP_STRING */ + +static const size_t MDString_minsize = offsetof(MDString, buffer[0]); + + +typedef struct { + u_int32_t thread_id; + u_int32_t suspend_count; + u_int32_t priority_class; + u_int32_t priority; + u_int64_t teb; /* Thread environment block */ + MDMemoryDescriptor stack; + MDLocationDescriptor thread_context; /* MDRawContext[CPU] */ +} MDRawThread; /* MINIDUMP_THREAD */ + + +typedef struct { + u_int32_t number_of_threads; + MDRawThread threads[1]; +} MDRawThreadList; /* MINIDUMP_THREAD_LIST */ + +static const size_t MDRawThreadList_minsize = offsetof(MDRawThreadList, + threads[0]); + + +typedef struct { + u_int64_t base_of_image; + u_int32_t size_of_image; + u_int32_t checksum; /* 0 if unknown */ + u_int32_t time_date_stamp; /* time_t */ + MDRVA module_name_rva; /* MDString, pathname or filename */ + MDVSFixedFileInfo version_info; + + /* The next field stores a CodeView record and is populated when a module's + * debug information resides in a PDB file. It identifies the PDB file. */ + MDLocationDescriptor cv_record; + + /* The next field is populated when a module's debug information resides + * in a DBG file. It identifies the DBG file. This field is effectively + * obsolete with modules built by recent toolchains. */ + MDLocationDescriptor misc_record; + + /* Alignment problem: reserved0 and reserved1 are defined by the platform + * SDK as 64-bit quantities. However, that results in a structure whose + * alignment is unpredictable on different CPUs and ABIs. If the ABI + * specifies full alignment of 64-bit quantities in structures (as ppc + * does), there will be padding between miscRecord and reserved0. If + * 64-bit quantities can be aligned on 32-bit boundaries (as on x86), + * this padding will not exist. (Note that the structure up to this point + * contains 1 64-bit member followed by 21 32-bit members.) + * As a workaround, reserved0 and reserved1 are instead defined here as + * four 32-bit quantities. This should be harmless, as there are + * currently no known uses for these fields. */ + u_int32_t reserved0[2]; + u_int32_t reserved1[2]; +} MDRawModule; /* MINIDUMP_MODULE */ + +/* The inclusion of a 64-bit type in MINIDUMP_MODULE forces the struct to + * be tail-padded out to a multiple of 64 bits under some ABIs (such as PPC). + * This doesn't occur on systems that don't tail-pad in this manner. Define + * this macro to be the usable size of the MDRawModule struct, and use it in + * place of sizeof(MDRawModule). */ +#define MD_MODULE_SIZE 108 + + +/* (MDRawModule).cv_record can reference MDCVInfoPDB20 or MDCVInfoPDB70. + * Ref.: http://www.debuginfo.com/articles/debuginfomatch.html + * MDCVInfoPDB70 is the expected structure type with recent toolchains. */ + +typedef struct { + u_int32_t signature; + u_int32_t offset; /* Offset to debug data (expect 0 in minidump) */ +} MDCVHeader; + +typedef struct { + MDCVHeader cv_header; + u_int32_t signature; /* time_t debug information created */ + u_int32_t age; /* revision of PDB file */ + u_int8_t pdb_file_name[1]; /* Pathname or filename of PDB file */ +} MDCVInfoPDB20; + +static const size_t MDCVInfoPDB20_minsize = offsetof(MDCVInfoPDB20, + pdb_file_name[0]); + +#define MD_CVINFOPDB20_SIGNATURE 0x3031424e /* cvHeader.signature = '01BN' */ + +typedef struct { + u_int32_t cv_signature; + MDGUID signature; /* GUID, identifies PDB file */ + u_int32_t age; /* Identifies incremental changes to PDB file */ + u_int8_t pdb_file_name[1]; /* Pathname or filename of PDB file, + * 0-terminated 8-bit character data (UTF-8?) */ +} MDCVInfoPDB70; + +static const size_t MDCVInfoPDB70_minsize = offsetof(MDCVInfoPDB70, + pdb_file_name[0]); + +#define MD_CVINFOPDB70_SIGNATURE 0x53445352 /* cvSignature = 'SDSR' */ + +typedef struct { + u_int32_t data1[2]; + u_int32_t data2; + u_int32_t data3; + u_int32_t data4; + u_int32_t data5[3]; + u_int8_t extra[2]; +} MDCVInfoELF; + +/* In addition to the two CodeView record formats above, used for linking + * to external pdb files, it is possible for debugging data to be carried + * directly in the CodeView record itself. These signature values will + * be found in the first 4 bytes of the CodeView record. Additional values + * not commonly experienced in the wild are given by "Microsoft Symbol and + * Type Information", http://www.x86.org/ftp/manuals/tools/sym.pdf, section + * 7.2. An in-depth description of the CodeView 4.1 format is given by + * "Undocumented Windows 2000 Secrets", Windows 2000 Debugging Support/ + * Microsoft Symbol File Internals/CodeView Subsections, + * http://www.rawol.com/features/undocumented/sbs-w2k-1-windows-2000-debugging-support.pdf + */ +#define MD_CVINFOCV41_SIGNATURE 0x3930424e /* '90BN', CodeView 4.10. */ +#define MD_CVINFOCV50_SIGNATURE 0x3131424e /* '11BN', CodeView 5.0, + * MS C7-format (/Z7). */ + +#define MD_CVINFOUNKNOWN_SIGNATURE 0xffffffff /* An unlikely value. */ + +/* (MDRawModule).miscRecord can reference MDImageDebugMisc. The Windows + * structure is actually defined in WinNT.h. This structure is effectively + * obsolete with modules built by recent toolchains. */ + +typedef struct { + u_int32_t data_type; /* IMAGE_DEBUG_TYPE_*, not defined here because + * this debug record type is mostly obsolete. */ + u_int32_t length; /* Length of entire MDImageDebugMisc structure */ + u_int8_t unicode; /* True if data is multibyte */ + u_int8_t reserved[3]; + u_int8_t data[1]; +} MDImageDebugMisc; /* IMAGE_DEBUG_MISC */ + +static const size_t MDImageDebugMisc_minsize = offsetof(MDImageDebugMisc, + data[0]); + + +typedef struct { + u_int32_t number_of_modules; + MDRawModule modules[1]; +} MDRawModuleList; /* MINIDUMP_MODULE_LIST */ + +static const size_t MDRawModuleList_minsize = offsetof(MDRawModuleList, + modules[0]); + + +typedef struct { + u_int32_t number_of_memory_ranges; + MDMemoryDescriptor memory_ranges[1]; +} MDRawMemoryList; /* MINIDUMP_MEMORY_LIST */ + +static const size_t MDRawMemoryList_minsize = offsetof(MDRawMemoryList, + memory_ranges[0]); + + +#define MD_EXCEPTION_MAXIMUM_PARAMETERS 15 + +typedef struct { + u_int32_t exception_code; /* Windows: MDExceptionCodeWin, + * Mac OS X: MDExceptionMac, + * Linux: MDExceptionCodeLinux. */ + u_int32_t exception_flags; /* Windows: 1 if noncontinuable, + Mac OS X: MDExceptionCodeMac. */ + u_int64_t exception_record; /* Address (in the minidump-producing host's + * memory) of another MDException, for + * nested exceptions. */ + u_int64_t exception_address; /* The address that caused the exception. + * Mac OS X: exception subcode (which is + * typically the address). */ + u_int32_t number_parameters; /* Number of valid elements in + * exception_information. */ + u_int32_t __align; + u_int64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS]; +} MDException; /* MINIDUMP_EXCEPTION */ + +#include "minidump_exception_win32.h" +#include "minidump_exception_mac.h" +#include "minidump_exception_linux.h" +#include "minidump_exception_solaris.h" + +typedef struct { + u_int32_t thread_id; /* Thread in which the exception + * occurred. Corresponds to + * (MDRawThread).thread_id. */ + u_int32_t __align; + MDException exception_record; + MDLocationDescriptor thread_context; /* MDRawContext[CPU] */ +} MDRawExceptionStream; /* MINIDUMP_EXCEPTION_STREAM */ + + +typedef union { + struct { + u_int32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */ + u_int32_t version_information; /* cpuid 1: eax */ + u_int32_t feature_information; /* cpuid 1: edx */ + u_int32_t amd_extended_cpu_features; /* cpuid 0x80000001, ebx */ + } x86_cpu_info; + struct { + u_int64_t processor_features[2]; + } other_cpu_info; +} MDCPUInformation; /* CPU_INFORMATION */ + + +typedef struct { + /* The next 3 fields and numberOfProcessors are from the SYSTEM_INFO + * structure as returned by GetSystemInfo */ + u_int16_t processor_architecture; + u_int16_t processor_level; /* x86: 5 = 586, 6 = 686, ... */ + u_int16_t processor_revision; /* x86: 0xMMSS, where MM=model, + * SS=stepping */ + + u_int8_t number_of_processors; + u_int8_t product_type; /* Windows: VER_NT_* from WinNT.h */ + + /* The next 5 fields are from the OSVERSIONINFO structure as returned + * by GetVersionEx */ + u_int32_t major_version; + u_int32_t minor_version; + u_int32_t build_number; + u_int32_t platform_id; + MDRVA csd_version_rva; /* MDString further identifying the + * host OS. + * Windows: name of the installed OS + * service pack. + * Mac OS X: the Apple OS build number + * (sw_vers -buildVersion). + * Linux: uname -srvmo */ + + u_int16_t suite_mask; /* Windows: VER_SUITE_* from WinNT.h */ + u_int16_t reserved2; + + MDCPUInformation cpu; +} MDRawSystemInfo; /* MINIDUMP_SYSTEM_INFO */ + +/* For (MDRawSystemInfo).processor_architecture: */ +typedef enum { + MD_CPU_ARCHITECTURE_X86 = 0, /* PROCESSOR_ARCHITECTURE_INTEL */ + MD_CPU_ARCHITECTURE_MIPS = 1, /* PROCESSOR_ARCHITECTURE_MIPS */ + MD_CPU_ARCHITECTURE_ALPHA = 2, /* PROCESSOR_ARCHITECTURE_ALPHA */ + MD_CPU_ARCHITECTURE_PPC = 3, /* PROCESSOR_ARCHITECTURE_PPC */ + MD_CPU_ARCHITECTURE_SHX = 4, /* PROCESSOR_ARCHITECTURE_SHX + * (Super-H) */ + MD_CPU_ARCHITECTURE_ARM = 5, /* PROCESSOR_ARCHITECTURE_ARM */ + MD_CPU_ARCHITECTURE_IA64 = 6, /* PROCESSOR_ARCHITECTURE_IA64 */ + MD_CPU_ARCHITECTURE_ALPHA64 = 7, /* PROCESSOR_ARCHITECTURE_ALPHA64 */ + MD_CPU_ARCHITECTURE_MSIL = 8, /* PROCESSOR_ARCHITECTURE_MSIL + * (Microsoft Intermediate Language) */ + MD_CPU_ARCHITECTURE_AMD64 = 9, /* PROCESSOR_ARCHITECTURE_AMD64 */ + MD_CPU_ARCHITECTURE_X86_WIN64 = 10, + /* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */ + MD_CPU_ARCHITECTURE_SPARC = 0x8001, /* Breakpad-defined value for SPARC */ + MD_CPU_ARCHITECTURE_UNKNOWN = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */ +} MDCPUArchitecture; + +/* For (MDRawSystemInfo).platform_id: */ +typedef enum { + MD_OS_WIN32S = 0, /* VER_PLATFORM_WIN32s (Windows 3.1) */ + MD_OS_WIN32_WINDOWS = 1, /* VER_PLATFORM_WIN32_WINDOWS (Windows 95-98-Me) */ + MD_OS_WIN32_NT = 2, /* VER_PLATFORM_WIN32_NT (Windows NT, 2000+) */ + MD_OS_WIN32_CE = 3, /* VER_PLATFORM_WIN32_CE, VER_PLATFORM_WIN32_HH + * (Windows CE, Windows Mobile, "Handheld") */ + + /* The following values are Breakpad-defined. */ + MD_OS_UNIX = 0x8000, /* Generic Unix-ish */ + MD_OS_MAC_OS_X = 0x8101, /* Mac OS X/Darwin */ + MD_OS_LINUX = 0x8201, /* Linux */ + MD_OS_SOLARIS = 0x8202 /* Solaris */ +} MDOSPlatform; + + +typedef struct { + u_int32_t size_of_info; /* Length of entire MDRawMiscInfo structure. */ + u_int32_t flags1; + + /* The next field is only valid if flags1 contains + * MD_MISCINFO_FLAGS1_PROCESS_ID. */ + u_int32_t process_id; + + /* The next 3 fields are only valid if flags1 contains + * MD_MISCINFO_FLAGS1_PROCESS_TIMES. */ + u_int32_t process_create_time; /* time_t process started */ + u_int32_t process_user_time; /* seconds of user CPU time */ + u_int32_t process_kernel_time; /* seconds of kernel CPU time */ + + /* The following fields are not present in MINIDUMP_MISC_INFO but are + * in MINIDUMP_MISC_INFO_2. When this struct is populated, these values + * may not be set. Use flags1 or sizeOfInfo to determine whether these + * values are present. These are only valid when flags1 contains + * MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO. */ + u_int32_t processor_max_mhz; + u_int32_t processor_current_mhz; + u_int32_t processor_mhz_limit; + u_int32_t processor_max_idle_state; + u_int32_t processor_current_idle_state; +} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO2 */ + +#define MD_MISCINFO_SIZE 24 +#define MD_MISCINFO2_SIZE 44 + +/* For (MDRawMiscInfo).flags1. These values indicate which fields in the + * MDRawMiscInfoStructure are valid. */ +typedef enum { + MD_MISCINFO_FLAGS1_PROCESS_ID = 0x00000001, + /* MINIDUMP_MISC1_PROCESS_ID */ + MD_MISCINFO_FLAGS1_PROCESS_TIMES = 0x00000002, + /* MINIDUMP_MISC1_PROCESS_TIMES */ + MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO = 0x00000004 + /* MINIDUMP_MISC1_PROCESSOR_POWER_INFO */ +} MDMiscInfoFlags1; + + +/* + * Breakpad extension types + */ + + +typedef struct { + /* validity is a bitmask with values from MDBreakpadInfoValidity, indicating + * which of the other fields in the structure are valid. */ + u_int32_t validity; + + /* Thread ID of the handler thread. dump_thread_id should correspond to + * the thread_id of an MDRawThread in the minidump's MDRawThreadList if + * a dedicated thread in that list was used to produce the minidump. If + * the MDRawThreadList does not contain a dedicated thread used to produce + * the minidump, this field should be set to 0 and the validity field + * must not contain MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID. */ + u_int32_t dump_thread_id; + + /* Thread ID of the thread that requested the minidump be produced. As + * with dump_thread_id, requesting_thread_id should correspond to the + * thread_id of an MDRawThread in the minidump's MDRawThreadList. For + * minidumps produced as a result of an exception, requesting_thread_id + * will be the same as the MDRawExceptionStream's thread_id field. For + * minidumps produced "manually" at the program's request, + * requesting_thread_id will indicate which thread caused the dump to be + * written. If the minidump was produced at the request of something + * other than a thread in the MDRawThreadList, this field should be set + * to 0 and the validity field must not contain + * MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID. */ + u_int32_t requesting_thread_id; +} MDRawBreakpadInfo; + +/* For (MDRawBreakpadInfo).validity: */ +typedef enum { + /* When set, the dump_thread_id field is valid. */ + MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID = 1 << 0, + + /* When set, the requesting_thread_id field is valid. */ + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID = 1 << 1 +} MDBreakpadInfoValidity; + +typedef struct { + /* expression, function, and file are 0-terminated UTF-16 strings. They + * may be truncated if necessary, but should always be 0-terminated when + * written to a file. + * Fixed-length strings are used because MiniDumpWriteDump doesn't offer + * a way for user streams to point to arbitrary RVAs for strings. */ + u_int16_t expression[128]; /* Assertion that failed... */ + u_int16_t function[128]; /* ...within this function... */ + u_int16_t file[128]; /* ...in this file... */ + u_int32_t line; /* ...at this line. */ + u_int32_t type; +} MDRawAssertionInfo; + +/* For (MDRawAssertionInfo).type: */ +typedef enum { + MD_ASSERTION_INFO_TYPE_UNKNOWN = 0, + + /* Used for assertions that would be raised by the MSVC CRT but are + * directed to an invalid parameter handler instead. */ + MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER, + + /* Used for assertions that would be raised by the MSVC CRT but are + * directed to a pure virtual call handler instead. */ + MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL +} MDAssertionInfoData; + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif /* _MSC_VER */ + + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ */ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_size.h b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_size.h new file mode 100644 index 00000000..918544b6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/common/minidump_size.h @@ -0,0 +1,107 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +// minidump_size.h: Provides a C++ template for programmatic access to +// the sizes of various types defined in minidump_format.h. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ + +#include + +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +template +class minidump_size { + public: + static size_t size() { return sizeof(T); } +}; + +// Explicit specializations for variable-length types. The size returned +// for these should be the size for an object without its variable-length +// section. + +template<> +class minidump_size { + public: + static size_t size() { return MDString_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDRawThreadList_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDCVInfoPDB20_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDCVInfoPDB70_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDImageDebugMisc_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDRawModuleList_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDRawMemoryList_minsize; } +}; + +// Explicit specialization for MDRawModule, for which sizeof may include +// tail-padding on some architectures but not others. + +template<> +class minidump_size { + public: + static size_t size() { return MD_MODULE_SIZE; } +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/basic_source_line_resolver.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/basic_source_line_resolver.h new file mode 100644 index 00000000..38759579 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/basic_source_line_resolver.h @@ -0,0 +1,114 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// BasicSourceLineResolver implements SourceLineResolverInterface, using +// address map files produced by a compatible writer, e.g. PDBSourceLineWriter. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ + +// TODO: Platforms that have no hash_map can use map, at the likely cost of +// performance. +#ifdef __SUNPRO_CC +#define BSLR_NO_HASH_MAP +#endif // __SUNPRO_CC + +#ifdef BSLR_NO_HASH_MAP +#include +#else // BSLR_NO_HASH_MAP +#include +#endif // BSLR_NO_HASH_MAP + +#include "google_breakpad/processor/source_line_resolver_interface.h" + +namespace google_breakpad { + +using std::string; +#ifdef BSLR_NO_HASH_MAP +using std::map; +#else // BSLR_NO_HASH_MAP +using __gnu_cxx::hash_map; +#endif // BSLR_NO_HASH_MAP + +class BasicSourceLineResolver : public SourceLineResolverInterface { + public: + BasicSourceLineResolver(); + virtual ~BasicSourceLineResolver(); + + // SourceLineResolverInterface methods, see source_line_resolver_interface.h + // for more details. + + // Adds a module to this resolver, returning true on success. + // The given map_file is read into memory, and its symbols will be + // retained until the BasicSourceLineResolver is destroyed. + virtual bool LoadModule(const string &module_name, const string &map_file); + + // Exactly the same as above, except the given map_buffer is used + // for symbols. + virtual bool LoadModuleUsingMapBuffer(const string &module_name, + const string &map_buffer); + + + virtual bool HasModule(const string &module_name) const; + + virtual StackFrameInfo* FillSourceLineInfo(StackFrame *frame) const; + + private: + template class MemAddrMap; + struct Line; + struct Function; + struct PublicSymbol; + struct File; +#ifdef BSLR_NO_HASH_MAP + struct CompareString { + bool operator()(const string &s1, const string &s2) const; + }; +#else // BSLR_NO_HASH_MAP + struct HashString { + size_t operator()(const string &s) const; + }; +#endif // BSLR_NO_HASH_MAP + class Module; + + // All of the modules we've loaded +#ifdef BSLR_NO_HASH_MAP + typedef map ModuleMap; +#else // BSLR_NO_HASH_MAP + typedef hash_map ModuleMap; +#endif // BSLR_NO_HASH_MAP + ModuleMap *modules_; + + // Disallow unwanted copy ctor and assignment operator + BasicSourceLineResolver(const BasicSourceLineResolver&); + void operator=(const BasicSourceLineResolver&); +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/call_stack.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/call_stack.h new file mode 100644 index 00000000..21f595e7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/call_stack.h @@ -0,0 +1,77 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// call_stack.h: A call stack comprised of stack frames. +// +// This class manages a vector of stack frames. It is used instead of +// exposing the vector directly to allow the CallStack to own StackFrame +// pointers without having to publicly export the linked_ptr class. A +// CallStack must be composed of pointers instead of objects to allow for +// CPU-specific StackFrame subclasses. +// +// By convention, the stack frame at index 0 is the innermost callee frame, +// and the frame at the highest index in a call stack is the outermost +// caller. CallStack only allows stacks to be built by pushing frames, +// beginning with the innermost callee frame. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_CALL_STACK_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_CALL_STACK_H__ + +#include + +namespace google_breakpad { + +using std::vector; + +struct StackFrame; +template class linked_ptr; + +class CallStack { + public: + CallStack() { Clear(); } + ~CallStack(); + + // Resets the CallStack to its initial empty state + void Clear(); + + const vector* frames() const { return &frames_; } + + private: + // Stackwalker is responsible for building the frames_ vector. + friend class Stackwalker; + + // Storage for pushed frames. + vector frames_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCSSOR_CALL_STACK_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/code_module.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/code_module.h new file mode 100644 index 00000000..38ee956e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/code_module.h @@ -0,0 +1,94 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// code_module.h: Carries information about code modules that are loaded +// into a process. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__ + +#include +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::string; + +class CodeModule { + public: + virtual ~CodeModule() {} + + // The base address of this code module as it was loaded by the process. + // (u_int64_t)-1 on error. + virtual u_int64_t base_address() const = 0; + + // The size of the code module. 0 on error. + virtual u_int64_t size() const = 0; + + // The path or file name that the code module was loaded from. Empty on + // error. + virtual string code_file() const = 0; + + // An identifying string used to discriminate between multiple versions and + // builds of the same code module. This may contain a uuid, timestamp, + // version number, or any combination of this or other information, in an + // implementation-defined format. Empty on error. + virtual string code_identifier() const = 0; + + // The filename containing debugging information associated with the code + // module. If debugging information is stored in a file separate from the + // code module itself (as is the case when .pdb or .dSYM files are used), + // this will be different from code_file. If debugging information is + // stored in the code module itself (possibly prior to stripping), this + // will be the same as code_file. Empty on error. + virtual string debug_file() const = 0; + + // An identifying string similar to code_identifier, but identifies a + // specific version and build of the associated debug file. This may be + // the same as code_identifier when the debug_file and code_file are + // identical or when the same identifier is used to identify distinct + // debug and code files. + virtual string debug_identifier() const = 0; + + // A human-readable representation of the code module's version. Empty on + // error. + virtual string version() const = 0; + + // Creates a new copy of this CodeModule object, which the caller takes + // ownership of. The new CodeModule may be of a different concrete class + // than the CodeModule being copied, but will behave identically to the + // copied CodeModule as far as the CodeModule interface is concerned. + virtual const CodeModule* Copy() const = 0; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/code_modules.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/code_modules.h new file mode 100644 index 00000000..29c55d4e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/code_modules.h @@ -0,0 +1,98 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// code_modules.h: Contains all of the CodeModule objects that were loaded +// into a single process. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__ + +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +class CodeModule; + +class CodeModules { + public: + virtual ~CodeModules() {} + + // The number of contained CodeModule objects. + virtual unsigned int module_count() const = 0; + + // Random access to modules. Returns the module whose code is present + // at the address indicated by |address|. If no module is present at this + // address, returns NULL. Ownership of the returned CodeModule is retained + // by the CodeModules object; pointers returned by this method are valid for + // comparison with pointers returned by the other Get methods. + virtual const CodeModule* GetModuleForAddress(u_int64_t address) const = 0; + + // Returns the module corresponding to the main executable. If there is + // no main executable, returns NULL. Ownership of the returned CodeModule + // is retained by the CodeModules object; pointers returned by this method + // are valid for comparison with pointers returned by the other Get + // methods. + virtual const CodeModule* GetMainModule() const = 0; + + // Sequential access to modules. A sequence number of 0 corresponds to the + // module residing lowest in memory. If the sequence number is out of + // range, returns NULL. Ownership of the returned CodeModule is retained + // by the CodeModules object; pointers returned by this method are valid for + // comparison with pointers returned by the other Get methods. + virtual const CodeModule* GetModuleAtSequence( + unsigned int sequence) const = 0; + + // Sequential access to modules. This is similar to GetModuleAtSequence, + // except no ordering requirement is enforced. A CodeModules implementation + // may return CodeModule objects from GetModuleAtIndex in any order it + // wishes, provided that the order remain the same throughout the life of + // the CodeModules object. Typically, GetModuleAtIndex would be used by + // a caller to enumerate all CodeModule objects quickly when the enumeration + // does not require any ordering. If the index argument is out of range, + // returns NULL. Ownership of the returned CodeModule is retained by + // the CodeModules object; pointers returned by this method are valid for + // comparison with pointers returned by the other Get methods. + virtual const CodeModule* GetModuleAtIndex(unsigned int index) const = 0; + + // Creates a new copy of this CodeModules object, which the caller takes + // ownership of. The new object will also contain copies of the existing + // object's child CodeModule objects. The new CodeModules object may be of + // a different concrete class than the object being copied, but will behave + // identically to the copied object as far as the CodeModules and CodeModule + // interfaces are concerned, except that the order that GetModuleAtIndex + // returns objects in may differ between a copy and the original CodeModules + // object. + virtual const CodeModules* Copy() const = 0; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/memory_region.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/memory_region.h new file mode 100644 index 00000000..1ac3fe8d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/memory_region.h @@ -0,0 +1,76 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// memory_region.h: Access to memory regions. +// +// A MemoryRegion provides virtual access to a range of memory. It is an +// abstraction allowing the actual source of memory to be independent of +// methods which need to access a virtual memory space. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__ + + +#include "google_breakpad/common/breakpad_types.h" + + +namespace google_breakpad { + + +class MemoryRegion { + public: + virtual ~MemoryRegion() {} + + // The base address of this memory region. + virtual u_int64_t GetBase() = 0; + + // The size of this memory region. + virtual u_int32_t GetSize() = 0; + + // Access to data of various sizes within the memory region. address + // is a pointer to read, and it must lie within the memory region as + // defined by its base address and size. The location pointed to by + // value is set to the value at address. Byte-swapping is performed + // if necessary so that the value is appropriate for the running + // program. Returns true on success. Fails and returns false if address + // is out of the region's bounds (after considering the width of value), + // or for other types of errors. + virtual bool GetMemoryAtAddress(u_int64_t address, u_int8_t* value) = 0; + virtual bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value) = 0; + virtual bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value) = 0; + virtual bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value) = 0; +}; + + +} // namespace google_breakpad + + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/minidump.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/minidump.h new file mode 100644 index 00000000..5c5dccc9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/minidump.h @@ -0,0 +1,904 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump.h: A minidump reader. +// +// The basic structure of this module tracks the structure of the minidump +// file itself. At the top level, a minidump file is represented by a +// Minidump object. Like most other classes in this module, Minidump +// provides a Read method that initializes the object with information from +// the file. Most of the classes in this file are wrappers around the +// "raw" structures found in the minidump file itself, and defined in +// minidump_format.h. For example, each thread is represented by a +// MinidumpThread object, whose parameters are specified in an MDRawThread +// structure. A properly byte-swapped MDRawThread can be obtained from a +// MinidumpThread easily by calling its thread() method. +// +// Most of the module lazily reads only the portion of the minidump file +// necessary to fulfill the user's request. Calling Minidump::Read +// only reads the minidump's directory. The thread list is not read until +// it is needed, and even once it's read, the memory regions for each +// thread's stack aren't read until they're needed. This strategy avoids +// unnecessary file input, and allocating memory for data in which the user +// has no interest. Note that although memory allocations for a typical +// minidump file are not particularly large, it is possible for legitimate +// minidumps to be sizable. A full-memory minidump, for example, contains +// a snapshot of the entire mapped memory space. Even a normal minidump, +// with stack memory only, can be large if, for example, the dump was +// generated in response to a crash that occurred due to an infinite- +// recursion bug that caused the stack's limits to be exceeded. Finally, +// some users of this library will unfortunately find themselves in the +// position of having to process potentially-hostile minidumps that might +// attempt to cause problems by forcing the minidump processor to over- +// allocate memory. +// +// Memory management in this module is based on a strict +// you-don't-own-anything policy. The only object owned by the user is +// the top-level Minidump object, the creation and destruction of which +// must be the user's own responsibility. All other objects obtained +// through interaction with this module are ultimately owned by the +// Minidump object, and will be freed upon the Minidump object's destruction. +// Because memory regions can potentially involve large allocations, a +// FreeMemory method is provided by MinidumpMemoryRegion, allowing the user +// to release data when it is no longer needed. Use of this method is +// optional but recommended. If freed data is later required, it will +// be read back in from the minidump file again. +// +// There is one exception to this memory management policy: +// Minidump::ReadString will return a string object to the user, and the user +// is responsible for its deletion. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__ + +#include + +#include +#include +#include + +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/memory_region.h" + + +namespace google_breakpad { + + +using std::map; +using std::string; +using std::vector; + + +class Minidump; +template class RangeMap; + + +// MinidumpObject is the base of all Minidump* objects except for Minidump +// itself. +class MinidumpObject { + public: + virtual ~MinidumpObject() {} + + bool valid() const { return valid_; } + + protected: + explicit MinidumpObject(Minidump* minidump); + + // Refers to the Minidump object that is the ultimate parent of this + // Some MinidumpObjects are owned by other MinidumpObjects, but at the + // root of the ownership tree is always a Minidump. The Minidump object + // is kept here for access to its seeking and reading facilities, and + // for access to data about the minidump file itself, such as whether + // it should be byte-swapped. + Minidump* minidump_; + + // MinidumpObjects are not valid when created. When a subclass populates + // its own fields, it can set valid_ to true. Accessors and mutators may + // wish to consider or alter the valid_ state as they interact with + // objects. + bool valid_; +}; + + +// This class exists primarily to provide a virtual destructor in a base +// class common to all objects that might be stored in +// Minidump::mStreamObjects. Some object types (MinidumpContext) will +// never be stored in Minidump::mStreamObjects, but are represented as +// streams and adhere to the same interface, and may be derived from +// this class. +class MinidumpStream : public MinidumpObject { + public: + virtual ~MinidumpStream() {} + + protected: + explicit MinidumpStream(Minidump* minidump); + + private: + // Populate (and validate) the MinidumpStream. minidump_ is expected + // to be positioned at the beginning of the stream, so that the next + // read from the minidump will be at the beginning of the stream. + // expected_size should be set to the stream's length as contained in + // the MDRawDirectory record or other identifying record. A class + // that implements MinidumpStream can compare expected_size to a + // known size as an integrity check. + virtual bool Read(u_int32_t expected_size) = 0; +}; + + +// MinidumpContext carries a CPU-specific MDRawContext structure, which +// contains CPU context such as register states. Each thread has its +// own context, and the exception record, if present, also has its own +// context. Note that if the exception record is present, the context it +// refers to is probably what the user wants to use for the exception +// thread, instead of that thread's own context. The exception thread's +// context (as opposed to the exception record's context) will contain +// context for the exception handler (which performs minidump generation), +// and not the context that caused the exception (which is probably what the +// user wants). +class MinidumpContext : public MinidumpStream { + public: + virtual ~MinidumpContext(); + + // Returns an MD_CONTEXT_* value such as MD_CONTEXT_X86 or MD_CONTEXT_PPC + // identifying the CPU type that the context was collected from. The + // returned value will identify the CPU only, and will have any other + // MD_CONTEXT_* bits masked out. Returns 0 on failure. + u_int32_t GetContextCPU() const; + + // Returns raw CPU-specific context data for the named CPU type. If the + // context data does not match the CPU type or does not exist, returns + // NULL. + const MDRawContextX86* GetContextX86() const; + const MDRawContextPPC* GetContextPPC() const; + const MDRawContextAMD64* GetContextAMD64() const; + const MDRawContextSPARC* GetContextSPARC() const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class MinidumpThread; + friend class MinidumpException; + + explicit MinidumpContext(Minidump* minidump); + + bool Read(u_int32_t expected_size); + + // Free the CPU-specific context structure. + void FreeContext(); + + // If the minidump contains a SYSTEM_INFO_STREAM, makes sure that the + // system info stream gives an appropriate CPU type matching the context + // CPU type in context_cpu_type. Returns false if the CPU type does not + // match. Returns true if the CPU type matches or if the minidump does + // not contain a system info stream. + bool CheckAgainstSystemInfo(u_int32_t context_cpu_type); + + // Store this separately because of the weirdo AMD64 context + u_int32_t context_flags_; + + // The CPU-specific context structure. + union { + MDRawContextBase* base; + MDRawContextX86* x86; + MDRawContextPPC* ppc; + MDRawContextAMD64* amd64; + // on Solaris SPARC, sparc is defined as a numeric constant, + // so variables can NOT be named as sparc + MDRawContextSPARC* ctx_sparc; + } context_; +}; + + +// MinidumpMemoryRegion does not wrap any MDRaw structure, and only contains +// a reference to an MDMemoryDescriptor. This object is intended to wrap +// portions of a minidump file that contain memory dumps. In normal +// minidumps, each MinidumpThread owns a MinidumpMemoryRegion corresponding +// to the thread's stack memory. MinidumpMemoryList also gives access to +// memory regions in its list as MinidumpMemoryRegions. This class +// adheres to MemoryRegion so that it may be used as a data provider to +// the Stackwalker family of classes. +class MinidumpMemoryRegion : public MinidumpObject, + public MemoryRegion { + public: + virtual ~MinidumpMemoryRegion(); + + static void set_max_bytes(u_int32_t max_bytes) { max_bytes_ = max_bytes; } + static u_int32_t max_bytes() { return max_bytes_; } + + // Returns a pointer to the base of the memory region. Returns the + // cached value if available, otherwise, reads the minidump file and + // caches the memory region. + const u_int8_t* GetMemory(); + + // The address of the base of the memory region. + u_int64_t GetBase(); + + // The size, in bytes, of the memory region. + u_int32_t GetSize(); + + // Frees the cached memory region, if cached. + void FreeMemory(); + + // Obtains the value of memory at the pointer specified by address. + bool GetMemoryAtAddress(u_int64_t address, u_int8_t* value); + bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value); + bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value); + bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class MinidumpThread; + friend class MinidumpMemoryList; + + explicit MinidumpMemoryRegion(Minidump* minidump); + + // Identify the base address and size of the memory region, and the + // location it may be found in the minidump file. + void SetDescriptor(MDMemoryDescriptor* descriptor); + + // Implementation for GetMemoryAtAddress + template bool GetMemoryAtAddressInternal(u_int64_t address, + T* value); + + // The largest memory region that will be read from a minidump. The + // default is 1MB. + static u_int32_t max_bytes_; + + // Base address and size of the memory region, and its position in the + // minidump file. + MDMemoryDescriptor* descriptor_; + + // Cached memory. + vector* memory_; +}; + + +// MinidumpThread contains information about a thread of execution, +// including a snapshot of the thread's stack and CPU context. For +// the thread that caused an exception, the context carried by +// MinidumpException is probably desired instead of the CPU context +// provided here. +class MinidumpThread : public MinidumpObject { + public: + virtual ~MinidumpThread(); + + const MDRawThread* thread() const { return valid_ ? &thread_ : NULL; } + MinidumpMemoryRegion* GetMemory(); + MinidumpContext* GetContext(); + + // The thread ID is used to determine if a thread is the exception thread, + // so a special getter is provided to retrieve this data from the + // MDRawThread structure. Returns false if the thread ID cannot be + // determined. + bool GetThreadID(u_int32_t *thread_id) const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + // These objects are managed by MinidumpThreadList. + friend class MinidumpThreadList; + + explicit MinidumpThread(Minidump* minidump); + + // This works like MinidumpStream::Read, but is driven by + // MinidumpThreadList. No size checking is done, because + // MinidumpThreadList handles that directly. + bool Read(); + + MDRawThread thread_; + MinidumpMemoryRegion* memory_; + MinidumpContext* context_; +}; + + +// MinidumpThreadList contains all of the threads (as MinidumpThreads) in +// a process. +class MinidumpThreadList : public MinidumpStream { + public: + virtual ~MinidumpThreadList(); + + static void set_max_threads(u_int32_t max_threads) { + max_threads_ = max_threads; + } + static u_int32_t max_threads() { return max_threads_; } + + unsigned int thread_count() const { return valid_ ? thread_count_ : 0; } + + // Sequential access to threads. + MinidumpThread* GetThreadAtIndex(unsigned int index) const; + + // Random access to threads. + MinidumpThread* GetThreadByID(u_int32_t thread_id); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + typedef map IDToThreadMap; + typedef vector MinidumpThreads; + + static const u_int32_t kStreamType = MD_THREAD_LIST_STREAM; + + explicit MinidumpThreadList(Minidump* aMinidump); + + bool Read(u_int32_t aExpectedSize); + + // The largest number of threads that will be read from a minidump. The + // default is 256. + static u_int32_t max_threads_; + + // Access to threads using the thread ID as the key. + IDToThreadMap id_to_thread_map_; + + // The list of threads. + MinidumpThreads* threads_; + u_int32_t thread_count_; +}; + + +// MinidumpModule wraps MDRawModule, which contains information about loaded +// code modules. Access is provided to various data referenced indirectly +// by MDRawModule, such as the module's name and a specification for where +// to locate debugging information for the module. +class MinidumpModule : public MinidumpObject, + public CodeModule { + public: + virtual ~MinidumpModule(); + + static void set_max_cv_bytes(u_int32_t max_cv_bytes) { + max_cv_bytes_ = max_cv_bytes; + } + static u_int32_t max_cv_bytes() { return max_cv_bytes_; } + + static void set_max_misc_bytes(u_int32_t max_misc_bytes) { + max_misc_bytes_ = max_misc_bytes; + } + static u_int32_t max_misc_bytes() { return max_misc_bytes_; } + + const MDRawModule* module() const { return valid_ ? &module_ : NULL; } + + // CodeModule implementation + virtual u_int64_t base_address() const { + return valid_ ? module_.base_of_image : static_cast(-1); + } + virtual u_int64_t size() const { return valid_ ? module_.size_of_image : 0; } + virtual string code_file() const; + virtual string code_identifier() const; + virtual string debug_file() const; + virtual string debug_identifier() const; + virtual string version() const; + virtual const CodeModule* Copy() const; + + // The CodeView record, which contains information to locate the module's + // debugging information (pdb). This is returned as u_int8_t* because + // the data can be of types MDCVInfoPDB20* or MDCVInfoPDB70*, or it may be + // of a type unknown to Breakpad, in which case the raw data will still be + // returned but no byte-swapping will have been performed. Check the + // record's signature in the first four bytes to differentiate between + // the various types. Current toolchains generate modules which carry + // MDCVInfoPDB70 by default. Returns a pointer to the CodeView record on + // success, and NULL on failure. On success, the optional |size| argument + // is set to the size of the CodeView record. + const u_int8_t* GetCVRecord(u_int32_t* size); + + // The miscellaneous debug record, which is obsolete. Current toolchains + // do not generate this type of debugging information (dbg), and this + // field is not expected to be present. Returns a pointer to the debugging + // record on success, and NULL on failure. On success, the optional |size| + // argument is set to the size of the debugging record. + const MDImageDebugMisc* GetMiscRecord(u_int32_t* size); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + // These objects are managed by MinidumpModuleList. + friend class MinidumpModuleList; + + explicit MinidumpModule(Minidump* minidump); + + // This works like MinidumpStream::Read, but is driven by + // MinidumpModuleList. No size checking is done, because + // MinidumpModuleList handles that directly. + bool Read(); + + // Reads indirectly-referenced data, including the module name, CodeView + // record, and miscellaneous debugging record. This is necessary to allow + // MinidumpModuleList to fully construct MinidumpModule objects without + // requiring seeks to read a contiguous set of MinidumpModule objects. + // All auxiliary data should be available when Read is called, in order to + // allow the CodeModule getters to be const methods. + bool ReadAuxiliaryData(); + + // The largest number of bytes that will be read from a minidump for a + // CodeView record or miscellaneous debugging record, respectively. The + // default for each is 1024. + static u_int32_t max_cv_bytes_; + static u_int32_t max_misc_bytes_; + + // True after a successful Read. This is different from valid_, which is + // not set true until ReadAuxiliaryData also completes successfully. + // module_valid_ is only used by ReadAuxiliaryData and the functions it + // calls to determine whether the object is ready for auxiliary data to + // be read. + bool module_valid_; + + // True if debug info was read from the module. Certain modules + // may contain debug records in formats we don't support, + // so we can just set this to false to ignore them. + bool has_debug_info_; + + MDRawModule module_; + + // Cached module name. + const string* name_; + + // Cached CodeView record - this is MDCVInfoPDB20 or (likely) + // MDCVInfoPDB70, or possibly something else entirely. Stored as a u_int8_t + // because the structure contains a variable-sized string and its exact + // size cannot be known until it is processed. + vector* cv_record_; + + // If cv_record_ is present, cv_record_signature_ contains a copy of the + // CodeView record's first four bytes, for ease of determinining the + // type of structure that cv_record_ contains. + u_int32_t cv_record_signature_; + + // Cached MDImageDebugMisc (usually not present), stored as u_int8_t + // because the structure contains a variable-sized string and its exact + // size cannot be known until it is processed. + vector* misc_record_; +}; + + +// MinidumpModuleList contains all of the loaded code modules for a process +// in the form of MinidumpModules. It maintains a map of these modules +// so that it may easily provide a code module corresponding to a specific +// address. +class MinidumpModuleList : public MinidumpStream, + public CodeModules { + public: + virtual ~MinidumpModuleList(); + + static void set_max_modules(u_int32_t max_modules) { + max_modules_ = max_modules; + } + static u_int32_t max_modules() { return max_modules_; } + + // CodeModules implementation. + virtual unsigned int module_count() const { + return valid_ ? module_count_ : 0; + } + virtual const MinidumpModule* GetModuleForAddress(u_int64_t address) const; + virtual const MinidumpModule* GetMainModule() const; + virtual const MinidumpModule* GetModuleAtSequence( + unsigned int sequence) const; + virtual const MinidumpModule* GetModuleAtIndex(unsigned int index) const; + virtual const CodeModules* Copy() const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + typedef vector MinidumpModules; + + static const u_int32_t kStreamType = MD_MODULE_LIST_STREAM; + + explicit MinidumpModuleList(Minidump* minidump); + + bool Read(u_int32_t expected_size); + + // The largest number of modules that will be read from a minidump. The + // default is 1024. + static u_int32_t max_modules_; + + // Access to modules using addresses as the key. + RangeMap *range_map_; + + MinidumpModules *modules_; + u_int32_t module_count_; +}; + + +// MinidumpMemoryList corresponds to a minidump's MEMORY_LIST_STREAM stream, +// which references the snapshots of all of the memory regions contained +// within the minidump. For a normal minidump, this includes stack memory +// (also referenced by each MinidumpThread, in fact, the MDMemoryDescriptors +// here and in MDRawThread both point to exactly the same data in a +// minidump file, conserving space), as well as a 256-byte snapshot of memory +// surrounding the instruction pointer in the case of an exception. Other +// types of minidumps may contain significantly more memory regions. Full- +// memory minidumps contain all of a process' mapped memory. +class MinidumpMemoryList : public MinidumpStream { + public: + virtual ~MinidumpMemoryList(); + + static void set_max_regions(u_int32_t max_regions) { + max_regions_ = max_regions; + } + static u_int32_t max_regions() { return max_regions_; } + + unsigned int region_count() const { return valid_ ? region_count_ : 0; } + + // Sequential access to memory regions. + MinidumpMemoryRegion* GetMemoryRegionAtIndex(unsigned int index); + + // Random access to memory regions. Returns the region encompassing + // the address identified by address. + MinidumpMemoryRegion* GetMemoryRegionForAddress(u_int64_t address); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + typedef vector MemoryDescriptors; + typedef vector MemoryRegions; + + static const u_int32_t kStreamType = MD_MEMORY_LIST_STREAM; + + explicit MinidumpMemoryList(Minidump* minidump); + + bool Read(u_int32_t expected_size); + + // The largest number of memory regions that will be read from a minidump. + // The default is 256. + static u_int32_t max_regions_; + + // Access to memory regions using addresses as the key. + RangeMap *range_map_; + + // The list of descriptors. This is maintained separately from the list + // of regions, because MemoryRegion doesn't own its MemoryDescriptor, it + // maintains a pointer to it. descriptors_ provides the storage for this + // purpose. + MemoryDescriptors *descriptors_; + + // The list of regions. + MemoryRegions *regions_; + u_int32_t region_count_; +}; + + +// MinidumpException wraps MDRawExceptionStream, which contains information +// about the exception that caused the minidump to be generated, if the +// minidump was generated in an exception handler called as a result of +// an exception. It also provides access to a MinidumpContext object, +// which contains the CPU context for the exception thread at the time +// the exception occurred. +class MinidumpException : public MinidumpStream { + public: + virtual ~MinidumpException(); + + const MDRawExceptionStream* exception() const { + return valid_ ? &exception_ : NULL; + } + + // The thread ID is used to determine if a thread is the exception thread, + // so a special getter is provided to retrieve this data from the + // MDRawExceptionStream structure. Returns false if the thread ID cannot + // be determined. + bool GetThreadID(u_int32_t *thread_id) const; + + MinidumpContext* GetContext(); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const u_int32_t kStreamType = MD_EXCEPTION_STREAM; + + explicit MinidumpException(Minidump* minidump); + + bool Read(u_int32_t expected_size); + + MDRawExceptionStream exception_; + MinidumpContext* context_; +}; + + +// MinidumpSystemInfo wraps MDRawSystemInfo and provides information about +// the system on which the minidump was generated. See also MinidumpMiscInfo. +class MinidumpSystemInfo : public MinidumpStream { + public: + virtual ~MinidumpSystemInfo(); + + const MDRawSystemInfo* system_info() const { + return valid_ ? &system_info_ : NULL; + } + + // GetOS and GetCPU return textual representations of the operating system + // and CPU that produced the minidump. Unlike most other Minidump* methods, + // they return string objects, not weak pointers. Defined values for + // GetOS() are "mac", "windows", and "linux". Defined values for GetCPU + // are "x86" and "ppc". These methods return an empty string when their + // values are unknown. + string GetOS(); + string GetCPU(); + + // I don't know what CSD stands for, but this field is documented as + // returning a textual representation of the OS service pack. On other + // platforms, this provides additional information about an OS version + // level beyond major.minor.micro. Returns NULL if unknown. + const string* GetCSDVersion(); + + // If a CPU vendor string can be determined, returns a pointer to it, + // otherwise, returns NULL. CPU vendor strings can be determined from + // x86 CPUs with CPUID 0. + const string* GetCPUVendor(); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const u_int32_t kStreamType = MD_SYSTEM_INFO_STREAM; + + explicit MinidumpSystemInfo(Minidump* minidump); + + bool Read(u_int32_t expected_size); + + MDRawSystemInfo system_info_; + + // Textual representation of the OS service pack, for minidumps produced + // by MiniDumpWriteDump on Windows. + const string* csd_version_; + + // A string identifying the CPU vendor, if known. + const string* cpu_vendor_; +}; + + +// MinidumpMiscInfo wraps MDRawMiscInfo and provides information about +// the process that generated the minidump, and optionally additional system +// information. See also MinidumpSystemInfo. +class MinidumpMiscInfo : public MinidumpStream { + public: + const MDRawMiscInfo* misc_info() const { + return valid_ ? &misc_info_ : NULL; + } + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const u_int32_t kStreamType = MD_MISC_INFO_STREAM; + + explicit MinidumpMiscInfo(Minidump* minidump_); + + bool Read(u_int32_t expected_size_); + + MDRawMiscInfo misc_info_; +}; + + +// MinidumpBreakpadInfo wraps MDRawBreakpadInfo, which is an optional stream in +// a minidump that provides additional information about the process state +// at the time the minidump was generated. +class MinidumpBreakpadInfo : public MinidumpStream { + public: + const MDRawBreakpadInfo* breakpad_info() const { + return valid_ ? &breakpad_info_ : NULL; + } + + // These thread IDs are used to determine if threads deserve special + // treatment, so special getters are provided to retrieve this data from + // the MDRawBreakpadInfo structure. The getters return false if the thread + // IDs cannot be determined. + bool GetDumpThreadID(u_int32_t *thread_id) const; + bool GetRequestingThreadID(u_int32_t *thread_id) const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const u_int32_t kStreamType = MD_BREAKPAD_INFO_STREAM; + + explicit MinidumpBreakpadInfo(Minidump* minidump_); + + bool Read(u_int32_t expected_size_); + + MDRawBreakpadInfo breakpad_info_; +}; + + +// Minidump is the user's interface to a minidump file. It wraps MDRawHeader +// and provides access to the minidump's top-level stream directory. +class Minidump { + public: + // path is the pathname of a file containing the minidump. + explicit Minidump(const string& path); + + ~Minidump(); + + static void set_max_streams(u_int32_t max_streams) { + max_streams_ = max_streams; + } + static u_int32_t max_streams() { return max_streams_; } + + static void set_max_string_length(u_int32_t max_string_length) { + max_string_length_ = max_string_length; + } + static u_int32_t max_string_length() { return max_string_length_; } + + const MDRawHeader* header() const { return valid_ ? &header_ : NULL; } + + // Reads the minidump file's header and top-level stream directory. + // The minidump is expected to be positioned at the beginning of the + // header. Read() sets up the stream list and map, and validates the + // Minidump object. + bool Read(); + + // The next set of methods are stubs that call GetStream. They exist to + // force code generation of the templatized API within the module, and + // to avoid exposing an ugly API (GetStream needs to accept a garbage + // parameter). + MinidumpThreadList* GetThreadList(); + MinidumpModuleList* GetModuleList(); + MinidumpMemoryList* GetMemoryList(); + MinidumpException* GetException(); + MinidumpSystemInfo* GetSystemInfo(); + MinidumpMiscInfo* GetMiscInfo(); + MinidumpBreakpadInfo* GetBreakpadInfo(); + + // The next set of methods are provided for users who wish to access + // data in minidump files directly, while leveraging the rest of + // this class and related classes to handle the basic minidump + // structure and known stream types. + + unsigned int GetDirectoryEntryCount() const { + return valid_ ? header_.stream_count : 0; + } + const MDRawDirectory* GetDirectoryEntryAtIndex(unsigned int index) const; + + // The next 2 methods are lower-level I/O routines. They use fd_. + + // Reads count bytes from the minidump at the current position into + // the storage area pointed to by bytes. bytes must be of sufficient + // size. After the read, the file position is advanced by count. + bool ReadBytes(void* bytes, size_t count); + + // Sets the position of the minidump file to offset. + bool SeekSet(off_t offset); + + // Returns the current position of the minidump file. + off_t Tell() { return valid_ ? lseek(fd_, 0, SEEK_CUR) : (off_t)-1; } + + // The next 2 methods are medium-level I/O routines. + + // ReadString returns a string which is owned by the caller! offset + // specifies the offset that a length-encoded string is stored at in the + // minidump file. + string* ReadString(off_t offset); + + // SeekToStreamType positions the file at the beginning of a stream + // identified by stream_type, and informs the caller of the stream's + // length by setting *stream_length. Because stream_map maps each stream + // type to only one stream in the file, this might mislead the user into + // thinking that the stream that this seeks to is the only stream with + // type stream_type. That can't happen for streams that these classes + // deal with directly, because they're only supposed to be present in the + // file singly, and that's verified when stream_map_ is built. Users who + // are looking for other stream types should be aware of this + // possibility, and consider using GetDirectoryEntryAtIndex (possibly + // with GetDirectoryEntryCount) if expecting multiple streams of the same + // type in a single minidump file. + bool SeekToStreamType(u_int32_t stream_type, u_int32_t* stream_length); + + bool swap() const { return valid_ ? swap_ : false; } + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + // MinidumpStreamInfo is used in the MinidumpStreamMap. It lets + // the Minidump object locate interesting streams quickly, and + // provides a convenient place to stash MinidumpStream objects. + struct MinidumpStreamInfo { + MinidumpStreamInfo() : stream_index(0), stream(NULL) {} + ~MinidumpStreamInfo() { delete stream; } + + // Index into the MinidumpDirectoryEntries vector + unsigned int stream_index; + + // Pointer to the stream if cached, or NULL if not yet populated + MinidumpStream* stream; + }; + + typedef vector MinidumpDirectoryEntries; + typedef map MinidumpStreamMap; + + template T* GetStream(T** stream); + + // Opens the minidump file, or if already open, seeks to the beginning. + bool Open(); + + // The largest number of top-level streams that will be read from a minidump. + // Note that streams are only read (and only consume memory) as needed, + // when directed by the caller. The default is 128. + static u_int32_t max_streams_; + + // The maximum length of a UTF-16 string that will be read from a minidump + // in 16-bit words. The default is 1024. UTF-16 strings are converted + // to UTF-8 when stored in memory, and each UTF-16 word will be represented + // by as many as 3 bytes in UTF-8. + static unsigned int max_string_length_; + + MDRawHeader header_; + + // The list of streams. + MinidumpDirectoryEntries* directory_; + + // Access to streams using the stream type as the key. + MinidumpStreamMap* stream_map_; + + // The pathname of the minidump file to process, set in the constructor. + const string path_; + + // The file descriptor for all file I/O. Used by ReadBytes and SeekSet. + // Set based on the |path_| member by Open, which is called by Read. + int fd_; + + // swap_ is true if the minidump file should be byte-swapped. If the + // minidump was produced by a CPU that is other-endian than the CPU + // processing the minidump, this will be true. If the two CPUs are + // same-endian, this will be false. + bool swap_; + + // Validity of the Minidump structure, false immediately after + // construction or after a failed Read(); true following a successful + // Read(). + bool valid_; +}; + + +} // namespace google_breakpad + + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/minidump_processor.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/minidump_processor.h new file mode 100644 index 00000000..73447f97 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/minidump_processor.h @@ -0,0 +1,94 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__ + +#include +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::string; + +class Minidump; +class ProcessState; +class SourceLineResolverInterface; +class SymbolSupplier; +class SystemInfo; + +class MinidumpProcessor { + public: + // Return type for Process() + enum ProcessResult { + PROCESS_OK, // the minidump was processed successfully + PROCESS_ERROR, // there was an error processing the minidump + PROCESS_INTERRUPTED // processing was interrupted by the SymbolSupplier + }; + + // Initializes this MinidumpProcessor. supplier should be an + // implementation of the SymbolSupplier abstract base class. + MinidumpProcessor(SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + ~MinidumpProcessor(); + + // Processes the minidump file and fills process_state with the result. + ProcessResult Process(const string &minidump_file, + ProcessState *process_state); + + // Populates the cpu_* fields of the |info| parameter with textual + // representations of the CPU type that the minidump in |dump| was + // produced on. Returns false if this information is not available in + // the minidump. + static bool GetCPUInfo(Minidump *dump, SystemInfo *info); + + // Populates the os_* fields of the |info| parameter with textual + // representations of the operating system that the minidump in |dump| + // was produced on. Returns false if this information is not available in + // the minidump. + static bool GetOSInfo(Minidump *dump, SystemInfo *info); + + // Returns a textual representation of the reason that a crash occurred, + // if the minidump in dump was produced as a result of a crash. Returns + // an empty string if this information cannot be determined. If address + // is non-NULL, it will be set to contain the address that caused the + // exception, if this information is available. This will be a code + // address when the crash was caused by problems such as illegal + // instructions or divisions by zero, or a data address when the crash + // was caused by a memory access violation. + static string GetCrashReason(Minidump *dump, u_int64_t *address); + + private: + SymbolSupplier *supplier_; + SourceLineResolverInterface *resolver_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/process_state.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/process_state.h new file mode 100644 index 00000000..afbbb193 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/process_state.h @@ -0,0 +1,115 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// process_state.h: A snapshot of a process, in a fully-digested state. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__ + +#include +#include +#include "google_breakpad/processor/system_info.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::string; +using std::vector; + +class CallStack; +class CodeModules; + +class ProcessState { + public: + ProcessState() : modules_(NULL) { Clear(); } + ~ProcessState(); + + // Resets the ProcessState to its default values + void Clear(); + + // Accessors. See the data declarations below. + u_int32_t time_date_stamp() const { return time_date_stamp_; } + bool crashed() const { return crashed_; } + string crash_reason() const { return crash_reason_; } + u_int64_t crash_address() const { return crash_address_; } + int requesting_thread() const { return requesting_thread_; } + const vector* threads() const { return &threads_; } + const SystemInfo* system_info() const { return &system_info_; } + const CodeModules* modules() const { return modules_; } + + private: + // MinidumpProcessor is responsible for building ProcessState objects. + friend class MinidumpProcessor; + + // The time-date stamp of the minidump (time_t format) + u_int32_t time_date_stamp_; + + // True if the process crashed, false if the dump was produced outside + // of an exception handler. + bool crashed_; + + // If the process crashed, the type of crash. OS- and possibly CPU- + // specific. For example, "EXCEPTION_ACCESS_VIOLATION" (Windows), + // "EXC_BAD_ACCESS / KERN_INVALID_ADDRESS" (Mac OS X), "SIGSEGV" + // (other Unix). + string crash_reason_; + + // If the process crashed, and if crash_reason implicates memory, + // the memory address that caused the crash. For data access errors, + // this will be the data address that caused the fault. For code errors, + // this will be the address of the instruction that caused the fault. + u_int64_t crash_address_; + + // The index of the thread that requested a dump be written in the + // threads vector. If a dump was produced as a result of a crash, this + // will point to the thread that crashed. If the dump was produced as + // by user code without crashing, and the dump contains extended Breakpad + // information, this will point to the thread that requested the dump. + // If the dump was not produced as a result of an exception and no + // extended Breakpad information is present, this field will be set to -1, + // indicating that the dump thread is not available. + int requesting_thread_; + + // Stacks for each thread (except possibly the exception handler + // thread) at the time of the crash. + vector threads_; + + // OS and CPU information. + SystemInfo system_info_; + + // The modules that were loaded into the process represented by the + // ProcessState. + const CodeModules *modules_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/source_line_resolver_interface.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/source_line_resolver_interface.h new file mode 100644 index 00000000..93ef85d2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/source_line_resolver_interface.h @@ -0,0 +1,82 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Abstract interface to return function/file/line info for a memory address. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ + +#include +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::string; + +struct StackFrame; +struct StackFrameInfo; + +class SourceLineResolverInterface { + public: + typedef u_int64_t MemAddr; + + virtual ~SourceLineResolverInterface() {} + + // Adds a module to this resolver, returning true on success. + // + // module_name may be an arbitrary string. Typically, it will be the + // filename of the module, optionally with version identifiers. + // + // map_file should contain line/address mappings for this module. + virtual bool LoadModule(const string &module_name, + const string &map_file) = 0; + // Same as above, but takes the contents of a pre-read map buffer + virtual bool LoadModuleUsingMapBuffer(const string &module_name, + const string &map_buffer) = 0; + + // Returns true if a module with the given name has been loaded. + virtual bool HasModule(const string &module_name) const = 0; + + // Fills in the function_base, function_name, source_file_name, + // and source_line fields of the StackFrame. The instruction and + // module_name fields must already be filled in. Additional debugging + // information, if available, is returned. If the information is not + // available, returns NULL. A NULL return value does not indicate an + // error. The caller takes ownership of any returned StackFrameInfo + // object. + virtual StackFrameInfo* FillSourceLineInfo(StackFrame *frame) const = 0; + + protected: + // SourceLineResolverInterface cannot be instantiated except by subclasses + SourceLineResolverInterface() {} +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/stack_frame.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/stack_frame.h new file mode 100644 index 00000000..b330f8ae --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/stack_frame.h @@ -0,0 +1,84 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__ + +#include +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +class CodeModule; + +using std::string; + +struct StackFrame { + StackFrame() + : instruction(), + module(NULL), + function_name(), + function_base(), + source_file_name(), + source_line(), + source_line_base() {} + virtual ~StackFrame() {} + + // The program counter location as an absolute virtual address. For the + // innermost called frame in a stack, this will be an exact program counter + // or instruction pointer value. For all other frames, this will be within + // the instruction that caused execution to branch to a called function, + // but may not necessarily point to the exact beginning of that instruction. + u_int64_t instruction; + + // The module in which the instruction resides. + const CodeModule *module; + + // The function name, may be omitted if debug symbols are not available. + string function_name; + + // The start address of the function, may be omitted if debug symbols + // are not available. + u_int64_t function_base; + + // The source file name, may be omitted if debug symbols are not available. + string source_file_name; + + // The (1-based) source line number, may be omitted if debug symbols are + // not available. + int source_line; + + // The start address of the source line, may be omitted if debug symbols + // are not available. + u_int64_t source_line_base; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/stack_frame_cpu.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/stack_frame_cpu.h new file mode 100644 index 00000000..70823b9c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/stack_frame_cpu.h @@ -0,0 +1,153 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stack_frame_cpu.h: CPU-specific StackFrame extensions. +// +// These types extend the StackFrame structure to carry CPU-specific register +// state. They are defined in this header instead of stack_frame.h to +// avoid the need to include minidump_format.h when only the generic +// StackFrame type is needed. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ + +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stack_frame.h" + +namespace google_breakpad { + +struct StackFrameX86 : public StackFrame { + // ContextValidity has one entry for each relevant hardware pointer register + // (%eip and %esp) and one entry for each nonvolatile (callee-save) register. + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_EIP = 1 << 0, + CONTEXT_VALID_ESP = 1 << 1, + CONTEXT_VALID_EBP = 1 << 2, + CONTEXT_VALID_EBX = 1 << 3, + CONTEXT_VALID_ESI = 1 << 4, + CONTEXT_VALID_EDI = 1 << 5, + CONTEXT_VALID_ALL = -1 + }; + + StackFrameX86() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextX86 context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +struct StackFramePPC : public StackFrame { + // ContextValidity should eventually contain entries for the validity of + // other nonvolatile (callee-save) registers as in + // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently + // locate registers other than the ones listed here. + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_SRR0 = 1 << 0, + CONTEXT_VALID_GPR1 = 1 << 1, + CONTEXT_VALID_ALL = -1 + }; + + StackFramePPC() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextPPC context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +struct StackFrameAMD64 : public StackFrame { + // ContextValidity has one entry for each relevant hardware pointer register + // (%rip and %rsp) and one entry for each nonvolatile (callee-save) register. + //FIXME: validate this list + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_RIP = 1 << 0, + CONTEXT_VALID_RSP = 1 << 1, + CONTEXT_VALID_RBP = 1 << 2, + CONTEXT_VALID_ALL = -1 + }; + + StackFrameAMD64() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextAMD64 context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +struct StackFrameSPARC : public StackFrame { + // to be confirmed + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_PC = 1 << 0, + CONTEXT_VALID_SP = 1 << 1, + CONTEXT_VALID_FP = 1 << 2, + CONTEXT_VALID_ALL = -1 + }; + + StackFrameSPARC() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextSPARC context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/stackwalker.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/stackwalker.h new file mode 100644 index 00000000..c463fd80 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/stackwalker.h @@ -0,0 +1,140 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker.h: Generic stackwalker. +// +// The Stackwalker class is an abstract base class providing common generic +// methods that apply to stacks from all systems. Specific implementations +// will extend this class by providing GetContextFrame and GetCallerFrame +// methods to fill in system-specific data in a StackFrame structure. +// Stackwalker assembles these StackFrame strucutres into a CallStack. +// +// Author: Mark Mentovai + + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__ + +#include + +namespace google_breakpad { + +class CallStack; +class CodeModules; +template class linked_ptr; +class MemoryRegion; +class MinidumpContext; +class SourceLineResolverInterface; +struct StackFrame; +struct StackFrameInfo; +class SymbolSupplier; +class SystemInfo; + +using std::vector; + + +class Stackwalker { + public: + virtual ~Stackwalker() {} + + // Populates the given CallStack by calling GetContextFrame and + // GetCallerFrame. The frames are further processed to fill all available + // data. Returns true if the stackwalk completed, or false if it was + // interrupted by SymbolSupplier::GetSymbolFile(). + bool Walk(CallStack *stack); + + // Returns a new concrete subclass suitable for the CPU that a stack was + // generated on, according to the CPU type indicated by the context + // argument. If no suitable concrete subclass exists, returns NULL. + static Stackwalker* StackwalkerForCPU(const SystemInfo *system_info, + MinidumpContext *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + protected: + // system_info identifies the operating system, NULL or empty if unknown. + // memory identifies a MemoryRegion that provides the stack memory + // for the stack to walk. modules, if non-NULL, is a CodeModules + // object that is used to look up which code module each stack frame is + // associated with. supplier is an optional caller-supplied SymbolSupplier + // implementation. If supplier is NULL, source line info will not be + // resolved. resolver is an instance of SourceLineResolverInterface + // (see source_line_resolver_interface.h and basic_source_line_resolver.h). + // If resolver is NULL, source line info will not be resolved. + Stackwalker(const SystemInfo *system_info, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + // Information about the system that produced the minidump. Subclasses + // and the SymbolSupplier may find this information useful. + const SystemInfo *system_info_; + + // The stack memory to walk. Subclasses will require this region to + // get information from the stack. + MemoryRegion *memory_; + + // A list of modules, for populating each StackFrame's module information. + // This field is optional and may be NULL. + const CodeModules *modules_; + + private: + // Obtains the context frame, the innermost called procedure in a stack + // trace. Returns NULL on failure. GetContextFrame allocates a new + // StackFrame (or StackFrame subclass), ownership of which is taken by + // the caller. + virtual StackFrame* GetContextFrame() = 0; + + // Obtains a caller frame. Each call to GetCallerFrame should return the + // frame that called the last frame returned by GetContextFrame or + // GetCallerFrame. To aid this purpose, stack contains the CallStack + // made of frames that have already been walked. GetCallerFrame should + // return NULL on failure or when there are no more caller frames (when + // the end of the stack has been reached). GetCallerFrame allocates a new + // StackFrame (or StackFrame subclass), ownership of which is taken by + // the caller. + virtual StackFrame* GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info) = 0; + + // The optional SymbolSupplier for resolving source line info. + SymbolSupplier *supplier_; + + // The SourceLineResolver implementation + SourceLineResolverInterface *resolver_; +}; + + +} // namespace google_breakpad + + +#endif // GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/symbol_supplier.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/symbol_supplier.h new file mode 100644 index 00000000..7b9d00e4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/symbol_supplier.h @@ -0,0 +1,82 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// The caller may implement the SymbolSupplier abstract base class +// to provide symbols for a given module. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__ + +#include + +namespace google_breakpad { + +using std::string; +class CodeModule; +class SystemInfo; + +class SymbolSupplier { + public: + // Result type for GetSymbolFile + enum SymbolResult { + // no symbols were found, but continue processing + NOT_FOUND, + + // symbols were found, and the path has been placed in symbol_file + FOUND, + + // stops processing the minidump immediately + INTERRUPT + }; + + virtual ~SymbolSupplier() {} + + // Retrieves the symbol file for the given CodeModule, placing the + // path in symbol_file if successful. system_info contains strings + // identifying the operating system and CPU; SymbolSupplier may use + // to help locate the symbol file. system_info may be NULL or its + // fields may be empty if these values are unknown. symbol_file + // must be a pointer to a valid string + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file) = 0; + // Same as above, except also places symbol data into symbol_data. + // If symbol_data is NULL, the data is not returned. + // TODO(nealsid) Once we have symbol data caching behavior implemented + // investigate making all symbol suppliers implement all methods, + // and make this pure virtual + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data) = 0; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__ diff --git a/thirdparty/google-breakpad/r318/src/google_breakpad/processor/system_info.h b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/system_info.h new file mode 100644 index 00000000..fdbdbfd6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/google_breakpad/processor/system_info.h @@ -0,0 +1,97 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// system_info.h: Information about the system that was running a program +// when a crash report was produced. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__ + +#include + +namespace google_breakpad { + +using std::string; + +struct SystemInfo { + public: + SystemInfo() : os(), os_short(), os_version(), cpu(), cpu_info(), + cpu_count(0) {} + + // Resets the SystemInfo object to its default values. + void Clear() { + os.clear(); + os_short.clear(); + os_version.clear(); + cpu.clear(); + cpu_info.clear(); + cpu_count = 0; + } + + // A string identifying the operating system, such as "Windows NT", + // "Mac OS X", or "Linux". If the information is present in the dump but + // its value is unknown, this field will contain a numeric value. If + // the information is not present in the dump, this field will be empty. + string os; + + // A short form of the os string, using lowercase letters and no spaces, + // suitable for use in a filesystem. Possible values are "windows", + // "mac", and "linux". Empty if the information is not present in the dump + // or if the OS given by the dump is unknown. The values stored in this + // field should match those used by MinidumpSystemInfo::GetOS. + string os_short; + + // A string identifying the version of the operating system, such as + // "5.1.2600 Service Pack 2" or "10.4.8 8L2127". If the dump does not + // contain this information, this field will be empty. + string os_version; + + // A string identifying the basic CPU family, such as "x86" or "ppc". + // If this information is present in the dump but its value is unknown, + // this field will contain a numeric value. If the information is not + // present in the dump, this field will be empty. The values stored in + // this field should match those used by MinidumpSystemInfo::GetCPU. + string cpu; + + // A string further identifying the specific CPU, such as + // "GenuineIntel level 6 model 13 stepping 8". If the information is not + // present in the dump, or additional identifying information is not + // defined for the CPU family, this field will be empty. + string cpu_info; + + // The number of processors in the system. Will be greater than one for + // multi-core systems. + int cpu_count; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/.dirstamp b/thirdparty/google-breakpad/r318/src/processor/.deps/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/address_map_unittest.Po b/thirdparty/google-breakpad/r318/src/processor/.deps/address_map_unittest.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/address_map_unittest.Po @@ -0,0 +1 @@ +# dummy diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/basic_code_modules.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/basic_code_modules.Plo new file mode 100644 index 00000000..79f6454d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/basic_code_modules.Plo @@ -0,0 +1,385 @@ +src/processor/basic_code_modules.lo src/processor/basic_code_modules.o: \ + src/processor/basic_code_modules.cc /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/sys/cdefs.h /usr/include/stdlib.h \ + /usr/include/available.h /usr/include/_types.h \ + /usr/include/sys/_types.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/i386/_structs.h /usr/include/sys/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + src/processor/basic_code_modules.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + src/google_breakpad/processor/code_module.h \ + /usr/include/c++/4.0.0/string \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/string.h /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc src/processor/linked_ptr.h \ + src/processor/logging.h /usr/include/c++/4.0.0/iostream \ + /usr/include/c++/4.0.0/ostream /usr/include/c++/4.0.0/ios \ + /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc src/processor/range_map-inl.h \ + src/processor/range_map.h /usr/include/c++/4.0.0/map \ + /usr/include/c++/4.0.0/bits/stl_tree.h \ + /usr/include/c++/4.0.0/bits/stl_map.h \ + /usr/include/c++/4.0.0/bits/stl_multimap.h + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/sys/cdefs.h: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +src/processor/basic_code_modules.h: + +src/google_breakpad/processor/code_modules.h: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +src/google_breakpad/processor/code_module.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/string.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +src/processor/linked_ptr.h: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: + +src/processor/range_map-inl.h: + +src/processor/range_map.h: + +/usr/include/c++/4.0.0/map: + +/usr/include/c++/4.0.0/bits/stl_tree.h: + +/usr/include/c++/4.0.0/bits/stl_map.h: + +/usr/include/c++/4.0.0/bits/stl_multimap.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/basic_source_line_resolver.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/basic_source_line_resolver.Plo new file mode 100644 index 00000000..1beffa48 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/basic_source_line_resolver.Plo @@ -0,0 +1,436 @@ +src/processor/basic_source_line_resolver.lo \ + src/processor/basic_source_line_resolver.o: \ + src/processor/basic_source_line_resolver.cc /usr/include/stdio.h \ + /usr/include/_types.h /usr/include/sys/_types.h \ + /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/string.h \ + /usr/include/sys/types.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/machine/endian.h /usr/include/i386/endian.h \ + /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/sys/_structs.h \ + /usr/include/sys/stat.h /usr/include/unistd.h /usr/include/sys/unistd.h \ + /usr/include/sys/select.h /usr/include/sys/_select.h \ + /usr/include/c++/4.0.0/map /usr/include/c++/4.0.0/bits/stl_tree.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/i386/signal.h /usr/include/i386/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/alloca.h \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h \ + /usr/include/c++/4.0.0/cctype /usr/include/ctype.h \ + /usr/include/runetype.h /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/stl_map.h \ + /usr/include/c++/4.0.0/bits/stl_multimap.h \ + /usr/include/c++/4.0.0/utility /usr/include/c++/4.0.0/bits/stl_relops.h \ + /usr/include/c++/4.0.0/vector \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc src/processor/address_map-inl.h \ + src/processor/address_map.h src/processor/logging.h \ + /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ + /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc \ + src/google_breakpad/common/breakpad_types.h /usr/include/inttypes.h \ + src/processor/contained_range_map-inl.h \ + src/processor/contained_range_map.h src/processor/range_map-inl.h \ + src/processor/range_map.h \ + src/google_breakpad/processor/basic_source_line_resolver.h \ + /usr/include/c++/4.0.0/ext/hash_map \ + /usr/include/c++/4.0.0/ext/hashtable.h /usr/include/c++/4.0.0/iterator \ + /usr/include/c++/4.0.0/bits/stream_iterator.h \ + /usr/include/c++/4.0.0/ext/hash_fun.h \ + src/google_breakpad/processor/source_line_resolver_interface.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/processor/stack_frame.h src/processor/linked_ptr.h \ + src/processor/scoped_ptr.h src/processor/stack_frame_info.h + +/usr/include/stdio.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/string.h: + +/usr/include/sys/types.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/sys/_structs.h: + +/usr/include/sys/stat.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/map: + +/usr/include/c++/4.0.0/bits/stl_tree.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/alloca.h: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/stl_map.h: + +/usr/include/c++/4.0.0/bits/stl_multimap.h: + +/usr/include/c++/4.0.0/utility: + +/usr/include/c++/4.0.0/bits/stl_relops.h: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/processor/address_map-inl.h: + +src/processor/address_map.h: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/inttypes.h: + +src/processor/contained_range_map-inl.h: + +src/processor/contained_range_map.h: + +src/processor/range_map-inl.h: + +src/processor/range_map.h: + +src/google_breakpad/processor/basic_source_line_resolver.h: + +/usr/include/c++/4.0.0/ext/hash_map: + +/usr/include/c++/4.0.0/ext/hashtable.h: + +/usr/include/c++/4.0.0/iterator: + +/usr/include/c++/4.0.0/bits/stream_iterator.h: + +/usr/include/c++/4.0.0/ext/hash_fun.h: + +src/google_breakpad/processor/source_line_resolver_interface.h: + +src/google_breakpad/processor/code_module.h: + +src/google_breakpad/processor/stack_frame.h: + +src/processor/linked_ptr.h: + +src/processor/scoped_ptr.h: + +src/processor/stack_frame_info.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/basic_source_line_resolver_unittest.Po b/thirdparty/google-breakpad/r318/src/processor/.deps/basic_source_line_resolver_unittest.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/basic_source_line_resolver_unittest.Po @@ -0,0 +1 @@ +# dummy diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/call_stack.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/call_stack.Plo new file mode 100644 index 00000000..16fe559b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/call_stack.Plo @@ -0,0 +1,301 @@ +src/processor/call_stack.lo src/processor/call_stack.o: \ + src/processor/call_stack.cc src/google_breakpad/processor/call_stack.h \ + /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/string.h /usr/include/_types.h /usr/include/sys/_types.h \ + /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/i386/_structs.h /usr/include/sys/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/processor/stack_frame.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h + +src/google_breakpad/processor/call_stack.h: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/string.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/processor/stack_frame.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/contained_range_map_unittest.Po b/thirdparty/google-breakpad/r318/src/processor/.deps/contained_range_map_unittest.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/contained_range_map_unittest.Po @@ -0,0 +1 @@ +# dummy diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/logging.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/logging.Plo new file mode 100644 index 00000000..572dbc28 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/logging.Plo @@ -0,0 +1,365 @@ +src/processor/logging.lo src/processor/logging.o: \ + src/processor/logging.cc /usr/include/assert.h /usr/include/sys/cdefs.h \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/_types.h \ + /usr/include/sys/_types.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/i386/_structs.h /usr/include/sys/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/errno.h /usr/include/sys/errno.h /usr/include/stdio.h \ + /usr/include/string.h /usr/include/time.h /usr/include/_structs.h \ + src/processor/logging.h /usr/include/c++/4.0.0/iostream \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/ostream /usr/include/c++/4.0.0/ios \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstring \ + /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/c++/4.0.0/cstdio \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/unistd.h /usr/include/sys/unistd.h \ + /usr/include/sys/select.h /usr/include/sys/_select.h \ + /usr/include/c++/4.0.0/cctype /usr/include/ctype.h \ + /usr/include/runetype.h /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h src/processor/pathname_stripper.h + +/usr/include/assert.h: + +/usr/include/sys/cdefs.h: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/errno.h: + +/usr/include/sys/errno.h: + +/usr/include/stdio.h: + +/usr/include/string.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: + +src/processor/pathname_stripper.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/minidump.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/minidump.Plo new file mode 100644 index 00000000..4214a0f8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/minidump.Plo @@ -0,0 +1,438 @@ +src/processor/minidump.lo src/processor/minidump.o: \ + src/processor/minidump.cc /usr/include/fcntl.h /usr/include/sys/fcntl.h \ + /usr/include/sys/_types.h /usr/include/sys/cdefs.h \ + /usr/include/machine/_types.h /usr/include/i386/_types.h \ + /usr/include/stdio.h /usr/include/_types.h /usr/include/string.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/sys/_structs.h \ + /usr/include/unistd.h /usr/include/sys/unistd.h \ + /usr/include/sys/select.h /usr/include/sys/appleapiopts.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/stdlib.h /usr/include/available.h \ + /usr/include/sys/wait.h /usr/include/sys/signal.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/i386/_structs.h /usr/include/machine/_structs.h \ + /usr/include/mach/i386/_structs.h /usr/include/sys/resource.h \ + /usr/include/machine/endian.h /usr/include/i386/endian.h \ + /usr/include/sys/_endian.h /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/map /usr/include/c++/4.0.0/bits/stl_tree.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/c++/4.0.0/cctype /usr/include/ctype.h \ + /usr/include/runetype.h /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h \ + /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/stl_map.h \ + /usr/include/c++/4.0.0/bits/stl_multimap.h \ + /usr/include/c++/4.0.0/vector \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc src/processor/range_map-inl.h \ + src/processor/range_map.h src/processor/logging.h \ + /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ + /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h src/google_breakpad/processor/minidump.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_cpu_sparc.h \ + src/google_breakpad/common/minidump_cpu_x86.h \ + src/google_breakpad/common/minidump_cpu_ppc.h \ + src/google_breakpad/common/minidump_cpu_ppc64.h \ + src/google_breakpad/common/minidump_cpu_amd64.h \ + src/google_breakpad/common/minidump_exception_win32.h \ + src/google_breakpad/common/minidump_exception_mac.h \ + src/google_breakpad/common/minidump_exception_linux.h \ + src/google_breakpad/common/minidump_exception_solaris.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/memory_region.h \ + src/processor/basic_code_module.h src/processor/basic_code_modules.h \ + src/processor/scoped_ptr.h + +/usr/include/fcntl.h: + +/usr/include/sys/fcntl.h: + +/usr/include/sys/_types.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/stdio.h: + +/usr/include/_types.h: + +/usr/include/string.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/map: + +/usr/include/c++/4.0.0/bits/stl_tree.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/stl_map.h: + +/usr/include/c++/4.0.0/bits/stl_multimap.h: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/processor/range_map-inl.h: + +src/processor/range_map.h: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: + +src/google_breakpad/processor/minidump.h: + +src/google_breakpad/common/minidump_format.h: + +src/google_breakpad/common/minidump_cpu_sparc.h: + +src/google_breakpad/common/minidump_cpu_x86.h: + +src/google_breakpad/common/minidump_cpu_ppc.h: + +src/google_breakpad/common/minidump_cpu_ppc64.h: + +src/google_breakpad/common/minidump_cpu_amd64.h: + +src/google_breakpad/common/minidump_exception_win32.h: + +src/google_breakpad/common/minidump_exception_mac.h: + +src/google_breakpad/common/minidump_exception_linux.h: + +src/google_breakpad/common/minidump_exception_solaris.h: + +src/google_breakpad/processor/code_module.h: + +src/google_breakpad/processor/code_modules.h: + +src/google_breakpad/processor/memory_region.h: + +src/processor/basic_code_module.h: + +src/processor/basic_code_modules.h: + +src/processor/scoped_ptr.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_dump.Po b/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_dump.Po new file mode 100644 index 00000000..d25636e0 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_dump.Po @@ -0,0 +1,420 @@ +src/processor/minidump_dump.o src/processor/minidump_dump.o: \ + src/processor/minidump_dump.cc /usr/include/c++/4.0.0/cstdio \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/stdio.h /usr/include/_types.h /usr/include/sys/_types.h \ + /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h src/google_breakpad/processor/minidump.h \ + /usr/include/unistd.h /usr/include/sys/unistd.h \ + /usr/include/sys/select.h /usr/include/sys/appleapiopts.h \ + /usr/include/sys/_structs.h /usr/include/sys/_select.h \ + /usr/include/c++/4.0.0/map /usr/include/c++/4.0.0/bits/stl_tree.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/cstring /usr/include/string.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/i386/signal.h /usr/include/i386/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h \ + /usr/include/c++/4.0.0/cctype /usr/include/ctype.h \ + /usr/include/runetype.h /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/stl_map.h \ + /usr/include/c++/4.0.0/bits/stl_multimap.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h src/google_breakpad/common/minidump_cpu_sparc.h \ + src/google_breakpad/common/minidump_cpu_x86.h \ + src/google_breakpad/common/minidump_cpu_ppc.h \ + src/google_breakpad/common/minidump_cpu_ppc64.h \ + src/google_breakpad/common/minidump_cpu_amd64.h \ + src/google_breakpad/common/minidump_exception_win32.h \ + src/google_breakpad/common/minidump_exception_mac.h \ + src/google_breakpad/common/minidump_exception_linux.h \ + src/google_breakpad/common/minidump_exception_solaris.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/memory_region.h src/processor/logging.h \ + /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ + /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/stdio.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +src/google_breakpad/processor/minidump.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/sys/_structs.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/map: + +/usr/include/c++/4.0.0/bits/stl_tree.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/string.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/stl_map.h: + +/usr/include/c++/4.0.0/bits/stl_multimap.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/common/minidump_format.h: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: + +src/google_breakpad/common/minidump_cpu_sparc.h: + +src/google_breakpad/common/minidump_cpu_x86.h: + +src/google_breakpad/common/minidump_cpu_ppc.h: + +src/google_breakpad/common/minidump_cpu_ppc64.h: + +src/google_breakpad/common/minidump_cpu_amd64.h: + +src/google_breakpad/common/minidump_exception_win32.h: + +src/google_breakpad/common/minidump_exception_mac.h: + +src/google_breakpad/common/minidump_exception_linux.h: + +src/google_breakpad/common/minidump_exception_solaris.h: + +src/google_breakpad/processor/code_module.h: + +src/google_breakpad/processor/code_modules.h: + +src/google_breakpad/processor/memory_region.h: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_processor.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_processor.Plo new file mode 100644 index 00000000..47031ede --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_processor.Plo @@ -0,0 +1,441 @@ +src/processor/minidump_processor.lo src/processor/minidump_processor.o: \ + src/processor/minidump_processor.cc /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/sys/cdefs.h /usr/include/stdlib.h \ + /usr/include/available.h /usr/include/_types.h \ + /usr/include/sys/_types.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/i386/_structs.h /usr/include/sys/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + src/google_breakpad/processor/minidump_processor.h \ + /usr/include/c++/4.0.0/string \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/string.h /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h src/google_breakpad/processor/call_stack.h \ + /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/processor/minidump.h /usr/include/c++/4.0.0/map \ + /usr/include/c++/4.0.0/bits/stl_tree.h \ + /usr/include/c++/4.0.0/bits/stl_map.h \ + /usr/include/c++/4.0.0/bits/stl_multimap.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_cpu_sparc.h \ + src/google_breakpad/common/minidump_cpu_x86.h \ + src/google_breakpad/common/minidump_cpu_ppc.h \ + src/google_breakpad/common/minidump_cpu_ppc64.h \ + src/google_breakpad/common/minidump_cpu_amd64.h \ + src/google_breakpad/common/minidump_exception_win32.h \ + src/google_breakpad/common/minidump_exception_mac.h \ + src/google_breakpad/common/minidump_exception_linux.h \ + src/google_breakpad/common/minidump_exception_solaris.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/processor/process_state.h \ + src/google_breakpad/processor/system_info.h src/processor/logging.h \ + /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ + /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc src/processor/scoped_ptr.h \ + src/processor/stackwalker_x86.h \ + src/google_breakpad/processor/stackwalker.h + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/sys/cdefs.h: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +src/google_breakpad/processor/minidump_processor.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/string.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: + +src/google_breakpad/processor/call_stack.h: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/processor/minidump.h: + +/usr/include/c++/4.0.0/map: + +/usr/include/c++/4.0.0/bits/stl_tree.h: + +/usr/include/c++/4.0.0/bits/stl_map.h: + +/usr/include/c++/4.0.0/bits/stl_multimap.h: + +src/google_breakpad/common/minidump_format.h: + +src/google_breakpad/common/minidump_cpu_sparc.h: + +src/google_breakpad/common/minidump_cpu_x86.h: + +src/google_breakpad/common/minidump_cpu_ppc.h: + +src/google_breakpad/common/minidump_cpu_ppc64.h: + +src/google_breakpad/common/minidump_cpu_amd64.h: + +src/google_breakpad/common/minidump_exception_win32.h: + +src/google_breakpad/common/minidump_exception_mac.h: + +src/google_breakpad/common/minidump_exception_linux.h: + +src/google_breakpad/common/minidump_exception_solaris.h: + +src/google_breakpad/processor/code_module.h: + +src/google_breakpad/processor/code_modules.h: + +src/google_breakpad/processor/memory_region.h: + +src/google_breakpad/processor/process_state.h: + +src/google_breakpad/processor/system_info.h: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: + +src/processor/scoped_ptr.h: + +src/processor/stackwalker_x86.h: + +src/google_breakpad/processor/stackwalker.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_processor_unittest.Po b/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_processor_unittest.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_processor_unittest.Po @@ -0,0 +1 @@ +# dummy diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_stackwalk.Po b/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_stackwalk.Po new file mode 100644 index 00000000..9ca4ce0b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/minidump_stackwalk.Po @@ -0,0 +1,469 @@ +src/processor/minidump_stackwalk.o src/processor/minidump_stackwalk.o: \ + src/processor/minidump_stackwalk.cc /usr/include/c++/4.0.0/cstdio \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/stdio.h /usr/include/_types.h /usr/include/sys/_types.h \ + /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/i386/_structs.h /usr/include/sys/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/cstring /usr/include/string.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/processor/basic_source_line_resolver.h \ + /usr/include/c++/4.0.0/ext/hash_map \ + /usr/include/c++/4.0.0/ext/hashtable.h /usr/include/c++/4.0.0/iterator \ + /usr/include/c++/4.0.0/ostream /usr/include/c++/4.0.0/ios \ + /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc \ + /usr/include/c++/4.0.0/bits/stream_iterator.h \ + /usr/include/c++/4.0.0/ext/hash_fun.h \ + src/google_breakpad/processor/source_line_resolver_interface.h \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/minidump.h /usr/include/c++/4.0.0/map \ + /usr/include/c++/4.0.0/bits/stl_tree.h \ + /usr/include/c++/4.0.0/bits/stl_map.h \ + /usr/include/c++/4.0.0/bits/stl_multimap.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_cpu_sparc.h \ + src/google_breakpad/common/minidump_cpu_x86.h \ + src/google_breakpad/common/minidump_cpu_ppc.h \ + src/google_breakpad/common/minidump_cpu_ppc64.h \ + src/google_breakpad/common/minidump_cpu_amd64.h \ + src/google_breakpad/common/minidump_exception_win32.h \ + src/google_breakpad/common/minidump_exception_mac.h \ + src/google_breakpad/common/minidump_exception_linux.h \ + src/google_breakpad/common/minidump_exception_solaris.h \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/processor/minidump_processor.h \ + src/google_breakpad/processor/process_state.h \ + src/google_breakpad/processor/system_info.h \ + src/google_breakpad/processor/stack_frame_cpu.h \ + src/google_breakpad/processor/stack_frame.h src/processor/logging.h \ + /usr/include/c++/4.0.0/iostream src/processor/pathname_stripper.h \ + src/processor/scoped_ptr.h src/processor/simple_symbol_supplier.h \ + src/google_breakpad/processor/symbol_supplier.h + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/stdio.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/string.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/processor/basic_source_line_resolver.h: + +/usr/include/c++/4.0.0/ext/hash_map: + +/usr/include/c++/4.0.0/ext/hashtable.h: + +/usr/include/c++/4.0.0/iterator: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: + +/usr/include/c++/4.0.0/bits/stream_iterator.h: + +/usr/include/c++/4.0.0/ext/hash_fun.h: + +src/google_breakpad/processor/source_line_resolver_interface.h: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: + +src/google_breakpad/processor/call_stack.h: + +src/google_breakpad/processor/code_module.h: + +src/google_breakpad/processor/code_modules.h: + +src/google_breakpad/processor/minidump.h: + +/usr/include/c++/4.0.0/map: + +/usr/include/c++/4.0.0/bits/stl_tree.h: + +/usr/include/c++/4.0.0/bits/stl_map.h: + +/usr/include/c++/4.0.0/bits/stl_multimap.h: + +src/google_breakpad/common/minidump_format.h: + +src/google_breakpad/common/minidump_cpu_sparc.h: + +src/google_breakpad/common/minidump_cpu_x86.h: + +src/google_breakpad/common/minidump_cpu_ppc.h: + +src/google_breakpad/common/minidump_cpu_ppc64.h: + +src/google_breakpad/common/minidump_cpu_amd64.h: + +src/google_breakpad/common/minidump_exception_win32.h: + +src/google_breakpad/common/minidump_exception_mac.h: + +src/google_breakpad/common/minidump_exception_linux.h: + +src/google_breakpad/common/minidump_exception_solaris.h: + +src/google_breakpad/processor/memory_region.h: + +src/google_breakpad/processor/minidump_processor.h: + +src/google_breakpad/processor/process_state.h: + +src/google_breakpad/processor/system_info.h: + +src/google_breakpad/processor/stack_frame_cpu.h: + +src/google_breakpad/processor/stack_frame.h: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +src/processor/pathname_stripper.h: + +src/processor/scoped_ptr.h: + +src/processor/simple_symbol_supplier.h: + +src/google_breakpad/processor/symbol_supplier.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/pathname_stripper.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/pathname_stripper.Plo new file mode 100644 index 00000000..cd28c7ae --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/pathname_stripper.Plo @@ -0,0 +1,280 @@ +src/processor/pathname_stripper.lo src/processor/pathname_stripper.o: \ + src/processor/pathname_stripper.cc src/processor/pathname_stripper.h \ + /usr/include/c++/4.0.0/string \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/string.h /usr/include/_types.h /usr/include/sys/_types.h \ + /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/i386/_structs.h /usr/include/sys/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc + +src/processor/pathname_stripper.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/string.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/pathname_stripper_unittest.Po b/thirdparty/google-breakpad/r318/src/processor/.deps/pathname_stripper_unittest.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/pathname_stripper_unittest.Po @@ -0,0 +1 @@ +# dummy diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/postfix_evaluator_unittest.Po b/thirdparty/google-breakpad/r318/src/processor/.deps/postfix_evaluator_unittest.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/postfix_evaluator_unittest.Po @@ -0,0 +1 @@ +# dummy diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/process_state.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/process_state.Plo new file mode 100644 index 00000000..20be5192 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/process_state.Plo @@ -0,0 +1,308 @@ +src/processor/process_state.lo src/processor/process_state.o: \ + src/processor/process_state.cc \ + src/google_breakpad/processor/process_state.h \ + /usr/include/c++/4.0.0/string \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/string.h /usr/include/_types.h /usr/include/sys/_types.h \ + /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/i386/_structs.h /usr/include/sys/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/processor/system_info.h \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/code_modules.h + +src/google_breakpad/processor/process_state.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/string.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/processor/system_info.h: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: + +src/google_breakpad/processor/call_stack.h: + +src/google_breakpad/processor/code_modules.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/range_map_unittest.Po b/thirdparty/google-breakpad/r318/src/processor/.deps/range_map_unittest.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/range_map_unittest.Po @@ -0,0 +1 @@ +# dummy diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/simple_symbol_supplier.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/simple_symbol_supplier.Plo new file mode 100644 index 00000000..5cfe3a15 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/simple_symbol_supplier.Plo @@ -0,0 +1,395 @@ +src/processor/simple_symbol_supplier.lo \ + src/processor/simple_symbol_supplier.o: \ + src/processor/simple_symbol_supplier.cc /usr/include/sys/types.h \ + /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/i386/_types.h /usr/include/sys/_types.h \ + /usr/include/machine/_types.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/sys/_structs.h \ + /usr/include/sys/stat.h /usr/include/c++/4.0.0/algorithm \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/string.h /usr/include/_types.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/i386/signal.h /usr/include/i386/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/alloca.h \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/new /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits /usr/include/c++/4.0.0/iostream \ + /usr/include/c++/4.0.0/ostream /usr/include/c++/4.0.0/ios \ + /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/string \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc /usr/include/c++/4.0.0/fstream \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/basic_file.h \ + /usr/include/c++/4.0.0/bits/fstream.tcc \ + src/processor/simple_symbol_supplier.h /usr/include/c++/4.0.0/vector \ + /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/processor/symbol_supplier.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/common/breakpad_types.h /usr/include/inttypes.h \ + src/google_breakpad/processor/system_info.h src/processor/logging.h \ + src/processor/pathname_stripper.h + +/usr/include/sys/types.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/i386/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/machine/_types.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/sys/_structs.h: + +/usr/include/sys/stat.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/string.h: + +/usr/include/_types.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/alloca.h: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: + +/usr/include/c++/4.0.0/fstream: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/basic_file.h: + +/usr/include/c++/4.0.0/bits/fstream.tcc: + +src/processor/simple_symbol_supplier.h: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/processor/symbol_supplier.h: + +src/google_breakpad/processor/code_module.h: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/inttypes.h: + +src/google_breakpad/processor/system_info.h: + +src/processor/logging.h: + +src/processor/pathname_stripper.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker.Plo new file mode 100644 index 00000000..7be34939 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker.Plo @@ -0,0 +1,454 @@ +src/processor/stackwalker.lo src/processor/stackwalker.o: \ + src/processor/stackwalker.cc /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/sys/cdefs.h /usr/include/stdlib.h \ + /usr/include/available.h /usr/include/_types.h \ + /usr/include/sys/_types.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/i386/_structs.h /usr/include/sys/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + src/google_breakpad/processor/stackwalker.h \ + /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/string.h /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h \ + /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/code_module.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/minidump.h /usr/include/c++/4.0.0/map \ + /usr/include/c++/4.0.0/bits/stl_tree.h \ + /usr/include/c++/4.0.0/bits/stl_map.h \ + /usr/include/c++/4.0.0/bits/stl_multimap.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_cpu_sparc.h \ + src/google_breakpad/common/minidump_cpu_x86.h \ + src/google_breakpad/common/minidump_cpu_ppc.h \ + src/google_breakpad/common/minidump_cpu_ppc64.h \ + src/google_breakpad/common/minidump_cpu_amd64.h \ + src/google_breakpad/common/minidump_exception_win32.h \ + src/google_breakpad/common/minidump_exception_mac.h \ + src/google_breakpad/common/minidump_exception_linux.h \ + src/google_breakpad/common/minidump_exception_solaris.h \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/processor/source_line_resolver_interface.h \ + src/google_breakpad/processor/stack_frame.h \ + src/google_breakpad/processor/symbol_supplier.h \ + src/processor/linked_ptr.h src/processor/logging.h \ + /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ + /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc src/processor/scoped_ptr.h \ + src/processor/stack_frame_info.h src/processor/stackwalker_ppc.h \ + src/processor/stackwalker_sparc.h src/processor/stackwalker_x86.h \ + src/processor/stackwalker_amd64.h + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/sys/cdefs.h: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +src/google_breakpad/processor/stackwalker.h: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/string.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/processor/call_stack.h: + +src/google_breakpad/processor/code_module.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: + +src/google_breakpad/processor/code_modules.h: + +src/google_breakpad/processor/minidump.h: + +/usr/include/c++/4.0.0/map: + +/usr/include/c++/4.0.0/bits/stl_tree.h: + +/usr/include/c++/4.0.0/bits/stl_map.h: + +/usr/include/c++/4.0.0/bits/stl_multimap.h: + +src/google_breakpad/common/minidump_format.h: + +src/google_breakpad/common/minidump_cpu_sparc.h: + +src/google_breakpad/common/minidump_cpu_x86.h: + +src/google_breakpad/common/minidump_cpu_ppc.h: + +src/google_breakpad/common/minidump_cpu_ppc64.h: + +src/google_breakpad/common/minidump_cpu_amd64.h: + +src/google_breakpad/common/minidump_exception_win32.h: + +src/google_breakpad/common/minidump_exception_mac.h: + +src/google_breakpad/common/minidump_exception_linux.h: + +src/google_breakpad/common/minidump_exception_solaris.h: + +src/google_breakpad/processor/memory_region.h: + +src/google_breakpad/processor/source_line_resolver_interface.h: + +src/google_breakpad/processor/stack_frame.h: + +src/google_breakpad/processor/symbol_supplier.h: + +src/processor/linked_ptr.h: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: + +src/processor/scoped_ptr.h: + +src/processor/stack_frame_info.h: + +src/processor/stackwalker_ppc.h: + +src/processor/stackwalker_sparc.h: + +src/processor/stackwalker_x86.h: + +src/processor/stackwalker_amd64.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_amd64.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_amd64.Plo new file mode 100644 index 00000000..a275c2c7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_amd64.Plo @@ -0,0 +1,414 @@ +src/processor/stackwalker_amd64.lo src/processor/stackwalker_amd64.o: \ + src/processor/stackwalker_amd64.cc src/processor/stackwalker_amd64.h \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/i386/_types.h /usr/include/sys/_types.h \ + /usr/include/machine/_types.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/sys/_structs.h \ + /usr/include/inttypes.h /usr/include/_types.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + src/google_breakpad/common/minidump_format.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + src/google_breakpad/common/minidump_cpu_sparc.h \ + src/google_breakpad/common/minidump_cpu_x86.h \ + src/google_breakpad/common/minidump_cpu_ppc.h \ + src/google_breakpad/common/minidump_cpu_ppc64.h \ + src/google_breakpad/common/minidump_cpu_amd64.h \ + src/google_breakpad/common/minidump_exception_win32.h \ + src/google_breakpad/common/minidump_exception_mac.h \ + src/google_breakpad/common/minidump_exception_linux.h \ + src/google_breakpad/common/minidump_exception_solaris.h \ + src/google_breakpad/processor/stackwalker.h \ + /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/include/string.h /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/i386/signal.h /usr/include/i386/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/alloca.h \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/processor/stack_frame_cpu.h \ + src/google_breakpad/processor/stack_frame.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc src/processor/logging.h \ + /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ + /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc + +src/processor/stackwalker_amd64.h: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/i386/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/machine/_types.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/sys/_structs.h: + +/usr/include/inttypes.h: + +/usr/include/_types.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +src/google_breakpad/common/minidump_format.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +src/google_breakpad/common/minidump_cpu_sparc.h: + +src/google_breakpad/common/minidump_cpu_x86.h: + +src/google_breakpad/common/minidump_cpu_ppc.h: + +src/google_breakpad/common/minidump_cpu_ppc64.h: + +src/google_breakpad/common/minidump_cpu_amd64.h: + +src/google_breakpad/common/minidump_exception_win32.h: + +src/google_breakpad/common/minidump_exception_mac.h: + +src/google_breakpad/common/minidump_exception_linux.h: + +src/google_breakpad/common/minidump_exception_solaris.h: + +src/google_breakpad/processor/stackwalker.h: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/include/string.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/alloca.h: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/processor/call_stack.h: + +src/google_breakpad/processor/memory_region.h: + +src/google_breakpad/processor/stack_frame_cpu.h: + +src/google_breakpad/processor/stack_frame.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_ppc.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_ppc.Plo new file mode 100644 index 00000000..c18f5722 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_ppc.Plo @@ -0,0 +1,414 @@ +src/processor/stackwalker_ppc.lo src/processor/stackwalker_ppc.o: \ + src/processor/stackwalker_ppc.cc src/processor/stackwalker_ppc.h \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/i386/_types.h /usr/include/sys/_types.h \ + /usr/include/machine/_types.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/sys/_structs.h \ + /usr/include/inttypes.h /usr/include/_types.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + src/google_breakpad/common/minidump_format.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + src/google_breakpad/common/minidump_cpu_sparc.h \ + src/google_breakpad/common/minidump_cpu_x86.h \ + src/google_breakpad/common/minidump_cpu_ppc.h \ + src/google_breakpad/common/minidump_cpu_ppc64.h \ + src/google_breakpad/common/minidump_cpu_amd64.h \ + src/google_breakpad/common/minidump_exception_win32.h \ + src/google_breakpad/common/minidump_exception_mac.h \ + src/google_breakpad/common/minidump_exception_linux.h \ + src/google_breakpad/common/minidump_exception_solaris.h \ + src/google_breakpad/processor/stackwalker.h \ + /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/include/string.h /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/i386/signal.h /usr/include/i386/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/alloca.h \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/processor/stack_frame_cpu.h \ + src/google_breakpad/processor/stack_frame.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc src/processor/logging.h \ + /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ + /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc + +src/processor/stackwalker_ppc.h: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/i386/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/machine/_types.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/sys/_structs.h: + +/usr/include/inttypes.h: + +/usr/include/_types.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +src/google_breakpad/common/minidump_format.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +src/google_breakpad/common/minidump_cpu_sparc.h: + +src/google_breakpad/common/minidump_cpu_x86.h: + +src/google_breakpad/common/minidump_cpu_ppc.h: + +src/google_breakpad/common/minidump_cpu_ppc64.h: + +src/google_breakpad/common/minidump_cpu_amd64.h: + +src/google_breakpad/common/minidump_exception_win32.h: + +src/google_breakpad/common/minidump_exception_mac.h: + +src/google_breakpad/common/minidump_exception_linux.h: + +src/google_breakpad/common/minidump_exception_solaris.h: + +src/google_breakpad/processor/stackwalker.h: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/include/string.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/alloca.h: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/processor/call_stack.h: + +src/google_breakpad/processor/memory_region.h: + +src/google_breakpad/processor/stack_frame_cpu.h: + +src/google_breakpad/processor/stack_frame.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_selftest.Po b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_selftest.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_selftest.Po @@ -0,0 +1 @@ +# dummy diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_sparc.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_sparc.Plo new file mode 100644 index 00000000..e2afb958 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_sparc.Plo @@ -0,0 +1,415 @@ +src/processor/stackwalker_sparc.lo src/processor/stackwalker_sparc.o: \ + src/processor/stackwalker_sparc.cc \ + src/google_breakpad/processor/call_stack.h \ + /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/cstring /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/string.h /usr/include/_types.h /usr/include/sys/_types.h \ + /usr/include/sys/cdefs.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/sys/appleapiopts.h \ + /usr/include/machine/signal.h /usr/include/i386/signal.h \ + /usr/include/i386/_structs.h /usr/include/sys/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/unistd.h \ + /usr/include/sys/unistd.h /usr/include/sys/select.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h src/google_breakpad/processor/stack_frame_cpu.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_cpu_sparc.h \ + src/google_breakpad/common/minidump_cpu_x86.h \ + src/google_breakpad/common/minidump_cpu_ppc.h \ + src/google_breakpad/common/minidump_cpu_ppc64.h \ + src/google_breakpad/common/minidump_cpu_amd64.h \ + src/google_breakpad/common/minidump_exception_win32.h \ + src/google_breakpad/common/minidump_exception_mac.h \ + src/google_breakpad/common/minidump_exception_linux.h \ + src/google_breakpad/common/minidump_exception_solaris.h \ + src/google_breakpad/processor/stack_frame.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc src/processor/logging.h \ + /usr/include/c++/4.0.0/iostream /usr/include/c++/4.0.0/ostream \ + /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/ostream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/bits/istream.tcc \ + src/processor/stackwalker_sparc.h \ + src/google_breakpad/processor/stackwalker.h + +src/google_breakpad/processor/call_stack.h: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/string.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/sys/cdefs.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/processor/memory_region.h: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: + +src/google_breakpad/processor/stack_frame_cpu.h: + +src/google_breakpad/common/minidump_format.h: + +src/google_breakpad/common/minidump_cpu_sparc.h: + +src/google_breakpad/common/minidump_cpu_x86.h: + +src/google_breakpad/common/minidump_cpu_ppc.h: + +src/google_breakpad/common/minidump_cpu_ppc64.h: + +src/google_breakpad/common/minidump_cpu_amd64.h: + +src/google_breakpad/common/minidump_exception_win32.h: + +src/google_breakpad/common/minidump_exception_mac.h: + +src/google_breakpad/common/minidump_exception_linux.h: + +src/google_breakpad/common/minidump_exception_solaris.h: + +src/google_breakpad/processor/stack_frame.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/bits/istream.tcc: + +src/processor/stackwalker_sparc.h: + +src/google_breakpad/processor/stackwalker.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_x86.Plo b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_x86.Plo new file mode 100644 index 00000000..64d30066 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/.deps/stackwalker_x86.Plo @@ -0,0 +1,446 @@ +src/processor/stackwalker_x86.lo src/processor/stackwalker_x86.o: \ + src/processor/stackwalker_x86.cc src/processor/postfix_evaluator-inl.h \ + /usr/include/c++/4.0.0/sstream /usr/include/c++/4.0.0/istream \ + /usr/include/c++/4.0.0/ios /usr/include/c++/4.0.0/iosfwd \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h \ + /usr/include/c++/4.0.0/clocale /usr/include/locale.h \ + /usr/include/_locale.h /usr/include/sys/cdefs.h /usr/include/_types.h \ + /usr/include/sys/_types.h /usr/include/machine/_types.h \ + /usr/include/i386/_types.h /usr/include/c++/4.0.0/cstring \ + /usr/include/c++/4.0.0/cstddef \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h \ + /usr/include/string.h /usr/include/c++/4.0.0/cstdio \ + /usr/include/stdio.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/pthread_impl.h /usr/include/sched.h \ + /usr/include/time.h /usr/include/_structs.h /usr/include/sys/_structs.h \ + /usr/include/unistd.h /usr/include/sys/unistd.h \ + /usr/include/sys/select.h /usr/include/sys/appleapiopts.h \ + /usr/include/sys/_select.h /usr/include/c++/4.0.0/cctype \ + /usr/include/ctype.h /usr/include/runetype.h \ + /usr/include/c++/4.0.0/bits/stringfwd.h \ + /usr/include/c++/4.0.0/bits/postypes.h /usr/include/c++/4.0.0/cwchar \ + /usr/include/c++/4.0.0/ctime /usr/include/wchar.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h \ + /usr/include/_wctype.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h \ + /usr/include/c++/4.0.0/bits/functexcept.h \ + /usr/include/c++/4.0.0/exception_defines.h \ + /usr/include/c++/4.0.0/exception \ + /usr/include/c++/4.0.0/bits/char_traits.h \ + /usr/include/c++/4.0.0/bits/stl_algobase.h \ + /usr/include/c++/4.0.0/climits \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h \ + /usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/machine/limits.h \ + /usr/include/i386/limits.h /usr/include/i386/_limits.h \ + /usr/include/sys/syslimits.h /usr/include/c++/4.0.0/cstdlib \ + /usr/include/stdlib.h /usr/include/available.h /usr/include/sys/wait.h \ + /usr/include/sys/signal.h /usr/include/machine/signal.h \ + /usr/include/i386/signal.h /usr/include/i386/_structs.h \ + /usr/include/machine/_structs.h /usr/include/mach/i386/_structs.h \ + /usr/include/sys/resource.h /usr/include/machine/endian.h \ + /usr/include/i386/endian.h /usr/include/sys/_endian.h \ + /usr/include/libkern/_OSByteOrder.h \ + /usr/include/libkern/i386/_OSByteOrder.h /usr/include/alloca.h \ + /usr/include/machine/types.h /usr/include/i386/types.h \ + /usr/include/c++/4.0.0/bits/stl_pair.h \ + /usr/include/c++/4.0.0/bits/cpp_type_traits.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h \ + /usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/4.0.0/bits/concept_check.h \ + /usr/include/c++/4.0.0/bits/stl_iterator.h \ + /usr/include/c++/4.0.0/debug/debug.h /usr/include/c++/4.0.0/cassert \ + /usr/include/assert.h /usr/include/c++/4.0.0/bits/localefwd.h \ + /usr/include/c++/4.0.0/bits/ios_base.h \ + /usr/include/c++/4.0.0/bits/atomicity.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h \ + /usr/include/c++/4.0.0/bits/locale_classes.h \ + /usr/include/c++/4.0.0/string /usr/include/c++/4.0.0/memory \ + /usr/include/c++/4.0.0/bits/allocator.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h \ + /usr/include/c++/4.0.0/ext/new_allocator.h /usr/include/c++/4.0.0/new \ + /usr/include/c++/4.0.0/bits/stl_construct.h \ + /usr/include/c++/4.0.0/bits/stl_uninitialized.h \ + /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h \ + /usr/include/c++/4.0.0/limits \ + /usr/include/c++/4.0.0/bits/stl_function.h \ + /usr/include/c++/4.0.0/bits/basic_string.h \ + /usr/include/c++/4.0.0/algorithm /usr/include/c++/4.0.0/bits/stl_algo.h \ + /usr/include/c++/4.0.0/bits/stl_heap.h \ + /usr/include/c++/4.0.0/bits/stl_tempbuf.h \ + /usr/include/c++/4.0.0/bits/basic_string.tcc \ + /usr/include/c++/4.0.0/streambuf \ + /usr/include/c++/4.0.0/bits/streambuf.tcc \ + /usr/include/c++/4.0.0/bits/basic_ios.h \ + /usr/include/c++/4.0.0/bits/streambuf_iterator.h \ + /usr/include/c++/4.0.0/bits/locale_facets.h \ + /usr/include/c++/4.0.0/cwctype /usr/include/wctype.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h \ + /usr/include/c++/4.0.0/bits/codecvt.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h \ + /usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h \ + /usr/include/c++/4.0.0/bits/basic_ios.tcc \ + /usr/include/c++/4.0.0/bits/istream.tcc /usr/include/c++/4.0.0/locale \ + /usr/include/c++/4.0.0/bits/locale_facets.tcc \ + /usr/include/c++/4.0.0/typeinfo /usr/include/c++/4.0.0/ostream \ + /usr/include/c++/4.0.0/bits/ostream.tcc \ + /usr/include/c++/4.0.0/bits/sstream.tcc \ + src/processor/postfix_evaluator.h /usr/include/c++/4.0.0/map \ + /usr/include/c++/4.0.0/bits/stl_tree.h \ + /usr/include/c++/4.0.0/bits/stl_map.h \ + /usr/include/c++/4.0.0/bits/stl_multimap.h \ + /usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/stl_vector.h \ + /usr/include/c++/4.0.0/bits/stl_bvector.h \ + /usr/include/c++/4.0.0/bits/vector.tcc \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/common/breakpad_types.h /usr/include/sys/types.h \ + /usr/include/inttypes.h src/processor/logging.h \ + /usr/include/c++/4.0.0/iostream src/processor/stackwalker_x86.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_cpu_sparc.h \ + src/google_breakpad/common/minidump_cpu_x86.h \ + src/google_breakpad/common/minidump_cpu_ppc.h \ + src/google_breakpad/common/minidump_cpu_ppc64.h \ + src/google_breakpad/common/minidump_cpu_amd64.h \ + src/google_breakpad/common/minidump_exception_win32.h \ + src/google_breakpad/common/minidump_exception_mac.h \ + src/google_breakpad/common/minidump_exception_linux.h \ + src/google_breakpad/common/minidump_exception_solaris.h \ + src/google_breakpad/processor/stackwalker.h \ + src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/stack_frame_cpu.h \ + src/google_breakpad/processor/stack_frame.h src/processor/linked_ptr.h \ + src/processor/stack_frame_info.h + +src/processor/postfix_evaluator-inl.h: + +/usr/include/c++/4.0.0/sstream: + +/usr/include/c++/4.0.0/istream: + +/usr/include/c++/4.0.0/ios: + +/usr/include/c++/4.0.0/iosfwd: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++config.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/os_defines.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++locale.h: + +/usr/include/c++/4.0.0/clocale: + +/usr/include/locale.h: + +/usr/include/_locale.h: + +/usr/include/sys/cdefs.h: + +/usr/include/_types.h: + +/usr/include/sys/_types.h: + +/usr/include/machine/_types.h: + +/usr/include/i386/_types.h: + +/usr/include/c++/4.0.0/cstring: + +/usr/include/c++/4.0.0/cstddef: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stddef.h: + +/usr/include/string.h: + +/usr/include/c++/4.0.0/cstdio: + +/usr/include/stdio.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++io.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/gthr-default.h: + +/usr/include/pthread.h: + +/usr/include/pthread_impl.h: + +/usr/include/sched.h: + +/usr/include/time.h: + +/usr/include/_structs.h: + +/usr/include/sys/_structs.h: + +/usr/include/unistd.h: + +/usr/include/sys/unistd.h: + +/usr/include/sys/select.h: + +/usr/include/sys/appleapiopts.h: + +/usr/include/sys/_select.h: + +/usr/include/c++/4.0.0/cctype: + +/usr/include/ctype.h: + +/usr/include/runetype.h: + +/usr/include/c++/4.0.0/bits/stringfwd.h: + +/usr/include/c++/4.0.0/bits/postypes.h: + +/usr/include/c++/4.0.0/cwchar: + +/usr/include/c++/4.0.0/ctime: + +/usr/include/wchar.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdarg.h: + +/usr/include/_wctype.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/stdint.h: + +/usr/include/c++/4.0.0/bits/functexcept.h: + +/usr/include/c++/4.0.0/exception_defines.h: + +/usr/include/c++/4.0.0/exception: + +/usr/include/c++/4.0.0/bits/char_traits.h: + +/usr/include/c++/4.0.0/bits/stl_algobase.h: + +/usr/include/c++/4.0.0/climits: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/limits.h: + +/usr/lib/gcc/i686-apple-darwin9/4.0.1/include/syslimits.h: + +/usr/include/limits.h: + +/usr/include/machine/limits.h: + +/usr/include/i386/limits.h: + +/usr/include/i386/_limits.h: + +/usr/include/sys/syslimits.h: + +/usr/include/c++/4.0.0/cstdlib: + +/usr/include/stdlib.h: + +/usr/include/available.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/signal.h: + +/usr/include/machine/signal.h: + +/usr/include/i386/signal.h: + +/usr/include/i386/_structs.h: + +/usr/include/machine/_structs.h: + +/usr/include/mach/i386/_structs.h: + +/usr/include/sys/resource.h: + +/usr/include/machine/endian.h: + +/usr/include/i386/endian.h: + +/usr/include/sys/_endian.h: + +/usr/include/libkern/_OSByteOrder.h: + +/usr/include/libkern/i386/_OSByteOrder.h: + +/usr/include/alloca.h: + +/usr/include/machine/types.h: + +/usr/include/i386/types.h: + +/usr/include/c++/4.0.0/bits/stl_pair.h: + +/usr/include/c++/4.0.0/bits/cpp_type_traits.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: + +/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/4.0.0/bits/concept_check.h: + +/usr/include/c++/4.0.0/bits/stl_iterator.h: + +/usr/include/c++/4.0.0/debug/debug.h: + +/usr/include/c++/4.0.0/cassert: + +/usr/include/assert.h: + +/usr/include/c++/4.0.0/bits/localefwd.h: + +/usr/include/c++/4.0.0/bits/ios_base.h: + +/usr/include/c++/4.0.0/bits/atomicity.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/atomic_word.h: + +/usr/include/c++/4.0.0/bits/locale_classes.h: + +/usr/include/c++/4.0.0/string: + +/usr/include/c++/4.0.0/memory: + +/usr/include/c++/4.0.0/bits/allocator.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/c++allocator.h: + +/usr/include/c++/4.0.0/ext/new_allocator.h: + +/usr/include/c++/4.0.0/new: + +/usr/include/c++/4.0.0/bits/stl_construct.h: + +/usr/include/c++/4.0.0/bits/stl_uninitialized.h: + +/usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h: + +/usr/include/c++/4.0.0/limits: + +/usr/include/c++/4.0.0/bits/stl_function.h: + +/usr/include/c++/4.0.0/bits/basic_string.h: + +/usr/include/c++/4.0.0/algorithm: + +/usr/include/c++/4.0.0/bits/stl_algo.h: + +/usr/include/c++/4.0.0/bits/stl_heap.h: + +/usr/include/c++/4.0.0/bits/stl_tempbuf.h: + +/usr/include/c++/4.0.0/bits/basic_string.tcc: + +/usr/include/c++/4.0.0/streambuf: + +/usr/include/c++/4.0.0/bits/streambuf.tcc: + +/usr/include/c++/4.0.0/bits/basic_ios.h: + +/usr/include/c++/4.0.0/bits/streambuf_iterator.h: + +/usr/include/c++/4.0.0/bits/locale_facets.h: + +/usr/include/c++/4.0.0/cwctype: + +/usr/include/wctype.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_base.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/ctype_inline.h: + +/usr/include/c++/4.0.0/bits/codecvt.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/time_members.h: + +/usr/include/c++/4.0.0/i686-apple-darwin9/bits/messages_members.h: + +/usr/include/c++/4.0.0/bits/basic_ios.tcc: + +/usr/include/c++/4.0.0/bits/istream.tcc: + +/usr/include/c++/4.0.0/locale: + +/usr/include/c++/4.0.0/bits/locale_facets.tcc: + +/usr/include/c++/4.0.0/typeinfo: + +/usr/include/c++/4.0.0/ostream: + +/usr/include/c++/4.0.0/bits/ostream.tcc: + +/usr/include/c++/4.0.0/bits/sstream.tcc: + +src/processor/postfix_evaluator.h: + +/usr/include/c++/4.0.0/map: + +/usr/include/c++/4.0.0/bits/stl_tree.h: + +/usr/include/c++/4.0.0/bits/stl_map.h: + +/usr/include/c++/4.0.0/bits/stl_multimap.h: + +/usr/include/c++/4.0.0/vector: + +/usr/include/c++/4.0.0/bits/stl_vector.h: + +/usr/include/c++/4.0.0/bits/stl_bvector.h: + +/usr/include/c++/4.0.0/bits/vector.tcc: + +src/google_breakpad/processor/memory_region.h: + +src/google_breakpad/common/breakpad_types.h: + +/usr/include/sys/types.h: + +/usr/include/inttypes.h: + +src/processor/logging.h: + +/usr/include/c++/4.0.0/iostream: + +src/processor/stackwalker_x86.h: + +src/google_breakpad/common/minidump_format.h: + +src/google_breakpad/common/minidump_cpu_sparc.h: + +src/google_breakpad/common/minidump_cpu_x86.h: + +src/google_breakpad/common/minidump_cpu_ppc.h: + +src/google_breakpad/common/minidump_cpu_ppc64.h: + +src/google_breakpad/common/minidump_cpu_amd64.h: + +src/google_breakpad/common/minidump_exception_win32.h: + +src/google_breakpad/common/minidump_exception_mac.h: + +src/google_breakpad/common/minidump_exception_linux.h: + +src/google_breakpad/common/minidump_exception_solaris.h: + +src/google_breakpad/processor/stackwalker.h: + +src/google_breakpad/processor/call_stack.h: + +src/google_breakpad/processor/code_modules.h: + +src/google_breakpad/processor/stack_frame_cpu.h: + +src/google_breakpad/processor/stack_frame.h: + +src/processor/linked_ptr.h: + +src/processor/stack_frame_info.h: diff --git a/thirdparty/google-breakpad/r318/src/processor/.dirstamp b/thirdparty/google-breakpad/r318/src/processor/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/thirdparty/google-breakpad/r318/src/processor/address_map-inl.h b/thirdparty/google-breakpad/r318/src/processor/address_map-inl.h new file mode 100644 index 00000000..d88b4fcc --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/address_map-inl.h @@ -0,0 +1,92 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// address_map-inl.h: Address map implementation. +// +// See address_map.h for documentation. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_ADDRESS_MAP_INL_H__ +#define PROCESSOR_ADDRESS_MAP_INL_H__ + +#include + +#include "processor/address_map.h" +#include "processor/logging.h" + +namespace google_breakpad { + +template +bool AddressMap::Store(const AddressType &address, + const EntryType &entry) { + // Ensure that the specified address doesn't conflict with something already + // in the map. + if (map_.find(address) != map_.end()) { + BPLOG(INFO) << "Store failed, address " << HexString(address) << + " is already present"; + return false; + } + + map_.insert(MapValue(address, entry)); + return true; +} + +template +bool AddressMap::Retrieve( + const AddressType &address, + EntryType *entry, AddressType *entry_address) const { + BPLOG_IF(ERROR, !entry) << "AddressMap::Retrieve requires |entry|"; + assert(entry); + + // upper_bound gives the first element whose key is greater than address, + // but we want the first element whose key is less than or equal to address. + // Decrement the iterator to get there, but not if the upper_bound already + // points to the beginning of the map - in that case, address is lower than + // the lowest stored key, so return false. + MapConstIterator iterator = map_.upper_bound(address); + if (iterator == map_.begin()) + return false; + --iterator; + + *entry = iterator->second; + if (entry_address) + *entry_address = iterator->first; + + return true; +} + +template +void AddressMap::Clear() { + map_.clear(); +} + +} // namespace google_breakpad + +#endif // PROCESSOR_ADDRESS_MAP_INL_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/address_map.h b/thirdparty/google-breakpad/r318/src/processor/address_map.h new file mode 100644 index 00000000..14139e7a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/address_map.h @@ -0,0 +1,80 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// address_map.h: Address maps. +// +// An address map contains a set of objects keyed by address. Objects are +// retrieved from the map by returning the object with the highest key less +// than or equal to the lookup key. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_ADDRESS_MAP_H__ +#define PROCESSOR_ADDRESS_MAP_H__ + +#include + +namespace google_breakpad { + +template +class AddressMap { + public: + AddressMap() : map_() {} + + // Inserts an entry into the map. Returns false without storing the entry + // if an entry is already stored in the map at the same address as specified + // by the address argument. + bool Store(const AddressType &address, const EntryType &entry); + + // Locates the entry stored at the highest address less than or equal to + // the address argument. If there is no such range, returns false. The + // entry is returned in entry, which is a required argument. If + // entry_address is not NULL, it will be set to the address that the entry + // was stored at. + bool Retrieve(const AddressType &address, + EntryType *entry, AddressType *entry_address) const; + + // Empties the address map, restoring it to the same state as when it was + // initially created. + void Clear(); + + private: + // Convenience types. + typedef std::map AddressToEntryMap; + typedef typename AddressToEntryMap::const_iterator MapConstIterator; + typedef typename AddressToEntryMap::value_type MapValue; + + // Maps the address of each entry to an EntryType. + AddressToEntryMap map_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_ADDRESS_MAP_H__ + diff --git a/thirdparty/google-breakpad/r318/src/processor/address_map_unittest.cc b/thirdparty/google-breakpad/r318/src/processor/address_map_unittest.cc new file mode 100644 index 00000000..f64a8984 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/address_map_unittest.cc @@ -0,0 +1,196 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// address_map_unittest.cc: Unit tests for AddressMap. +// +// Author: Mark Mentovai + +#include +#include + +#include "processor/address_map-inl.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" + +#define ASSERT_TRUE(condition) \ + if (!(condition)) { \ + fprintf(stderr, "FAIL: %s @ %s:%d\n", #condition, __FILE__, __LINE__); \ + return false; \ + } + +#define ASSERT_FALSE(condition) ASSERT_TRUE(!(condition)) + +#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2)) + +namespace { + +using google_breakpad::AddressMap; +using google_breakpad::linked_ptr; + +// A CountedObject holds an int. A global (not thread safe!) count of +// allocated CountedObjects is maintained to help test memory management. +class CountedObject { + public: + explicit CountedObject(int id) : id_(id) { ++count_; } + ~CountedObject() { --count_; } + + static int count() { return count_; } + int id() const { return id_; } + + private: + static int count_; + int id_; +}; + +int CountedObject::count_; + +typedef int AddressType; +typedef AddressMap< AddressType, linked_ptr > TestMap; + +static bool DoAddressMapTest() { + ASSERT_EQ(CountedObject::count(), 0); + + TestMap test_map; + linked_ptr entry; + AddressType address; + + // Check that a new map is truly empty. + ASSERT_FALSE(test_map.Retrieve(0, &entry, &address)); + ASSERT_FALSE(test_map.Retrieve(INT_MIN, &entry, &address)); + ASSERT_FALSE(test_map.Retrieve(INT_MAX, &entry, &address)); + + // Check that Clear clears the map without leaking. + ASSERT_EQ(CountedObject::count(), 0); + ASSERT_TRUE(test_map.Store(1, + linked_ptr(new CountedObject(0)))); + ASSERT_TRUE(test_map.Retrieve(1, &entry, &address)); + ASSERT_EQ(CountedObject::count(), 1); + test_map.Clear(); + ASSERT_EQ(CountedObject::count(), 1); // still holding entry in this scope + + // Check that a cleared map is truly empty. + ASSERT_FALSE(test_map.Retrieve(0, &entry, &address)); + ASSERT_FALSE(test_map.Retrieve(INT_MIN, &entry, &address)); + ASSERT_FALSE(test_map.Retrieve(INT_MAX, &entry, &address)); + + // Check a single-element map. + ASSERT_TRUE(test_map.Store(10, + linked_ptr(new CountedObject(1)))); + ASSERT_FALSE(test_map.Retrieve(9, &entry, &address)); + ASSERT_TRUE(test_map.Retrieve(10, &entry, &address)); + ASSERT_EQ(CountedObject::count(), 1); + ASSERT_EQ(entry->id(), 1); + ASSERT_EQ(address, 10); + ASSERT_TRUE(test_map.Retrieve(11, &entry, &address)); + ASSERT_TRUE(test_map.Retrieve(11, &entry, NULL)); // NULL ok here + + // Add some more elements. + ASSERT_TRUE(test_map.Store(5, + linked_ptr(new CountedObject(2)))); + ASSERT_EQ(CountedObject::count(), 2); + ASSERT_TRUE(test_map.Store(20, + linked_ptr(new CountedObject(3)))); + ASSERT_TRUE(test_map.Store(15, + linked_ptr(new CountedObject(4)))); + ASSERT_FALSE(test_map.Store(10, + linked_ptr(new CountedObject(5)))); // already in map + ASSERT_TRUE(test_map.Store(16, + linked_ptr(new CountedObject(6)))); + ASSERT_TRUE(test_map.Store(14, + linked_ptr(new CountedObject(7)))); + + // Nothing was stored with a key under 5. Don't use ASSERT inside loops + // because it won't show exactly which key/entry/address failed. + for (AddressType key = 0; key < 5; ++key) { + if (test_map.Retrieve(key, &entry, &address)) { + fprintf(stderr, + "FAIL: retrieve %d expected false observed true @ %s:%d\n", + key, __FILE__, __LINE__); + return false; + } + } + + // Check everything that was stored. + const int id_verify[] = { 0, 0, 0, 0, 0, // unused + 2, 2, 2, 2, 2, // 5 - 9 + 1, 1, 1, 1, 7, // 10 - 14 + 4, 6, 6, 6, 6, // 15 - 19 + 3, 3, 3, 3, 3, // 20 - 24 + 3, 3, 3, 3, 3 }; // 25 - 29 + const AddressType address_verify[] = { 0, 0, 0, 0, 0, // unused + 5, 5, 5, 5, 5, // 5 - 9 + 10, 10, 10, 10, 14, // 10 - 14 + 15, 16, 16, 16, 16, // 15 - 19 + 20, 20, 20, 20, 20, // 20 - 24 + 20, 20, 20, 20, 20 }; // 25 - 29 + + for (AddressType key = 5; key < 30; ++key) { + if (!test_map.Retrieve(key, &entry, &address)) { + fprintf(stderr, + "FAIL: retrieve %d expected true observed false @ %s:%d\n", + key, __FILE__, __LINE__); + return false; + } + if (entry->id() != id_verify[key]) { + fprintf(stderr, + "FAIL: retrieve %d expected entry %d observed %d @ %s:%d\n", + key, id_verify[key], entry->id(), __FILE__, __LINE__); + return false; + } + if (address != address_verify[key]) { + fprintf(stderr, + "FAIL: retrieve %d expected address %d observed %d @ %s:%d\n", + key, address_verify[key], address, __FILE__, __LINE__); + return false; + } + } + + // The stored objects should still be in the map. + ASSERT_EQ(CountedObject::count(), 6); + + return true; +} + +static bool RunTests() { + if (!DoAddressMapTest()) + return false; + + // Leak check. + ASSERT_EQ(CountedObject::count(), 0); + + return true; +} + +} // namespace + +int main(int argc, char **argv) { + BPLOG_INIT(&argc, &argv); + + return RunTests() ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/processor/basic_code_module.h b/thirdparty/google-breakpad/r318/src/processor/basic_code_module.h new file mode 100644 index 00000000..5c9f75f1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/basic_code_module.h @@ -0,0 +1,95 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// basic_code_module.h: Carries information about code modules that are loaded +// into a process. +// +// This is a basic concrete implementation of CodeModule. It cannot be +// instantiated directly, only based on other objects that implement +// the CodeModule interface. It exists to provide a CodeModule implementation +// a place to store information when the life of the original object (such as +// a MinidumpModule) cannot be guaranteed. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_BASIC_CODE_MODULE_H__ +#define PROCESSOR_BASIC_CODE_MODULE_H__ + +#include + +#include "google_breakpad/processor/code_module.h" + +namespace google_breakpad { + +using std::string; + +class BasicCodeModule : public CodeModule { + public: + // Creates a new BasicCodeModule given any existing CodeModule + // implementation. This is useful to make a copy of the data relevant to + // the CodeModule interface without requiring all of the resources that + // other CodeModule implementations may require. + explicit BasicCodeModule(const CodeModule *that) + : base_address_(that->base_address()), + size_(that->size()), + code_file_(that->code_file()), + code_identifier_(that->code_identifier()), + debug_file_(that->debug_file()), + debug_identifier_(that->debug_identifier()), + version_(that->version()) {} + virtual ~BasicCodeModule() {} + + // See code_module.h for descriptions of these methods and the associated + // members. + virtual u_int64_t base_address() const { return base_address_; } + virtual u_int64_t size() const { return size_; } + virtual string code_file() const { return code_file_; } + virtual string code_identifier() const { return code_identifier_; } + virtual string debug_file() const { return debug_file_; } + virtual string debug_identifier() const { return debug_identifier_; } + virtual string version() const { return version_; } + virtual const CodeModule* Copy() const { return new BasicCodeModule(this); } + + private: + u_int64_t base_address_; + u_int64_t size_; + string code_file_; + string code_identifier_; + string debug_file_; + string debug_identifier_; + string version_; + + // Disallow copy constructor and assignment operator. + BasicCodeModule(const BasicCodeModule &that); + void operator=(const BasicCodeModule &that); +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_BASIC_CODE_MODULE_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/basic_code_modules.cc b/thirdparty/google-breakpad/r318/src/processor/basic_code_modules.cc new file mode 100644 index 00000000..a21491c4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/basic_code_modules.cc @@ -0,0 +1,122 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// basic_code_modules.cc: Contains all of the CodeModule objects that +// were loaded into a single process. +// +// See basic_code_modules.h for documentation. +// +// Author: Mark Mentovai + +#include + +#include "processor/basic_code_modules.h" +#include "google_breakpad/processor/code_module.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" +#include "processor/range_map-inl.h" + +namespace google_breakpad { + +BasicCodeModules::BasicCodeModules(const CodeModules *that) + : main_address_(0), + map_(new RangeMap >()) { + BPLOG_IF(ERROR, !that) << "BasicCodeModules::BasicCodeModules requires " + "|that|"; + assert(that); + + const CodeModule *main_module = that->GetMainModule(); + if (main_module) + main_address_ = main_module->base_address(); + + unsigned int count = that->module_count(); + for (unsigned int module_sequence = 0; + module_sequence < count; + ++module_sequence) { + // Make a copy of the module and insert it into the map. Use + // GetModuleAtIndex because ordering is unimportant when slurping the + // entire list, and GetModuleAtIndex may be faster than + // GetModuleAtSequence. + const CodeModule *module = that->GetModuleAtIndex(module_sequence)->Copy(); + if (!map_->StoreRange(module->base_address(), module->size(), + linked_ptr(module))) { + BPLOG(ERROR) << "Module " << module->code_file() << + " could not be stored"; + } + } +} + +BasicCodeModules::~BasicCodeModules() { + delete map_; +} + +unsigned int BasicCodeModules::module_count() const { + return map_->GetCount(); +} + +const CodeModule* BasicCodeModules::GetModuleForAddress( + u_int64_t address) const { + linked_ptr module; + if (!map_->RetrieveRange(address, &module, NULL, NULL)) { + BPLOG(INFO) << "No module at " << HexString(address); + return NULL; + } + + return module.get(); +} + +const CodeModule* BasicCodeModules::GetMainModule() const { + return GetModuleForAddress(main_address_); +} + +const CodeModule* BasicCodeModules::GetModuleAtSequence( + unsigned int sequence) const { + linked_ptr module; + if (!map_->RetrieveRangeAtIndex(sequence, &module, NULL, NULL)) { + BPLOG(ERROR) << "RetrieveRangeAtIndex failed for sequence " << sequence; + return NULL; + } + + return module.get(); +} + +const CodeModule* BasicCodeModules::GetModuleAtIndex( + unsigned int index) const { + // This class stores everything in a RangeMap, without any more-efficient + // way to walk the list of CodeModule objects. Implement GetModuleAtIndex + // using GetModuleAtSequence, which meets all of the requirements, and + // in addition, guarantees ordering. + return GetModuleAtSequence(index); +} + +const CodeModules* BasicCodeModules::Copy() const { + return new BasicCodeModules(this); +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/basic_code_modules.h b/thirdparty/google-breakpad/r318/src/processor/basic_code_modules.h new file mode 100644 index 00000000..df87fc49 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/basic_code_modules.h @@ -0,0 +1,85 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// basic_code_modules.h: Contains all of the CodeModule objects that +// were loaded into a single process. +// +// This is a basic concrete implementation of CodeModules. It cannot be +// instantiated directly, only based on other objects that implement +// the CodeModules interface. It exists to provide a CodeModules +// implementation a place to store information when the life of the original +// object (such as a MinidumpModuleList) cannot be guaranteed. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_BASIC_CODE_MODULES_H__ +#define PROCESSOR_BASIC_CODE_MODULES_H__ + +#include "google_breakpad/processor/code_modules.h" + +namespace google_breakpad { + +template class linked_ptr; +template class RangeMap; + +class BasicCodeModules : public CodeModules { + public: + // Creates a new BasicCodeModules object given any existing CodeModules + // implementation. This is useful to make a copy of the data relevant to + // the CodeModules and CodeModule interfaces without requiring all of the + // resources that other implementations may require. A copy will be + // made of each contained CodeModule using CodeModule::Copy. + explicit BasicCodeModules(const CodeModules *that); + + virtual ~BasicCodeModules(); + + // See code_modules.h for descriptions of these methods. + virtual unsigned int module_count() const; + virtual const CodeModule* GetModuleForAddress(u_int64_t address) const; + virtual const CodeModule* GetMainModule() const; + virtual const CodeModule* GetModuleAtSequence(unsigned int sequence) const; + virtual const CodeModule* GetModuleAtIndex(unsigned int index) const; + virtual const CodeModules* Copy() const; + + private: + // The base address of the main module. + u_int64_t main_address_; + + // The map used to contain each CodeModule, keyed by each CodeModule's + // address range. + RangeMap > *map_; + + // Disallow copy constructor and assignment operator. + BasicCodeModules(const BasicCodeModules &that); + void operator=(const BasicCodeModules &that); +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_BASIC_CODE_MODULES_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/basic_source_line_resolver.cc b/thirdparty/google-breakpad/r318/src/processor/basic_source_line_resolver.cc new file mode 100644 index 00000000..bba86599 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/basic_source_line_resolver.cc @@ -0,0 +1,714 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "processor/address_map-inl.h" +#include "processor/contained_range_map-inl.h" +#include "processor/range_map-inl.h" + +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/stack_frame.h" +#include "processor/linked_ptr.h" +#include "processor/scoped_ptr.h" +#include "processor/stack_frame_info.h" + +using std::map; +using std::vector; +using std::make_pair; +#ifndef BSLR_NO_HASH_MAP +using __gnu_cxx::hash; +#endif // BSLR_NO_HASH_MAP + +namespace google_breakpad { + +struct BasicSourceLineResolver::Line { + Line(MemAddr addr, MemAddr code_size, int file_id, int source_line) + : address(addr) + , size(code_size) + , source_file_id(file_id) + , line(source_line) { } + + MemAddr address; + MemAddr size; + int source_file_id; + int line; +}; + +struct BasicSourceLineResolver::Function { + Function(const string &function_name, + MemAddr function_address, + MemAddr code_size, + int set_parameter_size) + : name(function_name), address(function_address), size(code_size), + parameter_size(set_parameter_size) { } + + string name; + MemAddr address; + MemAddr size; + + // The size of parameters passed to this function on the stack. + int parameter_size; + + RangeMap< MemAddr, linked_ptr > lines; +}; + +struct BasicSourceLineResolver::PublicSymbol { + PublicSymbol(const string& set_name, + MemAddr set_address, + int set_parameter_size) + : name(set_name), + address(set_address), + parameter_size(set_parameter_size) {} + + string name; + MemAddr address; + + // If the public symbol is used as a function entry point, parameter_size + // is set to the size of the parameters passed to the funciton on the + // stack, if known. + int parameter_size; +}; + +class BasicSourceLineResolver::Module { + public: + Module(const string &name) : name_(name) { } + + // Loads the given map file, returning true on success. Reads the + // map file into memory and calls LoadMapFromBuffer + bool LoadMap(const string &map_file); + + // Loads a map from the given buffer, returning true on success + bool LoadMapFromBuffer(const string &map_buffer); + + // Looks up the given relative address, and fills the StackFrame struct + // with the result. Additional debugging information, if available, is + // returned. If no additional information is available, returns NULL. + // A NULL return value is not an error. The caller takes ownership of + // any returned StackFrameInfo object. + StackFrameInfo* LookupAddress(StackFrame *frame) const; + + private: + friend class BasicSourceLineResolver; +#ifdef BSLR_NO_HASH_MAP + typedef map FileMap; +#else // BSLR_NO_HASH_MAP + typedef hash_map FileMap; +#endif // BSLR_NO_HASH_MAP + + // The types for stack_info_. This is equivalent to MS DIA's + // StackFrameTypeEnum. Each identifies a different type of frame + // information, although all are represented in the symbol file in the + // same format. These are used as indices to the stack_info_ array. + enum StackInfoTypes { + STACK_INFO_FPO = 0, + STACK_INFO_TRAP, // not used here + STACK_INFO_TSS, // not used here + STACK_INFO_STANDARD, + STACK_INFO_FRAME_DATA, + STACK_INFO_LAST, // must be the last sequentially-numbered item + STACK_INFO_UNKNOWN = -1 + }; + + // Splits line into at most max_tokens space-separated tokens, placing + // them in the tokens vector. line is a 0-terminated string that + // optionally ends with a newline character or combination, which will + // be removed. line must not contain any embedded '\n' or '\r' characters. + // If more tokens than max_tokens are present, the final token is placed + // into the vector without splitting it up at all. This modifies line as + // a side effect. Returns true if exactly max_tokens tokens are returned, + // and false if fewer are returned. This is not considered a failure of + // Tokenize, but may be treated as a failure if the caller expects an + // exact, as opposed to maximum, number of tokens. + static bool Tokenize(char *line, int max_tokens, vector *tokens); + + // Parses a file declaration + bool ParseFile(char *file_line); + + // Parses a function declaration, returning a new Function object. + Function* ParseFunction(char *function_line); + + // Parses a line declaration, returning a new Line object. + Line* ParseLine(char *line_line); + + // Parses a PUBLIC symbol declaration, storing it in public_symbols_. + // Returns false if an error occurs. + bool ParsePublicSymbol(char *public_line); + + // Parses a stack frame info declaration, storing it in stack_info_. + bool ParseStackInfo(char *stack_info_line); + + string name_; + FileMap files_; + RangeMap< MemAddr, linked_ptr > functions_; + AddressMap< MemAddr, linked_ptr > public_symbols_; + + // Each element in the array is a ContainedRangeMap for a type listed in + // StackInfoTypes. These are split by type because there may be overlaps + // between maps of different types, but some information is only available + // as certain types. + ContainedRangeMap< MemAddr, linked_ptr > + stack_info_[STACK_INFO_LAST]; +}; + +BasicSourceLineResolver::BasicSourceLineResolver() : modules_(new ModuleMap) { +} + +BasicSourceLineResolver::~BasicSourceLineResolver() { + ModuleMap::iterator it; + for (it = modules_->begin(); it != modules_->end(); ++it) { + delete it->second; + } + delete modules_; +} + +bool BasicSourceLineResolver::LoadModule(const string &module_name, + const string &map_file) { + // Make sure we don't already have a module with the given name. + if (modules_->find(module_name) != modules_->end()) { + BPLOG(INFO) << "Symbols for module " << module_name << " already loaded"; + return false; + } + + BPLOG(INFO) << "Loading symbols for module " << module_name << " from " << + map_file; + + Module *module = new Module(module_name); + if (!module->LoadMap(map_file)) { + delete module; + return false; + } + + modules_->insert(make_pair(module_name, module)); + return true; +} + +bool BasicSourceLineResolver::LoadModuleUsingMapBuffer( + const string &module_name, + const string &map_buffer) { + // Make sure we don't already have a module with the given name. + if (modules_->find(module_name) != modules_->end()) { + BPLOG(INFO) << "Symbols for module " << module_name << " already loaded"; + return false; + } + + BPLOG(INFO) << "Loading symbols for module " << module_name << " from buffer"; + + Module *module = new Module(module_name); + if (!module->LoadMapFromBuffer(map_buffer)) { + delete module; + return false; + } + + modules_->insert(make_pair(module_name, module)); + return true; +} + +bool BasicSourceLineResolver::HasModule(const string &module_name) const { + return modules_->find(module_name) != modules_->end(); +} + +StackFrameInfo* BasicSourceLineResolver::FillSourceLineInfo( + StackFrame *frame) const { + if (frame->module) { + ModuleMap::const_iterator it = modules_->find(frame->module->code_file()); + if (it != modules_->end()) { + return it->second->LookupAddress(frame); + } + } + return NULL; +} + +class AutoFileCloser { + public: + AutoFileCloser(FILE *file) : file_(file) {} + ~AutoFileCloser() { + if (file_) + fclose(file_); + } + + private: + FILE *file_; +}; + +bool BasicSourceLineResolver::Module::LoadMapFromBuffer( + const string &map_buffer) { + linked_ptr cur_func; + int line_number = 0; + const char *map_buffer_c_str = map_buffer.c_str(); + char *save_ptr; + + // set up our input buffer as a c-style string so we + // can we use strtok() + // have to copy because modifying the result of string::c_str is not + // permitted + size_t map_buffer_length = strlen(map_buffer_c_str); + char *map_buffer_chars = new char[map_buffer_length]; + if (map_buffer_chars == NULL) { + BPLOG(ERROR) << "Memory allocation of " << map_buffer_length << + " bytes failed"; + return false; + } + + strncpy(map_buffer_chars, map_buffer_c_str, map_buffer_length); + + if (map_buffer_chars[map_buffer_length - 1] == '\n') { + map_buffer_chars[map_buffer_length - 1] = '\0'; + } + char *buffer; + buffer = strtok_r(map_buffer_chars, "\r\n", &save_ptr); + + while (buffer != NULL) { + ++line_number; + + if (strncmp(buffer, "FILE ", 5) == 0) { + if (!ParseFile(buffer)) { + BPLOG(ERROR) << "ParseFile on buffer failed at " << + ":" << line_number; + delete [] map_buffer_chars; + return false; + } + } else if (strncmp(buffer, "STACK ", 6) == 0) { + if (!ParseStackInfo(buffer)) { + BPLOG(ERROR) << "ParseStackInfo failed at " << + ":" << line_number; + delete [] map_buffer_chars; + return false; + } + } else if (strncmp(buffer, "FUNC ", 5) == 0) { + cur_func.reset(ParseFunction(buffer)); + if (!cur_func.get()) { + BPLOG(ERROR) << "ParseFunction failed at " << + ":" << line_number; + delete [] map_buffer_chars; + return false; + } + // StoreRange will fail if the function has an invalid address or size. + // We'll silently ignore this, the function and any corresponding lines + // will be destroyed when cur_func is released. + functions_.StoreRange(cur_func->address, cur_func->size, cur_func); + } else if (strncmp(buffer, "PUBLIC ", 7) == 0) { + // Clear cur_func: public symbols don't contain line number information. + cur_func.reset(); + + if (!ParsePublicSymbol(buffer)) { + BPLOG(ERROR) << "ParsePublicSymbol failed at " << + ":" << line_number; + delete [] map_buffer_chars; + return false; + } + } else if (strncmp(buffer, "MODULE ", 7) == 0) { + // Ignore these. They're not of any use to BasicSourceLineResolver, + // which is fed modules by a SymbolSupplier. These lines are present to + // aid other tools in properly placing symbol files so that they can + // be accessed by a SymbolSupplier. + // + // MODULE + } else { + if (!cur_func.get()) { + BPLOG(ERROR) << "Found source line data without a function at " << + ":" << line_number; + delete [] map_buffer_chars; + return false; + } + Line *line = ParseLine(buffer); + if (!line) { + BPLOG(ERROR) << "ParseLine failed at " << line_number << " for " << + buffer; + delete [] map_buffer_chars; + return false; + } + cur_func->lines.StoreRange(line->address, line->size, + linked_ptr(line)); + } + + buffer = strtok_r(NULL, "\r\n", &save_ptr); + } + + return true; +} + +bool BasicSourceLineResolver::Module::LoadMap(const string &map_file) { + struct stat buf; + int error_code = stat(map_file.c_str(), &buf); + if (error_code == -1) { + string error_string; + int error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "Could not open " << map_file << + ", error " << error_code << ": " << error_string; + return false; + } + + off_t file_size = buf.st_size; + + // Allocate memory for file contents, plus a null terminator + // since we'll use strtok() on the contents. + char *file_buffer = new char[sizeof(char)*file_size + 1]; + + if (file_buffer == NULL) { + BPLOG(ERROR) << "Could not allocate memory for " << map_file; + return false; + } + + BPLOG(ERROR) << "Opening " << map_file; + + FILE *f = fopen(map_file.c_str(), "rt"); + if (!f) { + string error_string; + int error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "Could not open " << map_file << + ", error " << error_code << ": " << error_string; + delete [] file_buffer; + return false; + } + + AutoFileCloser closer(f); + + int items_read = 0; + + items_read = fread(file_buffer, 1, file_size, f); + + if (items_read != file_size) { + string error_string; + int error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "Could not slurp " << map_file << + ", error " << error_code << ": " << error_string; + delete [] file_buffer; + return false; + } + file_buffer[file_size] = '\0'; + string map_buffer(file_buffer); + delete [] file_buffer; + + return LoadMapFromBuffer(map_buffer); +} + +StackFrameInfo* BasicSourceLineResolver::Module::LookupAddress( + StackFrame *frame) const { + MemAddr address = frame->instruction - frame->module->base_address(); + + linked_ptr retrieved_info; + // Check for debugging info first, before any possible early returns. + // + // We only know about STACK_INFO_FRAME_DATA and STACK_INFO_FPO. Prefer + // them in this order. STACK_INFO_FRAME_DATA is the newer type that + // includes its own program string. STACK_INFO_FPO is the older type + // corresponding to the FPO_DATA struct. See stackwalker_x86.cc. + if (!stack_info_[STACK_INFO_FRAME_DATA].RetrieveRange(address, + &retrieved_info)) { + stack_info_[STACK_INFO_FPO].RetrieveRange(address, &retrieved_info); + } + + scoped_ptr frame_info; + if (retrieved_info.get()) { + frame_info.reset(new StackFrameInfo()); + frame_info->CopyFrom(*retrieved_info.get()); + } + + // First, look for a matching FUNC range. Use RetrieveNearestRange instead + // of RetrieveRange so that the nearest function can be compared to the + // nearest PUBLIC symbol if the address does not lie within the function. + // Having access to the highest function below address, even when address + // is outside of the function, is useful: if the function is higher than + // the nearest PUBLIC symbol, then it means that the PUBLIC symbols is not + // valid for the address, and no function information should be filled in. + // Using RetrieveNearestRange instead of RetrieveRange means that we need + // to verify that address is within the range before using a FUNC. + // + // If no FUNC containing the address is found, look for the nearest PUBLIC + // symbol, being careful not to use a public symbol at a lower address than + // the nearest FUNC. + int parameter_size = 0; + linked_ptr func; + linked_ptr public_symbol; + MemAddr function_base; + MemAddr function_size; + MemAddr public_address; + if (functions_.RetrieveNearestRange(address, &func, + &function_base, &function_size) && + address >= function_base && address < function_base + function_size) { + parameter_size = func->parameter_size; + + frame->function_name = func->name; + frame->function_base = frame->module->base_address() + function_base; + + linked_ptr line; + MemAddr line_base; + if (func->lines.RetrieveRange(address, &line, &line_base, NULL)) { + FileMap::const_iterator it = files_.find(line->source_file_id); + if (it != files_.end()) { + frame->source_file_name = files_.find(line->source_file_id)->second; + } + frame->source_line = line->line; + frame->source_line_base = frame->module->base_address() + line_base; + } + } else if (public_symbols_.Retrieve(address, + &public_symbol, &public_address) && + (!func.get() || public_address > function_base + function_size)) { + parameter_size = public_symbol->parameter_size; + + frame->function_name = public_symbol->name; + frame->function_base = frame->module->base_address() + public_address; + } else { + // No FUNC or PUBLIC data available. + return frame_info.release(); + } + + if (!frame_info.get()) { + // Even without a relevant STACK line, many functions contain information + // about how much space their parameters consume on the stack. Prefer + // the STACK stuff (above), but if it's not present, take the + // information from the FUNC or PUBLIC line. + frame_info.reset(new StackFrameInfo()); + frame_info->parameter_size = parameter_size; + frame_info->valid |= StackFrameInfo::VALID_PARAMETER_SIZE; + } + + return frame_info.release(); +} + +// static +bool BasicSourceLineResolver::Module::Tokenize(char *line, int max_tokens, + vector *tokens) { + tokens->clear(); + tokens->reserve(max_tokens); + + int remaining = max_tokens; + + // Split tokens on the space character. Look for newlines too to + // strip them out before exhausting max_tokens. + char *save_ptr; + char *token = strtok_r(line, " \r\n", &save_ptr); + while (token && --remaining > 0) { + tokens->push_back(token); + if (remaining > 1) + token = strtok_r(NULL, " \r\n", &save_ptr); + } + + // If there's anything left, just add it as a single token. + if (!remaining > 0) { + if ((token = strtok_r(NULL, "\r\n", &save_ptr))) { + tokens->push_back(token); + } + } + + return tokens->size() == static_cast(max_tokens); +} + +bool BasicSourceLineResolver::Module::ParseFile(char *file_line) { + // FILE + file_line += 5; // skip prefix + + vector tokens; + if (!Tokenize(file_line, 2, &tokens)) { + return false; + } + + int index = atoi(tokens[0]); + if (index < 0) { + return false; + } + + char *filename = tokens[1]; + if (!filename) { + return false; + } + + files_.insert(make_pair(index, string(filename))); + return true; +} + +BasicSourceLineResolver::Function* +BasicSourceLineResolver::Module::ParseFunction(char *function_line) { + // FUNC
      + function_line += 5; // skip prefix + + vector tokens; + if (!Tokenize(function_line, 4, &tokens)) { + return NULL; + } + + u_int64_t address = strtoull(tokens[0], NULL, 16); + u_int64_t size = strtoull(tokens[1], NULL, 16); + int stack_param_size = strtoull(tokens[2], NULL, 16); + char *name = tokens[3]; + + return new Function(name, address, size, stack_param_size); +} + +BasicSourceLineResolver::Line* BasicSourceLineResolver::Module::ParseLine( + char *line_line) { + //
      + vector tokens; + if (!Tokenize(line_line, 4, &tokens)) { + return NULL; + } + + u_int64_t address = strtoull(tokens[0], NULL, 16); + u_int64_t size = strtoull(tokens[1], NULL, 16); + int line_number = atoi(tokens[2]); + int source_file = atoi(tokens[3]); + if (line_number <= 0) { + return NULL; + } + + return new Line(address, size, source_file, line_number); +} + +bool BasicSourceLineResolver::Module::ParsePublicSymbol(char *public_line) { + // PUBLIC
      + + // Skip "PUBLIC " prefix. + public_line += 7; + + vector tokens; + if (!Tokenize(public_line, 3, &tokens)) { + return false; + } + + u_int64_t address = strtoull(tokens[0], NULL, 16); + int stack_param_size = strtoull(tokens[1], NULL, 16); + char *name = tokens[2]; + + // A few public symbols show up with an address of 0. This has been seen + // in the dumped output of ntdll.pdb for symbols such as _CIlog, _CIpow, + // RtlDescribeChunkLZNT1, and RtlReserveChunkLZNT1. They would conflict + // with one another if they were allowed into the public_symbols_ map, + // but since the address is obviously invalid, gracefully accept them + // as input without putting them into the map. + if (address == 0) { + return true; + } + + linked_ptr symbol(new PublicSymbol(name, address, + stack_param_size)); + return public_symbols_.Store(address, symbol); +} + +bool BasicSourceLineResolver::Module::ParseStackInfo(char *stack_info_line) { + // STACK WIN + // + // + // + // If has_program_string is 1, the rest of the line is a program string. + // Otherwise, the final token tells whether the stack info indicates that + // a base pointer has been allocated. + // + // Expect has_program_string to be 1 when type is STACK_INFO_FRAME_DATA and + // 0 when type is STACK_INFO_FPO, but don't enforce this. + + // Skip "STACK " prefix. + stack_info_line += 6; + + vector tokens; + if (!Tokenize(stack_info_line, 12, &tokens)) + return false; + + // Only MSVC stack frame info is understood for now. + const char *platform = tokens[0]; + if (strcmp(platform, "WIN") != 0) + return false; + + int type = strtol(tokens[1], NULL, 16); + if (type < 0 || type > STACK_INFO_LAST - 1) + return false; + + u_int64_t rva = strtoull(tokens[2], NULL, 16); + u_int64_t code_size = strtoull(tokens[3], NULL, 16); + u_int32_t prolog_size = strtoul(tokens[4], NULL, 16); + u_int32_t epilog_size = strtoul(tokens[5], NULL, 16); + u_int32_t parameter_size = strtoul(tokens[6], NULL, 16); + u_int32_t saved_register_size = strtoul(tokens[7], NULL, 16); + u_int32_t local_size = strtoul(tokens[8], NULL, 16); + u_int32_t max_stack_size = strtoul(tokens[9], NULL, 16); + int has_program_string = strtoul(tokens[10], NULL, 16); + + const char *program_string = ""; + int allocates_base_pointer = 0; + if (has_program_string) { + program_string = tokens[11]; + } else { + allocates_base_pointer = strtoul(tokens[11], NULL, 16); + } + + // TODO(mmentovai): I wanted to use StoreRange's return value as this + // method's return value, but MSVC infrequently outputs stack info that + // violates the containment rules. This happens with a section of code + // in strncpy_s in test_app.cc (testdata/minidump2). There, problem looks + // like this: + // STACK WIN 4 4242 1a a 0 ... (STACK WIN 4 base size prolog 0 ...) + // STACK WIN 4 4243 2e 9 0 ... + // ContainedRangeMap treats these two blocks as conflicting. In reality, + // when the prolog lengths are taken into account, the actual code of + // these blocks doesn't conflict. However, we can't take the prolog lengths + // into account directly here because we'd wind up with a different set + // of range conflicts when MSVC outputs stack info like this: + // STACK WIN 4 1040 73 33 0 ... + // STACK WIN 4 105a 59 19 0 ... + // because in both of these entries, the beginning of the code after the + // prolog is at 0x1073, and the last byte of contained code is at 0x10b2. + // Perhaps we could get away with storing ranges by rva + prolog_size + // if ContainedRangeMap were modified to allow replacement of + // already-stored values. + + linked_ptr stack_frame_info( + new StackFrameInfo(prolog_size, + epilog_size, + parameter_size, + saved_register_size, + local_size, + max_stack_size, + allocates_base_pointer, + program_string)); + stack_info_[type].StoreRange(rva, code_size, stack_frame_info); + + return true; +} + +#ifdef BSLR_NO_HASH_MAP +bool BasicSourceLineResolver::CompareString::operator()( + const string &s1, const string &s2) const { + return strcmp(s1.c_str(), s2.c_str()) < 0; +} +#else // BSLR_NO_HASH_MAP +size_t BasicSourceLineResolver::HashString::operator()(const string &s) const { + return hash()(s.c_str()); +} +#endif // BSLR_NO_HASH_MAP + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/basic_source_line_resolver_unittest.cc b/thirdparty/google-breakpad/r318/src/processor/basic_source_line_resolver_unittest.cc new file mode 100644 index 00000000..95595a85 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/basic_source_line_resolver_unittest.cc @@ -0,0 +1,212 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/stack_frame.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" +#include "processor/scoped_ptr.h" +#include "processor/stack_frame_info.h" + +#define ASSERT_TRUE(cond) \ + if (!(cond)) { \ + fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \ + return false; \ + } + +#define ASSERT_FALSE(cond) ASSERT_TRUE(!(cond)) + +#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2)) + +namespace { + +using std::string; +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CodeModule; +using google_breakpad::linked_ptr; +using google_breakpad::scoped_ptr; +using google_breakpad::StackFrame; +using google_breakpad::StackFrameInfo; + +class TestCodeModule : public CodeModule { + public: + TestCodeModule(string code_file) : code_file_(code_file) {} + virtual ~TestCodeModule() {} + + virtual u_int64_t base_address() const { return 0; } + virtual u_int64_t size() const { return 0x4000; } + virtual string code_file() const { return code_file_; } + virtual string code_identifier() const { return ""; } + virtual string debug_file() const { return ""; } + virtual string debug_identifier() const { return ""; } + virtual string version() const { return ""; } + virtual const CodeModule* Copy() const { + return new TestCodeModule(code_file_); + } + + private: + string code_file_; +}; + +static bool VerifyEmpty(const StackFrame &frame) { + ASSERT_TRUE(frame.function_name.empty()); + ASSERT_TRUE(frame.source_file_name.empty()); + ASSERT_EQ(frame.source_line, 0); + return true; +} + +static void ClearSourceLineInfo(StackFrame *frame) { + frame->function_name.clear(); + frame->module = NULL; + frame->source_file_name.clear(); + frame->source_line = 0; +} + +static bool RunTests() { + string testdata_dir = string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/processor/testdata"; + + BasicSourceLineResolver resolver; + ASSERT_TRUE(resolver.LoadModule("module1", testdata_dir + "/module1.out")); + ASSERT_TRUE(resolver.HasModule("module1")); + ASSERT_TRUE(resolver.LoadModule("module2", testdata_dir + "/module2.out")); + ASSERT_TRUE(resolver.HasModule("module2")); + + TestCodeModule module1("module1"); + + StackFrame frame; + frame.instruction = 0x1000; + frame.module = NULL; + scoped_ptr frame_info(resolver.FillSourceLineInfo(&frame)); + ASSERT_FALSE(frame.module); + ASSERT_TRUE(frame.function_name.empty()); + ASSERT_EQ(frame.function_base, 0); + ASSERT_TRUE(frame.source_file_name.empty()); + ASSERT_EQ(frame.source_line, 0); + ASSERT_EQ(frame.source_line_base, 0); + + frame.module = &module1; + frame_info.reset(resolver.FillSourceLineInfo(&frame)); + ASSERT_EQ(frame.function_name, "Function1_1"); + ASSERT_TRUE(frame.module); + ASSERT_EQ(frame.module->code_file(), "module1"); + ASSERT_EQ(frame.function_base, 0x1000); + ASSERT_EQ(frame.source_file_name, "file1_1.cc"); + ASSERT_EQ(frame.source_line, 44); + ASSERT_EQ(frame.source_line_base, 0x1000); + ASSERT_TRUE(frame_info.get()); + ASSERT_FALSE(frame_info->allocates_base_pointer); + ASSERT_EQ(frame_info->program_string, + "$eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ ="); + + ClearSourceLineInfo(&frame); + frame.instruction = 0x800; + frame.module = &module1; + frame_info.reset(resolver.FillSourceLineInfo(&frame)); + ASSERT_TRUE(VerifyEmpty(frame)); + ASSERT_FALSE(frame_info.get()); + + frame.instruction = 0x1280; + frame_info.reset(resolver.FillSourceLineInfo(&frame)); + ASSERT_EQ(frame.function_name, "Function1_3"); + ASSERT_TRUE(frame.source_file_name.empty()); + ASSERT_EQ(frame.source_line, 0); + ASSERT_TRUE(frame_info.get()); + ASSERT_FALSE(frame_info->allocates_base_pointer); + ASSERT_TRUE(frame_info->program_string.empty()); + + frame.instruction = 0x1380; + frame_info.reset(resolver.FillSourceLineInfo(&frame)); + ASSERT_EQ(frame.function_name, "Function1_4"); + ASSERT_TRUE(frame.source_file_name.empty()); + ASSERT_EQ(frame.source_line, 0); + ASSERT_TRUE(frame_info.get()); + ASSERT_FALSE(frame_info->allocates_base_pointer); + ASSERT_FALSE(frame_info->program_string.empty()); + + frame.instruction = 0x2000; + frame_info.reset(resolver.FillSourceLineInfo(&frame)); + ASSERT_FALSE(frame_info.get()); + + TestCodeModule module2("module2"); + + frame.instruction = 0x2181; + frame.module = &module2; + frame_info.reset(resolver.FillSourceLineInfo(&frame)); + ASSERT_EQ(frame.function_name, "Function2_2"); + ASSERT_EQ(frame.function_base, 0x2170); + ASSERT_TRUE(frame.module); + ASSERT_EQ(frame.module->code_file(), "module2"); + ASSERT_EQ(frame.source_file_name, "file2_2.cc"); + ASSERT_EQ(frame.source_line, 21); + ASSERT_EQ(frame.source_line_base, 0x2180); + ASSERT_TRUE(frame_info.get()); + ASSERT_EQ(frame_info->prolog_size, 1); + + frame.instruction = 0x216f; + resolver.FillSourceLineInfo(&frame); + ASSERT_EQ(frame.function_name, "Public2_1"); + + ClearSourceLineInfo(&frame); + frame.instruction = 0x219f; + frame.module = &module2; + resolver.FillSourceLineInfo(&frame); + ASSERT_TRUE(frame.function_name.empty()); + + frame.instruction = 0x21a0; + frame.module = &module2; + resolver.FillSourceLineInfo(&frame); + ASSERT_EQ(frame.function_name, "Public2_2"); + + ASSERT_FALSE(resolver.LoadModule("module3", + testdata_dir + "/module3_bad.out")); + ASSERT_FALSE(resolver.HasModule("module3")); + ASSERT_FALSE(resolver.LoadModule("module4", + testdata_dir + "/module4_bad.out")); + ASSERT_FALSE(resolver.HasModule("module4")); + ASSERT_FALSE(resolver.LoadModule("module5", + testdata_dir + "/invalid-filename")); + ASSERT_FALSE(resolver.HasModule("module5")); + ASSERT_FALSE(resolver.HasModule("invalid-module")); + return true; +} + +} // namespace + +int main(int argc, char **argv) { + BPLOG_INIT(&argc, &argv); + + if (!RunTests()) { + return 1; + } + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/processor/call_stack.cc b/thirdparty/google-breakpad/r318/src/processor/call_stack.cc new file mode 100644 index 00000000..e3276716 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/call_stack.cc @@ -0,0 +1,53 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// call_stack.cc: A call stack comprised of stack frames. +// +// See call_stack.h for documentation. +// +// Author: Mark Mentovai + +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/stack_frame.h" + +namespace google_breakpad { + +CallStack::~CallStack() { + Clear(); +} + +void CallStack::Clear() { + for (vector::const_iterator iterator = frames_.begin(); + iterator != frames_.end(); + ++iterator) { + delete *iterator; + } +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/contained_range_map-inl.h b/thirdparty/google-breakpad/r318/src/processor/contained_range_map-inl.h new file mode 100644 index 00000000..5cc498df --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/contained_range_map-inl.h @@ -0,0 +1,197 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// contained_range_map-inl.h: Hierarchically-organized range map implementation. +// +// See contained_range_map.h for documentation. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_CONTAINED_RANGE_MAP_INL_H__ +#define PROCESSOR_CONTAINED_RANGE_MAP_INL_H__ + + +#include + +#include "processor/contained_range_map.h" +#include "processor/logging.h" + + +namespace google_breakpad { + + +template +ContainedRangeMap::~ContainedRangeMap() { + // Clear frees the children pointed to by the map, and frees the map itself. + Clear(); +} + + +template +bool ContainedRangeMap::StoreRange( + const AddressType &base, const AddressType &size, const EntryType &entry) { + AddressType high = base + size - 1; + + // Check for undersize or overflow. + if (size <= 0 || high < base) { + //TODO(nealsid) We are commenting this out in order to prevent + // excessive logging. We plan to move to better logging as this + // failure happens quite often and is expected(see comment in + // basic_source_line_resolver.cc:671). + // BPLOG(INFO) << "StoreRange failed, " << HexString(base) << "+" + // << HexString(size) << ", " << HexString(high); + return false; + } + + if (!map_) + map_ = new AddressToRangeMap(); + + MapIterator iterator_base = map_->lower_bound(base); + MapIterator iterator_high = map_->lower_bound(high); + MapIterator iterator_end = map_->end(); + + if (iterator_base == iterator_high && iterator_base != iterator_end && + base >= iterator_base->second->base_) { + // The new range is entirely within an existing child range. + + // If the new range's geometry is exactly equal to an existing child + // range's, it violates the containment rules, and an attempt to store + // it must fail. iterator_base->first contains the key, which was the + // containing child's high address. + if (iterator_base->second->base_ == base && iterator_base->first == high) { + // TODO(nealsid): See the TODO above on why this is commented out. +// BPLOG(INFO) << "StoreRange failed, identical range is already " +// "present: " << HexString(base) << "+" << HexString(size); + return false; + } + + // Pass the new range on to the child to attempt to store. + return iterator_base->second->StoreRange(base, size, entry); + } + + // iterator_high might refer to an irrelevant range: one whose base address + // is higher than the new range's high address. Set contains_high to true + // only if iterator_high refers to a range that is at least partially + // within the new range. + bool contains_high = iterator_high != iterator_end && + high >= iterator_high->second->base_; + + // If the new range encompasses any existing child ranges, it must do so + // fully. Partial containment isn't allowed. + if ((iterator_base != iterator_end && base > iterator_base->second->base_) || + (contains_high && high < iterator_high->first)) { + // TODO(mmentovai): Some symbol files will trip this check frequently + // on STACK lines. Too many messages will be produced. These are more + // suitable for a DEBUG channel than an INFO channel. + // BPLOG(INFO) << "StoreRange failed, new range partially contains " + // "existing range: " << HexString(base) << "+" << + // HexString(size); + return false; + } + + // When copying and erasing contained ranges, the "end" iterator needs to + // point one past the last item of the range to copy. If contains_high is + // false, the iterator's already in the right place; the increment is safe + // because contains_high can't be true if iterator_high == iterator_end. + if (contains_high) + ++iterator_high; + + // Optimization: if the iterators are equal, no child ranges would be + // moved. Create the new child range with a NULL map to conserve space + // in leaf nodes, of which there will be many. + AddressToRangeMap *child_map = NULL; + + if (iterator_base != iterator_high) { + // The children of this range that are contained by the new range must + // be transferred over to the new range. Create the new child range map + // and copy the pointers to range maps it should contain into it. + child_map = new AddressToRangeMap(iterator_base, iterator_high); + + // Remove the copied child pointers from this range's map of children. + map_->erase(iterator_base, iterator_high); + } + + // Store the new range in the map by its high address. Any children that + // the new child range contains were formerly children of this range but + // are now this range's grandchildren. Ownership of these is transferred + // to the new child range. + map_->insert(MapValue(high, + new ContainedRangeMap(base, entry, child_map))); + return true; +} + + +template +bool ContainedRangeMap::RetrieveRange( + const AddressType &address, EntryType *entry) const { + BPLOG_IF(ERROR, !entry) << "ContainedRangeMap::RetrieveRange requires " + "|entry|"; + assert(entry); + + // If nothing was ever stored, then there's nothing to retrieve. + if (!map_) + return false; + + // Get an iterator to the child range whose high address is equal to or + // greater than the supplied address. If the supplied address is higher + // than all of the high addresses in the range, then this range does not + // contain a child at address, so return false. If the supplied address + // is lower than the base address of the child range, then it is not within + // the child range, so return false. + MapConstIterator iterator = map_->lower_bound(address); + if (iterator == map_->end() || address < iterator->second->base_) + return false; + + // The child in iterator->second contains the specified address. Find out + // if it has a more-specific descendant that also contains it. If it does, + // it will set |entry| appropriately. If not, set |entry| to the child. + if (!iterator->second->RetrieveRange(address, entry)) + *entry = iterator->second->entry_; + + return true; +} + + +template +void ContainedRangeMap::Clear() { + if (map_) { + MapConstIterator end = map_->end(); + for (MapConstIterator child = map_->begin(); child != end; ++child) + delete child->second; + + delete map_; + map_ = NULL; + } +} + + +} // namespace google_breakpad + + +#endif // PROCESSOR_CONTAINED_RANGE_MAP_INL_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/contained_range_map.h b/thirdparty/google-breakpad/r318/src/processor/contained_range_map.h new file mode 100644 index 00000000..f30016f3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/contained_range_map.h @@ -0,0 +1,145 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// contained_range_map.h: Hierarchically-organized range maps. +// +// A contained range map is similar to a standard range map, except it allows +// objects to be organized hierarchically. A contained range map allows +// objects to contain other objects. It is not sensitive to the order that +// objects are added to the map: larger, more general, containing objects +// may be added either before or after smaller, more specific, contained +// ones. +// +// Contained range maps guarantee that each object may only contain smaller +// objects than itself, and that a parent object may only contain child +// objects located entirely within the parent's address space. Attempts +// to introduce objects (via StoreRange) that violate these rules will fail. +// Retrieval (via RetrieveRange) always returns the most specific (smallest) +// object that contains the address being queried. Note that while it is +// not possible to insert two objects into a map that have exactly the same +// geometry (base address and size), it is possible to completely mask a +// larger object by inserting smaller objects that entirely fill the larger +// object's address space. +// +// Internally, contained range maps are implemented as a tree. Each tree +// node except for the root node describes an object in the map. Each node +// maintains its list of children in a map similar to a standard range map, +// keyed by the highest address that each child occupies. Each node's +// children occupy address ranges entirely within the node. The root node +// is the only node directly accessible to the user, and represents the +// entire address space. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_CONTAINED_RANGE_MAP_H__ +#define PROCESSOR_CONTAINED_RANGE_MAP_H__ + + +#include + + +namespace google_breakpad { + + +template +class ContainedRangeMap { + public: + // The default constructor creates a ContainedRangeMap with no geometry + // and no entry, and as such is only suitable for the root node of a + // ContainedRangeMap tree. + ContainedRangeMap() : base_(), entry_(), map_(NULL) {} + + ~ContainedRangeMap(); + + // Inserts a range into the map. If the new range is encompassed by + // an existing child range, the new range is passed into the child range's + // StoreRange method. If the new range encompasses any existing child + // ranges, those child ranges are moved to the new range, becoming + // grandchildren of this ContainedRangeMap. Returns false for a + // parameter error, or if the ContainedRangeMap hierarchy guarantees + // would be violated. + bool StoreRange(const AddressType &base, + const AddressType &size, + const EntryType &entry); + + // Retrieves the most specific (smallest) descendant range encompassing + // the specified address. This method will only return entries held by + // child ranges, and not the entry contained by |this|. This is necessary + // to support a sparsely-populated root range. If no descendant range + // encompasses the address, returns false. + bool RetrieveRange(const AddressType &address, EntryType *entry) const; + + // Removes all children. Note that Clear only removes descendants, + // leaving the node on which it is called intact. Because the only + // meaningful things contained by a root node are descendants, this + // is sufficient to restore an entire ContainedRangeMap to its initial + // empty state when called on the root node. + void Clear(); + + private: + // AddressToRangeMap stores pointers. This makes reparenting simpler in + // StoreRange, because it doesn't need to copy entire objects. + typedef std::map AddressToRangeMap; + typedef typename AddressToRangeMap::const_iterator MapConstIterator; + typedef typename AddressToRangeMap::iterator MapIterator; + typedef typename AddressToRangeMap::value_type MapValue; + + // Creates a new ContainedRangeMap with the specified base address, entry, + // and initial child map, which may be NULL. This is only used internally + // by ContainedRangeMap when it creates a new child. + ContainedRangeMap(const AddressType &base, const EntryType &entry, + AddressToRangeMap *map) + : base_(base), entry_(entry), map_(map) {} + + // The base address of this range. The high address does not need to + // be stored, because it is used as the key to an object in its parent's + // map, and all ContainedRangeMaps except for the root range are contained + // within maps. The root range does not actually contain an entry, so its + // base_ field is meaningless, and the fact that it has no parent and thus + // no key is unimportant. For this reason, the base_ field should only be + // is accessed on child ContainedRangeMap objects, and never on |this|. + const AddressType base_; + + // The entry corresponding to this range. The root range does not + // actually contain an entry, so its entry_ field is meaningless. For + // this reason, the entry_ field should only be accessed on child + // ContainedRangeMap objects, and never on |this|. + const EntryType entry_; + + // The map containing child ranges, keyed by each child range's high + // address. This is a pointer to avoid allocating map structures for + // leaf nodes, where they are not needed. + AddressToRangeMap *map_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_CONTAINED_RANGE_MAP_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/contained_range_map_unittest.cc b/thirdparty/google-breakpad/r318/src/processor/contained_range_map_unittest.cc new file mode 100644 index 00000000..6b65b4e1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/contained_range_map_unittest.cc @@ -0,0 +1,263 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// contained_range_map_unittest.cc: Unit tests for ContainedRangeMap +// +// Author: Mark Mentovai + +#include + +#include "processor/contained_range_map-inl.h" + +#include "processor/logging.h" + + +#define ASSERT_TRUE(condition) \ + if (!(condition)) { \ + fprintf(stderr, "FAIL: %s @ %s:%d\n", #condition, __FILE__, __LINE__); \ + return false; \ + } + +#define ASSERT_FALSE(condition) ASSERT_TRUE(!(condition)) + + +namespace { + + +using google_breakpad::ContainedRangeMap; + + +static bool RunTests() { + ContainedRangeMap crm; + + // First, do the StoreRange tests. This validates the containment + // rules. + ASSERT_TRUE (crm.StoreRange(10, 10, 1)); + ASSERT_FALSE(crm.StoreRange(10, 10, 2)); // exactly equal to 1 + ASSERT_FALSE(crm.StoreRange(11, 10, 3)); // begins inside 1 and extends up + ASSERT_FALSE(crm.StoreRange( 9, 10, 4)); // begins below 1 and ends inside + ASSERT_TRUE (crm.StoreRange(11, 9, 5)); // contained by existing + ASSERT_TRUE (crm.StoreRange(12, 7, 6)); + ASSERT_TRUE (crm.StoreRange( 9, 12, 7)); // contains existing + ASSERT_TRUE (crm.StoreRange( 9, 13, 8)); + ASSERT_TRUE (crm.StoreRange( 8, 14, 9)); + ASSERT_TRUE (crm.StoreRange(30, 3, 10)); + ASSERT_TRUE (crm.StoreRange(33, 3, 11)); + ASSERT_TRUE (crm.StoreRange(30, 6, 12)); // storable but totally masked + ASSERT_TRUE (crm.StoreRange(40, 8, 13)); // will be totally masked + ASSERT_TRUE (crm.StoreRange(40, 4, 14)); + ASSERT_TRUE (crm.StoreRange(44, 4, 15)); + ASSERT_FALSE(crm.StoreRange(32, 10, 16)); // begins in #10, ends in #14 + ASSERT_FALSE(crm.StoreRange(50, 0, 17)); // zero length + ASSERT_TRUE (crm.StoreRange(50, 10, 18)); + ASSERT_TRUE (crm.StoreRange(50, 1, 19)); + ASSERT_TRUE (crm.StoreRange(59, 1, 20)); + ASSERT_TRUE (crm.StoreRange(60, 1, 21)); + ASSERT_TRUE (crm.StoreRange(69, 1, 22)); + ASSERT_TRUE (crm.StoreRange(60, 10, 23)); + ASSERT_TRUE (crm.StoreRange(68, 1, 24)); + ASSERT_TRUE (crm.StoreRange(61, 1, 25)); + ASSERT_TRUE (crm.StoreRange(61, 8, 26)); + ASSERT_FALSE(crm.StoreRange(59, 9, 27)); + ASSERT_FALSE(crm.StoreRange(59, 10, 28)); + ASSERT_FALSE(crm.StoreRange(59, 11, 29)); + ASSERT_TRUE (crm.StoreRange(70, 10, 30)); + ASSERT_TRUE (crm.StoreRange(74, 2, 31)); + ASSERT_TRUE (crm.StoreRange(77, 2, 32)); + ASSERT_FALSE(crm.StoreRange(72, 6, 33)); + ASSERT_TRUE (crm.StoreRange(80, 3, 34)); + ASSERT_TRUE (crm.StoreRange(81, 1, 35)); + ASSERT_TRUE (crm.StoreRange(82, 1, 36)); + ASSERT_TRUE (crm.StoreRange(83, 3, 37)); + ASSERT_TRUE (crm.StoreRange(84, 1, 38)); + ASSERT_TRUE (crm.StoreRange(83, 1, 39)); + ASSERT_TRUE (crm.StoreRange(86, 5, 40)); + ASSERT_TRUE (crm.StoreRange(88, 1, 41)); + ASSERT_TRUE (crm.StoreRange(90, 1, 42)); + ASSERT_TRUE (crm.StoreRange(86, 1, 43)); + ASSERT_TRUE (crm.StoreRange(87, 1, 44)); + ASSERT_TRUE (crm.StoreRange(89, 1, 45)); + ASSERT_TRUE (crm.StoreRange(87, 4, 46)); + ASSERT_TRUE (crm.StoreRange(87, 3, 47)); + ASSERT_FALSE(crm.StoreRange(86, 2, 48)); + + // Each element in test_data contains the expected result when calling + // RetrieveRange on an address. + const int test_data[] = { + 0, // 0 + 0, // 1 + 0, // 2 + 0, // 3 + 0, // 4 + 0, // 5 + 0, // 6 + 0, // 7 + 9, // 8 + 7, // 9 + 1, // 10 + 5, // 11 + 6, // 12 + 6, // 13 + 6, // 14 + 6, // 15 + 6, // 16 + 6, // 17 + 6, // 18 + 5, // 19 + 7, // 20 + 8, // 21 + 0, // 22 + 0, // 23 + 0, // 24 + 0, // 25 + 0, // 26 + 0, // 27 + 0, // 28 + 0, // 29 + 10, // 30 + 10, // 31 + 10, // 32 + 11, // 33 + 11, // 34 + 11, // 35 + 0, // 36 + 0, // 37 + 0, // 38 + 0, // 39 + 14, // 40 + 14, // 41 + 14, // 42 + 14, // 43 + 15, // 44 + 15, // 45 + 15, // 46 + 15, // 47 + 0, // 48 + 0, // 49 + 19, // 50 + 18, // 51 + 18, // 52 + 18, // 53 + 18, // 54 + 18, // 55 + 18, // 56 + 18, // 57 + 18, // 58 + 20, // 59 + 21, // 60 + 25, // 61 + 26, // 62 + 26, // 63 + 26, // 64 + 26, // 65 + 26, // 66 + 26, // 67 + 24, // 68 + 22, // 69 + 30, // 70 + 30, // 71 + 30, // 72 + 30, // 73 + 31, // 74 + 31, // 75 + 30, // 76 + 32, // 77 + 32, // 78 + 30, // 79 + 34, // 80 + 35, // 81 + 36, // 82 + 39, // 83 + 38, // 84 + 37, // 85 + 43, // 86 + 44, // 87 + 41, // 88 + 45, // 89 + 42, // 90 + 0, // 91 + 0, // 92 + 0, // 93 + 0, // 94 + 0, // 95 + 0, // 96 + 0, // 97 + 0, // 98 + 0 // 99 + }; + unsigned int test_high = sizeof(test_data) / sizeof(int); + + // Now, do the RetrieveRange tests. This further validates that the + // objects were stored properly and that retrieval returns the correct + // object. + // If GENERATE_TEST_DATA is defined, instead of the retrieval tests, a + // new test_data array will be printed. Exercise caution when doing this. + // Be sure to verify the results manually! +#ifdef GENERATE_TEST_DATA + printf(" const int test_data[] = {\n"); +#endif // GENERATE_TEST_DATA + + for (unsigned int address = 0; address < test_high; ++address) { + int value; + if (!crm.RetrieveRange(address, &value)) + value = 0; + +#ifndef GENERATE_TEST_DATA + // Don't use ASSERT inside the loop because it won't show the failed + // |address|, and the line number will always be the same. That makes + // it difficult to figure out which test failed. + if (value != test_data[address]) { + fprintf(stderr, "FAIL: retrieve %d expected %d observed %d @ %s:%d\n", + address, test_data[address], value, __FILE__, __LINE__); + return false; + } +#else // !GENERATE_TEST_DATA + printf(" %d%c%s // %d\n", value, + address == test_high - 1 ? ' ' : ',', + value < 10 ? " " : "", + address); +#endif // !GENERATE_TEST_DATA + } + +#ifdef GENERATE_TEST_DATA + printf(" };\n"); +#endif // GENERATE_TEST_DATA + + return true; +} + + +} // namespace + + +int main(int argc, char **argv) { + BPLOG_INIT(&argc, &argv); + + return RunTests() ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/processor/linked_ptr.h b/thirdparty/google-breakpad/r318/src/processor/linked_ptr.h new file mode 100644 index 00000000..1a4ef7d4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/linked_ptr.h @@ -0,0 +1,193 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A "smart" pointer type with reference tracking. Every pointer to a +// particular object is kept on a circular linked list. When the last pointer +// to an object is destroyed or reassigned, the object is deleted. +// +// Used properly, this deletes the object when the last reference goes away. +// There are several caveats: +// - Like all reference counting schemes, cycles lead to leaks. +// - Each smart pointer is actually two pointers (8 bytes instead of 4). +// - Every time a pointer is assigned, the entire list of pointers to that +// object is traversed. This class is therefore NOT SUITABLE when there +// will often be more than two or three pointers to a particular object. +// - References are only tracked as long as linked_ptr<> objects are copied. +// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS +// will happen (double deletion). +// +// A good use of this class is storing object references in STL containers. +// You can safely put linked_ptr<> in a vector<>. +// Other uses may not be as good. +// +// Note: If you use an incomplete type with linked_ptr<>, the class +// *containing* linked_ptr<> must have a constructor and destructor (even +// if they do nothing!). + +#ifndef PROCESSOR_LINKED_PTR_H__ +#define PROCESSOR_LINKED_PTR_H__ + +namespace google_breakpad { + +// This is used internally by all instances of linked_ptr<>. It needs to be +// a non-template class because different types of linked_ptr<> can refer to +// the same object (linked_ptr(obj) vs linked_ptr(obj)). +// So, it needs to be possible for different types of linked_ptr to participate +// in the same circular linked list, so we need a single class type here. +// +// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr. +class linked_ptr_internal { + public: + // Create a new circle that includes only this instance. + void join_new() { + next_ = this; + } + + // Join an existing circle. + void join(linked_ptr_internal const* ptr) { + linked_ptr_internal const* p = ptr; + while (p->next_ != ptr) p = p->next_; + p->next_ = this; + next_ = ptr; + } + + // Leave whatever circle we're part of. Returns true iff we were the + // last member of the circle. Once this is done, you can join() another. + bool depart() { + if (next_ == this) return true; + linked_ptr_internal const* p = next_; + while (p->next_ != this) p = p->next_; + p->next_ = next_; + return false; + } + + private: + mutable linked_ptr_internal const* next_; +}; + +template +class linked_ptr { + public: + typedef T element_type; + + // Take over ownership of a raw pointer. This should happen as soon as + // possible after the object is created. + explicit linked_ptr(T* ptr = NULL) { capture(ptr); } + ~linked_ptr() { depart(); } + + // Copy an existing linked_ptr<>, adding ourselves to the list of references. + template linked_ptr(linked_ptr const& ptr) { copy(&ptr); } + linked_ptr(linked_ptr const& ptr) { copy(&ptr); } + + // Assignment releases the old value and acquires the new. + template linked_ptr& operator=(linked_ptr const& ptr) { + depart(); + copy(&ptr); + return *this; + } + + linked_ptr& operator=(linked_ptr const& ptr) { + if (&ptr != this) { + depart(); + copy(&ptr); + } + return *this; + } + + // Smart pointer members. + void reset(T* ptr = NULL) { depart(); capture(ptr); } + T* get() const { return value_; } + T* operator->() const { return value_; } + T& operator*() const { return *value_; } + // Release ownership of the pointed object and returns it. + // Sole ownership by this linked_ptr object is required. + T* release() { + bool last = link_.depart(); + T* v = value_; + value_ = NULL; + return v; + } + + bool operator==(T* p) const { return value_ == p; } + bool operator!=(T* p) const { return value_ != p; } + template + bool operator==(linked_ptr const& ptr) const { + return value_ == ptr.get(); + } + template + bool operator!=(linked_ptr const& ptr) const { + return value_ != ptr.get(); + } + + private: + template + friend class linked_ptr; + + T* value_; + linked_ptr_internal link_; + + void depart() { + if (link_.depart()) delete value_; + } + + void capture(T* ptr) { + value_ = ptr; + link_.join_new(); + } + + template void copy(linked_ptr const* ptr) { + value_ = ptr->get(); + if (value_) + link_.join(&ptr->link_); + else + link_.join_new(); + } +}; + +template inline +bool operator==(T* ptr, const linked_ptr& x) { + return ptr == x.get(); +} + +template inline +bool operator!=(T* ptr, const linked_ptr& x) { + return ptr != x.get(); +} + +// A function to convert T* into linked_ptr +// Doing e.g. make_linked_ptr(new FooBarBaz(arg)) is a shorter notation +// for linked_ptr >(new FooBarBaz(arg)) +template +linked_ptr make_linked_ptr(T* ptr) { + return linked_ptr(ptr); +} + +} // namespace google_breakpad + +#endif // PROCESSOR_LINKED_PTR_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/logging.cc b/thirdparty/google-breakpad/r318/src/processor/logging.cc new file mode 100644 index 00000000..8842df35 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/logging.cc @@ -0,0 +1,104 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// logging.cc: Breakpad logging +// +// See logging.h for documentation. +// +// Author: Mark Mentovai + +#include +#include +#include +#include +#include + +#include "processor/logging.h" +#include "processor/pathname_stripper.h" + +namespace google_breakpad { + +LogStream::LogStream(std::ostream &stream, Severity severity, + const char *file, int line) + : stream_(stream) { + time_t clock; + time(&clock); + struct tm tm_struct; + localtime_r(&clock, &tm_struct); + char time_string[20]; + strftime(time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", &tm_struct); + + const char *severity_string = "UNKNOWN_SEVERITY"; + switch (severity) { + case SEVERITY_INFO: + severity_string = "INFO"; + break; + case SEVERITY_ERROR: + severity_string = "ERROR"; + break; + } + + stream_ << time_string << ": " << PathnameStripper::File(file) << ":" << + line << ": " << severity_string << ": "; +} + +LogStream::~LogStream() { + stream_ << std::endl; +} + +std::string HexString(u_int32_t number) { + char buffer[11]; + snprintf(buffer, sizeof(buffer), "0x%x", number); + return std::string(buffer); +} + +std::string HexString(u_int64_t number) { + char buffer[19]; + snprintf(buffer, sizeof(buffer), "0x%" PRIx64, number); + return std::string(buffer); +} + +std::string HexString(int number) { + char buffer[19]; + snprintf(buffer, sizeof(buffer), "0x%x", number); + return std::string(buffer); +} + +int ErrnoString(std::string *error_string) { + assert(error_string); + + // strerror isn't necessarily thread-safe. strerror_r would be preferrable, + // but GNU libc uses a nonstandard strerror_r by default, which returns a + // char* (rather than an int success indicator) and doesn't necessarily + // use the supplied buffer. + error_string->assign(strerror(errno)); + return errno; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/logging.h b/thirdparty/google-breakpad/r318/src/processor/logging.h new file mode 100644 index 00000000..b638ff58 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/logging.h @@ -0,0 +1,153 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// logging.h: Breakpad logging +// +// Breakpad itself uses Breakpad logging with statements of the form: +// BPLOG(severity) << "message"; +// severity may be INFO, ERROR, or other values defined in this file. +// +// BPLOG is an overridable macro so that users can customize Breakpad's +// logging. Left at the default, logging messages are sent to stderr along +// with a timestamp and the source code location that produced a message. +// The streams may be changed by redefining BPLOG_*_STREAM, the logging +// behavior may be changed by redefining BPLOG_*, and the entire logging +// system may be overridden by redefining BPLOG(severity). These +// redefinitions may be passed to the preprocessor as a command-line flag +// (-D). +// +// If an additional header is required to override Breakpad logging, it can +// be specified by the BP_LOGGING_INCLUDE macro. If defined, this header +// will #include the header specified by that macro. +// +// If any initialization is needed before logging, it can be performed by +// a function called through the BPLOG_INIT macro. Each main function of +// an executable program in the Breakpad processor library calls +// BPLOG_INIT(&argc, &argv); before any logging can be performed; define +// BPLOG_INIT appropriately if initialization is required. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_LOGGING_H__ +#define PROCESSOR_LOGGING_H__ + +#include +#include + +#include "google_breakpad/common/breakpad_types.h" + +#ifdef BP_LOGGING_INCLUDE +#include BP_LOGGING_INCLUDE +#endif // BP_LOGGING_INCLUDE + +namespace google_breakpad { + +class LogStream { + public: + enum Severity { + SEVERITY_INFO, + SEVERITY_ERROR + }; + + // Begin logging a message to the stream identified by |stream|, at the + // indicated severity. The file and line parameters should be set so as to + // identify the line of source code that is producing a message. + LogStream(std::ostream &stream, Severity severity, + const char *file, int line); + + // Finish logging by printing a newline and flushing the output stream. + ~LogStream(); + + template std::ostream& operator<<(const T &t) { + return stream_ << t; + } + + private: + std::ostream &stream_; + + // Disallow copy constructor and assignment operator + explicit LogStream(const LogStream &that); + void operator=(const LogStream &that); +}; + +// This class is used to explicitly ignore values in the conditional logging +// macros. This avoids compiler warnings like "value computed is not used" +// and "statement has no effect". +class LogMessageVoidify { + public: + LogMessageVoidify() {} + + // This has to be an operator with a precedence lower than << but higher + // than ?: + void operator&(std::ostream &) {} +}; + +// Returns number formatted as a hexadecimal string, such as "0x7b". +std::string HexString(u_int32_t number); +std::string HexString(u_int64_t number); +std::string HexString(int number); + +// Returns the error code as set in the global errno variable, and sets +// error_string, a required argument, to a string describing that error +// code. +int ErrnoString(std::string *error_string); + +} // namespace google_breakpad + +#ifndef BPLOG_INIT +#define BPLOG_INIT(pargc, pargv) +#endif // BPLOG_INIT + +#ifndef BPLOG +#define BPLOG(severity) BPLOG_ ## severity +#endif // BPLOG + +#ifndef BPLOG_INFO +#ifndef BPLOG_INFO_STREAM +#define BPLOG_INFO_STREAM std::clog +#endif // BPLOG_INFO_STREAM +#define BPLOG_INFO google_breakpad::LogStream(BPLOG_INFO_STREAM, \ + google_breakpad::LogStream::SEVERITY_INFO, \ + __FILE__, __LINE__) +#endif // BPLOG_INFO + +#ifndef BPLOG_ERROR +#ifndef BPLOG_ERROR_STREAM +#define BPLOG_ERROR_STREAM std::cerr +#endif // BPLOG_ERROR_STREAM +#define BPLOG_ERROR google_breakpad::LogStream(BPLOG_ERROR_STREAM, \ + google_breakpad::LogStream::SEVERITY_ERROR, \ + __FILE__, __LINE__) +#endif // BPLOG_ERROR + +#define BPLOG_IF(severity, condition) \ + !(condition) ? (void) 0 : \ + google_breakpad::LogMessageVoidify() & BPLOG(severity) + +#endif // PROCESSOR_LOGGING_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/minidump.cc b/thirdparty/google-breakpad/r318/src/processor/minidump.cc new file mode 100644 index 00000000..83944501 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/minidump.cc @@ -0,0 +1,3679 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump.cc: A minidump reader. +// +// See minidump.h for documentation. +// +// Author: Mark Mentovai + + +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +typedef SSIZE_T ssize_t; +#define open _open +#define read _read +#define lseek _lseek +#else // _WIN32 +#define O_BINARY 0 +#endif // _WIN32 + +#include +#include +#include +#include + +#include "processor/range_map-inl.h" + +#include "google_breakpad/processor/minidump.h" +#include "processor/basic_code_module.h" +#include "processor/basic_code_modules.h" +#include "processor/logging.h" +#include "processor/scoped_ptr.h" + + +namespace google_breakpad { + + +using std::numeric_limits; +using std::vector; + + +// +// Swapping routines +// +// Inlining these doesn't increase code size significantly, and it saves +// a whole lot of unnecessary jumping back and forth. +// + + +// Swapping an 8-bit quantity is a no-op. This function is only provided +// to account for certain templatized operations that require swapping for +// wider types but handle u_int8_t too +// (MinidumpMemoryRegion::GetMemoryAtAddressInternal). +static inline void Swap(u_int8_t* value) { +} + + +// Optimization: don't need to AND the furthest right shift, because we're +// shifting an unsigned quantity. The standard requires zero-filling in this +// case. If the quantities were signed, a bitmask whould be needed for this +// right shift to avoid an arithmetic shift (which retains the sign bit). +// The furthest left shift never needs to be ANDed bitmask. + + +static inline void Swap(u_int16_t* value) { + *value = (*value >> 8) | + (*value << 8); +} + + +static inline void Swap(u_int32_t* value) { + *value = (*value >> 24) | + ((*value >> 8) & 0x0000ff00) | + ((*value << 8) & 0x00ff0000) | + (*value << 24); +} + + +static inline void Swap(u_int64_t* value) { + u_int32_t* value32 = reinterpret_cast(value); + Swap(&value32[0]); + Swap(&value32[1]); + u_int32_t temp = value32[0]; + value32[0] = value32[1]; + value32[1] = temp; +} + + +// Given a pointer to a 128-bit int in the minidump data, set the "low" +// and "high" fields appropriately. +static void Normalize128(u_int128_t* value, bool is_big_endian) { + // The struct format is [high, low], so if the format is big-endian, + // the most significant bytes will already be in the high field. + if (!is_big_endian) { + u_int64_t temp = value->low; + value->low = value->high; + value->high = temp; + } +} + +// This just swaps each int64 half of the 128-bit value. +// The value should also be normalized by calling Normalize128(). +static void Swap(u_int128_t* value) { + Swap(&value->low); + Swap(&value->high); +} + + +static inline void Swap(MDLocationDescriptor* location_descriptor) { + Swap(&location_descriptor->data_size); + Swap(&location_descriptor->rva); +} + + +static inline void Swap(MDMemoryDescriptor* memory_descriptor) { + Swap(&memory_descriptor->start_of_memory_range); + Swap(&memory_descriptor->memory); +} + + +static inline void Swap(MDGUID* guid) { + Swap(&guid->data1); + Swap(&guid->data2); + Swap(&guid->data3); + // Don't swap guid->data4[] because it contains 8-bit quantities. +} + + +// +// Character conversion routines +// + + +// Standard wide-character conversion routines depend on the system's own +// idea of what width a wide character should be: some use 16 bits, and +// some use 32 bits. For the purposes of a minidump, wide strings are +// always represented with 16-bit UTF-16 chracters. iconv isn't available +// everywhere, and its interface varies where it is available. iconv also +// deals purely with char* pointers, so in addition to considering the swap +// parameter, a converter that uses iconv would also need to take the host +// CPU's endianness into consideration. It doesn't seems worth the trouble +// of making it a dependency when we don't care about anything but UTF-16. +static string* UTF16ToUTF8(const vector& in, + bool swap) { + scoped_ptr out(new string()); + + // Set the string's initial capacity to the number of UTF-16 characters, + // because the UTF-8 representation will always be at least this long. + // If the UTF-8 representation is longer, the string will grow dynamically. + out->reserve(in.size()); + + for (vector::const_iterator iterator = in.begin(); + iterator != in.end(); + ++iterator) { + // Get a 16-bit value from the input + u_int16_t in_word = *iterator; + if (swap) + Swap(&in_word); + + // Convert the input value (in_word) into a Unicode code point (unichar). + u_int32_t unichar; + if (in_word >= 0xdc00 && in_word <= 0xdcff) { + BPLOG(ERROR) << "UTF16ToUTF8 found low surrogate " << + HexString(in_word) << " without high"; + return NULL; + } else if (in_word >= 0xd800 && in_word <= 0xdbff) { + // High surrogate. + unichar = (in_word - 0xd7c0) << 10; + if (++iterator == in.end()) { + BPLOG(ERROR) << "UTF16ToUTF8 found high surrogate " << + HexString(in_word) << " at end of string"; + return NULL; + } + u_int32_t high_word = in_word; + in_word = *iterator; + if (in_word < 0xdc00 || in_word > 0xdcff) { + BPLOG(ERROR) << "UTF16ToUTF8 found high surrogate " << + HexString(high_word) << " without low " << + HexString(in_word); + return NULL; + } + unichar |= in_word & 0x03ff; + } else { + // The ordinary case, a single non-surrogate Unicode character encoded + // as a single 16-bit value. + unichar = in_word; + } + + // Convert the Unicode code point (unichar) into its UTF-8 representation, + // appending it to the out string. + if (unichar < 0x80) { + (*out) += unichar; + } else if (unichar < 0x800) { + (*out) += 0xc0 | (unichar >> 6); + (*out) += 0x80 | (unichar & 0x3f); + } else if (unichar < 0x10000) { + (*out) += 0xe0 | (unichar >> 12); + (*out) += 0x80 | ((unichar >> 6) & 0x3f); + (*out) += 0x80 | (unichar & 0x3f); + } else if (unichar < 0x200000) { + (*out) += 0xf0 | (unichar >> 18); + (*out) += 0x80 | ((unichar >> 12) & 0x3f); + (*out) += 0x80 | ((unichar >> 6) & 0x3f); + (*out) += 0x80 | (unichar & 0x3f); + } else { + BPLOG(ERROR) << "UTF16ToUTF8 cannot represent high value " << + HexString(unichar) << " in UTF-8"; + return NULL; + } + } + + return out.release(); +} + + +// +// MinidumpObject +// + + +MinidumpObject::MinidumpObject(Minidump* minidump) + : minidump_(minidump), + valid_(false) { +} + + +// +// MinidumpStream +// + + +MinidumpStream::MinidumpStream(Minidump* minidump) + : MinidumpObject(minidump) { +} + + +// +// MinidumpContext +// + + +MinidumpContext::MinidumpContext(Minidump* minidump) + : MinidumpStream(minidump), + context_flags_(0), + context_() { +} + + +MinidumpContext::~MinidumpContext() { + FreeContext(); +} + + +bool MinidumpContext::Read(u_int32_t expected_size) { + valid_ = false; + + FreeContext(); + + // First, figure out what type of CPU this context structure is for. + // For some reason, the AMD64 Context doesn't have context_flags + // at the beginning of the structure, so special case it here. + if (expected_size == sizeof(MDRawContextAMD64)) { + BPLOG(INFO) << "MinidumpContext: looks like AMD64 context"; + + scoped_ptr context_amd64(new MDRawContextAMD64()); + if (!minidump_->ReadBytes(context_amd64.get(), + sizeof(MDRawContextAMD64))) { + BPLOG(ERROR) << "MinidumpContext could not read amd64 context"; + return false; + } + + if (minidump_->swap()) + Swap(&context_amd64->context_flags); + + u_int32_t cpu_type = context_amd64->context_flags & MD_CONTEXT_CPU_MASK; + + if (cpu_type != MD_CONTEXT_AMD64) { + //TODO: fall through to switch below? + // need a Tell method to be able to SeekSet back to beginning + // http://code.google.com/p/google-breakpad/issues/detail?id=224 + BPLOG(ERROR) << "MinidumpContext not actually amd64 context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext amd64 does not match system info"; + return false; + } + + // Normalize the 128-bit types in the dump. + // Since this is AMD64, by definition, the values are little-endian. + for (unsigned int vr_index = 0; + vr_index < MD_CONTEXT_AMD64_VR_COUNT; + ++vr_index) + Normalize128(&context_amd64->vector_register[vr_index], false); + + if (minidump_->swap()) { + Swap(&context_amd64->p1_home); + Swap(&context_amd64->p2_home); + Swap(&context_amd64->p3_home); + Swap(&context_amd64->p4_home); + Swap(&context_amd64->p5_home); + Swap(&context_amd64->p6_home); + // context_flags is already swapped + Swap(&context_amd64->mx_csr); + Swap(&context_amd64->cs); + Swap(&context_amd64->ds); + Swap(&context_amd64->es); + Swap(&context_amd64->fs); + Swap(&context_amd64->ss); + Swap(&context_amd64->eflags); + Swap(&context_amd64->dr0); + Swap(&context_amd64->dr1); + Swap(&context_amd64->dr2); + Swap(&context_amd64->dr3); + Swap(&context_amd64->dr6); + Swap(&context_amd64->dr7); + Swap(&context_amd64->rax); + Swap(&context_amd64->rcx); + Swap(&context_amd64->rdx); + Swap(&context_amd64->rbx); + Swap(&context_amd64->rsp); + Swap(&context_amd64->rbp); + Swap(&context_amd64->rsi); + Swap(&context_amd64->rdi); + Swap(&context_amd64->r8); + Swap(&context_amd64->r9); + Swap(&context_amd64->r10); + Swap(&context_amd64->r11); + Swap(&context_amd64->r12); + Swap(&context_amd64->r13); + Swap(&context_amd64->r14); + Swap(&context_amd64->r15); + Swap(&context_amd64->rip); + //FIXME: I'm not sure what actually determines + // which member of the union {flt_save, sse_registers} + // is valid. We're not currently using either, + // but it would be good to have them swapped properly. + + for (unsigned int vr_index = 0; + vr_index < MD_CONTEXT_AMD64_VR_COUNT; + ++vr_index) + Swap(&context_amd64->vector_register[vr_index]); + Swap(&context_amd64->vector_control); + Swap(&context_amd64->debug_control); + Swap(&context_amd64->last_branch_to_rip); + Swap(&context_amd64->last_branch_from_rip); + Swap(&context_amd64->last_exception_to_rip); + Swap(&context_amd64->last_exception_from_rip); + } + + context_flags_ = context_amd64->context_flags; + + context_.amd64 = context_amd64.release(); + } + else { + u_int32_t context_flags; + if (!minidump_->ReadBytes(&context_flags, sizeof(context_flags))) { + BPLOG(ERROR) << "MinidumpContext could not read context flags"; + return false; + } + if (minidump_->swap()) + Swap(&context_flags); + + u_int32_t cpu_type = context_flags & MD_CONTEXT_CPU_MASK; + + // Allocate the context structure for the correct CPU and fill it. The + // casts are slightly unorthodox, but it seems better to do that than to + // maintain a separate pointer for each type of CPU context structure + // when only one of them will be used. + switch (cpu_type) { + case MD_CONTEXT_X86: { + if (expected_size != sizeof(MDRawContextX86)) { + BPLOG(ERROR) << "MinidumpContext x86 size mismatch, " << + expected_size << " != " << sizeof(MDRawContextX86); + return false; + } + + scoped_ptr context_x86(new MDRawContextX86()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_x86->context_flags = context_flags; + + size_t flags_size = sizeof(context_x86->context_flags); + u_int8_t* context_after_flags = + reinterpret_cast(context_x86.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextX86) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read x86 context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext x86 does not match system info"; + return false; + } + + if (minidump_->swap()) { + // context_x86->context_flags was already swapped. + Swap(&context_x86->dr0); + Swap(&context_x86->dr1); + Swap(&context_x86->dr2); + Swap(&context_x86->dr3); + Swap(&context_x86->dr6); + Swap(&context_x86->dr7); + Swap(&context_x86->float_save.control_word); + Swap(&context_x86->float_save.status_word); + Swap(&context_x86->float_save.tag_word); + Swap(&context_x86->float_save.error_offset); + Swap(&context_x86->float_save.error_selector); + Swap(&context_x86->float_save.data_offset); + Swap(&context_x86->float_save.data_selector); + // context_x86->float_save.register_area[] contains 8-bit quantities + // and does not need to be swapped. + Swap(&context_x86->float_save.cr0_npx_state); + Swap(&context_x86->gs); + Swap(&context_x86->fs); + Swap(&context_x86->es); + Swap(&context_x86->ds); + Swap(&context_x86->edi); + Swap(&context_x86->esi); + Swap(&context_x86->ebx); + Swap(&context_x86->edx); + Swap(&context_x86->ecx); + Swap(&context_x86->eax); + Swap(&context_x86->ebp); + Swap(&context_x86->eip); + Swap(&context_x86->cs); + Swap(&context_x86->eflags); + Swap(&context_x86->esp); + Swap(&context_x86->ss); + // context_x86->extended_registers[] contains 8-bit quantities and + // does not need to be swapped. + } + + context_.x86 = context_x86.release(); + + break; + } + + case MD_CONTEXT_PPC: { + if (expected_size != sizeof(MDRawContextPPC)) { + BPLOG(ERROR) << "MinidumpContext ppc size mismatch, " << + expected_size << " != " << sizeof(MDRawContextPPC); + return false; + } + + scoped_ptr context_ppc(new MDRawContextPPC()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_ppc->context_flags = context_flags; + + size_t flags_size = sizeof(context_ppc->context_flags); + u_int8_t* context_after_flags = + reinterpret_cast(context_ppc.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextPPC) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read ppc context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext ppc does not match system info"; + return false; + } + + // Normalize the 128-bit types in the dump. + // Since this is PowerPC, by definition, the values are big-endian. + for (unsigned int vr_index = 0; + vr_index < MD_VECTORSAVEAREA_PPC_VR_COUNT; + ++vr_index) { + Normalize128(&context_ppc->vector_save.save_vr[vr_index], true); + } + + if (minidump_->swap()) { + // context_ppc->context_flags was already swapped. + Swap(&context_ppc->srr0); + Swap(&context_ppc->srr1); + for (unsigned int gpr_index = 0; + gpr_index < MD_CONTEXT_PPC_GPR_COUNT; + ++gpr_index) { + Swap(&context_ppc->gpr[gpr_index]); + } + Swap(&context_ppc->cr); + Swap(&context_ppc->xer); + Swap(&context_ppc->lr); + Swap(&context_ppc->ctr); + Swap(&context_ppc->mq); + Swap(&context_ppc->vrsave); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; + ++fpr_index) { + Swap(&context_ppc->float_save.fpregs[fpr_index]); + } + // Don't swap context_ppc->float_save.fpscr_pad because it is only + // used for padding. + Swap(&context_ppc->float_save.fpscr); + for (unsigned int vr_index = 0; + vr_index < MD_VECTORSAVEAREA_PPC_VR_COUNT; + ++vr_index) { + Swap(&context_ppc->vector_save.save_vr[vr_index]); + } + Swap(&context_ppc->vector_save.save_vscr); + // Don't swap the padding fields in vector_save. + Swap(&context_ppc->vector_save.save_vrvalid); + } + + context_.ppc = context_ppc.release(); + + break; + } + + case MD_CONTEXT_SPARC: { + if (expected_size != sizeof(MDRawContextSPARC)) { + BPLOG(ERROR) << "MinidumpContext sparc size mismatch, " << + expected_size << " != " << sizeof(MDRawContextSPARC); + return false; + } + + scoped_ptr context_sparc(new MDRawContextSPARC()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_sparc->context_flags = context_flags; + + size_t flags_size = sizeof(context_sparc->context_flags); + u_int8_t* context_after_flags = + reinterpret_cast(context_sparc.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextSPARC) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read sparc context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext sparc does not match system info"; + return false; + } + + if (minidump_->swap()) { + // context_sparc->context_flags was already swapped. + for (unsigned int gpr_index = 0; + gpr_index < MD_CONTEXT_SPARC_GPR_COUNT; + ++gpr_index) { + Swap(&context_sparc->g_r[gpr_index]); + } + Swap(&context_sparc->ccr); + Swap(&context_sparc->pc); + Swap(&context_sparc->npc); + Swap(&context_sparc->y); + Swap(&context_sparc->asi); + Swap(&context_sparc->fprs); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT; + ++fpr_index) { + Swap(&context_sparc->float_save.regs[fpr_index]); + } + Swap(&context_sparc->float_save.filler); + Swap(&context_sparc->float_save.fsr); + } + context_.ctx_sparc = context_sparc.release(); + + break; + } + + default: { + // Unknown context type + BPLOG(ERROR) << "MinidumpContext unknown context type " << + HexString(cpu_type); + return false; + break; + } + } + context_flags_ = context_flags; + } + + valid_ = true; + return true; +} + + +u_int32_t MinidumpContext::GetContextCPU() const { + if (!valid_) { + // Don't log a message, GetContextCPU can be legitimately called with + // valid_ false by FreeContext, which is called by Read. + return 0; + } + + return context_flags_ & MD_CONTEXT_CPU_MASK; +} + + +const MDRawContextX86* MinidumpContext::GetContextX86() const { + if (GetContextCPU() != MD_CONTEXT_X86) { + BPLOG(ERROR) << "MinidumpContext cannot get x86 context"; + return NULL; + } + + return context_.x86; +} + + +const MDRawContextPPC* MinidumpContext::GetContextPPC() const { + if (GetContextCPU() != MD_CONTEXT_PPC) { + BPLOG(ERROR) << "MinidumpContext cannot get ppc context"; + return NULL; + } + + return context_.ppc; +} + +const MDRawContextAMD64* MinidumpContext::GetContextAMD64() const { + if (GetContextCPU() != MD_CONTEXT_AMD64) { + BPLOG(ERROR) << "MinidumpContext cannot get amd64 context"; + return NULL; + } + + return context_.amd64; +} + +const MDRawContextSPARC* MinidumpContext::GetContextSPARC() const { + if (GetContextCPU() != MD_CONTEXT_SPARC) { + BPLOG(ERROR) << "MinidumpContext cannot get sparc context"; + return NULL; + } + + return context_.ctx_sparc; +} + +void MinidumpContext::FreeContext() { + switch (GetContextCPU()) { + case MD_CONTEXT_X86: + delete context_.x86; + break; + + case MD_CONTEXT_PPC: + delete context_.ppc; + break; + + case MD_CONTEXT_AMD64: + delete context_.amd64; + break; + + case MD_CONTEXT_SPARC: + delete context_.ctx_sparc; + break; + + default: + // There is no context record (valid_ is false) or there's a + // context record for an unknown CPU (shouldn't happen, only known + // records are stored by Read). + break; + } + + context_flags_ = 0; + context_.base = NULL; +} + + +bool MinidumpContext::CheckAgainstSystemInfo(u_int32_t context_cpu_type) { + // It's OK if the minidump doesn't contain an MD_SYSTEM_INFO_STREAM, + // as this function just implements a sanity check. + MinidumpSystemInfo* system_info = minidump_->GetSystemInfo(); + if (!system_info) { + BPLOG(INFO) << "MinidumpContext could not be compared against " + "MinidumpSystemInfo"; + return true; + } + + // If there is an MD_SYSTEM_INFO_STREAM, it should contain valid system info. + const MDRawSystemInfo* raw_system_info = system_info->system_info(); + if (!raw_system_info) { + BPLOG(INFO) << "MinidumpContext could not be compared against " + "MDRawSystemInfo"; + return false; + } + + MDCPUArchitecture system_info_cpu_type = static_cast( + raw_system_info->processor_architecture); + + // Compare the CPU type of the context record to the CPU type in the + // minidump's system info stream. + bool return_value = false; + switch (context_cpu_type) { + case MD_CONTEXT_X86: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_X86 || + system_info_cpu_type == MD_CPU_ARCHITECTURE_X86_WIN64 || + system_info_cpu_type == MD_CPU_ARCHITECTURE_AMD64) { + return_value = true; + } + break; + + case MD_CONTEXT_PPC: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_PPC) + return_value = true; + break; + + case MD_CONTEXT_AMD64: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_AMD64) + return_value = true; + break; + + case MD_CONTEXT_SPARC: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_SPARC) + return_value = true; + break; + } + + BPLOG_IF(ERROR, !return_value) << "MinidumpContext CPU " << + HexString(context_cpu_type) << + " wrong for MinidumpSysmtemInfo CPU " << + HexString(system_info_cpu_type); + + return return_value; +} + + +void MinidumpContext::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpContext cannot print invalid data"; + return; + } + + switch (GetContextCPU()) { + case MD_CONTEXT_X86: { + const MDRawContextX86* context_x86 = GetContextX86(); + printf("MDRawContextX86\n"); + printf(" context_flags = 0x%x\n", + context_x86->context_flags); + printf(" dr0 = 0x%x\n", context_x86->dr0); + printf(" dr1 = 0x%x\n", context_x86->dr1); + printf(" dr2 = 0x%x\n", context_x86->dr2); + printf(" dr3 = 0x%x\n", context_x86->dr3); + printf(" dr6 = 0x%x\n", context_x86->dr6); + printf(" dr7 = 0x%x\n", context_x86->dr7); + printf(" float_save.control_word = 0x%x\n", + context_x86->float_save.control_word); + printf(" float_save.status_word = 0x%x\n", + context_x86->float_save.status_word); + printf(" float_save.tag_word = 0x%x\n", + context_x86->float_save.tag_word); + printf(" float_save.error_offset = 0x%x\n", + context_x86->float_save.error_offset); + printf(" float_save.error_selector = 0x%x\n", + context_x86->float_save.error_selector); + printf(" float_save.data_offset = 0x%x\n", + context_x86->float_save.data_offset); + printf(" float_save.data_selector = 0x%x\n", + context_x86->float_save.data_selector); + printf(" float_save.register_area[%2d] = 0x", + MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE); + for (unsigned int register_index = 0; + register_index < MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE; + ++register_index) { + printf("%02x", context_x86->float_save.register_area[register_index]); + } + printf("\n"); + printf(" float_save.cr0_npx_state = 0x%x\n", + context_x86->float_save.cr0_npx_state); + printf(" gs = 0x%x\n", context_x86->gs); + printf(" fs = 0x%x\n", context_x86->fs); + printf(" es = 0x%x\n", context_x86->es); + printf(" ds = 0x%x\n", context_x86->ds); + printf(" edi = 0x%x\n", context_x86->edi); + printf(" esi = 0x%x\n", context_x86->esi); + printf(" ebx = 0x%x\n", context_x86->ebx); + printf(" edx = 0x%x\n", context_x86->edx); + printf(" ecx = 0x%x\n", context_x86->ecx); + printf(" eax = 0x%x\n", context_x86->eax); + printf(" ebp = 0x%x\n", context_x86->ebp); + printf(" eip = 0x%x\n", context_x86->eip); + printf(" cs = 0x%x\n", context_x86->cs); + printf(" eflags = 0x%x\n", context_x86->eflags); + printf(" esp = 0x%x\n", context_x86->esp); + printf(" ss = 0x%x\n", context_x86->ss); + printf(" extended_registers[%3d] = 0x", + MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE); + for (unsigned int register_index = 0; + register_index < MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE; + ++register_index) { + printf("%02x", context_x86->extended_registers[register_index]); + } + printf("\n\n"); + + break; + } + + case MD_CONTEXT_PPC: { + const MDRawContextPPC* context_ppc = GetContextPPC(); + printf("MDRawContextPPC\n"); + printf(" context_flags = 0x%x\n", + context_ppc->context_flags); + printf(" srr0 = 0x%x\n", context_ppc->srr0); + printf(" srr1 = 0x%x\n", context_ppc->srr1); + for (unsigned int gpr_index = 0; + gpr_index < MD_CONTEXT_PPC_GPR_COUNT; + ++gpr_index) { + printf(" gpr[%2d] = 0x%x\n", + gpr_index, context_ppc->gpr[gpr_index]); + } + printf(" cr = 0x%x\n", context_ppc->cr); + printf(" xer = 0x%x\n", context_ppc->xer); + printf(" lr = 0x%x\n", context_ppc->lr); + printf(" ctr = 0x%x\n", context_ppc->ctr); + printf(" mq = 0x%x\n", context_ppc->mq); + printf(" vrsave = 0x%x\n", context_ppc->vrsave); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; + ++fpr_index) { + printf(" float_save.fpregs[%2d] = 0x%" PRIx64 "\n", + fpr_index, context_ppc->float_save.fpregs[fpr_index]); + } + printf(" float_save.fpscr = 0x%x\n", + context_ppc->float_save.fpscr); + // TODO(mmentovai): print the 128-bit quantities in + // context_ppc->vector_save. This isn't done yet because printf + // doesn't support 128-bit quantities, and printing them using + // PRIx64 as two 64-bit quantities requires knowledge of the CPU's + // byte ordering. + printf(" vector_save.save_vrvalid = 0x%x\n", + context_ppc->vector_save.save_vrvalid); + printf("\n"); + + break; + } + + case MD_CONTEXT_AMD64: { + const MDRawContextAMD64* context_amd64 = GetContextAMD64(); + printf("MDRawContextAMD64\n"); + printf(" p1_home = 0x%" PRIx64 "\n", + context_amd64->p1_home); + printf(" p2_home = 0x%" PRIx64 "\n", + context_amd64->p2_home); + printf(" p3_home = 0x%" PRIx64 "\n", + context_amd64->p3_home); + printf(" p4_home = 0x%" PRIx64 "\n", + context_amd64->p4_home); + printf(" p5_home = 0x%" PRIx64 "\n", + context_amd64->p5_home); + printf(" p6_home = 0x%" PRIx64 "\n", + context_amd64->p6_home); + printf(" context_flags = 0x%x\n", + context_amd64->context_flags); + printf(" mx_csr = 0x%x\n", + context_amd64->mx_csr); + printf(" cs = 0x%x\n", context_amd64->cs); + printf(" ds = 0x%x\n", context_amd64->ds); + printf(" es = 0x%x\n", context_amd64->es); + printf(" fs = 0x%x\n", context_amd64->fs); + printf(" gs = 0x%x\n", context_amd64->gs); + printf(" ss = 0x%x\n", context_amd64->ss); + printf(" eflags = 0x%x\n", context_amd64->eflags); + printf(" dr0 = 0x%" PRIx64 "\n", context_amd64->dr0); + printf(" dr1 = 0x%" PRIx64 "\n", context_amd64->dr1); + printf(" dr2 = 0x%" PRIx64 "\n", context_amd64->dr2); + printf(" dr3 = 0x%" PRIx64 "\n", context_amd64->dr3); + printf(" dr6 = 0x%" PRIx64 "\n", context_amd64->dr6); + printf(" dr7 = 0x%" PRIx64 "\n", context_amd64->dr7); + printf(" rax = 0x%" PRIx64 "\n", context_amd64->rax); + printf(" rcx = 0x%" PRIx64 "\n", context_amd64->rcx); + printf(" rdx = 0x%" PRIx64 "\n", context_amd64->rdx); + printf(" rbx = 0x%" PRIx64 "\n", context_amd64->rbx); + printf(" rsp = 0x%" PRIx64 "\n", context_amd64->rsp); + printf(" rbp = 0x%" PRIx64 "\n", context_amd64->rbp); + printf(" rsi = 0x%" PRIx64 "\n", context_amd64->rsi); + printf(" rdi = 0x%" PRIx64 "\n", context_amd64->rdi); + printf(" r8 = 0x%" PRIx64 "\n", context_amd64->r8); + printf(" r9 = 0x%" PRIx64 "\n", context_amd64->r9); + printf(" r10 = 0x%" PRIx64 "\n", context_amd64->r10); + printf(" r11 = 0x%" PRIx64 "\n", context_amd64->r11); + printf(" r12 = 0x%" PRIx64 "\n", context_amd64->r12); + printf(" r13 = 0x%" PRIx64 "\n", context_amd64->r13); + printf(" r14 = 0x%" PRIx64 "\n", context_amd64->r14); + printf(" r15 = 0x%" PRIx64 "\n", context_amd64->r15); + printf(" rip = 0x%" PRIx64 "\n", context_amd64->rip); + //TODO: print xmm, vector, debug registers + printf("\n"); + break; + } + + case MD_CONTEXT_SPARC: { + const MDRawContextSPARC* context_sparc = GetContextSPARC(); + printf("MDRawContextSPARC\n"); + printf(" context_flags = 0x%x\n", + context_sparc->context_flags); + for (unsigned int g_r_index = 0; + g_r_index < MD_CONTEXT_SPARC_GPR_COUNT; + ++g_r_index) { + printf(" g_r[%2d] = 0x%" PRIx64 "\n", + g_r_index, context_sparc->g_r[g_r_index]); + } + printf(" ccr = 0x%" PRIx64 "\n", context_sparc->ccr); + printf(" pc = 0x%" PRIx64 "\n", context_sparc->pc); + printf(" npc = 0x%" PRIx64 "\n", context_sparc->npc); + printf(" y = 0x%" PRIx64 "\n", context_sparc->y); + printf(" asi = 0x%" PRIx64 "\n", context_sparc->asi); + printf(" fprs = 0x%" PRIx64 "\n", context_sparc->fprs); + + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT; + ++fpr_index) { + printf(" float_save.regs[%2d] = 0x%" PRIx64 "\n", + fpr_index, context_sparc->float_save.regs[fpr_index]); + } + printf(" float_save.filler = 0x%" PRIx64 "\n", + context_sparc->float_save.filler); + printf(" float_save.fsr = 0x%" PRIx64 "\n", + context_sparc->float_save.fsr); + break; + } + + default: { + break; + } + } +} + + +// +// MinidumpMemoryRegion +// + + +u_int32_t MinidumpMemoryRegion::max_bytes_ = 1024 * 1024; // 1MB + + +MinidumpMemoryRegion::MinidumpMemoryRegion(Minidump* minidump) + : MinidumpObject(minidump), + descriptor_(NULL), + memory_(NULL) { +} + + +MinidumpMemoryRegion::~MinidumpMemoryRegion() { + delete memory_; +} + + +void MinidumpMemoryRegion::SetDescriptor(MDMemoryDescriptor* descriptor) { + descriptor_ = descriptor; + valid_ = descriptor && + descriptor_->memory.data_size <= + numeric_limits::max() - + descriptor_->start_of_memory_range; +} + + +const u_int8_t* MinidumpMemoryRegion::GetMemory() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetMemory"; + return NULL; + } + + if (!memory_) { + if (descriptor_->memory.data_size == 0) { + BPLOG(ERROR) << "MinidumpMemoryRegion is empty"; + return NULL; + } + + if (!minidump_->SeekSet(descriptor_->memory.rva)) { + BPLOG(ERROR) << "MinidumpMemoryRegion could not seek to memory region"; + return NULL; + } + + if (descriptor_->memory.data_size > max_bytes_) { + BPLOG(ERROR) << "MinidumpMemoryRegion size " << + descriptor_->memory.data_size << " exceeds maximum " << + max_bytes_; + return NULL; + } + + scoped_ptr< vector > memory( + new vector(descriptor_->memory.data_size)); + + if (!minidump_->ReadBytes(&(*memory)[0], descriptor_->memory.data_size)) { + BPLOG(ERROR) << "MinidumpMemoryRegion could not read memory region"; + return NULL; + } + + memory_ = memory.release(); + } + + return &(*memory_)[0]; +} + + +u_int64_t MinidumpMemoryRegion::GetBase() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetBase"; + return static_cast(-1); + } + + return descriptor_->start_of_memory_range; +} + + +u_int32_t MinidumpMemoryRegion::GetSize() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetSize"; + return 0; + } + + return descriptor_->memory.data_size; +} + + +void MinidumpMemoryRegion::FreeMemory() { + delete memory_; + memory_ = NULL; +} + + +template +bool MinidumpMemoryRegion::GetMemoryAtAddressInternal(u_int64_t address, + T* value) { + BPLOG_IF(ERROR, !value) << "MinidumpMemoryRegion::GetMemoryAtAddressInternal " + "requires |value|"; + assert(value); + *value = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for " + "GetMemoryAtAddressInternal"; + return false; + } + + if (address < descriptor_->start_of_memory_range || + sizeof(T) > numeric_limits::max() - address || + address + sizeof(T) > descriptor_->start_of_memory_range + + descriptor_->memory.data_size) { + BPLOG(ERROR) << "MinidumpMemoryRegion request out of range: " << + HexString(address) << "+" << sizeof(T) << "/" << + HexString(descriptor_->start_of_memory_range) << "+" << + HexString(descriptor_->memory.data_size); + return false; + } + + const u_int8_t* memory = GetMemory(); + if (!memory) { + // GetMemory already logged a perfectly good message. + return false; + } + + // If the CPU requires memory accesses to be aligned, this can crash. + // x86 and ppc are able to cope, though. + *value = *reinterpret_cast( + &memory[address - descriptor_->start_of_memory_range]); + + if (minidump_->swap()) + Swap(value); + + return true; +} + + +bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address, + u_int8_t* value) { + return GetMemoryAtAddressInternal(address, value); +} + + +bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address, + u_int16_t* value) { + return GetMemoryAtAddressInternal(address, value); +} + + +bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address, + u_int32_t* value) { + return GetMemoryAtAddressInternal(address, value); +} + + +bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address, + u_int64_t* value) { + return GetMemoryAtAddressInternal(address, value); +} + + +void MinidumpMemoryRegion::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpMemoryRegion cannot print invalid data"; + return; + } + + const u_int8_t* memory = GetMemory(); + if (memory) { + printf("0x"); + for (unsigned int byte_index = 0; + byte_index < descriptor_->memory.data_size; + byte_index++) { + printf("%02x", memory[byte_index]); + } + printf("\n"); + } else { + printf("No memory\n"); + } +} + + +// +// MinidumpThread +// + + +MinidumpThread::MinidumpThread(Minidump* minidump) + : MinidumpObject(minidump), + thread_(), + memory_(NULL), + context_(NULL) { +} + + +MinidumpThread::~MinidumpThread() { + delete memory_; + delete context_; +} + + +bool MinidumpThread::Read() { + // Invalidate cached data. + delete memory_; + memory_ = NULL; + delete context_; + context_ = NULL; + + valid_ = false; + + if (!minidump_->ReadBytes(&thread_, sizeof(thread_))) { + BPLOG(ERROR) << "MinidumpThread cannot read thread"; + return false; + } + + if (minidump_->swap()) { + Swap(&thread_.thread_id); + Swap(&thread_.suspend_count); + Swap(&thread_.priority_class); + Swap(&thread_.priority); + Swap(&thread_.teb); + Swap(&thread_.stack); + Swap(&thread_.thread_context); + } + + // Check for base + size overflow or undersize. + if (thread_.stack.memory.data_size == 0 || + thread_.stack.memory.data_size > numeric_limits::max() - + thread_.stack.start_of_memory_range) { + BPLOG(ERROR) << "MinidumpThread has a memory region problem, " << + HexString(thread_.stack.start_of_memory_range) << "+" << + HexString(thread_.stack.memory.data_size); + return false; + } + + memory_ = new MinidumpMemoryRegion(minidump_); + memory_->SetDescriptor(&thread_.stack); + + valid_ = true; + return true; +} + + +MinidumpMemoryRegion* MinidumpThread::GetMemory() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThread for GetMemory"; + return NULL; + } + + return memory_; +} + + +MinidumpContext* MinidumpThread::GetContext() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThread for GetContext"; + return NULL; + } + + if (!context_) { + if (!minidump_->SeekSet(thread_.thread_context.rva)) { + BPLOG(ERROR) << "MinidumpThread cannot seek to context"; + return NULL; + } + + scoped_ptr context(new MinidumpContext(minidump_)); + + if (!context->Read(thread_.thread_context.data_size)) { + BPLOG(ERROR) << "MinidumpThread cannot read context"; + return NULL; + } + + context_ = context.release(); + } + + return context_; +} + + +bool MinidumpThread::GetThreadID(u_int32_t *thread_id) const { + BPLOG_IF(ERROR, !thread_id) << "MinidumpThread::GetThreadID requires " + "|thread_id|"; + assert(thread_id); + *thread_id = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThread for GetThreadID"; + return false; + } + + *thread_id = thread_.thread_id; + return true; +} + + +void MinidumpThread::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpThread cannot print invalid data"; + return; + } + + printf("MDRawThread\n"); + printf(" thread_id = 0x%x\n", thread_.thread_id); + printf(" suspend_count = %d\n", thread_.suspend_count); + printf(" priority_class = 0x%x\n", thread_.priority_class); + printf(" priority = 0x%x\n", thread_.priority); + printf(" teb = 0x%" PRIx64 "\n", thread_.teb); + printf(" stack.start_of_memory_range = 0x%" PRIx64 "\n", + thread_.stack.start_of_memory_range); + printf(" stack.memory.data_size = 0x%x\n", + thread_.stack.memory.data_size); + printf(" stack.memory.rva = 0x%x\n", thread_.stack.memory.rva); + printf(" thread_context.data_size = 0x%x\n", + thread_.thread_context.data_size); + printf(" thread_context.rva = 0x%x\n", + thread_.thread_context.rva); + + MinidumpContext* context = GetContext(); + if (context) { + printf("\n"); + context->Print(); + } else { + printf(" (no context)\n"); + printf("\n"); + } + + MinidumpMemoryRegion* memory = GetMemory(); + if (memory) { + printf("Stack\n"); + memory->Print(); + } else { + printf("No stack\n"); + } + printf("\n"); +} + + +// +// MinidumpThreadList +// + + +u_int32_t MinidumpThreadList::max_threads_ = 256; + + +MinidumpThreadList::MinidumpThreadList(Minidump* minidump) + : MinidumpStream(minidump), + id_to_thread_map_(), + threads_(NULL), + thread_count_(0) { +} + + +MinidumpThreadList::~MinidumpThreadList() { + delete threads_; +} + + +bool MinidumpThreadList::Read(u_int32_t expected_size) { + // Invalidate cached data. + id_to_thread_map_.clear(); + delete threads_; + threads_ = NULL; + thread_count_ = 0; + + valid_ = false; + + u_int32_t thread_count; + if (expected_size < sizeof(thread_count)) { + BPLOG(ERROR) << "MinidumpThreadList count size mismatch, " << + expected_size << " < " << sizeof(thread_count); + return false; + } + if (!minidump_->ReadBytes(&thread_count, sizeof(thread_count))) { + BPLOG(ERROR) << "MinidumpThreadList cannot read thread count"; + return false; + } + + if (minidump_->swap()) + Swap(&thread_count); + + if (thread_count > numeric_limits::max() / sizeof(MDRawThread)) { + BPLOG(ERROR) << "MinidumpThreadList thread count " << thread_count << + " would cause multiplication overflow"; + return false; + } + + if (expected_size != sizeof(thread_count) + + thread_count * sizeof(MDRawThread)) { + // may be padded with 4 bytes on 64bit ABIs for alignment + if (expected_size == sizeof(thread_count) + 4 + + thread_count * sizeof(MDRawThread)) { + u_int32_t useless; + if (!minidump_->ReadBytes(&useless, 4)) { + BPLOG(ERROR) << "MinidumpThreadList cannot read threadlist padded bytes"; + return false; + } + } else { + BPLOG(ERROR) << "MinidumpThreadList size mismatch, " << expected_size << + " != " << sizeof(thread_count) + + thread_count * sizeof(MDRawThread); + return false; + } + } + + + if (thread_count > max_threads_) { + BPLOG(ERROR) << "MinidumpThreadList count " << thread_count << + " exceeds maximum " << max_threads_; + return false; + } + + if (thread_count != 0) { + scoped_ptr threads( + new MinidumpThreads(thread_count, MinidumpThread(minidump_))); + + for (unsigned int thread_index = 0; + thread_index < thread_count; + ++thread_index) { + MinidumpThread* thread = &(*threads)[thread_index]; + + // Assume that the file offset is correct after the last read. + if (!thread->Read()) { + BPLOG(ERROR) << "MinidumpThreadList cannot read thread " << + thread_index << "/" << thread_count; + return false; + } + + u_int32_t thread_id; + if (!thread->GetThreadID(&thread_id)) { + BPLOG(ERROR) << "MinidumpThreadList cannot get thread ID for thread " << + thread_index << "/" << thread_count; + return false; + } + + if (GetThreadByID(thread_id)) { + // Another thread with this ID is already in the list. Data error. + BPLOG(ERROR) << "MinidumpThreadList found multiple threads with ID " << + HexString(thread_id) << " at thread " << + thread_index << "/" << thread_count; + return false; + } + id_to_thread_map_[thread_id] = thread; + } + + threads_ = threads.release(); + } + + thread_count_ = thread_count; + + valid_ = true; + return true; +} + + +MinidumpThread* MinidumpThreadList::GetThreadAtIndex(unsigned int index) + const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThreadList for GetThreadAtIndex"; + return NULL; + } + + if (index >= thread_count_) { + BPLOG(ERROR) << "MinidumpThreadList index out of range: " << + index << "/" << thread_count_; + return NULL; + } + + return &(*threads_)[index]; +} + + +MinidumpThread* MinidumpThreadList::GetThreadByID(u_int32_t thread_id) { + // Don't check valid_. Read calls this method before everything is + // validated. It is safe to not check valid_ here. + return id_to_thread_map_[thread_id]; +} + + +void MinidumpThreadList::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpThreadList cannot print invalid data"; + return; + } + + printf("MinidumpThreadList\n"); + printf(" thread_count = %d\n", thread_count_); + printf("\n"); + + for (unsigned int thread_index = 0; + thread_index < thread_count_; + ++thread_index) { + printf("thread[%d]\n", thread_index); + + (*threads_)[thread_index].Print(); + } +} + + +// +// MinidumpModule +// + + +u_int32_t MinidumpModule::max_cv_bytes_ = 1024; +u_int32_t MinidumpModule::max_misc_bytes_ = 1024; + + +MinidumpModule::MinidumpModule(Minidump* minidump) + : MinidumpObject(minidump), + module_valid_(false), + has_debug_info_(false), + module_(), + name_(NULL), + cv_record_(NULL), + cv_record_signature_(MD_CVINFOUNKNOWN_SIGNATURE), + misc_record_(NULL) { +} + + +MinidumpModule::~MinidumpModule() { + delete name_; + delete cv_record_; + delete misc_record_; +} + + +bool MinidumpModule::Read() { + // Invalidate cached data. + delete name_; + name_ = NULL; + delete cv_record_; + cv_record_ = NULL; + cv_record_signature_ = MD_CVINFOUNKNOWN_SIGNATURE; + delete misc_record_; + misc_record_ = NULL; + + module_valid_ = false; + has_debug_info_ = false; + valid_ = false; + + if (!minidump_->ReadBytes(&module_, MD_MODULE_SIZE)) { + BPLOG(ERROR) << "MinidumpModule cannot read module"; + return false; + } + + if (minidump_->swap()) { + Swap(&module_.base_of_image); + Swap(&module_.size_of_image); + Swap(&module_.checksum); + Swap(&module_.time_date_stamp); + Swap(&module_.module_name_rva); + Swap(&module_.version_info.signature); + Swap(&module_.version_info.struct_version); + Swap(&module_.version_info.file_version_hi); + Swap(&module_.version_info.file_version_lo); + Swap(&module_.version_info.product_version_hi); + Swap(&module_.version_info.product_version_lo); + Swap(&module_.version_info.file_flags_mask); + Swap(&module_.version_info.file_flags); + Swap(&module_.version_info.file_os); + Swap(&module_.version_info.file_type); + Swap(&module_.version_info.file_subtype); + Swap(&module_.version_info.file_date_hi); + Swap(&module_.version_info.file_date_lo); + Swap(&module_.cv_record); + Swap(&module_.misc_record); + // Don't swap reserved fields because their contents are unknown (as + // are their proper widths). + } + + // Check for base + size overflow or undersize. + if (module_.size_of_image == 0 || + module_.size_of_image > + numeric_limits::max() - module_.base_of_image) { + BPLOG(ERROR) << "MinidumpModule has a module problem, " << + HexString(module_.base_of_image) << "+" << + HexString(module_.size_of_image); + return false; + } + + module_valid_ = true; + return true; +} + + +bool MinidumpModule::ReadAuxiliaryData() { + if (!module_valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for ReadAuxiliaryData"; + return false; + } + + // Each module must have a name. + name_ = minidump_->ReadString(module_.module_name_rva); + if (!name_) { + BPLOG(ERROR) << "MinidumpModule could not read name"; + return false; + } + + // At this point, we have enough info for the module to be valid. + valid_ = true; + + // CodeView and miscellaneous debug records are only required if the + // module indicates that they exist. + if (module_.cv_record.data_size && !GetCVRecord(NULL)) { + BPLOG(ERROR) << "MinidumpModule has no CodeView record, " + "but one was expected"; + return false; + } + + if (module_.misc_record.data_size && !GetMiscRecord(NULL)) { + BPLOG(ERROR) << "MinidumpModule has no miscellaneous debug record, " + "but one was expected"; + return false; + } + + has_debug_info_ = true; + return true; +} + + +string MinidumpModule::code_file() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for code_file"; + return ""; + } + + return *name_; +} + + +string MinidumpModule::code_identifier() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for code_identifier"; + return ""; + } + + if (!has_debug_info_) + return ""; + + MinidumpSystemInfo *minidump_system_info = minidump_->GetSystemInfo(); + if (!minidump_system_info) { + BPLOG(ERROR) << "MinidumpModule code_identifier requires " + "MinidumpSystemInfo"; + return ""; + } + + const MDRawSystemInfo *raw_system_info = minidump_system_info->system_info(); + if (!raw_system_info) { + BPLOG(ERROR) << "MinidumpModule code_identifier requires MDRawSystemInfo"; + return ""; + } + + string identifier; + + switch (raw_system_info->platform_id) { + case MD_OS_WIN32_NT: + case MD_OS_WIN32_WINDOWS: { + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + char identifier_string[17]; + snprintf(identifier_string, sizeof(identifier_string), "%08X%x", + module_.time_date_stamp, module_.size_of_image); + identifier = identifier_string; + break; + } + + case MD_OS_MAC_OS_X: + case MD_OS_SOLARIS: + case MD_OS_LINUX: { + // TODO(mmentovai): support uuid extension if present, otherwise fall + // back to version (from LC_ID_DYLIB?), otherwise fall back to something + // else. + identifier = "id"; + break; + } + + default: { + // Without knowing what OS generated the dump, we can't generate a good + // identifier. Return an empty string, signalling failure. + BPLOG(ERROR) << "MinidumpModule code_identifier requires known platform, " + "found " << HexString(raw_system_info->platform_id); + break; + } + } + + return identifier; +} + + +string MinidumpModule::debug_file() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for debug_file"; + return ""; + } + + if (!has_debug_info_) + return ""; + + string file; + // Prefer the CodeView record if present. + if (cv_record_) { + if (cv_record_signature_ == MD_CVINFOPDB70_SIGNATURE) { + // It's actually an MDCVInfoPDB70 structure. + const MDCVInfoPDB70* cv_record_70 = + reinterpret_cast(&(*cv_record_)[0]); + assert(cv_record_70->cv_signature == MD_CVINFOPDB70_SIGNATURE); + + // GetCVRecord guarantees pdb_file_name is null-terminated. + file = reinterpret_cast(cv_record_70->pdb_file_name); + } else if (cv_record_signature_ == MD_CVINFOPDB20_SIGNATURE) { + // It's actually an MDCVInfoPDB20 structure. + const MDCVInfoPDB20* cv_record_20 = + reinterpret_cast(&(*cv_record_)[0]); + assert(cv_record_20->cv_header.signature == MD_CVINFOPDB20_SIGNATURE); + + // GetCVRecord guarantees pdb_file_name is null-terminated. + file = reinterpret_cast(cv_record_20->pdb_file_name); + } + + // If there's a CodeView record but it doesn't match a known signature, + // try the miscellaneous record. + } + + if (file.empty()) { + // No usable CodeView record. Try the miscellaneous debug record. + if (misc_record_) { + const MDImageDebugMisc* misc_record = + reinterpret_cast(&(*misc_record_)[0]); + if (!misc_record->unicode) { + // If it's not Unicode, just stuff it into the string. It's unclear + // if misc_record->data is 0-terminated, so use an explicit size. + file = string( + reinterpret_cast(misc_record->data), + module_.misc_record.data_size - MDImageDebugMisc_minsize); + } else { + // There's a misc_record but it encodes the debug filename in UTF-16. + // (Actually, because miscellaneous records are so old, it's probably + // UCS-2.) Convert it to UTF-8 for congruity with the other strings + // that this method (and all other methods in the Minidump family) + // return. + + unsigned int bytes = + module_.misc_record.data_size - MDImageDebugMisc_minsize; + if (bytes % 2 == 0) { + unsigned int utf16_words = bytes / 2; + + // UTF16ToUTF8 expects a vector, so create a temporary one + // and copy the UTF-16 data into it. + vector string_utf16(utf16_words); + if (utf16_words) + memcpy(&string_utf16[0], &misc_record->data, bytes); + + // GetMiscRecord already byte-swapped the data[] field if it contains + // UTF-16, so pass false as the swap argument. + scoped_ptr new_file(UTF16ToUTF8(string_utf16, false)); + file = *new_file; + } + } + } + } + + BPLOG_IF(ERROR, file.empty()) << "MinidumpModule could not determine " + "debug_file for " << *name_; + + return file; +} + + +string MinidumpModule::debug_identifier() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for debug_identifier"; + return ""; + } + + if (!has_debug_info_) + return ""; + + string identifier; + + // Use the CodeView record if present. + if (cv_record_) { + if (cv_record_signature_ == MD_CVINFOPDB70_SIGNATURE) { + // It's actually an MDCVInfoPDB70 structure. + const MDCVInfoPDB70* cv_record_70 = + reinterpret_cast(&(*cv_record_)[0]); + assert(cv_record_70->cv_signature == MD_CVINFOPDB70_SIGNATURE); + + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + char identifier_string[41]; + snprintf(identifier_string, sizeof(identifier_string), + "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%x", + cv_record_70->signature.data1, + cv_record_70->signature.data2, + cv_record_70->signature.data3, + cv_record_70->signature.data4[0], + cv_record_70->signature.data4[1], + cv_record_70->signature.data4[2], + cv_record_70->signature.data4[3], + cv_record_70->signature.data4[4], + cv_record_70->signature.data4[5], + cv_record_70->signature.data4[6], + cv_record_70->signature.data4[7], + cv_record_70->age); + identifier = identifier_string; + } else if (cv_record_signature_ == MD_CVINFOPDB20_SIGNATURE) { + // It's actually an MDCVInfoPDB20 structure. + const MDCVInfoPDB20* cv_record_20 = + reinterpret_cast(&(*cv_record_)[0]); + assert(cv_record_20->cv_header.signature == MD_CVINFOPDB20_SIGNATURE); + + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + char identifier_string[17]; + snprintf(identifier_string, sizeof(identifier_string), + "%08X%x", cv_record_20->signature, cv_record_20->age); + identifier = identifier_string; + } + } + + // TODO(mmentovai): if there's no usable CodeView record, there might be a + // miscellaneous debug record. It only carries a filename, though, and no + // identifier. I'm not sure what the right thing to do for the identifier + // is in that case, but I don't expect to find many modules without a + // CodeView record (or some other Breakpad extension structure in place of + // a CodeView record). Treat it as an error (empty identifier) for now. + + // TODO(mmentovai): on the Mac, provide fallbacks as in code_identifier(). + + BPLOG_IF(ERROR, identifier.empty()) << "MinidumpModule could not determine " + "debug_identifier for " << *name_; + + return identifier; +} + + +string MinidumpModule::version() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for version"; + return ""; + } + + string version; + + if (module_.version_info.signature == MD_VSFIXEDFILEINFO_SIGNATURE && + module_.version_info.struct_version & MD_VSFIXEDFILEINFO_VERSION && + (module_.version_info.file_version_hi != 0 || module_.version_info.file_version_lo != 0)) { + char version_string[24]; + snprintf(version_string, sizeof(version_string), "%u.%u.%u.%u", + module_.version_info.file_version_hi >> 16, + module_.version_info.file_version_hi & 0xffff, + module_.version_info.file_version_lo >> 16, + module_.version_info.file_version_lo & 0xffff); + version = version_string; + } + + // TODO(mmentovai): possibly support other struct types in place of + // the one used with MD_VSFIXEDFILEINFO_SIGNATURE. We can possibly use + // a different structure that better represents versioning facilities on + // Mac OS X and Linux, instead of forcing them to adhere to the dotted + // quad of 16-bit ints that Windows uses. + + BPLOG_IF(INFO, version.empty()) << "MinidumpModule could not determine " + "version for " << *name_; + + return version; +} + + +const CodeModule* MinidumpModule::Copy() const { + return new BasicCodeModule(this); +} + + +const u_int8_t* MinidumpModule::GetCVRecord(u_int32_t* size) { + if (!module_valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for GetCVRecord"; + return NULL; + } + + if (!cv_record_) { + // This just guards against 0-sized CodeView records; more specific checks + // are used when the signature is checked against various structure types. + if (module_.cv_record.data_size == 0) { + return NULL; + } + + if (!minidump_->SeekSet(module_.cv_record.rva)) { + BPLOG(ERROR) << "MinidumpModule could not seek to CodeView record"; + return NULL; + } + + if (module_.cv_record.data_size > max_cv_bytes_) { + BPLOG(ERROR) << "MinidumpModule CodeView record size " << + module_.cv_record.data_size << " exceeds maximum " << + max_cv_bytes_; + return NULL; + } + + // Allocating something that will be accessed as MDCVInfoPDB70 or + // MDCVInfoPDB20 but is allocated as u_int8_t[] can cause alignment + // problems. x86 and ppc are able to cope, though. This allocation + // style is needed because the MDCVInfoPDB70 or MDCVInfoPDB20 are + // variable-sized due to their pdb_file_name fields; these structures + // are not MDCVInfoPDB70_minsize or MDCVInfoPDB20_minsize and treating + // them as such would result in incomplete structures or overruns. + scoped_ptr< vector > cv_record( + new vector(module_.cv_record.data_size)); + + if (!minidump_->ReadBytes(&(*cv_record)[0], module_.cv_record.data_size)) { + BPLOG(ERROR) << "MinidumpModule could not read CodeView record"; + return NULL; + } + + u_int32_t signature = MD_CVINFOUNKNOWN_SIGNATURE; + if (module_.cv_record.data_size > sizeof(signature)) { + MDCVInfoPDB70* cv_record_signature = + reinterpret_cast(&(*cv_record)[0]); + signature = cv_record_signature->cv_signature; + if (minidump_->swap()) + Swap(&signature); + } + + if (signature == MD_CVINFOPDB70_SIGNATURE) { + // Now that the structure type is known, recheck the size. + if (MDCVInfoPDB70_minsize > module_.cv_record.data_size) { + BPLOG(ERROR) << "MinidumpModule CodeView7 record size mismatch, " << + MDCVInfoPDB70_minsize << " > " << + module_.cv_record.data_size; + return NULL; + } + + if (minidump_->swap()) { + MDCVInfoPDB70* cv_record_70 = + reinterpret_cast(&(*cv_record)[0]); + Swap(&cv_record_70->cv_signature); + Swap(&cv_record_70->signature); + Swap(&cv_record_70->age); + // Don't swap cv_record_70.pdb_file_name because it's an array of 8-bit + // quantities. (It's a path, is it UTF-8?) + } + + // The last field of either structure is null-terminated 8-bit character + // data. Ensure that it's null-terminated. + if ((*cv_record)[module_.cv_record.data_size - 1] != '\0') { + BPLOG(ERROR) << "MinidumpModule CodeView7 record string is not " + "0-terminated"; + return NULL; + } + } else if (signature == MD_CVINFOPDB20_SIGNATURE) { + // Now that the structure type is known, recheck the size. + if (MDCVInfoPDB20_minsize > module_.cv_record.data_size) { + BPLOG(ERROR) << "MinidumpModule CodeView2 record size mismatch, " << + MDCVInfoPDB20_minsize << " > " << + module_.cv_record.data_size; + return NULL; + } + if (minidump_->swap()) { + MDCVInfoPDB20* cv_record_20 = + reinterpret_cast(&(*cv_record)[0]); + Swap(&cv_record_20->cv_header.signature); + Swap(&cv_record_20->cv_header.offset); + Swap(&cv_record_20->signature); + Swap(&cv_record_20->age); + // Don't swap cv_record_20.pdb_file_name because it's an array of 8-bit + // quantities. (It's a path, is it UTF-8?) + } + + // The last field of either structure is null-terminated 8-bit character + // data. Ensure that it's null-terminated. + if ((*cv_record)[module_.cv_record.data_size - 1] != '\0') { + BPLOG(ERROR) << "MindumpModule CodeView2 record string is not " + "0-terminated"; + return NULL; + } + } + + // If the signature doesn't match something above, it's not something + // that Breakpad can presently handle directly. Because some modules in + // the wild contain such CodeView records as MD_CVINFOCV50_SIGNATURE, + // don't bail out here - allow the data to be returned to the user, + // although byte-swapping can't be done. + + // Store the vector type because that's how storage was allocated, but + // return it casted to u_int8_t*. + cv_record_ = cv_record.release(); + cv_record_signature_ = signature; + } + + if (size) + *size = module_.cv_record.data_size; + + return &(*cv_record_)[0]; +} + + +const MDImageDebugMisc* MinidumpModule::GetMiscRecord(u_int32_t* size) { + if (!module_valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for GetMiscRecord"; + return NULL; + } + + if (!misc_record_) { + if (module_.misc_record.data_size == 0) { + return NULL; + } + + if (MDImageDebugMisc_minsize > module_.misc_record.data_size) { + BPLOG(ERROR) << "MinidumpModule miscellaneous debugging record " + "size mismatch, " << MDImageDebugMisc_minsize << " > " << + module_.misc_record.data_size; + return NULL; + } + + if (!minidump_->SeekSet(module_.misc_record.rva)) { + BPLOG(ERROR) << "MinidumpModule could not seek to miscellaneous " + "debugging record"; + return NULL; + } + + if (module_.misc_record.data_size > max_misc_bytes_) { + BPLOG(ERROR) << "MinidumpModule miscellaneous debugging record size " << + module_.misc_record.data_size << " exceeds maximum " << + max_misc_bytes_; + return NULL; + } + + // Allocating something that will be accessed as MDImageDebugMisc but + // is allocated as u_int8_t[] can cause alignment problems. x86 and + // ppc are able to cope, though. This allocation style is needed + // because the MDImageDebugMisc is variable-sized due to its data field; + // this structure is not MDImageDebugMisc_minsize and treating it as such + // would result in an incomplete structure or an overrun. + scoped_ptr< vector > misc_record_mem( + new vector(module_.misc_record.data_size)); + MDImageDebugMisc* misc_record = + reinterpret_cast(&(*misc_record_mem)[0]); + + if (!minidump_->ReadBytes(misc_record, module_.misc_record.data_size)) { + BPLOG(ERROR) << "MinidumpModule could not read miscellaneous debugging " + "record"; + return NULL; + } + + if (minidump_->swap()) { + Swap(&misc_record->data_type); + Swap(&misc_record->length); + // Don't swap misc_record.unicode because it's an 8-bit quantity. + // Don't swap the reserved fields for the same reason, and because + // they don't contain any valid data. + if (misc_record->unicode) { + // There is a potential alignment problem, but shouldn't be a problem + // in practice due to the layout of MDImageDebugMisc. + u_int16_t* data16 = reinterpret_cast(&(misc_record->data)); + unsigned int dataBytes = module_.misc_record.data_size - + MDImageDebugMisc_minsize; + unsigned int dataLength = dataBytes / 2; + for (unsigned int characterIndex = 0; + characterIndex < dataLength; + ++characterIndex) { + Swap(&data16[characterIndex]); + } + } + } + + if (module_.misc_record.data_size != misc_record->length) { + BPLOG(ERROR) << "MinidumpModule miscellaneous debugging record data " + "size mismatch, " << module_.misc_record.data_size << + " != " << misc_record->length; + return NULL; + } + + // Store the vector type because that's how storage was allocated, but + // return it casted to MDImageDebugMisc*. + misc_record_ = misc_record_mem.release(); + } + + if (size) + *size = module_.misc_record.data_size; + + return reinterpret_cast(&(*misc_record_)[0]); +} + + +void MinidumpModule::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpModule cannot print invalid data"; + return; + } + + printf("MDRawModule\n"); + printf(" base_of_image = 0x%" PRIx64 "\n", + module_.base_of_image); + printf(" size_of_image = 0x%x\n", + module_.size_of_image); + printf(" checksum = 0x%x\n", + module_.checksum); + printf(" time_date_stamp = 0x%x\n", + module_.time_date_stamp); + printf(" module_name_rva = 0x%x\n", + module_.module_name_rva); + printf(" version_info.signature = 0x%x\n", + module_.version_info.signature); + printf(" version_info.struct_version = 0x%x\n", + module_.version_info.struct_version); + printf(" version_info.file_version = 0x%x:0x%x\n", + module_.version_info.file_version_hi, + module_.version_info.file_version_lo); + printf(" version_info.product_version = 0x%x:0x%x\n", + module_.version_info.product_version_hi, + module_.version_info.product_version_lo); + printf(" version_info.file_flags_mask = 0x%x\n", + module_.version_info.file_flags_mask); + printf(" version_info.file_flags = 0x%x\n", + module_.version_info.file_flags); + printf(" version_info.file_os = 0x%x\n", + module_.version_info.file_os); + printf(" version_info.file_type = 0x%x\n", + module_.version_info.file_type); + printf(" version_info.file_subtype = 0x%x\n", + module_.version_info.file_subtype); + printf(" version_info.file_date = 0x%x:0x%x\n", + module_.version_info.file_date_hi, + module_.version_info.file_date_lo); + printf(" cv_record.data_size = %d\n", + module_.cv_record.data_size); + printf(" cv_record.rva = 0x%x\n", + module_.cv_record.rva); + printf(" misc_record.data_size = %d\n", + module_.misc_record.data_size); + printf(" misc_record.rva = 0x%x\n", + module_.misc_record.rva); + + printf(" (code_file) = \"%s\"\n", code_file().c_str()); + printf(" (code_identifier) = \"%s\"\n", + code_identifier().c_str()); + + u_int32_t cv_record_size; + const u_int8_t *cv_record = GetCVRecord(&cv_record_size); + if (cv_record) { + if (cv_record_signature_ == MD_CVINFOPDB70_SIGNATURE) { + const MDCVInfoPDB70* cv_record_70 = + reinterpret_cast(cv_record); + assert(cv_record_70->cv_signature == MD_CVINFOPDB70_SIGNATURE); + + printf(" (cv_record).cv_signature = 0x%x\n", + cv_record_70->cv_signature); + printf(" (cv_record).signature = %08x-%04x-%04x-%02x%02x-", + cv_record_70->signature.data1, + cv_record_70->signature.data2, + cv_record_70->signature.data3, + cv_record_70->signature.data4[0], + cv_record_70->signature.data4[1]); + for (unsigned int guidIndex = 2; + guidIndex < 8; + ++guidIndex) { + printf("%02x", cv_record_70->signature.data4[guidIndex]); + } + printf("\n"); + printf(" (cv_record).age = %d\n", + cv_record_70->age); + printf(" (cv_record).pdb_file_name = \"%s\"\n", + cv_record_70->pdb_file_name); + } else if (cv_record_signature_ == MD_CVINFOPDB20_SIGNATURE) { + const MDCVInfoPDB20* cv_record_20 = + reinterpret_cast(cv_record); + assert(cv_record_20->cv_header.signature == MD_CVINFOPDB20_SIGNATURE); + + printf(" (cv_record).cv_header.signature = 0x%x\n", + cv_record_20->cv_header.signature); + printf(" (cv_record).cv_header.offset = 0x%x\n", + cv_record_20->cv_header.offset); + printf(" (cv_record).signature = 0x%x\n", + cv_record_20->signature); + printf(" (cv_record).age = %d\n", + cv_record_20->age); + printf(" (cv_record).pdb_file_name = \"%s\"\n", + cv_record_20->pdb_file_name); + } else { + printf(" (cv_record) = "); + for (unsigned int cv_byte_index = 0; + cv_byte_index < cv_record_size; + ++cv_byte_index) { + printf("%02x", cv_record[cv_byte_index]); + } + printf("\n"); + } + } else { + printf(" (cv_record) = (null)\n"); + } + + const MDImageDebugMisc* misc_record = GetMiscRecord(NULL); + if (misc_record) { + printf(" (misc_record).data_type = 0x%x\n", + misc_record->data_type); + printf(" (misc_record).length = 0x%x\n", + misc_record->length); + printf(" (misc_record).unicode = %d\n", + misc_record->unicode); + // Don't bother printing the UTF-16, we don't really even expect to ever + // see this misc_record anyway. + if (misc_record->unicode) + printf(" (misc_record).data = \"%s\"\n", + misc_record->data); + else + printf(" (misc_record).data = (UTF-16)\n"); + } else { + printf(" (misc_record) = (null)\n"); + } + + printf(" (debug_file) = \"%s\"\n", debug_file().c_str()); + printf(" (debug_identifier) = \"%s\"\n", + debug_identifier().c_str()); + printf(" (version) = \"%s\"\n", version().c_str()); + printf("\n"); +} + + +// +// MinidumpModuleList +// + + +u_int32_t MinidumpModuleList::max_modules_ = 1024; + + +MinidumpModuleList::MinidumpModuleList(Minidump* minidump) + : MinidumpStream(minidump), + range_map_(new RangeMap()), + modules_(NULL), + module_count_(0) { +} + + +MinidumpModuleList::~MinidumpModuleList() { + delete range_map_; + delete modules_; +} + + +bool MinidumpModuleList::Read(u_int32_t expected_size) { + // Invalidate cached data. + range_map_->Clear(); + delete modules_; + modules_ = NULL; + module_count_ = 0; + + valid_ = false; + + u_int32_t module_count; + if (expected_size < sizeof(module_count)) { + BPLOG(ERROR) << "MinidumpModuleList count size mismatch, " << + expected_size << " < " << sizeof(module_count); + return false; + } + if (!minidump_->ReadBytes(&module_count, sizeof(module_count))) { + BPLOG(ERROR) << "MinidumpModuleList could not read module count"; + return false; + } + + if (minidump_->swap()) + Swap(&module_count); + + if (module_count > numeric_limits::max() / MD_MODULE_SIZE) { + BPLOG(ERROR) << "MinidumpModuleList module count " << module_count << + " would cause multiplication overflow"; + return false; + } + + if (expected_size != sizeof(module_count) + + module_count * MD_MODULE_SIZE) { + // may be padded with 4 bytes on 64bit ABIs for alignment + if (expected_size == sizeof(module_count) + 4 + + module_count * MD_MODULE_SIZE) { + u_int32_t useless; + if (!minidump_->ReadBytes(&useless, 4)) { + BPLOG(ERROR) << "MinidumpModuleList cannot read modulelist padded bytes"; + return false; + } + } else { + BPLOG(ERROR) << "MinidumpModuleList size mismatch, " << expected_size << + " != " << sizeof(module_count) + + module_count * MD_MODULE_SIZE; + return false; + } + } + + if (module_count > max_modules_) { + BPLOG(ERROR) << "MinidumpModuleList count " << module_count_ << + " exceeds maximum " << max_modules_; + return false; + } + + if (module_count != 0) { + scoped_ptr modules( + new MinidumpModules(module_count, MinidumpModule(minidump_))); + + for (unsigned int module_index = 0; + module_index < module_count; + ++module_index) { + MinidumpModule* module = &(*modules)[module_index]; + + // Assume that the file offset is correct after the last read. + if (!module->Read()) { + BPLOG(ERROR) << "MinidumpModuleList could not read module " << + module_index << "/" << module_count; + return false; + } + } + + // Loop through the module list once more to read additional data and + // build the range map. This is done in a second pass because + // MinidumpModule::ReadAuxiliaryData seeks around, and if it were + // included in the loop above, additional seeks would be needed where + // none are now to read contiguous data. + for (unsigned int module_index = 0; + module_index < module_count; + ++module_index) { + MinidumpModule* module = &(*modules)[module_index]; + + // ReadAuxiliaryData fails if any data that the module indicates should + // exist is missing, but we treat some such cases as valid anyway. See + // issue #222: if a debugging record is of a format that's too large to + // handle, it shouldn't render the entire dump invalid. Check module + // validity before giving up. + if (!module->ReadAuxiliaryData() && !module->valid()) { + BPLOG(ERROR) << "MinidumpModuleList could not read required module " + "auxiliary data for module " << + module_index << "/" << module_count; + return false; + } + + // It is safe to use module->code_file() after successfully calling + // module->ReadAuxiliaryData or noting that the module is valid. + + u_int64_t base_address = module->base_address(); + u_int64_t module_size = module->size(); + if (base_address == static_cast(-1)) { + BPLOG(ERROR) << "MinidumpModuleList found bad base address " + "for module " << module_index << "/" << module_count << + ", " << module->code_file(); + return false; + } + + if (!range_map_->StoreRange(base_address, module_size, module_index)) { + BPLOG(ERROR) << "MinidumpModuleList could not store module " << + module_index << "/" << module_count << ", " << + module->code_file() << ", " << + HexString(base_address) << "+" << + HexString(module_size); + return false; + } + } + + modules_ = modules.release(); + } + + module_count_ = module_count; + + valid_ = true; + return true; +} + + +const MinidumpModule* MinidumpModuleList::GetModuleForAddress( + u_int64_t address) const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModuleList for GetModuleForAddress"; + return NULL; + } + + unsigned int module_index; + if (!range_map_->RetrieveRange(address, &module_index, NULL, NULL)) { + BPLOG(INFO) << "MinidumpModuleList has no module at " << + HexString(address); + return NULL; + } + + return GetModuleAtIndex(module_index); +} + + +const MinidumpModule* MinidumpModuleList::GetMainModule() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModuleList for GetMainModule"; + return NULL; + } + + // The main code module is the first one present in a minidump file's + // MDRawModuleList. + return GetModuleAtSequence(0); +} + + +const MinidumpModule* MinidumpModuleList::GetModuleAtSequence( + unsigned int sequence) const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModuleList for GetModuleAtSequence"; + return NULL; + } + + if (sequence >= module_count_) { + BPLOG(ERROR) << "MinidumpModuleList sequence out of range: " << + sequence << "/" << module_count_; + return NULL; + } + + unsigned int module_index; + if (!range_map_->RetrieveRangeAtIndex(sequence, &module_index, NULL, NULL)) { + BPLOG(ERROR) << "MinidumpModuleList has no module at sequence " << sequence; + return NULL; + } + + return GetModuleAtIndex(module_index); +} + + +const MinidumpModule* MinidumpModuleList::GetModuleAtIndex( + unsigned int index) const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModuleList for GetModuleAtIndex"; + return NULL; + } + + if (index >= module_count_) { + BPLOG(ERROR) << "MinidumpModuleList index out of range: " << + index << "/" << module_count_; + return NULL; + } + + return &(*modules_)[index]; +} + + +const CodeModules* MinidumpModuleList::Copy() const { + return new BasicCodeModules(this); +} + + +void MinidumpModuleList::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpModuleList cannot print invalid data"; + return; + } + + printf("MinidumpModuleList\n"); + printf(" module_count = %d\n", module_count_); + printf("\n"); + + for (unsigned int module_index = 0; + module_index < module_count_; + ++module_index) { + printf("module[%d]\n", module_index); + + (*modules_)[module_index].Print(); + } +} + + +// +// MinidumpMemoryList +// + + +u_int32_t MinidumpMemoryList::max_regions_ = 256; + + +MinidumpMemoryList::MinidumpMemoryList(Minidump* minidump) + : MinidumpStream(minidump), + range_map_(new RangeMap()), + descriptors_(NULL), + regions_(NULL), + region_count_(0) { +} + + +MinidumpMemoryList::~MinidumpMemoryList() { + delete range_map_; + delete descriptors_; + delete regions_; +} + + +bool MinidumpMemoryList::Read(u_int32_t expected_size) { + // Invalidate cached data. + delete descriptors_; + descriptors_ = NULL; + delete regions_; + regions_ = NULL; + range_map_->Clear(); + region_count_ = 0; + + valid_ = false; + + u_int32_t region_count; + if (expected_size < sizeof(region_count)) { + BPLOG(ERROR) << "MinidumpMemoryList count size mismatch, " << + expected_size << " < " << sizeof(region_count); + return false; + } + if (!minidump_->ReadBytes(®ion_count, sizeof(region_count))) { + BPLOG(ERROR) << "MinidumpMemoryList could not read memory region count"; + return false; + } + + if (minidump_->swap()) + Swap(®ion_count); + + if (region_count > + numeric_limits::max() / sizeof(MDMemoryDescriptor)) { + BPLOG(ERROR) << "MinidumpMemoryList region count " << region_count << + " would cause multiplication overflow"; + return false; + } + + if (expected_size != sizeof(region_count) + + region_count * sizeof(MDMemoryDescriptor)) { + // may be padded with 4 bytes on 64bit ABIs for alignment + if (expected_size == sizeof(region_count) + 4 + + region_count * sizeof(MDMemoryDescriptor)) { + u_int32_t useless; + if (!minidump_->ReadBytes(&useless, 4)) { + BPLOG(ERROR) << "MinidumpMemoryList cannot read memorylist padded bytes"; + return false; + } + } else { + BPLOG(ERROR) << "MinidumpMemoryList size mismatch, " << expected_size << + " != " << sizeof(region_count) + + region_count * sizeof(MDMemoryDescriptor); + return false; + } + } + + if (region_count > max_regions_) { + BPLOG(ERROR) << "MinidumpMemoryList count " << region_count << + " exceeds maximum " << max_regions_; + return false; + } + + if (region_count != 0) { + scoped_ptr descriptors( + new MemoryDescriptors(region_count)); + + // Read the entire array in one fell swoop, instead of reading one entry + // at a time in the loop. + if (!minidump_->ReadBytes(&(*descriptors)[0], + sizeof(MDMemoryDescriptor) * region_count)) { + BPLOG(ERROR) << "MinidumpMemoryList could not read memory region list"; + return false; + } + + scoped_ptr regions( + new MemoryRegions(region_count, MinidumpMemoryRegion(minidump_))); + + for (unsigned int region_index = 0; + region_index < region_count; + ++region_index) { + MDMemoryDescriptor* descriptor = &(*descriptors)[region_index]; + + if (minidump_->swap()) + Swap(descriptor); + + u_int64_t base_address = descriptor->start_of_memory_range; + u_int32_t region_size = descriptor->memory.data_size; + + // Check for base + size overflow or undersize. + if (region_size == 0 || + region_size > numeric_limits::max() - base_address) { + BPLOG(ERROR) << "MinidumpMemoryList has a memory region problem, " << + " region " << region_index << "/" << region_count << + ", " << HexString(base_address) << "+" << + HexString(region_size); + return false; + } + + if (!range_map_->StoreRange(base_address, region_size, region_index)) { + BPLOG(ERROR) << "MinidumpMemoryList could not store memory region " << + region_index << "/" << region_count << ", " << + HexString(base_address) << "+" << + HexString(region_size); + return false; + } + + (*regions)[region_index].SetDescriptor(descriptor); + } + + descriptors_ = descriptors.release(); + regions_ = regions.release(); + } + + region_count_ = region_count; + + valid_ = true; + return true; +} + + +MinidumpMemoryRegion* MinidumpMemoryList::GetMemoryRegionAtIndex( + unsigned int index) { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryList for GetMemoryRegionAtIndex"; + return NULL; + } + + if (index >= region_count_) { + BPLOG(ERROR) << "MinidumpMemoryList index out of range: " << + index << "/" << region_count_; + return NULL; + } + + return &(*regions_)[index]; +} + + +MinidumpMemoryRegion* MinidumpMemoryList::GetMemoryRegionForAddress( + u_int64_t address) { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryList for GetMemoryRegionForAddress"; + return NULL; + } + + unsigned int region_index; + if (!range_map_->RetrieveRange(address, ®ion_index, NULL, NULL)) { + BPLOG(INFO) << "MinidumpMemoryList has no memory region at " << + HexString(address); + return NULL; + } + + return GetMemoryRegionAtIndex(region_index); +} + + +void MinidumpMemoryList::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpMemoryList cannot print invalid data"; + return; + } + + printf("MinidumpMemoryList\n"); + printf(" region_count = %d\n", region_count_); + printf("\n"); + + for (unsigned int region_index = 0; + region_index < region_count_; + ++region_index) { + MDMemoryDescriptor* descriptor = &(*descriptors_)[region_index]; + printf("region[%d]\n", region_index); + printf("MDMemoryDescriptor\n"); + printf(" start_of_memory_range = 0x%" PRIx64 "\n", + descriptor->start_of_memory_range); + printf(" memory.data_size = 0x%x\n", descriptor->memory.data_size); + printf(" memory.rva = 0x%x\n", descriptor->memory.rva); + MinidumpMemoryRegion* region = GetMemoryRegionAtIndex(region_index); + if (region) { + printf("Memory\n"); + region->Print(); + } else { + printf("No memory\n"); + } + printf("\n"); + } +} + + +// +// MinidumpException +// + + +MinidumpException::MinidumpException(Minidump* minidump) + : MinidumpStream(minidump), + exception_(), + context_(NULL) { +} + + +MinidumpException::~MinidumpException() { + delete context_; +} + + +bool MinidumpException::Read(u_int32_t expected_size) { + // Invalidate cached data. + delete context_; + context_ = NULL; + + valid_ = false; + + if (expected_size != sizeof(exception_)) { + BPLOG(ERROR) << "MinidumpException size mismatch, " << expected_size << + " != " << sizeof(exception_); + return false; + } + + if (!minidump_->ReadBytes(&exception_, sizeof(exception_))) { + BPLOG(ERROR) << "MinidumpException cannot read exception"; + return false; + } + + if (minidump_->swap()) { + Swap(&exception_.thread_id); + // exception_.__align is for alignment only and does not need to be + // swapped. + Swap(&exception_.exception_record.exception_code); + Swap(&exception_.exception_record.exception_flags); + Swap(&exception_.exception_record.exception_record); + Swap(&exception_.exception_record.exception_address); + Swap(&exception_.exception_record.number_parameters); + // exception_.exception_record.__align is for alignment only and does not + // need to be swapped. + for (unsigned int parameter_index = 0; + parameter_index < MD_EXCEPTION_MAXIMUM_PARAMETERS; + ++parameter_index) { + Swap(&exception_.exception_record.exception_information[parameter_index]); + } + Swap(&exception_.thread_context); + } + + valid_ = true; + return true; +} + + +bool MinidumpException::GetThreadID(u_int32_t *thread_id) const { + BPLOG_IF(ERROR, !thread_id) << "MinidumpException::GetThreadID requires " + "|thread_id|"; + assert(thread_id); + *thread_id = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpException for GetThreadID"; + return false; + } + + *thread_id = exception_.thread_id; + return true; +} + + +MinidumpContext* MinidumpException::GetContext() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpException for GetContext"; + return NULL; + } + + if (!context_) { + if (!minidump_->SeekSet(exception_.thread_context.rva)) { + BPLOG(ERROR) << "MinidumpException cannot seek to context"; + return NULL; + } + + scoped_ptr context(new MinidumpContext(minidump_)); + + if (!context->Read(exception_.thread_context.data_size)) { + BPLOG(ERROR) << "MinidumpException cannot read context"; + return NULL; + } + + context_ = context.release(); + } + + return context_; +} + + +void MinidumpException::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpException cannot print invalid data"; + return; + } + + printf("MDException\n"); + printf(" thread_id = 0x%x\n", + exception_.thread_id); + printf(" exception_record.exception_code = 0x%x\n", + exception_.exception_record.exception_code); + printf(" exception_record.exception_flags = 0x%x\n", + exception_.exception_record.exception_flags); + printf(" exception_record.exception_record = 0x%" PRIx64 "\n", + exception_.exception_record.exception_record); + printf(" exception_record.exception_address = 0x%" PRIx64 "\n", + exception_.exception_record.exception_address); + printf(" exception_record.number_parameters = %d\n", + exception_.exception_record.number_parameters); + for (unsigned int parameterIndex = 0; + parameterIndex < exception_.exception_record.number_parameters; + ++parameterIndex) { + printf(" exception_record.exception_information[%2d] = 0x%" PRIx64 "\n", + parameterIndex, + exception_.exception_record.exception_information[parameterIndex]); + } + printf(" thread_context.data_size = %d\n", + exception_.thread_context.data_size); + printf(" thread_context.rva = 0x%x\n", + exception_.thread_context.rva); + MinidumpContext* context = GetContext(); + if (context) { + printf("\n"); + context->Print(); + } else { + printf(" (no context)\n"); + printf("\n"); + } +} + + +// +// MinidumpSystemInfo +// + + +MinidumpSystemInfo::MinidumpSystemInfo(Minidump* minidump) + : MinidumpStream(minidump), + system_info_(), + csd_version_(NULL), + cpu_vendor_(NULL) { +} + + +MinidumpSystemInfo::~MinidumpSystemInfo() { + delete csd_version_; + delete cpu_vendor_; +} + + +bool MinidumpSystemInfo::Read(u_int32_t expected_size) { + // Invalidate cached data. + delete csd_version_; + csd_version_ = NULL; + delete cpu_vendor_; + cpu_vendor_ = NULL; + + valid_ = false; + + if (expected_size != sizeof(system_info_)) { + BPLOG(ERROR) << "MinidumpSystemInfo size mismatch, " << expected_size << + " != " << sizeof(system_info_); + return false; + } + + if (!minidump_->ReadBytes(&system_info_, sizeof(system_info_))) { + BPLOG(ERROR) << "MinidumpSystemInfo cannot read system info"; + return false; + } + + if (minidump_->swap()) { + Swap(&system_info_.processor_architecture); + Swap(&system_info_.processor_level); + Swap(&system_info_.processor_revision); + // number_of_processors and product_type are 8-bit quantities and need no + // swapping. + Swap(&system_info_.major_version); + Swap(&system_info_.minor_version); + Swap(&system_info_.build_number); + Swap(&system_info_.platform_id); + Swap(&system_info_.csd_version_rva); + Swap(&system_info_.suite_mask); + // Don't swap the reserved2 field because its contents are unknown. + + if (system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86 || + system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86_WIN64) { + for (unsigned int i = 0; i < 3; ++i) + Swap(&system_info_.cpu.x86_cpu_info.vendor_id[i]); + Swap(&system_info_.cpu.x86_cpu_info.version_information); + Swap(&system_info_.cpu.x86_cpu_info.feature_information); + Swap(&system_info_.cpu.x86_cpu_info.amd_extended_cpu_features); + } else { + for (unsigned int i = 0; i < 2; ++i) + Swap(&system_info_.cpu.other_cpu_info.processor_features[i]); + } + } + + valid_ = true; + return true; +} + + +string MinidumpSystemInfo::GetOS() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpSystemInfo for GetOS"; + return NULL; + } + + string os; + + switch (system_info_.platform_id) { + case MD_OS_WIN32_NT: + case MD_OS_WIN32_WINDOWS: + os = "windows"; + break; + + case MD_OS_MAC_OS_X: + os = "mac"; + break; + + case MD_OS_LINUX: + os = "linux"; + break; + + case MD_OS_SOLARIS: + os = "solaris"; + break; + + default: + BPLOG(ERROR) << "MinidumpSystemInfo unknown OS for platform " << + HexString(system_info_.platform_id); + break; + } + + return os; +} + + +string MinidumpSystemInfo::GetCPU() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpSystemInfo for GetCPU"; + return ""; + } + + string cpu; + + switch (system_info_.processor_architecture) { + case MD_CPU_ARCHITECTURE_X86: + case MD_CPU_ARCHITECTURE_X86_WIN64: + cpu = "x86"; + break; + + case MD_CPU_ARCHITECTURE_PPC: + cpu = "ppc"; + break; + + case MD_CPU_ARCHITECTURE_SPARC: + cpu = "sparc"; + break; + + default: + BPLOG(ERROR) << "MinidumpSystemInfo unknown CPU for architecture " << + HexString(system_info_.processor_architecture); + break; + } + + return cpu; +} + + +const string* MinidumpSystemInfo::GetCSDVersion() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpSystemInfo for GetCSDVersion"; + return NULL; + } + + if (!csd_version_) + csd_version_ = minidump_->ReadString(system_info_.csd_version_rva); + + BPLOG_IF(ERROR, !csd_version_) << "MinidumpSystemInfo could not read " + "CSD version"; + + return csd_version_; +} + + +const string* MinidumpSystemInfo::GetCPUVendor() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpSystemInfo for GetCPUVendor"; + return NULL; + } + + // CPU vendor information can only be determined from x86 minidumps. + if (!cpu_vendor_ && + (system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86 || + system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86_WIN64)) { + char cpu_vendor_string[13]; + snprintf(cpu_vendor_string, sizeof(cpu_vendor_string), + "%c%c%c%c%c%c%c%c%c%c%c%c", + system_info_.cpu.x86_cpu_info.vendor_id[0] & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[0] >> 8) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[0] >> 16) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[0] >> 24) & 0xff, + system_info_.cpu.x86_cpu_info.vendor_id[1] & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[1] >> 8) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[1] >> 16) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[1] >> 24) & 0xff, + system_info_.cpu.x86_cpu_info.vendor_id[2] & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[2] >> 8) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[2] >> 16) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[2] >> 24) & 0xff); + cpu_vendor_ = new string(cpu_vendor_string); + } + + return cpu_vendor_; +} + + +void MinidumpSystemInfo::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpSystemInfo cannot print invalid data"; + return; + } + + printf("MDRawSystemInfo\n"); + printf(" processor_architecture = %d\n", + system_info_.processor_architecture); + printf(" processor_level = %d\n", + system_info_.processor_level); + printf(" processor_revision = 0x%x\n", + system_info_.processor_revision); + printf(" number_of_processors = %d\n", + system_info_.number_of_processors); + printf(" product_type = %d\n", + system_info_.product_type); + printf(" major_version = %d\n", + system_info_.major_version); + printf(" minor_version = %d\n", + system_info_.minor_version); + printf(" build_number = %d\n", + system_info_.build_number); + printf(" platform_id = %d\n", + system_info_.platform_id); + printf(" csd_version_rva = 0x%x\n", + system_info_.csd_version_rva); + printf(" suite_mask = 0x%x\n", + system_info_.suite_mask); + for (unsigned int i = 0; i < 3; ++i) { + printf(" cpu.x86_cpu_info.vendor_id[%d] = 0x%x\n", + i, system_info_.cpu.x86_cpu_info.vendor_id[i]); + } + printf(" cpu.x86_cpu_info.version_information = 0x%x\n", + system_info_.cpu.x86_cpu_info.version_information); + printf(" cpu.x86_cpu_info.feature_information = 0x%x\n", + system_info_.cpu.x86_cpu_info.feature_information); + printf(" cpu.x86_cpu_info.amd_extended_cpu_features = 0x%x\n", + system_info_.cpu.x86_cpu_info.amd_extended_cpu_features); + const string* csd_version = GetCSDVersion(); + if (csd_version) { + printf(" (csd_version) = \"%s\"\n", + csd_version->c_str()); + } else { + printf(" (csd_version) = (null)\n"); + } + const string* cpu_vendor = GetCPUVendor(); + if (cpu_vendor) { + printf(" (cpu_vendor) = \"%s\"\n", + cpu_vendor->c_str()); + } else { + printf(" (cpu_vendor) = (null)\n"); + } + printf("\n"); +} + + +// +// MinidumpMiscInfo +// + + +MinidumpMiscInfo::MinidumpMiscInfo(Minidump* minidump) + : MinidumpStream(minidump), + misc_info_() { +} + + +bool MinidumpMiscInfo::Read(u_int32_t expected_size) { + valid_ = false; + + if (expected_size != MD_MISCINFO_SIZE && + expected_size != MD_MISCINFO2_SIZE) { + BPLOG(ERROR) << "MinidumpMiscInfo size mismatch, " << expected_size << + " != " << MD_MISCINFO_SIZE << ", " << MD_MISCINFO2_SIZE << + ")"; + return false; + } + + if (!minidump_->ReadBytes(&misc_info_, expected_size)) { + BPLOG(ERROR) << "MinidumpMiscInfo cannot read miscellaneous info"; + return false; + } + + if (minidump_->swap()) { + Swap(&misc_info_.size_of_info); + Swap(&misc_info_.flags1); + Swap(&misc_info_.process_id); + Swap(&misc_info_.process_create_time); + Swap(&misc_info_.process_user_time); + Swap(&misc_info_.process_kernel_time); + if (misc_info_.size_of_info > MD_MISCINFO_SIZE) { + Swap(&misc_info_.processor_max_mhz); + Swap(&misc_info_.processor_current_mhz); + Swap(&misc_info_.processor_mhz_limit); + Swap(&misc_info_.processor_max_idle_state); + Swap(&misc_info_.processor_current_idle_state); + } + } + + if (expected_size != misc_info_.size_of_info) { + BPLOG(ERROR) << "MinidumpMiscInfo size mismatch, " << + expected_size << " != " << misc_info_.size_of_info; + return false; + } + + valid_ = true; + return true; +} + + +void MinidumpMiscInfo::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpMiscInfo cannot print invalid data"; + return; + } + + printf("MDRawMiscInfo\n"); + printf(" size_of_info = %d\n", misc_info_.size_of_info); + printf(" flags1 = 0x%x\n", misc_info_.flags1); + printf(" process_id = 0x%x\n", misc_info_.process_id); + printf(" process_create_time = 0x%x\n", + misc_info_.process_create_time); + printf(" process_user_time = 0x%x\n", + misc_info_.process_user_time); + printf(" process_kernel_time = 0x%x\n", + misc_info_.process_kernel_time); + if (misc_info_.size_of_info > MD_MISCINFO_SIZE) { + printf(" processor_max_mhz = %d\n", + misc_info_.processor_max_mhz); + printf(" processor_current_mhz = %d\n", + misc_info_.processor_current_mhz); + printf(" processor_mhz_limit = %d\n", + misc_info_.processor_mhz_limit); + printf(" processor_max_idle_state = 0x%x\n", + misc_info_.processor_max_idle_state); + printf(" processor_current_idle_state = 0x%x\n", + misc_info_.processor_current_idle_state); + } + printf("\n"); +} + + +// +// MinidumpBreakpadInfo +// + + +MinidumpBreakpadInfo::MinidumpBreakpadInfo(Minidump* minidump) + : MinidumpStream(minidump), + breakpad_info_() { +} + + +bool MinidumpBreakpadInfo::Read(u_int32_t expected_size) { + valid_ = false; + + if (expected_size != sizeof(breakpad_info_)) { + BPLOG(ERROR) << "MinidumpBreakpadInfo size mismatch, " << expected_size << + " != " << sizeof(breakpad_info_); + return false; + } + + if (!minidump_->ReadBytes(&breakpad_info_, sizeof(breakpad_info_))) { + BPLOG(ERROR) << "MinidumpBreakpadInfo cannot read Breakpad info"; + return false; + } + + if (minidump_->swap()) { + Swap(&breakpad_info_.validity); + Swap(&breakpad_info_.dump_thread_id); + Swap(&breakpad_info_.requesting_thread_id); + } + + valid_ = true; + return true; +} + + +bool MinidumpBreakpadInfo::GetDumpThreadID(u_int32_t *thread_id) const { + BPLOG_IF(ERROR, !thread_id) << "MinidumpBreakpadInfo::GetDumpThreadID " + "requires |thread_id|"; + assert(thread_id); + *thread_id = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpBreakpadInfo for GetDumpThreadID"; + return false; + } + + if (!(breakpad_info_.validity & MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID)) { + BPLOG(INFO) << "MinidumpBreakpadInfo has no dump thread"; + return false; + } + + *thread_id = breakpad_info_.dump_thread_id; + return true; +} + + +bool MinidumpBreakpadInfo::GetRequestingThreadID(u_int32_t *thread_id) + const { + BPLOG_IF(ERROR, !thread_id) << "MinidumpBreakpadInfo::GetRequestingThreadID " + "requires |thread_id|"; + assert(thread_id); + *thread_id = 0; + + if (!thread_id || !valid_) { + BPLOG(ERROR) << "Invalid MinidumpBreakpadInfo for GetRequestingThreadID"; + return false; + } + + if (!(breakpad_info_.validity & + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID)) { + BPLOG(INFO) << "MinidumpBreakpadInfo has no requesting thread"; + return false; + } + + *thread_id = breakpad_info_.requesting_thread_id; + return true; +} + + +void MinidumpBreakpadInfo::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpBreakpadInfo cannot print invalid data"; + return; + } + + printf("MDRawBreakpadInfo\n"); + printf(" validity = 0x%x\n", breakpad_info_.validity); + + if (breakpad_info_.validity & MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID) { + printf(" dump_thread_id = 0x%x\n", breakpad_info_.dump_thread_id); + } else { + printf(" dump_thread_id = (invalid)\n"); + } + + if (breakpad_info_.validity & MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID) { + printf(" requesting_thread_id = 0x%x\n", + breakpad_info_.requesting_thread_id); + } else { + printf(" requesting_thread_id = (invalid)\n"); + } + + printf("\n"); +} + + +// +// Minidump +// + + +u_int32_t Minidump::max_streams_ = 128; +unsigned int Minidump::max_string_length_ = 1024; + + +Minidump::Minidump(const string& path) + : header_(), + directory_(NULL), + stream_map_(new MinidumpStreamMap()), + path_(path), + fd_(-1), + swap_(false), + valid_(false) { +} + + +Minidump::~Minidump() { + delete directory_; + delete stream_map_; + if (fd_ != -1) { + BPLOG(INFO) << "Minidump closing minidump on fd " << fd_; + close(fd_); + } +} + + +bool Minidump::Open() { + if (fd_ != -1) { + BPLOG(INFO) << "Minidump reopening minidump " << path_ << " on fd " << fd_; + + // The file is already open. Seek to the beginning, which is the position + // the file would be at if it were opened anew. + return SeekSet(0); + } + + // O_BINARY is useful (and defined) on Windows. On other platforms, it's + // useless, and because it's defined as 0 above, harmless. + fd_ = open(path_.c_str(), O_RDONLY | O_BINARY); + if (fd_ == -1) { + string error_string; + int error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "Minidump could not open minidump " << path_ << + ", error " << error_code << ": " << error_string; + return false; + } + + BPLOG(INFO) << "Minidump opened minidump " << path_ << " on fd " << fd_; + return true; +} + + +bool Minidump::Read() { + // Invalidate cached data. + delete directory_; + directory_ = NULL; + stream_map_->clear(); + + valid_ = false; + + if (!Open()) { + BPLOG(ERROR) << "Minidump cannot open minidump"; + return false; + } + + if (!ReadBytes(&header_, sizeof(MDRawHeader))) { + BPLOG(ERROR) << "Minidump cannot read header"; + return false; + } + + if (header_.signature != MD_HEADER_SIGNATURE) { + // The file may be byte-swapped. Under the present architecture, these + // classes don't know or need to know what CPU (or endianness) the + // minidump was produced on in order to parse it. Use the signature as + // a byte order marker. + u_int32_t signature_swapped = header_.signature; + Swap(&signature_swapped); + if (signature_swapped != MD_HEADER_SIGNATURE) { + // This isn't a minidump or a byte-swapped minidump. + BPLOG(ERROR) << "Minidump header signature mismatch: (" << + HexString(header_.signature) << ", " << + HexString(signature_swapped) << ") != " << + HexString(MD_HEADER_SIGNATURE); + return false; + } + swap_ = true; + } else { + // The file is not byte-swapped. Set swap_ false (it may have been true + // if the object is being reused?) + swap_ = false; + } + + BPLOG(INFO) << "Minidump " << (swap_ ? "" : "not ") << + "byte-swapping minidump"; + + if (swap_) { + Swap(&header_.signature); + Swap(&header_.version); + Swap(&header_.stream_count); + Swap(&header_.stream_directory_rva); + Swap(&header_.checksum); + Swap(&header_.time_date_stamp); + Swap(&header_.flags); + } + + // Version check. The high 16 bits of header_.version contain something + // else "implementation specific." + if ((header_.version & 0x0000ffff) != MD_HEADER_VERSION) { + BPLOG(ERROR) << "Minidump version mismatch: " << + HexString(header_.version & 0x0000ffff) << " != " << + HexString(MD_HEADER_VERSION); + return false; + } + + if (!SeekSet(header_.stream_directory_rva)) { + BPLOG(ERROR) << "Minidump cannot seek to stream directory"; + return false; + } + + if (header_.stream_count > max_streams_) { + BPLOG(ERROR) << "Minidump stream count " << header_.stream_count << + " exceeds maximum " << max_streams_; + return false; + } + + if (header_.stream_count != 0) { + scoped_ptr directory( + new MinidumpDirectoryEntries(header_.stream_count)); + + // Read the entire array in one fell swoop, instead of reading one entry + // at a time in the loop. + if (!ReadBytes(&(*directory)[0], + sizeof(MDRawDirectory) * header_.stream_count)) { + BPLOG(ERROR) << "Minidump cannot read stream directory"; + return false; + } + + for (unsigned int stream_index = 0; + stream_index < header_.stream_count; + ++stream_index) { + MDRawDirectory* directory_entry = &(*directory)[stream_index]; + + if (swap_) { + Swap(&directory_entry->stream_type); + Swap(&directory_entry->location); + } + + // Initialize the stream_map_ map, which speeds locating a stream by + // type. + unsigned int stream_type = directory_entry->stream_type; + switch (stream_type) { + case MD_THREAD_LIST_STREAM: + case MD_MODULE_LIST_STREAM: + case MD_MEMORY_LIST_STREAM: + case MD_EXCEPTION_STREAM: + case MD_SYSTEM_INFO_STREAM: + case MD_MISC_INFO_STREAM: + case MD_BREAKPAD_INFO_STREAM: { + if (stream_map_->find(stream_type) != stream_map_->end()) { + // Another stream with this type was already found. A minidump + // file should contain at most one of each of these stream types. + BPLOG(ERROR) << "Minidump found multiple streams of type " << + stream_type << ", but can only deal with one"; + return false; + } + // Fall through to default + } + + default: { + // Overwrites for stream types other than those above, but it's + // expected to be the user's burden in that case. + (*stream_map_)[stream_type].stream_index = stream_index; + } + } + } + + directory_ = directory.release(); + } + + valid_ = true; + return true; +} + + +MinidumpThreadList* Minidump::GetThreadList() { + MinidumpThreadList* thread_list; + return GetStream(&thread_list); +} + + +MinidumpModuleList* Minidump::GetModuleList() { + MinidumpModuleList* module_list; + return GetStream(&module_list); +} + + +MinidumpMemoryList* Minidump::GetMemoryList() { + MinidumpMemoryList* memory_list; + return GetStream(&memory_list); +} + + +MinidumpException* Minidump::GetException() { + MinidumpException* exception; + return GetStream(&exception); +} + + +MinidumpSystemInfo* Minidump::GetSystemInfo() { + MinidumpSystemInfo* system_info; + return GetStream(&system_info); +} + + +MinidumpMiscInfo* Minidump::GetMiscInfo() { + MinidumpMiscInfo* misc_info; + return GetStream(&misc_info); +} + + +MinidumpBreakpadInfo* Minidump::GetBreakpadInfo() { + MinidumpBreakpadInfo* breakpad_info; + return GetStream(&breakpad_info); +} + + +void Minidump::Print() { + if (!valid_) { + BPLOG(ERROR) << "Minidump cannot print invalid data"; + return; + } + + printf("MDRawHeader\n"); + printf(" signature = 0x%x\n", header_.signature); + printf(" version = 0x%x\n", header_.version); + printf(" stream_count = %d\n", header_.stream_count); + printf(" stream_directory_rva = 0x%x\n", header_.stream_directory_rva); + printf(" checksum = 0x%x\n", header_.checksum); + struct tm timestruct; + gmtime_r(reinterpret_cast(&header_.time_date_stamp), ×truct); + char timestr[20]; + strftime(timestr, 20, "%Y-%m-%d %H:%M:%S", ×truct); + printf(" time_date_stamp = 0x%x %s\n", header_.time_date_stamp, + timestr); + printf(" flags = 0x%" PRIx64 "\n", header_.flags); + printf("\n"); + + for (unsigned int stream_index = 0; + stream_index < header_.stream_count; + ++stream_index) { + MDRawDirectory* directory_entry = &(*directory_)[stream_index]; + + printf("mDirectory[%d]\n", stream_index); + printf("MDRawDirectory\n"); + printf(" stream_type = %d\n", directory_entry->stream_type); + printf(" location.data_size = %d\n", + directory_entry->location.data_size); + printf(" location.rva = 0x%x\n", directory_entry->location.rva); + printf("\n"); + } + + printf("Streams:\n"); + for (MinidumpStreamMap::const_iterator iterator = stream_map_->begin(); + iterator != stream_map_->end(); + ++iterator) { + u_int32_t stream_type = iterator->first; + MinidumpStreamInfo info = iterator->second; + printf(" stream type 0x%x at index %d\n", stream_type, info.stream_index); + } + printf("\n"); +} + + +const MDRawDirectory* Minidump::GetDirectoryEntryAtIndex(unsigned int index) + const { + if (!valid_) { + BPLOG(ERROR) << "Invalid Minidump for GetDirectoryEntryAtIndex"; + return NULL; + } + + if (index >= header_.stream_count) { + BPLOG(ERROR) << "Minidump stream directory index out of range: " << + index << "/" << header_.stream_count; + return NULL; + } + + return &(*directory_)[index]; +} + + +bool Minidump::ReadBytes(void* bytes, size_t count) { + // Can't check valid_ because Read needs to call this method before + // validity can be determined. The only member that this method + // depends on is mFD, and an unset or invalid fd may generate an + // error but should not cause a crash. + ssize_t bytes_read = read(fd_, bytes, count); + if (static_cast(bytes_read) != count) { + if (bytes_read == -1) { + string error_string; + int error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "ReadBytes: error " << error_code << ": " << error_string; + } else { + BPLOG(ERROR) << "ReadBytes: read " << bytes_read << "/" << count; + } + return false; + } + return true; +} + + +bool Minidump::SeekSet(off_t offset) { + // Can't check valid_ because Read needs to call this method before + // validity can be determined. The only member that this method + // depends on is mFD, and an unset or invalid fd may generate an + // error but should not cause a crash. + off_t sought = lseek(fd_, offset, SEEK_SET); + if (sought != offset) { + if (sought == -1) { + string error_string; + int error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "SeekSet: error " << error_code << ": " << error_string; + } else { + BPLOG(ERROR) << "SeekSet: sought " << sought << "/" << offset; + } + return false; + } + return true; +} + + +string* Minidump::ReadString(off_t offset) { + if (!valid_) { + BPLOG(ERROR) << "Invalid Minidump for ReadString"; + return NULL; + } + if (!SeekSet(offset)) { + BPLOG(ERROR) << "ReadString could not seek to string at offset " << offset; + return NULL; + } + + u_int32_t bytes; + if (!ReadBytes(&bytes, sizeof(bytes))) { + BPLOG(ERROR) << "ReadString could not read string size at offset " << + offset; + return NULL; + } + if (swap_) + Swap(&bytes); + + if (bytes % 2 != 0) { + BPLOG(ERROR) << "ReadString found odd-sized " << bytes << + "-byte string at offset " << offset; + return NULL; + } + unsigned int utf16_words = bytes / 2; + + if (utf16_words > max_string_length_) { + BPLOG(ERROR) << "ReadString string length " << utf16_words << + " exceeds maximum " << max_string_length_ << + " at offset " << offset; + return NULL; + } + + vector string_utf16(utf16_words); + + if (utf16_words) { + if (!ReadBytes(&string_utf16[0], bytes)) { + BPLOG(ERROR) << "ReadString could not read " << bytes << + "-byte string at offset " << offset; + return NULL; + } + } + + return UTF16ToUTF8(string_utf16, swap_); +} + + +bool Minidump::SeekToStreamType(u_int32_t stream_type, + u_int32_t* stream_length) { + BPLOG_IF(ERROR, !stream_length) << "Minidump::SeekToStreamType requires " + "|stream_length|"; + assert(stream_length); + *stream_length = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid Mindump for SeekToStreamType"; + return false; + } + + MinidumpStreamMap::const_iterator iterator = stream_map_->find(stream_type); + if (iterator == stream_map_->end()) { + // This stream type didn't exist in the directory. + BPLOG(INFO) << "SeekToStreamType: type " << stream_type << " not present"; + return false; + } + + MinidumpStreamInfo info = iterator->second; + if (info.stream_index >= header_.stream_count) { + BPLOG(ERROR) << "SeekToStreamType: type " << stream_type << + " out of range: " << + info.stream_index << "/" << header_.stream_count; + return false; + } + + MDRawDirectory* directory_entry = &(*directory_)[info.stream_index]; + if (!SeekSet(directory_entry->location.rva)) { + BPLOG(ERROR) << "SeekToStreamType could not seek to stream type " << + stream_type; + return false; + } + + *stream_length = directory_entry->location.data_size; + + return true; +} + + +template +T* Minidump::GetStream(T** stream) { + // stream is a garbage parameter that's present only to account for C++'s + // inability to overload a method based solely on its return type. + + const u_int32_t stream_type = T::kStreamType; + + BPLOG_IF(ERROR, !stream) << "Minidump::GetStream type " << stream_type << + " requires |stream|"; + assert(stream); + *stream = NULL; + + if (!valid_) { + BPLOG(ERROR) << "Invalid Minidump for GetStream type " << stream_type; + return NULL; + } + + MinidumpStreamMap::iterator iterator = stream_map_->find(stream_type); + if (iterator == stream_map_->end()) { + // This stream type didn't exist in the directory. + BPLOG(INFO) << "GetStream: type " << stream_type << " not present"; + return NULL; + } + + // Get a pointer so that the stored stream field can be altered. + MinidumpStreamInfo* info = &iterator->second; + + if (info->stream) { + // This cast is safe because info.stream is only populated by this + // method, and there is a direct correlation between T and stream_type. + *stream = static_cast(info->stream); + return *stream; + } + + u_int32_t stream_length; + if (!SeekToStreamType(stream_type, &stream_length)) { + BPLOG(ERROR) << "GetStream could not seek to stream type " << stream_type; + return NULL; + } + + scoped_ptr new_stream(new T(this)); + + if (!new_stream->Read(stream_length)) { + BPLOG(ERROR) << "GetStream could not read stream type " << stream_type; + return NULL; + } + + *stream = new_stream.release(); + info->stream = *stream; + return *stream; +} + + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/minidump_dump b/thirdparty/google-breakpad/r318/src/processor/minidump_dump new file mode 100644 index 0000000000000000000000000000000000000000..579bf6bd4300044b4c29c818fca862a4d30ce04c GIT binary patch literal 246444 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 literal 0 HcmV?d00001 diff --git a/thirdparty/google-breakpad/r318/src/processor/minidump_dump.cc b/thirdparty/google-breakpad/r318/src/processor/minidump_dump.cc new file mode 100644 index 00000000..12a699de --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/minidump_dump.cc @@ -0,0 +1,130 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_dump.cc: Print the contents of a minidump file in somewhat +// readable text. +// +// Author: Mark Mentovai + +#include + +#include "google_breakpad/processor/minidump.h" +#include "processor/logging.h" + +namespace { + +using google_breakpad::Minidump; +using google_breakpad::MinidumpThreadList; +using google_breakpad::MinidumpModuleList; +using google_breakpad::MinidumpMemoryList; +using google_breakpad::MinidumpException; +using google_breakpad::MinidumpSystemInfo; +using google_breakpad::MinidumpMiscInfo; +using google_breakpad::MinidumpBreakpadInfo; + +static bool PrintMinidumpDump(const char *minidump_file) { + Minidump minidump(minidump_file); + if (!minidump.Read()) { + BPLOG(ERROR) << "minidump.Read() failed"; + return false; + } + minidump.Print(); + + int errors = 0; + + MinidumpThreadList *thread_list = minidump.GetThreadList(); + if (!thread_list) { + ++errors; + BPLOG(ERROR) << "minidump.GetThreadList() failed"; + } else { + thread_list->Print(); + } + + MinidumpModuleList *module_list = minidump.GetModuleList(); + if (!module_list) { + ++errors; + BPLOG(ERROR) << "minidump.GetModuleList() failed"; + } else { + module_list->Print(); + } + + MinidumpMemoryList *memory_list = minidump.GetMemoryList(); + if (!memory_list) { + ++errors; + BPLOG(ERROR) << "minidump.GetMemoryList() failed"; + } else { + memory_list->Print(); + } + + MinidumpException *exception = minidump.GetException(); + if (!exception) { + BPLOG(INFO) << "minidump.GetException() failed"; + } else { + exception->Print(); + } + + MinidumpSystemInfo *system_info = minidump.GetSystemInfo(); + if (!system_info) { + ++errors; + BPLOG(ERROR) << "minidump.GetSystemInfo() failed"; + } else { + system_info->Print(); + } + + MinidumpMiscInfo *misc_info = minidump.GetMiscInfo(); + if (!misc_info) { + ++errors; + BPLOG(ERROR) << "minidump.GetMiscInfo() failed"; + } else { + misc_info->Print(); + } + + MinidumpBreakpadInfo *breakpad_info = minidump.GetBreakpadInfo(); + if (!breakpad_info) { + // Breakpad info is optional, so don't treat this as an error. + BPLOG(INFO) << "minidump.GetBreakpadInfo() failed"; + } else { + breakpad_info->Print(); + } + + return errors == 0; +} + +} // namespace + +int main(int argc, char **argv) { + BPLOG_INIT(&argc, &argv); + + if (argc != 2) { + fprintf(stderr, "usage: %s \n", argv[0]); + return 1; + } + + return PrintMinidumpDump(argv[1]) ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/processor/minidump_dump_test b/thirdparty/google-breakpad/r318/src/processor/minidump_dump_test new file mode 100644 index 00000000..fb62ace7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/minidump_dump_test @@ -0,0 +1,36 @@ +#!/bin/sh + +# Copyright (c) 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +testdata_dir=$srcdir/src/processor/testdata +./src/processor/minidump_dump $testdata_dir/minidump2.dmp | \ + tr -d '\015' | \ + diff -u $testdata_dir/minidump2.dump.out - +exit $? diff --git a/thirdparty/google-breakpad/r318/src/processor/minidump_processor.cc b/thirdparty/google-breakpad/r318/src/processor/minidump_processor.cc new file mode 100644 index 00000000..3c609170 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/minidump_processor.cc @@ -0,0 +1,992 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +#include "google_breakpad/processor/minidump_processor.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/process_state.h" +#include "processor/logging.h" +#include "processor/scoped_ptr.h" +#include "processor/stackwalker_x86.h" + +namespace google_breakpad { + +MinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier, + SourceLineResolverInterface *resolver) + : supplier_(supplier), resolver_(resolver) { +} + +MinidumpProcessor::~MinidumpProcessor() { +} + +MinidumpProcessor::ProcessResult MinidumpProcessor::Process( + const string &minidump_file, ProcessState *process_state) { + BPLOG(INFO) << "Processing minidump in file " << minidump_file; + + Minidump dump(minidump_file); + if (!dump.Read()) { + BPLOG(ERROR) << "Minidump " << minidump_file << " could not be read"; + return PROCESS_ERROR; + } + + process_state->Clear(); + + const MDRawHeader *header = dump.header(); + BPLOG_IF(ERROR, !header) << "Minidump " << minidump_file << " has no header"; + assert(header); + process_state->time_date_stamp_ = header->time_date_stamp; + + bool has_cpu_info = GetCPUInfo(&dump, &process_state->system_info_); + bool has_os_info = GetOSInfo(&dump, &process_state->system_info_); + + u_int32_t dump_thread_id = 0; + bool has_dump_thread = false; + u_int32_t requesting_thread_id = 0; + bool has_requesting_thread = false; + + MinidumpBreakpadInfo *breakpad_info = dump.GetBreakpadInfo(); + if (breakpad_info) { + has_dump_thread = breakpad_info->GetDumpThreadID(&dump_thread_id); + has_requesting_thread = + breakpad_info->GetRequestingThreadID(&requesting_thread_id); + } + + MinidumpException *exception = dump.GetException(); + if (exception) { + process_state->crashed_ = true; + has_requesting_thread = exception->GetThreadID(&requesting_thread_id); + + process_state->crash_reason_ = GetCrashReason( + &dump, &process_state->crash_address_); + } + + MinidumpModuleList *module_list = dump.GetModuleList(); + + // Put a copy of the module list into ProcessState object. This is not + // necessarily a MinidumpModuleList, but it adheres to the CodeModules + // interface, which is all that ProcessState needs to expose. + if (module_list) + process_state->modules_ = module_list->Copy(); + + MinidumpThreadList *threads = dump.GetThreadList(); + if (!threads) { + BPLOG(ERROR) << "Minidump " << minidump_file << " has no thread list"; + return PROCESS_ERROR; + } + + BPLOG(INFO) << "Minidump " << minidump_file << " has " << + (has_cpu_info ? "" : "no ") << "CPU info, " << + (has_os_info ? "" : "no ") << "OS info, " << + (breakpad_info != NULL ? "" : "no ") << "Breakpad info, " << + (exception != NULL ? "" : "no ") << "exception, " << + (module_list != NULL ? "" : "no ") << "module list, " << + (threads != NULL ? "" : "no ") << "thread list, " << + (has_dump_thread ? "" : "no ") << "dump thread, and " << + (has_requesting_thread ? "" : "no ") << "requesting thread"; + + bool interrupted = false; + bool found_requesting_thread = false; + unsigned int thread_count = threads->thread_count(); + for (unsigned int thread_index = 0; + thread_index < thread_count; + ++thread_index) { + char thread_string_buffer[64]; + snprintf(thread_string_buffer, sizeof(thread_string_buffer), "%d/%d", + thread_index, thread_count); + string thread_string = minidump_file + ":" + thread_string_buffer; + + MinidumpThread *thread = threads->GetThreadAtIndex(thread_index); + if (!thread) { + BPLOG(ERROR) << "Could not get thread for " << thread_string; + return PROCESS_ERROR; + } + + u_int32_t thread_id; + if (!thread->GetThreadID(&thread_id)) { + BPLOG(ERROR) << "Could not get thread ID for " << thread_string; + return PROCESS_ERROR; + } + + thread_string += " id " + HexString(thread_id); + BPLOG(INFO) << "Looking at thread " << thread_string; + + // If this thread is the thread that produced the minidump, don't process + // it. Because of the problems associated with a thread producing a + // dump of itself (when both its context and its stack are in flux), + // processing that stack wouldn't provide much useful data. + if (has_dump_thread && thread_id == dump_thread_id) { + continue; + } + + MinidumpContext *context = thread->GetContext(); + + if (has_requesting_thread && thread_id == requesting_thread_id) { + if (found_requesting_thread) { + // There can't be more than one requesting thread. + BPLOG(ERROR) << "Duplicate requesting thread: " << thread_string; + return PROCESS_ERROR; + } + + // Use processed_state->threads_.size() instead of thread_index. + // thread_index points to the thread index in the minidump, which + // might be greater than the thread index in the threads vector if + // any of the minidump's threads are skipped and not placed into the + // processed threads vector. The thread vector's current size will + // be the index of the current thread when it's pushed into the + // vector. + process_state->requesting_thread_ = process_state->threads_.size(); + + found_requesting_thread = true; + + if (process_state->crashed_) { + // Use the exception record's context for the crashed thread, instead + // of the thread's own context. For the crashed thread, the thread's + // own context is the state inside the exception handler. Using it + // would not result in the expected stack trace from the time of the + // crash. + context = exception->GetContext(); + } + } + + MinidumpMemoryRegion *thread_memory = thread->GetMemory(); + if (!thread_memory) { + BPLOG(ERROR) << "No memory region for " << thread_string; + return PROCESS_ERROR; + } + + // Use process_state->modules_ instead of module_list, because the + // |modules| argument will be used to populate the |module| fields in + // the returned StackFrame objects, which will be placed into the + // returned ProcessState object. module_list's lifetime is only as + // long as the Minidump object: it will be deleted when this function + // returns. process_state->modules_ is owned by the ProcessState object + // (just like the StackFrame objects), and is much more suitable for this + // task. + scoped_ptr stackwalker( + Stackwalker::StackwalkerForCPU(process_state->system_info(), + context, + thread_memory, + process_state->modules_, + supplier_, + resolver_)); + if (!stackwalker.get()) { + BPLOG(ERROR) << "No stackwalker for " << thread_string; + return PROCESS_ERROR; + } + + scoped_ptr stack(new CallStack()); + if (!stackwalker->Walk(stack.get())) { + BPLOG(INFO) << "Stackwalker interrupt (missing symbols?) at " << + thread_string; + interrupted = true; + } + process_state->threads_.push_back(stack.release()); + } + + if (interrupted) { + BPLOG(INFO) << "Processing interrupted for " << minidump_file; + return PROCESS_INTERRUPTED; + } + + // If a requesting thread was indicated, it must be present. + if (has_requesting_thread && !found_requesting_thread) { + // Don't mark as an error, but invalidate the requesting thread + BPLOG(ERROR) << "Minidump indicated requesting thread " << + HexString(requesting_thread_id) << ", not found in " << + minidump_file; + process_state->requesting_thread_ = -1; + } + + BPLOG(INFO) << "Processed " << minidump_file; + return PROCESS_OK; +} + +// Returns the MDRawSystemInfo from a minidump, or NULL if system info is +// not available from the minidump. If system_info is non-NULL, it is used +// to pass back the MinidumpSystemInfo object. +static const MDRawSystemInfo* GetSystemInfo(Minidump *dump, + MinidumpSystemInfo **system_info) { + MinidumpSystemInfo *minidump_system_info = dump->GetSystemInfo(); + if (!minidump_system_info) + return NULL; + + if (system_info) + *system_info = minidump_system_info; + + return minidump_system_info->system_info(); +} + +// static +bool MinidumpProcessor::GetCPUInfo(Minidump *dump, SystemInfo *info) { + assert(dump); + assert(info); + + info->cpu.clear(); + info->cpu_info.clear(); + + MinidumpSystemInfo *system_info; + const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, &system_info); + if (!raw_system_info) + return false; + + switch (raw_system_info->processor_architecture) { + case MD_CPU_ARCHITECTURE_X86: + case MD_CPU_ARCHITECTURE_AMD64: { + if (raw_system_info->processor_architecture == + MD_CPU_ARCHITECTURE_X86) + info->cpu = "x86"; + else + info->cpu = "amd64"; + + const string *cpu_vendor = system_info->GetCPUVendor(); + if (cpu_vendor) { + info->cpu_info = *cpu_vendor; + info->cpu_info.append(" "); + } + + char x86_info[36]; + snprintf(x86_info, sizeof(x86_info), "family %u model %u stepping %u", + raw_system_info->processor_level, + raw_system_info->processor_revision >> 8, + raw_system_info->processor_revision & 0xff); + info->cpu_info.append(x86_info); + break; + } + + case MD_CPU_ARCHITECTURE_PPC: { + info->cpu = "ppc"; + break; + } + + case MD_CPU_ARCHITECTURE_SPARC: { + info->cpu = "sparc"; + break; + } + + default: { + // Assign the numeric architecture ID into the CPU string. + char cpu_string[7]; + snprintf(cpu_string, sizeof(cpu_string), "0x%04x", + raw_system_info->processor_architecture); + info->cpu = cpu_string; + break; + } + } + + info->cpu_count = raw_system_info->number_of_processors; + + return true; +} + +// static +bool MinidumpProcessor::GetOSInfo(Minidump *dump, SystemInfo *info) { + assert(dump); + assert(info); + + info->os.clear(); + info->os_short.clear(); + info->os_version.clear(); + + MinidumpSystemInfo *system_info; + const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, &system_info); + if (!raw_system_info) + return false; + + info->os_short = system_info->GetOS(); + + switch (raw_system_info->platform_id) { + case MD_OS_WIN32_NT: { + info->os = "Windows NT"; + break; + } + + case MD_OS_WIN32_WINDOWS: { + info->os = "Windows"; + break; + } + + case MD_OS_MAC_OS_X: { + info->os = "Mac OS X"; + break; + } + + case MD_OS_LINUX: { + info->os = "Linux"; + break; + } + + case MD_OS_SOLARIS: { + info->os = "Solaris"; + break; + } + + default: { + // Assign the numeric platform ID into the OS string. + char os_string[11]; + snprintf(os_string, sizeof(os_string), "0x%08x", + raw_system_info->platform_id); + info->os = os_string; + break; + } + } + + char os_version_string[33]; + snprintf(os_version_string, sizeof(os_version_string), "%u.%u.%u", + raw_system_info->major_version, + raw_system_info->minor_version, + raw_system_info->build_number); + info->os_version = os_version_string; + + const string *csd_version = system_info->GetCSDVersion(); + if (csd_version) { + info->os_version.append(" "); + info->os_version.append(*csd_version); + } + + return true; +} + +// static +string MinidumpProcessor::GetCrashReason(Minidump *dump, u_int64_t *address) { + MinidumpException *exception = dump->GetException(); + if (!exception) + return ""; + + const MDRawExceptionStream *raw_exception = exception->exception(); + if (!raw_exception) + return ""; + + if (address) + *address = raw_exception->exception_record.exception_address; + + // The reason value is OS-specific and possibly CPU-specific. Set up + // sensible numeric defaults for the reason string in case we can't + // map the codes to a string (because there's no system info, or because + // it's an unrecognized platform, or because it's an unrecognized code.) + char reason_string[24]; + u_int32_t exception_code = raw_exception->exception_record.exception_code; + u_int32_t exception_flags = raw_exception->exception_record.exception_flags; + snprintf(reason_string, sizeof(reason_string), "0x%08x / 0x%08x", + exception_code, exception_flags); + string reason = reason_string; + + const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, NULL); + if (!raw_system_info) + return reason; + + switch (raw_system_info->platform_id) { + case MD_OS_MAC_OS_X: { + char flags_string[11]; + snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags); + switch (exception_code) { + case MD_EXCEPTION_MAC_BAD_ACCESS: + reason = "EXC_BAD_ACCESS / "; + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS: + reason.append("KERN_INVALID_ADDRESS"); + break; + case MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE: + reason.append("KERN_PROTECTION_FAILURE"); + break; + case MD_EXCEPTION_CODE_MAC_NO_ACCESS: + reason.append("KERN_NO_ACCESS"); + break; + case MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE: + reason.append("KERN_MEMORY_FAILURE"); + break; + case MD_EXCEPTION_CODE_MAC_MEMORY_ERROR: + reason.append("KERN_MEMORY_ERROR"); + break; + // These are ppc only but shouldn't be a problem as they're + // unused on x86 + case MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ: + reason.append("EXC_PPC_VM_PROT_READ"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_BADSPACE: + reason.append("EXC_PPC_BADSPACE"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED: + reason.append("EXC_PPC_UNALIGNED"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_MAC_BAD_INSTRUCTION: + reason = "EXC_BAD_INSTRUCTION / "; + switch (raw_system_info->processor_architecture) { + case MD_CPU_ARCHITECTURE_PPC: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL: + reason.append("EXC_PPC_INVALID_SYSCALL"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION: + reason.append("EXC_PPC_UNIPL_INST"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION: + reason.append("EXC_PPC_PRIVINST"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER: + reason.append("EXC_PPC_PRIVREG"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_TRACE: + reason.append("EXC_PPC_TRACE"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR: + reason.append("EXC_PPC_PERFMON"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + case MD_CPU_ARCHITECTURE_X86: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION: + reason.append("EXC_I386_INVOP"); + break; + case MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT: + reason.append("EXC_INVTSSFLT"); + break; + case MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT: + reason.append("EXC_SEGNPFLT"); + break; + case MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT: + reason.append("EXC_STKFLT"); + break; + case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT: + reason.append("EXC_GPFLT"); + break; + case MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT: + reason.append("EXC_ALIGNFLT"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_MAC_ARITHMETIC: + reason = "EXC_ARITHMETIC / "; + switch (raw_system_info->processor_architecture) { + case MD_CPU_ARCHITECTURE_PPC: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW: + reason.append("EXC_PPC_OVERFLOW"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE: + reason.append("EXC_PPC_ZERO_DIVIDE"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT: + reason.append("EXC_FLT_INEXACT"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE: + reason.append("EXC_PPC_FLT_ZERO_DIVIDE"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW: + reason.append("EXC_PPC_FLT_UNDERFLOW"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW: + reason.append("EXC_PPC_FLT_OVERFLOW"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER: + reason.append("EXC_PPC_FLT_NOT_A_NUMBER"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION: + reason.append("EXC_PPC_NOEMULATION"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST: + reason.append("EXC_PPC_ALTIVECASSIST"); + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + case MD_CPU_ARCHITECTURE_X86: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_X86_DIV: + reason.append("EXC_I386_DIV"); + break; + case MD_EXCEPTION_CODE_MAC_X86_INTO: + reason.append("EXC_I386_INTO"); + break; + case MD_EXCEPTION_CODE_MAC_X86_NOEXT: + reason.append("EXC_I386_NOEXT"); + break; + case MD_EXCEPTION_CODE_MAC_X86_EXTOVR: + reason.append("EXC_I386_EXTOVR"); + break; + case MD_EXCEPTION_CODE_MAC_X86_EXTERR: + reason.append("EXC_I386_EXTERR"); + break; + case MD_EXCEPTION_CODE_MAC_X86_EMERR: + reason.append("EXC_I386_EMERR"); + break; + case MD_EXCEPTION_CODE_MAC_X86_BOUND: + reason.append("EXC_I386_BOUND"); + break; + case MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR: + reason.append("EXC_I386_SSEEXTERR"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_MAC_EMULATION: + reason = "EXC_EMULATION / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_MAC_SOFTWARE: + reason = "EXC_SOFTWARE / "; + switch (exception_flags) { + // These are ppc only but shouldn't be a problem as they're + // unused on x86 + case MD_EXCEPTION_CODE_MAC_PPC_TRAP: + reason.append("EXC_PPC_TRAP"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_MIGRATE: + reason.append("EXC_PPC_MIGRATE"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_MAC_BREAKPOINT: + reason = "EXC_BREAKPOINT / "; + switch (raw_system_info->processor_architecture) { + case MD_CPU_ARCHITECTURE_PPC: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT: + reason.append("EXC_PPC_BREAKPOINT"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + case MD_CPU_ARCHITECTURE_X86: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_X86_SGL: + reason.append("EXC_I386_SGL"); + break; + case MD_EXCEPTION_CODE_MAC_X86_BPT: + reason.append("EXC_I386_BPT"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_MAC_SYSCALL: + reason = "EXC_SYSCALL / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_MAC_MACH_SYSCALL: + reason = "EXC_MACH_SYSCALL / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_MAC_RPC_ALERT: + reason = "EXC_RPC_ALERT / "; + reason.append(flags_string); + break; + } + break; + } + + case MD_OS_WIN32_NT: + case MD_OS_WIN32_WINDOWS: { + switch (exception_code) { + case MD_EXCEPTION_CODE_WIN_CONTROL_C: + reason = "DBG_CONTROL_C"; + break; + case MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION: + reason = "EXCEPTION_GUARD_PAGE"; + break; + case MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT: + reason = "EXCEPTION_DATATYPE_MISALIGNMENT"; + break; + case MD_EXCEPTION_CODE_WIN_BREAKPOINT: + reason = "EXCEPTION_BREAKPOINT"; + break; + case MD_EXCEPTION_CODE_WIN_SINGLE_STEP: + reason = "EXCEPTION_SINGLE_STEP"; + break; + case MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION: + // For EXCEPTION_ACCESS_VIOLATION, Windows puts the address that + // caused the fault in exception_information[1]. + // exception_information[0] is 0 if the violation was caused by + // an attempt to read data and 1 if it was an attempt to write + // data. + // This information is useful in addition to the code address, which + // will be present in the crash thread's instruction field anyway. + reason = "EXCEPTION_ACCESS_VIOLATION"; + if (address && + raw_exception->exception_record.number_parameters >= 2) { + *address = + raw_exception->exception_record.exception_information[1]; + } + break; + case MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR: + reason = "EXCEPTION_IN_PAGE_ERROR"; + break; + case MD_EXCEPTION_CODE_WIN_INVALID_HANDLE: + reason = "EXCEPTION_INVALID_HANDLE"; + break; + case MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION: + reason = "EXCEPTION_ILLEGAL_INSTRUCTION"; + break; + case MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION: + reason = "EXCEPTION_NONCONTINUABLE_EXCEPTION"; + break; + case MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION: + reason = "EXCEPTION_INVALID_DISPOSITION"; + break; + case MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED: + reason = "EXCEPTION_BOUNDS_EXCEEDED"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND: + reason = "EXCEPTION_FLT_DENORMAL_OPERAND"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO: + reason = "EXCEPTION_FLT_DIVIDE_BY_ZERO"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT: + reason = "EXCEPTION_FLT_INEXACT_RESULT"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION: + reason = "EXCEPTION_FLT_INVALID_OPERATION"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW: + reason = "EXCEPTION_FLT_OVERFLOW"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK: + reason = "EXCEPTION_FLT_STACK_CHECK"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW: + reason = "EXCEPTION_FLT_UNDERFLOW"; + break; + case MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO: + reason = "EXCEPTION_INT_DIVIDE_BY_ZERO"; + break; + case MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW: + reason = "EXCEPTION_INT_OVERFLOW"; + break; + case MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION: + reason = "EXCEPTION_PRIV_INSTRUCTION"; + break; + case MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW: + reason = "EXCEPTION_STACK_OVERFLOW"; + break; + case MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK: + reason = "EXCEPTION_POSSIBLE_DEADLOCK"; + break; + default: + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + + case MD_OS_LINUX: { + switch (exception_code) { + case MD_EXCEPTION_CODE_LIN_SIGHUP: + reason = "SIGHUP"; + break; + case MD_EXCEPTION_CODE_LIN_SIGINT: + reason = "SIGINT"; + break; + case MD_EXCEPTION_CODE_LIN_SIGQUIT: + reason = "SIGQUIT"; + break; + case MD_EXCEPTION_CODE_LIN_SIGILL: + reason = "SIGILL"; + break; + case MD_EXCEPTION_CODE_LIN_SIGTRAP: + reason = "SIGTRAP"; + break; + case MD_EXCEPTION_CODE_LIN_SIGABRT: + reason = "SIGABRT"; + break; + case MD_EXCEPTION_CODE_LIN_SIGBUS: + reason = "SIGBUS"; + break; + case MD_EXCEPTION_CODE_LIN_SIGFPE: + reason = "SIGFPE"; + break; + case MD_EXCEPTION_CODE_LIN_SIGKILL: + reason = "SIGKILL"; + break; + case MD_EXCEPTION_CODE_LIN_SIGUSR1: + reason = "SIGUSR1"; + break; + case MD_EXCEPTION_CODE_LIN_SIGSEGV: + reason = "SIGSEGV"; + break; + case MD_EXCEPTION_CODE_LIN_SIGUSR2: + reason = "SIGUSR2"; + break; + case MD_EXCEPTION_CODE_LIN_SIGPIPE: + reason = "SIGPIPE"; + break; + case MD_EXCEPTION_CODE_LIN_SIGALRM: + reason = "SIGALRM"; + break; + case MD_EXCEPTION_CODE_LIN_SIGTERM: + reason = "SIGTERM"; + break; + case MD_EXCEPTION_CODE_LIN_SIGSTKFLT: + reason = "SIGSTKFLT"; + break; + case MD_EXCEPTION_CODE_LIN_SIGCHLD: + reason = "SIGCHLD"; + break; + case MD_EXCEPTION_CODE_LIN_SIGCONT: + reason = "SIGCONT"; + break; + case MD_EXCEPTION_CODE_LIN_SIGSTOP: + reason = "SIGSTOP"; + break; + case MD_EXCEPTION_CODE_LIN_SIGTSTP: + reason = "SIGTSTP"; + break; + case MD_EXCEPTION_CODE_LIN_SIGTTIN: + reason = "SIGTTIN"; + break; + case MD_EXCEPTION_CODE_LIN_SIGTTOU: + reason = "SIGTTOU"; + break; + case MD_EXCEPTION_CODE_LIN_SIGURG: + reason = "SIGURG"; + break; + case MD_EXCEPTION_CODE_LIN_SIGXCPU: + reason = "SIGXCPU"; + break; + case MD_EXCEPTION_CODE_LIN_SIGXFSZ: + reason = "SIGXFSZ"; + break; + case MD_EXCEPTION_CODE_LIN_SIGVTALRM: + reason = "SIGVTALRM"; + break; + case MD_EXCEPTION_CODE_LIN_SIGPROF: + reason = "SIGPROF"; + break; + case MD_EXCEPTION_CODE_LIN_SIGWINCH: + reason = "SIGWINCH"; + break; + case MD_EXCEPTION_CODE_LIN_SIGIO: + reason = "SIGIO"; + break; + case MD_EXCEPTION_CODE_LIN_SIGPWR: + reason = "SIGPWR"; + break; + case MD_EXCEPTION_CODE_LIN_SIGSYS: + reason = "SIGSYS"; + break; + default: + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + + case MD_OS_SOLARIS: { + switch (exception_code) { + case MD_EXCEPTION_CODE_SOL_SIGHUP: + reason = "SIGHUP"; + break; + case MD_EXCEPTION_CODE_SOL_SIGINT: + reason = "SIGINT"; + break; + case MD_EXCEPTION_CODE_SOL_SIGQUIT: + reason = "SIGQUIT"; + break; + case MD_EXCEPTION_CODE_SOL_SIGILL: + reason = "SIGILL"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTRAP: + reason = "SIGTRAP"; + break; + case MD_EXCEPTION_CODE_SOL_SIGIOT: + reason = "SIGIOT | SIGABRT"; + break; + case MD_EXCEPTION_CODE_SOL_SIGEMT: + reason = "SIGEMT"; + break; + case MD_EXCEPTION_CODE_SOL_SIGFPE: + reason = "SIGFPE"; + break; + case MD_EXCEPTION_CODE_SOL_SIGKILL: + reason = "SIGKILL"; + break; + case MD_EXCEPTION_CODE_SOL_SIGBUS: + reason = "SIGBUS"; + break; + case MD_EXCEPTION_CODE_SOL_SIGSEGV: + reason = "SIGSEGV"; + break; + case MD_EXCEPTION_CODE_SOL_SIGSYS: + reason = "SIGSYS"; + break; + case MD_EXCEPTION_CODE_SOL_SIGPIPE: + reason = "SIGPIPE"; + break; + case MD_EXCEPTION_CODE_SOL_SIGALRM: + reason = "SIGALRM"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTERM: + reason = "SIGTERM"; + break; + case MD_EXCEPTION_CODE_SOL_SIGUSR1: + reason = "SIGUSR1"; + break; + case MD_EXCEPTION_CODE_SOL_SIGUSR2: + reason = "SIGUSR2"; + break; + case MD_EXCEPTION_CODE_SOL_SIGCLD: + reason = "SIGCLD | SIGCHLD"; + break; + case MD_EXCEPTION_CODE_SOL_SIGPWR: + reason = "SIGPWR"; + break; + case MD_EXCEPTION_CODE_SOL_SIGWINCH: + reason = "SIGWINCH"; + break; + case MD_EXCEPTION_CODE_SOL_SIGURG: + reason = "SIGURG"; + break; + case MD_EXCEPTION_CODE_SOL_SIGPOLL: + reason = "SIGPOLL | SIGIO"; + break; + case MD_EXCEPTION_CODE_SOL_SIGSTOP: + reason = "SIGSTOP"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTSTP: + reason = "SIGTSTP"; + break; + case MD_EXCEPTION_CODE_SOL_SIGCONT: + reason = "SIGCONT"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTTIN: + reason = "SIGTTIN"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTTOU: + reason = "SIGTTOU"; + break; + case MD_EXCEPTION_CODE_SOL_SIGVTALRM: + reason = "SIGVTALRM"; + break; + case MD_EXCEPTION_CODE_SOL_SIGPROF: + reason = "SIGPROF"; + break; + case MD_EXCEPTION_CODE_SOL_SIGXCPU: + reason = "SIGXCPU"; + break; + case MD_EXCEPTION_CODE_SOL_SIGXFSZ: + reason = "SIGXFSZ"; + break; + case MD_EXCEPTION_CODE_SOL_SIGWAITING: + reason = "SIGWAITING"; + break; + case MD_EXCEPTION_CODE_SOL_SIGLWP: + reason = "SIGLWP"; + break; + case MD_EXCEPTION_CODE_SOL_SIGFREEZE: + reason = "SIGFREEZE"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTHAW: + reason = "SIGTHAW"; + break; + case MD_EXCEPTION_CODE_SOL_SIGCANCEL: + reason = "SIGCANCEL"; + break; + case MD_EXCEPTION_CODE_SOL_SIGLOST: + reason = "SIGLOST"; + break; + case MD_EXCEPTION_CODE_SOL_SIGXRES: + reason = "SIGXRES"; + break; + case MD_EXCEPTION_CODE_SOL_SIGJVM1: + reason = "SIGJVM1"; + break; + case MD_EXCEPTION_CODE_SOL_SIGJVM2: + reason = "SIGJVM2"; + break; + default: + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + + default: { + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + } + + return reason; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/minidump_processor_unittest.cc b/thirdparty/google-breakpad/r318/src/processor/minidump_processor_unittest.cc new file mode 100644 index 00000000..bf8a8989 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/minidump_processor_unittest.cc @@ -0,0 +1,239 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Unit test for MinidumpProcessor. Uses a pre-generated minidump and +// corresponding symbol file, and checks the stack frames for correctness. + +#include +#include +#include +#include +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/minidump_processor.h" +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/stack_frame.h" +#include "google_breakpad/processor/symbol_supplier.h" +#include "processor/logging.h" +#include "processor/scoped_ptr.h" + +namespace { + +using std::string; +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::MinidumpProcessor; +using google_breakpad::ProcessState; +using google_breakpad::scoped_ptr; +using google_breakpad::SymbolSupplier; +using google_breakpad::SystemInfo; + +static const char *kSystemInfoOS = "Windows NT"; +static const char *kSystemInfoOSShort = "windows"; +static const char *kSystemInfoOSVersion = "5.1.2600 Service Pack 2"; +static const char *kSystemInfoCPU = "x86"; +static const char *kSystemInfoCPUInfo = + "GenuineIntel family 6 model 13 stepping 8"; + +#define ASSERT_TRUE(cond) \ + if (!(cond)) { \ + fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \ + return false; \ + } + +#define ASSERT_FALSE(cond) ASSERT_TRUE(!(cond)) + +#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2)) + +// Use ASSERT_*_ABORT in functions that can't return a boolean. +#define ASSERT_TRUE_ABORT(cond) \ + if (!(cond)) { \ + fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \ + abort(); \ + } + +#define ASSERT_EQ_ABORT(e1, e2) ASSERT_TRUE_ABORT((e1) == (e2)) + +class TestSymbolSupplier : public SymbolSupplier { + public: + TestSymbolSupplier() : interrupt_(false) {} + + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file); + + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data); + + // When set to true, causes the SymbolSupplier to return INTERRUPT + void set_interrupt(bool interrupt) { interrupt_ = interrupt; } + + private: + bool interrupt_; +}; + +SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile( + const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file) { + ASSERT_TRUE_ABORT(module); + ASSERT_TRUE_ABORT(system_info); + ASSERT_EQ_ABORT(system_info->cpu, kSystemInfoCPU); + ASSERT_EQ_ABORT(system_info->cpu_info, kSystemInfoCPUInfo); + ASSERT_EQ_ABORT(system_info->os, kSystemInfoOS); + ASSERT_EQ_ABORT(system_info->os_short, kSystemInfoOSShort); + ASSERT_EQ_ABORT(system_info->os_version, kSystemInfoOSVersion); + + if (interrupt_) { + return INTERRUPT; + } + + if (module && module->code_file() == "c:\\test_app.exe") { + *symbol_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/processor/testdata/symbols/test_app.pdb/" + + module->debug_identifier() + + "/test_app.sym"; + return FOUND; + } + + return NOT_FOUND; +} + +SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile( + const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data) { + SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info, + symbol_file); + if (s == FOUND) { + std::ifstream in(symbol_file->c_str()); + std::getline(in, *symbol_data, std::string::traits_type::to_char_type( + std::string::traits_type::eof())); + in.close(); + } + + return s; +} + +static bool RunTests() { + TestSymbolSupplier supplier; + BasicSourceLineResolver resolver; + MinidumpProcessor processor(&supplier, &resolver); + + string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/processor/testdata/minidump2.dmp"; + + ProcessState state; + ASSERT_EQ(processor.Process(minidump_file, &state), + MinidumpProcessor::PROCESS_OK); + ASSERT_EQ(state.system_info()->os, kSystemInfoOS); + ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort); + ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion); + ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU); + ASSERT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo); + ASSERT_TRUE(state.crashed()); + ASSERT_EQ(state.crash_reason(), "EXCEPTION_ACCESS_VIOLATION"); + ASSERT_EQ(state.crash_address(), 0x45); + ASSERT_EQ(state.threads()->size(), 1); + ASSERT_EQ(state.requesting_thread(), 0); + + CallStack *stack = state.threads()->at(0); + ASSERT_TRUE(stack); + ASSERT_EQ(stack->frames()->size(), 4); + + ASSERT_TRUE(stack->frames()->at(0)->module); + ASSERT_EQ(stack->frames()->at(0)->module->base_address(), 0x400000); + ASSERT_EQ(stack->frames()->at(0)->module->code_file(), "c:\\test_app.exe"); + ASSERT_EQ(stack->frames()->at(0)->function_name, + "`anonymous namespace'::CrashFunction"); + ASSERT_EQ(stack->frames()->at(0)->source_file_name, "c:\\test_app.cc"); + ASSERT_EQ(stack->frames()->at(0)->source_line, 58); + + ASSERT_TRUE(stack->frames()->at(1)->module); + ASSERT_EQ(stack->frames()->at(1)->module->base_address(), 0x400000); + ASSERT_EQ(stack->frames()->at(1)->module->code_file(), "c:\\test_app.exe"); + ASSERT_EQ(stack->frames()->at(1)->function_name, "main"); + ASSERT_EQ(stack->frames()->at(1)->source_file_name, "c:\\test_app.cc"); + ASSERT_EQ(stack->frames()->at(1)->source_line, 65); + + // This comes from the CRT + ASSERT_TRUE(stack->frames()->at(2)->module); + ASSERT_EQ(stack->frames()->at(2)->module->base_address(), 0x400000); + ASSERT_EQ(stack->frames()->at(2)->module->code_file(), "c:\\test_app.exe"); + ASSERT_EQ(stack->frames()->at(2)->function_name, "__tmainCRTStartup"); + ASSERT_EQ(stack->frames()->at(2)->source_file_name, + "f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0.c"); + ASSERT_EQ(stack->frames()->at(2)->source_line, 327); + + // No debug info available for kernel32.dll + ASSERT_TRUE(stack->frames()->at(3)->module); + ASSERT_EQ(stack->frames()->at(3)->module->base_address(), 0x7c800000); + ASSERT_EQ(stack->frames()->at(3)->module->code_file(), + "C:\\WINDOWS\\system32\\kernel32.dll"); + ASSERT_TRUE(stack->frames()->at(3)->function_name.empty()); + ASSERT_TRUE(stack->frames()->at(3)->source_file_name.empty()); + ASSERT_EQ(stack->frames()->at(3)->source_line, 0); + + ASSERT_EQ(state.modules()->module_count(), 13); + ASSERT_TRUE(state.modules()->GetMainModule()); + ASSERT_EQ(state.modules()->GetMainModule()->code_file(), "c:\\test_app.exe"); + ASSERT_FALSE(state.modules()->GetModuleForAddress(0)); + ASSERT_EQ(state.modules()->GetMainModule(), + state.modules()->GetModuleForAddress(0x400000)); + ASSERT_EQ(state.modules()->GetModuleForAddress(0x7c801234)->debug_file(), + "kernel32.pdb"); + ASSERT_EQ(state.modules()->GetModuleForAddress(0x77d43210)->version(), + "5.1.2600.2622"); + + // Test that the symbol supplier can interrupt processing + state.Clear(); + supplier.set_interrupt(true); + ASSERT_EQ(processor.Process(minidump_file, &state), + MinidumpProcessor::PROCESS_INTERRUPTED); + + return true; +} + +} // namespace + +int main(int argc, char *argv[]) { + BPLOG_INIT(&argc, &argv); + + if (!RunTests()) { + return 1; + } + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk b/thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk new file mode 100644 index 0000000000000000000000000000000000000000..588778670b6911c99e68be41e6d2621760e76135 GIT binary patch literal 458288 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 +#include +#include +#include + +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/minidump_processor.h" +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/logging.h" +#include "processor/pathname_stripper.h" +#include "processor/scoped_ptr.h" +#include "processor/simple_symbol_supplier.h" + +namespace { + +using std::string; +using std::vector; +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::CodeModules; +using google_breakpad::MinidumpModule; +using google_breakpad::MinidumpProcessor; +using google_breakpad::PathnameStripper; +using google_breakpad::ProcessState; +using google_breakpad::scoped_ptr; +using google_breakpad::SimpleSymbolSupplier; +using google_breakpad::StackFrame; +using google_breakpad::StackFramePPC; +using google_breakpad::StackFrameSPARC; +using google_breakpad::StackFrameX86; +using google_breakpad::StackFrameAMD64; + +// Separator character for machine readable output. +static const char kOutputSeparator = '|'; + +// PrintRegister prints a register's name and value to stdout. It will +// print four registers on a line. For the first register in a set, +// pass 0 for |sequence|. For registers in a set, pass the most recent +// return value of PrintRegister. Note that PrintRegister will print a +// newline before the first register (with |sequence| set to 0) is printed. +// The caller is responsible for printing the final newline after a set +// of registers is completely printed, regardless of the number of calls +// to PrintRegister. +static int PrintRegister(const char *name, u_int32_t value, int sequence) { + if (sequence % 4 == 0) { + printf("\n "); + } + printf(" %5s = 0x%08x", name, value); + return ++sequence; +} + +// StripSeparator takes a string |original| and returns a copy +// of the string with all occurences of |kOutputSeparator| removed. +static string StripSeparator(const string &original) { + string result = original; + string::size_type position = 0; + while ((position = result.find(kOutputSeparator, position)) != string::npos) { + result.erase(position, 1); + } + return result; +} + +// PrintStack prints the call stack in |stack| to stdout, in a reasonably +// useful form. Module, function, and source file names are displayed if +// they are available. The code offset to the base code address of the +// source line, function, or module is printed, preferring them in that +// order. If no source line, function, or module information is available, +// an absolute code offset is printed. +// +// If |cpu| is a recognized CPU name, relevant register state for each stack +// frame printed is also output, if available. +static void PrintStack(const CallStack *stack, const string &cpu) { + int frame_count = stack->frames()->size(); + for (int frame_index = 0; frame_index < frame_count; ++frame_index) { + const StackFrame *frame = stack->frames()->at(frame_index); + printf("%2d ", frame_index); + + if (frame->module) { + printf("%s", PathnameStripper::File(frame->module->code_file()).c_str()); + if (!frame->function_name.empty()) { + printf("!%s", frame->function_name.c_str()); + if (!frame->source_file_name.empty()) { + string source_file = PathnameStripper::File(frame->source_file_name); + printf(" [%s : %d + 0x%" PRIx64 "]", + source_file.c_str(), + frame->source_line, + frame->instruction - frame->source_line_base); + } else { + printf(" + 0x%" PRIx64, frame->instruction - frame->function_base); + } + } else { + printf(" + 0x%" PRIx64, + frame->instruction - frame->module->base_address()); + } + } else { + printf("0x%" PRIx64, frame->instruction); + } + + int sequence = 0; + if (cpu == "x86") { + const StackFrameX86 *frame_x86 = + reinterpret_cast(frame); + + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EIP) + sequence = PrintRegister("eip", frame_x86->context.eip, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_ESP) + sequence = PrintRegister("esp", frame_x86->context.esp, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EBP) + sequence = PrintRegister("ebp", frame_x86->context.ebp, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EBX) + sequence = PrintRegister("ebx", frame_x86->context.ebx, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_ESI) + sequence = PrintRegister("esi", frame_x86->context.esi, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EDI) + sequence = PrintRegister("edi", frame_x86->context.edi, sequence); + if (frame_x86->context_validity == StackFrameX86::CONTEXT_VALID_ALL) { + sequence = PrintRegister("eax", frame_x86->context.eax, sequence); + sequence = PrintRegister("ecx", frame_x86->context.ecx, sequence); + sequence = PrintRegister("edx", frame_x86->context.edx, sequence); + sequence = PrintRegister("efl", frame_x86->context.eflags, sequence); + } + } else if (cpu == "ppc") { + const StackFramePPC *frame_ppc = + reinterpret_cast(frame); + + if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_SRR0) + sequence = PrintRegister("srr0", frame_ppc->context.srr0, sequence); + if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_GPR1) + sequence = PrintRegister("r1", frame_ppc->context.gpr[1], sequence); + } else if (cpu == "amd64") { + const StackFrameAMD64 *frame_amd64 = + reinterpret_cast(frame); + + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RIP) + sequence = PrintRegister("rip", frame_amd64->context.rip, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RSP) + sequence = PrintRegister("rsp", frame_amd64->context.rsp, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBP) + sequence = PrintRegister("rbp", frame_amd64->context.rbp, sequence); + } else if (cpu == "sparc") { + const StackFrameSPARC *frame_sparc = + reinterpret_cast(frame); + + if (frame_sparc->context_validity & StackFrameSPARC::CONTEXT_VALID_SP) + sequence = PrintRegister("sp", frame_sparc->context.g_r[14], sequence); + if (frame_sparc->context_validity & StackFrameSPARC::CONTEXT_VALID_FP) + sequence = PrintRegister("fp", frame_sparc->context.g_r[30], sequence); + if (frame_sparc->context_validity & StackFrameSPARC::CONTEXT_VALID_PC) + sequence = PrintRegister("pc", frame_sparc->context.pc, sequence); + } + printf("\n"); + } +} + +// PrintStackMachineReadable prints the call stack in |stack| to stdout, +// in the following machine readable pipe-delimited text format: +// thread number|frame number|module|function|source file|line|offset +// +// Module, function, source file, and source line may all be empty +// depending on availability. The code offset follows the same rules as +// PrintStack above. +static void PrintStackMachineReadable(int thread_num, const CallStack *stack) { + int frame_count = stack->frames()->size(); + for (int frame_index = 0; frame_index < frame_count; ++frame_index) { + const StackFrame *frame = stack->frames()->at(frame_index); + printf("%d%c%d%c", thread_num, kOutputSeparator, frame_index, + kOutputSeparator); + + if (frame->module) { + assert(!frame->module->code_file().empty()); + printf("%s", StripSeparator(PathnameStripper::File( + frame->module->code_file())).c_str()); + if (!frame->function_name.empty()) { + printf("%c%s", kOutputSeparator, + StripSeparator(frame->function_name).c_str()); + if (!frame->source_file_name.empty()) { + printf("%c%s%c%d%c0x%" PRIx64, + kOutputSeparator, + StripSeparator(frame->source_file_name).c_str(), + kOutputSeparator, + frame->source_line, + kOutputSeparator, + frame->instruction - frame->source_line_base); + } else { + printf("%c%c%c0x%" PRIx64, + kOutputSeparator, // empty source file + kOutputSeparator, // empty source line + kOutputSeparator, + frame->instruction - frame->function_base); + } + } else { + printf("%c%c%c%c0x%" PRIx64, + kOutputSeparator, // empty function name + kOutputSeparator, // empty source file + kOutputSeparator, // empty source line + kOutputSeparator, + frame->instruction - frame->module->base_address()); + } + } else { + // the printf before this prints a trailing separator for module name + printf("%c%c%c%c0x%" PRIx64, + kOutputSeparator, // empty function name + kOutputSeparator, // empty source file + kOutputSeparator, // empty source line + kOutputSeparator, + frame->instruction); + } + printf("\n"); + } +} + +static void PrintModules(const CodeModules *modules) { + if (!modules) + return; + + printf("\n"); + printf("Loaded modules:\n"); + + u_int64_t main_address = 0; + const CodeModule *main_module = modules->GetMainModule(); + if (main_module) { + main_address = main_module->base_address(); + } + + unsigned int module_count = modules->module_count(); + for (unsigned int module_sequence = 0; + module_sequence < module_count; + ++module_sequence) { + const CodeModule *module = modules->GetModuleAtSequence(module_sequence); + u_int64_t base_address = module->base_address(); + printf("0x%08" PRIx64 " - 0x%08" PRIx64 " %s %s%s\n", + base_address, base_address + module->size() - 1, + PathnameStripper::File(module->code_file()).c_str(), + module->version().empty() ? "???" : module->version().c_str(), + main_module != NULL && base_address == main_address ? + " (main)" : ""); + } +} + +// PrintModulesMachineReadable outputs a list of loaded modules, +// one per line, in the following machine-readable pipe-delimited +// text format: +// Module|{Module Filename}|{Version}|{Debug Filename}|{Debug Identifier}| +// {Base Address}|{Max Address}|{Main} +static void PrintModulesMachineReadable(const CodeModules *modules) { + if (!modules) + return; + + u_int64_t main_address = 0; + const CodeModule *main_module = modules->GetMainModule(); + if (main_module) { + main_address = main_module->base_address(); + } + + unsigned int module_count = modules->module_count(); + for (unsigned int module_sequence = 0; + module_sequence < module_count; + ++module_sequence) { + const CodeModule *module = modules->GetModuleAtSequence(module_sequence); + u_int64_t base_address = module->base_address(); + printf("Module%c%s%c%s%c%s%c%s%c0x%08" PRIx64 "%c0x%08" PRIx64 "%c%d\n", + kOutputSeparator, + StripSeparator(PathnameStripper::File(module->code_file())).c_str(), + kOutputSeparator, StripSeparator(module->version()).c_str(), + kOutputSeparator, + StripSeparator(PathnameStripper::File(module->debug_file())).c_str(), + kOutputSeparator, + StripSeparator(module->debug_identifier()).c_str(), + kOutputSeparator, base_address, + kOutputSeparator, base_address + module->size() - 1, + kOutputSeparator, + main_module != NULL && base_address == main_address ? 1 : 0); + } +} + +static void PrintProcessState(const ProcessState& process_state) { + // Print OS and CPU information. + string cpu = process_state.system_info()->cpu; + string cpu_info = process_state.system_info()->cpu_info; + printf("Operating system: %s\n", process_state.system_info()->os.c_str()); + printf(" %s\n", + process_state.system_info()->os_version.c_str()); + printf("CPU: %s\n", cpu.c_str()); + if (!cpu_info.empty()) { + // This field is optional. + printf(" %s\n", cpu_info.c_str()); + } + printf(" %d CPU%s\n", + process_state.system_info()->cpu_count, + process_state.system_info()->cpu_count != 1 ? "s" : ""); + printf("\n"); + + // Print crash information. + if (process_state.crashed()) { + printf("Crash reason: %s\n", process_state.crash_reason().c_str()); + printf("Crash address: 0x%" PRIx64 "\n", process_state.crash_address()); + } else { + printf("No crash\n"); + } + + // If the thread that requested the dump is known, print it first. + int requesting_thread = process_state.requesting_thread(); + if (requesting_thread != -1) { + printf("\n"); + printf("Thread %d (%s)\n", + requesting_thread, + process_state.crashed() ? "crashed" : + "requested dump, did not crash"); + PrintStack(process_state.threads()->at(requesting_thread), cpu); + } + + // Print all of the threads in the dump. + int thread_count = process_state.threads()->size(); + for (int thread_index = 0; thread_index < thread_count; ++thread_index) { + if (thread_index != requesting_thread) { + // Don't print the crash thread again, it was already printed. + printf("\n"); + printf("Thread %d\n", thread_index); + PrintStack(process_state.threads()->at(thread_index), cpu); + } + } + + PrintModules(process_state.modules()); +} + +static void PrintProcessStateMachineReadable(const ProcessState& process_state) +{ + // Print OS and CPU information. + // OS|{OS Name}|{OS Version} + // CPU|{CPU Name}|{CPU Info}|{Number of CPUs} + printf("OS%c%s%c%s\n", kOutputSeparator, + StripSeparator(process_state.system_info()->os).c_str(), + kOutputSeparator, + StripSeparator(process_state.system_info()->os_version).c_str()); + printf("CPU%c%s%c%s%c%d\n", kOutputSeparator, + StripSeparator(process_state.system_info()->cpu).c_str(), + kOutputSeparator, + // this may be empty + StripSeparator(process_state.system_info()->cpu_info).c_str(), + kOutputSeparator, + process_state.system_info()->cpu_count); + + int requesting_thread = process_state.requesting_thread(); + + // Print crash information. + // Crash|{Crash Reason}|{Crash Address}|{Crashed Thread} + printf("Crash%c", kOutputSeparator); + if (process_state.crashed()) { + printf("%s%c0x%" PRIx64 "%c", + StripSeparator(process_state.crash_reason()).c_str(), + kOutputSeparator, process_state.crash_address(), kOutputSeparator); + } else { + printf("No crash%c%c", kOutputSeparator, kOutputSeparator); + } + + if (requesting_thread != -1) { + printf("%d\n", requesting_thread); + } else { + printf("\n"); + } + + PrintModulesMachineReadable(process_state.modules()); + + // blank line to indicate start of threads + printf("\n"); + + // If the thread that requested the dump is known, print it first. + if (requesting_thread != -1) { + PrintStackMachineReadable(requesting_thread, + process_state.threads()->at(requesting_thread)); + } + + // Print all of the threads in the dump. + int thread_count = process_state.threads()->size(); + for (int thread_index = 0; thread_index < thread_count; ++thread_index) { + if (thread_index != requesting_thread) { + // Don't print the crash thread again, it was already printed. + PrintStackMachineReadable(thread_index, + process_state.threads()->at(thread_index)); + } + } +} + +// Processes |minidump_file| using MinidumpProcessor. |symbol_path|, if +// non-empty, is the base directory of a symbol storage area, laid out in +// the format required by SimpleSymbolSupplier. If such a storage area +// is specified, it is made available for use by the MinidumpProcessor. +// +// Returns the value of MinidumpProcessor::Process. If processing succeeds, +// prints identifying OS and CPU information from the minidump, crash +// information if the minidump was produced as a result of a crash, and +// call stacks for each thread contained in the minidump. All information +// is printed to stdout. +static bool PrintMinidumpProcess(const string &minidump_file, + const vector &symbol_paths, + bool machine_readable) { + scoped_ptr symbol_supplier; + if (!symbol_paths.empty()) { + // TODO(mmentovai): check existence of symbol_path if specified? + symbol_supplier.reset(new SimpleSymbolSupplier(symbol_paths)); + } + + BasicSourceLineResolver resolver; + MinidumpProcessor minidump_processor(symbol_supplier.get(), &resolver); + + // Process the minidump. + ProcessState process_state; + if (minidump_processor.Process(minidump_file, &process_state) != + MinidumpProcessor::PROCESS_OK) { + BPLOG(ERROR) << "MinidumpProcessor::Process failed"; + return false; + } + + if (machine_readable) { + PrintProcessStateMachineReadable(process_state); + } else { + PrintProcessState(process_state); + } + + return true; +} + +} // namespace + +static void usage(const char *program_name) { + fprintf(stderr, "usage: %s [-m] [symbol-path ...]\n" + " -m : Output in machine-readable format\n", + program_name); +} + +int main(int argc, char **argv) { + BPLOG_INIT(&argc, &argv); + + if (argc < 2) { + usage(argv[0]); + return 1; + } + + const char *minidump_file; + bool machine_readable; + int symbol_path_arg; + + if (strcmp(argv[1], "-m") == 0) { + if (argc < 3) { + usage(argv[0]); + return 1; + } + + machine_readable = true; + minidump_file = argv[2]; + symbol_path_arg = 3; + } else { + machine_readable = false; + minidump_file = argv[1]; + symbol_path_arg = 2; + } + + // extra arguments are symbol paths + std::vector symbol_paths; + if (argc > symbol_path_arg) { + for (int argi = symbol_path_arg; argi < argc; ++argi) + symbol_paths.push_back(argv[argi]); + } + + return PrintMinidumpProcess(minidump_file, + symbol_paths, + machine_readable) ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk_machine_readable_test b/thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk_machine_readable_test new file mode 100644 index 00000000..2aadb241 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk_machine_readable_test @@ -0,0 +1,37 @@ +#!/bin/sh + +# Copyright (c) 2007, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +testdata_dir=$srcdir/src/processor/testdata +./src/processor/minidump_stackwalk -m $testdata_dir/minidump2.dmp \ + $testdata_dir/symbols | \ + tr -d '\015' | \ + diff -u $testdata_dir/minidump2.stackwalk.machine_readable.out - +exit $? diff --git a/thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk_test b/thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk_test new file mode 100644 index 00000000..f9790279 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/minidump_stackwalk_test @@ -0,0 +1,37 @@ +#!/bin/sh + +# Copyright (c) 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +testdata_dir=$srcdir/src/processor/testdata +./src/processor/minidump_stackwalk $testdata_dir/minidump2.dmp \ + $testdata_dir/symbols | \ + tr -d '\015' | \ + diff -u $testdata_dir/minidump2.stackwalk.out - +exit $? diff --git a/thirdparty/google-breakpad/r318/src/processor/pathname_stripper.cc b/thirdparty/google-breakpad/r318/src/processor/pathname_stripper.cc new file mode 100644 index 00000000..839287bd --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/pathname_stripper.cc @@ -0,0 +1,56 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// pathname_stripper.cc: Manipulates pathnames into their component parts. +// +// See pathname_stripper.h for documentation. +// +// Author: Mark Mentovai + +#include "processor/pathname_stripper.h" + +namespace google_breakpad { + +// static +string PathnameStripper::File(const string &path) { + string::size_type slash = path.rfind('/'); + string::size_type backslash = path.rfind('\\'); + + string::size_type file_start = 0; + if (slash != string::npos && + (backslash == string::npos || slash > backslash)) { + file_start = slash + 1; + } else if (backslash != string::npos) { + file_start = backslash + 1; + } + + return path.substr(file_start); +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/pathname_stripper.h b/thirdparty/google-breakpad/r318/src/processor/pathname_stripper.h new file mode 100644 index 00000000..17db75d6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/pathname_stripper.h @@ -0,0 +1,53 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// pathname_stripper.h: Manipulates pathnames into their component parts. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_PATHNAME_STRIPPER_H__ +#define PROCESSOR_PATHNAME_STRIPPER_H__ + +#include + +namespace google_breakpad { + +using std::string; + +class PathnameStripper { + public: + // Given path, a pathname with components separated by slashes (/) or + // backslashes (\), returns the trailing component, without any separator. + // If path ends in a separator character, returns an empty string. + static string File(const string &path); +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_PATHNAME_STRIPPER_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/pathname_stripper_unittest.cc b/thirdparty/google-breakpad/r318/src/processor/pathname_stripper_unittest.cc new file mode 100644 index 00000000..957c94f2 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/pathname_stripper_unittest.cc @@ -0,0 +1,85 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "processor/pathname_stripper.h" +#include "processor/logging.h" + +#define ASSERT_TRUE(condition) \ + if (!(condition)) { \ + fprintf(stderr, "FAIL: %s @ %s:%d\n", #condition, __FILE__, __LINE__); \ + return false; \ + } + +#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2)) + +namespace { + +using google_breakpad::PathnameStripper; + +static bool RunTests() { + ASSERT_EQ(PathnameStripper::File("/dir/file"), "file"); + ASSERT_EQ(PathnameStripper::File("\\dir\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("/dir\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("\\dir/file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir/file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir/\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir\\/file"), "file"); + ASSERT_EQ(PathnameStripper::File("file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir/"), ""); + ASSERT_EQ(PathnameStripper::File("dir\\"), ""); + ASSERT_EQ(PathnameStripper::File("dir/dir/"), ""); + ASSERT_EQ(PathnameStripper::File("dir\\dir\\"), ""); + ASSERT_EQ(PathnameStripper::File("dir1/dir2/file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir1\\dir2\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir1/dir2\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir1\\dir2/file"), "file"); + ASSERT_EQ(PathnameStripper::File(""), ""); + ASSERT_EQ(PathnameStripper::File("1"), "1"); + ASSERT_EQ(PathnameStripper::File("1/2"), "2"); + ASSERT_EQ(PathnameStripper::File("1\\2"), "2"); + ASSERT_EQ(PathnameStripper::File("/1/2"), "2"); + ASSERT_EQ(PathnameStripper::File("\\1\\2"), "2"); + ASSERT_EQ(PathnameStripper::File("dir//file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir\\\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("/dir//file"), "file"); + ASSERT_EQ(PathnameStripper::File("\\dir\\\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("c:\\dir\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("c:\\dir\\file.ext"), "file.ext"); + + return true; +} + +} // namespace + +int main(int argc, char **argv) { + BPLOG_INIT(&argc, &argv); + + return RunTests() ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/processor/postfix_evaluator-inl.h b/thirdparty/google-breakpad/r318/src/processor/postfix_evaluator-inl.h new file mode 100644 index 00000000..aa0851d9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/postfix_evaluator-inl.h @@ -0,0 +1,282 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// postfix_evaluator-inl.h: Postfix (reverse Polish) notation expression +// evaluator. +// +// Documentation in postfix_evaluator.h. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_POSTFIX_EVALUATOR_INL_H__ +#define PROCESSOR_POSTFIX_EVALUATOR_INL_H__ + + +#include + +#include "processor/postfix_evaluator.h" +#include "google_breakpad/processor/memory_region.h" +#include "processor/logging.h" + +namespace google_breakpad { + +using std::istringstream; +using std::ostringstream; + + +// A small class used in Evaluate to make sure to clean up the stack +// before returning failure. +class AutoStackClearer { + public: + explicit AutoStackClearer(vector *stack) : stack_(stack) {} + ~AutoStackClearer() { stack_->clear(); } + + private: + vector *stack_; +}; + + +template +bool PostfixEvaluator::Evaluate(const string &expression, + DictionaryValidityType *assigned) { + // Ensure that the stack is cleared before returning. + AutoStackClearer clearer(&stack_); + + // Tokenize, splitting on whitespace. + istringstream stream(expression); + string token; + while (stream >> token) { + // There are enough binary operations that do exactly the same thing + // (other than the specific operation, of course) that it makes sense + // to share as much code as possible. + enum BinaryOperation { + BINARY_OP_NONE = 0, + BINARY_OP_ADD, + BINARY_OP_SUBTRACT, + BINARY_OP_MULTIPLY, + BINARY_OP_DIVIDE_QUOTIENT, + BINARY_OP_DIVIDE_MODULUS + }; + + BinaryOperation operation = BINARY_OP_NONE; + if (token == "+") + operation = BINARY_OP_ADD; + else if (token == "-") + operation = BINARY_OP_SUBTRACT; + else if (token == "*") + operation = BINARY_OP_MULTIPLY; + else if (token == "/") + operation = BINARY_OP_DIVIDE_QUOTIENT; + else if (token == "%") + operation = BINARY_OP_DIVIDE_MODULUS; + + if (operation != BINARY_OP_NONE) { + // Get the operands. + ValueType operand1, operand2; + if (!PopValues(&operand1, &operand2)) { + BPLOG(ERROR) << "Could not PopValues to get two values for binary " + "operation " << token << ": " << expression; + return false; + } + + // Perform the operation. + ValueType result; + switch (operation) { + case BINARY_OP_ADD: + result = operand1 + operand2; + break; + case BINARY_OP_SUBTRACT: + result = operand1 - operand2; + break; + case BINARY_OP_MULTIPLY: + result = operand1 * operand2; + break; + case BINARY_OP_DIVIDE_QUOTIENT: + result = operand1 / operand2; + break; + case BINARY_OP_DIVIDE_MODULUS: + result = operand1 % operand2; + break; + case BINARY_OP_NONE: + // This will not happen, but compilers will want a default or + // BINARY_OP_NONE case. + BPLOG(ERROR) << "Not reached!"; + return false; + break; + } + + // Save the result. + PushValue(result); + } else if (token == "^") { + // ^ for unary dereference. Can't dereference without memory. + if (!memory_) { + BPLOG(ERROR) << "Attempt to dereference without memory: " << + expression; + return false; + } + + ValueType address; + if (!PopValue(&address)) { + BPLOG(ERROR) << "Could not PopValue to get value to derefence: " << + expression; + return false; + } + + ValueType value; + if (!memory_->GetMemoryAtAddress(address, &value)) { + BPLOG(ERROR) << "Could not dereference memory at address " << + HexString(address) << ": " << expression; + return false; + } + + PushValue(value); + } else if (token == "=") { + // = for assignment. + ValueType value; + if (!PopValue(&value)) { + BPLOG(ERROR) << "Could not PopValue to get value to assign: " << + expression; + return false; + } + + // Assignment is only meaningful when assigning into an identifier. + // The identifier must name a variable, not a constant. Variables + // begin with '$'. + string identifier; + if (PopValueOrIdentifier(NULL, &identifier) != POP_RESULT_IDENTIFIER) { + BPLOG(ERROR) << "PopValueOrIdentifier returned a value, but an " + "identifier is needed to assign " << + HexString(value) << ": " << expression; + return false; + } + if (identifier.empty() || identifier[0] != '$') { + BPLOG(ERROR) << "Can't assign " << HexString(value) << " to " << + identifier << ": " << expression; + return false; + } + + (*dictionary_)[identifier] = value; + if (assigned) + (*assigned)[identifier] = true; + } else { + // The token is not an operator, it's a literal value or an identifier. + // Push it onto the stack as-is. Use push_back instead of PushValue + // because PushValue pushes ValueType as a string, but token is already + // a string. + stack_.push_back(token); + } + } + + // If there's anything left on the stack, it indicates incomplete execution. + // This is a failure case. If the stack is empty, evalution was complete + // and successful. + BPLOG_IF(ERROR, !stack_.empty()) << "Incomplete execution: " << expression; + return stack_.empty(); +} + + +template +typename PostfixEvaluator::PopResult +PostfixEvaluator::PopValueOrIdentifier( + ValueType *value, string *identifier) { + // There needs to be at least one element on the stack to pop. + if (!stack_.size()) + return POP_RESULT_FAIL; + + string token = stack_.back(); + stack_.pop_back(); + + // First, try to treat the value as a literal. In order for this to + // succed, the entire string must be parseable as ValueType. If this + // isn't possible, it can't be a literal, so treat it as an identifier + // instead. + istringstream token_stream(token); + ValueType literal; + if (token_stream >> literal && token_stream.peek() == EOF) { + if (value) { + *value = literal; + } + return POP_RESULT_VALUE; + } else { + if (identifier) { + *identifier = token; + } + return POP_RESULT_IDENTIFIER; + } +} + + +template +bool PostfixEvaluator::PopValue(ValueType *value) { + ValueType literal; + string token; + PopResult result; + if ((result = PopValueOrIdentifier(&literal, &token)) == POP_RESULT_FAIL) { + return false; + } else if (result == POP_RESULT_VALUE) { + // This is the easy case. + *value = literal; + } else { // result == POP_RESULT_IDENTIFIER + // There was an identifier at the top of the stack. Resolve it to a + // value by looking it up in the dictionary. + typename DictionaryType::const_iterator iterator = + dictionary_->find(token); + if (iterator == dictionary_->end()) { + // The identifier wasn't found in the dictionary. Don't imply any + // default value, just fail. + BPLOG(ERROR) << "Identifier " << token << " not in dictionary"; + return false; + } + + *value = iterator->second; + } + + return true; +} + + +template +bool PostfixEvaluator::PopValues(ValueType *value1, + ValueType *value2) { + return PopValue(value2) && PopValue(value1); +} + + +template +void PostfixEvaluator::PushValue(const ValueType &value) { + ostringstream token_stream; + token_stream << value; + stack_.push_back(token_stream.str()); +} + + +} // namespace google_breakpad + + +#endif // PROCESSOR_POSTFIX_EVALUATOR_INL_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/postfix_evaluator.h b/thirdparty/google-breakpad/r318/src/processor/postfix_evaluator.h new file mode 100644 index 00000000..552ed159 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/postfix_evaluator.h @@ -0,0 +1,158 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// postfix_evaluator.h: Postfix (reverse Polish) notation expression evaluator. +// +// PostfixEvaluator evaluates an expression, using the expression itself +// in postfix (reverse Polish) notation and a dictionary mapping constants +// and variables to their values. The evaluator supports standard +// arithmetic operations, assignment into variables, and when an optional +// MemoryRange is provided, dereferencing. (Any unary key-to-value operation +// may be used with a MemoryRange implementation that returns the appropriate +// values, but PostfixEvaluator was written with dereferencing in mind.) +// +// The expression language is simple. Expressions are supplied as strings, +// with operands and operators delimited by whitespace. Operands may be +// either literal values suitable for ValueType, or constants or variables, +// which reference the dictionary. The supported binary operators are + +// (addition), - (subtraction), * (multiplication), / (quotient of division), +// and % (modulus of division). The unary ^ (dereference) operator is also +// provided. These operators allow any operand to be either a literal +// value, constant, or variable. Assignment (=) of any type of operand into +// a variable is also supported. +// +// The dictionary is provided as a map with string keys. Keys beginning +// with the '$' character are treated as variables. All other keys are +// treated as constants. Any results must be assigned into variables in the +// dictionary. These variables do not need to exist prior to calling +// Evaluate, unless used in an expression prior to being assigned to. The +// internal stack state is not made available after evaluation, and any +// values remaining on the stack are treated as evidence of incomplete +// execution and cause the evaluator to indicate failure. +// +// PostfixEvaluator is intended to support evaluation of "program strings" +// obtained from MSVC frame data debugging information in pdb files as +// returned by the DIA APIs. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_POSTFIX_EVALUATOR_H__ +#define PROCESSOR_POSTFIX_EVALUATOR_H__ + + +#include +#include +#include + +namespace google_breakpad { + +using std::map; +using std::string; +using std::vector; + +class MemoryRegion; + +template +class PostfixEvaluator { + public: + typedef map DictionaryType; + typedef map DictionaryValidityType; + + // Create a PostfixEvaluator object that may be used (with Evaluate) on + // one or more expressions. PostfixEvaluator does not take ownership of + // either argument. |memory| may be NULL, in which case dereferencing + // (^) will not be supported. |dictionary| may be NULL, but evaluation + // will fail in that case unless set_dictionary is used before calling + // Evaluate. + PostfixEvaluator(DictionaryType *dictionary, MemoryRegion *memory) + : dictionary_(dictionary), memory_(memory), stack_() {} + + // Evaluate the expression. The results of execution will be stored + // in one (or more) variables in the dictionary. Returns false if any + // failures occure during execution, leaving variables in the dictionary + // in an indeterminate state. If assigned is non-NULL, any keys set in + // the dictionary as a result of evaluation will also be set to true in + // assigned, providing a way to determine if an expression modifies any + // of its input variables. + bool Evaluate(const string &expression, DictionaryValidityType *assigned); + + DictionaryType* dictionary() const { return dictionary_; } + + // Reset the dictionary. PostfixEvaluator does not take ownership. + void set_dictionary(DictionaryType *dictionary) {dictionary_ = dictionary; } + + private: + // Return values for PopValueOrIdentifier + enum PopResult { + POP_RESULT_FAIL = 0, + POP_RESULT_VALUE, + POP_RESULT_IDENTIFIER + }; + + // Retrieves the topmost literal value, constant, or variable from the + // stack. Returns POP_RESULT_VALUE if the topmost entry is a literal + // value, and sets |value| accordingly. Returns POP_RESULT_IDENTIFIER + // if the topmost entry is a constant or variable identifier, and sets + // |identifier| accordingly. Returns POP_RESULT_FAIL on failure, such + // as when the stack is empty. + PopResult PopValueOrIdentifier(ValueType *value, string *identifier); + + // Retrieves the topmost value on the stack. If the topmost entry is + // an identifier, the dictionary is queried for the identifier's value. + // Returns false on failure, such as when the stack is empty or when + // a nonexistent identifier is named. + bool PopValue(ValueType *value); + + // Retrieves the top two values on the stack, in the style of PopValue. + // value2 is popped before value1, so that value1 corresponds to the + // entry that was pushed prior to value2. Returns false on failure. + bool PopValues(ValueType *value1, ValueType *value2); + + // Pushes a new value onto the stack. + void PushValue(const ValueType &value); + + // The dictionary mapping constant and variable identifiers (strings) to + // values. Keys beginning with '$' are treated as variable names, and + // PostfixEvaluator is free to create and modify these keys. Weak pointer. + DictionaryType *dictionary_; + + // If non-NULL, the MemoryRegion used for dereference (^) operations. + // If NULL, dereferencing is unsupported and will fail. Weak pointer. + MemoryRegion *memory_; + + // The stack contains state information as execution progresses. Values + // are pushed on to it as the expression string is read and as operations + // yield values; values are popped when used as operands to operators. + vector stack_; +}; + +} // namespace google_breakpad + + +#endif // PROCESSOR_POSTFIX_EVALUATOR_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/postfix_evaluator_unittest.cc b/thirdparty/google-breakpad/r318/src/processor/postfix_evaluator_unittest.cc new file mode 100644 index 00000000..d687cc83 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/postfix_evaluator_unittest.cc @@ -0,0 +1,303 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// postfix_evaluator_unittest.cc: Unit tests for PostfixEvaluator. +// +// Author: Mark Mentovai + +#include +#include +#include + +#include "processor/postfix_evaluator-inl.h" + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/memory_region.h" +#include "processor/logging.h" + + +namespace { + + +using std::map; +using std::string; +using google_breakpad::MemoryRegion; +using google_breakpad::PostfixEvaluator; + + +// FakeMemoryRegion is used to test PostfixEvaluator's dereference (^) +// operator. The result of dereferencing a value is one greater than +// the value. +class FakeMemoryRegion : public MemoryRegion { + public: + virtual u_int64_t GetBase() { return 0; } + virtual u_int32_t GetSize() { return 0; } + virtual bool GetMemoryAtAddress(u_int64_t address, u_int8_t *value) { + *value = address + 1; + return true; + } + virtual bool GetMemoryAtAddress(u_int64_t address, u_int16_t *value) { + *value = address + 1; + return true; + } + virtual bool GetMemoryAtAddress(u_int64_t address, u_int32_t *value) { + *value = address + 1; + return true; + } + virtual bool GetMemoryAtAddress(u_int64_t address, u_int64_t *value) { + *value = address + 1; + return true; + } +}; + + +struct EvaluateTest { + // Expression passed to PostfixEvaluator::Evaluate. + const string expression; + + // True if the expression is expected to be evaluable, false if evaluation + // is expected to fail. + bool evaluable; +}; + + +struct EvaluateTestSet { + // The dictionary used for all tests in the set. + PostfixEvaluator::DictionaryType *dictionary; + + // The list of tests. + const EvaluateTest *evaluate_tests; + + // The number of tests. + unsigned int evaluate_test_count; + + // Identifiers and their expected values upon completion of the Evaluate + // tests in the set. + map *validate_data; +}; + + +static bool RunTests() { + // The first test set checks the basic operations and failure modes. + PostfixEvaluator::DictionaryType dictionary_0; + const EvaluateTest evaluate_tests_0[] = { + { "$rAdd 2 2 + =", true }, // $rAdd = 2 + 2 = 4 + { "$rAdd $rAdd 2 + =", true }, // $rAdd = $rAdd + 2 = 6 + { "$rAdd 2 $rAdd + =", true }, // $rAdd = 2 + $rAdd = 8 + { "99", false }, // put some junk on the stack... + { "$rAdd2 2 2 + =", true }, // ...and make sure things still work + { "$rAdd2\t2\n2 + =", true }, // same but with different whitespace + { "$rAdd2 2 2 + = ", true }, // trailing whitespace + { " $rAdd2 2 2 + =", true }, // leading whitespace + { "$rAdd2 2 2 + =", true }, // extra whitespace + { "$T0 2 = +", false }, // too few operands for add + { "2 + =", false }, // too few operands for add + { "2 +", false }, // too few operands for add + { "+", false }, // too few operands for add + { "^", false }, // too few operands for dereference + { "=", false }, // too few operands for assignment + { "2 =", false }, // too few operands for assignment + { "2 2 + =", false }, // too few operands for assignment + { "2 2 =", false }, // can't assign into a literal + { "k 2 =", false }, // can't assign into a constant + { "2", false }, // leftover data on stack + { "2 2 +", false }, // leftover data on stack + { "$rAdd", false }, // leftover data on stack + { "0 $T1 0 0 + =", false }, // leftover data on stack + { "$T2 $T2 2 + =", false }, // can't operate on an undefined value + { "$rMul 9 6 * =", true }, // $rMul = 9 * 6 = 54 + { "$rSub 9 6 - =", true }, // $rSub = 9 - 6 = 3 + { "$rDivQ 9 6 / =", true }, // $rDivQ = 9 / 6 = 1 + { "$rDivM 9 6 % =", true }, // $rDivM = 9 % 6 = 3 + { "$rDeref 9 ^ =", true } // $rDeref = ^9 = 10 (FakeMemoryRegion) + }; + map validate_data_0; + validate_data_0["$rAdd"] = 8; + validate_data_0["$rAdd2"] = 4; + validate_data_0["$rSub"] = 3; + validate_data_0["$rMul"] = 54; + validate_data_0["$rDivQ"] = 1; + validate_data_0["$rDivM"] = 3; + validate_data_0["$rDeref"] = 10; + + // The second test set simulates a couple of MSVC program strings. + // The data is fudged a little bit because the tests use FakeMemoryRegion + // instead of a real stack snapshot, but the program strings are real and + // the implementation doesn't know or care that the data is not real. + PostfixEvaluator::DictionaryType dictionary_1; + dictionary_1["$ebp"] = 0xbfff0010; + dictionary_1["$eip"] = 0x10000000; + dictionary_1["$esp"] = 0xbfff0000; + dictionary_1[".cbSavedRegs"] = 4; + dictionary_1[".cbParams"] = 4; + dictionary_1[".raSearchStart"] = 0xbfff0020; + const EvaluateTest evaluate_tests_1[] = { + { "$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = " + "$L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =", true }, + // Intermediate state: $T0 = 0xbfff0010, $eip = 0xbfff0015, + // $ebp = 0xbfff0011, $esp = 0xbfff0018, + // $L = 0xbfff000c, $P = 0xbfff001c + { "$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = " + "$L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =", + true }, + // Intermediate state: $T0 = 0xbfff0011, $eip = 0xbfff0016, + // $ebp = 0xbfff0012, $esp = 0xbfff0019, + // $L = 0xbfff000d, $P = 0xbfff001d, + // $ebx = 0xbffefff6 + { "$T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = " + "$esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = " + "$ebx $T0 28 - ^ =", + true } + }; + map validate_data_1; + validate_data_1["$T0"] = 0xbfff0012; + validate_data_1["$T1"] = 0xbfff0020; + validate_data_1["$T2"] = 0xbfff0019; + validate_data_1["$eip"] = 0xbfff0021; + validate_data_1["$ebp"] = 0xbfff0012; + validate_data_1["$esp"] = 0xbfff0024; + validate_data_1["$L"] = 0xbfff000e; + validate_data_1["$P"] = 0xbfff0028; + validate_data_1["$ebx"] = 0xbffefff7; + validate_data_1[".cbSavedRegs"] = 4; + validate_data_1[".cbParams"] = 4; + + EvaluateTestSet evaluate_test_sets[] = { + { &dictionary_0, evaluate_tests_0, + sizeof(evaluate_tests_0) / sizeof(EvaluateTest), &validate_data_0 }, + { &dictionary_1, evaluate_tests_1, + sizeof(evaluate_tests_1) / sizeof(EvaluateTest), &validate_data_1 }, + }; + + unsigned int evaluate_test_set_count = sizeof(evaluate_test_sets) / + sizeof(EvaluateTestSet); + + FakeMemoryRegion fake_memory; + PostfixEvaluator postfix_evaluator = + PostfixEvaluator(NULL, &fake_memory); + + for (unsigned int evaluate_test_set_index = 0; + evaluate_test_set_index < evaluate_test_set_count; + ++evaluate_test_set_index) { + EvaluateTestSet *evaluate_test_set = + &evaluate_test_sets[evaluate_test_set_index]; + const EvaluateTest *evaluate_tests = evaluate_test_set->evaluate_tests; + unsigned int evaluate_test_count = evaluate_test_set->evaluate_test_count; + + // The same dictionary will be used for each test in the set. Earlier + // tests can affect the state of the dictionary for later tests. + postfix_evaluator.set_dictionary(evaluate_test_set->dictionary); + + // Use a new validity dictionary for each test set. + PostfixEvaluator::DictionaryValidityType assigned; + + for (unsigned int evaluate_test_index = 0; + evaluate_test_index < evaluate_test_count; + ++evaluate_test_index) { + const EvaluateTest *evaluate_test = &evaluate_tests[evaluate_test_index]; + + // Do the test. + bool result = postfix_evaluator.Evaluate(evaluate_test->expression, + &assigned); + if (result != evaluate_test->evaluable) { + fprintf(stderr, "FAIL: evaluate set %d/%d, test %d/%d, " + "expression \"%s\", expected %s, observed %s\n", + evaluate_test_set_index, evaluate_test_set_count, + evaluate_test_index, evaluate_test_count, + evaluate_test->expression.c_str(), + evaluate_test->evaluable ? "evaluable" : "not evaluable", + result ? "evaluted" : "not evaluated"); + return false; + } + } + + // Validate the results. + for (map::const_iterator validate_iterator = + evaluate_test_set->validate_data->begin(); + validate_iterator != evaluate_test_set->validate_data->end(); + ++validate_iterator) { + const string identifier = validate_iterator->first; + unsigned int expected_value = validate_iterator->second; + + map::const_iterator dictionary_iterator = + evaluate_test_set->dictionary->find(identifier); + + // The identifier must exist in the dictionary. + if (dictionary_iterator == evaluate_test_set->dictionary->end()) { + fprintf(stderr, "FAIL: evaluate test set %d/%d, " + "validate identifier \"%s\", " + "expected %d, observed not found\n", + evaluate_test_set_index, evaluate_test_set_count, + identifier.c_str(), expected_value); + return false; + } + + // The value in the dictionary must be the same as the expected value. + unsigned int observed_value = dictionary_iterator->second; + if (expected_value != observed_value) { + fprintf(stderr, "FAIL: evaluate test set %d/%d, " + "validate identifier \"%s\", " + "expected %d, observed %d\n", + evaluate_test_set_index, evaluate_test_set_count, + identifier.c_str(), expected_value, observed_value); + return false; + } + + // The value must be set in the "assigned" dictionary if it was a + // variable. It must not have been assigned if it was a constant. + bool expected_assigned = identifier[0] == '$'; + bool observed_assigned = false; + PostfixEvaluator::DictionaryValidityType::const_iterator + iterator_assigned = assigned.find(identifier); + if (iterator_assigned != assigned.end()) { + observed_assigned = iterator_assigned->second; + } + if (expected_assigned != observed_assigned) { + fprintf(stderr, "FAIL: evaluate test set %d/%d, " + "validate assignment of \"%s\", " + "expected %d, observed %d\n", + evaluate_test_set_index, evaluate_test_set_count, + identifier.c_str(), expected_assigned, observed_assigned); + return false; + } + } + } + + return true; +} + + +} // namespace + + +int main(int argc, char **argv) { + BPLOG_INIT(&argc, &argv); + + return RunTests() ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/processor/process_state.cc b/thirdparty/google-breakpad/r318/src/processor/process_state.cc new file mode 100644 index 00000000..934792b3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/process_state.cc @@ -0,0 +1,63 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// process_state.cc: A snapshot of a process, in a fully-digested state. +// +// See process_state.h for documentation. +// +// Author: Mark Mentovai + +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_modules.h" + +namespace google_breakpad { + +ProcessState::~ProcessState() { + Clear(); +} + +void ProcessState::Clear() { + time_date_stamp_ = 0; + crashed_ = false; + crash_reason_.clear(); + crash_address_ = 0; + requesting_thread_ = -1; + for (vector::const_iterator iterator = threads_.begin(); + iterator != threads_.end(); + ++iterator) { + delete *iterator; + } + threads_.clear(); + system_info_.Clear(); + delete modules_; + modules_ = NULL; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/range_map-inl.h b/thirdparty/google-breakpad/r318/src/processor/range_map-inl.h new file mode 100644 index 00000000..77bf7d20 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/range_map-inl.h @@ -0,0 +1,210 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// range_map-inl.h: Range map implementation. +// +// See range_map.h for documentation. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_RANGE_MAP_INL_H__ +#define PROCESSOR_RANGE_MAP_INL_H__ + + +#include + +#include "processor/range_map.h" +#include "processor/logging.h" + + +namespace google_breakpad { + + +template +bool RangeMap::StoreRange(const AddressType &base, + const AddressType &size, + const EntryType &entry) { + AddressType high = base + size - 1; + + // Check for undersize or overflow. + if (size <= 0 || high < base) { + // The processor will hit this case too frequently with common symbol + // files in the size == 0 case, which is more suited to a DEBUG channel. + // Filter those out since there's no DEBUG channel at the moment. + BPLOG_IF(INFO, size != 0) << "StoreRange failed, " << HexString(base) << + "+" << HexString(size) << ", " << + HexString(high); + return false; + } + + // Ensure that this range does not overlap with another one already in the + // map. + MapConstIterator iterator_base = map_.lower_bound(base); + MapConstIterator iterator_high = map_.lower_bound(high); + + if (iterator_base != iterator_high) { + // Some other range begins in the space used by this range. It may be + // contained within the space used by this range, or it may extend lower. + // Regardless, it is an error. + AddressType other_base = iterator_base->second.base(); + AddressType other_size = iterator_base->first - other_base + 1; + BPLOG(INFO) << "StoreRange failed, an existing range is contained by or " + "extends lower than the new range: new " << + HexString(base) << "+" << HexString(size) << ", existing " << + HexString(other_base) << "+" << HexString(other_size); + return false; + } + + if (iterator_high != map_.end()) { + if (iterator_high->second.base() <= high) { + // The range above this one overlaps with this one. It may fully + // contain this range, or it may begin within this range and extend + // higher. Regardless, it's an error. + AddressType other_base = iterator_high->second.base(); + AddressType other_size = iterator_high->first - other_base + 1; + BPLOG(INFO) << "StoreRange failed, an existing range contains or " + "extends higher than the new range: new " << + HexString(base) << "+" << HexString(size) << + ", existing " << + HexString(other_base) << "+" << HexString(other_size); + return false; + } + } + + // Store the range in the map by its high address, so that lower_bound can + // be used to quickly locate a range by address. + map_.insert(MapValue(high, Range(base, entry))); + return true; +} + + +template +bool RangeMap::RetrieveRange( + const AddressType &address, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) const { + BPLOG_IF(ERROR, !entry) << "RangeMap::RetrieveRange requires |entry|"; + assert(entry); + + MapConstIterator iterator = map_.lower_bound(address); + if (iterator == map_.end()) + return false; + + // The map is keyed by the high address of each range, so |address| is + // guaranteed to be lower than the range's high address. If |range| is + // not directly preceded by another range, it's possible for address to + // be below the range's low address, though. When that happens, address + // references something not within any range, so return false. + if (address < iterator->second.base()) + return false; + + *entry = iterator->second.entry(); + if (entry_base) + *entry_base = iterator->second.base(); + if (entry_size) + *entry_size = iterator->first - iterator->second.base() + 1; + + return true; +} + + +template +bool RangeMap::RetrieveNearestRange( + const AddressType &address, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) const { + BPLOG_IF(ERROR, !entry) << "RangeMap::RetrieveNearestRange requires |entry|"; + assert(entry); + + // If address is within a range, RetrieveRange can handle it. + if (RetrieveRange(address, entry, entry_base, entry_size)) + return true; + + // upper_bound gives the first element whose key is greater than address, + // but we want the first element whose key is less than or equal to address. + // Decrement the iterator to get there, but not if the upper_bound already + // points to the beginning of the map - in that case, address is lower than + // the lowest stored key, so return false. + MapConstIterator iterator = map_.upper_bound(address); + if (iterator == map_.begin()) + return false; + --iterator; + + *entry = iterator->second.entry(); + if (entry_base) + *entry_base = iterator->first; + if (entry_size) + *entry_size = iterator->first - iterator->second.base() + 1; + + return true; +} + + +template +bool RangeMap::RetrieveRangeAtIndex( + int index, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) const { + BPLOG_IF(ERROR, !entry) << "RangeMap::RetrieveRangeAtIndex requires |entry|"; + assert(entry); + + if (index >= GetCount()) { + BPLOG(ERROR) << "Index out of range: " << index << "/" << GetCount(); + return false; + } + + // Walk through the map. Although it's ordered, it's not a vector, so it + // can't be addressed directly by index. + MapConstIterator iterator = map_.begin(); + for (int this_index = 0; this_index < index; ++this_index) + ++iterator; + + *entry = iterator->second.entry(); + if (entry_base) + *entry_base = iterator->first; + if (entry_size) + *entry_size = iterator->first - iterator->second.base() + 1; + + return true; +} + + +template +int RangeMap::GetCount() const { + return map_.size(); +} + + +template +void RangeMap::Clear() { + map_.clear(); +} + + +} // namespace google_breakpad + + +#endif // PROCESSOR_RANGE_MAP_INL_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/range_map.h b/thirdparty/google-breakpad/r318/src/processor/range_map.h new file mode 100644 index 00000000..a7b67412 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/range_map.h @@ -0,0 +1,126 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// range_map.h: Range maps. +// +// A range map associates a range of addresses with a specific object. This +// is useful when certain objects of variable size are located within an +// address space. The range map makes it simple to determine which object is +// associated with a specific address, which may be any address within the +// range associated with an object. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_RANGE_MAP_H__ +#define PROCESSOR_RANGE_MAP_H__ + + +#include + + +namespace google_breakpad { + + +template +class RangeMap { + public: + RangeMap() : map_() {} + + // Inserts a range into the map. Returns false for a parameter error, + // or if the location of the range would conflict with a range already + // stored in the map. + bool StoreRange(const AddressType &base, + const AddressType &size, + const EntryType &entry); + + // Locates the range encompassing the supplied address. If there is + // no such range, returns false. entry_base and entry_size, if non-NULL, + // are set to the base and size of the entry's range. + bool RetrieveRange(const AddressType &address, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) const; + + // Locates the range encompassing the supplied address, if one exists. + // If no range encompasses the supplied address, locates the nearest range + // to the supplied address that is lower than the address. Returns false + // if no range meets these criteria. entry_base and entry_size, if + // non-NULL, are set to the base and size of the entry's range. + bool RetrieveNearestRange(const AddressType &address, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) + const; + + // Treating all ranges as a list ordered by the address spaces that they + // occupy, locates the range at the index specified by index. Returns + // false if index is larger than the number of ranges stored. entry_base + // and entry_size, if non-NULL, are set to the base and size of the entry's + // range. + // + // RetrieveRangeAtIndex is not optimized for speedy operation. + bool RetrieveRangeAtIndex(int index, EntryType *entry, + AddressType *entry_base, AddressType *entry_size) + const; + + // Returns the number of ranges stored in the RangeMap. + int GetCount() const; + + // Empties the range map, restoring it to the state it was when it was + // initially created. + void Clear(); + + private: + class Range { + public: + Range(const AddressType &base, const EntryType &entry) + : base_(base), entry_(entry) {} + + AddressType base() const { return base_; } + EntryType entry() const { return entry_; } + + private: + // The base address of the range. The high address does not need to + // be stored, because RangeMap uses it as the key to the map. + const AddressType base_; + + // The entry corresponding to a range. + const EntryType entry_; + }; + + // Convenience types. + typedef std::map AddressToRangeMap; + typedef typename AddressToRangeMap::const_iterator MapConstIterator; + typedef typename AddressToRangeMap::value_type MapValue; + + // Maps the high address of each range to a EntryType. + AddressToRangeMap map_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_RANGE_MAP_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/range_map_unittest.cc b/thirdparty/google-breakpad/r318/src/processor/range_map_unittest.cc new file mode 100644 index 00000000..5b5ce573 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/range_map_unittest.cc @@ -0,0 +1,494 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// range_map_unittest.cc: Unit tests for RangeMap +// +// Author: Mark Mentovai + + +#include +#include + +#include "processor/range_map-inl.h" + +#include "processor/linked_ptr.h" +#include "processor/logging.h" +#include "processor/scoped_ptr.h" + + +namespace { + + +using google_breakpad::linked_ptr; +using google_breakpad::scoped_ptr; +using google_breakpad::RangeMap; + + +// A CountedObject holds an int. A global (not thread safe!) count of +// allocated CountedObjects is maintained to help test memory management. +class CountedObject { + public: + explicit CountedObject(int id) : id_(id) { ++count_; } + ~CountedObject() { --count_; } + + static int count() { return count_; } + int id() const { return id_; } + + private: + static int count_; + int id_; +}; + +int CountedObject::count_; + + +typedef int AddressType; +typedef RangeMap< AddressType, linked_ptr > TestMap; + + +// RangeTest contains data to use for store and retrieve tests. See +// RunTests for descriptions of the tests. +struct RangeTest { + // Base address to use for test + AddressType address; + + // Size of range to use for test + AddressType size; + + // Unique ID of range - unstorable ranges must have unique IDs too + int id; + + // Whether this range is expected to be stored successfully or not + bool expect_storable; +}; + + +// A RangeTestSet encompasses multiple RangeTests, which are run in +// sequence on the same RangeMap. +struct RangeTestSet { + // An array of RangeTests + const RangeTest *range_tests; + + // The number of tests in the set + unsigned int range_test_count; +}; + + +// StoreTest uses the data in a RangeTest and calls StoreRange on the +// test RangeMap. It returns true if the expected result occurred, and +// false if something else happened. +static bool StoreTest(TestMap *range_map, const RangeTest *range_test) { + linked_ptr object(new CountedObject(range_test->id)); + bool stored = range_map->StoreRange(range_test->address, + range_test->size, + object); + + if (stored != range_test->expect_storable) { + fprintf(stderr, "FAILED: " + "StoreRange id %d, expected %s, observed %s\n", + range_test->id, + range_test->expect_storable ? "storable" : "not storable", + stored ? "stored" : "not stored"); + return false; + } + + return true; +} + + +// RetrieveTest uses the data in RangeTest and calls RetrieveRange on the +// test RangeMap. If it retrieves the expected value (which can be no +// map entry at the specified range,) it returns true, otherwise, it returns +// false. RetrieveTest will check the values around the base address and +// the high address of a range to guard against off-by-one errors. +static bool RetrieveTest(TestMap *range_map, const RangeTest *range_test) { + for (unsigned int side = 0; side <= 1; ++side) { + // When side == 0, check the low side (base address) of each range. + // When side == 1, check the high side (base + size) of each range. + + // Check one-less and one-greater than the target address in addition + // to the target address itself. + + // If the size of the range is only 1, don't check one greater than + // the base or one less than the high - for a successfully stored + // range, these tests would erroneously fail because the range is too + // small. + AddressType low_offset = -1; + AddressType high_offset = 1; + if (range_test->size == 1) { + if (!side) // When checking the low side, + high_offset = 0; // don't check one over the target. + else // When checking the high side, + low_offset = 0; // don't check one under the target. + } + + for (AddressType offset = low_offset; offset <= high_offset; ++offset) { + AddressType address = + offset + + (!side ? range_test->address : + range_test->address + range_test->size - 1); + + bool expected_result = false; // This is correct for tests not stored. + if (range_test->expect_storable) { + if (offset == 0) // When checking the target address, + expected_result = true; // test should always succeed. + else if (offset == -1) // When checking one below the target, + expected_result = side; // should fail low and succeed high. + else // When checking one above the target, + expected_result = !side; // should succeed low and fail high. + } + + linked_ptr object; + AddressType retrieved_base; + AddressType retrieved_size; + bool retrieved = range_map->RetrieveRange(address, &object, + &retrieved_base, + &retrieved_size); + + bool observed_result = retrieved && object->id() == range_test->id; + + if (observed_result != expected_result) { + fprintf(stderr, "FAILED: " + "RetrieveRange id %d, side %d, offset %d, " + "expected %s, observed %s\n", + range_test->id, + side, + offset, + expected_result ? "true" : "false", + observed_result ? "true" : "false"); + return false; + } + + // If a range was successfully retrieved, check that the returned + // bounds match the range as stored. + if (observed_result == true && + (retrieved_base != range_test->address || + retrieved_size != range_test->size)) { + fprintf(stderr, "FAILED: " + "RetrieveRange id %d, side %d, offset %d, " + "expected base/size %d/%d, observed %d/%d\n", + range_test->id, + side, + offset, + range_test->address, range_test->size, + retrieved_base, retrieved_size); + return false; + } + + // Now, check RetrieveNearestRange. The nearest range is always + // expected to be different from the test range when checking one + // less than the low side. + bool expected_nearest = range_test->expect_storable; + if (!side && offset < 0) + expected_nearest = false; + + linked_ptr nearest_object; + AddressType nearest_base; + bool retrieved_nearest = range_map->RetrieveNearestRange(address, + &nearest_object, + &nearest_base, + NULL); + + // When checking one greater than the high side, RetrieveNearestRange + // should usually return the test range. When a different range begins + // at that address, though, then RetrieveNearestRange should return the + // range at the address instead of the test range. + if (side && offset > 0 && nearest_base == address) { + expected_nearest = false; + } + + bool observed_nearest = retrieved_nearest && + nearest_object->id() == range_test->id; + + if (observed_nearest != expected_nearest) { + fprintf(stderr, "FAILED: " + "RetrieveNearestRange id %d, side %d, offset %d, " + "expected %s, observed %s\n", + range_test->id, + side, + offset, + expected_nearest ? "true" : "false", + observed_nearest ? "true" : "false"); + return false; + } + } + } + + return true; +} + + +// Test RetrieveRangeAtIndex, which is supposed to return objects in order +// according to their addresses. This test is performed by looping through +// the map, calling RetrieveRangeAtIndex for all possible indices in sequence, +// and verifying that each call returns a different object than the previous +// call, and that ranges are returned with increasing base addresses. Returns +// false if the test fails. +static bool RetrieveIndexTest(TestMap *range_map, int set) { + linked_ptr object; + CountedObject *last_object = NULL; + AddressType last_base = 0; + + int object_count = range_map->GetCount(); + for (int object_index = 0; object_index < object_count; ++object_index) { + AddressType base; + if (!range_map->RetrieveRangeAtIndex(object_index, &object, &base, NULL)) { + fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " + "expected success, observed failure\n", + set, object_index); + return false; + } + + if (!object.get()) { + fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " + "expected object, observed NULL\n", + set, object_index); + return false; + } + + // It's impossible to do these comparisons unless there's a previous + // object to compare against. + if (last_object) { + // The object must be different from the last one. + if (object->id() == last_object->id()) { + fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " + "expected different objects, observed same objects (%d)\n", + set, object_index, object->id()); + return false; + } + + // Each object must have a base greater than the previous object's base. + if (base <= last_base) { + fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " + "expected different bases, observed same bases (%d)\n", + set, object_index, base); + return false; + } + } + + last_object = object.get(); + last_base = base; + } + + // Make sure that RetrieveRangeAtIndex doesn't allow lookups at indices that + // are too high. + if (range_map->RetrieveRangeAtIndex(object_count, &object, NULL, NULL)) { + fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d (too large), " + "expected failure, observed success\n", + set, object_count); + return false; + } + + return true; +} + + +// RunTests runs a series of test sets. +static bool RunTests() { + // These tests will be run sequentially. The first set of tests exercises + // most functions of RangeTest, and verifies all of the bounds-checking. + const RangeTest range_tests_0[] = { + { INT_MIN, 16, 1, true }, // lowest possible range + { -2, 5, 2, true }, // a range through zero + { INT_MAX - 9, 11, 3, false }, // tests anti-overflow + { INT_MAX - 9, 10, 4, true }, // highest possible range + { 5, 0, 5, false }, // tests anti-zero-size + { 5, 1, 6, true }, // smallest possible range + { -20, 15, 7, true }, // entirely negative + + { 10, 10, 10, true }, // causes the following tests to fail + { 9, 10, 11, false }, // one-less base, one-less high + { 9, 11, 12, false }, // one-less base, identical high + { 9, 12, 13, false }, // completely contains existing + { 10, 9, 14, false }, // identical base, one-less high + { 10, 10, 15, false }, // exactly identical to existing range + { 10, 11, 16, false }, // identical base, one-greater high + { 11, 8, 17, false }, // contained completely within + { 11, 9, 18, false }, // one-greater base, identical high + { 11, 10, 19, false }, // one-greater base, one-greater high + { 9, 2, 20, false }, // overlaps bottom by one + { 10, 1, 21, false }, // overlaps bottom by one, contained + { 19, 1, 22, false }, // overlaps top by one, contained + { 19, 2, 23, false }, // overlaps top by one + + { 9, 1, 24, true }, // directly below without overlap + { 20, 1, 25, true }, // directly above without overlap + + { 6, 3, 26, true }, // exactly between two ranges, gapless + { 7, 3, 27, false }, // tries to span two ranges + { 7, 5, 28, false }, // tries to span three ranges + { 4, 20, 29, false }, // tries to contain several ranges + + { 30, 50, 30, true }, + { 90, 25, 31, true }, + { 35, 65, 32, false }, // tries to span two noncontiguous + { 120, 10000, 33, true }, // > 8-bit + { 20000, 20000, 34, true }, // > 8-bit + { 0x10001, 0x10001, 35, true }, // > 16-bit + + { 27, -1, 36, false } // tests high < base + }; + + // Attempt to fill the entire space. The entire space must be filled with + // three stores because AddressType is signed for these tests, so RangeMap + // treats the size as signed and rejects sizes that appear to be negative. + // Even if these tests were run as unsigned, two stores would be needed + // to fill the space because the entire size of the space could only be + // described by using one more bit than would be present in AddressType. + const RangeTest range_tests_1[] = { + { INT_MIN, INT_MAX, 50, true }, // From INT_MIN to -2, inclusive + { -1, 2, 51, true }, // From -1 to 0, inclusive + { 1, INT_MAX, 52, true }, // From 1 to INT_MAX, inclusive + { INT_MIN, INT_MAX, 53, false }, // Can't fill the space twice + { -1, 2, 54, false }, + { 1, INT_MAX, 55, false }, + { -3, 6, 56, false }, // -3 to 2, inclusive - spans 3 ranges + }; + + // A light round of testing to verify that RetrieveRange does the right + // the right thing at the extremities of the range when nothing is stored + // there. Checks are forced without storing anything at the extremities + // by setting size = 0. + const RangeTest range_tests_2[] = { + { INT_MIN, 0, 100, false }, // makes RetrieveRange check low end + { -1, 3, 101, true }, + { INT_MAX, 0, 102, false }, // makes RetrieveRange check high end + }; + + // Similar to the previous test set, but with a couple of ranges closer + // to the extremities. + const RangeTest range_tests_3[] = { + { INT_MIN + 1, 1, 110, true }, + { INT_MAX - 1, 1, 111, true }, + { INT_MIN, 0, 112, false }, // makes RetrieveRange check low end + { INT_MAX, 0, 113, false } // makes RetrieveRange check high end + }; + + // The range map is cleared between sets of tests listed here. + const RangeTestSet range_test_sets[] = { + { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) }, + { range_tests_1, sizeof(range_tests_1) / sizeof(RangeTest) }, + { range_tests_2, sizeof(range_tests_2) / sizeof(RangeTest) }, + { range_tests_3, sizeof(range_tests_3) / sizeof(RangeTest) }, + { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) } // Run again + }; + + // Maintain the range map in a pointer so that deletion can be meaningfully + // tested. + scoped_ptr range_map(new TestMap()); + + // Run all of the test sets in sequence. + unsigned int range_test_set_count = sizeof(range_test_sets) / + sizeof(RangeTestSet); + for (unsigned int range_test_set_index = 0; + range_test_set_index < range_test_set_count; + ++range_test_set_index) { + const RangeTest *range_tests = + range_test_sets[range_test_set_index].range_tests; + unsigned int range_test_count = + range_test_sets[range_test_set_index].range_test_count; + + // Run the StoreRange test, which validates StoreRange and initializes + // the RangeMap with data for the RetrieveRange test. + int stored_count = 0; // The number of ranges successfully stored + for (unsigned int range_test_index = 0; + range_test_index < range_test_count; + ++range_test_index) { + const RangeTest *range_test = &range_tests[range_test_index]; + if (!StoreTest(range_map.get(), range_test)) + return false; + + if (range_test->expect_storable) + ++stored_count; + } + + // There should be exactly one CountedObject for everything successfully + // stored in the RangeMap. + if (CountedObject::count() != stored_count) { + fprintf(stderr, "FAILED: " + "stored object counts don't match, expected %d, observed %d\n", + stored_count, + CountedObject::count()); + + return false; + } + + // The RangeMap's own count of objects should also match. + if (range_map->GetCount() != stored_count) { + fprintf(stderr, "FAILED: stored object count doesn't match GetCount, " + "expected %d, observed %d\n", + stored_count, range_map->GetCount()); + + return false; + } + + // Run the RetrieveRange test + for (unsigned int range_test_index = 0; + range_test_index < range_test_count; + ++range_test_index) { + const RangeTest *range_test = &range_tests[range_test_index]; + if (!RetrieveTest(range_map.get(), range_test)) + return false; + } + + if (!RetrieveIndexTest(range_map.get(), range_test_set_index)) + return false; + + // Clear the map between test sets. If this is the final test set, + // delete the map instead to test destruction. + if (range_test_set_index < range_test_set_count - 1) + range_map->Clear(); + else + range_map.reset(); + + // Test that all stored objects are freed when the RangeMap is cleared + // or deleted. + if (CountedObject::count() != 0) { + fprintf(stderr, "FAILED: " + "did not free all objects after %s, %d still allocated\n", + range_test_set_index < range_test_set_count - 1 ? "clear" + : "delete", + CountedObject::count()); + + return false; + } + } + + return true; +} + + +} // namespace + + +int main(int argc, char **argv) { + BPLOG_INIT(&argc, &argv); + + return RunTests() ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/processor/scoped_ptr.h b/thirdparty/google-breakpad/r318/src/processor/scoped_ptr.h new file mode 100644 index 00000000..0d4f7fd3 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/scoped_ptr.h @@ -0,0 +1,335 @@ +// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. +// Copyright (c) 2001, 2002 Peter Dimov +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +// See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation. +// + +// scoped_ptr mimics a built-in pointer except that it guarantees deletion +// of the object pointed to, either on destruction of the scoped_ptr or via +// an explicit reset(). scoped_ptr is a simple solution for simple needs; +// use shared_ptr or std::auto_ptr if your needs are more complex. + +// *** NOTE *** +// If your scoped_ptr is a class member of class FOO pointing to a +// forward declared type BAR (as shown below), then you MUST use a non-inlined +// version of the destructor. The destructor of a scoped_ptr (called from +// FOO's destructor) must have a complete definition of BAR in order to +// destroy it. Example: +// +// -- foo.h -- +// class BAR; +// +// class FOO { +// public: +// FOO(); +// ~FOO(); // Required for sources that instantiate class FOO to compile! +// +// private: +// scoped_ptr bar_; +// }; +// +// -- foo.cc -- +// #include "foo.h" +// FOO::~FOO() {} // Empty, but must be non-inlined to FOO's class definition. + +// scoped_ptr_malloc added by Google +// When one of these goes out of scope, instead of doing a delete or +// delete[], it calls free(). scoped_ptr_malloc is likely to see +// much more use than any other specializations. + +// release() added by Google +// Use this to conditionally transfer ownership of a heap-allocated object +// to the caller, usually on method success. + +#ifndef PROCESSOR_SCOPED_PTR_H__ +#define PROCESSOR_SCOPED_PTR_H__ + +#include // for std::ptrdiff_t +#include // for assert +#include // for free() decl + +namespace google_breakpad { + +template +class scoped_ptr { + private: + + T* ptr; + + scoped_ptr(scoped_ptr const &); + scoped_ptr & operator=(scoped_ptr const &); + + public: + + typedef T element_type; + + explicit scoped_ptr(T* p = 0): ptr(p) {} + + ~scoped_ptr() { + typedef char type_must_be_complete[sizeof(T)]; + delete ptr; + } + + void reset(T* p = 0) { + typedef char type_must_be_complete[sizeof(T)]; + + if (ptr != p) { + delete ptr; + ptr = p; + } + } + + T& operator*() const { + assert(ptr != 0); + return *ptr; + } + + T* operator->() const { + assert(ptr != 0); + return ptr; + } + + bool operator==(T* p) const { + return ptr == p; + } + + bool operator!=(T* p) const { + return ptr != p; + } + + T* get() const { + return ptr; + } + + void swap(scoped_ptr & b) { + T* tmp = b.ptr; + b.ptr = ptr; + ptr = tmp; + } + + T* release() { + T* tmp = ptr; + ptr = 0; + return tmp; + } + + private: + + // no reason to use these: each scoped_ptr should have its own object + template bool operator==(scoped_ptr const& p) const; + template bool operator!=(scoped_ptr const& p) const; +}; + +template inline +void swap(scoped_ptr& a, scoped_ptr& b) { + a.swap(b); +} + +template inline +bool operator==(T* p, const scoped_ptr& b) { + return p == b.get(); +} + +template inline +bool operator!=(T* p, const scoped_ptr& b) { + return p != b.get(); +} + +// scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to +// is guaranteed, either on destruction of the scoped_array or via an explicit +// reset(). Use shared_array or std::vector if your needs are more complex. + +template +class scoped_array { + private: + + T* ptr; + + scoped_array(scoped_array const &); + scoped_array & operator=(scoped_array const &); + + public: + + typedef T element_type; + + explicit scoped_array(T* p = 0) : ptr(p) {} + + ~scoped_array() { + typedef char type_must_be_complete[sizeof(T)]; + delete[] ptr; + } + + void reset(T* p = 0) { + typedef char type_must_be_complete[sizeof(T)]; + + if (ptr != p) { + delete [] ptr; + ptr = p; + } + } + + T& operator[](std::ptrdiff_t i) const { + assert(ptr != 0); + assert(i >= 0); + return ptr[i]; + } + + bool operator==(T* p) const { + return ptr == p; + } + + bool operator!=(T* p) const { + return ptr != p; + } + + T* get() const { + return ptr; + } + + void swap(scoped_array & b) { + T* tmp = b.ptr; + b.ptr = ptr; + ptr = tmp; + } + + T* release() { + T* tmp = ptr; + ptr = 0; + return tmp; + } + + private: + + // no reason to use these: each scoped_array should have its own object + template bool operator==(scoped_array const& p) const; + template bool operator!=(scoped_array const& p) const; +}; + +template inline +void swap(scoped_array& a, scoped_array& b) { + a.swap(b); +} + +template inline +bool operator==(T* p, const scoped_array& b) { + return p == b.get(); +} + +template inline +bool operator!=(T* p, const scoped_array& b) { + return p != b.get(); +} + + +// This class wraps the c library function free() in a class that can be +// passed as a template argument to scoped_ptr_malloc below. +class ScopedPtrMallocFree { + public: + inline void operator()(void* x) const { + free(x); + } +}; + +// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a +// second template argument, the functor used to free the object. + +template +class scoped_ptr_malloc { + private: + + T* ptr; + + scoped_ptr_malloc(scoped_ptr_malloc const &); + scoped_ptr_malloc & operator=(scoped_ptr_malloc const &); + + public: + + typedef T element_type; + + explicit scoped_ptr_malloc(T* p = 0): ptr(p) {} + + ~scoped_ptr_malloc() { + typedef char type_must_be_complete[sizeof(T)]; + free_((void*) ptr); + } + + void reset(T* p = 0) { + typedef char type_must_be_complete[sizeof(T)]; + + if (ptr != p) { + free_((void*) ptr); + ptr = p; + } + } + + T& operator*() const { + assert(ptr != 0); + return *ptr; + } + + T* operator->() const { + assert(ptr != 0); + return ptr; + } + + bool operator==(T* p) const { + return ptr == p; + } + + bool operator!=(T* p) const { + return ptr != p; + } + + T* get() const { + return ptr; + } + + void swap(scoped_ptr_malloc & b) { + T* tmp = b.ptr; + b.ptr = ptr; + ptr = tmp; + } + + T* release() { + T* tmp = ptr; + ptr = 0; + return tmp; + } + + private: + + // no reason to use these: each scoped_ptr_malloc should have its own object + template + bool operator==(scoped_ptr_malloc const& p) const; + template + bool operator!=(scoped_ptr_malloc const& p) const; + + static FreeProc const free_; +}; + +template +FP const scoped_ptr_malloc::free_ = FP(); + +template inline +void swap(scoped_ptr_malloc& a, scoped_ptr_malloc& b) { + a.swap(b); +} + +template inline +bool operator==(T* p, const scoped_ptr_malloc& b) { + return p == b.get(); +} + +template inline +bool operator!=(T* p, const scoped_ptr_malloc& b) { + return p != b.get(); +} + +} // namespace google_breakpad + +#endif // PROCESSOR_SCOPED_PTR_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/simple_symbol_supplier.cc b/thirdparty/google-breakpad/r318/src/processor/simple_symbol_supplier.cc new file mode 100644 index 00000000..c593e955 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/simple_symbol_supplier.cc @@ -0,0 +1,157 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// simple_symbol_supplier.cc: A simple SymbolSupplier implementation +// +// See simple_symbol_supplier.h for documentation. +// +// Author: Mark Mentovai + +#include +#include + +#include +#include +#include +#include + +#include "processor/simple_symbol_supplier.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/logging.h" +#include "processor/pathname_stripper.h" + +namespace google_breakpad { + +static bool file_exists(const string &file_name) { + struct stat sb; + return stat(file_name.c_str(), &sb) == 0; +} + +SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFile( + const CodeModule *module, const SystemInfo *system_info, + string *symbol_file) { + BPLOG_IF(ERROR, !symbol_file) << "SimpleSymbolSupplier::GetSymbolFile " + "requires |symbol_file|"; + assert(symbol_file); + symbol_file->clear(); + + for (unsigned int path_index = 0; path_index < paths_.size(); ++path_index) { + SymbolResult result; + if ((result = GetSymbolFileAtPathFromRoot(module, system_info, + paths_[path_index], + symbol_file)) != NOT_FOUND) { + return result; + } + } + return NOT_FOUND; +} + +SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFile( + const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data) { + assert(symbol_data); + symbol_data->clear(); + + SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info, symbol_file); + + if (s == FOUND) { + std::ifstream in(symbol_file->c_str()); + std::getline(in, *symbol_data, std::string::traits_type::to_char_type( + std::string::traits_type::eof())); + in.close(); + } + return s; +} + +SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFileAtPathFromRoot( + const CodeModule *module, const SystemInfo *system_info, + const string &root_path, string *symbol_file) { + BPLOG_IF(ERROR, !symbol_file) << "SimpleSymbolSupplier::GetSymbolFileAtPath " + "requires |symbol_file|"; + assert(symbol_file); + symbol_file->clear(); + + if (!module) + return NOT_FOUND; + + // Start with the base path. + string path = root_path; + + // Append the debug (pdb) file name as a directory name. + path.append("/"); + string debug_file_name = PathnameStripper::File(module->debug_file()); + if (debug_file_name.empty()) { + BPLOG(ERROR) << "Can't construct symbol file path without debug_file " + "(code_file = " << + PathnameStripper::File(module->code_file()) << ")"; + return NOT_FOUND; + } + path.append(debug_file_name); + + // Append the identifier as a directory name. + path.append("/"); + string identifier = module->debug_identifier(); + if (identifier.empty()) { + BPLOG(ERROR) << "Can't construct symbol file path without debug_identifier " + "(code_file = " << + PathnameStripper::File(module->code_file()) << + ", debug_file = " << debug_file_name << ")"; + return NOT_FOUND; + } + path.append(identifier); + + // Transform the debug file name into one ending in .sym. If the existing + // name ends in .pdb, strip the .pdb. Otherwise, add .sym to the non-.pdb + // name. + path.append("/"); + string debug_file_extension; + if (debug_file_name.size() > 4) + debug_file_extension = debug_file_name.substr(debug_file_name.size() - 4); + std::transform(debug_file_extension.begin(), debug_file_extension.end(), + debug_file_extension.begin(), tolower); + if (debug_file_extension == ".pdb") { + path.append(debug_file_name.substr(0, debug_file_name.size() - 4)); + } else { + path.append(debug_file_name); + } + path.append(".sym"); + + if (!file_exists(path)) { + BPLOG(INFO) << "No symbol file at " << path; + return NOT_FOUND; + } + + *symbol_file = path; + return FOUND; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/simple_symbol_supplier.h b/thirdparty/google-breakpad/r318/src/processor/simple_symbol_supplier.h new file mode 100644 index 00000000..dff6a512 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/simple_symbol_supplier.h @@ -0,0 +1,125 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// simple_symbol_supplier.h: A simple SymbolSupplier implementation +// +// SimpleSymbolSupplier is a straightforward implementation of SymbolSupplier +// that stores symbol files in a filesystem tree. A SimpleSymbolSupplier is +// created with one or more base directories, which are the root paths for all +// symbol files. Each symbol file contained therein has a directory entry in +// the base directory with a name identical to the corresponding debugging +// file (pdb). Within each of these directories, there are subdirectories +// named for the debugging file's identifier. For recent pdb files, this is +// a concatenation of the pdb's uuid and age, presented in hexadecimal form, +// without any dashes or separators. The uuid is in uppercase hexadecimal +// and the age is in lowercase hexadecimal. Within that subdirectory, +// SimpleSymbolSupplier expects to find the symbol file, which is named +// identically to the debug file, but with a .sym extension. If the original +// debug file had a name ending in .pdb, the .pdb extension will be replaced +// with .sym. This sample hierarchy is rooted at the "symbols" base +// directory: +// +// symbols +// symbols/test_app.pdb +// symbols/test_app.pdb/63FE4780728D49379B9D7BB6460CB42A1 +// symbols/test_app.pdb/63FE4780728D49379B9D7BB6460CB42A1/test_app.sym +// symbols/kernel32.pdb +// symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542 +// symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym +// +// In this case, the uuid of test_app.pdb is +// 63fe4780-728d-4937-9b9d-7bb6460cb42a and its age is 1. +// +// This scheme was chosen to be roughly analogous to the way that +// symbol files may be accessed from Microsoft Symbol Server. A hierarchy +// used for Microsoft Symbol Server storage is usable as a hierarchy for +// SimpleSymbolServer, provided that the pdb files are transformed to dumped +// format using a tool such as dump_syms, and given a .sym extension. +// +// SimpleSymbolSupplier will iterate over all root paths searching for +// a symbol file existing in that path. +// +// SimpleSymbolSupplier supports any debugging file which can be identified +// by a CodeModule object's debug_file and debug_identifier accessors. The +// expected ultimate source of these CodeModule objects are MinidumpModule +// objects; it is this class that is responsible for assigning appropriate +// values for debug_file and debug_identifier. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__ +#define PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__ + +#include +#include + +#include "google_breakpad/processor/symbol_supplier.h" + +namespace google_breakpad { + +using std::string; +using std::vector; + +class CodeModule; + +class SimpleSymbolSupplier : public SymbolSupplier { + public: + // Creates a new SimpleSymbolSupplier, using path as the root path where + // symbols are stored. + explicit SimpleSymbolSupplier(const string &path) : paths_(1, path) {} + + // Creates a new SimpleSymbolSupplier, using paths as a list of root + // paths where symbols may be stored. + explicit SimpleSymbolSupplier(const vector &paths) : paths_(paths) {} + + virtual ~SimpleSymbolSupplier() {} + + // Returns the path to the symbol file for the given module. See the + // description above. + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file); + + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data); + protected: + SymbolResult GetSymbolFileAtPathFromRoot(const CodeModule *module, + const SystemInfo *system_info, + const string &root_path, + string *symbol_file); + + private: + vector paths_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/stack_frame_info.h b/thirdparty/google-breakpad/r318/src/processor/stack_frame_info.h new file mode 100644 index 00000000..052a9338 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stack_frame_info.h @@ -0,0 +1,126 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stack_frame_info.h: Holds debugging information about a stack frame. +// +// This structure is specific to Windows debugging information obtained +// from pdb files using the DIA API. +// +// Author: Mark Mentovai + + +#ifndef PROCESSOR_STACK_FRAME_INFO_H__ +#define PROCESSOR_STACK_FRAME_INFO_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +struct StackFrameInfo { + public: + enum Validity { + VALID_NONE = 0, + VALID_PARAMETER_SIZE = 1, + VALID_ALL = -1 + }; + + StackFrameInfo() : valid(VALID_NONE), + prolog_size(0), + epilog_size(0), + parameter_size(0), + saved_register_size(0), + local_size(0), + max_stack_size(0), + allocates_base_pointer(0), + program_string() {} + + StackFrameInfo(u_int32_t set_prolog_size, + u_int32_t set_epilog_size, + u_int32_t set_parameter_size, + u_int32_t set_saved_register_size, + u_int32_t set_local_size, + u_int32_t set_max_stack_size, + int set_allocates_base_pointer, + const std::string set_program_string) + : valid(VALID_ALL), + prolog_size(set_prolog_size), + epilog_size(set_epilog_size), + parameter_size(set_parameter_size), + saved_register_size(set_saved_register_size), + local_size(set_local_size), + max_stack_size(set_max_stack_size), + allocates_base_pointer(set_allocates_base_pointer), + program_string(set_program_string) {} + + // CopyFrom makes "this" StackFrameInfo object identical to "that". + void CopyFrom(const StackFrameInfo &that) { + valid = that.valid; + prolog_size = that.prolog_size; + epilog_size = that.epilog_size; + parameter_size = that.parameter_size; + saved_register_size = that.saved_register_size; + local_size = that.local_size; + max_stack_size = that.max_stack_size; + allocates_base_pointer = that.allocates_base_pointer; + program_string = that.program_string; + } + + // Clears the StackFrameInfo object so that users will see it as though + // it contains no information. + void Clear() { + valid = VALID_NONE; + program_string.erase(); + } + + // Identifies which fields in the structure are valid. This is of + // type Validity, but it is defined as an int because it's not + // possible to OR values into an enumerated type. Users must check + // this field before using any other. + int valid; + + // These values come from IDiaFrameData. + u_int32_t prolog_size; + u_int32_t epilog_size; + u_int32_t parameter_size; + u_int32_t saved_register_size; + u_int32_t local_size; + u_int32_t max_stack_size; + + // Only one of allocates_base_pointer or program_string will be valid. + // If program_string is empty, use allocates_base_pointer. + bool allocates_base_pointer; + std::string program_string; +}; + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACK_FRAME_INFO_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker.cc b/thirdparty/google-breakpad/r318/src/processor/stackwalker.cc new file mode 100644 index 00000000..de67bdaa --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker.cc @@ -0,0 +1,193 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker.cc: Generic stackwalker. +// +// See stackwalker.h for documentation. +// +// Author: Mark Mentovai + + +#include + +#include "google_breakpad/processor/stackwalker.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame.h" +#include "google_breakpad/processor/symbol_supplier.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" +#include "processor/scoped_ptr.h" +#include "processor/stack_frame_info.h" +#include "processor/stackwalker_ppc.h" +#include "processor/stackwalker_sparc.h" +#include "processor/stackwalker_x86.h" +#include "processor/stackwalker_amd64.h" + +namespace google_breakpad { + + +Stackwalker::Stackwalker(const SystemInfo *system_info, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver) + : system_info_(system_info), + memory_(memory), + modules_(modules), + supplier_(supplier), + resolver_(resolver) { +} + + +bool Stackwalker::Walk(CallStack *stack) { + BPLOG_IF(ERROR, !stack) << "Stackwalker::Walk requires |stack|"; + assert(stack); + stack->Clear(); + + // stack_frame_info parallels the CallStack. The vector is passed to the + // GetCallerFrame function. It contains information that may be helpful + // for stackwalking. + vector< linked_ptr > stack_frame_info; + + // Begin with the context frame, and keep getting callers until there are + // no more. + + // Take ownership of the pointer returned by GetContextFrame. + scoped_ptr frame(GetContextFrame()); + + while (frame.get()) { + // frame already contains a good frame with properly set instruction and + // frame_pointer fields. The frame structure comes from either the + // context frame (above) or a caller frame (below). + + linked_ptr frame_info; + + // Resolve the module information, if a module map was provided. + if (modules_) { + const CodeModule *module = + modules_->GetModuleForAddress(frame->instruction); + if (module) { + frame->module = module; + if (resolver_ && + !resolver_->HasModule(frame->module->code_file()) && + supplier_) { + string symbol_data, symbol_file; + SymbolSupplier::SymbolResult symbol_result = + supplier_->GetSymbolFile(module, system_info_, + &symbol_file, &symbol_data); + + switch (symbol_result) { + case SymbolSupplier::FOUND: + resolver_->LoadModuleUsingMapBuffer(frame->module->code_file(), + symbol_data); + break; + case SymbolSupplier::NOT_FOUND: + break; // nothing to do + case SymbolSupplier::INTERRUPT: + return false; + } + } + frame_info.reset(resolver_->FillSourceLineInfo(frame.get())); + } + } + + // Add the frame to the call stack. Relinquish the ownership claim + // over the frame, because the stack now owns it. + stack->frames_.push_back(frame.release()); + + // Add the frame info to the parallel stack. + stack_frame_info.push_back(frame_info); + frame_info.reset(NULL); + + // Get the next frame and take ownership. + frame.reset(GetCallerFrame(stack, stack_frame_info)); + } + + return true; +} + + +// static +Stackwalker* Stackwalker::StackwalkerForCPU( + const SystemInfo *system_info, + MinidumpContext *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver) { + if (!context) { + BPLOG(ERROR) << "Can't choose a stackwalker implementation without context"; + return NULL; + } + + Stackwalker *cpu_stackwalker = NULL; + + u_int32_t cpu = context->GetContextCPU(); + switch (cpu) { + case MD_CONTEXT_X86: + cpu_stackwalker = new StackwalkerX86(system_info, + context->GetContextX86(), + memory, modules, supplier, + resolver); + break; + + case MD_CONTEXT_PPC: + cpu_stackwalker = new StackwalkerPPC(system_info, + context->GetContextPPC(), + memory, modules, supplier, + resolver); + break; + + case MD_CONTEXT_AMD64: + cpu_stackwalker = new StackwalkerAMD64(system_info, + context->GetContextAMD64(), + memory, modules, supplier, + resolver); + break; + + case MD_CONTEXT_SPARC: + cpu_stackwalker = new StackwalkerSPARC(system_info, + context->GetContextSPARC(), + memory, modules, supplier, + resolver); + break; + } + + BPLOG_IF(ERROR, !cpu_stackwalker) << "Unknown CPU type " << HexString(cpu) << + ", can't choose a stackwalker " + "implementation"; + return cpu_stackwalker; +} + + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker_amd64.cc b/thirdparty/google-breakpad/r318/src/processor/stackwalker_amd64.cc new file mode 100644 index 00000000..7a413963 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker_amd64.cc @@ -0,0 +1,131 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_amd64.cc: amd64-specific stackwalker. +// +// See stackwalker_amd64.h for documentation. +// +// Author: Mark Mentovai, Ted Mielczarek + + +#include "processor/stackwalker_amd64.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/logging.h" + +namespace google_breakpad { + + +StackwalkerAMD64::StackwalkerAMD64(const SystemInfo *system_info, + const MDRawContextAMD64 *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver) + : Stackwalker(system_info, memory, modules, supplier, resolver), + context_(context) { +} + + +StackFrame* StackwalkerAMD64::GetContextFrame() { + if (!context_ || !memory_) { + BPLOG(ERROR) << "Can't get context frame without context or memory"; + return NULL; + } + + StackFrameAMD64 *frame = new StackFrameAMD64(); + + // The instruction pointer is stored directly in a register, so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = StackFrameAMD64::CONTEXT_VALID_ALL; + frame->instruction = frame->context.rip; + + return frame; +} + + +StackFrame* StackwalkerAMD64::GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + StackFrameAMD64 *last_frame = static_cast( + stack->frames()->back()); + + //FIXME: this pretty much doesn't work at all due to FPO + // being enabled by default. + // Brain-dead stackwalking: + // %rip_new = *(%rbp_old + 8) + // %rsp_new = %rbp_old + 16 + // %rbp_new = *(%rbp_old) + + // A caller frame must reside higher in memory than its callee frames. + // Anything else is an error, or an indication that we've reached the + // end of the stack. + u_int64_t stack_pointer = last_frame->context.rbp + 16; + if (stack_pointer <= last_frame->context.rsp) { + return NULL; + } + + u_int64_t instruction; + if (!memory_->GetMemoryAtAddress(last_frame->context.rbp + 8, + &instruction) || + instruction <= 1) { + return NULL; + } + + u_int64_t stack_base; + if (!memory_->GetMemoryAtAddress(last_frame->context.rbp, + &stack_base) || + stack_base <= 1) { + return NULL; + } + + StackFrameAMD64 *frame = new StackFrameAMD64(); + + frame->context = last_frame->context; + frame->context.rip = instruction; + frame->context.rsp = stack_pointer; + frame->context.rbp = stack_base; + frame->context_validity = StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP | + StackFrameAMD64::CONTEXT_VALID_RBP; + + frame->instruction = frame->context.rip - 1; + + return frame; +} + + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker_amd64.h b/thirdparty/google-breakpad/r318/src/processor/stackwalker_amd64.h new file mode 100644 index 00000000..a3e11358 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker_amd64.h @@ -0,0 +1,80 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_amd64.h: amd64-specific stackwalker. +// +// Provides stack frames given amd64 register context and a memory region +// corresponding to a amd64 stack. +// +// Author: Mark Mentovai, Ted Mielczarek + + +#ifndef PROCESSOR_STACKWALKER_AMD64_H__ +#define PROCESSOR_STACKWALKER_AMD64_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerAMD64 : public Stackwalker { + public: + // context is a amd64 context object that gives access to amd64-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerAMD64(const SystemInfo *system_info, + const MDRawContextAMD64 *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + private: + // Implementation of Stackwalker, using amd64 context (stack pointer in %rsp, + // stack base in %rbp) and stack conventions (saved stack pointer at 0(%rbp)) + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextAMD64 *context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_AMD64_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker_ppc.cc b/thirdparty/google-breakpad/r318/src/processor/stackwalker_ppc.cc new file mode 100644 index 00000000..02a49b21 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker_ppc.cc @@ -0,0 +1,146 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_ppc.cc: ppc-specific stackwalker. +// +// See stackwalker_ppc.h for documentation. +// +// Author: Mark Mentovai + + +#include "processor/stackwalker_ppc.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/logging.h" + +namespace google_breakpad { + + +StackwalkerPPC::StackwalkerPPC(const SystemInfo *system_info, + const MDRawContextPPC *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver) + : Stackwalker(system_info, memory, modules, supplier, resolver), + context_(context) { + if (memory_->GetBase() + memory_->GetSize() - 1 > 0xffffffff) { + // This implementation only covers 32-bit ppc CPUs. The limits of the + // supplied stack are invalid. Mark memory_ = NULL, which will cause + // stackwalking to fail. + BPLOG(ERROR) << "Memory out of range for stackwalking: " << + HexString(memory_->GetBase()) << "+" << + HexString(memory_->GetSize()); + memory_ = NULL; + } +} + + +StackFrame* StackwalkerPPC::GetContextFrame() { + if (!context_ || !memory_) { + BPLOG(ERROR) << "Can't get context frame without context or memory"; + return NULL; + } + + StackFramePPC *frame = new StackFramePPC(); + + // The instruction pointer is stored directly in a register, so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = StackFramePPC::CONTEXT_VALID_ALL; + frame->instruction = frame->context.srr0; + + return frame; +} + + +StackFrame* StackwalkerPPC::GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + // The instruction pointers for previous frames are saved on the stack. + // The typical ppc calling convention is for the called procedure to store + // its return address in the calling procedure's stack frame at 8(%r1), + // and to allocate its own stack frame by decrementing %r1 (the stack + // pointer) and saving the old value of %r1 at 0(%r1). Because the ppc has + // no hardware stack, there is no distinction between the stack pointer and + // frame pointer, and what is typically thought of as the frame pointer on + // an x86 is usually referred to as the stack pointer on a ppc. + + StackFramePPC *last_frame = static_cast( + stack->frames()->back()); + + // A caller frame must reside higher in memory than its callee frames. + // Anything else is an error, or an indication that we've reached the + // end of the stack. + u_int32_t stack_pointer; + if (!memory_->GetMemoryAtAddress(last_frame->context.gpr[1], + &stack_pointer) || + stack_pointer <= last_frame->context.gpr[1]) { + return NULL; + } + + // Mac OS X/Darwin gives 1 as the return address from the bottom-most + // frame in a stack (a thread's entry point). I haven't found any + // documentation on this, but 0 or 1 would be bogus return addresses, + // so check for them here and return false (end of stack) when they're + // hit to avoid having a phantom frame. + u_int32_t instruction; + if (!memory_->GetMemoryAtAddress(stack_pointer + 8, &instruction) || + instruction <= 1) { + return NULL; + } + + StackFramePPC *frame = new StackFramePPC(); + + frame->context = last_frame->context; + frame->context.srr0 = instruction; + frame->context.gpr[1] = stack_pointer; + frame->context_validity = StackFramePPC::CONTEXT_VALID_SRR0 | + StackFramePPC::CONTEXT_VALID_GPR1; + + // frame->context.srr0 is the return address, which is one instruction + // past the branch that caused us to arrive at the callee. Set + // frame_ppc->instruction to four less than that. Since all ppc + // instructions are 4 bytes wide, this is the address of the branch + // instruction. This allows source line information to match up with the + // line that contains a function call. Callers that require the exact + // return address value may access the context.srr0 field of StackFramePPC. + frame->instruction = frame->context.srr0 - 4; + + return frame; +} + + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker_ppc.h b/thirdparty/google-breakpad/r318/src/processor/stackwalker_ppc.h new file mode 100644 index 00000000..3d312419 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker_ppc.h @@ -0,0 +1,81 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_ppc.h: ppc-specific stackwalker. +// +// Provides stack frames given ppc register context and a memory region +// corresponding to a ppc stack. +// +// Author: Mark Mentovai + + +#ifndef PROCESSOR_STACKWALKER_PPC_H__ +#define PROCESSOR_STACKWALKER_PPC_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerPPC : public Stackwalker { + public: + // context is a ppc context object that gives access to ppc-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerPPC(const SystemInfo *system_info, + const MDRawContextPPC *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + private: + // Implementation of Stackwalker, using ppc context (stack pointer in %r1, + // saved program counter in %srr0) and stack conventions (saved stack + // pointer at 0(%r1), return address at 8(0(%r1)). + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextPPC *context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_PPC_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker_selftest.cc b/thirdparty/google-breakpad/r318/src/processor/stackwalker_selftest.cc new file mode 100644 index 00000000..6b71a6a8 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker_selftest.cc @@ -0,0 +1,425 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_selftest.cc: Tests StackwalkerX86 or StackwalkerPPC using the +// running process' stack as test data, if running on an x86 or ppc and +// compiled with gcc. This test is not enabled in the "make check" suite +// by default, because certain optimizations interfere with its proper +// operation. To turn it on, configure with --enable-selftest. +// +// Optimizations that cause problems: +// - stack frame reuse. The Recursor function here calls itself with +// |return Recursor|. When the caller's frame is reused, it will cause +// CountCallerFrames to correctly return the same number of frames +// in both the caller and callee. This is considered an unexpected +// condition in the test, which expects a callee to have one more +// caller frame in the stack than its caller. +// - frame pointer omission. Even with a stackwalker that understands +// this optimization, the code to harness debug information currently +// only exists to retrieve it from minidumps, not the current process. +// +// This test can also serve as a developmental and debugging aid if +// PRINT_STACKS is defined. +// +// Author: Mark Mentovai + +#include "processor/logging.h" + +#if defined(__i386) && !defined(__i386__) +#define __i386__ +#endif +#if defined(__sparc) && !defined(__sparc__) +#define __sparc__ +#endif + +#if (defined(__SUNPRO_CC) || defined(__GNUC__)) && \ + (defined(__i386__) || defined(__ppc__) || defined(__sparc__)) + + +#include + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/scoped_ptr.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::MemoryRegion; +using google_breakpad::scoped_ptr; +using google_breakpad::StackFrame; +using google_breakpad::StackFramePPC; +using google_breakpad::StackFrameX86; +using google_breakpad::StackFrameSPARC; + +#if defined(__i386__) +#include "processor/stackwalker_x86.h" +using google_breakpad::StackwalkerX86; +#elif defined(__ppc__) +#include "processor/stackwalker_ppc.h" +using google_breakpad::StackwalkerPPC; +#elif defined(__sparc__) +#include "processor/stackwalker_sparc.h" +using google_breakpad::StackwalkerSPARC; +#endif // __i386__ || __ppc__ || __sparc__ + +#define RECURSION_DEPTH 100 + + +// A simple MemoryRegion subclass that provides direct access to this +// process' memory space by pointer. +class SelfMemoryRegion : public MemoryRegion { + public: + virtual u_int64_t GetBase() { return 0; } + virtual u_int32_t GetSize() { return 0xffffffff; } + + bool GetMemoryAtAddress(u_int64_t address, u_int8_t* value) { + return GetMemoryAtAddressInternal(address, value); } + bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value) { + return GetMemoryAtAddressInternal(address, value); } + bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value) { + return GetMemoryAtAddressInternal(address, value); } + bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value) { + return GetMemoryAtAddressInternal(address, value); } + + private: + template bool GetMemoryAtAddressInternal(u_int64_t address, + T* value) { + // Without knowing what addresses are actually mapped, just assume that + // everything low is not mapped. This helps the stackwalker catch the + // end of a stack when it tries to dereference a null or low pointer + // in an attempt to find the caller frame. Other unmapped accesses will + // cause the program to crash, but that would properly be a test failure. + if (address < 0x100) + return false; + + u_int8_t* memory = 0; + *value = *reinterpret_cast(&memory[address]); + return true; + } +}; + + +#if defined(__GNUC__) + + +#if defined(__i386__) + +// GetEBP returns the current value of the %ebp register. Because it's +// implemented as a function, %ebp itself contains GetEBP's frame pointer +// and not the caller's frame pointer. Dereference %ebp to obtain the +// caller's frame pointer, which the compiler-generated preamble stored +// on the stack (provided frame pointers are not being omitted.) Because +// this function depends on the compiler-generated preamble, inlining is +// disabled. +static u_int32_t GetEBP() __attribute__((noinline)); +static u_int32_t GetEBP() { + u_int32_t ebp; + __asm__ __volatile__( + "movl (%%ebp), %0" + : "=a" (ebp) + ); + return ebp; +} + + +// The caller's %esp is 8 higher than the value of %ebp in this function, +// assuming that it's not inlined and that the standard prolog is used. +// The CALL instruction places a 4-byte return address on the stack above +// the caller's %esp, and this function's prolog will save the caller's %ebp +// on the stack as well, for another 4 bytes, before storing %esp in %ebp. +static u_int32_t GetESP() __attribute__((noinline)); +static u_int32_t GetESP() { + u_int32_t ebp; + __asm__ __volatile__( + "movl %%ebp, %0" + : "=a" (ebp) + ); + return ebp + 8; +} + + +// GetEIP returns the instruction pointer identifying the next instruction +// to execute after GetEIP returns. It obtains this information from the +// stack, where it was placed by the call instruction that called GetEIP. +// This function depends on frame pointers not being omitted. It is possible +// to write a pure asm version of this routine that has no compiler-generated +// preamble and uses %esp instead of %ebp; that would function in the +// absence of frame pointers. However, the simpler approach is used here +// because GetEBP and stackwalking necessarily depends on access to frame +// pointers. Because this function depends on a call instruction and the +// compiler-generated preamble, inlining is disabled. +static u_int32_t GetEIP() __attribute__((noinline)); +static u_int32_t GetEIP() { + u_int32_t eip; + __asm__ __volatile__( + "movl 4(%%ebp), %0" + : "=a" (eip) + ); + return eip; +} + + +#elif defined(__ppc__) + + +// GetSP returns the current value of the %r1 register, which by convention, +// is the stack pointer on ppc. Because it's implemented as a function, +// %r1 itself contains GetSP's own stack pointer and not the caller's stack +// pointer. Dereference %r1 to obtain the caller's stack pointer, which the +// compiler-generated prolog stored on the stack. Because this function +// depends on the compiler-generated prolog, inlining is disabled. +static u_int32_t GetSP() __attribute__((noinline)); +static u_int32_t GetSP() { + u_int32_t sp; + __asm__ __volatile__( + "lwz %0, 0(r1)" + : "=r" (sp) + ); + return sp; +} + + +// GetPC returns the program counter identifying the next instruction to +// execute after GetPC returns. It obtains this information from the +// link register, where it was placed by the branch instruction that called +// GetPC. Because this function depends on the caller's use of a branch +// instruction, inlining is disabled. +static u_int32_t GetPC() __attribute__((noinline)); +static u_int32_t GetPC() { + u_int32_t lr; + __asm__ __volatile__( + "mflr %0" + : "=r" (lr) + ); + return lr; +} + + +#elif defined(__sparc__) + + +// GetSP returns the current value of the %sp/%o6/%g_r[14] register, which +// by convention, is the stack pointer on sparc. Because it's implemented +// as a function, %sp itself contains GetSP's own stack pointer and not +// the caller's stack pointer. Dereference to obtain the caller's stack +// pointer, which the compiler-generated prolog stored on the stack. +// Because this function depends on the compiler-generated prolog, inlining +// is disabled. +static u_int32_t GetSP() __attribute__((noinline)); +static u_int32_t GetSP() { + u_int32_t sp; + __asm__ __volatile__( + "mov %%fp, %0" + : "=r" (sp) + ); + return sp; +} + +// GetFP returns the current value of the %fp register. Because it's +// implemented as a function, %fp itself contains GetFP's frame pointer +// and not the caller's frame pointer. Dereference %fp to obtain the +// caller's frame pointer, which the compiler-generated preamble stored +// on the stack (provided frame pointers are not being omitted.) Because +// this function depends on the compiler-generated preamble, inlining is +// disabled. +static u_int32_t GetFP() __attribute__((noinline)); +static u_int32_t GetFP() { + u_int32_t fp; + __asm__ __volatile__( + "ld [%%fp+56], %0" + : "=r" (fp) + ); + return fp; +} + +// GetPC returns the program counter identifying the next instruction to +// execute after GetPC returns. It obtains this information from the +// link register, where it was placed by the branch instruction that called +// GetPC. Because this function depends on the caller's use of a branch +// instruction, inlining is disabled. +static u_int32_t GetPC() __attribute__((noinline)); +static u_int32_t GetPC() { + u_int32_t pc; + __asm__ __volatile__( + "mov %%i7, %0" + : "=r" (pc) + ); + return pc + 8; +} + +#endif // __i386__ || __ppc__ || __sparc__ + +#elif defined(__SUNPRO_CC) + +#if defined(__i386__) +extern "C" { +extern u_int32_t GetEIP(); +extern u_int32_t GetEBP(); +extern u_int32_t GetESP(); +} +#elif defined(__sparc__) +extern "C" { +extern u_int32_t GetPC(); +extern u_int32_t GetFP(); +extern u_int32_t GetSP(); +} +#endif // __i386__ || __sparc__ + +#endif // __GNUC__ || __SUNPRO_CC + +// CountCallerFrames returns the number of stack frames beneath the function +// that called CountCallerFrames. Because this function's return value +// is dependent on the size of the stack beneath it, inlining is disabled, +// and any function that calls this should not be inlined either. +#if defined(__GNUC__) +static unsigned int CountCallerFrames() __attribute__((noinline)); +#elif defined(__SUNPRO_CC) +static unsigned int CountCallerFrames(); +#endif +static unsigned int CountCallerFrames() { + SelfMemoryRegion memory; + BasicSourceLineResolver resolver; + +#if defined(__i386__) + MDRawContextX86 context = MDRawContextX86(); + context.eip = GetEIP(); + context.ebp = GetEBP(); + context.esp = GetESP(); + + StackwalkerX86 stackwalker = StackwalkerX86(NULL, &context, &memory, NULL, + NULL, &resolver); +#elif defined(__ppc__) + MDRawContextPPC context = MDRawContextPPC(); + context.srr0 = GetPC(); + context.gpr[1] = GetSP(); + + StackwalkerPPC stackwalker = StackwalkerPPC(NULL, &context, &memory, NULL, + NULL, &resolver); +#elif defined(__sparc__) + MDRawContextSPARC context = MDRawContextSPARC(); + context.pc = GetPC(); + context.g_r[14] = GetSP(); + context.g_r[30] = GetFP(); + + StackwalkerSPARC stackwalker = StackwalkerSPARC(NULL, &context, &memory, + NULL, NULL, &resolver); +#endif // __i386__ || __ppc__ || __sparc__ + + CallStack stack; + stackwalker.Walk(&stack); + +#ifdef PRINT_STACKS + printf("\n"); + for (unsigned int frame_index = 0; + frame_index < stack.frames()->size(); + ++frame_index) { + StackFrame *frame = stack.frames()->at(frame_index); + printf("frame %-3d instruction = 0x%08" PRIx64, + frame_index, frame->instruction); +#if defined(__i386__) + StackFrameX86 *frame_x86 = reinterpret_cast(frame); + printf(" esp = 0x%08x ebp = 0x%08x\n", + frame_x86->context.esp, frame_x86->context.ebp); +#elif defined(__ppc__) + StackFramePPC *frame_ppc = reinterpret_cast(frame); + printf(" gpr[1] = 0x%08x\n", frame_ppc->context.gpr[1]); +#elif defined(__sparc__) + StackFrameSPARC *frame_sparc = reinterpret_cast(frame); + printf(" sp = 0x%08x fp = 0x%08x\n", + frame_sparc->context.g_r[14], frame_sparc->context.g_r[30]); +#endif // __i386__ || __ppc__ || __sparc__ + } +#endif // PRINT_STACKS + + // Subtract 1 because the caller wants the number of frames beneath + // itself. Because the caller called us, subract two for our frame and its + // frame, which are included in stack.size(). + return stack.frames()->size() - 2; +} + + +// Recursor verifies that the number stack frames beneath itself is one more +// than the number of stack frames beneath its parent. When depth frames +// have been reached, Recursor stops checking and returns success. If the +// frame count check fails at any depth, Recursor will stop and return false. +// Because this calls CountCallerFrames, inlining is disabled. +#if defined(__GNUC__) +static bool Recursor(unsigned int depth, unsigned int parent_callers) + __attribute__((noinline)); +#elif defined(__SUNPRO_CC) +static bool Recursor(unsigned int depth, unsigned int parent_callers); +#endif +static bool Recursor(unsigned int depth, unsigned int parent_callers) { + unsigned int callers = CountCallerFrames(); + if (callers != parent_callers + 1) + return false; + + if (depth) + return Recursor(depth - 1, callers); + + // depth == 0 + return true; +} + + +// Because this calls CountCallerFrames, inlining is disabled - but because +// it's main (and nobody calls it other than the entry point), it wouldn't +// be inlined anyway. +#if defined(__GNUC__) +int main(int argc, char** argv) __attribute__((noinline)); +#elif defined(__SUNPRO_CC) +int main(int argc, char** argv); +#endif +int main(int argc, char** argv) { + BPLOG_INIT(&argc, &argv); + + return Recursor(RECURSION_DEPTH, CountCallerFrames()) ? 0 : 1; +} + + +#else +// Not i386 or ppc or sparc? We can only test stacks we know how to walk. + + +int main(int argc, char **argv) { + BPLOG_INIT(&argc, &argv); + + // "make check" interprets an exit status of 77 to mean that the test is + // not supported. + BPLOG(ERROR) << "Selftest not supported here"; + return 77; +} + + +#endif // (__GNUC__ || __SUNPRO_CC) && (__i386__ || __ppc__ || __sparc__) diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker_selftest_sol.s b/thirdparty/google-breakpad/r318/src/processor/stackwalker_selftest_sol.s new file mode 100644 index 00000000..648b0499 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker_selftest_sol.s @@ -0,0 +1,111 @@ +/* Copyright (c) 2007, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* stackwalker_selftest_sol.s + * On Solaris, the recommeded compiler is CC, so we can not use gcc inline + * asm, use this method instead. + * + * How to compile: as -P -L -D_ASM -D_STDC -K PIC -o \ + * src/processor/stackwalker_selftest_sol.o \ + * src/processor/stackwalker_selftest_sol.s + * + * Author: Michael Shang + */ + +#include + +#if defined(__i386) + + +ENTRY(GetEBP) + pushl %ebp + movl %esp,%ebp + subl $0x00000004,%esp + movl 0x00000000(%ebp),%eax + movl %eax,0xfffffffc(%ebp) + movl 0xfffffffc(%ebp),%eax + leave + ret +SET_SIZE(GetEBP) + +ENTRY(GetEIP) + pushl %ebp + movl %esp,%ebp + subl $0x00000004,%esp + movl 0x00000004(%ebp),%eax + movl %eax,0xfffffffc(%ebp) + movl 0xfffffffc(%ebp),%eax + leave + ret +SET_SIZE(GetEIP) + +ENTRY(GetESP) + pushl %ebp + movl %esp,%ebp + subl $0x00000004,%esp + movl %ebp,%eax + movl %eax,0xfffffffc(%ebp) + movl 0xfffffffc(%ebp),%eax + addl $0x00000008,%eax + leave + ret +SET_SIZE(GetESP) + + +#elif defined(__sparc) + + +ENTRY(GetPC) + save %sp, -120, %sp + mov %i7, %i4 + inccc 8, %i4 + mov %i4, %i0 + ret + restore +SET_SIZE(GetPC) + +ENTRY(GetSP) + save %sp, -120, %sp + mov %fp, %i4 + mov %i4, %i0 + ret + restore +SET_SIZE(GetSP) + +ENTRY(GetFP) + save %sp, -120, %sp + ld [%fp + 56], %g1 + mov %g1, %i0 + ret + restore +SET_SIZE(GetFP) + + +#endif // __i386 || __sparc diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker_sparc.cc b/thirdparty/google-breakpad/r318/src/processor/stackwalker_sparc.cc new file mode 100644 index 00000000..b7b6f005 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker_sparc.cc @@ -0,0 +1,139 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_sparc.cc: sparc-specific stackwalker. +// +// See stackwalker_sparc.h for documentation. +// +// Author: Michael Shang + + +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/logging.h" +#include "processor/stackwalker_sparc.h" + +namespace google_breakpad { + + +StackwalkerSPARC::StackwalkerSPARC(const SystemInfo *system_info, + const MDRawContextSPARC *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver) + : Stackwalker(system_info, memory, modules, supplier, resolver), + context_(context) { +} + + +StackFrame* StackwalkerSPARC::GetContextFrame() { + if (!context_ || !memory_) { + BPLOG(ERROR) << "Can't get context frame without context or memory"; + return NULL; + } + + StackFrameSPARC *frame = new StackFrameSPARC(); + + // The instruction pointer is stored directly in a register, so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = StackFrameSPARC::CONTEXT_VALID_ALL; + frame->instruction = frame->context.pc; + + return frame; +} + + +StackFrame* StackwalkerSPARC::GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + StackFrameSPARC *last_frame = static_cast( + stack->frames()->back()); + + // new: caller + // old: callee + // %fp, %i6 and g_r[30] is the same, see minidump_format.h + // %sp, %o6 and g_r[14] is the same, see minidump_format.h + // %sp_new = %fp_old + // %fp_new = *(%fp_old + 32 + 32 - 8), where the callee's %i6 + // %pc_new = *(%fp_old + 32 + 32 - 4) + 8 + // which is callee's %i7 plus 8 + + // A caller frame must reside higher in memory than its callee frames. + // Anything else is an error, or an indication that we've reached the + // end of the stack. + u_int32_t stack_pointer = last_frame->context.g_r[30]; + if (stack_pointer <= last_frame->context.g_r[14]) { + return NULL; + } + + u_int32_t instruction; + if (!memory_->GetMemoryAtAddress(stack_pointer + 60, + &instruction) || instruction <= 1) { + return NULL; + } + + u_int32_t stack_base; + if (!memory_->GetMemoryAtAddress(stack_pointer + 56, + &stack_base) || stack_base <= 1) { + return NULL; + } + + StackFrameSPARC *frame = new StackFrameSPARC(); + + frame->context = last_frame->context; + frame->context.g_r[14] = stack_pointer; + frame->context.g_r[30] = stack_base; + + // frame->context.pc is the return address, which is 2 instruction + // past the branch that caused us to arrive at the callee, which are + // a CALL instruction then a NOP instruction. + // frame_ppc->instruction to 8 less than that. Since all sparc + // instructions are 4 bytes wide, this is the address of the branch + // instruction. This allows source line information to match up with the + // line that contains a function call. Callers that require the exact + // return address value may access the %i7/g_r[31] field of StackFrameSPARC. + frame->context.pc = instruction + 8; + frame->instruction = instruction; + frame->context_validity = StackFrameSPARC::CONTEXT_VALID_PC | + StackFrameSPARC::CONTEXT_VALID_SP | + StackFrameSPARC::CONTEXT_VALID_FP; + + return frame; +} + + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker_sparc.h b/thirdparty/google-breakpad/r318/src/processor/stackwalker_sparc.h new file mode 100644 index 00000000..f051e5bb --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker_sparc.h @@ -0,0 +1,86 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_sparc.h: sparc-specific stackwalker. +// +// Provides stack frames given sparc register context and a memory region +// corresponding to an sparc stack. +// +// Author: Michael Shang + + +#ifndef PROCESSOR_STACKWALKER_SPARC_H__ +#define PROCESSOR_STACKWALKER_SPARC_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerSPARC : public Stackwalker { + public: + // context is a sparc context object that gives access to sparc-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerSPARC(const SystemInfo *system_info, + const MDRawContextSPARC *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + private: + // Implementation of Stackwalker, using x86 context (%ebp, %esp, %eip) and + // stack conventions (saved %ebp at [%ebp], saved %eip at 4[%ebp], or + // alternate conventions as guided by stack_frame_info_). + // Implementation of Stackwalker, using ppc context (stack pointer in %r1, + // saved program counter in %srr0) and stack conventions (saved stack + // pointer at 0(%r1), return address at 8(0(%r1)). + // Implementation of Stackwalker, using sparc context (%fp, %sp, %pc) and + // stack conventions (saved %sp at) + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextSPARC *context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_SPARC_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker_x86.cc b/thirdparty/google-breakpad/r318/src/processor/stackwalker_x86.cc new file mode 100644 index 00000000..e39df17f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker_x86.cc @@ -0,0 +1,432 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_x86.cc: x86-specific stackwalker. +// +// See stackwalker_x86.h for documentation. +// +// Author: Mark Mentovai + + +#include "processor/postfix_evaluator-inl.h" + +#include "processor/stackwalker_x86.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" +#include "processor/stack_frame_info.h" + +namespace google_breakpad { + + +StackwalkerX86::StackwalkerX86(const SystemInfo *system_info, + const MDRawContextX86 *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver) + : Stackwalker(system_info, memory, modules, supplier, resolver), + context_(context) { + if (memory_->GetBase() + memory_->GetSize() - 1 > 0xffffffff) { + // The x86 is a 32-bit CPU, the limits of the supplied stack are invalid. + // Mark memory_ = NULL, which will cause stackwalking to fail. + BPLOG(ERROR) << "Memory out of range for stackwalking: " << + HexString(memory_->GetBase()) << "+" << + HexString(memory_->GetSize()); + memory_ = NULL; + } +} + + +StackFrame* StackwalkerX86::GetContextFrame() { + if (!context_ || !memory_) { + BPLOG(ERROR) << "Can't get context frame without context or memory"; + return NULL; + } + + StackFrameX86 *frame = new StackFrameX86(); + + // The instruction pointer is stored directly in a register, so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = StackFrameX86::CONTEXT_VALID_ALL; + frame->instruction = frame->context.eip; + + return frame; +} + + +StackFrame* StackwalkerX86::GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + StackFrameX86 *last_frame = static_cast( + stack->frames()->back()); + StackFrameInfo *last_frame_info = stack_frame_info.back().get(); + + // This stackwalker sets each frame's %esp to its value immediately prior + // to the CALL into the callee. This means that %esp points to the last + // callee argument pushed onto the stack, which may not be where %esp points + // after the callee returns. Specifically, the value is correct for the + // cdecl calling convention, but not other conventions. The cdecl + // convention requires a caller to pop its callee's arguments from the + // stack after the callee returns. This is usually accomplished by adding + // the known size of the arguments to %esp. Other calling conventions, + // including stdcall, thiscall, and fastcall, require the callee to pop any + // parameters stored on the stack before returning. This is usually + // accomplished by using the RET n instruction, which pops n bytes off + // the stack after popping the return address. + // + // Because each frame's %esp will point to a location on the stack after + // callee arguments have been PUSHed, when locating things in a stack frame + // relative to %esp, the size of the arguments to the callee need to be + // taken into account. This seems a little bit unclean, but it's better + // than the alternative, which would need to take these same things into + // account, but only for cdecl functions. With this implementation, we get + // to be agnostic about each function's calling convention. Furthermore, + // this is how Windows debugging tools work, so it means that the %esp + // values produced by this stackwalker directly correspond to the %esp + // values you'll see there. + // + // If the last frame has no callee (because it's the context frame), just + // set the callee parameter size to 0: the stack pointer can't point to + // callee arguments because there's no callee. This is correct as long + // as the context wasn't captured while arguments were being pushed for + // a function call. Note that there may be functions whose parameter sizes + // are unknown, 0 is also used in that case. When that happens, it should + // be possible to walk to the next frame without reference to %esp. + + int frames_already_walked = stack_frame_info.size(); + u_int32_t last_frame_callee_parameter_size = 0; + if (frames_already_walked >= 2) { + StackFrameInfo *last_frame_callee_info = + stack_frame_info[frames_already_walked - 2].get(); + if (last_frame_callee_info && + last_frame_callee_info->valid & StackFrameInfo::VALID_PARAMETER_SIZE) { + last_frame_callee_parameter_size = + last_frame_callee_info->parameter_size; + } + } + + // Set up the dictionary for the PostfixEvaluator. %ebp and %esp are used + // in each program string, and their previous values are known, so set them + // here. .cbCalleeParams is a Breakpad extension that allows us to use + // the PostfixEvaluator engine when certain types of debugging information + // are present without having to write the constants into the program string + // as literals. + PostfixEvaluator::DictionaryType dictionary; + dictionary["$ebp"] = last_frame->context.ebp; + dictionary["$esp"] = last_frame->context.esp; + dictionary[".cbCalleeParams"] = last_frame_callee_parameter_size; + + if (last_frame_info && last_frame_info->valid == StackFrameInfo::VALID_ALL) { + // FPO debugging data is available. Initialize constants. + dictionary[".cbSavedRegs"] = last_frame_info->saved_register_size; + dictionary[".cbLocals"] = last_frame_info->local_size; + dictionary[".raSearchStart"] = last_frame->context.esp + + last_frame_callee_parameter_size + + last_frame_info->local_size + + last_frame_info->saved_register_size; + } + if (last_frame_info && + last_frame_info->valid & StackFrameInfo::VALID_PARAMETER_SIZE) { + // This is treated separately because it can either come from FPO data or + // from other debugging data. + dictionary[".cbParams"] = last_frame_info->parameter_size; + } + + // Decide what type of program string to use. The program string is in + // postfix notation and will be passed to PostfixEvaluator::Evaluate. + // Given the dictionary and the program string, it is possible to compute + // the return address and the values of other registers in the calling + // function. When encountering a nontraditional frame (one which takes + // advantage of FPO), the stack may need to be scanned for these values. + // For traditional frames, simple deterministic dereferencing suffices + // without any need for scanning. The results of program string evaluation + // will be used to determine whether to scan for better values. + string program_string; + bool traditional_frame = true; + bool recover_ebp = true; + if (last_frame_info && last_frame_info->valid == StackFrameInfo::VALID_ALL) { + // FPO data available. + traditional_frame = false; + if (!last_frame_info->program_string.empty()) { + // The FPO data has its own program string, which will tell us how to + // get to the caller frame, and may even fill in the values of + // nonvolatile registers and provide pointers to local variables and + // parameters. In some cases, particularly with program strings that use + // .raSearchStart, the stack may need to be scanned afterward. + program_string = last_frame_info->program_string; + } else if (last_frame_info->allocates_base_pointer) { + // The function corresponding to the last frame doesn't use the frame + // pointer for conventional purposes, but it does allocate a new + // frame pointer and use it for its own purposes. Its callee's + // information is still accessed relative to %esp, and the previous + // value of %ebp can be recovered from a location in its stack frame, + // within the saved-register area. + // + // Functions that fall into this category use the %ebp register for + // a purpose other than the frame pointer. They restore the caller's + // %ebp before returning. These functions create their stack frame + // after a CALL by decrementing the stack pointer in an amount + // sufficient to store local variables, and then PUSHing saved + // registers onto the stack. Arguments to a callee function, if any, + // are PUSHed after that. Walking up to the caller, therefore, + // can be done solely with calculations relative to the stack pointer + // (%esp). The return address is recovered from the memory location + // above the known sizes of the callee's parameters, saved registers, + // and locals. The caller's stack pointer (the value of %esp when + // the caller executed CALL) is the location immediately above the + // saved return address. The saved value of %ebp to be restored for + // the caller is at a known location in the saved-register area of + // the stack frame. + // + // For this type of frame, MSVC 14 (from Visual Studio 8/2005) in + // link-time code generation mode (/LTCG and /GL) can generate erroneous + // debugging data. The reported size of saved registers can be 0, + // which is clearly an error because these frames must, at the very + // least, save %ebp. For this reason, in addition to those given above + // about the use of .raSearchStart, the stack may need to be scanned + // for a better return address and a better frame pointer after the + // program string is evaluated. + // + // %eip_new = *(%esp_old + callee_params + saved_regs + locals) + // %ebp_new = *(%esp_old + callee_params + saved_regs - 8) + // %esp_new = %esp_old + callee_params + saved_regs + locals + 4 + program_string = "$eip .raSearchStart ^ = " + "$ebp $esp .cbCalleeParams + .cbSavedRegs + 8 - ^ = " + "$esp .raSearchStart 4 + ="; + } else { + // The function corresponding to the last frame doesn't use %ebp at + // all. The callee frame is located relative to %esp. + // + // The called procedure's instruction pointer and stack pointer are + // recovered in the same way as the case above, except that no + // frame pointer (%ebp) is used at all, so it is not saved anywhere + // in the callee's stack frame and does not need to be recovered. + // Because %ebp wasn't used in the callee, whatever value it has + // is the value that it had in the caller, so it can be carried + // straight through without bringing its validity into question. + // + // Because of the use of .raSearchStart, the stack will possibly be + // examined to locate a better return address after program string + // evaluation. The stack will not be examined to locate a saved + // %ebp value, because these frames do not save (or use) %ebp. + // + // %eip_new = *(%esp_old + callee_params + saved_regs + locals) + // %esp_new = %esp_old + callee_params + saved_regs + locals + 4 + // %ebp_new = %ebp_old + program_string = "$eip .raSearchStart ^ = " + "$esp .raSearchStart 4 + ="; + recover_ebp = false; + } + } else { + // No FPO information is available for the last frame. Assume that the + // standard %ebp-using x86 calling convention is in use. + // + // The typical x86 calling convention, when frame pointers are present, + // is for the calling procedure to use CALL, which pushes the return + // address onto the stack and sets the instruction pointer (%eip) to + // the entry point of the called routine. The called routine then + // PUSHes the calling routine's frame pointer (%ebp) onto the stack + // before copying the stack pointer (%esp) to the frame pointer (%ebp). + // Therefore, the calling procedure's frame pointer is always available + // by dereferencing the called procedure's frame pointer, and the return + // address is always available at the memory location immediately above + // the address pointed to by the called procedure's frame pointer. The + // calling procedure's stack pointer (%esp) is 8 higher than the value + // of the called procedure's frame pointer at the time the calling + // procedure made the CALL: 4 bytes for the return address pushed by the + // CALL itself, and 4 bytes for the callee's PUSH of the caller's frame + // pointer. + // + // Instruction and frame pointer recovery for these traditional frames is + // entirely deterministic, and the stack will not be scanned after + // recovering these values. + // + // %eip_new = *(%ebp_old + 4) + // %esp_new = %ebp_old + 8 + // %ebp_new = *(%ebp_old) + program_string = "$eip $ebp 4 + ^ = " + "$esp $ebp 8 + = " + "$ebp $ebp ^ ="; + } + + // Now crank it out, making sure that the program string set at least the + // two required variables. + PostfixEvaluator evaluator = + PostfixEvaluator(&dictionary, memory_); + PostfixEvaluator::DictionaryValidityType dictionary_validity; + if (!evaluator.Evaluate(program_string, &dictionary_validity) || + dictionary_validity.find("$eip") == dictionary_validity.end() || + dictionary_validity.find("$esp") == dictionary_validity.end()) { + return NULL; + } + + // If this stack frame did not use %ebp in a traditional way, locating the + // return address isn't entirely deterministic. In that case, the stack + // can be scanned to locate the return address. + // + // Even in nontraditional frames, if program string evaluation resulted in + // both %eip and %ebp values of 0, trust that the end of the stack has been + // reached and don't scan for anything else. + if (!traditional_frame && + (dictionary["$eip"] != 0 || dictionary["$ebp"] != 0)) { + int offset = 0; + + // This scan can only be done if a CodeModules object is available, to + // check that candidate return addresses are in fact inside a module. + // + // TODO(mmentovai): This ignores dynamically-generated code. One possible + // solution is to check the minidump's memory map to see if the candidate + // %eip value comes from a mapped executable page, although this would + // require dumps that contain MINIDUMP_MEMORY_INFO, which the Breakpad + // client doesn't currently write (it would need to call MiniDumpWriteDump + // with the MiniDumpWithFullMemoryInfo type bit set). Even given this + // ability, older OSes (pre-XP SP2) and CPUs (pre-P4) don't enforce + // an independent execute privilege on memory pages. + + u_int32_t eip = dictionary["$eip"]; + if (modules_ && !modules_->GetModuleForAddress(eip)) { + const int kRASearchWords = 15; + + // The instruction pointer at .raSearchStart was invalid, so start + // looking one 32-bit word above that location. + u_int32_t location_start = dictionary[".raSearchStart"] + 4; + + for (u_int32_t location = location_start; + location <= location_start + kRASearchWords * 4; + location += 4) { + if (!memory_->GetMemoryAtAddress(location, &eip)) + break; + + if (modules_->GetModuleForAddress(eip)) { + // This is a better return address that what program string + // evaluation found. Use it, and set %esp to the location above the + // one where the return address was found. + // + // TODO(mmentovai): The return-address check can be made even + // stronger in modules for which debugging data is available. In + // that case, it's possible to check that the candidate return + // address is inside a known function. + + dictionary["$eip"] = eip; + dictionary["$esp"] = location + 4; + offset = location - location_start; + break; + } + } + } + + // When trying to recover the previous value of the frame pointer (%ebp), + // start looking at the lowest possible address in the saved-register + // area, and look at the entire saved register area, increased by the + // size of |offset| to account for additional data that may be on the + // stack. The scan is performed from the highest possible address to + // the lowest, because we expect that the function's prolog would have + // saved %ebp early. + u_int32_t ebp = dictionary["$ebp"]; + u_int32_t value; // throwaway variable to check pointer validity + if (recover_ebp && !memory_->GetMemoryAtAddress(ebp, &value)) { + int fp_search_bytes = last_frame_info->saved_register_size + offset; + u_int32_t location_end = last_frame->context.esp + + last_frame_callee_parameter_size; + + for (u_int32_t location = location_end + fp_search_bytes; + location >= location_end; + location -= 4) { + if (!memory_->GetMemoryAtAddress(location, &ebp)) + break; + + if (memory_->GetMemoryAtAddress(ebp, &value)) { + // The candidate value is a pointer to the same memory region + // (the stack). Prefer it as a recovered %ebp result. + dictionary["$ebp"] = ebp; + break; + } + } + } + } + + // Treat an instruction address of 0 as end-of-stack. Treat incorrect stack + // direction as end-of-stack to enforce progress and avoid infinite loops. + if (dictionary["$eip"] == 0 || + dictionary["$esp"] <= last_frame->context.esp) { + return NULL; + } + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameX86 *frame = new StackFrameX86(); + + frame->context = last_frame->context; + frame->context.eip = dictionary["$eip"]; + frame->context.esp = dictionary["$esp"]; + frame->context.ebp = dictionary["$ebp"]; + frame->context_validity = StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP; + + // These are nonvolatile (callee-save) registers, and the program string + // may have filled them in. + if (dictionary_validity.find("$ebx") != dictionary_validity.end()) { + frame->context.ebx = dictionary["$ebx"]; + frame->context_validity |= StackFrameX86::CONTEXT_VALID_EBX; + } + if (dictionary_validity.find("$esi") != dictionary_validity.end()) { + frame->context.esi = dictionary["$esi"]; + frame->context_validity |= StackFrameX86::CONTEXT_VALID_ESI; + } + if (dictionary_validity.find("$edi") != dictionary_validity.end()) { + frame->context.edi = dictionary["$edi"]; + frame->context_validity |= StackFrameX86::CONTEXT_VALID_EDI; + } + + // frame->context.eip is the return address, which is one instruction + // past the CALL that caused us to arrive at the callee. Set + // frame->instruction to one less than that. This won't reference the + // beginning of the CALL instruction, but it's guaranteed to be within the + // CALL, which is sufficient to get the source line information to match up + // with the line that contains a function call. Callers that require the + // exact return address value may access the context.eip field of + // StackFrameX86. + frame->instruction = frame->context.eip - 1; + + return frame; +} + + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/processor/stackwalker_x86.h b/thirdparty/google-breakpad/r318/src/processor/stackwalker_x86.h new file mode 100644 index 00000000..14b9e8b9 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/stackwalker_x86.h @@ -0,0 +1,82 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_x86.h: x86-specific stackwalker. +// +// Provides stack frames given x86 register context and a memory region +// corresponding to an x86 stack. +// +// Author: Mark Mentovai + + +#ifndef PROCESSOR_STACKWALKER_X86_H__ +#define PROCESSOR_STACKWALKER_X86_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + + +class StackwalkerX86 : public Stackwalker { + public: + // context is an x86 context object that gives access to x86-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerX86(const SystemInfo *system_info, + const MDRawContextX86 *context, + MemoryRegion *memory, + const CodeModules *modules, + SymbolSupplier *supplier, + SourceLineResolverInterface *resolver); + + private: + // Implementation of Stackwalker, using x86 context (%ebp, %esp, %eip) and + // stack conventions (saved %ebp at [%ebp], saved %eip at 4[%ebp], or + // alternate conventions as guided by stack_frame_info_). + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame( + const CallStack *stack, + const vector< linked_ptr > &stack_frame_info); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextX86 *context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_X86_H__ diff --git a/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.dmp b/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.dmp new file mode 100644 index 0000000000000000000000000000000000000000..1a6feee7cc1f6a988c3810c325dc43df70562799 GIT binary patch literal 11317 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 literal 0 HcmV?d00001 diff --git a/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.dump.out b/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.dump.out new file mode 100644 index 00000000..d8816e5d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.dump.out @@ -0,0 +1,705 @@ +MDRawHeader + signature = 0x504d444d + version = 0x5128a793 + stream_count = 9 + stream_directory_rva = 0x20 + checksum = 0x0 + time_date_stamp = 0x45d35f73 2007-02-14 19:13:55 + flags = 0x0 + +mDirectory[0] +MDRawDirectory + stream_type = 3 + location.data_size = 100 + location.rva = 0x184 + +mDirectory[1] +MDRawDirectory + stream_type = 4 + location.data_size = 1408 + location.rva = 0x1e8 + +mDirectory[2] +MDRawDirectory + stream_type = 5 + location.data_size = 52 + location.rva = 0x1505 + +mDirectory[3] +MDRawDirectory + stream_type = 6 + location.data_size = 168 + location.rva = 0xdc + +mDirectory[4] +MDRawDirectory + stream_type = 7 + location.data_size = 56 + location.rva = 0x8c + +mDirectory[5] +MDRawDirectory + stream_type = 15 + location.data_size = 24 + location.rva = 0xc4 + +mDirectory[6] +MDRawDirectory + stream_type = 1197932545 + location.data_size = 12 + location.rva = 0x14f9 + +mDirectory[7] +MDRawDirectory + stream_type = 0 + location.data_size = 0 + location.rva = 0x0 + +mDirectory[8] +MDRawDirectory + stream_type = 0 + location.data_size = 0 + location.rva = 0x0 + +Streams: + stream type 0x0 at index 8 + stream type 0x3 at index 0 + stream type 0x4 at index 1 + stream type 0x5 at index 2 + stream type 0x6 at index 3 + stream type 0x7 at index 4 + stream type 0xf at index 5 + stream type 0x47670001 at index 6 + +MinidumpThreadList + thread_count = 2 + +thread[0] +MDRawThread + thread_id = 0xbf4 + suspend_count = 0 + priority_class = 0x0 + priority = 0x0 + teb = 0x7ffdf000 + stack.start_of_memory_range = 0x12f31c + stack.memory.data_size = 0xce4 + stack.memory.rva = 0x1639 + thread_context.data_size = 0x2cc + thread_context.rva = 0xd94 + +MDRawContextX86 + context_flags = 0x1003f + dr0 = 0x0 + dr1 = 0x0 + dr2 = 0x0 + dr3 = 0x0 + dr6 = 0x0 + dr7 = 0x0 + float_save.control_word = 0xffff027f + float_save.status_word = 0xffff0000 + float_save.tag_word = 0xffffffff + float_save.error_offset = 0x0 + float_save.error_selector = 0x220000 + float_save.data_offset = 0x0 + float_save.data_selector = 0xffff0000 + float_save.register_area[80] = 0x0000000018b72200000118b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + float_save.cr0_npx_state = 0x0 + gs = 0x0 + fs = 0x3b + es = 0x23 + ds = 0x23 + edi = 0x0 + esi = 0x7b8 + ebx = 0x7c883780 + edx = 0x7c97c0d8 + ecx = 0x7c80b46e + eax = 0x400000 + ebp = 0x12f384 + eip = 0x7c90eb94 + cs = 0x1b + eflags = 0x246 + esp = 0x12f320 + ss = 0x23 + extended_registers[512] = 0x7f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b62200 + +Stack +0x00000000c0e9907ccb25807cb8070000000000000000000034ff1200b0fe12008037887c140000000100000000000000000000001000000027e0907c2e39917c0050fd7f00f0fd7f000000000400000034f312006947c788d4f31200a89a837cf825807c0000000098f312003225807cb8070000ffffffff00000000e4f31200ff1d4000b8070000ffffffffa8fa12008037887c0e1c4000a8fa120000000000ff792a0f64f91200b01b400000004000b0fe12000040020070fa1200084042000000000080fa120080fa12004e30867ca8fa12000000000000000000000000000018000002100000e3ef907c0000000079d900000000000048f41200000014003207917c0500000078071400000014000000000020f412003207917ca05f140018ee907cfa00000074f61200000000009615917ceb06917cf00298000100000000000000384f14009615917ceb06917c7801140008000000404f14000000a659985f1400080000000000000018ee907c90fea700400698003815917c184f1400eb06917c00000000800000000000a65988f69f0090f51200a569917cf8f41200d95c878880f5120043ef907c480485000500000090f5120088fea700a8212400000000000000000080f512002469917cf8fbfd7fa821240008000000f500000000000000384d850078019800a8fa120004000000a05f140096d4917c00000000b0d4917c0000000008069800184f140000000000104f140000000000184f140000004000000000010040020063003a005c0074006500730074005f006100700070002e006500780065000000000000002f00000028000000184f1400780185007801140028000000000000000000140084f3120010000000d8f5120018ee907cf006917cffffffffeb06917ce619917c88e6a7003003000001030000ff1b917c0000980080e6a70080069800400698000000980080e6a70000000000000000000000000080e6a7000818000088e6a700d759927c78019800081800000210000000009800f8f31200280a0000dcf6120018ee907cf006917cffffffffeb06917c0859927c00009800080000005859927c00000000000001000000a659000000005a6202000010000068fe030001000000dffe03000000010000000100fffffe7f0100000001c0c27700008500000000002dc0c27700000000684aaf590000a659241a917c80c0977c0000000000000000cd5c927c0050fd7f0000a65900000100080000004550fd7f0000000000000000000000000050fd7fcd5c927c05000000d4f61200f45c927c80e4977c05000000010000000050fd7f18f712007009917cc0e4977c172e817cff2d817c000000000000a6590000a6590210000000f0fd7f05000000e8f612000806980064f81200a89a837c002e817cffffffffff2d817cc8242400dd8ea75901000000000000004cf712003608a9590000a65901000000000000000100000060f71200e407a9596cf7120000004000000000010040020063003a005c0074006500730074005f006100700070002e0065007800650000006d05917c905f140000000000440d020000000000604f14000c0000007801140000000000a04e1400d84d8700400687004509917c0800000000000000000000004000000078011400a8038700404f14000510907c000000000000000078011400980387000800000008000000c0e4977cd04d8700f835887c7801140010000000a0e7ae591600000030fd1200d39b917c44000000620000000000a65950e9ae59d8eaae59a80387000100000014040000000000000100000002000000f800a659c003870001000000780114009508917c0000a659091b917c020000000900000040000000a2fd12009cfd1200404f1400a2fd1200d04d8700640187000000000000000000d04d870010000000d84d8700384f1400a803870010000000c00300000000870074fb1200404f14006cfe120018ee907cf006917cffffffffeb06917ca09d400000008700000000000400000000000000ffffff3fc04d8700ccfd12009c4d400004000000fa19917cb84d870064018700c04d8700063440000400000018000000c04d870079d90000c0038700fa31400000000000c04d8700c04d87000000000001000000b0fe120082294000c04d87000000000000000000c04d870048fe12008cfe120000000000e224400040fe12008cfe1200c04d8700d84d8700b0fe12008600817c54fa1200d8f9120000000000160018005479420079d90000000000000757917c00000200a4f91200a4f91200a4f91200020000000200000000000000c4f912000000000079d9000014fb12004cfa120014fb1200005a917c00fa1200a0fb120001000000655a917ca405817c74c1977ce705817c00000000f4fd120098fb120000000000a0fb12000000000090fb12000000800070fa120000000000000000000000000016001800547942000000000001000000000000000000000000000000000000003308917ca89a837c0000807c0000807ce800807c2cfa12001fe2907c11fa877cffffffffe06f817c000000006cfa12001c0000000f000000e06f817c8fc60000f0f312000060817cc8fa1200a89a837c7039867cfffffffff0ff1200da36847ca8fa1200099b837cb0fa120000000000b0fa12000000000000000000000000009cfb1200b8fb1200d4fa1200bf37907c9cfb1200e0ff1200b8fb120070fb1200b0ff1200d837907ce0ff120084fb12008b37907c9cfb1200e0ff1200b8fb120070fb1200a89a837c010000009cfb1200e0ff12006078937c9cfb1200e0ff1200b8fb120070fb1200a89a837c280a00009cfb12000200000018ee907c9032917cffffffff8832917c3364917c68fb1200000087003207917c02000000dc31917c1232917c8132917c8832917c1e000000c01e2400080200003807917c54fb12003207917cc4fb120018ee907c9032917c0000130000d01200beb4800088fe1200faea907c00000000b8fb12009cfb1200b8fb1200050000c000000000000000009e4240000200000001000000450000003f0001000000000000000000000000000000000000000000000000007f02ffff0000ffffffffffff0000000000002200000000000000ffff0000000018b72200000118b7220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b0000002300000023000000280a000002000000c1ab807c58bc420094fe12004500000088fe12009e4240001b0000004602010084fe1200230000007f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b622004500000070ff120000424000b8278700dc31917c00000000004c870000000020040000000000000007000000000000004042400000000000000000002e000000000000000cff12007b434100010000000700000084434100004d87002e39917cffffffff24000000240000002700000000000000584d870004000000b1944000244c87002a0000002f000000c0fe1200004d8700584d87000000a659b0b9a859015d400015aa400000000000b4070000784e14000000000001000000f40b00000000000000000000bc070000b8070000f40b0000a8fa120000000000009c4000599c400094b240004f752a0fc0ff1200ec534000010000003039870050398700ff752a0f00002400a02024000050fd7f050000c00100000005000000000000000000240084ff1200acfa1200e0ff1200d06f4000a70b7a0f00000000f0ff1200d76f817c00002400a02024000050fd7f050000c0c8ff1200a8fa1200ffffffffa89a837ce06f817c0000000000000000000000004354400000000000 + +thread[1] +MDRawThread + thread_id = 0x11c0 + suspend_count = 0 + priority_class = 0x0 + priority = 0x0 + teb = 0x7ffde000 + stack.start_of_memory_range = 0x97f6e8 + stack.memory.data_size = 0x918 + stack.memory.rva = 0x231d + thread_context.data_size = 0x2cc + thread_context.rva = 0x1060 + +MDRawContextX86 + context_flags = 0x1003f + dr0 = 0x0 + dr1 = 0x0 + dr2 = 0x0 + dr3 = 0x0 + dr6 = 0x0 + dr7 = 0x0 + float_save.control_word = 0xffff027f + float_save.status_word = 0xffff0000 + float_save.tag_word = 0xffffffff + float_save.error_offset = 0x0 + float_save.error_selector = 0x870000 + float_save.data_offset = 0x0 + float_save.data_selector = 0xffff0000 + float_save.register_area[80] = 0x84fb120000001400320778071400000014000000f4fe1200a0fd120018eeb0fd12003815917c961534ff120034ff12000000e7712a0f2a0000005400ccfb120068514000584d540000002a000000f4fe + float_save.cr0_npx_state = 0x0 + gs = 0x0 + fs = 0x3b + es = 0x23 + ds = 0x23 + edi = 0x145b00 + esi = 0x145aa8 + ebx = 0x145ad0 + edx = 0x7c90eb94 + ecx = 0x7 + eax = 0xa80000 + ebp = 0x97f6fc + eip = 0x7c90eb94 + cs = 0x1b + eflags = 0x246 + esp = 0x97f6ec + ss = 0x23 + extended_registers[512] = 0x7f0200000000870000000000000000000000000000000000801f0000ccfb120084fb1200000014003207917c050000007807140000001400000000005cfb1200f4fe1200a0fd120018ee907c2d020000b0fd12003815917c9615917ceb06917c34ff120034ff12000000000060000000e7712a0f2a0000005400000000000000ccfb120068514000584d870034fc1200540000002a000000f4fe1200f8fe12002c2f4000584d87005e00000034fc12005400000000000000b0fe1200f4fe1200c0fe12005f21400034fc12002a0000003b762a0f91214000303132330000870038393a3b3c3d3e3f4041424300000000070000003bd11e2340061400b858101e5e03e0652e005c00320033003100650064003100780114002d0066003300380034002d0000000000390034002d0062003800350038002d0031003000984e1400350065003000330065003000360035002e0064006d0070000000907c08000000ffffffff8832917cbeb4807c780114001d00f40b784e14000401000044fd120050fd1200c01e240078011400bdb9807ca04e14007c80c2770000000008fd120078011400ecfc1200f0fc1200e6b9807cffffffff7c80c27708fd12001c00000024fd1200e92a867c7c80c277b45a887c8037887c2d0200000080c2770000c17780000000005003000010000020000000780114005cff12001648847c091b917c + +Stack +0x8000108020fa97009fd7907c0000000048f7970005000f0040061400000000004cf7970037b9807c00000000000000003103917c780114000000000061dc907cf1b8807c00000000ffffffff70f79700000000000000000054f797003082140001000000000000000200000000000000000000007cf7970020b9807c0e00000004000000006000000000a80078011400000000000882140092d5907c8b9b807c9c070000d0f89700780114009c07000038821400807f140020dea85910fa9700780114009807000088fb9700e07f14009c0700000000000078011400000000000882140000000000000000000000000078011400ba0300000000000000000000000000000000000000000000000000007801140000000000000000000000000000000000c0030000000000000000000000000000088214005c0057000600000078011400000000005c00730079007300740065006d0033000082140068011400000000000000000000821400d47f1400807f140070f8970061eea859e000a8000000a8001c4e000084f89700bdeea859e000a8000000a8001c4e0000a4f897005fefa8590000a8000000000006000000c4f89700e000a80060fe9700c8f897005abfa8590000a80000000000060000001c000000d47f1400807f1400380000006ce9907c88b9807cffffffff0000a80000000000807f140030fa97007fc3a859a0c4a859b0fb970060fe9700684f1400504500004c010400ca9610410000000000000000e0000e210b01070a00400000003a000000000000f1100000001000000000bf760000000000100000000200000500010005000100040000000000000000b00000000400009ba2000000001400285214000000000034fa97007801140034fa9700910e917c080614006d05917cc84d85005c4e8500684f140000000000b04800002852140078011400e00300003052140000000000000000000000000078011400c403000030821400380000000000000000000000000000000000000000000000000000003882140048050000780200003800000000100000ec000000b8470000400000000000000000000000000000000000140000000000807f140000000000000000000000000000000101a900000060fe9700dcff9700dcff97000050fd7f78fa970054fa9700ad9d917c8cfa9700c2066f7f0e000000000000001c01000078fa9700c84d850068fa970085ae807c78fc970024fc970083dba85978fc97008cfa9700800000008edba85914010000050000000100000096020000b8fc97003815917c9615917ceb06917c60fe970060fe9700c4fd9700d8fa9700000014003207917c21000000b80c14000000140030521400b0fa9700fffffffff4fc970018ee907c3807917cffffffff3207917cab06917ceb06917ccc4f140060fe9700684f1400e0004000e4fa9700a863917c74fb970018ee907c3808917cffffffff3308917c5b2c817c872c817c00000000f4fb9700000000000000000054fd970018ee907c4006140064fd97003815917c00e0fd7feb06917c684f140038821400780114000050fd7facfb970000000000000004000000000090fe97000000000018fb970050531400508b1400a89a837cffe9907cf60d817ca807000000000000ffe9907cf60d817c08000000000000000000000000000000585314003cfc97003882140000000000160e817cc4fd970060fe970058531400208f1400588b1400460f917c50531400208f1400780114003082140000000000b8fc970078011400b8fc9700910e917c080614006d05917c3882140060fe97000000000000000000960200003082140078011400ffe9907c38821400a807000000000000780114005853140058fc9700505314001000000000000000160e817c784e8500c4fd9700388214000000000024010000f00c00001000000044fc970000000000c7e2907ce721807cffffffffe8f69700388214001809000098fc9700acfc9700d2e2a859ffffffffe8f697003882140018090000c4fc97003882140060fe9700c4fd9700ccfc97004ee3a859ffffffffe8f69700000000003882140018090000e0fc9700f4fc970093b2a859ffffffffe8f69700000000003882140018090000c4fd970060fe9700a85a140078fd9700a5b3a85960fe9700c4fd9700684f1400e8f697000000000018090000000000000200000080fd9700c4fd970060fe970000000000f40b000000000000000000000000000000f0fd7f000000001cf3120000000000e40c000039160000cc020000940d00000000000000000000000000000000000002000000ac4f14006010000098fd97005eb7a8593916000000000000684f1400784e85000000000084ff9700d4fe97007bb9a85960fe9700c4fd9700684f14003849140084ff9700010000000000000008ff9700f40b0000090000000000000020000000200000006c0000008c000000380000001e000000c4000000dc000000a80000008401000064000000b801000030000000e801000080050000e8010000680700000000000068070000680700000000000005150000340000002915000039150000fc1600001d23000068070000600300008a070000c80a0000310a00002c130000f91400000c000000352c000000000000ffffffff5c0f0000c84d8500784e8500884e85000000000000000000000000004c010000fc39a6590000000002000000050000000100000000008500280a000001000001cc0200009c0000000b00000050000000040000000010000000000000000000000001000000000000000000000000000034ff970078baa859384914005c0f0000c84d850001000000884e8500684f140008ff970064ff970000000000a8070000b0fe1200f40b00009cfb120000000000b8fb12000000000000000000ae20140000000000884e8500784e8500c84d8500a8fa120011204000ffffffff5c0f0000a80700000000000078ff970064ff970000000000adbf807c2025807cecff97000100000084ff970003000000c0110000f40b0000f40b0000a8fa120000000000010067470c0000006cff9700bc070000ffffffff000000006c1a4000f40b000000fa12000000000000004000a09d4000b0fe120083b6807cb0fe120000004000a09d4000b0fe120000e0fd7f00069c86c0ff9700d8863f86ffffffffa89a837c90b6807c000000000000000000000000301a4000b0fe120000000000 + +MinidumpModuleList + module_count = 13 + +module[0] +MDRawModule + base_of_image = 0x400000 + size_of_image = 0x2d000 + checksum = 0x0 + time_date_stamp = 0x45d35f6c + module_name_rva = 0x78a + version_info.signature = 0x0 + version_info.struct_version = 0x0 + version_info.file_version = 0x0:0x0 + version_info.product_version = 0x0:0x0 + version_info.file_flags_mask = 0x0 + version_info.file_flags = 0x0 + version_info.file_os = 0x0 + version_info.file_type = 0x0 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 40 + cv_record.rva = 0x132c + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "c:\test_app.exe" + (code_identifier) = "45D35F6C2d000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 5a9832e5-2872-41c1-838e-d98914e9b7ff + (cv_record).age = 1 + (cv_record).pdb_file_name = "c:\test_app.pdb" + (misc_record) = (null) + (debug_file) = "c:\test_app.pdb" + (debug_identifier) = "5A9832E5287241C1838ED98914E9B7FF1" + (version) = "" + +module[1] +MDRawModule + base_of_image = 0x7c900000 + size_of_image = 0xb0000 + checksum = 0xaf2f7 + time_date_stamp = 0x411096b4 + module_name_rva = 0x7ae + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 34 + cv_record.rva = 0x1354 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\ntdll.dll" + (code_identifier) = "411096B4b0000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 36515fb5-d043-45e4-91f6-72fa2e2878c0 + (cv_record).age = 2 + (cv_record).pdb_file_name = "ntdll.pdb" + (misc_record) = (null) + (debug_file) = "ntdll.pdb" + (debug_identifier) = "36515FB5D04345E491F672FA2E2878C02" + (version) = "5.1.2600.2180" + +module[2] +MDRawModule + base_of_image = 0x7c800000 + size_of_image = 0xf4000 + checksum = 0xf724d + time_date_stamp = 0x44ab9a84 + module_name_rva = 0x7ee + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280b81 + version_info.product_version = 0x50001:0xa280b81 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 37 + cv_record.rva = 0x1376 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\kernel32.dll" + (code_identifier) = "44AB9A84f4000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = bce8785c-57b4-4245-a669-896b6a19b954 + (cv_record).age = 2 + (cv_record).pdb_file_name = "kernel32.pdb" + (misc_record) = (null) + (debug_file) = "kernel32.pdb" + (debug_identifier) = "BCE8785C57B44245A669896B6A19B9542" + (version) = "5.1.2600.2945" + +module[3] +MDRawModule + base_of_image = 0x774e0000 + size_of_image = 0x13d000 + checksum = 0x13dc6b + time_date_stamp = 0x42e5be93 + module_name_rva = 0x834 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280aa6 + version_info.product_version = 0x50001:0xa280aa6 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 34 + cv_record.rva = 0x139b + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\ole32.dll" + (code_identifier) = "42E5BE9313d000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 683b65b2-46f4-4187-96d2-ee6d4c55eb11 + (cv_record).age = 2 + (cv_record).pdb_file_name = "ole32.pdb" + (misc_record) = (null) + (debug_file) = "ole32.pdb" + (debug_identifier) = "683B65B246F4418796D2EE6D4C55EB112" + (version) = "5.1.2600.2726" + +module[4] +MDRawModule + base_of_image = 0x77dd0000 + size_of_image = 0x9b000 + checksum = 0xa0de4 + time_date_stamp = 0x411096a7 + module_name_rva = 0x874 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 37 + cv_record.rva = 0x13bd + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\advapi32.dll" + (code_identifier) = "411096A79b000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 455d6c5f-184d-45bb-b5c5-f30f82975114 + (cv_record).age = 2 + (cv_record).pdb_file_name = "advapi32.pdb" + (misc_record) = (null) + (debug_file) = "advapi32.pdb" + (debug_identifier) = "455D6C5F184D45BBB5C5F30F829751142" + (version) = "5.1.2600.2180" + +module[5] +MDRawModule + base_of_image = 0x77e70000 + size_of_image = 0x91000 + checksum = 0x9c482 + time_date_stamp = 0x411096ae + module_name_rva = 0x8ba + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 35 + cv_record.rva = 0x13e2 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\rpcrt4.dll" + (code_identifier) = "411096AE91000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = bea45a72-1da1-41da-a3ba-86b3a2031153 + (cv_record).age = 2 + (cv_record).pdb_file_name = "rpcrt4.pdb" + (misc_record) = (null) + (debug_file) = "rpcrt4.pdb" + (debug_identifier) = "BEA45A721DA141DAA3BA86B3A20311532" + (version) = "5.1.2600.2180" + +module[6] +MDRawModule + base_of_image = 0x77f10000 + size_of_image = 0x47000 + checksum = 0x4d0d0 + time_date_stamp = 0x43b34feb + module_name_rva = 0x8fc + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280b02 + version_info.product_version = 0x50001:0xa280b02 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 34 + cv_record.rva = 0x1405 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\gdi32.dll" + (code_identifier) = "43B34FEB47000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = c0ea66be-00a6-4bd7-aef7-9e443a91869c + (cv_record).age = 2 + (cv_record).pdb_file_name = "gdi32.pdb" + (misc_record) = (null) + (debug_file) = "gdi32.pdb" + (debug_identifier) = "C0EA66BE00A64BD7AEF79E443A91869C2" + (version) = "5.1.2600.2818" + +module[7] +MDRawModule + base_of_image = 0x77d40000 + size_of_image = 0x90000 + checksum = 0x9505c + time_date_stamp = 0x42260159 + module_name_rva = 0x93c + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280a3e + version_info.product_version = 0x50001:0xa280a3e + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 35 + cv_record.rva = 0x1427 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\user32.dll" + (code_identifier) = "4226015990000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = ee2b714d-83a3-4c9d-8802-7621272f8326 + (cv_record).age = 2 + (cv_record).pdb_file_name = "user32.pdb" + (misc_record) = (null) + (debug_file) = "user32.pdb" + (debug_identifier) = "EE2B714D83A34C9D88027621272F83262" + (version) = "5.1.2600.2622" + +module[8] +MDRawModule + base_of_image = 0x77c10000 + size_of_image = 0x58000 + checksum = 0x57cd3 + time_date_stamp = 0x41109752 + module_name_rva = 0x97e + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x70000:0xa280884 + version_info.product_version = 0x60001:0x21be0884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x1 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 35 + cv_record.rva = 0x144a + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\msvcrt.dll" + (code_identifier) = "4110975258000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = a678f3c3-0ded-426b-8390-32b996987e38 + (cv_record).age = 1 + (cv_record).pdb_file_name = "msvcrt.pdb" + (misc_record) = (null) + (debug_file) = "msvcrt.pdb" + (debug_identifier) = "A678F3C30DED426B839032B996987E381" + (version) = "7.0.2600.2180" + +module[9] +MDRawModule + base_of_image = 0x76390000 + size_of_image = 0x1d000 + checksum = 0x2a024 + time_date_stamp = 0x411096ae + module_name_rva = 0x9c0 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 34 + cv_record.rva = 0x146d + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\imm32.dll" + (code_identifier) = "411096AE1d000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 2c17a49c-251b-4c8e-b9e2-ad13d7d9ea16 + (cv_record).age = 2 + (cv_record).pdb_file_name = "imm32.pdb" + (misc_record) = (null) + (debug_file) = "imm32.pdb" + (debug_identifier) = "2C17A49C251B4C8EB9E2AD13D7D9EA162" + (version) = "5.1.2600.2180" + +module[10] +MDRawModule + base_of_image = 0x59a60000 + size_of_image = 0xa1000 + checksum = 0xa8824 + time_date_stamp = 0x4110969a + module_name_rva = 0xa00 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 36 + cv_record.rva = 0x148f + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\dbghelp.dll" + (code_identifier) = "4110969Aa1000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 39559573-e21b-46f2-8e28-6923be9e6a76 + (cv_record).age = 1 + (cv_record).pdb_file_name = "dbghelp.pdb" + (misc_record) = (null) + (debug_file) = "dbghelp.pdb" + (debug_identifier) = "39559573E21B46F28E286923BE9E6A761" + (version) = "5.1.2600.2180" + +module[11] +MDRawModule + base_of_image = 0x77c00000 + size_of_image = 0x8000 + checksum = 0x11d78 + time_date_stamp = 0x411096b7 + module_name_rva = 0xa44 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 36 + cv_record.rva = 0x14b3 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\version.dll" + (code_identifier) = "411096B78000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 180a90c4-0384-463e-82dd-c45b2c8ab76e + (cv_record).age = 2 + (cv_record).pdb_file_name = "version.pdb" + (misc_record) = (null) + (debug_file) = "version.pdb" + (debug_identifier) = "180A90C40384463E82DDC45B2C8AB76E2" + (version) = "5.1.2600.2180" + +module[12] +MDRawModule + base_of_image = 0x76bf0000 + size_of_image = 0xb000 + checksum = 0xa29b + time_date_stamp = 0x411096ca + module_name_rva = 0xa88 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 34 + cv_record.rva = 0x14d7 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\psapi.dll" + (code_identifier) = "411096CAb000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = a5c3a1f9-689f-43d8-ad22-8a0929388970 + (cv_record).age = 2 + (cv_record).pdb_file_name = "psapi.pdb" + (misc_record) = (null) + (debug_file) = "psapi.pdb" + (debug_identifier) = "A5C3A1F9689F43D8AD228A09293889702" + (version) = "5.1.2600.2180" + +MinidumpMemoryList + region_count = 3 + +region[0] +MDMemoryDescriptor + start_of_memory_range = 0x7c90eb14 + memory.data_size = 0x100 + memory.rva = 0x1539 +Memory +0xff83c4ec890424c744240401000000895c2408c74424100000000054e877000000c208009090909090558bec83ec508944240c64a1180000008b80a4010000890424c744240400000000c744240800000000c74424100000000054e8380000008b04248be55dc3908da424000000008d490090909090908bd40f349090909090c38da424000000008d64240090909090908d542408cd2ec3558bec9c81ecd00200008985dcfdffff898dd8fdffff8b45088b4d0489480c8d852cfdffff8988b80000008998a40000008990a800000089b0a000000089b89c0000008d4d0c8988c40000008b4d008988b40000008b4dfc8988c00000008c88bc0000008c989800 + +region[1] +MDMemoryDescriptor + start_of_memory_range = 0x12f31c + memory.data_size = 0xce4 + memory.rva = 0x1639 +Memory +0x00000000c0e9907ccb25807cb8070000000000000000000034ff1200b0fe12008037887c140000000100000000000000000000001000000027e0907c2e39917c0050fd7f00f0fd7f000000000400000034f312006947c788d4f31200a89a837cf825807c0000000098f312003225807cb8070000ffffffff00000000e4f31200ff1d4000b8070000ffffffffa8fa12008037887c0e1c4000a8fa120000000000ff792a0f64f91200b01b400000004000b0fe12000040020070fa1200084042000000000080fa120080fa12004e30867ca8fa12000000000000000000000000000018000002100000e3ef907c0000000079d900000000000048f41200000014003207917c0500000078071400000014000000000020f412003207917ca05f140018ee907cfa00000074f61200000000009615917ceb06917cf00298000100000000000000384f14009615917ceb06917c7801140008000000404f14000000a659985f1400080000000000000018ee907c90fea700400698003815917c184f1400eb06917c00000000800000000000a65988f69f0090f51200a569917cf8f41200d95c878880f5120043ef907c480485000500000090f5120088fea700a8212400000000000000000080f512002469917cf8fbfd7fa821240008000000f500000000000000384d850078019800a8fa120004000000a05f140096d4917c00000000b0d4917c0000000008069800184f140000000000104f140000000000184f140000004000000000010040020063003a005c0074006500730074005f006100700070002e006500780065000000000000002f00000028000000184f1400780185007801140028000000000000000000140084f3120010000000d8f5120018ee907cf006917cffffffffeb06917ce619917c88e6a7003003000001030000ff1b917c0000980080e6a70080069800400698000000980080e6a70000000000000000000000000080e6a7000818000088e6a700d759927c78019800081800000210000000009800f8f31200280a0000dcf6120018ee907cf006917cffffffffeb06917c0859927c00009800080000005859927c00000000000001000000a659000000005a6202000010000068fe030001000000dffe03000000010000000100fffffe7f0100000001c0c27700008500000000002dc0c27700000000684aaf590000a659241a917c80c0977c0000000000000000cd5c927c0050fd7f0000a65900000100080000004550fd7f0000000000000000000000000050fd7fcd5c927c05000000d4f61200f45c927c80e4977c05000000010000000050fd7f18f712007009917cc0e4977c172e817cff2d817c000000000000a6590000a6590210000000f0fd7f05000000e8f612000806980064f81200a89a837c002e817cffffffffff2d817cc8242400dd8ea75901000000000000004cf712003608a9590000a65901000000000000000100000060f71200e407a9596cf7120000004000000000010040020063003a005c0074006500730074005f006100700070002e0065007800650000006d05917c905f140000000000440d020000000000604f14000c0000007801140000000000a04e1400d84d8700400687004509917c0800000000000000000000004000000078011400a8038700404f14000510907c000000000000000078011400980387000800000008000000c0e4977cd04d8700f835887c7801140010000000a0e7ae591600000030fd1200d39b917c44000000620000000000a65950e9ae59d8eaae59a80387000100000014040000000000000100000002000000f800a659c003870001000000780114009508917c0000a659091b917c020000000900000040000000a2fd12009cfd1200404f1400a2fd1200d04d8700640187000000000000000000d04d870010000000d84d8700384f1400a803870010000000c00300000000870074fb1200404f14006cfe120018ee907cf006917cffffffffeb06917ca09d400000008700000000000400000000000000ffffff3fc04d8700ccfd12009c4d400004000000fa19917cb84d870064018700c04d8700063440000400000018000000c04d870079d90000c0038700fa31400000000000c04d8700c04d87000000000001000000b0fe120082294000c04d87000000000000000000c04d870048fe12008cfe120000000000e224400040fe12008cfe1200c04d8700d84d8700b0fe12008600817c54fa1200d8f9120000000000160018005479420079d90000000000000757917c00000200a4f91200a4f91200a4f91200020000000200000000000000c4f912000000000079d9000014fb12004cfa120014fb1200005a917c00fa1200a0fb120001000000655a917ca405817c74c1977ce705817c00000000f4fd120098fb120000000000a0fb12000000000090fb12000000800070fa120000000000000000000000000016001800547942000000000001000000000000000000000000000000000000003308917ca89a837c0000807c0000807ce800807c2cfa12001fe2907c11fa877cffffffffe06f817c000000006cfa12001c0000000f000000e06f817c8fc60000f0f312000060817cc8fa1200a89a837c7039867cfffffffff0ff1200da36847ca8fa1200099b837cb0fa120000000000b0fa12000000000000000000000000009cfb1200b8fb1200d4fa1200bf37907c9cfb1200e0ff1200b8fb120070fb1200b0ff1200d837907ce0ff120084fb12008b37907c9cfb1200e0ff1200b8fb120070fb1200a89a837c010000009cfb1200e0ff12006078937c9cfb1200e0ff1200b8fb120070fb1200a89a837c280a00009cfb12000200000018ee907c9032917cffffffff8832917c3364917c68fb1200000087003207917c02000000dc31917c1232917c8132917c8832917c1e000000c01e2400080200003807917c54fb12003207917cc4fb120018ee907c9032917c0000130000d01200beb4800088fe1200faea907c00000000b8fb12009cfb1200b8fb1200050000c000000000000000009e4240000200000001000000450000003f0001000000000000000000000000000000000000000000000000007f02ffff0000ffffffffffff0000000000002200000000000000ffff0000000018b72200000118b7220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b0000002300000023000000280a000002000000c1ab807c58bc420094fe12004500000088fe12009e4240001b0000004602010084fe1200230000007f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b622004500000070ff120000424000b8278700dc31917c00000000004c870000000020040000000000000007000000000000004042400000000000000000002e000000000000000cff12007b434100010000000700000084434100004d87002e39917cffffffff24000000240000002700000000000000584d870004000000b1944000244c87002a0000002f000000c0fe1200004d8700584d87000000a659b0b9a859015d400015aa400000000000b4070000784e14000000000001000000f40b00000000000000000000bc070000b8070000f40b0000a8fa120000000000009c4000599c400094b240004f752a0fc0ff1200ec534000010000003039870050398700ff752a0f00002400a02024000050fd7f050000c00100000005000000000000000000240084ff1200acfa1200e0ff1200d06f4000a70b7a0f00000000f0ff1200d76f817c00002400a02024000050fd7f050000c0c8ff1200a8fa1200ffffffffa89a837ce06f817c0000000000000000000000004354400000000000 + +region[2] +MDMemoryDescriptor + start_of_memory_range = 0x97f6e8 + memory.data_size = 0x918 + memory.rva = 0x231d +Memory +0x8000108020fa97009fd7907c0000000048f7970005000f0040061400000000004cf7970037b9807c00000000000000003103917c780114000000000061dc907cf1b8807c00000000ffffffff70f79700000000000000000054f797003082140001000000000000000200000000000000000000007cf7970020b9807c0e00000004000000006000000000a80078011400000000000882140092d5907c8b9b807c9c070000d0f89700780114009c07000038821400807f140020dea85910fa9700780114009807000088fb9700e07f14009c0700000000000078011400000000000882140000000000000000000000000078011400ba0300000000000000000000000000000000000000000000000000007801140000000000000000000000000000000000c0030000000000000000000000000000088214005c0057000600000078011400000000005c00730079007300740065006d0033000082140068011400000000000000000000821400d47f1400807f140070f8970061eea859e000a8000000a8001c4e000084f89700bdeea859e000a8000000a8001c4e0000a4f897005fefa8590000a8000000000006000000c4f89700e000a80060fe9700c8f897005abfa8590000a80000000000060000001c000000d47f1400807f1400380000006ce9907c88b9807cffffffff0000a80000000000807f140030fa97007fc3a859a0c4a859b0fb970060fe9700684f1400504500004c010400ca9610410000000000000000e0000e210b01070a00400000003a000000000000f1100000001000000000bf760000000000100000000200000500010005000100040000000000000000b00000000400009ba2000000001400285214000000000034fa97007801140034fa9700910e917c080614006d05917cc84d85005c4e8500684f140000000000b04800002852140078011400e00300003052140000000000000000000000000078011400c403000030821400380000000000000000000000000000000000000000000000000000003882140048050000780200003800000000100000ec000000b8470000400000000000000000000000000000000000140000000000807f140000000000000000000000000000000101a900000060fe9700dcff9700dcff97000050fd7f78fa970054fa9700ad9d917c8cfa9700c2066f7f0e000000000000001c01000078fa9700c84d850068fa970085ae807c78fc970024fc970083dba85978fc97008cfa9700800000008edba85914010000050000000100000096020000b8fc97003815917c9615917ceb06917c60fe970060fe9700c4fd9700d8fa9700000014003207917c21000000b80c14000000140030521400b0fa9700fffffffff4fc970018ee907c3807917cffffffff3207917cab06917ceb06917ccc4f140060fe9700684f1400e0004000e4fa9700a863917c74fb970018ee907c3808917cffffffff3308917c5b2c817c872c817c00000000f4fb9700000000000000000054fd970018ee907c4006140064fd97003815917c00e0fd7feb06917c684f140038821400780114000050fd7facfb970000000000000004000000000090fe97000000000018fb970050531400508b1400a89a837cffe9907cf60d817ca807000000000000ffe9907cf60d817c08000000000000000000000000000000585314003cfc97003882140000000000160e817cc4fd970060fe970058531400208f1400588b1400460f917c50531400208f1400780114003082140000000000b8fc970078011400b8fc9700910e917c080614006d05917c3882140060fe97000000000000000000960200003082140078011400ffe9907c38821400a807000000000000780114005853140058fc9700505314001000000000000000160e817c784e8500c4fd9700388214000000000024010000f00c00001000000044fc970000000000c7e2907ce721807cffffffffe8f69700388214001809000098fc9700acfc9700d2e2a859ffffffffe8f697003882140018090000c4fc97003882140060fe9700c4fd9700ccfc97004ee3a859ffffffffe8f69700000000003882140018090000e0fc9700f4fc970093b2a859ffffffffe8f69700000000003882140018090000c4fd970060fe9700a85a140078fd9700a5b3a85960fe9700c4fd9700684f1400e8f697000000000018090000000000000200000080fd9700c4fd970060fe970000000000f40b000000000000000000000000000000f0fd7f000000001cf3120000000000e40c000039160000cc020000940d00000000000000000000000000000000000002000000ac4f14006010000098fd97005eb7a8593916000000000000684f1400784e85000000000084ff9700d4fe97007bb9a85960fe9700c4fd9700684f14003849140084ff9700010000000000000008ff9700f40b0000090000000000000020000000200000006c0000008c000000380000001e000000c4000000dc000000a80000008401000064000000b801000030000000e801000080050000e8010000680700000000000068070000680700000000000005150000340000002915000039150000fc1600001d23000068070000600300008a070000c80a0000310a00002c130000f91400000c000000352c000000000000ffffffff5c0f0000c84d8500784e8500884e85000000000000000000000000004c010000fc39a6590000000002000000050000000100000000008500280a000001000001cc0200009c0000000b00000050000000040000000010000000000000000000000001000000000000000000000000000034ff970078baa859384914005c0f0000c84d850001000000884e8500684f140008ff970064ff970000000000a8070000b0fe1200f40b00009cfb120000000000b8fb12000000000000000000ae20140000000000884e8500784e8500c84d8500a8fa120011204000ffffffff5c0f0000a80700000000000078ff970064ff970000000000adbf807c2025807cecff97000100000084ff970003000000c0110000f40b0000f40b0000a8fa120000000000010067470c0000006cff9700bc070000ffffffff000000006c1a4000f40b000000fa12000000000000004000a09d4000b0fe120083b6807cb0fe120000004000a09d4000b0fe120000e0fd7f00069c86c0ff9700d8863f86ffffffffa89a837c90b6807c000000000000000000000000301a4000b0fe120000000000 + +MDException + thread_id = 0xbf4 + exception_record.exception_code = 0xc0000005 + exception_record.exception_flags = 0x0 + exception_record.exception_record = 0x0 + exception_record.exception_address = 0x40429e + exception_record.number_parameters = 2 + exception_record.exception_information[ 0] = 0x1 + exception_record.exception_information[ 1] = 0x45 + thread_context.data_size = 716 + thread_context.rva = 0xac8 + +MDRawContextX86 + context_flags = 0x1003f + dr0 = 0x0 + dr1 = 0x0 + dr2 = 0x0 + dr3 = 0x0 + dr6 = 0x0 + dr7 = 0x0 + float_save.control_word = 0xffff027f + float_save.status_word = 0xffff0000 + float_save.tag_word = 0xffffffff + float_save.error_offset = 0x0 + float_save.error_selector = 0x220000 + float_save.data_offset = 0x0 + float_save.data_selector = 0xffff0000 + float_save.register_area[80] = 0x0000000018b72200000118b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + float_save.cr0_npx_state = 0x0 + gs = 0x0 + fs = 0x3b + es = 0x23 + ds = 0x23 + edi = 0xa28 + esi = 0x2 + ebx = 0x7c80abc1 + edx = 0x42bc58 + ecx = 0x12fe94 + eax = 0x45 + ebp = 0x12fe88 + eip = 0x40429e + cs = 0x1b + eflags = 0x10246 + esp = 0x12fe84 + ss = 0x23 + extended_registers[512] = 0x7f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b62200 + +MDRawSystemInfo + processor_architecture = 0 + processor_level = 6 + processor_revision = 0xd08 + number_of_processors = 1 + product_type = 1 + major_version = 5 + minor_version = 1 + build_number = 2600 + platform_id = 2 + csd_version_rva = 0x768 + suite_mask = 0x100 + cpu.x86_cpu_info.vendor_id[0] = 0x756e6547 + cpu.x86_cpu_info.vendor_id[1] = 0x49656e69 + cpu.x86_cpu_info.vendor_id[2] = 0x6c65746e + cpu.x86_cpu_info.version_information = 0x6d8 + cpu.x86_cpu_info.feature_information = 0xafe9fbff + cpu.x86_cpu_info.amd_extended_cpu_features = 0xffffffff + (csd_version) = "Service Pack 2" + (cpu_vendor) = "GenuineIntel" + +MDRawMiscInfo + size_of_info = 24 + flags1 = 0x3 + process_id = 0xf5c + process_create_time = 0x45d35f73 + process_user_time = 0x0 + process_kernel_time = 0x0 + +MDRawBreakpadInfo + validity = 0x3 + dump_thread_id = 0x11c0 + requesting_thread_id = 0xbf4 + diff --git a/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.stackwalk.machine_readable.out b/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.stackwalk.machine_readable.out new file mode 100644 index 00000000..e1589534 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.stackwalk.machine_readable.out @@ -0,0 +1,21 @@ +OS|Windows NT|5.1.2600 Service Pack 2 +CPU|x86|GenuineIntel family 6 model 13 stepping 8|1 +Crash|EXCEPTION_ACCESS_VIOLATION|0x45|0 +Module|test_app.exe||test_app.pdb|5A9832E5287241C1838ED98914E9B7FF1|0x00400000|0x0042cfff|1 +Module|dbghelp.dll|5.1.2600.2180|dbghelp.pdb|39559573E21B46F28E286923BE9E6A761|0x59a60000|0x59b00fff|0 +Module|imm32.dll|5.1.2600.2180|imm32.pdb|2C17A49C251B4C8EB9E2AD13D7D9EA162|0x76390000|0x763acfff|0 +Module|psapi.dll|5.1.2600.2180|psapi.pdb|A5C3A1F9689F43D8AD228A09293889702|0x76bf0000|0x76bfafff|0 +Module|ole32.dll|5.1.2600.2726|ole32.pdb|683B65B246F4418796D2EE6D4C55EB112|0x774e0000|0x7761cfff|0 +Module|version.dll|5.1.2600.2180|version.pdb|180A90C40384463E82DDC45B2C8AB76E2|0x77c00000|0x77c07fff|0 +Module|msvcrt.dll|7.0.2600.2180|msvcrt.pdb|A678F3C30DED426B839032B996987E381|0x77c10000|0x77c67fff|0 +Module|user32.dll|5.1.2600.2622|user32.pdb|EE2B714D83A34C9D88027621272F83262|0x77d40000|0x77dcffff|0 +Module|advapi32.dll|5.1.2600.2180|advapi32.pdb|455D6C5F184D45BBB5C5F30F829751142|0x77dd0000|0x77e6afff|0 +Module|rpcrt4.dll|5.1.2600.2180|rpcrt4.pdb|BEA45A721DA141DAA3BA86B3A20311532|0x77e70000|0x77f00fff|0 +Module|gdi32.dll|5.1.2600.2818|gdi32.pdb|C0EA66BE00A64BD7AEF79E443A91869C2|0x77f10000|0x77f56fff|0 +Module|kernel32.dll|5.1.2600.2945|kernel32.pdb|BCE8785C57B44245A669896B6A19B9542|0x7c800000|0x7c8f3fff|0 +Module|ntdll.dll|5.1.2600.2180|ntdll.pdb|36515FB5D04345E491F672FA2E2878C02|0x7c900000|0x7c9affff|0 + +0|0|test_app.exe|`anonymous namespace'::CrashFunction|c:\test_app.cc|58|0x3 +0|1|test_app.exe|main|c:\test_app.cc|65|0x4 +0|2|test_app.exe|__tmainCRTStartup|f:\sp\vctools\crt_bld\self_x86\crt\src\crt0.c|327|0x11 +0|3|kernel32.dll|BaseProcessStart|||0x22 diff --git a/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.stackwalk.out b/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.stackwalk.out new file mode 100644 index 00000000..21b425de --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/testdata/minidump2.stackwalk.out @@ -0,0 +1,35 @@ +Operating system: Windows NT + 5.1.2600 Service Pack 2 +CPU: x86 + GenuineIntel family 6 model 13 stepping 8 + 1 CPU + +Crash reason: EXCEPTION_ACCESS_VIOLATION +Crash address: 0x45 + +Thread 0 (crashed) + 0 test_app.exe!`anonymous namespace'::CrashFunction [test_app.cc : 58 + 0x3] + eip = 0x0040429e esp = 0x0012fe84 ebp = 0x0012fe88 ebx = 0x7c80abc1 + esi = 0x00000002 edi = 0x00000a28 eax = 0x00000045 ecx = 0x0012fe94 + edx = 0x0042bc58 efl = 0x00010246 + 1 test_app.exe!main [test_app.cc : 65 + 0x4] + eip = 0x00404200 esp = 0x0012fe90 ebp = 0x0012ff70 + 2 test_app.exe!__tmainCRTStartup [crt0.c : 327 + 0x11] + eip = 0x004053ec esp = 0x0012ff78 ebp = 0x0012ffc0 + 3 kernel32.dll!BaseProcessStart + 0x22 + eip = 0x7c816fd7 esp = 0x0012ffc8 ebp = 0x0012fff0 + +Loaded modules: +0x00400000 - 0x0042cfff test_app.exe ??? (main) +0x59a60000 - 0x59b00fff dbghelp.dll 5.1.2600.2180 +0x76390000 - 0x763acfff imm32.dll 5.1.2600.2180 +0x76bf0000 - 0x76bfafff psapi.dll 5.1.2600.2180 +0x774e0000 - 0x7761cfff ole32.dll 5.1.2600.2726 +0x77c00000 - 0x77c07fff version.dll 5.1.2600.2180 +0x77c10000 - 0x77c67fff msvcrt.dll 7.0.2600.2180 +0x77d40000 - 0x77dcffff user32.dll 5.1.2600.2622 +0x77dd0000 - 0x77e6afff advapi32.dll 5.1.2600.2180 +0x77e70000 - 0x77f00fff rpcrt4.dll 5.1.2600.2180 +0x77f10000 - 0x77f56fff gdi32.dll 5.1.2600.2818 +0x7c800000 - 0x7c8f3fff kernel32.dll 5.1.2600.2945 +0x7c900000 - 0x7c9affff ntdll.dll 5.1.2600.2180 diff --git a/thirdparty/google-breakpad/r318/src/processor/testdata/module1.out b/thirdparty/google-breakpad/r318/src/processor/testdata/module1.out new file mode 100644 index 00000000..85687828 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/testdata/module1.out @@ -0,0 +1,19 @@ +MODULE windows x86 111111111111111111111111111111111 module1.pdb +FILE 1 file1_1.cc +FILE 2 file1_2.cc +FILE 3 file1_3.cc +FUNC 1000 c 0 Function1_1 +1000 4 44 1 +1004 4 45 1 +1008 4 46 1 +FUNC 1100 8 4 Function1_2 +1100 4 65 2 +1104 4 66 2 +FUNC 1200 100 8 Function1_3 +FUNC 1300 100 c Function1_4 +FUNC 2000 0 0 Test_Zero_Size_Function_Is_Ignored +2000 4 88 2 +STACK WIN 4 1000 c 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = +STACK WIN 4 1100 8 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = +STACK WIN 4 1100 100 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = +STACK WIN 4 1300 100 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = diff --git a/thirdparty/google-breakpad/r318/src/processor/testdata/module2.out b/thirdparty/google-breakpad/r318/src/processor/testdata/module2.out new file mode 100644 index 00000000..265401c1 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/testdata/module2.out @@ -0,0 +1,17 @@ +MODULE windows x86 222222222 module2.pdb +FILE 1 file2_1.cc +FILE 2 file2_2.cc +FILE 3 file2_3.cc +FUNC 2000 c 4 Function2_1 +1000 4 54 1 +1004 4 55 1 +1008 4 56 1 +PUBLIC 2160 0 Public2_1 +FUNC 2170 14 4 Function2_2 +2170 6 10 2 +2176 4 12 2 +217a 6 13 2 +2180 4 21 2 +PUBLIC 21a0 0 Public2_2 +STACK WIN 4 2000 c 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = +STACK WIN 4 2170 14 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = diff --git a/thirdparty/google-breakpad/r318/src/processor/testdata/module3_bad.out b/thirdparty/google-breakpad/r318/src/processor/testdata/module3_bad.out new file mode 100644 index 00000000..bb772486 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/testdata/module3_bad.out @@ -0,0 +1,3 @@ +MODULE windows x86 333333333333333333333333333333333 module3.pdb +FILE 1 file1.cc +FUNC 1000 diff --git a/thirdparty/google-breakpad/r318/src/processor/testdata/module4_bad.out b/thirdparty/google-breakpad/r318/src/processor/testdata/module4_bad.out new file mode 100644 index 00000000..d01fb2cc --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/testdata/module4_bad.out @@ -0,0 +1,5 @@ +MODULE windows x86 444444444444444444444444444444444 module4.pdb +FILE 1 file4_1.cc +FILE 2 file4_2.cc +1000 4 44 1 +1004 4 45 1 diff --git a/thirdparty/google-breakpad/r318/src/processor/testdata/test_app.cc b/thirdparty/google-breakpad/r318/src/processor/testdata/test_app.cc new file mode 100644 index 00000000..f230ef3f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/processor/testdata/test_app.cc @@ -0,0 +1,69 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is used to generate minidump2.dmp and minidump2.sym. +// cl /Zi test_app.cc /Fetest_app.exe /I google_breakpad/src \ +// google_breakpad/src/client/windows/releasestaticcrt/exception_handler.lib +// Then run test_app to generate a dump, and dump_syms to create the .sym file. + +#include + +#include "client/windows/handler/exception_handler.h" + +namespace { + +static bool callback(const wchar_t *dump_path, const wchar_t *id, + void *context, EXCEPTION_POINTERS *exinfo, + MDRawAssertionInfo *assertion, + bool succeeded) { + if (succeeded) { + printf("dump guid is %ws\n", id); + } else { + printf("dump failed\n"); + } + fflush(stdout); + + return succeeded; +} + +static void CrashFunction() { + int *i = reinterpret_cast(0x45); + *i = 5; // crash! +} + +} // namespace + +int main(int argc, char **argv) { + google_breakpad::ExceptionHandler eh( + L".", NULL, callback, NULL, + google_breakpad::ExceptionHandler::HANDLER_ALL); + CrashFunction(); + printf("did not crash?\n"); + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/stamp-h1 b/thirdparty/google-breakpad/r318/src/stamp-h1 new file mode 100644 index 00000000..57ea58e4 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/stamp-h1 @@ -0,0 +1 @@ +timestamp for src/config.h diff --git a/thirdparty/google-breakpad/r318/src/tools/linux/dump_syms/Makefile b/thirdparty/google-breakpad/r318/src/tools/linux/dump_syms/Makefile new file mode 100644 index 00000000..7d74abad --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/linux/dump_syms/Makefile @@ -0,0 +1,30 @@ +CXX=g++ +CC=gcc + +CXXFLAGS=-gstabs -I../../.. -DNDEBUG -Wall -D_REENTRANT + +.PHONY:all clean + +BIN=dump_syms + +all:$(BIN) + +DUMP_OBJ=dump_symbols.o guid_creator.o dump_syms.o file_id.o md5.o + +dump_syms:$(DUMP_OBJ) + $(CXX) $(CXXFLAGS) -o $@ $^ + +dump_symbols.o:../../../common/linux/dump_symbols.cc + $(CXX) $(CXXFLAGS) -c $^ + +guid_creator.o:../../../common/linux/guid_creator.cc + $(CXX) $(CXXFLAGS) -c $^ + +file_id.o:../../../common/linux/file_id.cc + $(CXX) $(CXXFLAGS) -c $^ + +md5.o:../../../common/md5.c + $(CC) $(CXXFLAGS) -c $^ + +clean: + rm -f $(BIN) $(DUMP_OBJ) diff --git a/thirdparty/google-breakpad/r318/src/tools/linux/dump_syms/dump_syms.cc b/thirdparty/google-breakpad/r318/src/tools/linux/dump_syms/dump_syms.cc new file mode 100644 index 00000000..e7eb0a2d --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/linux/dump_syms/dump_syms.cc @@ -0,0 +1,52 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include + +#include "common/linux/dump_symbols.h" + +using namespace google_breakpad; + +int main(int argc, char **argv) { + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *binary = argv[1]; + + DumpSymbols dumper; + if (!dumper.WriteSymbolFile(binary, fileno(stdout))) { + fprintf(stderr, "Failed to write symbol file.\n"); + return 1; + } + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/linux/symupload/Makefile b/thirdparty/google-breakpad/r318/src/tools/linux/symupload/Makefile new file mode 100644 index 00000000..c0c49eed --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/linux/symupload/Makefile @@ -0,0 +1,24 @@ +CXX=g++ + +CXXFLAGS=-gstabs -I../../.. -Wall -D_REENTRANT + +.PHONY:all clean + +BIN=minidump_upload sym_upload + +all:$(BIN) + +DUMP_UPLOAD_OBJ=minidump_upload.o http_upload.o +SYM_UPLOAD_OBJ=sym_upload.o http_upload.o + +minidump_upload:$(DUMP_UPLOAD_OBJ) + $(CXX) $(CXXFLAGS) -ldl -o $@ $^ + +sym_upload:$(SYM_UPLOAD_OBJ) + $(CXX) $(CXXFLAGS) -ldl -o $@ $^ + +http_upload.o:../../../common/linux/http_upload.cc + $(CXX) $(CXXFLAGS) `curl-config --cflags` -c $^ + +clean: + rm *.o $(BIN) diff --git a/thirdparty/google-breakpad/r318/src/tools/linux/symupload/minidump_upload.cc b/thirdparty/google-breakpad/r318/src/tools/linux/symupload/minidump_upload.cc new file mode 100644 index 00000000..cab6ad43 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/linux/symupload/minidump_upload.cc @@ -0,0 +1,144 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_upload.m: Upload a minidump to a HTTP server. The upload is sent as +// a multipart/form-data POST request with the following parameters: +// prod: the product name +// ver: the product version +// symbol_file: the breakpad format symbol file + +#include + +#include + +#include "common/linux/http_upload.h" + +using google_breakpad::HTTPUpload; + +struct Options { + std::string minidumpPath; + std::string uploadURLStr; + std::string product; + std::string version; + std::string proxy; + std::string proxy_user_pwd; + bool success; +}; + +//============================================================================= +static void Start(Options *options) { + std::map parameters; + // Add parameters + parameters["prod"] = options->product; + parameters["ver"] = options->version; + + // Send it + std::string response, error; + bool success = HTTPUpload::SendRequest(options->uploadURLStr, + parameters, + options->minidumpPath, + "upload_file_minidump", + options->proxy, + options->proxy_user_pwd, + &response, + &error); + + if (success) { + printf("Successfully sent the minidump file.\n"); + } else { + printf("Failed to send minidump: %s\n", error.c_str()); + printf("Response:\n"); + printf("%s\n", response.c_str()); + } + options->success = success; +} + +//============================================================================= +static void +Usage(int argc, const char *argv[]) { + fprintf(stderr, "Submit minidump information.\n"); + fprintf(stderr, "Usage: %s [options...] -p -v " + "\n", argv[0]); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " should be a minidump.\n"); + fprintf(stderr, " is the destination for the upload\n"); + + fprintf(stderr, "-p:\t Product name\n"); + fprintf(stderr, "-v:\t Product version\n"); + fprintf(stderr, "-x:\t Use HTTP proxy on given port\n"); + fprintf(stderr, "-u:\t Set proxy user and password\n"); + fprintf(stderr, "-h:\t Usage\n"); + fprintf(stderr, "-?:\t Usage\n"); +} + +//============================================================================= +static void +SetupOptions(int argc, const char *argv[], Options *options) { + extern int optind; + char ch; + + while ((ch = getopt(argc, (char * const *)argv, "p:u:v:x:h?")) != -1) { + switch (ch) { + case 'p': + options->product = optarg; + break; + case 'u': + options->proxy_user_pwd = optarg; + break; + case 'v': + options->version = optarg; + break; + case 'x': + options->proxy = optarg; + break; + + default: + Usage(argc, argv); + exit(0); + break; + } + } + + if ((argc - optind) != 2) { + fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]); + Usage(argc, argv); + exit(1); + } + + options->minidumpPath = argv[optind]; + options->uploadURLStr = argv[optind + 1]; +} + +//============================================================================= +int main (int argc, const char * argv[]) { + Options options; + SetupOptions(argc, argv, &options); + Start(&options); + return options.success ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/linux/symupload/sym_upload.cc b/thirdparty/google-breakpad/r318/src/tools/linux/symupload/sym_upload.cc new file mode 100644 index 00000000..4e4da065 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/linux/symupload/sym_upload.cc @@ -0,0 +1,216 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// symupload.cc: Upload a symbol file to a HTTP server. The upload is sent as +// a multipart/form-data POST request with the following parameters: +// code_file: the basename of the module, e.g. "app" +// debug_file: the basename of the debugging file, e.g. "app" +// debug_identifier: the debug file's identifier, usually consisting of +// the guid and age embedded in the pdb, e.g. +// "11111111BBBB3333DDDD555555555555F" +// version: the file version of the module, e.g. "1.2.3.4" +// os: the operating system that the module was built for +// cpu: the CPU that the module was built for +// symbol_file: the contents of the breakpad-format symbol file + +#include + +#include +#include +#include +#include +#include +#include + +#include "common/linux/http_upload.h" + +using google_breakpad::HTTPUpload; + +typedef struct { + std::string symbolsPath; + std::string uploadURLStr; + std::string proxy; + std::string proxy_user_pwd; + std::string version; + bool success; +} Options; + +static void TokenizeByChar(const std::string &source_string, + int c, std::vector *results) { + assert(results); + std::string::size_type cur_pos = 0, next_pos = 0; + while ((next_pos = source_string.find(c, cur_pos)) != std::string::npos) { + if (next_pos != cur_pos) + results->push_back(source_string.substr(cur_pos, next_pos - cur_pos)); + cur_pos = next_pos + 1; + } + if (cur_pos < source_string.size() && next_pos != cur_pos) + results->push_back(source_string.substr(cur_pos)); +} + +//============================================================================= +// Parse out the module line which have 5 parts. +// MODULE +static bool ModuleDataForSymbolFile(const std::string &file, + std::vector *module_parts) { + assert(module_parts); + const size_t kModulePartNumber = 5; + FILE *fp = fopen(file.c_str(), "r"); + if (fp) { + char buffer[1024]; + if (fgets(buffer, sizeof(buffer), fp)) { + std::string line(buffer); + std::string::size_type line_break_pos = line.find_first_of('\n'); + if (line_break_pos == std::string::npos) { + assert(!"The file is invalid!"); + fclose(fp); + return false; + } + line.resize(line_break_pos); + const char kDelimiter = ' '; + TokenizeByChar(line, kDelimiter, module_parts); + if (module_parts->size() != kModulePartNumber) + module_parts->clear(); + } + fclose(fp); + } + + return module_parts->size() == kModulePartNumber; +} + +//============================================================================= +static std::string CompactIdentifier(const std::string &uuid) { + std::vector components; + TokenizeByChar(uuid, '-', &components); + std::string result; + for (size_t i = 0; i < components.size(); ++i) + result += components[i]; + return result; +} + +//============================================================================= +static void Start(Options *options) { + std::map parameters; + options->success = false; + std::vector module_parts; + if (!ModuleDataForSymbolFile(options->symbolsPath, &module_parts)) { + fprintf(stderr, "Failed to parse symbol file!\n"); + return; + } + + std::string compacted_id = CompactIdentifier(module_parts[3]); + + // Add parameters + if (!options->version.empty()) + parameters["version"] = options->version; + + // MODULE + // 0 1 2 3 4 + parameters["os"] = module_parts[1]; + parameters["cpu"] = module_parts[2]; + parameters["debug_file"] = module_parts[4]; + parameters["code_file"] = module_parts[4]; + parameters["debug_identifier"] = compacted_id; + std::string response, error; + bool success = HTTPUpload::SendRequest(options->uploadURLStr, + parameters, + options->symbolsPath, + "symbol_file", + options->proxy, + options->proxy_user_pwd, + &response, + &error); + + if (success) { + printf("Successfully sent the symbol file.\n"); + } else { + printf("Failed to send symbol file: %s\n", error.c_str()); + printf("Response:\n"); + printf("%s\n", response.c_str()); + } + options->success = success; +} + +//============================================================================= +static void +Usage(int argc, const char *argv[]) { + fprintf(stderr, "Submit symbol information.\n"); + fprintf(stderr, "Usage: %s [options...] \n", argv[0]); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " should be created by using the dump_syms tool.\n"); + fprintf(stderr, " is the destination for the upload\n"); + fprintf(stderr, "-v:\t Version information (e.g., 1.2.3.4)\n"); + fprintf(stderr, "-x:\t Use HTTP proxy on given port\n"); + fprintf(stderr, "-u:\t Set proxy user and password\n"); + fprintf(stderr, "-h:\t Usage\n"); + fprintf(stderr, "-?:\t Usage\n"); +} + +//============================================================================= +static void +SetupOptions(int argc, const char *argv[], Options *options) { + extern int optind; + char ch; + + while ((ch = getopt(argc, (char * const *)argv, "u:v:x:h?")) != -1) { + switch (ch) { + case 'u': + options->proxy_user_pwd = optarg; + break; + case 'v': + options->version = optarg; + break; + case 'x': + options->proxy = optarg; + break; + + default: + Usage(argc, argv); + exit(0); + break; + } + } + + if ((argc - optind) != 2) { + fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]); + Usage(argc, argv); + exit(1); + } + + options->symbolsPath = argv[optind]; + options->uploadURLStr = argv[optind + 1]; +} + +//============================================================================= +int main (int argc, const char * argv[]) { + Options options; + SetupOptions(argc, argv, &options); + Start(&options); + return options.success ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/mac/crash_report/crash_report.mm b/thirdparty/google-breakpad/r318/src/tools/mac/crash_report/crash_report.mm new file mode 100644 index 00000000..f90ee42f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/mac/crash_report/crash_report.mm @@ -0,0 +1,362 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// crash_report.mm: Convert the contents of a minidump into a format that +// looks more like Apple's CrashReporter format + +#include + +#include +#include + +#include + +#include + +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/minidump_processor.h" +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/pathname_stripper.h" +#include "processor/scoped_ptr.h" +#include "processor/simple_symbol_supplier.h" + +#include "on_demand_symbol_supplier.h" + +using std::string; + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::CodeModules; +using google_breakpad::MinidumpProcessor; +using google_breakpad::OnDemandSymbolSupplier; +using google_breakpad::PathnameStripper; +using google_breakpad::ProcessState; +using google_breakpad::scoped_ptr; +using google_breakpad::StackFrame; +using google_breakpad::StackFramePPC; +using google_breakpad::StackFrameX86; +using google_breakpad::SystemInfo; + +typedef struct { + NSString *minidumpPath; + NSString *searchDir; + NSString *symbolSearchDir; +} Options; + +//============================================================================= +static int PrintRegister(const char *name, u_int32_t value, int sequence) { + if (sequence % 4 == 0) { + printf("\n"); + } + printf("%6s = 0x%08x ", name, value); + return ++sequence; +} + +//============================================================================= +static void PrintStack(const CallStack *stack, const string &cpu) { + int frame_count = stack->frames()->size(); + char buffer[1024]; + for (int frame_index = 0; frame_index < frame_count; ++frame_index) { + const StackFrame *frame = stack->frames()->at(frame_index); + const CodeModule *module = frame->module; + printf("%2d ", frame_index); + + if (module) { + // Module name (20 chars max) + strcpy(buffer, PathnameStripper::File(module->code_file()).c_str()); + int maxStr = 20; + buffer[maxStr] = 0; + printf("%-*s", maxStr, buffer); + + strcpy(buffer, module->version().c_str()); + buffer[maxStr] = 0; + + printf("%-*s",maxStr, buffer); + + u_int64_t instruction = frame->instruction; + + // PPC only: Adjust the instruction to match that of Crash reporter. The + // instruction listed is actually the return address. See the detailed + // comments in stackwalker_ppc.cc for more information. + if (cpu == "ppc" && frame_index) + instruction += 4; + + printf(" 0x%08llx ", instruction); + + // Function name + if (!frame->function_name.empty()) { + printf("%s", frame->function_name.c_str()); + if (!frame->source_file_name.empty()) { + string source_file = PathnameStripper::File(frame->source_file_name); + printf(" + 0x%llx (%s:%d)", + instruction - frame->source_line_base, + source_file.c_str(), frame->source_line); + } else { + printf(" + 0x%llx", instruction - frame->function_base); + } + } + } + printf("\n"); + } +} + +//============================================================================= +static void PrintRegisters(const CallStack *stack, const string &cpu) { + int sequence = 0; + const StackFrame *frame = stack->frames()->at(0); + if (cpu == "x86") { + const StackFrameX86 *frame_x86 = + reinterpret_cast(frame); + + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EIP) + sequence = PrintRegister("eip", frame_x86->context.eip, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_ESP) + sequence = PrintRegister("esp", frame_x86->context.esp, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EBP) + sequence = PrintRegister("ebp", frame_x86->context.ebp, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EBX) + sequence = PrintRegister("ebx", frame_x86->context.ebx, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_ESI) + sequence = PrintRegister("esi", frame_x86->context.esi, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EDI) + sequence = PrintRegister("edi", frame_x86->context.edi, sequence); + if (frame_x86->context_validity == StackFrameX86::CONTEXT_VALID_ALL) { + sequence = PrintRegister("eax", frame_x86->context.eax, sequence); + sequence = PrintRegister("ecx", frame_x86->context.ecx, sequence); + sequence = PrintRegister("edx", frame_x86->context.edx, sequence); + sequence = PrintRegister("efl", frame_x86->context.eflags, sequence); + } + } else if (cpu == "ppc") { + const StackFramePPC *frame_ppc = + reinterpret_cast(frame); + + if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_ALL == + StackFramePPC::CONTEXT_VALID_ALL) { + sequence = PrintRegister("srr0", frame_ppc->context.srr0, sequence); + sequence = PrintRegister("srr1", frame_ppc->context.srr1, sequence); + sequence = PrintRegister("cr", frame_ppc->context.cr, sequence); + sequence = PrintRegister("xer", frame_ppc->context.xer, sequence); + sequence = PrintRegister("lr", frame_ppc->context.lr, sequence); + sequence = PrintRegister("ctr", frame_ppc->context.ctr, sequence); + sequence = PrintRegister("mq", frame_ppc->context.mq, sequence); + sequence = PrintRegister("vrsave", frame_ppc->context.vrsave, sequence); + + sequence = 0; + char buffer[5]; + for (int i = 0; i < MD_CONTEXT_PPC_GPR_COUNT; ++i) { + sprintf(buffer, "r%d", i); + sequence = PrintRegister(buffer, frame_ppc->context.gpr[i], sequence); + } + } else { + if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_SRR0) + sequence = PrintRegister("srr0", frame_ppc->context.srr0, sequence); + if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_GPR1) + sequence = PrintRegister("r1", frame_ppc->context.gpr[1], sequence); + } + } + + printf("\n"); +} + +static void PrintModules(const CodeModules *modules) { + if (!modules) + return; + + printf("\n"); + printf("Loaded modules:\n"); + + u_int64_t main_address = 0; + const CodeModule *main_module = modules->GetMainModule(); + if (main_module) { + main_address = main_module->base_address(); + } + + unsigned int module_count = modules->module_count(); + for (unsigned int module_sequence = 0; + module_sequence < module_count; + ++module_sequence) { + const CodeModule *module = modules->GetModuleAtSequence(module_sequence); + assert(module); + u_int64_t base_address = module->base_address(); + printf("0x%08llx - 0x%08llx %s %s%s %s\n", + base_address, base_address + module->size() - 1, + PathnameStripper::File(module->code_file()).c_str(), + module->version().empty() ? "???" : module->version().c_str(), + main_module != NULL && base_address == main_address ? + " (main)" : "", + module->code_file().c_str()); + } +} + +//============================================================================= +static void Start(Options *options) { + string minidump_file([options->minidumpPath fileSystemRepresentation]); + + BasicSourceLineResolver resolver; + string search_dir = options->searchDir ? + [options->searchDir fileSystemRepresentation] : ""; + string symbol_search_dir = options->symbolSearchDir ? + [options->symbolSearchDir fileSystemRepresentation] : ""; + scoped_ptr symbol_supplier( + new OnDemandSymbolSupplier(search_dir, symbol_search_dir)); + scoped_ptr + minidump_processor(new MinidumpProcessor(symbol_supplier.get(), &resolver)); + ProcessState process_state; + if (minidump_processor->Process(minidump_file, &process_state) != + MinidumpProcessor::PROCESS_OK) { + fprintf(stderr, "MinidumpProcessor::Process failed\n"); + return; + } + + const SystemInfo *system_info = process_state.system_info(); + string cpu = system_info->cpu; + + // Convert the time to a string + u_int32_t time_date_stamp = process_state.time_date_stamp(); + struct tm timestruct; + gmtime_r(reinterpret_cast(&time_date_stamp), ×truct); + char timestr[20]; + strftime(timestr, 20, "%Y-%m-%d %H:%M:%S", ×truct); + printf("Date: %s GMT\n", timestr); + + printf("Operating system: %s (%s)\n", system_info->os.c_str(), + system_info->os_version.c_str()); + printf("Architecture: %s\n", cpu.c_str()); + + if (process_state.crashed()) { + printf("Crash reason: %s\n", process_state.crash_reason().c_str()); + printf("Crash address: 0x%llx\n", process_state.crash_address()); + } else { + printf("No crash\n"); + } + + int requesting_thread = process_state.requesting_thread(); + if (requesting_thread != -1) { + printf("\n"); + printf("Thread %d (%s)\n", + requesting_thread, + process_state.crashed() ? "crashed" : + "requested dump, did not crash"); + PrintStack(process_state.threads()->at(requesting_thread), cpu); + } + + // Print all of the threads in the dump. + int thread_count = process_state.threads()->size(); + for (int thread_index = 0; thread_index < thread_count; ++thread_index) { + if (thread_index != requesting_thread) { + // Don't print the crash thread again, it was already printed. + printf("\n"); + printf("Thread %d\n", thread_index); + PrintStack(process_state.threads()->at(thread_index), cpu); + } + } + + // Print the crashed registers + if (requesting_thread != -1) { + printf("\nThread %d:", requesting_thread); + PrintRegisters(process_state.threads()->at(requesting_thread), cpu); + } + + // Print information about modules + PrintModules(process_state.modules()); +} + +//============================================================================= +static void Usage(int argc, const char *argv[]) { + fprintf(stderr, "Convert a minidump to a crash report. Breakpad symbol " + "files will be used (or created if missing) in /tmp.\n" + "If a symbol-file-search-dir is specified, any symbol " + "files in it will be used instead of being loaded from " + "modules on disk.\n" + "If modules cannot be found at the paths stored in the " + "minidump file, they will be searched for at " + "/.\n"); + fprintf(stderr, "Usage: %s [-s module-search-dir] [-S symbol-file-search-dir] minidump-file\n", argv[0]); + fprintf(stderr, "\t-s: Specify a search directory to use for missing modules\n" + "\t-S: Specify a search directory to use for symbol files\n" + "\t-h: Usage\n" + "\t-?: Usage\n"); +} + +//============================================================================= +static void SetupOptions(int argc, const char *argv[], Options *options) { + extern int optind; + char ch; + + while ((ch = getopt(argc, (char * const *)argv, "S:s:h?")) != -1) { + switch (ch) { + case 's': + options->searchDir = [[NSFileManager defaultManager] + stringWithFileSystemRepresentation:optarg + length:strlen(optarg)]; + break; + + case 'S': + options->symbolSearchDir = [[NSFileManager defaultManager] + stringWithFileSystemRepresentation:optarg + length:strlen(optarg)]; + break; + + case 'h': + case '?': + Usage(argc, argv); + exit(1); + break; + } + } + + if ((argc - optind) != 1) { + fprintf(stderr, "%s: Missing minidump file\n", argv[0]); + Usage(argc, argv); + exit(1); + } + + options->minidumpPath = [[NSFileManager defaultManager] + stringWithFileSystemRepresentation:argv[optind] + length:strlen(argv[optind])]; +} + +//============================================================================= +int main (int argc, const char * argv[]) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + Options options; + + bzero(&options, sizeof(Options)); + SetupOptions(argc, argv, &options); + Start(&options); + [pool release]; + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/mac/crash_report/on_demand_symbol_supplier.h b/thirdparty/google-breakpad/r318/src/tools/mac/crash_report/on_demand_symbol_supplier.h new file mode 100644 index 00000000..9c0e8b78 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/mac/crash_report/on_demand_symbol_supplier.h @@ -0,0 +1,97 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// on_demand_symbol_supplier.h: Provides a Symbol Supplier that will create +// a breakpad symbol file on demand. + +#ifndef TOOLS_MAC_CRASH_REPORT_ON_DEMAND_SYMBOL_SUPPLIER_H__ +#define TOOLS_MAC_CRASH_REPORT_ON_DEMAND_SYMBOL_SUPPLIER_H__ + +#include +#include +#include "google_breakpad/processor/symbol_supplier.h" + +namespace google_breakpad { + +using std::map; +using std::string; +class MinidumpModule; + +class OnDemandSymbolSupplier : public SymbolSupplier { + public: + // |search_dir| is the directory to search for alternative symbols with + // the same name as the module in the minidump + OnDemandSymbolSupplier(const string &search_dir, + const string &symbol_search_dir); + virtual ~OnDemandSymbolSupplier() {} + + // Returns the path to the symbol file for the given module. + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file); + + // Returns the path to the symbol file for the given module. + virtual SymbolResult GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data); + protected: + // Search directory + string search_dir_; + string symbol_search_dir_; + + // When we create a symbol file for a module, save the name of the module + // and the path to that module's symbol file. + map module_file_map_; + + // Return the name for |module| This will be the value used as the key + // to the |module_file_map_|. + string GetNameForModule(const CodeModule *module); + + // Find the module on local system. If the module resides in a different + // location than the full path in the minidump, this will be the location + // used. + string GetLocalModulePath(const CodeModule *module); + + // Return the full path for |module|. + string GetModulePath(const CodeModule *module); + + // Return the path to the symbol file for |module|. If an empty string is + // returned, then |module| doesn't have a symbol file. + string GetModuleSymbolFile(const CodeModule *module); + + // Generate the breakpad symbol file for |module|. Return true if successful. + // File is generated in /tmp. + bool GenerateSymbolFile(const CodeModule *module, + const SystemInfo *system_info); +}; + +} // namespace google_breakpad + +#endif // TOOLS_MAC_CRASH_REPORT_ON_DEMAND_SYMBOL_SUPPLIER_H__ diff --git a/thirdparty/google-breakpad/r318/src/tools/mac/crash_report/on_demand_symbol_supplier.mm b/thirdparty/google-breakpad/r318/src/tools/mac/crash_report/on_demand_symbol_supplier.mm new file mode 100644 index 00000000..4123a27c --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/mac/crash_report/on_demand_symbol_supplier.mm @@ -0,0 +1,267 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include +#include + +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/pathname_stripper.h" + +#include "on_demand_symbol_supplier.h" +#include "dump_syms.h" + +using std::map; +using std::string; + +using google_breakpad::OnDemandSymbolSupplier; +using google_breakpad::PathnameStripper; +using google_breakpad::SymbolSupplier; +using google_breakpad::SystemInfo; + +OnDemandSymbolSupplier::OnDemandSymbolSupplier(const string &search_dir, + const string &symbol_search_dir) + : search_dir_(search_dir) { + NSFileManager *mgr = [NSFileManager defaultManager]; + int length = symbol_search_dir.length(); + if (length) { + // Load all sym files in symbol_search_dir into our module_file_map + // A symbol file always starts with a line like this: + // MODULE mac x86 BBF0A8F9BEADDD2048E6464001CA193F0 GoogleDesktopDaemon + // or + // MODULE mac ppc BBF0A8F9BEADDD2048E6464001CA193F0 GoogleDesktopDaemon + const char *symbolSearchStr = symbol_search_dir.c_str(); + NSString *symbolSearchPath = + [mgr stringWithFileSystemRepresentation:symbolSearchStr + length:strlen(symbolSearchStr)]; + NSDirectoryEnumerator *dirEnum = [mgr enumeratorAtPath:symbolSearchPath]; + NSString *fileName; + NSCharacterSet *hexSet = + [NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCDEF"]; + NSCharacterSet *newlineSet = + [NSCharacterSet characterSetWithCharactersInString:@"\r\n"]; + while ((fileName = [dirEnum nextObject])) { + // Check to see what type of file we have + NSDictionary *attrib = [dirEnum fileAttributes]; + NSString *fileType = [attrib objectForKey:NSFileType]; + if ([fileType isEqualToString:NSFileTypeDirectory]) { + // Skip subdirectories + [dirEnum skipDescendents]; + } else { + NSString *filePath = [symbolSearchPath stringByAppendingPathComponent:fileName]; + NSString *dataStr = [[[NSString alloc] initWithContentsOfFile:filePath] autorelease]; + if (dataStr) { + // Check file to see if it is of appropriate type, and grab module + // name. + NSScanner *scanner = [NSScanner scannerWithString:dataStr]; + BOOL goodScan = [scanner scanString:@"MODULE mac " intoString:nil]; + if (goodScan) { + goodScan = ([scanner scanString:@"x86 " intoString:nil] || + [scanner scanString:@"ppc " intoString:nil]); + if (goodScan) { + NSString *moduleID; + goodScan = [scanner scanCharactersFromSet:hexSet + intoString:&moduleID]; + if (goodScan) { + // Module IDs are always 33 chars long + goodScan = [moduleID length] == 33; + if (goodScan) { + NSString *moduleName; + goodScan = [scanner scanUpToCharactersFromSet:newlineSet + intoString:&moduleName]; + if (goodScan) { + goodScan = [moduleName length] > 0; + if (goodScan) { + const char *moduleNameStr = [moduleName UTF8String]; + const char *filePathStr = [filePath fileSystemRepresentation]; + // Map our file + module_file_map_[moduleNameStr] = filePathStr; + } + } + } + } + } + } + } + } + } + } +} + +SymbolSupplier::SymbolResult +OnDemandSymbolSupplier::GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file) { + string path(GetModuleSymbolFile(module)); + + if (path.empty()) { + if (!GenerateSymbolFile(module, system_info)) + return NOT_FOUND; + + path = GetModuleSymbolFile(module); + } + + if (path.empty()) + return NOT_FOUND; + + *symbol_file = path; + return FOUND; +} + +SymbolSupplier::SymbolResult +OnDemandSymbolSupplier::GetSymbolFile(const CodeModule *module, + const SystemInfo *system_info, + string *symbol_file, + string *symbol_data) { + SymbolSupplier::SymbolResult s = GetSymbolFile(module, + system_info, + symbol_file); + + + if (s == FOUND) { + ifstream in(symbol_file->c_str()); + getline(in, *symbol_data, std::string::traits_type::to_char_type( + std::string::traits_type::eof())); + in.close(); + } + + return s; +} + +string OnDemandSymbolSupplier::GetLocalModulePath(const CodeModule *module) { + NSFileManager *mgr = [NSFileManager defaultManager]; + const char *moduleStr = module->code_file().c_str(); + NSString *modulePath = + [mgr stringWithFileSystemRepresentation:moduleStr length:strlen(moduleStr)]; + const char *searchStr = search_dir_.c_str(); + NSString *searchDir = + [mgr stringWithFileSystemRepresentation:searchStr length:strlen(searchStr)]; + + if ([mgr fileExistsAtPath:modulePath]) + return module->code_file(); + + // If the module is not found, try to start appending the components to the + // search string and stop if a file (not dir) is found or all components + // have been appended + NSArray *pathComponents = [modulePath componentsSeparatedByString:@"/"]; + int count = [pathComponents count]; + NSMutableString *path = [NSMutableString string]; + + for (int i = 0; i < count; ++i) { + [path setString:searchDir]; + + for (int j = 0; j < i + 1; ++j) { + int idx = count - 1 - i + j; + [path appendFormat:@"/%@", [pathComponents objectAtIndex:idx]]; + } + + BOOL isDir; + if ([mgr fileExistsAtPath:path isDirectory:&isDir] && (!isDir)) { + return [path fileSystemRepresentation]; + } + } + + return ""; +} + +string OnDemandSymbolSupplier::GetModulePath(const CodeModule *module) { + return module->code_file(); +} + +string OnDemandSymbolSupplier::GetNameForModule(const CodeModule *module) { + return PathnameStripper::File(module->code_file()); +} + +string OnDemandSymbolSupplier::GetModuleSymbolFile(const CodeModule *module) { + string name(GetNameForModule(module)); + map::iterator result = module_file_map_.find(name); + + return (result == module_file_map_.end()) ? "" : (*result).second; +} + +static float GetFileModificationTime(const char *path) { + float result = 0; + struct stat file_stat; + if (stat(path, &file_stat) == 0) + result = (float)file_stat.st_mtimespec.tv_sec + + (float)file_stat.st_mtimespec.tv_nsec / 1.0e9; + + return result; +} + +bool OnDemandSymbolSupplier::GenerateSymbolFile(const CodeModule *module, + const SystemInfo *system_info) { + bool result = true; + string name = GetNameForModule(module); + string module_path = GetLocalModulePath(module); + NSString *symbol_path = [NSString stringWithFormat:@"/tmp/%s.%s.sym", + name.c_str(), system_info->cpu.c_str()]; + + if (module_path.empty()) + return false; + + // Check if there's already a symbol file cached. Ensure that the file is + // newer than the module. Otherwise, generate a new one. + BOOL generate_file = YES; + if ([[NSFileManager defaultManager] fileExistsAtPath:symbol_path]) { + // Check if the module file is newer than the saved symbols + float cache_time = + GetFileModificationTime([symbol_path fileSystemRepresentation]); + float module_time = + GetFileModificationTime(module_path.c_str()); + + if (cache_time > module_time) + generate_file = NO; + } + + if (generate_file) { + NSString *module_str = [[NSFileManager defaultManager] + stringWithFileSystemRepresentation:module_path.c_str() + length:module_path.length()]; + DumpSymbols *dump = [[DumpSymbols alloc] initWithContentsOfFile:module_str]; + const char *archStr = system_info->cpu.c_str(); + if ([dump setArchitecture:[NSString stringWithUTF8String:archStr]]) { + [dump writeSymbolFile:symbol_path]; + } else { + printf("Architecture %s not available for %s\n", archStr, name.c_str()); + result = false; + } + [dump release]; + } + + // Add the mapping + if (result) + module_file_map_[name] = [symbol_path fileSystemRepresentation]; + + return result; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/mac/dump_syms/dump_syms_tool.m b/thirdparty/google-breakpad/r318/src/tools/mac/dump_syms/dump_syms_tool.m new file mode 100644 index 00000000..3729a8d5 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/mac/dump_syms/dump_syms_tool.m @@ -0,0 +1,142 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dump_syms_tool.m: Command line tool that uses the DumpSymbols class. +// TODO(waylonis): accept stdin + +#include +#include + +#include "dump_syms.h" +#include "common/mac/macho_utilities.h" + +typedef struct { + NSString *srcPath; + NSString *arch; + NSString *uuidStr; + BOOL result; +} Options; + +//============================================================================= +static void Start(Options *options) { + DumpSymbols *dump = [[DumpSymbols alloc] + initWithContentsOfFile:options->srcPath]; + + if (!dump) { + fprintf(stderr, "%s is not a valid Mach-o file\n", + [options->srcPath fileSystemRepresentation]); + options->result = NO; + return; + } + + if (![dump setArchitecture:options->arch]) { + fprintf(stderr, "Architecture: %s not available in %s\n", + [options->arch UTF8String], + [options->srcPath fileSystemRepresentation]); + options->result = NO; + return; + } + + options->result = [dump writeSymbolFile:@"-"]; +} + +//============================================================================= +static void Usage(int argc, const char *argv[]) { + fprintf(stderr, "Output a Breakpad symbol file from a Mach-o file.\n"); + fprintf(stderr, "Usage: %s [-a ppc|i386|x86] \n", + argv[0]); + fprintf(stderr, "\t-a: Architecture type [default: native]\n"); + fprintf(stderr, "\t-h: Usage\n"); + fprintf(stderr, "\t-?: Usage\n"); +} + +//============================================================================= +static void SetupOptions(int argc, const char *argv[], Options *options) { + extern int optind; + const NXArchInfo *localArchInfo = NXGetLocalArchInfo(); + char ch; + + if (localArchInfo) { + if (localArchInfo->cputype & CPU_ARCH_ABI64) + options->arch = (localArchInfo->cputype == CPU_TYPE_POWERPC64) ? @"ppc64": + @"x86_64"; + else + options->arch = (localArchInfo->cputype == CPU_TYPE_POWERPC) ? @"ppc" : + @"x86"; + } + + while ((ch = getopt(argc, (char * const *)argv, "a:h?")) != -1) { + switch (ch) { + case 'a': + if (strcmp("ppc", optarg) == 0) + options->arch = @"ppc"; + else if (strcmp("x86", optarg) == 0 || strcmp("i386", optarg) == 0) + options->arch = @"x86"; + else if (strcmp("ppc64", optarg) == 0) + options->arch = @"ppc64"; + else if (strcmp("x86_64", optarg) == 0) + options->arch = @"x86_64"; + else { + fprintf(stderr, "%s: Invalid architecture: %s\n", argv[0], optarg); + Usage(argc, argv); + exit(1); + } + break; + case '?': + case 'h': + Usage(argc, argv); + exit(0); + break; + } + } + + if ((argc - optind) != 1) { + fprintf(stderr, "Must specify Mach-o file\n"); + Usage(argc, argv); + exit(1); + } + + options->srcPath = [[NSFileManager defaultManager] + stringWithFileSystemRepresentation:argv[optind] + length:strlen(argv[optind])]; +} + +//============================================================================= +int main (int argc, const char * argv[]) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + Options options; + + bzero(&options, sizeof(Options)); + SetupOptions(argc, argv, &options); + Start(&options); + + [pool release]; + + return !options.result; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/mac/dump_syms/dump_syms_tool.mm b/thirdparty/google-breakpad/r318/src/tools/mac/dump_syms/dump_syms_tool.mm new file mode 100644 index 00000000..827cea41 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/mac/dump_syms/dump_syms_tool.mm @@ -0,0 +1,142 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dump_syms_tool.m: Command line tool that uses the DumpSymbols class. +// TODO(waylonis): accept stdin + +#include +#include + +#include "dump_syms.h" +#include "common/mac/macho_utilities.h" + +typedef struct { + NSString *srcPath; + NSString *arch; + NSString *uuidStr; + BOOL result; +} Options; + +//============================================================================= +static void Start(Options *options) { + DumpSymbols *dump = [[DumpSymbols alloc] + initWithContentsOfFile:options->srcPath]; + + if (!dump) { + fprintf(stderr, "%s is not a valid Mach-o file\n", + [options->srcPath fileSystemRepresentation]); + options->result = NO; + return; + } + + if (![dump setArchitecture:options->arch]) { + fprintf(stderr, "Architecture: %s not available in %s\n", + [options->arch UTF8String], + [options->srcPath fileSystemRepresentation]); + options->result = NO; + return; + } + + options->result = [dump writeSymbolFile:@"-"]; +} + +//============================================================================= +static void Usage(int argc, const char *argv[]) { + fprintf(stderr, "Output a Breakpad symbol file from a Mach-o file.\n"); + fprintf(stderr, "Usage: %s [-a ppc|i386|x86] \n", + argv[0]); + fprintf(stderr, "\t-a: Architecture type [default: native]\n"); + fprintf(stderr, "\t-h: Usage\n"); + fprintf(stderr, "\t-?: Usage\n"); +} + +//============================================================================= +static void SetupOptions(int argc, const char *argv[], Options *options) { + extern int optind; + const NXArchInfo *localArchInfo = NXGetLocalArchInfo(); + signed char ch; + + if (localArchInfo) { + if (localArchInfo->cputype & CPU_ARCH_ABI64) + options->arch = (localArchInfo->cputype == CPU_TYPE_POWERPC64) ? @"ppc64": + @"x86_64"; + else + options->arch = (localArchInfo->cputype == CPU_TYPE_POWERPC) ? @"ppc" : + @"x86"; + } + + while ((ch = getopt(argc, (char * const *)argv, "a:h?")) != -1) { + switch (ch) { + case 'a': + if (strcmp("ppc", optarg) == 0) + options->arch = @"ppc"; + else if (strcmp("x86", optarg) == 0 || strcmp("i386", optarg) == 0) + options->arch = @"x86"; + else if (strcmp("ppc64", optarg) == 0) + options->arch = @"ppc64"; + else if (strcmp("x86_64", optarg) == 0) + options->arch = @"x86_64"; + else { + fprintf(stderr, "%s: Invalid architecture: %s\n", argv[0], optarg); + Usage(argc, argv); + exit(1); + } + break; + case '?': + case 'h': + Usage(argc, argv); + exit(0); + break; + } + } + + if ((argc - optind) != 1) { + fprintf(stderr, "Must specify Mach-o file\n"); + Usage(argc, argv); + exit(1); + } + + options->srcPath = [[NSFileManager defaultManager] + stringWithFileSystemRepresentation:argv[optind] + length:strlen(argv[optind])]; +} + +//============================================================================= +int main (int argc, const char * argv[]) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + Options options; + + bzero(&options, sizeof(Options)); + SetupOptions(argc, argv, &options); + Start(&options); + + [pool release]; + + return !options.result; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/mac/symupload/minidump_upload.m b/thirdparty/google-breakpad/r318/src/tools/mac/symupload/minidump_upload.m new file mode 100644 index 00000000..4f9d8c7a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/mac/symupload/minidump_upload.m @@ -0,0 +1,135 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_upload.m: Upload a minidump to a HTTP server. The upload is sent as +// a multipart/form-data POST request with the following parameters: +// prod: the product name +// ver: the product version +// symbol_file: the breakpad format symbol file + +#import + +#import + +#import "common/mac/HTTPMultipartUpload.h" + +typedef struct { + NSString *minidumpPath; + NSString *uploadURLStr; + NSString *product; + NSString *version; + BOOL success; +} Options; + +//============================================================================= +static void Start(Options *options) { + NSURL *url = [NSURL URLWithString:options->uploadURLStr]; + HTTPMultipartUpload *ul = [[HTTPMultipartUpload alloc] initWithURL:url]; + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + + // Add parameters + [parameters setObject:options->product forKey:@"prod"]; + [parameters setObject:options->version forKey:@"ver"]; + [ul setParameters:parameters]; + + // Add file + [ul addFileAtPath:options->minidumpPath name:@"upload_file_minidump"]; + + // Send it + NSError *error = nil; + NSData *data = [ul send:&error]; + NSString *result = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + + NSLog(@"Send: %@", error ? [error description] : @"No Error"); + NSLog(@"Response: %d", [[ul response] statusCode]); + NSLog(@"Result: %d bytes\n%@", [data length], result); + + [result release]; + [ul release]; + options->success = !error; +} + +//============================================================================= +static void +Usage(int argc, const char *argv[]) { + fprintf(stderr, "Submit minidump information.\n"); + fprintf(stderr, "Usage: %s -p -v " + "\n", argv[0]); + fprintf(stderr, " should be a minidump.\n"); + fprintf(stderr, " is the destination for the upload\n"); + + fprintf(stderr, "\t-h: Usage\n"); + fprintf(stderr, "\t-?: Usage\n"); +} + +//============================================================================= +static void +SetupOptions(int argc, const char *argv[], Options *options) { + extern int optind; + char ch; + + while ((ch = getopt(argc, (char * const *)argv, "p:v:h?")) != -1) { + switch (ch) { + case 'p': + options->product = [NSString stringWithCString:optarg]; + break; + case 'v': + options->version = [NSString stringWithCString:optarg]; + break; + + default: + Usage(argc, argv); + exit(0); + break; + } + } + + if ((argc - optind) != 2) { + fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]); + Usage(argc, argv); + exit(1); + } + + options->minidumpPath = [NSString stringWithCString:argv[optind]]; + options->uploadURLStr = [NSString stringWithCString:argv[optind + 1]]; +} + +//============================================================================= +int main (int argc, const char * argv[]) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + Options options; + + bzero(&options, sizeof(Options)); + SetupOptions(argc, argv, &options); + Start(&options); + + [pool release]; + return options.success ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/mac/symupload/symupload.m b/thirdparty/google-breakpad/r318/src/tools/mac/symupload/symupload.m new file mode 100644 index 00000000..d4a30150 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/mac/symupload/symupload.m @@ -0,0 +1,190 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// symupload.m: Upload a symbol file to a HTTP server. The upload is sent as +// a multipart/form-data POST request with the following parameters: +// code_file: the basename of the module, e.g. "app" +// debug_file: the basename of the debugging file, e.g. "app" +// debug_identifier: the debug file's identifier, usually consisting of +// the guid and age embedded in the pdb, e.g. +// "11111111BBBB3333DDDD555555555555F" +// os: the operating system that the module was built for +// cpu: the CPU that the module was built for (x86 or ppc) +// symbol_file: the contents of the breakpad-format symbol file + +#include + +#include +#include "HTTPMultipartUpload.h" + +typedef struct { + NSString *symbolsPath; + NSString *uploadURLStr; + BOOL success; +} Options; + +//============================================================================= +static NSArray *ModuleDataForSymbolFile(NSString *file) { + NSFileHandle *fh = [NSFileHandle fileHandleForReadingAtPath:file]; + NSData *data = [fh readDataOfLength:1024]; + NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSScanner *scanner = [NSScanner scannerWithString:str]; + NSString *line; + NSMutableArray *parts = nil; + const int MODULE_ID_INDEX = 3; + + if ([scanner scanUpToString:@"\n" intoString:&line]) { + parts = [[NSMutableArray alloc] init]; + NSScanner *moduleInfoScanner = [NSScanner scannerWithString:line]; + NSString *moduleInfo; + // Get everything BEFORE the module name. None of these properties + // can have spaces. + for (int i = 0; i <= MODULE_ID_INDEX; i++) { + [moduleInfoScanner scanUpToString:@" " intoString:&moduleInfo]; + [parts addObject:moduleInfo]; + } + + // Now get the module name. This can have a space so we scan to + // the end of the line. + [moduleInfoScanner scanUpToString:@"\n" intoString:&moduleInfo]; + [parts addObject:moduleInfo]; + } + + [str release]; + + return parts; +} + +//============================================================================= +static NSString *CompactIdentifier(NSString *uuid) { + NSMutableString *str = [NSMutableString stringWithString:uuid]; + [str replaceOccurrencesOfString:@"-" withString:@"" options:0 + range:NSMakeRange(0, [str length])]; + + return str; +} + +//============================================================================= +static void Start(Options *options) { + NSURL *url = [NSURL URLWithString:options->uploadURLStr]; + HTTPMultipartUpload *ul = [[HTTPMultipartUpload alloc] initWithURL:url]; + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + NSArray *moduleParts = ModuleDataForSymbolFile(options->symbolsPath); + NSMutableString *compactedID = + [NSMutableString stringWithString:[moduleParts objectAtIndex:3]]; + [compactedID replaceOccurrencesOfString:@"-" withString:@"" options:0 + range:NSMakeRange(0, [compactedID length])]; + + // Add parameters + [parameters setObject:compactedID forKey:@"debug_identifier"]; + + // MODULE + // 0 1 2 3 4 + [parameters setObject:[moduleParts objectAtIndex:1] forKey:@"os"]; + [parameters setObject:[moduleParts objectAtIndex:2] forKey:@"cpu"]; + [parameters setObject:[moduleParts objectAtIndex:4] forKey:@"debug_file"]; + [parameters setObject:[moduleParts objectAtIndex:4] forKey:@"code_file"]; + [ul setParameters:parameters]; + + NSArray *keys = [parameters allKeys]; + int count = [keys count]; + for (int i = 0; i < count; ++i) { + NSString *key = [keys objectAtIndex:i]; + NSString *value = [parameters objectForKey:key]; + fprintf(stdout, "'%s' = '%s'\n", [key UTF8String], + [value UTF8String]); + } + + // Add file + [ul addFileAtPath:options->symbolsPath name:@"symbol_file"]; + + // Send it + NSError *error = nil; + NSData *data = [ul send:&error]; + NSString *result = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + + fprintf(stdout, "Send: %s\n", error ? [[error description] UTF8String] : + "No Error"); + fprintf(stdout, "Response: %d\n", [[ul response] statusCode]); + fprintf(stdout, "Result: %d bytes\n%s\n", [data length], [result UTF8String]); + + [result release]; + [ul release]; + options->success = !error; +} + +//============================================================================= +static void +Usage(int argc, const char *argv[]) { + fprintf(stderr, "Submit symbol information.\n"); + fprintf(stderr, "Usage: %s \n", argv[0]); + fprintf(stderr, " should be created by using the dump_syms tool.\n"); + fprintf(stderr, " is the destination for the upload\n"); + fprintf(stderr, "\t-h: Usage\n"); + fprintf(stderr, "\t-?: Usage\n"); +} + +//============================================================================= +static void +SetupOptions(int argc, const char *argv[], Options *options) { + extern int optind; + char ch; + + while ((ch = getopt(argc, (char * const *)argv, "h?")) != -1) { + switch (ch) { + default: + Usage(argc, argv); + exit(0); + break; + } + } + + if ((argc - optind) != 2) { + fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]); + Usage(argc, argv); + exit(1); + } + + options->symbolsPath = [NSString stringWithCString:argv[optind]]; + options->uploadURLStr = [NSString stringWithCString:argv[optind + 1]]; +} + +//============================================================================= +int main (int argc, const char * argv[]) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + Options options; + + bzero(&options, sizeof(Options)); + SetupOptions(argc, argv, &options); + Start(&options); + + [pool release]; + return options.success ? 0 : 1; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/Makefile b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/Makefile new file mode 100644 index 00000000..f0a4c11a --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/Makefile @@ -0,0 +1,64 @@ +# Copyright (c) 2007, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Author: Alfred Peng + +CXX=CC +CC=cc + +CXXFLAGS=-g -xs -xdebugformat=stabs -I../../.. -I../../../common/solaris -lelf -ldemangle -D_REENTRANT + +.PHONY:all clean + +BIN=dump_syms + +all:$(BIN) + +DUMP_OBJ=dump_symbols.o guid_creator.o dump_syms.o file_id.o md5.o + +dump_syms:$(DUMP_OBJ) + $(CXX) $(CXXFLAGS) -o $@ $^ + +dump_symbols.o:../../../common/solaris/dump_symbols.cc + $(CXX) $(CXXFLAGS) -c $^ + +guid_creator.o:../../../common/solaris/guid_creator.cc + $(CXX) $(CXXFLAGS) -c $^ + +file_id.o:../../../common/solaris/file_id.cc + $(CXX) $(CXXFLAGS) -c $^ + +md5.o:../../../common/md5.c + $(CC) $(CXXFLAGS) -c $^ + +test:all + ./run_regtest.sh + +clean: + rm -f $(BIN) $(DUMP_OBJ) diff --git a/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/dump_syms.cc b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/dump_syms.cc new file mode 100644 index 00000000..54cea57e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/dump_syms.cc @@ -0,0 +1,54 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#include +#include + +#include "common/solaris/dump_symbols.h" + +using namespace google_breakpad; + +int main(int argc, char **argv) { + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *binary = argv[1]; + + DumpSymbols dumper; + if (!dumper.WriteSymbolFile(binary, fileno(stdout))) { + fprintf(stderr, "Failed to write symbol file.\n"); + return 1; + } + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/run_regtest.sh b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/run_regtest.sh new file mode 100644 index 00000000..ffb34330 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/run_regtest.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +# Copyright (c) 2007, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +./dump_syms testdata/dump_syms_regtest.o > testdata/dump_syms_regtest.new +status=$? + +if [ $status -ne 0 ] ; then + echo "FAIL, dump_syms failed" + exit $status +fi + +diff -u testdata/dump_syms_regtest.new testdata/dump_syms_regtest.sym > \ + testdata/dump_syms_regtest.diff +status=$? + +if [ $status -eq 0 ] ; then + rm testdata/dump_syms_regtest.diff testdata/dump_syms_regtest.new + echo "PASS" +else + echo "FAIL, see testdata/dump_syms_regtest.[new|diff]" +fi + +exit $status diff --git a/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc new file mode 100644 index 00000000..e617a23b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc @@ -0,0 +1,64 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ./dump_syms dump_syms_regtest.pdb > dump_syms_regtest.sym + +namespace google_breakpad { + +class C { + public: + C() : member_(1) {} + virtual ~C() {} + + void set_member(int value) { member_ = value; } + int member() const { return member_; } + + void f() { member_ = g(); } + virtual int g() { return 2; } + static char* h(const C &that) { return 0; } + + private: + int member_; +}; + +static int i() { + return 3; +} + +} // namespace google_breakpad + +int main(int argc, char **argv) { + google_breakpad::C object; + object.set_member(google_breakpad::i()); + object.f(); + int value = object.g(); + char *nothing = object.h(object); + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs new file mode 100644 index 00000000..c5f93ef7 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs @@ -0,0 +1,129 @@ + + +Debugging Stab table -- 104 entries + + 0: .stabs "dump_syms_regtest.cc",N_UNDF,0x0,0x67,0x71c + 1: .stabs "/export/home/alfred/cvs/breakpad/google-breakpad20070927/src/tools/solaris/dump_syms/testdata/",N_SO,0x0,0x0,0x0 + 2: .stabs "dump_syms_regtest.cc",N_SO,0x0,0x4,0x0 + 3: .stabs "",N_OBJ,0x0,0x0,0x0 + 4: .stabs "",N_OBJ,0x0,0x0,0x0 + 5: .stabs "V=9.0;DBG_GEN=5.0.8;dm;cd;backend;ptf;ptx;ptk;s;g;R=5.8<>;G=.XAB6Z2hOiL$Gl1b.;A=2",N_OPT,0x0,0x0,0x46fcb88e + 6: .stabs "dump_syms_regtest.cc",N_SOL,0x0,0x0,0x0 + 7: .stabs "char:t(0,1)=bsc1;0;8",N_ISYM,0x0,0x0,0x0 + 8: .stabs "short:t(0,2)=bs2;0;16",N_ISYM,0x0,0x0,0x0 + 9: .stabs "int:t(0,3)=bs4;0;32",N_ISYM,0x0,0x0,0x0 + 10: .stabs "long:t(0,4)=bs4;0;32",N_ISYM,0x0,0x0,0x0 + 11: .stabs "long long:t(0,5)=bs8;0;64",N_ISYM,0x0,0x0,0x0 + 12: .stabs "unsigned char:t(0,6)=buc1;0;8",N_ISYM,0x0,0x0,0x0 + 13: .stabs "unsigned short:t(0,7)=bu2;0;16",N_ISYM,0x0,0x0,0x0 + 14: .stabs "unsigned:t(0,8)=bu4;0;32",N_ISYM,0x0,0x0,0x0 + 15: .stabs "unsigned long:t(0,9)=bu4;0;32",N_ISYM,0x0,0x0,0x0 + 16: .stabs "unsigned long long:t(0,10)=bu8;0;64",N_ISYM,0x0,0x0,0x0 + 17: .stabs "signed char:t(0,11)=bsc1;0;8",N_ISYM,0x0,0x0,0x0 + 18: .stabs "wchar_t:t(0,12)=buc4;0;32",N_ISYM,0x0,0x0,0x0 + 19: .stabs "void:t(0,13)=bs0;0;0",N_ISYM,0x0,0x0,0x0 + 20: .stabs "float:t(0,14)=R1;4",N_ISYM,0x0,0x0,0x0 + 21: .stabs "double:t(0,15)=R2;8",N_ISYM,0x0,0x0,0x0 + 22: .stabs "long double:t(0,16)=R6;12",N_ISYM,0x0,0x0,0x0 + 23: .stabs "...:t(0,17)=buv4;0;32",N_ISYM,0x0,0x0,0x0 + 24: .stabs "bool:t(0,18)=bub1;0;8",N_ISYM,0x0,0x0,0x0 + 25: .stabs "__1nPgoogle_breakpad_:T(0,19)=Yn0google_breakpad;",N_ISYM,0x0,0x0,0x0 + 26: .stabs "nBC(0,19):U(0,20)",N_ESYM,0x0,0x0,0x0 + 27: .stabs "nBC(0,19):T(0,20)=Yc8C;;AcHmember_:(0,3),32,32;;Cc2t6M_v K2c2T6M_v CcKset_member6Mi_v CcGmember6kM_i CcBf6M_v K3cBg6M_i GcBh6Frk1_pc;;;2 0;;;;110;",N_ESYM,0x0,0x8,0x0 + 28: .stabs "main:F(0,3);(0,3);(0,21)=*(0,22)=*(0,1)",N_FUN,0x0,0x38,0x0 + 29: .stabs "main",N_MAIN,0x0,0x0,0x0 + 30: .stabs "argc:p(0,3)",N_PSYM,0x0,0x4,0x8 + 31: .stabs "argv:p(0,21)",N_PSYM,0x0,0x4,0xc + 32: .stabn N_LBRAC,0x0,0x1,0x12 + 33: .stabs "object:(0,20)",N_LSYM,0x0,0x8,0xfffffff4 + 34: .stabs "value:(0,3)",N_LSYM,0x0,0x4,0xfffffff0 + 35: .stabs "nothing:(0,22)",N_LSYM,0x0,0x4,0xffffffec + 36: .stabn N_SLINE,0x0,0x39,0x12 + 37: .stabs "object:2",N_CONSTRUCT,0x0,0xc,0x12 + 38: .stabn N_SLINE,0x2,0x3a,0x1e + 39: .stabn N_SLINE,0x0,0x3b,0x36 + 40: .stabn N_SLINE,0x0,0x3c,0x42 + 41: .stabn N_SLINE,0x0,0x3d,0x57 + 42: .stabn N_SLINE,0x0,0x3f,0x6c + 43: .stabs "2:0",N_DESTRUCT,0x0,0xc,0x73 + 44: .stabn N_SLINE,0xfffffffe,0x40,0x9c + 45: .stabn N_RBRAC,0x0,0x1,0x9c + 46: .stabs "__1cPgoogle_breakpadBi6F_i_:f(0,3)",N_FUN,0x0,0x32,0x0 + 47: .stabn N_LBRAC,0x0,0x1,0x6 + 48: .stabn N_SLINE,0x0,0x33,0x6 + 49: .stabn N_SLINE,0x0,0x34,0x10 + 50: .stabn N_RBRAC,0x0,0x1,0x10 + 51: .stabs "__1cPgoogle_breakpadBC2t6M_v_:F(0,13);(0,23)=*(0,20)",N_FUN,0x0,0x24,0x0 + 52: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 53: .stabn N_LBRAC,0x0,0x1,0x3 + 54: .stabn N_SLINE,0x0,0x24,0x25 + 55: .stabn N_RBRAC,0x0,0x1,0x25 + 56: .stabs "__1cPgoogle_breakpadBC2T6M_v_:F(0,13);(0,23)",N_FUN,0x0,0x25,0x0 + 57: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 58: .stabn N_LBRAC,0x0,0x1,0x3 + 59: .stabn N_SLINE,0x0,0x25,0x3 + 60: .stabn N_RBRAC,0x0,0x1,0x3 + 61: .stabs "__1cPgoogle_breakpadBCKset_member6Mi_v_:F(0,13);(0,23);(0,3)",N_FUN,0x0,0x27,0x0 + 62: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 63: .stabs "value:p(0,3)",N_PSYM,0x0,0x4,0xc + 64: .stabn N_LBRAC,0x0,0x1,0x3 + 65: .stabn N_SLINE,0x0,0x27,0x3 + 66: .stabn N_SLINE,0x0,0x27,0xc + 67: .stabn N_RBRAC,0x0,0x1,0xc + 68: .stabs "__1cPgoogle_breakpadBCBf6M_v_:F(0,13);(0,23)",N_FUN,0x0,0x2a,0x0 + 69: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 70: .stabn N_LBRAC,0x0,0x1,0x3 + 71: .stabn N_SLINE,0x0,0x2a,0x3 + 72: .stabn N_SLINE,0x0,0x2a,0x1d + 73: .stabn N_RBRAC,0x0,0x1,0x1d + 74: .stabs "__1cPgoogle_breakpadBCBg6M_i_:F(0,3);(0,23)",N_FUN,0x0,0x2b,0x0 + 75: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 76: .stabn N_LBRAC,0x0,0x1,0x6 + 77: .stabn N_SLINE,0x0,0x2b,0x6 + 78: .stabn N_SLINE,0x0,0x2b,0x10 + 79: .stabn N_RBRAC,0x0,0x1,0x10 + 80: .stabs "__1cPgoogle_breakpadBCBh6Frk1_pc_:F(0,22);(0,24)=&(0,25)=k(0,20)",N_FUN,0x0,0x2c,0x0 + 81: .stabs "that:p(0,24)",N_PSYM,0x0,0x4,0x8 + 82: .stabn N_LBRAC,0x0,0x1,0x6 + 83: .stabn N_SLINE,0x0,0x2c,0x6 + 84: .stabn N_SLINE,0x0,0x2c,0x10 + 85: .stabn N_RBRAC,0x0,0x1,0x10 + 86: .stabs "__1cPgoogle_breakpadBC2T5B6M_v_:F(0,13);(0,23)",N_FUN,0x0,0x25,0x0 + 87: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 88: .stabn N_LBRAC,0x0,0x1,0x3 + 89: .stabn N_SLINE,0x0,0x25,0xf + 90: .stabn N_RBRAC,0x0,0x1,0xf + 91: .stabs "__SLIP.DELETER__A:f(0,13);(0,23);(0,3)",N_FUN,0x0,0x25,0x0 + 92: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 93: .stabs "delete:p(0,3)",N_PSYM,0x0,0x4,0xc + 94: .stabn N_LBRAC,0x0,0x1,0x3 + 95: .stabn N_LBRAC,0x0,0x2,0x3 + 96: .stabn N_RBRAC,0x0,0x2,0x28 + 97: .stabn N_RBRAC,0x0,0x1,0x28 + 98: .stabs "true:l(0,18);1",N_LSYM,0x0,0x4,0x0 + 99: .stabs "false:l(0,18);0",N_LSYM,0x0,0x4,0x0 + 100: .stabs "__1c2k6Fpv_v_:P(0,13);(0,26)=*(0,13)",N_FUN,0x0,0x0,0x0 + 101: .stabs "__1cPgoogle_breakpadBC2t5B6M_v_:F__1cPgoogle_breakpadBC2t6M_v_",N_ALIAS,0x0,0x0,0x0 + 102: .stabs "cbD__RTTI__1nPgoogle_breakpadBC_(0,19):YR(0,20)",N_LSYM,0x0,0x0,0x0 + 103: .stabn N_ENDM,0x0,0x0,0x0 + + +Index Stab table -- 17 entries + + 0: .stabs "dump_syms_regtest.cc",N_UNDF,0x0,0x10,0x3b1 + 1: .stabs "/export/home/alfred/cvs/breakpad/google-breakpad20070927/src/tools/solaris/dump_syms/testdata/",N_SO,0x0,0x0,0x0 + 2: .stabs "dump_syms_regtest.cc",N_SO,0x0,0x4,0x0 + 3: .stabs "/export/home/alfred/cvs/breakpad/google-breakpad20070927/src/tools/solaris/dump_syms/testdata",N_OBJ,0x0,0x0,0x0 + 4: .stabs "dump_syms_regtest.o",N_OBJ,0x0,0x0,0x0 + 5: .stabs "V=9.0;DBG_GEN=5.0.8;dm;cd;backend;ptf;ptx;ptk;s;g;R=5.8<>;G=.XAB6Z2hOiL$Gl1b.;A=2",N_OPT,0x0,0x0,0x46fcb88e + 6: .stabs "/export/home/alfred/cvs/breakpad/google-breakpad20070927/src/tools/solaris/dump_syms/testdata/; /ws/on10-tools-prc/SUNWspro/SS11/prod/bin/CC -g -xs -xdebugformat=stabs -I../../.. -I../../../common/solaris -D_REENTRANT -xs dump_syms_regtest.cc -Qoption ccfe -prefix -Qoption ccfe .XAB6Z2hOiL\$Gl1b.",N_CMDLINE,0x0,0x0,0x0 + 7: .stabs "__1nPgoogle_breakpadBC_:U",N_ESYM,0x0,0x0,0x0 + 8: .stabs "main",N_MAIN,0x0,0x0,0x0 + 9: .stabs "main",N_FUN,0x0,0x0,0x0 + 10: .stabs "__1cPgoogle_breakpadBC2t6M_v_",N_FUN,0x0,0x0,0x0 + 11: .stabs "__1cPgoogle_breakpadBC2T6M_v_",N_FUN,0x0,0x0,0x0 + 12: .stabs "__1cPgoogle_breakpadBCKset_member6Mi_v_",N_FUN,0x0,0x0,0x0 + 13: .stabs "__1cPgoogle_breakpadBCBf6M_v_",N_FUN,0x0,0x0,0x0 + 14: .stabs "__1cPgoogle_breakpadBCBg6M_i_",N_FUN,0x0,0x0,0x0 + 15: .stabs "__1cPgoogle_breakpadBCBh6Frk1_pc_",N_FUN,0x0,0x0,0x0 + 16: .stabs "__1cPgoogle_breakpadBC2T5B6M_v_",N_FUN,0x0,0x0,0x0 diff --git a/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym new file mode 100644 index 00000000..44d3c539 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym @@ -0,0 +1,33 @@ +MODULE solaris x86 3DC8191474338D8587339B5FB3E2C62A0 dump_syms_regtest.o +FILE 0 dump_syms_regtest.cc +FUNC 0 156 0 main +12 18 57 0 +1e 12 58 0 +36 24 59 0 +42 12 60 0 +57 21 61 0 +6c 21 63 0 +9c 48 64 0 +FUNC 0 16 0 int google_breakpad::i() +6 6 51 0 +10 10 52 0 +FUNC 0 37 0 google_breakpad::C::C() +25 37 36 0 +FUNC 0 3 0 google_breakpad::C::~C() +3 3 37 0 +FUNC 0 12 0 void google_breakpad::C::set_member(int) +3 3 39 0 +c 9 39 0 +FUNC 0 29 0 void google_breakpad::C::f() +3 3 42 0 +1d 26 42 0 +FUNC 0 16 0 int google_breakpad::C::g() +6 6 43 0 +10 10 43 0 +FUNC 0 16 0 char*google_breakpad::C::h(const google_breakpad::C&) +6 6 44 0 +10 10 44 0 +FUNC 0 15 0 google_breakpad::C::~C #Nvariant 1() +f 15 37 0 +FUNC 0 0 0 __SLIP.DELETER__A +FUNC 0 0 0 void operator delete(void*) diff --git a/thirdparty/google-breakpad/r318/src/tools/windows/converter/ms_symbol_server_converter.cc b/thirdparty/google-breakpad/r318/src/tools/windows/converter/ms_symbol_server_converter.cc new file mode 100644 index 00000000..2b6278ba --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/windows/converter/ms_symbol_server_converter.cc @@ -0,0 +1,522 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ms_symbol_server_converter.cc: Obtain symbol files from a Microsoft +// symbol server, and convert them to Breakpad's dumped format. +// +// See ms_symbol_server_converter.h for documentation. +// +// Author: Mark Mentovai + +#include +#include + +#include +#include + +#include "tools/windows/converter/ms_symbol_server_converter.h" +#include "common/windows/pdb_source_line_writer.h" +#include "common/windows/string_utils-inl.h" + +// SYMOPT_NO_PROMPTS is not defined in earlier platform SDKs. Define it +// in that case, in the event that this code is used with a newer version +// of DbgHelp at runtime that recognizes the option. The presence of this +// bit in the symbol options should not harm earlier versions of DbgHelp. +#ifndef SYMOPT_NO_PROMPTS +#define SYMOPT_NO_PROMPTS 0x00080000 +#endif // SYMOPT_NO_PROMPTS + +namespace google_breakpad { + +// Use sscanf_s if it is available, to quench the warning about scanf being +// deprecated. Use scanf where sscanf_is not available. Note that the +// parameters passed to sscanf and sscanf_s are only compatible as long as +// fields of type c, C, s, S, and [ are not used. +#if _MSC_VER >= 1400 // MSVC 2005/8 +#define SSCANF sscanf_s +#else // _MSC_VER >= 1400 +#define SSCANF sscanf +#endif // _MSC_VER >= 1400 + +bool GUIDOrSignatureIdentifier::InitializeFromString( + const string &identifier) { + type_ = TYPE_NONE; + + size_t length = identifier.length(); + + if (length > 32 && length <= 40) { + // GUID + if (SSCANF(identifier.c_str(), + "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%X", + &guid_.Data1, &guid_.Data2, &guid_.Data3, + &guid_.Data4[0], &guid_.Data4[1], + &guid_.Data4[2], &guid_.Data4[3], + &guid_.Data4[4], &guid_.Data4[5], + &guid_.Data4[6], &guid_.Data4[7], + &age_) != 12) { + return false; + } + + type_ = TYPE_GUID; + } else if (length > 8 && length <= 15) { + // Signature + if (SSCANF(identifier.c_str(), "%08X%x", &signature_, &age_) != 2) { + return false; + } + + type_ = TYPE_SIGNATURE; + } else { + return false; + } + + return true; +} + +#undef SSCANF + +MSSymbolServerConverter::MSSymbolServerConverter( + const string &local_cache, const vector &symbol_servers) + : symbol_path_(), + fail_dns_(false), + fail_timeout_(false), + fail_not_found_(false) { + // Setting local_cache can be done without verifying that it exists because + // SymSrv will create it if it is missing - any creation failures will occur + // at that time, so there's nothing to check here, making it safe to + // assign this in the constructor. + + assert(symbol_servers.size() > 0); + + // These are characters that are interpreted as having special meanings in + // symbol_path_. + const char *kInvalidCharacters = "*;"; + assert(local_cache.find_first_of(kInvalidCharacters) == string::npos); + + for (vector::const_iterator symbol_server = symbol_servers.begin(); + symbol_server != symbol_servers.end(); + ++symbol_server) { + // The symbol path format is explained by + // http://msdn.microsoft.com/library/en-us/debug/base/using_symsrv.asp . + // "srv*" is the same as "symsrv*symsrv.dll*", which means that + // symsrv.dll is to be responsible for locating symbols. symsrv.dll + // interprets the rest of the string as a series of symbol stores separated + // by '*'. "srv*local_cache*symbol_server" means to check local_cache + // first for the symbol file, and if it is not found there, to check + // symbol_server. Symbol files found on the symbol server will be placed + // in the local cache, decompressed. + // + // Multiple specifications in this format may be presented, separated by + // semicolons. + + assert((*symbol_server).find_first_of(kInvalidCharacters) == string::npos); + symbol_path_ += "srv*" + local_cache + "*" + *symbol_server + ";"; + } + + // Strip the trailing semicolon. + symbol_path_.erase(symbol_path_.length() - 1); +} + +// A stack-based class that manages SymInitialize and SymCleanup calls. +class AutoSymSrv { + public: + AutoSymSrv() : initialized_(false) {} + + ~AutoSymSrv() { + if (!Cleanup()) { + // Print the error message here, because destructors have no return + // value. + fprintf(stderr, "~AutoSymSrv: SymCleanup: error %d\n", GetLastError()); + } + } + + bool Initialize(HANDLE process, char *path, bool invade_process) { + process_ = process; + initialized_ = SymInitialize(process, path, invade_process) == TRUE; + return initialized_; + } + + bool Cleanup() { + if (initialized_) { + if (SymCleanup(process_)) { + initialized_ = false; + return true; + } + return false; + } + + return true; + } + + private: + HANDLE process_; + bool initialized_; +}; + +// A stack-based class that "owns" a pathname and deletes it when destroyed, +// unless told not to by having its Release() method called. Early deletions +// are supported by calling Delete(). +class AutoDeleter { + public: + AutoDeleter(const string &path) : path_(path) {} + + ~AutoDeleter() { + int error; + if ((error = Delete()) != 0) { + // Print the error message here, because destructors have no return + // value. + fprintf(stderr, "~AutoDeleter: Delete: error %d for %s\n", + error, path_.c_str()); + } + } + + int Delete() { + if (path_.empty()) + return 0; + + int error = remove(path_.c_str()); + Release(); + return error; + } + + void Release() { + path_.clear(); + } + + private: + string path_; +}; + +MSSymbolServerConverter::LocateResult +MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo &missing, + string *symbol_file) { + assert(symbol_file); + symbol_file->clear(); + + GUIDOrSignatureIdentifier identifier; + if (!identifier.InitializeFromString(missing.debug_identifier)) { + fprintf(stderr, + "LocateSymbolFile: Unparseable debug_identifier for %s %s %s\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str()); + return LOCATE_FAILURE; + } + + HANDLE process = GetCurrentProcess(); // CloseHandle is not needed. + AutoSymSrv symsrv; + if (!symsrv.Initialize(process, + const_cast(symbol_path_.c_str()), + false)) { + fprintf(stderr, "LocateSymbolFile: SymInitialize: error %d for %s %s %s\n", + GetLastError(), + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str()); + return LOCATE_FAILURE; + } + + if (!SymRegisterCallback64(process, SymCallback, + reinterpret_cast(this))) { + fprintf(stderr, + "LocateSymbolFile: SymRegisterCallback64: error %d for %s %s %s\n", + GetLastError(), + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str()); + return LOCATE_FAILURE; + } + + // SYMOPT_DEBUG arranges for SymCallback to be called with additional + // debugging information. This is used to determine the nature of failures. + DWORD options = SymGetOptions() | SYMOPT_DEBUG | SYMOPT_NO_PROMPTS | + SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_SECURE; + SymSetOptions(options); + + // SymCallback will set these as needed inisde the SymFindFileInPath call. + fail_dns_ = false; + fail_timeout_ = false; + fail_not_found_ = false; + + // Do the lookup. + char path[MAX_PATH]; + if (!SymFindFileInPath( + process, NULL, + const_cast(missing.debug_file.c_str()), + const_cast(identifier.guid_or_signature_pointer()), + identifier.age(), 0, + identifier.type() == GUIDOrSignatureIdentifier::TYPE_GUID ? + SSRVOPT_GUIDPTR : SSRVOPT_DWORDPTR, + path, SymFindFileInPathCallback, this)) { + DWORD error = GetLastError(); + if (error == ERROR_FILE_NOT_FOUND) { + // This can be returned for a number of reasons. Use the crumbs + // collected by SymCallback to determine which one is relevant. + + // These errors are possibly transient. + if (fail_dns_ || fail_timeout_) { + return LOCATE_RETRY; + } + + // This is an authoritiative file-not-found message. + if (fail_not_found_) { + fprintf(stderr, + "LocateSymbolFile: SymFindFileInPath: LOCATE_NOT_FOUND error " + "for %s %s %s\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str()); + return LOCATE_NOT_FOUND; + } + + // If the error is FILE_NOT_FOUND but none of the known error + // conditions are matched, fall through to LOCATE_FAILURE. + } + + fprintf(stderr, + "LocateSymbolFile: SymFindFileInPath: error %d for %s %s %s\n", + error, + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str()); + return LOCATE_FAILURE; + } + + // The AutoDeleter ensures that the file is only kept when returning + // LOCATE_SUCCESS. + AutoDeleter deleter(path); + + // Do the cleanup here even though it will happen when symsrv goes out of + // scope, to allow it to influence the return value. + if (!symsrv.Cleanup()) { + fprintf(stderr, "LocateSymbolFile: SymCleanup: error %d for %s %s %s\n", + GetLastError(), + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str()); + return LOCATE_FAILURE; + } + + deleter.Release(); + + *symbol_file = path; + return LOCATE_SUCCESS; +} + +// static +BOOL CALLBACK MSSymbolServerConverter::SymCallback(HANDLE process, + ULONG action, + ULONG64 data, + ULONG64 context) { + MSSymbolServerConverter *self = + reinterpret_cast(context); + + switch (action) { + case CBA_EVENT: { + IMAGEHLP_CBA_EVENT *cba_event = + reinterpret_cast(data); + + // Put the string into a string object to be able to use string::find + // for substring matching. This is important because the not-found + // message does not use the entire string but is appended to the URL + // that SymSrv attempted to retrieve. + string desc(cba_event->desc); + + // desc_action maps strings (in desc) to boolean pointers that are to + // be set to true if the string matches. + struct desc_action { + const char *desc; // The substring to match. + bool *action; // On match, this pointer will be set to true. + }; + + static const desc_action desc_actions[] = { + // When a DNS error occurs, it could be indiciative of network + // problems. + { "SYMSRV: The server name or address could not be resolved\n", + &self->fail_dns_ }, + + // This message is produced if no connection is opened. + { "SYMSRV: A connection with the server could not be established\n", + &self->fail_timeout_ }, + + // This message is produced if a connection is established but the + // server fails to respond to the HTTP request. + { "SYMSRV: The operation timed out\n", + &self->fail_timeout_ }, + + // This message is produced when the requested file is not found, + // even if one or more of the above messages are also produced. + // It's trapped to distinguish between not-found and unknown-failure + // conditions. Note that this message will not be produced if a + // connection is established and the server begins to respond to the + // HTTP request but does not finish transmitting the file. + { " not found\n", + &self->fail_not_found_ } + }; + + for (int desc_action_index = 0; + desc_action_index < sizeof(desc_actions) / sizeof(desc_action); + ++desc_action_index) { + if (desc.find(desc_actions[desc_action_index].desc) != string::npos) { + *(desc_actions[desc_action_index].action) = true; + break; + } + } + + break; + } + } + + // This function is a mere fly on the wall. Treat everything as unhandled. + return FALSE; +} + +// static +BOOL CALLBACK MSSymbolServerConverter::SymFindFileInPathCallback( + char *filename, void *context) { + // FALSE ends the search, indicating that the located symbol file is + // satisfactory. + return FALSE; +} + +MSSymbolServerConverter::LocateResult +MSSymbolServerConverter::LocateAndConvertSymbolFile( + const MissingSymbolInfo &missing, + bool keep_symbol_file, + string *converted_symbol_file, + string *symbol_file) { + assert(converted_symbol_file); + converted_symbol_file->clear(); + if (symbol_file) { + symbol_file->clear(); + } + + string pdb_file; + LocateResult result = LocateSymbolFile(missing, &pdb_file); + if (result != LOCATE_SUCCESS) { + return result; + } + + if (symbol_file && keep_symbol_file) { + *symbol_file = pdb_file; + } + + // Conversion may fail because the file is corrupt. If a broken file is + // kept in the local cache, LocateSymbolFile will not hit the network again + // to attempt to locate it. To guard against problems like this, the + // symbol file in the local cache will be removed if conversion fails. + AutoDeleter pdb_deleter(pdb_file); + + // Be sure that it's a .pdb file, since we'll be replacing .pdb with .sym + // for the converted file's name. + string pdb_extension = pdb_file.substr(pdb_file.length() - 4); + // strcasecmp is called _stricmp here. + if (_stricmp(pdb_extension.c_str(), ".pdb") != 0) { + fprintf(stderr, "LocateAndConvertSymbolFile: " + "LocateSymbolFile: no .pdb extension for %s %s %s %s\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + pdb_file.c_str()); + return LOCATE_FAILURE; + } + + // PDBSourceLineWriter wants the filename as a wstring, so convert it. + wstring pdb_file_w; + if (!WindowsStringUtils::safe_mbstowcs(pdb_file, &pdb_file_w)) { + fprintf(stderr, "LocateAndConvertSymbolFile: " + "WindowsStringUtils::safe_mbstowcs failed for %s %s %s %s\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + pdb_file.c_str()); + return LOCATE_FAILURE; + } + + PDBSourceLineWriter writer; + if (!writer.Open(pdb_file_w, PDBSourceLineWriter::PDB_FILE)) { + fprintf(stderr, "LocateAndConvertSymbolFile: " + "PDBSourceLineWriter::Open failed for %s %s %s %ws\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + pdb_file_w.c_str()); + return LOCATE_FAILURE; + } + + *converted_symbol_file = pdb_file.substr(0, pdb_file.length() - 4) + ".sym"; + + FILE *converted_output = NULL; +#if _MSC_VER >= 1400 // MSVC 2005/8 + errno_t err; + if ((err = fopen_s(&converted_output, converted_symbol_file->c_str(), "w")) + != 0) { +#else // _MSC_VER >= 1400 + // fopen_s and errno_t were introduced in MSVC8. Use fopen for earlier + // environments. Don't use fopen with MSVC8 and later, because it's + // deprecated. fopen does not provide reliable error codes, so just use + // -1 in the event of a failure. + int err; + if (!(converted_output = fopen(converted_symbol_file->c_str(), "w"))) { + err = -1; +#endif // _MSC_VER >= 1400 + fprintf(stderr, "LocateAndConvertSymbolFile: " + "fopen_s: error %d for %s %s %s %s\n", + err, + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + converted_symbol_file->c_str()); + return LOCATE_FAILURE; + } + + AutoDeleter sym_deleter(*converted_symbol_file); + + bool success = writer.WriteMap(converted_output); + fclose(converted_output); + + if (!success) { + fprintf(stderr, "LocateAndConvertSymbolFile: " + "PDBSourceLineWriter::WriteMap failed for %s %s %s %s\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + pdb_file.c_str()); + return LOCATE_FAILURE; + } + + if (keep_symbol_file) { + pdb_deleter.Release(); + } + + sym_deleter.Release(); + + return LOCATE_SUCCESS; +} + +} // namespace google_breakpad diff --git a/thirdparty/google-breakpad/r318/src/tools/windows/converter/ms_symbol_server_converter.h b/thirdparty/google-breakpad/r318/src/tools/windows/converter/ms_symbol_server_converter.h new file mode 100644 index 00000000..fffb7b8b --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/windows/converter/ms_symbol_server_converter.h @@ -0,0 +1,201 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ms_symbol_server_converter.h: Obtain symbol files from a Microsoft +// symbol server, and convert them to Breakpad's dumped format. +// +// At runtime, MSSymbolServerConverter and code that it calls depend on being +// able to locate suitable versions of dbghelp.dll and symsrv.dll. For best +// results, place these files in the same directory as the executable. +// dbghelp.dll and symsrv.dll as supplied with Debugging Tools for Windows are +// both redistributable, as indicated by the package's redist.txt file. +// +// When connecting to Microsoft's symbol server at +// http://msdl.microsoft.com/download/symbols/, which provides access to +// symbols for the operating system itself, symsrv.dll requires agreement to +// Microsoft's "Terms of Use for Microsoft Symbols and Binaries." Because this +// library places the symbol engine into a promptless mode, the dialog with the +// terms will not appear, and use of Microsoft's symbol server will not be +// possible. To indicate agreement to the terms, create a file called +// symsrv.yes in the same directory as symsrv.dll. (Note that symsrv.dll will +// also recognize a symsrv.no file as indicating that you do not accept the +// terms; the .yes file takes priority over the .no file.) The terms of use +// are contained within symsrv.dll; they were formerly available online at +// http://www.microsoft.com/whdc/devtools/debugging/symsrvTOU2.mspx , but +// do not appear to be available online any longer as of January, 2007. It is +// possible to view the terms from within WinDbg (Debugging Tools for Windows) +// by removing any symsrv.yes and symsrv.no files from WinDbg's directory, +// setting the symbol path to include Microsoft's symbol server (.sympath), and +// attempting to load symbols from their server (.reload). +// +// This code has been tested with dbghelp.dll 6.5.3.7 and symsrv.dll 6.5.3.8, +// included with Microsoft Visual Studio 8 in Common7/IDE. This has also +// been tested with dbghelp.dll and symsrv.dll 6.6.7.5, included with that +// version of Debugging Tools for Windows, available at +// http://www.microsoft.com/whdc/devtools/debugging/ . +// +// Author: Mark Mentovai + + +#ifndef MS_SYMBOL_SERVER_CONVERTER_H__ +#define MS_SYMBOL_SERVER_CONVERTER_H__ + +#include + +#include +#include + +namespace google_breakpad { + +using std::string; +using std::vector; + +// MissingSymbolInfo contains the subset of the information in the processor's +// CodeModule structure relevant to obtaining a missing symbol file. Only +// debug_file and debug_identifier are relevant in actually obtaining the +// missing file; the other fields are for convenience. +struct MissingSymbolInfo { + string code_file; + string code_identifier; + string debug_file; + string debug_identifier; + string version; +}; + +class GUIDOrSignatureIdentifier { + public: + enum GUIDOrSignatureType { + TYPE_NONE = 0, + TYPE_GUID, + TYPE_SIGNATURE + }; + + GUIDOrSignatureIdentifier() : type_(TYPE_NONE) {} + + // Converts |identifier|, a debug_identifier-formatted string, into its + // component fields: either a GUID and age, or signature and age. If + // successful, sets the relevant fields in the object, including the type + // field, and returns true. On error, returns false. + bool InitializeFromString(const string &identifier); + + GUIDOrSignatureType type() const { return type_; } + GUID guid() const { return guid_; } + DWORD signature() const { return signature_; } + int age() const { return age_; } + const void *guid_or_signature_pointer() const { return &guid_; } + + private: + GUIDOrSignatureType type_; + + // An identifier contains either a 128-bit uuid or a 32-bit signature. + union { + GUID guid_; + DWORD signature_; + }; + + // All identifiers used here have age fields, which indicate a specific + // revision given a uuid or signature. + int age_; +}; + +class MSSymbolServerConverter { + public: + enum LocateResult { + LOCATE_FAILURE = 0, + LOCATE_NOT_FOUND, // Authoritative: the file is not present. + LOCATE_RETRY, // Transient (network?) error, try again later. + LOCATE_SUCCESS + }; + + // Create a new object. local_cache is the location (pathname) of a local + // symbol store used to hold downloaded and converted symbol files. This + // directory will be created by LocateSymbolFile when it successfully + // retrieves a symbol file. symbol_servers contains a list of locations (URLs + // or pathnames) of the upstream symbol server stores, given in order of + // preference, with the first string in the vector identifying the first + // store to try. The vector must contain at least one string. None of the + // strings passed to this constructor may contain asterisk ('*') or semicolon + // (';') characters, as the symbol engine uses these characters as separators. + MSSymbolServerConverter(const string &local_cache, + const vector &symbol_servers); + + // Locates the symbol file specified by the identifying information in + // |missing|, by checking the symbol stores identified when the object + // was created. When returning LOCATE_SUCCESS, symbol_file is set to + // the pathname of the decompressed symbol file as it is stored in the + // local cache. + LocateResult LocateSymbolFile(const MissingSymbolInfo &missing, + string *symbol_file); + + // Calls LocateSymbolFile and converts the returned symbol file to the + // dumped-symbol format, storing it adjacent to the symbol file. The + // only conversion supported is from pdb files. Returns the return + // value of LocateSymbolFile, or if LocateSymbolFile succeeds but + // conversion fails, returns LOCATE_FAILURE. The pathname to the + // pdb file and to the converted symbol file are returned in + // converted_symbol_file and symbol_file. symbol_file is optional and + // may be NULL. If only the converted symbol file is desired, set + // keep_symbol_file to false to indicate that the original symbol file + // (pdb) should be deleted after conversion. + LocateResult LocateAndConvertSymbolFile(const MissingSymbolInfo &missing, + bool keep_symbol_file, + string *converted_symbol_file, + string *symbol_file); + + private: + // Called by various SymSrv functions to report status as progress is made + // and to allow the callback to influence processing. Messages sent to this + // callback can be used to distinguish between the various failure modes + // that SymFindFileInPath might encounter. + static BOOL CALLBACK SymCallback(HANDLE process, ULONG action, ULONG64 data, + ULONG64 context); + + // Called by SymFindFileInPath (in LocateSymbolFile) after a candidate + // symbol file is located, when it's present in the local cache. + // SymFindFileInPath actually seems to accept NULL for a callback function + // and behave properly for our needs in that case, but the documentation + // doesn't mention it, so this little callback is provided. + static BOOL CALLBACK SymFindFileInPathCallback(char *filename, + void *context); + + // The search path used by SymSrv, built based on the arguments to the + // constructor. + string symbol_path_; + + // SymCallback will set at least one of these failure variables if + // SymFindFileInPath fails for an expected reason. + bool fail_dns_; // DNS failures (fail_not_found_ will also be set). + bool fail_timeout_; // Timeouts (fail_not_found_ will also be set). + bool fail_not_found_; // The file could not be found. If this is the only + // fail_* member set, then it is authoritative. +}; + +} // namespace google_breakpad + +#endif // MS_SYMBOL_SERVER_CONVERTER_H__ diff --git a/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/dump_syms.cc b/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/dump_syms.cc new file mode 100644 index 00000000..3e8827b6 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/dump_syms.cc @@ -0,0 +1,61 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Windows utility to dump the line number data from a pdb file to +// a text-based format that we can use from the minidump processor. + +#include + +#include + +#include "common/windows/pdb_source_line_writer.h" + +using std::wstring; +using google_breakpad::PDBSourceLineWriter; + +int wmain(int argc, wchar_t **argv) { + if (argc < 2) { + fprintf(stderr, "Usage: %ws \n", argv[0]); + return 1; + } + + PDBSourceLineWriter writer; + if (!writer.Open(wstring(argv[1]), PDBSourceLineWriter::ANY_FILE)) { + fprintf(stderr, "Open failed\n"); + return 1; + } + + if (!writer.WriteMap(stdout)) { + fprintf(stderr, "WriteMap failed\n"); + return 1; + } + + writer.Close(); + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/run_regtest.sh b/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/run_regtest.sh new file mode 100644 index 00000000..1f20f64f --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/run_regtest.sh @@ -0,0 +1,53 @@ +#!/bin/sh + +# Copyright (c) 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Release/dump_syms.exe testdata/dump_syms_regtest.pdb | \ + tr -d '\015' > \ + testdata/dump_syms_regtest.new +status=$? + +if [ $status -ne 0 ] ; then + echo "FAIL, dump_syms.exe failed" + exit $status +fi + +diff -u testdata/dump_syms_regtest.new testdata/dump_syms_regtest.sym > \ + testdata/dump_syms_regtest.diff +status=$? + +if [ $status -eq 0 ] ; then + rm testdata/dump_syms_regtest.diff testdata/dump_syms_regtest.new + echo "PASS" +else + echo "FAIL, see testdata/dump_syms_regtest.[new|diff]" +fi + +exit $status diff --git a/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc b/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc new file mode 100644 index 00000000..ce53f582 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc @@ -0,0 +1,65 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// cl /Zi dump_syms_regtest.cc +// dump_syms dump_syms_regtest.pdb | tr -d '\015' > dump_syms_regtest.sym + +namespace google_breakpad { + +class C { + public: + C() : member_(1) {} + virtual ~C() {} + + void set_member(int value) { member_ = value; } + int member() const { return member_; } + + void f() { member_ = g(); } + virtual int g() { return 2; } + static char* h(const C &that) { return 0; } + + private: + int member_; +}; + +static int i() { + return 3; +} + +} // namespace google_breakpad + +int main(int argc, char **argv) { + google_breakpad::C object; + object.set_member(google_breakpad::i()); + object.f(); + int value = object.g(); + char *nothing = object.h(object); + + return 0; +} diff --git a/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym b/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym new file mode 100644 index 00000000..8e5ce026 --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym @@ -0,0 +1,14097 @@ +MODULE windows x86 3EB931A9CE0242ABB14FFDF4ECAA97FC1 dump_syms_regtest.pdb +FILE 1 c:\breakpad\trunk\src\tools\windows\dump_syms\testdata\dump_syms_regtest.cc +FILE 2 f:\sp\public\sdk\inc\reason.h +FILE 3 f:\sp\public\sdk\inc\wincon.h +FILE 4 f:\sp\public\sdk\inc\pshpack2.h +FILE 5 f:\sp\public\sdk\inc\mcx.h +FILE 6 f:\sp\public\sdk\inc\winuser.h +FILE 7 f:\sp\public\sdk\inc\winnls.h +FILE 8 f:\sp\public\sdk\inc\guiddef.h +FILE 9 f:\sp\public\sdk\inc\specstrings.h +FILE 10 f:\sp\public\sdk\inc\basetsd.h +FILE 11 f:\sp\public\sdk\inc\stralign.h +FILE 12 f:\sp\public\sdk\inc\tvout.h +FILE 13 f:\sp\public\sdk\inc\winsvc.h +FILE 14 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 15 f:\sp\public\sdk\inc\wingdi.h +FILE 16 f:\sp\public\sdk\inc\pshpack4.h +FILE 17 f:\sp\public\sdk\inc\poppack.h +FILE 18 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 19 f:\sp\public\sdk\inc\winnetwk.h +FILE 20 f:\sp\public\sdk\inc\imm.h +FILE 21 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 22 f:\sp\public\sdk\inc\windef.h +FILE 23 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 24 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\tran\i386\cpu_disp.c +FILE 25 f:\sp\public\sdk\inc\pshpack1.h +FILE 26 f:\sp\public\sdk\inc\winver.h +FILE 27 f:\sp\public\sdk\inc\windows.h +FILE 28 f:\sp\public\sdk\inc\winnt.h +FILE 29 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 30 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 31 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 32 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 33 f:\sp\public\sdk\inc\ddbanned.h +FILE 34 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 35 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 36 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 37 f:\sp\public\sdk\inc\winreg.h +FILE 38 f:\sp\public\sdk\inc\winbase.h +FILE 39 f:\sp\public\sdk\inc\winerror.h +FILE 40 f:\sp\public\sdk\inc\pshpack8.h +FILE 41 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 42 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 43 f:\sp\public\sdk\inc\reason.h +FILE 44 f:\sp\public\sdk\inc\wincon.h +FILE 45 f:\sp\public\sdk\inc\pshpack2.h +FILE 46 f:\sp\public\sdk\inc\mcx.h +FILE 47 f:\sp\public\sdk\inc\winuser.h +FILE 48 f:\sp\public\sdk\inc\winnls.h +FILE 49 f:\sp\public\sdk\inc\guiddef.h +FILE 50 f:\sp\public\sdk\inc\specstrings.h +FILE 51 f:\sp\public\sdk\inc\basetsd.h +FILE 52 f:\sp\public\sdk\inc\stralign.h +FILE 53 f:\sp\public\sdk\inc\tvout.h +FILE 54 f:\sp\public\sdk\inc\winsvc.h +FILE 55 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 56 f:\sp\public\sdk\inc\wingdi.h +FILE 57 f:\sp\public\sdk\inc\pshpack4.h +FILE 58 f:\sp\public\sdk\inc\poppack.h +FILE 59 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 60 f:\sp\public\sdk\inc\winnetwk.h +FILE 61 f:\sp\public\sdk\inc\imm.h +FILE 62 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 63 f:\sp\public\sdk\inc\windef.h +FILE 64 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 65 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\tran\i386\mathfcns.c +FILE 66 f:\sp\public\sdk\inc\pshpack1.h +FILE 67 f:\sp\public\sdk\inc\winver.h +FILE 68 f:\sp\public\sdk\inc\windows.h +FILE 69 f:\sp\public\sdk\inc\winnt.h +FILE 70 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 71 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 72 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 73 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 74 f:\sp\public\sdk\inc\ddbanned.h +FILE 75 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 76 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 77 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 78 f:\sp\public\sdk\inc\winreg.h +FILE 79 f:\sp\public\sdk\inc\winbase.h +FILE 80 f:\sp\public\sdk\inc\winerror.h +FILE 81 f:\sp\public\sdk\inc\pshpack8.h +FILE 82 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 83 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 84 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 85 f:\sp\public\sdk\inc\winreg.h +FILE 86 f:\sp\public\sdk\inc\winbase.h +FILE 87 f:\sp\public\sdk\inc\winerror.h +FILE 88 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 89 f:\sp\public\sdk\inc\windef.h +FILE 90 f:\sp\vctools\crt_bld\self_x86\crt\src\ctime.h +FILE 91 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 92 f:\sp\vctools\crt_bld\self_x86\crt\src\time.h +FILE 93 f:\sp\public\sdk\inc\pshpack8.h +FILE 94 f:\sp\public\sdk\inc\reason.h +FILE 95 f:\sp\public\sdk\inc\wincon.h +FILE 96 f:\sp\vctools\crt_bld\self_x86\crt\src\time.inl +FILE 97 f:\sp\public\sdk\inc\pshpack2.h +FILE 98 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 99 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 100 f:\sp\public\sdk\inc\mcx.h +FILE 101 f:\sp\public\sdk\inc\winuser.h +FILE 102 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 103 f:\sp\public\sdk\inc\winnls.h +FILE 104 f:\sp\public\sdk\inc\guiddef.h +FILE 105 f:\sp\public\sdk\inc\stralign.h +FILE 106 f:\sp\public\sdk\inc\winnt.h +FILE 107 f:\sp\public\sdk\inc\specstrings.h +FILE 108 f:\sp\public\sdk\inc\basetsd.h +FILE 109 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 110 f:\sp\public\sdk\inc\tvout.h +FILE 111 f:\sp\public\sdk\inc\winsvc.h +FILE 112 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 113 f:\sp\public\sdk\inc\wingdi.h +FILE 114 f:\sp\vctools\crt_bld\self_x86\crt\src\tzset.c +FILE 115 f:\sp\public\sdk\inc\pshpack4.h +FILE 116 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 117 f:\sp\public\sdk\inc\poppack.h +FILE 118 f:\sp\public\sdk\inc\winnetwk.h +FILE 119 f:\sp\public\sdk\inc\imm.h +FILE 120 f:\sp\public\sdk\inc\ddbanned.h +FILE 121 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 122 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 123 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 124 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 125 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 126 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 127 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 128 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 129 f:\sp\public\sdk\inc\windows.h +FILE 130 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 131 f:\sp\public\sdk\inc\pshpack1.h +FILE 132 f:\sp\public\sdk\inc\winver.h +FILE 133 f:\sp\vctools\crt_bld\self_x86\crt\src\time.inl +FILE 134 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 135 f:\sp\public\sdk\inc\winnt.h +FILE 136 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 137 f:\sp\public\sdk\inc\winreg.h +FILE 138 f:\sp\public\sdk\inc\winbase.h +FILE 139 f:\sp\public\sdk\inc\winerror.h +FILE 140 f:\sp\public\sdk\inc\pshpack8.h +FILE 141 f:\sp\public\sdk\inc\reason.h +FILE 142 f:\sp\public\sdk\inc\wincon.h +FILE 143 f:\sp\public\sdk\inc\pshpack2.h +FILE 144 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 145 f:\sp\public\sdk\inc\mcx.h +FILE 146 f:\sp\public\sdk\inc\winuser.h +FILE 147 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 148 f:\sp\public\sdk\inc\winnls.h +FILE 149 f:\sp\public\sdk\inc\guiddef.h +FILE 150 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 151 f:\sp\public\sdk\inc\stralign.h +FILE 152 f:\sp\public\sdk\inc\specstrings.h +FILE 153 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 154 f:\sp\public\sdk\inc\basetsd.h +FILE 155 f:\sp\public\sdk\inc\windows.h +FILE 156 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 157 f:\sp\public\sdk\inc\tvout.h +FILE 158 f:\sp\public\sdk\inc\winsvc.h +FILE 159 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 160 f:\sp\public\sdk\inc\wingdi.h +FILE 161 f:\sp\vctools\crt_bld\self_x86\crt\src\timeset.c +FILE 162 f:\sp\public\sdk\inc\pshpack4.h +FILE 163 f:\sp\public\sdk\inc\poppack.h +FILE 164 f:\sp\public\sdk\inc\winnetwk.h +FILE 165 f:\sp\public\sdk\inc\imm.h +FILE 166 f:\sp\public\sdk\inc\ddbanned.h +FILE 167 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 168 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 169 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 170 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 171 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 172 f:\sp\public\sdk\inc\windef.h +FILE 173 f:\sp\public\sdk\inc\pshpack1.h +FILE 174 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 175 f:\sp\vctools\crt_bld\self_x86\crt\src\time.h +FILE 176 f:\sp\public\sdk\inc\winver.h +FILE 177 f:\sp\public\sdk\inc\wincon.h +FILE 178 f:\sp\vctools\crt_bld\self_x86\crt\src\time.h +FILE 179 f:\sp\public\sdk\inc\imm.h +FILE 180 f:\sp\public\sdk\inc\winbase.h +FILE 181 f:\sp\public\sdk\inc\wingdi.h +FILE 182 f:\sp\public\sdk\inc\winver.h +FILE 183 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 184 f:\sp\public\sdk\inc\windows.h +FILE 185 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 186 f:\sp\public\sdk\inc\pshpack2.h +FILE 187 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 188 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 189 f:\sp\public\sdk\inc\reason.h +FILE 190 f:\sp\vctools\crt_bld\self_x86\crt\src\strftime.c +FILE 191 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 192 f:\sp\public\sdk\inc\specstrings.h +FILE 193 f:\sp\public\sdk\inc\basetsd.h +FILE 194 f:\sp\public\sdk\inc\pshpack4.h +FILE 195 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 196 f:\sp\public\sdk\inc\winnetwk.h +FILE 197 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 198 f:\sp\public\sdk\inc\stralign.h +FILE 199 f:\sp\vctools\crt_bld\self_x86\crt\src\time.inl +FILE 200 f:\sp\public\sdk\inc\poppack.h +FILE 201 f:\sp\public\sdk\inc\winsvc.h +FILE 202 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 203 f:\sp\public\sdk\inc\windef.h +FILE 204 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 205 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 206 f:\sp\public\sdk\inc\winuser.h +FILE 207 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 208 f:\sp\public\sdk\inc\mcx.h +FILE 209 f:\sp\public\sdk\inc\pshpack8.h +FILE 210 f:\sp\public\sdk\inc\guiddef.h +FILE 211 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 212 f:\sp\public\sdk\inc\winnt.h +FILE 213 f:\sp\public\sdk\inc\winnls.h +FILE 214 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 215 f:\sp\public\sdk\inc\pshpack1.h +FILE 216 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 217 f:\sp\public\sdk\inc\winerror.h +FILE 218 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 219 f:\sp\public\sdk\inc\winreg.h +FILE 220 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 221 f:\sp\public\sdk\inc\ddbanned.h +FILE 222 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 223 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 224 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 225 f:\sp\public\sdk\inc\tvout.h +FILE 226 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 227 f:\sp\public\sdk\inc\poppack.h +FILE 228 f:\sp\public\sdk\inc\winnetwk.h +FILE 229 f:\sp\public\sdk\inc\imm.h +FILE 230 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 231 f:\sp\public\sdk\inc\windef.h +FILE 232 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 233 f:\sp\public\sdk\inc\pshpack1.h +FILE 234 f:\sp\public\sdk\inc\winver.h +FILE 235 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 236 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 237 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 238 f:\sp\public\sdk\inc\winnt.h +FILE 239 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 240 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 241 f:\sp\public\sdk\inc\winreg.h +FILE 242 f:\sp\vctools\crt_bld\self_x86\crt\src\days.c +FILE 243 f:\sp\public\sdk\inc\winbase.h +FILE 244 f:\sp\public\sdk\inc\winerror.h +FILE 245 f:\sp\public\sdk\inc\pshpack8.h +FILE 246 f:\sp\public\sdk\inc\reason.h +FILE 247 f:\sp\public\sdk\inc\wincon.h +FILE 248 f:\sp\public\sdk\inc\ddbanned.h +FILE 249 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 250 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 251 f:\sp\public\sdk\inc\pshpack2.h +FILE 252 f:\sp\public\sdk\inc\mcx.h +FILE 253 f:\sp\public\sdk\inc\winuser.h +FILE 254 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 255 f:\sp\public\sdk\inc\winnls.h +FILE 256 f:\sp\public\sdk\inc\guiddef.h +FILE 257 f:\sp\public\sdk\inc\windows.h +FILE 258 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 259 f:\sp\public\sdk\inc\specstrings.h +FILE 260 f:\sp\public\sdk\inc\basetsd.h +FILE 261 f:\sp\public\sdk\inc\stralign.h +FILE 262 f:\sp\public\sdk\inc\tvout.h +FILE 263 f:\sp\public\sdk\inc\winsvc.h +FILE 264 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 265 f:\sp\public\sdk\inc\wingdi.h +FILE 266 f:\sp\public\sdk\inc\pshpack4.h +FILE 267 f:\sp\public\sdk\inc\wincon.h +FILE 268 f:\sp\public\sdk\inc\imm.h +FILE 269 f:\sp\public\sdk\inc\winbase.h +FILE 270 f:\sp\public\sdk\inc\wingdi.h +FILE 271 f:\sp\public\sdk\inc\winver.h +FILE 272 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 273 f:\sp\public\sdk\inc\windows.h +FILE 274 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 275 f:\sp\public\sdk\inc\pshpack2.h +FILE 276 f:\sp\public\sdk\inc\reason.h +FILE 277 f:\sp\vctools\crt_bld\self_x86\crt\src\strnicol.c +FILE 278 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 279 f:\sp\public\sdk\inc\specstrings.h +FILE 280 f:\sp\public\sdk\inc\basetsd.h +FILE 281 f:\sp\public\sdk\inc\pshpack4.h +FILE 282 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 283 f:\sp\public\sdk\inc\winnetwk.h +FILE 284 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 285 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 286 f:\sp\public\sdk\inc\stralign.h +FILE 287 f:\sp\public\sdk\inc\poppack.h +FILE 288 f:\sp\public\sdk\inc\winsvc.h +FILE 289 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 290 f:\sp\public\sdk\inc\windef.h +FILE 291 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 292 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 293 f:\sp\public\sdk\inc\winuser.h +FILE 294 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 295 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 296 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 297 f:\sp\public\sdk\inc\mcx.h +FILE 298 f:\sp\public\sdk\inc\pshpack8.h +FILE 299 f:\sp\public\sdk\inc\guiddef.h +FILE 300 f:\sp\public\sdk\inc\winnt.h +FILE 301 f:\sp\public\sdk\inc\winnls.h +FILE 302 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 303 f:\sp\public\sdk\inc\pshpack1.h +FILE 304 f:\sp\public\sdk\inc\winerror.h +FILE 305 f:\sp\public\sdk\inc\winreg.h +FILE 306 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 307 f:\sp\public\sdk\inc\ddbanned.h +FILE 308 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 309 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 310 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 311 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 312 f:\sp\public\sdk\inc\tvout.h +FILE 313 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 314 f:\sp\public\sdk\inc\mcx.h +FILE 315 f:\sp\public\sdk\inc\pshpack8.h +FILE 316 f:\sp\public\sdk\inc\winnt.h +FILE 317 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 318 f:\sp\public\sdk\inc\specstrings.h +FILE 319 f:\sp\public\sdk\inc\basetsd.h +FILE 320 f:\sp\public\sdk\inc\winnls.h +FILE 321 f:\sp\public\sdk\inc\pshpack1.h +FILE 322 f:\sp\public\sdk\inc\winerror.h +FILE 323 f:\sp\public\sdk\inc\winreg.h +FILE 324 f:\sp\vctools\crt_bld\self_x86\crt\src\strnicmp.c +FILE 325 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 326 f:\sp\public\sdk\inc\tvout.h +FILE 327 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 328 f:\sp\public\sdk\inc\wincon.h +FILE 329 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 330 f:\sp\public\sdk\inc\imm.h +FILE 331 f:\sp\public\sdk\inc\guiddef.h +FILE 332 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 333 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 334 f:\sp\public\sdk\inc\winbase.h +FILE 335 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 336 f:\sp\public\sdk\inc\wingdi.h +FILE 337 f:\sp\public\sdk\inc\windows.h +FILE 338 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 339 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 340 f:\sp\public\sdk\inc\winver.h +FILE 341 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 342 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 343 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 344 f:\sp\public\sdk\inc\pshpack2.h +FILE 345 f:\sp\public\sdk\inc\reason.h +FILE 346 f:\sp\public\sdk\inc\pshpack4.h +FILE 347 f:\sp\public\sdk\inc\winnetwk.h +FILE 348 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 349 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 350 f:\sp\public\sdk\inc\stralign.h +FILE 351 f:\sp\public\sdk\inc\windef.h +FILE 352 f:\sp\public\sdk\inc\poppack.h +FILE 353 f:\sp\public\sdk\inc\winsvc.h +FILE 354 f:\sp\public\sdk\inc\ddbanned.h +FILE 355 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 356 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 357 f:\sp\public\sdk\inc\winuser.h +FILE 358 f:\sp\public\sdk\inc\mcx.h +FILE 359 f:\sp\public\sdk\inc\pshpack8.h +FILE 360 f:\sp\public\sdk\inc\winnt.h +FILE 361 f:\sp\public\sdk\inc\specstrings.h +FILE 362 f:\sp\public\sdk\inc\basetsd.h +FILE 363 f:\sp\public\sdk\inc\winnls.h +FILE 364 f:\sp\public\sdk\inc\pshpack1.h +FILE 365 f:\sp\public\sdk\inc\winerror.h +FILE 366 f:\sp\public\sdk\inc\winreg.h +FILE 367 f:\sp\vctools\crt_bld\self_x86\crt\src\stricmp.c +FILE 368 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 369 f:\sp\public\sdk\inc\tvout.h +FILE 370 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 371 f:\sp\public\sdk\inc\wincon.h +FILE 372 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 373 f:\sp\public\sdk\inc\imm.h +FILE 374 f:\sp\public\sdk\inc\guiddef.h +FILE 375 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 376 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 377 f:\sp\public\sdk\inc\winbase.h +FILE 378 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 379 f:\sp\public\sdk\inc\wingdi.h +FILE 380 f:\sp\public\sdk\inc\windows.h +FILE 381 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 382 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 383 f:\sp\public\sdk\inc\winver.h +FILE 384 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 385 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 386 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 387 f:\sp\public\sdk\inc\pshpack2.h +FILE 388 f:\sp\public\sdk\inc\reason.h +FILE 389 f:\sp\public\sdk\inc\pshpack4.h +FILE 390 f:\sp\public\sdk\inc\winnetwk.h +FILE 391 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 392 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 393 f:\sp\public\sdk\inc\stralign.h +FILE 394 f:\sp\public\sdk\inc\windef.h +FILE 395 f:\sp\public\sdk\inc\poppack.h +FILE 396 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 397 f:\sp\public\sdk\inc\winsvc.h +FILE 398 f:\sp\public\sdk\inc\ddbanned.h +FILE 399 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 400 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 401 f:\sp\public\sdk\inc\winuser.h +FILE 402 f:\sp\public\sdk\inc\winnt.h +FILE 403 f:\sp\public\sdk\inc\pshpack4.h +FILE 404 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 405 f:\sp\public\sdk\inc\poppack.h +FILE 406 f:\sp\vctools\crt_bld\self_x86\crt\src\tcsncpy_s.inl +FILE 407 f:\sp\public\sdk\inc\winnetwk.h +FILE 408 f:\sp\public\sdk\inc\imm.h +FILE 409 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 410 f:\sp\public\sdk\inc\pshpack1.h +FILE 411 f:\sp\public\sdk\inc\winver.h +FILE 412 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 413 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 414 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 415 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 416 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 417 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 418 f:\sp\public\sdk\inc\guiddef.h +FILE 419 f:\sp\public\sdk\inc\windows.h +FILE 420 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 421 f:\sp\public\sdk\inc\specstrings.h +FILE 422 f:\sp\public\sdk\inc\basetsd.h +FILE 423 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 424 f:\sp\public\sdk\inc\winreg.h +FILE 425 f:\sp\vctools\crt_bld\self_x86\crt\src\strncpy_s.c +FILE 426 f:\sp\public\sdk\inc\winbase.h +FILE 427 f:\sp\public\sdk\inc\winerror.h +FILE 428 f:\sp\public\sdk\inc\pshpack8.h +FILE 429 f:\sp\public\sdk\inc\reason.h +FILE 430 f:\sp\public\sdk\inc\wincon.h +FILE 431 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 432 f:\sp\public\sdk\inc\ddbanned.h +FILE 433 f:\sp\public\sdk\inc\windef.h +FILE 434 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 435 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 436 f:\sp\public\sdk\inc\pshpack2.h +FILE 437 f:\sp\public\sdk\inc\mcx.h +FILE 438 f:\sp\public\sdk\inc\winuser.h +FILE 439 f:\sp\public\sdk\inc\winnls.h +FILE 440 f:\sp\public\sdk\inc\stralign.h +FILE 441 f:\sp\public\sdk\inc\tvout.h +FILE 442 f:\sp\public\sdk\inc\winsvc.h +FILE 443 f:\sp\public\sdk\inc\wingdi.h +FILE 444 f:\sp\public\sdk\inc\winnt.h +FILE 445 f:\sp\public\sdk\inc\pshpack4.h +FILE 446 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 447 f:\sp\public\sdk\inc\poppack.h +FILE 448 f:\sp\vctools\crt_bld\self_x86\crt\src\tcscpy_s.inl +FILE 449 f:\sp\public\sdk\inc\winnetwk.h +FILE 450 f:\sp\public\sdk\inc\imm.h +FILE 451 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 452 f:\sp\public\sdk\inc\pshpack1.h +FILE 453 f:\sp\public\sdk\inc\winver.h +FILE 454 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 455 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 456 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 457 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 458 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 459 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 460 f:\sp\public\sdk\inc\guiddef.h +FILE 461 f:\sp\public\sdk\inc\windows.h +FILE 462 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 463 f:\sp\public\sdk\inc\specstrings.h +FILE 464 f:\sp\public\sdk\inc\basetsd.h +FILE 465 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 466 f:\sp\public\sdk\inc\winreg.h +FILE 467 f:\sp\vctools\crt_bld\self_x86\crt\src\strcpy_s.c +FILE 468 f:\sp\public\sdk\inc\winbase.h +FILE 469 f:\sp\public\sdk\inc\winerror.h +FILE 470 f:\sp\public\sdk\inc\pshpack8.h +FILE 471 f:\sp\public\sdk\inc\reason.h +FILE 472 f:\sp\public\sdk\inc\wincon.h +FILE 473 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 474 f:\sp\public\sdk\inc\ddbanned.h +FILE 475 f:\sp\public\sdk\inc\windef.h +FILE 476 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 477 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 478 f:\sp\public\sdk\inc\pshpack2.h +FILE 479 f:\sp\public\sdk\inc\mcx.h +FILE 480 f:\sp\public\sdk\inc\winuser.h +FILE 481 f:\sp\public\sdk\inc\winnls.h +FILE 482 f:\sp\public\sdk\inc\stralign.h +FILE 483 f:\sp\public\sdk\inc\tvout.h +FILE 484 f:\sp\public\sdk\inc\winsvc.h +FILE 485 f:\sp\public\sdk\inc\wingdi.h +FILE 486 f:\sp\public\sdk\inc\winnt.h +FILE 487 f:\sp\public\sdk\inc\pshpack4.h +FILE 488 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 489 f:\sp\public\sdk\inc\poppack.h +FILE 490 f:\sp\vctools\crt_bld\self_x86\crt\src\tcscat_s.inl +FILE 491 f:\sp\public\sdk\inc\winnetwk.h +FILE 492 f:\sp\public\sdk\inc\imm.h +FILE 493 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 494 f:\sp\public\sdk\inc\pshpack1.h +FILE 495 f:\sp\public\sdk\inc\winver.h +FILE 496 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 497 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 498 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 499 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 500 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 501 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 502 f:\sp\public\sdk\inc\guiddef.h +FILE 503 f:\sp\public\sdk\inc\windows.h +FILE 504 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 505 f:\sp\public\sdk\inc\specstrings.h +FILE 506 f:\sp\public\sdk\inc\basetsd.h +FILE 507 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 508 f:\sp\public\sdk\inc\winreg.h +FILE 509 f:\sp\vctools\crt_bld\self_x86\crt\src\strcat_s.c +FILE 510 f:\sp\public\sdk\inc\winbase.h +FILE 511 f:\sp\public\sdk\inc\winerror.h +FILE 512 f:\sp\public\sdk\inc\pshpack8.h +FILE 513 f:\sp\public\sdk\inc\reason.h +FILE 514 f:\sp\public\sdk\inc\wincon.h +FILE 515 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 516 f:\sp\public\sdk\inc\ddbanned.h +FILE 517 f:\sp\public\sdk\inc\windef.h +FILE 518 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 519 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 520 f:\sp\public\sdk\inc\pshpack2.h +FILE 521 f:\sp\public\sdk\inc\mcx.h +FILE 522 f:\sp\public\sdk\inc\winuser.h +FILE 523 f:\sp\public\sdk\inc\winnls.h +FILE 524 f:\sp\public\sdk\inc\stralign.h +FILE 525 f:\sp\public\sdk\inc\tvout.h +FILE 526 f:\sp\public\sdk\inc\winsvc.h +FILE 527 f:\sp\public\sdk\inc\wingdi.h +FILE 528 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 529 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 530 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 531 f:\sp\vctools\crt_bld\self_x86\crt\src\strlen_s.c +FILE 532 f:\sp\public\sdk\inc\ddbanned.h +FILE 533 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 534 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 535 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strpbrk.asm +FILE 536 F:\SP\vctools\crt_bld\SELF_X86\crt\src\Intel\STRSPN.ASM +FILE 537 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 538 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\_strnicm.asm +FILE 539 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 540 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 541 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 542 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 543 f:\sp\vctools\crt_bld\self_x86\crt\src\intel\strncmp.c +FILE 544 f:\sp\public\sdk\inc\ddbanned.h +FILE 545 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 546 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 547 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strlen.asm +FILE 548 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 549 f:\sp\public\sdk\inc\pshpack2.h +FILE 550 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 551 f:\sp\public\sdk\inc\mcx.h +FILE 552 f:\sp\public\sdk\inc\winuser.h +FILE 553 f:\sp\public\sdk\inc\winnls.h +FILE 554 f:\sp\public\sdk\inc\stralign.h +FILE 555 f:\sp\public\sdk\inc\tvout.h +FILE 556 f:\sp\public\sdk\inc\winsvc.h +FILE 557 f:\sp\public\sdk\inc\wingdi.h +FILE 558 f:\sp\public\sdk\inc\winnt.h +FILE 559 f:\sp\public\sdk\inc\pshpack4.h +FILE 560 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 561 f:\sp\public\sdk\inc\poppack.h +FILE 562 f:\sp\public\sdk\inc\winnetwk.h +FILE 563 f:\sp\public\sdk\inc\imm.h +FILE 564 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 565 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 566 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 567 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 568 f:\sp\vctools\crt_bld\self_x86\crt\src\strdup.c +FILE 569 f:\sp\public\sdk\inc\pshpack1.h +FILE 570 f:\sp\public\sdk\inc\winver.h +FILE 571 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 572 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 573 f:\sp\public\sdk\inc\guiddef.h +FILE 574 f:\sp\public\sdk\inc\windows.h +FILE 575 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 576 f:\sp\public\sdk\inc\specstrings.h +FILE 577 f:\sp\public\sdk\inc\basetsd.h +FILE 578 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 579 f:\sp\public\sdk\inc\winreg.h +FILE 580 f:\sp\public\sdk\inc\ddbanned.h +FILE 581 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 582 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 583 f:\sp\public\sdk\inc\winbase.h +FILE 584 f:\sp\public\sdk\inc\winerror.h +FILE 585 f:\sp\public\sdk\inc\pshpack8.h +FILE 586 f:\sp\public\sdk\inc\reason.h +FILE 587 f:\sp\public\sdk\inc\wincon.h +FILE 588 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 589 f:\sp\public\sdk\inc\windef.h +FILE 590 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strcspn.asm +FILE 591 F:\SP\vctools\crt_bld\SELF_X86\crt\src\Intel\STRSPN.ASM +FILE 592 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 593 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strcmp.asm +FILE 594 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 595 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strchr.asm +FILE 596 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 597 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\string\i386\p4_memset.c +FILE 598 f:\sp\public\sdk\inc\ddbanned.h +FILE 599 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 600 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 601 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\memset.asm +FILE 602 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 603 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\memmove.asm +FILE 604 F:\SP\vctools\crt_bld\SELF_X86\crt\src\Intel\MEMCPY.ASM +FILE 605 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 606 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\string\i386\memcmp.c +FILE 607 f:\sp\public\sdk\inc\ddbanned.h +FILE 608 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 609 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 610 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\string\i386\p4_memcpy.c +FILE 611 f:\sp\public\sdk\inc\ddbanned.h +FILE 612 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 613 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 614 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\memcpy.asm +FILE 615 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 616 f:\sp\public\sdk\inc\pshpack2.h +FILE 617 f:\sp\public\sdk\inc\winreg.h +FILE 618 f:\sp\public\sdk\inc\guiddef.h +FILE 619 f:\sp\public\sdk\inc\windows.h +FILE 620 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 621 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 622 f:\sp\public\sdk\inc\specstrings.h +FILE 623 f:\sp\public\sdk\inc\basetsd.h +FILE 624 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 625 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 626 f:\sp\public\sdk\inc\pshpack4.h +FILE 627 f:\sp\public\sdk\inc\reason.h +FILE 628 f:\sp\public\sdk\inc\wincon.h +FILE 629 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 630 f:\sp\public\sdk\inc\poppack.h +FILE 631 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 632 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 633 f:\sp\public\sdk\inc\mcx.h +FILE 634 f:\sp\public\sdk\inc\winuser.h +FILE 635 f:\sp\public\sdk\inc\winnls.h +FILE 636 f:\sp\public\sdk\inc\stralign.h +FILE 637 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 638 f:\sp\public\sdk\inc\windef.h +FILE 639 f:\sp\public\sdk\inc\tvout.h +FILE 640 f:\sp\public\sdk\inc\winsvc.h +FILE 641 f:\sp\vctools\crt_bld\self_x86\crt\src\tidtable.c +FILE 642 f:\sp\public\sdk\inc\wingdi.h +FILE 643 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 644 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 645 f:\sp\public\sdk\inc\winnt.h +FILE 646 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 647 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 648 f:\sp\public\sdk\inc\winnetwk.h +FILE 649 f:\sp\public\sdk\inc\imm.h +FILE 650 f:\sp\public\sdk\inc\ddbanned.h +FILE 651 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 652 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 653 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 654 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 655 f:\sp\public\sdk\inc\winbase.h +FILE 656 f:\sp\public\sdk\inc\winerror.h +FILE 657 f:\sp\public\sdk\inc\pshpack1.h +FILE 658 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 659 f:\sp\vctools\crt_bld\self_x86\crt\src\memory.h +FILE 660 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 661 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 662 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 663 f:\sp\public\sdk\inc\pshpack8.h +FILE 664 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 665 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 666 f:\sp\public\sdk\inc\winver.h +FILE 667 f:\sp\public\sdk\inc\pshpack4.h +FILE 668 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 669 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 670 f:\sp\public\sdk\inc\poppack.h +FILE 671 f:\sp\public\sdk\inc\winnt.h +FILE 672 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 673 f:\sp\public\sdk\inc\winnetwk.h +FILE 674 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 675 f:\sp\public\sdk\inc\imm.h +FILE 676 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 677 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 678 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 679 f:\sp\public\sdk\inc\pshpack1.h +FILE 680 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 681 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 682 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 683 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 684 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 685 f:\sp\public\sdk\inc\winver.h +FILE 686 f:\sp\public\sdk\inc\guiddef.h +FILE 687 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 688 f:\sp\public\sdk\inc\specstrings.h +FILE 689 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 690 f:\sp\public\sdk\inc\basetsd.h +FILE 691 f:\sp\public\sdk\inc\windows.h +FILE 692 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 693 f:\sp\public\sdk\inc\winreg.h +FILE 694 f:\sp\vctools\crt_bld\self_x86\crt\src\stdenvp.c +FILE 695 f:\sp\public\sdk\inc\winbase.h +FILE 696 f:\sp\public\sdk\inc\winerror.h +FILE 697 f:\sp\public\sdk\inc\pshpack8.h +FILE 698 f:\sp\public\sdk\inc\reason.h +FILE 699 f:\sp\public\sdk\inc\ddbanned.h +FILE 700 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 701 f:\sp\public\sdk\inc\wincon.h +FILE 702 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 703 f:\sp\public\sdk\inc\pshpack2.h +FILE 704 f:\sp\public\sdk\inc\mcx.h +FILE 705 f:\sp\public\sdk\inc\winuser.h +FILE 706 f:\sp\public\sdk\inc\winnls.h +FILE 707 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 708 f:\sp\public\sdk\inc\windef.h +FILE 709 f:\sp\public\sdk\inc\stralign.h +FILE 710 f:\sp\public\sdk\inc\tvout.h +FILE 711 f:\sp\public\sdk\inc\winsvc.h +FILE 712 f:\sp\public\sdk\inc\wingdi.h +FILE 713 f:\sp\public\sdk\inc\poppack.h +FILE 714 f:\sp\vctools\crt_bld\self_x86\crt\src\dos.h +FILE 715 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 716 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 717 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 718 f:\sp\public\sdk\inc\winnetwk.h +FILE 719 f:\sp\public\sdk\inc\imm.h +FILE 720 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 721 f:\sp\public\sdk\inc\windef.h +FILE 722 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 723 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 724 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 725 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 726 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 727 f:\sp\public\sdk\inc\pshpack1.h +FILE 728 f:\sp\public\sdk\inc\winver.h +FILE 729 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 730 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 731 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 732 f:\sp\public\sdk\inc\winnt.h +FILE 733 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 734 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 735 f:\sp\public\sdk\inc\winreg.h +FILE 736 f:\sp\vctools\crt_bld\self_x86\crt\src\stdargv.c +FILE 737 f:\sp\public\sdk\inc\winbase.h +FILE 738 f:\sp\public\sdk\inc\winerror.h +FILE 739 f:\sp\public\sdk\inc\pshpack8.h +FILE 740 f:\sp\public\sdk\inc\reason.h +FILE 741 f:\sp\public\sdk\inc\wincon.h +FILE 742 f:\sp\public\sdk\inc\ddbanned.h +FILE 743 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 744 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 745 f:\sp\public\sdk\inc\pshpack2.h +FILE 746 f:\sp\public\sdk\inc\mcx.h +FILE 747 f:\sp\public\sdk\inc\winuser.h +FILE 748 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 749 f:\sp\public\sdk\inc\winnls.h +FILE 750 f:\sp\public\sdk\inc\guiddef.h +FILE 751 f:\sp\public\sdk\inc\windows.h +FILE 752 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 753 f:\sp\public\sdk\inc\specstrings.h +FILE 754 f:\sp\public\sdk\inc\basetsd.h +FILE 755 f:\sp\public\sdk\inc\stralign.h +FILE 756 f:\sp\public\sdk\inc\tvout.h +FILE 757 f:\sp\public\sdk\inc\winsvc.h +FILE 758 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 759 f:\sp\public\sdk\inc\wingdi.h +FILE 760 f:\sp\public\sdk\inc\pshpack4.h +FILE 761 f:\sp\public\sdk\inc\reason.h +FILE 762 f:\sp\public\sdk\inc\wincon.h +FILE 763 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 764 f:\sp\public\sdk\inc\poppack.h +FILE 765 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 766 f:\sp\public\sdk\inc\mcx.h +FILE 767 f:\sp\public\sdk\inc\winuser.h +FILE 768 f:\sp\public\sdk\inc\winnls.h +FILE 769 f:\sp\public\sdk\inc\stralign.h +FILE 770 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 771 f:\sp\public\sdk\inc\windef.h +FILE 772 f:\sp\public\sdk\inc\tvout.h +FILE 773 f:\sp\public\sdk\inc\winsvc.h +FILE 774 f:\sp\public\sdk\inc\wingdi.h +FILE 775 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 776 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 777 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 778 f:\sp\public\sdk\inc\winnt.h +FILE 779 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 780 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 781 f:\sp\public\sdk\inc\winnetwk.h +FILE 782 f:\sp\public\sdk\inc\imm.h +FILE 783 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 784 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 785 f:\sp\vctools\crt_bld\self_x86\crt\src\mlock.c +FILE 786 f:\sp\public\sdk\inc\winbase.h +FILE 787 f:\sp\public\sdk\inc\winerror.h +FILE 788 f:\sp\public\sdk\inc\pshpack1.h +FILE 789 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 790 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 791 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 792 f:\sp\public\sdk\inc\pshpack8.h +FILE 793 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 794 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 795 f:\sp\public\sdk\inc\winver.h +FILE 796 f:\sp\public\sdk\inc\ddbanned.h +FILE 797 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 798 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 799 f:\sp\public\sdk\inc\pshpack2.h +FILE 800 f:\sp\public\sdk\inc\winreg.h +FILE 801 f:\sp\public\sdk\inc\guiddef.h +FILE 802 f:\sp\public\sdk\inc\windows.h +FILE 803 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 804 f:\sp\public\sdk\inc\specstrings.h +FILE 805 f:\sp\public\sdk\inc\basetsd.h +FILE 806 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 807 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 808 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 809 f:\sp\public\sdk\inc\pshpack4.h +FILE 810 f:\sp\public\sdk\inc\poppack.h +FILE 811 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 812 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 813 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 814 f:\sp\public\sdk\inc\winnetwk.h +FILE 815 f:\sp\public\sdk\inc\imm.h +FILE 816 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 817 f:\sp\public\sdk\inc\windef.h +FILE 818 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 819 f:\sp\public\sdk\inc\pshpack1.h +FILE 820 f:\sp\public\sdk\inc\winver.h +FILE 821 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 822 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 823 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 824 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 825 f:\sp\public\sdk\inc\winnt.h +FILE 826 f:\sp\vctools\crt_bld\self_x86\crt\src\cmsgs.h +FILE 827 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 828 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 829 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 830 f:\sp\public\sdk\inc\winreg.h +FILE 831 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 832 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0msg.c +FILE 833 f:\sp\public\sdk\inc\winbase.h +FILE 834 f:\sp\public\sdk\inc\winerror.h +FILE 835 f:\sp\public\sdk\inc\pshpack8.h +FILE 836 f:\sp\public\sdk\inc\reason.h +FILE 837 f:\sp\public\sdk\inc\wincon.h +FILE 838 f:\sp\public\sdk\inc\ddbanned.h +FILE 839 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 840 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 841 f:\sp\public\sdk\inc\pshpack2.h +FILE 842 f:\sp\public\sdk\inc\mcx.h +FILE 843 f:\sp\public\sdk\inc\winuser.h +FILE 844 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 845 f:\sp\public\sdk\inc\winnls.h +FILE 846 f:\sp\public\sdk\inc\guiddef.h +FILE 847 f:\sp\public\sdk\inc\windows.h +FILE 848 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 849 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 850 f:\sp\public\sdk\inc\specstrings.h +FILE 851 f:\sp\public\sdk\inc\basetsd.h +FILE 852 f:\sp\public\sdk\inc\stralign.h +FILE 853 f:\sp\public\sdk\inc\tvout.h +FILE 854 f:\sp\public\sdk\inc\winsvc.h +FILE 855 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 856 f:\sp\public\sdk\inc\wingdi.h +FILE 857 f:\sp\public\sdk\inc\pshpack4.h +FILE 858 f:\sp\public\sdk\inc\pshpack1.h +FILE 859 f:\sp\public\sdk\inc\winver.h +FILE 860 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 861 f:\sp\public\sdk\inc\winnt.h +FILE 862 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 863 f:\sp\public\sdk\inc\winreg.h +FILE 864 f:\sp\public\sdk\inc\winbase.h +FILE 865 f:\sp\public\sdk\inc\winerror.h +FILE 866 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 867 f:\sp\public\sdk\inc\pshpack8.h +FILE 868 f:\sp\public\sdk\inc\reason.h +FILE 869 f:\sp\public\sdk\inc\wincon.h +FILE 870 f:\sp\public\sdk\inc\pshpack2.h +FILE 871 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0init.c +FILE 872 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 873 f:\sp\public\sdk\inc\mcx.h +FILE 874 f:\sp\public\sdk\inc\winuser.h +FILE 875 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 876 f:\sp\public\sdk\inc\winnls.h +FILE 877 f:\sp\public\sdk\inc\guiddef.h +FILE 878 f:\sp\public\sdk\inc\windows.h +FILE 879 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 880 f:\sp\public\sdk\inc\specstrings.h +FILE 881 f:\sp\public\sdk\inc\basetsd.h +FILE 882 f:\sp\public\sdk\inc\stralign.h +FILE 883 f:\sp\public\sdk\inc\tvout.h +FILE 884 f:\sp\public\sdk\inc\winsvc.h +FILE 885 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 886 f:\sp\public\sdk\inc\wingdi.h +FILE 887 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 888 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 889 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 890 f:\sp\public\sdk\inc\pshpack4.h +FILE 891 f:\sp\public\sdk\inc\ddbanned.h +FILE 892 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 893 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 894 f:\sp\public\sdk\inc\poppack.h +FILE 895 f:\sp\public\sdk\inc\winnetwk.h +FILE 896 f:\sp\public\sdk\inc\imm.h +FILE 897 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 898 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 899 f:\sp\public\sdk\inc\windef.h +FILE 900 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 901 f:\sp\public\sdk\inc\poppack.h +FILE 902 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 903 f:\sp\public\sdk\inc\winnetwk.h +FILE 904 f:\sp\public\sdk\inc\imm.h +FILE 905 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 906 f:\sp\public\sdk\inc\windef.h +FILE 907 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 908 f:\sp\public\sdk\inc\pshpack1.h +FILE 909 f:\sp\public\sdk\inc\winver.h +FILE 910 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 911 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 912 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 913 f:\sp\public\sdk\inc\winnt.h +FILE 914 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 915 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 916 f:\sp\public\sdk\inc\winreg.h +FILE 917 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0fp.c +FILE 918 f:\sp\public\sdk\inc\winbase.h +FILE 919 f:\sp\public\sdk\inc\winerror.h +FILE 920 f:\sp\public\sdk\inc\pshpack8.h +FILE 921 f:\sp\public\sdk\inc\reason.h +FILE 922 f:\sp\public\sdk\inc\wincon.h +FILE 923 f:\sp\public\sdk\inc\ddbanned.h +FILE 924 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 925 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 926 f:\sp\public\sdk\inc\pshpack2.h +FILE 927 f:\sp\public\sdk\inc\mcx.h +FILE 928 f:\sp\public\sdk\inc\winuser.h +FILE 929 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 930 f:\sp\public\sdk\inc\winnls.h +FILE 931 f:\sp\public\sdk\inc\guiddef.h +FILE 932 f:\sp\public\sdk\inc\windows.h +FILE 933 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 934 f:\sp\public\sdk\inc\specstrings.h +FILE 935 f:\sp\public\sdk\inc\basetsd.h +FILE 936 f:\sp\public\sdk\inc\stralign.h +FILE 937 f:\sp\public\sdk\inc\tvout.h +FILE 938 f:\sp\public\sdk\inc\winsvc.h +FILE 939 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 940 f:\sp\public\sdk\inc\wingdi.h +FILE 941 f:\sp\public\sdk\inc\pshpack4.h +FILE 942 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 943 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 944 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 945 f:\sp\public\sdk\inc\pshpack4.h +FILE 946 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 947 f:\sp\public\sdk\inc\reason.h +FILE 948 f:\sp\public\sdk\inc\wincon.h +FILE 949 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 950 f:\sp\public\sdk\inc\poppack.h +FILE 951 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 952 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 953 f:\sp\public\sdk\inc\mcx.h +FILE 954 f:\sp\public\sdk\inc\winuser.h +FILE 955 f:\sp\public\sdk\inc\winnls.h +FILE 956 f:\sp\public\sdk\inc\stralign.h +FILE 957 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 958 f:\sp\public\sdk\inc\windef.h +FILE 959 f:\sp\public\sdk\inc\tvout.h +FILE 960 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 961 f:\sp\public\sdk\inc\winsvc.h +FILE 962 f:\sp\public\sdk\inc\wingdi.h +FILE 963 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 964 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 965 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 966 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 967 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 968 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 969 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 970 f:\sp\public\sdk\inc\winnt.h +FILE 971 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 972 f:\sp\public\sdk\inc\winnetwk.h +FILE 973 f:\sp\public\sdk\inc\imm.h +FILE 974 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0dat.c +FILE 975 f:\sp\public\sdk\inc\winbase.h +FILE 976 f:\sp\public\sdk\inc\winerror.h +FILE 977 f:\sp\public\sdk\inc\pshpack1.h +FILE 978 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 979 f:\sp\public\sdk\inc\pshpack8.h +FILE 980 f:\sp\public\sdk\inc\winver.h +FILE 981 f:\sp\public\sdk\inc\ddbanned.h +FILE 982 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 983 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 984 f:\sp\vctools\crt_bld\self_x86\crt\src\dos.h +FILE 985 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 986 f:\sp\public\sdk\inc\pshpack2.h +FILE 987 f:\sp\public\sdk\inc\winreg.h +FILE 988 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 989 f:\sp\public\sdk\inc\guiddef.h +FILE 990 f:\sp\public\sdk\inc\windows.h +FILE 991 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 992 f:\sp\public\sdk\inc\specstrings.h +FILE 993 f:\sp\public\sdk\inc\basetsd.h +FILE 994 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 995 f:\sp\public\sdk\inc\tvout.h +FILE 996 f:\sp\public\sdk\inc\winsvc.h +FILE 997 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 998 f:\sp\public\sdk\inc\wingdi.h +FILE 999 f:\sp\public\sdk\inc\pshpack4.h +FILE 1000 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 1001 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 1002 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 1003 f:\sp\public\sdk\inc\poppack.h +FILE 1004 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 1005 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1006 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 1007 f:\sp\public\sdk\inc\winnetwk.h +FILE 1008 f:\sp\public\sdk\inc\imm.h +FILE 1009 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1010 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1011 f:\sp\public\sdk\inc\windef.h +FILE 1012 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1013 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1014 f:\sp\vctools\crt_bld\self_x86\crt\src\dos.h +FILE 1015 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1016 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1017 f:\sp\public\sdk\inc\pshpack1.h +FILE 1018 f:\sp\public\sdk\inc\winver.h +FILE 1019 f:\sp\public\sdk\inc\winnt.h +FILE 1020 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1021 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1022 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0.c +FILE 1023 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1024 f:\sp\public\sdk\inc\winreg.h +FILE 1025 f:\sp\public\sdk\inc\winbase.h +FILE 1026 f:\sp\public\sdk\inc\winerror.h +FILE 1027 f:\sp\public\sdk\inc\ddbanned.h +FILE 1028 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1029 f:\sp\public\sdk\inc\pshpack8.h +FILE 1030 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1031 f:\sp\public\sdk\inc\reason.h +FILE 1032 f:\sp\public\sdk\inc\wincon.h +FILE 1033 f:\sp\public\sdk\inc\pshpack2.h +FILE 1034 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1035 f:\sp\public\sdk\inc\mcx.h +FILE 1036 f:\sp\public\sdk\inc\winuser.h +FILE 1037 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1038 f:\sp\public\sdk\inc\winnls.h +FILE 1039 f:\sp\public\sdk\inc\guiddef.h +FILE 1040 f:\sp\public\sdk\inc\windows.h +FILE 1041 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1042 f:\sp\public\sdk\inc\specstrings.h +FILE 1043 f:\sp\public\sdk\inc\basetsd.h +FILE 1044 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 1045 f:\sp\public\sdk\inc\stralign.h +FILE 1046 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\alloca16.asm +FILE 1047 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 1048 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\chkstk.asm +FILE 1049 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 1050 f:\sp\public\sdk\inc\wincon.h +FILE 1051 f:\sp\public\sdk\inc\imm.h +FILE 1052 f:\sp\public\sdk\inc\winbase.h +FILE 1053 f:\sp\public\sdk\inc\wingdi.h +FILE 1054 f:\sp\public\sdk\inc\winver.h +FILE 1055 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 1056 f:\sp\public\sdk\inc\windows.h +FILE 1057 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 1058 f:\sp\public\sdk\inc\pshpack2.h +FILE 1059 f:\sp\public\sdk\inc\reason.h +FILE 1060 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\rtc\initsect.cpp +FILE 1061 f:\sp\public\sdk\inc\specstrings.h +FILE 1062 f:\sp\public\sdk\inc\basetsd.h +FILE 1063 f:\sp\public\sdk\inc\pshpack4.h +FILE 1064 f:\sp\public\sdk\inc\winnetwk.h +FILE 1065 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 1066 f:\sp\public\sdk\inc\stralign.h +FILE 1067 f:\sp\public\sdk\inc\poppack.h +FILE 1068 f:\sp\public\sdk\inc\winsvc.h +FILE 1069 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 1070 f:\sp\public\sdk\inc\windef.h +FILE 1071 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 1072 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 1073 f:\sp\public\sdk\inc\winuser.h +FILE 1074 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 1075 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 1076 f:\sp\public\sdk\inc\mcx.h +FILE 1077 f:\sp\public\sdk\inc\pshpack8.h +FILE 1078 f:\sp\public\sdk\inc\guiddef.h +FILE 1079 f:\sp\public\sdk\inc\winnt.h +FILE 1080 f:\sp\public\sdk\inc\winnls.h +FILE 1081 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 1082 f:\sp\public\sdk\inc\pshpack1.h +FILE 1083 f:\sp\public\sdk\inc\winerror.h +FILE 1084 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\rtcapi.h +FILE 1085 f:\sp\public\sdk\inc\winreg.h +FILE 1086 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 1087 f:\sp\public\sdk\inc\ddbanned.h +FILE 1088 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 1089 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 1090 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\rtcpriv.h +FILE 1091 f:\sp\public\sdk\inc\tvout.h +FILE 1092 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 1093 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 1094 f:\sp\public\sdk\inc\poppack.h +FILE 1095 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1096 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1097 f:\sp\public\sdk\inc\winnetwk.h +FILE 1098 f:\sp\public\sdk\inc\imm.h +FILE 1099 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1100 f:\sp\public\sdk\inc\windef.h +FILE 1101 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1102 f:\sp\public\sdk\inc\pshpack1.h +FILE 1103 f:\sp\public\sdk\inc\winver.h +FILE 1104 f:\sp\public\sdk\inc\windows.h +FILE 1105 f:\sp\public\sdk\inc\winnt.h +FILE 1106 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1107 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1108 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1109 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1110 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1111 f:\sp\public\sdk\inc\winreg.h +FILE 1112 f:\sp\public\sdk\inc\winbase.h +FILE 1113 f:\sp\vctools\crt_bld\self_x86\crt\src\wtombenv.c +FILE 1114 f:\sp\public\sdk\inc\winerror.h +FILE 1115 f:\sp\public\sdk\inc\pshpack8.h +FILE 1116 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1117 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1118 f:\sp\public\sdk\inc\reason.h +FILE 1119 f:\sp\public\sdk\inc\wincon.h +FILE 1120 f:\sp\public\sdk\inc\ddbanned.h +FILE 1121 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1122 f:\sp\public\sdk\inc\pshpack2.h +FILE 1123 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1124 f:\sp\public\sdk\inc\mcx.h +FILE 1125 f:\sp\public\sdk\inc\winuser.h +FILE 1126 f:\sp\public\sdk\inc\winnls.h +FILE 1127 f:\sp\public\sdk\inc\guiddef.h +FILE 1128 f:\sp\public\sdk\inc\specstrings.h +FILE 1129 f:\sp\public\sdk\inc\basetsd.h +FILE 1130 f:\sp\public\sdk\inc\stralign.h +FILE 1131 f:\sp\public\sdk\inc\tvout.h +FILE 1132 f:\sp\public\sdk\inc\winsvc.h +FILE 1133 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1134 f:\sp\public\sdk\inc\wingdi.h +FILE 1135 f:\sp\public\sdk\inc\pshpack4.h +FILE 1136 f:\sp\public\sdk\inc\winnt.h +FILE 1137 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1138 f:\sp\public\sdk\inc\winreg.h +FILE 1139 f:\sp\public\sdk\inc\winbase.h +FILE 1140 f:\sp\public\sdk\inc\winerror.h +FILE 1141 f:\sp\public\sdk\inc\pshpack8.h +FILE 1142 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1143 f:\sp\public\sdk\inc\reason.h +FILE 1144 f:\sp\public\sdk\inc\wincon.h +FILE 1145 f:\sp\vctools\crt_bld\self_x86\crt\src\float.h +FILE 1146 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1147 f:\sp\public\sdk\inc\pshpack2.h +FILE 1148 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1149 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1150 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1151 f:\sp\public\sdk\inc\mcx.h +FILE 1152 f:\sp\public\sdk\inc\winuser.h +FILE 1153 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1154 f:\sp\public\sdk\inc\winnls.h +FILE 1155 f:\sp\public\sdk\inc\guiddef.h +FILE 1156 f:\sp\public\sdk\inc\windows.h +FILE 1157 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1158 f:\sp\public\sdk\inc\specstrings.h +FILE 1159 f:\sp\public\sdk\inc\basetsd.h +FILE 1160 f:\sp\public\sdk\inc\stralign.h +FILE 1161 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1162 f:\sp\vctools\crt_bld\self_x86\crt\src\signal.h +FILE 1163 f:\sp\public\sdk\inc\tvout.h +FILE 1164 f:\sp\public\sdk\inc\winsvc.h +FILE 1165 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1166 f:\sp\vctools\crt_bld\self_x86\crt\src\winxfltr.c +FILE 1167 f:\sp\public\sdk\inc\wingdi.h +FILE 1168 f:\sp\public\sdk\inc\pshpack4.h +FILE 1169 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1170 f:\sp\public\sdk\inc\poppack.h +FILE 1171 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1172 f:\sp\public\sdk\inc\winnetwk.h +FILE 1173 f:\sp\public\sdk\inc\imm.h +FILE 1174 f:\sp\public\sdk\inc\ddbanned.h +FILE 1175 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1176 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1177 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1178 f:\sp\public\sdk\inc\windef.h +FILE 1179 f:\sp\vctools\crt_bld\self_x86\crt\src\crtwrn.h +FILE 1180 f:\sp\public\sdk\inc\pshpack1.h +FILE 1181 f:\sp\public\sdk\inc\winver.h +FILE 1182 f:\sp\public\sdk\inc\winnetwk.h +FILE 1183 f:\sp\public\sdk\inc\imm.h +FILE 1184 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1185 f:\sp\public\sdk\inc\windef.h +FILE 1186 f:\sp\public\sdk\inc\pshpack1.h +FILE 1187 f:\sp\public\sdk\inc\winver.h +FILE 1188 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1189 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1190 f:\sp\public\sdk\inc\winnt.h +FILE 1191 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1192 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1193 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1194 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1195 f:\sp\public\sdk\inc\winreg.h +FILE 1196 f:\sp\public\sdk\inc\winbase.h +FILE 1197 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1198 f:\sp\public\sdk\inc\winerror.h +FILE 1199 f:\sp\vctools\crt_bld\self_x86\crt\src\winsig.c +FILE 1200 f:\sp\public\sdk\inc\pshpack8.h +FILE 1201 f:\sp\public\sdk\inc\reason.h +FILE 1202 f:\sp\public\sdk\inc\wincon.h +FILE 1203 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1204 f:\sp\public\sdk\inc\pshpack2.h +FILE 1205 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1206 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1207 f:\sp\public\sdk\inc\mcx.h +FILE 1208 f:\sp\public\sdk\inc\winuser.h +FILE 1209 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1210 f:\sp\public\sdk\inc\winnls.h +FILE 1211 f:\sp\public\sdk\inc\guiddef.h +FILE 1212 f:\sp\public\sdk\inc\windows.h +FILE 1213 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1214 f:\sp\public\sdk\inc\specstrings.h +FILE 1215 f:\sp\public\sdk\inc\ddbanned.h +FILE 1216 f:\sp\public\sdk\inc\basetsd.h +FILE 1217 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1218 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1219 f:\sp\public\sdk\inc\stralign.h +FILE 1220 f:\sp\vctools\crt_bld\self_x86\crt\src\signal.h +FILE 1221 f:\sp\public\sdk\inc\tvout.h +FILE 1222 f:\sp\public\sdk\inc\winsvc.h +FILE 1223 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1224 f:\sp\public\sdk\inc\wingdi.h +FILE 1225 f:\sp\vctools\crt_bld\self_x86\crt\src\float.h +FILE 1226 f:\sp\vctools\crt_bld\self_x86\crt\src\crtwrn.h +FILE 1227 f:\sp\public\sdk\inc\pshpack4.h +FILE 1228 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1229 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1230 f:\sp\public\sdk\inc\poppack.h +FILE 1231 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1232 f:\sp\public\sdk\inc\wincon.h +FILE 1233 f:\sp\public\sdk\inc\imm.h +FILE 1234 f:\sp\public\sdk\inc\winbase.h +FILE 1235 f:\sp\public\sdk\inc\wingdi.h +FILE 1236 f:\sp\public\sdk\inc\winver.h +FILE 1237 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1238 f:\sp\public\sdk\inc\windows.h +FILE 1239 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1240 f:\sp\public\sdk\inc\pshpack2.h +FILE 1241 f:\sp\public\sdk\inc\reason.h +FILE 1242 f:\sp\vctools\crt_bld\self_x86\crt\src\w_str.c +FILE 1243 f:\sp\public\sdk\inc\specstrings.h +FILE 1244 f:\sp\public\sdk\inc\basetsd.h +FILE 1245 f:\sp\public\sdk\inc\pshpack4.h +FILE 1246 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1247 f:\sp\public\sdk\inc\winnetwk.h +FILE 1248 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1249 f:\sp\public\sdk\inc\stralign.h +FILE 1250 f:\sp\public\sdk\inc\poppack.h +FILE 1251 f:\sp\public\sdk\inc\winsvc.h +FILE 1252 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1253 f:\sp\public\sdk\inc\windef.h +FILE 1254 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1255 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1256 f:\sp\public\sdk\inc\winuser.h +FILE 1257 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1258 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1259 f:\sp\public\sdk\inc\mcx.h +FILE 1260 f:\sp\public\sdk\inc\pshpack8.h +FILE 1261 f:\sp\public\sdk\inc\guiddef.h +FILE 1262 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1263 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1264 f:\sp\public\sdk\inc\winnt.h +FILE 1265 f:\sp\public\sdk\inc\winnls.h +FILE 1266 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1267 f:\sp\public\sdk\inc\pshpack1.h +FILE 1268 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 1269 f:\sp\public\sdk\inc\winerror.h +FILE 1270 f:\sp\public\sdk\inc\winreg.h +FILE 1271 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1272 f:\sp\public\sdk\inc\ddbanned.h +FILE 1273 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1274 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1275 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1276 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1277 f:\sp\public\sdk\inc\tvout.h +FILE 1278 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1279 f:\sp\public\sdk\inc\wincon.h +FILE 1280 f:\sp\public\sdk\inc\imm.h +FILE 1281 f:\sp\public\sdk\inc\winbase.h +FILE 1282 f:\sp\public\sdk\inc\wingdi.h +FILE 1283 f:\sp\public\sdk\inc\winver.h +FILE 1284 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1285 f:\sp\public\sdk\inc\windows.h +FILE 1286 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1287 f:\sp\public\sdk\inc\pshpack2.h +FILE 1288 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1289 f:\sp\public\sdk\inc\reason.h +FILE 1290 f:\sp\vctools\crt_bld\self_x86\crt\src\w_loc.c +FILE 1291 f:\sp\public\sdk\inc\specstrings.h +FILE 1292 f:\sp\public\sdk\inc\basetsd.h +FILE 1293 f:\sp\public\sdk\inc\pshpack4.h +FILE 1294 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 1295 f:\sp\public\sdk\inc\winnetwk.h +FILE 1296 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1297 f:\sp\public\sdk\inc\stralign.h +FILE 1298 f:\sp\public\sdk\inc\poppack.h +FILE 1299 f:\sp\public\sdk\inc\winsvc.h +FILE 1300 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1301 f:\sp\public\sdk\inc\windef.h +FILE 1302 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1303 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1304 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1305 f:\sp\public\sdk\inc\winuser.h +FILE 1306 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1307 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1308 f:\sp\public\sdk\inc\mcx.h +FILE 1309 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1310 f:\sp\public\sdk\inc\pshpack8.h +FILE 1311 f:\sp\public\sdk\inc\guiddef.h +FILE 1312 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1313 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1314 f:\sp\public\sdk\inc\winnt.h +FILE 1315 f:\sp\public\sdk\inc\winnls.h +FILE 1316 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1317 f:\sp\public\sdk\inc\pshpack1.h +FILE 1318 f:\sp\public\sdk\inc\winerror.h +FILE 1319 f:\sp\public\sdk\inc\winreg.h +FILE 1320 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1321 f:\sp\public\sdk\inc\ddbanned.h +FILE 1322 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1323 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1324 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1325 f:\sp\public\sdk\inc\tvout.h +FILE 1326 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1327 f:\sp\public\sdk\inc\poppack.h +FILE 1328 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1329 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1330 f:\sp\public\sdk\inc\winnetwk.h +FILE 1331 f:\sp\public\sdk\inc\imm.h +FILE 1332 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1333 f:\sp\public\sdk\inc\windef.h +FILE 1334 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1335 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1336 f:\sp\public\sdk\inc\pshpack1.h +FILE 1337 f:\sp\public\sdk\inc\winver.h +FILE 1338 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1339 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 1340 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1341 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1342 f:\sp\public\sdk\inc\winnt.h +FILE 1343 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1344 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1345 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1346 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1347 f:\sp\public\sdk\inc\winreg.h +FILE 1348 f:\sp\vctools\crt_bld\self_x86\crt\src\convrtcp.c +FILE 1349 f:\sp\public\sdk\inc\winbase.h +FILE 1350 f:\sp\public\sdk\inc\winerror.h +FILE 1351 f:\sp\public\sdk\inc\pshpack8.h +FILE 1352 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1353 f:\sp\public\sdk\inc\reason.h +FILE 1354 f:\sp\public\sdk\inc\wincon.h +FILE 1355 f:\sp\public\sdk\inc\ddbanned.h +FILE 1356 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1357 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1358 f:\sp\public\sdk\inc\pshpack2.h +FILE 1359 f:\sp\public\sdk\inc\mcx.h +FILE 1360 f:\sp\public\sdk\inc\winuser.h +FILE 1361 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1362 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1363 f:\sp\public\sdk\inc\winnls.h +FILE 1364 f:\sp\public\sdk\inc\guiddef.h +FILE 1365 f:\sp\public\sdk\inc\windows.h +FILE 1366 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1367 f:\sp\public\sdk\inc\specstrings.h +FILE 1368 f:\sp\public\sdk\inc\basetsd.h +FILE 1369 f:\sp\public\sdk\inc\stralign.h +FILE 1370 f:\sp\public\sdk\inc\tvout.h +FILE 1371 f:\sp\public\sdk\inc\winsvc.h +FILE 1372 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1373 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1374 f:\sp\public\sdk\inc\wingdi.h +FILE 1375 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1376 f:\sp\public\sdk\inc\pshpack4.h +FILE 1377 f:\sp\public\sdk\inc\winerror.h +FILE 1378 f:\sp\public\sdk\inc\pshpack8.h +FILE 1379 f:\sp\public\sdk\inc\reason.h +FILE 1380 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 1381 f:\sp\public\sdk\inc\wincon.h +FILE 1382 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 1383 f:\sp\public\sdk\inc\pshpack2.h +FILE 1384 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1385 f:\sp\public\sdk\inc\mcx.h +FILE 1386 f:\sp\public\sdk\inc\winuser.h +FILE 1387 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1388 f:\sp\public\sdk\inc\winnls.h +FILE 1389 f:\sp\public\sdk\inc\guiddef.h +FILE 1390 f:\sp\public\sdk\inc\windows.h +FILE 1391 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 1392 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1393 f:\sp\public\sdk\inc\specstrings.h +FILE 1394 f:\sp\public\sdk\inc\basetsd.h +FILE 1395 f:\sp\public\sdk\inc\stralign.h +FILE 1396 f:\sp\public\sdk\inc\tvout.h +FILE 1397 f:\sp\public\sdk\inc\winsvc.h +FILE 1398 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1399 f:\sp\public\sdk\inc\wingdi.h +FILE 1400 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1401 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1402 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1403 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1404 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1405 f:\sp\public\sdk\inc\pshpack4.h +FILE 1406 f:\sp\public\sdk\inc\poppack.h +FILE 1407 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1408 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1409 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.c +FILE 1410 f:\sp\public\sdk\inc\winnetwk.h +FILE 1411 f:\sp\public\sdk\inc\imm.h +FILE 1412 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1413 f:\sp\public\sdk\inc\windef.h +FILE 1414 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1415 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1416 f:\sp\public\sdk\inc\pshpack1.h +FILE 1417 f:\sp\public\sdk\inc\ddbanned.h +FILE 1418 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1419 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1420 f:\sp\public\sdk\inc\winver.h +FILE 1421 f:\sp\public\sdk\inc\winnt.h +FILE 1422 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1423 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1424 f:\sp\public\sdk\inc\winreg.h +FILE 1425 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1426 f:\sp\public\sdk\inc\winbase.h +FILE 1427 f:\sp\public\sdk\inc\poppack.h +FILE 1428 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1429 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 1430 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1431 f:\sp\public\sdk\inc\winnetwk.h +FILE 1432 f:\sp\public\sdk\inc\imm.h +FILE 1433 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1434 f:\sp\public\sdk\inc\windef.h +FILE 1435 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 1436 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1437 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1438 f:\sp\public\sdk\inc\pshpack1.h +FILE 1439 f:\sp\public\sdk\inc\winver.h +FILE 1440 f:\sp\public\sdk\inc\windows.h +FILE 1441 f:\sp\public\sdk\inc\winnt.h +FILE 1442 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1443 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 1444 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1445 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1446 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1447 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1448 f:\sp\public\sdk\inc\winreg.h +FILE 1449 f:\sp\public\sdk\inc\winbase.h +FILE 1450 f:\sp\vctools\crt_bld\self_x86\crt\src\setenv.c +FILE 1451 f:\sp\public\sdk\inc\winerror.h +FILE 1452 f:\sp\public\sdk\inc\pshpack8.h +FILE 1453 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1454 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1455 f:\sp\public\sdk\inc\reason.h +FILE 1456 f:\sp\public\sdk\inc\wincon.h +FILE 1457 f:\sp\public\sdk\inc\ddbanned.h +FILE 1458 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1459 f:\sp\public\sdk\inc\pshpack2.h +FILE 1460 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1461 f:\sp\public\sdk\inc\mcx.h +FILE 1462 f:\sp\public\sdk\inc\winuser.h +FILE 1463 f:\sp\public\sdk\inc\winnls.h +FILE 1464 f:\sp\public\sdk\inc\guiddef.h +FILE 1465 f:\sp\public\sdk\inc\specstrings.h +FILE 1466 f:\sp\public\sdk\inc\basetsd.h +FILE 1467 f:\sp\public\sdk\inc\stralign.h +FILE 1468 f:\sp\public\sdk\inc\tvout.h +FILE 1469 f:\sp\public\sdk\inc\winsvc.h +FILE 1470 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1471 f:\sp\public\sdk\inc\wingdi.h +FILE 1472 f:\sp\public\sdk\inc\pshpack4.h +FILE 1473 f:\sp\public\sdk\inc\poppack.h +FILE 1474 f:\sp\public\sdk\inc\winnetwk.h +FILE 1475 f:\sp\public\sdk\inc\imm.h +FILE 1476 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1477 f:\sp\public\sdk\inc\windef.h +FILE 1478 f:\sp\public\sdk\inc\pshpack1.h +FILE 1479 f:\sp\public\sdk\inc\winver.h +FILE 1480 f:\sp\public\sdk\inc\windows.h +FILE 1481 f:\sp\public\sdk\inc\winnt.h +FILE 1482 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1483 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1484 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1485 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1486 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1487 f:\sp\public\sdk\inc\winreg.h +FILE 1488 f:\sp\public\sdk\inc\winbase.h +FILE 1489 f:\sp\vctools\crt_bld\self_x86\crt\src\rand_s.c +FILE 1490 f:\sp\public\sdk\inc\winerror.h +FILE 1491 f:\sp\public\sdk\inc\pshpack8.h +FILE 1492 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1493 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1494 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1495 f:\sp\public\sdk\inc\reason.h +FILE 1496 f:\sp\public\sdk\inc\wincon.h +FILE 1497 f:\sp\public\sdk\inc\ddbanned.h +FILE 1498 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1499 f:\sp\public\sdk\inc\pshpack2.h +FILE 1500 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1501 f:\sp\public\sdk\inc\mcx.h +FILE 1502 f:\sp\public\sdk\inc\winuser.h +FILE 1503 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1504 f:\sp\public\sdk\inc\winnls.h +FILE 1505 f:\sp\public\sdk\inc\guiddef.h +FILE 1506 f:\sp\public\sdk\inc\specstrings.h +FILE 1507 f:\sp\public\sdk\inc\basetsd.h +FILE 1508 f:\sp\public\sdk\inc\stralign.h +FILE 1509 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1510 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1511 f:\sp\public\sdk\inc\tvout.h +FILE 1512 f:\sp\public\sdk\inc\winsvc.h +FILE 1513 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1514 f:\sp\public\sdk\inc\wingdi.h +FILE 1515 f:\sp\public\sdk\inc\pshpack4.h +FILE 1516 f:\sp\public\sdk\inc\poppack.h +FILE 1517 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 1518 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1519 f:\sp\public\sdk\inc\winnetwk.h +FILE 1520 f:\sp\public\sdk\inc\imm.h +FILE 1521 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1522 f:\sp\public\sdk\inc\windef.h +FILE 1523 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1524 f:\sp\public\sdk\inc\pshpack1.h +FILE 1525 f:\sp\public\sdk\inc\winver.h +FILE 1526 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1527 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1528 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1529 f:\sp\public\sdk\inc\winnt.h +FILE 1530 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1531 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1532 f:\sp\public\sdk\inc\winreg.h +FILE 1533 f:\sp\vctools\crt_bld\self_x86\crt\src\purevirt.c +FILE 1534 f:\sp\public\sdk\inc\winbase.h +FILE 1535 f:\sp\public\sdk\inc\winerror.h +FILE 1536 f:\sp\public\sdk\inc\pshpack8.h +FILE 1537 f:\sp\public\sdk\inc\reason.h +FILE 1538 f:\sp\public\sdk\inc\wincon.h +FILE 1539 f:\sp\public\sdk\inc\ddbanned.h +FILE 1540 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1541 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1542 f:\sp\public\sdk\inc\pshpack2.h +FILE 1543 f:\sp\public\sdk\inc\mcx.h +FILE 1544 f:\sp\public\sdk\inc\winuser.h +FILE 1545 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1546 f:\sp\public\sdk\inc\winnls.h +FILE 1547 f:\sp\public\sdk\inc\guiddef.h +FILE 1548 f:\sp\public\sdk\inc\windows.h +FILE 1549 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1550 f:\sp\public\sdk\inc\specstrings.h +FILE 1551 f:\sp\public\sdk\inc\basetsd.h +FILE 1552 f:\sp\public\sdk\inc\stralign.h +FILE 1553 f:\sp\public\sdk\inc\tvout.h +FILE 1554 f:\sp\public\sdk\inc\winsvc.h +FILE 1555 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1556 f:\sp\public\sdk\inc\wingdi.h +FILE 1557 f:\sp\public\sdk\inc\pshpack4.h +FILE 1558 f:\sp\public\sdk\inc\poppack.h +FILE 1559 f:\sp\public\sdk\inc\winnetwk.h +FILE 1560 f:\sp\public\sdk\inc\imm.h +FILE 1561 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1562 f:\sp\public\sdk\inc\windef.h +FILE 1563 f:\sp\public\sdk\inc\pshpack1.h +FILE 1564 f:\sp\public\sdk\inc\winver.h +FILE 1565 f:\sp\public\sdk\inc\windows.h +FILE 1566 f:\sp\public\sdk\inc\winnt.h +FILE 1567 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1568 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1569 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1570 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1571 f:\sp\public\sdk\inc\winreg.h +FILE 1572 f:\sp\public\sdk\inc\winbase.h +FILE 1573 f:\sp\vctools\crt_bld\self_x86\crt\src\pesect.c +FILE 1574 f:\sp\public\sdk\inc\winerror.h +FILE 1575 f:\sp\public\sdk\inc\pshpack8.h +FILE 1576 f:\sp\public\sdk\inc\reason.h +FILE 1577 f:\sp\public\sdk\inc\wincon.h +FILE 1578 f:\sp\public\sdk\inc\ddbanned.h +FILE 1579 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1580 f:\sp\public\sdk\inc\pshpack2.h +FILE 1581 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1582 f:\sp\public\sdk\inc\mcx.h +FILE 1583 f:\sp\public\sdk\inc\winuser.h +FILE 1584 f:\sp\public\sdk\inc\winnls.h +FILE 1585 f:\sp\public\sdk\inc\guiddef.h +FILE 1586 f:\sp\public\sdk\inc\specstrings.h +FILE 1587 f:\sp\public\sdk\inc\basetsd.h +FILE 1588 f:\sp\public\sdk\inc\stralign.h +FILE 1589 f:\sp\public\sdk\inc\tvout.h +FILE 1590 f:\sp\public\sdk\inc\winsvc.h +FILE 1591 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1592 f:\sp\public\sdk\inc\wingdi.h +FILE 1593 f:\sp\public\sdk\inc\pshpack4.h +FILE 1594 f:\sp\public\sdk\inc\winerror.h +FILE 1595 f:\sp\public\sdk\inc\pshpack1.h +FILE 1596 f:\sp\public\sdk\inc\pshpack8.h +FILE 1597 f:\sp\public\sdk\inc\winver.h +FILE 1598 f:\sp\public\sdk\inc\pshpack2.h +FILE 1599 f:\sp\public\sdk\inc\winreg.h +FILE 1600 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1601 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1602 f:\sp\public\sdk\inc\guiddef.h +FILE 1603 f:\sp\public\sdk\inc\windows.h +FILE 1604 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1605 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 1606 f:\sp\public\sdk\inc\specstrings.h +FILE 1607 f:\sp\public\sdk\inc\basetsd.h +FILE 1608 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1609 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1610 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1611 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1612 f:\sp\public\sdk\inc\pshpack4.h +FILE 1613 f:\sp\public\sdk\inc\reason.h +FILE 1614 f:\sp\public\sdk\inc\wincon.h +FILE 1615 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1616 f:\sp\public\sdk\inc\poppack.h +FILE 1617 f:\sp\public\sdk\inc\mcx.h +FILE 1618 f:\sp\public\sdk\inc\winuser.h +FILE 1619 f:\sp\public\sdk\inc\winnls.h +FILE 1620 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsdata2.c +FILE 1621 f:\sp\public\sdk\inc\stralign.h +FILE 1622 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1623 f:\sp\public\sdk\inc\windef.h +FILE 1624 f:\sp\public\sdk\inc\tvout.h +FILE 1625 f:\sp\public\sdk\inc\winsvc.h +FILE 1626 f:\sp\public\sdk\inc\wingdi.h +FILE 1627 f:\sp\public\sdk\inc\ddbanned.h +FILE 1628 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1629 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1630 f:\sp\public\sdk\inc\winnt.h +FILE 1631 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1632 f:\sp\public\sdk\inc\winnetwk.h +FILE 1633 f:\sp\public\sdk\inc\imm.h +FILE 1634 f:\sp\public\sdk\inc\winbase.h +FILE 1635 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1636 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1637 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1638 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsdata1.c +FILE 1639 f:\sp\public\sdk\inc\ddbanned.h +FILE 1640 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1641 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1642 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1643 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsint.h +FILE 1644 f:\sp\public\sdk\inc\reason.h +FILE 1645 f:\sp\public\sdk\inc\wincon.h +FILE 1646 f:\sp\public\sdk\inc\pshpack2.h +FILE 1647 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1648 f:\sp\public\sdk\inc\mcx.h +FILE 1649 f:\sp\public\sdk\inc\winuser.h +FILE 1650 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1651 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 1652 f:\sp\public\sdk\inc\winnls.h +FILE 1653 f:\sp\public\sdk\inc\guiddef.h +FILE 1654 f:\sp\public\sdk\inc\windows.h +FILE 1655 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1656 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1657 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1658 f:\sp\public\sdk\inc\specstrings.h +FILE 1659 f:\sp\public\sdk\inc\basetsd.h +FILE 1660 f:\sp\public\sdk\inc\stralign.h +FILE 1661 f:\sp\public\sdk\inc\tvout.h +FILE 1662 f:\sp\public\sdk\inc\winsvc.h +FILE 1663 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1664 f:\sp\public\sdk\inc\wingdi.h +FILE 1665 f:\sp\public\sdk\inc\pshpack4.h +FILE 1666 f:\sp\public\sdk\inc\poppack.h +FILE 1667 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 1668 f:\sp\public\sdk\inc\winnetwk.h +FILE 1669 f:\sp\public\sdk\inc\imm.h +FILE 1670 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1671 f:\sp\public\sdk\inc\windef.h +FILE 1672 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1673 f:\sp\vctools\crt_bld\self_x86\crt\src\onexit.c +FILE 1674 f:\sp\public\sdk\inc\pshpack1.h +FILE 1675 f:\sp\public\sdk\inc\winver.h +FILE 1676 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1677 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1678 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1679 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1680 f:\sp\public\sdk\inc\winnt.h +FILE 1681 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1682 f:\sp\public\sdk\inc\ddbanned.h +FILE 1683 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1684 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1685 f:\sp\public\sdk\inc\winreg.h +FILE 1686 f:\sp\public\sdk\inc\winbase.h +FILE 1687 f:\sp\public\sdk\inc\winerror.h +FILE 1688 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1689 f:\sp\public\sdk\inc\pshpack8.h +FILE 1690 f:\sp\public\sdk\inc\winbase.h +FILE 1691 f:\sp\public\sdk\inc\winerror.h +FILE 1692 f:\sp\public\sdk\inc\pshpack1.h +FILE 1693 f:\sp\public\sdk\inc\pshpack8.h +FILE 1694 f:\sp\public\sdk\inc\winver.h +FILE 1695 f:\sp\public\sdk\inc\pshpack2.h +FILE 1696 f:\sp\public\sdk\inc\winreg.h +FILE 1697 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1698 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1699 f:\sp\public\sdk\inc\guiddef.h +FILE 1700 f:\sp\public\sdk\inc\windows.h +FILE 1701 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1702 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1703 f:\sp\public\sdk\inc\specstrings.h +FILE 1704 f:\sp\public\sdk\inc\basetsd.h +FILE 1705 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1706 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1707 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1708 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1709 f:\sp\public\sdk\inc\pshpack4.h +FILE 1710 f:\sp\public\sdk\inc\reason.h +FILE 1711 f:\sp\public\sdk\inc\wincon.h +FILE 1712 f:\sp\public\sdk\inc\poppack.h +FILE 1713 f:\sp\public\sdk\inc\mcx.h +FILE 1714 f:\sp\public\sdk\inc\winuser.h +FILE 1715 f:\sp\public\sdk\inc\winnls.h +FILE 1716 f:\sp\vctools\crt_bld\self_x86\crt\src\lconv.c +FILE 1717 f:\sp\public\sdk\inc\stralign.h +FILE 1718 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1719 f:\sp\public\sdk\inc\windef.h +FILE 1720 f:\sp\public\sdk\inc\tvout.h +FILE 1721 f:\sp\public\sdk\inc\winsvc.h +FILE 1722 f:\sp\public\sdk\inc\wingdi.h +FILE 1723 f:\sp\public\sdk\inc\ddbanned.h +FILE 1724 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1725 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1726 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1727 f:\sp\public\sdk\inc\winnt.h +FILE 1728 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1729 f:\sp\public\sdk\inc\winnetwk.h +FILE 1730 f:\sp\public\sdk\inc\imm.h +FILE 1731 f:\sp\public\sdk\inc\guiddef.h +FILE 1732 f:\sp\public\sdk\inc\winnt.h +FILE 1733 f:\sp\public\sdk\inc\winnls.h +FILE 1734 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1735 f:\sp\public\sdk\inc\pshpack1.h +FILE 1736 f:\sp\public\sdk\inc\winerror.h +FILE 1737 f:\sp\public\sdk\inc\winreg.h +FILE 1738 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1739 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 1740 f:\sp\public\sdk\inc\tvout.h +FILE 1741 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1742 f:\sp\vctools\crt_bld\self_x86\crt\src\invarg.c +FILE 1743 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1744 f:\sp\public\sdk\inc\wincon.h +FILE 1745 f:\sp\public\sdk\inc\imm.h +FILE 1746 f:\sp\public\sdk\inc\winbase.h +FILE 1747 f:\sp\public\sdk\inc\wingdi.h +FILE 1748 f:\sp\public\sdk\inc\winver.h +FILE 1749 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1750 f:\sp\public\sdk\inc\windows.h +FILE 1751 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1752 f:\sp\public\sdk\inc\pshpack2.h +FILE 1753 f:\sp\public\sdk\inc\reason.h +FILE 1754 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 1755 f:\sp\public\sdk\inc\specstrings.h +FILE 1756 f:\sp\public\sdk\inc\basetsd.h +FILE 1757 f:\sp\public\sdk\inc\pshpack4.h +FILE 1758 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1759 f:\sp\public\sdk\inc\winnetwk.h +FILE 1760 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1761 f:\sp\public\sdk\inc\stralign.h +FILE 1762 f:\sp\public\sdk\inc\poppack.h +FILE 1763 f:\sp\public\sdk\inc\winsvc.h +FILE 1764 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1765 f:\sp\public\sdk\inc\windef.h +FILE 1766 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1767 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1768 f:\sp\public\sdk\inc\winuser.h +FILE 1769 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1770 f:\sp\public\sdk\inc\ddbanned.h +FILE 1771 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1772 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1773 f:\sp\public\sdk\inc\mcx.h +FILE 1774 f:\sp\public\sdk\inc\pshpack8.h +FILE 1775 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1776 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1777 f:\sp\public\sdk\inc\pshpack4.h +FILE 1778 f:\sp\public\sdk\inc\poppack.h +FILE 1779 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1780 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1781 f:\sp\public\sdk\inc\winnetwk.h +FILE 1782 f:\sp\public\sdk\inc\imm.h +FILE 1783 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1784 f:\sp\public\sdk\inc\windef.h +FILE 1785 f:\sp\public\sdk\inc\pshpack1.h +FILE 1786 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1787 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1788 f:\sp\public\sdk\inc\winver.h +FILE 1789 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1790 f:\sp\public\sdk\inc\winnt.h +FILE 1791 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1792 f:\sp\public\sdk\inc\winreg.h +FILE 1793 f:\sp\vctools\crt_bld\self_x86\crt\src\inittime.c +FILE 1794 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1795 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1796 f:\sp\public\sdk\inc\winbase.h +FILE 1797 f:\sp\public\sdk\inc\winerror.h +FILE 1798 f:\sp\public\sdk\inc\pshpack8.h +FILE 1799 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1800 f:\sp\public\sdk\inc\reason.h +FILE 1801 f:\sp\public\sdk\inc\ddbanned.h +FILE 1802 f:\sp\public\sdk\inc\wincon.h +FILE 1803 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1804 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1805 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1806 f:\sp\public\sdk\inc\pshpack2.h +FILE 1807 f:\sp\public\sdk\inc\mcx.h +FILE 1808 f:\sp\public\sdk\inc\winuser.h +FILE 1809 f:\sp\public\sdk\inc\winnls.h +FILE 1810 f:\sp\public\sdk\inc\guiddef.h +FILE 1811 f:\sp\public\sdk\inc\stralign.h +FILE 1812 f:\sp\public\sdk\inc\specstrings.h +FILE 1813 f:\sp\public\sdk\inc\basetsd.h +FILE 1814 f:\sp\public\sdk\inc\windows.h +FILE 1815 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1816 f:\sp\public\sdk\inc\tvout.h +FILE 1817 f:\sp\public\sdk\inc\winsvc.h +FILE 1818 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1819 f:\sp\public\sdk\inc\wingdi.h +FILE 1820 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1821 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1822 f:\sp\public\sdk\inc\pshpack4.h +FILE 1823 f:\sp\public\sdk\inc\poppack.h +FILE 1824 f:\sp\public\sdk\inc\winnt.h +FILE 1825 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1826 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1827 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1828 f:\sp\public\sdk\inc\winnetwk.h +FILE 1829 f:\sp\public\sdk\inc\imm.h +FILE 1830 f:\sp\public\sdk\inc\pshpack1.h +FILE 1831 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1832 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1833 f:\sp\public\sdk\inc\winver.h +FILE 1834 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1835 f:\sp\public\sdk\inc\guiddef.h +FILE 1836 f:\sp\public\sdk\inc\specstrings.h +FILE 1837 f:\sp\public\sdk\inc\basetsd.h +FILE 1838 f:\sp\public\sdk\inc\windows.h +FILE 1839 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1840 f:\sp\public\sdk\inc\winreg.h +FILE 1841 f:\sp\vctools\crt_bld\self_x86\crt\src\initnum.c +FILE 1842 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsint.h +FILE 1843 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1844 f:\sp\public\sdk\inc\winbase.h +FILE 1845 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1846 f:\sp\public\sdk\inc\winerror.h +FILE 1847 f:\sp\public\sdk\inc\pshpack8.h +FILE 1848 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1849 f:\sp\public\sdk\inc\reason.h +FILE 1850 f:\sp\public\sdk\inc\ddbanned.h +FILE 1851 f:\sp\public\sdk\inc\wincon.h +FILE 1852 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1853 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1854 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1855 f:\sp\public\sdk\inc\pshpack2.h +FILE 1856 f:\sp\public\sdk\inc\mcx.h +FILE 1857 f:\sp\public\sdk\inc\winuser.h +FILE 1858 f:\sp\public\sdk\inc\winnls.h +FILE 1859 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1860 f:\sp\public\sdk\inc\windef.h +FILE 1861 f:\sp\public\sdk\inc\stralign.h +FILE 1862 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1863 f:\sp\public\sdk\inc\tvout.h +FILE 1864 f:\sp\public\sdk\inc\winsvc.h +FILE 1865 f:\sp\public\sdk\inc\wingdi.h +FILE 1866 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1867 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1868 f:\sp\public\sdk\inc\pshpack4.h +FILE 1869 f:\sp\public\sdk\inc\poppack.h +FILE 1870 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1871 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1872 f:\sp\public\sdk\inc\winnetwk.h +FILE 1873 f:\sp\public\sdk\inc\imm.h +FILE 1874 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1875 f:\sp\public\sdk\inc\windef.h +FILE 1876 f:\sp\public\sdk\inc\pshpack1.h +FILE 1877 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1878 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1879 f:\sp\public\sdk\inc\winver.h +FILE 1880 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1881 f:\sp\public\sdk\inc\winnt.h +FILE 1882 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1883 f:\sp\public\sdk\inc\winreg.h +FILE 1884 f:\sp\vctools\crt_bld\self_x86\crt\src\initmon.c +FILE 1885 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1886 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1887 f:\sp\public\sdk\inc\winbase.h +FILE 1888 f:\sp\public\sdk\inc\winerror.h +FILE 1889 f:\sp\public\sdk\inc\pshpack8.h +FILE 1890 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1891 f:\sp\public\sdk\inc\reason.h +FILE 1892 f:\sp\public\sdk\inc\ddbanned.h +FILE 1893 f:\sp\public\sdk\inc\wincon.h +FILE 1894 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1895 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1896 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1897 f:\sp\public\sdk\inc\pshpack2.h +FILE 1898 f:\sp\public\sdk\inc\mcx.h +FILE 1899 f:\sp\public\sdk\inc\winuser.h +FILE 1900 f:\sp\public\sdk\inc\winnls.h +FILE 1901 f:\sp\public\sdk\inc\guiddef.h +FILE 1902 f:\sp\public\sdk\inc\stralign.h +FILE 1903 f:\sp\public\sdk\inc\specstrings.h +FILE 1904 f:\sp\public\sdk\inc\basetsd.h +FILE 1905 f:\sp\public\sdk\inc\windows.h +FILE 1906 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1907 f:\sp\public\sdk\inc\tvout.h +FILE 1908 f:\sp\public\sdk\inc\winsvc.h +FILE 1909 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1910 f:\sp\public\sdk\inc\wingdi.h +FILE 1911 f:\sp\public\sdk\inc\winbase.h +FILE 1912 f:\sp\public\sdk\inc\winerror.h +FILE 1913 f:\sp\public\sdk\inc\pshpack1.h +FILE 1914 f:\sp\public\sdk\inc\pshpack8.h +FILE 1915 f:\sp\public\sdk\inc\winver.h +FILE 1916 f:\sp\public\sdk\inc\pshpack2.h +FILE 1917 f:\sp\public\sdk\inc\winreg.h +FILE 1918 f:\sp\public\sdk\inc\guiddef.h +FILE 1919 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 1920 f:\sp\public\sdk\inc\specstrings.h +FILE 1921 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1922 f:\sp\public\sdk\inc\basetsd.h +FILE 1923 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1924 f:\sp\public\sdk\inc\windows.h +FILE 1925 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1926 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1927 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1928 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1929 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1930 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1931 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1932 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1933 f:\sp\public\sdk\inc\pshpack4.h +FILE 1934 f:\sp\public\sdk\inc\reason.h +FILE 1935 f:\sp\public\sdk\inc\wincon.h +FILE 1936 f:\sp\public\sdk\inc\poppack.h +FILE 1937 f:\sp\vctools\crt_bld\self_x86\crt\src\inithelp.c +FILE 1938 f:\sp\public\sdk\inc\mcx.h +FILE 1939 f:\sp\public\sdk\inc\winuser.h +FILE 1940 f:\sp\public\sdk\inc\winnls.h +FILE 1941 f:\sp\public\sdk\inc\stralign.h +FILE 1942 f:\sp\public\sdk\inc\tvout.h +FILE 1943 f:\sp\public\sdk\inc\winsvc.h +FILE 1944 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1945 f:\sp\public\sdk\inc\wingdi.h +FILE 1946 f:\sp\public\sdk\inc\windef.h +FILE 1947 f:\sp\public\sdk\inc\ddbanned.h +FILE 1948 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1949 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1950 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1951 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1952 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1953 f:\sp\public\sdk\inc\winnetwk.h +FILE 1954 f:\sp\public\sdk\inc\imm.h +FILE 1955 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1956 f:\sp\public\sdk\inc\winnt.h +FILE 1957 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1958 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1959 f:\sp\public\sdk\inc\pshpack4.h +FILE 1960 f:\sp\public\sdk\inc\poppack.h +FILE 1961 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1962 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1963 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1964 f:\sp\public\sdk\inc\winnetwk.h +FILE 1965 f:\sp\public\sdk\inc\imm.h +FILE 1966 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1967 f:\sp\public\sdk\inc\windef.h +FILE 1968 f:\sp\public\sdk\inc\pshpack1.h +FILE 1969 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1970 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1971 f:\sp\public\sdk\inc\winver.h +FILE 1972 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1973 f:\sp\public\sdk\inc\winnt.h +FILE 1974 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1975 f:\sp\public\sdk\inc\winreg.h +FILE 1976 f:\sp\vctools\crt_bld\self_x86\crt\src\initctyp.c +FILE 1977 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 1978 f:\sp\public\sdk\inc\winbase.h +FILE 1979 f:\sp\public\sdk\inc\winerror.h +FILE 1980 f:\sp\public\sdk\inc\pshpack8.h +FILE 1981 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1982 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 1983 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1984 f:\sp\public\sdk\inc\reason.h +FILE 1985 f:\sp\public\sdk\inc\ddbanned.h +FILE 1986 f:\sp\public\sdk\inc\wincon.h +FILE 1987 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1988 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1989 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1990 f:\sp\public\sdk\inc\pshpack2.h +FILE 1991 f:\sp\public\sdk\inc\mcx.h +FILE 1992 f:\sp\public\sdk\inc\winuser.h +FILE 1993 f:\sp\public\sdk\inc\winnls.h +FILE 1994 f:\sp\public\sdk\inc\guiddef.h +FILE 1995 f:\sp\public\sdk\inc\stralign.h +FILE 1996 f:\sp\public\sdk\inc\specstrings.h +FILE 1997 f:\sp\public\sdk\inc\basetsd.h +FILE 1998 f:\sp\public\sdk\inc\windows.h +FILE 1999 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2000 f:\sp\public\sdk\inc\tvout.h +FILE 2001 f:\sp\public\sdk\inc\winsvc.h +FILE 2002 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2003 f:\sp\public\sdk\inc\wingdi.h +FILE 2004 f:\sp\public\sdk\inc\poppack.h +FILE 2005 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2006 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2007 f:\sp\public\sdk\inc\winnetwk.h +FILE 2008 f:\sp\public\sdk\inc\imm.h +FILE 2009 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2010 f:\sp\public\sdk\inc\windef.h +FILE 2011 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2012 f:\sp\public\sdk\inc\pshpack1.h +FILE 2013 f:\sp\public\sdk\inc\winver.h +FILE 2014 f:\sp\public\sdk\inc\windows.h +FILE 2015 f:\sp\public\sdk\inc\winnt.h +FILE 2016 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2017 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2018 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2019 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2020 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2021 f:\sp\public\sdk\inc\winreg.h +FILE 2022 f:\sp\public\sdk\inc\winbase.h +FILE 2023 f:\sp\vctools\crt_bld\self_x86\crt\src\initcrit.c +FILE 2024 f:\sp\public\sdk\inc\winerror.h +FILE 2025 f:\sp\public\sdk\inc\pshpack8.h +FILE 2026 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2027 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2028 f:\sp\public\sdk\inc\reason.h +FILE 2029 f:\sp\public\sdk\inc\wincon.h +FILE 2030 f:\sp\public\sdk\inc\ddbanned.h +FILE 2031 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2032 f:\sp\public\sdk\inc\pshpack2.h +FILE 2033 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2034 f:\sp\public\sdk\inc\mcx.h +FILE 2035 f:\sp\public\sdk\inc\winuser.h +FILE 2036 f:\sp\public\sdk\inc\winnls.h +FILE 2037 f:\sp\public\sdk\inc\guiddef.h +FILE 2038 f:\sp\public\sdk\inc\specstrings.h +FILE 2039 f:\sp\public\sdk\inc\basetsd.h +FILE 2040 f:\sp\public\sdk\inc\stralign.h +FILE 2041 f:\sp\public\sdk\inc\tvout.h +FILE 2042 f:\sp\public\sdk\inc\winsvc.h +FILE 2043 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2044 f:\sp\public\sdk\inc\wingdi.h +FILE 2045 f:\sp\public\sdk\inc\pshpack4.h +FILE 2046 f:\sp\public\sdk\inc\poppack.h +FILE 2047 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2048 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2049 f:\sp\public\sdk\inc\winnetwk.h +FILE 2050 f:\sp\public\sdk\inc\imm.h +FILE 2051 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2052 f:\sp\public\sdk\inc\windef.h +FILE 2053 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2054 f:\sp\public\sdk\inc\pshpack1.h +FILE 2055 f:\sp\public\sdk\inc\winver.h +FILE 2056 f:\sp\public\sdk\inc\windows.h +FILE 2057 f:\sp\public\sdk\inc\winnt.h +FILE 2058 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2059 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2060 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2061 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2062 f:\sp\public\sdk\inc\winreg.h +FILE 2063 f:\sp\public\sdk\inc\winbase.h +FILE 2064 f:\sp\vctools\crt_bld\self_x86\crt\src\initcoll.c +FILE 2065 f:\sp\public\sdk\inc\winerror.h +FILE 2066 f:\sp\public\sdk\inc\pshpack8.h +FILE 2067 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2068 f:\sp\public\sdk\inc\reason.h +FILE 2069 f:\sp\public\sdk\inc\wincon.h +FILE 2070 f:\sp\public\sdk\inc\ddbanned.h +FILE 2071 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2072 f:\sp\public\sdk\inc\pshpack2.h +FILE 2073 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2074 f:\sp\public\sdk\inc\mcx.h +FILE 2075 f:\sp\public\sdk\inc\winuser.h +FILE 2076 f:\sp\public\sdk\inc\winnls.h +FILE 2077 f:\sp\public\sdk\inc\guiddef.h +FILE 2078 f:\sp\public\sdk\inc\specstrings.h +FILE 2079 f:\sp\public\sdk\inc\basetsd.h +FILE 2080 f:\sp\public\sdk\inc\stralign.h +FILE 2081 f:\sp\public\sdk\inc\tvout.h +FILE 2082 f:\sp\public\sdk\inc\winsvc.h +FILE 2083 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2084 f:\sp\public\sdk\inc\wingdi.h +FILE 2085 f:\sp\public\sdk\inc\pshpack4.h +FILE 2086 f:\sp\public\sdk\inc\poppack.h +FILE 2087 f:\sp\public\sdk\inc\winnetwk.h +FILE 2088 f:\sp\public\sdk\inc\imm.h +FILE 2089 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2090 f:\sp\public\sdk\inc\windef.h +FILE 2091 f:\binaries.x86ret\vcboot\inc\mm3dnow.h +FILE 2092 f:\sp\public\sdk\inc\pshpack1.h +FILE 2093 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2094 f:\sp\public\sdk\inc\winver.h +FILE 2095 f:\sp\public\sdk\inc\windows.h +FILE 2096 f:\sp\public\sdk\inc\winnt.h +FILE 2097 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2098 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2099 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2100 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2101 f:\sp\public\sdk\inc\winreg.h +FILE 2102 f:\sp\public\sdk\inc\winbase.h +FILE 2103 f:\sp\vctools\crt_bld\self_x86\crt\src\gs_support.c +FILE 2104 f:\sp\public\sdk\inc\winerror.h +FILE 2105 f:\sp\public\sdk\inc\pshpack8.h +FILE 2106 f:\sp\vctools\crt_bld\self_x86\crt\src\intrin.h +FILE 2107 f:\sp\vctools\crt_bld\self_x86\crt\src\setjmp.h +FILE 2108 f:\sp\public\sdk\inc\reason.h +FILE 2109 f:\sp\public\sdk\inc\wincon.h +FILE 2110 f:\sp\public\sdk\inc\ddbanned.h +FILE 2111 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2112 f:\sp\public\sdk\inc\pshpack2.h +FILE 2113 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2114 f:\sp\public\sdk\inc\mcx.h +FILE 2115 f:\sp\public\sdk\inc\winuser.h +FILE 2116 f:\sp\public\sdk\inc\winnls.h +FILE 2117 f:\sp\public\sdk\inc\guiddef.h +FILE 2118 f:\sp\public\sdk\inc\specstrings.h +FILE 2119 f:\sp\public\sdk\inc\basetsd.h +FILE 2120 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2121 f:\sp\public\sdk\inc\stralign.h +FILE 2122 f:\sp\public\sdk\inc\tvout.h +FILE 2123 f:\sp\public\sdk\inc\winsvc.h +FILE 2124 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2125 f:\sp\public\sdk\inc\wingdi.h +FILE 2126 f:\binaries.x86ret\vcboot\inc\emmintrin.h +FILE 2127 f:\binaries.x86ret\vcboot\inc\xmmintrin.h +FILE 2128 f:\binaries.x86ret\vcboot\inc\mmintrin.h +FILE 2129 f:\sp\public\sdk\inc\pshpack4.h +FILE 2130 f:\sp\public\sdk\inc\poppack.h +FILE 2131 f:\sp\public\sdk\inc\winnetwk.h +FILE 2132 f:\sp\public\sdk\inc\imm.h +FILE 2133 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2134 f:\sp\public\sdk\inc\windef.h +FILE 2135 f:\sp\public\sdk\inc\pshpack1.h +FILE 2136 f:\sp\public\sdk\inc\winver.h +FILE 2137 f:\sp\public\sdk\inc\windows.h +FILE 2138 f:\sp\public\sdk\inc\winnt.h +FILE 2139 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2140 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2141 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2142 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2143 f:\sp\public\sdk\inc\winreg.h +FILE 2144 f:\sp\public\sdk\inc\winbase.h +FILE 2145 f:\sp\vctools\crt_bld\self_x86\crt\src\gs_report.c +FILE 2146 f:\sp\public\sdk\inc\winerror.h +FILE 2147 f:\sp\public\sdk\inc\pshpack8.h +FILE 2148 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2149 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2150 f:\sp\public\sdk\inc\reason.h +FILE 2151 f:\sp\public\sdk\inc\wincon.h +FILE 2152 f:\sp\public\sdk\inc\ddbanned.h +FILE 2153 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2154 f:\sp\public\sdk\inc\pshpack2.h +FILE 2155 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2156 f:\sp\public\sdk\inc\mcx.h +FILE 2157 f:\sp\public\sdk\inc\winuser.h +FILE 2158 f:\sp\public\sdk\inc\winnls.h +FILE 2159 f:\sp\public\sdk\inc\guiddef.h +FILE 2160 f:\sp\public\sdk\inc\specstrings.h +FILE 2161 f:\sp\public\sdk\inc\basetsd.h +FILE 2162 f:\sp\public\sdk\inc\stralign.h +FILE 2163 f:\sp\public\sdk\inc\tvout.h +FILE 2164 f:\sp\public\sdk\inc\winsvc.h +FILE 2165 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2166 f:\sp\public\sdk\inc\wingdi.h +FILE 2167 f:\sp\public\sdk\inc\pshpack4.h +FILE 2168 f:\sp\public\sdk\inc\poppack.h +FILE 2169 f:\sp\public\sdk\inc\winnetwk.h +FILE 2170 f:\sp\public\sdk\inc\imm.h +FILE 2171 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2172 f:\sp\public\sdk\inc\windef.h +FILE 2173 f:\sp\public\sdk\inc\pshpack1.h +FILE 2174 f:\sp\public\sdk\inc\winver.h +FILE 2175 f:\sp\public\sdk\inc\windows.h +FILE 2176 f:\sp\public\sdk\inc\winnt.h +FILE 2177 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2178 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2179 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2180 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2181 f:\sp\public\sdk\inc\winreg.h +FILE 2182 f:\sp\public\sdk\inc\winbase.h +FILE 2183 f:\sp\vctools\crt_bld\self_x86\crt\src\gs_cookie.c +FILE 2184 f:\sp\public\sdk\inc\winerror.h +FILE 2185 f:\sp\public\sdk\inc\pshpack8.h +FILE 2186 f:\sp\public\sdk\inc\reason.h +FILE 2187 f:\sp\public\sdk\inc\wincon.h +FILE 2188 f:\sp\public\sdk\inc\ddbanned.h +FILE 2189 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2190 f:\sp\public\sdk\inc\pshpack2.h +FILE 2191 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2192 f:\sp\public\sdk\inc\mcx.h +FILE 2193 f:\sp\public\sdk\inc\winuser.h +FILE 2194 f:\sp\public\sdk\inc\winnls.h +FILE 2195 f:\sp\public\sdk\inc\guiddef.h +FILE 2196 f:\sp\public\sdk\inc\specstrings.h +FILE 2197 f:\sp\public\sdk\inc\basetsd.h +FILE 2198 f:\sp\public\sdk\inc\stralign.h +FILE 2199 f:\sp\public\sdk\inc\tvout.h +FILE 2200 f:\sp\public\sdk\inc\winsvc.h +FILE 2201 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2202 f:\sp\public\sdk\inc\wingdi.h +FILE 2203 f:\sp\public\sdk\inc\pshpack4.h +FILE 2204 f:\sp\public\sdk\inc\winerror.h +FILE 2205 f:\sp\public\sdk\inc\pshpack1.h +FILE 2206 f:\sp\public\sdk\inc\pshpack8.h +FILE 2207 f:\sp\public\sdk\inc\winver.h +FILE 2208 f:\sp\public\sdk\inc\pshpack2.h +FILE 2209 f:\sp\public\sdk\inc\winreg.h +FILE 2210 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2211 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2212 f:\sp\public\sdk\inc\guiddef.h +FILE 2213 f:\sp\public\sdk\inc\windows.h +FILE 2214 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2215 f:\sp\public\sdk\inc\specstrings.h +FILE 2216 f:\sp\public\sdk\inc\basetsd.h +FILE 2217 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2218 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2219 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2220 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2221 f:\sp\public\sdk\inc\pshpack4.h +FILE 2222 f:\sp\public\sdk\inc\reason.h +FILE 2223 f:\sp\public\sdk\inc\wincon.h +FILE 2224 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2225 f:\sp\public\sdk\inc\poppack.h +FILE 2226 f:\sp\public\sdk\inc\mcx.h +FILE 2227 f:\sp\public\sdk\inc\winuser.h +FILE 2228 f:\sp\public\sdk\inc\winnls.h +FILE 2229 f:\sp\vctools\crt_bld\self_x86\crt\src\glstatus.c +FILE 2230 f:\sp\public\sdk\inc\stralign.h +FILE 2231 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2232 f:\sp\public\sdk\inc\windef.h +FILE 2233 f:\sp\public\sdk\inc\tvout.h +FILE 2234 f:\sp\public\sdk\inc\winsvc.h +FILE 2235 f:\sp\public\sdk\inc\wingdi.h +FILE 2236 f:\sp\public\sdk\inc\ddbanned.h +FILE 2237 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2238 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2239 f:\sp\public\sdk\inc\winnt.h +FILE 2240 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2241 f:\sp\public\sdk\inc\winnetwk.h +FILE 2242 f:\sp\public\sdk\inc\imm.h +FILE 2243 f:\sp\public\sdk\inc\winbase.h +FILE 2244 f:\sp\public\sdk\inc\pshpack4.h +FILE 2245 f:\sp\public\sdk\inc\poppack.h +FILE 2246 f:\sp\public\sdk\inc\winnt.h +FILE 2247 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2248 f:\sp\public\sdk\inc\winnetwk.h +FILE 2249 f:\sp\public\sdk\inc\imm.h +FILE 2250 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2251 f:\sp\public\sdk\inc\pshpack1.h +FILE 2252 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2253 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2254 f:\sp\public\sdk\inc\winver.h +FILE 2255 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2256 f:\sp\public\sdk\inc\guiddef.h +FILE 2257 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2258 f:\sp\public\sdk\inc\specstrings.h +FILE 2259 f:\sp\public\sdk\inc\basetsd.h +FILE 2260 f:\sp\public\sdk\inc\windows.h +FILE 2261 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2262 f:\sp\public\sdk\inc\winreg.h +FILE 2263 f:\sp\vctools\crt_bld\self_x86\crt\src\getqloc.c +FILE 2264 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2265 f:\sp\public\sdk\inc\winbase.h +FILE 2266 f:\sp\public\sdk\inc\winerror.h +FILE 2267 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2268 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2269 f:\sp\public\sdk\inc\pshpack8.h +FILE 2270 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2271 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2272 f:\sp\public\sdk\inc\reason.h +FILE 2273 f:\sp\public\sdk\inc\ddbanned.h +FILE 2274 f:\sp\public\sdk\inc\wincon.h +FILE 2275 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2276 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2277 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2278 f:\sp\public\sdk\inc\pshpack2.h +FILE 2279 f:\sp\public\sdk\inc\mcx.h +FILE 2280 f:\sp\public\sdk\inc\winuser.h +FILE 2281 f:\sp\public\sdk\inc\winnls.h +FILE 2282 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2283 f:\sp\public\sdk\inc\windef.h +FILE 2284 f:\sp\public\sdk\inc\stralign.h +FILE 2285 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2286 f:\sp\public\sdk\inc\tvout.h +FILE 2287 f:\sp\public\sdk\inc\winsvc.h +FILE 2288 f:\sp\public\sdk\inc\wingdi.h +FILE 2289 f:\sp\public\sdk\inc\reason.h +FILE 2290 f:\sp\public\sdk\inc\wincon.h +FILE 2291 f:\sp\public\sdk\inc\pshpack2.h +FILE 2292 f:\sp\public\sdk\inc\mcx.h +FILE 2293 f:\sp\public\sdk\inc\winuser.h +FILE 2294 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2295 f:\sp\public\sdk\inc\winnls.h +FILE 2296 f:\sp\public\sdk\inc\guiddef.h +FILE 2297 f:\sp\public\sdk\inc\windows.h +FILE 2298 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2299 f:\sp\public\sdk\inc\specstrings.h +FILE 2300 f:\sp\public\sdk\inc\basetsd.h +FILE 2301 f:\sp\public\sdk\inc\stralign.h +FILE 2302 f:\sp\public\sdk\inc\tvout.h +FILE 2303 f:\sp\public\sdk\inc\winsvc.h +FILE 2304 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2305 f:\sp\public\sdk\inc\wingdi.h +FILE 2306 f:\sp\public\sdk\inc\pshpack4.h +FILE 2307 f:\sp\public\sdk\inc\poppack.h +FILE 2308 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2309 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2310 f:\sp\public\sdk\inc\winnetwk.h +FILE 2311 f:\sp\public\sdk\inc\imm.h +FILE 2312 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2313 f:\sp\public\sdk\inc\windef.h +FILE 2314 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2315 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2316 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2317 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2318 f:\sp\vctools\crt_bld\self_x86\crt\src\getenv.c +FILE 2319 f:\sp\public\sdk\inc\pshpack1.h +FILE 2320 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2321 f:\sp\public\sdk\inc\winver.h +FILE 2322 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2323 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2324 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2325 f:\sp\public\sdk\inc\winnt.h +FILE 2326 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2327 f:\sp\public\sdk\inc\ddbanned.h +FILE 2328 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2329 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2330 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2331 f:\sp\public\sdk\inc\winreg.h +FILE 2332 f:\sp\public\sdk\inc\winbase.h +FILE 2333 f:\sp\public\sdk\inc\winerror.h +FILE 2334 f:\sp\public\sdk\inc\pshpack8.h +FILE 2335 f:\sp\public\sdk\inc\poppack.h +FILE 2336 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2337 f:\sp\public\sdk\inc\winnetwk.h +FILE 2338 f:\sp\public\sdk\inc\imm.h +FILE 2339 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2340 f:\sp\public\sdk\inc\windef.h +FILE 2341 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2342 f:\sp\public\sdk\inc\pshpack1.h +FILE 2343 f:\sp\public\sdk\inc\winver.h +FILE 2344 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2345 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2346 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2347 f:\sp\public\sdk\inc\winnt.h +FILE 2348 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2349 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2350 f:\sp\public\sdk\inc\winreg.h +FILE 2351 f:\sp\vctools\crt_bld\self_x86\crt\src\errmode.c +FILE 2352 f:\sp\public\sdk\inc\winbase.h +FILE 2353 f:\sp\public\sdk\inc\winerror.h +FILE 2354 f:\sp\public\sdk\inc\pshpack8.h +FILE 2355 f:\sp\public\sdk\inc\reason.h +FILE 2356 f:\sp\public\sdk\inc\wincon.h +FILE 2357 f:\sp\public\sdk\inc\ddbanned.h +FILE 2358 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2359 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2360 f:\sp\public\sdk\inc\pshpack2.h +FILE 2361 f:\sp\public\sdk\inc\mcx.h +FILE 2362 f:\sp\public\sdk\inc\winuser.h +FILE 2363 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2364 f:\sp\public\sdk\inc\winnls.h +FILE 2365 f:\sp\public\sdk\inc\guiddef.h +FILE 2366 f:\sp\public\sdk\inc\windows.h +FILE 2367 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2368 f:\sp\public\sdk\inc\specstrings.h +FILE 2369 f:\sp\public\sdk\inc\basetsd.h +FILE 2370 f:\sp\public\sdk\inc\stralign.h +FILE 2371 f:\sp\public\sdk\inc\tvout.h +FILE 2372 f:\sp\public\sdk\inc\winsvc.h +FILE 2373 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2374 f:\sp\public\sdk\inc\wingdi.h +FILE 2375 f:\sp\public\sdk\inc\pshpack4.h +FILE 2376 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2377 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2378 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2379 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2380 f:\sp\vctools\crt_bld\self_x86\crt\src\dbghook.c +FILE 2381 f:\sp\public\sdk\inc\ddbanned.h +FILE 2382 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2383 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2384 f:\sp\public\sdk\inc\poppack.h +FILE 2385 f:\sp\public\sdk\inc\winnetwk.h +FILE 2386 f:\sp\public\sdk\inc\imm.h +FILE 2387 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2388 f:\sp\public\sdk\inc\windef.h +FILE 2389 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2390 f:\sp\public\sdk\inc\pshpack1.h +FILE 2391 f:\sp\public\sdk\inc\winver.h +FILE 2392 f:\sp\public\sdk\inc\windows.h +FILE 2393 f:\sp\public\sdk\inc\winnt.h +FILE 2394 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2395 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2396 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2397 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2398 f:\sp\public\sdk\inc\winreg.h +FILE 2399 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 2400 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.c +FILE 2401 f:\sp\public\sdk\inc\winbase.h +FILE 2402 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 2403 f:\sp\public\sdk\inc\winerror.h +FILE 2404 f:\sp\public\sdk\inc\pshpack8.h +FILE 2405 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2406 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2407 f:\sp\public\sdk\inc\reason.h +FILE 2408 f:\sp\public\sdk\inc\wincon.h +FILE 2409 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2410 f:\sp\public\sdk\inc\ddbanned.h +FILE 2411 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2412 f:\sp\public\sdk\inc\pshpack2.h +FILE 2413 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2414 f:\sp\public\sdk\inc\mcx.h +FILE 2415 f:\sp\public\sdk\inc\winuser.h +FILE 2416 f:\sp\public\sdk\inc\winnls.h +FILE 2417 f:\sp\public\sdk\inc\guiddef.h +FILE 2418 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2419 f:\sp\public\sdk\inc\specstrings.h +FILE 2420 f:\sp\public\sdk\inc\basetsd.h +FILE 2421 f:\sp\public\sdk\inc\stralign.h +FILE 2422 f:\sp\public\sdk\inc\tvout.h +FILE 2423 f:\sp\public\sdk\inc\winsvc.h +FILE 2424 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2425 f:\sp\public\sdk\inc\wingdi.h +FILE 2426 f:\sp\public\sdk\inc\pshpack4.h +FILE 2427 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2428 f:\sp\public\sdk\inc\mcx.h +FILE 2429 f:\sp\public\sdk\inc\winuser.h +FILE 2430 f:\sp\public\sdk\inc\winnls.h +FILE 2431 f:\sp\public\sdk\inc\stralign.h +FILE 2432 f:\sp\public\sdk\inc\tvout.h +FILE 2433 f:\sp\public\sdk\inc\winsvc.h +FILE 2434 f:\sp\public\sdk\inc\wingdi.h +FILE 2435 f:\sp\public\sdk\inc\pshpack4.h +FILE 2436 f:\sp\public\sdk\inc\winnt.h +FILE 2437 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2438 f:\sp\public\sdk\inc\poppack.h +FILE 2439 f:\sp\public\sdk\inc\winnetwk.h +FILE 2440 f:\sp\public\sdk\inc\imm.h +FILE 2441 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2442 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2443 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2444 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2445 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2446 f:\sp\public\sdk\inc\pshpack1.h +FILE 2447 f:\sp\vctools\crt_bld\self_x86\crt\src\crtmbox.c +FILE 2448 f:\sp\public\sdk\inc\winver.h +FILE 2449 f:\sp\public\sdk\inc\guiddef.h +FILE 2450 f:\sp\public\sdk\inc\windows.h +FILE 2451 f:\sp\public\sdk\inc\specstrings.h +FILE 2452 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2453 f:\sp\public\sdk\inc\basetsd.h +FILE 2454 f:\sp\public\sdk\inc\winreg.h +FILE 2455 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2456 f:\sp\public\sdk\inc\winbase.h +FILE 2457 f:\sp\public\sdk\inc\ddbanned.h +FILE 2458 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2459 f:\sp\public\sdk\inc\winerror.h +FILE 2460 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2461 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2462 f:\sp\public\sdk\inc\pshpack8.h +FILE 2463 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2464 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2465 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2466 f:\sp\public\sdk\inc\reason.h +FILE 2467 f:\sp\public\sdk\inc\wincon.h +FILE 2468 f:\sp\public\sdk\inc\pshpack2.h +FILE 2469 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2470 f:\sp\public\sdk\inc\windef.h +FILE 2471 f:\sp\public\sdk\inc\poppack.h +FILE 2472 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 2473 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2474 f:\sp\public\sdk\inc\winnetwk.h +FILE 2475 f:\sp\public\sdk\inc\imm.h +FILE 2476 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2477 f:\sp\public\sdk\inc\windef.h +FILE 2478 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2479 f:\sp\public\sdk\inc\pshpack1.h +FILE 2480 f:\sp\public\sdk\inc\winver.h +FILE 2481 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2482 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2483 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2484 f:\sp\public\sdk\inc\winnt.h +FILE 2485 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2486 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2487 f:\sp\public\sdk\inc\winreg.h +FILE 2488 f:\sp\vctools\crt_bld\self_x86\crt\src\cmiscdat.c +FILE 2489 f:\sp\public\sdk\inc\winbase.h +FILE 2490 f:\sp\public\sdk\inc\winerror.h +FILE 2491 f:\sp\public\sdk\inc\pshpack8.h +FILE 2492 f:\sp\public\sdk\inc\reason.h +FILE 2493 f:\sp\public\sdk\inc\wincon.h +FILE 2494 f:\sp\public\sdk\inc\ddbanned.h +FILE 2495 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2496 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2497 f:\sp\public\sdk\inc\pshpack2.h +FILE 2498 f:\sp\public\sdk\inc\mcx.h +FILE 2499 f:\sp\public\sdk\inc\winuser.h +FILE 2500 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2501 f:\sp\public\sdk\inc\winnls.h +FILE 2502 f:\sp\public\sdk\inc\guiddef.h +FILE 2503 f:\sp\public\sdk\inc\windows.h +FILE 2504 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2505 f:\sp\public\sdk\inc\specstrings.h +FILE 2506 f:\sp\public\sdk\inc\basetsd.h +FILE 2507 f:\sp\public\sdk\inc\stralign.h +FILE 2508 f:\sp\public\sdk\inc\tvout.h +FILE 2509 f:\sp\public\sdk\inc\winsvc.h +FILE 2510 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2511 f:\sp\public\sdk\inc\wingdi.h +FILE 2512 f:\sp\public\sdk\inc\pshpack4.h +FILE 2513 f:\sp\public\sdk\inc\pshpack4.h +FILE 2514 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2515 f:\sp\vctools\crt_bld\self_x86\crt\src\signal.h +FILE 2516 f:\sp\public\sdk\inc\poppack.h +FILE 2517 f:\sp\public\sdk\inc\winnetwk.h +FILE 2518 f:\sp\public\sdk\inc\imm.h +FILE 2519 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2520 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2521 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2522 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2523 f:\sp\public\sdk\inc\windef.h +FILE 2524 f:\sp\public\sdk\inc\pshpack1.h +FILE 2525 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2526 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2527 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2528 f:\sp\public\sdk\inc\winver.h +FILE 2529 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2530 f:\sp\public\sdk\inc\winnt.h +FILE 2531 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2532 f:\sp\public\sdk\inc\winreg.h +FILE 2533 f:\sp\vctools\crt_bld\self_x86\crt\src\abort.c +FILE 2534 f:\sp\public\sdk\inc\winbase.h +FILE 2535 f:\sp\public\sdk\inc\winerror.h +FILE 2536 f:\sp\public\sdk\inc\pshpack8.h +FILE 2537 f:\sp\public\sdk\inc\reason.h +FILE 2538 f:\sp\public\sdk\inc\ddbanned.h +FILE 2539 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2540 f:\sp\public\sdk\inc\wincon.h +FILE 2541 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2542 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2543 f:\sp\public\sdk\inc\pshpack2.h +FILE 2544 f:\sp\public\sdk\inc\mcx.h +FILE 2545 f:\sp\public\sdk\inc\winuser.h +FILE 2546 f:\sp\public\sdk\inc\winnls.h +FILE 2547 f:\sp\public\sdk\inc\guiddef.h +FILE 2548 f:\sp\public\sdk\inc\stralign.h +FILE 2549 f:\sp\public\sdk\inc\specstrings.h +FILE 2550 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2551 f:\sp\public\sdk\inc\basetsd.h +FILE 2552 f:\sp\public\sdk\inc\windows.h +FILE 2553 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2554 f:\sp\public\sdk\inc\tvout.h +FILE 2555 f:\sp\public\sdk\inc\winsvc.h +FILE 2556 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2557 f:\sp\public\sdk\inc\wingdi.h +FILE 2558 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2559 f:\sp\public\sdk\inc\wincon.h +FILE 2560 f:\sp\public\sdk\inc\imm.h +FILE 2561 f:\sp\public\sdk\inc\winbase.h +FILE 2562 f:\sp\public\sdk\inc\wingdi.h +FILE 2563 f:\sp\public\sdk\inc\winver.h +FILE 2564 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2565 f:\sp\public\sdk\inc\windows.h +FILE 2566 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2567 f:\sp\public\sdk\inc\pshpack2.h +FILE 2568 f:\sp\public\sdk\inc\reason.h +FILE 2569 f:\sp\vctools\crt_bld\self_x86\crt\src\a_str.c +FILE 2570 f:\sp\public\sdk\inc\specstrings.h +FILE 2571 f:\sp\public\sdk\inc\basetsd.h +FILE 2572 f:\sp\public\sdk\inc\pshpack4.h +FILE 2573 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2574 f:\sp\public\sdk\inc\winnetwk.h +FILE 2575 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2576 f:\sp\public\sdk\inc\stralign.h +FILE 2577 f:\sp\public\sdk\inc\poppack.h +FILE 2578 f:\sp\public\sdk\inc\winsvc.h +FILE 2579 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2580 f:\sp\public\sdk\inc\windef.h +FILE 2581 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2582 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2583 f:\sp\public\sdk\inc\winuser.h +FILE 2584 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2585 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2586 f:\sp\public\sdk\inc\mcx.h +FILE 2587 f:\sp\public\sdk\inc\pshpack8.h +FILE 2588 f:\sp\public\sdk\inc\guiddef.h +FILE 2589 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2590 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2591 f:\sp\public\sdk\inc\winnt.h +FILE 2592 f:\sp\public\sdk\inc\winnls.h +FILE 2593 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2594 f:\sp\public\sdk\inc\pshpack1.h +FILE 2595 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2596 f:\sp\public\sdk\inc\winerror.h +FILE 2597 f:\sp\public\sdk\inc\winreg.h +FILE 2598 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2599 f:\sp\public\sdk\inc\ddbanned.h +FILE 2600 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2601 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2602 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2603 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2604 f:\sp\public\sdk\inc\tvout.h +FILE 2605 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2606 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2607 f:\sp\public\sdk\inc\wincon.h +FILE 2608 f:\sp\public\sdk\inc\imm.h +FILE 2609 f:\sp\public\sdk\inc\winbase.h +FILE 2610 f:\sp\public\sdk\inc\wingdi.h +FILE 2611 f:\sp\public\sdk\inc\winver.h +FILE 2612 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2613 f:\sp\public\sdk\inc\windows.h +FILE 2614 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2615 f:\sp\public\sdk\inc\pshpack2.h +FILE 2616 f:\sp\public\sdk\inc\reason.h +FILE 2617 f:\sp\vctools\crt_bld\self_x86\crt\src\a_map.c +FILE 2618 f:\sp\public\sdk\inc\specstrings.h +FILE 2619 f:\sp\public\sdk\inc\basetsd.h +FILE 2620 f:\sp\public\sdk\inc\pshpack4.h +FILE 2621 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2622 f:\sp\public\sdk\inc\winnetwk.h +FILE 2623 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2624 f:\sp\public\sdk\inc\stralign.h +FILE 2625 f:\sp\public\sdk\inc\poppack.h +FILE 2626 f:\sp\public\sdk\inc\winsvc.h +FILE 2627 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2628 f:\sp\public\sdk\inc\windef.h +FILE 2629 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2630 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2631 f:\sp\public\sdk\inc\winuser.h +FILE 2632 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2633 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2634 f:\sp\public\sdk\inc\mcx.h +FILE 2635 f:\sp\public\sdk\inc\pshpack8.h +FILE 2636 f:\sp\public\sdk\inc\guiddef.h +FILE 2637 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2638 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2639 f:\sp\public\sdk\inc\winnt.h +FILE 2640 f:\sp\public\sdk\inc\winnls.h +FILE 2641 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2642 f:\sp\public\sdk\inc\pshpack1.h +FILE 2643 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2644 f:\sp\public\sdk\inc\winerror.h +FILE 2645 f:\sp\public\sdk\inc\winreg.h +FILE 2646 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2647 f:\sp\public\sdk\inc\ddbanned.h +FILE 2648 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2649 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2650 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2651 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2652 f:\sp\public\sdk\inc\tvout.h +FILE 2653 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2654 f:\sp\public\sdk\inc\wincon.h +FILE 2655 f:\sp\public\sdk\inc\imm.h +FILE 2656 f:\sp\public\sdk\inc\winbase.h +FILE 2657 f:\sp\public\sdk\inc\wingdi.h +FILE 2658 f:\sp\public\sdk\inc\winver.h +FILE 2659 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2660 f:\sp\public\sdk\inc\windows.h +FILE 2661 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2662 f:\sp\public\sdk\inc\pshpack2.h +FILE 2663 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2664 f:\sp\public\sdk\inc\reason.h +FILE 2665 f:\sp\vctools\crt_bld\self_x86\crt\src\a_loc.c +FILE 2666 f:\sp\public\sdk\inc\specstrings.h +FILE 2667 f:\sp\public\sdk\inc\basetsd.h +FILE 2668 f:\sp\public\sdk\inc\pshpack4.h +FILE 2669 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2670 f:\sp\public\sdk\inc\winnetwk.h +FILE 2671 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2672 f:\sp\public\sdk\inc\stralign.h +FILE 2673 f:\sp\public\sdk\inc\poppack.h +FILE 2674 f:\sp\public\sdk\inc\winsvc.h +FILE 2675 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2676 f:\sp\public\sdk\inc\windef.h +FILE 2677 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2678 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2679 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2680 f:\sp\public\sdk\inc\winuser.h +FILE 2681 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2682 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2683 f:\sp\public\sdk\inc\mcx.h +FILE 2684 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2685 f:\sp\public\sdk\inc\pshpack8.h +FILE 2686 f:\sp\public\sdk\inc\guiddef.h +FILE 2687 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2688 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2689 f:\sp\public\sdk\inc\winnt.h +FILE 2690 f:\sp\public\sdk\inc\winnls.h +FILE 2691 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2692 f:\sp\public\sdk\inc\pshpack1.h +FILE 2693 f:\sp\public\sdk\inc\winerror.h +FILE 2694 f:\sp\public\sdk\inc\winreg.h +FILE 2695 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2696 f:\sp\public\sdk\inc\ddbanned.h +FILE 2697 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2698 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2699 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2700 f:\sp\public\sdk\inc\tvout.h +FILE 2701 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2702 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2703 f:\sp\public\sdk\inc\poppack.h +FILE 2704 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2705 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2706 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2707 f:\sp\public\sdk\inc\winnetwk.h +FILE 2708 f:\sp\public\sdk\inc\imm.h +FILE 2709 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2710 f:\sp\public\sdk\inc\windef.h +FILE 2711 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2712 f:\sp\public\sdk\inc\pshpack1.h +FILE 2713 f:\sp\public\sdk\inc\winver.h +FILE 2714 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2715 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2716 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2717 f:\sp\public\sdk\inc\winnt.h +FILE 2718 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2719 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2720 f:\sp\public\sdk\inc\winreg.h +FILE 2721 f:\sp\vctools\crt_bld\self_x86\crt\src\a_env.c +FILE 2722 f:\sp\public\sdk\inc\winbase.h +FILE 2723 f:\sp\public\sdk\inc\winerror.h +FILE 2724 f:\sp\public\sdk\inc\pshpack8.h +FILE 2725 f:\sp\public\sdk\inc\reason.h +FILE 2726 f:\sp\public\sdk\inc\wincon.h +FILE 2727 f:\sp\public\sdk\inc\ddbanned.h +FILE 2728 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2729 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2730 f:\sp\public\sdk\inc\pshpack2.h +FILE 2731 f:\sp\public\sdk\inc\mcx.h +FILE 2732 f:\sp\public\sdk\inc\winuser.h +FILE 2733 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2734 f:\sp\public\sdk\inc\winnls.h +FILE 2735 f:\sp\public\sdk\inc\guiddef.h +FILE 2736 f:\sp\public\sdk\inc\windows.h +FILE 2737 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2738 f:\sp\public\sdk\inc\specstrings.h +FILE 2739 f:\sp\public\sdk\inc\basetsd.h +FILE 2740 f:\sp\public\sdk\inc\stralign.h +FILE 2741 f:\sp\public\sdk\inc\tvout.h +FILE 2742 f:\sp\public\sdk\inc\winsvc.h +FILE 2743 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2744 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2745 f:\sp\public\sdk\inc\wingdi.h +FILE 2746 f:\sp\public\sdk\inc\pshpack4.h +FILE 2747 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2748 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2749 f:\sp\public\sdk\inc\wincon.h +FILE 2750 f:\sp\public\sdk\inc\imm.h +FILE 2751 f:\sp\public\sdk\inc\winbase.h +FILE 2752 f:\sp\public\sdk\inc\wingdi.h +FILE 2753 f:\sp\public\sdk\inc\winver.h +FILE 2754 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2755 f:\sp\public\sdk\inc\windows.h +FILE 2756 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2757 f:\sp\public\sdk\inc\pshpack2.h +FILE 2758 f:\sp\public\sdk\inc\reason.h +FILE 2759 f:\sp\vctools\crt_bld\self_x86\crt\src\a_cmp.c +FILE 2760 f:\sp\public\sdk\inc\specstrings.h +FILE 2761 f:\sp\public\sdk\inc\basetsd.h +FILE 2762 f:\sp\public\sdk\inc\pshpack4.h +FILE 2763 f:\sp\public\sdk\inc\winnetwk.h +FILE 2764 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2765 f:\sp\public\sdk\inc\stralign.h +FILE 2766 f:\sp\public\sdk\inc\poppack.h +FILE 2767 f:\sp\public\sdk\inc\winsvc.h +FILE 2768 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2769 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2770 f:\sp\public\sdk\inc\windef.h +FILE 2771 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2772 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2773 f:\sp\public\sdk\inc\winuser.h +FILE 2774 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2775 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2776 f:\sp\public\sdk\inc\mcx.h +FILE 2777 f:\sp\public\sdk\inc\pshpack8.h +FILE 2778 f:\sp\public\sdk\inc\guiddef.h +FILE 2779 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2780 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2781 f:\sp\public\sdk\inc\winnt.h +FILE 2782 f:\sp\public\sdk\inc\winnls.h +FILE 2783 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2784 f:\sp\public\sdk\inc\pshpack1.h +FILE 2785 f:\sp\public\sdk\inc\winerror.h +FILE 2786 f:\sp\public\sdk\inc\winreg.h +FILE 2787 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2788 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2789 f:\sp\public\sdk\inc\ddbanned.h +FILE 2790 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2791 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2792 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2793 f:\sp\public\sdk\inc\tvout.h +FILE 2794 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2795 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\sehprolg4.asm +FILE 2796 f:\sp\public\sdk\inc\poppack.h +FILE 2797 f:\sp\public\sdk\inc\winnetwk.h +FILE 2798 f:\sp\public\sdk\inc\imm.h +FILE 2799 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2800 f:\sp\public\sdk\inc\windef.h +FILE 2801 f:\sp\public\sdk\inc\pshpack1.h +FILE 2802 f:\sp\public\sdk\inc\winver.h +FILE 2803 f:\sp\public\sdk\inc\windows.h +FILE 2804 f:\sp\public\sdk\inc\winnt.h +FILE 2805 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2806 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2807 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2808 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2809 f:\sp\public\sdk\inc\winreg.h +FILE 2810 f:\sp\public\sdk\inc\winbase.h +FILE 2811 f:\sp\vctools\crt_bld\self_x86\crt\src\intel\secchk.c +FILE 2812 f:\sp\public\sdk\inc\winerror.h +FILE 2813 f:\sp\public\sdk\inc\pshpack8.h +FILE 2814 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 2815 f:\sp\public\sdk\inc\reason.h +FILE 2816 f:\sp\public\sdk\inc\wincon.h +FILE 2817 f:\sp\public\sdk\inc\ddbanned.h +FILE 2818 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2819 f:\sp\public\sdk\inc\pshpack2.h +FILE 2820 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2821 f:\sp\public\sdk\inc\mcx.h +FILE 2822 f:\sp\public\sdk\inc\winuser.h +FILE 2823 f:\sp\public\sdk\inc\winnls.h +FILE 2824 f:\sp\public\sdk\inc\guiddef.h +FILE 2825 f:\sp\public\sdk\inc\specstrings.h +FILE 2826 f:\sp\public\sdk\inc\basetsd.h +FILE 2827 f:\sp\public\sdk\inc\stralign.h +FILE 2828 f:\sp\public\sdk\inc\tvout.h +FILE 2829 f:\sp\public\sdk\inc\winsvc.h +FILE 2830 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2831 f:\sp\public\sdk\inc\wingdi.h +FILE 2832 f:\sp\public\sdk\inc\pshpack4.h +FILE 2833 f:\sp\public\sdk\inc\poppack.h +FILE 2834 f:\sp\public\sdk\inc\winnetwk.h +FILE 2835 f:\sp\public\sdk\inc\imm.h +FILE 2836 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2837 f:\sp\public\sdk\inc\windef.h +FILE 2838 f:\sp\public\sdk\inc\pshpack1.h +FILE 2839 f:\sp\public\sdk\inc\winver.h +FILE 2840 f:\sp\public\sdk\inc\windows.h +FILE 2841 f:\sp\public\sdk\inc\winnt.h +FILE 2842 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2843 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2844 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2845 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2846 f:\sp\public\sdk\inc\winreg.h +FILE 2847 f:\sp\public\sdk\inc\winbase.h +FILE 2848 f:\sp\vctools\crt_bld\self_x86\crt\src\intel\loadcfg.c +FILE 2849 f:\sp\public\sdk\inc\winerror.h +FILE 2850 f:\sp\public\sdk\inc\pshpack8.h +FILE 2851 f:\sp\public\sdk\inc\reason.h +FILE 2852 f:\sp\public\sdk\inc\wincon.h +FILE 2853 f:\sp\public\sdk\inc\ddbanned.h +FILE 2854 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2855 f:\sp\public\sdk\inc\pshpack2.h +FILE 2856 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2857 f:\sp\public\sdk\inc\mcx.h +FILE 2858 f:\sp\public\sdk\inc\winuser.h +FILE 2859 f:\sp\public\sdk\inc\winnls.h +FILE 2860 f:\sp\public\sdk\inc\guiddef.h +FILE 2861 f:\sp\public\sdk\inc\specstrings.h +FILE 2862 f:\sp\public\sdk\inc\basetsd.h +FILE 2863 f:\sp\public\sdk\inc\stralign.h +FILE 2864 f:\sp\public\sdk\inc\tvout.h +FILE 2865 f:\sp\public\sdk\inc\winsvc.h +FILE 2866 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2867 f:\sp\public\sdk\inc\wingdi.h +FILE 2868 f:\sp\public\sdk\inc\pshpack4.h +FILE 2869 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\exsup4.asm +FILE 2870 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\exsup.inc +FILE 2871 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\exsup.asm +FILE 2872 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\pversion.inc +FILE 2873 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\cmacros.inc +FILE 2874 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\exsup.inc +FILE 2875 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\nlgsupp.asm +FILE 2876 f:\sp\public\sdk\inc\ntldr.h +FILE 2877 f:\sp\public\sdk\inc\ntpoapi.h +FILE 2878 f:\sp\public\sdk\inc\ntexapi.h +FILE 2879 f:\sp\public\sdk\inc\pshpack1.h +FILE 2880 f:\sp\public\sdk\inc\pshpack8.h +FILE 2881 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 2882 f:\sp\public\sdk\inc\ntdef.h +FILE 2883 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 2884 f:\sp\public\sdk\inc\mce.h +FILE 2885 f:\sp\public\sdk\inc\poppack.h +FILE 2886 f:\sp\public\sdk\inc\ntimage.h +FILE 2887 f:\sp\public\sdk\inc\pshpack2.h +FILE 2888 f:\sp\public\sdk\inc\ntpsapi.h +FILE 2889 f:\sp\public\sdk\inc\nti386.h +FILE 2890 f:\sp\public\sdk\inc\nt.h +FILE 2891 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 2892 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 2893 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 2894 f:\sp\public\sdk\inc\specstrings.h +FILE 2895 f:\sp\public\sdk\inc\basetsd.h +FILE 2896 f:\sp\public\sdk\inc\ntxcapi.h +FILE 2897 f:\sp\public\sdk\inc\guiddef.h +FILE 2898 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\misc\i386\chandler4.c +FILE 2899 f:\sp\public\sdk\inc\ntstatus.h +FILE 2900 f:\sp\public\sdk\inc\ntkeapi.h +FILE 2901 f:\sp\public\sdk\inc\ntconfig.h +FILE 2902 f:\sp\public\sdk\inc\ntregapi.h +FILE 2903 f:\sp\public\sdk\inc\ntmmapi.h +FILE 2904 f:\sp\public\sdk\inc\ntobapi.h +FILE 2905 f:\sp\public\sdk\inc\nxi386.h +FILE 2906 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\process.h +FILE 2907 f:\sp\public\sdk\inc\ntioapi.h +FILE 2908 f:\sp\public\sdk\inc\devioctl.h +FILE 2909 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 2910 f:\sp\public\sdk\inc\ntseapi.h +FILE 2911 f:\sp\public\sdk\inc\ddbanned.h +FILE 2912 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 2913 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 2914 f:\sp\public\sdk\inc\ntnls.h +FILE 2915 f:\sp\public\sdk\inc\ntelfapi.h +FILE 2916 f:\sp\public\sdk\inc\pshpack4.h +FILE 2917 f:\sp\public\sdk\inc\ntiolog.h +FILE 2918 f:\sp\public\sdk\inc\ntlpcapi.h +FILE 2919 f:\sp\public\sdk\inc\ntpnpapi.h +FILE 2920 f:\sp\public\sdk\inc\cfg.h +FILE 2921 f:\sp\public\sdk\inc\pebteb.h +FILE 2922 f:\sp\public\sdk\inc\wincon.h +FILE 2923 f:\sp\public\sdk\inc\imm.h +FILE 2924 f:\sp\public\sdk\inc\winbase.h +FILE 2925 f:\sp\public\sdk\inc\wingdi.h +FILE 2926 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2927 f:\sp\public\sdk\inc\winver.h +FILE 2928 f:\sp\public\sdk\inc\pshpack2.h +FILE 2929 f:\sp\public\sdk\inc\reason.h +FILE 2930 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 2931 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2932 f:\sp\vctools\crt_bld\self_x86\crt\src\mbsnbico.c +FILE 2933 f:\sp\public\sdk\inc\specstrings.h +FILE 2934 f:\sp\public\sdk\inc\basetsd.h +FILE 2935 f:\sp\public\sdk\inc\pshpack4.h +FILE 2936 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2937 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 2938 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2939 f:\sp\public\sdk\inc\winnetwk.h +FILE 2940 f:\sp\public\sdk\inc\stralign.h +FILE 2941 f:\sp\public\sdk\inc\poppack.h +FILE 2942 f:\sp\public\sdk\inc\winsvc.h +FILE 2943 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2944 f:\sp\public\sdk\inc\windef.h +FILE 2945 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2946 f:\sp\public\sdk\inc\winuser.h +FILE 2947 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2948 f:\sp\public\sdk\inc\windows.h +FILE 2949 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2950 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2951 f:\sp\public\sdk\inc\mcx.h +FILE 2952 f:\sp\public\sdk\inc\pshpack8.h +FILE 2953 f:\sp\public\sdk\inc\guiddef.h +FILE 2954 f:\sp\public\sdk\inc\winnt.h +FILE 2955 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2956 f:\sp\public\sdk\inc\winnls.h +FILE 2957 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2958 f:\sp\public\sdk\inc\pshpack1.h +FILE 2959 f:\sp\public\sdk\inc\winerror.h +FILE 2960 f:\sp\public\sdk\inc\winreg.h +FILE 2961 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2962 f:\sp\public\sdk\inc\ddbanned.h +FILE 2963 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2964 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2965 f:\sp\public\sdk\inc\tvout.h +FILE 2966 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2967 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2968 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2969 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2970 f:\sp\public\sdk\inc\wincon.h +FILE 2971 f:\sp\public\sdk\inc\imm.h +FILE 2972 f:\sp\public\sdk\inc\winbase.h +FILE 2973 f:\sp\public\sdk\inc\wingdi.h +FILE 2974 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 2975 f:\sp\public\sdk\inc\winver.h +FILE 2976 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2977 f:\sp\public\sdk\inc\windows.h +FILE 2978 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2979 f:\sp\public\sdk\inc\pshpack2.h +FILE 2980 f:\sp\public\sdk\inc\reason.h +FILE 2981 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2982 f:\sp\vctools\crt_bld\self_x86\crt\src\mbschr.c +FILE 2983 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2984 f:\sp\public\sdk\inc\specstrings.h +FILE 2985 f:\sp\public\sdk\inc\basetsd.h +FILE 2986 f:\sp\public\sdk\inc\pshpack4.h +FILE 2987 f:\sp\public\sdk\inc\winnetwk.h +FILE 2988 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2989 f:\sp\public\sdk\inc\stralign.h +FILE 2990 f:\sp\public\sdk\inc\poppack.h +FILE 2991 f:\sp\public\sdk\inc\winsvc.h +FILE 2992 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2993 f:\sp\public\sdk\inc\windef.h +FILE 2994 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2995 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2996 f:\sp\public\sdk\inc\winuser.h +FILE 2997 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2998 f:\sp\public\sdk\inc\mcx.h +FILE 2999 f:\sp\public\sdk\inc\pshpack8.h +FILE 3000 f:\sp\public\sdk\inc\guiddef.h +FILE 3001 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 3002 f:\sp\public\sdk\inc\winnt.h +FILE 3003 f:\sp\public\sdk\inc\winnls.h +FILE 3004 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3005 f:\sp\public\sdk\inc\pshpack1.h +FILE 3006 f:\sp\public\sdk\inc\winerror.h +FILE 3007 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 3008 f:\sp\public\sdk\inc\winreg.h +FILE 3009 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3010 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3011 f:\sp\public\sdk\inc\ddbanned.h +FILE 3012 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3013 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3014 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3015 f:\sp\public\sdk\inc\tvout.h +FILE 3016 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3017 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 3018 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 3019 f:\sp\public\sdk\inc\wincon.h +FILE 3020 f:\sp\public\sdk\inc\imm.h +FILE 3021 f:\sp\public\sdk\inc\winbase.h +FILE 3022 f:\sp\public\sdk\inc\wingdi.h +FILE 3023 f:\sp\public\sdk\inc\winver.h +FILE 3024 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3025 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3026 f:\sp\public\sdk\inc\pshpack2.h +FILE 3027 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 3028 f:\sp\public\sdk\inc\reason.h +FILE 3029 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.c +FILE 3030 f:\sp\public\sdk\inc\specstrings.h +FILE 3031 f:\sp\public\sdk\inc\basetsd.h +FILE 3032 f:\sp\public\sdk\inc\pshpack4.h +FILE 3033 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3034 f:\sp\public\sdk\inc\winnetwk.h +FILE 3035 f:\sp\public\sdk\inc\stralign.h +FILE 3036 f:\sp\public\sdk\inc\poppack.h +FILE 3037 f:\sp\public\sdk\inc\winsvc.h +FILE 3038 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3039 f:\sp\public\sdk\inc\windef.h +FILE 3040 f:\sp\public\sdk\inc\winuser.h +FILE 3041 f:\sp\public\sdk\inc\windows.h +FILE 3042 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3043 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3044 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3045 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3046 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3047 f:\sp\public\sdk\inc\mcx.h +FILE 3048 f:\sp\public\sdk\inc\pshpack8.h +FILE 3049 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3050 f:\sp\public\sdk\inc\guiddef.h +FILE 3051 f:\sp\public\sdk\inc\winnt.h +FILE 3052 f:\sp\public\sdk\inc\winnls.h +FILE 3053 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3054 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 3055 f:\sp\public\sdk\inc\pshpack1.h +FILE 3056 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3057 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3058 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3059 f:\sp\public\sdk\inc\winerror.h +FILE 3060 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 3061 f:\sp\public\sdk\inc\winreg.h +FILE 3062 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3063 f:\sp\public\sdk\inc\ddbanned.h +FILE 3064 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3065 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3066 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 3067 f:\sp\public\sdk\inc\tvout.h +FILE 3068 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3069 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3070 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3071 f:\sp\public\sdk\inc\wincon.h +FILE 3072 f:\sp\public\sdk\inc\imm.h +FILE 3073 f:\sp\public\sdk\inc\winbase.h +FILE 3074 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3075 f:\sp\public\sdk\inc\wingdi.h +FILE 3076 f:\sp\public\sdk\inc\windef.h +FILE 3077 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 3078 f:\sp\public\sdk\inc\winver.h +FILE 3079 f:\sp\public\sdk\inc\pshpack2.h +FILE 3080 f:\sp\public\sdk\inc\reason.h +FILE 3081 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3082 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3083 f:\sp\vctools\crt_bld\self_x86\crt\src\ismbbyte.c +FILE 3084 f:\sp\public\sdk\inc\winnt.h +FILE 3085 f:\sp\public\sdk\inc\specstrings.h +FILE 3086 f:\sp\public\sdk\inc\basetsd.h +FILE 3087 f:\sp\public\sdk\inc\pshpack4.h +FILE 3088 f:\sp\public\sdk\inc\winnetwk.h +FILE 3089 f:\sp\public\sdk\inc\stralign.h +FILE 3090 f:\sp\public\sdk\inc\poppack.h +FILE 3091 f:\sp\public\sdk\inc\winsvc.h +FILE 3092 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3093 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3094 f:\sp\public\sdk\inc\winuser.h +FILE 3095 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3096 f:\sp\public\sdk\inc\mcx.h +FILE 3097 f:\sp\public\sdk\inc\pshpack8.h +FILE 3098 f:\sp\public\sdk\inc\guiddef.h +FILE 3099 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3100 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 3101 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3102 f:\sp\public\sdk\inc\windows.h +FILE 3103 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3104 f:\sp\public\sdk\inc\winnls.h +FILE 3105 f:\sp\public\sdk\inc\pshpack1.h +FILE 3106 f:\sp\public\sdk\inc\winerror.h +FILE 3107 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3108 f:\sp\public\sdk\inc\winreg.h +FILE 3109 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3110 f:\sp\public\sdk\inc\ddbanned.h +FILE 3111 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3112 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3113 f:\sp\public\sdk\inc\tvout.h +FILE 3114 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 3115 f:\sp\public\sdk\inc\poppack.h +FILE 3116 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3117 f:\sp\public\sdk\inc\winnetwk.h +FILE 3118 f:\sp\public\sdk\inc\imm.h +FILE 3119 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3120 f:\sp\public\sdk\inc\windef.h +FILE 3121 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3122 f:\sp\public\sdk\inc\pshpack1.h +FILE 3123 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 3124 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3125 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 3126 f:\sp\public\sdk\inc\winver.h +FILE 3127 f:\sp\public\sdk\inc\windows.h +FILE 3128 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3129 f:\sp\public\sdk\inc\winnt.h +FILE 3130 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3131 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3132 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3133 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3134 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3135 f:\sp\public\sdk\inc\winreg.h +FILE 3136 f:\sp\public\sdk\inc\winbase.h +FILE 3137 f:\sp\vctools\crt_bld\self_x86\crt\src\ioinit.c +FILE 3138 f:\sp\public\sdk\inc\winerror.h +FILE 3139 f:\sp\public\sdk\inc\pshpack8.h +FILE 3140 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3141 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3142 f:\sp\public\sdk\inc\reason.h +FILE 3143 f:\sp\public\sdk\inc\wincon.h +FILE 3144 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3145 f:\sp\public\sdk\inc\ddbanned.h +FILE 3146 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3147 f:\sp\public\sdk\inc\pshpack2.h +FILE 3148 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3149 f:\sp\public\sdk\inc\mcx.h +FILE 3150 f:\sp\public\sdk\inc\winuser.h +FILE 3151 f:\sp\public\sdk\inc\winnls.h +FILE 3152 f:\sp\public\sdk\inc\guiddef.h +FILE 3153 f:\sp\public\sdk\inc\specstrings.h +FILE 3154 f:\sp\public\sdk\inc\basetsd.h +FILE 3155 f:\sp\public\sdk\inc\stralign.h +FILE 3156 f:\sp\public\sdk\inc\tvout.h +FILE 3157 f:\sp\public\sdk\inc\winsvc.h +FILE 3158 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3159 f:\sp\public\sdk\inc\wingdi.h +FILE 3160 f:\sp\public\sdk\inc\pshpack4.h +FILE 3161 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\ulldvrm.asm +FILE 3162 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 3163 F:\SP\vctools\crt_bld\SELF_X86\crt\src\mm.inc +FILE 3164 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\llmul.asm +FILE 3165 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 3166 F:\SP\vctools\crt_bld\SELF_X86\crt\src\mm.inc +FILE 3167 f:\sp\public\sdk\inc\poppack.h +FILE 3168 f:\sp\public\sdk\inc\winnetwk.h +FILE 3169 f:\sp\public\sdk\inc\imm.h +FILE 3170 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3171 f:\sp\public\sdk\inc\windef.h +FILE 3172 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3173 f:\sp\public\sdk\inc\pshpack1.h +FILE 3174 f:\sp\public\sdk\inc\winver.h +FILE 3175 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3176 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3177 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3178 f:\sp\public\sdk\inc\winnt.h +FILE 3179 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3180 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3181 f:\sp\public\sdk\inc\winreg.h +FILE 3182 f:\sp\vctools\crt_bld\self_x86\crt\src\_newmode.c +FILE 3183 f:\sp\public\sdk\inc\winbase.h +FILE 3184 f:\sp\public\sdk\inc\winerror.h +FILE 3185 f:\sp\public\sdk\inc\pshpack8.h +FILE 3186 f:\sp\public\sdk\inc\reason.h +FILE 3187 f:\sp\public\sdk\inc\wincon.h +FILE 3188 f:\sp\public\sdk\inc\ddbanned.h +FILE 3189 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3190 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3191 f:\sp\public\sdk\inc\pshpack2.h +FILE 3192 f:\sp\public\sdk\inc\mcx.h +FILE 3193 f:\sp\public\sdk\inc\winuser.h +FILE 3194 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3195 f:\sp\public\sdk\inc\winnls.h +FILE 3196 f:\sp\public\sdk\inc\guiddef.h +FILE 3197 f:\sp\public\sdk\inc\windows.h +FILE 3198 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3199 f:\sp\public\sdk\inc\specstrings.h +FILE 3200 f:\sp\public\sdk\inc\basetsd.h +FILE 3201 f:\sp\public\sdk\inc\stralign.h +FILE 3202 f:\sp\public\sdk\inc\tvout.h +FILE 3203 f:\sp\public\sdk\inc\winsvc.h +FILE 3204 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3205 f:\sp\public\sdk\inc\wingdi.h +FILE 3206 f:\sp\public\sdk\inc\pshpack4.h +FILE 3207 f:\sp\vctools\crt_bld\self_x86\crt\src\new.h +FILE 3208 f:\sp\public\sdk\inc\winerror.h +FILE 3209 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 3210 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 3211 f:\sp\public\sdk\inc\winreg.h +FILE 3212 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3213 f:\sp\public\sdk\inc\tvout.h +FILE 3214 f:\sp\vctools\crt_bld\self_x86\crt\src\delete.cpp +FILE 3215 f:\sp\public\sdk\inc\wincon.h +FILE 3216 f:\sp\public\sdk\inc\imm.h +FILE 3217 f:\sp\public\sdk\inc\winbase.h +FILE 3218 f:\sp\public\sdk\inc\wingdi.h +FILE 3219 f:\sp\public\sdk\inc\winver.h +FILE 3220 f:\sp\public\sdk\inc\windows.h +FILE 3221 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3222 f:\sp\public\sdk\inc\pshpack2.h +FILE 3223 f:\sp\public\sdk\inc\reason.h +FILE 3224 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3225 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3226 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3227 f:\sp\public\sdk\inc\specstrings.h +FILE 3228 f:\sp\public\sdk\inc\basetsd.h +FILE 3229 f:\sp\public\sdk\inc\pshpack4.h +FILE 3230 f:\sp\public\sdk\inc\winnetwk.h +FILE 3231 f:\sp\public\sdk\inc\stralign.h +FILE 3232 f:\sp\public\sdk\inc\poppack.h +FILE 3233 f:\sp\public\sdk\inc\winsvc.h +FILE 3234 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3235 f:\sp\public\sdk\inc\windef.h +FILE 3236 f:\sp\public\sdk\inc\winuser.h +FILE 3237 f:\sp\public\sdk\inc\mcx.h +FILE 3238 f:\sp\public\sdk\inc\pshpack8.h +FILE 3239 f:\sp\public\sdk\inc\ddbanned.h +FILE 3240 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3241 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3242 f:\sp\public\sdk\inc\guiddef.h +FILE 3243 f:\sp\public\sdk\inc\winnt.h +FILE 3244 f:\sp\public\sdk\inc\winnls.h +FILE 3245 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3246 f:\sp\public\sdk\inc\pshpack1.h +FILE 3247 f:\sp\public\sdk\inc\tvout.h +FILE 3248 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3249 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 3250 f:\sp\public\sdk\inc\wincon.h +FILE 3251 f:\sp\public\sdk\inc\imm.h +FILE 3252 f:\sp\public\sdk\inc\winbase.h +FILE 3253 f:\sp\public\sdk\inc\wingdi.h +FILE 3254 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3255 f:\sp\public\sdk\inc\winver.h +FILE 3256 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3257 f:\sp\public\sdk\inc\windows.h +FILE 3258 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3259 f:\sp\public\sdk\inc\pshpack2.h +FILE 3260 f:\sp\vctools\crt_bld\self_x86\crt\src\handler.cpp +FILE 3261 f:\sp\public\sdk\inc\reason.h +FILE 3262 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3263 f:\sp\public\sdk\inc\specstrings.h +FILE 3264 f:\sp\public\sdk\inc\basetsd.h +FILE 3265 f:\sp\public\sdk\inc\pshpack4.h +FILE 3266 f:\sp\public\sdk\inc\winnetwk.h +FILE 3267 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 3268 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3269 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3270 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3271 f:\sp\public\sdk\inc\stralign.h +FILE 3272 f:\sp\public\sdk\inc\poppack.h +FILE 3273 f:\sp\public\sdk\inc\winsvc.h +FILE 3274 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3275 f:\sp\public\sdk\inc\windef.h +FILE 3276 f:\sp\public\sdk\inc\winuser.h +FILE 3277 f:\sp\public\sdk\inc\mcx.h +FILE 3278 f:\sp\public\sdk\inc\pshpack8.h +FILE 3279 f:\sp\public\sdk\inc\guiddef.h +FILE 3280 f:\sp\public\sdk\inc\winnt.h +FILE 3281 f:\sp\public\sdk\inc\winnls.h +FILE 3282 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3283 f:\sp\public\sdk\inc\pshpack1.h +FILE 3284 f:\sp\public\sdk\inc\winerror.h +FILE 3285 f:\sp\public\sdk\inc\ddbanned.h +FILE 3286 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3287 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3288 f:\sp\public\sdk\inc\winreg.h +FILE 3289 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3290 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3291 f:\sp\vctools\crt_bld\self_x86\crt\src\new.h +FILE 3292 f:\sp\public\sdk\inc\winsvc.h +FILE 3293 f:\sp\public\sdk\inc\wingdi.h +FILE 3294 f:\sp\public\sdk\inc\pshpack4.h +FILE 3295 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3296 f:\sp\public\sdk\inc\poppack.h +FILE 3297 f:\sp\public\sdk\inc\winnt.h +FILE 3298 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3299 f:\sp\public\sdk\inc\winnetwk.h +FILE 3300 f:\sp\public\sdk\inc\imm.h +FILE 3301 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3302 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 3303 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3304 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3305 f:\sp\public\sdk\inc\pshpack1.h +FILE 3306 f:\sp\public\sdk\inc\winver.h +FILE 3307 f:\sp\public\sdk\inc\guiddef.h +FILE 3308 f:\sp\public\sdk\inc\specstrings.h +FILE 3309 f:\sp\public\sdk\inc\basetsd.h +FILE 3310 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 3311 f:\sp\vctools\crt_bld\self_x86\crt\src\sbheap.c +FILE 3312 f:\sp\public\sdk\inc\windows.h +FILE 3313 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3314 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3315 f:\sp\public\sdk\inc\winreg.h +FILE 3316 f:\sp\public\sdk\inc\winbase.h +FILE 3317 f:\sp\public\sdk\inc\winerror.h +FILE 3318 f:\sp\public\sdk\inc\pshpack8.h +FILE 3319 f:\sp\public\sdk\inc\ddbanned.h +FILE 3320 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3321 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3322 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3323 f:\sp\public\sdk\inc\reason.h +FILE 3324 f:\sp\public\sdk\inc\wincon.h +FILE 3325 f:\sp\public\sdk\inc\pshpack2.h +FILE 3326 f:\sp\public\sdk\inc\mcx.h +FILE 3327 f:\sp\public\sdk\inc\winuser.h +FILE 3328 f:\sp\public\sdk\inc\winnls.h +FILE 3329 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3330 f:\sp\public\sdk\inc\windef.h +FILE 3331 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3332 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3333 f:\sp\public\sdk\inc\stralign.h +FILE 3334 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3335 f:\sp\public\sdk\inc\tvout.h +FILE 3336 f:\sp\public\sdk\inc\winver.h +FILE 3337 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 3338 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 3339 f:\sp\public\sdk\inc\guiddef.h +FILE 3340 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3341 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3342 f:\sp\public\sdk\inc\specstrings.h +FILE 3343 f:\sp\public\sdk\inc\basetsd.h +FILE 3344 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 3345 f:\sp\public\sdk\inc\windows.h +FILE 3346 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3347 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3348 f:\sp\public\sdk\inc\winreg.h +FILE 3349 f:\sp\public\sdk\inc\winbase.h +FILE 3350 f:\sp\public\sdk\inc\winerror.h +FILE 3351 f:\sp\public\sdk\inc\pshpack8.h +FILE 3352 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3353 f:\sp\public\sdk\inc\reason.h +FILE 3354 f:\sp\public\sdk\inc\wincon.h +FILE 3355 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3356 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3357 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3358 f:\sp\public\sdk\inc\pshpack2.h +FILE 3359 f:\sp\public\sdk\inc\mcx.h +FILE 3360 f:\sp\public\sdk\inc\winuser.h +FILE 3361 f:\sp\public\sdk\inc\winnls.h +FILE 3362 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3363 f:\sp\public\sdk\inc\windef.h +FILE 3364 f:\sp\public\sdk\inc\stralign.h +FILE 3365 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3366 f:\sp\public\sdk\inc\tvout.h +FILE 3367 f:\sp\public\sdk\inc\winsvc.h +FILE 3368 f:\sp\vctools\crt_bld\self_x86\crt\src\realloc.c +FILE 3369 f:\sp\public\sdk\inc\wingdi.h +FILE 3370 f:\sp\public\sdk\inc\pshpack4.h +FILE 3371 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3372 f:\sp\public\sdk\inc\poppack.h +FILE 3373 f:\sp\public\sdk\inc\winnt.h +FILE 3374 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3375 f:\sp\public\sdk\inc\winnetwk.h +FILE 3376 f:\sp\public\sdk\inc\ddbanned.h +FILE 3377 f:\sp\public\sdk\inc\imm.h +FILE 3378 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3379 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3380 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3381 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3382 f:\sp\public\sdk\inc\pshpack1.h +FILE 3383 f:\sp\public\sdk\inc\pshpack2.h +FILE 3384 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 3385 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3386 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3387 f:\sp\public\sdk\inc\mcx.h +FILE 3388 f:\sp\public\sdk\inc\winuser.h +FILE 3389 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3390 f:\sp\public\sdk\inc\winnls.h +FILE 3391 f:\sp\public\sdk\inc\guiddef.h +FILE 3392 f:\sp\public\sdk\inc\windows.h +FILE 3393 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3394 f:\sp\public\sdk\inc\specstrings.h +FILE 3395 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3396 f:\sp\public\sdk\inc\basetsd.h +FILE 3397 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3398 f:\sp\public\sdk\inc\stralign.h +FILE 3399 f:\sp\public\sdk\inc\tvout.h +FILE 3400 f:\sp\public\sdk\inc\winsvc.h +FILE 3401 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3402 f:\sp\public\sdk\inc\wingdi.h +FILE 3403 f:\sp\public\sdk\inc\pshpack4.h +FILE 3404 f:\sp\public\sdk\inc\poppack.h +FILE 3405 f:\sp\public\sdk\inc\winnetwk.h +FILE 3406 f:\sp\public\sdk\inc\imm.h +FILE 3407 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3408 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3409 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3410 f:\sp\public\sdk\inc\windef.h +FILE 3411 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3412 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3413 f:\sp\vctools\crt_bld\self_x86\crt\src\msize.c +FILE 3414 f:\sp\public\sdk\inc\pshpack1.h +FILE 3415 f:\sp\public\sdk\inc\winver.h +FILE 3416 f:\sp\public\sdk\inc\winnt.h +FILE 3417 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3418 f:\sp\public\sdk\inc\winreg.h +FILE 3419 f:\sp\public\sdk\inc\ddbanned.h +FILE 3420 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3421 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3422 f:\sp\public\sdk\inc\winbase.h +FILE 3423 f:\sp\public\sdk\inc\winerror.h +FILE 3424 f:\sp\public\sdk\inc\pshpack8.h +FILE 3425 f:\sp\public\sdk\inc\reason.h +FILE 3426 f:\sp\public\sdk\inc\wincon.h +FILE 3427 f:\sp\public\sdk\inc\pshpack2.h +FILE 3428 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3429 f:\sp\public\sdk\inc\mcx.h +FILE 3430 f:\sp\public\sdk\inc\winuser.h +FILE 3431 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3432 f:\sp\public\sdk\inc\winnls.h +FILE 3433 f:\sp\public\sdk\inc\guiddef.h +FILE 3434 f:\sp\public\sdk\inc\windows.h +FILE 3435 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3436 f:\sp\public\sdk\inc\specstrings.h +FILE 3437 f:\sp\public\sdk\inc\basetsd.h +FILE 3438 f:\sp\public\sdk\inc\stralign.h +FILE 3439 f:\sp\public\sdk\inc\tvout.h +FILE 3440 f:\sp\public\sdk\inc\winsvc.h +FILE 3441 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3442 f:\sp\public\sdk\inc\wingdi.h +FILE 3443 f:\sp\public\sdk\inc\pshpack4.h +FILE 3444 f:\sp\public\sdk\inc\poppack.h +FILE 3445 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3446 f:\sp\public\sdk\inc\winnetwk.h +FILE 3447 f:\sp\public\sdk\inc\imm.h +FILE 3448 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3449 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3450 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3451 f:\sp\public\sdk\inc\windef.h +FILE 3452 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3453 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3454 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3455 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.c +FILE 3456 f:\sp\public\sdk\inc\pshpack1.h +FILE 3457 f:\sp\public\sdk\inc\winver.h +FILE 3458 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 3459 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 3460 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3461 f:\sp\public\sdk\inc\winnt.h +FILE 3462 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 3463 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3464 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3465 f:\sp\public\sdk\inc\winreg.h +FILE 3466 f:\sp\public\sdk\inc\ddbanned.h +FILE 3467 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3468 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3469 f:\sp\public\sdk\inc\winbase.h +FILE 3470 f:\sp\public\sdk\inc\winerror.h +FILE 3471 f:\sp\public\sdk\inc\pshpack8.h +FILE 3472 f:\sp\public\sdk\inc\reason.h +FILE 3473 f:\sp\public\sdk\inc\wincon.h +FILE 3474 f:\sp\public\sdk\inc\winver.h +FILE 3475 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3476 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3477 f:\sp\public\sdk\inc\winnt.h +FILE 3478 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3479 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3480 f:\sp\public\sdk\inc\winreg.h +FILE 3481 f:\sp\public\sdk\inc\winbase.h +FILE 3482 f:\sp\public\sdk\inc\winerror.h +FILE 3483 f:\sp\public\sdk\inc\pshpack8.h +FILE 3484 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3485 f:\sp\public\sdk\inc\reason.h +FILE 3486 f:\sp\public\sdk\inc\wincon.h +FILE 3487 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3488 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3489 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3490 f:\sp\public\sdk\inc\pshpack2.h +FILE 3491 f:\sp\public\sdk\inc\mcx.h +FILE 3492 f:\sp\public\sdk\inc\winuser.h +FILE 3493 f:\sp\public\sdk\inc\winnls.h +FILE 3494 f:\sp\public\sdk\inc\guiddef.h +FILE 3495 f:\sp\public\sdk\inc\stralign.h +FILE 3496 f:\sp\public\sdk\inc\specstrings.h +FILE 3497 f:\sp\public\sdk\inc\basetsd.h +FILE 3498 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 3499 f:\sp\public\sdk\inc\windows.h +FILE 3500 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3501 f:\sp\public\sdk\inc\tvout.h +FILE 3502 f:\sp\public\sdk\inc\winsvc.h +FILE 3503 f:\sp\vctools\crt_bld\self_x86\crt\src\heapinit.c +FILE 3504 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3505 f:\sp\public\sdk\inc\wingdi.h +FILE 3506 f:\sp\public\sdk\inc\pshpack4.h +FILE 3507 f:\sp\public\sdk\inc\poppack.h +FILE 3508 f:\sp\public\sdk\inc\winnetwk.h +FILE 3509 f:\sp\public\sdk\inc\ddbanned.h +FILE 3510 f:\sp\public\sdk\inc\imm.h +FILE 3511 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3512 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3513 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3514 f:\sp\public\sdk\inc\windef.h +FILE 3515 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3516 f:\sp\public\sdk\inc\pshpack1.h +FILE 3517 f:\sp\public\sdk\inc\pshpack2.h +FILE 3518 f:\sp\public\sdk\inc\mcx.h +FILE 3519 f:\sp\public\sdk\inc\winuser.h +FILE 3520 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 3521 f:\sp\public\sdk\inc\winnls.h +FILE 3522 f:\sp\public\sdk\inc\guiddef.h +FILE 3523 f:\sp\public\sdk\inc\windows.h +FILE 3524 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3525 f:\sp\public\sdk\inc\specstrings.h +FILE 3526 f:\sp\public\sdk\inc\basetsd.h +FILE 3527 f:\sp\public\sdk\inc\stralign.h +FILE 3528 f:\sp\public\sdk\inc\tvout.h +FILE 3529 f:\sp\public\sdk\inc\winsvc.h +FILE 3530 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3531 f:\sp\public\sdk\inc\wingdi.h +FILE 3532 f:\sp\public\sdk\inc\pshpack4.h +FILE 3533 f:\sp\public\sdk\inc\poppack.h +FILE 3534 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3535 f:\sp\public\sdk\inc\winnetwk.h +FILE 3536 f:\sp\public\sdk\inc\imm.h +FILE 3537 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3538 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3539 f:\sp\public\sdk\inc\windef.h +FILE 3540 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3541 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3542 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3543 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3544 f:\sp\public\sdk\inc\pshpack1.h +FILE 3545 f:\sp\vctools\crt_bld\self_x86\crt\src\free.c +FILE 3546 f:\sp\public\sdk\inc\winver.h +FILE 3547 f:\sp\public\sdk\inc\winnt.h +FILE 3548 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3549 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 3550 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 3551 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3552 f:\sp\public\sdk\inc\winreg.h +FILE 3553 f:\sp\public\sdk\inc\ddbanned.h +FILE 3554 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3555 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3556 f:\sp\public\sdk\inc\winbase.h +FILE 3557 f:\sp\public\sdk\inc\winerror.h +FILE 3558 f:\sp\public\sdk\inc\pshpack8.h +FILE 3559 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3560 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3561 f:\sp\public\sdk\inc\reason.h +FILE 3562 f:\sp\public\sdk\inc\wincon.h +FILE 3563 f:\sp\public\sdk\inc\pshpack2.h +FILE 3564 f:\sp\public\sdk\inc\mcx.h +FILE 3565 f:\sp\public\sdk\inc\winuser.h +FILE 3566 f:\sp\public\sdk\inc\winnls.h +FILE 3567 f:\sp\public\sdk\inc\guiddef.h +FILE 3568 f:\sp\public\sdk\inc\windows.h +FILE 3569 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3570 f:\sp\public\sdk\inc\specstrings.h +FILE 3571 f:\sp\public\sdk\inc\basetsd.h +FILE 3572 f:\sp\public\sdk\inc\stralign.h +FILE 3573 f:\sp\public\sdk\inc\tvout.h +FILE 3574 f:\sp\public\sdk\inc\winsvc.h +FILE 3575 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3576 f:\sp\public\sdk\inc\wingdi.h +FILE 3577 f:\sp\public\sdk\inc\pshpack4.h +FILE 3578 f:\sp\public\sdk\inc\poppack.h +FILE 3579 f:\sp\public\sdk\inc\winnetwk.h +FILE 3580 f:\sp\public\sdk\inc\imm.h +FILE 3581 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3582 f:\sp\public\sdk\inc\windef.h +FILE 3583 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3584 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3585 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3586 f:\sp\public\sdk\inc\pshpack1.h +FILE 3587 f:\sp\vctools\crt_bld\self_x86\crt\src\crtheap.c +FILE 3588 f:\sp\public\sdk\inc\winver.h +FILE 3589 f:\sp\public\sdk\inc\winnt.h +FILE 3590 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3591 f:\sp\public\sdk\inc\winreg.h +FILE 3592 f:\sp\public\sdk\inc\ddbanned.h +FILE 3593 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3594 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3595 f:\sp\public\sdk\inc\winbase.h +FILE 3596 f:\sp\public\sdk\inc\winerror.h +FILE 3597 f:\sp\public\sdk\inc\pshpack8.h +FILE 3598 f:\sp\public\sdk\inc\reason.h +FILE 3599 f:\sp\public\sdk\inc\wincon.h +FILE 3600 f:\sp\public\sdk\inc\pshpack2.h +FILE 3601 f:\sp\public\sdk\inc\mcx.h +FILE 3602 f:\sp\public\sdk\inc\winuser.h +FILE 3603 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3604 f:\sp\public\sdk\inc\winnls.h +FILE 3605 f:\sp\public\sdk\inc\stralign.h +FILE 3606 f:\sp\public\sdk\inc\tvout.h +FILE 3607 f:\sp\public\sdk\inc\winsvc.h +FILE 3608 f:\sp\public\sdk\inc\wingdi.h +FILE 3609 f:\sp\public\sdk\inc\winnt.h +FILE 3610 f:\sp\public\sdk\inc\pshpack4.h +FILE 3611 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3612 f:\sp\public\sdk\inc\poppack.h +FILE 3613 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3614 f:\sp\public\sdk\inc\winnetwk.h +FILE 3615 f:\sp\public\sdk\inc\imm.h +FILE 3616 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3617 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3618 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3619 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3620 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3621 f:\sp\public\sdk\inc\pshpack1.h +FILE 3622 f:\sp\vctools\crt_bld\self_x86\crt\src\calloc.c +FILE 3623 f:\sp\public\sdk\inc\winver.h +FILE 3624 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 3625 f:\sp\public\sdk\inc\guiddef.h +FILE 3626 f:\sp\public\sdk\inc\windows.h +FILE 3627 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3628 f:\sp\public\sdk\inc\specstrings.h +FILE 3629 f:\sp\public\sdk\inc\basetsd.h +FILE 3630 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 3631 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 3632 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3633 f:\sp\public\sdk\inc\winreg.h +FILE 3634 f:\sp\public\sdk\inc\ddbanned.h +FILE 3635 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3636 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3637 f:\sp\public\sdk\inc\winbase.h +FILE 3638 f:\sp\public\sdk\inc\winerror.h +FILE 3639 f:\sp\public\sdk\inc\pshpack8.h +FILE 3640 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3641 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3642 f:\sp\public\sdk\inc\reason.h +FILE 3643 f:\sp\public\sdk\inc\wincon.h +FILE 3644 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3645 f:\sp\public\sdk\inc\windef.h +FILE 3646 f:\sp\public\sdk\inc\wincon.h +FILE 3647 f:\sp\public\sdk\inc\imm.h +FILE 3648 f:\sp\public\sdk\inc\winbase.h +FILE 3649 f:\sp\public\sdk\inc\wingdi.h +FILE 3650 f:\sp\public\sdk\inc\winver.h +FILE 3651 f:\sp\public\sdk\inc\pshpack2.h +FILE 3652 f:\sp\public\sdk\inc\reason.h +FILE 3653 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 3654 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\unhandld.cpp +FILE 3655 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 3656 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 3657 f:\sp\public\sdk\inc\specstrings.h +FILE 3658 f:\sp\public\sdk\inc\basetsd.h +FILE 3659 f:\sp\public\sdk\inc\pshpack4.h +FILE 3660 f:\sp\public\sdk\inc\winnetwk.h +FILE 3661 f:\sp\public\sdk\inc\stralign.h +FILE 3662 f:\sp\public\sdk\inc\poppack.h +FILE 3663 f:\sp\public\sdk\inc\winsvc.h +FILE 3664 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 3665 f:\sp\public\sdk\inc\windef.h +FILE 3666 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 3667 f:\sp\public\sdk\inc\winuser.h +FILE 3668 f:\sp\public\sdk\inc\windows.h +FILE 3669 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 3670 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 3671 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 3672 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 3673 f:\sp\public\sdk\inc\mcx.h +FILE 3674 f:\sp\public\sdk\inc\pshpack8.h +FILE 3675 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 3676 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 3677 f:\sp\public\sdk\inc\guiddef.h +FILE 3678 f:\sp\public\sdk\inc\winnt.h +FILE 3679 f:\sp\public\sdk\inc\winnls.h +FILE 3680 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 3681 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 3682 f:\sp\public\sdk\inc\pshpack1.h +FILE 3683 f:\sp\public\sdk\inc\winerror.h +FILE 3684 f:\sp\vctools\langapi\include\ehdata.h +FILE 3685 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 3686 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 3687 f:\sp\public\sdk\inc\winreg.h +FILE 3688 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 3689 f:\sp\public\sdk\inc\ddbanned.h +FILE 3690 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 3691 f:\sp\public\sdk\inc\tvout.h +FILE 3692 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 3693 f:\sp\public\sdk\inc\specstrings.h +FILE 3694 f:\sp\public\sdk\inc\basetsd.h +FILE 3695 f:\sp\public\sdk\inc\pshpack4.h +FILE 3696 f:\sp\public\sdk\inc\winnetwk.h +FILE 3697 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 3698 f:\sp\public\sdk\inc\stralign.h +FILE 3699 f:\sp\public\sdk\inc\poppack.h +FILE 3700 f:\sp\public\sdk\inc\winsvc.h +FILE 3701 f:\sp\public\sdk\inc\winuser.h +FILE 3702 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 3703 f:\sp\public\sdk\inc\windef.h +FILE 3704 f:\sp\vctools\langapi\undname\undname.cxx +FILE 3705 f:\sp\public\sdk\inc\mcx.h +FILE 3706 f:\sp\public\sdk\inc\pshpack8.h +FILE 3707 f:\sp\public\sdk\inc\guiddef.h +FILE 3708 f:\sp\vctools\langapi\undname\utf8.h +FILE 3709 f:\sp\public\sdk\inc\winnls.h +FILE 3710 f:\sp\public\sdk\inc\pshpack1.h +FILE 3711 f:\sp\public\sdk\inc\winnt.h +FILE 3712 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 3713 f:\sp\public\sdk\inc\winerror.h +FILE 3714 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\swprintf.inl +FILE 3715 f:\sp\vctools\langapi\undname\undname.hxx +FILE 3716 f:\sp\vctools\langapi\undname\undname.h +FILE 3717 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 3718 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 3719 f:\sp\public\sdk\inc\winreg.h +FILE 3720 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 3721 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 3722 f:\sp\public\sdk\inc\tvout.h +FILE 3723 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdio.h +FILE 3724 f:\sp\public\sdk\inc\wincon.h +FILE 3725 f:\sp\public\sdk\inc\imm.h +FILE 3726 f:\sp\public\sdk\inc\winbase.h +FILE 3727 f:\sp\public\sdk\inc\wingdi.h +FILE 3728 f:\sp\public\sdk\inc\winver.h +FILE 3729 f:\sp\public\sdk\inc\pshpack2.h +FILE 3730 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 3731 f:\sp\public\sdk\inc\windows.h +FILE 3732 f:\sp\public\sdk\inc\reason.h +FILE 3733 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 3734 f:\sp\public\sdk\inc\ddbanned.h +FILE 3735 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 3736 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 3737 f:\sp\vctools\langapi\undname\undname.inl +FILE 3738 f:\sp\public\sdk\inc\guiddef.h +FILE 3739 f:\sp\public\sdk\inc\winnt.h +FILE 3740 f:\sp\public\sdk\inc\winnls.h +FILE 3741 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 3742 f:\sp\public\sdk\inc\pshpack1.h +FILE 3743 f:\sp\public\sdk\inc\winerror.h +FILE 3744 f:\sp\public\sdk\inc\winreg.h +FILE 3745 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 3746 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 3747 f:\sp\public\sdk\inc\tvout.h +FILE 3748 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\typname.cpp +FILE 3749 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 3750 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\cstddef +FILE 3751 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 3752 f:\sp\public\sdk\inc\wincon.h +FILE 3753 f:\sp\public\sdk\inc\imm.h +FILE 3754 f:\sp\public\sdk\inc\winbase.h +FILE 3755 f:\sp\public\sdk\inc\wingdi.h +FILE 3756 f:\sp\public\sdk\inc\winver.h +FILE 3757 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 3758 f:\sp\public\sdk\inc\windows.h +FILE 3759 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 3760 f:\sp\public\sdk\inc\pshpack2.h +FILE 3761 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 3762 f:\sp\public\sdk\inc\reason.h +FILE 3763 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 3764 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\dbgint.h +FILE 3765 f:\sp\public\sdk\inc\specstrings.h +FILE 3766 f:\sp\public\sdk\inc\basetsd.h +FILE 3767 f:\sp\public\sdk\inc\pshpack4.h +FILE 3768 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\typeinfo.h +FILE 3769 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\typeinfo +FILE 3770 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\exception +FILE 3771 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\xstddef +FILE 3772 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 3773 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\yvals.h +FILE 3774 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\use_ansi.h +FILE 3775 f:\sp\public\sdk\inc\winnetwk.h +FILE 3776 f:\sp\vctools\langapi\undname\undname.h +FILE 3777 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 3778 f:\sp\public\sdk\inc\stralign.h +FILE 3779 f:\sp\public\sdk\inc\poppack.h +FILE 3780 f:\sp\public\sdk\inc\winsvc.h +FILE 3781 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 3782 f:\sp\public\sdk\inc\windef.h +FILE 3783 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 3784 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 3785 f:\sp\public\sdk\inc\winuser.h +FILE 3786 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 3787 f:\sp\public\sdk\inc\ddbanned.h +FILE 3788 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 3789 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 3790 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 3791 f:\sp\public\sdk\inc\mcx.h +FILE 3792 f:\sp\public\sdk\inc\pshpack8.h +FILE 3793 f:\sp\public\sdk\inc\winnls.h +FILE 3794 f:\sp\public\sdk\inc\pshpack1.h +FILE 3795 f:\sp\public\sdk\inc\winnt.h +FILE 3796 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 3797 f:\sp\public\sdk\inc\winerror.h +FILE 3798 f:\sp\public\sdk\inc\winreg.h +FILE 3799 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 3800 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 3801 f:\sp\public\sdk\inc\tvout.h +FILE 3802 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\dbgint.h +FILE 3803 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 3804 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\cstddef +FILE 3805 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 3806 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\typinfo.cpp +FILE 3807 f:\sp\public\sdk\inc\wincon.h +FILE 3808 f:\sp\public\sdk\inc\imm.h +FILE 3809 f:\sp\public\sdk\inc\winbase.h +FILE 3810 f:\sp\public\sdk\inc\wingdi.h +FILE 3811 f:\sp\public\sdk\inc\winver.h +FILE 3812 f:\sp\public\sdk\inc\pshpack2.h +FILE 3813 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 3814 f:\sp\public\sdk\inc\reason.h +FILE 3815 f:\sp\public\sdk\inc\windows.h +FILE 3816 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 3817 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 3818 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 3819 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 3820 f:\sp\public\sdk\inc\specstrings.h +FILE 3821 f:\sp\public\sdk\inc\basetsd.h +FILE 3822 f:\sp\public\sdk\inc\pshpack4.h +FILE 3823 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\typeinfo +FILE 3824 f:\sp\public\sdk\inc\winnetwk.h +FILE 3825 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\exception +FILE 3826 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\xstddef +FILE 3827 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 3828 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\yvals.h +FILE 3829 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\use_ansi.h +FILE 3830 f:\sp\public\sdk\inc\stralign.h +FILE 3831 f:\sp\public\sdk\inc\poppack.h +FILE 3832 f:\sp\public\sdk\inc\winsvc.h +FILE 3833 f:\sp\public\sdk\inc\winuser.h +FILE 3834 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 3835 f:\sp\public\sdk\inc\windef.h +FILE 3836 f:\sp\vctools\langapi\undname\undname.h +FILE 3837 f:\sp\public\sdk\inc\ddbanned.h +FILE 3838 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 3839 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 3840 f:\sp\public\sdk\inc\mcx.h +FILE 3841 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 3842 f:\sp\public\sdk\inc\pshpack8.h +FILE 3843 f:\sp\public\sdk\inc\guiddef.h +FILE 3844 f:\sp\public\sdk\inc\poppack.h +FILE 3845 f:\sp\public\sdk\inc\winsvc.h +FILE 3846 f:\sp\public\sdk\inc\windows.h +FILE 3847 f:\sp\public\sdk\inc\winuser.h +FILE 3848 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 3849 f:\sp\public\sdk\inc\windef.h +FILE 3850 f:\sp\public\sdk\inc\mcx.h +FILE 3851 f:\sp\public\sdk\inc\pshpack8.h +FILE 3852 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 3853 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 3854 f:\sp\public\sdk\inc\guiddef.h +FILE 3855 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\hooks.cpp +FILE 3856 f:\sp\public\sdk\inc\winnls.h +FILE 3857 f:\sp\public\sdk\inc\pshpack1.h +FILE 3858 f:\sp\public\sdk\inc\winnt.h +FILE 3859 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 3860 f:\sp\public\sdk\inc\winerror.h +FILE 3861 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 3862 f:\sp\public\sdk\inc\winreg.h +FILE 3863 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 3864 f:\sp\public\sdk\inc\tvout.h +FILE 3865 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 3866 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 3867 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 3868 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 3869 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 3870 f:\sp\public\sdk\inc\wincon.h +FILE 3871 f:\sp\public\sdk\inc\imm.h +FILE 3872 f:\sp\public\sdk\inc\winbase.h +FILE 3873 f:\sp\public\sdk\inc\wingdi.h +FILE 3874 f:\sp\public\sdk\inc\winver.h +FILE 3875 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 3876 f:\sp\public\sdk\inc\pshpack2.h +FILE 3877 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 3878 f:\sp\public\sdk\inc\reason.h +FILE 3879 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 3880 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 3881 f:\sp\public\sdk\inc\specstrings.h +FILE 3882 f:\sp\public\sdk\inc\basetsd.h +FILE 3883 f:\sp\public\sdk\inc\pshpack4.h +FILE 3884 f:\sp\public\sdk\inc\ddbanned.h +FILE 3885 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 3886 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 3887 f:\sp\public\sdk\inc\winnetwk.h +FILE 3888 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 3889 f:\sp\public\sdk\inc\stralign.h +FILE 3890 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3891 f:\sp\public\sdk\inc\pshpack4.h +FILE 3892 f:\sp\public\sdk\inc\reason.h +FILE 3893 f:\sp\public\sdk\inc\wincon.h +FILE 3894 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3895 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3896 f:\sp\public\sdk\inc\poppack.h +FILE 3897 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3898 f:\sp\public\sdk\inc\mcx.h +FILE 3899 f:\sp\public\sdk\inc\winuser.h +FILE 3900 f:\sp\public\sdk\inc\winnls.h +FILE 3901 f:\sp\public\sdk\inc\stralign.h +FILE 3902 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3903 f:\sp\public\sdk\inc\windef.h +FILE 3904 f:\sp\public\sdk\inc\tvout.h +FILE 3905 f:\sp\public\sdk\inc\winsvc.h +FILE 3906 f:\sp\public\sdk\inc\wingdi.h +FILE 3907 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3908 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3909 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3910 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3911 f:\sp\public\sdk\inc\winnt.h +FILE 3912 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3913 f:\sp\public\sdk\inc\winnetwk.h +FILE 3914 f:\sp\public\sdk\inc\imm.h +FILE 3915 f:\sp\vctools\crt_bld\self_x86\crt\src\dosmap.c +FILE 3916 f:\sp\public\sdk\inc\winbase.h +FILE 3917 f:\sp\public\sdk\inc\winerror.h +FILE 3918 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3919 f:\sp\public\sdk\inc\pshpack1.h +FILE 3920 f:\sp\public\sdk\inc\pshpack8.h +FILE 3921 f:\sp\public\sdk\inc\winver.h +FILE 3922 f:\sp\public\sdk\inc\ddbanned.h +FILE 3923 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3924 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3925 f:\sp\public\sdk\inc\pshpack2.h +FILE 3926 f:\sp\public\sdk\inc\winreg.h +FILE 3927 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3928 f:\sp\public\sdk\inc\guiddef.h +FILE 3929 f:\sp\public\sdk\inc\windows.h +FILE 3930 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3931 f:\sp\public\sdk\inc\specstrings.h +FILE 3932 f:\sp\public\sdk\inc\basetsd.h +FILE 3933 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3934 f:\sp\public\sdk\inc\mcx.h +FILE 3935 f:\sp\public\sdk\inc\pshpack8.h +FILE 3936 f:\sp\public\sdk\inc\guiddef.h +FILE 3937 f:\sp\public\sdk\inc\winnt.h +FILE 3938 f:\sp\public\sdk\inc\winnls.h +FILE 3939 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3940 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3941 f:\sp\public\sdk\inc\pshpack1.h +FILE 3942 f:\sp\public\sdk\inc\winerror.h +FILE 3943 f:\sp\vctools\crt_bld\self_x86\crt\src\tolower.c +FILE 3944 f:\sp\public\sdk\inc\winreg.h +FILE 3945 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3946 f:\sp\public\sdk\inc\tvout.h +FILE 3947 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3948 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3949 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3950 f:\sp\public\sdk\inc\wincon.h +FILE 3951 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 3952 f:\sp\public\sdk\inc\imm.h +FILE 3953 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3954 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3955 f:\sp\public\sdk\inc\winbase.h +FILE 3956 f:\sp\public\sdk\inc\wingdi.h +FILE 3957 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3958 f:\sp\public\sdk\inc\winver.h +FILE 3959 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3960 f:\sp\public\sdk\inc\windows.h +FILE 3961 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3962 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3963 f:\sp\public\sdk\inc\pshpack2.h +FILE 3964 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3965 f:\sp\public\sdk\inc\reason.h +FILE 3966 f:\sp\public\sdk\inc\specstrings.h +FILE 3967 f:\sp\public\sdk\inc\basetsd.h +FILE 3968 f:\sp\public\sdk\inc\pshpack4.h +FILE 3969 f:\sp\public\sdk\inc\winnetwk.h +FILE 3970 f:\sp\public\sdk\inc\ddbanned.h +FILE 3971 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3972 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3973 f:\sp\public\sdk\inc\stralign.h +FILE 3974 f:\sp\public\sdk\inc\poppack.h +FILE 3975 f:\sp\public\sdk\inc\winsvc.h +FILE 3976 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3977 f:\sp\public\sdk\inc\windef.h +FILE 3978 f:\sp\public\sdk\inc\winuser.h +FILE 3979 f:\sp\public\sdk\inc\winsvc.h +FILE 3980 f:\sp\public\sdk\inc\winuser.h +FILE 3981 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3982 f:\sp\public\sdk\inc\mcx.h +FILE 3983 f:\sp\public\sdk\inc\pshpack8.h +FILE 3984 f:\sp\public\sdk\inc\guiddef.h +FILE 3985 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3986 f:\sp\public\sdk\inc\windows.h +FILE 3987 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3988 f:\sp\public\sdk\inc\winnls.h +FILE 3989 f:\sp\vctools\crt_bld\self_x86\crt\src\strtoq.c +FILE 3990 f:\sp\public\sdk\inc\pshpack1.h +FILE 3991 f:\sp\public\sdk\inc\winerror.h +FILE 3992 f:\sp\public\sdk\inc\winreg.h +FILE 3993 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3994 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3995 f:\sp\public\sdk\inc\tvout.h +FILE 3996 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3997 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3998 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3999 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4000 f:\sp\public\sdk\inc\wincon.h +FILE 4001 f:\sp\public\sdk\inc\imm.h +FILE 4002 f:\sp\public\sdk\inc\winbase.h +FILE 4003 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4004 f:\sp\public\sdk\inc\wingdi.h +FILE 4005 f:\sp\public\sdk\inc\windef.h +FILE 4006 f:\sp\public\sdk\inc\winver.h +FILE 4007 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4008 f:\sp\public\sdk\inc\pshpack2.h +FILE 4009 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4010 f:\sp\public\sdk\inc\reason.h +FILE 4011 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4012 f:\sp\public\sdk\inc\winnt.h +FILE 4013 f:\sp\public\sdk\inc\specstrings.h +FILE 4014 f:\sp\public\sdk\inc\basetsd.h +FILE 4015 f:\sp\public\sdk\inc\pshpack4.h +FILE 4016 f:\sp\public\sdk\inc\ddbanned.h +FILE 4017 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4018 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4019 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4020 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4021 f:\sp\public\sdk\inc\winnetwk.h +FILE 4022 f:\sp\public\sdk\inc\stralign.h +FILE 4023 f:\sp\public\sdk\inc\poppack.h +FILE 4024 f:\sp\public\sdk\inc\winsvc.h +FILE 4025 f:\sp\public\sdk\inc\winuser.h +FILE 4026 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4027 f:\sp\public\sdk\inc\mcx.h +FILE 4028 f:\sp\public\sdk\inc\pshpack8.h +FILE 4029 f:\sp\public\sdk\inc\guiddef.h +FILE 4030 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4031 f:\sp\public\sdk\inc\windows.h +FILE 4032 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4033 f:\sp\public\sdk\inc\winnls.h +FILE 4034 f:\sp\vctools\crt_bld\self_x86\crt\src\strtol.c +FILE 4035 f:\sp\public\sdk\inc\pshpack1.h +FILE 4036 f:\sp\public\sdk\inc\winerror.h +FILE 4037 f:\sp\public\sdk\inc\winreg.h +FILE 4038 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4039 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4040 f:\sp\public\sdk\inc\tvout.h +FILE 4041 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4042 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4043 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4044 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4045 f:\sp\public\sdk\inc\wincon.h +FILE 4046 f:\sp\public\sdk\inc\imm.h +FILE 4047 f:\sp\public\sdk\inc\winbase.h +FILE 4048 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4049 f:\sp\public\sdk\inc\wingdi.h +FILE 4050 f:\sp\public\sdk\inc\windef.h +FILE 4051 f:\sp\public\sdk\inc\winver.h +FILE 4052 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4053 f:\sp\public\sdk\inc\pshpack2.h +FILE 4054 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4055 f:\sp\public\sdk\inc\reason.h +FILE 4056 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4057 f:\sp\public\sdk\inc\winnt.h +FILE 4058 f:\sp\public\sdk\inc\specstrings.h +FILE 4059 f:\sp\public\sdk\inc\basetsd.h +FILE 4060 f:\sp\public\sdk\inc\pshpack4.h +FILE 4061 f:\sp\public\sdk\inc\ddbanned.h +FILE 4062 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4063 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4064 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4065 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4066 f:\sp\public\sdk\inc\winnetwk.h +FILE 4067 f:\sp\public\sdk\inc\stralign.h +FILE 4068 f:\sp\public\sdk\inc\poppack.h +FILE 4069 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4070 f:\sp\public\sdk\inc\winreg.h +FILE 4071 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4072 f:\sp\public\sdk\inc\tvout.h +FILE 4073 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4074 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4075 f:\sp\public\sdk\inc\wincon.h +FILE 4076 f:\sp\public\sdk\inc\imm.h +FILE 4077 f:\sp\public\sdk\inc\winbase.h +FILE 4078 f:\sp\vctools\crt_bld\self_x86\crt\src\isctype.c +FILE 4079 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4080 f:\sp\public\sdk\inc\wingdi.h +FILE 4081 f:\sp\public\sdk\inc\windef.h +FILE 4082 f:\sp\public\sdk\inc\winver.h +FILE 4083 f:\sp\public\sdk\inc\pshpack2.h +FILE 4084 f:\sp\public\sdk\inc\reason.h +FILE 4085 f:\sp\public\sdk\inc\winnt.h +FILE 4086 f:\sp\public\sdk\inc\specstrings.h +FILE 4087 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4088 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 4089 f:\sp\public\sdk\inc\basetsd.h +FILE 4090 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4091 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4092 f:\sp\public\sdk\inc\pshpack4.h +FILE 4093 f:\sp\public\sdk\inc\winnetwk.h +FILE 4094 f:\sp\public\sdk\inc\stralign.h +FILE 4095 f:\sp\public\sdk\inc\poppack.h +FILE 4096 f:\sp\public\sdk\inc\winsvc.h +FILE 4097 f:\sp\public\sdk\inc\winuser.h +FILE 4098 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4099 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4100 f:\sp\public\sdk\inc\mcx.h +FILE 4101 f:\sp\public\sdk\inc\pshpack8.h +FILE 4102 f:\sp\public\sdk\inc\guiddef.h +FILE 4103 f:\sp\public\sdk\inc\ddbanned.h +FILE 4104 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4105 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4106 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4107 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4108 f:\sp\public\sdk\inc\windows.h +FILE 4109 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4110 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4111 f:\sp\public\sdk\inc\winnls.h +FILE 4112 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4113 f:\sp\public\sdk\inc\pshpack1.h +FILE 4114 f:\sp\public\sdk\inc\winerror.h +FILE 4115 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4116 f:\sp\public\sdk\inc\winreg.h +FILE 4117 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4118 f:\sp\public\sdk\inc\tvout.h +FILE 4119 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4120 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4121 f:\sp\public\sdk\inc\wincon.h +FILE 4122 f:\sp\public\sdk\inc\imm.h +FILE 4123 f:\sp\public\sdk\inc\winbase.h +FILE 4124 f:\sp\vctools\crt_bld\self_x86\crt\src\iswctype.c +FILE 4125 f:\sp\public\sdk\inc\wingdi.h +FILE 4126 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4127 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4128 f:\sp\public\sdk\inc\winver.h +FILE 4129 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4130 f:\sp\public\sdk\inc\windows.h +FILE 4131 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4132 f:\sp\public\sdk\inc\pshpack2.h +FILE 4133 f:\sp\public\sdk\inc\reason.h +FILE 4134 f:\sp\public\sdk\inc\specstrings.h +FILE 4135 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 4136 f:\sp\public\sdk\inc\basetsd.h +FILE 4137 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4138 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4139 f:\sp\public\sdk\inc\pshpack4.h +FILE 4140 f:\sp\public\sdk\inc\winnetwk.h +FILE 4141 f:\sp\public\sdk\inc\stralign.h +FILE 4142 f:\sp\public\sdk\inc\poppack.h +FILE 4143 f:\sp\public\sdk\inc\winsvc.h +FILE 4144 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4145 f:\sp\public\sdk\inc\windef.h +FILE 4146 f:\sp\public\sdk\inc\winuser.h +FILE 4147 f:\sp\public\sdk\inc\mcx.h +FILE 4148 f:\sp\public\sdk\inc\pshpack8.h +FILE 4149 f:\sp\public\sdk\inc\guiddef.h +FILE 4150 f:\sp\public\sdk\inc\ddbanned.h +FILE 4151 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4152 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4153 f:\sp\public\sdk\inc\winnt.h +FILE 4154 f:\sp\public\sdk\inc\winnls.h +FILE 4155 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4156 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4157 f:\sp\public\sdk\inc\pshpack1.h +FILE 4158 f:\sp\public\sdk\inc\winerror.h +FILE 4159 f:\sp\public\sdk\inc\winsvc.h +FILE 4160 f:\sp\public\sdk\inc\winuser.h +FILE 4161 f:\sp\public\sdk\inc\mcx.h +FILE 4162 f:\sp\public\sdk\inc\pshpack8.h +FILE 4163 f:\sp\public\sdk\inc\guiddef.h +FILE 4164 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4165 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4166 f:\sp\public\sdk\inc\windows.h +FILE 4167 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4168 f:\sp\public\sdk\inc\winnls.h +FILE 4169 f:\sp\vctools\crt_bld\self_x86\crt\src\_wctype.c +FILE 4170 f:\sp\public\sdk\inc\pshpack1.h +FILE 4171 f:\sp\public\sdk\inc\winerror.h +FILE 4172 f:\sp\public\sdk\inc\winreg.h +FILE 4173 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4174 f:\sp\public\sdk\inc\tvout.h +FILE 4175 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4176 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4177 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4178 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4179 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4180 f:\sp\public\sdk\inc\wincon.h +FILE 4181 f:\sp\public\sdk\inc\imm.h +FILE 4182 f:\sp\public\sdk\inc\winbase.h +FILE 4183 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4184 f:\sp\public\sdk\inc\wingdi.h +FILE 4185 f:\sp\public\sdk\inc\windef.h +FILE 4186 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 4187 f:\sp\public\sdk\inc\winver.h +FILE 4188 f:\sp\public\sdk\inc\pshpack2.h +FILE 4189 f:\sp\public\sdk\inc\reason.h +FILE 4190 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4191 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4192 f:\sp\public\sdk\inc\winnt.h +FILE 4193 f:\sp\public\sdk\inc\specstrings.h +FILE 4194 f:\sp\public\sdk\inc\basetsd.h +FILE 4195 f:\sp\public\sdk\inc\pshpack4.h +FILE 4196 f:\sp\public\sdk\inc\ddbanned.h +FILE 4197 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4198 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4199 f:\sp\public\sdk\inc\winnetwk.h +FILE 4200 f:\sp\public\sdk\inc\stralign.h +FILE 4201 f:\sp\public\sdk\inc\poppack.h +FILE 4202 f:\sp\public\sdk\inc\mcx.h +FILE 4203 f:\sp\public\sdk\inc\pshpack8.h +FILE 4204 f:\sp\public\sdk\inc\guiddef.h +FILE 4205 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4206 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4207 f:\sp\public\sdk\inc\windows.h +FILE 4208 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4209 f:\sp\public\sdk\inc\winnls.h +FILE 4210 f:\sp\public\sdk\inc\pshpack1.h +FILE 4211 f:\sp\public\sdk\inc\winerror.h +FILE 4212 f:\sp\public\sdk\inc\winreg.h +FILE 4213 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4214 f:\sp\vctools\crt_bld\self_x86\crt\src\_ctype.c +FILE 4215 f:\sp\public\sdk\inc\tvout.h +FILE 4216 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4217 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4218 f:\sp\public\sdk\inc\wincon.h +FILE 4219 f:\sp\public\sdk\inc\imm.h +FILE 4220 f:\sp\public\sdk\inc\winbase.h +FILE 4221 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4222 f:\sp\public\sdk\inc\wingdi.h +FILE 4223 f:\sp\public\sdk\inc\windef.h +FILE 4224 f:\sp\public\sdk\inc\winver.h +FILE 4225 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4226 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4227 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4228 f:\sp\public\sdk\inc\pshpack2.h +FILE 4229 f:\sp\public\sdk\inc\reason.h +FILE 4230 f:\sp\public\sdk\inc\winnt.h +FILE 4231 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4232 f:\sp\public\sdk\inc\specstrings.h +FILE 4233 f:\sp\public\sdk\inc\basetsd.h +FILE 4234 f:\sp\public\sdk\inc\pshpack4.h +FILE 4235 f:\sp\public\sdk\inc\winnetwk.h +FILE 4236 f:\sp\public\sdk\inc\stralign.h +FILE 4237 f:\sp\public\sdk\inc\poppack.h +FILE 4238 f:\sp\public\sdk\inc\winsvc.h +FILE 4239 f:\sp\public\sdk\inc\ddbanned.h +FILE 4240 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4241 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4242 f:\sp\public\sdk\inc\winuser.h +FILE 4243 f:\sp\public\sdk\inc\pshpack2.h +FILE 4244 f:\sp\public\sdk\inc\mcx.h +FILE 4245 f:\sp\public\sdk\inc\winuser.h +FILE 4246 f:\sp\public\sdk\inc\winnls.h +FILE 4247 f:\sp\public\sdk\inc\stralign.h +FILE 4248 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4249 f:\sp\public\sdk\inc\windef.h +FILE 4250 f:\sp\public\sdk\inc\tvout.h +FILE 4251 f:\sp\public\sdk\inc\winsvc.h +FILE 4252 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 4253 f:\sp\public\sdk\inc\wingdi.h +FILE 4254 f:\sp\public\sdk\inc\pshpack4.h +FILE 4255 f:\sp\public\sdk\inc\poppack.h +FILE 4256 f:\sp\public\sdk\inc\winnt.h +FILE 4257 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4258 f:\sp\public\sdk\inc\winnetwk.h +FILE 4259 f:\sp\public\sdk\inc\imm.h +FILE 4260 f:\sp\vctools\crt_bld\self_x86\crt\src\xtoa.c +FILE 4261 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4262 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4263 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4264 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4265 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 4266 f:\sp\vctools\crt_bld\self_x86\crt\src\xtoas.c +FILE 4267 f:\sp\public\sdk\inc\pshpack1.h +FILE 4268 f:\sp\public\sdk\inc\winver.h +FILE 4269 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4270 f:\sp\public\sdk\inc\guiddef.h +FILE 4271 f:\sp\public\sdk\inc\specstrings.h +FILE 4272 f:\sp\public\sdk\inc\basetsd.h +FILE 4273 f:\sp\public\sdk\inc\winreg.h +FILE 4274 f:\sp\public\sdk\inc\ddbanned.h +FILE 4275 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4276 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4277 f:\sp\public\sdk\inc\windows.h +FILE 4278 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4279 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4280 f:\sp\public\sdk\inc\winbase.h +FILE 4281 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4282 f:\sp\public\sdk\inc\winerror.h +FILE 4283 f:\sp\public\sdk\inc\pshpack8.h +FILE 4284 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 4285 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4286 f:\sp\public\sdk\inc\reason.h +FILE 4287 f:\sp\public\sdk\inc\wincon.h +FILE 4288 f:\sp\public\sdk\inc\poppack.h +FILE 4289 f:\sp\public\sdk\inc\winnetwk.h +FILE 4290 f:\sp\public\sdk\inc\imm.h +FILE 4291 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4292 f:\sp\public\sdk\inc\windef.h +FILE 4293 f:\sp\public\sdk\inc\pshpack1.h +FILE 4294 f:\sp\public\sdk\inc\winver.h +FILE 4295 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4296 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4297 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4298 f:\sp\public\sdk\inc\winnt.h +FILE 4299 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4300 f:\sp\public\sdk\inc\winreg.h +FILE 4301 f:\sp\vctools\crt_bld\self_x86\crt\src\atox.c +FILE 4302 f:\sp\public\sdk\inc\winbase.h +FILE 4303 f:\sp\public\sdk\inc\winerror.h +FILE 4304 f:\sp\public\sdk\inc\pshpack8.h +FILE 4305 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4306 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4307 f:\sp\public\sdk\inc\reason.h +FILE 4308 f:\sp\public\sdk\inc\wincon.h +FILE 4309 f:\sp\public\sdk\inc\ddbanned.h +FILE 4310 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4311 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4312 f:\sp\public\sdk\inc\pshpack2.h +FILE 4313 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 4314 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4315 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 4316 f:\sp\public\sdk\inc\mcx.h +FILE 4317 f:\sp\public\sdk\inc\winuser.h +FILE 4318 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4319 f:\sp\public\sdk\inc\winnls.h +FILE 4320 f:\sp\public\sdk\inc\guiddef.h +FILE 4321 f:\sp\public\sdk\inc\windows.h +FILE 4322 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4323 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 4324 f:\sp\public\sdk\inc\specstrings.h +FILE 4325 f:\sp\public\sdk\inc\basetsd.h +FILE 4326 f:\sp\public\sdk\inc\stralign.h +FILE 4327 f:\sp\public\sdk\inc\tvout.h +FILE 4328 f:\sp\public\sdk\inc\winsvc.h +FILE 4329 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4330 f:\sp\public\sdk\inc\wingdi.h +FILE 4331 f:\sp\public\sdk\inc\pshpack4.h +PUBLIC 1005 0 @ILT+0(?h@C@google_breakpad@@SAPADABV12@@Z) +PUBLIC 100a 0 @ILT+5(?set_member@C@google_breakpad@@QAEXH@Z) +PUBLIC 100f 0 @ILT+10(??_EC@google_breakpad@@UAEPAXI@Z) +PUBLIC 1014 0 @ILT+15(??_EC@google_breakpad@@UAEPAXI@Z) +PUBLIC 1019 0 @ILT+20(?f@C@google_breakpad@@QAEXXZ) +PUBLIC 101e 0 @ILT+25(_main) +PUBLIC 1023 0 @ILT+30(??0C@google_breakpad@@QAE@XZ) +PUBLIC 1028 0 @ILT+35(??1C@google_breakpad@@UAE@XZ) +PUBLIC 102d 0 @ILT+40(?g@C@google_breakpad@@UAEHXZ) +FUNC 1060 54 8 main +1060 6 57 1 +1066 8 58 1 +106e e 59 1 +107c 8 60 1 +1084 b 61 1 +108f f 62 1 +109e 12 64 1 +10b0 4 65 1 +FUNC 10c0 a 0 google_breakpad::i +10c0 3 51 1 +10c3 5 52 1 +10c8 2 53 1 +FUNC 10f0 21 0 google_breakpad::C::C() +10f0 21 37 1 +FUNC 1120 14 0 google_breakpad::C::~C() +1120 14 38 1 +FUNC 1140 16 8 google_breakpad::C::set_member(int) +1140 16 40 1 +FUNC 1160 1e 0 google_breakpad::C::f() +1160 1e 43 1 +FUNC 1190 10 0 google_breakpad::C::g() +1190 10 44 1 +FUNC 11b0 7 4 google_breakpad::C::h(google_breakpad::C const &) +11b0 7 45 1 +FUNC 11c0 2c 0 google_breakpad::C::`vector deleting destructor'(unsigned int) +FUNC 11f7 f 4 type_info::name(__type_info_node *) +11f7 0 44 3806 +11f7 c 45 3806 +1203 3 46 3806 +FUNC 1206 e 0 type_info::~type_info() +1206 0 49 3806 +1206 d 50 3806 +1213 1 51 3806 +FUNC 1214 1c 0 type_info::`vector deleting destructor'(unsigned int) +FUNC 1230 f 4 type_info::_name_internal_method(__type_info_node *) +1230 0 54 3806 +1230 c 55 3806 +123c 3 56 3806 +FUNC 123f 8 0 type_info::_type_info_dtor_internal_method() +123f 0 59 3806 +123f 7 60 3806 +1246 1 61 3806 +FUNC 1247 1b 4 type_info::operator==(type_info const &) +1247 0 89 3806 +1247 18 90 3806 +125f 3 91 3806 +FUNC 1262 1c 4 type_info::operator!=(type_info const &) +1262 0 98 3806 +1262 19 99 3806 +127b 3 100 3806 +FUNC 127e 1f 4 type_info::before(type_info const &) +127e 0 103 3806 +127e 1c 104 3806 +129a 3 105 3806 +FUNC 129d 4 0 type_info::raw_name() +129d 0 108 3806 +129d 3 109 3806 +12a0 1 110 3806 +FUNC 12a1 b 4 type_info::type_info(type_info const &) +12a1 8 113 3806 +12a9 3 123 3806 +FUNC 12ac 5 4 type_info::operator=(type_info const &) +12ac 2 127 3806 +12ae 3 135 3806 +FUNC 12b1 5 4 operator delete(void *) +12b1 0 20 3214 +12b1 5 23 3214 +FUNC 12b6 a 4 _set_osplatform +12b6 a 385 1009 +FUNC 12c0 a 4 _set_osver +12c0 a 386 1009 +FUNC 12ca a 4 _set_winver +12ca a 387 1009 +FUNC 12d4 a 4 _set_winmajor +12d4 a 388 1009 +FUNC 12de a 4 _set_winminor +12de a 389 1009 +FUNC 12e8 24 4 fast_error_exit +12e8 0 375 1022 +12e8 9 384 1022 +12f1 5 386 1022 +12f6 9 388 1022 +12ff c 389 1022 +130b 1 390 1022 +FUNC 130c 41 0 check_managed_app +130c 0 413 1022 +130c b 418 1022 +1317 5 422 1022 +131c a 424 1022 +1326 2 425 1022 +1328 9 427 1022 +1331 2 428 1022 +1333 7 433 1022 +133a 2 434 1022 +133c d 437 1022 +1349 1 438 1022 +134a 2 419 1022 +134c 1 438 1022 +FUNC 134d 1b6 0 __tmainCRTStartup +134d c 203 1022 +1359 19 233 1022 +1372 4 234 1022 +1376 8 235 1022 +137e a 236 1022 +1388 2 242 1022 +138a 7 243 1022 +1391 3 244 1022 +1394 4 243 1022 +1398 9 244 1022 +13a1 2 245 1022 +13a3 6 248 1022 +13a9 6 249 1022 +13af 6 250 1022 +13b5 9 256 1022 +13be 9 257 1022 +13c7 8 258 1022 +13cf 6 259 1022 +13d5 d 260 1022 +13e2 6 262 1022 +13e8 5 263 1022 +13ed 6 264 1022 +13f3 6 265 1022 +13f9 6 266 1022 +13ff 8 271 1022 +1407 c 273 1022 +1413 8 274 1022 +141b 9 276 1022 +1424 8 277 1022 +142c 5 286 1022 +1431 4 294 1022 +1435 9 296 1022 +143e 8 297 1022 +1446 b 300 1022 +1451 a 303 1022 +145b 9 305 1022 +1464 8 306 1022 +146c 9 307 1022 +1475 8 308 1022 +147d 8 310 1022 +1485 4 311 1022 +1489 7 312 1022 +1490 a 326 1022 +149a 18 327 1022 +14b2 6 330 1022 +14b8 6 331 1022 +14be 5 333 1022 +14c3 2 335 1022 +14c5 17 336 1022 +14dc 6 342 1022 +14e2 6 344 1022 +14e8 6 345 1022 +14ee 5 347 1022 +14f3 7 349 1022 +14fa 3 351 1022 +14fd 6 352 1022 +FUNC 1503 a 0 mainCRTStartup +1503 0 186 1022 +1503 5 193 1022 +1508 5 195 1022 +FUNC 150d 22 18 _invoke_watson_if_error +150d 3 754 3783 +1510 6 755 3783 +1516 17 759 3783 +152d 2 760 3783 +FUNC 152f 70 4 type_info::_Type_info_dtor(type_info *) +152f c 62 3748 +153b 8 63 3748 +1543 4 64 3748 +1547 a 65 3748 +1551 d 70 3748 +155e 4 72 3748 +1562 4 74 3748 +1566 6 79 3748 +156c 7 80 3748 +1573 9 94 3748 +157c 4 101 3748 +1580 c 103 3748 +158c 6 107 3748 +1592 2 83 3748 +1594 2 72 3748 +1596 9 104 3748 +FUNC 159f f5 8 type_info::_Name_base(type_info const *,__type_info_node *) +159f c 109 3748 +15ab e 113 3748 +15b9 24 124 3748 +15dd 7 125 3748 +15e4 16 132 3748 +15fa 2 133 3748 +15fc 5 132 3748 +1601 b 136 3748 +160c 5 142 3748 +1611 a 149 3748 +161b 4 150 3748 +161f 11 157 3748 +1630 20 158 3748 +1650 5 159 3748 +1655 9 165 3748 +165e 3 166 3748 +1661 2 167 3748 +1663 7 173 3748 +166a 9 180 3748 +1673 c 181 3748 +167f 3 188 3748 +1682 6 189 3748 +1688 3 181 3748 +168b 9 182 3748 +FUNC 1694 70 4 type_info::_Type_info_dtor_internal(type_info *) +1694 c 197 3748 +16a0 8 198 3748 +16a8 4 199 3748 +16ac a 200 3748 +16b6 d 205 3748 +16c3 4 207 3748 +16c7 4 209 3748 +16cb 6 214 3748 +16d1 7 215 3748 +16d8 9 229 3748 +16e1 4 236 3748 +16e5 c 238 3748 +16f1 6 242 3748 +16f7 2 218 3748 +16f9 2 207 3748 +16fb 9 239 3748 +FUNC 1704 31 10 __unDNameHelper +1704 3 249 3748 +1707 7 250 3748 +170e 7 252 3748 +1715 1e 260 3748 +1733 2 261 3748 +FUNC 1735 eb 8 type_info::_Name_base_internal(type_info const *,__type_info_node *) +1735 c 265 3748 +1741 e 269 3748 +174f 1a 273 3748 +1769 7 274 3748 +1770 16 281 3748 +1786 2 282 3748 +1788 5 281 3748 +178d b 285 3748 +1798 5 291 3748 +179d a 298 3748 +17a7 4 299 3748 +17ab 11 306 3748 +17bc 20 307 3748 +17dc 5 308 3748 +17e1 9 314 3748 +17ea 3 315 3748 +17ed 2 316 3748 +17ef 7 322 3748 +17f6 9 329 3748 +17ff c 330 3748 +180b 3 337 3748 +180e 6 338 3748 +1814 3 330 3748 +1817 9 331 3748 +FUNC 1820 53 4 __clean_type_info_names_internal +1820 c 346 3748 +182c 8 347 3748 +1834 4 348 3748 +1838 6 352 3748 +183e 4 354 3748 +1842 3 356 3748 +1845 7 357 3748 +184c 8 358 3748 +1854 4 354 3748 +1858 c 359 3748 +1864 6 363 3748 +186a 9 361 3748 +FUNC 1880 88 8 strcmp +1880 0 65 593 +1880 4 73 593 +1884 4 74 593 +1888 6 76 593 +188e 2 77 593 +1890 2 81 593 +1892 2 83 593 +1894 2 84 593 +1896 2 85 593 +1898 2 86 593 +189a 3 87 593 +189d 2 88 593 +189f 2 89 593 +18a1 2 90 593 +18a3 3 92 593 +18a6 3 94 593 +18a9 2 95 593 +18ab 2 96 593 +18ad 2 97 593 +18af 3 98 593 +18b2 2 99 593 +18b4 3 100 593 +18b7 3 101 593 +18ba 2 102 593 +18bc 4 103 593 +18c0 2 107 593 +18c2 2 108 593 +18c4 2 115 593 +18c6 2 116 593 +18c8 3 117 593 +18cb 1 118 593 +18cc 6 122 593 +18d2 2 123 593 +18d4 2 125 593 +18d6 3 126 593 +18d9 2 127 593 +18db 2 128 593 +18dd 3 129 593 +18e0 2 130 593 +18e2 2 131 593 +18e4 6 133 593 +18ea 2 134 593 +18ec 3 139 593 +18ef 3 140 593 +18f2 2 141 593 +18f4 2 142 593 +18f6 2 143 593 +18f8 2 144 593 +18fa 3 145 593 +18fd 2 146 593 +18ff 2 147 593 +1901 2 148 593 +1903 3 149 593 +1906 2 150 593 +FUNC 1908 8e 4 free +1908 c 42 3545 +1914 7 47 3545 +191b 9 53 3545 +1924 8 57 3545 +192c 4 58 3545 +1930 e 60 3545 +193e 9 61 3545 +1947 c 64 3545 +1953 6 68 3545 +1959 3 70 3545 +195c 2 106 3545 +195e 9 65 3545 +1967 f 109 3545 +1976 4 110 3545 +197a 16 112 3545 +1990 6 115 3545 +FUNC 1996 3d 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *) +1996 0 67 3654 +1996 33 68 3654 +19c9 5 69 3654 +19ce 2 72 3654 +19d0 3 73 3654 +FUNC 19d3 e 0 __CxxSetUnhandledExceptionFilter +19d3 0 86 3654 +19d3 b 89 3654 +19de 2 90 3654 +19e0 1 91 3654 +FUNC 19e1 24 4 _amsg_exit +19e1 0 446 974 +19e1 5 449 974 +19e6 9 450 974 +19ef b 451 974 +19fa a 452 974 +1a04 1 453 974 +FUNC 1a05 26 4 __crtCorExitProcess +1a05 0 650 974 +1a05 b 654 974 +1a10 4 655 974 +1a14 c 656 974 +1a20 4 657 974 +1a24 6 658 974 +1a2a 1 668 974 +FUNC 1a2b 15 4 __crtExitProcess +1a2b 0 673 974 +1a2b a 674 974 +1a35 b 683 974 +FUNC 1a40 9 0 _lockexit +1a40 0 733 974 +1a40 8 734 974 +1a48 1 735 974 +FUNC 1a49 9 0 _unlockexit +1a49 0 759 974 +1a49 8 760 974 +1a51 1 761 974 +FUNC 1a52 18 4 _initterm +1a52 3 841 974 +1a55 2 855 974 +1a57 6 853 974 +1a5d 2 854 974 +1a5f 3 855 974 +1a62 7 848 974 +1a69 1 857 974 +FUNC 1a6a 20 8 _initterm_e +1a6a 1 890 974 +1a6b c 899 974 +1a77 6 904 974 +1a7d 2 905 974 +1a7f 3 906 974 +1a82 7 899 974 +1a89 1 910 974 +FUNC 1a8a 37 4 _get_osplatform +1a8a 0 929 974 +1a8a 27 931 974 +1ab1 1 939 974 +1ab2 9 934 974 +1abb 2 936 974 +1abd 3 938 974 +1ac0 1 939 974 +FUNC 1ac1 3c 4 _get_osver +1ac1 0 958 974 +1ac1 27 960 974 +1ae8 1 968 974 +1ae9 8 963 974 +1af1 8 965 974 +1af9 3 967 974 +1afc 1 968 974 +FUNC 1afd 3c 4 _get_winver +1afd 0 987 974 +1afd 27 989 974 +1b24 1 997 974 +1b25 8 992 974 +1b2d 8 994 974 +1b35 3 996 974 +1b38 1 997 974 +FUNC 1b39 3c 4 _get_winmajor +1b39 0 1016 974 +1b39 27 1018 974 +1b60 1 1026 974 +1b61 8 1021 974 +1b69 8 1023 974 +1b71 3 1025 974 +1b74 1 1026 974 +FUNC 1b75 3c 4 _get_winminor +1b75 0 1045 974 +1b75 27 1047 974 +1b9c 1 1055 974 +1b9d 8 1050 974 +1ba5 8 1052 974 +1bad 3 1054 974 +1bb0 1 1055 974 +FUNC 1bb1 37 4 _get_wpgmptr +1bb1 0 1074 974 +1bb1 27 1076 974 +1bd8 1 1085 974 +1bd9 9 1080 974 +1be2 2 1082 974 +1be4 3 1084 974 +1be7 1 1085 974 +FUNC 1be8 37 4 _get_pgmptr +1be8 0 1104 974 +1be8 27 1106 974 +1c0f 1 1115 974 +1c10 9 1110 974 +1c19 2 1112 974 +1c1b 3 1114 974 +1c1e 1 1115 974 +FUNC 1c1f 92 4 _cinit +1c1f 0 263 974 +1c1f 18 273 974 +1c37 b 275 974 +1c42 5 277 974 +1c47 f 283 974 +1c56 4 284 974 +1c5a 4 285 974 +1c5e a 288 974 +1c68 20 293 974 +1c88 1a 306 974 +1ca2 c 308 974 +1cae 2 312 974 +1cb0 1 313 974 +FUNC 1cb1 e2 c doexit +1cb1 c 499 974 +1cbd 8 517 974 +1cc5 5 518 974 +1cca b 520 974 +1cd5 6 521 974 +1cdb 8 524 974 +1ce3 5 526 974 +1ce8 e 542 974 +1cf6 12 543 974 +1d08 5 545 974 +1d0d b 546 974 +1d18 10 551 974 +1d28 9 552 974 +1d31 2 553 974 +1d33 10 558 974 +1d43 10 566 974 +1d53 c 584 974 +1d5f 6 588 974 +1d65 6 592 974 +1d6b 8 594 974 +1d73 8 596 974 +1d7b 3 584 974 +1d7e 6 585 974 +1d84 9 586 974 +1d8d 6 597 974 +FUNC 1d93 11 4 exit +1d93 0 397 974 +1d93 10 398 974 +1da3 1 399 974 +FUNC 1da4 11 4 _exit +1da4 0 405 974 +1da4 10 406 974 +1db4 1 407 974 +FUNC 1db5 f 0 _cexit +1db5 0 412 974 +1db5 e 413 974 +1dc3 1 414 974 +FUNC 1dc4 f 0 _c_exit +1dc4 0 419 974 +1dc4 e 420 974 +1dd2 1 421 974 +FUNC 1dd3 4c 0 _init_pointers +1dd3 1 786 974 +1dd4 7 787 974 +1ddb 6 789 974 +1de1 6 790 974 +1de7 6 791 974 +1ded 6 792 974 +1df3 6 793 974 +1df9 6 794 974 +1dff 6 795 974 +1e05 6 796 974 +1e0b 13 799 974 +1e1e 1 800 974 +FUNC 1e1f 1a0 4 _NMSG_WRITE +1e1f 2 174 832 +1e21 a 178 832 +1e2b f 179 832 +1e3a a 182 832 +1e44 2a 203 832 +1e6e c 215 832 +1e7a 2a 224 832 +1ea4 1e 227 832 +1ec2 26 228 832 +1ee8 d 231 832 +1ef5 b 233 832 +1f00 2f 234 832 +1f2f 20 237 832 +1f4f 22 238 832 +1f71 15 242 832 +1f86 a 205 832 +1f90 9 206 832 +1f99 24 212 832 +1fbd 2 245 832 +FUNC 1fbf 20 4 _GET_RTERRMSG +1fbf 0 268 832 +1fbf 2 271 832 +1fc1 13 272 832 +1fd4 2 275 832 +1fd6 1 276 832 +1fd7 7 273 832 +1fde 1 276 832 +FUNC 1fdf 39 0 _FF_MSGBANNER +1fdf 0 141 832 +1fdf 22 145 832 +2001 a 147 832 +200b c 148 832 +2017 1 150 832 +FUNC 2018 1 4 _initp_misc_winxfltr +2018 0 105 1166 +2018 1 106 1166 +FUNC 2019 32 4 xcptlookup +2019 0 410 1166 +2019 b 411 1166 +2024 14 418 1166 +2038 e 425 1166 +2046 2 428 1166 +2048 2 426 1166 +204a 1 429 1166 +FUNC 204b 15e 8 _XcptFilter +204b 6 206 1166 +2051 7 213 1166 +2058 8 214 1166 +2060 34 219 1166 +2094 2 221 1166 +2096 2 225 1166 +2098 3 227 1166 +209b 7 234 1166 +20a2 7 235 1166 +20a9 5 243 1166 +20ae 4 248 1166 +20b2 8 249 1166 +20ba 3 255 1166 +20bd 6 259 1166 +20c3 6 273 1166 +20c9 6 274 1166 +20cf c 283 1166 +20db 17 291 1166 +20f2 1e 294 1166 +2110 3 291 1166 +2113 c 321 1166 +211f 9 323 1166 +2128 7 325 1166 +212f 9 327 1166 +2138 7 329 1166 +213f 9 331 1166 +2148 7 333 1166 +214f 9 335 1166 +2158 7 337 1166 +215f 9 339 1166 +2168 7 341 1166 +216f 9 343 1166 +2178 7 345 1166 +217f 7 347 1166 +2186 8 356 1166 +218e 3 361 1166 +2191 2 363 1166 +2193 4 368 1166 +2197 3 369 1166 +219a 7 375 1166 +21a1 6 377 1166 +21a7 2 379 1166 +FUNC 21a9 1b 8 __CppXcptFilter +21a9 0 145 1166 +21a9 b 146 1166 +21b4 c 147 1166 +21c0 1 151 1166 +21c1 2 149 1166 +21c3 1 151 1166 +FUNC 21c4 db 0 _setenvp +21c4 1 77 694 +21c5 c 85 694 +21d1 5 86 694 +21d6 8 91 694 +21de 4 98 694 +21e2 8 99 694 +21ea 4 110 694 +21ee 1 111 694 +21ef 11 112 694 +2200 15 117 694 +2215 2 118 694 +2217 9 121 694 +2220 9 123 694 +2229 6 125 694 +222f 10 127 694 +223f 1c 133 694 +225b 3 134 694 +225e 6 121 694 +2264 b 138 694 +226f 6 139 694 +2275 2 142 694 +2277 a 149 694 +2281 7 152 694 +2288 17 153 694 +FUNC 229f a 4 _set_pgmptr +229f a 334 717 +FUNC 22a9 198 c parse_cmdline +22a9 4 218 736 +22ad 6 226 736 +22b3 8 230 736 +22bb 14 231 736 +22cf 3 250 736 +22d2 5 252 736 +22d7 5 254 736 +22dc 9 255 736 +22e5 2 256 736 +22e7 2 258 736 +22e9 4 259 736 +22ed 8 260 736 +22f5 2 262 736 +22f7 f 264 736 +2306 2 265 736 +2308 6 266 736 +230e a 267 736 +2318 1 268 736 +2319 1a 272 736 +2333 4 277 736 +2337 4 278 736 +233b 4 281 736 +233f 9 286 736 +2348 a 287 736 +2352 3 288 736 +2355 1 275 736 +2356 2 276 736 +2358 9 291 736 +2361 6 295 736 +2367 9 296 736 +2370 2 297 736 +2372 3 311 736 +2375 4 315 736 +2379 1 318 736 +237a 1 319 736 +237b 5 316 736 +2380 5 321 736 +2385 5 324 736 +238a e 325 736 +2398 2 326 736 +239a 2 327 736 +239c d 329 736 +23a9 2 332 736 +23ab 5 336 736 +23b0 4 337 736 +23b4 4 338 736 +23b8 6 339 736 +23be 3 338 736 +23c1 14 343 736 +23d5 4 348 736 +23d9 2 349 736 +23db 10 350 736 +23eb b 351 736 +23f6 2 352 736 +23f8 a 354 736 +2402 2 355 736 +2404 a 356 736 +240e 1 357 736 +240f 2 358 736 +2411 5 361 736 +2416 1 363 736 +2417 5 372 736 +241c 4 376 736 +2420 7 377 736 +2427 2 378 736 +2429 8 379 736 +2431 9 382 736 +243a 3 383 736 +243d 2 384 736 +243f 2 385 736 +FUNC 2441 b9 0 _setargv +2441 7 88 736 +2448 c 97 736 +2454 5 98 736 +2459 18 104 736 +2471 19 120 736 +248a 11 127 736 +249b 15 132 736 +24b0 a 136 736 +24ba 2 138 736 +24bc 8 140 736 +24c4 3 141 736 +24c7 2 142 736 +24c9 13 149 736 +24dc c 153 736 +24e8 6 157 736 +24ee 4 172 736 +24f2 6 134 736 +24f8 2 173 736 +FUNC 24fa 135 0 __crtGetEnvironmentStringsA +24fa 2 43 2721 +24fc 1a 57 2721 +2516 8 59 2721 +251e c 60 2721 +252a b 62 2721 +2535 e 63 2721 +2543 9 68 2721 +254c 4 71 2721 +2550 8 72 2721 +2558 7 73 2721 +255f 7 77 2721 +2566 7 78 2721 +256d 7 79 2721 +2574 1b 93 2721 +258f 13 97 2721 +25a2 11 111 2721 +25b3 a 113 2721 +25bd 8 114 2721 +25c5 7 99 2721 +25cc 4 100 2721 +25d0 6 123 2721 +25d6 2 152 2721 +25d8 a 126 2721 +25e2 6 127 2721 +25e8 4 133 2721 +25ec 5 134 2721 +25f1 5 135 2721 +25f6 5 138 2721 +25fb d 140 2721 +2608 7 141 2721 +260f 5 142 2721 +2614 b 145 2721 +261f 7 147 2721 +2626 6 149 2721 +262c 3 153 2721 +FUNC 262f 240 0 _ioinit +262f c 111 3137 +263b 5 122 3137 +2640 a 127 3137 +264a 7 128 3137 +2651 f 137 3137 +2660 6 139 3137 +2666 5 142 3137 +266b 6 143 3137 +2671 8 145 3137 +2679 4 146 3137 +267d 3 147 3137 +2680 4 148 3137 +2684 3 149 3137 +2687 4 151 3137 +268b 4 152 3137 +268f 4 153 3137 +2693 13 145 3137 +26a6 15 161 3137 +26bb 2 166 3137 +26bd 3 172 3137 +26c0 6 173 3137 +26c6 b 179 3137 +26d1 5 185 3137 +26d6 f 191 3137 +26e5 9 204 3137 +26ee 7 205 3137 +26f5 8 207 3137 +26fd 4 208 3137 +2701 3 209 3137 +2704 4 210 3137 +2708 4 211 3137 +270c 4 212 3137 +2710 4 213 3137 +2714 4 214 3137 +2718 f 207 3137 +2727 9 185 3137 +2730 2 284 3137 +2732 6 197 3137 +2738 8 221 3137 +2740 24 234 3137 +2764 15 236 3137 +2779 7 237 3137 +2780 5 238 3137 +2785 18 241 3137 +279d 3 243 3137 +27a0 d 221 3137 +27ad 2 253 3137 +27af b 255 3137 +27ba c 258 3137 +27c6 6 306 3137 +27cc 4 262 3137 +27d0 30 266 3137 +2800 2 271 3137 +2802 a 277 3137 +280c 6 278 3137 +2812 5 279 3137 +2817 4 280 3137 +281b 14 284 3137 +282f 3 286 3137 +2832 2 288 3137 +2834 4 297 3137 +2838 6 298 3137 +283e a 253 3137 +2848 c 313 3137 +2854 4 315 3137 +2858 7 128 3137 +285f a 129 3137 +2869 6 316 3137 +FUNC 286f 4c 0 _ioterm +286f 2 341 3137 +2871 5 345 3137 +2876 6 347 3137 +287c 8 353 3137 +2884 9 355 3137 +288d 11 356 3137 +289e 4 353 3137 +28a2 7 361 3137 +28a9 11 362 3137 +28ba 1 365 3137 +FUNC 28bb 24 0 _RTC_Initialize +FUNC 28df 24 0 _RTC_Terminate +FUNC 2903 6c 0 _use_encode_pointer +2903 7 66 641 +290a 2 72 641 +290c 12 75 641 +291e 7 76 641 +2925 5 78 641 +292a 7 82 641 +2931 5 85 641 +2936 e 91 641 +2944 1f 93 641 +2963 4 95 641 +2967 6 100 641 +296d 2 101 641 +FUNC 296f 6e 4 _encode_pointer +296f 1 120 641 +2970 2b 129 641 +299b 8 145 641 +29a3 d 133 641 +29b0 d 135 641 +29bd c 138 641 +29c9 4 148 641 +29cd a 150 641 +29d7 5 153 641 +29dc 1 154 641 +FUNC 29dd 9 0 _encoded_null +29dd 0 173 641 +29dd 8 174 641 +29e5 1 175 641 +FUNC 29e6 6e 4 _decode_pointer +29e6 1 194 641 +29e7 2b 203 641 +2a12 8 219 641 +2a1a d 207 641 +2a27 d 209 641 +2a34 c 212 641 +2a40 4 222 641 +2a44 a 224 641 +2a4e 5 227 641 +2a53 1 228 641 +FUNC 2a54 9 4 __crtTlsAlloc +2a54 0 240 641 +2a54 6 241 641 +2a5a 3 242 641 +FUNC 2a5d 15 4 __fls_getvalue +2a5d 0 258 641 +2a5d 12 259 641 +2a6f 3 260 641 +FUNC 2a72 6 0 __get_flsindex +2a72 0 272 641 +2a72 5 273 641 +2a77 1 274 641 +FUNC 2a78 32 0 __set_flsgetvalue +2a78 1 286 641 +2a79 e 288 641 +2a87 4 289 641 +2a8b e 291 641 +2a99 d 292 641 +2aa6 3 294 641 +2aa9 1 298 641 +FUNC 2aaa 19 8 __fls_setvalue +2aaa 0 315 641 +2aaa 16 316 641 +2ac0 3 317 641 +FUNC 2ac3 3d 0 _mtterm +2ac3 0 473 641 +2ac3 a 480 641 +2acd f 481 641 +2adc 7 482 641 +2ae3 a 485 641 +2aed 7 486 641 +2af4 7 487 641 +2afb 5 494 641 +FUNC 2b00 bf 8 _initptd +2b00 c 521 641 +2b0c e 522 641 +2b1a a 524 641 +2b24 6 525 641 +2b2a 4 527 641 +2b2e 9 529 641 +2b37 16 532 641 +2b4d 10 533 641 +2b5d 3 540 641 +2b60 7 544 641 +2b67 7 545 641 +2b6e 8 546 641 +2b76 7 547 641 +2b7d 8 551 641 +2b85 4 552 641 +2b89 6 553 641 +2b8f 4 561 641 +2b93 8 562 641 +2b9b 9 563 641 +2ba4 c 565 641 +2bb0 6 568 641 +2bb6 9 566 641 +FUNC 2bbf 77 0 _getptd_noexit +2bbf 2 588 641 +2bc1 6 592 641 +2bc7 15 600 641 +2bdc 14 608 641 +2bf0 19 610 641 +2c09 a 616 641 +2c13 6 618 641 +2c19 6 619 641 +2c1f 2 621 641 +2c21 7 627 641 +2c28 2 628 641 +2c2a 8 633 641 +2c32 3 635 641 +2c35 1 636 641 +FUNC 2c36 18 0 _getptd +2c36 1 657 641 +2c37 7 658 641 +2c3e 4 659 641 +2c42 8 660 641 +2c4a 3 662 641 +2c4d 1 663 641 +FUNC 2c4e 121 4 _freefls +2c4e c 691 641 +2c5a b 702 641 +2c65 7 703 641 +2c6c 7 704 641 +2c73 7 706 641 +2c7a 7 707 641 +2c81 7 709 641 +2c88 7 710 641 +2c8f 7 712 641 +2c96 7 713 641 +2c9d 7 715 641 +2ca4 7 716 641 +2cab 7 718 641 +2cb2 7 719 641 +2cb9 a 721 641 +2cc3 7 722 641 +2cca 8 724 641 +2cd2 4 725 641 +2cd6 1a 728 641 +2cf0 7 729 641 +2cf7 c 731 641 +2d03 8 735 641 +2d0b 7 737 641 +2d12 7 738 641 +2d19 7 740 641 +2d20 15 743 641 +2d35 7 744 641 +2d3c c 747 641 +2d48 7 751 641 +2d4f 8 754 641 +2d57 3 731 641 +2d5a 9 732 641 +2d63 3 747 641 +2d66 9 748 641 +FUNC 2d6f 69 4 _freeptd +2d6f 0 778 641 +2d6f a 783 641 +2d79 1b 795 641 +2d94 13 796 641 +2da7 16 802 641 +2dbd 7 804 641 +2dc4 a 807 641 +2dce 9 811 641 +2dd7 1 813 641 +FUNC 2dd8 6 0 __threadid +2dd8 0 837 641 +2dd8 6 838 641 +FUNC 2dde 6 0 __threadhandle +2dde 0 844 641 +2dde 6 845 641 +FUNC 2de4 184 0 _mtinit +2de4 1 346 641 +2de5 d 355 641 +2df2 4 356 641 +2df6 5 357 641 +2dfb 3 358 641 +2dfe 2 444 641 +2e00 e 362 641 +2e0e d 365 641 +2e1b d 368 641 +2e28 d 371 641 +2e35 2a 372 641 +2e5f a 375 641 +2e69 1a 379 641 +2e83 25 388 641 +2ea8 5 393 641 +2ead b 400 641 +2eb8 10 401 641 +2ec8 10 402 641 +2ed8 18 403 641 +2ef0 7 410 641 +2ef7 2 412 641 +2ef9 1b 418 641 +2f14 2 420 641 +2f16 2d 428 641 +2f43 a 438 641 +2f4d 6 440 641 +2f53 6 441 641 +2f59 5 443 641 +2f5e 5 430 641 +2f63 4 389 641 +2f67 1 444 641 +FUNC 2f68 5b 0 __heap_select +2f68 6 70 3503 +2f6e 23 143 3503 +2f91 1b 144 3503 +2fac d 145 3503 +2fb9 3 146 3503 +2fbc 2 164 3503 +2fbe 3 161 3503 +2fc1 2 164 3503 +FUNC 2fc3 5a 4 _heap_init +2fc3 0 192 3503 +2fc3 20 199 3503 +2fe3 2 200 3503 +2fe5 1 240 3503 +2fe6 5 204 3503 +2feb a 206 3503 +2ff5 f 209 3503 +3004 c 211 3503 +3010 7 212 3503 +3017 2 213 3503 +3019 3 239 3503 +301c 1 240 3503 +FUNC 301d 74 0 _heap_term +301d 1 261 3503 +301e c 264 3503 +302a 1b 270 3503 +3045 f 273 3503 +3054 b 276 3503 +305f d 278 3503 +306c 11 281 3503 +307d c 300 3503 +3089 7 301 3503 +3090 1 302 3503 +FUNC 3091 6 0 _get_heap_handle +3091 0 320 3503 +3091 5 322 3503 +3096 1 323 3503 +FUNC 3098 45 0 _SEH_prolog4 +FUNC 30dd 14 0 _SEH_epilog4 +FUNC 3100 24 0 ValidateLocalCookies +FUNC 3130 196 10 _except_handler4 +FUNC 32c6 94 0 __security_init_cookie +32c6 6 97 2103 +32cc 21 114 2103 +32ed 7 116 2103 +32f4 3 117 2103 +32f7 a 127 2103 +3301 6 132 2103 +3307 8 135 2103 +330f 8 136 2103 +3317 8 137 2103 +331f 10 139 2103 +332f 2 144 2103 +3331 4 161 2103 +3335 7 163 2103 +333c 4 166 2103 +3340 7 168 2103 +3347 6 172 2103 +334d b 173 2103 +3358 2 175 2103 +FUNC 335a a 4 _initp_misc_invarg +335a 0 38 1742 +335a 9 39 1742 +3363 1 40 1742 +FUNC 3364 fc 14 _invoke_watson +3364 1c 111 1742 +3380 6 128 1742 +3386 6 129 1742 +338c 6 130 1742 +3392 3 131 1742 +3395 3 132 1742 +3398 3 133 1742 +339b 7 134 1742 +33a2 7 135 1742 +33a9 4 136 1742 +33ad 4 137 1742 +33b1 4 138 1742 +33b5 4 139 1742 +33b9 1 140 1742 +33ba 6 141 1742 +33c0 6 147 1742 +33c6 19 148 1742 +33df 3 150 1742 +33e2 13 163 1742 +33f5 6 168 1742 +33fb 13 169 1742 +340e 6 171 1742 +3414 a 174 1742 +341e a 176 1742 +3428 8 180 1742 +3430 8 181 1742 +3438 12 184 1742 +344a 16 185 1742 +FUNC 3460 22 4 _set_invalid_parameter_handler +3460 1 207 1742 +3461 b 211 1742 +346c d 212 1742 +3479 5 214 1742 +347e 3 216 1742 +3481 1 217 1742 +FUNC 3482 d 0 _get_invalid_parameter_handler +3482 0 221 1742 +3482 c 225 1742 +348e 1 228 1742 +FUNC 348f 9 14 _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int) +348f 3 266 1742 +3492 1 274 1742 +3493 5 273 1742 +FUNC 3498 24 14 _invalid_parameter +3498 3 70 1742 +349b b 77 1742 +34a6 5 78 1742 +34ab 1 89 1742 +34ac 2 80 1742 +34ae 8 86 1742 +34b6 1 89 1742 +34b7 5 88 1742 +FUNC 34bc 10 0 _invalid_parameter_noinfo +34bc 0 98 1742 +34bc f 99 1742 +34cb 1 100 1742 +FUNC 34cc 9 14 _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int) +34cc 3 249 1742 +34cf 1 257 1742 +34d0 5 256 1742 +FUNC 34d5 49 0 _mtinitlocks +34d5 2 137 785 +34d7 7 144 785 +34de 11 145 785 +34ef 2 146 785 +34f1 15 148 785 +3506 6 144 785 +350c 5 157 785 +3511 d 158 785 +FUNC 351e 55 0 _mtdeletelocks +351e 1 188 785 +351f d 194 785 +352c c 196 785 +3538 3 200 785 +353b 6 206 785 +3541 f 207 785 +3550 6 215 785 +3556 c 217 785 +3562 10 221 785 +3572 1 224 785 +FUNC 3573 15 4 _unlock +3573 3 371 785 +3576 10 375 785 +3586 2 376 785 +FUNC 3588 18 4 _lockerr_exit +3588 0 403 785 +3588 c 404 785 +3594 b 405 785 +359f 1 406 785 +FUNC 35a0 c3 4 _mtinitlocknum +35a0 c 259 785 +35ac 6 261 785 +35b2 a 269 785 +35bc 5 270 785 +35c1 7 271 785 +35c8 c 272 785 +35d4 e 276 785 +35e2 4 277 785 +35e6 e 279 785 +35f4 b 280 785 +35ff 4 281 785 +3603 8 284 785 +360b 3 285 785 +360e 4 287 785 +3612 11 288 785 +3623 7 289 785 +362a b 290 785 +3635 3 291 785 +3638 2 292 785 +363a 2 293 785 +363c 2 296 785 +363e 7 297 785 +3645 c 300 785 +3651 3 304 785 +3654 6 305 785 +365a 9 301 785 +FUNC 3663 31 4 _lock +3663 3 333 785 +3666 10 338 785 +3676 b 340 785 +3681 8 341 785 +3689 9 348 785 +3692 2 349 785 +FUNC 3694 65 c strcpy_s +3694 0 13 448 +3694 30 18 448 +36c4 c 19 448 +36d0 2 21 448 +36d2 d 23 448 +36df 4 27 448 +36e3 2 29 448 +36e5 e 30 448 +36f3 5 33 448 +36f8 1 34 448 +FUNC 3700 8b 4 strlen +3700 0 54 547 +3700 4 63 547 +3704 6 64 547 +370a 2 65 547 +370c 2 69 547 +370e 3 70 547 +3711 2 71 547 +3713 2 72 547 +3715 6 73 547 +371b 2 74 547 +371d 13 76 547 +3730 2 81 547 +3732 5 82 547 +3737 2 83 547 +3739 3 84 547 +373c 2 85 547 +373e 3 86 547 +3741 5 87 547 +3746 2 88 547 +3748 3 90 547 +374b 2 91 547 +374d 2 92 547 +374f 2 93 547 +3751 2 94 547 +3753 5 95 547 +3758 2 96 547 +375a 5 97 547 +375f 2 98 547 +3761 2 99 547 +3763 3 103 547 +3766 4 104 547 +376a 2 105 547 +376c 1 106 547 +376d 3 108 547 +3770 4 109 547 +3774 2 110 547 +3776 1 111 547 +3777 3 113 547 +377a 4 114 547 +377e 2 115 547 +3780 1 116 547 +3781 3 118 547 +3784 4 119 547 +3788 2 120 547 +378a 1 121 547 +FUNC 378b 6 0 HeapManager::Block::Block() +378b 6 90 3704 +FUNC 3791 1b 8 HeapManager::Constructor(void * (*)(unsigned int),void (*)(void *)) +3791 6 100 3704 +3797 7 101 3704 +379e 5 102 3704 +37a3 3 103 3704 +37a6 3 104 3704 +37a9 3 105 3704 +FUNC 37ac 26 0 HeapManager::Destructor() +37ac 9 110 3704 +37b5 2 111 3704 +37b7 5 113 3704 +37bc 15 115 3704 +37d1 1 118 3704 +FUNC 37d2 63 0 UnDecorator::getNumberOfDimensions() +37d2 0 1663 3704 +37d2 c 1664 3704 +37de 2 1665 3704 +37e0 1 1696 3704 +37e1 a 1666 3704 +37eb d 1667 3704 +37f8 1 1696 3704 +37f9 4 1670 3704 +37fd 4 1677 3704 +3801 a 1679 3704 +380b 6 1680 3704 +3811 d 1684 3704 +381e 5 1675 3704 +3823 e 1690 3704 +3831 3 1691 3704 +3834 1 1696 3704 +FUNC 3835 474 0 UnDecorator::getTypeEncoding() +3835 f 2335 3704 +3844 2 2336 3704 +3846 5 2341 3704 +384b 9 2345 3704 +3854 c 2351 3704 +3860 9 2423 3704 +3869 2 2426 3704 +386b 2a 2427 3704 +3895 8 2450 3704 +389d 2 2451 3704 +389f 24 2454 3704 +38c3 7 2462 3704 +38ca 5 2463 3704 +38cf 6 2353 3704 +38d5 8 2358 3704 +38dd b 2362 3704 +38e8 5 2363 3704 +38ed 2 2364 3704 +38ef 5 2365 3704 +38f4 9 2369 3704 +38fd 1b 2373 3704 +3918 11 2377 3704 +3929 a 2393 3704 +3933 10 2388 3704 +3943 2 2389 3704 +3945 18 2384 3704 +395d 2 2385 3704 +395f 12 2380 3704 +3971 16 2399 3704 +3987 11 2418 3704 +3998 a 2406 3704 +39a2 5 2407 3704 +39a7 15 2410 3704 +39bc 5 2422 3704 +39c1 1b 2427 3704 +39dc a 2430 3704 +39e6 5 2431 3704 +39eb 7 2472 3704 +39f2 a 2478 3704 +39fc c 2483 3704 +3a08 5 2485 3704 +3a0d 5 2486 3704 +3a12 5 2487 3704 +3a17 5 2490 3704 +3a1c 5 2505 3704 +3a21 5 2508 3704 +3a26 5 2509 3704 +3a2b 5 2434 3704 +3a30 5 2435 3704 +3a35 1a 2427 3704 +3a4f 30 2568 3704 +3a7f 5 2529 3704 +3a84 4 2530 3704 +3a88 a 2531 3704 +3a92 2 2532 3704 +3a94 a 2533 3704 +3a9e 5 2537 3704 +3aa3 5 2538 3704 +3aa8 2 2539 3704 +3aaa 5 2540 3704 +3aaf e 2544 3704 +3abd 6 2560 3704 +3ac3 10 2555 3704 +3ad3 2 2556 3704 +3ad5 18 2551 3704 +3aed 2 2552 3704 +3aef 12 2547 3704 +3b01 2 2564 3704 +3b03 a 2442 3704 +3b0d 2 2443 3704 +3b0f a 2438 3704 +3b19 2 2439 3704 +3b1b 5 2445 3704 +3b20 c 2574 3704 +3b2c 14 2577 3704 +3b40 a 2579 3704 +3b4a 18 2586 3704 +3b62 1a 2589 3704 +3b7c 1b 2590 3704 +3b97 5 2591 3704 +3b9c 1a 2594 3704 +3bb6 1b 2595 3704 +3bd1 5 2596 3704 +3bd6 1a 2599 3704 +3bf0 10 2600 3704 +3c00 2 2601 3704 +3c02 7 2604 3704 +3c09 2 2605 3704 +3c0b a 2608 3704 +3c15 2 2609 3704 +3c17 a 2612 3704 +3c21 2 2613 3704 +3c23 a 2616 3704 +3c2d 2 2617 3704 +3c2f a 2620 3704 +3c39 2 2621 3704 +3c3b a 2624 3704 +3c45 7 2634 3704 +3c4c 7 2635 3704 +3c53 7 2637 3704 +3c5a 10 2639 3704 +3c6a 3f 2648 3704 +FUNC 3ca9 b 0 UnDecorator::doUnderScore() +3ca9 b 4259 3704 +FUNC 3cb4 d 0 UnDecorator::doMSKeywords() +3cb4 d 4260 3704 +FUNC 3cc1 e 0 UnDecorator::doPtr64() +3cc1 e 4261 3704 +FUNC 3ccf e 0 UnDecorator::doFunctionReturns() +3ccf e 4262 3704 +FUNC 3cdd e 0 UnDecorator::doAllocationModel() +3cdd e 4263 3704 +FUNC 3ceb e 0 UnDecorator::doAllocationLanguage() +3ceb e 4264 3704 +FUNC 3cf9 12 0 UnDecorator::doThisTypes() +3cf9 12 4271 3704 +FUNC 3d0b e 0 UnDecorator::doAccessSpecifiers() +3d0b e 4272 3704 +FUNC 3d19 e 0 UnDecorator::doThrowTypes() +3d19 e 4273 3704 +FUNC 3d27 e 0 UnDecorator::doMemberTypes() +3d27 e 4274 3704 +FUNC 3d35 b 0 UnDecorator::doNameOnly() +3d35 b 4279 3704 +FUNC 3d40 b 0 UnDecorator::doTypeOnly() +3d40 b 4280 3704 +FUNC 3d4b b 0 UnDecorator::haveTemplateParameters() +3d4b b 4281 3704 +FUNC 3d56 e 0 UnDecorator::doEcsu() +3d56 e 4282 3704 +FUNC 3d64 b 0 UnDecorator::doNoIdentCharCheck() +3d64 b 4283 3704 +FUNC 3d6f e 0 UnDecorator::doEllipsis() +3d6f e 4284 3704 +FUNC 3d7d 19 4 UnDecorator::UScore(Tokens) +3d7d 0 4288 3704 +3d7d 9 4293 3704 +3d86 d 4294 3704 +3d93 2 4296 3704 +3d95 1 4298 3704 +FUNC 3d96 84 8 HeapManager::getMemory(unsigned int,int) +3d96 2 134 3737 +3d98 a 137 3737 +3da2 9 139 3737 +3dab 6 140 3737 +3db1 4 146 3737 +3db5 3 147 3737 +3db8 8 149 3737 +3dc0 7 153 3737 +3dc7 2 154 3737 +3dc9 1c 159 3737 +3de5 4 164 3737 +3de9 7 168 3737 +3df0 2 169 3737 +3df2 2 170 3737 +3df4 3 171 3737 +3df7 8 175 3737 +3dff 2 182 3737 +3e01 4 179 3737 +3e05 5 183 3737 +3e0a d 187 3737 +3e17 3 190 3737 +FUNC 3e1a d 0 DName::DName() +3e1a 2 210 3737 +3e1c 3 211 3737 +3e1f 7 220 3737 +3e26 1 221 3737 +FUNC 3e27 12 4 DName::DName(DNameNode *) +3e27 2 224 3737 +3e29 4 225 3737 +3e2d 9 234 3737 +3e36 3 235 3737 +FUNC 3e39 9c 4 DName::DName(DName const &) +3e39 2 259 3737 +3e3b 17 260 3737 +3e52 10 261 3737 +3e62 d 262 3737 +3e6f d 263 3737 +3e7c 10 264 3737 +3e8c 4 265 3737 +3e90 e 266 3737 +3e9e 13 267 3737 +3eb1 10 268 3737 +3ec1 11 269 3737 +3ed2 3 270 3737 +FUNC 3ed5 a 0 DName::status() +3ed5 a 481 3737 +FUNC 3edf 5 0 DName::clearStatus() +3edf 5 482 3737 +FUNC 3ee4 7 0 DName::setPtrRef() +3ee4 7 484 3737 +FUNC 3eeb a 0 DName::isPtrRef() +3eeb a 485 3737 +FUNC 3ef5 8 0 DName::setIsArray() +3ef5 8 490 3737 +FUNC 3efd a 0 DName::isArray() +3efd a 491 3737 +FUNC 3f07 a 0 DName::isNoTE() +3f07 a 492 3737 +FUNC 3f11 8 0 DName::setIsNoTE() +3f11 8 493 3737 +FUNC 3f19 a 0 DName::isPinPtr() +3f19 a 494 3737 +FUNC 3f23 8 0 DName::setIsPinPtr() +3f23 8 495 3737 +FUNC 3f2b a 0 DName::isComArray() +3f2b a 496 3737 +FUNC 3f35 8 0 DName::setIsComArray() +3f35 8 497 3737 +FUNC 3f3d a 0 DName::isVCallThunk() +3f3d a 498 3737 +FUNC 3f47 8 0 DName::setIsVCallThunk() +3f47 8 499 3737 +FUNC 3f4f 7b 4 DName::operator=(DName const &) +3f4f 3 879 3737 +3f52 12 880 3737 +3f64 17 882 3737 +3f7b d 883 3737 +3f88 d 884 3737 +3f95 d 885 3737 +3fa2 10 886 3737 +3fb2 10 887 3737 +3fc2 5 889 3737 +3fc7 3 897 3737 +FUNC 3fca 9 0 Replicator::isFull() +3fca 9 1001 3737 +FUNC 3fd3 25 4 Replicator::operator[](int) +3fd3 0 1028 3737 +3fd3 9 1029 3737 +3fdc b 1031 3737 +3fe7 6 1034 3737 +3fed 5 1032 3737 +3ff2 3 1030 3737 +3ff5 3 1036 3737 +FUNC 3ff8 d 0 DNameNode::DNameNode() +3ff8 d 1048 3737 +FUNC 4005 4 0 DNameNode::nextNode() +4005 4 1052 3737 +FUNC 4009 29 4 DNameNode::operator+=(DNameNode *) +4009 2 1131 3737 +400b 8 1132 3737 +4013 8 1134 3737 +401b b 1139 3737 +4026 4 1144 3737 +402a 2 1147 3737 +402c 3 1148 3737 +402f 3 1156 3737 +FUNC 4032 16 4 charNode::charNode(char) +4032 16 1166 3737 +FUNC 4048 4 0 charNode::length() +4048 4 1168 3737 +FUNC 404c 4 0 charNode::getLastChar() +404c 4 1170 3737 +FUNC 4050 1b 8 charNode::getString(char *,int) +4050 0 1173 3737 +4050 f 1174 3737 +405f 5 1175 3737 +4064 2 1176 3737 +4066 2 1177 3737 +4068 3 1183 3737 +FUNC 406b 4 0 pcharNode::length() +406b 4 1189 3737 +FUNC 406f 2f 4 pDNameNode::pDNameNode(DName *) +406f 2f 1244 3737 +FUNC 409e 25 4 DNameStatusNode::DNameStatusNode(DNameStatus) +409e 25 1261 3737 +FUNC 40c3 4 0 DNameStatusNode::length() +40c3 4 1263 3737 +FUNC 40c7 d 0 DNameStatusNode::getLastChar() +40c7 d 1266 3737 +FUNC 40d4 e 0 und_strlen +40d4 0 1283 3737 +40d4 6 1286 3737 +40da 7 1287 3737 +40e1 1 1291 3737 +FUNC 40e2 20 8 und_strncpy +40e2 0 1295 3737 +40e2 1b 1296 3737 +40fd 4 1299 3737 +4101 1 1301 3737 +FUNC 4102 25 4 und_strncmp +4102 0 1304 3737 +4102 7 1305 3737 +4109 2 1306 3737 +410b 1 1315 3737 +410c a 1308 3737 +4116 1 1310 3737 +4117 1 1311 3737 +4118 6 1308 3737 +411e 8 1314 3737 +4126 1 1315 3737 +FUNC 4127 33 0 UnDecorator::getDataIndirectType() +4127 33 4033 3704 +FUNC 415a 34 0 UnDecorator::getThisType() +415a 34 4034 3704 +FUNC 418e 13 c operator new(unsigned int,HeapManager &,int) +418e 13 131 3737 +FUNC 41a1 56 4 DName::DName(DName *) +41a1 0 274 3737 +41a1 a 275 3737 +41ab 23 277 3737 +41ce 13 278 3737 +41e1 2 281 3737 +41e3 4 283 3737 +41e7 3 284 3737 +41ea 7 295 3737 +41f1 6 296 3737 +FUNC 41f7 61 4 DName::DName(DNameStatus) +41f7 2 457 3737 +41f9 21 458 3737 +421a 1e 459 3737 +4238 7 467 3737 +423f 9 469 3737 +4248 a 470 3737 +4252 6 472 3737 +FUNC 4258 17 0 DName::isValid() +4258 17 478 3737 +FUNC 426f 15 0 DName::isEmpty() +426f 15 479 3737 +FUNC 4284 14 0 DName::isUDC() +4284 14 486 3737 +FUNC 4298 e 0 DName::setIsUDC() +4298 e 487 3737 +FUNC 42a6 14 0 DName::isUDTThunk() +42a6 14 488 3737 +FUNC 42ba 25 0 DName::length() +42ba 1 502 3737 +42bb 2 503 3737 +42bd a 506 3737 +42c7 4 507 3737 +42cb b 508 3737 +42d6 5 507 3737 +42db 3 510 3737 +42de 1 512 3737 +FUNC 42df 38 0 DName::getLastChar() +42df 2 516 3737 +42e1 2 517 3737 +42e3 9 519 3737 +42ec 6 520 3737 +42f2 a 521 3737 +42fc 2 522 3737 +42fe 7 520 3737 +4305 11 524 3737 +4316 1 526 3737 +FUNC 4317 91 8 DName::getString(char *,int) +4317 7 530 3737 +431e 9 531 3737 +4327 5 535 3737 +432c 7 537 3737 +4333 e 538 3737 +4341 c 544 3737 +434d d 550 3737 +435a 4 553 3737 +435e 8 555 3737 +4366 4 561 3737 +436a 6 565 3737 +4370 2 566 3737 +4372 b 570 3737 +437d 4 574 3737 +4381 2 578 3737 +4383 3 579 3737 +4386 3 586 3737 +4389 4 553 3737 +438d 4 590 3737 +4391 2 593 3737 +4393 6 594 3737 +4399 6 595 3737 +439f 5 599 3737 +43a4 4 601 3737 +FUNC 43a8 35 4 DName::operator|=(DName const &) +43a8 3 832 3737 +43ab 19 835 3737 +43c4 13 836 3737 +43d7 3 840 3737 +43da 3 842 3737 +FUNC 43dd 81 4 DName::operator=(DNameStatus) +43dd 2 928 3737 +43df 10 929 3737 +43ef 12 937 3737 +4401 26 945 3737 +4427 6 947 3737 +442d e 948 3737 +443b 10 933 3737 +444b d 934 3737 +4458 3 954 3737 +445b 3 956 3737 +FUNC 445e 1e 0 Replicator::Replicator() +445e 1e 1004 3737 +FUNC 447c 47 4 Replicator::operator+=(DName const &) +447c 3 1009 3737 +447f 12 1010 3737 +4491 20 1012 3737 +44b1 4 1017 3737 +44b5 8 1018 3737 +44bd 3 1022 3737 +44c0 3 1024 3737 +FUNC 44c3 47 0 DNameNode::clone() +44c3 3 1055 3737 +44c6 43 1056 3737 +4509 1 1057 3737 +FUNC 450a 65 8 pcharNode::pcharNode(char const *,int) +450a 1 1197 3737 +450b 1f 1200 3737 +452a c 1201 3737 +4536 8 1205 3737 +453e c 1207 3737 +454a a 1210 3737 +4554 b 1211 3737 +455f 2 1214 3737 +4561 3 1216 3737 +4564 4 1217 3737 +4568 7 1220 3737 +FUNC 456f 12 0 pcharNode::getLastChar() +456f 12 1191 3737 +FUNC 4581 31 8 pcharNode::getString(char *,int) +4581 0 1224 3737 +4581 b 1227 3737 +458c 2 1228 3737 +458e 21 1232 3737 +45af 3 1234 3737 +FUNC 45b2 f 0 pDNameNode::length() +45b2 f 1246 3737 +FUNC 45c1 f 0 pDNameNode::getLastChar() +45c1 f 1248 3737 +FUNC 45d0 1d 8 pDNameNode::getString(char *,int) +45d0 1d 1251 3737 +FUNC 45ed 33 8 DNameStatusNode::getString(char *,int) +45ed 0 1269 3737 +45ed b 1272 3737 +45f8 2 1273 3737 +45fa 23 1277 3737 +461d 3 1279 3737 +FUNC 4620 73 14 UnDecorator::UnDecorator(char *,char const *,int,char * (*)(long),unsigned long) +4620 16 736 3704 +4636 8 737 3704 +463e 5 738 3704 +4643 9 740 3704 +464c a 741 3704 +4656 5 745 3704 +465b 2 747 3704 +465d 6 748 3704 +4663 6 749 3704 +4669 8 754 3704 +4671 15 755 3704 +4686 d 758 3704 +FUNC 4693 2f 4 UnDecorator::getReturnType(DName *) +4693 3 2906 3704 +4696 8 2907 3704 +469e 15 2911 3704 +46b3 d 2915 3704 +46c0 2 2917 3704 +FUNC 46c2 f 0 UnDecorator::getStorageConvention() +46c2 f 4032 3704 +FUNC 46d1 79 4 DName::operator+=(DNameStatus) +46d1 4 799 3737 +46d5 17 800 3737 +46ec 20 804 3737 +470c 4 807 3737 +4710 7 809 3737 +4717 6 811 3737 +471d 8 812 3737 +4725 2 815 3737 +4727 3 816 3737 +472a 5 818 3737 +472f e 819 3737 +473d 7 801 3737 +4744 3 825 3737 +4747 3 827 3737 +FUNC 474a 68 4 DName::operator=(DName *) +474a 3 901 3737 +474d 12 902 3737 +475f 7 903 3737 +4766 29 911 3737 +478f 6 913 3737 +4795 c 914 3737 +47a1 2 917 3737 +47a3 9 918 3737 +47ac 3 922 3737 +47af 3 924 3737 +FUNC 47b2 a6 8 DName::doPchar(char const *,int) +47b2 3 962 3737 +47b5 1e 963 3737 +47d3 6 964 3737 +47d9 c 965 3737 +47e5 10 966 3737 +47f5 5 970 3737 +47fa 23 984 3737 +481d 6 986 3737 +4823 9 987 3737 +482c 2 988 3737 +482e 1b 977 3737 +4849 c 993 3737 +4855 3 995 3737 +FUNC 4858 26 4 DName::DName(char) +4858 3 238 3737 +485b 3 244 3737 +485e 7 248 3737 +4865 7 252 3737 +486c c 253 3737 +4878 6 255 3737 +FUNC 487e 31 4 DName::DName(char const *) +487e 0 300 3737 +487e 16 312 3737 +4894 15 313 3737 +48a9 6 315 3737 +FUNC 48af d0 8 DName::DName(char const * &,char) +48af 7 319 3737 +48b6 d 329 3737 +48c3 f 333 3737 +48d2 8 334 3737 +48da 9 342 3737 +48e3 40 343 3737 +4923 b 344 3737 +492e 9 355 3737 +4937 8 359 3737 +493f 8 361 3737 +4947 9 363 3737 +4950 3 364 3737 +4953 2 367 3737 +4955 3 347 3737 +4958 a 378 3737 +4962 8 380 3737 +496a 6 368 3737 +4970 7 371 3737 +4977 6 372 3737 +497d 2 375 3737 +FUNC 497f 69 8 DName::DName(unsigned __int64) +497f 15 384 3737 +4994 3 390 3737 +4997 a 398 3737 +49a1 4 402 3737 +49a5 13 406 3737 +49b8 3 407 3737 +49bb c 409 3737 +49c7 e 411 3737 +49d5 13 413 3737 +FUNC 49e8 96 8 DName::DName(__int64) +49e8 10 416 3737 +49f8 26 436 3737 +4a1e 15 438 3737 +4a33 10 443 3737 +4a43 5 444 3737 +4a48 c 446 3737 +4a54 6 448 3737 +4a5a 4 449 3737 +4a5e e 452 3737 +4a6c 12 453 3737 +FUNC 4a7e 2e 4 DName::operator+(DNameStatus) +4a7e 1 675 3737 +4a7f c 676 3737 +4a8b 9 679 3737 +4a94 b 680 3737 +4a9f 2 681 3737 +4aa1 5 682 3737 +4aa6 3 686 3737 +4aa9 3 688 3737 +FUNC 4aac 62 4 DName::operator+=(DName const &) +4aac 2 739 3737 +4aae f 740 3737 +4abd 13 741 3737 +4ad0 2 742 3737 +4ad2 9 743 3737 +4adb 6 744 3737 +4ae1 2 745 3737 +4ae3 7 747 3737 +4aea 6 749 3737 +4af0 9 750 3737 +4af9 2 751 3737 +4afb d 752 3737 +4b08 3 758 3737 +4b0b 3 760 3737 +FUNC 4b0e 8b 4 DName::operator+=(DName *) +4b0e 2 764 3737 +4b10 a 765 3737 +4b1a 9 766 3737 +4b23 8 767 3737 +4b2b 10 768 3737 +4b3b 8 789 3737 +4b43 20 770 3737 +4b63 4 773 3737 +4b67 7 775 3737 +4b6e 6 777 3737 +4b74 8 778 3737 +4b7c 2 781 3737 +4b7e 3 782 3737 +4b81 5 784 3737 +4b86 d 785 3737 +4b93 3 793 3737 +4b96 3 795 3737 +FUNC 4b99 1c 4 DName::operator=(char) +4b99 1 847 3737 +4b9a 15 854 3737 +4baf 3 856 3737 +4bb2 3 858 3737 +FUNC 4bb5 2a 4 DName::operator=(char const *) +4bb5 0 862 3737 +4bb5 24 869 3737 +4bd9 3 873 3737 +4bdc 3 875 3737 +FUNC 4bdf a6 0 UnDecorator::getCallingConvention() +4bdf 5 2825 3704 +4be4 f 2826 3704 +4bf3 c 2828 3704 +4bff 5 2835 3704 +4c04 1a 2845 3704 +4c1e 20 2852 3704 +4c3e 2 2875 3704 +4c40 2 2876 3704 +4c42 2 2871 3704 +4c44 2 2872 3704 +4c46 2 2867 3704 +4c48 2 2868 3704 +4c4a 2 2863 3704 +4c4c 2 2864 3704 +4c4e 1 2859 3704 +4c4f 2 2860 3704 +4c51 13 2855 3704 +4c64 e 2891 3704 +4c72 4 2895 3704 +4c76 d 2899 3704 +4c83 2 2901 3704 +FUNC 4c85 37 0 UnDecorator::getVCallThunkType() +4c85 3 4057 3704 +4c88 9 4059 3704 +4c91 5 4066 3704 +4c96 4 4059 3704 +4c9a 4 4066 3704 +4c9e 6 4061 3704 +4ca4 c 4062 3704 +4cb0 a 4064 3704 +4cba 2 4170 3704 +FUNC 4cbc 51 4 DName::operator+(DName const &) +4cbc 1 639 3737 +4cbd c 640 3737 +4cc9 b 643 3737 +4cd4 b 644 3737 +4cdf d 645 3737 +4cec 11 646 3737 +4cfd 2 647 3737 +4cff 8 648 3737 +4d07 3 652 3737 +4d0a 3 654 3737 +FUNC 4d0d 2e 4 DName::operator+(DName *) +4d0d 1 658 3737 +4d0e c 659 3737 +4d1a 9 662 3737 +4d23 b 663 3737 +4d2e 2 664 3737 +4d30 5 665 3737 +4d35 3 669 3737 +4d38 3 671 3737 +FUNC 4d3b 6a 4 DName::operator+=(char) +4d3b 1 693 3737 +4d3c b 694 3737 +4d47 9 695 3737 +4d50 6 696 3737 +4d56 2 697 3737 +4d58 7 699 3737 +4d5f 6 701 3737 +4d65 2b 702 3737 +4d90 2 703 3737 +4d92 c 704 3737 +4d9e 4 710 3737 +4da2 3 712 3737 +FUNC 4da5 6c 4 DName::operator+=(char const *) +4da5 2 716 3737 +4da7 f 717 3737 +4db6 9 718 3737 +4dbf 6 719 3737 +4dc5 2 720 3737 +4dc7 7 722 3737 +4dce 6 724 3737 +4dd4 28 725 3737 +4dfc 2 726 3737 +4dfe d 727 3737 +4e0b 3 733 3737 +4e0e 3 735 3737 +FUNC 4e11 e0 0 UnDecorator::getArgumentList() +4e11 7 3076 3704 +4e18 12 3078 3704 +4e2a 29 3081 3704 +4e53 6 3085 3704 +4e59 4 3086 3704 +4e5d 2 3087 3704 +4e5f e 3088 3704 +4e6d 6 3093 3704 +4e73 6 3095 3704 +4e79 5 3100 3704 +4e7e 1 3102 3704 +4e7f 11 3106 3704 +4e90 2 3109 3704 +4e92 16 3116 3704 +4ea8 19 3121 3704 +4ec1 9 3122 3704 +4eca 17 3126 3704 +4ee1 b 3132 3704 +4eec 3 3141 3704 +4eef 2 3143 3704 +FUNC 4ef1 4f 4 UnDecorator::getVdispMapType(DName const &) +4ef1 6 4230 3704 +4ef7 d 4231 3704 +4f04 c 4232 3704 +4f10 12 4233 3704 +4f22 9 4234 3704 +4f2b a 4236 3704 +4f35 6 4237 3704 +4f3b 3 4238 3704 +4f3e 2 4239 3704 +FUNC 4f40 22 8 operator+(char,DName const &) +4f40 22 198 3737 +FUNC 4f62 22 8 operator+(DNameStatus,DName const &) +4f62 22 201 3737 +FUNC 4f84 22 8 operator+(char const *,DName const &) +4f84 22 204 3737 +FUNC 4fa6 2e 4 DName::operator+(char) +4fa6 1 605 3737 +4fa7 c 606 3737 +4fb3 9 609 3737 +4fbc b 610 3737 +4fc7 2 611 3737 +4fc9 5 612 3737 +4fce 3 616 3737 +4fd1 3 618 3737 +FUNC 4fd4 2e 4 DName::operator+(char const *) +4fd4 1 622 3737 +4fd5 c 623 3737 +4fe1 9 626 3737 +4fea b 627 3737 +4ff5 2 628 3737 +4ff7 5 629 3737 +4ffc 3 633 3737 +4fff 3 635 3737 +FUNC 5002 141 4 UnDecorator::getDimension(bool) +5002 7 1616 3704 +5009 10 1618 3704 +5019 e 1620 3704 +5027 6 1623 3704 +502d f 1624 3704 +503c 8 1625 3704 +5044 47 1626 3704 +508b 4 1629 3704 +508f 4 1636 3704 +5093 8 1638 3704 +509b 20 1639 3704 +50bb d 1643 3704 +50c8 4 1634 3704 +50cc b 1649 3704 +50d7 2 1650 3704 +50d9 5 1652 3704 +50de 13 1653 3704 +50f1 c 1637 3704 +50fd 4 1641 3704 +5101 a 1653 3704 +510b 36 1655 3704 +5141 2 1659 3704 +FUNC 5143 d4 0 UnDecorator::getEnumType() +5143 6 2762 3704 +5149 1a 2766 3704 +5163 12 2770 3704 +5175 5 2774 3704 +517a 2 2775 3704 +517c 5 2779 3704 +5181 2 2780 3704 +5183 5 2786 3704 +5188 2 2787 3704 +518a d 2791 3704 +5197 1f 2801 3704 +51b6 1e 2807 3704 +51d4 e 2814 3704 +51e2 4 2795 3704 +51e6 d 2818 3704 +51f3 24 2820 3704 +FUNC 5217 c4 0 UnDecorator::getArgumentTypes() +5217 3 3035 3704 +521a 18 3036 3704 +5232 9 3046 3704 +523b 7 3051 3704 +5242 13 3052 3704 +5255 c 3064 3704 +5261 36 3058 3704 +5297 b 3061 3704 +52a2 21 3039 3704 +52c3 16 3042 3704 +52d9 2 3072 3704 +FUNC 52db 7e 0 UnDecorator::getThrowTypes() +52db 3 3148 3704 +52de e 3149 3704 +52ec 2 3150 3704 +52ee 21 3151 3704 +530f 1f 3153 3704 +532e 29 3155 3704 +5357 2 3157 3704 +FUNC 5359 125 c UnDecorator::getExtendedDataIndirectType(char &,bool &,int) +5359 6 3636 3704 +535f 1a 3641 3704 +5379 1c 3643 3704 +5395 a 3669 3704 +539f 6 3670 3704 +53a5 b 3672 3704 +53b0 a 3674 3704 +53ba 21 3675 3704 +53db 17 3678 3704 +53f2 a 3680 3704 +53fc 6 3689 3704 +5402 2 3691 3704 +5404 17 3693 3704 +541b 1e 3700 3704 +5439 6 3663 3704 +543f 2 3665 3704 +5441 3 3656 3704 +5444 d 3657 3704 +5451 2 3659 3704 +5453 6 3647 3704 +5459 13 3649 3704 +546c 10 3703 3704 +547c 2 3704 3704 +FUNC 547e 15f 4 UnDecorator::getArrayType(DName const &) +547e 3 3986 3704 +5481 12 3987 3704 +5493 7 3989 3704 +549a 4 3991 3704 +549e 2 3992 3704 +54a0 4 3994 3704 +54a4 9 3995 3704 +54ad 2a 4026 3704 +54d7 2 4028 3704 +54d9 c 3998 3704 +54e5 9 4000 3704 +54ee d 4001 3704 +54fb 35 4005 3704 +5530 b 4009 3704 +553b 4 4010 3704 +553f 8 4011 3704 +5547 2 4012 3704 +5549 2c 4013 3704 +5575 d 4017 3704 +5582 9 4018 3704 +558b 12 4019 3704 +559d a 4023 3704 +55a7 36 4024 3704 +FUNC 55dd 31 0 UnDecorator::getLexicalFrame() +55dd 31 4031 3704 +FUNC 560e 12 0 UnDecorator::getDisplacement() +560e 12 4048 3704 +FUNC 5620 12 0 UnDecorator::getCallIndex() +5620 12 4049 3704 +FUNC 5632 12 0 UnDecorator::getGuardNumber() +5632 12 4050 3704 +FUNC 5644 150 4 UnDecorator::getVfTableType(DName const &) +5644 7 4174 3704 +564b d 4175 3704 +5658 1d 4178 3704 +5675 2c 4180 3704 +56a1 f 4182 3704 +56b0 e 4184 3704 +56be 5 4186 3704 +56c3 11 4188 3704 +56d4 2d 4190 3704 +5701 b 4194 3704 +570c 7 4195 3704 +5713 10 4199 3704 +5723 a 4200 3704 +572d b 4188 3704 +5738 b 4204 3704 +5743 a 4206 3704 +574d 7 4207 3704 +5754 9 4209 3704 +575d a 4216 3704 +5767 6 4217 3704 +576d 2 4220 3704 +576f 9 4221 3704 +5778 17 4222 3704 +578f 3 4224 3704 +5792 2 4226 3704 +FUNC 5794 a0 8 UnDecorator::getStringEncoding(char *,int) +5794 6 1447 3704 +579a b 1448 3704 +57a5 22 1451 3704 +57c7 6 1456 3704 +57cd b 1459 3704 +57d8 b 1462 3704 +57e3 13 1464 3704 +57f6 c 1466 3704 +5802 5 1469 3704 +5807 6 1470 3704 +580d 4 1471 3704 +5811 14 1477 3704 +5825 d 1452 3704 +5832 2 1478 3704 +FUNC 5834 50 0 UnDecorator::getSignedDimension() +5834 5 1603 3704 +5839 b 1604 3704 +5844 c 1605 3704 +5850 2 1606 3704 +5852 23 1608 3704 +5875 d 1611 3704 +5882 2 1612 3704 +FUNC 5884 2bb 0 UnDecorator::getTemplateConstant() +5884 15 1877 3704 +5899 f 1884 3704 +58a8 32 1885 3704 +58da 9 1921 3704 +58e3 b 1922 3704 +58ee 20 1924 3704 +590e 12 1931 3704 +5920 e 1932 3704 +592e 3 1937 3704 +5931 7 1939 3704 +5938 6 1941 3704 +593e 4 1942 3704 +5942 2 1944 3704 +5944 4 1945 3704 +5948 2a 1950 3704 +5972 a 1900 3704 +597c 6 1902 3704 +5982 11 1903 3704 +5993 1b 1906 3704 +59ae b 1892 3704 +59b9 6 2034 3704 +59bf 7 1954 3704 +59c6 26 1885 3704 +59ec b 1990 3704 +59f7 c 1991 3704 +5a03 10 1992 3704 +5a13 9 1966 3704 +5a1c c 1968 3704 +5a28 e 1971 3704 +5a36 10 1973 3704 +5a46 6 1975 3704 +5a4c 6 1976 3704 +5a52 3 1980 3704 +5a55 29 1981 3704 +5a7e a 1983 3704 +5a88 a 2001 3704 +5a92 a 2003 3704 +5a9c 13 2007 3704 +5aaf a 2008 3704 +5ab9 11 2012 3704 +5aca 13 2015 3704 +5add a 2016 3704 +5ae7 13 2021 3704 +5afa a 2022 3704 +5b04 13 2026 3704 +5b17 d 2029 3704 +5b24 7 1913 3704 +5b2b 14 2041 3704 +FUNC 5b3f d9 8 UnDecorator::getPtrRefDataType(DName const &,int) +5b3f 3 3937 3704 +5b42 11 3940 3704 +5b53 b 3944 3704 +5b5e 12 3948 3704 +5b70 12 3949 3704 +5b82 10 3951 3704 +5b92 5 3957 3704 +5b97 16 3961 3704 +5bad d 3967 3704 +5bba c 3968 3704 +5bc6 b 3970 3704 +5bd1 6 3972 3704 +5bd7 1e 3974 3704 +5bf5 e 3976 3704 +5c03 13 3980 3704 +5c16 2 3982 3704 +FUNC 5c18 14 4 UnDecorator::getVbTableType(DName const &) +5c18 14 4053 3704 +FUNC 5c2c 1b8 0 UnDecorator::getTemplateArgumentList() +5c2c 14 1775 3704 +5c40 c 1777 3704 +5c4c 7 1778 3704 +5c53 2a 1781 3704 +5c7d 6 1785 3704 +5c83 4 1786 3704 +5c87 2 1787 3704 +5c89 e 1788 3704 +5c97 8 1793 3704 +5c9f 5 1798 3704 +5ca4 1 1800 3704 +5ca5 11 1804 3704 +5cb6 5 1807 3704 +5cbb 7 1810 3704 +5cc2 7 1816 3704 +5cc9 6 1817 3704 +5ccf 12 1818 3704 +5ce1 a 1820 3704 +5ceb 5 1821 3704 +5cf0 e 1822 3704 +5cfe 5 1824 3704 +5d03 9 1830 3704 +5d0c c 1832 3704 +5d18 e 1835 3704 +5d26 10 1837 3704 +5d36 6 1839 3704 +5d3c 1 1840 3704 +5d3d 2 1842 3704 +5d3f 25 1843 3704 +5d64 2 1846 3704 +5d66 10 1847 3704 +5d76 2 1850 3704 +5d78 1f 1851 3704 +5d97 17 1857 3704 +5dae 9 1858 3704 +5db7 16 1862 3704 +5dcd 17 1873 3704 +FUNC 5de4 56f 8 UnDecorator::getOperatorName(bool,bool *) +5de4 b 1095 3704 +5def 53 1103 3704 +5e42 13 1183 3704 +5e55 c 1439 3704 +5e61 1d 1440 3704 +5e7e 11 1442 3704 +5e8f 5 1444 3704 +5e94 3 1124 3704 +5e97 8 1126 3704 +5e9f 21 1127 3704 +5ec0 c 1129 3704 +5ecc a 1130 3704 +5ed6 a 1133 3704 +5ee0 7 1135 3704 +5ee7 3 1136 3704 +5eea 9 1144 3704 +5ef3 5 1145 3704 +5ef8 6 1148 3704 +5efe 2 1154 3704 +5f00 15 1156 3704 +5f15 18 1160 3704 +5f2d 1a 1161 3704 +5f47 10 1166 3704 +5f57 b 1167 3704 +5f62 5 1170 3704 +5f67 6 1106 3704 +5f6d f 1108 3704 +5f7c 21 1103 3704 +5f9d 3d 1220 3704 +5fda 18 1240 3704 +5ff2 b 1234 3704 +5ffd 5 1235 3704 +6002 13 1245 3704 +6015 7 1247 3704 +601c 8 1249 3704 +6024 18 1220 3704 +603c 13 1255 3704 +604f 7 1256 3704 +6056 2 1257 3704 +6058 16 1335 3704 +606e 7 1356 3704 +6075 6 1350 3704 +607b 2 1352 3704 +607d 25 1220 3704 +60a2 13 1290 3704 +60b5 17 1291 3704 +60cc 24 1292 3704 +60f0 14 1313 3704 +6104 6 1316 3704 +610a 5 1317 3704 +610f 10 1302 3704 +611f 20 1303 3704 +613f 20 1304 3704 +615f 20 1305 3704 +617f 22 1306 3704 +61a1 12 1307 3704 +61b3 c 1296 3704 +61bf 2b 1297 3704 +61ea 13 1281 3704 +61fd 17 1282 3704 +6214 1a 1283 3704 +622e 5 1284 3704 +6233 2d 1220 3704 +6260 25 1364 3704 +6285 10 1373 3704 +6295 13 1378 3704 +62a8 a 1397 3704 +62b2 13 1399 3704 +62c5 a 1403 3704 +62cf 6 1405 3704 +62d5 2 1408 3704 +62d7 13 1410 3704 +62ea d 1413 3704 +62f7 5 1415 3704 +62fc 10 1278 3704 +630c b 1330 3704 +6317 5 1428 3704 +631c 3 1187 3704 +631f 13 1216 3704 +6332 8 1437 3704 +633a 19 1438 3704 +FUNC 6353 153 4 UnDecorator::getTemplateName(bool) +6353 5 1700 3704 +6358 1f 1704 3704 +6377 16 1714 3704 +638d 1d 1716 3704 +63aa 23 1725 3704 +63cd e 1729 3704 +63db 6 1730 3704 +63e1 12 1732 3704 +63f3 2 1734 3704 +63f5 16 1735 3704 +640b c 1738 3704 +6417 7 1739 3704 +641e 6 1746 3704 +6424 21 1747 3704 +6445 c 1749 3704 +6451 a 1750 3704 +645b a 1753 3704 +6465 6 1755 3704 +646b 6 1756 3704 +6471 23 1769 3704 +6494 d 1705 3704 +64a1 5 1771 3704 +FUNC 64a6 1ea 4 UnDecorator::getZName(bool) +64a6 10 1007 3704 +64b6 11 1008 3704 +64c7 3 1013 3704 +64ca 26 1043 3704 +64f0 b 1024 3704 +64fb 5 1026 3704 +6500 16 1028 3704 +6516 16 1030 3704 +652c 17 1031 3704 +6543 7 1033 3704 +654a 25 1040 3704 +656f 5 1042 3704 +6574 29 1043 3704 +659d 8 1045 3704 +65a5 b 1051 3704 +65b0 c 1053 3704 +65bc e 1056 3704 +65ca 10 1058 3704 +65da 4 1060 3704 +65de b 1061 3704 +65e9 2 1063 3704 +65eb a 1064 3704 +65f5 10 1065 3704 +6605 2 1068 3704 +6607 d 1069 3704 +6614 2a 1070 3704 +663e 2 1073 3704 +6640 1a 1076 3704 +665a 11 1083 3704 +666b 9 1084 3704 +6674 f 1087 3704 +6683 d 1090 3704 +FUNC 6690 e4 0 UnDecorator::getScopedName() +6690 7 2727 3704 +6697 e 2728 3704 +66a5 15 2733 3704 +66ba 1a 2737 3704 +66d4 2a 2738 3704 +66fe b 2742 3704 +6709 8 2743 3704 +6711 4 2744 3704 +6715 1b 2745 3704 +6730 b 2746 3704 +673b 7 2747 3704 +6742 2 2748 3704 +6744 2b 2749 3704 +676f 3 2753 3704 +6772 2 2755 3704 +FUNC 6774 f 0 UnDecorator::getECSUName() +6774 f 2758 3704 +FUNC 6783 100 0 UnDecorator::getECSUDataType() +6783 3 3392 3704 +6786 20 3395 3704 +67a6 37 3399 3704 +67dd 5 3424 3704 +67e2 2 3425 3704 +67e4 5 3420 3704 +67e9 2 3421 3704 +67eb 26 3431 3704 +6811 2 3432 3704 +6813 5 3415 3704 +6818 2 3416 3704 +681a 5 3411 3704 +681f 2 3412 3704 +6821 d 3407 3704 +682e 7 3439 3704 +6835 4 3441 3704 +6839 c 3442 3704 +6845 16 3446 3704 +685b e 3450 3704 +6869 18 3404 3704 +6881 2 3452 3704 +FUNC 6883 46 0 UnDecorator::getSymbolName() +6883 3 989 3704 +6886 a 990 3704 +6890 6 991 3704 +6896 c 992 3704 +68a2 16 997 3704 +68b8 f 1001 3704 +68c7 2 1003 3704 +FUNC 68c9 92 0 UnDecorator::getBasedType() +68c9 6 2653 3704 +68cf 13 2654 3704 +68e2 a 2659 3704 +68ec 17 2661 3704 +6903 c 2707 3704 +690f 13 2699 3704 +6922 2 2700 3704 +6924 d 2674 3704 +6931 2 2711 3704 +6933 a 2712 3704 +693d d 2716 3704 +694a f 2720 3704 +6959 2 2722 3704 +FUNC 695b b42 4 UnDecorator::composeDeclaration(DName const &) +695b 6 2045 3704 +6961 e 2046 3704 +696f 5 2047 3704 +6974 a 2048 3704 +697e b 2053 3704 +6989 f 2054 3704 +6998 8 2055 3704 +69a0 15 2056 3704 +69b5 8 2057 3704 +69bd 10 2058 3704 +69cd 83 2075 3704 +6a50 7 2081 3704 +6a57 19 2082 3704 +6a70 21 2083 3704 +6a91 2 2084 3704 +6a93 15 2085 3704 +6aa8 27 2090 3704 +6acf 33 2092 3704 +6b02 9 2094 3704 +6b0b 9 2096 3704 +6b14 2b 2098 3704 +6b3f d 2101 3704 +6b4c 9 2103 3704 +6b55 2d 2105 3704 +6b82 2e 2107 3704 +6bb0 5 2111 3704 +6bb5 3 2114 3704 +6bb8 3 2115 3704 +6bbb 3 2116 3704 +6bbe 3 2117 3704 +6bc1 3 2118 3704 +6bc4 26 2121 3704 +6bea 12 2123 3704 +6bfc 19 2125 3704 +6c15 19 2126 3704 +6c2e 2 2127 3704 +6c30 12 2129 3704 +6c42 19 2131 3704 +6c5b 1b 2134 3704 +6c76 13 2141 3704 +6c89 a 2142 3704 +6c93 15 2143 3704 +6ca8 2 2144 3704 +6caa f 2145 3704 +6cb9 10 2147 3704 +6cc9 9 2151 3704 +6cd2 22 2152 3704 +6cf4 2 2153 3704 +6cf6 13 2168 3704 +6d09 c 2172 3704 +6d15 14 2173 3704 +6d29 1a 2174 3704 +6d43 2 2175 3704 +6d45 b 2176 3704 +6d50 5 2182 3704 +6d55 6 2185 3704 +6d5b 27 2187 3704 +6d82 b 2189 3704 +6d8d 5 2190 3704 +6d92 1b 2194 3704 +6dad 15 2195 3704 +6dc2 1d 2202 3704 +6ddf 16 2204 3704 +6df5 55 2205 3704 +6e4a 12 2206 3704 +6e5c 2b 2207 3704 +6e87 2 2208 3704 +6e89 d 2209 3704 +6e96 1a 2211 3704 +6eb0 2e 2218 3704 +6ede 12 2222 3704 +6ef0 c 2223 3704 +6efc c 2227 3704 +6f08 15 2228 3704 +6f1d 2 2229 3704 +6f1f f 2230 3704 +6f2e 1a 2235 3704 +6f48 b 2237 3704 +6f53 3 2238 3704 +6f56 5 2243 3704 +6f5b b 2245 3704 +6f66 1c 2250 3704 +6f82 13 2251 3704 +6f95 e 2252 3704 +6fa3 2 2253 3704 +6fa5 10 2254 3704 +6fb5 3d 2255 3704 +6ff2 c 2256 3704 +6ffe e 2257 3704 +700c 4c 2258 3704 +7058 a 2259 3704 +7062 4b 2260 3704 +70ad 7 2261 3704 +70b4 4b 2262 3704 +70ff f 2263 3704 +710e f 2264 3704 +711d 6 2268 3704 +7123 61 2277 3704 +7184 15 2281 3704 +7199 2 2283 3704 +719b 18 2285 3704 +71b3 2d 2292 3704 +71e0 12 2294 3704 +71f2 37 2296 3704 +7229 23 2297 3704 +724c b7 2299 3704 +7303 23 2300 3704 +7326 12 2306 3704 +7338 37 2307 3704 +736f b 2308 3704 +737a 37 2309 3704 +73b1 b 2310 3704 +73bc 30 2311 3704 +73ec 23 2312 3704 +740f 36 2319 3704 +7445 1e 2320 3704 +7463 8 2325 3704 +746b 1e 2326 3704 +7489 12 2329 3704 +749b 2 2331 3704 +FUNC 749d 211 0 UnDecorator::getDecoratedName() +749d 7 861 3704 +74a4 e 864 3704 +74b2 a 868 3704 +74bc b 873 3704 +74c7 8 874 3704 +74cf 11 876 3704 +74e0 10 878 3704 +74f0 6 882 3704 +74f6 9 903 3704 +74ff 9 906 3704 +7508 8 910 3704 +7510 6 912 3704 +7516 5 910 3704 +751b 2 915 3704 +751d a 918 3704 +7527 19 919 3704 +7540 6 920 3704 +7546 f 924 3704 +7555 8 925 3704 +755d 17 929 3704 +7574 a 930 3704 +757e c 932 3704 +758a 8 933 3704 +7592 5 934 3704 +7597 18 935 3704 +75af a 936 3704 +75b9 13 937 3704 +75cc b 938 3704 +75d7 2 940 3704 +75d9 29 941 3704 +7602 4 945 3704 +7606 10 946 3704 +7616 9 948 3704 +761f 3 950 3704 +7622 1c 955 3704 +763e f 959 3704 +764d 4 976 3704 +7651 6 962 3704 +7657 14 964 3704 +766b 19 967 3704 +7684 5 968 3704 +7689 10 971 3704 +7699 2 979 3704 +769b 2 980 3704 +769d f 982 3704 +76ac 2 984 3704 +FUNC 76ae 28b 0 UnDecorator::getScope() +76ae d 1482 3704 +76bb f 1483 3704 +76ca 2a 1489 3704 +76f4 14 1492 3704 +7708 b 1495 3704 +7713 16 1496 3704 +7729 5 1498 3704 +772e 17 1499 3704 +7745 3 1500 3704 +7748 f 1506 3704 +7757 2a 1507 3704 +7781 10 1566 3704 +7791 5 1567 3704 +7796 34 1561 3704 +77ca 4 1562 3704 +77ce 5 1563 3704 +77d3 e 1510 3704 +77e1 5 1514 3704 +77e6 22 1515 3704 +7808 e 1518 3704 +7816 6 1519 3704 +781c 5 1522 3704 +7821 2a 1523 3704 +784b 2 1524 3704 +784d f 1546 3704 +785c 1a 1548 3704 +7876 b 1550 3704 +7881 9 1551 3704 +788a 2 1554 3704 +788c f 1530 3704 +789b 2 1570 3704 +789d 21 1571 3704 +78be a 1489 3704 +78c8 f 1577 3704 +78d7 18 1590 3704 +78ef 2 1591 3704 +78f1 b 1580 3704 +78fc 7 1581 3704 +7903 2 1582 3704 +7905 2b 1583 3704 +7930 4 1597 3704 +7934 5 1599 3704 +FUNC 7939 341 4 UnDecorator::getFunctionIndirectType(DName const &) +7939 3 3461 3704 +793c e 3462 3704 +794a 15 3463 3704 +795f f 3465 3704 +796e 10 3466 3704 +797e 7 3469 3704 +7985 a 3471 3704 +798f 6 3473 3704 +7995 7 3475 3704 +799c d 3477 3704 +79a9 17 3482 3704 +79c0 9 3485 3704 +79c9 3 3486 3704 +79cc 5 3490 3704 +79d1 f 3491 3704 +79e0 6 3496 3704 +79e6 13 3497 3704 +79f9 b 3501 3704 +7a04 1e 3503 3704 +7a22 8 3505 3704 +7a2a 29 3506 3704 +7a53 2 3507 3704 +7a55 17 3508 3704 +7a6c f 3510 3704 +7a7b 4 3511 3704 +7a7f 10 3518 3704 +7a8f 15 3519 3704 +7aa4 9 3527 3704 +7aad d 3528 3704 +7aba 30 3529 3704 +7aea 2 3530 3704 +7aec 11 3521 3704 +7afd 7 3514 3704 +7b04 16 3516 3704 +7b1a 13 3531 3704 +7b2d d 3535 3704 +7b3a 22 3537 3704 +7b5c 2 3546 3704 +7b5e 13 3547 3704 +7b71 c 3551 3704 +7b7d 28 3552 3704 +7ba5 1e 3557 3704 +7bc3 c 3558 3704 +7bcf 2e 3561 3704 +7bfd 10 3563 3704 +7c0d c 3564 3704 +7c19 c 3566 3704 +7c25 15 3567 3704 +7c3a 2 3568 3704 +7c3c f 3569 3704 +7c4b 4 3573 3704 +7c4f b 3574 3704 +7c5a e 3580 3704 +7c68 10 3576 3704 +7c78 2 3581 3704 +FUNC 7c7a 4e4 10 UnDecorator::getDataIndirectType(DName const &,char,DName const &,int) +7c7a 6 3707 3704 +7c80 23 3711 3704 +7ca3 4 3713 3704 +7ca7 17 3715 3704 +7cbe c 3717 3704 +7cca 10 3719 3704 +7cda e 3723 3704 +7ce8 6 3725 3704 +7cee 15 3726 3704 +7d03 17 3732 3704 +7d1a 11 3751 3704 +7d2b a 3752 3704 +7d35 32 3753 3704 +7d67 5 3754 3704 +7d6c 11 3743 3704 +7d7d a 3744 3704 +7d87 25 3745 3704 +7dac 2 3746 3704 +7dae 8 3747 3704 +7db6 2 3749 3704 +7db8 19 3735 3704 +7dd1 a 3736 3704 +7ddb 14 3737 3704 +7def 5 3738 3704 +7df4 11 3739 3704 +7e05 6 3766 3704 +7e0b a 3768 3704 +7e15 17 3770 3704 +7e2c 10 3772 3704 +7e3c 1a 3778 3704 +7e56 5 3780 3704 +7e5b 6 3782 3704 +7e61 9 3787 3704 +7e6a b 3789 3704 +7e75 19 3791 3704 +7e8e c 3793 3704 +7e9a 24 3794 3704 +7ebe c 3796 3704 +7eca 22 3797 3704 +7eec 9 3801 3704 +7ef5 5 3805 3704 +7efa 7 3806 3704 +7f01 6 3810 3704 +7f07 1e 3812 3704 +7f25 8 3814 3704 +7f2d 1b 3815 3704 +7f48 2 3816 3704 +7f4a 16 3817 3704 +7f60 a 3819 3704 +7f6a 13 3828 3704 +7f7d b 3833 3704 +7f88 c 3834 3704 +7f94 8 3835 3704 +7f9c 6 3836 3704 +7fa2 b 3842 3704 +7fad b 3843 3704 +7fb8 3 3863 3704 +7fbb 6 3864 3704 +7fc1 22 3866 3704 +7fe3 9 3871 3704 +7fec 13 3872 3704 +7fff 5 3876 3704 +8004 1e 3877 3704 +8022 5 3879 3704 +8027 1e 3880 3704 +8045 5 3884 3704 +804a e 3885 3704 +8058 14 3889 3704 +806c 28 3895 3704 +8094 2 3890 3704 +8096 b 3891 3704 +80a1 2 3892 3704 +80a3 c 3898 3704 +80af 17 3899 3704 +80c6 4 3902 3704 +80ca 6 3904 3704 +80d0 7 3906 3704 +80d7 8 3774 3704 +80df 13 3918 3704 +80f2 12 3922 3704 +8104 29 3925 3704 +812d 10 3923 3704 +813d c 3928 3704 +8149 3 3929 3704 +814c 10 3931 3704 +815c 2 3933 3704 +FUNC 815e 14c 0 UnDecorator::operator char *() +815e 6 762 3704 +8164 4 763 3704 +8168 f 764 3704 +8177 9 770 3704 +8180 c 772 3704 +818c 7 775 3704 +8193 1d 776 3704 +81b0 4 782 3704 +81b4 16 783 3704 +81ca 9 785 3704 +81d3 5 794 3704 +81d8 9 795 3704 +81e1 13 799 3704 +81f4 e 808 3704 +8202 2 809 3704 +8204 2 848 3704 +8206 1a 810 3704 +8220 e 813 3704 +822e e 811 3704 +823c 9 817 3704 +8245 e 819 3704 +8253 d 820 3704 +8260 a 824 3704 +826a f 825 3704 +8279 5 828 3704 +827e 2 829 3704 +8280 2 830 3704 +8282 5 831 3704 +8287 1 832 3704 +8288 5 833 3704 +828d 1 835 3704 +828e 5 834 3704 +8293 2 838 3704 +8295 a 839 3704 +829f 9 841 3704 +82a8 2 848 3704 +FUNC 82aa 116 c UnDecorator::getPtrRefType(DName const &,DName const &,char) +82aa 5 3585 3704 +82af f 3588 3704 +82be d 3589 3704 +82cb b 3591 3704 +82d6 20 3594 3704 +82f6 b 3595 3704 +8301 b 3597 3704 +830c 9 3598 3704 +8315 14 3600 3704 +8329 14 3606 3704 +833d 1b 3608 3704 +8358 a 3612 3704 +8362 b 3615 3704 +836d c 3617 3704 +8379 9 3618 3704 +8382 c 3620 3704 +838e c 3622 3704 +839a a 3623 3704 +83a4 b 3625 3704 +83af f 3629 3704 +83be 2 3632 3704 +FUNC 83c0 1b 8 UnDecorator::getPointerType(DName const &,DName const &) +83c0 1b 4037 3704 +FUNC 83db 1b 8 UnDecorator::getPointerTypeArray(DName const &,DName const &) +83db 1b 4040 3704 +FUNC 83f6 1b 8 UnDecorator::getReferenceType(DName const &,DName const &) +83f6 1b 4043 3704 +FUNC 8411 a3 18 __unDName +8411 f 604 3704 +8420 9 606 3704 +8429 4 607 3704 +842d a 612 3704 +8437 2 613 3704 +8439 8 614 3704 +8441 3 615 3704 +8444 20 618 3704 +8464 1a 627 3704 +847e e 628 3704 +848c a 633 3704 +8496 c 636 3704 +84a2 3 643 3704 +84a5 6 645 3704 +84ab 9 637 3704 +FUNC 84b4 a3 1c __unDNameEx +84b4 f 684 3704 +84c3 9 687 3704 +84cc 4 688 3704 +84d0 a 693 3704 +84da 2 694 3704 +84dc 8 695 3704 +84e4 3 696 3704 +84e7 20 699 3704 +8507 1a 708 3704 +8521 e 709 3704 +852f a 714 3704 +8539 c 717 3704 +8545 3 724 3704 +8548 6 726 3704 +854e 9 718 3704 +FUNC 8557 387 4 UnDecorator::getBasicDataType(DName const &) +8557 3 3162 3704 +855a 15 3163 3704 +856f 6 3165 3704 +8575 4 3168 3704 +8579 35 3173 3704 +85ae 5 3178 3704 +85b3 5 3179 3704 +85b8 5 3183 3704 +85bd 5 3184 3704 +85c2 5 3188 3704 +85c7 5 3189 3704 +85cc 5 3193 3704 +85d1 5 3194 3704 +85d6 5 3203 3704 +85db 5 3204 3704 +85e0 2a 3173 3704 +860a 3c 3222 3704 +8646 5 3231 3704 +864b 5 3232 3704 +8650 22 3273 3704 +8672 5 3235 3704 +8677 5 3236 3704 +867c f 3222 3704 +868b 5 3243 3704 +8690 5 3244 3704 +8695 5 3239 3704 +869a 5 3240 3704 +869f 5 3247 3704 +86a4 5 3248 3704 +86a9 1b 3222 3704 +86c4 3 3264 3704 +86c7 6 3262 3704 +86cd 10 3264 3704 +86dd 10 3266 3704 +86ed 11 3267 3704 +86fe 5 3275 3704 +8703 2 3276 3704 +8705 5 3255 3704 +870a 2 3257 3704 +870c 3 3224 3704 +870f 12 3343 3704 +8721 9 3345 3704 +872a 7 3347 3704 +8731 16 3348 3704 +8747 6 3352 3704 +874d d 3353 3704 +875a 5 3355 3704 +875f 5 3227 3704 +8764 2 3278 3704 +8766 d 3281 3704 +8773 2 3282 3704 +8775 5 3219 3704 +877a 2 3220 3704 +877c 3 3287 3704 +877f 5 3290 3704 +8784 d 3207 3704 +8791 d 3212 3704 +879e 9 3297 3704 +87a7 1f 3301 3704 +87c6 19 3314 3704 +87df c 3322 3704 +87eb 2 3326 3704 +87ed c 3307 3704 +87f9 2 3308 3704 +87fb 1e 3311 3704 +8819 10 3332 3704 +8829 18 3333 3704 +8841 5 3337 3704 +8846 c 3360 3704 +8852 5 3367 3704 +8857 d 3369 3704 +8864 5 3371 3704 +8869 d 3372 3704 +8876 2 3373 3704 +8878 5 3374 3704 +887d d 3375 3704 +888a 17 3380 3704 +88a1 16 3385 3704 +88b7 27 3387 3704 +FUNC 88de 13e 4 UnDecorator::getPrimaryDataType(DName const &) +88de 7 2962 3704 +88e5 2b 2966 3704 +8910 12 3027 3704 +8922 d 2972 3704 +892f c 2974 3704 +893b a 2975 3704 +8945 b 2981 3704 +8950 6 2984 3704 +8956 1e 2986 3704 +8974 7 2996 3704 +897b 2 2997 3704 +897d 6 2998 3704 +8983 f 3000 3704 +8992 8 3002 3704 +899a 10 3004 3704 +89aa 2f 3022 3704 +89d9 16 3012 3704 +89ef 17 3008 3704 +8a06 14 2969 3704 +8a1a 2 3030 3704 +FUNC 8a1c b1 4 UnDecorator::getDataType(DName *) +8a1c 6 2922 3704 +8a22 b 2923 3704 +8a2d 15 2928 3704 +8a42 10 2954 3704 +8a52 6 2934 3704 +8a58 c 2936 3704 +8a64 f 2937 3704 +8a73 13 2939 3704 +8a86 6 2944 3704 +8a8c 29 2946 3704 +8ab5 2 2947 3704 +8ab7 14 2931 3704 +8acb 2 2957 3704 +FUNC 8acd 64 4 UnDecorator::getExternalDataType(DName const &) +8acd 7 4244 3704 +8ad4 1e 4247 3704 +8af2 9 4248 3704 +8afb 30 4253 3704 +8b2b 4 4255 3704 +8b2f 2 4257 3704 +FUNC 8b31 4f 4 V6_HeapAlloc +8b31 c 27 3455 +8b3d 4 28 3455 +8b41 b 29 3455 +8b4c 8 31 3455 +8b54 4 32 3455 +8b58 a 33 3455 +8b62 c 35 3455 +8b6e 3 39 3455 +8b71 6 40 3455 +8b77 9 36 3455 +FUNC 8b80 75 4 _heap_alloc +8b80 0 90 3455 +8b80 9 95 3455 +8b89 5 96 3455 +8b8e 7 97 3455 +8b95 c 98 3455 +8ba1 a 104 3455 +8bab 18 105 3455 +8bc3 1 129 3455 +8bc4 a 107 3455 +8bce 9 108 3455 +8bd7 2 109 3455 +8bd9 4 121 3455 +8bdd 1 122 3455 +8bde 6 124 3455 +8be4 10 126 3455 +8bf4 1 129 3455 +FUNC 8bf5 c3 4 malloc +8bf5 1 155 3455 +8bf6 16 159 3455 +8c0c 65 163 3455 +8c71 4 168 3455 +8c75 b 172 3455 +8c80 b 179 3455 +8c8b 2 183 3455 +8c8d 7 174 3455 +8c94 8 193 3455 +8c9c 5 195 3455 +8ca1 1 196 3455 +8ca2 7 185 3455 +8ca9 b 186 3455 +8cb4 3 187 3455 +8cb7 1 196 3455 +FUNC 8cb8 3b 4 _get_errno_from_oserr +8cb8 0 119 3915 +8cb8 6 123 3915 +8cbe f 124 3915 +8ccd 8 133 3915 +8cd5 3 134 3915 +8cd8 1 139 3915 +8cd9 7 125 3915 +8ce0 1 139 3915 +8ce1 11 135 3915 +8cf2 1 139 3915 +FUNC 8cf3 13 0 _errno +8cf3 0 280 3915 +8cf3 5 281 3915 +8cf8 4 282 3915 +8cfc 5 283 3915 +8d01 1 288 3915 +8d02 3 285 3915 +8d05 1 288 3915 +FUNC 8d06 13 0 __doserrno +8d06 0 293 3915 +8d06 5 294 3915 +8d0b 4 295 3915 +8d0f 5 296 3915 +8d14 1 300 3915 +8d15 3 298 3915 +8d18 1 300 3915 +FUNC 8d19 1e 4 _dosmaperr +8d19 1 110 3915 +8d1a 9 111 3915 +8d23 13 113 3915 +8d36 1 114 3915 +FUNC 8d37 1b 4 _set_errno +8d37 0 157 3915 +8d37 5 158 3915 +8d3c 4 159 3915 +8d40 3 161 3915 +8d43 1 168 3915 +8d44 b 165 3915 +8d4f 2 166 3915 +8d51 1 168 3915 +FUNC 8d52 2a 4 _get_errno +8d52 1 187 3915 +8d53 1b 189 3915 +8d6e 1 195 3915 +8d6f 9 193 3915 +8d78 3 194 3915 +8d7b 1 195 3915 +FUNC 8d7c 1b 4 _set_doserrno +8d7c 0 213 3915 +8d7c 5 214 3915 +8d81 4 215 3915 +8d85 3 217 3915 +8d88 1 224 3915 +8d89 b 221 3915 +8d94 2 222 3915 +8d96 1 224 3915 +FUNC 8d97 2a 4 _get_doserrno +8d97 1 243 3915 +8d98 1b 245 3915 +8db3 1 251 3915 +8db4 9 249 3915 +8dbd 3 250 3915 +8dc0 1 251 3915 +FUNC 8dc1 21 0 _get_sbh_threshold +8dc1 0 61 3311 +8dc1 9 64 3311 +8dca 2 66 3311 +8dcc 1 81 3311 +8dcd 14 69 3311 +8de1 1 81 3311 +FUNC 8de2 46 4 _set_amblksiz +8de2 0 214 3311 +8de2 2b 216 3311 +8e0d 1 224 3311 +8e0e 11 217 3311 +8e1f 5 220 3311 +8e24 3 223 3311 +8e27 1 224 3311 +FUNC 8e28 3c 4 _get_amblksiz +8e28 0 243 3311 +8e28 27 245 3311 +8e4f 1 253 3311 +8e50 8 246 3311 +8e58 8 249 3311 +8e60 3 252 3311 +8e63 1 253 3311 +FUNC 8e64 48 4 __sbh_heap_init +8e64 0 274 3311 +8e64 1c 275 3311 +8e80 1 285 3311 +8e81 4 278 3311 +8e85 7 280 3311 +8e8c c 281 3311 +8e98 13 284 3311 +8eab 1 285 3311 +FUNC 8eac 2b 4 __sbh_find_block +8eac 0 306 3311 +8eac 12 307 3311 +8ebe 7 316 3311 +8ec5 8 317 3311 +8ecd 3 319 3311 +8ed0 4 314 3311 +8ed4 2 321 3311 +8ed6 1 322 3311 +FUNC 8ed7 314 8 __sbh_free_block +8ed7 6 381 3311 +8edd 7 399 3311 +8ee4 9 402 3311 +8eed 18 407 3311 +8f05 3 408 3311 +8f08 d 412 3311 +8f15 3 416 3311 +8f18 5 417 3311 +8f1d 6 420 3311 +8f23 b 424 3311 +8f2e 4 429 3311 +8f32 5 430 3311 +8f37 3 431 3311 +8f3a 8 434 3311 +8f42 3 439 3311 +8f45 b 441 3311 +8f50 e 442 3311 +8f5e 5 443 3311 +8f63 2 445 3311 +8f65 5 448 3311 +8f6a 11 449 3311 +8f7b 9 450 3311 +8f84 9 455 3311 +8f8d 15 459 3311 +8fa2 6 463 3311 +8fa8 5 464 3311 +8fad 3 465 3311 +8fb0 f 468 3311 +8fbf 3 474 3311 +8fc2 6 477 3311 +8fc8 b 478 3311 +8fd3 2 479 3311 +8fd5 3 483 3311 +8fd8 6 484 3311 +8fde 7 485 3311 +8fe5 2 486 3311 +8fe7 4 489 3311 +8feb b 493 3311 +8ff6 3 498 3311 +8ff9 11 501 3311 +900a 6 502 3311 +9010 5 503 3311 +9015 2 505 3311 +9017 e 508 3311 +9025 6 509 3311 +902b 6 511 3311 +9031 c 516 3311 +903d c 517 3311 +9049 8 520 3311 +9051 e 524 3311 +905f 6 528 3311 +9065 3 529 3311 +9068 6 530 3311 +906e 3 531 3311 +9071 6 532 3311 +9077 8 535 3311 +907f 18 541 3311 +9097 e 542 3311 +90a5 f 543 3311 +90b4 2 545 3311 +90b6 6 547 3311 +90bc 10 548 3311 +90cc 13 550 3311 +90df 5 556 3311 +90e4 4 558 3311 +90e8 b 561 3311 +90f3 d 564 3311 +9100 6 568 3311 +9106 1a 569 3311 +9120 15 573 3311 +9135 16 577 3311 +914b 19 578 3311 +9164 9 579 3311 +916d 6 583 3311 +9173 8 586 3311 +917b 16 589 3311 +9191 25 595 3311 +91b6 14 599 3311 +91ca 4 600 3311 +91ce a 603 3311 +91d8 8 608 3311 +91e0 9 609 3311 +91e9 2 611 3311 +FUNC 91eb b0 0 __sbh_alloc_new_region +91eb 0 891 3311 +91eb 13 897 3311 +91fe 1e 900 3311 +921c 4 901 3311 +9220 12 905 3311 +9232 9 909 3311 +923b 18 913 3311 +9253 2 914 3311 +9255 1a 918 3311 +926f 10 920 3311 +927f 2 921 3311 +9281 9 927 3311 +928a 6 930 3311 +9290 6 933 3311 +9296 4 935 3311 +929a 1 936 3311 +FUNC 929b 106 4 __sbh_alloc_new_group +929b 5 958 3311 +92a0 3 959 3311 +92a3 9 972 3311 +92ac 4 973 3311 +92b0 2 976 3311 +92b2 1 977 3311 +92b3 4 974 3311 +92b7 15 981 3311 +92cc c 986 3311 +92d8 1f 993 3311 +92f7 8 994 3311 +92ff 6 998 3311 +9305 12 1001 3311 +9317 4 1004 3311 +931b 7 1005 3311 +9322 8 1011 3311 +932a 10 1013 3311 +933a 12 1016 3311 +934c 3 1001 3311 +934f 8 1021 3311 +9357 6 1023 3311 +935d 3 1024 3311 +9360 6 1027 3311 +9366 3 1028 3311 +9369 5 1030 3311 +936e a 1031 3311 +9378 9 1032 3311 +9381 b 1033 3311 +938c e 1036 3311 +939a 5 1038 3311 +939f 2 1039 3311 +FUNC 93a1 2df c __sbh_resize_block +93a1 6 1061 3311 +93a7 c 1080 3311 +93b3 b 1083 3311 +93be 3 1084 3311 +93c1 12 1085 3311 +93d3 7 1089 3311 +93da 14 1096 3311 +93ee 13 1099 3311 +9401 7 1105 3311 +9408 8 1106 3311 +9410 6 1107 3311 +9416 8 1110 3311 +941e 3 1115 3311 +9421 9 1117 3311 +942a 11 1118 3311 +943b 5 1119 3311 +9440 2 1121 3311 +9442 5 1124 3311 +9447 14 1125 3311 +945b 6 1126 3311 +9461 9 1131 3311 +946a 9 1132 3311 +9473 12 1135 3311 +9485 a 1141 3311 +948f 9 1142 3311 +9498 3 1143 3311 +949b 9 1147 3311 +94a4 6 1148 3311 +94aa 6 1149 3311 +94b0 3 1150 3311 +94b3 6 1151 3311 +94b9 8 1154 3311 +94c1 18 1160 3311 +94d9 e 1161 3311 +94e7 6 1162 3311 +94ed 2 1164 3311 +94ef 6 1166 3311 +94f5 10 1167 3311 +9505 13 1169 3311 +9518 c 1174 3311 +9524 9 1176 3311 +952d 6 1180 3311 +9533 9 1182 3311 +953c 7 1100 3311 +9543 6 1186 3311 +9549 3 1189 3311 +954c d 1195 3311 +9559 7 1198 3311 +9560 b 1199 3311 +956b 3 1200 3311 +956e a 1203 3311 +9578 7 1208 3311 +957f 5 1209 3311 +9584 3 1210 3311 +9587 8 1213 3311 +958f 3 1218 3311 +9592 b 1221 3311 +959d e 1222 3311 +95ab 5 1223 3311 +95b0 2 1225 3311 +95b2 5 1228 3311 +95b7 11 1229 3311 +95c8 9 1231 3311 +95d1 9 1236 3311 +95da 9 1237 3311 +95e3 9 1240 3311 +95ec 4 1241 3311 +95f0 5 1242 3311 +95f5 3 1243 3311 +95f8 6 1249 3311 +95fe 3 1250 3311 +9601 6 1251 3311 +9607 3 1252 3311 +960a 6 1253 3311 +9610 8 1256 3311 +9618 18 1262 3311 +9630 e 1263 3311 +963e 6 1264 3311 +9644 2 1266 3311 +9646 6 1268 3311 +964c 10 1269 3311 +965c 13 1271 3311 +966f 5 1276 3311 +9674 4 1278 3311 +9678 6 1281 3311 +967e 2 1282 3311 +FUNC 9680 cd 0 __sbh_heapmin +9680 0 1302 3311 +9680 d 1306 3311 +968d 6 1310 3311 +9693 17 1311 3311 +96aa 15 1314 3311 +96bf 16 1318 3311 +96d5 19 1319 3311 +96ee 9 1320 3311 +96f7 f 1325 3311 +9706 11 1328 3311 +9717 28 1333 3311 +973f 6 1334 3311 +9745 7 1338 3311 +974c 1 1340 3311 +FUNC 974d 2e2 0 __sbh_heap_check +974d 3 1361 3311 +9750 12 1391 3311 +9762 8 1393 3311 +976a 16 1398 3311 +9780 3 1401 3311 +9783 8 1402 3311 +978b 6 1406 3311 +9791 9 1407 3311 +979a c 1408 3311 +97a6 3 1409 3311 +97a9 3 1410 3311 +97ac 6 1411 3311 +97b2 4 1418 3311 +97b6 1b 1421 3311 +97d1 9 1424 3311 +97da 9 1428 3311 +97e3 1c 1438 3311 +97ff 2 1445 3311 +9801 7 1446 3311 +9808 1 1449 3311 +9809 c 1452 3311 +9815 3 1456 3311 +9818 2 1458 3311 +981a 6 1462 3311 +9820 5 1463 3311 +9825 3 1464 3311 +9828 9 1465 3311 +9831 1e 1470 3311 +984f c 1475 3311 +985b 2 1479 3311 +985d 4 1481 3311 +9861 6 1484 3311 +9867 10 1488 3311 +9877 e 1492 3311 +9885 2 1498 3311 +9887 4 1502 3311 +988b 20 1505 3311 +98ab 19 1509 3311 +98c4 8 1514 3311 +98cc 3 1518 3311 +98cf 6 1520 3311 +98d5 8 1524 3311 +98dd 4 1527 3311 +98e1 e 1532 3311 +98ef 8 1536 3311 +98f7 6 1541 3311 +98fd 5 1542 3311 +9902 3 1543 3311 +9905 8 1544 3311 +990d c 1549 3311 +9919 11 1554 3311 +992a 6 1559 3311 +9930 3 1561 3311 +9933 e 1563 3311 +9941 3 1564 3311 +9944 2 1566 3311 +9946 8 1568 3311 +994e 3 1569 3311 +9951 1c 1575 3311 +996d c 1580 3311 +9979 10 1585 3311 +9989 17 1591 3311 +99a0 7 1595 3311 +99a7 7 1596 3311 +99ae 16 1597 3311 +99c4 f 1602 3311 +99d3 18 1606 3311 +99eb 5 1608 3311 +99f0 2 1609 3311 +99f2 4 1403 3311 +99f6 4 1425 3311 +99fa 4 1453 3311 +99fe 4 1485 3311 +9a02 4 1471 3311 +9a06 4 1439 3311 +9a0a 4 1493 3311 +9a0e 4 1537 3311 +9a12 4 1545 3311 +9a16 4 1550 3311 +9a1a 4 1510 3311 +9a1e 4 1581 3311 +9a22 4 1576 3311 +9a26 4 1592 3311 +9a2a 5 1603 3311 +FUNC 9a2f a8 4 _set_sbh_threshold +9a2f 1 102 3311 +9a30 a 104 3311 +9a3a 3 106 3311 +9a3d 1 195 3311 +9a3e a 109 3311 +9a48 25 112 3311 +9a6d 5 113 3311 +9a72 4 114 3311 +9a76 2 195 3311 +9a78 6 173 3311 +9a7e 2 175 3311 +9a80 5 179 3311 +9a85 2d 185 3311 +9ab2 6 186 3311 +9ab8 a 187 3311 +9ac2 5 188 3311 +9ac7 b 193 3311 +9ad2 4 194 3311 +9ad6 1 195 3311 +FUNC 9ad7 2e3 4 __sbh_alloc_block +9ad7 6 632 3311 +9add 5 633 3311 +9ae2 15 650 3311 +9af7 5 668 3311 +9afc 7 669 3311 +9b03 5 671 3311 +9b08 4 672 3311 +9b0c 2 674 3311 +9b0e d 677 3311 +9b1b a 682 3311 +9b25 e 686 3311 +9b33 3 688 3311 +9b36 2 683 3311 +9b38 5 688 3311 +9b3d 4 692 3311 +9b41 8 694 3311 +9b49 e 698 3311 +9b57 3 700 3311 +9b5a 2 695 3311 +9b5c 5 700 3311 +9b61 6 705 3311 +9b67 6 709 3311 +9b6d 6 711 3311 +9b73 4 707 3311 +9b77 4 715 3311 +9b7b 8 717 3311 +9b83 6 720 3311 +9b89 3 722 3311 +9b8c 2 718 3311 +9b8e 5 722 3311 +9b93 4 726 3311 +9b97 e 727 3311 +9ba5 7 728 3311 +9bac 12 733 3311 +9bbe 2 734 3311 +9bc0 6 737 3311 +9bc6 3 739 3311 +9bc9 2 740 3311 +9bcb 1c 745 3311 +9be7 4 749 3311 +9beb 14 751 3311 +9bff e 752 3311 +9c0d 3 751 3311 +9c10 12 754 3311 +9c22 a 760 3311 +9c2c d 763 3311 +9c39 2 768 3311 +9c3b 2 767 3311 +9c3d 1 768 3311 +9c3e 4 765 3311 +9c42 7 770 3311 +9c49 5 775 3311 +9c4e 6 776 3311 +9c54 8 777 3311 +9c5c 3 778 3311 +9c5f 8 781 3311 +9c67 8 784 3311 +9c6f 3 788 3311 +9c72 e 791 3311 +9c80 15 792 3311 +9c95 8 793 3311 +9c9d 2 795 3311 +9c9f f 798 3311 +9cae f 799 3311 +9cbd e 800 3311 +9ccb 1c 809 3311 +9ce7 6 813 3311 +9ced 3 814 3311 +9cf0 6 815 3311 +9cf6 3 816 3311 +9cf9 6 817 3311 +9cff 8 820 3311 +9d07 18 826 3311 +9d1f b 827 3311 +9d2a 10 829 3311 +9d3a 2 831 3311 +9d3c 6 833 3311 +9d42 d 835 3311 +9d4f 16 837 3311 +9d65 3 831 3311 +9d68 4 844 3311 +9d6c 2 846 3311 +9d6e 9 848 3311 +9d77 a 853 3311 +9d81 4 855 3311 +9d85 e 858 3311 +9d93 13 862 3311 +9da6 7 863 3311 +9dad 5 866 3311 +9db2 6 868 3311 +9db8 2 869 3311 +FUNC 9dba 39 0 terminate() +9dba c 94 3855 +9dc6 8 107 3855 +9dce 4 111 3855 +9dd2 4 116 3855 +9dd6 2 120 3855 +9dd8 2 121 3855 +9dda 7 122 3855 +9de1 7 127 3855 +9de8 5 135 3855 +9ded 6 136 3855 +FUNC 9df3 13 0 unexpected() +9df3 0 149 3855 +9df3 8 159 3855 +9dfb 4 163 3855 +9dff 2 167 3855 +9e01 5 173 3855 +FUNC 9e06 37 0 _inconsistency() +9e06 c 187 3855 +9e12 c 196 3855 +9e1e 4 197 3855 +9e22 4 202 3855 +9e26 2 203 3855 +9e28 2 204 3855 +9e2a 7 205 3855 +9e31 7 211 3855 +9e38 5 217 3855 +FUNC 9e3d 11 4 _initp_eh_hooks +9e3d 0 74 3855 +9e3d 10 80 3855 +9e4d 1 81 3855 +FUNC 9e4e b9 4 _onexit_nolock +9e4e 5 104 1673 +9e53 b 107 1673 +9e5e 13 108 1673 +9e71 16 112 1673 +9e87 d 122 1673 +9e94 d 127 1673 +9ea1 14 129 1673 +9eb5 3 134 1673 +9eb8 14 136 1673 +9ecc 3 147 1673 +9ecf f 149 1673 +9ede e 156 1673 +9eec c 157 1673 +9ef8 7 159 1673 +9eff 6 114 1673 +9f05 2 160 1673 +FUNC 9f07 2f 0 __onexitinit +9f07 1 205 1673 +9f08 b 208 1673 +9f13 9 209 1673 +9f1c e 211 1673 +9f2a 4 216 1673 +9f2e 1 221 1673 +9f2f 3 218 1673 +9f32 3 220 1673 +9f35 1 221 1673 +FUNC 9f36 3c 4 _onexit +9f36 c 85 1673 +9f42 5 88 1673 +9f47 4 90 1673 +9f4b c 91 1673 +9f57 c 93 1673 +9f63 3 97 1673 +9f66 6 98 1673 +9f6c 6 94 1673 +FUNC 9f72 12 4 atexit +9f72 0 165 1673 +9f72 11 166 1673 +9f83 1 167 1673 +FUNC 9f84 1f 0 _initp_misc_cfltcvt_tab +9f84 2 54 2488 +9f86 8 56 2488 +9f8e 14 58 2488 +9fa2 1 60 2488 +FUNC 9fb0 29 4 _ValidateImageBase +9fb0 0 44 1573 +9fb0 b 50 1573 +9fbb 2 52 1573 +9fbd 1 68 1573 +9fbe 5 55 1573 +9fc3 6 56 1573 +9fc9 2 58 1573 +9fcb d 62 1573 +9fd8 1 68 1573 +FUNC 9fe0 42 8 _FindPESection +9fe0 0 92 1573 +9fe0 9 99 1573 +9fe9 19 108 1573 +a002 10 111 1573 +a012 a 108 1573 +a01c 5 123 1573 +a021 1 124 1573 +FUNC a030 bb 4 _IsNonwritableInCurrentImage +a030 33 149 1573 +a063 7 156 1573 +a06a f 164 1573 +a079 2 166 1573 +a07b 8 174 1573 +a083 e 175 1573 +a091 2 176 1573 +a093 2 178 1573 +a095 12 185 1573 +a0a7 12 195 1573 +a0b9 17 187 1573 +a0d0 9 193 1573 +a0d9 12 195 1573 +FUNC a0eb 19 4 _initp_misc_winsig +a0eb 0 57 1199 +a0eb 9 58 1199 +a0f4 5 59 1199 +a0f9 5 60 1199 +a0fe 5 61 1199 +a103 1 62 1199 +FUNC a104 9b 4 ctrlevent_capture +a104 c 89 1199 +a110 9 94 1199 +a119 3 95 1199 +a11c 5 102 1199 +a121 5 103 1199 +a126 e 104 1199 +a134 7 105 1199 +a13b 2 107 1199 +a13d 5 108 1199 +a142 e 109 1199 +a150 7 110 1199 +a157 1 109 1199 +a158 9 113 1199 +a161 7 117 1199 +a168 c 120 1199 +a174 5 124 1199 +a179 4 128 1199 +a17d 2 120 1199 +a17f 8 121 1199 +a187 6 130 1199 +a18d 7 131 1199 +a194 3 138 1199 +a197 8 139 1199 +FUNC a19f 34 4 siglookup +a19f 0 634 1199 +a19f b 635 1199 +a1aa 15 645 1199 +a1bf f 649 1199 +a1ce 2 653 1199 +a1d0 2 658 1199 +a1d2 1 659 1199 +FUNC a1d3 d 0 __get_sigabrt +a1d3 0 676 1199 +a1d3 c 677 1199 +a1df 1 678 1199 +FUNC a1e0 9 0 __fpecode +a1e0 0 699 1199 +a1e0 8 700 1199 +a1e8 1 701 1199 +FUNC a1e9 9 0 __pxcptinfoptrs +a1e9 0 721 1199 +a1e9 8 722 1199 +a1f1 1 723 1199 +FUNC a1f2 23d 8 signal +a1f2 c 219 1199 +a1fe 4 224 1199 +a202 3 230 1199 +a205 3 244 1199 +a208 12 230 1199 +a21a 2f 244 1199 +a249 13 327 1199 +a25c 7 334 1199 +a263 8 335 1199 +a26b a 342 1199 +a275 17 346 1199 +a28c 10 352 1199 +a29c 13 367 1199 +a2af 3 380 1199 +a2b2 e 382 1199 +a2c0 3 395 1199 +a2c3 17 401 1199 +a2da 5 390 1199 +a2df 5 401 1199 +a2e4 8 246 1199 +a2ec 4 247 1199 +a2f0 12 254 1199 +a302 14 257 1199 +a316 6 259 1199 +a31c 2 261 1199 +a31e f 263 1199 +a32d a 264 1199 +a337 18 268 1199 +a34f f 288 1199 +a35e 4 289 1199 +a362 b 291 1199 +a36d 2 293 1199 +a36f f 279 1199 +a37e 4 280 1199 +a382 b 282 1199 +a38d 2 284 1199 +a38f f 296 1199 +a39e 4 297 1199 +a3a2 b 299 1199 +a3ad 2 301 1199 +a3af f 271 1199 +a3be 4 272 1199 +a3c2 c 274 1199 +a3ce c 305 1199 +a3da 9 309 1199 +a3e3 4 407 1199 +a3e7 3 305 1199 +a3ea 9 306 1199 +a3f3 19 410 1199 +a40c 1a 419 1199 +a426 3 417 1199 +a429 6 423 1199 +FUNC a42f 1b0 4 raise +a42f c 452 1199 +a43b 5 459 1199 +a440 3 460 1199 +a443 1f 462 1199 +a462 a 488 1199 +a46c 4 489 1199 +a470 8 490 1199 +a478 a 465 1199 +a482 2 467 1199 +a484 11 492 1199 +a495 2 493 1199 +a497 f 462 1199 +a4a6 1c 500 1199 +a4c2 a 476 1199 +a4cc 2 478 1199 +a4ce a 470 1199 +a4d8 2 472 1199 +a4da a 481 1199 +a4e4 7 482 1199 +a4eb a 502 1199 +a4f5 2 510 1199 +a4f7 4 509 1199 +a4fb 6 510 1199 +a501 5 515 1199 +a506 7 520 1199 +a50d 5 527 1199 +a512 7 528 1199 +a519 5 530 1199 +a51e f 543 1199 +a52d 6 544 1199 +a533 3 545 1199 +a536 5 551 1199 +a53b 6 552 1199 +a541 7 553 1199 +a548 5 561 1199 +a54d 1c 568 1199 +a569 d 571 1199 +a576 5 568 1199 +a57b 7 574 1199 +a582 c 577 1199 +a58e 5 582 1199 +a593 8 588 1199 +a59b 2 589 1199 +a59d 6 577 1199 +a5a3 6 578 1199 +a5a9 9 579 1199 +a5b2 5 590 1199 +a5b7 f 597 1199 +a5c6 6 598 1199 +a5cc 5 603 1199 +a5d1 6 604 1199 +a5d7 2 607 1199 +a5d9 6 608 1199 +FUNC a5df a 4 _initp_misc_rand_s +a5df 0 58 1489 +a5df 9 59 1489 +a5e8 1 60 1489 +FUNC a5e9 104 4 rand_s +a5e9 3 66 1489 +a5ec b 67 1489 +a5f7 2b 68 1489 +a622 c 71 1489 +a62e d 77 1489 +a63b 4 78 1489 +a63f 1e 80 1489 +a65d e 83 1489 +a66b 4 84 1489 +a66f 2f 86 1489 +a69e 9 88 1489 +a6a7 5 89 1489 +a6ac 16 94 1489 +a6c2 7 103 1489 +a6c9 9 107 1489 +a6d2 b 109 1489 +a6dd 9 110 1489 +a6e6 6 112 1489 +a6ec 1 113 1489 +FUNC a6ed 15a 14 __getlocaleinfo +a6ed 1d 70 1937 +a70a 7 76 1937 +a711 87 109 1937 +a798 13 103 1937 +a7ab 5 114 1937 +a7b0 7 115 1937 +a7b7 3 141 1937 +a7ba 12 142 1937 +a7cc 20 106 1937 +a7ec 5 108 1937 +a7f1 7 109 1937 +a7f8 4 111 1937 +a7fc 5 118 1937 +a801 1a 126 1937 +a81b 2 127 1937 +a81d 2 129 1937 +a81f 10 134 1937 +a82f 16 135 1937 +a845 2 139 1937 +FUNC a847 a 4 _initp_misc_purevirt +a847 0 166 1937 +a847 9 167 1937 +a850 1 168 1937 +FUNC a851 a 4 _initp_misc_initcrit +a851 0 47 2023 +a851 9 48 2023 +a85a 1 49 2023 +FUNC a85b 10 8 __crtInitCritSecNoSpinCount +a85b 0 76 2023 +a85b a 77 2023 +a865 3 78 2023 +a868 3 79 2023 +FUNC a86b c5 8 __crtInitCritSecAndSpinCount +a86b c 109 2023 +a877 5 111 2023 +a87c e 112 2023 +a88a 4 114 2023 +a88e 1b 120 2023 +a8a9 4 121 2023 +a8ad 2 129 2023 +a8af b 130 2023 +a8ba 4 131 2023 +a8be e 134 2023 +a8cc 4 136 2023 +a8d0 5 149 2023 +a8d5 c 152 2023 +a8e1 3 155 2023 +a8e4 b 161 2023 +a8ef 2 162 2023 +a8f1 1a 163 2023 +a90b 9 170 2023 +a914 8 171 2023 +a91c 4 173 2023 +a920 7 174 2023 +a927 3 176 2023 +a92a 6 177 2023 +FUNC a930 a 4 _initp_heap_handler +a930 0 31 3260 +a930 9 32 3260 +a939 1 33 3260 +FUNC a93a 31 4 _set_new_handler(int (*)(unsigned int)) +a93a 1 53 3260 +a93b 7 57 3260 +a942 b 59 3260 +a94d b 60 3260 +a958 f 63 3260 +a967 3 65 3260 +a96a 1 66 3260 +FUNC a96b 9 4 _set_new_handler(int) +a96b 0 86 3260 +a96b 8 89 3260 +a973 1 90 3260 +FUNC a974 d 0 _query_new_handler() +a974 0 110 3260 +a974 c 111 3260 +a980 1 112 3260 +FUNC a981 22 4 _callnewh +a981 0 131 3260 +a981 b 133 3260 +a98c 10 135 3260 +a99c 3 138 3260 +a99f 1 139 3260 +a9a0 2 136 3260 +a9a2 1 139 3260 +FUNC a9a3 1bd c __crtMessageBoxA +a9a3 9 41 2447 +a9ac 5 49 2447 +a9b1 2 56 2447 +a9b3 18 64 2447 +a9cb d 66 2447 +a9d8 2 67 2447 +a9da 6 69 2447 +a9e0 10 76 2447 +a9f0 6 78 2447 +a9f6 6 80 2447 +a9fc 15 83 2447 +aa11 1a 86 2447 +aa2b 1c 88 2447 +aa47 6 89 2447 +aa4d 8 95 2447 +aa55 6 98 2447 +aa5b a 100 2447 +aa65 14 102 2447 +aa79 14 116 2447 +aa8d 6 119 2447 +aa93 d 120 2447 +aaa0 c 122 2447 +aaac 1f 127 2447 +aacb 1b 136 2447 +aae6 6 137 2447 +aaec 7 138 2447 +aaf3 2 139 2447 +aaf5 7 140 2447 +aafc 2 142 2447 +aafe a 144 2447 +ab08 6 146 2447 +ab0e 5 147 2447 +ab13 2 149 2447 +ab15 11 153 2447 +ab26 6 155 2447 +ab2c 5 156 2447 +ab31 8 158 2447 +ab39 b 165 2447 +ab44 5 166 2447 +ab49 10 168 2447 +ab59 5 173 2447 +ab5e 2 176 2447 +FUNC ab60 71 c strcat_s +ab60 0 13 490 +ab60 30 18 490 +ab90 c 19 490 +ab9c 2 21 490 +ab9e 4 23 490 +aba2 1 25 490 +aba3 3 26 490 +aba6 2 29 490 +aba8 2 32 490 +abaa d 35 490 +abb7 4 39 490 +abbb 2 41 490 +abbd e 42 490 +abcb 5 45 490 +abd0 1 46 490 +FUNC abd1 b3 10 strncpy_s +abd1 5 13 406 +abd6 14 17 406 +abea 5 65 406 +abef 2 66 406 +abf1 26 24 406 +ac17 5 25 406 +ac1c 2 28 406 +ac1e 2 29 406 +ac20 b 31 406 +ac2b 8 35 406 +ac33 d 37 406 +ac40 2 41 406 +ac42 12 45 406 +ac54 5 48 406 +ac59 2 50 406 +ac5b 4 54 406 +ac5f 6 56 406 +ac65 3 58 406 +ac68 c 59 406 +ac74 2 61 406 +ac76 e 62 406 +FUNC ac84 46 4 _set_error_mode +ac84 0 43 2351 +ac84 15 50 2351 +ac99 6 58 2351 +ac9f 1 65 2351 +aca0 5 54 2351 +aca5 7 55 2351 +acac 1 65 2351 +acad 1c 61 2351 +acc9 1 65 2351 +FUNC acca a 4 __set_app_type +acca 0 91 2351 +acca 9 96 2351 +acd3 1 97 2351 +FUNC acd4 6 0 __get_app_type +acd4 0 120 2351 +acd4 5 125 2351 +acd9 1 126 2351 +FUNC acda 21 4 wait_a_bit +acda 1 18 3587 +acdb b 19 3587 +ace6 6 20 3587 +acec 8 21 3587 +acf4 3 22 3587 +acf7 3 23 3587 +acfa 1 24 3587 +FUNC acfb 10 4 _set_malloc_crt_max_wait +acfb 0 32 3587 +acfb f 34 3587 +ad0a 1 36 3587 +FUNC ad0b 40 4 _malloc_crt +ad0b 2 39 3587 +ad0d 2 40 3587 +ad0f b 44 3587 +ad1a d 45 3587 +ad27 18 46 3587 +ad3f 7 47 3587 +ad46 4 50 3587 +ad4a 1 51 3587 +FUNC ad4b 48 8 _calloc_crt +ad4b 2 54 3587 +ad4d 2 55 3587 +ad4f 14 61 3587 +ad63 c 62 3587 +ad6f 18 63 3587 +ad87 7 64 3587 +ad8e 4 67 3587 +ad92 1 68 3587 +FUNC ad93 4b 8 _realloc_crt +ad93 2 71 3587 +ad95 2 72 3587 +ad97 f 76 3587 +ada6 14 77 3587 +adba 18 78 3587 +add2 7 79 3587 +add9 4 82 3587 +addd 1 83 3587 +FUNC adde 50 c _recalloc_crt +adde 2 86 3587 +ade0 2 87 3587 +ade2 16 91 3587 +adf8 12 92 3587 +ae0a 18 94 3587 +ae22 7 95 3587 +ae29 4 100 3587 +ae2d 1 101 3587 +FUNC ae2e 8 0 _malloc_crt_fastcall +ae2e 0 105 3587 +ae2e 7 106 3587 +ae35 1 107 3587 +FUNC ae36 a 0 _calloc_crt_fastcall +ae36 0 110 3587 +ae36 9 111 3587 +ae3f 1 112 3587 +FUNC ae40 a 0 _realloc_crt_fastcall +ae40 0 115 3587 +ae40 9 116 3587 +ae49 1 117 3587 +FUNC ae4a e 0 _LocaleUpdate::~_LocaleUpdate() +ae4a 0 282 3057 +ae4a 6 283 3057 +ae50 7 284 3057 +ae57 1 285 3057 +FUNC ae58 3 0 _LocaleUpdate::GetLocaleT() +ae58 2 287 3057 +ae5a 1 289 3057 +FUNC ae5b 2f 0 CPtoLCID +ae5b 0 329 3029 +ae5b 14 330 3029 +ae6f 2 345 3029 +ae71 1 346 3029 +ae72 5 342 3029 +ae77 1 346 3029 +ae78 5 339 3029 +ae7d 1 346 3029 +ae7e 5 336 3029 +ae83 1 346 3029 +ae84 5 333 3029 +ae89 1 346 3029 +FUNC ae8a 55 0 setSBCS +ae8a 4 363 3029 +ae8e 14 368 3029 +aea2 3 371 3029 +aea5 3 374 3029 +aea8 3 376 3029 +aeab 8 379 3029 +aeb3 a 381 3029 +aebd 9 382 3029 +aec6 b 384 3029 +aed1 d 385 3029 +aede 1 386 3029 +FUNC aedf 18a 0 setSBUpLow +aedf 1d 402 3029 +aefc f 412 3029 +af0b d 415 3029 +af18 c 416 3029 +af24 e 420 3029 +af32 3 419 3029 +af35 28 421 3029 +af5d 1d 427 3029 +af7a 23 432 3029 +af9d 25 437 3029 +afc2 2 442 3029 +afc4 a 443 3029 +afce 5 445 3029 +afd3 9 446 3029 +afdc 5 448 3029 +afe1 5 450 3029 +afe6 e 451 3029 +aff4 2 453 3029 +aff6 8 454 3029 +affe 5 442 3029 +b003 8 456 3029 +b00b 2c 472 3029 +b037 5 466 3029 +b03c 5 468 3029 +b041 7 469 3029 +b048 2 471 3029 +b04a 3 472 3029 +b04d 5 460 3029 +b052 17 474 3029 +FUNC b069 a4 0 __updatetmbcinfo +b069 c 496 3029 +b075 7 499 3029 +b07c 10 500 3029 +b08c 3 533 3029 +b08f 4 536 3029 +b093 8 538 3029 +b09b 2 541 3029 +b09d 6 542 3029 +b0a3 8 501 3029 +b0ab 4 503 3029 +b0af e 506 3029 +b0bd 17 512 3029 +b0d4 7 517 3029 +b0db 11 524 3029 +b0ec 7 525 3029 +b0f3 11 528 3029 +b104 9 530 3029 +FUNC b10d 82 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *) +b10d 0 261 3057 +b10d f 262 3057 +b11c 8 264 3057 +b124 5 265 3057 +b129 6 266 3057 +b12f 1c 268 3057 +b14b 21 269 3057 +b16c 9 270 3057 +b175 4 272 3057 +b179 4 273 3057 +b17d 2 276 3057 +b17f a 278 3057 +b189 6 280 3057 +FUNC b18f 7a 0 getSystemCP +b18f 7 282 3029 +b196 b 284 3029 +b1a1 b 289 3029 +b1ac a 291 3029 +b1b6 14 292 3029 +b1ca 5 295 3029 +b1cf a 297 3029 +b1d9 8 298 3029 +b1e1 5 302 3029 +b1e6 12 305 3029 +b1f8 f 308 3029 +b207 2 309 3029 +FUNC b209 1d9 8 _setmbcp_nolock +b209 15 686 3029 +b21e b 693 3029 +b229 9 696 3029 +b232 7 698 3029 +b239 7 699 3029 +b240 3 703 3029 +b243 2 705 3029 +b245 19 708 3029 +b25e 2a 743 3029 +b288 13 751 3029 +b29b f 756 3029 +b2aa 15 761 3029 +b2bf 17 764 3029 +b2d6 c 766 3029 +b2e2 f 712 3029 +b2f1 15 715 3029 +b306 9 720 3029 +b30f 8 723 3029 +b317 12 724 3029 +b329 9 723 3029 +b332 5 720 3029 +b337 12 715 3029 +b349 20 731 3029 +b369 d 733 3029 +b376 7 736 3029 +b37d 5 737 3029 +b382 6 767 3029 +b388 10 766 3029 +b398 8 771 3029 +b3a0 7 772 3029 +b3a7 b 775 3029 +b3b2 3 778 3029 +b3b5 2 780 3029 +b3b7 3 782 3029 +b3ba 8 785 3029 +b3c2 2 789 3029 +b3c4 6 794 3029 +b3ca 6 797 3029 +b3d0 3 746 3029 +b3d3 f 802 3029 +FUNC b3e2 3c 0 _getmbcp +b3e2 6 819 3029 +b3e8 a 821 3029 +b3f2 9 822 3029 +b3fb 10 823 3029 +b40b 2 826 3029 +b40d f 825 3029 +b41c 2 826 3029 +FUNC b41e 19a 4 _setmbcp +b41e c 574 3029 +b42a 4 575 3029 +b42e a 579 3029 +b438 5 581 3029 +b43d 3 582 3029 +b440 b 585 3029 +b44b 9 587 3029 +b454 d 593 3029 +b461 8 595 3029 +b469 c 597 3029 +b475 3 607 3029 +b478 16 612 3029 +b48e 1a 614 3029 +b4a8 7 615 3029 +b4af 3 619 3029 +b4b2 9 620 3029 +b4bb 17 622 3029 +b4d2 8 624 3029 +b4da 4 625 3029 +b4de 8 630 3029 +b4e6 8 631 3029 +b4ee 8 632 3029 +b4f6 a 633 3029 +b500 d 634 3029 +b50d 3 633 3029 +b510 c 635 3029 +b51c a 636 3029 +b526 3 635 3029 +b529 c 637 3029 +b535 d 638 3029 +b542 3 637 3029 +b545 1c 640 3029 +b561 7 641 3029 +b568 6 645 3029 +b56e 3 646 3029 +b571 e 648 3029 +b57f 9 650 3029 +b588 2 653 3029 +b58a 5 654 3029 +b58f 8 660 3029 +b597 7 661 3029 +b59e b 662 3029 +b5a9 2 668 3029 +b5ab 4 673 3029 +b5af 3 682 3029 +b5b2 6 683 3029 +FUNC b5b8 1e 0 __initmbctable +b5b8 0 843 3029 +b5b8 9 853 3029 +b5c1 8 854 3029 +b5c9 a 855 3029 +b5d3 2 860 3029 +b5d5 1 861 3029 +FUNC b5d6 51 10 x_ismbbtype_l +b5d6 6 213 3083 +b5dc b 214 3083 +b5e7 4 219 3083 +b5eb 3a 222 3083 +b625 2 223 3083 +FUNC b627 15 8 _ismbbkalnum_l +b627 0 80 3083 +b627 14 81 3083 +b63b 1 82 3083 +FUNC b63c 13 4 _ismbbkalnum +b63c 0 85 3083 +b63c 12 86 3083 +b64e 1 87 3083 +FUNC b64f 15 8 _ismbbkprint_l +b64f 0 90 3083 +b64f 14 91 3083 +b663 1 92 3083 +FUNC b664 13 4 _ismbbkprint +b664 0 95 3083 +b664 12 96 3083 +b676 1 97 3083 +FUNC b677 15 8 _ismbbkpunct_l +b677 0 100 3083 +b677 14 101 3083 +b68b 1 102 3083 +FUNC b68c 13 4 _ismbbkpunct +b68c 0 105 3083 +b68c 12 106 3083 +b69e 1 107 3083 +FUNC b69f 18 8 _ismbbalnum_l +b69f 0 113 3083 +b69f 17 114 3083 +b6b6 1 115 3083 +FUNC b6b7 16 4 _ismbbalnum +b6b7 0 118 3083 +b6b7 15 119 3083 +b6cc 1 120 3083 +FUNC b6cd 18 8 _ismbbalpha_l +b6cd 0 123 3083 +b6cd 17 124 3083 +b6e4 1 125 3083 +FUNC b6e5 16 4 _ismbbalpha +b6e5 0 128 3083 +b6e5 15 129 3083 +b6fa 1 130 3083 +FUNC b6fb 18 8 _ismbbgraph_l +b6fb 0 133 3083 +b6fb 17 134 3083 +b712 1 135 3083 +FUNC b713 16 4 _ismbbgraph +b713 0 138 3083 +b713 15 139 3083 +b728 1 140 3083 +FUNC b729 18 8 _ismbbprint_l +b729 0 143 3083 +b729 17 144 3083 +b740 1 145 3083 +FUNC b741 16 4 _ismbbprint +b741 0 148 3083 +b741 15 149 3083 +b756 1 150 3083 +FUNC b757 15 8 _ismbbpunct_l +b757 0 153 3083 +b757 14 154 3083 +b76b 1 155 3083 +FUNC b76c 13 4 _ismbbpunct +b76c 0 158 3083 +b76c 12 159 3083 +b77e 1 160 3083 +FUNC b77f 15 8 _ismbblead_l +b77f 0 166 3083 +b77f 14 167 3083 +b793 1 168 3083 +FUNC b794 13 4 _ismbblead +b794 0 171 3083 +b794 12 172 3083 +b7a6 1 173 3083 +FUNC b7a7 15 8 _ismbbtrail_l +b7a7 0 176 3083 +b7a7 14 177 3083 +b7bb 1 178 3083 +FUNC b7bc 13 4 _ismbbtrail +b7bc 0 181 3083 +b7bc 12 182 3083 +b7ce 1 183 3083 +FUNC b7cf 53 8 _ismbbkana_l +b7cf 6 189 3083 +b7d5 b 190 3083 +b7e0 10 192 3083 +b7f0 1f 194 3083 +b80f 2 197 3083 +b811 f 196 3083 +b820 2 197 3083 +FUNC b822 e 4 _ismbbkana +b822 0 200 3083 +b822 d 201 3083 +b82f 1 202 3083 +FUNC b830 365 c memcpy +b830 3 101 614 +b833 1 113 614 +b834 1 114 614 +b835 3 116 614 +b838 3 117 614 +b83b 3 119 614 +b83e 2 129 614 +b840 2 131 614 +b842 2 132 614 +b844 2 134 614 +b846 2 135 614 +b848 2 137 614 +b84a 6 138 614 +b850 6 147 614 +b856 2 148 614 +b858 7 150 614 +b85f 2 151 614 +b861 1 153 614 +b862 1 154 614 +b863 3 155 614 +b866 3 156 614 +b869 2 157 614 +b86b 1 158 614 +b86c 1 159 614 +b86d 2 160 614 +b86f 1 163 614 +b870 1 164 614 +b871 1 165 614 +b872 5 166 614 +b877 6 179 614 +b87d 2 180 614 +b87f 3 182 614 +b882 3 183 614 +b885 3 185 614 +b888 2 186 614 +b88a 2 188 614 +b88c 8 190 614 +b894 2 208 614 +b896 5 209 614 +b89b 3 211 614 +b89e 2 212 614 +b8a0 3 214 614 +b8a3 2 215 614 +b8a5 7 217 614 +b8ac 8 221 614 +b8b4 14 225 614 +b8c8 2 232 614 +b8ca 2 233 614 +b8cc 2 235 614 +b8ce 3 236 614 +b8d1 3 238 614 +b8d4 3 239 614 +b8d7 3 241 614 +b8da 3 242 614 +b8dd 3 244 614 +b8e0 3 245 614 +b8e3 3 247 614 +b8e6 2 248 614 +b8e8 2 250 614 +b8ea a 252 614 +b8f4 2 256 614 +b8f6 2 257 614 +b8f8 2 259 614 +b8fa 3 260 614 +b8fd 3 262 614 +b900 3 263 614 +b903 3 265 614 +b906 3 266 614 +b909 3 268 614 +b90c 2 269 614 +b90e 2 271 614 +b910 8 273 614 +b918 2 277 614 +b91a 2 278 614 +b91c 2 280 614 +b91e 3 281 614 +b921 3 283 614 +b924 3 284 614 +b927 3 286 614 +b92a 2 287 614 +b92c 2 289 614 +b92e 2a 291 614 +b958 4 298 614 +b95c 4 300 614 +b960 4 302 614 +b964 4 304 614 +b968 4 306 614 +b96c 4 308 614 +b970 4 310 614 +b974 4 312 614 +b978 4 314 614 +b97c 4 316 614 +b980 4 318 614 +b984 4 320 614 +b988 4 322 614 +b98c 4 324 614 +b990 7 326 614 +b997 2 328 614 +b999 2 329 614 +b99b 19 331 614 +b9b4 3 340 614 +b9b7 1 341 614 +b9b8 1 342 614 +b9b9 3 344 614 +b9bc 2 348 614 +b9be 2 350 614 +b9c0 3 351 614 +b9c3 1 352 614 +b9c4 1 353 614 +b9c5 3 354 614 +b9c8 2 358 614 +b9ca 2 360 614 +b9cc 3 361 614 +b9cf 3 362 614 +b9d2 3 363 614 +b9d5 1 364 614 +b9d6 1 365 614 +b9d7 5 366 614 +b9dc 2 370 614 +b9de 2 372 614 +b9e0 3 373 614 +b9e3 3 374 614 +b9e6 3 375 614 +b9e9 3 376 614 +b9ec 3 377 614 +b9ef 1 378 614 +b9f0 1 379 614 +b9f1 3 380 614 +b9f4 4 391 614 +b9f8 4 392 614 +b9fc 6 397 614 +ba02 2 398 614 +ba04 3 400 614 +ba07 3 401 614 +ba0a 3 403 614 +ba0d 2 404 614 +ba0f 1 406 614 +ba10 2 407 614 +ba12 1 408 614 +ba13 9 410 614 +ba1c 2 414 614 +ba1e a 417 614 +ba28 2 422 614 +ba2a 5 423 614 +ba2f 3 425 614 +ba32 2 426 614 +ba34 3 428 614 +ba37 2 429 614 +ba39 7 431 614 +ba40 14 435 614 +ba54 3 442 614 +ba57 2 443 614 +ba59 3 445 614 +ba5c 3 446 614 +ba5f 3 448 614 +ba62 3 449 614 +ba65 3 451 614 +ba68 2 452 614 +ba6a 1 454 614 +ba6b 2 455 614 +ba6d 1 456 614 +ba6e a 458 614 +ba78 3 462 614 +ba7b 2 463 614 +ba7d 3 465 614 +ba80 3 466 614 +ba83 3 468 614 +ba86 3 469 614 +ba89 3 471 614 +ba8c 3 472 614 +ba8f 3 474 614 +ba92 2 475 614 +ba94 1 477 614 +ba95 2 478 614 +ba97 1 479 614 +ba98 8 481 614 +baa0 3 485 614 +baa3 2 486 614 +baa5 3 488 614 +baa8 3 489 614 +baab 3 491 614 +baae 3 492 614 +bab1 3 494 614 +bab4 3 495 614 +bab7 3 497 614 +baba 3 498 614 +babd 3 500 614 +bac0 6 501 614 +bac6 1 503 614 +bac7 2 504 614 +bac9 1 505 614 +baca 2a 507 614 +baf4 4 516 614 +baf8 4 518 614 +bafc 4 520 614 +bb00 4 522 614 +bb04 4 524 614 +bb08 4 526 614 +bb0c 4 528 614 +bb10 4 530 614 +bb14 4 532 614 +bb18 4 534 614 +bb1c 4 536 614 +bb20 4 538 614 +bb24 4 540 614 +bb28 4 542 614 +bb2c 7 544 614 +bb33 2 546 614 +bb35 2 547 614 +bb37 19 549 614 +bb50 3 558 614 +bb53 1 560 614 +bb54 1 561 614 +bb55 3 562 614 +bb58 3 566 614 +bb5b 3 568 614 +bb5e 3 569 614 +bb61 1 570 614 +bb62 1 571 614 +bb63 5 572 614 +bb68 3 576 614 +bb6b 3 578 614 +bb6e 3 579 614 +bb71 3 580 614 +bb74 3 581 614 +bb77 1 582 614 +bb78 1 583 614 +bb79 3 584 614 +bb7c 3 588 614 +bb7f 3 590 614 +bb82 3 591 614 +bb85 3 592 614 +bb88 3 593 614 +bb8b 3 594 614 +bb8e 3 595 614 +bb91 1 596 614 +bb92 1 597 614 +bb93 2 598 614 +FUNC bb95 6 0 ___setlc_active_func +bb95 0 90 1409 +bb95 5 91 1409 +bb9a 1 92 1409 +FUNC bb9b 6 0 ___unguarded_readlc_active_add_func +bb9b 0 104 1409 +bb9b 5 105 1409 +bba0 1 106 1409 +FUNC bba1 140 4 __freetlocinfo +bba1 3 144 1409 +bba4 26 152 1409 +bbca e 155 1409 +bbd8 6 157 1409 +bbde d 158 1409 +bbeb e 162 1409 +bbf9 6 164 1409 +bbff d 165 1409 +bc0c b 168 1409 +bc17 d 169 1409 +bc24 e 176 1409 +bc32 11 178 1409 +bc43 13 179 1409 +bc56 e 180 1409 +bc64 e 181 1409 +bc72 17 188 1409 +bc89 6 190 1409 +bc8f 9 191 1409 +bc98 6 194 1409 +bc9e 13 197 1409 +bcb1 7 199 1409 +bcb8 10 205 1409 +bcc8 d 207 1409 +bcd5 b 214 1409 +bce0 1 215 1409 +FUNC bce1 86 4 __addlocaleref +bce1 3 225 1409 +bce4 e 227 1409 +bcf2 a 228 1409 +bcfc 3 229 1409 +bcff a 231 1409 +bd09 3 232 1409 +bd0c a 234 1409 +bd16 3 235 1409 +bd19 a 237 1409 +bd23 3 238 1409 +bd26 6 240 1409 +bd2c f 242 1409 +bd3b 3 243 1409 +bd3e d 245 1409 +bd4b 9 246 1409 +bd54 12 248 1409 +bd66 1 249 1409 +FUNC bd67 8c 4 __removelocaleref +bd67 1 259 1409 +bd68 b 261 1409 +bd73 9 263 1409 +bd7c a 265 1409 +bd86 3 266 1409 +bd89 a 268 1409 +bd93 3 269 1409 +bd96 a 271 1409 +bda0 3 272 1409 +bda3 a 274 1409 +bdad 3 275 1409 +bdb0 6 277 1409 +bdb6 f 279 1409 +bdc5 3 280 1409 +bdc8 d 282 1409 +bdd5 9 283 1409 +bdde 11 285 1409 +bdef 3 287 1409 +bdf2 1 288 1409 +FUNC bdf3 24 0 _copytlocinfo_nolock +bdf3 3 302 1409 +bdf6 d 303 1409 +be03 7 304 1409 +be0a 3 305 1409 +be0d 9 306 1409 +be16 1 308 1409 +FUNC be17 3e 0 _updatetlocinfoEx_nolock +be17 0 321 1409 +be17 9 324 1409 +be20 2 326 1409 +be22 4 327 1409 +be26 8 334 1409 +be2e 5 339 1409 +be33 6 341 1409 +be39 e 350 1409 +be47 7 351 1409 +be4e 3 355 1409 +be51 1 356 1409 +be52 2 325 1409 +be54 1 356 1409 +FUNC be55 76 0 __updatetlocinfo +be55 c 382 1409 +be61 7 384 1409 +be68 10 386 1409 +be78 8 397 1409 +be80 4 399 1409 +be84 8 401 1409 +be8c 2 404 1409 +be8e 6 405 1409 +be94 8 387 1409 +be9c 4 388 1409 +bea0 11 390 1409 +beb1 e 392 1409 +bebf 8 394 1409 +bec7 4 395 1409 +FUNC becb 66 4 _configthreadlocale +becb 2 420 1409 +becd 5 434 1409 +bed2 10 435 1409 +bee2 19 437 1409 +befb 1d 456 1409 +bf18 3 444 1409 +bf1b 2 445 1409 +bf1d 6 440 1409 +bf23 2 441 1409 +bf25 7 452 1409 +bf2c 4 460 1409 +bf30 1 462 1409 +FUNC bf31 53 0 sync_legacy_variables_lk +bf31 0 489 1409 +bf31 e 490 1409 +bf3f 9 491 1409 +bf48 c 492 1409 +bf54 c 493 1409 +bf60 c 494 1409 +bf6c c 495 1409 +bf78 b 496 1409 +bf83 1 497 1409 +FUNC bf84 96 4 _free_locale +bf84 c 517 1409 +bf90 9 518 1409 +bf99 1c 522 1409 +bfb5 7 524 1409 +bfbc 4 526 1409 +bfc0 8 534 1409 +bfc8 3 535 1409 +bfcb 8 537 1409 +bfd3 11 540 1409 +bfe4 7 541 1409 +bfeb c 543 1409 +bff7 7 552 1409 +bffe 3 553 1409 +c001 7 554 1409 +c008 6 556 1409 +c00e 3 543 1409 +c011 9 545 1409 +FUNC c01a 5 4 __free_locale +c01a 0 562 1409 +c01a 5 563 1409 +FUNC c01f 88 0 _get_current_locale +c01f c 687 1409 +c02b 7 689 1409 +c032 14 691 1409 +c046 b 693 1409 +c051 4 694 1409 +c055 5 697 1409 +c05a 5 698 1409 +c05f 5 706 1409 +c064 6 707 1409 +c06a 8 708 1409 +c072 4 709 1409 +c076 8 710 1409 +c07e c 712 1409 +c08a 9 715 1409 +c093 2 717 1409 +c095 6 718 1409 +c09b 3 712 1409 +c09e 9 713 1409 +FUNC c0a7 5 0 __get_current_locale +c0a7 0 722 1409 +c0a7 5 723 1409 +FUNC c0ac 3 4 __init_dummy +c0ac 0 1283 1409 +c0ac 2 1284 1409 +c0ae 1 1285 1409 +FUNC c0af 3e c _strcats +c0af 2 1288 1409 +c0b1 f 1294 1409 +c0c0 26 1296 1409 +c0e6 6 1294 1409 +c0ec 1 1299 1409 +FUNC c0ed 129 8 __lc_strtolc +c0ed 6 1302 1409 +c0f3 11 1307 1409 +c104 c 1309 1409 +c110 7 1310 1409 +c117 b 1313 1409 +c122 25 1315 1409 +c147 6 1317 1409 +c14d 2 1318 1409 +c14f 15 1323 1409 +c164 1d 1328 1409 +c181 9 1329 1409 +c18a 10 1331 1409 +c19a c 1332 1409 +c1a6 14 1334 1409 +c1ba 28 1335 1409 +c1e2 9 1340 1409 +c1eb b 1348 1409 +c1f6 18 1350 1409 +c20e 6 1338 1409 +c214 2 1353 1409 +FUNC c216 6b c __lc_lctostr +c216 5 1356 1409 +c21b 25 1357 1409 +c240 7 1358 1409 +c247 16 1359 1409 +c25d c 1360 1409 +c269 16 1361 1409 +c27f 2 1362 1409 +FUNC c281 171 0 _setlocale_get_all +c281 4 1124 1409 +c285 3 1126 1409 +c288 1d 1134 1409 +c2a5 3 1137 1409 +c2a8 3 1139 1409 +c2ab 2 1140 1409 +c2ad 2f 1143 1409 +c2dc 26 1146 1409 +c302 10 1147 1409 +c312 5 1148 1409 +c317 4 1141 1409 +c31b 2f 1143 1409 +c34a a 1144 1409 +c354 8 1152 1409 +c35c 14 1154 1409 +c370 9 1156 1409 +c379 e 1159 1409 +c387 9 1161 1409 +c390 7 1165 1409 +c397 7 1166 1409 +c39e 9 1168 1409 +c3a7 15 1170 1409 +c3bc 9 1172 1409 +c3c5 e 1175 1409 +c3d3 9 1177 1409 +c3dc 12 1183 1409 +c3ee 4 1187 1409 +FUNC c3f2 1d4 18 _expandlocale +c3f2 15 1198 1409 +c407 41 1230 1409 +c448 14 1211 1409 +c45c b 1216 1409 +c467 26 1219 1409 +c48d 4 1220 1409 +c491 3 1222 1409 +c494 4 1223 1409 +c498 4 1224 1409 +c49c 7 1226 1409 +c4a3 2 1228 1409 +c4a5 8 1230 1409 +c4ad 6 1234 1409 +c4b3 2f 1236 1409 +c4e2 4 1241 1409 +c4e6 e 1243 1409 +c4f4 6 1244 1409 +c4fa 10 1246 1409 +c50a 6 1247 1409 +c510 9 1251 1409 +c519 10 1253 1409 +c529 a 1255 1409 +c533 2 1260 1409 +c535 8 1263 1409 +c53d 26 1267 1409 +c563 5 1271 1409 +c568 e 1272 1409 +c576 5 1273 1409 +c57b 10 1274 1409 +c58b 22 1276 1409 +c5ad 5 1277 1409 +c5b2 2 1212 1409 +c5b4 12 1278 1409 +FUNC c5c6 2f6 4 _setlocale_set_cat +c5c6 19 980 1409 +c5df 5 993 1409 +c5e4 2f 998 1409 +c613 7 1000 1409 +c61a 19 1002 1409 +c633 6 1004 1409 +c639 c 1007 1409 +c645 16 1008 1409 +c65b 2 1010 1409 +c65d 3 1013 1409 +c660 d 1014 1409 +c66d 2c 1015 1409 +c699 3 1016 1409 +c69c 39 1019 1409 +c6d5 6 1020 1409 +c6db 15 1021 1409 +c6f0 17 1022 1409 +c707 a 1029 1409 +c711 6 1031 1409 +c717 18 1037 1409 +c72f 7 1039 1409 +c736 8 1053 1409 +c73e 14 1054 1409 +c752 18 1055 1409 +c76a 2 1039 1409 +c76c a 1044 1409 +c776 d 1046 1409 +c783 b 1047 1409 +c78e 9 1058 1409 +c797 26 1066 1409 +c7bd 2 1069 1409 +c7bf 10 1071 1409 +c7cf 22 1072 1409 +c7f1 2 1081 1409 +c7f3 4 1082 1409 +c7f7 5 1083 1409 +c7fc 9 1085 1409 +c805 6 1088 1409 +c80b 9 1089 1409 +c814 12 1091 1409 +c826 6 1094 1409 +c82c e 1095 1409 +c83a f 1096 1409 +c849 9 1097 1409 +c852 5 1099 1409 +c857 24 1106 1409 +c87b 7 1109 1409 +c882 8 1110 1409 +c88a 6 1111 1409 +c890 18 1116 1409 +c8a8 3 1118 1409 +c8ab 11 1119 1409 +FUNC c8bc 1ce 4 _setlocale_nolock +c8bc 1a 873 1409 +c8d6 7 877 1409 +c8dd 5 904 1409 +c8e2 17 880 1409 +c8f9 5 882 1409 +c8fe 12 888 1409 +c910 1d 890 1409 +c92d 2 894 1409 +c92f d 898 1409 +c93c 1e 900 1409 +c95a 11 904 1409 +c96b 1d 907 1409 +c988 e 904 1409 +c996 1b 913 1409 +c9b1 6 916 1409 +c9b7 24 918 1409 +c9db 18 922 1409 +c9f3 3 923 1409 +c9f6 7 925 1409 +c9fd 1 926 1409 +c9fe 9 928 1409 +ca07 c 930 1409 +ca13 4 901 1409 +ca17 19 935 1409 +ca30 3 937 1409 +ca33 4 939 1409 +ca37 11 941 1409 +ca48 c 943 1409 +ca54 2 947 1409 +ca56 3 949 1409 +ca59 2 952 1409 +ca5b 3 953 1409 +ca5e 9 937 1409 +ca67 5 956 1409 +ca6c 2 961 1409 +ca6e 3 962 1409 +ca71 2 965 1409 +ca73 5 966 1409 +ca78 12 972 1409 +FUNC ca8a f3 8 _create_locale +ca8a 0 605 1409 +ca8a 10 609 1409 +ca9a 13 612 1409 +caad b 614 1409 +cab8 4 610 1409 +cabc c 658 1409 +cac8 8 617 1409 +cad0 7 619 1409 +cad7 2 621 1409 +cad9 14 623 1409 +caed 7 625 1409 +caf4 7 626 1409 +cafb 2 628 1409 +cafd c 630 1409 +cb09 14 632 1409 +cb1d 7 634 1409 +cb24 7 635 1409 +cb2b 9 637 1409 +cb34 2 640 1409 +cb36 13 642 1409 +cb49 8 644 1409 +cb51 7 645 1409 +cb58 7 646 1409 +cb5f 9 647 1409 +cb68 2 648 1409 +cb6a 2 650 1409 +cb6c 5 652 1409 +cb71 5 653 1409 +cb76 7 657 1409 +FUNC cb7d 5 8 __create_locale +cb7d 0 665 1409 +cb7d 5 666 1409 +FUNC cb82 170 8 setlocale +cb82 c 791 1409 +cb8e 5 792 1409 +cb93 25 797 1409 +cbb8 a 799 1409 +cbc2 5 801 1409 +cbc7 4 806 1409 +cbcb 3 807 1409 +cbce 1b 808 1409 +cbe9 8 818 1409 +cbf1 7 819 1409 +cbf8 a 820 1409 +cc02 8 822 1409 +cc0a 19 826 1409 +cc23 18 834 1409 +cc3b a 836 1409 +cc45 8 839 1409 +cc4d 7 840 1409 +cc54 a 841 1409 +cc5e 7 842 1409 +cc65 f 846 1409 +cc74 c 847 1409 +cc80 18 849 1409 +cc98 5 850 1409 +cc9d b 852 1409 +cca8 8 822 1409 +ccb0 9 823 1409 +ccb9 3 852 1409 +ccbc 9 853 1409 +ccc5 2 855 1409 +ccc7 6 856 1409 +cccd 8 857 1409 +ccd5 c 860 1409 +cce1 3 865 1409 +cce4 6 866 1409 +ccea 3 860 1409 +cced 5 862 1409 +FUNC ccf2 f 0 __security_check_cookie +ccf2 0 52 2811 +ccf2 6 55 2811 +ccf8 2 56 2811 +ccfa 2 57 2811 +ccfc 5 59 2811 +FUNC cd04 90 0 _local_unwind4 +FUNC cd94 46 0 _unwind_handler4 +FUNC cdda 1c 4 _seh_longjmp_unwind4 +FUNC cdf6 17 0 _EH4_CallFilterFunc +FUNC ce0d 19 0 _EH4_TransferToHandler +FUNC ce26 1a 0 _EH4_GlobalUnwind +FUNC ce40 17 8 _EH4_LocalUnwind +FUNC ce57 8 4 _crt_debugger_hook +ce57 0 62 2380 +ce57 7 65 2380 +ce5e 1 66 2380 +FUNC ce60 7a c memset +ce60 0 59 601 +ce60 4 68 601 +ce64 4 69 601 +ce68 2 71 601 +ce6a 2 72 601 +ce6c 2 74 601 +ce6e 4 75 601 +ce72 2 78 601 +ce74 2 79 601 +ce76 6 80 601 +ce7c 2 81 601 +ce7e 7 82 601 +ce85 2 83 601 +ce87 5 85 601 +ce8c 1 91 601 +ce8d 2 92 601 +ce8f 3 94 601 +ce92 2 95 601 +ce94 2 97 601 +ce96 3 98 601 +ce99 2 99 601 +ce9b 2 101 601 +ce9d 2 103 601 +ce9f 3 104 601 +cea2 3 105 601 +cea5 2 106 601 +cea7 2 110 601 +cea9 3 111 601 +ceac 2 113 601 +ceae 2 115 601 +ceb0 3 117 601 +ceb3 2 119 601 +ceb5 2 122 601 +ceb7 3 123 601 +ceba 3 124 601 +cebd 2 125 601 +cebf 2 127 601 +cec1 2 129 601 +cec3 2 130 601 +cec5 2 134 601 +cec7 3 135 601 +ceca 3 137 601 +cecd 2 138 601 +cecf 4 142 601 +ced3 1 143 601 +ced4 1 145 601 +ced5 4 148 601 +ced9 1 150 601 +FUNC ceda 2a 0 _purecall +ceda 0 43 1533 +ceda b 44 1533 +cee5 5 45 1533 +ceea 2 47 1533 +ceec 7 54 1533 +cef3 c 56 1533 +ceff 5 57 1533 +FUNC cf04 22 4 _set_purecall_handler +cf04 1 82 1533 +cf05 b 85 1533 +cf10 12 86 1533 +cf22 3 88 1533 +cf25 1 89 1533 +FUNC cf26 d 0 _get_purecall_handler +cf26 0 92 1533 +cf26 c 93 1533 +cf32 1 94 1533 +FUNC cf40 95 0 _aulldvrm +cf40 0 45 3161 +cf40 1 47 3161 +cf41 4 79 3161 +cf45 2 80 3161 +cf47 2 81 3161 +cf49 4 82 3161 +cf4d 4 83 3161 +cf51 2 84 3161 +cf53 2 85 3161 +cf55 2 86 3161 +cf57 4 87 3161 +cf5b 2 88 3161 +cf5d 2 89 3161 +cf5f 2 94 3161 +cf61 4 95 3161 +cf65 2 96 3161 +cf67 2 97 3161 +cf69 4 98 3161 +cf6d 2 99 3161 +cf6f 2 100 3161 +cf71 2 107 3161 +cf73 4 108 3161 +cf77 4 109 3161 +cf7b 4 110 3161 +cf7f 2 112 3161 +cf81 2 113 3161 +cf83 2 114 3161 +cf85 2 115 3161 +cf87 2 116 3161 +cf89 2 117 3161 +cf8b 2 118 3161 +cf8d 2 119 3161 +cf8f 4 128 3161 +cf93 2 129 3161 +cf95 4 130 3161 +cf99 2 131 3161 +cf9b 2 132 3161 +cf9d 2 133 3161 +cf9f 4 141 3161 +cfa3 2 142 3161 +cfa5 2 143 3161 +cfa7 4 144 3161 +cfab 2 145 3161 +cfad 1 147 3161 +cfae 4 148 3161 +cfb2 4 149 3161 +cfb6 2 151 3161 +cfb8 4 160 3161 +cfbc 4 161 3161 +cfc0 2 162 3161 +cfc2 2 163 3161 +cfc4 3 164 3161 +cfc7 2 169 3161 +cfc9 2 170 3161 +cfcb 2 171 3161 +cfcd 2 172 3161 +cfcf 2 173 3161 +cfd1 1 179 3161 +cfd2 3 181 3161 +FUNC cfe0 34 0 _allmul +cfe0 0 47 3164 +cfe0 4 62 3164 +cfe4 4 63 3164 +cfe8 2 64 3164 +cfea 4 65 3164 +cfee 2 66 3164 +cff0 4 68 3164 +cff4 2 69 3164 +cff6 3 71 3164 +cff9 1 74 3164 +cffa 2 81 3164 +cffc 2 82 3164 +cffe 4 84 3164 +d002 4 85 3164 +d006 2 86 3164 +d008 4 88 3164 +d00c 2 89 3164 +d00e 2 90 3164 +d010 1 92 3164 +d011 3 94 3164 +FUNC d014 11 4 atol +d014 0 55 4301 +d014 10 56 4301 +d024 1 57 4301 +FUNC d025 15 8 _atol_l +d025 0 64 4301 +d025 14 65 4301 +d039 1 66 4301 +FUNC d03a 5 4 atoi +d03a 0 99 4301 +d03a 5 100 4301 +FUNC d03f 5 8 _atoi_l +d03f 0 107 4301 +d03f 5 108 4301 +FUNC d044 11 4 _atoi64 +d044 0 143 4301 +d044 10 144 4301 +d054 1 145 4301 +FUNC d055 15 8 _atoi64_l +d055 0 151 4301 +d055 14 152 4301 +d069 1 153 4301 +FUNC d070 365 c memmove +d070 3 101 604 +d073 1 113 604 +d074 1 114 604 +d075 3 116 604 +d078 3 117 604 +d07b 3 119 604 +d07e 2 129 604 +d080 2 131 604 +d082 2 132 604 +d084 2 134 604 +d086 2 135 604 +d088 2 137 604 +d08a 6 138 604 +d090 6 147 604 +d096 2 148 604 +d098 7 150 604 +d09f 2 151 604 +d0a1 1 153 604 +d0a2 1 154 604 +d0a3 3 155 604 +d0a6 3 156 604 +d0a9 2 157 604 +d0ab 1 158 604 +d0ac 1 159 604 +d0ad 2 160 604 +d0af 1 163 604 +d0b0 1 164 604 +d0b1 1 165 604 +d0b2 5 166 604 +d0b7 6 179 604 +d0bd 2 180 604 +d0bf 3 182 604 +d0c2 3 183 604 +d0c5 3 185 604 +d0c8 2 186 604 +d0ca 2 188 604 +d0cc 8 190 604 +d0d4 2 208 604 +d0d6 5 209 604 +d0db 3 211 604 +d0de 2 212 604 +d0e0 3 214 604 +d0e3 2 215 604 +d0e5 7 217 604 +d0ec 8 221 604 +d0f4 14 225 604 +d108 2 232 604 +d10a 2 233 604 +d10c 2 235 604 +d10e 3 236 604 +d111 3 238 604 +d114 3 239 604 +d117 3 241 604 +d11a 3 242 604 +d11d 3 244 604 +d120 3 245 604 +d123 3 247 604 +d126 2 248 604 +d128 2 250 604 +d12a a 252 604 +d134 2 256 604 +d136 2 257 604 +d138 2 259 604 +d13a 3 260 604 +d13d 3 262 604 +d140 3 263 604 +d143 3 265 604 +d146 3 266 604 +d149 3 268 604 +d14c 2 269 604 +d14e 2 271 604 +d150 8 273 604 +d158 2 277 604 +d15a 2 278 604 +d15c 2 280 604 +d15e 3 281 604 +d161 3 283 604 +d164 3 284 604 +d167 3 286 604 +d16a 2 287 604 +d16c 2 289 604 +d16e 2a 291 604 +d198 4 298 604 +d19c 4 300 604 +d1a0 4 302 604 +d1a4 4 304 604 +d1a8 4 306 604 +d1ac 4 308 604 +d1b0 4 310 604 +d1b4 4 312 604 +d1b8 4 314 604 +d1bc 4 316 604 +d1c0 4 318 604 +d1c4 4 320 604 +d1c8 4 322 604 +d1cc 4 324 604 +d1d0 7 326 604 +d1d7 2 328 604 +d1d9 2 329 604 +d1db 19 331 604 +d1f4 3 340 604 +d1f7 1 341 604 +d1f8 1 342 604 +d1f9 3 344 604 +d1fc 2 348 604 +d1fe 2 350 604 +d200 3 351 604 +d203 1 352 604 +d204 1 353 604 +d205 3 354 604 +d208 2 358 604 +d20a 2 360 604 +d20c 3 361 604 +d20f 3 362 604 +d212 3 363 604 +d215 1 364 604 +d216 1 365 604 +d217 5 366 604 +d21c 2 370 604 +d21e 2 372 604 +d220 3 373 604 +d223 3 374 604 +d226 3 375 604 +d229 3 376 604 +d22c 3 377 604 +d22f 1 378 604 +d230 1 379 604 +d231 3 380 604 +d234 4 391 604 +d238 4 392 604 +d23c 6 397 604 +d242 2 398 604 +d244 3 400 604 +d247 3 401 604 +d24a 3 403 604 +d24d 2 404 604 +d24f 1 406 604 +d250 2 407 604 +d252 1 408 604 +d253 9 410 604 +d25c 2 414 604 +d25e a 417 604 +d268 2 422 604 +d26a 5 423 604 +d26f 3 425 604 +d272 2 426 604 +d274 3 428 604 +d277 2 429 604 +d279 7 431 604 +d280 14 435 604 +d294 3 442 604 +d297 2 443 604 +d299 3 445 604 +d29c 3 446 604 +d29f 3 448 604 +d2a2 3 449 604 +d2a5 3 451 604 +d2a8 2 452 604 +d2aa 1 454 604 +d2ab 2 455 604 +d2ad 1 456 604 +d2ae a 458 604 +d2b8 3 462 604 +d2bb 2 463 604 +d2bd 3 465 604 +d2c0 3 466 604 +d2c3 3 468 604 +d2c6 3 469 604 +d2c9 3 471 604 +d2cc 3 472 604 +d2cf 3 474 604 +d2d2 2 475 604 +d2d4 1 477 604 +d2d5 2 478 604 +d2d7 1 479 604 +d2d8 8 481 604 +d2e0 3 485 604 +d2e3 2 486 604 +d2e5 3 488 604 +d2e8 3 489 604 +d2eb 3 491 604 +d2ee 3 492 604 +d2f1 3 494 604 +d2f4 3 495 604 +d2f7 3 497 604 +d2fa 3 498 604 +d2fd 3 500 604 +d300 6 501 604 +d306 1 503 604 +d307 2 504 604 +d309 1 505 604 +d30a 2a 507 604 +d334 4 516 604 +d338 4 518 604 +d33c 4 520 604 +d340 4 522 604 +d344 4 524 604 +d348 4 526 604 +d34c 4 528 604 +d350 4 530 604 +d354 4 532 604 +d358 4 534 604 +d35c 4 536 604 +d360 4 538 604 +d364 4 540 604 +d368 4 542 604 +d36c 7 544 604 +d373 2 546 604 +d375 2 547 604 +d377 19 549 604 +d390 3 558 604 +d393 1 560 604 +d394 1 561 604 +d395 3 562 604 +d398 3 566 604 +d39b 3 568 604 +d39e 3 569 604 +d3a1 1 570 604 +d3a2 1 571 604 +d3a3 5 572 604 +d3a8 3 576 604 +d3ab 3 578 604 +d3ae 3 579 604 +d3b1 3 580 604 +d3b4 3 581 604 +d3b7 1 582 604 +d3b8 1 583 604 +d3b9 3 584 604 +d3bc 3 588 604 +d3bf 3 590 604 +d3c2 3 591 604 +d3c5 3 592 604 +d3c8 3 593 604 +d3cb 3 594 604 +d3ce 3 595 604 +d3d1 1 596 604 +d3d2 1 597 604 +d3d3 2 598 604 +FUNC d3d5 f3 0 abort +d3d5 1b 53 2533 +d3f0 a 56 2533 +d3fa 8 59 2533 +d402 5 68 2533 +d407 4 69 2533 +d40b 8 71 2533 +d413 d 78 2533 +d420 6 87 2533 +d426 6 88 2533 +d42c 6 89 2533 +d432 3 90 2533 +d435 3 91 2533 +d438 3 92 2533 +d43b 7 93 2533 +d442 7 94 2533 +d449 4 95 2533 +d44d 4 96 2533 +d451 4 97 2533 +d455 4 98 2533 +d459 1 99 2533 +d45a 6 100 2533 +d460 6 106 2533 +d466 19 107 2533 +d47f 3 109 2533 +d482 13 117 2533 +d495 9 122 2533 +d49e 3 123 2533 +d4a1 15 126 2533 +d4b6 a 128 2533 +d4c0 8 137 2533 +FUNC d4c8 1e 8 _set_abort_behavior +d4c8 0 158 2533 +d4c8 1d 160 2533 +d4e5 1 162 2533 +FUNC d4e6 a3 4 _msize +d4e6 c 43 3413 +d4f2 2d 47 3413 +d51f 9 51 3413 +d528 8 55 3413 +d530 3 56 3413 +d533 e 57 3413 +d541 e 59 3413 +d54f c 61 3413 +d55b 5 64 3413 +d560 10 88 3413 +d570 2 91 3413 +d572 6 93 3413 +d578 8 61 3413 +d580 9 62 3413 +FUNC d589 9 0 _fptrap +d589 0 46 917 +d589 8 47 917 +d591 1 48 917 +FUNC d592 54 8 _isalpha_l +d592 6 57 4214 +d598 b 58 4214 +d5a3 41 60 4214 +d5e4 2 61 4214 +FUNC d5e6 2b 4 isalpha +d5e6 0 66 4214 +d5e6 9 67 4214 +d5ef 13 69 4214 +d602 1 75 4214 +d603 d 73 4214 +d610 1 75 4214 +FUNC d611 4f 8 _isupper_l +d611 6 81 4214 +d617 b 82 4214 +d622 3c 84 4214 +d65e 2 85 4214 +FUNC d660 29 4 isupper +d660 0 90 4214 +d660 9 91 4214 +d669 11 93 4214 +d67a 1 99 4214 +d67b d 97 4214 +d688 1 99 4214 +FUNC d689 4f 8 _islower_l +d689 6 105 4214 +d68f b 106 4214 +d69a 3c 108 4214 +d6d6 2 109 4214 +FUNC d6d8 29 4 islower +d6d8 0 114 4214 +d6d8 9 115 4214 +d6e1 11 117 4214 +d6f2 1 123 4214 +d6f3 d 121 4214 +d700 1 123 4214 +FUNC d701 4f 8 _isdigit_l +d701 6 129 4214 +d707 b 130 4214 +d712 3c 132 4214 +d74e 2 133 4214 +FUNC d750 29 4 isdigit +d750 0 138 4214 +d750 9 139 4214 +d759 11 141 4214 +d76a 1 147 4214 +d76b d 145 4214 +d778 1 147 4214 +FUNC d779 54 8 _isxdigit_l +d779 6 153 4214 +d77f b 154 4214 +d78a 41 156 4214 +d7cb 2 157 4214 +FUNC d7cd 2b 4 isxdigit +d7cd 0 162 4214 +d7cd 9 163 4214 +d7d6 13 165 4214 +d7e9 1 171 4214 +d7ea d 169 4214 +d7f7 1 171 4214 +FUNC d7f8 4f 8 _isspace_l +d7f8 6 177 4214 +d7fe b 178 4214 +d809 3c 180 4214 +d845 2 181 4214 +FUNC d847 29 4 isspace +d847 0 186 4214 +d847 9 187 4214 +d850 11 189 4214 +d861 1 195 4214 +d862 d 193 4214 +d86f 1 195 4214 +FUNC d870 4f 8 _ispunct_l +d870 6 201 4214 +d876 b 202 4214 +d881 3c 204 4214 +d8bd 2 205 4214 +FUNC d8bf 29 4 ispunct +d8bf 0 210 4214 +d8bf 9 211 4214 +d8c8 11 213 4214 +d8d9 1 219 4214 +d8da d 217 4214 +d8e7 1 219 4214 +FUNC d8e8 54 8 _isalnum_l +d8e8 6 225 4214 +d8ee b 226 4214 +d8f9 41 228 4214 +d93a 2 229 4214 +FUNC d93c 2b 4 isalnum +d93c 0 234 4214 +d93c 9 235 4214 +d945 13 237 4214 +d958 1 243 4214 +d959 d 241 4214 +d966 1 243 4214 +FUNC d967 54 8 _isprint_l +d967 6 249 4214 +d96d b 250 4214 +d978 41 252 4214 +d9b9 2 253 4214 +FUNC d9bb 2b 4 isprint +d9bb 0 258 4214 +d9bb 9 259 4214 +d9c4 13 261 4214 +d9d7 1 267 4214 +d9d8 d 265 4214 +d9e5 1 267 4214 +FUNC d9e6 54 8 _isgraph_l +d9e6 6 273 4214 +d9ec b 274 4214 +d9f7 41 276 4214 +da38 2 277 4214 +FUNC da3a 2b 4 isgraph +da3a 0 282 4214 +da3a 9 283 4214 +da43 13 285 4214 +da56 1 291 4214 +da57 d 289 4214 +da64 1 291 4214 +FUNC da65 4f 8 _iscntrl_l +da65 6 297 4214 +da6b b 298 4214 +da76 3c 300 4214 +dab2 2 301 4214 +FUNC dab4 29 4 iscntrl +dab4 0 306 4214 +dab4 9 307 4214 +dabd 11 309 4214 +dace 1 315 4214 +dacf d 313 4214 +dadc 1 315 4214 +FUNC dadd d 4 __isascii +dadd 0 320 4214 +dadd c 321 4214 +dae9 1 322 4214 +FUNC daea 8 4 __toascii +daea 0 327 4214 +daea 7 328 4214 +daf1 1 329 4214 +FUNC daf2 1f 8 _iscsymf_l +daf2 0 335 4214 +daf2 1a 336 4214 +db0c 1 337 4214 +db0d 3 336 4214 +db10 1 337 4214 +FUNC db11 1a 4 __iscsymf +db11 0 341 4214 +db11 15 342 4214 +db26 1 343 4214 +db27 3 342 4214 +db2a 1 343 4214 +FUNC db2b 1f 8 _iscsym_l +db2b 0 349 4214 +db2b 1a 350 4214 +db45 1 351 4214 +db46 3 350 4214 +db49 1 351 4214 +FUNC db4a 1c 4 __iscsym +db4a 0 356 4214 +db4a 17 357 4214 +db61 1 358 4214 +db62 3 357 4214 +db65 1 358 4214 +FUNC db66 12 8 _MarkAllocaS +db66 0 207 1309 +db66 8 208 1309 +db6e 6 210 1309 +db74 3 211 1309 +db77 1 214 1309 +FUNC db78 1b 4 _freea +db78 0 249 1309 +db78 8 251 1309 +db80 3 253 1309 +db83 8 255 1309 +db8b 7 257 1309 +db92 1 266 1309 +FUNC db93 13b 18 __crtGetLocaleInfoW_stat +db93 f 60 1290 +dba2 14 68 1290 +dbb6 d 70 1290 +dbc3 8 71 1290 +dbcb b 73 1290 +dbd6 f 74 1290 +dbe5 5 79 1290 +dbea 13 81 1290 +dbfd 7 86 1290 +dc04 2 140 1290 +dc06 8 96 1290 +dc0e b 97 1290 +dc19 16 100 1290 +dc2f 7 101 1290 +dc36 48 104 1290 +dc7e 2 105 1290 +dc80 2 106 1290 +dc82 e 110 1290 +dc90 7 113 1290 +dc97 2 121 1290 +dc99 2 123 1290 +dc9b 17 130 1290 +dcb2 6 134 1290 +dcb8 4 136 1290 +dcbc 12 141 1290 +FUNC dcce 3b 18 __crtGetLocaleInfoW +dcce 6 151 1290 +dcd4 b 152 1290 +dcdf 28 161 1290 +dd07 2 162 1290 +FUNC dd09 13d 18 __crtGetLocaleInfoA_stat +dd09 f 60 2665 +dd18 17 68 2665 +dd2f a 70 2665 +dd39 8 71 2665 +dd41 b 73 2665 +dd4c f 74 2665 +dd5b 11 79 2665 +dd6c 4 86 2665 +dd70 5 96 2665 +dd75 b 97 2665 +dd80 13 100 2665 +dd93 7 101 2665 +dd9a 49 104 2665 +dde3 2 105 2665 +dde5 2 106 2665 +dde7 10 110 2665 +ddf7 3 114 2665 +ddfa 6 124 2665 +de00 2 126 2665 +de02 15 135 2665 +de17 7 139 2665 +de1e 4 141 2665 +de22 12 81 2665 +de34 12 145 2665 +FUNC de46 3b 18 __crtGetLocaleInfoA +de46 6 155 2665 +de4c b 156 2665 +de57 28 165 2665 +de7f 2 166 2665 +FUNC de81 11e c _calloc_impl +de81 c 23 3622 +de8d 9 28 3622 +de96 2e 30 3622 +dec4 9 32 3622 +decd 4 36 3622 +ded1 3 37 3622 +ded4 5 41 3622 +ded9 5 43 3622 +dede 9 46 3622 +dee7 9 50 3622 +def0 b 52 3622 +defb 8 56 3622 +df03 3 57 3622 +df06 c 58 3622 +df12 c 60 3622 +df1e 7 64 3622 +df25 d 65 3622 +df32 4 93 3622 +df36 11 94 3622 +df47 c 97 3622 +df53 f 109 3622 +df62 b 111 3622 +df6d 6 112 3622 +df73 5 113 3622 +df78 5 60 3622 +df7d 9 61 3622 +df86 4 100 3622 +df8a 7 102 3622 +df91 6 103 3622 +df97 2 105 3622 +df99 6 119 3622 +FUNC df9f 3f 8 calloc +df9f 4 145 3622 +dfa3 5 146 3622 +dfa8 14 147 3622 +dfbc 15 149 3622 +dfd1 8 151 3622 +dfd9 3 153 3622 +dfdc 2 154 3622 +FUNC dfde 21b 8 realloc +dfde c 64 3368 +dfea 7 69 3368 +dff1 e 70 3368 +dfff 7 73 3368 +e006 7 75 3368 +e00d 5 76 3368 +e012 d 81 3368 +e01f 5 88 3368 +e024 9 89 3368 +e02d 8 91 3368 +e035 3 92 3368 +e038 12 96 3368 +e04a 8 100 3368 +e052 f 102 3368 +e061 5 103 3368 +e066 e 104 3368 +e074 4 107 3368 +e078 10 108 3368 +e088 9 110 3368 +e091 a 111 3368 +e09b 5 118 3368 +e0a0 4 120 3368 +e0a4 6 121 3368 +e0aa 9 123 3368 +e0b3 15 124 3368 +e0c8 4 127 3368 +e0cc 10 128 3368 +e0dc c 129 3368 +e0e8 c 135 3368 +e0f4 6 142 3368 +e0fa 4 144 3368 +e0fe 1 145 3368 +e0ff 9 147 3368 +e108 14 148 3368 +e11c 6 135 3368 +e122 9 137 3368 +e12b 3 148 3368 +e12e 10 158 3368 +e13e f 181 3368 +e14d 5 186 3368 +e152 5 183 3368 +e157 11 186 3368 +e168 2 188 3368 +e16a 8 160 3368 +e172 5 170 3368 +e177 3 167 3368 +e17a 2 172 3368 +e17c 6 174 3368 +e182 2 155 3368 +e184 4 321 3368 +e188 1 322 3368 +e189 12 323 3368 +e19b c 332 3368 +e1a7 b 347 3368 +e1b2 5 319 3368 +e1b7 7 327 3368 +e1be b 328 3368 +e1c9 2 329 3368 +e1cb 6 356 3368 +e1d1 5 349 3368 +e1d6 5 350 3368 +e1db 4 334 3368 +e1df 16 341 3368 +e1f5 4 343 3368 +FUNC e1f9 79 c _recalloc +e1f9 3 744 3368 +e1fc a 749 3368 +e206 28 751 3368 +e22e 4 753 3368 +e232 9 754 3368 +e23b b 755 3368 +e246 b 756 3368 +e251 a 757 3368 +e25b 10 759 3368 +e26b 5 761 3368 +e270 2 762 3368 +FUNC e272 1a 4 strncnt +e272 0 48 2617 +e272 6 49 2617 +e278 6 52 2617 +e27e 1 53 2617 +e27f 5 52 2617 +e284 7 55 2617 +e28b 1 56 2617 +FUNC e28c 3a2 20 __crtLCMapStringA_stat +e28c 12 99 2617 +e29e d 108 2617 +e2ab 1b 109 2617 +e2c6 8 110 2617 +e2ce b 111 2617 +e2d9 a 112 2617 +e2e3 5 119 2617 +e2e8 19 120 2617 +e301 5 124 2617 +e306 1 125 2617 +e307 3 127 2617 +e30a 16 133 2617 +e320 9 213 2617 +e329 8 235 2617 +e331 8 236 2617 +e339 27 247 2617 +e360 6 248 2617 +e366 48 251 2617 +e3ae 3 252 2617 +e3b1 6 253 2617 +e3b7 19 262 2617 +e3d0 21 271 2617 +e3f1 8 274 2617 +e3f9 9 277 2617 +e402 9 279 2617 +e40b 12 288 2617 +e41d 5 292 2617 +e422 4b 298 2617 +e46d 4 299 2617 +e471 18 309 2617 +e489 3 312 2617 +e48c 6 322 2617 +e492 2 325 2617 +e494 17 335 2617 +e4ab 7 342 2617 +e4b2 8 344 2617 +e4ba 9 346 2617 +e4c3 b 141 2617 +e4ce 8 142 2617 +e4d6 5 143 2617 +e4db 8 144 2617 +e4e3 11 146 2617 +e4f4 7 147 2617 +e4fb 9 153 2617 +e504 15 155 2617 +e519 5 156 2617 +e51e 2 157 2617 +e520 1b 164 2617 +e53b 7 166 2617 +e542 41 169 2617 +e583 2 170 2617 +e585 28 196 2617 +e5ad 2 183 2617 +e5af 2 184 2617 +e5b1 25 190 2617 +e5d6 7 198 2617 +e5dd 2 199 2617 +e5df 1a 202 2617 +e5f9 5 204 2617 +e5fe 9 205 2617 +e607 c 206 2617 +e613 7 207 2617 +e61a 2 208 2617 +e61c 12 350 2617 +FUNC e62e 43 24 __crtLCMapStringA +e62e 6 363 2617 +e634 b 364 2617 +e63f 30 376 2617 +e66f 2 377 2617 +FUNC e671 1b8 1c __crtGetStringTypeA_stat +e671 f 66 2569 +e680 10 75 2569 +e690 18 79 2569 +e6a8 8 80 2569 +e6b0 b 82 2569 +e6bb f 83 2569 +e6ca 11 88 2569 +e6db 9 120 2569 +e6e4 8 141 2569 +e6ec 8 142 2569 +e6f4 27 153 2569 +e71b 6 154 2569 +e721 3e 157 2569 +e75f 2 158 2569 +e761 2 159 2569 +e763 f 161 2569 +e772 13 169 2569 +e785 11 174 2569 +e796 6 176 2569 +e79c 6 178 2569 +e7a2 2 90 2569 +e7a4 5 94 2569 +e7a9 8 95 2569 +e7b1 5 96 2569 +e7b6 8 97 2569 +e7be e 99 2569 +e7cc 4 100 2569 +e7d0 5 104 2569 +e7d5 17 106 2569 +e7ec 2 107 2569 +e7ee 2 108 2569 +e7f0 3 109 2569 +e7f3 15 112 2569 +e808 6 113 2569 +e80e 7 114 2569 +e815 2 115 2569 +e817 12 182 2569 +FUNC e829 40 20 __crtGetStringTypeA +e829 6 194 2569 +e82f b 195 2569 +e83a 2d 206 2569 +e867 2 207 2569 +FUNC e869 87 c fastcopy_I +FUNC e8f0 e3 c _VEC_memcpy +FUNC e9d3 14 0 _sse2_mathfcns_init +FUNC e9e7 14 4 _set_SSE2_enable +FUNC e9fb 6 0 __pwctype_func +e9fb 0 24 2400 +e9fb 5 25 2400 +ea00 1 26 2400 +FUNC ea01 29 0 __pctype_func +ea01 0 29 2400 +ea01 7 35 2400 +ea08 3 36 2400 +ea0b 18 38 2400 +ea23 6 39 2400 +ea29 1 40 2400 +FUNC ea2a 419 0 _get_lc_time +ea2a 6 94 1793 +ea30 12 104 1793 +ea42 3 105 1793 +ea45 2 170 1793 +ea47 9 108 1793 +ea50 16 112 1793 +ea66 15 113 1793 +ea7b 15 114 1793 +ea90 18 115 1793 +eaa8 15 116 1793 +eabd 13 117 1793 +ead0 14 118 1793 +eae4 18 120 1793 +eafc 15 121 1793 +eb11 15 122 1793 +eb26 15 123 1793 +eb3b 18 124 1793 +eb53 15 125 1793 +eb68 15 126 1793 +eb7d 15 128 1793 +eb92 18 129 1793 +ebaa 15 130 1793 +ebbf 15 131 1793 +ebd4 15 132 1793 +ebe9 18 133 1793 +ec01 15 134 1793 +ec16 15 135 1793 +ec2b 15 136 1793 +ec40 18 137 1793 +ec58 15 138 1793 +ec6d 15 139 1793 +ec82 15 141 1793 +ec97 18 142 1793 +ecaf 15 143 1793 +ecc4 15 144 1793 +ecd9 15 145 1793 +ecee 18 146 1793 +ed06 18 147 1793 +ed1e 18 148 1793 +ed36 18 149 1793 +ed4e 1b 150 1793 +ed69 18 151 1793 +ed81 18 152 1793 +ed99 18 154 1793 +edb1 1b 155 1793 +edcc 18 160 1793 +ede4 18 161 1793 +edfc 1b 163 1793 +ee17 20 165 1793 +ee37 a 169 1793 +ee41 2 170 1793 +FUNC ee43 190 4 __free_lc_time +ee43 1 179 1793 +ee44 c 180 1793 +ee50 8 183 1793 +ee58 8 184 1793 +ee60 8 185 1793 +ee68 8 186 1793 +ee70 8 187 1793 +ee78 8 188 1793 +ee80 7 189 1793 +ee87 8 191 1793 +ee8f 8 192 1793 +ee97 8 193 1793 +ee9f 8 194 1793 +eea7 8 195 1793 +eeaf 8 196 1793 +eeb7 8 197 1793 +eebf 8 199 1793 +eec7 b 200 1793 +eed2 8 201 1793 +eeda 8 202 1793 +eee2 8 203 1793 +eeea 8 204 1793 +eef2 8 205 1793 +eefa 8 206 1793 +ef02 8 207 1793 +ef0a 8 208 1793 +ef12 8 209 1793 +ef1a 8 210 1793 +ef22 8 212 1793 +ef2a 8 213 1793 +ef32 8 214 1793 +ef3a 8 215 1793 +ef42 8 216 1793 +ef4a b 217 1793 +ef55 b 218 1793 +ef60 b 219 1793 +ef6b b 220 1793 +ef76 b 221 1793 +ef81 b 222 1793 +ef8c b 223 1793 +ef97 b 225 1793 +efa2 b 226 1793 +efad b 228 1793 +efb8 b 229 1793 +efc3 f 230 1793 +efd2 1 232 1793 +FUNC efd3 73 4 __init_time +efd3 4 56 1793 +efd7 f 60 1793 +efe6 16 64 1793 +effc 4 65 1793 +f000 b 67 1793 +f00b 6 69 1793 +f011 8 70 1793 +f019 2 71 1793 +f01b 6 73 1793 +f021 2 74 1793 +f023 2 75 1793 +f025 18 78 1793 +f03d 2 82 1793 +f03f 6 83 1793 +f045 1 84 1793 +FUNC f046 33 0 fix_grouping +f046 0 32 1841 +f046 8 40 1841 +f04e a 43 1841 +f058 4 45 1841 +f05c 1 61 1841 +f05d 6 40 1841 +f063 1 63 1841 +f064 4 50 1841 +f068 2 52 1841 +f06a 7 55 1841 +f071 6 56 1841 +f077 2 60 1841 +FUNC f079 40 4 __free_lconv_num +f079 1 211 1841 +f07a 8 212 1841 +f082 a 215 1841 +f08c 7 216 1841 +f093 b 218 1841 +f09e 7 219 1841 +f0a5 b 221 1841 +f0b0 8 222 1841 +f0b8 1 223 1841 +FUNC f0b9 1c8 4 __init_numeric +f0b9 7 84 1841 +f0c0 4 92 1841 +f0c4 2 93 1841 +f0c6 11 96 1841 +f0d7 3 177 1841 +f0da 3 178 1841 +f0dd c 179 1841 +f0e9 14 102 1841 +f0fd 8 103 1841 +f105 9 108 1841 +f10e 13 113 1841 +f121 9 115 1841 +f12a 2 116 1841 +f12c 2 118 1841 +f12e 9 120 1841 +f137 12 125 1841 +f149 8 127 1841 +f151 a 128 1841 +f15b 7 129 1841 +f162 2 131 1841 +f164 19 140 1841 +f17d 15 142 1841 +f192 1b 144 1841 +f1ad 2 146 1841 +f1af c 148 1841 +f1bb 1e 154 1841 +f1d9 2 156 1841 +f1db 17 154 1841 +f1f2 b 164 1841 +f1fd 9 165 1841 +f206 c 166 1841 +f212 8 168 1841 +f21a 7 169 1841 +f221 2 170 1841 +f223 13 186 1841 +f236 11 191 1841 +f247 b 193 1841 +f252 d 194 1841 +f25f 9 197 1841 +f268 9 198 1841 +f271 9 200 1841 +f27a 5 201 1841 +f27f 2 202 1841 +FUNC f281 33 0 fix_grouping +f281 0 214 1884 +f281 8 222 1884 +f289 a 225 1884 +f293 4 227 1884 +f297 1 243 1884 +f298 6 222 1884 +f29e 1 245 1884 +f29f 4 232 1884 +f2a3 2 234 1884 +f2a5 7 237 1884 +f2ac 6 238 1884 +f2b2 2 242 1884 +FUNC f2b4 89 4 __free_lconv_mon +f2b4 1 255 1884 +f2b5 8 256 1884 +f2bd b 259 1884 +f2c8 7 260 1884 +f2cf b 262 1884 +f2da 7 263 1884 +f2e1 b 265 1884 +f2ec 7 266 1884 +f2f3 b 268 1884 +f2fe 7 269 1884 +f305 b 271 1884 +f310 7 272 1884 +f317 b 274 1884 +f322 7 275 1884 +f329 b 277 1884 +f334 8 278 1884 +f33c 1 279 1884 +FUNC f33d 2c4 4 __init_monetary +f33d 8 65 1884 +f345 6 73 1884 +f34b 13 77 1884 +f35e 3 187 1884 +f361 3 188 1884 +f364 a 189 1884 +f36e 11 83 1884 +f37f 8 84 1884 +f387 f 89 1884 +f396 7 91 1884 +f39d 2 92 1884 +f39f 2 94 1884 +f3a1 9 96 1884 +f3aa f 101 1884 +f3b9 6 103 1884 +f3bf 9 104 1884 +f3c8 2 105 1884 +f3ca 2 107 1884 +f3cc 4 112 1884 +f3d0 14 117 1884 +f3e4 14 119 1884 +f3f8 14 121 1884 +f40c 17 123 1884 +f423 14 125 1884 +f437 14 128 1884 +f44b 14 130 1884 +f45f 17 133 1884 +f476 14 135 1884 +f48a 14 137 1884 +f49e 14 139 1884 +f4b2 17 141 1884 +f4c9 14 143 1884 +f4dd 14 145 1884 +f4f1 17 147 1884 +f508 2 149 1884 +f50a 6 150 1884 +f510 6 151 1884 +f516 8 152 1884 +f51e b 153 1884 +f529 5 154 1884 +f52e 1c 157 1884 +f54a 2 159 1884 +f54c 17 157 1884 +f563 c 169 1884 +f56f 3 175 1884 +f572 32 181 1884 +f5a4 11 194 1884 +f5b5 15 199 1884 +f5ca b 201 1884 +f5d5 d 202 1884 +f5e2 9 204 1884 +f5eb 9 205 1884 +f5f4 6 206 1884 +f5fa 5 208 1884 +f5ff 2 209 1884 +FUNC f601 395 4 __init_ctype +f601 11 59 1976 +f612 6 60 1976 +f618 1f 82 1976 +f637 7 84 1976 +f63e 20 89 1976 +f65e 7 94 1976 +f665 10 98 1976 +f675 b 100 1976 +f680 b 102 1976 +f68b 12 104 1976 +f69d 2f 106 1976 +f6cc 5 109 1976 +f6d1 2 112 1976 +f6d3 e 113 1976 +f6e1 15 115 1976 +f6f6 a 118 1976 +f700 4 121 1976 +f704 8 124 1976 +f70c e 126 1976 +f71a 9 128 1976 +f723 b 129 1976 +f72e b 128 1976 +f739 2c 140 1976 +f765 33 155 1976 +f798 2d 166 1976 +f7c5 37 178 1976 +f7fc 11 180 1976 +f80d 17 182 1976 +f824 15 183 1976 +f839 d 180 1976 +f846 12 189 1976 +f858 f 190 1976 +f867 12 191 1976 +f879 18 195 1976 +f891 11 198 1976 +f8a2 13 199 1976 +f8b5 e 200 1976 +f8c3 e 201 1976 +f8d1 9 203 1976 +f8da 6 204 1976 +f8e0 9 206 1976 +f8e9 9 207 1976 +f8f2 9 208 1976 +f8fb 9 209 1976 +f904 9 210 1976 +f90d 9 213 1976 +f916 4 214 1976 +f91a 8 217 1976 +f922 8 218 1976 +f92a 8 219 1976 +f932 10 220 1976 +f942 13 227 1976 +f955 2 231 1976 +f957 6 232 1976 +f95d a 233 1976 +f967 a 234 1976 +f971 a 235 1976 +f97b a 236 1976 +f985 2 238 1976 +f987 f 240 1976 +FUNC f996 29 0 ___mb_cur_max_func +f996 0 248 1976 +f996 7 254 1976 +f99d 3 255 1976 +f9a0 18 257 1976 +f9b8 6 259 1976 +f9be 1 260 1976 +FUNC f9bf 16 4 ___mb_cur_max_l_func +f9bf 0 263 1976 +f9bf 15 264 1976 +f9d4 1 265 1976 +FUNC f9d5 26 0 ___lc_codepage_func +f9d5 0 268 1976 +f9d5 7 274 1976 +f9dc 3 275 1976 +f9df 18 277 1976 +f9f7 3 279 1976 +f9fa 1 280 1976 +FUNC f9fb 26 0 ___lc_collate_cp_func +f9fb 0 284 1976 +f9fb 7 290 1976 +fa02 3 291 1976 +fa05 18 293 1976 +fa1d 3 295 1976 +fa20 1 296 1976 +FUNC fa21 26 0 ___lc_handle_func +fa21 0 300 1976 +fa21 7 306 1976 +fa28 3 307 1976 +fa2b 18 309 1976 +fa43 3 311 1976 +fa46 1 312 1976 +FUNC fa47 3 4 __init_collate +fa47 0 41 2064 +fa47 2 42 2064 +fa49 1 43 2064 +FUNC fa4a fe 4 _Getdays_l +fa4a 9 111 190 +fa53 d 115 190 +fa60 9 117 190 +fa69 9 119 190 +fa72 28 120 190 +fa9a b 121 190 +faa5 c 123 190 +fab1 4 126 190 +fab5 30 128 190 +fae5 8 129 190 +faed 31 131 190 +fb1e 12 132 190 +fb30 3 134 190 +fb33 13 137 190 +fb46 2 138 190 +FUNC fb48 9 0 _Getdays +fb48 0 142 190 +fb48 8 143 190 +fb50 1 144 190 +FUNC fb51 fe 4 _Getmonths_l +fb51 9 150 190 +fb5a d 154 190 +fb67 16 156 190 +fb7d 2b 159 190 +fba8 b 160 190 +fbb3 8 162 190 +fbbb a 163 190 +fbc5 2d 167 190 +fbf2 8 168 190 +fbfa 2c 170 190 +fc26 11 171 190 +fc37 3 173 190 +fc3a 13 176 190 +fc4d 2 177 190 +FUNC fc4f 9 0 _Getmonths +fc4f 0 181 190 +fc4f 8 182 190 +fc57 1 183 190 +FUNC fc58 355 4 _Gettnames_l +fc58 9 189 190 +fc61 d 193 190 +fc6e 9 195 190 +fc77 9 197 190 +fc80 28 198 190 +fca8 d 199 190 +fcb5 29 200 190 +fcde 18 201 190 +fcf6 11 202 190 +fd07 f 203 190 +fd16 f 204 190 +fd25 7 205 190 +fd2c e 206 190 +fd3a 8 208 190 +fd42 12 212 190 +fd54 13 213 190 +fd67 6 214 190 +fd6d 2a 215 190 +fd97 6 216 190 +fd9d d 217 190 +fdaa 26 218 190 +fdd0 1c 219 190 +fdec 18 221 190 +fe04 6 222 190 +fe0a 26 223 190 +fe30 a 224 190 +fe3a 5 225 190 +fe3f 2a 226 190 +fe69 18 227 190 +fe81 30 230 190 +feb1 a 231 190 +febb 30 233 190 +feeb a 234 190 +fef5 30 236 190 +ff25 a 237 190 +ff2f 30 239 190 +ff5f a 240 190 +ff69 30 242 190 +ff99 12 245 190 +ffab 2 246 190 +FUNC ffad 9 0 _Gettnames +ffad 0 250 190 +ffad 8 251 190 +ffb5 1 252 190 +FUNC ffb6 20 0 _store_str +ffb6 0 869 190 +ffb6 f 871 190 +ffc5 7 872 190 +ffcc 9 873 190 +ffd5 1 875 190 +FUNC ffd6 36 0 _store_number +ffd6 0 965 190 +ffd6 8 973 190 +ffde c 976 190 +ffea 2 977 190 +ffec b 978 190 +fff7 2 981 190 +fff9 2 982 190 +fffb 1 983 190 +fffc 7 988 190 +10003 3 989 190 +10006 5 990 190 +1000b 1 991 190 +FUNC 1000c 79 4 _store_num +1000c 8 909 190 +10014 2 910 190 +10016 8 912 190 +1001e 33 913 190 +10051 2 914 190 +10053 4 917 190 +10057 8 918 190 +1005f b 919 190 +1006a c 921 190 +10076 5 923 190 +1007b 2 924 190 +1007d 2 926 190 +1007f 4 927 190 +10083 2 928 190 +FUNC 10085 3e6 10 _expandtime +10085 5 548 190 +1008a 4f 558 190 +100d9 16 659 190 +100ef 5 662 190 +100f4 16 587 190 +1010a 7 589 190 +10111 5 590 190 +10116 16 571 190 +1012c 7 573 190 +10133 5 574 190 +10138 5 822 190 +1013d 7 823 190 +10144 5 824 190 +10149 16 667 190 +1015f 10 668 190 +1016f 2 669 190 +10171 5 672 190 +10176 23 558 190 +10199 6 787 190 +1019f 5 789 190 +101a4 15 736 190 +101b9 2 737 190 +101bb 2 739 190 +101bd 5 740 190 +101c2 15 722 190 +101d7 2 723 190 +101d9 16 742 190 +101ef 4 743 190 +101f3 2 744 190 +101f5 5 745 190 +101fa 6 746 190 +10200 8 747 190 +10208 1 748 190 +10209 5 752 190 +1020e f 715 190 +1021d 5 718 190 +10222 3 696 190 +10225 2 699 190 +10227 1d 804 190 +10244 6 806 190 +1024a d 808 190 +10257 2 809 190 +10259 37 558 190 +10290 19 678 190 +102a9 8 680 190 +102b1 2 681 190 +102b3 15 650 190 +102c8 13 652 190 +102db 5 653 190 +102e0 1e 601 190 +102fe 2 603 190 +10300 5 606 190 +10305 2 607 190 +10307 2 608 190 +10309 25 615 190 +1032e 2 617 190 +10330 1 627 190 +10331 2 642 190 +10333 e 579 190 +10341 7 581 190 +10348 5 582 190 +1034d 2d 562 190 +1037a 6 564 190 +10380 5 565 190 +10385 e 687 190 +10393 3 689 190 +10396 5 690 190 +1039b 15 558 190 +103b0 2 834 190 +103b2 5 814 190 +103b7 19 817 190 +103d0 5 819 190 +103d5 d 795 190 +103e2 b 798 190 +103ed 5 799 190 +103f2 11 762 190 +10403 5 764 190 +10408 1 774 190 +10409 5 776 190 +1040e 16 729 190 +10424 6 731 190 +1042a 5 732 190 +1042f 16 704 190 +10445 3 705 190 +10448 b 706 190 +10453 2 707 190 +10455 e 708 190 +10463 6 839 190 +10469 2 840 190 +FUNC 1046b 45d 18 _store_winword +1046b 10 1035 190 +1047b 5 1043 190 +10480 a 1053 190 +1048a 3 1043 190 +1048d 6 1053 190 +10493 2 1054 190 +10495 6 1049 190 +1049b 2 1050 190 +1049d 6 1046 190 +104a3 10 1057 190 +104b3 4 1066 190 +104b7 8 1067 190 +104bf 6 1069 190 +104c5 d 1075 190 +104d2 a 1076 190 +104dc 8 1077 190 +104e4 4 1078 190 +104e8 2a 1085 190 +10512 b 1087 190 +1051d 31 1092 190 +1054e 7 1093 190 +10555 3 1097 190 +10558 13 1100 190 +1056b 10 1101 190 +1057b b 1102 190 +10586 b 1103 190 +10591 9 1106 190 +1059a 3 1291 190 +1059d 12 1292 190 +105af 11 1114 190 +105c0 5 1117 190 +105c5 b 1120 190 +105d0 37 1125 190 +10607 14 1274 190 +1061b c 1277 190 +10627 8 1283 190 +1062f 4 1284 190 +10633 9 1286 190 +1063c c 1287 190 +10648 5 1277 190 +1064d e 1128 190 +1065b 7 1133 190 +10662 7 1132 190 +10669 7 1130 190 +10670 2 1131 190 +10672 5 1134 190 +10677 a 1156 190 +10681 7 1158 190 +10688 2 1159 190 +1068a 5 1160 190 +1068f 11 1175 190 +106a0 5 1176 190 +106a5 11 1177 190 +106b6 6 1178 190 +106bc 2 1179 190 +106be 5 1180 190 +106c3 b 1225 190 +106ce 13 1226 190 +106e1 4 1228 190 +106e5 1a 1233 190 +106ff 9 1236 190 +10708 8 1242 190 +10710 4 1243 190 +10714 9 1246 190 +1071d 8 1247 190 +10725 5 1277 190 +1072a 1 1230 190 +1072b 5 1250 190 +10730 12 1136 190 +10742 7 1141 190 +10749 7 1140 190 +10750 7 1138 190 +10757 2 1139 190 +10759 5 1142 190 +1075e 29 1125 190 +10787 e 1144 190 +10795 7 1147 190 +1079c 2 1146 190 +1079e 5 1148 190 +107a3 7 1182 190 +107aa b 1183 190 +107b5 2 1184 190 +107b7 6 1185 190 +107bd 12 1187 190 +107cf 17 1188 190 +107e6 c 1191 190 +107f2 8 1197 190 +107fa 4 1198 190 +107fe 8 1201 190 +10806 2 1202 190 +10808 5 1203 190 +1080d 9 1204 190 +10816 1a 1205 190 +10830 9 1207 190 +10839 8 1212 190 +10841 4 1213 190 +10845 9 1215 190 +1084e 8 1216 190 +10856 2 1220 190 +10858 d 1168 190 +10865 7 1170 190 +1086c 2 1171 190 +1086e 2 1172 190 +10870 d 1162 190 +1087d 7 1164 190 +10884 2 1165 190 +10886 2 1166 190 +10888 d 1150 190 +10895 7 1152 190 +1089c 2 1153 190 +1089e 1b 1268 190 +108b9 3 1272 190 +108bc 5 1273 190 +108c1 7 1194 190 +FUNC 108c8 1af 18 _Strftime_l +108c8 6 356 190 +108ce 4 361 190 +108d2 13 362 190 +108e5 33 364 190 +10918 33 365 190 +1094b d 368 190 +10958 10 375 190 +10968 e 385 190 +10976 a 387 190 +10980 1e 435 190 +1099e 4 438 190 +109a2 a 446 190 +109ac 5 447 190 +109b1 b 452 190 +109bc 3 453 190 +109bf 2 454 190 +109c1 7 400 190 +109c8 1 405 190 +109c9 2 408 190 +109cb 5 409 190 +109d0 1 411 190 +109d1 1 412 190 +109d2 1d 415 190 +109ef 1 428 190 +109f0 5 385 190 +109f5 5 464 190 +109fa 5 469 190 +109ff 13 470 190 +10a12 3 441 190 +10a15 f 478 190 +10a24 b 481 190 +10a2f 2 483 190 +10a31 b 402 190 +10a3c 2 403 190 +10a3e 5 421 190 +10a43 7 423 190 +10a4a 2 464 190 +10a4c 18 485 190 +10a64 11 488 190 +10a75 2 490 190 +FUNC 10a77 1e 14 _strftime_l +10a77 3 291 190 +10a7a 19 292 190 +10a93 2 293 190 +FUNC 10a95 1d 10 strftime +10a95 0 300 190 +10a95 1c 301 190 +10ab1 1 302 190 +FUNC 10ab2 1e 14 _Strftime +10ab2 3 343 190 +10ab5 19 345 190 +10ace 2 346 190 +FUNC 10ad0 26 0 localeconv +10ad0 0 69 1716 +10ad0 5 75 1716 +10ad5 1b 78 1716 +10af0 5 79 1716 +10af5 1 80 1716 +FUNC 10b00 46 8 strcspn +10b00 4 191 591 +10b04 2 198 591 +10b06 1 199 591 +10b07 1 200 591 +10b08 1 201 591 +10b09 1 202 591 +10b0a 1 203 591 +10b0b 1 204 591 +10b0c 1 205 591 +10b0d 1 206 591 +10b0e 6 212 591 +10b14 2 216 591 +10b16 2 217 591 +10b18 2 218 591 +10b1a 3 219 591 +10b1d 4 220 591 +10b21 2 221 591 +10b23 3 227 591 +10b26 6 229 591 +10b2c 3 234 591 +10b2f 2 236 591 +10b31 2 237 591 +10b33 2 238 591 +10b35 3 239 591 +10b38 4 240 591 +10b3c 2 245 591 +10b3e 2 255 591 +10b40 3 257 591 +10b43 3 259 591 +FUNC 10b46 60 c TranslateName +10b46 3 340 2263 +10b49 3 342 2263 +10b4c 3 343 2263 +10b4f b 346 2263 +10b5a a 348 2263 +10b64 14 349 2263 +10b78 6 351 2263 +10b7e a 352 2263 +10b88 2 353 2263 +10b8a 4 354 2263 +10b8e 2 355 2263 +10b90 3 356 2263 +10b93 7 346 2263 +10b9a a 359 2263 +10ba4 2 360 2263 +FUNC 10ba6 14 0 GetLcidFromDefault +10ba6 0 761 2263 +10ba6 7 762 2263 +10bad c 763 2263 +10bb9 1 764 2263 +FUNC 10bba 77 0 ProcessCodePage +10bba 13 784 2263 +10bcd 1a 787 2263 +10be7 11 795 2263 +10bf8 8 799 2263 +10c00 2 801 2263 +10c02 18 791 2263 +10c1a 3 793 2263 +10c1d 7 805 2263 +10c24 d 806 2263 +FUNC 10c31 1e 4 TestDefaultCountry +10c31 0 826 2263 +10c31 2 830 2263 +10c33 15 832 2263 +10c48 3 835 2263 +10c4b 1 836 2263 +10c4c 2 833 2263 +10c4e 1 836 2263 +FUNC 10c4f 32 0 LcidFromHexString +10c4f 1 893 2263 +10c50 2 895 2263 +10c52 2 897 2263 +10c54 9 899 2263 +10c5d 5 900 2263 +10c62 8 901 2263 +10c6a 3 902 2263 +10c6d 10 903 2263 +10c7d 3 906 2263 +10c80 1 907 2263 +FUNC 10c81 1b 0 GetPrimaryLen +10c81 0 926 2263 +10c81 2 927 2263 +10c83 3 930 2263 +10c86 12 931 2263 +10c98 1 933 2263 +10c99 2 935 2263 +10c9b 1 938 2263 +FUNC 10c9c 96 4 CountryEnumProc +10c9c 15 717 2263 +10cb1 7 718 2263 +10cb8 f 719 2263 +10cc7 23 725 2263 +10cea 3 728 2263 +10ced 3 729 2263 +10cf0 12 731 2263 +10d02 b 734 2263 +10d0d a 738 2263 +10d17 b 741 2263 +10d22 10 742 2263 +FUNC 10d32 72 8 TestDefaultLanguage +10d32 11 858 2263 +10d43 22 864 2263 +10d65 4 865 2263 +10d69 d 867 2263 +10d76 1c 871 2263 +10d92 2 872 2263 +10d94 3 874 2263 +10d97 d 875 2263 +FUNC 10da4 1d0 4 LangCountryEnumProc +10da4 16 435 2263 +10dba 7 436 2263 +10dc1 d 437 2263 +10dce 27 444 2263 +10df5 4 447 2263 +10df9 8 448 2263 +10e01 16 450 2263 +10e17 1d 456 2263 +10e34 2 460 2263 +10e36 11 462 2263 +10e47 7 467 2263 +10e4e 5 468 2263 +10e53 6 472 2263 +10e59 1a 475 2263 +10e73 14 482 2263 +10e87 3 483 2263 +10e8a a 487 2263 +10e94 b 490 2263 +10e9f 6 493 2263 +10ea5 3 494 2263 +10ea8 12 501 2263 +10eba 1d 506 2263 +10ed7 6 510 2263 +10edd c 513 2263 +10ee9 16 518 2263 +10eff 8 522 2263 +10f07 14 528 2263 +10f1b 2 531 2263 +10f1d 2 540 2263 +10f1f 1b 550 2263 +10f3a f 553 2263 +10f49 7 557 2263 +10f50 5 558 2263 +10f55 3 559 2263 +10f58 b 566 2263 +10f63 11 567 2263 +FUNC 10f74 bf 4 LanguageEnumProc +10f74 15 624 2263 +10f89 7 625 2263 +10f90 f 626 2263 +10f9f 23 632 2263 +10fc2 3 635 2263 +10fc5 3 636 2263 +10fc8 11 639 2263 +10fd9 7 643 2263 +10fe0 2 650 2263 +10fe2 1d 651 2263 +10fff f 654 2263 +1100e a 658 2263 +11018 b 662 2263 +11023 10 663 2263 +FUNC 11033 2c 0 GetLcidFromCountry +11033 0 686 2263 +11033 10 687 2263 +11043 11 689 2263 +11054 6 693 2263 +1105a 4 694 2263 +1105e 1 695 2263 +FUNC 1105f 65 0 GetLcidFromLangCountry +1105f 0 386 2263 +1105f 7 388 2263 +11066 1a 389 2263 +11080 5 390 2263 +11085 17 392 2263 +1109c 10 394 2263 +110ac 13 402 2263 +110bf 4 403 2263 +110c3 1 404 2263 +FUNC 110c4 3c 0 GetLcidFromLanguage +110c4 0 591 2263 +110c4 13 593 2263 +110d7 e 594 2263 +110e5 10 596 2263 +110f5 6 600 2263 +110fb 4 601 2263 +110ff 1 602 2263 +FUNC 11100 1e3 c __get_qualified_locale +11100 4 205 2263 +11104 5 208 2263 +11109 12 212 2263 +1111b 7 215 2263 +11122 5 217 2263 +11127 3 222 2263 +1112a f 223 2263 +11139 10 226 2263 +11149 d 230 2263 +11156 a 232 2263 +11160 5 235 2263 +11165 2 237 2263 +11167 5 240 2263 +1116c 5 243 2263 +11171 14 248 2263 +11185 a 250 2263 +1118f 5 252 2263 +11194 2 254 2263 +11196 5 256 2263 +1119b 2 261 2263 +1119d a 263 2263 +111a7 28 266 2263 +111cf 2 268 2263 +111d1 13 271 2263 +111e4 3 277 2263 +111e7 6 278 2263 +111ed 17 281 2263 +11204 32 285 2263 +11236 d 289 2263 +11243 6 290 2263 +11249 8 293 2263 +11251 7 295 2263 +11258 8 296 2263 +11260 4 297 2263 +11264 8 301 2263 +1126c d 305 2263 +11279 23 306 2263 +1129c 2 307 2263 +1129e f 308 2263 +112ad 2 309 2263 +112af 12 311 2263 +112c1 2 312 2263 +112c3 14 313 2263 +112d7 5 315 2263 +112dc 6 286 2263 +112e2 1 316 2263 +FUNC 112e3 12 0 cmpResult +FUNC 112f5 18 0 cmpBYTE +FUNC 1130d 40 0 cmpWORD +FUNC 1134d 78 0 cmpDWORD +FUNC 113c5 1490 0 unaligned_memcmp +FUNC 12855 1680 c memcmp +FUNC 13ed5 be c strncmp +13ed5 4 42 543 +13ed9 5 43 543 +13ede 7 45 543 +13ee5 7 46 543 +13eec 6 48 543 +13ef2 d 51 543 +13eff 11 56 543 +13f10 c 61 543 +13f1c c 66 543 +13f28 15 71 543 +13f3d 2 81 543 +13f3f a 73 543 +13f49 a 68 543 +13f53 a 63 543 +13f5d 10 58 543 +13f6d 2 79 543 +13f6f a 81 543 +13f79 1 85 543 +13f7a 4 86 543 +13f7e 5 79 543 +13f83 4 89 543 +13f87 2 90 543 +13f89 a 83 543 +FUNC 13fa0 40 8 strpbrk +13fa0 4 191 536 +13fa4 2 198 536 +13fa6 1 199 536 +13fa7 1 200 536 +13fa8 1 201 536 +13fa9 1 202 536 +13faa 1 203 536 +13fab 1 204 536 +13fac 1 205 536 +13fad 1 206 536 +13fae 6 212 536 +13fb4 2 216 536 +13fb6 2 217 536 +13fb8 2 218 536 +13fba 3 219 536 +13fbd 4 220 536 +13fc1 2 221 536 +13fc3 5 227 536 +13fc8 2 236 536 +13fca 2 237 536 +13fcc 2 238 536 +13fce 3 239 536 +13fd1 4 240 536 +13fd5 2 247 536 +13fd7 3 248 536 +13fda 3 257 536 +13fdd 3 259 536 +FUNC 13fe0 104 0 __report_gsfailure +13fe0 9 140 2145 +13fe9 5 170 2145 +13fee 6 171 2145 +13ff4 6 172 2145 +13ffa 6 173 2145 +14000 6 174 2145 +14006 6 175 2145 +1400c 7 176 2145 +14013 7 177 2145 +1401a 7 178 2145 +14021 7 179 2145 +14028 7 180 2145 +1402f 7 181 2145 +14036 1 182 2145 +14037 6 183 2145 +1403d 3 190 2145 +14040 5 191 2145 +14045 3 192 2145 +14048 5 193 2145 +1404d 3 194 2145 +14050 5 195 2145 +14055 6 201 2145 +1405b a 204 2145 +14065 a 206 2145 +1406f a 285 2145 +14079 a 286 2145 +14083 b 293 2145 +1408e b 294 2145 +14099 b 297 2145 +140a4 8 298 2145 +140ac 8 302 2145 +140b4 b 304 2145 +140bf 9 313 2145 +140c8 8 315 2145 +140d0 12 319 2145 +140e2 2 320 2145 +FUNC 140e4 20 0 _global_unwind2 +FUNC 14104 45 0 __unwind_handler +FUNC 14149 84 0 _local_unwind2 +FUNC 141cd 23 0 _abnormal_termination +FUNC 141f0 9 0 _NLG_Notify1 +FUNC 141f9 1f 0 _NLG_Notify +PUBLIC 14210 0 _NLG_Dispatch +FUNC 14218 3 0 _NLG_Call +PUBLIC 1421a 0 _NLG_Return2 +FUNC 1421b 57 8 fastzero_I +FUNC 14272 8f c _VEC_memzero +FUNC 14301 22b 14 strtoxl +14301 8 80 4034 +14309 b 86 4034 +14314 3 89 4034 +14317 b 92 4034 +14322 30 94 4034 +14352 11 95 4034 +14363 c 100 4034 +1436f 34 101 4034 +143a3 5 102 4034 +143a8 5 104 4034 +143ad 4 105 4034 +143b1 2 106 4034 +143b3 5 108 4034 +143b8 3 109 4034 +143bb 1d 111 4034 +143d8 4 118 4034 +143dc 5 121 4034 +143e1 9 122 4034 +143ea a 123 4034 +143f4 9 126 4034 +143fd 7 124 4034 +14404 2 129 4034 +14406 5 140 4034 +1440b f 142 4034 +1441a 1 143 4034 +1441b 9 144 4034 +14424 8 149 4034 +1442c c 154 4034 +14438 8 155 4034 +14440 7 156 4034 +14447 13 157 4034 +1445a 5 160 4034 +1445f 4 164 4034 +14463 b 171 4034 +1446e 4 177 4034 +14472 6 178 4034 +14478 8 190 4034 +14480 6 193 4034 +14486 3 195 4034 +14489 4 196 4034 +1448d 2 198 4034 +1448f c 173 4034 +1449b 3 185 4034 +1449e 2 186 4034 +144a0 24 201 4034 +144c4 5 204 4034 +144c9 c 205 4034 +144d5 6 206 4034 +144db 10 207 4034 +144eb 7 213 4034 +144f2 2 215 4034 +144f4 6 217 4034 +144fa 3 219 4034 +144fd 12 221 4034 +1450f 7 113 4034 +14516 2 115 4034 +14518 12 116 4034 +1452a 2 222 4034 +FUNC 1452c 29 c strtol +1452c 3 229 4034 +1452f 8 230 4034 +14537 13 232 4034 +1454a 9 236 4034 +14553 2 238 4034 +FUNC 14555 1b 10 _strtol_l +14555 0 246 4034 +14555 1a 247 4034 +1456f 1 248 4034 +FUNC 14570 2a c strtoul +14570 3 255 4034 +14573 7 256 4034 +1457a 14 258 4034 +1458e a 262 4034 +14598 2 264 4034 +FUNC 1459a 1b 10 _strtoul_l +1459a 0 272 4034 +1459a 1a 273 4034 +145b4 1 274 4034 +FUNC 145b5 294 14 strtoxq +145b5 8 80 3989 +145bd b 86 3989 +145c8 3 89 3989 +145cb b 92 3989 +145d6 31 94 3989 +14607 12 95 3989 +14619 c 100 3989 +14625 37 102 3989 +1465c 2 103 3989 +1465e 9 105 3989 +14667 4 106 3989 +1466b 2 107 3989 +1466d 6 109 3989 +14673 9 110 3989 +1467c 8 112 3989 +14684 6 115 3989 +1468a 9 116 3989 +14693 a 117 3989 +1469d 9 120 3989 +146a6 3 118 3989 +146a9 5 123 3989 +146ae 10 125 3989 +146be 1 126 3989 +146bf 9 127 3989 +146c8 26 132 3989 +146ee e 137 3989 +146fc 8 138 3989 +14704 6 139 3989 +1470a 11 140 3989 +1471b 5 143 3989 +14720 31 154 3989 +14751 4 160 3989 +14755 6 161 3989 +1475b a 173 3989 +14765 7 176 3989 +1476c 6 178 3989 +14772 6 179 3989 +14778 5 181 3989 +1477d 19 156 3989 +14796 b 168 3989 +147a1 5 169 3989 +147a6 35 184 3989 +147db 5 187 3989 +147e0 c 188 3989 +147ec a 189 3989 +147f6 6 190 3989 +147fc 7 191 3989 +14803 2 192 3989 +14805 7 193 3989 +1480c 8 195 3989 +14814 5 197 3989 +14819 6 199 3989 +1481f 13 201 3989 +14832 15 203 3989 +14847 2 204 3989 +FUNC 14849 29 c _strtoi64 +14849 3 211 3989 +1484c 8 212 3989 +14854 13 214 3989 +14867 9 218 3989 +14870 2 220 3989 +FUNC 14872 1b 10 _strtoi64_l +14872 0 227 3989 +14872 1a 228 3989 +1488c 1 229 3989 +FUNC 1488d 2a c _strtoui64 +1488d 3 236 3989 +14890 7 237 3989 +14897 14 239 3989 +148ab a 243 3989 +148b5 2 245 3989 +FUNC 148b7 1b 10 _strtoui64_l +148b7 0 253 3989 +148b7 1a 254 3989 +148d1 1 255 3989 +FUNC 148d2 b6 c _isctype_l +148d2 7 114 4078 +148d9 b 118 4078 +148e4 d 121 4078 +148f1 f 122 4078 +14900 1f 124 4078 +1491f 3 126 4078 +14922 d 129 4078 +1492f 2 130 4078 +14931 a 133 4078 +1493b 26 144 4078 +14961 10 146 4078 +14971 15 149 4078 +14986 2 150 4078 +FUNC 14988 2f 8 _isctype +14988 0 156 4078 +14988 9 157 4078 +14991 12 159 4078 +149a3 1 165 4078 +149a4 12 163 4078 +149b6 1 165 4078 +FUNC 149c0 2c 0 _alloca_probe_16 +149c0 0 44 1046 +149c0 1 46 1046 +149c1 4 47 1046 +149c5 2 48 1046 +149c7 3 49 1046 +149ca 2 50 1046 +149cc 2 51 1046 +149ce 2 52 1046 +149d0 1 53 1046 +149d1 5 54 1046 +149d6 1 59 1046 +149d7 4 60 1046 +149db 2 61 1046 +149dd 3 62 1046 +149e0 2 63 1046 +149e2 2 64 1046 +149e4 2 65 1046 +149e6 1 66 1046 +149e7 5 67 1046 +PUBLIC 149d6 0 _alloca_probe_8 +FUNC 149ec 47 4 __ansicp +149ec 10 39 1348 +149fc 1c 44 1348 +14a18 3 45 1348 +14a1b 2 46 1348 +14a1d a 47 1348 +14a27 c 49 1348 +FUNC 14a33 1b2 18 __convertcp +14a33 16 79 1348 +14a49 10 83 1348 +14a59 18 85 1348 +14a71 17 90 1348 +14a88 13 92 1348 +14a9b 6 93 1348 +14aa1 d 99 1348 +14aae 2 101 1348 +14ab0 c 103 1348 +14abc 2a 115 1348 +14ae6 15 111 1348 +14afb 7 112 1348 +14b02 1c 115 1348 +14b1e 3 116 1348 +14b21 2 117 1348 +14b23 10 119 1348 +14b33 15 127 1348 +14b48 7 129 1348 +14b4f 18 138 1348 +14b67 3 139 1348 +14b6a 2 140 1348 +14b6c 1f 149 1348 +14b8b 11 151 1348 +14b9c 12 160 1348 +14bae 9 162 1348 +14bb7 3 163 1348 +14bba 2 164 1348 +14bbc 6 165 1348 +14bc2 5 166 1348 +14bc7 9 174 1348 +14bd0 3 177 1348 +14bd3 12 178 1348 +FUNC 14be5 50 0 has_osfxsr_set +FUNC 14c35 60 0 _get_sse2_info +FUNC 14c95 d 0 __sse2_available_init +FUNC 14ca2 34 4 _get_daylight +14ca2 0 35 161 +14ca2 27 36 161 +14cc9 1 41 161 +14cca 8 39 161 +14cd2 3 40 161 +14cd5 1 41 161 +FUNC 14cd6 34 4 _get_dstbias +14cd6 0 44 161 +14cd6 27 45 161 +14cfd 1 50 161 +14cfe 8 48 161 +14d06 3 49 161 +14d09 1 50 161 +FUNC 14d0a 34 4 _get_timezone +14d0a 0 53 161 +14d0a 27 54 161 +14d31 1 59 161 +14d32 8 57 161 +14d3a 3 58 161 +14d3d 1 59 161 +FUNC 14d3e a2 10 _get_tzname +14d3e 3 62 161 +14d41 10 63 161 +14d51 4 64 161 +14d55 3 66 161 +14d58 7 68 161 +14d5f 27 69 161 +14d86 20 63 161 +14da6 f 72 161 +14db5 8 73 161 +14dbd 4 76 161 +14dc1 5 78 161 +14dc6 5 80 161 +14dcb 13 82 161 +14dde 2 83 161 +FUNC 14de0 6 0 __daylight +14de0 0 118 161 +14de0 5 119 161 +14de5 1 120 161 +FUNC 14de6 6 0 __dstbias +14de6 0 123 161 +14de6 5 124 161 +14deb 1 125 161 +FUNC 14dec 6 0 __timezone +14dec 0 128 161 +14dec 5 129 161 +14df1 1 130 161 +FUNC 14df2 6 0 __tzname +14df2 0 133 161 +14df2 5 134 161 +14df7 1 135 161 +FUNC 14df8 c 4 _set_daylight +14df8 c 189 92 +FUNC 14e04 c 4 _set_dstbias +14e04 c 190 92 +FUNC 14e10 c 4 _set_timezone +14e10 c 191 92 +FUNC 14e1c 349 0 _tzset_nolock +14e1c c 124 114 +14e28 5 127 114 +14e2d 3 129 114 +14e30 3 130 114 +14e33 3 131 114 +14e36 3 132 114 +14e39 3 133 114 +14e3c 8 135 114 +14e44 3 136 114 +14e47 8 139 114 +14e4f 1b 142 114 +14e6a 1b 143 114 +14e85 1b 144 114 +14ea0 8 149 114 +14ea8 6 154 114 +14eae f 160 114 +14ebd 18 165 114 +14ed5 14 260 114 +14ee9 b 268 114 +14ef4 4 274 114 +14ef8 7 275 114 +14eff 16 277 114 +14f15 6 281 114 +14f1b 32 283 114 +14f4d 9 174 114 +14f56 7 175 114 +14f5d 6 176 114 +14f63 13 179 114 +14f76 9 183 114 +14f7f b 188 114 +14f8a 9 190 114 +14f93 e 191 114 +14fa1 12 199 114 +14fb3 3 201 114 +14fb6 c 203 114 +14fc2 2 205 114 +14fc4 3 206 114 +14fc7 3 214 114 +14fca 27 234 114 +14ff1 8 235 114 +14ff9 2 236 114 +14ffb 7 237 114 +15002 23 247 114 +15025 9 248 114 +1502e 2 249 114 +15030 8 250 114 +15038 7 256 114 +1503f a 288 114 +15049 a 289 114 +15053 a 290 114 +1505d c 292 114 +15069 9 296 114 +15072 23 301 114 +15095 8 310 114 +1509d 7 311 114 +150a4 1 312 114 +150a5 10 318 114 +150b5 11 320 114 +150c6 5 292 114 +150cb 9 293 114 +150d4 5 325 114 +150d9 e 329 114 +150e7 d 330 114 +150f4 5 335 114 +150f9 b 339 114 +15104 d 340 114 +15111 5 344 114 +15116 3 345 114 +15119 6 350 114 +1511f 4 351 114 +15123 21 352 114 +15144 2 354 114 +15146 5 355 114 +1514b a 357 114 +15155 a 358 114 +1515f 6 360 114 +FUNC 15165 1f5 24 cvtdate +15165 6 409 114 +1516b 4 412 114 +1516f c 414 114 +1517b 52 424 114 +151cd 4c 430 114 +15219 14 436 114 +1522d 2 437 114 +1522f 2 438 114 +15231 46 447 114 +15277 3 449 114 +1527a 2 452 114 +1527c 3c 457 114 +152b8 3 459 114 +152bb 27 467 114 +152e2 6 472 114 +152e8 2 474 114 +152ea 29 485 114 +15313 11 486 114 +15324 a 487 114 +1532e 8 488 114 +15336 d 490 114 +15343 6 491 114 +15349 6 492 114 +1534f 9 499 114 +15358 2 503 114 +FUNC 1535a 1ae 0 _isindst_nolock +1535a 5 554 114 +1535f 20 558 114 +1537f 5 560 114 +15384 7 561 114 +1538b 1b 568 114 +153a6 c 569 114 +153b2 7 573 114 +153b9 34 584 114 +153ed 2 585 114 +153ef 19 596 114 +15408 40 611 114 +15448 2 612 114 +1544a 1e 623 114 +15468 2 626 114 +1546a 14 641 114 +1547e 1a 653 114 +15498 d 660 114 +154a5 d 664 114 +154b2 8 666 114 +154ba 4 674 114 +154be 2 697 114 +154c0 8 673 114 +154c8 8 675 114 +154d0 4 676 114 +154d4 14 679 114 +154e8 4 681 114 +154ec b 682 114 +154f7 2 685 114 +154f9 d 691 114 +15506 2 694 114 +FUNC 15508 4f 0 __tzset +15508 c 85 114 +15514 a 88 114 +1551e 8 90 114 +15526 3 91 114 +15529 8 93 114 +15531 5 94 114 +15536 6 95 114 +1553c c 98 114 +15548 6 103 114 +1554e 9 99 114 +FUNC 15557 38 0 _tzset +15557 c 109 114 +15563 8 110 114 +1556b 4 111 114 +1556f 5 113 114 +15574 c 115 114 +15580 6 118 114 +15586 9 116 114 +FUNC 1558f 41 4 _isindst +1558f c 538 114 +1559b 8 541 114 +155a3 4 542 114 +155a7 b 543 114 +155b2 c 544 114 +155be 3 548 114 +155c1 6 549 114 +155c7 9 545 114 +FUNC 155d0 35 8 __ascii_stricmp +155d0 a 75 367 +155da c 80 367 +155e6 3 81 367 +155e9 c 82 367 +155f5 3 83 367 +155f8 9 85 367 +15601 3 87 367 +15604 1 88 367 +FUNC 15605 d3 c _stricmp_l +15605 7 47 367 +1560c b 49 367 +15617 36 52 367 +1564d 32 53 367 +1567f 8 55 367 +15687 e 57 367 +15695 15 63 367 +156aa 11 64 367 +156bb 8 65 367 +156c3 13 68 367 +156d6 2 69 367 +FUNC 156d8 50 8 _stricmp +156d8 4 94 367 +156dc a 95 367 +156e6 24 98 367 +1570a 6 99 367 +15710 1 107 367 +15711 5 101 367 +15716 10 105 367 +15726 2 107 367 +FUNC 15728 36 8 _isleadbyte_l +15728 6 55 4169 +1572e b 56 4169 +15739 23 57 4169 +1575c 2 58 4169 +FUNC 1575e e 4 isleadbyte +1575e 0 63 4169 +1575e d 64 4169 +1576b 1 65 4169 +FUNC 1576c 16 8 _iswalpha_l +1576c 0 71 4169 +1576c 15 72 4169 +15781 1 73 4169 +FUNC 15782 11 4 iswalpha +15782 0 78 4169 +15782 10 79 4169 +15792 1 80 4169 +FUNC 15793 13 8 _iswupper_l +15793 0 86 4169 +15793 12 87 4169 +157a5 1 88 4169 +FUNC 157a6 e 4 iswupper +157a6 0 93 4169 +157a6 d 94 4169 +157b3 1 95 4169 +FUNC 157b4 13 8 _iswlower_l +157b4 0 101 4169 +157b4 12 102 4169 +157c6 1 103 4169 +FUNC 157c7 e 4 iswlower +157c7 0 108 4169 +157c7 d 109 4169 +157d4 1 110 4169 +FUNC 157d5 13 8 _iswdigit_l +157d5 0 116 4169 +157d5 12 117 4169 +157e7 1 118 4169 +FUNC 157e8 e 4 iswdigit +157e8 0 123 4169 +157e8 d 124 4169 +157f5 1 125 4169 +FUNC 157f6 16 8 _iswxdigit_l +157f6 0 131 4169 +157f6 15 132 4169 +1580b 1 133 4169 +FUNC 1580c 11 4 iswxdigit +1580c 0 138 4169 +1580c 10 139 4169 +1581c 1 140 4169 +FUNC 1581d 13 8 _iswspace_l +1581d 0 146 4169 +1581d 12 147 4169 +1582f 1 148 4169 +FUNC 15830 e 4 iswspace +15830 0 153 4169 +15830 d 154 4169 +1583d 1 155 4169 +FUNC 1583e 13 8 _iswpunct_l +1583e 0 161 4169 +1583e 12 162 4169 +15850 1 163 4169 +FUNC 15851 e 4 iswpunct +15851 0 168 4169 +15851 d 169 4169 +1585e 1 170 4169 +FUNC 1585f 16 8 _iswalnum_l +1585f 0 176 4169 +1585f 15 177 4169 +15874 1 178 4169 +FUNC 15875 11 4 iswalnum +15875 0 183 4169 +15875 10 184 4169 +15885 1 185 4169 +FUNC 15886 16 8 _iswprint_l +15886 0 191 4169 +15886 15 192 4169 +1589b 1 193 4169 +FUNC 1589c 11 4 iswprint +1589c 0 198 4169 +1589c 10 199 4169 +158ac 1 200 4169 +FUNC 158ad 16 8 _iswgraph_l +158ad 0 206 4169 +158ad 15 207 4169 +158c2 1 208 4169 +FUNC 158c3 11 4 iswgraph +158c3 0 213 4169 +158c3 10 214 4169 +158d3 1 215 4169 +FUNC 158d4 13 8 _iswcntrl_l +158d4 0 221 4169 +158d4 12 222 4169 +158e6 1 223 4169 +FUNC 158e7 e 4 iswcntrl +158e7 0 228 4169 +158e7 d 229 4169 +158f4 1 230 4169 +FUNC 158f5 c 4 iswascii +158f5 0 235 4169 +158f5 b 236 4169 +15900 1 237 4169 +FUNC 15901 26 8 _iswcsym_l +15901 0 243 4169 +15901 21 244 4169 +15922 1 245 4169 +15923 3 244 4169 +15926 1 245 4169 +FUNC 15927 21 4 __iswcsym +15927 0 250 4169 +15927 1c 251 4169 +15943 1 252 4169 +15944 3 251 4169 +15947 1 252 4169 +FUNC 15948 26 8 _iswcsymf_l +15948 0 258 4169 +15948 21 259 4169 +15969 1 260 4169 +1596a 3 259 4169 +1596d 1 260 4169 +FUNC 1596e 21 4 __iswcsymf +1596e 0 265 4169 +1596e 1c 266 4169 +1598a 1 267 4169 +1598b 3 266 4169 +1598e 1 267 4169 +FUNC 1598f f0 10 _strnicmp_l +1598f 7 51 324 +15996 d 54 324 +159a3 b 56 324 +159ae 33 59 324 +159e1 7 60 324 +159e8 32 61 324 +15a1a 8 63 324 +15a22 1d 65 324 +15a3f 15 71 324 +15a54 11 72 324 +15a65 d 74 324 +15a72 6 76 324 +15a78 5 79 324 +15a7d 2 80 324 +FUNC 15a7f 5c c _strnicmp +15a7f 4 125 324 +15a83 a 127 324 +15a8d 24 130 324 +15ab1 5 131 324 +15ab6 a 132 324 +15ac0 1 141 324 +15ac1 5 134 324 +15ac6 13 138 324 +15ad9 2 141 324 +FUNC 15adb db c xtoa_s +15adb 8 93 4260 +15ae3 24 102 4260 +15b07 24 103 4260 +15b2b 19 105 4260 +15b44 b 106 4260 +15b4f a 112 4260 +15b59 6 114 4260 +15b5f 7 116 4260 +15b66 2 118 4260 +15b68 2 121 4260 +15b6a 5 124 4260 +15b6f 5 128 4260 +15b74 3 129 4260 +15b77 2 130 4260 +15b79 6 131 4260 +15b7f 3 135 4260 +15b82 e 136 4260 +15b90 8 139 4260 +15b98 2 141 4260 +15b9a 2 142 4260 +15b9c 3 148 4260 +15b9f 6 152 4260 +15ba5 3 154 4260 +15ba8 1 155 4260 +15ba9 4 156 4260 +15bad 5 158 4260 +15bb2 4 160 4260 +FUNC 15bb6 28 10 _itoa_s +15bb6 3 172 4260 +15bb9 d 175 4260 +15bc6 4 176 4260 +15bca 2 177 4260 +15bcc 10 178 4260 +15bdc 2 181 4260 +FUNC 15bde 25 10 _ltoa_s +15bde 3 189 4260 +15be1 20 190 4260 +15c01 2 191 4260 +FUNC 15c03 18 10 _ultoa_s +15c03 0 199 4260 +15c03 17 200 4260 +15c1a 1 201 4260 +FUNC 15c1b f6 14 x64toa_s +15c1b 7 309 4260 +15c22 25 318 4260 +15c47 5 319 4260 +15c4c 19 321 4260 +15c65 b 322 4260 +15c70 3 327 4260 +15c73 20 333 4260 +15c93 3 336 4260 +15c96 1e 352 4260 +15cb4 3 344 4260 +15cb7 2 345 4260 +15cb9 5 346 4260 +15cbe 5 351 4260 +15cc3 13 352 4260 +15cd6 5 355 4260 +15cdb 3 357 4260 +15cde 13 358 4260 +15cf1 4 364 4260 +15cf5 9 368 4260 +15cfe 3 370 4260 +15d01 1 371 4260 +15d02 7 372 4260 +15d09 4 375 4260 +15d0d 4 377 4260 +FUNC 15d11 33 14 _i64toa_s +15d11 3 390 4260 +15d14 2e 391 4260 +15d42 2 392 4260 +FUNC 15d44 1d 14 _ui64toa_s +15d44 4 400 4260 +15d48 17 401 4260 +15d5f 2 402 4260 +FUNC 15d70 2b 0 _chkstk +15d70 0 65 1048 +15d70 1 69 1048 +15d71 4 73 1048 +15d75 2 74 1048 +15d77 2 79 1048 +15d79 2 80 1048 +15d7b 2 81 1048 +15d7d 2 83 1048 +15d7f 5 84 1048 +15d84 2 87 1048 +15d86 2 88 1048 +15d88 2 89 1048 +15d8a 1 90 1048 +15d8b 1 91 1048 +15d8c 2 92 1048 +15d8e 3 93 1048 +15d91 1 94 1048 +15d92 5 98 1048 +15d97 2 99 1048 +15d99 2 100 1048 +FUNC 15d9b 81 4 _getenv_helper_nolock +15d9b 0 95 2318 +15d9b 10 103 2318 +15dab 3 104 2318 +15dae 1 169 2318 +15daf e 128 2318 +15dbd 7 131 2318 +15dc4 2 132 2318 +15dc6 6 135 2318 +15dcc c 140 2318 +15dd8 9 142 2318 +15de1 2 150 2318 +15de3 22 154 2318 +15e05 3 164 2318 +15e08 6 150 2318 +15e0e 5 168 2318 +15e13 9 169 2318 +FUNC 15e1c 93 c _getenv_s_helper +15e1c 7 220 2318 +15e23 21 224 2318 +15e44 15 226 2318 +15e59 4 227 2318 +15e5d 3 229 2318 +15e60 a 233 2318 +15e6a 3 234 2318 +15e6d 2 236 2318 +15e6f 7 239 2318 +15e76 6 240 2318 +15e7c 2 243 2318 +15e7e 5 246 2318 +15e83 5 251 2318 +15e88 20 254 2318 +15ea8 5 256 2318 +15ead 2 257 2318 +FUNC 15eaf a2 8 _dupenv_s_helper +15eaf 6 339 2318 +15eb5 21 344 2318 +15ed6 9 346 2318 +15edf 2 348 2318 +15ee1 5 350 2318 +15ee6 8 352 2318 +15eee 6 353 2318 +15ef4 2 355 2318 +15ef6 9 358 2318 +15eff b 362 2318 +15f0a 6 364 2318 +15f10 b 366 2318 +15f1b 9 367 2318 +15f24 1e 370 2318 +15f42 7 371 2318 +15f49 2 373 2318 +15f4b 4 375 2318 +15f4f 2 376 2318 +FUNC 15f51 83 4 getenv +15f51 c 75 2318 +15f5d 2a 78 2318 +15f87 18 79 2318 +15f9f 8 81 2318 +15fa7 3 82 2318 +15faa c 83 2318 +15fb6 c 85 2318 +15fc2 3 89 2318 +15fc5 6 90 2318 +15fcb 9 86 2318 +FUNC 15fd4 d8 10 getenv_s +15fd4 c 198 2318 +15fe0 8 201 2318 +15fe8 5 202 2318 +15fed a1 203 2318 +1608e c 205 2318 +1609a 3 209 2318 +1609d 6 210 2318 +160a3 9 206 2318 +FUNC 160ac e6 c _dupenv_s +160ac c 303 2318 +160b8 8 306 2318 +160c0 5 307 2318 +160c5 af 311 2318 +16174 c 314 2318 +16180 3 318 2318 +16183 6 319 2318 +16189 9 315 2318 +FUNC 16192 8 4 _tolower +16192 0 48 3943 +16192 7 49 3943 +16199 1 50 3943 +FUNC 1619a 117 8 _tolower_l +1619a 8 70 3943 +161a2 b 74 3943 +161ad c 77 3943 +161b9 31 79 3943 +161ea f 80 3943 +161f9 14 82 3943 +1620d 2b 86 3943 +16238 3 88 3943 +1623b d 91 3943 +16248 2 92 3943 +1624a b 94 3943 +16255 a 97 3943 +1625f 25 110 3943 +16284 6 112 3943 +1628a 5 116 3943 +1628f 6 117 3943 +16295 1a 119 3943 +162af 2 120 3943 +FUNC 162b1 27 4 tolower +162b1 0 143 3943 +162b1 9 145 3943 +162ba f 147 3943 +162c9 1 153 3943 +162ca d 151 3943 +162d7 1 153 3943 +FUNC 162d8 82 c _iswctype_l +162d8 6 66 4124 +162de 8 69 4124 +162e6 6 70 4124 +162ec 8 71 4124 +162f4 18 72 4124 +1630c 2 73 4124 +1630e b 75 4124 +16319 25 85 4124 +1633e 3 86 4124 +16341 d 87 4124 +1634e a 89 4124 +16358 2 90 4124 +FUNC 1635a 6e 8 iswctype +1635a 4 96 4124 +1635e 8 97 4124 +16366 2 99 4124 +16368 2 122 4124 +1636a 8 101 4124 +16372 14 103 4124 +16386 2 122 4124 +16388 9 106 4124 +16391 25 117 4124 +163b6 10 121 4124 +163c6 2 122 4124 +FUNC 163c8 5 8 is_wctype +163c8 0 148 4124 +163c8 5 149 4124 +FUNC 163d0 61 c __ascii_strnicmp +163d0 6 69 538 +163d6 3 75 538 +163d9 2 76 538 +163db 2 77 538 +163dd 3 79 538 +163e0 3 80 538 +163e3 2 82 538 +163e5 2 83 538 +163e7 5 84 538 +163ec 2 89 538 +163ee 2 91 538 +163f0 2 93 538 +163f2 2 95 538 +163f4 2 97 538 +163f6 2 98 538 +163f8 3 100 538 +163fb 3 101 538 +163fe 2 103 538 +16400 2 104 538 +16402 2 106 538 +16404 2 107 538 +16406 2 109 538 +16408 2 112 538 +1640a 2 113 538 +1640c 2 115 538 +1640e 2 116 538 +16410 2 118 538 +16412 2 121 538 +16414 2 122 538 +16416 3 124 538 +16419 2 125 538 +1641b 2 128 538 +1641d 2 129 538 +1641f 2 130 538 +16421 5 133 538 +16426 2 134 538 +16428 2 135 538 +1642a 2 138 538 +1642c 5 140 538 +FUNC 16431 ec 10 _mbsnbicoll_l +16431 7 53 2932 +16438 b 55 2932 +16443 9 57 2932 +1644c 13 58 2932 +1645f 33 61 2932 +16492 6 62 2932 +16498 23 63 2932 +164bb 8 65 2932 +164c3 14 66 2932 +164d7 23 74 2932 +164fa 10 75 2932 +1650a 11 77 2932 +1651b 2 79 2932 +FUNC 1651d 17 c _mbsnbicoll +1651d 0 85 2932 +1651d 16 86 2932 +16533 1 87 2932 +FUNC 16534 95 0 __wtomb_environ +16534 7 43 1113 +1653b 3 44 1113 +1653e 9 45 1113 +16547 c 52 1113 +16553 12 57 1113 +16565 11 61 1113 +16576 12 65 1113 +16588 10 72 1113 +16598 5 74 1113 +1659d 9 76 1113 +165a6 3 77 1113 +165a9 9 81 1113 +165b2 5 84 1113 +165b7 2 85 1113 +165b9 5 58 1113 +165be 9 67 1113 +165c7 2 68 1113 +FUNC 165c9 1a 8 strnlen +165c9 0 38 531 +165c9 19 45 531 +165e2 1 49 531 +FUNC 165e3 224 1c __crtGetStringTypeW_stat +165e3 10 64 1242 +165f3 9 72 1242 +165fc 7 73 1242 +16603 14 75 1242 +16617 11 79 1242 +16628 8 80 1242 +16630 b 82 1242 +1663b f 83 1242 +1664a 4 88 1242 +1664e 13 90 1242 +16661 7 95 1242 +16668 2 199 1242 +1666a 8 119 1242 +16672 b 120 1242 +1667d 5 121 1242 +16682 b 122 1242 +1668d e 128 1242 +1669b 5 130 1242 +166a0 3 131 1242 +166a3 1d 142 1242 +166c0 6 143 1242 +166c6 40 146 1242 +16706 3 147 1242 +16709 6 148 1242 +1670f d 150 1242 +1671c 1a 160 1242 +16736 4d 164 1242 +16783 4 165 1242 +16787 5 170 1242 +1678c b 171 1242 +16797 3 174 1242 +1679a 23 178 1242 +167bd 12 186 1242 +167cf f 189 1242 +167de 4 187 1242 +167e2 7 191 1242 +167e9 8 194 1242 +167f1 4 196 1242 +167f5 12 200 1242 +FUNC 16807 3e 1c __crtGetStringTypeW +16807 6 211 1242 +1680d b 212 1242 +16818 2b 222 1242 +16843 2 223 1242 +FUNC 16845 1a 4 strncnt +16845 0 50 2759 +16845 6 51 2759 +1684b 6 54 2759 +16851 1 55 2759 +16852 5 54 2759 +16857 7 57 2759 +1685e 1 58 2759 +FUNC 1685f 389 18 __crtCompareStringA_stat +1685f 10 96 2759 +1686f 31 280 2759 +168a0 c 107 2759 +168ac b 109 2759 +168b7 a 110 2759 +168c1 5 118 2759 +168c6 1b 119 2759 +168e1 7 122 2759 +168e8 1f 123 2759 +16907 6 120 2759 +1690d 7 121 2759 +16914 3 124 2759 +16917 2 125 2759 +16919 17 130 2759 +16930 7 189 2759 +16937 8 201 2759 +1693f 8 202 2759 +16947 d 208 2759 +16954 5 214 2759 +16959 8 215 2759 +16961 2 218 2759 +16963 6 219 2759 +16969 5 222 2759 +1696e 4 223 2759 +16972 f 231 2759 +16981 2 232 2759 +16983 5 237 2759 +16988 4 239 2759 +1698c 2 240 2759 +1698e 10 244 2759 +1699e a 246 2759 +169a8 7 244 2759 +169af 2 262 2759 +169b1 5 253 2759 +169b6 6 255 2759 +169bc 8 256 2759 +169c4 10 260 2759 +169d4 11 262 2759 +169e5 7 260 2759 +169ec 2 262 2759 +169ee 1a 280 2759 +16a08 6 281 2759 +16a0e 4d 284 2759 +16a5b 4 285 2759 +16a5f 6 286 2759 +16a65 19 295 2759 +16a7e 17 305 2759 +16a95 46 309 2759 +16adb 4 310 2759 +16adf 13 320 2759 +16af2 17 326 2759 +16b09 7 328 2759 +16b10 8 331 2759 +16b18 9 333 2759 +16b21 4 132 2759 +16b25 5 137 2759 +16b2a 8 138 2759 +16b32 5 139 2759 +16b37 8 140 2759 +16b3f e 142 2759 +16b4d 6 143 2759 +16b53 5 148 2759 +16b58 19 155 2759 +16b71 2 156 2759 +16b73 6 157 2759 +16b79 19 163 2759 +16b92 4 164 2759 +16b96 7 166 2759 +16b9d 5 167 2759 +16ba2 3 169 2759 +16ba5 3 170 2759 +16ba8 18 178 2759 +16bc0 6 179 2759 +16bc6 6 181 2759 +16bcc 8 182 2759 +16bd4 2 184 2759 +16bd6 12 337 2759 +FUNC 16be8 40 20 __crtCompareStringA +16be8 6 349 2759 +16bee b 350 2759 +16bf9 2d 361 2759 +16c26 2 362 2759 +FUNC 16c28 f8 10 _strnicoll_l +16c28 7 55 277 +16c2f b 57 277 +16c3a 9 59 277 +16c43 13 60 277 +16c56 33 63 277 +16c89 6 64 277 +16c8f 23 65 277 +16cb2 a 67 277 +16cbc 15 68 277 +16cd1 21 78 277 +16cf2 b 80 277 +16cfd 10 81 277 +16d0d 11 84 277 +16d1e 2 85 277 +FUNC 16d20 27 c _strnicoll +16d20 3 92 277 +16d23 9 93 277 +16d2c 1 101 277 +16d2d 5 95 277 +16d32 13 99 277 +16d45 2 101 277 +FUNC 16d47 4d 4 findenv +16d47 1 387 1450 +16d48 8 390 1450 +16d50 12 394 1450 +16d62 d 399 1450 +16d6f 9 390 1450 +16d78 e 407 1450 +16d86 1 408 1450 +16d87 c 400 1450 +16d93 1 408 1450 +FUNC 16d94 5d 0 copy_environ +16d94 4 428 1450 +16d98 2 429 1450 +16d9a 6 434 1450 +16da0 2 464 1450 +16da2 7 438 1450 +16da9 8 439 1450 +16db1 14 443 1450 +16dc5 8 444 1450 +16dcd 6 448 1450 +16dd3 11 458 1450 +16de4 4 448 1450 +16de8 2 461 1450 +16dea 5 463 1450 +16def 2 464 1450 +FUNC 16df1 24c 8 __crtsetenv +16df1 6 76 1450 +16df7 2c 89 1450 +16e23 2 91 1450 +16e25 1c 98 1450 +16e41 5 114 1450 +16e46 13 125 1450 +16e59 c 126 1450 +16e65 4 130 1450 +16e69 d 153 1450 +16e76 9 155 1450 +16e7f b 100 1450 +16e8a 6 101 1450 +16e90 2 356 1450 +16e92 3 164 1450 +16e95 6 165 1450 +16e9b f 171 1450 +16eaa 2 172 1450 +16eac 2 173 1450 +16eae 8 176 1450 +16eb6 f 178 1450 +16ec5 2 179 1450 +16ec7 2 180 1450 +16ec9 6 196 1450 +16ecf 5 197 1450 +16ed4 2 200 1450 +16ed6 10 207 1450 +16ee6 9 210 1450 +16eef a 216 1450 +16ef9 6 218 1450 +16eff 5 235 1450 +16f04 5 238 1450 +16f09 5 241 1450 +16f0e c 222 1450 +16f1a 4 221 1450 +16f1e 1d 230 1450 +16f3b 2 233 1450 +16f3d 9 245 1450 +16f46 4 250 1450 +16f4a 2 251 1450 +16f4c 2f 255 1450 +16f7b 8 258 1450 +16f83 3 259 1450 +16f86 5 262 1450 +16f8b 5 264 1450 +16f90 21 287 1450 +16fb1 25 289 1450 +16fd6 21 338 1450 +16ff7 4 339 1450 +16ffb b 343 1450 +17006 7 346 1450 +1700d 5 349 1450 +17012 8 351 1450 +1701a 6 352 1450 +17020 8 355 1450 +17028 8 271 1450 +17030 6 274 1450 +17036 7 276 1450 +FUNC 1703d 50 4 _strdup +1703d 1 66 568 +1703e b 70 568 +17049 6 71 568 +1704f 9 73 568 +17058 e 77 568 +17066 1c 80 568 +17082 4 81 568 +17086 6 84 568 +1708c 1 85 568 +FUNC 1708d ba c _mbschr_l +1708d 7 53 2982 +17094 b 55 2982 +1709f 32 58 2982 +170d1 8 60 2982 +170d9 d 61 2982 +170e6 a 65 2982 +170f0 7 67 2982 +170f7 10 69 2982 +17107 3 70 2982 +1710a 8 72 2982 +17112 d 63 2982 +1711f 8 76 2982 +17127 e 77 2982 +17135 10 79 2982 +17145 2 80 2982 +FUNC 17147 13 8 _mbschr +17147 0 86 2982 +17147 12 87 2982 +17159 1 88 2982 +FUNC 17170 be 8 strchr +17170 0 60 595 +17170 2 68 595 +17172 4 69 595 +17176 1 73 595 +17177 2 74 595 +17179 3 75 595 +1717c 4 76 595 +17180 6 77 595 +17186 2 78 595 +17188 2 81 595 +1718a 3 82 595 +1718d 2 83 595 +1718f 2 84 595 +17191 2 85 595 +17193 2 86 595 +17195 6 87 595 +1719b 2 88 595 +1719d 2 91 595 +1719f 1 92 595 +171a0 2 93 595 +171a2 3 94 595 +171a5 1 95 595 +171a6 2 96 595 +171a8 2 101 595 +171aa 5 102 595 +171af 2 104 595 +171b1 2 105 595 +171b3 2 107 595 +171b5 2 108 595 +171b7 2 110 595 +171b9 3 111 595 +171bc 3 113 595 +171bf 2 114 595 +171c1 2 116 595 +171c3 3 117 595 +171c6 6 119 595 +171cc 2 120 595 +171ce 5 124 595 +171d3 2 125 595 +171d5 5 127 595 +171da 2 128 595 +171dc 6 130 595 +171e2 2 131 595 +171e4 1 134 595 +171e5 1 135 595 +171e6 1 137 595 +171e7 2 138 595 +171e9 1 139 595 +171ea 3 142 595 +171ed 2 143 595 +171ef 2 144 595 +171f1 2 145 595 +171f3 2 146 595 +171f5 2 147 595 +171f7 2 148 595 +171f9 2 149 595 +171fb 2 150 595 +171fd 3 151 595 +17200 2 152 595 +17202 2 153 595 +17204 2 154 595 +17206 2 155 595 +17208 2 156 595 +1720a 2 157 595 +1720c 2 158 595 +1720e 2 159 595 +17210 2 160 595 +17212 1 163 595 +17213 1 164 595 +17214 3 165 595 +17217 1 166 595 +17218 1 167 595 +17219 3 170 595 +1721c 1 171 595 +1721d 1 172 595 +1721e 1 173 595 +1721f 1 174 595 +17220 3 177 595 +17223 1 178 595 +17224 1 179 595 +17225 1 180 595 +17226 1 181 595 +17227 3 184 595 +1722a 1 185 595 +1722b 1 186 595 +1722c 1 187 595 +1722d 1 188 595 +PUBLIC 17176 0 __from_strstr_to_strchr +STACK WIN 4 1060 54 6 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10c0 a 3 0 0 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10f0 21 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1120 14 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1140 16 7 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1160 1e 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1190 10 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 11b0 7 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 11c0 2c 7 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 11f7 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1206 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1214 1c 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1215 18 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1230 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 123f 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1247 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1262 1c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 127e 1f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 129d 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12a1 b 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12ac 5 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12b1 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12b6 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12c0 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12ca a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12d4 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12de a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12e8 24 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 130c 41 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 134d 1b6 c 0 0 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14c5 14 0 0 0 c 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1503 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 150d 22 3 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 152f 70 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1596 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 159f f5 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1688 b 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1694 70 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16fb 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1704 31 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1735 eb c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1814 b 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1820 53 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 186a 8 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1908 8e c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 195e 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1996 3d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19d3 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e1 24 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a05 26 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a2b 15 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a40 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a49 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a52 18 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a53 16 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a6a 20 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a6b 1e 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a8a 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a8f 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1ac1 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1ac6 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1afd 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b02 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b39 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b3e 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b75 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b7a 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bb1 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bb6 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1be8 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bed 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c1f 92 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c5d 34 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c5e 32 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1cb1 e2 c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d7b 11 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1d93 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1da4 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1db5 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dc4 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dd3 4c 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dd4 4a 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1e1f 1a0 8 0 4 0 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1e21 19c 6 0 4 4 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 1e26 196 1 0 4 8 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 1e27 194 0 0 4 c 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 1e44 176 0 0 4 10 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 20 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 1fbf 20 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1fdf 39 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2018 1 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2019 32 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2024 1c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 204b 15e 6 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2051 156 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2069 13d 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 206f 136 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 21a9 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21c4 db b 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21c5 c3 a 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 21ce b9 1 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 21cf b7 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 221e 67 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 229f a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22a9 198 e 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22b1 187 6 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 22b7 180 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2441 b9 11 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2448 b0 a 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2451 a6 1 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2452 a4 0 0 0 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 24fa 135 b 0 0 0 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2502 12a 3 0 0 4 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ = +STACK WIN 4 2503 128 2 0 0 8 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ = +STACK WIN 4 2504 126 1 0 0 c 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ = +STACK WIN 4 2505 124 0 0 0 10 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ = +STACK WIN 4 262f 240 c 0 0 c 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2858 4 0 0 0 c 64 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 286f 4c 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2870 4a 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2871 48 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 28bb 24 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 28bc 22 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 28bd 20 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 28df 24 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 28e0 22 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 28e1 20 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2903 6c 7 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2909 64 1 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 290a 62 0 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 292a 41 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 296f 6e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2970 6c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 29dd 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 29e6 6e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 29e7 6c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2a54 9 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2a5d 15 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2a72 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2a78 32 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2a79 30 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2aaa 19 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2ac3 3d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2b00 bf c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2bb6 8 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 2bbf 77 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2bc0 75 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2bc1 71 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2c36 18 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2c37 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2c4e 121 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2d57 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 2d63 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 2d6f 69 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2d79 4b 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2d82 25 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2dd8 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2dde 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2de4 184 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2de5 182 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2e00 166 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2f68 5b 6 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2f6e 43 0 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2fc3 5a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 301d 74 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 301e 72 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 302a 53 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 3031 4b 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 303c 30 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 3091 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3100 24 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3130 196 14 0 10 0 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3134 d3 10 0 10 4 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 24 - ^ = +STACK WIN 4 3139 cd b 0 10 8 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ = +STACK WIN 4 313a cb a 0 10 c 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ = +STACK WIN 4 3144 c0 0 0 10 10 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ = +STACK WIN 4 32c6 94 15 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 32da 7e 1 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 32db 7c 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 32f7 5f 0 0 0 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 335a a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3364 fc 1c 0 14 4 328 0 1 $T0 $ebp 680 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 3460 22 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3461 20 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3482 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 348f 9 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 3498 24 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 34bc 10 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 34cc 9 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 34d5 49 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 34d6 3b 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 34d7 39 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 351e 55 8 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 351f 53 7 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 3526 4b 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 352c 2a 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 3573 15 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 3588 18 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 35a0 c3 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 365a 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 3663 31 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 366a 28 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 3694 65 b 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3699 5f 6 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 369e 59 1 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 369f 57 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 378b 6 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3791 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 37ac 26 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 37ad 24 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 37d2 63 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3835 474 a 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 383c 42e 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 383d 42c 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 383e 42a 1 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 383f 428 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 3ca9 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3cb4 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3cc1 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3ccf e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3cdd e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3ceb e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3cf9 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d0b e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d19 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d27 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d35 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d40 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d4b b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d56 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d64 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d6f e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d7d 19 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d96 84 13 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d97 80 12 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3d98 7e 11 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3dbe 57 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ = +STACK WIN 4 3e1a d 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3e27 12 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3e39 9c 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3e4c 86 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3ed5 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3edf 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3ee4 7 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3eeb a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3ef5 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3efd a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3f07 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3f11 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3f19 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3f23 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3f2b a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3f35 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3f3d a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3f47 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3f4f 7b 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3f52 75 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3fca 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3fd3 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3ff8 d 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4005 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4009 29 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 401b f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4032 16 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4048 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 404c 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4050 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 406b 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 406f 2f 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 409e 25 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 40c3 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 40c7 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 40d4 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 40e2 20 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4102 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4127 33 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 415a 34 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 418e 13 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 41a1 56 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 41a7 4d 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 41f7 61 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 41f8 5d a 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 41f9 59 9 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4258 17 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 426f 15 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4284 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4298 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42a6 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42ba 25 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42bb 23 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42c7 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42df 38 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42e0 36 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42e1 32 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4317 91 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 431b 89 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 431c 87 2 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4351 40 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 43a8 35 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 43ab 2f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 43dd 81 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 43de 7d a 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 43df 79 9 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 445e 1e 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 445f 1c 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 447c 47 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 447d 43 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 44c3 47 7 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 44c4 45 6 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 44c5 43 5 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 44c6 41 4 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 450a 65 11 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 450b 61 10 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4510 5b b 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4511 57 a 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 456f 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4581 31 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 45b2 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 45c1 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 45d0 1d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 45ed 33 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4620 73 7 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4624 6b 3 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4625 5b 2 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4693 2f 3 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 46c2 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 46d1 79 4 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 46d2 75 3 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 46d3 71 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 474a 68 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 474b 64 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 47b2 a6 3 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 47b3 a2 2 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 47d3 81 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 47e5 6e 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 4858 26 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4859 22 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 487e 31 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4883 29 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48af d0 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 48b3 b3 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 48b4 b1 2 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 48c3 9f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 497f 69 13 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4990 4f 2 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 4991 4b 1 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 4992 49 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 49e8 96 22 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 49fc 79 e 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4a0a 66 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4a2f 29 0 0 8 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 4a7e 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4a7f 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4aac 62 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4aad 5e 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4aae 5a 6 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4b0e 8b a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4b0f 87 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4b10 83 8 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4b99 1c 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4b9a 18 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4bb5 2a 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4bba 22 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4bdf a6 5 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4c85 37 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4cbc 51 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4cbd 4d 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4d0d 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4d0e 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4d3b 6a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4d3c 66 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4d43 5e 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4da5 6c a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4da6 68 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4da7 64 8 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e11 e0 e 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4e18 d7 7 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4e1f cd 0 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4e3a b1 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 4ef1 4f 6 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4ef7 47 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4f40 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4f62 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4f84 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4fa6 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4fa7 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4fd4 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4fd5 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5002 141 7 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5009 138 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 508a b3 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 508b b1 0 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 5143 d4 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5217 c4 e 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 52db 7e d 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5359 125 11 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 536a 112 0 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 547e 15f f 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 548d 4a 0 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 54e5 b3 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 55dd 31 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 560e 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5620 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5632 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5644 150 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 564b 147 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5794 a0 6 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5834 50 5 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5884 2bb 2b 0 4 0 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 589f 296 10 0 4 4 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 58a8 28a 7 0 4 8 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 58af 282 0 0 4 c d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 5b3f d9 b 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5bad 17 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5c18 14 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5c2c 1b8 18 0 4 0 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5c3d 1a0 7 0 4 4 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5c44 18d 0 0 4 8 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5c65 168 0 0 4 c 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 108 - ^ = +STACK WIN 4 5de4 56f 22 0 c 0 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5df8 97 e 0 c 4 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 164 - ^ = +STACK WIN 4 5e06 88 0 0 c 8 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 164 - ^ = +STACK WIN 4 6353 153 10 0 8 0 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6377 11b 0 0 8 4 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 637e 113 0 0 8 8 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 6387 109 0 0 8 c d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 64a6 1ea 1b 0 8 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 64c1 1c8 0 0 8 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6549 111 0 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 654a 10f 0 0 8 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 6690 e4 15 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6697 db e 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 66a5 ca 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6774 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6783 100 19 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 678f f2 d 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 679c e4 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 6883 46 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 68c9 92 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 695b b42 14 0 8 0 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6966 b35 9 0 8 4 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 696f b2b 0 0 8 8 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 69d8 abe 0 0 8 c 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 120 - ^ = +STACK WIN 4 749d 211 13 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 74a4 208 c 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 74b0 1fb 0 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 76ae 28b 1f 0 4 0 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 76ba 27a 13 0 4 4 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 76bb 278 12 0 4 8 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 76cd 263 0 0 4 c 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 7939 341 d 0 8 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 797e 2f7 0 0 8 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 79e5 28f 0 0 8 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 79e6 28d 0 0 8 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 7c7a 4e4 18 0 14 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7c88 4d4 a 0 14 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 7c89 4d2 9 0 14 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 7c92 4c8 0 0 14 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 815e 14c 6 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 82aa 116 5 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 82cb 59 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 83c0 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 83db 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 83f6 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8411 a3 f 0 18 c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 84ab 8 0 0 18 c 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 84b4 a3 f 0 1c c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 854e 8 0 0 1c c 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8557 387 12 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8567 350 2 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 8568 34e 1 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 8569 34c 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 88de 13e 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 88e5 135 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8a1c b1 6 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8acd 64 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8ad4 5b 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8b31 4f c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8b77 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8b80 75 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8bc8 2c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8bf5 c3 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8bf6 c1 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 8c04 9c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 8c0b 94 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 8c0c 90 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 8cb8 3b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8cf3 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8d06 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8d19 1e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8d1a 1c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8d37 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8d52 2a 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8d53 28 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8d7c 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8d97 2a 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8d98 28 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8dc1 21 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8de2 46 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8ded 3a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8e28 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8e2d 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8e64 48 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8eac 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8ed7 314 11 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8ee4 305 4 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8ee8 300 0 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8f15 2d2 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 91eb b0 d 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 91f1 a9 7 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 91f8 a1 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 929b 106 11 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 92a7 f8 5 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 92a8 f6 4 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 92ac f1 0 0 4 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 93a1 2df 12 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 93ae 2d0 5 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 93af 2ce 4 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 93b3 2c9 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 9680 cd 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 974d 2e2 f 0 0 0 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 975c 294 0 0 0 4 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ = +STACK WIN 4 9771 27e 0 0 0 8 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ = +STACK WIN 4 9774 27a 0 0 0 c 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ = +STACK WIN 4 9a2f a8 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9a30 a6 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9a78 5d 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9ad7 2e3 2a 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9afb 2bd 6 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 9b00 2b7 1 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 9b01 2b5 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 9dba 39 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9dda 4 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9df3 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e06 37 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9e2a 4 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9e3d 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e4e b9 5 0 4 0 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e50 b5 3 0 4 4 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 9e51 b3 2 0 4 8 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9e52 b1 1 0 4 c 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9e53 af 0 0 4 10 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9f07 2f 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9f08 2d 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9f36 3c c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9f6c 5 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9f72 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9f84 1f 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9f85 1d 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9f86 1b 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9fb0 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9fe0 42 18 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9fee 33 a 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 9fef 31 9 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 9ff8 27 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 a030 bb 33 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a04a a1 19 0 4 10 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 a0b9 14 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 a0eb 19 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a104 9b c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a17d 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 a19f 34 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a1aa 1d 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a1d3 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a1e0 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a1e9 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a1f2 23d c 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a3e7 b 0 0 8 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 a42f 1b0 c 0 4 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a59d 14 0 0 4 c 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 a5df a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a5e9 104 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a5ea 102 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 a5eb 100 1 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 a5ec fe 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 a625 c4 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 16 - ^ = +STACK WIN 4 a6ed 15a 24 0 14 0 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a706 bc b 0 14 4 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ = +STACK WIN 4 a707 b8 a 0 14 8 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ = +STACK WIN 4 a711 ad 0 0 14 c 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ = +STACK WIN 4 a847 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a851 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a85b 10 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a86b c5 c 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a8f1 17 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 a930 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a93a 31 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a93b 2f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a96b 9 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a974 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a981 22 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a9a3 1bd 9 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a9aa 1b4 2 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 a9ab 1b2 1 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 a9ac 1b0 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 ab60 71 b 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ab65 6b 6 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ab6a 65 1 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ab6b 63 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 abd1 b3 e 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 abd5 1a a 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 abd6 2e 9 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 abdf e 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 ac84 46 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac89 40 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 acca a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 acd4 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 acda 21 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 acdb 1f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 acfb 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ad0b 40 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ad0c 3e 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ad0d 3c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ad4b 48 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ad4c 46 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ad4d 44 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ad93 4b 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ad94 49 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ad95 47 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 adde 50 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 addf 4e 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ade0 4c 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae2e 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae36 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae40 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae4a e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae58 3 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae5b 2f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae8a 55 b 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae8b 53 a 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ae8c 51 9 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 ae8d 4f 8 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 ae8e 4d 7 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 aedf 18a 1d 0 0 0 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 aefb 161 1 0 0 4 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1312 - ^ = +STACK WIN 4 aefc 15d 0 0 0 8 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1312 - ^ = +STACK WIN 4 b069 a4 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b101 b 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 b10d 82 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b114 78 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b18f 7a 7 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b196 71 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 b209 1d9 19 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b21a 1c1 8 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 b21e 1ba 4 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 b222 1b5 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 b3e2 3c 6 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b41e 19a c 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b57f 8 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 b5b8 1e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b5d6 51 6 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b627 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b63c 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b64f 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b664 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b677 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b68c 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b69f 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b6b7 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b6cd 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b6e5 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b6fb 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b713 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b729 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b741 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b757 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b76c 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b77f 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b794 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b7a7 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b7bc 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b7cf 53 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b822 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bb95 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bb9b 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bba1 140 12 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bba2 13e 11 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 bba3 13c 10 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 bba4 13a f 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 bbb3 12a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 bce1 86 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bce2 84 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 bce3 82 6 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 bce4 80 5 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 bce9 7a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 bd67 8c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bd68 8a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bd71 7e 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 bd72 7c 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 bd73 7a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 bdf3 24 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bdf4 22 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 be03 12 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 be17 3e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 be20 31 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 be55 76 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 bebf 8 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 becb 66 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 becc 64 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 becd 62 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bf31 53 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bf84 96 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c00e b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 c01a 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c01f 88 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c09b b 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 c0a7 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0ac 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0af 3e 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0b0 3c 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 c0b1 3a 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 c0bc 2e 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 c0ed 129 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c0f1 123 2 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 c0f2 121 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 c0f3 11f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 c216 6b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c21a 4d 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 c21b 4b 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 c281 171 4 0 0 0 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c285 169 0 0 0 4 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 20 - ^ = +STACK WIN 4 c2a4 149 0 0 0 8 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 24 - ^ = $ebx $T0 20 - ^ = +STACK WIN 4 c2a5 141 0 0 0 c 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 24 - ^ = $ebx $T0 20 - ^ = +STACK WIN 4 c3f2 1d4 1e 0 18 0 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c40b 1b1 5 0 18 4 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 c40c 1ad 4 0 18 8 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 c410 1a8 0 0 18 c b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 c5c6 2f6 17 0 4 0 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c5dc 2d6 1 0 4 4 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 456 - ^ = +STACK WIN 4 c5dd 2d2 0 0 4 8 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 456 - ^ = +STACK WIN 4 c8bc 1ce 18 0 4 0 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c8d5 1ab 0 0 4 4 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 c8d6 1a7 0 0 4 8 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 c8dd 19f 0 0 4 c 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 ca8a f3 7 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ca90 2c 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ca91 2a 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 cb7d 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 cb82 170 c 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 cca8 10 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 ccb9 b 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 ccea 7 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 ccf2 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ce57 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ceda 2a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 cf04 22 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 cf05 20 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 cf26 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d014 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d025 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d03a 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d03f 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d044 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d055 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d3d5 f3 23 0 0 4 328 0 1 $T0 $ebp 680 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d4c8 1e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d4e6 a3 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d578 10 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 d589 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d592 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d5e6 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d611 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d660 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d689 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d6d8 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d701 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d750 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d779 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d7cd 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d7f8 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d847 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d870 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d8bf 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d8e8 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d93c 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d967 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 d9bb 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 d9e6 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 da3a 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 da65 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 dab4 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 dadd d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 daea 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 daf2 1f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 db11 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 db2b 1f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 db4a 1c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 db66 12 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 db78 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 db93 13b 1d 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 dba8 126 8 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 dcce 3b 6 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 dd09 13d 1d 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 dd1e 128 8 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 de46 3b 6 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 de81 11e c 0 c c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 df78 d 0 0 c c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 df9f 3f 9 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 dfa8 34 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 dfc1 18 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 dfde 21b c 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e11c e 0 0 8 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 e1f9 79 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e200 70 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 e236 39 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 e237 37 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 e272 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e28c 3a2 1d 0 20 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e29d 391 c 0 20 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 e62e 43 6 0 24 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e671 1b8 1d 0 1c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e686 1a3 8 0 1c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 e829 40 6 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e869 87 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e8f0 e3 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e9d3 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e9e7 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e9fb 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ea01 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ea2a 419 6 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ea4c 3f5 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 ea4d 3ed 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 ee43 190 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ee44 18e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 efd3 73 4 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 efd4 71 3 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 efd5 6f 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 efd6 6d 1 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 efd7 6b 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 f046 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f04d 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f04e 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f079 40 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f07a 3e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f0b9 1c8 11 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f0c0 1bf a 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 f0c4 1ba 6 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 f0ca 1b3 0 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 f281 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f288 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f289 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f2b4 89 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f2b5 87 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f33d 2c4 c 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f344 2bb 5 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 f345 2b9 4 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 f349 2b4 0 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 f601 395 1b 0 4 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f612 37d a 0 4 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 f615 377 7 0 4 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 f61c 36f 0 0 4 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 f996 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f9bf 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f9d5 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f9fb 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fa21 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fa47 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fa4a fe 9 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 fa51 e9 2 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 fa52 e7 1 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 fa53 e5 0 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 fb48 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fb51 fe 9 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 fb58 e9 2 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 fb59 e7 1 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 fb5a e5 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 fc4f 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fc58 355 9 0 4 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 fc5f 34c 2 0 4 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 fc60 348 1 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 fc61 346 0 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 ffad 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ffb6 20 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ffba 1b 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ffbf 15 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ffd6 36 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ffdc 2f 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1000c 79 8 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10011 72 3 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 10012 70 2 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 10085 3e6 11 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1008a 3df c 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 10091 3d7 5 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 10092 3d5 4 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1046b 45d 1d 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1047f 449 9 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 108c8 1af a 0 18 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 108d2 1a3 0 0 18 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 10918 15c 0 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1094b 128 0 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 10a77 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10a95 1d 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10ab2 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10ad0 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10b46 60 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10b4c 56 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 10b55 45 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 10b56 43 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 10ba6 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10bba 77 11 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10bcb 5f 0 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10c31 1e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10c4f 32 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10c50 30 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10c81 1b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10c9c 96 12 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10cad 7c 1 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10cae 78 0 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10d32 72 11 0 8 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10d43 5a 0 0 8 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10d7f 13 0 0 8 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10da4 1d0 13 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10db5 1b6 2 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 10db6 1b2 1 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 10db7 1b0 0 0 4 c 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 10f74 bf 12 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10f85 a5 1 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10f86 a1 0 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 11033 2c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1105f 65 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 110c4 3c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 11100 1e3 4 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 11101 1e1 3 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 11102 1df 2 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 11103 1dd 1 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 11104 1db 0 0 c 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 112e3 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 112f5 18 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1130d 40 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1134d 78 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 113c5 1490 4 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 113c6 83f 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 113c7 83d 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12855 1680 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12859 15f8 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1285a 15f6 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1288b 86c 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 13ed5 be 9 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 13ede a9 0 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 13ef0 96 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 13fe0 104 9 0 0 0 328 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1421b 57 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14272 8f 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14301 22b 8 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14308 222 1 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14309 220 0 0 14 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14367 1c1 0 0 14 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 1452c 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14555 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14570 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1459a 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 145b5 294 8 0 14 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 145bc 28b 1 0 14 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 145bd 289 0 0 14 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 14619 1f9 0 0 14 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 14849 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14872 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1488d 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 148b7 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148d2 b6 7 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 148d9 ad 0 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 14988 2f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 149ec 47 10 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14a33 1b2 2a 0 18 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14a50 195 d 0 18 c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 14be5 50 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14c02 1c 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 14c35 60 9 0 0 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14c3e 57 0 0 0 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 14c95 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ca2 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ca7 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14cd6 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14cdb 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14d0a 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14d0f 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14d3e a2 c 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14d45 99 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 14d4a 93 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 14d58 84 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 14de0 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14de6 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14dec 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14df2 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14df8 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e04 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e10 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e1c 349 c 0 0 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 150c6 d 0 0 0 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 15165 1f5 14 0 24 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15174 1e4 5 0 24 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 15175 1e2 4 0 24 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 15176 1e0 3 0 24 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 1535a 1ae 5 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1535f 15f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1538f 12e 0 0 0 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 15508 4f c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1554e 8 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 15557 38 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15586 8 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1558f 41 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 155c7 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 155d0 35 a 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 155d5 2f 5 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 155da 27 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15605 d3 7 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1560c ca 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1564d 88 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 15695 33 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 156d8 50 4 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 156dc 4a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15728 36 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1575e e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1576c 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15782 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15793 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157a6 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157b4 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157c7 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157d5 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157e8 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157f6 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1580c 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1581d 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15830 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1583e 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15851 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1585f 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15875 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15886 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1589c 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 158ad 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 158c3 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 158d4 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 158e7 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 158f5 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15901 26 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15927 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15948 26 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1596e 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1598f f0 e 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15996 e7 7 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1599c e0 1 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1599d de 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 15a7f 5c 4 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15a83 56 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15adb db 8 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15ae0 d2 3 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 15ae1 d0 2 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 15b0b a5 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 15bb6 28 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15bde 25 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15c03 18 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15c1b f6 c 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15c22 eb 5 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 15c27 e5 0 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 15d11 33 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15d2c 16 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15d44 1d 4 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15d48 17 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15d9b 81 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15da3 70 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15db2 60 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 15db3 5e 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 15e1c 93 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15e20 8d 3 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 15e21 8b 2 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 15e60 4b 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 15eaf a2 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15eb4 9b 1 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15eb5 99 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15f51 83 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15fcb 8 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 15fd4 d8 c 0 10 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 160a3 8 0 0 10 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 160ac e6 c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16189 8 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 16192 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1619a 117 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 161a1 10e 1 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 161a2 10c 0 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 162b1 27 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 162d8 82 6 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1635a 6e 4 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 163c8 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 16431 ec 7 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16438 e3 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 16498 82 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1651d 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 16534 95 a 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1653a 7d 4 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1653b 7b 3 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1653e 77 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 165c9 1a 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 165e3 224 17 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 165f8 20f 2 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 16807 3e 6 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16845 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1685f 389 16 0 18 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16873 375 2 0 18 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 16be8 40 6 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16c28 f8 7 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16c2f ef 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 16c8f 8e 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 16d20 27 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16d47 4d 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 16d48 48 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 16d94 5d 4 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16db0 3f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 16db1 3d 0 0 0 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 16df1 24c f 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16dfb 95 5 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 16e00 8f 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 16e23 6b 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 1703d 50 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1703e 4e 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 17043 48 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1704e 3c 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1704f 3a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1708d ba 7 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 17094 b1 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 170d1 73 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 17147 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 0 14c5 14 0 0 0 0 0 0 0 0 +STACK WIN 0 1596 9 0 0 0 0 0 0 0 0 +STACK WIN 0 1688 c 0 0 0 0 0 0 0 0 +STACK WIN 0 16fb 9 0 0 0 0 0 0 0 0 +STACK WIN 0 1814 c 0 0 0 0 0 0 0 0 +STACK WIN 0 186a 9 0 0 0 0 0 0 0 0 +STACK WIN 0 1880 88 0 0 8 0 0 0 0 0 +STACK WIN 0 195e 9 0 0 0 0 0 0 0 0 +STACK WIN 0 1d7b 12 0 0 0 0 0 0 0 0 +STACK WIN 0 2858 4 0 0 0 0 0 0 0 0 +STACK WIN 0 2bb6 9 0 0 0 0 0 0 0 0 +STACK WIN 0 2d57 c 0 0 0 0 0 0 0 0 +STACK WIN 0 2d63 c 0 0 0 0 0 0 0 0 +STACK WIN 0 365a 9 0 0 0 0 0 0 0 0 +STACK WIN 0 3700 8b 0 0 4 0 0 0 0 0 +STACK WIN 0 84ab 9 0 0 0 0 0 0 0 0 +STACK WIN 0 854e 9 0 0 0 0 0 0 0 0 +STACK WIN 0 8b77 9 0 0 0 0 0 0 0 0 +STACK WIN 0 9dda 4 0 0 0 0 0 0 0 0 +STACK WIN 0 9e2a 4 0 0 0 0 0 0 0 0 +STACK WIN 0 9f6c 6 0 0 0 0 0 0 0 0 +STACK WIN 0 a0b9 14 0 0 0 0 0 0 0 0 +STACK WIN 0 a17d a 0 0 0 0 0 0 0 0 +STACK WIN 0 a3e7 c 0 0 0 0 0 0 0 0 +STACK WIN 0 a59d 15 0 0 0 0 0 0 0 0 +STACK WIN 0 a8f1 17 0 0 0 0 0 0 0 0 +STACK WIN 0 b101 c 0 0 0 0 0 0 0 0 +STACK WIN 0 b57f 9 0 0 0 0 0 0 0 0 +STACK WIN 0 bebf 9 0 0 0 0 0 0 0 0 +STACK WIN 0 c00e c 0 0 0 0 0 0 0 0 +STACK WIN 0 c09b c 0 0 0 0 0 0 0 0 +STACK WIN 0 cca8 11 0 0 0 0 0 0 0 0 +STACK WIN 0 ccb9 c 0 0 0 0 0 0 0 0 +STACK WIN 0 ccea 8 0 0 0 0 0 0 0 0 +STACK WIN 0 cd04 90 3 0 c c 0 0 0 0 +STACK WIN 0 cd94 46 0 0 10 4 0 0 0 1 +STACK WIN 0 cdf6 17 4 0 0 10 0 0 0 1 +STACK WIN 0 ce0d 19 0 0 0 0 0 0 0 0 +STACK WIN 0 ce40 17 1 0 8 4 0 0 0 1 +STACK WIN 0 ce60 7a 0 0 c 0 0 0 0 0 +STACK WIN 0 d578 11 0 0 0 0 0 0 0 0 +STACK WIN 0 df78 e 0 0 0 0 0 0 0 0 +STACK WIN 0 e11c f 0 0 0 0 0 0 0 0 +STACK WIN 0 14149 84 3 0 8 c 0 0 0 0 +STACK WIN 0 141cd 23 0 0 0 0 0 0 0 0 +STACK WIN 0 14218 3 0 0 0 0 0 0 0 0 +STACK WIN 0 14c02 1c 0 0 0 0 0 0 0 0 +STACK WIN 0 150c6 e 0 0 0 0 0 0 0 0 +STACK WIN 0 1554e 9 0 0 0 0 0 0 0 0 +STACK WIN 0 15586 9 0 0 0 0 0 0 0 0 +STACK WIN 0 155c7 9 0 0 0 0 0 0 0 0 +STACK WIN 0 15fcb 9 0 0 0 0 0 0 0 0 +STACK WIN 0 160a3 9 0 0 0 0 0 0 0 0 +STACK WIN 0 16189 9 0 0 0 0 0 0 0 0 +STACK WIN 0 17170 be 0 0 8 0 0 0 0 0 diff --git a/thirdparty/google-breakpad/r318/src/tools/windows/symupload/symupload.cc b/thirdparty/google-breakpad/r318/src/tools/windows/symupload/symupload.cc new file mode 100644 index 00000000..e2ec640e --- /dev/null +++ b/thirdparty/google-breakpad/r318/src/tools/windows/symupload/symupload.cc @@ -0,0 +1,202 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Tool to upload an exe/dll and its associated symbols to an HTTP server. +// The PDB file is located automatically, using the path embedded in the +// executable. The upload is sent as a multipart/form-data POST request, +// with the following parameters: +// code_file: the basename of the module, e.g. "app.exe" +// debug_file: the basename of the debugging file, e.g. "app.pdb" +// debug_identifier: the debug file's identifier, usually consisting of +// the guid and age embedded in the pdb, e.g. +// "11111111BBBB3333DDDD555555555555F" +// version: the file version of the module, e.g. "1.2.3.4" +// os: the operating system that the module was built for, always +// "windows" in this implementation. +// cpu: the CPU that the module was built for, typically "x86". +// symbol_file: the contents of the breakpad-format symbol file + +#include +#include +#include + +#include +#include +#include +#include + +#include "common/windows/string_utils-inl.h" + +#include "common/windows/http_upload.h" +#include "common/windows/pdb_source_line_writer.h" + +using std::string; +using std::wstring; +using std::vector; +using std::map; +using google_breakpad::HTTPUpload; +using google_breakpad::PDBModuleInfo; +using google_breakpad::PDBSourceLineWriter; +using google_breakpad::WindowsStringUtils; + +// Extracts the file version information for the given filename, +// as a string, for example, "1.2.3.4". Returns true on success. +static bool GetFileVersionString(const wchar_t *filename, wstring *version) { + DWORD handle; + DWORD version_size = GetFileVersionInfoSize(filename, &handle); + if (version_size < sizeof(VS_FIXEDFILEINFO)) { + return false; + } + + vector version_info(version_size); + if (!GetFileVersionInfo(filename, handle, version_size, &version_info[0])) { + return false; + } + + void *file_info_buffer = NULL; + unsigned int file_info_length; + if (!VerQueryValue(&version_info[0], L"\\", + &file_info_buffer, &file_info_length)) { + return false; + } + + // The maximum value of each version component is 65535 (0xffff), + // so the max length is 24, including the terminating null. + wchar_t ver_string[24]; + VS_FIXEDFILEINFO *file_info = + reinterpret_cast(file_info_buffer); + swprintf(ver_string, sizeof(ver_string) / sizeof(ver_string[0]), + L"%d.%d.%d.%d", + file_info->dwFileVersionMS >> 16, + file_info->dwFileVersionMS & 0xffff, + file_info->dwFileVersionLS >> 16, + file_info->dwFileVersionLS & 0xffff); + + // remove when VC++7.1 is no longer supported + ver_string[sizeof(ver_string) / sizeof(ver_string[0]) - 1] = L'\0'; + + *version = ver_string; + return true; +} + +// Creates a new temporary file and writes the symbol data from the given +// exe/dll file to it. Returns the path to the temp file in temp_file_path +// and information about the pdb in pdb_info. +static bool DumpSymbolsToTempFile(const wchar_t *file, + wstring *temp_file_path, + PDBModuleInfo *pdb_info) { + google_breakpad::PDBSourceLineWriter writer; + // Use EXE_FILE to get information out of the exe/dll in addition to the + // pdb. The name and version number of the exe/dll are of value, and + // there's no way to locate an exe/dll given a pdb. + if (!writer.Open(file, PDBSourceLineWriter::EXE_FILE)) { + return false; + } + + wchar_t temp_path[_MAX_PATH]; + if (GetTempPath(_MAX_PATH, temp_path) == 0) { + return false; + } + + wchar_t temp_filename[_MAX_PATH]; + if (GetTempFileName(temp_path, L"sym", 0, temp_filename) == 0) { + return false; + } + + FILE *temp_file = NULL; +#if _MSC_VER >= 1400 // MSVC 2005/8 + if (_wfopen_s(&temp_file, temp_filename, L"w") != 0) { +#else // _MSC_VER >= 1400 + // _wfopen_s was introduced in MSVC8. Use _wfopen for earlier environments. + // Don't use it with MSVC8 and later, because it's deprecated. + if (!(temp_file = _wfopen(temp_filename, L"w"))) { +#endif // _MSC_VER >= 1400 + return false; + } + + bool success = writer.WriteMap(temp_file); + fclose(temp_file); + if (!success) { + _wunlink(temp_filename); + return false; + } + + *temp_file_path = temp_filename; + + return writer.GetModuleInfo(pdb_info); +} + +int wmain(int argc, wchar_t *argv[]) { + if (argc < 3) { + wprintf(L"Usage: %s \n", argv[0]); + return 0; + } + const wchar_t *module = argv[1], *url = argv[2]; + + wstring symbol_file; + PDBModuleInfo pdb_info; + if (!DumpSymbolsToTempFile(module, &symbol_file, &pdb_info)) { + fwprintf(stderr, L"Could not get symbol data from %s\n", module); + return 1; + } + + wstring code_file = WindowsStringUtils::GetBaseName(wstring(module)); + + map parameters; + parameters[L"code_file"] = code_file; + parameters[L"debug_file"] = pdb_info.debug_file; + parameters[L"debug_identifier"] = pdb_info.debug_identifier; + parameters[L"os"] = L"windows"; // This version of symupload is Windows-only + parameters[L"cpu"] = pdb_info.cpu; + + // Don't make a missing version a hard error. Issue a warning, and let the + // server decide whether to reject files without versions. + wstring file_version; + if (GetFileVersionString(module, &file_version)) { + parameters[L"version"] = file_version; + } else { + fwprintf(stderr, L"Warning: Could not get file version for %s\n", module); + } + + bool success = HTTPUpload::SendRequest(url, parameters, + symbol_file, L"symbol_file", + NULL, NULL); + _wunlink(symbol_file.c_str()); + + if (!success) { + fwprintf(stderr, L"Symbol file upload failed\n"); + return 1; + } + + wprintf(L"Uploaded symbols for windows-%s/%s/%s (%s %s)\n", + pdb_info.cpu.c_str(), pdb_info.debug_file.c_str(), + pdb_info.debug_identifier.c_str(), code_file.c_str(), + file_version.c_str()); + return 0; +}

  • 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%0DfgdR?Ax4hU_{BC|J2E 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%0AVJ)}>JgoF#4J`0u#={4jz(a>q);u(u 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 C{z3!* literal 0 HcmV?d00001 diff --git a/thirdparty/google-breakpad/r318/lib/win32/breakpad.lib b/thirdparty/google-breakpad/r318/lib/win32/breakpad.lib new file mode 100644 index 0000000000000000000000000000000000000000..6e6e82b304883f265a2f342138352fd36f3418ce GIT binary patch literal 10305410 zcmeFaOOGSTk{((|Go#U*qpbjK1k4o*f;NKkQCZyuT-=Oc1Q`rIqcW3O)h$3FCK;K@ zQ%nYjkFKio1GJO05wzA%5VX)z&{|9FwASCy;(liC@qRgzNmkeCm@~~{(%sC>&CSit z&CSjKpZ|Bfnmqo0zyFtioBY4iv-2O$f4sQ(@g(_s@aO5tj~C}}sO;bT{?)6$`1h~= zqWjF=-olMbEdsM z(IwL=M(QB#A93*Op~pOoO^n~r&?{@BgUYz83-#z}wJ55I;!k?5v3dC{nzkpJ4Gx{2 zoyavb60v-dCx*sK82t7$gfV%73AM>oZaKtQHWA7Y_)tE!FM(E@Ar;sK~8 z66I{;t;jN9-0tS<(sMWC2Q6yaUtp!*PBv(_o*q@xg9rUwuG>H9ADw!lNP93c{1WTi z3GB}IiJ4-0kT?HpEpFwEi&^iroaJsXQgSABWFTI(F00aI!6E}CRx_)FS>aMCMax~$ z3Y**`$`w1tQu9RD6Wd5LT66bDG;*&e<2iQa%gxFSm-xiO-kQzl?t-idJG3V-)TXUB z%#nLVeaIRK>KMR;ssH4TCllOdtJ2xB8XMch@7zZxuV+vuWn}QkSGdh9mrZJn&HrgRJZf&Ol z(;9{YeTrcv2iC`+Wdq)=@oWL%A$!>!!{NmaFn8sR=Oy#f29i|Yr5l9$vjf&cbXxRN zd}ateNQ1Gy(@f+|!sprMQS3rScNpK5H`&bm#dw~a;4BC)Ow*Z0!+y@gj?Y^+q$wEW z(8-t(hT4OOrHeR%@puX6=V@|^yznRs6%vy?@&;3jwI?|3t$(rcOga9KF`~79Ke0Js zsVAk5CGESNrDST>Gc|c;^WBf>FT!A|wQr<-zvnT%g}nw>FO901vUJ7D8)~9dX|y6o zN680SD3}0w9DQ>9R)akRj-5%D?Qu#>Cj&2}%#U;4oZU#h_?f>L*HLU-57fl7hwcFsMEuP+?N-a?drmL#4=fNopTMOh0oEIUIO zm!p5gm4c7#wmBDJT_1(7`p0_9th8lrG~EGjW3b~OSHruSZ_nbJe);;hyZ~_6o4qHI1^@PvzC4(>DQZ= zI$U)Km*qvSW?K*7J367nIy@uWxHoKaz zn=W6Q{TqA?FE2K}e|a(Y7Y~=Ob)Cs#kfzod4%$w0U}>;eFHhIrrW&Y^^IE6V)-79` zE#NzvO)oEUpaWS?wCHG7yX6dqorVUsTwcgvIb4y5S35m7?3UTH`xZ{kb^SAaB+FZl zrFTFDmtUS`DqQr3jn=T=ZEyvj%Ga4nKePsx*>9N!SK{)oROu;OvtzcqgRVq3q4Fht zY%?_*x@PrTokp|kM6}PS8uxHY-dcO7$J*!@1k|3UyBeXQt%0T>-4VVv}P zFr=rArq=B?8?83PfeM&buFFj`CYK8C>4P!N=^Gc&mk5)k^#@kdvW8+5BKSM1$6aS} zQbcEKEu-J->DGV=yL@f52oIyZd_!NK^HYLiTk9IVjydS)+(c?bnQUeS_gIZ=!_e%m z+3Yu)Eyh{S1?Fc|g@*?-N-{cPc{HF@7_!{7G{YR4ZF3+RyQb1eBvT!@yrAL;X>1(1 zghzc){7n0btv_Z4mh0YN2ZBQwr=H|Gi7=Gpe7c(0K z$t*R@g4mDcgCzhNF;mNc{4K@>o*~?rn8Dmb5~`5;maX-SR%_63x;&a6hm_#`R*IEgrP=e2+*UYCXtBw{Hu^kBF?o(Pi$&#-W_MTpD8}^N=|req>!0 z@rChnotP4P$83_5S|B_PiMK3hMaSt4J7V%P@mz_S9|=U9+krZWQAdjtwUf)gH&ntM z{}O(?eBG`9;Lfnv@&_-Mz#}>yw72G-She%F+WAXvSl(EDOoHGfj&X(K3E zoHd0K53=wS>lc!n zHFZt33!(=RT&f@G;#6nS#n~QZYNWfBu8{4UsByMikIr&Ca+XW~SrOT1nXnm2OA(Rh zyAgSwOXPVjk>^E3o)-{#UPR;@RU+jc;p$C_%<%UtNl{UHoWqhVSzL5`gN4<&9j|VX zD2b!7O$~9?i2Sq~uP(EtxYAcr+A1xzN=w_NrFLm)r?j+NTG}ry9h8<*7KSo@I5X3T&`W5-K5z(uU&fgsJ?no`9<-XopNUIKB#90f1 zlI93Buj68|=43-YyE=~lYh_oV>}W$y!EGW@DUzD0thWeg{7AXZ7})eCT7BlHc;@$! z&Pd%Lk)jH(p$sXt9LKA<%@t*_ttWi$gcqEu^DW}iM6q$hQ`Yh}n6VozeS^8t#C5{F zP*=I$0Pg9lfV6|OW?>4k;4HNqMSHxO-j8Q<5@Oq5-yzn50na|Xp}#ldji(`$03HFi zJzn!`3!INm%Sl=mwCE0aR@sYM5rv7|iX=er3_3-!40#4?byBEKB$L+Os%8_X@yVK5 z(7N!B2S@recilm4b@4PSnuDB(@nvs8h`4OmUN3}dtuM-DCAHoVROkAZa@6(6@m62A z%->c%{~;%KF4bqnl?H0}o;IR&>O5L=uXWsfcy4Us;g*`-oxfd7Yb}wVyT-;=s!sh+ z;#+0}?IG5@kL`K)wOw9dmy@+qi(rKv4hGRtj}WFOxF2eLR;bTvajNj~N+(%w<+B&7 zwx0{#Dz#p!&`Ye4`r}U?Ckd>TQod4p-$=WjZc_(Q@J2~iegPBp&Ac~zqL+4qSf)1l znfv2pVGzh<=M@IgG@ZP{Ad;q=R~SaVxVf-l*Gj2CDb-@6vhx&TRJ;Gl>&oUpob~|iDo_}Pg2$?)%lvvXo%wk?iPqERem;I!2Rn(I*|ZK8 zE7F@mptWR@(p6RwnmwXt<-va?5L^(!|A$v{KH}cK5@=WF#>Ue>Zr7XpnK$Qvp7h=^ zHR8z3MRL*eClvc12Jq8aicH!?o66W@mvz8faTtuyll+NWRrNNKIZ+%l#FxBtrR+9! znMJHX%+pxWnRpj)yj+q9rv*LbBvEsvAa}-{xJ8jhhreU@S!lATPO&@hA&zpWGQSO zSN`_lk&>_A5zCdkT={>*Lz#FWid*x>^+n-=MVfB2l5kA?`CLxiN~bkha*>#NxvOQp0V^4V zjL_EHD&dwisR{%wW_xAW8Y>HtOcWN}sfTO@J}u+XCZpCX%-$lslHq;LuTp*qCrF;4 z)w-ZW7i7e&=2i)}gphgS7FGE&E-Tg7dR2FNo`0{jEBES*D#gzF>?S%Vz?w7D)NCv{ z^H5?V`TQv{ijvgc&%SsnuG;&#KUVhZKKQa0fV=Jit?DG>L0DEj#~J(uD^b86>S*h|t}%vPmhg zxx86iRn7nGt=#%1{7#GCUg->IhCR7=HXP+Gtd>{>4P0$$z$xDMr`x$Fvo_-Bvf>|wyfPb4D-!VQ#4wYandHvdWe)@^@9-IHpX}0>1I|TC9>+yrPCaWUP zDf;9uyp25L$tz!=ya;x&eezZ__CV!<`t16zGJ6QWYW{sZOu;7)IJC*Ll2QiH@~I_H z=yS8^zkeT3!fn1k$IB!IAVI45BuKLiB*-401ZkCl1PSGnAXXVja4$0n(k=rDZmcCi z>@twx9$ONmQw9=TP)mYz%RqvB^+}L^8Ay=AJ_#}?1Bu=RNCM&aaJ=*OM?j~3D}l~F4aEquKgV&rIZ05E>7_uC zep#vnL-wsHMv?tF2Zw%^eb$Z1)6Y?m?MPIXMUS!@J0IVTU5HK; z<7tFV5fdV}Ms5O$9Py1Rf;M?>NJL^CSAm7}T(2Gd~H{FGH;^?<;E?5*UUtiK+ z&ENsc_INR!=S^YEmB=#`3)>NB`7@m5QAIV>v@&6GzjpQc+@H|YP=n)Ee?mZ^Qgxf_ z$xAY5jAwv1b=d?|#39TTkQXcp>$kNWeb}6>dh0jPk z2}Z#1mtRpf`ScmDG`Rk9L+`n($Vbr8(FzjeKe^+{1b(`xJ!&N;E6OYk@SdEMVLs7D z?)79mA0z5{vr4u~Wmm+7EEBR_|4sE+K0@PS$R50;@=+S|^m||C0a^V zU(owEE>*NV`^SeoigC%i?_H(48WO0=?PPGLY$i|3< zOI1=~c1qWe(v*0{!V)t|_|-|Jc9=zH=h{iwDOg&`Erx zKgSZ-M=FR*s%A@QL40d2?V_-PnfzQPz4W^FY~DS8!6TtkpLx%*El&d5Qs_MR>ZQti z&ZH+J=()-&-Tt%YQ;dL}r$(B9q|Sd1JDw}Jv0m^Ts5S_KsdDnX9bru8M*@)S|FeeU z1sJgNFg|ORMhrM1cUF)mM!0sy+b=Hr;aqs(=X-AMVHiCJgY@eWb+kztZ~T?}dA50E z3bnFb5O+<<5`%*q+syMfY!uVKw^3W<*>k}Nc#FkOhdh+zPQN6QuEwyApr;gE7NQZj z@j|`B1SZhk;;KFR$9Kd-2b3E6eI!mCuBgtq{I^|W<0N|#xCy^k`YAiF(#Y<|`n~7H zuAcHx?1BSbA5en*R84fbM?XfR^9@$p zMiVy+WH=49@4H_UF~&;?54{6WsK|K`%x~Opw#2H1CQa*64I7bpSHZqyDx2SwqdKw# zQ;b-el%p~%L4@^9`GLTj*es9Ha#V)!^HvxYvA(w>j(kHZeu}902I@Bu5y6odEl1@@ zl8T=rj(kHZM4+Id^#^u$(CV5Ro_(5`+ovT54APf)9NbBxuMPU0uIV^KZMJ}!Gn-ys z2up#Y1aCMF@M68aTTfQAIhwTy{kHzhvqEPv2X0hdo3 zw$^S9b<^nUjE~z!sHd(!(8nWvM9kub6p(hcZntBZoxaUTw}gd1qOeB}ii~LHHpWzs zspmhr3jGvPYwB9JKQwe>AP_To47H$oOg#6I;h7nXgmH3Z{w->ZAw)YR1IuGPq857L zN0Kf}>ouFLVY?NRF>Z=`czH&(nR)!9Pk(X=Q^FF-A6&pyE@9kDS>}pd!WbANqMLu? z{s}l9aqen@!lt2h97i|W7KOsffmPrflf~${GPl8hGSi~D#Nx_Tm>?z~>J8JpGn>O< zZ(r>_@QQ)otEjuWrG>Qk}C8Mwg#j+%;B$NY(nB& zy4LQPwmp>UCK~X4i9gWTgp^ylX0!&j?hIQjGfX*)Z){5PSMCW*36BbE5*BeWZ9mhH zL_)+fk0qN67_F$tLRCJcL`81q3!#m4z>*1v?ReA;I2=lxBl*&`@?CLx;rRhjdPjBh zh$VX3$5jL^U6geI8dev0=txS05r+^;u$>||ScK3Pb_yP&LcUv^D5&6td#z!eoY>40 zL6@^#dAGCGW;>o6aGk1Qp^Xvc91!so3NSjZcK?bzgo>^<9Ftw2uxgRfx$Y3ovHu_f0<}+SHNqyTwi8X8rJFVzFYFv zo)L!=bhrG~E^~!DUp8A3$cGCd^(!%#6_|@bA;0vFPU%#iKH#8lmrik`&>uUu>Nd8N z2=sV57NKx6PFL9R_$PGF&_(LP>XyIOWN0sMH&#j)I7PrSy@> z7Cb(3RQ`P%l}X*5jF;odY;#;wBgleKkXl_ymcp5#YBjL%c~8sZ_f?qmBGd72M680e zxxaz##*CdKn}f8NK6s?;UnaJq)&b$X z8Trk$KrVSoIk=Pe#KkD3TJqcF4PVuP2#GEJS) zvxc8;$MfyZP`PO}cUiQv={b)me6sPSzvQc&$2LWI)3)5MDO~*chA>>W%7VD^_)WGK zTVCiD$b#rAp~zR>`UO`rewC}RJ(_7~%_YaIyBuT2RL@R0DED@KbGsrz+VN%n@`RRK zL#{s8V)4nU28!Awk7fRPLp``Wp(qUEos6jV51Af`qb`-GCUfBORFO8WOyMP`KMcB7 z11I9*_>E7x_^?bI1LN>3JgR%ww;HXU)e~puvG9VT7zi8(HyVy<^~6~=1y;&H4h}Nl z13mtz#$`1TW@4ER0xB>k<%#=_$Ao-TuX0St6`2!!fXLnB5B`%69>uvopCWQ!_#l#t znQs#?O-hGHVLC0OcXDW=DGZNv)nmckBZmm5Y}{&{z$|LpgXwk3gVyk>uM1lyb*fzjPL~zktb1Q?aQ2jHQLi8aErGm!o=kAJtv>Q@&op_fhy-Kn6kD?ksJLuV4u0 zNa!M=M2SfvZcA~qxZ1&6oC zWV6sTlGr2hm+jEk;aT-jT8$}J?(9(-l~d>hhpLU)R9x;YlLwV+y*wME`@FA_@deo) zu^t_2EeiG&1Ai*g6CZBvJJXy-m==t<_Dwp=y9?R+27zYuoQ}M>U3P=LY+&Q7dfpw~ zQrPIGYIu`e`|}=lTVBpTQa8f^5890<1-Qe+U5WiR+`d6j1ZVe>>s0BI@ceWDhqf{I zkwd19E@zWp=m7Tb-n7YEvWK9J^x<=Ca%hzJW}=jD3HzTDrRUtMFY8={AQ0|DFA+gI zi36W$xq}Pg&O=D-#-I4}KH_4LTs^<%JUDO+ z?UKp3b-KzdaSkUgIf(2qKj&?_Q^nK5uv#cNSDOVSb}A^<{cj?CHvOZOmom_>s|323KPL6VSF0JMC9F@$31}2&B+u?4vO~2sZ4*z>0|5Cbzja$P*qucJb+G0q#XDS46Uzk&QBf@Mg zzx0=(J3ffG)!K$2G|aXTrigt}yZlX@{85jY7Ul?77T33^%8*`I? zi~i(W&IZ-vfaLhAyM2(Z2KgQ{AX05=}A(gAB%BBaf;Jc1 zTHQjXMV zVc@!ycIpTkSM>WRA&sHRWrd2B^Ory8{>j`hhtwTdE!kd|u|c#rM`1!o8PZs2EbnWN z(kN0QkpzwTB?)&%??{xXbD^&C9-p8UFv$FI$Z-N|M6Qptjwb>p*t)L{tlVfpCt30#+6?@ zctY`DWk4*W>1(Uf3nb2p3$mshWx{1f?kKIwX+DJmW93t-nn<_(*-I=5YF@{W!uW4B z+}vq6i`)nCU=tp3dZdi&UiH*r?KUOYm2i1I3wHB$S=rX5p1o8^s#PTV`DUv~kb38v z5Kz8VLE;xo-guZ_nI_DM?@I@l358gckD?U0P~+K56bEHnkb44mk;{m~8qg(4T8c!q zyUBh$x5Pm^gC(#s^o=HRK^}?7kDpy*GrzD&8DE#h$n(<-hxSC#TCdpAZ2k&`W1t*4 zXY1lN3oAB+VcrU<;oQ&TS&*2iT&@@|r?Ms-fp~de0R9XdmnSI?q>$;{{@_lQl~tD| zucDo#kB#zVLi_MWMy%hAAGA}go704jtKwuOL|57?pQ6)qA8UiF`R!X0=*!a``c3m# zzK7A(3~SIZhTT|fSK%2ZA6ouGCy&uVCdVO(5TxKllG0b;%@fOLHJe5wmKY*B^o)>j zV+R!?JDRAi3c*8YZ5ApsK(Ab7Xm7aO2bI zLE7tIG#zlb#`iO7L!yF1A$s&zT2$lJYW!7`?@X4Y{wh$=dImDQ)l{-pV?_A= z9W*SSYaeVK&pC{|d@~id%IU@bf>+8)5r}d-FY`)Hl@HO2c#Oqyn z#tZUF_TmB=2CEYbVz$xSBmof4Yqq;V32W)X>@@nVPFLjQ61k>CAXylV#i_gcy{^&k zc0|Y@$B(gv!lpx_X48Tl)9bcu`M_DRalxVMxf!oG_DnfQjay)wjSVlhv^XG*LFB|U!>8=`NXaCU%hPgb82*!kYvst_H5;4b&G_2it|lIGdFeMj z@v=PY=5*EOV*AvhH+Tp}sdf)}9R}N{J8!jCsxJtkOlXSrzdqghn4Bt_qwDO&A1}b39l$eq7zlm6`x9o zh-cw2SHk3oQ8i3blvL{{#i6IF91HEtzmYDer3rL?quj)a!iPfDjs z-K1oeLL{ZKuxdsk3u{K~2&A#FYDyA|>t&>{xN1TI3#%ohFQ-oN~S*he8#!@9VTD%D*QeKZh}yz(ZFtV(J>QGr!*9;!^U z@Lmyy;CBI-;uN)Gafy*bUCwmngE52&4t!XDSKj@V$lZ;Y>OxyMO3aYk{jAigwUHi~ zie~a=xOziL=&GhtieZOlLP)hHQo3a4hC=v?=2A*Xy`2!Sq=DxOKpd_FeKdPwQq*`IH{=B@CGmvEpE6gDhxX2klHS# z6VbSjL9q&waE_Ou3M!Q%3@39grl7PC zMSQ+yFvJQA5k!L#&g9r|#Y+oOM6)hKL0D7_9G_HK_*iK%ieTzw!DUGyXfQi6kg`Ak zrq*}CAF;x7=9f1X^0eUQHJuC_t9bp#=vsgO|3N=Bng_&t0-&XPQ5cQ`*``_9yhU+a zL!*ylcCc-<__XjpQ%&>%pZ@A;yh(SZtqog46OTZ2wYiV`d~pBq+rD^nSbL zG&Kx?`!M(K#`Eh5m{ttXZ8VLRK5(KIR`60z?}{OYR=?LY8y!v3aIrxOARh8L`~$fI z-^B|NMx$kStt`-*CAk2s-!cp&crl8>Hsgmh+j?5Jp(9^_)z5+n5@997H=2g)Yj&^S z>kaju)*qUqUi0$evpA3t0t(4wd5!&>nhpcaZgqNgyV*;$?4dn`ziq%A(c8>C8fZ?h zIfVMp;p+W%!LM;$UeG~DnrKIBnU>S+C0pd-hydsO_)-eg&^2e+u^QH(o1iu}loQ;i zLwcuN=!VvE`uYF}ve3bp1|9do>)>|#31+|1>oq&ZV3>sz_)Sr;q?lmdwKD}9wgL9a>|zd6=CgZy>3Tu4Upp?HqUqxAi9(CTgl0XsnHCqJ!m7zh{#e!eWBLAWSab;*X#G2!;T;sXD+%PMgGuV0lV-7 z4&LasZC&KLVNA%0sOvoOk~J|BLwnE>Z8MvgPg#b%Ya@f0NUgwye8k1)Y8;%Dz>0Kb z9UB=Wka~;R&$*DkQk5lrFaRfaVkCF;TN=KLtR)VukW{dx4?b-B6n^7#JwCnTf+Rdv zSiOz3Gp67G_lp5ID+Hh7F(~to&+~FRflw)A@3OHj5b^&&K~=o|ePN7C1AquI6uk~Wn_lymfzN^b_; zet*!H2c|4z%zi$mb2Cc5!RNPJki=wbZO3qW z-A02M!{jhJmJ4PP&1+(Xm=D~|okVd~=@&Zd6Tbcc-&-r>~9yw`F2fAfU+FmbGNX5(>9WA5WHQPthaR~OPN z9JrF%Zs#}v^=1cAtFCyniZ+yr(728{GPzd~(J(=f0+Q=#+>vbi5jsa9he~ zBk_h6hb}20!Z8Ge9F0&p1}XwnEN>&6q5-8G_n?H<&>3souS#2d%hB6JXkY*6-uwiu zY#`bZUB@*nF-WKM2qu-@>b+4x@eo@fH7;@I_D$>k;SC*jWBY-9iYBjkI|$R+7_bqY z?cIDf5nNKEiK7p5#*R@&yL%-rhmni|Sjy8&&>>N+cfdvaYNmr647&hIW{^jUKnG#? zMt~5!P#5SVPvWkm-B>Ce_Ia~C8l@-c8n0ft zHg=M>{sqyI`qLey*g@heybU{fEGcS!i5Is0^+p6&=KtE8O=N-TPpI<97MZM8siy1& z!ucueT;|>K7ZNT`?z;JR+wq)c!7I0CH$Xl3-kaUMa@i1Ye|UF)dUtnm@7}$A>$z`! z^e*si{LVeScylp1KRcg{&!<7%clVPYei*;GbI&KI6Zg##K@a{+V?c{XodE<+7 z@AMvZ-KBr`$NqT9@vE)bYQ0JS*c;=wOHNs`{K}6Ue;%)5zLa#t`_vN+%%0<}w+eS$Yg-h;ssP2c~;d)9c3 z+!3Cfhhr8Tej+6B6^0R=>cg0WM0Et2^a%_ma4FXJJi273WuHexFGF3vmhUl}aFfJC zQ)73a5yBP7WB|ViM2kC4PkNKI$A$s9TZA$avYdh2F7T4_W`?^Vf0FEzz(r)F5F&+r z9=$>`MvNRU$s^`lP@Y?vyBG~r2IWgkGD%9nZ%~s*ilQjxQuuuNf%~&;f?*Mr`Xk0j z60_7$h_Q`oCxXiB^qqW_E}XG2 zc*J!XY6SWdSDgYdF}D&GZjtEHUqQs+kqz~$mOHo+G|6J)mhx4lp2ou+PUa#tEinf= z`z3HzPw}X4WWR}3*xQITT5I3jIHM(bsk7H52oTqMn0kJ&d`DP5CxpWz==Kf_75BsN zoQB{Xo*3UB3Eb27OMi{`IaqFRBfY~E8Y#Na*3HWEI7ivd(|8$#`9s7ZShI=kj zdZXLv!Ik@to;`|u*C%HVUOQ+F#5uqqb(VH+SiQE{x5=4okZUqs;Y}B(=tIYXJ5V4_ zSGcemO|#pg3ULhSY6i}P+ry62#CZUzDQpHV-;s^(ud!PDi_3GIn!!nP`EH8SVm#E+ zySxb8?sZJ`-qwu>_y#FO2x`1s!iO_vB&R;I1OsshIn;V4+@U7FIY1pGymUIp zN0R)~1a~`f^}p-jOwBM2an9lpD~I$EIbP%3J$*NTlQyW$FM_apls}eKGf^AYxCYI^ za5$7tXMknw8DEQ<;t%NRJXdYz=V**iTU`xrLi8QP8(Mv%?Ehs%?8oKm>`7;bJ{O2fWqj}u`O_JL5J~p^GR!6zpwqtQ zSj|qaCEU$<43xa#-Wp^#u&))HXWS7gTR_N%$<9M)(LI&kcc(su(xkOB$mZSO&Nnmi zs5kuWVme-Zt>E3h7vE@c3)+_V(i{G?s@326i0$F*exse9W^el`-xd_N{Zb>=Mlx=A z;>u^)zLJ7I%PW#NupnQ(Tpp@sH*(1AXK*mLN-bEy6iP`R<`^jF1)ZAUmhXOa(X_or z(knS_O4)xMD7igMy5Fple50M5V6Y&4@?2|l)B5qo|1d)`?(%Vd0hv!(;X6)LqVdKj zdUvK&xh3AH>@ms2?2&n?-31Jj(#gin!6U@^rR82#$)rX$L+QJ7q8^b1y2Qo0= zD~xZEIC?kAXf6kNQ0t9d{>BbtkQ!&~R>^({7^g6jK^j;&I+Y_y=qKalcrx2i{!4`x zWU9F!r>p`5M46iLo|fuuh#VOr<6$i?JIae-o6^YaHt%^Dk&uTn;~fA!%!NP&r6xkY z4*@SLkX}K&tG2sS4F(EzXXVMq36%OHo*38_Mx3XRe}Xosc!!hTh7$YgVB?$F)W){J zZ)n?@h*sj-1wWtV*M7mD!#%5IAQrY`=#D9N+u6>DuqxhRCkmPNXBBck1f=vCFf(F5 zXIqOEW?|49I_SLdMf8ivmG(houz`2cHs#k$n!sy)U+V|Q<}$E~cc@IoH)#1^{%!LA zPS4JNIREkD;>VNZ@4=s^CvSgv`i7d-pG1{ilESk6!)f|MO2@{nvl; zFJArY|MBkCKmMQQtK~m`|7!Yw|JAGi_P_66{qf)Vum0EH{@Yjopy*%mcThL|x2PM{`JIFgu>9q# z-#_Djf+F!rG>F~^+~Rvcqv%zfIx44LP)X3M-@W<={44!Ub^nTc^?UsK*ZBP}@Gn99 z6-s~4zXZH0`u90~B5LA&iEsy_6VaHaFrY1h5#NXoF^+^i;tBo!hZ4RMB~(AjtN34p zKahpu-U@C~yMo_>sy_hpAHY?j;SaC=9$Fy`RO9#jUp_ujF3SEMLlCrpB1z6D|jL(pdJY*@i)~HbO*IW`R`Z;{t};m4V=^-)g#%V ze$uzU;qQWrLLP-=(f5BSYtlE8D3UN5rTB;t4uMfnP4XFh+x=f51ENnvvlz#J$dnKV z=zo8M7XAU~Az7#2h!52Nzv9|K9|T?W8T?PojKAjk;m|xK^^qZiD z%EU~ge~HJt_c00a*W3dd3!2IFKf)=-lBf)7i(i7j#P9KW5|kuoPxNd2TL2wk5B`nn z&@a@Y_%Dz(;t17=##`uth&Gys!Q7>P1OCvjL>c`jT8ra|O5)Jb_hg@hZXxUeby537 zTkxys4N)Md4EhxHQnVZYd)MzmzUY(wBZ(lYNhW{Ca!UV-5-N?b$0-(EjZ0hbJ*qFh z1^gEp<98H#b9q8HYoch8TUXzHp|kLf^k|F2QydMmUm~h#1_#|h0hdl$Cc;DmWQq*L z<7;jYDPLW@n*(o9DFT@5QNtB=<7CT|%q;O$IOI9>j$Qk+?U=Gq?8MhFZ>WqP%tj<6 z1ZNi_6i`P){KALaJYf=)$3>n(4Orx93tER8Oc9MN7*?cb4l+7N9Q;Tr)I(3BosBdp z)Y9Mk&?{@KgLc%_=W`#?8WbdYtDqQpB2p-&Qgxf_$y+{9X<=iL+#hF^CyI~K=81+r zk513R;Om?&*HgW0swao4=2eDQ#UhrkQi!3k5(d9L4F!~Aco3RRak5YXVSG8h(mSC+ z5PnrPifl#zByJ;2v)2&_w@YtMr7kAOuw&V@l1dTlfwBgoE&y+&f>QlBY@5$wO89Eu zkyI9|bXHpD(%j-37)NSd+*gQeOe2>8wIawU0)>IAxt8Htxxkfr8l)nTHjv^2nK9La zYbwvWfE4MxBVHH_?)u1^V@irL(6wc^vY2~Ok9NXa-<2~+hQwXIojCXXj)*B=MLp7b zln_sz;z!yy(Ag`tNO|3@wRlF0mkm?Rt_-_EYd;XLqX>0+kdD%5NmpyZ$OuO95Y^1e zFe@!ubSeFT?*>K(P;&nq7&ur#aFv}R(BoBJ5K&orfaH>rN3D_#A^H;QkrGt8*GfQ$ zr28(3Rv3k}z*vPYLm#OKy^bIty}>X5co9RDV1;)kjys7*_ib zo}XyLeRiUj7@(5i1f9nmE6xI=hDl5=JSZ6Gh~&g7Nk7Er1Az!f2$Y%)h9lmQ;zUQ% zjbA;=0X2IkzLAMsl=^~r4jHzuR6St~DnSS)iBC?_qXfk)K0C*)I;qI%gvR4UQPjK8 z6&X{exfx&hWG5d^oepWQgbnNjnbU)0@)V9xo7hI1+!1x$1M6p z=VSALIu=;@nMrU6T9kMwZTAGxN`TR1ksVWl3T^%r2b6%ZNiEy&scj>E&H2Kh@Ok?0 zvIYjq=eZ-8YsTzhrnX`aqCSLZcY+KS{iyx8dW(@8XtOlAVRfZuW8MQvFYu~C z1`dQY0ZHQ_#_Pl+iRtE$QPnm|#FgAulnCE<&c?<-kySy9&s-{FCQ4EN!$F5rtAfpe z+@w@RFdl3QRyL!==oeVso-327&MA>A*HmHvZnetv{6%kuM;QfERa0-`h556?abxLO;3b+58+@Isve^}$PY6;<=no#&I0o8&ydYBsfbLA|_$ z<^@&LY0UGhrIVMZYc(jW5Lb$42{9|Jnh>>kO}8CR1V&t*9H<(_}F11RGPiS5=ArMTH$Ci>)~sP!n2Ip$@8VZzFt;1`N9F zCGy;#CP)5-H6)K;e40`8BehuH!rxFBWGLU*zr56Vrc#C+V?^uR3fT+xr0`#GR1^C7 zC}T>CVLemj92GP5yB||BBI+^yvl-LdLqDQ4Njj92thj`xQi4d^qN;~p-{L8#AcO5J za5X6P@Ylx^(gcMEc^XoUr?vzMpPZCCxh1LIGVa&?3@u75k6E436%jy|ZU|%cSokg$ zc8AYE5Nucypw*m;TZDxa?1Cms$3cvTO2!?w)u5M$cI*f3{AS2kr23c3d^o?9!qDv}9H`ywTkd z?~Idltr69Pj6dVmYW!6j8Qb;7f1=mr`TgXaoQ;|Ez2)MoJxyF@!V;g$Uy>1#e_HY2N z6(9H#qH04V+3=2Un+ETqo=`+nrb#S$O9Ag65rdHG{27&; zoudG^WVD~p-kiCE3n4YklPhoOuQv4d7hYXE2+gvwDzzC&rCFDBSA^M^OG_-6cYX!QgMeEU{R5l4kK(Ty8q zA^hZi^|zYo-J|2~=FxN49A@T1FZ7^JKQ>KqI3*xbSK_M=2YPFPR!art>=0MkdupXpBRvpWvhw0plgV440cD+!rLQau+Tu;D4J|!n0 z9;AQRJi6X$g&lgx!uYCCSR>`KQ-0nx*p1Eo2RQu7S}v%tZ^Qm}5Z>M>t)Fu{q`ZFeW{67NH{>eb>EtE(bnvFcS~7F8`2wVW+q;RTP(wGlQ`AR4WBikX`0%P|LqAgC9qb&q~c8sZD^gG5> zh=vLRDo$fZu$h64^xY1D4YIkU=#)h(2!QI{Q$&q|7)6y;&v;LFJL5gg*?@{2RMd3s zCDsbP#GzYM41elqa1?ICv)gebo(Ln zphljIeBV~1=?<9qJP?r}DRcyeb$=9|izDakpyt`-E;EM^71Dl59gvk-KOq(o4_1ui z81_(_m{dRN^W*&UO@@-@eQy2!PELRn)D`4{6gdh+rWk8jh*(bqr~;^>3%vB`pynzJ=CK5>YEioq^j8Ia{65$@&fm0uHF)`k zvpfVY>zEIY?T;cvkuNRsed}-~mwLa8kR_e5xpXC}lu{<#=7m&+#VSZbcWORO!nqq% zDn%IjO>;2?rG+SB!xCow2$>x#EJP5ESLig24OhIh5JlwR%=95FDh7`GFSGEm(qa^W zmof`3OA0{)M`Q+476`!9QHtP?I83>EnRLV=utT2frLMDC*hx(u$18WU8qYRs%@QX) z3D<~)BuPkzAfhpTiu6>IK?=Qp|c8UQPR8B(8uq?&(WBKeK$KW77s!jg1&QBaT#E|MjN=AN82biL8-^cvdbJN)mpu5EbTR zhK@A|s7g0~VKtg&w?!4=&8Mq18k&X9H5<*o#(7Zsy|X^6GHJYA!wl}u`B&2D4R==OEZ@NK*; zJsZzwfAWgjXlZt1U^(rk)*20xESk@&c-7LnhBGkxj;SI4%hY(B&8I7GQQX$h=nuO( zcsyEsTKJ!-CL{x&{_1JGNsnM#8@7h#plfxtxj&xL0es6}HNO;g#?~yo-)0L3z(CYV^W}~A?sfM&lA)F%zPOd0+HQO{A zExT)Ff!4fm7l8F!hS3{#jAF3O_#w@<9y+D>bkLav6C~pB|IS;b;rg20>-Ty?y@!cu zj(W|@i_aKUA9I9fPR_qc71ii#gMO!LI?hm=EpVq~Hod&aOpW#SZarDemXPI`?gK20 zxlUWR>VqXE2|Up3R;OpTo4rJrJ#>`bf5NB;HmB8IW1u;`=8#%W0J2WG$CIR# z*X{CRF@EyW+;X&*33b~`wwMAGi$@C7&^2e+u^QH(n{8AK(8QmD=6vXeW;jE$VYeJ@ zMA@S*&*Q^m_IXCVxqRK~Eg{CQ+kFoc2LDXwbNo194f{4+bBu=8a{BrJ^kj(%WHaES z51EM|P0i@_njK>>%tDH8tl6dwCiyG^#msIGJ5JLaLP;$)-ePn4&YZ0g-2;6Ej-yMY z5-#6OG3P;X@A4u7?r0sW)wJ8X5dq(P#UuyRc)6S-ks%{F^(Px>%y)4}r`2!R2prO` zZ*-%3dGWy>B-VqZ#w+_P!rIe%-HzTGIK4=T_$$^S;{|3wsJoz9njx6k&@fTjg8?My z^LT}Kz#pgsD-Umh)Ax%89?AQ(90LK;Y)$7OV6&yQ2gb0kZO1k{JwYzU18xdx(dcBW_S%DX)97{+D8FRu^@okt zu-|QPJ)g?6?f%djSZ2Rv8eECXzf#So47wjWkfA|WqMJ}Tn`7H-&0eqHZw@=6FW5Wk zI#h_RL;Ize_(Q+fHTqq)n01|nfDz}=Ik5GHZR;e#y3Uqlhdy!BTsWh;%pxfERG;2;po|RD5Y-(jAJPZo zhk2c@-nSa9o)ru{mJMB>(g&kw4%1&@_udT#P$LriBNg#7&L26o9lPDLbW;okvz004 zp|~gL1oDQiL0CJDrkqwhBHY;p)nmF?khmZ_N`PF=6-%b^Vl6|!t{)1T;1{ua^Cf70(Eb3uRC zF$ad-7xe!^rQ9kjFzzrn9rY;*Z)j%Efcej@GtJydq5h!3iC#l06H>eQn}0nKMR8KF z*V5ZYU&jhfg)BbYEDsx_&OEGqoLWN`t15UzNK z`nqj2+b~k80B&-rT$lqapekG$bo>25-x6AxRWc7NPYZ58Px6wKG__`<;h0uW_J}2_!{M+mCP=bhvXeZoc%k?h?|bIwxQJOWjUCH&Orb-V@jR8e>-;AV3$rdZxUmrj zpCXa9wU&Whoz9+{i2vMu0UnUP%TMVhhI-TN$JH*A!{fnY6p0hFmkane9ycD)@Y2$(7G2)en5pz4tA0=M29mDB$;d-LhSP)s-d-P|M$LNAT6ELk6AQhuBZW~y;}LfKVd*`4LX7g+;(IjF+aEo=7OT&b~VEq zGz|D*q8Y^`^33KYn7xdS>5No!Y8a^}k)(As6O^{~u2A=pyyhY1b{IRi9W}v!rV)3$ z9n0+Wh1TV%${#F7JVs1x)FLD1W+N5GRg#GNSf5(WrXiI}IZX`DI3wAP$j)Lnu=-i; zp6&>J6A_ok4wh=Bnpqq%Ce?|kvx%OdExT(r`%UZ#ser37l04-Wu`Ozm`NRd0CXJ{_ zHrB*rQ0*bCBw@O8&mx|raEfWkGc;-!D#s?A_*d*Of+^Mzzm^*(Mpx^@cc8c77^V6w z3)})z!83yS7I7=;6jxyydB}JUGGWa4h(tzOUGH+GnUbDL)`JGr;Luf%frl-`8UR% zVwIo|Ba<^010rHXAHDD+P1g`6U$@ncX%{9W>P?IlyomA0F*)3K7N@A&+;^tEypI`? zO0dh)40C9<;jLhaxhA3u6{+Arp2&!ja(RnEGiSNu(OB@%2#;WrbC%Y_^u^XOwp(JZ zFhj)VUV&AS{0OfA^N&$*31eXHMw5eoW69w5#EfNbCn#(hTE}s8qiqSBvwS=l6^|QJ z!04GDT)=-urA!dd9j?LzG5V-CT!kTa5zuhLG-2dA4m=laI>FL)RpKKlV6o-Feb0hS?SyL*@nZkv}3PF+I^>^AL08GM+VwA6MbWF#N{YZ2FUbi~eLaV1xyI z`sUCFYX!!46A^D=9qe^mw%imj_n7XOU`I5w6z~Uki@7d@U&S48MpQ%s$IbAVF`mf2 z=PArW7)?(GyL=NTe9-K6aR4XwMciQ~ilKQ*i`jfZt#S)o%yfu^9J1x_R>l2m*CY%N46!UOm}N6m7*i#S3DzLNg-f0auTh!v(@dX7YJ8WmO@T)OWh$luqcQz|Z=I%Chd)f}hXwYro*n zkr?&0M!P*kB!k#aeP4=)4)qZvC*l#MPk<*FD*&ELJk_EtNX%5`t`-`=Tq?9jYGR5X zRrUcqc?0nf2v0-KTL_J7;Y8ON3U2_H^UR;n@Qd9Bf91}w@?bR+Q$;KhDwJ?V1=Cuz z%FTQsD!6_Aa~UUmFl_hDE<#PH4inCGnEI5i{gs);79uO{j-fm9v_BY~X!3HugFQ)X zX7gNqRv|NAK*m)??B|4_Fe$OZEKD>MaDtka>ENIy8VVi-bs6HQ4HX&Uii|hf@};-P zT!*I|uYJ6_acvfZNklld<9)}0J3-hxqfn3-INGqr4TWH=VpEeMQ3*76>E{uPWSPHF z3|ct=YY3il{1NO+#jFq7i!6xtP-{4ih6%q^*oPfQfX7;81h^uP0Jp%bVrE2cponv< zCZcJ{l{eu4fb2dZ1lo2hwmtj~=E>^#hH-q^u?JFk&;s*=RXsJD>qh{y&;n-Pv4VC7H4nEB+A>` zPZm8YZMU7b)G98137NV&xztChmwdDz>5dP9+@|^xEAhTeyd{MWi)&}Gl57{_h3Wpq z%Ceo4g{L?lJJAtjrKxs7^dN#u^&?%J>P)&g+oMd4bhpwKvV9XZ&UWk3S#C$pa_K)S zBKs`!n4hGjh{*HZh&<0F@;sNw^CBY83y3@~BJzzYk@9}o)teNV;qO_JqN4OThb39E zxCl2$UE`{$-!$D}qti5QG`cmaFUPCR6C(M=<=it{e|3p;nlk%bDnWcvzIUv*^c;FT z*_KE|Y&?3CPtJISix_z9896|2Zk*AQBI~pH^B>rJeV*$LAO)-plv>gEw$nD)oBg_bVLnL(i#(5T$_ zB4L2&;fL$Z3ineqDv@6^?7!Br&OY~UH(wA3gQP^z_z5b$Nz2}XFObpg&mD$@6;Nu# z_hSgNAx2CK_h+2(=8-R{PC=a|3h|0=W;g<^y4Q%r3FvR8`3=7Sks7f!^pCeXu%w{R z=RxZmT6PAo7_<-K8mmxOqs?r-&Q6m3bylKnG5JGP%X&Yi5HfQVi3G{=A-&i9Xf&N0 zdpK|%+z+~GUR@(!3D1Cyz#w$FJ=GKt^7?0a8*$-}uKp=%4Ck%YiECjo2RFucg&W=* ztmASqzVep-YIE%^XmB&#(vjULgj{d@Cly9uUuSHoa;$$M7a%%f-aR~e^JU+kZs(qA zU-VJi9^lI7z-YRz#@Y0Migc*Fep+Qwe%xa+$psCwN!*3j@^h1fV%w7Uj;}XkY4cv= z0>7FqX6S7U8f7vPYj!9(f?v#iRilpNag=->Nf;?$-PLlk+Pry*K@fBXedg(^L?BuD zsjkxWu^gS#x`4(oZG)hylFZ)vDt4c2ywP6?{>D@Y{zp07qQi_MACPKW#9A{ z-X0wx6c87E@@ao0dteayWWTNuj^|2#l+2}k;U^yo@jq5Sluj|Ec?&gE#@=h(Th__g zkLDXO_`PpljX&$_wYMTaD=$Z|Z5#${SQn>f=k7rJ`Lvx?!57GOpJNr!47S(9?Phq7 z9reUpuN4H8jV)%;`pSDi?jdjG!J1M#d4NeH_}kY%isiuo63jAmO8CA`+l^P3RC=rT zMo9USSB%GH<}(;l%|)i+BCT$)AG}FD9xk4t02A=!O$is5bk|iVK)wexlLRLF@;Cm(pZ6ig$m~Ly?l9O6{4E;;8DX65 z9g>?!!%oRak~{y5LC7ehoQdkVXwnE^X{4&jKsg-})p`e9Ass#BT-pUtnv9ePlt2fZ z35hag1|0)0)U9OhS4c}dLFaBPr4=p`WkoS&JsXo?LUQFHiOvF^+bRb+xkob_eC7O$ zJST}|f%;5KzEE!2{U9p?VpsquE2`>VaX!EvYWYf6o|ie2Y%NR`%0_4jOe75uhQKpj z1r#RzRELPA`BVo=r~Ry=E1m39)|Wf=jjDk0PD+~Dc^=TxQ7&BVY4F*H_Z*ak-Vq`B z(;GO@Xq{Q7caKK?*pw zCJMOa;3f0&@^X&B<5>Y;&NT;lmCD;M=bWRL^UguS!E*dn{HyMvu<6&!@n-TE7;lB_ zrpjT2K?P|y$gXPqREd(dSBkBxx9wK(-7ROl673^&@K(RF^}$U=FDuAN5<{6^p{2sj zh^lojLL~~e!KBh}d{XZfo13g+S60ltugNNQ<$aMj!(m4u5?`zBXQi?oxv{OBz%X0P zrWAKjt>(k!VOPMHFqZ=F9ZrmQb^Xx_b4H6yl5VwdUONBz*zF=>X(xAM*0o58(r4Yu zLmqC06J6ju)j>3=;`kNyBg3EJLb`FqL9l{+1pb%Y-4oi)cgv=R<-=_A7%`Gn$L$UghJ|sd@D0(tjRS!=Gan ztXD8>k`k(!rv%cx>t?MUD%1l{51cr!H>>Rg(^biW!@lMtGOvp@%Je39_Xh~v;1Q5o zBB!|$No?bJYa&v5UmE;-Jq(s3_FRMsxM;7ni@WDnpQv)3|k^vNpIin58a#Kr{emTcCl}zJ zz6wYi5k%vSAFHE=qCH+s=@}_fWVXM)!}F^Qcm^j0{^poZ>T zo0aF)UeBa+xZYaxbJuL96xlFR`E)(n=G8|G`3{=ryXM&gSg)sL>nZE8?mfA5>LVN4 zj$h-6Z!AC0J7qeYebT$5>-x2pC@`h5->(lMNqmb}n!UuD)kM#`uQziAE<3VzY7wk3 zcEBJy3m3xl1Rq(g&kFTfElw5wKk3Qs;ocoxudnUrLSJ01mn!rUE2RGTlgFo%wJ7B) zB^;`x{FS#UhY|%rQ6x#6l?U~wF-4g9!5I!B)Yz3q{-b;+TZX>sP(;yhV3c08&|_QV zKP&cL6+skHby#ngI6(<`nC{(S+vZ5TfTJlfI&{mD+g~uz5v|&rJ<$!G;Hm}P|Azo4 z3xj(Wc3xo+?BB^N3m{n!xQaC{ZhIp}zeM&^g-O{@ z6((grRhX3hRAE~7)5QU>lzlF)Wxtkv@^Qq&`&FFm3E2;VT=NWs!$uEKR7%WC)jM41 z>$!+>>5IOmme+cxl)F<(jSd~@)t4C(5woFG{W9jLr~1@0!5&_K$q)GA5ejjwQOjj! zcN*+EzY4iLNCMJl;p{+#FG)$HN1o-Os^ z-&(U|SoS`fu&es;ujImNqgfyRsU7}Z`F^dG3Y3yvi&5nr5_yJvRi7c#(H(DKb3Bao zbu3TgmwU@J2}r_BdoK zUQFg{$e#&faRo#^MdW_O^NUKI?dsyvTN2<1Jq#OOjboG^vEe07(e>@dm+#bx*L^r~ z;5oL)c3$bJM#-QEP`*PGRKGQ%-(;ms4ZK(>f0H$kXzCtGr|2OXkrnV9dClmZj>OAB z+Rxl3RUY9blyvovR6L&k5w92B&%8OuT36^%dQt;gwC7LgesOpKm_i6-{wZ=rJu4Lz zu8Jv&Ehov!Z7#~pbU=5VFdF!iX+BD$xTi%6UPZ5Kr&Y#jRXkcXvog#old{`X#sOhG z^9+a;1sIk~(i3TIlJZ}V`Dqn*wz&7p^9l1Ya$ed$x^#^&a0d9BTUB2 z@np79%TWbkvx)Ippu_fG@IGk#Zs7gmtxRu@x9Ia<_nOS{_f{k{_FHtOh~b$wMS|vFb$K{{)Vg-azR&hyq3<4bY_GO2Q_t)rn1y6MS>Qw?Pv!)iM+%I zY*mD}=gqFD)Aih{o?A7yz@y@%NIbLfPM7=OAx$(k|tVljc1w)qQUwwR8$Z$-IBI=aCgX=$B24^kr#7BDoF0OR;2a z(9Ev$X(sb&=AUoW43jSQoC6`wY>|JuA=q|c*P!tB=bdec=9RpK`9}t2CmRXm$C%-K z@P=8NK7KiD+rsnV`S(g^u~6>ydlSO)&Y3Bhqtl$sKKyP+&Bl^A>8ys%VIx@_0T;iC z{=ssdm-;})A_t@$KsQmtQbnYca*;Mmh@7P8uu4UkEZ<6@6?5pYy%w7-ddx&gm)_65 zcq-wM_j7-&983A&(OK7e;xA!Gk5{YlS8Ze<7Sn&CcgvfL4Nk8!PpfBtVbeSVDAtNZ z6U)s?EBESWT4UUCm_oGV*|)@w0_VTNywB2_{YAEr3m!E_v9|UCArlL4Bi=wQeN`E1 z36Jg4h5-za+Z!A?-)$dU?~8orcCGLxY-q_xXjU50Qtj{;{mRsnUGjakcq*|oTe*m_ zntXBb+wpw6Gt^w> zw6CCO?ti9N1nV~#cF_@gzc}#Z-qAaIEo@A%;h>vg4R~?l_rcEG0Zf}GcRstDi5iL0 zk!y`?lTD|m@fTOV5LmmHb1r$qMCb6_7@rclr0k4B1^`uHP|z;Hi9sd3O-_mI0*p!2rH%ITsU@$F z8n@%s4TAHyzA0{}p1ps+89&_WSGGR5(KPe@xmF0$%mrzdfwXc#T4f+sE{IhI66DKH z_N8405@Zrig4kssL4M&RNT&=WNF1C5>6U@?bGzR!0~zFk49Y-o4?Y(Nzn6pM%YdVo zN`a&2%K?5bZ!KRI9KBQ;96eti@Oyb{`7+_?rBdPO`Er5Z%UjEr4M#7P4oA}l& z-9YadKNVsMip!D2sW0eayh;_akn}=aVU2QBVMg<$=5chlLMp>N{~5qixeU0KOLtIM zMsfkc<>VF+>q=7nC0;c@{_S0MZ{v>C1h&a;5j@K+g778D2etQLXehn#8z<Qm^F*BWrCJfAw+D;SQX!AYXO!0-UZI##{G2=}^K%?pITkke>NX1- z_G|Vh8cT(}6fp5c6wtO4jL98(SpTW?D(U;i`-TO#)GA1vTH#?@kMBMA=?({;pC@bW z1I~8*&+F^WYPNV7ZD#XzmKE1JoFAD@u!$Y=)wdYh#MddBQblhWX6+fb4m1 zoxb6>o|tSixkWH#{kCyPSI*#C{Z177Yzq%qW1-DKC@w@Rp0K| z@}vKmvR~wFsZ+k*HL5OsIER(%vg4s@ti_D3J$)sfK6R}py-rDhBYK?HpJvO?D#N~+ zVTu&Er8X-{4~D|D=%jo+TX>xBw)c58Q=+?FF1^)6P0UF}KCU$FCv3kg{6DKd{J6^b z^$|II=KjO~&)#={M^Sz4&+I0223U$njYx+;8W2RyZhBAXsK~OZMAA$FqJS$XRxE&` zC<0=kC@LsY1jT{~C@P>JB1Hs2Q7oXM$p1a(&g{;%kZkxpzwdkgpO22oX6Jp+IrrXk z&u!-xWLtB~%Fr#cCmD&XKhd$6T(ZWb4o`};B7qqa4V2l+Bx@3WO|ncupJ6G=B8R9A z0jv2_+!XyE6Op$@bUEHXO)bb){}5Y}OZ&bVw+A zqR=pxw{x|PExNbeKC9+!r2NCWlivDfqWAn*j}Z~#B7sK%3JCXNtpeTT3*b9aw%+rJ{o+TWA@KnV4H&1x{jmpY8XmDO=R@Q(#Yu3Plxz>ot+yVH>HrN_E zAYwpvcvyJ0Ej&m2?%=%aL4#}&S=R9E&}?f&1nub>G&s^aFgr9SH`g{GJU28C-yMo|xIv`}Q`iJq2vMLJ-bH=J8m9bz&T`wPtL?M->*z=at51&Zhzrz6tzF1z( zcf`SP++|TxR)L*E*yU4J&9@!ZS`8_x`)-jMa%;z3N~-&^5JNo}LupLJQT1v>@pvPf z=gO;lgTKHz&#L(r{2anyYbC|O)qJfqC(BxnWGPshE~Mlwld=1%TGLIas3^5wvdHo) z3v#gMj6`7aM*X!aq1Fej<_yv*i1v9%$iRUEgMvas2Ze+T!Vf{?8%ff|i?Wm|Pn5SL zMgF^{$@BYHroHsk7i+t8AO7ytuUbego79)+Z)5hikeW;4pME)Is9%$E)nBD#{Loj{ zepCP7sJYZHyP&XZUcTcG4e*^wZr?LY&CUG1{6fd~b|f05=?2HI{Db3rXeru1W4lXI zQi@Ug)%AP1QyibCF03y-f2)u0l~*~wH?Xxq`bBB%_?>=m@aAMWJ`a5(K3=@N6z*vzt${4!fnP&_^4vU&GM zu0E^9EaUIFVe%`t$&ws~0&FJP8%~iQiZ@DaM>Vxyyx7(rC`Ot9tTOhi@2*8xWUMVeKA!?95q(BFI#ajU1|=WTh45E zrprEcY5Wj%<`v|{O~l>tVY$8U$s`r zE~}u_l|=%#$=TEfrsuB99C+udi-xJ~P51bXJIRK;Si%7B{Qm2nlGvolMNQ@JqW%cX zHXZTX0Fc%J`*3E~rdQutH16Yz&7Y~?r_HUV@BJ1QF}kfRpG~mq!otv}2mCgCg7x$aJzg)asi?ZXQFvl-|5m{S|lKFnr6^FFsZIM?X`8#(tL;xj6>CI;_)z#SgcL zn0EN%H4$T`9y5JV9jI?P%S&^!MfWHQE2HFv8y@X*=G63errq@Rj}_0Gw$>TfYReJr z?#a%Nu9&vxv$T7AEX*wZ^R;fKkL!+Ii2zHO`AEQU91eRYp1*iX=sQUYbn z&(2JLU{hZ2{$H$I-*NDBqfVM4udIupVGL^Sx;m=Y{v}%vjs9z*&2Xxh>8|#50gYtP zs-&I^W-kuCeQwIs(w-ZaRhp86`~sa=QAA!rG+#rrN4{#htE>57|3Ozr?HK-yslI=; z6cJFdsQ0Z#Z(7uK{jP)WtorfSRj-G=XlgUiFEN406C$j8{##iMMlQN)LH*~FH~*8L zmtb0awZEX$o*2`X|L(6z4=wytIkz}?`mgQ#n|_P*3sbG4p$vLMjD6VPd0Fl5Ip6rv z$5zj}-t>%rpwK=)r+^_}{pIDazL~HtJ~rTkSMF#$DZupaXussFn1pdOBd#temLspZ zb!C^W&GvU6Ga<%weX?JO5V8`(M8>=?|H*gq?&>}C=Qj?<4SVF-FHFXp{KYKBxQ~3u zlS@n2T>I(k0S9BcEo!=P$4OK2IDa8=1d$<|E8~7mvQ4b2D7`7;8e8@mQ_*;TA+?Be zZ?lq@-ktf^FJHa-MOx-{k6bWa%<>BoLyK}%$~&4qaZS>Sc~9Q(ZPUl!Z}HJPrh|S< zS(Yopl%&KV+Xl_PW$w!leH~FaaL`+(p4om$N$othVzTg^^NSx@aZB6%i=KEU=cA#= zPp6n3%<&5}8*?6_7G>NzcE*`^hP4mhk?>Z|KTQXlX8VVT-i^yUIRDjyTN;1ZVtVuB zi`NGasWScHH(rqlrO%ZAvSCZgRKvJNA0Vl%MC9&N+qoYP1`?=)s9Y+I_d_ ziwST1^8C#^O%?tD7T%USr4-prSntEXT=V6i@c23HdMsG8_sy;8rYHRaEh;LnLV{Zn z?Jo@Izx2b|=Z1XKGP1>v^r7oa%B_B>UYr#k!cvZDeg4V)KdzhFveVf7n?KkXV_N1P zU|DH4GtBtM|*VYSM~DNKTV_j2DOz}6^k;G*9`qT_t*3HK7=y8y0!Q@ZfBl zJqza^H5(4?Y8R3H%DywEd#Cw@iB#M?L>M^>)?G8zmrYhPWMYrXzv8Q{x0)9ZF?vUUP|3P{MS2X z|7L12-%m*at4%=s)j#)*&<$&TH1>Trto&k7L(?bzf}+`@iHc@Fb5GTqjZMLS9Sd4= zbVBl+Nv0p_fU3>x+@3#GmYPraqDi-T&*z{2yu$Qx9YBlKdV1F0#BjQ0<%tDb65lU5 z6i{Z`=`ZMH=SXA7GynAcAUo^l=wI)?df&zO_L;t1U>*z%(6GSPufSl4dl^|_-Fc!t!GAj_KqpiUrh2V zrI^rWQ5%l_^38qe|HLLocKr23V%n#suIv01wWKgNj3I9xHu3&~oX72h`ahOaFXXMM zre4)URy)~HSWtu=PmKHJW@AXR-Hl&7FsbQhk;nREnR?a%7jt_!U&gr7b7faN7La)A zwm;^UCQNPpoau*+ewv^XyQ(LvLy$+?r?ot_K4j9n^FrHP-}*OG_FH~}V%@PIM-*1# zybFh#e4k*txAMZ^hjN=NGTri#pP<<^H^kciIC0Ckv9@k6KhfoiPDOvew9C}3daL@L zZi1kWQFrpbR{3{LU)b)m{dfG`<=!2yn7-ZNr=+M>n)>&@*8kJn{^)t%cW-T7vZ(%w zVW!Ye{RE{|PpoT9Vhb$aT6yg4QQf0Y4+!mHTVZHpy2D@C5}PLK(;-K{JhtziY2QE7 ztV#DPH{N0z>n~;BrbvaApXx>)(BkJheP zE0qTiDm>HSgQ&tTrZdO{O@|q8-Zjkh#0fu9QT#Tf zBVk!joId{UgAb(NhzFHJuF(}UYy zZ`tX>RMXD4Oe=r$Q`VyFDXe{#?d5GvkGyWQ{Z;ni%%2uLVmj*4s3}^wwEFEt8X#k3okB z<`xgy-DTnvlQw1?>G8t0`!bSDE$DE$=={M7kzjRB__R~X5 zTkokBwb~96%QRR3$2{7&_CqD(~MX$T;y^?{e%b(pb zyy4IL4$tfRwP{-&U@?zqwP~Z-o9E58KN#5QnUY5*rToxhVPlhWum5IXD{zgztN!77 zszuvI>h1>7yU$S6apS`b`!s`G#r3eQ#%BldH{ljy&Jz|{v zMby{z|84nOzyec59bg^%rvUuXiUP}m=J|i7jQJ_oo_*r5X+Rx-r@#zYQUh$yV`<~3 zZtpKo?KSlDxIGOTnFiJYmaHpavzIJ<{idl~q_)zNRh@G?-Dw(B2Uvm1t>TtvmTx>; zQ20|;i^Ma98Exm9uCD`b?gYjh)?{Ji_?xu(R7J<;J_Q!j{A&7?;4{#uM^ z0DIquO&*$m=)QyX!j8Y6{?e7}O}*;?OZ(_>Ya3wK?(FsOnWa+uk6R4xwyEf;W~M%M zfGsE~&zqbB)K`~$scgRat{Bso^Df>|d~mj@Zyiw8tp$L6Z)m$U_k3}5%lpe`Zp<4s zXNoDfF0hm7kPJ}!)xR!yNYg35f4-yhollQHy~Wh84yX*u^|Euo+dYo-OEdN^C_232 zinFUt=O6OF9!#cv?P|AjVe-nQr_P>!+xF3-%!ap3pJ00NVgG??Gfb8UZI{2<;l9_q zWu?5(uwA?HqnGV6^{j&(rZ}tEo)y1zc=Kev&5{3x%}yRVbB!si4s8rBm9}A`*mmEV z*!HSLf4_D|(CVv#4z*usy83zl&7j@H2;4p8OUiyWEO{lOXkW{5zb`hMy3_&J(P8aA zl~G~1@4&13&fOwcJ^jtKrh_l~FD*Q^=(8a1#V)7bOg{B#8_Ui+&gCDd*lg-w7wc9a z?K(hzh+KQ%*=rjO+dHH~dDKmvTbov`sEf2}i7n~A?`X#_<~?TlWKGD0SB}j!y;cWQ z_!@^B~P&C0}wG9O%dVp#i)m8LayfJD{GwH4vy2Y^@1OUZbv!L0|!UlZG?>)x-1&F;bZ&t%z66LmmdH7 z^%pnpKho3GVx|8jHidJ80`-&Ye#|`3GivGSUd@8meK@V2sa;)A3rn(9Y1g$0iL7_S ziDfJEX7B9~yKcFu{bj&queEgo#G6qA=)|5b&}hCGfktI31R9b- ziqiqaCz#_h5)&+O(dMY|;g!Yw$gx#Lg{L7>p$GpmqB1us9FOuGHF6n6fD2W?R2^Va zqB$`$AvrZBCIyJeHh|z!iKIMH;qkdy{3sK@rrFBCU{ew8_h2V9p+2LcX6R4{q*^jF z(o+-6c^L5N6{|;YEK=VXrh6kIHN%n|9h(ws#_22l8-eu3V)cz%Uv}CuG(9>lJtjIP z3Foh3Qgp^M&>P)b3**VJ=-x<(PmIZoPD?Py`1<++-Pfa&&FS%}NolER7PI~oNz{OX z;-~?9kzQ2S*t8LNWa#j&B>ESa-toR>2c!C85xNg zY0(++E;u5qzdMXh9MkGLmH`q?p$wYreKaY5#Rtu|9-laW>|=L~F}+#`SR9L^9t5y0 zD!cBxxPITwLpFc4YS;Y0&rPq?0hUhr3E1@apLqSJSEcWNGmPy#Gcc}?DPpVtHAWne zhp<}?U3b&k-yYAI_jvBN2W&TeVH)xgqxwAyM-!$c#oEsPu_9y>hj)T8HNuX1_l`La zMJ@UK-Z@LcKj?q(!y%^emzPw3vWGT~z4XidN5(84Kd<P4w(5;p2hYdV`yJ^j3p%4QSR-!@1i0hkdeY8{a#FNkN z{5kzO)9aUo0qZ5|2CVpI7m|xw^G{>2Crjk<`*YS_-)_NUrrSQh9K~E-P*j?YYsI+~&P@C6 zZDU6Ey@{v#)ITVf7YnWyWR2gRo+#3F!;Vcv3Ls-j1c;G}s?7QF!hSXF=- zI)Lz)r1)5bzzGa6+3htKjc4m#L(YPPw9L%ZjAWrP63tjFOmCx~^69}bJ_1Vo7&U;O zs#*AZ+DEZz^rt*}6wsrP9^zFt9RE1Q`C-?@OT55FXB2*DvAZi@xoVd@vdd)EE^~DX z#wD23<5E%*GvhMZGCZCrAu%c)Qi|eb)p!n>|I9J7Aahzl_n})EWf2;`D5PaH24+L@ zi~N&-WIL5P-Vw#@Fs`apJSjC*RVwYIvwla%nNw2YqT>^zV_B(e2M{x|sjc*x*W$qE zDnTnEn9^A^gbY1Ff;lZcAub^yL)0fHEbGapW2@AJg+~gvsVqZvEHN?Wq?FjWw79r< zR-<|ru2s&ja7nRQ`43J_S$j4uSwPja3!74vVYp6)0cjc0@fm3;7^Q0kD5|ydT^>Hr{DN@i?&Oj24JYc+{pa+-w&VKG@amQ@GqBG*_QYs+JzF(+K`PB_=gFHa*$G z8dcw>Yf{%;9DJ6JDi%{2u^F+6vFW0&4=3X}UA$NK;agFz3S24J1YC|>5?tqWE`~qk zLUGzkd}kmDK>w*m8c0T(r5Y(mCwY8^ITcc;q$P=3K9XMY$<5VFCq?xp<-h90Wkp2W z^fB>eTf|hXV}>i?d|Jq^4L>%!MqgI#Xt(?+?04%#HNb ze?K}lHZ?gp8sBHrd;5Nb{`-kZDVdpR87byepZM46zaNvDn2?@{hL!3Qf0F+D(b1N~ z^i(u-%&5h4VR#d1*BPhE(U?9=j7>;NijOvjAiG7xfPsS|2ivl6Dkskp9TOWDFDe5s zpI$+R7!^7Z%Y~NcxK&E7qI=14U=VrI^LM zh;s_iD^g3+IZH)qbWSH#ni&aplM|8R&RkH8jWGpSb@n2jw&J8SOb5a&P%(%8;lzxL z%S=v9OiE4=lgmgr#a)@IR6}}gmHJxAU(VM;V$w6yQS>5ARKG3Lx4+|WH?*8LNd3xk zY!$YyWl}&)M*8p(oMNNlk&p0)irgs`U8}MsDJCN}PJDitK93nTqU)F#i_|gJGQuK0 zKji#;r2g}7oS&!aKR@XFJVyWd*Uryx)PH`!@p-HZ{#VY=UGVoiKX<|3r+%Jhao6BW z{a;)-zR>^0g=Me)FD^WL^nY>DWViO0Om_)B*Z;*ug3t7SagpFt{a;)p*rorAiv*vj ze;MUbiXZF$;v&IL{a;)p*rET6iv-*Ce{qq(^b%^(6s~qt^wm!JpqZ4UOAR(l4h#rt zAlW-|8XWu4D`A2gGdGgnC?O6d-f z0yM?ja$_*ar(C~r#ghukN{Xc!^#dj17%DhkMEq=TS5K0nwnfU4@;kjeJhwu7Ys3Uh z#OBa;c*l#w#f!ay@M1DvY_%;C!u{p;VhlE>7FU)gl$BJLI$j+qUVWKfor71~Z;Lca zN?;dP&Q!Rtcy*_i<5g8$TNk|gSbcsK;x=@9br>d0Mi*2}h%I!=J6e!lq&Gjnn?l~^ z^k!@>W}-@}G-Z95s6Kp${gwtu4Z|jCJ5Wj-7B_rk>IiH6u#7b8=%n=UFh{XOwj&2& zuNQ(x2juVR#P7WQpaB++3Z-mrj?GtUk~?H{Ly9{pmWZB4$*}9H&#p2`_Fsk6o6>;u z7#58}wsn*ZD*+>aKo8|3JiBAdPl9(y+A>6!%x>L8dsti0DVSy-mTStR&DWR~0hZ*lHfyX-Y zM3Z-YXLezIn+V7kh5_<6KsxmmXx{?Op|2~PyRL+2Z!YjQ4hP;+;Ay&&RI*~6&ANth zZo)B1Kv4CgmT?8j8*eQ~*I@q{uQun_*Fd}yj#rS*bxa6e(3;Yf;)RYQ@j?Wad=!3R z0ye2gld&HH=?=Ld2)i4JRo{4DvH`!y(nZR`Bz2JMStS&TM4zLp4v_4UEdHc^(i|V& zmn`ev!LLTwui`s_uHV70p5L)Iy8&Wi1DzDUtu0z#nM2H?Qb#TBLt-}YQ%tX_L0&i2 z)K6+EcJCV@_B4nc&0^1Vh+SG`Eq4eWN`g031#hm}H$rYe_6>Ehux5PYoMhQq0CT)Z zSrfC9&KjKq4fc1_S^We$+w;dlpOIHeQkQLQ1LW(P%E}x~CCbh1u2bXx1v=Gpt$z5` zOZ5vL2fbUtOS0Z~K<_6ty%Ekj8cMjg8W`c(P%dvV>WkWY>uGI;_|qYNKdy!oA3+I6 zAr}gyr!pWa!)JHNryl)f^BP!zWfXFb6Bg`K0K^Z0cqK|h zrivsha~ZLs#3~8{JBEA-tCq@LhDInv$^Jf^3;y>FVRjCZq!w(<$22(XbGOp|qZ*>c z0|7wDiit9IpgqB8xwj(yWA$j1=RAQs8ABt=XK23sf-@}$5kq1?S* zD_;U)3r)d+qHt$U1jL(wKtF}YI}G8q3ag3KxeCWxI0(?Hup|oLeWX;hp8=Mr!rK{( z5)@)@hMPzZutbCtAzbNXQJ8_E7C(x#i}rUhz0jVU)=tLq+8i8EsJ!60r(04gEU`#RA72-3^l_HEC=RkXwI1A z2ahvm^#!4dDZ(*fy|JPsz9YP1{EWc@y7liFteRHfkP-!(NWqLO>e+4Rl7RGL1s+=g zCtATN4bDfsb)Y4RYBEbL+Mpmt>r)A|Ge9$On>x*CzFUCcZRK^L}w~Jj8mLS0kfB2dIJU?4KTk7i(w4P#lS{4 zTYY1W@liZsR6Igv$v#O?O`Hm<;h;iy0q6OfphDpkRf*#9MN_kKsuC=nrh(-Nu%Mfh zWvT(Pa#qy}yCZ9&R&*TIe7>#`N*Ds=2tZC1@IMgz7Kak&1ahLSyr#f3+EgK@3CO3X z1F~LENovhSa2PwasV#Wq^H#HNyIl`a>JFFfc*XtNg9DsWZ)7SpYbSi z;UfIBf*vO!kE|RKQiXa*h5HO$M$l)w^N7+e;M>mu{AYk4f)TWlk#(R)8FX^>>F3o^ zbbx`7?K1>!)?DD82QF1x`GLhG;txRML8>zA zX#q%@+)yWftw;)rD=jq->MrS0P12PD^vx#$S{A04^a_^rN=;IqxbD&lX!|MwymbM9 zp8~Kp^d~uGrMr;UcV_#`RJ+#;DV}`_Qk;MkJV!z;OXkuDW?^~=VM0B#)4Q8(jb^ru z0=L6L;PwmGn@vFW2c)Qj9vS_C>25LsYu_wD`#b~C(E!yVcQQ1EmgV7UbA5@pX>R8WR#Ves-%>o_mZNX(?tDOVD@+km* zqTa`-4``zLf_0ZwAlv0u+(}>mGH^?QtI0}IV(Lbfl`rh5&ZM(?swPzg-qWuD&p1dg z=ORX2qRHtE(p^S@YHuMh*SreMzQELEB8 zTs7Qv4-E1tJxUQ*1>B`YSb^lO7m}JL1A8D?j<1GxR4+9R8aLUg@q)@u_n@(~$ zE$&kG2?F(lw}CnbsOc1HvYi?0TgLj8v8Sia^=WQI(Q&v9$KM!79hQY@DU?-jY*J^))<;nqgF{FJk9PAa;iZ7`hEPo7Ra>zDNi6Zm2*ze zNfkaIC*k4{SHLs@IR66x%0pDZ0tWoU0f_Sj#gjZCGowd}zvv|#DgeiAC20Xj6R+|R z2K?Ir$Y;j90n(jTny$kI()1lb%DYy~x5#t^&7l0_K%%2$H3SOW3805HAUc_5P(}-< zT1_;<7fOk#f*`}4l6{}(POkVEU`GHpp4!Q>2T=lUV>8kJZw3u~Y&7nQ7l*wZ4JCuaJ-xu} zvlo~Tnk6ZM)=8b1$}RyHo9i16x4L1&kG^#O5}*lR0Q4|GsXgmKKNXZHV~ zE@}jNZU40Jo;=dKKB;N&w$-0KmTixCE6@=lmF*)E4M; zq|%`LatR9VYz##62lD42NhkcYKtK;h3( z@qXh!@qV{>NwSbUSfHl%Cm$hGDc1^|2sa#WK~Mt>^B>)HB-^4y{L9R0hqAtF)|uwVWI*na>! zo@~y=r&xroBHa|?SwZ2eXJB0j@7qrb5Yt8cJU>B_vdB|Y>ocCCIVr;uJjg;uY9E+I zLs9U^%2QJK8-0KsBm>c?R#Tec&P{ZN*4!eL)_`O%Zw(sW!VQichCN6?&NBk?H60{* z9_(Hcig&f9*(O5ytg4D!v$~RcgC!O#b_f~N{+(Kr94H4tO!L+3f=UB`c>$PR$&z!q zJO0NNknWyz;3Z(q#~t!6L!f~muO~<&ZBo!J?WZEPS9fMqx1qs4p6-k)OyXu~luKEV z2CKMPYnox_ky8*_;f(eo3=Nn`m=j&=AWT+02=fPov9FfkWeiu$hM`F&gVJ5d6hap= zWlyT$#SN#!an@DxIH{uC(y&ZqU!9`P&Nw||IH2IW1YoEqpuRVw&g1>w+<6QYsBbg{ zYEh~>9%NJj*oOggN^mjeWLs6awYY?%G*A3Anlq=sfZ9b*8GC3l1oUkmtJ$waz{vcD5QZYyfprVzjIOOg0I86^_8=f>( z>xD$$xd#~~E1>&~J%mT}L03vUgjd&PD1;C@ zz3{&-9fAE6usc$_r4V0MK4(}Id;xE)aJLDHJJDjH(Nd_zBHB(kez5Q+0W3bY3X+>+ z^IH23C}2NG*s6)X(|}!DpO<2GZ+-@f4||oGK7MC&YdZ#NU9(9g#N}kA6t4+x9zD>G}a{G_bUJBWfkGa{DXX zRzi62TCHbXAaMHi2hLL9@VvFtGtLB%tV|Vfq3&?*esNA8_KQyo%oQQP{1%uzXU&)b zE=nEJc}`jDug2Al=(dRw-M8TY%)fyLUj`#DMSMq#5@IHteuN!;uKc+V6K@ls(+2?b zC4l-ICW3Qe=n*4X(~+J-_1>t2YlQl91_AgN0HZ_4riStSeiZpg zm)9|L(7PCS|M;l@dp-eR$HuGvk&0KQLXjr`Rep>fN;VVlay>4jcB2_?!A4Q6*Skbc zVPZaNYSyWM@PtmJp3Xn(fvfe+`viDy8o)OIoP9IR>BtJ9 z19C(`PL;cn2vRpZS0xNj2gttwNkJcM;91dD6on`g83|s#q6Cxj7)ra@9Bw6+>jieF zz@?)j-XO%75t1D%#b@3&c?RgM5!;~Z|M0jL}Dbiz~k8D)(v zv9fStGoqV#PGCp486=}$dQTvijs)^7ASbFlUeQxjZ|>COEwU_9@IHm-JEQ{e>5ao4vBh@hWO)yY&(9k?SzWe8IQNFIi>4~c^Hx|z(cw= zRw-7>Wm&9v7D%_@H*Zqa<6Y60QpRJqwEgihP-aLTE=}InwjKp2qPS+WnJa8rn9p!) z;Yl<;j;C2dn*2or|3(y4&l`ahl&@_IdI|_y5ARZgJbQQH9_>d3&YYWoGX*$W?@mru zR(ie$Q|r4TbxU6M*u(=MsIpleeIx(T4WM3+QL$uBT{Hq$%1B$e2` zOS-6aNj(J9o?@CF+Y1r(Te#zdFr+8wLn!PzBHH$pqIY5dz#XgaqFKrS8`86IDSdhs?ubuAZ**D^^XE3+;I<>-TT<$x~JB%~X5J0Noai6ERi_Xh}1 z;iuQm-B}h+U|r|lSF*Pe$Z1o7dqnl=lur0g@9cNRDuTMce_fp_P)qbYPj$;$)xbpd$^!44u^2M@`%KNQN!>SKaV)qrkS^2kgbbW&`SAFEVU4jtiH0>NqBmmjty%v&RKi#zVk* zw+ik4IBhejPx~Q^yyQVfGd_%Ln?}k2YM}g`21>qZP-Hx%D4#Sihek3_kaV02lDltH zdo+?#RstBLET_D}hGhx262XKdMX@xo2FacfD7Vi8O8wjUpaLeJ8!`aSxp_sv(3wwS z@SY;c{-l8D_BbG(0t81pEC|UVD@_T!Sx1#~69jso&9h$SwO3P&s7h2r&y zXYhIxY@f&aD~8b>s(oGm{u1$i46gsP--`Ds#*vgx{640My$aw`JC+K7ip2mp4FFoh zmz2&7P+FFoT~H1~y4%s!1TP4P$R&UXzC$xX7luI8Q8A%LufO;#Uf<++y{qrn-Awqr zppROL_mAU!p+Pr(KR>qutAC#S*t?`IiMnh>S}vg4JO`*aJ1PV%(9-I+OpDi8mSWI? z$t7hTZN(C2u_SZJsGE;o7FfT$2rSE;YWp7z09onFFr~g=;OX^1uLz)J%K&6|1?ta0 zxRx53ZgHjv>*}1N!ChZe`^eDj5Obu2htIA{( zne>rI(qjxglrTK0yLEMujy}S(>jY4UHL0W=Gd;E{ zPwBB`&N31ydt8rW?H9le-vIEwnH*W8eUUk6YlStQqCp>MJ}mBy<%nQuwiYa5cX1aU zASq-B3~ysls(Bv1j5dYn3RG8&n+2HkCcs_c z!#*&Cz7oD8Ku4|v=+$?l5U~P=WDTNrkacB+icFi$buBQ9#iC8-(iF%Rfpu^ruzmzq z1r^pL$-o7#977k$k&w>-K_3YrDTNv%*l!lF4{QeP`dQ96hyo5-`9{E29|!4+pZBkg z7MS^O12ga*b+v<|4%!PRi->0XJ1jBMC>2+f(M&eZ_7!Afbk5nQ%?U{5<>gGRGXUdx zZrb2Q8(`jQ3lpJZI|jx*4@uHhnD~&_gF#lhy<07hkK+k(`2;ie(4j9S7lXsb$YX^&)~I*2mgHH>tBSHp3awVlh*WD@(wMkd zGv&2lg^W_rvv!FRB4NtDIg_RT4zl1mSOZ9HE6H2&C#*R#SxIrOdBg-;@kDD?Nu@cK zIC8BO6Og{ZlK{C$5vh>UI-Zof}S->^0hM()JGsvXwODAfU-7To1ZhDhkso3o8mr3#;H0 zP}Ee&$(fc!HIfl~OFDPtGJd$R0e$B}NebmiWPlfp6dguNN(x6q0^=27kg#UJ_z8!I zuzL*N*2)-`Lh7**FUKH{mikLcnSdIO6?;db8p@B7+J%Lg(h@))ELQi`HsD?KHb#rb zeJ$RRC@TwlQ(^QG0;zs0ApNKziT(IRZgQp4#m+(wW)F3*cyR4My zCfNpo^kN$z%?A?i9UcuNyPI4Ig(X>+7Ho@Z`zrvqNfWFU;O^E5<^#%2vUdek{FQ); zepZ#NE1(WClob_fRBl;8Ue)jlWR$W@Ld?%o`s_xATjJxamekaY7>hM2Ei+ZCEY@_Y zDRkmA2$PRNqPBfT6ca#Ur9LF@LA1@2;E7&un5%#DZJyRzy}xS=Vq4R=s6Y$ z%{O4m5OVWFOWPBIsoZ4^A#R%czO;>W2581uTWaXq_p0FK%QE<79>HrWKI;U zGU>mAUyZKRl zox-NxvU1(0)UMDVqKA(dMs#8qqli95zi@^a15m%^OlM65DAgCOWjO1y7uIP5z+BkLL$<$#{G6c?H z)>F8PuyG*xe4TdK>k)>)`$&9OGC8TJv{3UAW9W72(O-oy1I5cXSn+b?dW5X^J|W4n zfdr7}(nEP#1BxlDh{FseBkC zH%CJu?~RNl+<|he0m+7TfW@_BQCeevMnws=V=Zn-&P_1g@JMyw%nNzR~7U%+KQJIV@E6sPS#T`>p6jO%K z7QOgzB<`nq4-R%b;@PYA#g%tE`dWP7O{T5z&SuTj{!#nt|rDo z2rv-=if@sUDU?KujDW2s2%wmm0NM;7o>t51DJ!iQi}zI42n#E5D%Kr$0joJq6CsY1 zt^4|V(4eBAEj9EV_}?! z=R%14K0)1Hg!u=f@$YW(13l%3AWVA}M)d2KNftf-XM#U%KKMV|B}vyHxHg0Z%VYyt z>GdBV7t3#OozQ-_V1Mfgut$F?N!LMl!?hawfV#8mReglK1_ogZK=uj9l2Lbz-=p3b z{-OsNT2@ABoHP;PDD`4YWfx~V3*NnOu^6UT>r0{598B5Uw|oxHC%90dn3GPKt1%6? z<>gvvq6U$hCA*^1RyfL5#@j!fqnVKvwtR{`EyIRcZlK!a=< znp0`|J)O!8{F=M3ibAy2%!)FL$l)e%5!Q`N8d*HCxMVUqQVKRlVxu2D)INkF#rxXB zW|SoH61|y+GgX5#Ksfq9{*FQCBH>~6u+^S6=(h^m#o}xkQX^t2LNfe;85-#?dMFKb zS`JOBxt?^;B4K0_<^^;bpZK4m@#C*Rm!meB&JF<$}%j;l0HIctUBmq(m2q20ORO7y>*6eBYBMWokgg< zXy5-9)cEWxp7JuvKSFR>d7H)0to*Nwf64ydKHzPL|KR~u{O?)(cUgQ`KPfgNFCFQQ zE@^#QF}HARrrJFHKWg(Hn3A)1{aWG#juga9{0QD)%Wi5cAF%LA#gj@V=7wBS@M@|} zW*t?~{DSvtleh&c+yxb|o0e+7P+>c(uv4c(XsuP?%|~i6jPzFrH4fD2;EVtrRX^o@ z={E<0g{ z;v?uL-{MXfev}%6LDVF2M^aQx{b;QXQU8*L@RYcQn(Id)XhB|T-%yMf?KdBlq?y+|&fiU*~5bgkiNQT$J=gaEIUd`<%+0W7YG`81A4PI)K7~<1_e%T>VE%;87;wWl( ziU!m)=#<03DJxwCbA*T3;<&C0J#hZ5HGLc0LS+v>!9`#QV0s?Z>tyK8GNf`ID;~P& z>=zxUP1?~o$|&O3;ok%Ebzt&%WjU#&^k9%^oFlCTkbDwA2Q{FT4Ah%}D5UT_;&m};qmcS&5QE&_cO2hDvO@qg6#&7%0U#FuA~WFtVYJfH+~OQh0g|0d*lHiv zn(gL?r?G!X#1DZO2lEZ`VDQSypz7J3lWn9xE26H;)YpB#LxMe!fR5rDXlhTsmc<}p zFz?1j;1=O#NlP3$A#D&uqFhl|QRd;|82jKK#PG?;m5CeIDJ()FJ)BM+FNFfL@RXoh zBrQppdY(l>PFo8ZI>?QRafBjQ!X9tkT$ShiU`;v%`zBm0WB(D-+ux>cF3>rF$V$*0 zn}J*nvbM1%QE6@lrK*XlrJcJM6|_6)fhB@QSo?kW49CC*`DZrB2;VTGj%evOy9tb; zje)Tj7}y(UFp|%gyU~Nh!ScL7%czA=p-lmJ+b=Fc-RK*}t58=fz<383ZbFebvNB$v z4fZ0GSG3of18wE6?3t0uhcWU5Mx+-EU)J7i0!-y^E{YKt{E0UhucEx#5*QnS;iedg zBP)fz(Rj-ZB~C?6?IlX?k=DQ(|GVlXgkvuj2wpmT?1t8+ppkD3mrK;T(;U_Ye2c-C zKz%k%!0Y?$O2O>A&(_hSNnEHk{qhc=?|zOaqYMG;2i#?t=G%TkeXZ_yAq&>3OB+o0 zqD=ooEjVr=TxMi&S-FFWM`Ip1cSH$h195-2H)n)kUHv0ZY^Y8tn1u1+thG4XOEBdT zn%ncbK*nz%V<{C70_x7#fg(M`65h!Y4#Ryq@nt1N|1}X$b%lsC{)F%P67JAY52eta zgv_A_1t>E0@@g1(H_Mz_V#{%zV0AO?aEmn^;~>E&4iJW>241F$OOOo z9p~$DoI$?UO9Xn9j{1qNqYMrwkJk__igaf{$V+ad5;QScH{2CJCY?iI?YgRf)-0t zaO%fu&VBa?aNistOOwb~@wkh|II8x?E-8iRU3o>7slTl`b;M{;uK{&AQ9H+;!tlpy zK<(O<9j!U_?i)beFc97EQCd-Mys@{;{IqFGrhP7AS(!F`h_&TZ>ScL>nN1`_?1Yli zf)3X*62YQ-<=|cqE%ao~1&w|bf@UH~OdeH@M>w)1aw&@LRx9I1>Pn5kUt3#5^E^dV zxMFBNU=}x*d26lQj+;kM0iz9NJy5WE=U%y~qXgRNn#;f8Nf5VbA!8>b*S2}J$QB;yi19QEqPqEcIw zqIe@xu?=fP>agEk*fE~6vU7p0{;avJ5?+J=Ijv-l>kM4asElM~088N+)wqknvykqA z4P^M8WYD6lT17HvmO-Q)5XpYC0qq2bsRMYCg##L%GiN(BJ&l0j4SLW-ml(Iu)P{j3 z8)OQ~Wb)`Td1U$7Z}E5z55r6J)2H+}LXYq1@gqGH`W>4yk)nv|hFG-8q#ax36%PIM z{eiPn$ro#VSFVNN_qL&WhaI>}7<8|0Mmen3Gs+?QY4IB=YHsK`eywSR)C$4xX|v5A>>&KQgcFD1LZGoCnZ{TbvN z-yZUPEG4!!Ggymq|&^?3QF`%wvAS%SxVkV`&9kBfL1vN2z1D58f_hNl!2TUk^( zoOc}t$9j59 zCsk*#zW0;9lj#Zw-Z(<`8`6y#XM6?5)}6pO!BE)R5EKM1qZuYN#^GUL!Xj`Ph_xZH zHhCG3K&HO;S%XwBnRYE#(PI&@E~W?72$_s5&nEu4^yr5fQQ3k=y=eL=4G%*GJ?O@I z16>(!pu67+tB zqO;6t1q`H_k(4qjBsY1Dn&Ao$P2pdWz(&71WDQOe z6y}zf*AWSA%B7J3wbWKnX71WGCc5r2s?Akvw`wss%~dK|?~+q6*D08bUF>qqy2}b> z6h}ma+)UyWMLBN{GW$5(;G#pU!%;ZOolYQ8xf@Mf&+~r(Vap(y24%8w%`+hE2tK(t z3SU;}{O4t%)+T5KJ9_XI%zpAmuwM&ythX8hob1P(B2cc_%OZkf=F6F$_Jok)wVxox z9grfHr07iCtLSmaDFvN@g%s#J>s|)pa2d6cKv4!m&*10x!O!P5h2>WZ!ic&OYKuxD zs%P_KEYnC3%fEp5G>9o5zsyEg?p@59TIxm|9f#Y>#6Bo- z`arH}bj=S=5nEBY5k=I+$dvU)p9XxiU_SXPn3sZ?j-$$g^dTlKr-6B0IrZ7N#|Xw* zzkzY5$|xz6G!_~ilvykALF0#lAM3)T;2^8v8yfo$7MLZsk?4V!`I|tTjU}Z=4BRR52YQH^} z;-OG4eOairp}FSBJ{Rn-{{i+Fz|M}$$$kX9stDBgd2u0rY43C)hXnuBzrcSI{Om%6 z&J>S;(A|a9n$R&bqU9(QUc`WL9Xs*9=fQ2dTJ<9PNMnVVtoSaRC^e?kk+@7e#zN+*hrsp)D_Y3&$BM znBV^g%uTzh?n{t9z@*;XSFJhq?kh|%+Ae@`pvovIwbv+E^`%t|Q5ZIDKsV zK1xk+TQ7*McAk)|K;jG)oZxmLXX238YM2gZh{c7h$~<4ejfkSWoOZTc$xLHtW_D>0 zS=^;`;vQ7ROgdD3Cx~RF1Jjk~! zB8#HO7$Q`<3fkh_DVK|PQ2=<)f;S$#^_i3|{*>vqPD6WQCROF@>A`|1BUlFQGNsyT zj{whRaK^PT!!Qi7tgh!`UlB4*QVO~LVZwu3@WP|>YZb)!LQES2Wo2B0|y8th4zX>jjm-RsDvqFl!_yLAjzsA5hcSgTr0M#X`w zB(a3g+9CngC}G%LxPjJwTQ3YhmtiR>pdkdIduL@wF^gI@kfh-fW>b8NffbIxv0UX< z#kH>GB$Cti$gMP7NVB>XqzMm})kNRVGJ#7lthON^e#d9Coqq*4+ZS5{e<|?!3N&Z4 z?eZq+^On#j3$qg5G^&;p?N+;|ncVma!FRR|_;!L%YqxY2wfqek^DsTm6Qi<8@cM8U ze$f7O1!&K@(|+!t{flWo5VXGBg&({p+Jd(eaxt^JU|s39Y?-dOHjs5?QdK@g57uAV zA!I16^y;xLDFSVg(Gsz}B24~#JIIg#83w{rkgFsy45x_l2YQ?(MuneI)wro@sZo6s z9MtTl-WB9>2aw+la&}XswydzRqpEXLm*hfIVJ+EBsa0!9M^Hr|Up2caLB-W6s?vv> zss#<)luFaL6KHM*jpnA@N|o!fs82E)5e^nrY-4 z2MO}uK}t@f$CWWdz|ZIl_;A3}KvYsJ8eYYOlFD*haZb6lJh$|ccv$gL@!AIiZ>$3^ zTEojPE2%7{ixa$xc3G|}3zC~)Ax)_DI*D;N#NaDjXyQoZS zP$AL!evs%>FA~LS64B*f|8arPXjOqW_lH332Y8yOhy_w>sudlMITq7+YPJ-F!&Yp) z;fuekkBdb&3oj_PP^*=DTPRoVLSdBmLLfsPWZ+nwEB6%}s9s0l>1Zuhcz%|l1oJVX zZ?BUKfA?n@z7;aOJQ_0eiPy{U7Ryk|GN5e{Jy()C3!+|CR2w}o4;;?nl{X7@e4}^M-9?Ee>t$I0b;m&qLZ3HUOiED68Y$kT;|$& zQO=n=je~+{A<^5DA<-O7BASa5>r~1qO(Jie=&}n0PoxU;{uBsw(2GDVH|o6rd7=a# zp2&wu)OC*XiX5}q-4ksN;mUoZFv>?&kfA5??mIovCa}xOS1vM;Dn)O@4W1I^yLR*XA}!NpbIr?}0v7(VI$SzpZNd?g~T(VIZ~P?2gs%1tL9Co<&&=5eIs z)MnQ&Nr&;8TV~R41XIptFue(;0knCL^JBilOdm5-Sq{w_)tm;41THJ@mzV=`Hfwn0 zQ$nKIZ$qM>V$ItHZqizgm<1qJeU&S>4tLA`9L$#eTjW=3{|?ZTfX=OhE!z(aveJ}! zyjr$eI#0`96ihw0fT;{jPRll6rq;~lY1!&&d|1}kOD>jeEG#?pT}X7mVcB*pM_xf; zp-Tb#LS*COvH?ezhazh(fDaLHK#5jl@@Cf}Q(a80ip_XBSS`4o-~jx@_wWb?$JI1X zWdVh(gfNkCC8BoJhzdo9xpypZ^N|xZiRR5hl_BqgW)x`b8>MZX4Go+lE*iVbR7(t0 zfbw{fz($WOmL-B^$t$cx8au7M)J_^2da1%>31J3pgD@8$Og3~5ptQB}MokKtrBFx= zgqI<183Aj`tfuF5+2nt_AkWzj^3+mTVlHhv45Z|}1{3K|s>-A2F`6C|t5F*WsE;qpQRHg)oixK$uS;jI$26 z)1;7D3MKL#SAS8Xbe3*z-ncPD^%sfYMeH2;1$aA_skVL=6teQ3AaZXkHR6N8)yAUU z`AgeN4Y2WAp=X0H!50rcx){Y6MSSb%Arfl7FPPmcY|WV6D(reexPBi9mx54KSmL2Z zXdTYELB;iNTJ5bFk2b*7k_Npjh~oBxXeWqpghw`fN`*(h$DsVCQo6HLTUFf4ZEL97 zMs|yGd+#f-8OzmjyLk(h+gvsD}nBOp(Zbr zPV$q?y51LSwLPSpegW%Z9W~P;SUVjA>qw1NCRS0Q>r5=6&| zD4;^Eqy4Fll5a66lxz)@*yKey);K#4ZTF0>%*)FyOS2Ut15}xLl$S)G=4w(zlAYPp z2_GQaj|wSrjzWqdkV2e=r+xT1_NrwQz1$)oml|g@Fj7KO z`BQT42ie2ZsQ}TEF26aPefTjU%A?01%I6RTYZJ0e*-&Mr{A)*fh|SW`w(?vrS#EHv zlEcKD!L}{!V#cZ1?||96QZw=7TEMxcz0g7)POaC5z_m^1+CF9M*@vt$__PCB>L-+o z;I8BNd^qHwbr<>?XE0K#ggnl@;6Bt-YY>}^^D(p&>TNm!*k=KYs}p2`6*-Y^6R^>a zE#|&pX_TN(?xEFEbcmeUv1MW*g z;sb*`3sNBbIOtY4P%pgavCxtt%J!{7tH!4Q7XvsR)-3{%ERtF5s~IL)%}J%ty7;~z z==%c*3PBK#SlF=CNkBAei*l*ZPBia(|Cb2d@jn9hW#Cds=q&IT1gb}YyQ7Noc6_QU z?&k%5)M?-!1HLHkR|T#|aXS#ylWXM8-EE=;%&!n~ts2XI5~As3wXj!{@f12rp*rRo zotkhKd6qaeanDZxO$R6!`BQXiLL8l-r?(QR*_n*%1^Tj|fj$}Nt__jSg8w`IFC8o|3YM6f zv5+R1EVQPVSaOg_FK<{bPIQ&$W)%BA@)GLw-JFj1$wq?!&Ow zq733MpbSo-4A>nR$;J(N?;PzG#nB`yvic+EajwI8Qa)(S?;u9~8Jo%Ae*U-!n3cE} zQo8|H+=(;_%lQoAWuJq`EqlEA#GW0*fUjT|sXgX)Cm`)%k(Gb2Oy~}%tqytu(i*aT zs8|<@2>@UZTn4F0NK4VOLJnA*z_O0wzQa1nR(PrY!^N-f5Ptp5rof+ghk9NqhMg|e zOaXq`&rj)xBgg}QljdF6ZWRi|m;wtTomN7K>nIimfSeZ?Gh!+f*Hf;@?ehr)Qq0xohT?M@PI;*zTS-uw6gRcH4M}N5^`_Ak1TMs>1McGS8ka z67gB=6@VEHnC9ppB!$k?xg)6Yj|ajofv|xP><$Dv(<~6I!}<91r2-zB*F}5LORNU- zbS#SwQ120kheO(eXgP>*!JCD@jh+;= zKglVwY9i4SdnlBE3nMtB)f8GKPSvfu5^NzeRE5s4Lian^#P$VsG~}a~aS_7x2s+Z< zYr6+%P4ZWvU}ZZ{mVpvkqm8;_;3q(tRNuffc%^c7Pz;AP66b zev9ap4VRVKsXuZh3DSRvwCPMfyJ?WOG3fy&wTYV(E`!e4MB+R!tZv>=bzajE^eLdH z3T$v5d{^lByA<^wkReHbFx(`JFufC`cmz_|=ktN5X-~uUEKKlXtdG$-W<%#C_^b;( z2GD~~G>aoobaeePi>l99;5aaU@G3|-{w|&uG#L13^HDA@I%0hp&s8Vk@*y$Nr5>%m zQ&?$j7w|6ye<7t;-~I@!z=jfsyD4)3PI`)yEheY4#9@QJye20G_`nPt$QFL#_SpVJotWIzBU=r$N8Q(HU40?_GtAI+?GHt=j_#p3Ao#9&a* z0W~+Xzp0sZ0I4hvPSN3SU(KwR0#GxfeUjRKKJ~Eqzx}}9-+Zm;eUafdF)w53MS6c3Fxl_jS~>Hbm-q-rGY#^eBk5qn>=8 zmrwCJ&&?{d-weFi-RA9t=_P5oQ&&Cp4PsA0MHqNDfS1zpD9YqaxWvx^@G52z`;Vbnptdg ziEOQn7419$4qIglMFJy15pX{bK?Sdg-IRO^2+`mUy%zGR6iy-`35Hx>4BcM~lzT0^93~p`w4WYqK zA{Yz;QLX4uG&c?Jt?yC{+BF_DUY6|Z1jXX(KrsarqK(rTdZzH%#{FW+zaA`094vH{ znpu3ckLpQW+xU8+NWUmhYzGA<8PLX$GKH@;UOm3|!uXX4esdJYDWOBA4~Kgx2Cs#& z)eMTT2erbW!~!srZ#PmsiB~htwt(U$PzW;x^T}PW=LyyQ7dVM>Sxz{j%BjbQhekt$ zyC6c>dvU1+Vkb&YC-X6Dr60@V?KI(kOq{3~h_lOG96n>M(7Ab(fI1>|KOt{HMd3w7 z(J_w|YoNigz-u>~PE=qwW-Da&G%7Nmle8w}RutqF=AcspR9(+WTcUA`vn7_-_|+Al z8XdI`Glx?0HFbeFOk8$=bS)^LIi!KMuSb?HHp8#dCGQWnzYqtFW1zA9UnB&s*P=&L znI_!0Tn#)QGz-%o^(aN2%n9B4(5i4>dc2EN3iaQ^Bk&LB~?$#AYFY)d9=;xM6s zOjw^x*g%;h3>TkQbeWE%qu!y~;a{ZB5+g5E61zm}^|h}$;U&;K|8ZHWLY5#&c}f-5 z_0%fu3sV;cYgEH|bRi-g2+Q89Hm`d-wTgS^W0UZYPGf`Ep|JN>Xb?UhWw+b7tz)Bh zJ(>o*(Nw0Kr=tG9M?X;`Fg8a051^J{pq3y~8*+j2t_wPNZ|H)Du`8WF>qZZ^l71Q1 zF|5YJxE7BFT-;RB@}szm%P@x?3LV{t$4a{V#SIJS3p~KT0-tgZ%ynh~%=HM(lS&Gu z86biG2Nt=uS5G*{daQ7LY*xnx8qGOI(EaH#Qi)WF8>uSL1nBSR(y*^a+st0y<5~{; zocm#fJx{?1>*Q@6>nnFO6@4Jr3rB5`-D-og$x}s;sUpZ!5sX|Bl;y&ZnU^c|g#S%P zoBPE)J-LQPqM;0&2c@?!lqCzz{hlRHe~uo1&_f|bPz{D@sblJzIKzMG9cf=l_U1zN zHy(rRGoIl--Bb46EW6hrN?Yag7DV}o-aMyyUCtOs3yH3r4~YgWat2Y9o>S%w5y~Ex z$6FBf9}}nk6A;JlE)J)MP$=bxmmo@&#Vv?R5$c^KydA*P1yL_@UIi~fR2@=0pqf-0 zMENKqq^0&5L`^3RYTpwUFM!6sL*tqTQD-PIeg*@}pVQ+FBuS{h7LUNsDP2P9 zX*?)?lFy=ZFe)!OEa(wrih@w*E6h`imlv_y;hlvbh@Gy?WqX8E;1yM2uQL;i=M<^z7 z4WjC1K~dapLDT{N3f%lP%(diYm`e?!C_@Sf{6DbBU4y8Dtng(CqHa6{Biy|TMyO2? zte5r5|k^5e?_YTlN`{=6mPVi*BVV#wFyjgat^A#NZ zM;LwK-Md>6=?*7tNfPW!!UV3+J_r+?Fsv=gh+bCwB}_c^dP}7lzJ36%P`eufd!bGS#BneThzqUho%8bv~vl ze8fWgo2>#}N5ux*_ZwKVbb}GJi$_2j-Lk{3bjYcaHZjs9LN;YNn+zn_4x{AGOcd;} zow-`We(&D_`^DcX-WfJJD21l+V$cCJ{X$RmfB(c(uV5-0O@SWLf~I}Gjz#Yrf-C7E z&gSLPiKXgZFc@ja5@GulE5VKo9sP zD?%IkMu)R`-1%M`D8%%9Vb@^71F_FWR|nsY%f1Rnep_eZs053*x&9y+ff8i|hus2G z=8b+y7d)?;jM2`+Xp9!B1S_>CI9jmY*;E{>!bKasrhgNPTL8s@=%R1DnZPu4DSb19zN7LbJ;j4@OmW~% z`mzy~;P6<29po8*P$pzJ;sa%PdeBp+VbEn5^cb9nh@=)K1!R^ZYciN%tr|(e=LBjn zna-vS$~}6@YZI9A98B4XI?O7jZbyz_1)DBo;}i3u?3ufh#~pFG5$RTx$&RhhNS1X5 zy>a`4b9ubyHc`6O(6{S}&zz2lAHu{7SPgyed6;tpCr+^V6R2F0V*+QTq7!bSU`6MW zB)lF*zqONFOK5vO8nC;wf_I`fKra|tF8VB)vPA-rvgsFv6j-mW7Ul*Sny;{}5Vi$kfFHwY0_0WIM*o=0Z@ z&!+;G9uXdz=(q8(ZsX$>JhuENKU>PJKN^on zh7Wdsn9S}EJ0{o-LM_B~M^r_IaCu3ECVFA+g)-m3d3#f8gQP8J9r%5EtABbRwtBZ) zrLjU)1!qtW=2R3AL0tSHHljGs{0;8t`qlK>{v%!j;O-wu(oVnmQs-kvZEmMre=JP6?Z3gGF=TQV;I)vFz$&7W2cqZxaXle=B3Tj(2Wa6c%!Sb6qf43WhUXi5>Wwr4tB zf{ll{CnfqfZ;E$oCk^nzLonOLn9bX@T3l@6T|0+eFwd1%nCyE@^4?S!d_=g5o;^Ju zv%iAb-LBPNqf<}M$R^8}G1y?$_=d}`n!C#>?XK0k=?OpaK1{gZ?Z(N@PM>Na(m5Nl z`D|@Si%;7|3;E_v^g=}wA4Brk?;|y2J1qcY9e@mXgTW8S21{6bgQKcdl&)|Aiz`x- zo0&cNl;ZE}?YWBEa}u_P`SsRO*c~fDg$R3eXh6%W>{O|p5`J3^E!e|2zoqdzcsTI; zW#IQ{aJ{Nm>56)d4{4&8pw@Y)^ymt5OlcDca4Bxi#r@~1XtdY9%64={V?qm(RW9~|7XIV2K-R#sv@65GGT-n zg^>i^%6cWPT4!o8po0Mt&$ZgI$jP`(LR%Osk{IzijJP#Urb^HwjvI;KaAxH}o*vAw z0hc3B##^|5sUGZS9PBj=1}9#XwH8d2jXi>Jne@hRxbD|Ot*^sSo!>KXu{yaVT<(B? zOL7`a7QjP#u)lDy&tWhJE;ijjdH3+J_9nf#ej_OE2rDtSJ6~K_kI7%hPG#4Nh;FsO zg!s)2p{F$q@^&?RcP|2bPXWH=fNqit-A)9@g)YG+7^Q0ROQ?%J@4T-`jNY_xg#D%& z01bTKQW*d=nH@?zU<8rG_A#3osxTzIw*@dg1DI0fk;M81k1ua?Pfw<{Ulu z!Amjs`!V-=he|&QBwM>WN15$otOOAuDqo<`cava&FcOPPm&{(EA^FjAKr-o0OU)9C zi?UJ+BHva|IH;$c3PmDIQIy`HXS{R;W;_rxHURI@`Q#dILlL&~uo7&lQi`E&G$V2FK7q%J#$UZ1`OO(eqKd7GkQF4yw zHJBgH0?cjhwp5n#M;g+&Q0+m02wEf~-Xr!2+RO+H+s|M30H%)vCRhH1?k52aXKov} zn?dF_PdBYOJqIxU12BZS9Z%*a+mvAH7Upf)Y%NaCSw&j8N9XidfA}b7O0csECMi`; zUV@7{u3A5%vio<;S&ey)$2>Twa1Aksvh+Gi;Lve8dMlmnHV%K|_@DBxgC&bpr_0|h zj?5(IZgCK&eG~X+*I>Nc?C~&+C3lr4Soemk+HtNI4hqd8Mh{gY0r;Z;{1VjeMFX{aQi7UbIig;JpfzWz+~3iam~Mq!N7*h|pD8UlyB{X|0%`+rA!nLhHcj_&+;+)=9$AbG*Vi zs(xyz_aK48`nt@)q)=_4ys1pkfSd~?TYX2ThR*mu%)cJ<7e2<@LAIzm8)%I2aUZB+1pxCM z0ONS)n8yNiH;)cVZ?Q^xLr8i9QdCJ`l@LI0=@5W~qImRXg3MmlNAKIDwjCZ6$1>Dy zW_^IvT5_u@nQwWZvIM172u*}vsaR7@Ef6$!o{!#M)%3RDWYAlkLvKtl0==cPBe<9t zBC*2TDio(l%NuEP`$lg9#eJU?H{ehlv)Mp#9eu0UR0yuZ;znz2>(i$wzA1uhIt2vx z8HeClw*i7{-N4(vDjcq)Ox^5xO%)+Mj*zw!tf>vYuBG$+B;6l4q|2mVwQyx_bsq~P zE3!F6HczC+r0Y~*^+jM67brv`uL7xd+B)kHoWjrwdc)A`uZ5kh6Ihy0140jb$T)9U z$>E9dR}dM7NY+9b7VFkTRZexNJVGp=clQ{4&7NJq>GiKJ6L##OdEmJ3(WLw&NqHqm zxv<)TgDt`8r3ecEBJ}#m#k3JA#c-=IShH01FMjJ@Q7dIIA7rBLRewP-Q-VbrZdOU< zM3g!a?nyw(T1W*O9iqlrd5GSz9nQv%-S#kcO!`>GoU$_O8{Cs0@o_&N$8bBiMUfo; zm0;B-6v5`fzKY>d!te+$Qu@$2!1(CTEVURR;Yo5XM2NC(&ys@>k$Z%BFa*Js!cBAM zVsWN4P#h@IlWroF0{wD+)3;U>v}ne1)OjHDFM!Mom!l*3q^(b5%9I4$_x>vWl?Qc; ze>O^|*-XlVsvGgJcowQ&$0Nc6A(A2TAO0ERsSwF9^Huz7FFYa%R!!oNv{WitA&x~h zhsXxGoud*u+76Y2auMW|I%|Am);`ul!isnsx&CQ}2l91X~FH6UU42@*PpxMKk2 zaTUunJWc@`PNH9Hg^J5kv8Oh%T@&JrFM|+w{iRg3TDtf-!PXmgFuHQBeF<`tWMEiK z{khRmwrBEXp_NF~E8%oS>nPtho7oQ2TtAQs@LTNx`w@4)5xc(>B}G;2yArvUyofiY zTVkDo?<`rR{b7|$scUOH-&}8~w@$O7Tk}f2saJmmn|c{G6;)jba&uSpX?Bab-VzcM zLenjYoPskHz)Qi|@GK;IsKQ=X0JI-#(4gP3|3b;Ek_sy?!^-ucHW)`TQw3XPu;tG@ zdP-*=T})cs_E(q0avTOZ zZU>9N>ZA#q;MH4T-3<$8Z_Mpsnk$&}{Ye)6uh&98;6IOZlItI?QHmzrYuj>V#`*qB@4s&XHV7Gsb#mza%_TRuH7dw-%g%2hv z-{5_`gzm8Z*jvvMcJX;mcMqnM2JfE!*lgm1iOV;5A9rFP(d}Eijh?dYdQ7?VZ|nx| zyu8|O$xY85*IMbCQ?luWX8f>BE8=$?@tdv_RmMcSBJe`rs_E~?-va%0fd0S{tE?3g z%35lZUZpwBgqqWU03G(oZuD1Z%-(hbFnhhmtYs}0%(B@M4s}BXvlGHBe4LvWXh;ryj*l{U3C<=wEydnEcv04%(_0{0N(3dZTCvRJ(BCm z_YDnZ`<>RtnS6G&o@z6%sHT?7nJcMBcrML2FcBPHfq+wBMZQE% zm0*1!S|XJ1Va4J+Np{g~L%yPeA!~2La7!^9iqRt07sUo=D-Y_O*w@bd2wIe6nAyyF zQ`bFYCsn(!`de;EpOC9{cZc0?#}pT03S90UvDhKYO0W@AsiqtylxW}dA+3!704T)Q z1!Efxz#j>~qX3}r6%84QZ=b{!4WY=fx3qE{t zkBtP@WIO6TSgzqa^ZS7B%HLXQe>x6+A_!tXAp|1o*JMXW`&Kg=@g}B~-V)N($TSK& zThILQA7JL^Fmo;NQYEc(o}tw!J%bW#VnY~)hFN3!rsrpy#4Yrt^qoWBHN*Nf}N-UPxIhtpWHR^<{&~=jK1l`z60xA4b!4~0aN;S zavxm8Mg$wll%m!W#m_7qo>=Hv}}<^Ex!;p!p=8kNO8kAWN0hC!! zTAGBVLCU!#VF4t;o;!dctOe9Y&mU|7b({v^f`lXl~<0+eZH4ga1#H|}bdQWZiyl6NmqE|DpVLj^^zr?IJ zV^-aJik0dfhItY$e>88D^sM_wZBiRpBKm$tBr zju%${8Ux3FZ>fXs-c?Ns{(src;+!Z9H;!;o_wTp+;ZkK@1`VHvq{h&7;9cLCZ z`9b#hoM^liazh+7Bu7wpTXLMQ5ZWR6<2JS#VAx%2)L$jGPY1TeohI3t38r!SIASGX zKOEs+Az;@6UH&NW`2z4MLf~Iu|5k!I_^y^yL1q{-i_*Z$Q}3agdWRnawzq#8n%&o; zNRZmWm5mF&3e2B>9UgLr$c4xpkd)=!nZ-GU37p$9Z&|M5*;**^dfkj?W))blHfoy81216LK@J5meD+|6~kg|G__k?9V{Ra`Gg%ldO9H z?vnnotSYmk=u%S1=nJBPnXXDv8Q8F)Z{39Df3&3VCpwz+w>W5``*~ebsIPKgMn-rM z9|PjjVl@ExUGrcMyzOC0<|Xn7G@g<$55a*=`NWO7-r(^qG3_@oEmD;&PYJ-z%pgv% z(g8E3bGhR;aY}s`f-a`GNl*F1tuW<(WTkL0{ox!;I{5qywN>|$XT&X+nZ89&r@i1l0 zi4auut5E&QRFwEq0q>fn@V~-c+X2lpUa(WPm;`7gn1M{jSxE&P#~KwL3hY*r-^a7s zLz3UWq6zTg?LmNtg8+H;UDYd0r<0q@bh0)(Jb@G|IltrSVTKgZd5AaSHhIFL*Jwmv zxFZn#5D>lh-JhAMsw|28B-l6$2tKTG)+cnFNz~7qFcu$nEngd z*pTa~+%r5;8uqGMH)!HrvJ+5y0Z?0b9*$;f3+FQDDh59%(Yh7qi|!^O(ar?(+HFOs zLfsRhZoigmqkhirK>gW&2I{XP>L)v>m;Q+^)~h7EoM3lEDi8J*$8P(-igFgJoS_k> z;oYnQsOYjKJu-8EAGrclXY;Xu?p&SE_nTQD(WNh0Y7giTD!~M9U$T#zHE*t{HrbBI zqKu(ZUAq>p*%QOufMIq5ovQ?sNPWY+nPgtigwVQcblPTiHYR)x6H4CsWOk!VFl!ZD zD=g=`gcVgH(^)6%iuYRQe6P`yuG|Zg9`rJ>r*ppl#hh=hRbNEOT-gXSR_!||nZy8i zQug(^mFRILjw1Z31l5&tr$Y9-{u4WTeC7V2#O+_PR1adulij2y=}ITr3*xJmG@1lu zI_R)9yS|bx8J;e=q|%FSTr;%j(wwwr{gd7UQv3o)5x2Zrx-m3qFOr~AL$a&%=a*9- z!u%>^H;!%{c2|>4cH15ZvU|)&b`q#d(0#47Xc4#>gpVt+i=>TceafNV{7=U&Zqc!e zJ>Clv*zGTtT83<29lO|Xph|yTtPEQpIv&3Dz zLtJ9b|s`9W)xB~q1iCp}Zb^{h7e?jRxF3PO|;u2^RoLq*s?~ zR}OsH1MihWl9yeQ?$ES3X)b89_OB9@sIsbFr$WK}7;2Z5D=Egw z|FUDd4EMan`Azg@&YCSc*7e-6i?CzOckenm@+CwutV{Sv@Tps=3}^dBYB$rJNkUp& zDDt<^RukOK_OG6-3cs8s5FK+6AZmJ*m#yy_iF^*t7$R5jk)ZFeg#KsuC&9p|Soiil z`GvN)A3PXio{cd@fbS@DNe^fVMb`{xv{LQ3{jDDB#6vLF{TNGYrPQB|@l?t6s;%Yb z!ch1h&GEWa+err=iap-yHKrh;ZTt^l5?Oci!B*o|f`8jvUXMHBvwefP5$Q0*mOdGg zyqS?4n&|l4mT#T)6x3%z$7Z+guYcc;maPF$a zlir~{?|Njt4D9*JKkRXO*k2xwVRw7oQty^wcm9Tkcnr;(R%Lr~d2Vn|e#3CC)(-XP zomioJ=$mh3Xqlb?Lz-6R`2tAVjN-Y0=Nf>=ioP01Y0$e3v{P4R3#y`{n z#xwu6F)$tlY*{P$aKN)N0^@V{YZ#OH{$y`&?ULGLS4(Z}isa&Sa>K`!H(rd|7fcZ`ZRv+>BYD#HHwiU+CGHMY%kPJii{`;aF^R)~h)>O=yF?aj)a(azj0IbEjVCQ>|F% zZ~uXHX05w-jZQw3F;BUH>vVLTin95*#pdAF3alZL;FEN<@X)g9xhs;HHXN3XhLKz= zGRXpHg$Fcz@ovC3{om3VF=E|CND>eIDdhY*duvEd7@2*9JztjG_$zgq>$RM4DJGow z#y{{KK=l|O?#3^cjennR0PWp)HjNA0_!6;Xz2)O?e5u#<#!G{2n_+xYuk-d5SZBw7 zN^Ly5j9csiZna-~2wAo@rv#YjQ3jZs7EQ?X@#V7}2ln9xsbf)F5df4;@N3v(l zh~XG3k`3g4P`)$uYx8KQge(z|rKQQTS{rd+Ux{&35p;Nv1cw{!(H0)|HXVz@doceM zm|v82o=Pk66aSJ{Zpb?_muo7qpo8>+e#Ze{z<}F`7=QI;d%F)SwP~AqyVvw${yA0l zf=F#vVtZ{B&mI_Bo7=2HES|$;>oA!s#J-C2Y9+pG&xrIux&I?Gk{w)~^XsSq!2cyj9K>v%|yPz32&BJzi!V8xwR(Ob9}BhGd9?VD^vTj z{e36muT_2h{h2}Ne+|tP8{T;wZ7m0x0`-8C^BmCYAo2v%LXiP8IOHSm`YcS&vF(XL(IbvjUeKxyt00E7Ebdsa&p+}k>iDPEu)=mf+GB_<1pzZm{hoy zD8lLuaxM1D^RFQMlyX6yZ>nptxTSM^=2lLx@0#N=)w?E#u8$pwIGfm{4ys^+Hh7KB zem&6E0~qLZ45W=tmVWWwh1G9~rSIj9m4i|CV0ie5b~XA0%UiNL0eNt^mIr?&g}ed^ z(ei)+_P2>bDly33alGwX6um?AafGIib%UUf!?rN=!N9Vg*HyN0V%tdWU%^!wT!}nH zXMLYQJYCDNzmp0Jpu!M=&+xL4q-`|RRgWsv1lUq7Zv@t9$d;tL=} znEsaa5bQK7!6>qjAYv_cdPC)~kFWm#M{{cC+DVKRb87q^hjgAIvBBn%#;*FLCd@yR zFt?9sUz;W2tpvl!esOIZK$J%C_$STPeem`cF4W`v>jaFG$2cLpmSHiD_cj<19!tr? zv)&+zvmeHPKoFnY`#jv z^(sDo$47$v1Vd&PRZ>yLQI0_g>Ev<~uwuLGy)^xvGzJ6@0Ku@+BayWTObUI+3YS#tGgJ{)7L#&MBV66dyu_J_f%Ic29y~FJ6Vi@n=2` zzXp$ajPiBxkzm{>6at&kO%#H~I_z=z20$=x>bMX*!f?~y_((7)hSuLFj3JvMJhoIe zD1oN#60>2luMWSFmcOkL()mGvb2`9j1ue^6!I1=GG3Dng8#4%>?^3<|tv`hMo;CBa zk4+>&WP|6UfH}CkHZ#t&4E6L4t{SSHQ`>CUqw+EiI-Qs6Wjyd<4BHfsFjplSeei0a z?O{F^atqV4k3?u-7JCQBpJkB-{?jL8mRpKvd79hwn(P%P1hq87yB|WWtPq78-C0jf ztt`jf?{bV@%==HpGzU(@&BxoJ&s8q^IS9`h!6rR!F&Nx2XKp%$wtWV#B$x4|G02@{)xs(!PqKiU!nZY}_`o@Uap{(bF0iqNQVC`#aN0MS z4N(#Z$FoHsuGc_3LLg295WC*J<0R|n=WzM-*-m8n_KujS??jh>v!40#b20NS33vHS zmngk_GugNv>4`1>CJn@_^8mzR03pjS$nqIuBOKwLaT8Z71&5QAGBG&pZFqrjJZa!~ zQs7{iOSU1M9}((!~+J7ZV4(*D4JL{lvoW1M`?Jv zGaZbX;-KnKrsgJ4`^_|MR1Ru9#Om8z2ju-3gHusYm}yxw}xUzKMgo`-rAE#`90fxOE!?q#nYwd70`2ZKmVcmeQH^fUi z41{w%SbJU%8~F@|J!_kYs$nqsE@JIrJ`((=fZUAB9SwDRNE;FD-l2g^wx=gII$A{B zuDYr{#(4AS=8O!kg2Y&uBo0^UCn>kj~??cepFpO z?_k0dwWf0{Rak~`u!`-V5AL0*?;>&t!^qfRzHcDsy&1OlP-vkcpW6ze*xU1}^@4Zd zg15n#ur0XY^j87sGCpSDLo9fm!5SwMjc;JM);3UNJIs>zu$O$#eua#) z^~vrQ%+ZT);_5W>S!aEFLkb_S!pG4(DXj*{A&$8kjbh1#YNpm&k@FTuP)=&8|7?Xn z)uGn3jOtW<>O_^ppV7ZRYbn*4U6o6YjAS=R6BKNPH8naNFYUA|U$GSLz}Y*~)jT(J z?=(WDy9haX1`slzxHz1TPm#Q$JMOI(^$)Gg_IKnY5MMi|2B%fe^FzsTjjIc$4(Hb( zYrGeDqQZ|wtmX=r?X6$}WcwROa=F@h&TF^Zug%7_j65OfWJhNzS>M&%-i9|v@usDi zu}9Er06N_$J=xK`rrdC_A0xp%$ww>R#DO>!ILCo#Z|63QVa&KX=pu}pZf{BHQ*r{Z z9laJ>xuTt#AIuKqMg>L%6n-AK;5*;7VQg;eN_DiQx*Ai-uI`RhOLJ!z#$AVTBkJUD z16I)IA)c#8bJ>BFW2DDkQgr5>`DSyzvp{Ci=t;MOjuvA5 zok(e7&k!?WXC50mP+QxbT!h@_u1t4JvSU#yLp&@>bx7{r=~gs4eWtaGDx53?7gwVm zkn{im>@0j4edRltC$kznC<7#ePKo5BcLI*5R(;Gz>GS-Q&Tl~wQTHfRowwL(0f(^k z$-tlX56magk1e)5M+bja=@HBirYmcb|2O!v_&1aNzrmlyzp>QE4a1lVHtS8Ow^^ec zFwM13!oFE&k+H_rq@YgmmwJ#`6PDG}oy}hfUy}r9Og&)ef zINegwNEBpwxg2D-^ewhq~aqnVn6fcKRos4EP8uM^l@0zYDV z61b&!hos>V#g}e}AGXAqpr-=p1g`JRWLldW zS~AV`5JHDmeAIMupU1(((jD#TrO6H;w4p|+ zJ>qJoE$dr4n;Y<>o#aPd(^}H?U7Dvo0M=@$YYa)&bU{TqKC@wHthOPy3bj6&{2HWe zZWvfO)St7}^IknJ+dM&LIj! zlZmTiaE|P}V~lnlRvTBli->8)-=D@W=Oa=@2Hcn*pD?i2@ znSqs~II)?2M|568@jey$i#(TL0Dq8DKAlxG(+TUWD=-4~{ZH}kmiD$qnKZTWS#juWnRF`; z?C0=(T*ZZM>hbp%@OMo89Ng2^D>4nuoyocudVZHSFG^A+%5=7Ow>5NXWka@iJ3#q4 z(1B1gmHUuGWecCJ-2;6Q=8B4be>Q386MTH04@-49gTVwvNuXD`wg>VU3P)m~sz$z< z=A&DWvGvse$X3`w=sH}Gi1yt{y51JALnpm8{^4*#ww zLLftMyG8iLrCidb3AL_g)GshjAqh?)WqI^~c~(GREK@^jMD_mn35>Y<2q~tK>hNV) zV_ZF^Nyg^;m&<2&?UC+EXX;y0$+qrvW>H6bcN)L{3cib|3&9Xc9-RT5#9=RQlGk2D zhWjz@d|bV#;YhZ$)FtbeWKwNQn>$34zXG7d)b~Bq-3m6CX-c*=v^2LZ@=!GV(j)t- zhFpIxpQ|51hCPf1IF|E$LxZpz=x3){vzBUrie4nDWZ%K_@Ia^4BO|!( zTMXc0y|%#DhBP%ivuDO9@}9-E#MDncM9`UROl9ht+Zwvs+v^sm>LIykM+s}24%(%} z74ax+O#(=@hHi15VYrC>@I0XO zI)G%Uf3UF2ju zE37a-T|dL0KsSiM+jlOU2nP>*Hxa%I=}TPCq&kIx1nby4R6!L!BEUZhASMbt0k-bu11_lfE$Ob*@~+lY zS4VR_kM0k+Pin2%-g#jstR!2f-`(Qr#L&CJcx`NMNny;p#ljcw^@(=;z_?gO#W-=XJUCnjCPCYhvR6OJu>Mr~)u0CPN+xDw8C+USN+#_G^ zZ@wh6zYiZ->N2w&7+Ma$u|rtJ(!=F9U*=L`>V%Uc%J_~mo%KyAD8O*`slrbT)NxGm z8FAFRL5`whB_WQYPsa&x9D^yUetQMrc$yD6gE95c6Rx$nC)(_>USnH48pr!ff@Sx6c!`O%H83J3ta`i~laX=^` zgUhR8A8<&#*a2KZrE$&wWAu^z`kmS~Uo)2P9a=Zo1>ZD|&;xRWa?bc6j)4+qNG4dN z$3FR2GB${`4UF9$`aujGz2jl*H=`HL4WsR=+8Dv9ZEolr9nR)^*67#;%j;=H)gtoD z)aE7WDx3fl3Pas1Lp2Ys9XdW29AmLN$P#o!>4pG;pC%12eX_Na1M?I3 zXvs^=pN^Hr4`}_)`RM479-3Dfm3D_J0spx#_X+*+t-gF}1zz?(1$7 zp zbu>3Nry6LccdbaLl1r1#Ep$ieafHckkKyh$Y_h&3ptl`izG-AMqwsTX(iIY_+%U>0 zU}t`$Z*aB8rvDRJlJ*>|57&Y1cc{W(&<*=`FDbJL$7x>PV2i{2u;GU&HH<}h8I!I=N~ZJCG@ zCVG`ky_#|vUTewGDP`=;X0bD=c+3vhJbZyU2r{Ib$kyKMKa=7txLmZIxFsA5ztnyo zxc)J;?FyocIr@Zbj8}|&K1{^Donj=Sp1j`n+pNm=^&=;=wr^2{wcA~}?9SIqZyK+)kgyffqJWJ6RAF$Ah-GTOCK@*KmM5|Me zLsKv?PDxubIL_%D;-h>-YZB1L(bac&#N)lFqxWKRIsW0xbRiA<_iD5FD`IN8EmM>A z^$>}fhEy9QpC^cB!KSnjnjjtyDaK+rIX_87dlCa0M-l@u^(zm(EN^XT>gqyJ%%PAS zq5Ge2a7}YK;7~Hg@Gci$B0SNeR>qJaPRv#LhCm7Eza4)QpHkOFNqz!KWiSi0BSm zW4Tn+g|xWbfXW|S?t^<2o^X~MQ}=st38SN{y}rFALqnvYeOa3as|mogmA$*r)0Si! zyIY__JK<4kRHs9yY=e=LsV9t?PPn0&epH}ZDX=oj;;>U;ybU5>b1;{$9~wHo5Bdvm z4d(L{eim0f#l{`Jqh%LYYvx1W^4rH#K>2Z{w2I_6KhFc#vJ{VwgPY<5XV7E(_&?m= zIEN7=>qCA;Uai7dF?E1L3k@mB zXLD0isD$((N>LBCnCyg$Oy?>ILJ{M+`d9^B9l5DFo1Hf!S&WHC+Hs3)BIqO62~Uj9 z6z~2B8h|<8{TNyM1b+=y~^O$*Oj^f;56(+ip!8bPGR*|ke%V5Pw2_dFD@VX5Yb0T3&#$X6!N2#c?`ZCVpQpt+ zE8qekuITn#sSEXOnZ(1?)R!B{f>bxS=~&?YC9d z^~~0D^r?^H)42K%)UB2@48cyY!xZdD+vIpzsQ+SEth7Lr9UaLPb<9h^I{zYH?Tsv? zWnLHE>SE@YX{7XXJYNs#C>99w$Rh8)gsl^e?V|Qjg-2#%_&Ah%$FquD zb_}DPtK0Y$p@tNEa4_Xt>rx#aCCCB<@1B;I0V)fm2BTTn0rD|g;=ZB>uxy-nRJ;3ZvetIlD;GGB}A)T0BOglem zf25pRs^6e#UT8v5NeM7Oa%DD>WvO$`7&Ugb2*P{g$FwEuBKl3+3)3=`?Pd0itv@lU zWGB#EU>7j#Cej3X_z}f60;DdS!cx?Qcoa2tO8OYXbTWh)x@}1G<_~6`!&64zvbgxObT}OjXR+q^uifs2WfPC zMr0y)={N_&=<8c5>noVs(#U14;^TNe;%e7volOi)sI8-a{REXX6ds^n>)?4F7tpSh ziLn5U7GB2nr0nFsrGfv!h<}sPDjOjjN}?Wy|r5`SYFp1Hi$YgSgsH&Tcoe z&riY((b=X>D^P58r_DXbs~DM!fg~$Xz2DHmyy9?R$)h@pg&;?361Z+R1mKa%6fhX! zVyo*W+x@WcnG>-9FpWTs)_GGi8Jk}6Q0XG-((gG;9%YqCHnE$uZ?t|K-I6JEPRSe` z5lgcpOgtk$w%Ne1MIpBoGh0O&G|6d!T7_aC+L>HBOM$S#`#{b(Rub0x7)FhLSok%K zWIw;|G5p#~khGg|B%^LD20n|p`a25@R?q?}%!KzLrpA~Cu>xglg)MRHd6J{_Xj^Kz zS-{-B!L?{tjXp#ptH%bATjJxH!9=GOdI7gAXh}DumbSt_whVKfO!``@bM0D&)|JY& zLqWu}Wja~=1n_GzIMtaiL#n+~ZPq#+N@B}WpEqN;NVl!mjKA2bgc0i|)mrNKd%!29X1k4kbJk=>rYq>GIvyEQ^O1ws zuoS6Zu&XmDN#%c)WZ~JmL|ok<(#h)th^yb?Gu!LUVm6fg?Gaa1aTKpDZ5I!#1^+Ib z?oa4kg>+}PQxkk9C@ZcO$)KLhg1-O|`ovJYiaQmW+gCEpZCPJ_jr?twu68$f4<0{= zoD^@(>NJ#>*jX6Q{0t_J|5fn3t?;d-+NBEFOGp=sJk+Kg|hU^!RTn4N}ccgQF6}0_zJ?gZ`R5TV+g*)jE-;{E$ z=o#pC0mW==u)l8*x#D)HAjk5sXt;%Lj)lk2rTV7Nj0vLJpU}O&7W=YruD zaQ*94GI*Sgm^#(Os9=%m(6SSqVsP?3COBDAO^fjd16&he3SJ*}5aXi$iNliG?;5^MQEEm1 zu@7ThEofJel9CzpovoA&3wr?SVwv5q1a^+DDw`H%Iquzsmcf#wbBZ{l>30RoJNX%=r?RK#eBgn?g z!{a%EmrHm&y_0!(lgj`MZ?ZoTHTpwPESuYwwl6W21=|biKQ?u3Hq)=0DGY;-;_Bt8 zqHUpu(^6FMolP*FVbdGSk*fMgU-fQZ+Ky_NJb?bUWaJ`x}BQon~Q?zC`tVC+H zV^z>YYpG!~p{r$tlB0u;%S^u-DFSfaIp|m8EzqWs@lPx&dalW78|z>1P}aROvHP1X zsm)TXs`Bn+5Od}*83z69{R^M)944l=Xsj1&-6fFDiVPtABZi+dEx?m%P^F>=>6%7= zMdRX47l&mkUEQ-`z1SR$~(Rg`#vTxR27LR`1e0N2npS#14f!F|O$_6+J_wBs|SNDS6HRj+A^ErbyaT$ofU_z~~8v_?ejFA^xvXBu&{owu9fc2fHeE zg<%V6|C_jB`5nDSn~iR2^(7+iFOnRNdR7W#SN2O;fvFVwGMD-r31a%ni)YY!3D%JW zR2~nZxr&X^LhMgyA^8<0&s#2kHgDOV2zkCZwOhN`W=4N{ug!@5SGFShQ6t{_Jvr-- zZ&vXhy={NhKbjwbO|*SlH~m z{2Hp>`SSbytVoKr#5Qx-&vuZ6x7}h(LJ40nP+0pWt~fQaGd54bop?FV2kK#WOPBTY ze+56Y6x+y2z+{45=&rz9RT3(>fJLJ$jl)?#*1u@m>qJJ~-if@l_O@hK7c%2KVac6T zbO!w#&<2(kJ0kXG2nxvT3XF>}QjA|RV=hcTPhdsNNzodhCp73UK@M6|tXj4r>N%tb zi+WO2%4ZPlS5CxYe}Os0tsEe(mdt9RxN+N~EP#C`ZZ=&RG5`*Rx!=$=i^=uJ2-foX5Y1giMrzz0cQ`aF=mnoZj z#MMGXhXTF7z8M}x!yHVzv=j^4g$i9&x+FOUQ@h;Ms^}VnR|%`LjAA+vQTXHxo{#A7 zb)iY#O~QT0WnlFCakx*QfM?KnJTs78pIL=|y$+Yusk715&a#C6+QlJf$f_*0r!>8D z{kp{-G;vN9f9&;7l?c99Nq4;c=w_3kXiPl-i^90mSOAde?nEz1Fc>CDchcQw+CF)b z*tb&A-wN`5DbU+c19>}BpwDGaVMne9`N?)x;r%#Padqu9e?v%+<(ZN|da3a#It^uF z>R}H8x{`Hu=vh|R(Y}mF(X--hRdnFLi+7K>_^sp(whukLoE_XFkzIx@N3c2ldsA9SYoT0MaeR z#=J#GzLe)Dc;@N$(9LAx>awXBc$c#Mk}+O*0E0*WdL~i7cGNB)$n;RVx7C)Li0>@} zitfA;iHV`!Jdb|+cA9gO!YUZ-6h>n_;7_dF^2FNhPek9IE1cZ41Bj`6Jfv(=Ve8P) z%0tIfpnZMz4qMQBGJ17G)rob4^``YcII9Vvpl)f0@M*CAm}-OvnV#dO_Rg+Mb9(7K z?LC(08=D{;ZO))hmo7Yr4UVa^f=XwGHNGCrb1Fz|u_3X!0dIW?wP6XV3Oy;OrR^Y| z_P}3jhH-_{M3sROz8_Z=fJ54hKDStlF99c8+*#2ddrYQxieW@ly$ReD$9ru}C@gTZ zh!TZ;!l4a6;-SJuw1D(BU)Tw|Nck>|Lf4cz`D?b4YCN2#km%MrPazT77f$WAbGY_E zdAN6|5OvawWxS;i?BVg2Mtk>FEjiRaj+>|Pd1D%m^~3dhMno5L{&FVyylpF+1G~xf z%oAm}Qlxt&nc}0zqUYAgkz=`$4NJ5AW2jStn@m~4vTjNZM$ zG15b$dGEX1%e#NXyBY$Is3Qz71>sDOkK075WP7zao zm{Ob*6<1FOLBNmNhV%$}y)pF@&%r_*9^E%XD|@%Zitd90n)WAC7q&q@9{ywwtmBZ@ z$;J1221M%xw#wKQ9`xCki_xm`$ zbJa9QMf)CAG=^WnDGEHY_>)B<<2uqyILXU-A){ehRrC_OQG%rJYu?g=P6?35b{_v9 zMH`N&4;1M}AY1mD-&oZsrZRqeoh8SxDVVaLGXjvn@0jZE!ZCUcC1g0Hh&xUE{pZJ{=viayY1S!@9Y6P&MuQfd^o0>{h)NDbmG3> zF~>^Evv66$NN?Y&Rd&htId(>PlK!#qL`f|d#HXaMuAp$La&wBARBlDvC8?%AKjclR zY2g{%w0yb$mXw;fY6ABIV-bKBe+TnLH}MX#s5xEJt%3}9VZcQ#IZv{9$G`l}!txaaS9hXv$8 z16-UoPcwl7WQi^Qqk@`G7VwAk3qa=K9KFE)b>0>d<1esG{M(MfchGWL;<{xXyO|oD2t=r9LSvOW!LqL5{^2 zJ!L76vMhz14|x4?n2JOnyrBw@f;0^$WE)t&?0w(f(va#fJU9b&3LTO>T^^8Caizfk zIv696;>Q5G?wJkKR#I3OT4UXq6!kj}D0~FG*QBV|0Cb%IhaiNvEk**^8^=J-P+821Gr0_E+&&e8Fx8-2~? zHoY*cXSAa4C{cMUnw?OJFbCVKv$?Z;m4 zhhAzyk;;~CK_dVVXlt^ozR9C;*QjWxF5`ew>TT8EvFS=_8Nu$FEY{nd*cMmKT18E@ zb+bX=L1are+XhiSH_(L&$gUw+6tt%K2U)Y7n(&k@Y;RiNDY;@cB;qDGP+g>3#)r_> zgV=o>;ztz1DB|0u<}X+>{ax8GOEGFJ(qUeyfOGMQc3U;a)SyliZA~u=W{PfsngoxB zKrT*pZ)*6Lu$AbKB!I>KfzIK$h>(@-U7pDJ8yyr`!xK^0Ho>a3bBYY@;Lk86k0Cur z-WJCPjmR}7!u8&(7Gmmd58snGeyeozNriQ>!X-XCe;0P>Lb}Az^92`)qkOLq7h`Dg zX_vPwN57XPsIU;PjH02SA`GA+i|r{ieCehg0$D*dpJ_3 z1uldO`kcn-X*vwYAg<02{ubXbR%odvL!LF^He9evx|na4T4i2ygA1ke+Jj**x#p1x z@z6Zq?Wk|M<1rL2$V)k0pzmY%MIJVqaHD+k#Bm+i$eZ>v$KnhXlUCy4kaK{ZFYMZp z8}85I+SmG_k*3~}Hk4_O^!4a^VBBR^c%NXgFwNiSCluie<)>={KgAd{IAiM99`XZ6 zk&A}9QZ2aFkWHMWpPEP4ro-e_U8{@{YRS?Dh4x!(S1iJ1vdf#B(g&xO}aUc~Tr`k@$Y`#}kR~%MF@`R_q{d2J@y7VmVqlKh}Z1cqZFT5nKR^ z0g)*5Y5V>jD9vJ)1nQ5Yv1)}pEV(HS^>`%X&TiCKH{#Y&WR|mB&T$&l*jBiE#}%$w zg6fi~M`py@To0f<9U2Ro4Ey_F*c-=&OK#&ZDxDMSbUKgYQv2LTH^uSvahpcPcbrQ} zO0=d4G2XR&pl{Ug{0z0yC&J`oYGvRk^V%ic&!KNX>uMI1IEvaXK;2^h3(^76Sg(N| zi0mtPA$*R|N*ztv-%0D;T4yba0o?AtXUW{h20Yi}@L1|uyWC1T69h~_?LqW(C1659 zM6&Eyr3GI2OAl{oZ11Q~Wmt!pL1;T;HyGX0X!6w7k=TBt^0J=xFMGX$Z3oYsHwk2(B@~8@ZAfD(< zx96OrSfD}=*cK{lfc%3XB^IwWC_NG=>2v%<=Ejr>g0l9pC&=sPSe2h`N# z@^I;dz~lxLEf<3mW)YPDW)0zx`aRVAnvrUXbY}bQpleyw5~;?HsSlb|pW=8WF0j+A zI1tE-o}ud~JRI_E?sOTw)MQe@HRBwptEj5KliBX*&}#N#ZmGQp%1`bdxLMxMYU~E; zx?Wv+!iD5=9;l*qOVO$?%O2B+jN8F}9qjzMSZTPg{Tfa7ond852iMh-(MGM9?h7RM zltp&HD;94>0j2*MM;@G?yxr!Ui>X(APeM0HEceB3(wlB3|F^_$BI=o2HNqVCAA1{a zY@{!uZvBok3?eL<;W6CqgKo*TFA=%7xB&-EIB`8%`N4IWvDv8DzEq=HxdqW{i{qE3 z+dIy^9m8y~t)p>#yEO-cXMb846K_a%(%*{>#_-Ud2xiHAXQnFXIjy-enxDBGnL^@H z%~85mbfzVy*)Ey@yIuu&bBU%|L9YBslIb~oM7LzqEa76(+gQT}}V$o<)}tMpvB$zg=b|hn_H_ z`QwLH^{<19VmB$A0hR}}UMK>_-=di}1VwlC_&n-|hBtUnQms+)E8FKWyuo3l;`1nO zcU98SVfn-NCdxzqmM6IH$!TysU&SRu6H!(y#m-HFK!r{%3Npv)coR)g+4 z+=zQam?!Tv90pUIc?QwWM0q=5+jf`UOKSi)pO{&}WY}xC6EFFii#fP{7qvjf#{gQv zL1dUOC$65GhC1vnTv*!Gu>!+(;OyWsCTzWbF8A_GLs4+Q=U05Qc61pX`rVyfOW z7yVd&3ax6reQo(0y*xAZRR7fYGca}BKQ;a=o;t2hIksfSN!D@;KbuEGIN&?7rGK&O z+ikZUQ~S`VlI-YY`(V4{F^m$Ahp-A(2d`}m2-=bzM}ngEgXEv=R06f|71Y|=m&W4g zdP^|ij!=B?xO zT92t;c-WNjZ?>csB~iP@NGh+sl1m<(5aafMIclP}i|p|xPLsr9UWbho zSKouofL33hq>II&9h0-O2cNm46(F)8#7~ z&{Q|*?3t;exUO7o*wD>R>W2nU^uw+Ml5y&#(pFIuB5DT{@GKjs4um|Vj&f(ZY#HbV zYaOzsd3srqG)LU!e2L~S>p|+xz)D9sJi?oLV^~>e>P=kDG!)@9=!~f!dZ-iGUGNV= z*y@a6P$h`KAxnhzzNytnZ%)H>V&Lt|X|U9vo^lw%A**^1s+oIeb!J|!`jE_=>NzVj z*<4L;ruxw8>Y9}`xt>Gj%nf4*uT0haDIbk75=AcmFn?h1p1iqGRx$;wPcNd5=*gAhuX0Zv9?s96W51T>e6^lHZaTZHhSLnsmou2bhhlJgw&FvlDQ$S9# zwSQmWk}hh@O$Pjw&g+%l;L~A;A;7dp1_`=s99oyeO{J-}rOh4fZN)*e;3uPuTc$(+ z|7?Oo;Dv?q!hNAH;Om3%bxd_=8(z{kT`N8Y*8b&hI3h?#d;C`;L}RrIZi>T@xQD9y z@nq~Fm{4-mRI{@~0ctI|J?@nc(Oc;b@nkIE_OcDQoLEvBynOjNag5=@CBN6!iA6C( zOY8{Bu*a^p7g~~J0=~1S@Pb83gOYSO=!KV99@(AhSka!A`9l}Btkb*gWHe@XgUQ(mfNiN|ha3#d-taTY=ik}W~#L$w=fZ?X^7Z3z5WUF_ycihA`fXW zoyc+E5tg6ww!h=GI^WraFuku;IMufErRuV)xopv8Ky|ZNstK9%S11;aRuNNkAcAbC z0IzaSdfWjl3H+Qk!C{))!JU%;Wc1^xfkjZsn`duxnD2`0jH^Q~0@1XiEo2IJTgB9A z#<*f(NON5`GccUauee5UZyhZvYM;A&(`ANF625i5GVk$*Tddfr6H}djCD+hKnBu;r ziq;Cl31+dM#4PrrVmQYQWt`-Y??DEm-C4%C^Y|cLoS3)mPndWTRu30b?+MZ`u86_a z7-B9v)XR>W8+18RXx;2b{ntpcug#X&=4j1(RAb+uLsW=W!Xaam)qOTu?E#Pbs$pEh zo0m+AN41ky?ryW`^TVXi1^%H@>viDM9_#@bET+2s`y!r&~hD zlKzd0Ibicecd&a-b))ALbL6;+swhM?(sXF-TDEm-Xe?me#?*u0F{WD#($+JbNwgfI zV+kCmeu>9Rur)wC)36FyfPog#F~HUU@9v7xP{zF@dHY_>9YG#A@#Znj25ooWZ< z4hf0_+pO?jN*7UE*#YxI$_31Q?mjge8cpEt5MU22D^>JVNhTXWYKL|rVC(i|#D^Kh z<$VVBNjGSxZjWqPb|W?+f|BgO=%9h$mtzSNiMqwq6|M|~kXytoNk;X5!uhVVe))btL9+yJiHTj)jtiv9qN70Hhx@7(4_^~H?_Y7a%jy2&a6g#ayjwZ}qI z7C%j~7gM|a4yrm_RJO!Lk2N;>XX1p`T!i?i0fOrw@%-X0ruwxoZcH~qPzU5O^9M)J zItW+x@&9p)MNCz@LY2!z&F(04WoL>(_cD?s)_5|=Ag(^OC$5@ue67C}UB8K%utvlw z_>rZ~GSprZ?%fC~h4kiI^o>|@ZB$H6`5BeDPAMJ9G`FVF1+2L%nNH&>R#jMvIRr>% z^z~rPspa*lw0-Z@`Eb0WaBHgE^+Nuek0x}_dw+^Y6ZzDpnR!0ib!pKM_~r_4jVrRp z_ejvRYOzXqs`H`+5ADZZQLMZ)vpDXU*H}n@u-+ z_#GKRFWlz{K=fsXu}AeS%XY7WT5zF*_pmpTT*&Of1g{%4Ki@3=25=rP2p$!N-{4q~ zci@g7fUE3Jpu&VUO2RR76k6M0-GFV3sjqtY7QAaoxJ%K^%)`8J^ZhMOAI@a0+Z}UP zog{IJm{Kx_awe&pq zLT*^<(^ytXJa#eCxWd^7KQhgievF>MsV()nG3 zXeg4kG1_nYJ}1rG}R9c=0}G5M}2s*)cz%a z$E8j-6vg1fIr5liRv~;FQKb9(h3*e1N1*QLev-%M{#BmERmRjZ&q5GT)@|+sEBR;n z2{UFpf-`0UXZvhTrMK9G-8bkX>?Rv4O(1Ms(WeRfP6|6qZBc@h%JHwm%0q2fd=TiA zA5EVi%+Wu9=G8(Jt~WIgj^?w2J?P3+ON)U8<*h@#WBoY|Ju0Jc)S67yNhVWU+hp6e zGobQZM@1Iw?Gfh;`NqH&e+$1rrHp4+7Uc$!vg<#EC@d&JU8Ut+Tz$x4NQ?T1R%ZLX zJn1m-Bukx9?(opv5W+=*2=xERkIheN3g{YdnngA(6py{gKj1ld398uRc5C zqvE*w$?t1;!|s>zn6T=IUHfHJt|~1kXgwJ z%0~Daa=oEcRg-B;s#7AcM6KT`#mtg!&w|^A^34OoegZ+iWrxJTri)p0zp&_!lz_Y3 zT8}UBjyb=@3q}8M54fF!+2OuH-{!z7EOEfoNka<7!&>Tv5}=epIvT@!VUZFBA1rWW zd4AAPmmV2fiw5?7YKo~NJwIwfc2Q94im5iwFW`sk85$eR`(}!(|HDtThyfdLxvwg` zSGd4Z&j|Ke1+DtVKqn;6k5H_dZuWhTZi>KBNiE5x>flKWs5E!$bC&f?Mx7-v*9+k) zOU5vz%;GwA26=moO3N>1f)`q9_i_M+bLjw&zDIMFj*>J~j*8-H+uxd9z)6w3164R2 zQa-M})QY~Z$3n4I};>_xVu;VII`KRfE=)Q zb8|z+xP7^lM@1dEv&11}!F_4f?tLZJ((N^RO1>XgCj<-x3Sz&JaF{^%WI5_eCmqrZ z(tl>LU(ozf)7Zl$7VC^tya#ZOm3XO~)q4T5${g)ewjrHEg2X8Mks_>4^dATNIHp=W zNAgJj;g7519f{woJp<+4mVc}FqdxmMv4*Q0& z)EgK^EzI~-9lf=4rN663iJDWJ6qjq{P_>6vhLD+1f>fwzjBiE6)G;35I&)};-hhd);pY|~&2(6q9eWL`=HitKq6Fm|Bl6eQri_QnF!vC1e3wd3h zU1+GQ@9#sK4&N?V>e}*W)ku-xQ4O5b=k-Z_JexoYH8_8xpHuuv&%bMl zy)Y6jj8SAk>1AYfF}Vjp@%+LM)C(G@lg68%$bnTngZmTz6fbfL^gQuO5HK#ym_0`9 zt-_aoR{}jAmK=tm^GomohG6T*g}WkJRdi z=`VVqOUl6%&Itm1;IA5yE4_$>%32d(ItP}ZsC2TlT4kwY%Yhe;{Q&M?)$81*+(5=r zf!?&!*L9 zd)DLvo3?%V$-)UOoeYrL8=NezzG74@G`rO~6Lu;@`ygGM;mX$)qI_jMaCUCM{W^XZ z?p@)CG}d*P3-{shR}96&fO4HVQ19dNOmSBgE6arIe4EH-Iq z@m8dpuMqO+@gS4t^4tJ6e;z)6xy^1Yx7pzuN6S98{HlXtWID+0!4c_TG}8h zb5RO9y&Thbv5%t|WxCba!Ga0}rTHCZ9rk1+Y31*gzd~SQNOIK-Zg@R8i9y@8119y|ZJG`Us*juRqh=nGqjz3kt|} zWwxaFOQr=cs9|#g9SjbpAC-s&pG)jTck&kQBOPqS6O=xH;aF%UUvb0QZm%{cA&32h z%N45~Jg>H<8cv|8vFY%KFCm68=5ab1276XiXvP*mi~JGlM&#Te#nsTOCqm6;sI9MK z>AXI~6d?8BmU)d{oy`;4->DsMAr`*cKU1 z&GoRQ22g8vtNfG{i^kM`PSTEhg{70W!;$o2-E=gvpN(|qsz`I$~o78(W(=SQ5rA1n>Q+5W+7O1?Vt%awh-eIr-|+>6=% z;BUW*)Umjlga*Yj>dNeBUr)w9+PFevv~Trbu6O3>nxT>W0rCsorD!CJaAn|oxWEV& zOuvy084N^=cNV1WWXKIanMU=LN4Q3u8rLr1iP1_ zDo5`FoG)DL0^DRs$IaacYQ@#NFYy5eQi2b80S7C_B0oJsf1ITYf`MfDsYYnsdU!Nc zVd|b7_mf}TJmX@(&us(#cNA)n;k{`_hAbD6=_RTA>yhh|Xmq%APE9RBU8ig@m1nwe zqcl*DtNX9F!7;DQpO1oF*#1aiz)z+>gYU_yQsKFl-3+KX`JprRwN%wZ2RyvbgL@P{ zAQSu^ucKj5@g(+enC4hkgguX6a1{u&WaO|)FIEGSW)Ef=bG_?WBhy4*@VqY=*tqxO z>e*rtIRxPA#|&{bA7~b8F)-nvG!KntM@F*T+uz8K7KQw%anStcDfvy>5WE=(Z{Le= zEOiwqPAwcnt}_C!`WS1fD^;O`vKNQkY8TaFe*s}_ZH=wC##lE{_#KEOu5NqQ20!CC z8HHRH=o8R|;w9Wq*lYeA$PQ-^qa%lqA9$e&@QmWq;O99-=OXa+O#26K!xa69CcX{p zF)MQRM$b8%?HhSJW=9_PXnv;NmbVnCGr`>ssMaiw?$eq3lY3q)T&^GK)j~P0euM8W zL+&^_tY2n-_m)D3^J(+lodlu_Liw(r7~ecCW0Co7!OwR75zq3%*$Z1sv@r;r-8uHz zU4biIl6Cmfi<^m`|LR&avPCF*DzqO}cnu3D!dF!e|NQxt!@n_#U{IOypA($<;Nj=d zzYp|gsc%7&?!9njALQN!2r^2^mB_NuqG{Q@O#5(dZ~*KA#XhxOcgcDPK@jUVpD~h3 zgwonEDuYaD*)qCqm_O6jfFPaa18}dPk$DPQ$0TCMQ0L%1!s;WW+;mTjD9-SKZKykH&Q~6^n!0B_@dz< zsx3bju%_KeHFJ>~?3!QG^@wli5nGX_i{+FUOKi8fwE#=zVoLtp+9vzcblp-6jgifs zzDq`)&VH>zwPEnJ`mMH^mWtf7ADme;<=yS@YFym|(1di&rq}~vXZFO;qCXeVWpTI_ zoH>2Dk=kOHS-@x`*{OokFtRU(ZCeICZGpoD2vwm<-g*Kr#nrt*=wxR6Xfl2jS6}ph zjn7~Hf9$;pd{jl&Hh%jikVsep;;s;aG{m8iMG<;*NN5rT0*xdft`S0jNJuawBI;}{$Fbd4+(lg8ao_i4+;zs8(f{+Ds=8Zuha~Oy{=aXAMLBrgI%YyAuGuxxw57x5O38QMJ;aj;!tG0+Y z{wSmaT(dddLGC#5w$4~nr|&9)K8Aw0e!j_Z!l_RLs@Pd~GoD!3ku z#kx`q&vEs{QdE2krrkh_a}45+hBf+3Kt?z@*ch5iem`JKSzs-C%vjd{)_fE!om0%B z&-qXn?e_aM9A<49Vr_nHG&p`rGb9dzh`za^_Ri^k_EnUk|3Bva=DOewQFPz$#x zD%OIyKt%=pQWW%g^xV6mm(hdrnrUc>v0V^@C=0hQB%qJEc=Z)}0bq84b(2}LRR)ZO z+s<0AY%ShV-cMYLzERo*V>_ztt#8DIL%vr#!{uE=LsR2I@nJ7BBZ|W0;!5@Opb}a8jxKaR;F9pd3R&Vom zhNA-W!exSRbG;0V@a^};+H`}Wc86jiYr_qcMa|^-HMNZ`rD%F|D- z;w`xwWt=l%q>PI&#}XJ0q10KR9=RApp}VeScWvc9qo7BnKsy5{4!9NwFm4QShD026 z$qR&LY1;m51nTqx>iVrNsnQdoO5M)Vs$}ZOZ|SNXNLO3w;Jo$bPnWeG)Zi&N9bRBX z)*1ax(OAG-C8MccUc#W)9`(>KCcXD`c~ZSZc$H^cDSEH>bkQ~HjcyGWhX@vI@pM+u z^9FCbV`)8vXHD!=J#w;yBJ`Gv}gA?SK0?e;( z>a-+6);!7HP`4oMqRD2&IOAq5##;0fwMS`HQS@9YXu2h#70VJ>qFonFbOy!=^Md_PZux#=buc!?ON`j5tAu zEB*wx8FQtn@oF)o$?G&ECQ$R6mekCx#fSTr`FbDFbRB9X_bn__=>-@pJg9fGvJ${$ z2$WV@iW!=$MPNx{;v~-!#~!Nre68aMQeS*@xF7Sq+a9Y*e!1f%`zar%^1tKHFRzs| zu)e`!mfa2YK6xmx-xk$?~|Wd$k|5_;iC+|B-LulM%5gMv;r%~*wW9^ z#slqoXa^2-h#_IDxm>-9?wpB-ti7>UC)2!HUI&`*04n|I$fP;<8jQrS=rJ;I3BLDB zhq40JzsO!`C0>+$OS$XY%e4Q*N&fEsRh8+=&1BL`ZEA?{y2^8T<~$fAutEtQO1z=K zuUFus0?eQVaTalka&Ysqm3T*GxIr>3Uxd$I2lGrUhwhp}fL%v5^^NRm<#rmivB?@n#eK;1IL?4tHX;VvE7hxe z`_4emCgaMAVqzTmfo4{{cao2@aJ$t1!V7mrrZcMJE+Idio8==oeDP<;@XMKApC-)y z!F@%x<(-&kXcds#X2tqnwowD-f71XO%ZICbqA#V&iL~+h4Ak z>5Qw(%(gf0t|BwS<52TJ%)1M(G{dKqE0EHRp4x`VKC-^j4PGvzr*qBd$&(+r`%7;) z!!!X~7K=Ku<8zCVaAT}Yas9iQpjSh8rM2AdwzgY#$#r-q@fN)b>J=2~K{UUGH~h(& z<*BAtkF`>#csW1);;dg_k~f;~{jBSdufQ4vS4MS`H!#v*L%Sz{L)K~;!_S?6MC-Da zu1(bomz%~q-6v?%wAb$qmG=4zneDbpdwqmyul*=M<=241R}qCuEW>tTrvvWTk=$}k zQOXph-POVZ>msumFt{C-qfJWj3@mpPSbz4LKHmLpc~Q3IMVUTKvH6Y7&K@}^)C(|u z+?!`!{r(5O6a>c%C_MVm3j@3tdNQ zfu>&dukB2ZH`@V&ncY;u=ABGC*Z>?JLJj`@DlM0m=26k;qPfc!rI}(AQ7VDbwg$