WebKit Bugzilla
Attachment 373642 Details for
Bug 199177
: Enable a debug WebRTC mode without any encryption
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for landing
bug-199177-20190708105437.patch (text/plain), 18.63 KB, created by
youenn fablet
on 2019-07-08 10:54:38 PDT
(
hide
)
Description:
Patch for landing
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2019-07-08 10:54:38 PDT
Size:
18.63 KB
patch
obsolete
>Subversion Revision: 247200 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index cebfd627debd4a8d93a786617c89a0550b514696..7b505131faf8bcd149807a2096c6fe9b00c6ef08 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,13 @@ >+2019-07-06 Youenn Fablet <youenn@apple.com> >+ >+ Enable a debug WebRTC mode without any encryption >+ https://bugs.webkit.org/show_bug.cgi?id=199177 >+ <rdar://problem/52074986> >+ >+ Reviewed by Eric Carlson. >+ >+ * inspector/protocol/Page.json: >+ > 2019-07-06 Michael Saboff <msaboff@apple.com> > > switch(String) needs to check for exceptions when resolving the string >diff --git a/Source/ThirdParty/libwebrtc/ChangeLog b/Source/ThirdParty/libwebrtc/ChangeLog >index 18a01aa5a7bed2e0efcecd1920852c85bd86b86e..14dc78e61b3c6bf22fc8a74a3cbdec38b08bdde1 100644 >--- a/Source/ThirdParty/libwebrtc/ChangeLog >+++ b/Source/ThirdParty/libwebrtc/ChangeLog >@@ -1,3 +1,15 @@ >+2019-07-06 Youenn Fablet <youenn@apple.com> >+ >+ Enable a debug WebRTC mode without any encryption >+ https://bugs.webkit.org/show_bug.cgi?id=199177 >+ <rdar://problem/52074986> >+ >+ Reviewed by Eric Carlson. >+ >+ * Configurations/libwebrtc.iOS.exp: >+ * Configurations/libwebrtc.iOSsim.exp: >+ * Configurations/libwebrtc.mac.exp: >+ > 2019-06-28 Dean Jackson <dino@apple.com> > > unable to build WebRTC for iOS Simulator >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 7b8f6a802ddbb804ed7015c8783704f7158d8d63..8d67c81a023b9cd7672ed71adf83746d74fa241d 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,32 @@ >+2019-07-08 Youenn Fablet <youenn@apple.com> >+ >+ Enable a debug WebRTC mode without any encryption >+ https://bugs.webkit.org/show_bug.cgi?id=199177 >+ <rdar://problem/52074986> >+ >+ Reviewed by Eric Carlson. >+ >+ For every RTCPeerConnection, first set whether to use encryption or not >+ based on page settings. >+ If encryption is disabled, log it. >+ Add internals API to toggle the switch from tests. >+ Test: webrtc/disable-encryption.html >+ >+ * Modules/mediastream/RTCPeerConnection.cpp: >+ (WebCore::RTCPeerConnection::RTCPeerConnection): >+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp: >+ (WebCore::createLibWebRTCPeerConnectionBackend): >+ * inspector/agents/InspectorPageAgent.cpp: >+ * page/Settings.yaml: >+ * platform/mediastream/libwebrtc/LibWebRTCProvider.cpp: >+ (WebCore::LibWebRTCProvider::setEnableWebRTCEncryption): >+ * platform/mediastream/libwebrtc/LibWebRTCProvider.h: >+ * testing/Internals.cpp: >+ (WebCore::Internals::resetToConsistentState): >+ (WebCore::Internals::setEnableWebRTCEncryption): >+ * testing/Internals.h: >+ * testing/Internals.idl: >+ > 2019-07-07 Zalan Bujtas <zalan@apple.com> > > [ContentChangeObserver] Difficult to control videos on iqiyi.com as the actions are mouse hover >diff --git a/Source/WebInspectorUI/ChangeLog b/Source/WebInspectorUI/ChangeLog >index 1df39540308c474a657fd4d918c8968189b1f1c8..f6ec75bfd797b236a34664e1d4cec2693c53db40 100644 >--- a/Source/WebInspectorUI/ChangeLog >+++ b/Source/WebInspectorUI/ChangeLog >@@ -1,3 +1,14 @@ >+2019-07-06 Youenn Fablet <youenn@apple.com> >+ >+ Enable a debug WebRTC mode without any encryption >+ https://bugs.webkit.org/show_bug.cgi?id=199177 >+ <rdar://problem/52074986> >+ >+ Reviewed by Eric Carlson. >+ >+ * Localizations/en.lproj/localizedStrings.js: >+ * UserInterface/Base/Main.js: >+ > 2019-07-06 Nikita Vasilyev <nvasilyev@apple.com> > > Web Inspector: Styles: unbalanced quotes and parenthesis aren't displayed as property closed after editing values >diff --git a/Source/JavaScriptCore/inspector/protocol/Page.json b/Source/JavaScriptCore/inspector/protocol/Page.json >index 769bf4b3b8f98e6c4ed39f5506955727e72f0815..8c64cfc3033ac8f0f49085c019fb260c7376dab4 100644 >--- a/Source/JavaScriptCore/inspector/protocol/Page.json >+++ b/Source/JavaScriptCore/inspector/protocol/Page.json >@@ -15,6 +15,7 @@ > "MockCaptureDevicesEnabled", > "NeedsSiteSpecificQuirks", > "ScriptEnabled", >+ "WebRTCEncryptionEnabled", > "WebSecurityEnabled" > ] > }, >diff --git a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp >index 2b06ca8fa0fd5baf25694038f3680ac137fb9465..646d8d4cbde0e62fbe27cf9a486b34314c3a7521 100644 >--- a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp >+++ b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp >@@ -247,3 +247,4 @@ __ZN6webrtc16RtpFecParametersD1Ev > __ZN6webrtc16RtpRtxParametersC1ERKS0_ > __ZN6webrtc16RtpRtxParametersD1Ev > __ZN3rtc10LogMessage12SetLogOutputENS_15LoggingSeverityEPFvS1_PKcE >+__ZN6webrtc13CryptoOptions5NoGcmEv >diff --git a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp >index 6c366cf73720a8355f4792de64ba1aa1a0275504..980c3f495139e9d86d03a5ec06cf98a89c274073 100644 >--- a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp >+++ b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp >@@ -248,3 +248,4 @@ __ZN6webrtc16RtpFecParametersD1Ev > __ZN6webrtc16RtpRtxParametersC1ERKS0_ > __ZN6webrtc16RtpRtxParametersD1Ev > __ZN3rtc10LogMessage12SetLogOutputENS_15LoggingSeverityEPFvS1_PKcE >+__ZN6webrtc13CryptoOptions5NoGcmEv >diff --git a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp >index 6c366cf73720a8355f4792de64ba1aa1a0275504..980c3f495139e9d86d03a5ec06cf98a89c274073 100644 >--- a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp >+++ b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp >@@ -248,3 +248,4 @@ __ZN6webrtc16RtpFecParametersD1Ev > __ZN6webrtc16RtpRtxParametersC1ERKS0_ > __ZN6webrtc16RtpRtxParametersD1Ev > __ZN3rtc10LogMessage12SetLogOutputENS_15LoggingSeverityEPFvS1_PKcE >+__ZN6webrtc13CryptoOptions5NoGcmEv >diff --git a/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp b/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp >index 8713fdded1711cb80b8b22fe78cd4fec10dde7a6..e439186b3aba0ae488719bcdd926632a733f889f 100644 >--- a/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp >+++ b/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp >@@ -52,6 +52,7 @@ > #include "RTCIceCandidate.h" > #include "RTCPeerConnectionIceEvent.h" > #include "RTCSessionDescription.h" >+#include "Settings.h" > #include <wtf/CryptographicallyRandomNumber.h> > #include <wtf/IsoMallocInlines.h> > #include <wtf/MainThread.h> >@@ -89,6 +90,13 @@ RTCPeerConnection::RTCPeerConnection(ScriptExecutionContext& context) > , m_backend(PeerConnectionBackend::create(*this)) > { > ALWAYS_LOG(LOGIDENTIFIER); >+ >+#if !RELEASE_LOG_DISABLED >+ auto* page = downcast<Document>(context).page(); >+ if (page && !page->settings().webRTCEncryptionEnabled()) >+ ALWAYS_LOG(LOGIDENTIFIER, "encryption is disabled"); >+#endif >+ > if (!m_backend) > m_connectionState = RTCPeerConnectionState::Closed; > } >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >index 851fddead4ce95b5a70e015be9c44a06cb7dc774..207f15e6457b9dfcac1c339ea39fea1d77859d8b 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >@@ -46,6 +46,7 @@ > #include "RealtimeOutgoingAudioSource.h" > #include "RealtimeOutgoingVideoSource.h" > #include "RuntimeEnabledFeatures.h" >+#include "Settings.h" > > namespace WebCore { > >@@ -58,6 +59,8 @@ static std::unique_ptr<PeerConnectionBackend> createLibWebRTCPeerConnectionBacke > if (!page) > return nullptr; > >+ page->libWebRTCProvider().setEnableWebRTCEncryption(page->settings().webRTCEncryptionEnabled()); >+ > return std::make_unique<LibWebRTCPeerConnectionBackend>(peerConnection, page->libWebRTCProvider()); > } > >diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp >index c6762e6386e01a495d5493e73bb88dd487d3cd75..a0f4ad81ee2a8177f03ed9f8ae6cdce67159a788 100644 >--- a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp >+++ b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp >@@ -93,6 +93,7 @@ using namespace Inspector; > macro(MockCaptureDevicesEnabled) \ > macro(NeedsSiteSpecificQuirks) \ > macro(ScriptEnabled) \ >+ macro(WebRTCEncryptionEnabled) \ > macro(WebSecurityEnabled) > > static bool decodeBuffer(const char* buffer, unsigned size, const String& textEncodingName, String* result) >diff --git a/Source/WebCore/page/Settings.yaml b/Source/WebCore/page/Settings.yaml >index e22d8d4e29023e82a0ca047c1d6f55e84d42d8a3..e628bea254a9e2809f407b30023311e36a0a5980 100644 >--- a/Source/WebCore/page/Settings.yaml >+++ b/Source/WebCore/page/Settings.yaml >@@ -846,6 +846,10 @@ shouldDispatchSyntheticMouseOutAfterSyntheticClick: > allowViewportShrinkToFitContent: > initial: true > >+webRTCEncryptionEnabled: >+ initial: true >+ inspectorOverride: true >+ > # Deprecated > > iceCandidateFilteringEnabled: >diff --git a/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp b/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp >index ffe50e663a3cea9c56373325a8a5f66a935e28ae..3aa90cfa46a7ec00e756da3fbecd52a643c72ece 100644 >--- a/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp >+++ b/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp >@@ -297,6 +297,17 @@ rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPee > return createPeerConnection(observer, *factoryAndThreads.networkManager, *factoryAndThreads.packetSocketFactory, WTFMove(configuration), nullptr); > } > >+void LibWebRTCProvider::setEnableWebRTCEncryption(bool enableWebRTCEncryption) >+{ >+ auto* factory = this->factory(); >+ if (!factory) >+ return; >+ >+ webrtc::PeerConnectionFactoryInterface::Options options; >+ options.disable_encryption = !enableWebRTCEncryption; >+ m_factory->SetOptions(options); >+} >+ > rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver& observer, rtc::NetworkManager& networkManager, rtc::PacketSocketFactory& packetSocketFactory, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration, std::unique_ptr<webrtc::AsyncResolverFactory>&& asyncResolveFactory) > { > auto& factoryAndThreads = getStaticFactoryAndThreads(m_useNetworkThreadWithSocketServer); >diff --git a/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h b/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h >index 1a184310719c84189d41443bab2f099297f18917..248572f36cf16722d548552c8e5ef1e3b4328e88 100644 >--- a/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h >+++ b/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h >@@ -116,6 +116,7 @@ public: > void clearFactory() { m_factory = nullptr; } > > void setEnableLogging(bool); >+ void setEnableWebRTCEncryption(bool); > > protected: > LibWebRTCProvider() = default; >diff --git a/Source/WebCore/testing/Internals.cpp b/Source/WebCore/testing/Internals.cpp >index 8834ffba44bb4eae0d045060bee8eec3f3c38c16..8c13877690c5ea3ccb860cee640eae336f2b2625 100644 >--- a/Source/WebCore/testing/Internals.cpp >+++ b/Source/WebCore/testing/Internals.cpp >@@ -527,6 +527,7 @@ void Internals::resetToConsistentState(Page& page) > WebCore::useRealRTCPeerConnectionFactory(rtcProvider); > rtcProvider.disableNonLocalhostConnections(); > RuntimeEnabledFeatures::sharedFeatures().setWebRTCVP8CodecEnabled(true); >+ page.settings().setWebRTCEncryptionEnabled(true); > #endif > > page.settings().setStorageAccessAPIEnabled(false); >@@ -1506,6 +1507,14 @@ void Internals::applyRotationForOutgoingVideoSources(RTCPeerConnection& connecti > { > connection.applyRotationForOutgoingVideoSources(); > } >+ >+void Internals::setEnableWebRTCEncryption(bool value) >+{ >+#if USE(LIBWEBRTC) >+ if (auto* page = contextDocument()->page()) >+ page->settings().setWebRTCEncryptionEnabled(value); >+#endif >+} > #endif > > #if ENABLE(MEDIA_STREAM) >diff --git a/Source/WebCore/testing/Internals.h b/Source/WebCore/testing/Internals.h >index 91a7e004c9296ec364d8b0d2e15828b5fe891049..b7f25802747cd2591ee3a3fa2755d4d3b70dd91b 100644 >--- a/Source/WebCore/testing/Internals.h >+++ b/Source/WebCore/testing/Internals.h >@@ -535,6 +535,7 @@ public: > void stopPeerConnection(RTCPeerConnection&); > void clearPeerConnectionFactory(); > void applyRotationForOutgoingVideoSources(RTCPeerConnection&); >+ void setEnableWebRTCEncryption(bool); > #endif > > String getImageSourceURL(Element&); >diff --git a/Source/WebCore/testing/Internals.idl b/Source/WebCore/testing/Internals.idl >index dc9752edd55941acab7f7f7fa29318c06ebbab87..0eb589f5bdc3293b092fc1c4386d9dd67893ff8a 100644 >--- a/Source/WebCore/testing/Internals.idl >+++ b/Source/WebCore/testing/Internals.idl >@@ -607,6 +607,7 @@ enum CompositingPolicy { > [Conditional=WEB_RTC] void setEnumeratingAllNetworkInterfacesEnabled(boolean enabled); > [Conditional=WEB_RTC] void stopPeerConnection(RTCPeerConnection connection); > [Conditional=WEB_RTC] void clearPeerConnectionFactory(); >+ [Conditional=WEB_RTC] void setEnableWebRTCEncryption(boolean enabled); > > [Conditional=VIDEO] void simulateSystemSleep(); > [Conditional=VIDEO] void simulateSystemWake(); >diff --git a/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js b/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js >index 224d44958befdad9b49f675c90ba624d3a9b7331..52ce95b1d12c83c7233769c017c140b84d10d52a 100644 >--- a/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js >+++ b/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js >@@ -335,6 +335,7 @@ localizedStrings["Dimensions"] = "Dimensions"; > localizedStrings["Disable Breakpoint"] = "Disable Breakpoint"; > localizedStrings["Disable Breakpoints"] = "Disable Breakpoints"; > localizedStrings["Disable Descendant Breakpoints"] = "Disable Descendant Breakpoints"; >+localizedStrings["Disable Encryption"] = "Disable Encryption"; > localizedStrings["Disable Event Listener"] = "Disable Event Listener"; > localizedStrings["Disable ICE Candidate Restrictions"] = "Disable ICE Candidate Restrictions"; > localizedStrings["Disable Program"] = "Disable Program"; >diff --git a/Source/WebInspectorUI/UserInterface/Base/Main.js b/Source/WebInspectorUI/UserInterface/Base/Main.js >index e9e6acdcaee26b486eda0a8bdb3bded2aece6053..de940ec61325e2451a5b7c174af1ef8078f84f5c 100644 >--- a/Source/WebInspectorUI/UserInterface/Base/Main.js >+++ b/Source/WebInspectorUI/UserInterface/Base/Main.js >@@ -2265,6 +2265,7 @@ WI._handleDeviceSettingsToolbarButtonClicked = function(event) > {name: WI.UIString("Allow Media Capture on Insecure Sites"), setting: PageAgent.Setting.MediaCaptureRequiresSecureConnection, value: false}, > {name: WI.UIString("Disable ICE Candidate Restrictions"), setting: PageAgent.Setting.ICECandidateFilteringEnabled, value: false}, > {name: WI.UIString("Use Mock Capture Devices"), setting: PageAgent.Setting.MockCaptureDevicesEnabled, value: true}, >+ {name: WI.UIString("Disable Encryption"), setting: PageAgent.Setting.WebRTCEncryptionEnabled, value: false}, > ], > ], > }, >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 668c3504d1983581cb1c990b609259203ce43873..fb6ba7102bd432d6c350706d38d236c77c6a9b25 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,14 @@ >+2019-07-08 Youenn Fablet <youenn@apple.com> >+ >+ Enable a debug WebRTC mode without any encryption >+ https://bugs.webkit.org/show_bug.cgi?id=199177 >+ <rdar://problem/52074986> >+ >+ Reviewed by Eric Carlson. >+ >+ * webrtc/disable-encryption-expected.txt: Added. >+ * webrtc/disable-encryption.html: Added. >+ > 2019-07-07 Zalan Bujtas <zalan@apple.com> > > [ContentChangeObserver] Difficult to control videos on iqiyi.com as the actions are mouse hover >diff --git a/LayoutTests/webrtc/disable-encryption-expected.txt b/LayoutTests/webrtc/disable-encryption-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..ddd4b8c6752a16fe75cee6dbd4bdc49b02ac7c5b >--- /dev/null >+++ b/LayoutTests/webrtc/disable-encryption-expected.txt >@@ -0,0 +1,5 @@ >+ >+ >+PASS Basic data channel exchange without encryption >+PASS Make sure a pc with encryption and a pc without encryption cannot talk >+ >diff --git a/LayoutTests/webrtc/disable-encryption.html b/LayoutTests/webrtc/disable-encryption.html >new file mode 100644 >index 0000000000000000000000000000000000000000..6749bf9d9c731e92db688709510af871a5b7944e >--- /dev/null >+++ b/LayoutTests/webrtc/disable-encryption.html >@@ -0,0 +1,50 @@ >+<!doctype html> >+<html> >+ <head> >+ <meta charset="utf-8"> >+ <title>Testing connection with and without encryption</title> >+ <script src="../resources/testharness.js"></script> >+ <script src="../resources/testharnessreport.js"></script> >+ </head> >+ <body> >+ <video id="video" autoplay playsinline></video> >+ <script src ="routines.js"></script> >+ <script> >+promise_test(async (test) => { >+ if (window.internals) >+ internals.setEnableWebRTCEncryption(false); >+ const localStream = await navigator.mediaDevices.getUserMedia({video: true}); >+ >+ video.srcObject = await new Promise((resolve, reject) => { >+ createConnections((localConnection) => { >+ localConnection.addTrack(localStream.getVideoTracks()[0], localStream); >+ }, (remoteConnection) => { >+ remoteConnection.ontrack = (event) => { >+ resolve(event.streams[0]); >+ }; >+ }); >+ setTimeout(() => { reject("Test timed out"); }, 5000); >+ }); >+ >+ await video.play(); >+}, "Basic data channel exchange without encryption"); >+ >+promise_test(async (test) => { >+ if (!window.internals) >+ return Promise.rejects("Test needs internals"); >+ >+ internals.setEnableWebRTCEncryption(false); >+ const pc1 = new RTCPeerConnection(); >+ >+ internals.setEnableWebRTCEncryption(true); >+ const pc2 = new RTCPeerConnection(); >+ >+ pc1.addTransceiver('audio'); >+ const offer = await pc1.createOffer(); >+ await pc1.setLocalDescription(offer); >+ >+ return promise_rejects(test, 'InvalidAccessError', pc2.setRemoteDescription(offer)); >+}, "Make sure a pc with encryption and a pc without encryption cannot talk"); >+ </script> >+ </body> >+</html>
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 199177
:
373151
|
373159
|
373165
|
373602
| 373642