Commit graph android_packages_modules_Co.../tests/unit/java/com/android
Message SHA1
Merge "Move package enumeration out of PermissionMonitor" into main
Junyu Lai   authored and   Android (Google) Code Review   commited 2025-04-23 22:43:39 -07:00
4aa806dc20
Merge changes Id6191d5a,I9ace3ed0,Ic79afc18 into main
* changes:
  Add light-weight DefferedBroadcastReceiver for handling broadcast events
  Move user intent reception out of SatelliteAccessController
  Move user/package intent reception out of PermissionMonitor

Jean Chalard   authored and   Android (Google) Code Review   commited 2025-04-23 21:50:19 -07:00
0d578113f7
Move package enumeration out of PermissionMonitor
The PackageManager#getInstallPackagesAsUser method is time
consuming (30~200ms) and blocks boot time while it executes.
This change moves the getInstallPackagesAsUser
method from PermissionMonitor. This is a performance-focused
refactoring to allow for efficient sharing of package enumeration
results in subsequent changes, avoiding redundant time-consuming
operations.

Flag: EXEMPT refactor
Test: atest ConnectivityCoverageTests:android.net.connectivity.com.android.server.connectivity.SatelliteAccessControllerTest \
      ConnectivityCoverageTests: android.net.connectivity.com.android.server.ConnectivityServiceTest
Test: atest ConnectivityCoverageTests:android.net.connectivity.com.android.server.connectivity.PermissionMonitorTest \
      ConnectivityCoverageTests:android.net.connectivity.com.android.server.connectivity.BroadcastReceiveHelperTest \
      --update-device
Bug: 410731080
Change-Id: I3929fa28ff9419329622f3abdf10336289730607

Junyu Lai   commited 2025-04-24 11:43:11 +08:00
830b579081
Add light-weight DefferedBroadcastReceiver for handling broadcast events
This commit introduces the DeferredBroadcastReceiver class, which
defers received Intent handling using a Handler. It prevents
Application Not Responding (ANR) errors by offloading potentially
time-consuming or blocking operations triggered by broadcast
event handling, even if `onReceive` takes a long time on the
handler thread.

Flag: EXEMPT refactor
Test: atest ConnectivityCoverageTests:android.net.connectivity.com.android.server.connectivity.PermissionMonitorTest \
      ConnectivityCoverageTests:android.net.connectivity.com.android.server.ConnectivityServiceTest \
      ConnectivityCoverageTests:android.net.connectivity.com.android.server.connectivity.BroadcastReceiveHelperTest \
      --update-device
Bug: 410731080
Change-Id: Id6191d5ad9ae9f17fca3236110573340aa713048

Junyu Lai   commited 2025-04-24 10:50:44 +08:00
244f3e3df2
Move user intent reception out of SatelliteAccessController
This is a no-op refactoring that moves the reception of
user-related intents in SatelliteAccessController to
ConnectivityService.
It then dispatches these events to the SatelliteAccessController.

Flag: EXEMPT refactor
Test: atest ConnectivityCoverageTests:android.net.connectivity.com.android.server.connectivity.SatelliteAccessControllerTest \
  ConnectivityCoverageTests:android.net.connectivity.com.android.server.ConnectivityServiceTest
Bug: 410731080
Change-Id: I9ace3ed09a161446dc92d40bc0d400e32051de32

Junyu Lai   commited 2025-04-24 10:50:44 +08:00
b14633ea2f
Move user/package intent reception out of PermissionMonitor
This is a no-op refactoring that moves the reception of
package and user-related intents in PermissionMonitor to
BroadcastReceiveHelper.
It then dispatches these events to the PermissionMonitor.
This change is necessary to centralize intent receivers
from other subclasses to ConnectivityService in
subsequent modifications.

This reverts the design change introduced in aosp/2183343, which
had PermissionMonitor listening to user change events instead
of ConnectivityService.

Flag: EXEMPT refactor
Test: atest ConnectivityCoverageTests:android.net.connectivity.com.android.server.connectivity.PermissionMonitorTest \
      ConnectivityCoverageTests:android.net.connectivity.com.android.server.ConnectivityServiceTest \
      ConnectivityCoverageTests:android.net.connectivity.com.android.server.connectivity.BroadcastReceiveHelperTest \
      --update-device
Bug: 410731080
Change-Id: Ic79afc18a6e8603ddf8d48a1f78cf8d98f2447ae

Junyu Lai   commited 2025-04-24 10:50:44 +08:00
8b1fe1976b
Improve the tests for the fallback network shell command.
- Also verify the netd operations that add and remove UID ranges.
- Don't set the network to keep connected, since that is not
  representative of what happens on a real device.

Test: test-only change
Bug: 410731080
Flag: TEST_ONLY
Change-Id: Ib4305748b5f1627546b7a63fb9596308b14155e0

Lorenzo Colitti   commited 2025-04-23 12:03:57 +09:00
c9baec4101
Add a shell command to set an app's fallback default network.
This adds two new shell commands to ConnectivityService that sets
a given UID to fall back to a given transport type if there is no
system default network. The syntax is:

  cmd connectivity set-debug-fallback-network-for-uid <uid> <transport>
  cmd connectivity clear-debug-fallback-network-for-uid <uid>

This works only on debug builds and should be used only for
manual testing.

Test: none yet
Bug: 410731080
Flag: TEST_ONLY
Change-Id: I9e0ac0713dbb95e59b22faa7cd45bdc8c1070f08

Lorenzo Colitti   commited 2025-04-22 22:46:34 +09:00
4a8e41d2ae
Simplify and correct isNetworkPotentialSatisfier.
This makes the code clearer, and also fixes a bug: currently, a
TRACK_DEFAULT request in a multilayer request can cause a network
to remain needed. This is incorrect: only requests should be able
to keep a network up.

This prevents satellite networking from disconnecting when the
default network reappears (see changes in unit test).

This CL removes the code before the loop that special-cases
non-multilayer listens because it is not very useful. Any
non-multilayer listen will either:
- Immediately return false, if it's the active request, or:
- Cause the code to continue (because it's not the active
  request), and because mRequests only has one element, will
  hit the "return false" statement after the loop.

Flag: EXEMPT bug fix
Test: covered by existing tests
Change-Id: I7295ce469335af924aa20b7976cc4a9136ef5d61

Lorenzo Colitti   commited 2025-04-22 22:02:40 +09:00
dd577efdde
Add a test for NetworkCallbacks for fallback satellite networks.
Bug: 410731080
Flag: TEST_ONLY
Test: test-only change
Change-Id: If74f461bca2bc34b1defa841e05237849f4c1c4a

Lorenzo Colitti   commited 2025-04-22 22:01:59 +09:00
eda7af89fe
Merge "Ignore IPv6 temporary addresses in mDNS advertising." into main
Yuyang Huang   authored and   Android (Google) Code Review   commited 2025-04-21 00:48:54 -07:00
6df77e382d
Ignore IPv6 temporary addresses in mDNS advertising.
This commit modifies the mDNS advertising process to ignore IPv6
temporary addresses. These addresses are ephemeral and can lead to large
advertising packets and negatively impact mDNS offload(as RAM for doing
mDNS offload is limited), especially on devices with long internet
connections and multiple temporary addresses.  Ignoring them provides a
more stable and efficient mDNS advertising
experience.

Flag: EXEMPT mainline
Test: TH
Change-Id: I79c7f331eb29ecdd7ade4ccde1d1a22d0dbf1400

Yuyang Huang   commited 2025-04-21 14:57:12 +09:00
2184846d35
Merge "Update enforceMeteredApnPolicy to follow the compat flag" into main
Treehugger Robot   authored and   Android (Google) Code Review   commited 2025-04-20 22:15:06 -07:00
2c8f7b5608
Merge changes Id3a9d374,If67ebaa2 into main
* changes:
  Fix a callback leak in tests using CSAgentWrapper.
  Make dumpAllRequestInfoLogsToLogcat accessible to tests.

Treehugger Robot   authored and   Android (Google) Code Review   commited 2025-04-20 20:56:03 -07:00
ae1b72bd80
Update enforceMeteredApnPolicy to follow the compat flag
On V+, ConnectivityService uses uid blocking state in BpfMap instead of
asking NetworkPolicyManager.
But, there was one behavior difference because NetworkPolicyManager
considers the network is always not blocked for apps without Internet
permission.
To ensure backward compatibility, the
NETWORK_BLOCKED_WITHOUT_INTERNET_PERMISSION flag was introduced in
aosp/3076606, aosp/3088285.

This CL updates enforceMeteredApnPolicy to respect this flag for
backward compatibility.

Test: CSEnforceMeteredApnPolicy
Bug: 404428733
Bug: 370383309
Flag: EXEMPT bugfix
Change-Id: I631f4f840818e1d40f20fccae1ec1a2cbbb6a166

Motomu Utsumi   commited 2025-04-21 12:19:45 +09:00
5759bf45a5
Merge "Format MdnsRecordRepositoryTest with ktlint" into main
Yuyang Huang   authored and   Android (Google) Code Review   commited 2025-04-20 19:49:05 -07:00
eae525f200
Fix a callback leak in tests using CSAgentWrapper.
The method above this one (connect) unregisters the callback, but
disconnect doesn't. Looks like it was just missed in code review.

Flag: TEST_ONLY
Test: test-only change
Change-Id: Id3a9d3748554275fd28d8bf2ff2b6fa42be24ddc

Lorenzo Colitti   commited 2025-04-21 11:20:24 +09:00
7a0a9dd096
Format MdnsRecordRepositoryTest with ktlint
Test: TH
Flag: EXEMPT test only
Change-Id: I9d39a2927df5d09183c30140ed2e2b22f457a5bf

Yuyang Huang   commited 2025-04-20 14:50:12 +09:00
ecdc5d7743
CSTest: overload Agent with the given parameters.
CSTest already has an Agent function helper. Instead of using a new
function to create a network agent based on the given parameters,
it's better to overload the existing Agent function.

Flag: EXEMPT test-only change
Bug: 368416967
Test: atest ConnectivityCoverageTests
Change-Id: I134a96f564111ba65ddd5f8ec7878aeeab340dee

Xiao Ma   commited 2025-04-17 17:28:45 +09:00
926df9a9ab
CSTest: move nc function helper to CSTestHelpers.
Flag: EXEMPT test-only change
Bug: 368416967
Test: atest ConnectivityCoverageTests
Change-Id: I022bb5ab026fefec82a4b2a260b9167ef7891e96

Xiao Ma   commited 2025-04-17 15:56:43 +09:00
4eb7a669e5
Rename FdWrapper to TunWrapper
For clarity, as it doesn't support wrapping any fd. If the fd is a
connected socket, it must be shutdown() to interrupt blocking
operations. Tun doesn not require shutdown(), so TunWrapper is a better
name.

Test: TH
Flag: EXEMPT mainline
Bug: 1000001
Change-Id: I2f7af95ef8d9ebceefdfc479c04e0272b2cb7311

Patrick Rohr   commited 2025-04-16 15:16:05 -07:00
18ec5811ec
Remove unnecessary shutdown() calls
For some reason, I used to believe shutdown() was required for tun
interface fds. As it turns out, it isn't and throws an error every time
it is called:

    shutdown failed: ENOTSOCK (Socket operation on non-socket)

This change removes all calls to shutdown() including the shutdownRead()
and shutdownWrite() interface methods.

Test: TH
Flag: EXEMPT mainline
Bug: 1000001
Change-Id: I5a1716f82426b24db9e05367f82dc4080762e288

Patrick Rohr   commited 2025-04-16 15:16:05 -07:00
48ac9543c3
Merge "Fix a bug where non-VPN networks would update VPN uids." into main
Jean Chalard   authored and   Android (Google) Code Review   commited 2025-04-13 17:24:59 -07:00
8a7ea6fde6
Fix a bug where non-VPN networks would update VPN uids.
Previously, non VPNs would not be created when updateVpnUids()
is called inside handleRegisterNetworkAgent. Because the network
is not created, netd would refuse to set the UIDs with an error.
Now that networks are created immediately with the
QUEUE_NETWORK_AGENT_EVENTS_IN_SYSTEM_SERVER flag,
the network is created and netd does set the UID for any
network as if they were a VPN. This results in the UID having
the wrong default network, which in turns prevents it from
accessing Internet.

Test: new test in this patch
Bug: 408717088
Flag: EXEMPT bugfix
Change-Id: If68ea7d60919c0c7e177480f6167196381e00f35

Chalard Jean   commited 2025-04-12 09:33:54 +09:00
97e6901697
Fix/Suppress issues for errorprone update
When updating errorprone to 2.27.0, it finds new issues that cause the build to fail.

Flag: EXEMPT refactor
Bug: 253827323
Test: RUN_ERROR_PRONE=true m javac-check
Change-Id: I9c70d64e1f1e43be3bc1d9af8413548d10c8d490

Cole Faust   commited 2025-04-11 13:58:06 -07:00
8995a1fb73
De-duplicate the createWifiAgent func in the CS unit test.
Flag: EXEMPT test-only change
Bug: 368416967
Test: atest ConnectivityCoverageTests
Change-Id: Id51f39c1f2043474632b07a462fc23238115a33f

Xiao Ma   commited 2025-04-09 11:20:17 +09:00
dd9c3d3beb
De-duplicate the nc func in the CS unit test.
Flag: EXEMPT test-only change
Bug: 368416967
Test: atest ConnectivityCoverageTests
Change-Id: Idc02d6fce816ccf7aa3512d5b8f1f7a55cf1a676

Xiao Ma   commited 2025-04-09 11:20:17 +09:00
a118d86378
De-duplicate the lp func with the default lp.
Flag: EXEMPT test-only change
Bug: 368416967
Test: atest ConnectivityCoverageTests
Change-Id: I59436a257bea3b0e50b2b532b64f21ca5102f610

Xiao Ma   commited 2025-04-08 02:03:48 -07:00
f41687cae1
Merge "Delete TextStrings, only keep TextEntries" into main
Remi NGUYEN VAN   authored and   Android (Google) Code Review   commited 2025-04-07 23:28:02 -07:00
ceef633a80
Delete TextStrings, only keep TextEntries
TextStrings was kept for backwards compatibility when the code was used
outside of Android, but is not necessary in the Android version as only
TextEntries are used.

Test: atest
Flag: EXEMPT refactor
Change-Id: If70fe1512570dd55019eac06cfce91639fd04b11

Remi NGUYEN VAN   commited 2025-04-08 12:43:57 +09:00
937cab001a
Merge "Ensure PacketHandler is removed from sockets" into main
Treehugger Robot   authored and   Android (Google) Code Review   commited 2025-04-06 19:37:26 -07:00
a45c2e8cda
Ensure PacketHandler is removed from sockets
When MdnsMultinetworkSocketClient stops using a socket (when
isSocketActive starts returning false), the packet handler should be
removed from that socket. The code only removed it from the
mSocketPacketHandlers map without clearing it from the socket.

This caused packets to be handled potentially many times, affecting
performance.

Bug: 406623719
Bug: 408324621
Test: atest
Flag: EXEMPT bugfix
Change-Id: I3d1117a4b847f3b95a01fc8a5997a53655ef608a

Remi NGUYEN VAN   commited 2025-04-04 13:34:45 +09:00
b5fbc0143a
Allow tagging sockets with a specified tag
Address the TODO to allow tagging sockets, which was done before the
code was imported to the Android codebase.

Also remove the comment in MdnsSocket, as the tagging is already done by
setting the thread tag, and tagSocket in the original code actually did
nothing for DatagramSockets.

The option is unset in the Android repository, so this code is unused
there.

Test: atest
Flag: EXEMPT unused in Android repo
Change-Id: Ifccc4ec2f0b63bf2caabe1d9ef4f57f08731a2b1

Remi NGUYEN VAN   commited 2025-04-04 09:30:36 +09:00
766451a785
Merge "Temporarily raise the number of system requests to 375" into main
Jean Chalard   authored and   Android (Google) Code Review   commited 2025-04-03 16:57:15 -07:00
48c667e43a
Merge "Avoid unnecessary lost callbacks" into main
Treehugger Robot   authored and   Android (Google) Code Review   commited 2025-04-03 04:15:34 -07:00
0da2789931
Merge changes from topic "Optimized ESR" into main
* changes:
  Optimized Expired Service Removal
  Exclude expired services in response retrieval
  Update cached service first query time

Treehugger Robot   authored and   Android (Google) Code Review   commited 2025-04-03 04:13:22 -07:00
6fa69e9935
Merge "De-duplicate the keepScore func in the CS unit test." into main
Xiao Ma   authored and   Android (Google) Code Review   commited 2025-04-03 04:03:01 -07:00
933e62d145
Avoid unnecessary lost callbacks
The lost callback should be skipped if the service has not been
previously notified. Otherwise, the listener could inadvertently
initiate the service removal process for the incorrect service.

Bug: 387910548
Test: atest ConnectivityCoverageTests NsdManagerTest
Flag: EXEMPT legacy flag nsd_optimized_expired_service_removal
Change-Id: I7fdf31f0b15f19becc10fcb35c7b1f47dcc38c27

Paul Hu   commited 2025-04-03 09:32:28 +00:00
1cba7f04ca
Optimized Expired Service Removal
This commit introduces a new feature to optimize the removal of
expired services. After the query is sent, a task is scheduled
with a 2-second delay to wait for responses. During this delay,
if a service response is received, the service information is
updated, and the service is removed from the removal list. After
the delay, services that are expired, have sent a query, and for
which the query time was 2 seconds ago are removed, and listeners
are notified.

Bug: 387910548
Test: atest ConnectivityCoverageTests NsdManagerTest
Flag: EXEMPT legacy flag nsd_optimized_expired_service_removal
Change-Id: I498747839664eed8fe5b73a6f6d002deb9167271

Paul Hu   commited 2025-04-03 09:32:01 +00:00
1fd85ef1db
Exclude expired services in response retrieval
Update MdnsServiceCache to enhance its ability to retrieve
responses and manage expired services effectively. Introduce an
argument `excludeExpiredServices` to control whether expired
services should be excluded when retrieving responses. And add a
new method `markExpiredServices` to mark services as expired
based on their TTL and current time.

Bug: 387910548
Test: atest ConnectivityCoverageTests NsdManagerTest
Flag: EXEMPT legacy flag nsd_optimized_expired_service_removal
Change-Id: Ifa30fbe75a72ea400a69ab258d67381a54faf9b5

Paul Hu   commited 2025-04-03 09:27:14 +00:00
14c515562a
Update cached service first query time
Updated the MdnsServiceCache to maintain the first query time
after the last update of cached services, allowing for more
accurate expired service management.

Bug: 387910548
Test: atest ConnectivityCoverageTests NsdManagerTest
Flag: EXEMPT legacy flag nsd_optimized_expired_service_removal
Change-Id: I6da0691ece239b3b2e5dc5198a656cf21b30e953

Paul Hu   commited 2025-04-03 09:27:01 +00:00
60488fea83
Only flush records with matching rrtype
MdnsResponseDecoder flushed all address records when receiving an
address record with the the cache-flush bit is set. However as per
RFC6762 10.2, only records with a matching rrtype should be
flushed, which means that AAAA records should not be flushed when an A
record is received, and vice-versa.

Fix the logic and include a default-on flag to allow turning it off if
needed.

Test: atest
Flag: EXEMPT bugfix
Bug: 407698496
Change-Id: I6142f9996362dd7c16b4e80c8019f0cb1caef174

Remi NGUYEN VAN   commited 2025-04-03 15:14:46 +09:00
d66c016ca1
Temporarily raise the number of system requests to 375
This is a stopgap to palliate a bad interaction between
ConnectivityService and JobScheduler.

To help developers find request leaks and protect against OOMs
in the system server, ConnectivityService is enforncing a maximum
number of network requests/callbacks per UID. It has a higher
value for system UIDs because some system components need to
file requests on behalf of apps, most prominently JobScheduler.

The count is increased on entry in ConnectivityService, on the
Binder thread ; this is when CS can throw TooManyRequestsException
to the caller, it could not do that later when the request is
actually registered on the handler thread.
Conversely it only decreases the count on the handler thread,
because until then it doesn't know whether the request was
actually registered, and it can't look at that data structure on
the Binder thread.
This leads to a slightly confusing result where a UID can register
a request immediately after it unregisters one, and it will receive
TooManyRequestsException, because the unregister hasn't been
processed yet and the count not decremented yet.
This is arguably a bug, but if your app is treading on that last
request, you almost certainly had a leak anyway, and you should
not be trying to play with the exact count of requests either.
The remaining case is when an app would unregister and register
requests again in a tight loop, but there is no valid use case for
that, right ? Right !?

Enter JobScheduler. Because the limit for system UIDs is 250
requests but there can be more than 250 UIDs (especially on
devices with multiple users), JobScheduler has its own limit of
requests (which is set to 125). It has heuristics to choose which
are the most important 125 UIDs to file requests for.

When the request count exceeds 125, or when something
happens that may change which are the most important 125
UIDs, JobScheduler will re-evaluate which are the most important
ones. Upon doing this, it will unregister all requests and file
again the important ones in a tight loop. At worst, it will
therefore remove 125 requests and add 125 requests again,
taking up at most all 250 requests allowed for system UIDs ;
if the system server has any other request outstanding (and
it does), it may hit the issue where CS doesn't know yet that
requests have been unregistered, and crashes and hilarity ensue.

To palliate the issue above, this patch increases the allowed
request count for system UIDs by 125. This immediately should
fix the issue where all 250 requests are taken up by JobScheduler.

For a long-term fix, we should instead make at least one of the
following fixes :
- Have JobScheduler be smarter, and make sure it only unregisters
  the requests that it no longer needs instead of all of them.
- Make CS only throw when the requests are really full, by using
  some combination of locking, making the caller wait or similar.
- Have a separate pool of requests for JobScheduler that is
  dimensioned so it knows it can file all the necessary requests
  and no longer has to limit itself, and simplify the JS code.

Flag: EXEMPT bugfix
Bug: 391114053
Test: ConnectivityServiceTest
Change-Id: I4c4702e2d0c5d03eb5f3d6fe0f1578a210b188e8

Chalard Jean   commited 2025-04-03 15:02:20 +09:00
ff3222ce51
Merge "Let MdnsSocket guess networks of incoming packets" into main
Treehugger Robot   authored and   Android (Google) Code Review   commited 2025-04-01 17:05:14 -07:00
c4ed32bc86
Let MdnsSocket guess networks of incoming packets
When using MdnsSocketClient (unused in the platform, may be used as a
library), allow guessing the Network of incoming packets based on their
source address.

This is flawed as there may be races between LinkProperties updates,
interfaces going up/down, and packets being received, and the source
address can not always be mapped 1:1 to an interface prefix, but it
should improve the situation for legacy code that currently assumes the
Network is the last one that was used for sending, which is often wrong.

Test: atest
Flag: EXEMPT: dead code in Android repo
Change-Id: I885c741d3d40b1b128a06b6d7a7aff8e0551ffea

Remi NGUYEN VAN   commited 2025-04-02 09:02:36 +09:00
bdc48fcc63
Clean up allowMultipleSrvRecordsPerHost
This is hardcoded to true, and there is no use-case for setting it to
false.

Test: atest
Flag: EXEMPT refactor
Change-Id: I1c1b8f8ac4015adfa9900012c576312b5193433a

Remi NGUYEN VAN   commited 2025-04-01 18:43:29 +09:00
ce737da8af
De-duplicate the keepScore func in the CS unit test.
Flag: EXEMPT test-only change
Bug: 368416967
Test: atest CSSatelliteNetworkTest
Test: atest CSCaptivePortalAppTest
Test: atest CSLocalAgentTests
Change-Id: I0739f4524e5dd5ec0d5f3c170c82120ca30e8730

Xiao Ma   commited 2025-04-01 17:02:42 +09:00
315cf7110c
Merge "Move responseMatchesOptions() to MdnsUtils" into main
Paul Hu   authored and   Android (Google) Code Review   commited 2025-03-28 03:29:30 -07:00
1f1b6995fa
Move responseMatchesOptions() to MdnsUtils
Move utility method responseMatchesOptions() to MdnsUtils, where
it can be used by other mDNS classes.

Bug: 387910548
Test: atest ConnectivityCoverageTests NsdManagerTest
Change-Id: Idecd5e7d4c2c4dcf108c42e07a7befd97b68b5a7

Paul Hu   commited 2025-03-28 01:47:06 +00:00
3dc5357c0b
Merge changes from topic "revert-3561690-revert-3538339-SNUWWZJNJZ-BUWEOGUTIT" into main am: 2519a78731
Original change: https://android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/3563843

Change-Id: I71adf8e70b37b93378041ca17bb3d20c8f871cd5
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>

Treehugger Robot   authored and   Automerger Merge Worker   commited 2025-03-27 01:14:42 -07:00
480d443869