From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C17853D6461 for ; Tue, 24 Mar 2026 14:36:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=90.155.92.199 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774363003; cv=none; b=Z7TV8yhFBlt2YwHwCuCSXcH/PKhROc6Pet3vbWPq4alfCUL0cddk0AWH57wjZzQD9RG1/CQWG1dfQP3Z9AzTbYyAjJ8xhxsw11GysEwnJj6HLM367700ftwCtTOVaLQ+tZNnRDaMRIkQDnbIaC5sA9JTN9X1IMKSHnjtI1e96aU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774363003; c=relaxed/simple; bh=hRDYzLum5hBZNFzttXhshs9lkNmY9XiDrU0SVBrz/Ec=; h=Message-ID:Subject:From:To:Cc:Date:In-Reply-To:References: Content-Type:MIME-Version; b=tRD2QGG25C3fGFR6u5WSJ+6sAebyud3WqbEQoVt7LZRt2mKhLffOC9wh1GGobtTGJvhzUxr+BQQ2J0CZ9NZSwjnaG9lk7agWnY0GIYqhjDdComH1uZhu+yix8/XeW1VxiY2HIZ+zJ7vHujvn5MTYeb4+e0c5t6V9CsMiQ79S9qY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=infradead.org; spf=none smtp.mailfrom=desiato.srs.infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=GOy1iK2d; arc=none smtp.client-ip=90.155.92.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=infradead.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=desiato.srs.infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="GOy1iK2d" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=MIME-Version:Content-Type:References: In-Reply-To:Date:Cc:To:From:Subject:Message-ID:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=hRDYzLum5hBZNFzttXhshs9lkNmY9XiDrU0SVBrz/Ec=; b=GOy1iK2dT9XBvH7V4O5QO1AGyC CzXMxfTf1DW9w2LIDTc6aved+BTFQMSxNQ66c3WptW6zpL1CEQdZKrf6cmJQpjuYq0KcXZp09cvoM SN5K83OmnFIulCLQrIhFUMzS+ncCJhnbXcMLa6StIn37mNVoUx29sb452dMwcnL0LLZGgv2Vf3qsc ttfGMZJfSOkBXXicd5Vhg64mPxgrqkDhX1uB4UixkynUWo38SM5pbzfeSklN+qBYdaTuJhjkByKCO jRWXTjQo/d9X/z42UUAc2sn/Eq+fHHyErxYVkwsLLxGtLX5IhpvRi+qotx6y72MzxZn5FTMcfxMzc h4WIz9Yg==; Received: from [172.31.31.148] (helo=u09cd745991455d.lumleys.internal) by desiato.infradead.org with esmtpsa (Exim 4.98.2 #2 (Red Hat Linux)) id 1w52s1-00000004Hjm-1rIf; Tue, 24 Mar 2026 14:36:37 +0000 Message-ID: Subject: Re: [PATCH v2 5/5] locking/rwsem: Remove reader optimistic spinning From: David Woodhouse To: "longman@redhat.com" Cc: "dave@stgolabs.net" , "linux-kernel@vger.kernel.org" , Peter Zijlstra , Ingo Molnar , Will Deacon , Davidlohr Bueso , Phil Auld Date: Tue, 24 Mar 2026 14:36:37 +0000 In-Reply-To: <57E7A552-AFFA-4860-8149-747CBA5C0541@amazon.de> References: <57E7A552-AFFA-4860-8149-747CBA5C0541@amazon.de> Content-Type: multipart/signed; micalg="sha-256"; protocol="application/pkcs7-signature"; boundary="=-7S2EZca7NrHYkQtEn68P" User-Agent: Evolution 3.52.3-0ubuntu1.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by desiato.infradead.org. See http://www.infradead.org/rpr.html --=-7S2EZca7NrHYkQtEn68P Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, 2025-05-27 at 09:08 +0000, Krcka, Tomas wrote: > Hi Waiman, >=20 > I recently discovered that this patch ( commit 617f3ef95177=20 > ("locking/rwsem: Remove reader optimistic spinning") ) results in up to 5= 0% performance drop in > real life scenarios - more processes are trying to perform operation on t= op of sysfs (read and write). > Reverting of the patch gained the performance back. My suggestion would b= e to revert the patch > from mainline as well. >=20 > I notice that degradation initially due to a workload where more processe= s are=C2=A0 accessing > same sysfs seeing up to 50% performance drop - time spent to proceed the = test. > After investigation, I traced the root cause back to two related changes: > first, when kernfs switched from mutex to rwsem (commit 7ba0273b2f34 ("ke= rnfs: switch kernfs to use an rwsem")),=20 > and ultimately to the removal of reader optimistic spinning. >=20 > The lock contention tracing shows a clear pattern: process accessing a ke= rnfs_dentry_node taking read semaphore is=20 > now forced to take the slow path since the lock is taken by another proce= ss operating on same node and needs write semaphore. > (See below ftrace for the exact operations.) >=20 > This contrasts with the previous behavior where optimistic spinning preve= nted such=20 > situations. >=20 > I have confirmed this behavior across multiple kernel versions (6.14.4, 6= .8.12, 6.6.80), as well if backporting > the mentioned commits to older versions (specifically v5.10) > While the real-world impact was observed on AArch64, I've successfully re= produced > the core issue using our test case on both AArch64 (192 vCPUs) and x86 Ic= e Lake (128 vCPUs) systems. >=20 > While I identified this through sysfs (kernfs) operations, I believe this= regression=20 > could affect other subsystems using reader-writer semaphores with similar= access=20 > patterns.=20 >=20 > ftrace with the commit showing this pattern: >=20 > """" > userspace_bench-6796=C2=A0=C2=A0=C2=A0 [000] .....=C2=A0 2328.023515: con= tention_begin: 00000000ca66c48e (flags=3DREAD) > ^^^ - waiting for lock and now all next threads will be waiting >=20 > userspace_bench-6796=C2=A0=C2=A0=C2=A0 [000] d....=C2=A0 2328.023518: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6796 prev_prio=3D120 prev= _state=3DD =3D=3D> next_comm=3Duserspace_bench next_pid=3D6798 next_prio=3D= 120 > userspace_bench-6806=C2=A0=C2=A0=C2=A0 [009] d....=C2=A0 2328.023524: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6806 prev_prio=3D120 prev= _state=3DR+ =3D=3D> next_comm=3Dmigration/9 next_pid=3D70 next_prio=3D0 > userspace_bench-6804=C2=A0=C2=A0=C2=A0 [004] d....=C2=A0 2328.023532: con= tention_begin: 00000000ca66c48e (flags=3DWRITE) > userspace_bench-6805=C2=A0=C2=A0=C2=A0 [005] d....=C2=A0 2328.023532: con= tention_begin: 00000000ca66c48e (flags=3DWRITE) > userspace_bench-6804=C2=A0=C2=A0=C2=A0 [004] d....=C2=A0 2328.023533: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6804 prev_prio=3D120 prev= _state=3DD =3D=3D> next_comm=3Dswapper/4 next_pid=3D0 next_prio=3D120 > userspace_bench-6797=C2=A0=C2=A0=C2=A0 [001] .....=C2=A0 2328.023534: con= tention_begin: 00000000ca66c48e (flags=3DREAD) >=20 > ... [cut] ....=20 >=20 > userspace_bench-6807=C2=A0=C2=A0=C2=A0 [007] .....=C2=A0 2328.023661: con= tention_begin: 00000000ca66c48e (flags=3DREAD) > userspace_bench-6807=C2=A0=C2=A0=C2=A0 [007] d....=C2=A0 2328.023666: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6807 prev_prio=3D120 prev= _state=3DD =3D=3D> next_comm=3Dswapper/7 next_pid=3D0 next_prio=3D120 > userspace_bench-6813=C2=A0=C2=A0=C2=A0 [013] .....=C2=A0 2328.023669: con= tention_begin: 00000000ca66c48e (flags=3DREAD) > userspace_bench-6815=C2=A0=C2=A0=C2=A0 [015] .....=C2=A0 2328.023673: con= tention_begin: 00000000ca66c48e (flags=3DREAD) > userspace_bench-6813=C2=A0=C2=A0=C2=A0 [013] d....=C2=A0 2328.023674: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6813 prev_prio=3D120 prev= _state=3DD =3D=3D> next_comm=3Dswapper/13 next_pid=3D0 next_prio=3D120 > userspace_bench-6815=C2=A0=C2=A0=C2=A0 [015] d....=C2=A0 2328.023675: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6815 prev_prio=3D120 prev= _state=3DD =3D=3D> next_comm=3Dswapper/15 next_pid=3D0 next_prio=3D120 > userspace_bench-6803=C2=A0=C2=A0=C2=A0 [003] .....=C2=A0 2328.026170: con= tention_begin: 00000000ca66c48e (flags=3DREAD) > userspace_bench-6803=C2=A0=C2=A0=C2=A0 [003] d....=C2=A0 2328.026171: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6803 prev_prio=3D120 prev= _state=3DD =3D=3D> next_comm=3Dswapper/3 next_pid=3D0 next_prio=3D120 > userspace_bench-6798=C2=A0=C2=A0=C2=A0 [000] d....=C2=A0 2328.027162: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6798 prev_prio=3D120 prev= _state=3DR =3D=3D> next_comm=3Duserspace_bench next_pid=3D6800 next_prio=3D= 120 > userspace_bench-6799=C2=A0=C2=A0=C2=A0 [001] d....=C2=A0 2328.027162: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6799 prev_prio=3D120 prev= _state=3DR =3D=3D> next_comm=3Duserspace_bench next_pid=3D6801 next_prio=3D= 120 > userspace_bench-6800=C2=A0=C2=A0=C2=A0 [000] .....=C2=A0 2328.027165: con= tention_begin: 00000000ca66c48e (flags=3DREAD) > userspace_bench-6801=C2=A0=C2=A0=C2=A0 [001] .....=C2=A0 2328.027166: con= tention_begin: 00000000ca66c48e (flags=3DREAD) > userspace_bench-6800=C2=A0=C2=A0=C2=A0 [000] d....=C2=A0 2328.027167: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6800 prev_prio=3D120 prev= _state=3DD =3D=3D> next_comm=3Duserspace_bench next_pid=3D6796 next_prio=3D= 120 > userspace_bench-6801=C2=A0=C2=A0=C2=A0 [001] d....=C2=A0 2328.027167: sch= ed_switch: prev_comm=3Duserspace_bench prev_pid=3D6801 prev_prio=3D120 prev= _state=3DD =3D=3D> next_comm=3Duserspace_bench next_pid=3D6799 next_prio=3D= 120 > userspace_bench-6796=C2=A0=C2=A0=C2=A0 [000] .....=C2=A0 2328.027168: con= tention_end: 00000000ca66c48e (ret=3D0) > ^^^^ -- here the READer got the lock - it took ~3ms to get the lock > """" > without the commit we don't see any of the above waiting and the processe= s are only in the optimistic spinning. >=20 >=20 > In our situation the writer is doing this operation > """ > userspace_bench-6800=C2=A0=C2=A0=C2=A0=C2=A0 [031] .....=C2=A0=C2=A0=C2= =A0=C2=A0 0.251700: contention_begin: 000000007a4d517c (ret=3D0) > userspace_bench-6800=C2=A0=C2=A0=C2=A0=C2=A0 [031] .....=C2=A0=C2=A0=C2= =A0=C2=A0 0.251700: > =3D> __traceiter_contention_fastpath > =3D> rwsem_down_write_slowpath > =3D> down_write > =3D> kernfs_activate > =3D> kernfs_add_one > =3D> __kernfs_create_file > =3D> sysfs_add_file_mode_ns > =3D> internal_create_group > =3D> internal_create_groups.part.6 > =3D> sysfs_create_groups > """ >=20 > and the reader is doing this - both are taking the same semaphore > """ > userspace_bench-6801=C2=A0=C2=A0=C2=A0=C2=A0 [095] .....=C2=A0=C2=A0=C2= =A0=C2=A0 0.251700: contention_begin: 000000007a4d517c (flags=3DREAD) > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 usersp= ace_bench-6801=C2=A0=C2=A0=C2=A0=C2=A0 [095] .....=C2=A0=C2=A0=C2=A0=C2=A0 = 0.251700: > =3D> __traceiter_contention_begin > =3D> rwsem_down_read_slowpath > =3D> down_read > =3D> kernfs_dop_revalidate > =3D> lookup_fast > =3D> walk_component > =3D> link_path_walk.part.74 > =3D> path_openat > =3D> do_filp_open > =3D> do_sys_openat2 > =3D> do_sys_open > """ >=20 > ---- >=20 > To help investigate this issue, I've created a minimal reproduction case: > 1. Test repository: https://github.com/tomaskrcka/sysfs_bench > 2. The test consists of: > =C2=A0 - A kernel module that creates sysfs interface and handles file op= erations > =C2=A0 - A userspace application that spawns writers (matching CPU core c= ount) and readers >=20 > Using the test case on kernel 6.14.4, I collected the following measureme= nts=20 > (100 samples each): >=20 > On AArch64 c8g (192 vCPUs): > - Without revert: > =C2=A0* Avg: 3.50s (min: 3.39s, max: 3.63s, p99: 3.59s) > - With revert: > =C2=A0* Avg: 2.70s (min: 2.65s, max: 3.10s, p99: 2.83s) > =C2=A0* ~23% improvement >=20 > On x86 Ice Lake m6i (128 vCPUs): > - Without revert: > =C2=A0* Avg: 6.71s (min: 6.61s, max: 7.60s, p99: 6.82s) > - With revert: > =C2=A0* Avg: 6.28s (min: 5.89s, max: 7.52s, p99: 6.65s) > =C2=A0* ~6% improvement >=20 > Could you take a look on that and let me know your thoughts ? >=20 > I=E2=80=99m happy to help with further investigation. Any word on this? We're still carrying a patch to revert it because of the regression (as well as patches to revert the change of kernfs to rwsem because that was a massive performance regression too). --=-7S2EZca7NrHYkQtEn68P Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Disposition: attachment; filename="smime.p7s" Content-Transfer-Encoding: base64 MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCCD9Aw ggSOMIIDdqADAgECAhAOmiw0ECVD4cWj5DqVrT9PMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYT AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAi BgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yNDAxMzAwMDAwMDBaFw0zMTEx MDkyMzU5NTlaMEExCzAJBgNVBAYTAkFVMRAwDgYDVQQKEwdWZXJva2V5MSAwHgYDVQQDExdWZXJv a2V5IFNlY3VyZSBFbWFpbCBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMjvgLKj jfhCFqxYyRiW8g3cNFAvltDbK5AzcOaR7yVzVGadr4YcCVxjKrEJOgi7WEOH8rUgCNB5cTD8N/Et GfZI+LGqSv0YtNa54T9D1AWJy08ZKkWvfGGIXN9UFAPMJ6OLLH/UUEgFa+7KlrEvMUupDFGnnR06 aDJAwtycb8yXtILj+TvfhLFhafxroXrflspavejQkEiHjNjtHnwbZ+o43g0/yxjwnarGI3kgcak7 nnI9/8Lqpq79tLHYwLajotwLiGTB71AGN5xK+tzB+D4eN9lXayrjcszgbOv2ZCgzExQUAIt98mre 8EggKs9mwtEuKAhYBIP/0K6WsoMnQCcCAwEAAaOCAVwwggFYMBIGA1UdEwEB/wQIMAYBAf8CAQAw HQYDVR0OBBYEFIlICOogTndrhuWByNfhjWSEf/xwMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6en IZ3zbcgPMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDBAYIKwYBBQUHAwIweQYI KwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYB BQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RD QS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 QXNzdXJlZElEUm9vdENBLmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQELBQADggEB ACiagCqvNVxOfSd0uYfJMiZsOEBXAKIR/kpqRp2YCfrP4Tz7fJogYN4fxNAw7iy/bPZcvpVCfe/H /CCcp3alXL0I8M/rnEnRlv8ItY4MEF+2T/MkdXI3u1vHy3ua8SxBM8eT9LBQokHZxGUX51cE0kwa uEOZ+PonVIOnMjuLp29kcNOVnzf8DGKiek+cT51FvGRjV6LbaxXOm2P47/aiaXrDD5O0RF5SiPo6 xD1/ClkCETyyEAE5LRJlXtx288R598koyFcwCSXijeVcRvBB1cNOLEbg7RMSw1AGq14fNe2cH1HG W7xyduY/ydQt6gv5r21mDOQ5SaZSWC/ZRfLDuEYwggWbMIIEg6ADAgECAhAH5JEPagNRXYDiRPdl c1vgMA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAkFVMRAwDgYDVQQKEwdWZXJva2V5MSAwHgYD VQQDExdWZXJva2V5IFNlY3VyZSBFbWFpbCBHMjAeFw0yNDEyMzAwMDAwMDBaFw0yODAxMDQyMzU5 NTlaMB4xHDAaBgNVBAMME2R3bXcyQGluZnJhZGVhZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDali7HveR1thexYXx/W7oMk/3Wpyppl62zJ8+RmTQH4yZeYAS/SRV6zmfXlXaZ sNOE6emg8WXLRS6BA70liot+u0O0oPnIvnx+CsMH0PD4tCKSCsdp+XphIJ2zkC9S7/yHDYnqegqt w4smkqUqf0WX/ggH1Dckh0vHlpoS1OoxqUg+ocU6WCsnuz5q5rzFsHxhD1qGpgFdZEk2/c//ZvUN i12vPWipk8TcJwHw9zoZ/ZrVNybpMCC0THsJ/UEVyuyszPtNYeYZAhOJ41vav1RhZJzYan4a1gU0 kKBPQklcpQEhq48woEu15isvwWh9/+5jjh0L+YNaN0I//nHSp6U9COUG9Z0cvnO8FM6PTqsnSbcc 0j+GchwOHRC7aP2t5v2stVx3KbptaYEzi4MQHxm/0+HQpMEVLLUiizJqS4PWPU6zfQTOMZ9uLQRR ci+c5xhtMEBszlQDOvEQcyEG+hc++fH47K+MmZz21bFNfoBxLP6bjR6xtPXtREF5lLXxp+CJ6KKS blPKeVRg/UtyJHeFKAZXO8Zeco7TZUMVHmK0ZZ1EpnZbnAhKE19Z+FJrQPQrlR0gO3lBzuyPPArV hvWxjlO7S4DmaEhLzarWi/ze7EGwWSuI2eEa/8zU0INUsGI4ywe7vepQz7IqaAovAX0d+f1YjbmC VsAwjhLmveFjNwIDAQABo4IBsDCCAawwHwYDVR0jBBgwFoAUiUgI6iBOd2uG5YHI1+GNZIR//HAw HQYDVR0OBBYEFFxiGptwbOfWOtMk5loHw7uqWUOnMDAGA1UdEQQpMCeBE2R3bXcyQGluZnJhZGVh ZC5vcmeBEGRhdmlkQHdvb2Rob3Uuc2UwFAYDVR0gBA0wCzAJBgdngQwBBQEBMA4GA1UdDwEB/wQE AwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwewYDVR0fBHQwcjA3oDWgM4YxaHR0 cDovL2NybDMuZGlnaWNlcnQuY29tL1Zlcm9rZXlTZWN1cmVFbWFpbEcyLmNybDA3oDWgM4YxaHR0 cDovL2NybDQuZGlnaWNlcnQuY29tL1Zlcm9rZXlTZWN1cmVFbWFpbEcyLmNybDB2BggrBgEFBQcB AQRqMGgwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBABggrBgEFBQcwAoY0 aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL1Zlcm9rZXlTZWN1cmVFbWFpbEcyLmNydDANBgkq hkiG9w0BAQsFAAOCAQEAQXc4FPiPLRnTDvmOABEzkIumojfZAe5SlnuQoeFUfi+LsWCKiB8Uextv iBAvboKhLuN6eG/NC6WOzOCppn4mkQxRkOdLNThwMHW0d19jrZFEKtEG/epZ/hw/DdScTuZ2m7im 8ppItAT6GXD3aPhXkXnJpC/zTs85uNSQR64cEcBFjjoQDuSsTeJ5DAWf8EMyhMuD8pcbqx5kRvyt JPsWBQzv1Dsdv2LDPLNd/JUKhHSgr7nbUr4+aAP2PHTXGcEBh8lTeYea9p4d5k969pe0OHYMV5aL xERqTagmSetuIwolkAuBCzA9vulg8Y49Nz2zrpUGfKGOD0FMqenYxdJHgDCCBZswggSDoAMCAQIC EAfkkQ9qA1FdgOJE92VzW+AwDQYJKoZIhvcNAQELBQAwQTELMAkGA1UEBhMCQVUxEDAOBgNVBAoT B1Zlcm9rZXkxIDAeBgNVBAMTF1Zlcm9rZXkgU2VjdXJlIEVtYWlsIEcyMB4XDTI0MTIzMDAwMDAw MFoXDTI4MDEwNDIzNTk1OVowHjEcMBoGA1UEAwwTZHdtdzJAaW5mcmFkZWFkLm9yZzCCAiIwDQYJ KoZIhvcNAQEBBQADggIPADCCAgoCggIBANqWLse95HW2F7FhfH9bugyT/danKmmXrbMnz5GZNAfj Jl5gBL9JFXrOZ9eVdpmw04Tp6aDxZctFLoEDvSWKi367Q7Sg+ci+fH4KwwfQ8Pi0IpIKx2n5emEg nbOQL1Lv/IcNiep6Cq3DiyaSpSp/RZf+CAfUNySHS8eWmhLU6jGpSD6hxTpYKye7PmrmvMWwfGEP WoamAV1kSTb9z/9m9Q2LXa89aKmTxNwnAfD3Ohn9mtU3JukwILRMewn9QRXK7KzM+01h5hkCE4nj W9q/VGFknNhqfhrWBTSQoE9CSVylASGrjzCgS7XmKy/BaH3/7mOOHQv5g1o3Qj/+cdKnpT0I5Qb1 nRy+c7wUzo9OqydJtxzSP4ZyHA4dELto/a3m/ay1XHcpum1pgTOLgxAfGb/T4dCkwRUstSKLMmpL g9Y9TrN9BM4xn24tBFFyL5znGG0wQGzOVAM68RBzIQb6Fz758fjsr4yZnPbVsU1+gHEs/puNHrG0 9e1EQXmUtfGn4InoopJuU8p5VGD9S3Ikd4UoBlc7xl5yjtNlQxUeYrRlnUSmdlucCEoTX1n4UmtA 9CuVHSA7eUHO7I88CtWG9bGOU7tLgOZoSEvNqtaL/N7sQbBZK4jZ4Rr/zNTQg1SwYjjLB7u96lDP sipoCi8BfR35/ViNuYJWwDCOEua94WM3AgMBAAGjggGwMIIBrDAfBgNVHSMEGDAWgBSJSAjqIE53 a4blgcjX4Y1khH/8cDAdBgNVHQ4EFgQUXGIam3Bs59Y60yTmWgfDu6pZQ6cwMAYDVR0RBCkwJ4ET ZHdtdzJAaW5mcmFkZWFkLm9yZ4EQZGF2aWRAd29vZGhvdS5zZTAUBgNVHSAEDTALMAkGB2eBDAEF AQEwDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDB7BgNVHR8E dDByMDegNaAzhjFodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vVmVyb2tleVNlY3VyZUVtYWlsRzIu Y3JsMDegNaAzhjFodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vVmVyb2tleVNlY3VyZUVtYWlsRzIu Y3JsMHYGCCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t MEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vVmVyb2tleVNlY3VyZUVt YWlsRzIuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQBBdzgU+I8tGdMO+Y4AETOQi6aiN9kB7lKWe5Ch 4VR+L4uxYIqIHxR7G2+IEC9ugqEu43p4b80LpY7M4KmmfiaRDFGQ50s1OHAwdbR3X2OtkUQq0Qb9 6ln+HD8N1JxO5nabuKbymki0BPoZcPdo+FeRecmkL/NOzzm41JBHrhwRwEWOOhAO5KxN4nkMBZ/w QzKEy4PylxurHmRG/K0k+xYFDO/UOx2/YsM8s138lQqEdKCvudtSvj5oA/Y8dNcZwQGHyVN5h5r2 nh3mT3r2l7Q4dgxXlovERGpNqCZJ624jCiWQC4ELMD2+6WDxjj03PbOulQZ8oY4PQUyp6djF0keA MYIDuzCCA7cCAQEwVTBBMQswCQYDVQQGEwJBVTEQMA4GA1UEChMHVmVyb2tleTEgMB4GA1UEAxMX VmVyb2tleSBTZWN1cmUgRW1haWwgRzICEAfkkQ9qA1FdgOJE92VzW+AwDQYJYIZIAWUDBAIBBQCg ggE3MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI2MDMyNDE0MzYz N1owLwYJKoZIhvcNAQkEMSIEIPLn3ARbMNzhNCHtShIF0+E9CtnRj9Z9mgRLEHDlC3TbMGQGCSsG AQQBgjcQBDFXMFUwQTELMAkGA1UEBhMCQVUxEDAOBgNVBAoTB1Zlcm9rZXkxIDAeBgNVBAMTF1Zl cm9rZXkgU2VjdXJlIEVtYWlsIEcyAhAH5JEPagNRXYDiRPdlc1vgMGYGCyqGSIb3DQEJEAILMVeg VTBBMQswCQYDVQQGEwJBVTEQMA4GA1UEChMHVmVyb2tleTEgMB4GA1UEAxMXVmVyb2tleSBTZWN1 cmUgRW1haWwgRzICEAfkkQ9qA1FdgOJE92VzW+AwDQYJKoZIhvcNAQEBBQAEggIAY7RW+FxDpDlf cGQYn5EtWxfENujYIMv+zAByuzal4FjHjFE2lgvXJBLHHKpRY3h63dZeS3lEgpx+PNeDSJNWXWx4 1sh2pmXVj4IISHerReDwhBw1vf0mMuF4bdn9nxo2mxK9Dbno23fg4klmXukcy0ZDTGkKFEKNTfTG jlEfVNcXLFrsWRoZ1tZK3/r83SQZWts8wtqny+BUKRqIMcvke7bVglob0j8DF3EtIz9poJ0KIBJ6 JoNzWm4I1HXlOjLO3SRfcYAHjQY9t7n9Rffmg0eO6nypCz3D1Bubqtyatgo5HUD+H+HGhyhEkYIG uvguv6t5gjVr9jHMTnTugzCwvY5vFxPQ5nIB78880k6KMMPjpnK9+f0T/WIRHJ7Lhe+j3SgGa+vb AOHpb+tGj6OC3fGxKNIXtCUMRCvOxXV8TzGb3PRYDQU5i7WXUXh328K+UNtME8fyMGwC0gAV/RO+ /b9+1wKuqKUPMufnBEpJGOKB5l/2G9saqOvuB8al/1nF3WobP0jpn0LmV8L/g5g2csONISMXSOiU pqEeFwP7vjPPL9tcYwgzqXvt5KjOJZi1qM+bkjeHs5kPdQKTQQVLTcjnuGP15m6VDLnpWTyGxSQB VLMDM1FWlF9rFNRBsKV05J6BBt7xd5iwj1xJ0xM86B0JJRRoVkJtAE3AMCLhEPMAAAAAAAA= --=-7S2EZca7NrHYkQtEn68P--