summary refs log tree commit diff
path: root/synapse/handlers/sync.py (follow)
Commit message (Expand)AuthorAgeFilesLines
* Include user membership on events (#17282)Richard van der Hoff2024-06-131-2/+0
* Add Sliding Sync `/sync` endpoint (initial implementation) (#17187)Eric Eastwood2024-06-061-8/+11
* Always return OTK counts (#17275)Erik Johnston2024-06-061-4/+29
* Use fully-qualified `PersistedEventPosition` when returning `RoomsForUser` (#...Eric Eastwood2024-06-041-1/+1
* In sync wait for worker to catch up since token (#17215)Erik Johnston2024-05-301-0/+35
* Add Sliding Sync `/sync/e2ee` endpoint for To-Device messages (#17167)Eric Eastwood2024-05-231-10/+237
* Improve perf of sync device lists (#17216)Erik Johnston2024-05-211-31/+7
* Refactor `SyncResultBuilder` assembly to its own function (#17202)Eric Eastwood2024-05-161-116/+148
* Fix `joined_rooms`/`joined_room_ids` usage (#17208)Eric Eastwood2024-05-161-1/+1
* Rename to be obvious: `joined_rooms` -> `joined_room_ids` (#17203)Eric Eastwood2024-05-161-2/+2
* Removed `request_key` from the `SyncConfig` (moved outside as its own functio...Eric Eastwood2024-05-161-3/+3
* Revert "Improve perf of sync device lists" (#17207)Erik Johnston2024-05-161-6/+31
* Fix bug where push rules would be empty in `/sync` (#17142)Erik Johnston2024-05-161-12/+8
* Refactor Sync handler to be able to return different sync responses (`SyncVer...Eric Eastwood2024-05-161-7/+58
* Improve perf of sync device lists (#17191)Erik Johnston2024-05-141-31/+6
* Add support for MSC4115 (#17104)Richard van der Hoff2024-04-291-0/+2
* Also check if first event matches the last in prev batch (#17066)Erik Johnston2024-04-091-7/+13
* Fixups to #17064 (#17065)Erik Johnston2024-04-081-0/+3
* Add back fast path for non-gappy syncs (#17064)Erik Johnston2024-04-081-0/+36
* Fix bug in calculating state for non-gappy syncs (#16942)Richard van der Hoff2024-04-041-54/+37
* `/sync`: fix bug in calculating `state` response (#16930)Richard van der Hoff2024-04-041-41/+13
* Fix bug in `/sync` response for archived rooms (#16932)Richard van der Hoff2024-04-041-14/+107
* Improve event validation (#16908)Shay2024-03-191-1/+11
* `/sync`: Fix edge-case in calculating the "device_lists" response (#16949)Richard van der Hoff2024-03-141-2/+9
* Split up `SyncHandler.compute_state_delta` (#16929)Richard van der Hoff2024-03-141-145/+236
* Bump black from 23.10.1 to 24.2.0 (#16936)dependabot[bot]2024-03-131-3/+3
* Correctly mention previous copyright (#16820)Erik Johnston2024-01-231-0/+1
* Faster load recents for sync (#16783)Erik Johnston2024-01-101-6/+8
* Simplify internal metadata class. (#16762)Erik Johnston2024-01-051-2/+8
* Update license headersPatrick Cloke2023-11-211-10/+16
* Use full GitHub links instead of bare issue numbers. (#16637)Patrick Cloke2023-11-151-2/+2
* Add a new module API to update user presence state. (#16544)Patrick Cloke2023-10-261-1/+1
* Allow multiple workers to write to receipts stream. (#16432)Erik Johnston2023-10-251-1/+6
* Mark sync as limited if there is a gap in the timeline (#16485)Erik Johnston2023-10-191-8/+44
* Remove useless async job to delete device messages on sync (#16491)Mathieu Velten2023-10-161-22/+0
* Factor out `MultiWriter` token from `RoomStreamToken` (#16427)Erik Johnston2023-10-051-1/+1
* Return immutable objects for cachedList decorators (#16350)Patrick Cloke2023-09-191-2/+2
* Make cached account data/tags/admin types immutable (#16325)Patrick Cloke2023-09-181-11/+16
* Don't schedule an async task on every sync (#16312)Erik Johnston2023-09-131-11/+26
* Delete device messages asynchronously and in staged batches (#16240)Mathieu Velten2023-09-061-3/+13
* Disable caching in /sync corner case (#16080)Matthew Ma2023-08-171-10/+10
* Run pyupgrade for python 3.7 & 3.8. (#16110)Patrick Cloke2023-08-151-5/+3
* Error if attempting to set m.push_rules account data, per MSC4010. (#15555)Patrick Cloke2023-05-091-9/+3
* Use account data constants in more places. (#15554)Patrick Cloke2023-05-091-6/+6
* Fix a rare bug where initial /syncs would fail (#15383)Sean Quah2023-04-041-5/+19
* Faster joins: Fix spurious errors on incremental sync (#15232)Sean Quah2023-03-091-2/+7
* Bump black from 22.12.0 to 23.1.0 (#15103)dependabot[bot]2023-02-221-1/+0
* Faster joins: Omit device list updates from partial state rooms in /sync (#15...Sean Quah2023-02-141-0/+5
* Skip calculating unread push actions in `/sync` when `enable_push` is false. ...Erik Johnston2023-02-141-0/+8
* Return read-only collections from `@cached` methods (#13755)Sean Quah2023-02-101-2/+2
* Avoid fetching unused account data in sync. (#14973)Patrick Cloke2023-02-101-40/+48
* Avoid mutating cached values in `_generate_sync_entry_for_account_data` (#15047)Sean Quah2023-02-101-0/+2
* Skip unused calculations in sync handler. (#14908)Patrick Cloke2023-02-021-125/+133
* Do not calculate presence or ephemeral events when they are filtered out (#14...Patrick Cloke2023-02-021-10/+9
* Merge branch 'release-v1.76' into developDavid Robertson2023-01-271-7/+17
|\
| * Batch look-ups to see if rooms are partial stated. (#14917)Patrick Cloke2023-01-261-7/+17
* | Use StrCollection in place of Collection[str] in (most) handlers code. (#14922)Patrick Cloke2023-01-261-2/+2
|/
* Faster joins: omit partial rooms from eager syncs until the resync completes ...David Robertson2023-01-231-10/+55
* Merge account data streams (#14826)Erik Johnston2023-01-131-2/+9
* Calculate rooms changed for device lists to work. (#14810)Patrick Cloke2023-01-111-4/+0
* Improve /sync performance of when passing filters with empty arrays. (#14786)Patrick Cloke2023-01-091-3/+11
* Log to-device msgids when we return them over /sync (#14724)Richard van der Hoff2022-12-231-7/+13
* Move `StateFilter` to `synapse.types` (#14668)David Robertson2022-12-121-1/+1
* Improve logging and opentracing for to-device message handling (#14598)Richard van der Hoff2022-12-061-7/+19
* Better return type for `get_all_entities_changed` (#14604)Erik Johnston2022-12-051-2/+4
* Use `device_one_time_keys_count` to match MSC3202 (#14565)Andrew Ferrazzutti2022-11-281-3/+3
* Include heroes in partial join responses' state (#14442)David Robertson2022-11-151-17/+3
* Use stable identifiers for MSC3771 & MSC3773. (#14050)Patrick Cloke2022-10-071-6/+1
* Remove get rooms for user with stream ordering (#13991)Nick Mills-Barrett2022-10-041-80/+69
* Track notification counts per thread (implement MSC3773). (#13776)Patrick Cloke2022-10-041-5/+35
* Optimise get_rooms_for_user (drop with_stream_ordering) (#13787)Nick Mills-Barrett2022-09-291-10/+4
* Faster room joins: Fix spurious error when joining a room (#13872)Sean Quah2022-09-271-3/+19
* Re-type hint some collections in `/sync` code as read-only (#13754)Sean Quah2022-09-081-10/+10
* Cache user IDs instead of profile objects (#13573)Nick Mills-Barrett2022-08-231-2/+2
* Avoid blocking lazy-loading `/sync`s during partial joins (#13477)Sean Quah2022-08-181-30/+223
* Add some miscellaneous comments around sync (#13474)Sean Quah2022-08-101-38/+78
* Fix rooms not being properly excluded from incremental sync (#13408)Brendan Abolivier2022-08-041-10/+15
* Use new `device_list_changes_in_room` table when getting device list changes ...Erik Johnston2022-06-171-14/+5
* Speed up `get_unread_event_push_actions_by_room` (#13005)Erik Johnston2022-06-151-7/+3
* Decouple `synapse.api.auth_blocking.AuthBlocking` from `synapse.api.auth.Auth...Quentin Gliech2022-06-141-2/+2
* Wait for lazy join to complete when getting current state (#12872)Erik Johnston2022-06-011-4/+9
* Fix 404 on `/sync` when the last event is a redaction of an unknown/purged ev...Richard van der Hoff2022-06-011-8/+19
* Rename storage classes (#12913)Erik Johnston2022-05-311-12/+14
* Fix up `state_store` naming (#12871)Erik Johnston2022-05-251-10/+14
* Remove user-visible groups/communities code (#12553)Patrick Cloke2022-05-251-65/+0
* Add some type hints to datastore (#12717)Dirk Klimpel2022-05-171-3/+3
* Add `StreamKeyType` class and replace string literals with constants (#12567)Andrew Morgan2022-05-161-9/+14
* Implement changes to MSC2285 (hidden read receipts) (#12168)Å imon Brandner2022-05-041-1/+1
* Fix missing sync events during historical batch imports (#12319)Nick Mills-Barrett2022-04-131-8/+7
* Fix rejecting invites over federation (#12409)Erik Johnston2022-04-071-20/+33
* Do not add groups to sync results if disabled. (#12408)Patrick Cloke2022-04-071-2/+3
* Send device list updates to application services (MSC3202) - part 1 (#11881)Andrew Morgan2022-03-301-31/+9
* Add a configuration to exclude rooms from sync response (#12310)Brendan Abolivier2022-03-301-6/+17
* Move get_bundled_aggregations to relations handler. (#12237)Patrick Cloke2022-03-181-3/+6
* Use the ignored_users table to test event visibility & sync. (#12225)Patrick Cloke2022-03-151-28/+2
* Add logging to `/sync` for debugging #11916 (#12068)Erik Johnston2022-02-231-0/+9
* Remove `HomeServer.get_datastore()` (#12031)Richard van der Hoff2022-02-231-1/+1
* Optimise calculating device_list changes in `/sync`. (#11974)Erik Johnston2022-02-151-15/+53
* Send to-device messages to application services (#11215)Andrew Morgan2022-02-011-2/+2
* Improvements to bundling aggregations. (#11815)Patrick Cloke2022-01-261-1/+2
* Make the `get_global_account_data_by_type_for_user` cache be a tree-cache who...reivilibre2022-01-211-1/+1
* Include whether the requesting user has participated in a thread. (#11577)Patrick Cloke2022-01-181-1/+3
* Include bundled aggregations in the sync response cache. (#11659)Patrick Cloke2022-01-131-0/+10
* Remove debug logging for #4422 (#11693)David Robertson2022-01-061-37/+1
* Add type hints to event_push_actions. (#11594)Patrick Cloke2021-12-211-6/+6
* Various opentracing enhancements (#11619)Richard van der Hoff2021-12-211-3/+4
* Adjust _get_rooms_changed comments (#11550)David Robertson2021-12-101-22/+29
* Add a constant for receipt types (m.read). (#11531)Patrick Cloke2021-12-081-2/+2
* Refactors in `_generate_sync_entry_for_rooms` (#11515)David Robertson2021-12-071-45/+77
* Correctly ignore invites from ignored users (#11511)David Robertson2021-12-071-5/+6
* Comments on the /sync tentacles (#11494)David Robertson2021-12-021-39/+117
* Support filtering by relations per MSC3440 (#11236)Patrick Cloke2021-11-091-8/+10
* Add type hints for event streams. (#10856)Patrick Cloke2021-09-211-3/+3
* Require type hints in the handlers module. (#10831)Patrick Cloke2021-09-201-5/+6
* Merge branch 'release-v1.43' into developDavid Robertson2021-09-171-126/+141
|\
| * Cleanup opentracing logging for syncs (#10828)Erik Johnston2021-09-151-126/+141
* | Use direct references for some configuration variables (part 2) (#10812)Patrick Cloke2021-09-151-1/+1
|/
* Add logging to help debug #9424 (#10704)Azrenbeth2021-09-061-13/+54
* Additional type hints for the sync REST servlet. (#10666)Patrick Cloke2021-08-231-10/+11
* Do not include rooms with an unknown room version in a sync response. (#10644)Patrick Cloke2021-08-191-2/+5
* Convert room member storage tuples to attrs. (#10629)Patrick Cloke2021-08-181-8/+10
* Use auto-attribs for attrs classes for sync. (#10630)Patrick Cloke2021-08-181-78/+78
* Make sync response cache time configurable. (#10513)Richard van der Hoff2021-08-031-3/+11
* Always communicate device OTK counts to clients (#10485)Andrew Morgan2021-07-271-0/+4
* [pyupgrade] `synapse/` (#10348)Jonathan de Jong2021-07-191-1/+1
* Use inline type hints in `handlers/` and `rest/`. (#10382)Jonathan de Jong2021-07-161-15/+17
* Ensure that we do not cache empty sync responses after a timeout (#10158)Richard van der Hoff2021-06-171-10/+26
* Implement knock feature (#6739)Sorunome2021-06-091-20/+67
* Delete completes to-device messages earlier in /sync (#10124)Richard van der Hoff2021-06-071-10/+11
* Make /sync do less state res (#10102)Erik Johnston2021-06-021-2/+2
* Use get_current_users_in_room from store and not StateHandler (#9910)Erik Johnston2021-05-051-3/+3
* Remove `synapse.types.Collection` (#9856)Richard van der Hoff2021-04-221-2/+11
* Remove redundant "coding: utf-8" lines (#9786)Jonathan de Jong2021-04-141-1/+0
* Bugbear: Add Mutable Parameter fixes (#9682)Jonathan de Jong2021-04-081-4/+4
* Add type hints to expiring cache. (#9730)Patrick Cloke2021-04-061-4/+6
* Improve tracing for to device messages (#9686)Erik Johnston2021-04-011-1/+17
* Add a type hints for service notices to the HomeServer object. (#9675)Patrick Cloke2021-03-241-2/+4
* Fix bad naming of storage function (#9637)Erik Johnston2021-03-171-2/+4
* Add ResponseCache tests. (#9458)Jonathan de Jong2021-03-081-1/+1
* Revert "Fix #8518 (sync requests being cached wrongly on timeout) (#9358)"Patrick Cloke2021-03-021-2/+1
* Fix #8518 (sync requests being cached wrongly on timeout) (#9358)Jonathan de Jong2021-02-241-1/+2
* Update black, and run auto formatting over the codebase (#9381)Eric Eastwood2021-02-161-17/+20
* Add additional type hints to the storage module. (#8980)Patrick Cloke2020-12-301-1/+1
* Add admin API for logging in as a user (#8617)Erik Johnston2020-11-171-1/+3
* Fix typos and spelling errors. (#8639)Patrick Cloke2020-10-231-2/+2
* Send some ephemeral events to appservices (#8437)Will Hunt2020-10-151-1/+0
* Add type hints to response cache. (#8507)Patrick Cloke2020-10-091-1/+3
* Fix returning incorrect prev_batch token in incremental sync (#8486)Erik Johnston2020-10-071-1/+6
* Add support for MSC2732: olm fallback keys (#8312)Hubert Chathi2020-10-061-0/+8
* Do not assume that account data is of the correct form. (#8454)Patrick Cloke2020-10-051-8/+11
* Enable mypy checking for unreachable code and fix instances. (#8432)Patrick Cloke2020-10-011-1/+1
* Various clean ups to room stream tokens. (#8423)Erik Johnston2020-09-291-6/+14
* Add EventStreamPosition type (#8388)Erik Johnston2020-09-241-5/+5
* Use slots in attrs classes where possible (#8296)Patrick Cloke2020-09-141-24/+10
* Make `StreamToken.room_key` be a `RoomStreamToken` instance. (#8281)Erik Johnston2020-09-111-5/+6
* Add types to StreamToken and RoomStreamToken (#8279)Erik Johnston2020-09-081-3/+2
* Stop sub-classing object (#8249)Patrick Cloke2020-09-041-2/+2
* Fix typing for SyncHandler (#8237)Erik Johnston2020-09-031-5/+7
* Re-implement unread counts (again) (#8059)Brendan Abolivier2020-09-021-15/+18
* Define StateMap as immutable and add a MutableStateMap type. (#8183)Patrick Cloke2020-08-281-2/+3
* Revert #7736 (#8039)Brendan Abolivier2020-08-061-6/+0
* Convert streams to async. (#8014)Patrick Cloke2020-08-041-1/+1
* Re-implement unread counts (#7736)Brendan Abolivier2020-07-291-0/+6
* Fix up types and comments that refer to Deferreds. (#7945)Patrick Cloke2020-07-241-4/+0
* Add debugging to sync response generation (#7929)Richard van der Hoff2020-07-221-2/+15
* Back out MSC2625 implementation (#7761)Brendan Abolivier2020-07-011-3/+0
* Merge branch 'develop' into babolivier/mark_unreadBrendan Abolivier2020-06-151-18/+16
|\
| * Replace iteritems/itervalues/iterkeys with native versions. (#7692)Patrick Cloke2020-06-151-18/+16
* | Appease mypyBrendan Abolivier2020-06-101-1/+1
* | LintBrendan Abolivier2020-06-101-3/+3
* | Use temporary prefixes as per the MSCBrendan Abolivier2020-06-101-1/+3
* | Add a new unread_counter to sync responsesBrendan Abolivier2020-06-101-0/+1
|/
* Typo fixes.Patrick Cloke2020-06-051-1/+1
* Speed up fetching device lists changes in sync.Erik Johnston2020-05-051-4/+8
* typosMatthew Hodgson2020-04-111-1/+1
* Add explanatory commentAndrew Morgan2020-03-301-0/+2
* Just add own user ID to the list we track device changes forDavid Baker2020-03-301-4/+6
* Always send the user updates to their own device listDavid Baker2020-03-271-3/+4
* Clean up some LoggingContext stuff (#7120)Richard van der Hoff2020-03-241-2/+2
* Clarify list/set/dict/tuple comprehensions and enforce via flake8 (#6957)Patrick Cloke2020-02-211-12/+10
* Merge branch 'release-v1.10.0' into developRichard van der Hoff2020-02-111-0/+1
|\
| * filter out m.room.aliases from /sync state blocks (#6884)Matthew Hodgson2020-02-101-0/+1
* | Reduce amount of logging at INFO level. (#6862)Erik Johnston2020-02-061-3/+3
* | Add typing to SyncHandler (#6821)Erik Johnston2020-02-031-341/+364
|/
* Add `local_current_membership` table (#6655)Erik Johnston2020-01-151-1/+1
* Fixup functions to consistently return deferredsErik Johnston2019-12-061-3/+3
* Port SyncHandler to async/awaitErik Johnston2019-12-051-134/+117
* Update black to 19.10b0 (#6304)Amber Brown2019-11-011-7/+9
* Port to use state storageErik Johnston2019-10-301-9/+11
* Merge branch 'develop' into cross-signing_keysHubert Chathi2019-09-041-5/+4
|\
| * Remove double return statements (#5962)Andrew Morgan2019-09-031-1/+0
| * Remove unnecessary parentheses around return statements (#5931)Andrew Morgan2019-08-301-4/+4
* | Merge branch 'uhoreg/e2e_cross-signing_merged' into cross-signing_keysHubert Chathi2019-08-281-6/+25
|\|
| * Remove logging for #5407 and update commentsErik Johnston2019-08-151-17/+5
| * Handle TimelineBatch being limited and empty.Erik Johnston2019-08-061-6/+37
* | Merge branch 'cross-signing_hidden' into cross-signing_keysHubert Chathi2019-08-011-61/+51
|\|
| * Replace returnValue with return (#5736)Amber Brown2019-07-231-61/+51
* | allow uploading keys for cross-signingHubert Chathi2019-07-251-1/+6
|/
* Move logging utilities out of the side drawer of util/ and into logging/ (#5606)Amber Brown2019-07-041-1/+1
* Review commentsErik Johnston2019-06-271-4/+4
* Refactor and comment sync device list codeErik Johnston2019-06-261-17/+53
* Rename get_users_whose_devices_changedErik Johnston2019-06-261-1/+1
* Refactor get_user_ids_changed to pull less from DBErik Johnston2019-06-261-12/+10
* Run Black. (#5482)Amber Brown2019-06-201-343/+351
* Merge pull request #5089 from dnaf/m-heroes-empty-room-nameBrendan Abolivier2019-06-061-5/+4
|\
| * Simplify conditionBrendan Abolivier2019-06-061-2/+2
| * Simplify conditionBrendan Abolivier2019-06-051-3/+2
| * Merge branch 'develop' into m-heroes-empty-room-nameBrendan Abolivier2019-06-051-19/+25
| |\
| * | LintKatie Wolfe2019-04-241-1/+1
| * | Clean up codeKatie Wolfe2019-04-241-2/+3
| * | Show heroes if room name or canonical alias are emptyKatie Wolfe2019-04-241-3/+4
| * | Show heroes if room name or canonical alias are emptyKatie Wolfe2019-04-241-5/+3
* | | Do user_id != me checks before deciding whether we should pick heroes from th...Brendan Abolivier2019-06-051-15/+19
| |/ |/|
* | Make /sync attempt to return device updates for both joined and invited users...Matthew Hodgson2019-05-161-19/+25
|/
* Fix grammar and document get_current_users_in_room (#4998)Andrew Morgan2019-04-031-4/+4
* Merge pull request #4815 from matrix-org/erikj/docstringsErik Johnston2019-03-061-7/+26
|\
| * Add docstrings from matrix-org-hotfixesErik Johnston2019-03-061-7/+26
* | Port #4422 debug logging from hotfixesErik Johnston2019-03-061-7/+46
|/
* Add some debug for membership syncing issues (#4538)Richard van der Hoff2019-01-311-2/+11
* Fix remote invite rejections not comming down syncErik Johnston2019-01-301-1/+13
* Fixed line lengthNathan Pennie2018-12-191-1/+5
* Fix the variable names used for account_dataNathan Pennie2018-12-191-3/+3
* Refactor state group lookup to reduce DB hits (#4011)Erik Johnston2018-10-251-54/+43
* Add description to counter metricErik Johnston2018-10-101-1/+5
* Track number of non-empty sync responses insteadErik Johnston2018-10-101-9/+15
* Append _total to metric and fix up spellingErik Johnston2018-10-101-2/+2
* Add metric to count lazy member sync requestsErik Johnston2018-10-091-6/+20
* Fix lazy loaded sync with rejected state eventsErik Johnston2018-10-011-2/+2
* Only lazy load self-members on initial syncMatthew Hodgson2018-09-251-5/+8
* Always LL ourselves if we're in a room to simplify clients (#3916)Matthew Hodgson2018-09-201-0/+4
* show heroes if a room has a 'deleted' name/canonical_alias (#3851)Matthew Hodgson2018-09-121-2/+15
* argh pep8Matthew Hodgson2018-09-121-1/+1
* correctly log gappy sync metricsMatthew Hodgson2018-09-121-1/+1
* fix loglineMatthew Hodgson2018-09-121-1/+1
* Speed up lazy loading (#3827)Matthew Hodgson2018-09-121-30/+88
* Don't send empty tags list down syncErik Johnston2018-09-061-0/+5
* Send existing room tags down sync on joinErik Johnston2018-09-061-0/+8
* Merge pull request #3795 from matrix-org/erikj/faster_sync_stateAmber Brown2018-09-071-8/+8
|\
| * User iter* during sync state calculationsErik Johnston2018-09-051-8/+8
* | Port handlers/ to Python 3 (#3803)Amber Brown2018-09-071-3/+3
|/
* don't return non-LL-member state in incremental sync state blocks (#3760)Matthew Hodgson2018-08-281-1/+8
* Integrate presence from hotfixes (#3694)Amber Brown2018-08-181-1/+2
* initial cut at a room summary API (#3574)Matthew Hodgson2018-08-161-10/+149
* Merge pull request #3670 from matrix-org/neilj/mau_sync_blockNeil Johnson2018-08-141-2/+11
|\
| * only block on sync where user is not part of the mau cohortNeil Johnson2018-08-091-1/+6
| * block sync if auth checks failNeil Johnson2018-08-091-7/+5
| * sync auth blockingNeil Johnson2018-08-081-5/+11
* | Rename async to async_helpers because `async` is a keyword on Python 3.7 (#3678)Amber Brown2018-08-101-1/+1
|/
* Deduplicate redundant lazy-loaded members (#3331)Matthew Hodgson2018-07-261-25/+62
* clarify comment on p_idsMatthew Hodgson2018-07-241-1/+2