David Yip
97d2df77aa
Add apply-to-mentions option to keyword mute UI. #454 .
7 years ago
David Yip
cf28049f0a
Add a FeedManager example demonstrating non-mention keywords. #454 .
7 years ago
David Yip
a40e322f4b
Fix spacing in some FeedManager examples.
7 years ago
David Yip
26573ad7e6
Thread scopes through #matches?. #454 .
...
Also add an apply_to_mentions attribute on Glitch::KeywordMute, which is
used to calculate scope. Next up: additions to the test suite to
demonstrate how scoping works.
7 years ago
David Yip
37d495eeeb
keyword mute: Store keywords as a list
...
This has a couple of advantages over the regex approach:
- Keywords are individually addressable, which makes it easier to gather
statistics (#363 )
- Keywords can be individually applied to different feeds, e.g. skipping
mentions (#454 )
It *does* end up creating many more Regexp objects. I'm not yet sure if
the difference is significant.
7 years ago
David Yip
5dd2a78034
Merge pull request #528 from glitch-soc/merge-upstream
...
Merge with tootsuite/master
7 years ago
David Yip
8343f56b2c
Whoops, forgot to clean up a conflict.
7 years ago
David Yip
cfdbb36bdf
Merge pull request #519 from ThibG/glitch-soc/fixes/status-node-null
...
Prevent a rare crash when a status' root node is undefined
7 years ago
David Yip
3550470c18
Merge remote-tracking branch 'origin/master' into gs-master
...
Conflicts:
app/javascript/mastodon/locales/en.json
app/javascript/mastodon/locales/ja.json
app/javascript/mastodon/locales/pl.json
The above conflicts appear to be a text conflict introduced by
glitch-soc's additional level of columns (i.e. moving a bunch of columns
under the Misc option). They were resolved via accept-ours.
7 years ago
David Yip
a641d1b5b8
Merge remote-tracking branch 'personal/merge/tootsuite/master' into gs-master
7 years ago
Shuhei Kitagawa
00512ecf87
Add tests for migrations_controller ( #7707 )
7 years ago
Yamagishi Kazutoshi
89c86ee521
Weblate translations (2018-06-02) ( #7705 )
...
* Translated using Weblate (Korean)
Currently translated at 100.0% (303 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ko/
* Translated using Weblate (Chinese (Hong Kong))
Currently translated at 99.6% (302 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/zh_Hant_HK/
* Translated using Weblate (Chinese (Hong Kong))
Currently translated at 99.1% (616 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/zh_Hant_HK/
* Translated using Weblate (Chinese (Hong Kong))
Currently translated at 100.0% (62 of 62 strings)
Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/zh_Hant_HK/
* Translated using Weblate (Slovenian)
Currently translated at 14.4% (90 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sl/
* Translated using Weblate (Slovak)
Currently translated at 100.0% (303 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/
* Translated using Weblate (Japanese)
Currently translated at 100.0% (303 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/
* Translated using Weblate (Esperanto)
Currently translated at 100.0% (303 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/
* Translated using Weblate (Dutch)
Currently translated at 100.0% (62 of 62 strings)
Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/nl/
* Translated using Weblate (Dutch)
Currently translated at 100.0% (621 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/
* Translated using Weblate (Persian)
Currently translated at 100.0% (303 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fa/
* Translated using Weblate (Occitan)
Currently translated at 100.0% (303 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/oc/
* Translated using Weblate (Occitan)
Currently translated at 100.0% (303 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/oc/
to check if with O or U
* Translated using Weblate (Occitan)
Currently translated at 98.0% (609 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/oc/
* Translated using Weblate (Dutch)
Currently translated at 100.0% (303 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/
* Translated using Weblate (Basque)
Currently translated at 100.0% (621 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (62 of 62 strings)
Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/eu/
* Translated using Weblate (Korean)
Currently translated at 100.0% (66 of 66 strings)
Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ko/
* Translated using Weblate (Korean)
Currently translated at 99.6% (619 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/
* Translated using Weblate (Basque)
Currently translated at 100.0% (66 of 66 strings)
Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (303 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (621 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/
* Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.6% (302 of 303 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/
* Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.6% (619 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/
* Translated using Weblate (Basque)
Currently translated at 100.0% (76 of 76 strings)
Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/eu/
* i18n-tasks normalize && yarn manage:translations
7 years ago
Eugen Rochko
6e6c0e9613
Use different algorithm for trending tags ( #7697 )
7 years ago
Eugen Rochko
8d6e4e0485
Fix margin between compose warning, reply indicator and textarea ( #7701 )
7 years ago
Eugen Rochko
73c0c36e7b
Improve trends layout ( #7700 )
...
* Allow collapsing trends, responsively hide trends
* Add trends column
7 years ago
Yamagishi Kazutoshi
69b45350fe
Add loading indicator for trending tags ( #7693 )
7 years ago
Yamagishi Kazutoshi
bfa12239e8
Update ESLint for Code Climate ( #7696 )
...
* Update babel-eslint to version 8.2.3
* Update eslint to version 4.19.1
* Update eslint-plugin-promise to version 3.8.0
* Update eslint-plugin-react to version 7.8.2
* Upgrade eslint-plugin-jsx-a11y to version 6.0.3
* yarn test:lint --fix
7 years ago
Yamagishi Kazutoshi
15ce60f610
Fix duplicate key attributes ( #7694 )
7 years ago
David Yip
9ad5de8a3a
Merge pull request #501 from ThibG/glitch-soc/features/red-bookmarks
...
Make active bookmarks red (fixes #493 )
7 years ago
David Yip
0aba716fe1
Merge pull request #471 from impiaaa/thread-icon
...
Add an extra icon to indicate that a status is part of a conversation
7 years ago
Spencer Alves
e5f25a73f2
Adjust spacing between status icons
7 years ago
Spencer Alves
7d2e6429c2
Merge branch 'glitch' into thread-icon
7 years ago
Eugen Rochko
fb1ae0152d
Wrong exception class: ActiveRecord::RecordNotUnique, not PG::UniqueViolation ( #7688 )
...
* Wrong exception class: ActiveRecord::RecordNotUnique, not PG::UniqueViolation
It's completely not obvious but PG::UniqueViolation is just a string inside the exception message, not the actual class of the exception
* Favourite does not have target_account_id
7 years ago
Eugen Rochko
19b4c666f7
Improve account index migration ( #7684 )
...
* Improve account index migration
- Display more progress in stdout
- Catch PG::UniqueViolation when re-attributing favourites
- Skip callbacks and validations when re-attributing other relationships
* Use in_batches to reduce table lock-up during account merge
* Use #say_with_time to benchmark each deduplication
7 years ago
Eugen Rochko
1e938b966e
Exclude unlisted, private and direct toots from affecting trends ( #7686 )
7 years ago
Eugen Rochko
0ce5339a7b
Make the refresh trends button refresh trends ( #7685 )
7 years ago
Mélanie Chauvel (ariasuni)
691107263c
Put the CW field between the toot we are replying to and the toot field ( #7508 )
...
* Remove Collapsable and use CSS instead
* Put the CW field between the toot we are replying to and the toot field
* Use same spacing between all fields in the composing column
7 years ago
Thibaut Girka
b9fdeceb3c
Make active bookmarks red ( fixes #493 )
7 years ago
Thibaut Girka
893f2aff20
Prevent a rare crash when a status' root node is undefined
7 years ago
Thibaut Girka
e396fbfe3b
Fix direct timeline
7 years ago
Yamagishi Kazutoshi
648a22637c
Weblate translations (2018-05-31) ( #7681 )
...
* Translated using Weblate (Basque)
Currently translated at 100.0% (2 of 2 strings)
Translation: Mastodon/Activerecord
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/eu/
* Translated using Weblate (Corsican)
Currently translated at 100.0% (76 of 76 strings)
Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/co/
* Translated using Weblate (Italian)
Currently translated at 100.0% (66 of 66 strings)
Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/it/
* Translated using Weblate (Galician)
Currently translated at 100.0% (621 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/
* Translated using Weblate (Basque)
Currently translated at 99.3% (297 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eu/
* Translated using Weblate (Basque)
Currently translated at 55.2% (42 of 76 strings)
Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/eu/
* Translated using Weblate (Basque)
Currently translated at 8.5% (53 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/
* Translated using Weblate (Basque)
Currently translated at 9.0% (56 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/
* Translated using Weblate (Finnish)
Currently translated at 98.9% (296 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/
* Translated using Weblate (Finnish)
Currently translated at 98.9% (296 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/
* Translated using Weblate (Finnish)
Currently translated at 98.9% (296 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/
* Translated using Weblate (Corsican)
Currently translated at 100.0% (66 of 66 strings)
Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/co/
* Translated using Weblate (Corsican)
Currently translated at 99.6% (619 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/co/
* Translated using Weblate (Corsican)
Currently translated at 100.0% (299 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/co/
* Translated using Weblate (Corsican)
Currently translated at 100.0% (299 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/co/
* Translated using Weblate (Basque)
Currently translated at 41.3% (257 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (299 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (66 of 66 strings)
Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (62 of 62 strings)
Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/eu/
* Translated using Weblate (Basque)
Currently translated at 56.5% (43 of 76 strings)
Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/eu/
* Translated using Weblate (Arabic)
Currently translated at 90.8% (564 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/
* Translated using Weblate (German)
Currently translated at 96.9% (64 of 66 strings)
Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/
* Translated using Weblate (German)
Currently translated at 98.4% (65 of 66 strings)
Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/
* Translated using Weblate (Basque)
Currently translated at 42.9% (267 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/
* Translated using Weblate (Italian)
Currently translated at 100.0% (66 of 66 strings)
Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/it/
* Translated using Weblate (Italian)
Currently translated at 100.0% (299 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/it/
* Translated using Weblate (Basque)
Currently translated at 71.0% (54 of 76 strings)
Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/eu/
* Translated using Weblate (Slovak)
Currently translated at 95.3% (592 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/
* Translated using Weblate (Basque)
Currently translated at 43.8% (272 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/
* Translated using Weblate (Japanese)
Currently translated at 100.0% (299 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/
* Translated using Weblate (Basque)
Currently translated at 100.0% (76 of 76 strings)
Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (76 of 76 strings)
Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (66 of 66 strings)
Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (62 of 62 strings)
Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (299 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (621 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (621 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/
* Translated using Weblate (Basque)
Currently translated at 100.0% (621 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/
* Translated using Weblate (Slovak)
Currently translated at 100.0% (66 of 66 strings)
Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/
* Translated using Weblate (Slovak)
Currently translated at 95.3% (592 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/
* Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.5% (618 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/
* Translated using Weblate (Portuguese)
Currently translated at 83.7% (520 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt/
* Translated using Weblate (Japanese)
Currently translated at 100.0% (299 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/
* Translated using Weblate (Slovak)
Currently translated at 100.0% (299 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/
* Translated using Weblate (Arabic)
Currently translated at 91.9% (571 of 621 strings)
Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/
* yarn manage:translations && i18n-tasks noramlize && i18n-tasks remove-unused
* remove body_html: ''
* Translated using Weblate (Galician)
Currently translated at 100.0% (299 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/
* Translated using Weblate (Basque)
Currently translated at 100.0% (299 of 299 strings)
Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eu/
* yarn manage:translations
7 years ago
Marcin Mikołajczak
063d4d4ccc
🌍 : 🇵🇱 ⬆️ ( #7679 )
...
* 🌍 : 🇵🇱 ⬆️
Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
* yarn manage:translations
7 years ago
Jenkins
165b5dc7f5
Merge remote-tracking branch 'tootsuite/master' into glitchsoc/master
7 years ago
Eugen Rochko
c61c4565ab
Fix nil error in migration ( #7680 )
...
Under rare circumstances the user record could have already been deleted before...
7 years ago
Eugen Rochko
ad40bf5e0c
Speed up some rake tasks by moving execution to Sidekiq ( #7678 )
...
* Speed up some rake tasks by moving execution to Sidekiq
mastodon:media:remove_silenced
mastodon:media:remove_remote
mastodon:media:redownload_avatars
mastodon:feeds:build
* Fix code style issue
7 years ago
Eugen Rochko
a29f196f95
Bump version to 2.4.1rc1
7 years ago
Eugen Rochko
3623aea6c9
Redirect / to home on mobile layout, to getting started on desktop ( #7677 )
7 years ago
Eugen Rochko
1a7a74ff76
Improve getting started column ( #7676 )
...
* Adjust footer of getting started column
- Improved style
- Moved hotkeys, about this instance and logout to footer
- Removed FAQ, User Guide, Apps links
- Use hamburger icon for the column
* Add edit profile action button to profile and more to dropdown
* Add "Trending now" to getting started column
* Add preferences/security links on mobile layout
7 years ago
Yamagishi Kazutoshi
9130b3cda9
Fix broken migrate (regression from #7658 ) ( #7674 )
7 years ago
Eugen Rochko
a16e06bbf5
Deduplicate accounts and make unique username/domain index case-insensitive ( #7658 )
...
Fix #6937
Fix #6837
Fix #6667
7 years ago
Eugen Rochko
a7d726c383
Improve counter caches on Status and Account ( #7644 )
...
Do not touch statuses_count on accounts table when mass-destroying
statuses to reduce load when removing accounts, same for
reblogs_count and favourites_count
Do not count statuses with direct visibility in statuses_count
Fix #828
7 years ago
Eugen Rochko
461542784b
Reduce wasted work in RemoveStatusService due to inactive followers ( #7672 )
7 years ago
Thibaut Girka
e7b3a4263e
[Glitch] Fix low-contrasted cancel button of reply indicator
...
Port 86efccce2a
to glitch-soc
7 years ago
Thibaut Girka
08dbe29e29
[Glitch] Improve load gap styling in web UI
...
Port 45c9f16f71
to glitch-soc
7 years ago
Thibaut Girka
cc589d6ec0
[Glitch] Use randomized setTimeout when fallback-polling and re-add since_id
...
Port dafd7afc5e
to glitch-soc
7 years ago
Thibaut Girka
fbc25bdd2d
[Glitch] Do not crash in getStatusIds when there is a gap in the timeline
...
Port b1938d7853
to glitch-soc
7 years ago
Thibaut Girka
5cc4d34250
[Glitch] Fix gap insertion for timeline disconnection
...
Port 66359ec522
to glitch-soc
7 years ago
Thibaut Girka
15bef77add
[Glitch] Fix ID duplication in timelines
...
Port 306267dbd2
to glitch-soc
7 years ago
Thibaut Girka
4b38ac3bed
[Glitch] Fix comparing id
...
Port 0ba49eca8b
to glitch-soc
7 years ago
Thibaut Girka
6020a21130
[Glitch] Fix LoadMore on account media gallery
...
Port 3523aa440b
to glitch-soc
7 years ago