WebKit Bugzilla
Attachment 338858 Details for
Bug 184991
: We should cache the compiled sandbox profile in a data vault
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
WIP
b-backup.diff (text/plain), 19.17 KB, created by
Saam Barati
on 2018-04-25 22:50:48 PDT
(
hide
)
Description:
WIP
Filename:
MIME Type:
Creator:
Saam Barati
Created:
2018-04-25 22:50:48 PDT
Size:
19.17 KB
patch
obsolete
>Index: Source/WebKit/Configurations/WebKit.xcconfig >=================================================================== >--- Source/WebKit/Configurations/WebKit.xcconfig (revision 231041) >+++ Source/WebKit/Configurations/WebKit.xcconfig (working copy) >@@ -85,6 +85,9 @@ WK_MOBILE_CORE_SERVICES_LDFLAGS_cocoatou > WK_MOBILE_GESTALT_LDFLAGS = $(WK_MOBILE_GESTALT_LDFLAGS_$(WK_COCOA_TOUCH)); > WK_MOBILE_GESTALT_LDFLAGS_cocoatouch = -lMobileGestalt; > >+WK_LIBSANDBOX_LDFLAGS = $(WK_LIBSANDBOX_LDFLAGS_$(WK_PLATFORM_NAME)); >+WK_LIBSANDBOX_LDFLAGS_macosx = -lsandbox; >+ > WK_OPENGL_LDFLAGS = $(WK_OPENGL_LDFLAGS_$(WK_PLATFORM_NAME)); > WK_OPENGL_LDFLAGS_iphoneos = -framework OpenGLES; > WK_OPENGL_LDFLAGS_iphoneminimalsimulator = -framework OpenGL; >@@ -112,7 +115,7 @@ WK_SAFE_BROWSING_LDFLAGS_MACOS_SINCE_101 > WK_UIKIT_LDFLAGS = $(WK_UIKIT_LDFLAGS_$(WK_COCOA_TOUCH)); > WK_UIKIT_LDFLAGS_cocoatouch = -framework UIKit; > >-FRAMEWORK_AND_LIBRARY_LDFLAGS = -lobjc -framework CFNetwork -framework CoreAudio -framework CoreFoundation -framework CoreGraphics -framework CoreText -framework Foundation -framework ImageIO -framework IOKit -framework WebKitLegacy $(WK_ACCESSIBILITY_LDFLAGS) $(WK_APPKIT_LDFLAGS) $(WK_ASSERTION_SERVICES_LDFLAGS) $(WK_CARBON_LDFLAGS) $(WK_CORE_PDF_LDFLAGS) $(WK_CORE_PREDICTION_LDFLAGS) $(WK_CORE_SERVICES_LDFLAGS) $(WK_GRAPHICS_SERVICES_LDFLAGS) $(WK_IOSURFACE_LDFLAGS) $(WK_LIBWEBRTC_LDFLAGS) $(WK_MOBILE_CORE_SERVICES_LDFLAGS) $(WK_MOBILE_GESTALT_LDFLAGS) $(WK_OPENGL_LDFLAGS) $(WK_PDFKIT_LDFLAGS) $(WK_SAFE_BROWSING_LDFLAGS) $(WK_UIKIT_LDFLAGS); >+FRAMEWORK_AND_LIBRARY_LDFLAGS = -lobjc -framework CFNetwork -framework CoreAudio -framework CoreFoundation -framework CoreGraphics -framework CoreText -framework Foundation -framework ImageIO -framework IOKit -framework WebKitLegacy $(WK_ACCESSIBILITY_LDFLAGS) $(WK_APPKIT_LDFLAGS) $(WK_ASSERTION_SERVICES_LDFLAGS) $(WK_CARBON_LDFLAGS) $(WK_CORE_PDF_LDFLAGS) $(WK_CORE_PREDICTION_LDFLAGS) $(WK_CORE_SERVICES_LDFLAGS) $(WK_GRAPHICS_SERVICES_LDFLAGS) $(WK_IOSURFACE_LDFLAGS) $(WK_LIBWEBRTC_LDFLAGS) $(WK_MOBILE_CORE_SERVICES_LDFLAGS) $(WK_MOBILE_GESTALT_LDFLAGS) $(WK_LIBSANDBOX_LDFLAGS) $(WK_OPENGL_LDFLAGS) $(WK_PDFKIT_LDFLAGS) $(WK_SAFE_BROWSING_LDFLAGS) $(WK_UIKIT_LDFLAGS); > > // Prevent C++ standard library operator new, delete and their related exception types from being exported as weak symbols. > UNEXPORTED_SYMBOL_LDFLAGS = -Wl,-unexported_symbol -Wl,__ZTISt9bad_alloc -Wl,-unexported_symbol -Wl,__ZTISt9exception -Wl,-unexported_symbol -Wl,__ZTSSt9bad_alloc -Wl,-unexported_symbol -Wl,__ZTSSt9exception -Wl,-unexported_symbol -Wl,__ZdlPvS_ -Wl,-unexported_symbol -Wl,__ZnwmPv -Wl,-unexported_symbol -Wl,__Znwm -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEC2EOS4_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEC1EOS4_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEaSEDn -Wl,-unexported_symbol, -Wl,__ZNKSt3__18functionIFvN7WebCore12PolicyActionEEEclES2_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEE4swapERS4_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEC1ERKS4_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEC2ERKS4_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEED1Ev -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEED2Ev -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEaSERKS4_ -Wl,-unexported_symbol, -Wl,__ZTVNSt3__117bad_function_callE; >Index: Source/WebKit/Shared/ChildProcess.h >=================================================================== >--- Source/WebKit/Shared/ChildProcess.h (revision 231041) >+++ Source/WebKit/Shared/ChildProcess.h (working copy) >@@ -46,6 +46,8 @@ struct ChildProcessInitializationParamet > std::optional<WebCore::ProcessIdentifier> processIdentifier; > IPC::Connection::Identifier connectionIdentifier; > HashMap<String, String> extraInitializationData; >+ void* compiledSandbox { nullptr }; >+ size_t compiledSandboxSize { 0 }; > #if PLATFORM(COCOA) > OSObjectPtr<xpc_object_t> priorityBoostMessage; > #endif >Index: Source/WebKit/Shared/EntryPointUtilities/mac/XPCService/XPCServiceEntryPoint.h >=================================================================== >--- Source/WebKit/Shared/EntryPointUtilities/mac/XPCService/XPCServiceEntryPoint.h (revision 231041) >+++ Source/WebKit/Shared/EntryPointUtilities/mac/XPCService/XPCServiceEntryPoint.h (working copy) >@@ -112,6 +112,12 @@ void XPCServiceInitializer(OSObjectPtr<x > Thread::setGlobalMaxQOSClass(QOS_CLASS_UTILITY); > #endif > >+ if (xpc_object_t sandbox = xpc_dictionary_get_value(initializerMessage, "compiled-sandbox-buffer")) { >+ RELEASE_ASSERT(xpc_get_type(sandbox) == XPC_TYPE_DATA); >+ parameters.compiledSandbox = bitwise_cast<void*>(xpc_data_get_bytes_ptr(sandbox)); >+ parameters.compiledSandboxSize = xpc_data_get_length(sandbox); >+ } >+ > XPCServiceType::singleton().initialize(parameters); > } > >Index: Source/WebKit/Shared/mac/ChildProcessMac.mm >=================================================================== >--- Source/WebKit/Shared/mac/ChildProcessMac.mm (revision 231041) >+++ Source/WebKit/Shared/mac/ChildProcessMac.mm (working copy) >@@ -41,11 +41,16 @@ > #import <sysexits.h> > #import <wtf/Scope.h> > #import <wtf/spi/darwin/SandboxSPI.h> >+#import <wtf/DataLog.h> > > #if USE(APPLE_INTERNAL_SDK) > #include <HIServices/ProcessesPriv.h> > #endif > >+extern "C" { >+#import <sandbox/libsandbox.h> >+} >+ > typedef bool (^LSServerConnectionAllowedBlock) ( CFDictionaryRef optionsRef ); > extern "C" void _LSSetApplicationLaunchServicesServerConnectionStatus(uint64_t flags, LSServerConnectionAllowedBlock block); > extern "C" CFDictionaryRef _LSApplicationCheckIn(int sessionID, CFDictionaryRef applicationInfo); >@@ -111,18 +116,40 @@ static OSStatus enableSandboxStyleFileQu > > void ChildProcess::initializeSandbox(const ChildProcessInitializationParameters& parameters, SandboxInitializationParameters& sandboxParameters) > { >+ if (parameters.compiledSandbox) { >+ dataLogLn("Child process has sandbox, size: ", parameters.compiledSandboxSize); >+ sandbox_profile_t sandbox = static_cast<sandbox_profile_t>(fastMalloc(sizeof(decltype(*sandbox)))); >+ sandbox->builtin = nullptr; >+ sandbox->data = bitwise_cast<unsigned char*>(parameters.compiledSandbox); >+ sandbox->size = parameters.compiledSandboxSize; >+ if (sandbox_apply(sandbox)) { >+ dataLogLn("Couldn't apply sandbox!"); >+ CRASH(); >+ } >+ dataLogLn("Child process applied compiled sandbox!"); >+ return; >+ } >+ >+ > NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")]; >+ dataLogLn("bundle identifier: ", String([[NSBundle mainBundle] bundleIdentifier])); > String defaultProfilePath = [webkit2Bundle pathForResource:[[NSBundle mainBundle] bundleIdentifier] ofType:@"sb"]; >+ dataLogLn("default profile path (child) : ", defaultProfilePath); > > if (sandboxParameters.userDirectorySuffix().isNull()) { > auto userDirectorySuffix = parameters.extraInitializationData.find("user-directory-suffix"); > if (userDirectorySuffix != parameters.extraInitializationData.end()) > sandboxParameters.setUserDirectorySuffix([makeString(userDirectorySuffix->value, '/', String([[NSBundle mainBundle] bundleIdentifier])) fileSystemRepresentation]); > else { >+ dataLogLn("Making user directory suffix"); > String clientIdentifier = codeSigningIdentifier(parameters.connectionIdentifier.xpcConnection.get()); >- if (clientIdentifier.isNull()) >+ if (clientIdentifier.isNull()) { > clientIdentifier = parameters.clientIdentifier; >+ dataLogLn("clientIdentifier is null, getting it from params: ", clientIdentifier); >+ } else >+ dataLogLn("clientIdentifier is not null: ", clientIdentifier); > String defaultUserDirectorySuffix = makeString(String([[NSBundle mainBundle] bundleIdentifier]), '+', clientIdentifier); >+ dataLogLn("user directory suffix is: ", clientIdentifier); > sandboxParameters.setUserDirectorySuffix(defaultUserDirectorySuffix); > } > } >@@ -170,6 +197,14 @@ void ChildProcess::initializeSandbox(con > > sandboxParameters.addPathParameter("HOME_LIBRARY_PREFERENCES_DIR", FileSystem::fileSystemRepresentation(path).data()); > >+ dataLogLn("-----------child-process---------"); >+ for (size_t i = 0, count = sandboxParameters.count(); i != count; ++i) >+ dataLogLn(sandboxParameters.name(i), "=", sandboxParameters.value(i)); >+ dataLogLn("-----------"); >+ if (!sandboxParameters.count()) >+ dataLogLn("Empty sandbox paramteres"); >+ >+ > switch (sandboxParameters.mode()) { > case SandboxInitializationParameters::UseDefaultSandboxProfilePath: > case SandboxInitializationParameters::UseOverrideSandboxProfilePath: { >Index: Source/WebKit/UIProcess/Launcher/mac/ProcessLauncherMac.mm >=================================================================== >--- Source/WebKit/UIProcess/Launcher/mac/ProcessLauncherMac.mm (revision 231041) >+++ Source/WebKit/UIProcess/Launcher/mac/ProcessLauncherMac.mm (working copy) >@@ -43,10 +43,23 @@ > #import <wtf/text/CString.h> > #import <wtf/text/WTFString.h> > >+ > #if PLATFORM(MAC) > #import "CodeSigning.h" > #endif > >+#import "SandboxInitializationParameters.h" >+#import <WebCore/FileSystem.h> >+#import <wtf/DataLog.h> >+#import <WebCore/SystemVersion.h> >+#import <sysexits.h> >+#import <pwd.h> >+#import <wtf/spi/darwin/SandboxSPI.h> >+ >+extern "C" { >+#import <sandbox/libsandbox.h> >+} >+ > namespace WebKit { > > static const char* serviceName(const ProcessLauncher::LaunchOptions& launchOptions) >@@ -106,7 +119,16 @@ void ProcessLauncher::launchProcess() > { > ASSERT(!m_xpcConnection); > >- m_xpcConnection = adoptOSObject(xpc_connection_create(serviceName(m_launchOptions), dispatch_get_main_queue())); >+ dispatch_queue_t queue = nullptr; >+ { >+ static std::once_flag onceFlag; >+ std::call_once(onceFlag, [=] () mutable { >+ queue = dispatch_queue_create("process launch queue", DISPATCH_QUEUE_CONCURRENT); >+ //queue = dispatch_get_main_queue(); >+ }); >+ } >+ >+ m_xpcConnection = adoptOSObject(xpc_connection_create(serviceName(m_launchOptions), queue)); > > uuid_t uuid; > uuid_generate(uuid); >@@ -184,7 +206,11 @@ void ProcessLauncher::launchProcess() > > xpc_dictionary_set_mach_send(bootstrapMessage.get(), "server-port", listeningPort); > >- xpc_dictionary_set_string(bootstrapMessage.get(), "client-identifier", !clientIdentifier.isEmpty() ? clientIdentifier.utf8().data() : *_NSGetProgname()); >+ { >+ const char* theClient = !clientIdentifier.isEmpty() ? clientIdentifier.utf8().data() : *_NSGetProgname(); >+ dataLogLn("Sending clientIdentifier: ", theClient); >+ xpc_dictionary_set_string(bootstrapMessage.get(), "client-identifier", theClient); >+ } > xpc_dictionary_set_string(bootstrapMessage.get(), "process-identifier", String::number(m_launchOptions.processIdentifier.toUInt64()).utf8().data()); > xpc_dictionary_set_string(bootstrapMessage.get(), "ui-process-name", [[[NSProcessInfo processInfo] processName] UTF8String]); > >@@ -201,34 +227,123 @@ void ProcessLauncher::launchProcess() > > xpc_dictionary_set_value(bootstrapMessage.get(), "extra-initialization-data", extraInitializationData.get()); > >+ if (m_launchOptions.processType == ProcessLauncher::ProcessType::Web) { >+ NSBundle *webkit2Bundle = [NSBundle bundleForClass:NSClassFromString(@"WKView")]; >+ String defaultProfilePath = [webkit2Bundle pathForResource:@"com.apple.WebProcess" ofType:@"sb"]; >+ >+ SandboxInitializationParameters sandboxParameters; >+ >+ if (sandboxParameters.userDirectorySuffix().isNull()) { >+ /* >+ auto userDirectorySuffix = parameters.extraInitializationData.find("user-directory-suffix"); >+ if (userDirectorySuffix != parameters.extraInitializationData.end()) >+ sandboxParameters.setUserDirectorySuffix([makeString(userDirectorySuffix->value, '/', String([[NSBundle mainBundle] bundleIdentifier])) fileSystemRepresentation]); >+ else { >+ dataLogLn("Making user directory suffix"); >+ String clientIdentifier = codeSigningIdentifier(parameters.connectionIdentifier.xpcConnection.get()); >+ if (clientIdentifier.isNull()) { >+ clientIdentifier = parameters.clientIdentifier; >+ dataLogLn("clientIdentifier is null, getting it from params: ", clientIdentifier); >+ } else >+ dataLogLn("clientIdentifier is not null: ", clientIdentifier); >+ String defaultUserDirectorySuffix = makeString(String([[NSBundle mainBundle] bundleIdentifier]), '+', clientIdentifier); >+ sandboxParameters.setUserDirectorySuffix(defaultUserDirectorySuffix); >+ } >+ */ >+ >+ String defaultUserDirectorySuffix = makeString("com.apple.WebKit.WebContent", '+', clientIdentifier); >+ sandboxParameters.setUserDirectorySuffix(defaultUserDirectorySuffix); >+ } >+ >+ Vector<String> osVersionParts; >+ String osSystemMarketingVersion = WebCore::systemMarketingVersion(); >+ osSystemMarketingVersion.split('.', false, osVersionParts); >+ if (osVersionParts.size() < 2) { >+ WTFLogAlways("%s: Couldn't find OS Version\n", getprogname()); >+ exit(EX_NOPERM); >+ } >+ String osVersion = osVersionParts[0] + '.' + osVersionParts[1]; >+ sandboxParameters.addParameter("_OS_VERSION", osVersion.utf8().data()); >+ >+ setenv("DIRHELPER_USER_DIR_SUFFIX", WebCore::FileSystem::fileSystemRepresentation(sandboxParameters.userDirectorySuffix()).data(), 1); >+ sandboxParameters.addPathParameter("WEBKIT2_FRAMEWORK_DIR", [[webkit2Bundle bundlePath] stringByDeletingLastPathComponent]); >+ sandboxParameters.addConfDirectoryParameter("DARWIN_USER_TEMP_DIR", _CS_DARWIN_USER_TEMP_DIR); >+ sandboxParameters.addConfDirectoryParameter("DARWIN_USER_CACHE_DIR", _CS_DARWIN_USER_CACHE_DIR); >+ unsetenv("DIRHELPER_USER_DIR_SUFFIX"); >+ >+ char buffer[4096]; >+ int bufferSize = sizeof(buffer); >+ struct passwd pwd; >+ struct passwd* result = 0; >+ if (getpwuid_r(getuid(), &pwd, buffer, bufferSize, &result) || !result) { >+ WTFLogAlways("%s: Couldn't find home directory\n", getprogname()); >+ exit(EX_NOPERM); >+ } >+ >+ sandboxParameters.addPathParameter("HOME_DIR", pwd.pw_dir); >+ String path = String::fromUTF8(pwd.pw_dir); >+ path.append("/Library"); >+ sandboxParameters.addPathParameter("HOME_LIBRARY_DIR", WebCore::FileSystem::fileSystemRepresentation(path).data()); >+ path.append("/Preferences"); >+ sandboxParameters.addPathParameter("HOME_LIBRARY_PREFERENCES_DIR", WebCore::FileSystem::fileSystemRepresentation(path).data()); >+ >+ dataLogLn("-----------parent-process---------"); >+ for (size_t i = 0, count = sandboxParameters.count(); i != count; ++i) >+ dataLogLn(sandboxParameters.name(i), "=", sandboxParameters.value(i)); >+ dataLogLn("-----------"); >+ >+ { >+ sandbox_params_t params = sandbox_create_params(); >+ for (size_t i = 0; i < sandboxParameters.count(); ++i) >+ sandbox_set_param(params, sandboxParameters.name(i), sandboxParameters.value(i)); >+ char* error = nullptr; >+ >+ CString profilePath = WebCore::FileSystem::fileSystemRepresentation(defaultProfilePath); >+ if (sandbox_profile_t result = sandbox_compile_file(profilePath.data(), params, &error)) { >+ dataLogLn("successfully compiled sandbox"); >+ dataLogLn("result.builtin: ", result->builtin); >+ dataLogLn("result.data: ", RawPointer(result->data)); >+ dataLogLn("result.size: ", result->size); >+ >+ RELEASE_ASSERT(!result->builtin); >+ auto data = adoptOSObject(xpc_data_create(result->data, result->size)); >+ xpc_dictionary_set_value(bootstrapMessage.get(), "compiled-sandbox-buffer", data.get()); >+ } else { >+ dataLogLn("Couldn't compile sandbox"); >+ } >+ } >+ } >+ > auto weakProcessLauncher = m_weakPtrFactory.createWeakPtr(*this); > xpc_connection_set_event_handler(m_xpcConnection.get(), [weakProcessLauncher, listeningPort](xpc_object_t event) { >- ASSERT(xpc_get_type(event) == XPC_TYPE_ERROR); >+ dispatch_async(dispatch_get_main_queue(), ^{ >+ ASSERT(xpc_get_type(event) == XPC_TYPE_ERROR); > >- auto processLauncher = weakProcessLauncher.get(); >- if (!processLauncher) >- return; >+ auto processLauncher = weakProcessLauncher.get(); >+ if (!processLauncher) >+ return; > >- if (!processLauncher->isLaunching()) >- return; >+ if (!processLauncher->isLaunching()) >+ return; > > #ifndef _NDEBUG >- mach_port_urefs_t sendRightCount = 0; >- mach_port_get_refs(mach_task_self(), listeningPort, MACH_PORT_RIGHT_SEND, &sendRightCount); >- ASSERT(sendRightCount == 1); >+ mach_port_urefs_t sendRightCount = 0; >+ mach_port_get_refs(mach_task_self(), listeningPort, MACH_PORT_RIGHT_SEND, &sendRightCount); >+ ASSERT(sendRightCount == 1); > #endif > >- // We failed to launch. Release the send right. >- deallocateSendRightSafely(listeningPort); >+ // We failed to launch. Release the send right. >+ deallocateSendRightSafely(listeningPort); > >- // And the receive right. >- mach_port_mod_refs(mach_task_self(), listeningPort, MACH_PORT_RIGHT_RECEIVE, -1); >+ // And the receive right. >+ mach_port_mod_refs(mach_task_self(), listeningPort, MACH_PORT_RIGHT_RECEIVE, -1); > >- if (processLauncher->m_xpcConnection) >- xpc_connection_cancel(processLauncher->m_xpcConnection.get()); >- processLauncher->m_xpcConnection = nullptr; >+ if (processLauncher->m_xpcConnection) >+ xpc_connection_cancel(processLauncher->m_xpcConnection.get()); >+ processLauncher->m_xpcConnection = nullptr; > >- processLauncher->didFinishLaunchingProcess(0, IPC::Connection::Identifier()); >+ processLauncher->didFinishLaunchingProcess(0, IPC::Connection::Identifier()); >+ }); > }); > > xpc_connection_resume(m_xpcConnection.get()); >Index: Source/WebKit/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp >=================================================================== >--- Source/WebKit/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp (revision 231041) >+++ Source/WebKit/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp (working copy) >@@ -304,9 +304,9 @@ void WKBundlePageStopLoading(WKBundlePag > toImpl(pageRef)->stopLoading(); > } > >-void WKBundlePageSetDefersLoading(WKBundlePageRef pageRef, bool defersLoading) >+void WKBundlePageSetDefersLoading(WKBundlePageRef , bool ) > { >- toImpl(pageRef)->setDefersLoading(defersLoading); >+ //toImpl(pageRef)->setDefersLoading(defersLoading); > } > > WKStringRef WKBundlePageCopyRenderTreeExternalRepresentation(WKBundlePageRef pageRef)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 184991
:
338858
|
338915
|
338951
|
338955
|
338963
|
338968
|
339519
|
342768
|
342781
|
342796
|
342947
|
342973
|
342997
|
343006
|
343012
|
343014
|
343025
|
343051
|
343063
|
343073
|
343094
|
343110
|
343126
|
343354
|
343356
|
343456
|
343554
|
343574
|
343651
|
343655
|
343771
|
343774
|
343776
|
343804
|
344130
|
344805
|
344832
|
345206
|
345287
|
345311
|
345327
|
345377
|
345392
|
345405
|
345588
|
345598
|
346440
|
346558
|
346743
|
346810
|
346841
|
347144
|
347170