Compare commits

..
Author SHA1 Message Date
Hubert 7c3cf32cf6 Removing the CSS that changes the width of the toolbar buttons. 2023-08-31 17:04:57 -03:00
renovate[bot] c7e47ed578 Update dependency re-resizable to v6.9.11 (#8752)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-31 03:14:11 +00:00
github-actions[bot] 138f804580 @CptMeetKat has signed the CLA in laurent22/joplin#8746 2023-08-29 07:33:44 +00:00
renovate[bot] 5dbeb684d9 Update dependency sass to v1.64.2 (#8745)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-29 06:58:47 +00:00
renovate[bot] dd767dd479 Update dependency sass to v1.64.0 (#8744)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-29 05:53:32 +01:00
Helmut K. C. Tessarek b8d1ad60ff All: Translation: Update da_DK.po (thanks ERYpTION) 2023-08-28 18:14:50 -04:00
renovate[bot] a7053157d8 Update dependency deprecated-react-native-prop-types to v4.2.1 (#8739)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-28 14:23:48 +00:00
pedr ddc74af3d1 Chore: All: Change Logger to accept formatter function (#8702) 2023-08-28 14:30:56 +01:00
renovate[bot] 9430dccb61 Update dependency deprecated-react-native-prop-types to v4.2.0 (#8738)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-28 13:57:12 +01:00
Laurent Cozic 832e9454c7 Desktop: Resolves #8579: Allow more special content within tables in the Rich Text editor 2023-08-27 19:09:19 +01:00
Laurent Cozic e4cb871c11 Chore: Remove dummy file 2023-08-27 19:09:18 +01:00
wljince007 591324b7bf Mobile : Fixes #8517: Fixed code block not default line wrap in pdf view (#8626) 2023-08-27 15:32:04 +01:00
Fernando f74732a03d Translation: Update Brazilian Portuguese translation (#8733) 2023-08-27 15:31:34 +01:00
Joplin Bot dd789fbde7 Doc: Auto-update documentation
Auto-updated using release-website.sh
2023-08-27 12:18:11 +00:00
Peter Havekes 9d73ff0ead Update Dutch translations (#8725) 2023-08-27 12:43:01 +01:00
Henry Heino a3a7ab2cf0 Mobile: Fixes #8707: Fix not all dropdown items focusable with VoiceOver (#8714) 2023-08-27 12:42:42 +01:00
github-actions[bot] 4e25377122 @fernandonagase has signed the CLA in laurent22/joplin#8733 2023-08-26 01:50:34 +00:00
Laurent Cozic dcd3def942 All: Resolves #8684: Apply correct size to images imported from ENEX files 2023-08-25 15:13:36 +01:00
Laurent Cozic a14674aaa8 Doc: Update plugin generator doc 2023-08-25 10:41:46 +01:00
Титан a03401a692 Updated russian localization (#8635) 2023-08-25 10:15:31 +01:00
Henry Heino 315baacba7 Desktop: Fixes #8723: Update CSS variables in user iframes on theme change (#8724) 2023-08-25 09:20:44 +01:00
github-actions[bot] 7ab197a92b @phavekes has signed the CLA in laurent22/joplin#8725 2023-08-25 08:14:53 +00:00
Henry Heino bf41ed1b13 Chore: Fix packageJsonLint on some systems (#8721) 2023-08-24 19:51:53 +01:00
renovate[bot] ea60087788 Update dependency gettext-extractor to v3.8.0 (#8717)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-24 16:22:08 +01:00
Laurent Cozic 97938ec272 Tools: Retry CodeMirror mobile tests when they fail 2023-08-24 15:34:00 +01:00
Laurent Cozic 13b7e3657b Merge branch 'release-2.12' into dev 2023-08-23 19:10:58 +01:00
Laurent Cozic d590bd7720 Desktop release v2.12.14 2023-08-23 19:03:00 +01:00
Laurent Cozic 8696ae1bb6 Desktop: Fixes #8706: Pasting a resource in Rich Text editor breaks the resource link 2023-08-23 18:59:04 +01:00
Laurent Cozic b452a0a870 Desktop: Fixes #8706: Pasting a resource in Rich Text editor breaks the resource link 2023-08-23 18:41:58 +01:00
Laurent Cozic 77df474b46 Tools: Enable eslint rule comma-dangle: always-multiline for functions 2023-08-23 18:28:00 +01:00
Laurent Cozic 5a8032050d Desktop release v2.12.13 2023-08-23 18:16:51 +01:00
Laurent Cozic 73eedd3ec3 Desktop: Fixes #8706: Pasting a resource in Rich Text editor breaks the resource link 2023-08-23 18:16:06 +01:00
Laurent Cozic 3577b245f6 CLI v2.12.1 2023-08-23 13:53:55 +01:00
Laurent Cozic e126a2d8bf Lock file 2023-08-23 13:52:14 +01:00
Laurent Cozic 21929157b5 Releasing sub-packages 2023-08-23 13:51:28 +01:00
Laurent Cozic 5da3780197 Chore: Make package private 2023-08-23 13:48:49 +01:00
Laurent Cozic cea07b94fb Doc: Specify the domains the app connects to, and removed redundant info from privacy policy 2023-08-22 20:08:46 +01:00
Laurent Cozic 59f8b43c21 All: Fixes #8699: Prevent application from being stuck when importing an invalid ENEX file 2023-08-22 17:26:52 +01:00
Laurent Cozic 5c63eb0913 Merge branch 'release-2.12-mobile' into dev 2023-08-22 14:54:32 +01:00
Laurent Cozic 5855748e06 Android 2.12.2 2023-08-22 14:53:46 +01:00
Laurent Cozic 4e2d36648e Android: Only include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" in APK 2023-08-22 14:08:13 +01:00
Joplin Bot 6aec75806e Doc: Auto-update documentation
Auto-updated using release-website.sh
2023-08-22 12:19:35 +00:00
Laurent Cozic 2e9f93ad9a Tools: Enable eslint rule comma-dangle: always-multiline for functions 2023-08-22 11:58:53 +01:00
Laurent Cozic 26a967e53c Tools: Change order of pre-commit hooks 2023-08-22 11:46:35 +01:00
Laurent Cozic 2fda252a5e Doc: Update contributor table 2023-08-22 11:40:27 +01:00
Laurent Cozic 831b1ae035 Merge branch 'release-2.12-mobile' into dev 2023-08-22 11:26:15 +01:00
Laurent Cozic f807a0179d iOS 12.12.1 2023-08-22 11:08:22 +01:00
Laurent Cozic b3801b333d Chore: iOS: Disable Flipper support
It is useless and prevents the app from building
2023-08-22 11:01:54 +01:00
renovate[bot] 808e175f7f Update dependency react-native-device-info to v10.8.0 (#8703)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-21 18:39:20 +01:00
Laurent Cozic 03f1d86531 Desktop: Resolves #8691: Improve pasting content from Word and Excel (#8705) 2023-08-21 18:37:33 +01:00
Laurent Cozic 973680ea27 Desktop release v2.12.12 2023-08-19 21:03:46 +01:00
Henry HeinoandLaurent Cozic 3778f190fb Desktop: Resolves #8493: Link to FAQ when encryption password may have been reset by an update (#8667)
Co-authored-by: Laurent Cozic <laurent22@users.noreply.github.com>
2023-08-19 09:17:25 +01:00
Laurent Cozic f0c1042a71 Desktop: Fetch release info from Joplin server 2023-08-18 12:46:34 +01:00
214 changed files with 2129 additions and 1584 deletions

No files matched your search

+5 -1
View File
@@ -133,6 +133,7 @@ packages/app-desktop/gui/ClipperConfigScreen.js
packages/app-desktop/gui/ConfigScreen/ButtonBar.js
packages/app-desktop/gui/ConfigScreen/ConfigScreen.js
packages/app-desktop/gui/ConfigScreen/Sidebar.js
packages/app-desktop/gui/ConfigScreen/controls/MissingPasswordHelpLink.js
packages/app-desktop/gui/ConfigScreen/controls/ToggleAdvancedSettingsButton.js
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.js
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js
@@ -380,6 +381,7 @@ packages/app-desktop/services/plugins/hooks/useContentSize.js
packages/app-desktop/services/plugins/hooks/useHtmlLoader.js
packages/app-desktop/services/plugins/hooks/useScriptLoader.js
packages/app-desktop/services/plugins/hooks/useSubmitHandler.js
packages/app-desktop/services/plugins/hooks/useThemeCss.test.js
packages/app-desktop/services/plugins/hooks/useThemeCss.js
packages/app-desktop/services/plugins/hooks/useViewIsReady.js
packages/app-desktop/services/plugins/hooks/useWebviewToPluginMessages.js
@@ -400,6 +402,7 @@ packages/app-mobile/components/ActionButton.js
packages/app-mobile/components/BackButtonDialogBox.js
packages/app-mobile/components/CameraView.js
packages/app-mobile/components/CustomButton.js
packages/app-mobile/components/Dropdown.test.js
packages/app-mobile/components/Dropdown.js
packages/app-mobile/components/ExtendedWebView.js
packages/app-mobile/components/FolderPicker.js
@@ -549,7 +552,6 @@ packages/lib/database-driver-better-sqlite.js
packages/lib/database.js
packages/lib/debug/DebugService.js
packages/lib/dom.js
packages/lib/dummy.test.js
packages/lib/errorUtils.js
packages/lib/errors.js
packages/lib/eventManager.js
@@ -923,6 +925,7 @@ packages/tools/generate-images.js
packages/tools/git-changelog.test.js
packages/tools/git-changelog.js
packages/tools/licenseChecker.js
packages/tools/packageJsonLint.js
packages/tools/release-android.js
packages/tools/release-cli.js
packages/tools/release-electron.js
@@ -933,6 +936,7 @@ packages/tools/setupNewRelease.js
packages/tools/spellcheck.js
packages/tools/tagServerLatest.js
packages/tools/tool-utils.js
packages/tools/update-readme-contributors.js
packages/tools/update-readme-download.test.js
packages/tools/update-readme-download.js
packages/tools/update-readme-sponsors.js
+2 -2
View File
@@ -119,7 +119,7 @@ module.exports = {
'objects': 'always-multiline',
'imports': 'always-multiline',
'exports': 'always-multiline',
'functions': 'never',
'functions': 'always-multiline',
}],
'comma-spacing': ['error', { 'before': false, 'after': true }],
'no-trailing-spaces': 'error',
@@ -209,7 +209,7 @@ module.exports = {
'enums': 'always-multiline',
'generics': 'always-multiline',
'tuples': 'always-multiline',
'functions': 'never',
'functions': 'always-multiline',
}],
'@typescript-eslint/object-curly-spacing': ['error', 'always'],
'@typescript-eslint/semi': ['error', 'always'],
+5 -1
View File
@@ -119,6 +119,7 @@ packages/app-desktop/gui/ClipperConfigScreen.js
packages/app-desktop/gui/ConfigScreen/ButtonBar.js
packages/app-desktop/gui/ConfigScreen/ConfigScreen.js
packages/app-desktop/gui/ConfigScreen/Sidebar.js
packages/app-desktop/gui/ConfigScreen/controls/MissingPasswordHelpLink.js
packages/app-desktop/gui/ConfigScreen/controls/ToggleAdvancedSettingsButton.js
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.js
packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js
@@ -366,6 +367,7 @@ packages/app-desktop/services/plugins/hooks/useContentSize.js
packages/app-desktop/services/plugins/hooks/useHtmlLoader.js
packages/app-desktop/services/plugins/hooks/useScriptLoader.js
packages/app-desktop/services/plugins/hooks/useSubmitHandler.js
packages/app-desktop/services/plugins/hooks/useThemeCss.test.js
packages/app-desktop/services/plugins/hooks/useThemeCss.js
packages/app-desktop/services/plugins/hooks/useViewIsReady.js
packages/app-desktop/services/plugins/hooks/useWebviewToPluginMessages.js
@@ -386,6 +388,7 @@ packages/app-mobile/components/ActionButton.js
packages/app-mobile/components/BackButtonDialogBox.js
packages/app-mobile/components/CameraView.js
packages/app-mobile/components/CustomButton.js
packages/app-mobile/components/Dropdown.test.js
packages/app-mobile/components/Dropdown.js
packages/app-mobile/components/ExtendedWebView.js
packages/app-mobile/components/FolderPicker.js
@@ -535,7 +538,6 @@ packages/lib/database-driver-better-sqlite.js
packages/lib/database.js
packages/lib/debug/DebugService.js
packages/lib/dom.js
packages/lib/dummy.test.js
packages/lib/errorUtils.js
packages/lib/errors.js
packages/lib/eventManager.js
@@ -909,6 +911,7 @@ packages/tools/generate-images.js
packages/tools/git-changelog.test.js
packages/tools/git-changelog.js
packages/tools/licenseChecker.js
packages/tools/packageJsonLint.js
packages/tools/release-android.js
packages/tools/release-cli.js
packages/tools/release-electron.js
@@ -919,6 +922,7 @@ packages/tools/setupNewRelease.js
packages/tools/spellcheck.js
packages/tools/tagServerLatest.js
packages/tools/tool-utils.js
packages/tools/update-readme-contributors.js
packages/tools/update-readme-download.test.js
packages/tools/update-readme-download.js
packages/tools/update-readme-sponsors.js
+89 -74
View File
@@ -587,78 +587,93 @@ Thank you to everyone who've contributed to Joplin's source code!
<!-- CONTRIBUTORS-TABLE-AUTO-GENERATED -->
| | | | | |
| :---: | :---: | :---: | :---: | :---: |
| <img width="50" src="https://avatars.githubusercontent.com/u/1285584?v=4"/></br>[laurent22](https://github.com/laurent22) | <img width="50" src="https://avatars.githubusercontent.com/u/223439?v=4"/></br>[tessus](https://github.com/tessus) | <img width="50" src="https://avatars.githubusercontent.com/u/2179547?v=4"/></br>[CalebJohn](https://github.com/CalebJohn) | <img width="50" src="https://avatars.githubusercontent.com/u/1732810?v=4"/></br>[mic704b](https://github.com/mic704b) | <img width="50" src="https://avatars.githubusercontent.com/u/995612?v=4"/></br>[roman-r-m](https://github.com/roman-r-m) |
| <img width="50" src="https://avatars.githubusercontent.com/u/29672555?v=4"/></br>[genneko](https://github.com/genneko) | <img width="50" src="https://avatars.githubusercontent.com/u/63491353?v=4"/></br>[j-krl](https://github.com/j-krl) | <img width="50" src="https://avatars.githubusercontent.com/u/4553672?v=4"/></br>[tanrax](https://github.com/tanrax) | <img width="50" src="https://avatars.githubusercontent.com/u/30305957?v=4"/></br>[naviji](https://github.com/naviji) | <img width="50" src="https://avatars.githubusercontent.com/u/3542031?v=4"/></br>[PackElend](https://github.com/PackElend) |
| <img width="50" src="https://avatars.githubusercontent.com/u/8701534?v=4"/></br>[rtmkrlv](https://github.com/rtmkrlv) | <img width="50" src="https://avatars.githubusercontent.com/u/10997189?v=4"/></br>[fmrtn](https://github.com/fmrtn) | <img width="50" src="https://avatars.githubusercontent.com/u/4374338?v=4"/></br>[potatogim](https://github.com/potatogim) | <img width="50" src="https://avatars.githubusercontent.com/u/6979755?v=4"/></br>[devonzuegel](https://github.com/devonzuegel) | <img width="50" src="https://avatars.githubusercontent.com/u/26695184?v=4"/></br>[anjulalk](https://github.com/anjulalk) |
| <img width="50" src="https://avatars.githubusercontent.com/u/16101778?v=4"/></br>[gabcoh](https://github.com/gabcoh) | <img width="50" src="https://avatars.githubusercontent.com/u/10927304?v=4"/></br>[matsest](https://github.com/matsest) | <img width="50" src="https://avatars.githubusercontent.com/u/6319051?v=4"/></br>[abonte](https://github.com/abonte) | <img width="50" src="https://avatars.githubusercontent.com/u/1685517?v=4"/></br>[Abijeet](https://github.com/Abijeet) | <img width="50" src="https://avatars.githubusercontent.com/u/27751740?v=4"/></br>[ishantgupta777](https://github.com/ishantgupta777) |
| <img width="50" src="https://avatars.githubusercontent.com/u/24863925?v=4"/></br>[JackGruber](https://github.com/JackGruber) | <img width="50" src="https://avatars.githubusercontent.com/u/2063957?v=4"/></br>[Ardakilic](https://github.com/Ardakilic) | <img width="50" src="https://avatars.githubusercontent.com/u/44024553?v=4"/></br>[rabeehrz](https://github.com/rabeehrz) | <img width="50" src="https://avatars.githubusercontent.com/u/35633575?v=4"/></br>[coderrsid](https://github.com/coderrsid) | <img width="50" src="https://avatars.githubusercontent.com/u/208212?v=4"/></br>[foxmask](https://github.com/foxmask) |
| <img width="50" src="https://avatars.githubusercontent.com/u/6557454?v=4"/></br>[innocuo](https://github.com/innocuo) | <img width="50" src="https://avatars.githubusercontent.com/u/54268438?v=4"/></br>[Rahulm2310](https://github.com/Rahulm2310) | <img width="50" src="https://avatars.githubusercontent.com/u/1904967?v=4"/></br>[readingsnail](https://github.com/readingsnail) | <img width="50" src="https://avatars.githubusercontent.com/u/7415668?v=4"/></br>[mablin7](https://github.com/mablin7) | <img width="50" src="https://avatars.githubusercontent.com/u/3985557?v=4"/></br>[XarisA](https://github.com/XarisA) |
| <img width="50" src="https://avatars.githubusercontent.com/u/49979415?v=4"/></br>[jonath92](https://github.com/jonath92) | <img width="50" src="https://avatars.githubusercontent.com/u/4237724?v=4"/></br>[alexdevero](https://github.com/alexdevero) | <img width="50" src="https://avatars.githubusercontent.com/u/35904727?v=4"/></br>[Runo-saduwa](https://github.com/Runo-saduwa) | <img width="50" src="https://avatars.githubusercontent.com/u/5365582?v=4"/></br>[marcosvega91](https://github.com/marcosvega91) | <img width="50" src="https://avatars.githubusercontent.com/u/37639389?v=4"/></br>[petrz12](https://github.com/petrz12) |
| <img width="50" src="https://avatars.githubusercontent.com/u/51550769?v=4"/></br>[rnbastos](https://github.com/rnbastos) | <img width="50" src="https://avatars.githubusercontent.com/u/32396?v=4"/></br>[ProgramFan](https://github.com/ProgramFan) | <img width="50" src="https://avatars.githubusercontent.com/u/4245227?v=4"/></br>[zblesk](https://github.com/zblesk) | <img width="50" src="https://avatars.githubusercontent.com/u/5730052?v=4"/></br>[vsimkus](https://github.com/vsimkus) | <img width="50" src="https://avatars.githubusercontent.com/u/3194829?v=4"/></br>[moltenform](https://github.com/moltenform) |
| <img width="50" src="https://avatars.githubusercontent.com/u/36989112?v=4"/></br>[nishantwrp](https://github.com/nishantwrp) | <img width="50" src="https://avatars.githubusercontent.com/u/5199995?v=4"/></br>[zuphilip](https://github.com/zuphilip) | <img width="50" src="https://avatars.githubusercontent.com/u/54576074?v=4"/></br>[Rishabh-malhotraa](https://github.com/Rishabh-malhotraa) | <img width="50" src="https://avatars.githubusercontent.com/u/559346?v=4"/></br>[metbril](https://github.com/metbril) | <img width="50" src="https://avatars.githubusercontent.com/u/47623588?v=4"/></br>[WhiredPlanck](https://github.com/WhiredPlanck) |
| <img width="50" src="https://avatars.githubusercontent.com/u/43657314?v=4"/></br>[milotype](https://github.com/milotype) | <img width="50" src="https://avatars.githubusercontent.com/u/32196447?v=4"/></br>[yaozeye](https://github.com/yaozeye) | <img width="50" src="https://avatars.githubusercontent.com/u/12264626?v=4"/></br>[ylc395](https://github.com/ylc395) | <img width="50" src="https://avatars.githubusercontent.com/u/17768566?v=4"/></br>[RenatoXSR](https://github.com/RenatoXSR) | <img width="50" src="https://avatars.githubusercontent.com/u/54888685?v=4"/></br>[RedDocMD](https://github.com/RedDocMD) |
| <img width="50" src="https://avatars.githubusercontent.com/u/31567272?v=4"/></br>[q1011](https://github.com/q1011) | <img width="50" src="https://avatars.githubusercontent.com/u/12906090?v=4"/></br>[amitsin6h](https://github.com/amitsin6h) | <img width="50" src="https://avatars.githubusercontent.com/u/628474?v=4"/></br>[Atalanttore](https://github.com/Atalanttore) | <img width="50" src="https://avatars.githubusercontent.com/u/42747216?v=4"/></br>[Mannivu](https://github.com/Mannivu) | <img width="50" src="https://avatars.githubusercontent.com/u/23281486?v=4"/></br>[martonpaulo](https://github.com/martonpaulo) |
| <img width="50" src="https://avatars.githubusercontent.com/u/390889?v=4"/></br>[mmahmoudian](https://github.com/mmahmoudian) | <img width="50" src="https://avatars.githubusercontent.com/u/4497566?v=4"/></br>[rccavalcanti](https://github.com/rccavalcanti) | <img width="50" src="https://avatars.githubusercontent.com/u/1540054?v=4"/></br>[ShaneKilkelly](https://github.com/ShaneKilkelly) | <img width="50" src="https://avatars.githubusercontent.com/u/7091080?v=4"/></br>[sinkuu](https://github.com/sinkuu) | <img width="50" src="https://avatars.githubusercontent.com/u/6734573?v=4"/></br>[stweil](https://github.com/stweil) |
| <img width="50" src="https://avatars.githubusercontent.com/u/692072?v=4"/></br>[conyx](https://github.com/conyx) | <img width="50" src="https://avatars.githubusercontent.com/u/49116134?v=4"/></br>[anihm136](https://github.com/anihm136) | <img width="50" src="https://avatars.githubusercontent.com/u/937861?v=4"/></br>[archont00](https://github.com/archont00) | <img width="50" src="https://avatars.githubusercontent.com/u/32770029?v=4"/></br>[bradmcl](https://github.com/bradmcl) | <img width="50" src="https://avatars.githubusercontent.com/u/22592201?v=4"/></br>[tfinnberg](https://github.com/tfinnberg) |
| <img width="50" src="https://avatars.githubusercontent.com/u/8716226?v=4"/></br>[amandamcg](https://github.com/amandamcg) | <img width="50" src="https://avatars.githubusercontent.com/u/3870964?v=4"/></br>[marcushill](https://github.com/marcushill) | <img width="50" src="https://avatars.githubusercontent.com/u/102242?v=4"/></br>[nathanleiby](https://github.com/nathanleiby) | <img width="50" src="https://avatars.githubusercontent.com/u/226708?v=4"/></br>[RaphaelKimmig](https://github.com/RaphaelKimmig) | <img width="50" src="https://avatars.githubusercontent.com/u/20461071?v=4"/></br>[Vaso3](https://github.com/Vaso3) |
| <img width="50" src="https://avatars.githubusercontent.com/u/36303913?v=4"/></br>[sensor-freak](https://github.com/sensor-freak) | <img width="50" src="https://avatars.githubusercontent.com/u/63918341?v=4"/></br>[lkiThakur](https://github.com/lkiThakur) | <img width="50" src="https://avatars.githubusercontent.com/u/28987176?v=4"/></br>[infinity052](https://github.com/infinity052) | <img width="50" src="https://avatars.githubusercontent.com/u/21161146?v=4"/></br>[BartBucknill](https://github.com/BartBucknill) | <img width="50" src="https://avatars.githubusercontent.com/u/2494769?v=4"/></br>[mrwulf](https://github.com/mrwulf) |
| <img width="50" src="https://avatars.githubusercontent.com/u/560571?v=4"/></br>[chrisb86](https://github.com/chrisb86) | <img width="50" src="https://avatars.githubusercontent.com/u/1686759?v=4"/></br>[chrmoritz](https://github.com/chrmoritz) | <img width="50" src="https://avatars.githubusercontent.com/u/58074586?v=4"/></br>[Daeraxa](https://github.com/Daeraxa) | <img width="50" src="https://avatars.githubusercontent.com/u/71190696?v=4"/></br>[Elaborendum](https://github.com/Elaborendum) | <img width="50" src="https://avatars.githubusercontent.com/u/5001259?v=4"/></br>[ethan42411](https://github.com/ethan42411) |
| <img width="50" src="https://avatars.githubusercontent.com/u/2733783?v=4"/></br>[JOJ0](https://github.com/JOJ0) | <img width="50" src="https://avatars.githubusercontent.com/u/17108695?v=4"/></br>[jalajcodes](https://github.com/jalajcodes) | <img width="50" src="https://avatars.githubusercontent.com/u/238088?v=4"/></br>[jblunck](https://github.com/jblunck) | <img width="50" src="https://avatars.githubusercontent.com/u/3140223?v=4"/></br>[jdrobertso](https://github.com/jdrobertso) | <img width="50" src="https://avatars.githubusercontent.com/u/37297218?v=4"/></br>[Jesssullivan](https://github.com/Jesssullivan) |
| <img width="50" src="https://avatars.githubusercontent.com/u/339645?v=4"/></br>[jmontane](https://github.com/jmontane) | <img width="50" src="https://avatars.githubusercontent.com/u/69011?v=4"/></br>[johanhammar](https://github.com/johanhammar) | <img width="50" src="https://avatars.githubusercontent.com/u/4168339?v=4"/></br>[solariz](https://github.com/solariz) | <img width="50" src="https://avatars.githubusercontent.com/u/25288?v=4"/></br>[maicki](https://github.com/maicki) | <img width="50" src="https://avatars.githubusercontent.com/u/2136373?v=4"/></br>[mjjzf](https://github.com/mjjzf) |
| <img width="50" src="https://avatars.githubusercontent.com/u/27608187?v=4"/></br>[rt-oliveira](https://github.com/rt-oliveira) | <img width="50" src="https://avatars.githubusercontent.com/u/2486806?v=4"/></br>[sebastienjust](https://github.com/sebastienjust) | <img width="50" src="https://avatars.githubusercontent.com/u/28362310?v=4"/></br>[sealch](https://github.com/sealch) | <img width="50" src="https://avatars.githubusercontent.com/u/34258070?v=4"/></br>[StarFang208](https://github.com/StarFang208) | <img width="50" src="https://avatars.githubusercontent.com/u/59690052?v=4"/></br>[Subhra264](https://github.com/Subhra264) |
| <img width="50" src="https://avatars.githubusercontent.com/u/1782292?v=4"/></br>[SubodhDahal](https://github.com/SubodhDahal) | <img width="50" src="https://avatars.githubusercontent.com/u/5912371?v=4"/></br>[TobiasDev](https://github.com/TobiasDev) | <img width="50" src="https://avatars.githubusercontent.com/u/13502069?v=4"/></br>[Whaell](https://github.com/Whaell) | <img width="50" src="https://avatars.githubusercontent.com/u/29891001?v=4"/></br>[jyuvaraj03](https://github.com/jyuvaraj03) | <img width="50" src="https://avatars.githubusercontent.com/u/15380913?v=4"/></br>[kowalskidev](https://github.com/kowalskidev) |
| <img width="50" src="https://avatars.githubusercontent.com/u/337455?v=4"/></br>[alexchee](https://github.com/alexchee) | <img width="50" src="https://avatars.githubusercontent.com/u/5077221?v=4"/></br>[axq](https://github.com/axq) | <img width="50" src="https://avatars.githubusercontent.com/u/8808502?v=4"/></br>[barbowza](https://github.com/barbowza) | <img width="50" src="https://avatars.githubusercontent.com/u/42007357?v=4"/></br>[eresytter](https://github.com/eresytter) | <img width="50" src="https://avatars.githubusercontent.com/u/4316805?v=4"/></br>[lightray22](https://github.com/lightray22) |
| <img width="50" src="https://avatars.githubusercontent.com/u/11711053?v=4"/></br>[lscolombo](https://github.com/lscolombo) | <img width="50" src="https://avatars.githubusercontent.com/u/36228623?v=4"/></br>[mrkaato](https://github.com/mrkaato) | <img width="50" src="https://avatars.githubusercontent.com/u/17399340?v=4"/></br>[pf-siedler](https://github.com/pf-siedler) | <img width="50" src="https://avatars.githubusercontent.com/u/17232523?v=4"/></br>[ruuti](https://github.com/ruuti) | <img width="50" src="https://avatars.githubusercontent.com/u/23638148?v=4"/></br>[s1nceri7y](https://github.com/s1nceri7y) |
| <img width="50" src="https://avatars.githubusercontent.com/u/10117386?v=4"/></br>[kornava](https://github.com/kornava) | <img width="50" src="https://avatars.githubusercontent.com/u/7471938?v=4"/></br>[ShuiHuo](https://github.com/ShuiHuo) | <img width="50" src="https://avatars.githubusercontent.com/u/11596277?v=4"/></br>[ikunya](https://github.com/ikunya) | <img width="50" src="https://avatars.githubusercontent.com/u/8184424?v=4"/></br>[Ahmad45123](https://github.com/Ahmad45123) | <img width="50" src="https://avatars.githubusercontent.com/u/59133880?v=4"/></br>[bedwardly-down](https://github.com/bedwardly-down) |
| <img width="50" src="https://avatars.githubusercontent.com/u/50335724?v=4"/></br>[dcaveiro](https://github.com/dcaveiro) | <img width="50" src="https://avatars.githubusercontent.com/u/47456195?v=4"/></br>[hexclover](https://github.com/hexclover) | <img width="50" src="https://avatars.githubusercontent.com/u/45535789?v=4"/></br>[2jaeyeol](https://github.com/2jaeyeol) | <img width="50" src="https://avatars.githubusercontent.com/u/25622825?v=4"/></br>[thackeraaron](https://github.com/thackeraaron) | <img width="50" src="https://avatars.githubusercontent.com/u/15862474?v=4"/></br>[aaronxn](https://github.com/aaronxn) |
| <img width="50" src="https://avatars.githubusercontent.com/u/40672207?v=4"/></br>[xUser5000](https://github.com/xUser5000) | <img width="50" src="https://avatars.githubusercontent.com/u/56785486?v=4"/></br>[iamabhi222](https://github.com/iamabhi222) | <img width="50" src="https://avatars.githubusercontent.com/u/63443657?v=4"/></br>[Aksh-Konda](https://github.com/Aksh-Konda) | <img width="50" src="https://avatars.githubusercontent.com/u/3660978?v=4"/></br>[alanfortlink](https://github.com/alanfortlink) | <img width="50" src="https://avatars.githubusercontent.com/u/53372753?v=4"/></br>[AverageUser2](https://github.com/AverageUser2) |
| <img width="50" src="https://avatars.githubusercontent.com/u/4056990?v=4"/></br>[afischer211](https://github.com/afischer211) | <img width="50" src="https://avatars.githubusercontent.com/u/26230870?v=4"/></br>[a13xk](https://github.com/a13xk) | <img width="50" src="https://avatars.githubusercontent.com/u/14836659?v=4"/></br>[apankratov](https://github.com/apankratov) | <img width="50" src="https://avatars.githubusercontent.com/u/7045739?v=4"/></br>[teterkin](https://github.com/teterkin) | <img width="50" src="https://avatars.githubusercontent.com/u/215668?v=4"/></br>[avanderberg](https://github.com/avanderberg) |
| <img width="50" src="https://avatars.githubusercontent.com/u/41290751?v=4"/></br>[serenitatis](https://github.com/serenitatis) | <img width="50" src="https://avatars.githubusercontent.com/u/4408379?v=4"/></br>[lex111](https://github.com/lex111) | <img width="50" src="https://avatars.githubusercontent.com/u/60134194?v=4"/></br>[Alkindi42](https://github.com/Alkindi42) | <img width="50" src="https://avatars.githubusercontent.com/u/7129815?v=4"/></br>[Jumanjii](https://github.com/Jumanjii) | <img width="50" src="https://avatars.githubusercontent.com/u/19962243?v=4"/></br>[AlphaJack](https://github.com/AlphaJack) |
| <img width="50" src="https://avatars.githubusercontent.com/u/65647302?v=4"/></br>[Lord-Aman](https://github.com/Lord-Aman) | <img width="50" src="https://avatars.githubusercontent.com/u/14096959?v=4"/></br>[richtwin567](https://github.com/richtwin567) | <img width="50" src="https://avatars.githubusercontent.com/u/487182?v=4"/></br>[ajilderda](https://github.com/ajilderda) | <img width="50" src="https://avatars.githubusercontent.com/u/922429?v=4"/></br>[adrynov](https://github.com/adrynov) | <img width="50" src="https://avatars.githubusercontent.com/u/94937?v=4"/></br>[andrewperry](https://github.com/andrewperry) |
| <img width="50" src="https://avatars.githubusercontent.com/u/5417051?v=4"/></br>[tekdel](https://github.com/tekdel) | <img width="50" src="https://avatars.githubusercontent.com/u/54475686?v=4"/></br>[anshuman9999](https://github.com/anshuman9999) | <img width="50" src="https://avatars.githubusercontent.com/u/25694659?v=4"/></br>[rasklaad](https://github.com/rasklaad) | <img width="50" src="https://avatars.githubusercontent.com/u/17809291?v=4"/></br>[Technik-J](https://github.com/Technik-J) | <img width="50" src="https://avatars.githubusercontent.com/u/498326?v=4"/></br>[Shaxine](https://github.com/Shaxine) |
| <img width="50" src="https://avatars.githubusercontent.com/u/9095073?v=4"/></br>[antonio-ramadas](https://github.com/antonio-ramadas) | <img width="50" src="https://avatars.githubusercontent.com/u/28067395?v=4"/></br>[heyapoorva](https://github.com/heyapoorva) | <img width="50" src="https://avatars.githubusercontent.com/u/201215?v=4"/></br>[assimd](https://github.com/assimd) | <img width="50" src="https://avatars.githubusercontent.com/u/26827848?v=4"/></br>[Atrate](https://github.com/Atrate) | <img width="50" src="https://avatars.githubusercontent.com/u/60288895?v=4"/></br>[Beowulf2](https://github.com/Beowulf2) |
| <img width="50" src="https://avatars.githubusercontent.com/u/7034200?v=4"/></br>[bimlas](https://github.com/bimlas) | <img width="50" src="https://avatars.githubusercontent.com/u/47641641?v=4"/></br>[brenobaptista](https://github.com/brenobaptista) | <img width="50" src="https://avatars.githubusercontent.com/u/60824?v=4"/></br>[brttbndr](https://github.com/brttbndr) | <img width="50" src="https://avatars.githubusercontent.com/u/16287077?v=4"/></br>[carlbordum](https://github.com/carlbordum) | <img width="50" src="https://avatars.githubusercontent.com/u/20382?v=4"/></br>[carlosedp](https://github.com/carlosedp) |
| <img width="50" src="https://avatars.githubusercontent.com/u/105843?v=4"/></br>[chaifeng](https://github.com/chaifeng) | <img width="50" src="https://avatars.githubusercontent.com/u/549349?v=4"/></br>[charles-e](https://github.com/charles-e) | <img width="50" src="https://avatars.githubusercontent.com/u/19870089?v=4"/></br>[cyy5358](https://github.com/cyy5358) | <img width="50" src="https://avatars.githubusercontent.com/u/32337926?v=4"/></br>[Chillu1](https://github.com/Chillu1) | <img width="50" src="https://avatars.githubusercontent.com/u/2348463?v=4"/></br>[Techwolf12](https://github.com/Techwolf12) |
| <img width="50" src="https://avatars.githubusercontent.com/u/2282880?v=4"/></br>[cloudtrends](https://github.com/cloudtrends) | <img width="50" src="https://avatars.githubusercontent.com/u/17257053?v=4"/></br>[idcristi](https://github.com/idcristi) | <img width="50" src="https://avatars.githubusercontent.com/u/15956322?v=4"/></br>[damienmascre](https://github.com/damienmascre) | <img width="50" src="https://avatars.githubusercontent.com/u/1044056?v=4"/></br>[daniellandau](https://github.com/daniellandau) | <img width="50" src="https://avatars.githubusercontent.com/u/12847693?v=4"/></br>[danil-tolkachev](https://github.com/danil-tolkachev) |
| <img width="50" src="https://avatars.githubusercontent.com/u/7279100?v=4"/></br>[darshani28](https://github.com/darshani28) | <img width="50" src="https://avatars.githubusercontent.com/u/26189247?v=4"/></br>[daukadolt](https://github.com/daukadolt) | <img width="50" src="https://avatars.githubusercontent.com/u/28535750?v=4"/></br>[NeverMendel](https://github.com/NeverMendel) | <img width="50" src="https://avatars.githubusercontent.com/u/26790323?v=4"/></br>[dervist](https://github.com/dervist) | <img width="50" src="https://avatars.githubusercontent.com/u/11378282?v=4"/></br>[diego-betto](https://github.com/diego-betto) |
| <img width="50" src="https://avatars.githubusercontent.com/u/215270?v=4"/></br>[erdody](https://github.com/erdody) | <img width="50" src="https://avatars.githubusercontent.com/u/10371667?v=4"/></br>[domgoodwin](https://github.com/domgoodwin) | <img width="50" src="https://avatars.githubusercontent.com/u/72066?v=4"/></br>[b4mboo](https://github.com/b4mboo) | <img width="50" src="https://avatars.githubusercontent.com/u/5131923?v=4"/></br>[donbowman](https://github.com/donbowman) | <img width="50" src="https://avatars.githubusercontent.com/u/579727?v=4"/></br>[sirnacnud](https://github.com/sirnacnud) |
| <img width="50" src="https://avatars.githubusercontent.com/u/47756?v=4"/></br>[dflock](https://github.com/dflock) | <img width="50" src="https://avatars.githubusercontent.com/u/7990534?v=4"/></br>[drobilica](https://github.com/drobilica) | <img width="50" src="https://avatars.githubusercontent.com/u/21699905?v=4"/></br>[educbraga](https://github.com/educbraga) | <img width="50" src="https://avatars.githubusercontent.com/u/67867099?v=4"/></br>[eduardokimmel](https://github.com/eduardokimmel) | <img width="50" src="https://avatars.githubusercontent.com/u/30393516?v=4"/></br>[VodeniZeko](https://github.com/VodeniZeko) |
| <img width="50" src="https://avatars.githubusercontent.com/u/17415256?v=4"/></br>[ei-ke](https://github.com/ei-ke) | <img width="50" src="https://avatars.githubusercontent.com/u/1962738?v=4"/></br>[einverne](https://github.com/einverne) | <img width="50" src="https://avatars.githubusercontent.com/u/16492558?v=4"/></br>[eodeluga](https://github.com/eodeluga) | <img width="50" src="https://avatars.githubusercontent.com/u/16875937?v=4"/></br>[fathyar](https://github.com/fathyar) | <img width="50" src="https://avatars.githubusercontent.com/u/3057302?v=4"/></br>[fer22f](https://github.com/fer22f) |
| <img width="50" src="https://avatars.githubusercontent.com/u/43272148?v=4"/></br>[fpindado](https://github.com/fpindado) | <img width="50" src="https://avatars.githubusercontent.com/u/1714374?v=4"/></br>[FleischKarussel](https://github.com/FleischKarussel) | <img width="50" src="https://avatars.githubusercontent.com/u/18525376?v=4"/></br>[talkdirty](https://github.com/talkdirty) | <img width="50" src="https://avatars.githubusercontent.com/u/19814827?v=4"/></br>[gmaubach](https://github.com/gmaubach) | <img width="50" src="https://avatars.githubusercontent.com/u/6190183?v=4"/></br>[gmag11](https://github.com/gmag11) |
| <img width="50" src="https://avatars.githubusercontent.com/u/6209647?v=4"/></br>[Jackymancs4](https://github.com/Jackymancs4) | <img width="50" src="https://avatars.githubusercontent.com/u/297578?v=4"/></br>[Glandos](https://github.com/Glandos) | <img width="50" src="https://avatars.githubusercontent.com/u/24235344?v=4"/></br>[vibraniumdev](https://github.com/vibraniumdev) | <img width="50" src="https://avatars.githubusercontent.com/u/2257024?v=4"/></br>[gusbemacbe](https://github.com/gusbemacbe) | <img width="50" src="https://avatars.githubusercontent.com/u/64917442?v=4"/></br>[HOLLYwyh](https://github.com/HOLLYwyh) |
| <img width="50" src="https://avatars.githubusercontent.com/u/18524580?v=4"/></br>[Fvbor](https://github.com/Fvbor) | <img width="50" src="https://avatars.githubusercontent.com/u/22606250?v=4"/></br>[bennetthanna](https://github.com/bennetthanna) | <img width="50" src="https://avatars.githubusercontent.com/u/67231570?v=4"/></br>[harshitkathuria](https://github.com/harshitkathuria) | <img width="50" src="https://avatars.githubusercontent.com/u/1716229?v=4"/></br>[Vistaus](https://github.com/Vistaus) | <img width="50" src="https://avatars.githubusercontent.com/u/6509881?v=4"/></br>[ianjs](https://github.com/ianjs) |
| <img width="50" src="https://avatars.githubusercontent.com/u/19862172?v=4"/></br>[iahmedbacha](https://github.com/iahmedbacha) | <img width="50" src="https://avatars.githubusercontent.com/u/1533624?v=4"/></br>[IrvinDominin](https://github.com/IrvinDominin) | <img width="50" src="https://avatars.githubusercontent.com/u/33200024?v=4"/></br>[ishammahajan](https://github.com/ishammahajan) | <img width="50" src="https://avatars.githubusercontent.com/u/6916297?v=4"/></br>[ffadilaputra](https://github.com/ffadilaputra) | <img width="50" src="https://avatars.githubusercontent.com/u/19985741?v=4"/></br>[JRaiden16](https://github.com/JRaiden16) |
| <img width="50" src="https://avatars.githubusercontent.com/u/11466782?v=4"/></br>[jacobherrington](https://github.com/jacobherrington) | <img width="50" src="https://avatars.githubusercontent.com/u/9365179?v=4"/></br>[jamesadjinwa](https://github.com/jamesadjinwa) | <img width="50" src="https://avatars.githubusercontent.com/u/20801821?v=4"/></br>[jrwrigh](https://github.com/jrwrigh) | <img width="50" src="https://avatars.githubusercontent.com/u/4995433?v=4"/></br>[jaredcrowe](https://github.com/jaredcrowe) | <img width="50" src="https://avatars.githubusercontent.com/u/4087105?v=4"/></br>[volatilevar](https://github.com/volatilevar) |
| <img width="50" src="https://avatars.githubusercontent.com/u/47724360?v=4"/></br>[innkuika](https://github.com/innkuika) | <img width="50" src="https://avatars.githubusercontent.com/u/163555?v=4"/></br>[JoelRSimpson](https://github.com/JoelRSimpson) | <img width="50" src="https://avatars.githubusercontent.com/u/6965062?v=4"/></br>[joeltaylor](https://github.com/joeltaylor) | <img width="50" src="https://avatars.githubusercontent.com/u/242107?v=4"/></br>[exic](https://github.com/exic) | <img width="50" src="https://avatars.githubusercontent.com/u/13716151?v=4"/></br>[JonathanPlasse](https://github.com/JonathanPlasse) |
| <img width="50" src="https://avatars.githubusercontent.com/u/1248504?v=4"/></br>[joesfer](https://github.com/joesfer) | <img width="50" src="https://avatars.githubusercontent.com/u/6048003?v=4"/></br>[joybinchen](https://github.com/joybinchen) | <img width="50" src="https://avatars.githubusercontent.com/u/37601331?v=4"/></br>[kaustubhsh](https://github.com/kaustubhsh) | <img width="50" src="https://avatars.githubusercontent.com/u/1560189?v=4"/></br>[y-usuzumi](https://github.com/y-usuzumi) | <img width="50" src="https://avatars.githubusercontent.com/u/1660460?v=4"/></br>[xuhcc](https://github.com/xuhcc) |
| <img width="50" src="https://avatars.githubusercontent.com/u/16933735?v=4"/></br>[kirtanprht](https://github.com/kirtanprht) | <img width="50" src="https://avatars.githubusercontent.com/u/37491732?v=4"/></br>[k0ur0x](https://github.com/k0ur0x) | <img width="50" src="https://avatars.githubusercontent.com/u/7824233?v=4"/></br>[kklas](https://github.com/kklas) | <img width="50" src="https://avatars.githubusercontent.com/u/8622992?v=4"/></br>[xmlangel](https://github.com/xmlangel) | <img width="50" src="https://avatars.githubusercontent.com/u/1055100?v=4"/></br>[troilus](https://github.com/troilus) |
| <img width="50" src="https://avatars.githubusercontent.com/u/2599210?v=4"/></br>[lboullo0](https://github.com/lboullo0) | <img width="50" src="https://avatars.githubusercontent.com/u/1562062?v=4"/></br>[dbinary](https://github.com/dbinary) | <img width="50" src="https://avatars.githubusercontent.com/u/15436007?v=4"/></br>[marc-bouvier](https://github.com/marc-bouvier) | <img width="50" src="https://avatars.githubusercontent.com/u/5699725?v=4"/></br>[mvonmaltitz](https://github.com/mvonmaltitz) | <img width="50" src="https://avatars.githubusercontent.com/u/11036464?v=4"/></br>[mlkood](https://github.com/mlkood) |
| <img width="50" src="https://avatars.githubusercontent.com/u/2480960?v=4"/></br>[plextoriano](https://github.com/plextoriano) | <img width="50" src="https://avatars.githubusercontent.com/u/5788516?v=4"/></br>[Marmo](https://github.com/Marmo) | <img width="50" src="https://avatars.githubusercontent.com/u/29300939?v=4"/></br>[mcejp](https://github.com/mcejp) | <img width="50" src="https://avatars.githubusercontent.com/u/640949?v=4"/></br>[freaktechnik](https://github.com/freaktechnik) | <img width="50" src="https://avatars.githubusercontent.com/u/79802125?v=4"/></br>[martinkorelic](https://github.com/martinkorelic) |
| <img width="50" src="https://avatars.githubusercontent.com/u/287105?v=4"/></br>[Petemir](https://github.com/Petemir) | <img width="50" src="https://avatars.githubusercontent.com/u/5218859?v=4"/></br>[matsair](https://github.com/matsair) | <img width="50" src="https://avatars.githubusercontent.com/u/12831489?v=4"/></br>[mgroth0](https://github.com/mgroth0) | <img width="50" src="https://avatars.githubusercontent.com/u/21796?v=4"/></br>[silentmatt](https://github.com/silentmatt) | <img width="50" src="https://avatars.githubusercontent.com/u/76700192?v=4"/></br>[maxs-test](https://github.com/maxs-test) |
| <img width="50" src="https://avatars.githubusercontent.com/u/59669349?v=4"/></br>[MichBoi](https://github.com/MichBoi) | <img width="50" src="https://avatars.githubusercontent.com/u/51273874?v=4"/></br>[MichipX](https://github.com/MichipX) | <img width="50" src="https://avatars.githubusercontent.com/u/53177864?v=4"/></br>[MrTraduttore](https://github.com/MrTraduttore) | <img width="50" src="https://avatars.githubusercontent.com/u/48156230?v=4"/></br>[sanjarcode](https://github.com/sanjarcode) | <img width="50" src="https://avatars.githubusercontent.com/u/43955099?v=4"/></br>[Mustafa-ALD](https://github.com/Mustafa-ALD) |
| <img width="50" src="https://avatars.githubusercontent.com/u/9076687?v=4"/></br>[NJannasch](https://github.com/NJannasch) | <img width="50" src="https://avatars.githubusercontent.com/u/8016073?v=4"/></br>[zomglings](https://github.com/zomglings) | <img width="50" src="https://avatars.githubusercontent.com/u/10386884?v=4"/></br>[Frichetten](https://github.com/Frichetten) | <img width="50" src="https://avatars.githubusercontent.com/u/5541611?v=4"/></br>[nicolas-suzuki](https://github.com/nicolas-suzuki) | <img width="50" src="https://avatars.githubusercontent.com/u/12369770?v=4"/></br>[Ouvill](https://github.com/Ouvill) |
| <img width="50" src="https://avatars.githubusercontent.com/u/43815417?v=4"/></br>[shorty2380](https://github.com/shorty2380) | <img width="50" src="https://avatars.githubusercontent.com/u/15014287?v=4"/></br>[dist3r](https://github.com/dist3r) | <img width="50" src="https://avatars.githubusercontent.com/u/19418601?v=4"/></br>[rakleed](https://github.com/rakleed) | <img width="50" src="https://avatars.githubusercontent.com/u/7881932?v=4"/></br>[idle-code](https://github.com/idle-code) | <img width="50" src="https://avatars.githubusercontent.com/u/168931?v=4"/></br>[bobchao](https://github.com/bobchao) |
| <img width="50" src="https://avatars.githubusercontent.com/u/6306608?v=4"/></br>[Diadlo](https://github.com/Diadlo) | <img width="50" src="https://avatars.githubusercontent.com/u/42793024?v=4"/></br>[pranavmodx](https://github.com/pranavmodx) | <img width="50" src="https://avatars.githubusercontent.com/u/50834839?v=4"/></br>[R3dError](https://github.com/R3dError) | <img width="50" src="https://avatars.githubusercontent.com/u/42652941?v=4"/></br>[rajprakash00](https://github.com/rajprakash00) | <img width="50" src="https://avatars.githubusercontent.com/u/32304956?v=4"/></br>[rahil1304](https://github.com/rahil1304) |
| <img width="50" src="https://avatars.githubusercontent.com/u/8257474?v=4"/></br>[rasulkireev](https://github.com/rasulkireev) | <img width="50" src="https://avatars.githubusercontent.com/u/17312341?v=4"/></br>[reinhart1010](https://github.com/reinhart1010) | <img width="50" src="https://avatars.githubusercontent.com/u/60484714?v=4"/></br>[Retew](https://github.com/Retew) | <img width="50" src="https://avatars.githubusercontent.com/u/10456131?v=4"/></br>[ambrt](https://github.com/ambrt) | <img width="50" src="https://avatars.githubusercontent.com/u/15892014?v=4"/></br>[Derkades](https://github.com/Derkades) |
| <img width="50" src="https://avatars.githubusercontent.com/u/49439044?v=4"/></br>[fourstepper](https://github.com/fourstepper) | <img width="50" src="https://avatars.githubusercontent.com/u/54365?v=4"/></br>[rodgco](https://github.com/rodgco) | <img width="50" src="https://avatars.githubusercontent.com/u/96014?v=4"/></br>[Ronnie76er](https://github.com/Ronnie76er) | <img width="50" src="https://avatars.githubusercontent.com/u/79168?v=4"/></br>[roryokane](https://github.com/roryokane) | <img width="50" src="https://avatars.githubusercontent.com/u/744655?v=4"/></br>[ruzaq](https://github.com/ruzaq) |
| <img width="50" src="https://avatars.githubusercontent.com/u/20490839?v=4"/></br>[szokesandor](https://github.com/szokesandor) | <img width="50" src="https://avatars.githubusercontent.com/u/19328605?v=4"/></br>[SamuelBlickle](https://github.com/SamuelBlickle) | <img width="50" src="https://avatars.githubusercontent.com/u/80849457?v=4"/></br>[livingc0l0ur](https://github.com/livingc0l0ur) | <img width="50" src="https://avatars.githubusercontent.com/u/1776?v=4"/></br>[bronson](https://github.com/bronson) | <img width="50" src="https://avatars.githubusercontent.com/u/24606935?v=4"/></br>[semperor](https://github.com/semperor) |
| <img width="50" src="https://avatars.githubusercontent.com/u/607938?v=4"/></br>[shawnaxsom](https://github.com/shawnaxsom) | <img width="50" src="https://avatars.githubusercontent.com/u/9937486?v=4"/></br>[SFoskitt](https://github.com/SFoskitt) | <img width="50" src="https://avatars.githubusercontent.com/u/505011?v=4"/></br>[kcrt](https://github.com/kcrt) | <img width="50" src="https://avatars.githubusercontent.com/u/538584?v=4"/></br>[xissy](https://github.com/xissy) | <img width="50" src="https://avatars.githubusercontent.com/u/164962?v=4"/></br>[tams](https://github.com/tams) |
| <img width="50" src="https://avatars.githubusercontent.com/u/466122?v=4"/></br>[Tekki](https://github.com/Tekki) | <img width="50" src="https://avatars.githubusercontent.com/u/2112477?v=4"/></br>[ThatcherC](https://github.com/ThatcherC) | <img width="50" src="https://avatars.githubusercontent.com/u/21969426?v=4"/></br>[TheoDutch](https://github.com/TheoDutch) | <img width="50" src="https://avatars.githubusercontent.com/u/8731922?v=4"/></br>[tbroadley](https://github.com/tbroadley) | <img width="50" src="https://avatars.githubusercontent.com/u/114300?v=4"/></br>[Kriechi](https://github.com/Kriechi) |
| <img width="50" src="https://avatars.githubusercontent.com/u/3457339?v=4"/></br>[tkilaker](https://github.com/tkilaker) | <img width="50" src="https://avatars.githubusercontent.com/u/802148?v=4"/></br>[Tim-Erwin](https://github.com/Tim-Erwin) | <img width="50" src="https://avatars.githubusercontent.com/u/4201229?v=4"/></br>[tcyrus](https://github.com/tcyrus) | <img width="50" src="https://avatars.githubusercontent.com/u/834914?v=4"/></br>[tobias-grasse](https://github.com/tobias-grasse) | <img width="50" src="https://avatars.githubusercontent.com/u/6691273?v=4"/></br>[strobeltobias](https://github.com/strobeltobias) |
| <img width="50" src="https://avatars.githubusercontent.com/u/1677578?v=4"/></br>[kostegit](https://github.com/kostegit) | <img width="50" src="https://avatars.githubusercontent.com/u/70296?v=4"/></br>[tbergeron](https://github.com/tbergeron) | <img width="50" src="https://avatars.githubusercontent.com/u/10265443?v=4"/></br>[Ullas-Aithal](https://github.com/Ullas-Aithal) | <img width="50" src="https://avatars.githubusercontent.com/u/6104498?v=4"/></br>[MyTheValentinus](https://github.com/MyTheValentinus) | <img width="50" src="https://avatars.githubusercontent.com/u/2830093?v=4"/></br>[vassudanagunta](https://github.com/vassudanagunta) |
| <img width="50" src="https://avatars.githubusercontent.com/u/54314949?v=4"/></br>[vijayjoshi16](https://github.com/vijayjoshi16) | <img width="50" src="https://avatars.githubusercontent.com/u/59287619?v=4"/></br>[max-keviv](https://github.com/max-keviv) | <img width="50" src="https://avatars.githubusercontent.com/u/598576?v=4"/></br>[vandreykiv](https://github.com/vandreykiv) | <img width="50" src="https://avatars.githubusercontent.com/u/26511487?v=4"/></br>[WisdomCode](https://github.com/WisdomCode) | <img width="50" src="https://avatars.githubusercontent.com/u/1921957?v=4"/></br>[xsak](https://github.com/xsak) |
| <img width="50" src="https://avatars.githubusercontent.com/u/11031696?v=4"/></br>[ymitsos](https://github.com/ymitsos) | <img width="50" src="https://avatars.githubusercontent.com/u/63324960?v=4"/></br>[abolishallprivateproperty](https://github.com/abolishallprivateproperty) | <img width="50" src="https://avatars.githubusercontent.com/u/11336076?v=4"/></br>[aerotog](https://github.com/aerotog) | <img width="50" src="https://avatars.githubusercontent.com/u/39854348?v=4"/></br>[albertopasqualetto](https://github.com/albertopasqualetto) | <img width="50" src="https://avatars.githubusercontent.com/u/44570278?v=4"/></br>[asrient](https://github.com/asrient) |
| <img width="50" src="https://avatars.githubusercontent.com/u/621360?v=4"/></br>[bestlibre](https://github.com/bestlibre) | <img width="50" src="https://avatars.githubusercontent.com/u/35600612?v=4"/></br>[boring10](https://github.com/boring10) | <img width="50" src="https://avatars.githubusercontent.com/u/13894820?v=4"/></br>[cadolphs](https://github.com/cadolphs) | <img width="50" src="https://avatars.githubusercontent.com/u/12461043?v=4"/></br>[colorchestra](https://github.com/colorchestra) | <img width="50" src="https://avatars.githubusercontent.com/u/30935096?v=4"/></br>[cybertramp](https://github.com/cybertramp) |
| <img width="50" src="https://avatars.githubusercontent.com/u/15824892?v=4"/></br>[dartero](https://github.com/dartero) | <img width="50" src="https://avatars.githubusercontent.com/u/9694906?v=4"/></br>[delta-emil](https://github.com/delta-emil) | <img width="50" src="https://avatars.githubusercontent.com/u/926263?v=4"/></br>[doc75](https://github.com/doc75) | <img width="50" src="https://avatars.githubusercontent.com/u/5589253?v=4"/></br>[dsp77](https://github.com/dsp77) | <img width="50" src="https://avatars.githubusercontent.com/u/2903013?v=4"/></br>[ebayer](https://github.com/ebayer) |
| <img width="50" src="https://avatars.githubusercontent.com/u/9206310?v=4"/></br>[elsiehupp](https://github.com/elsiehupp) | <img width="50" src="https://avatars.githubusercontent.com/u/701050?v=4"/></br>[espinosa](https://github.com/espinosa) | <img width="50" src="https://avatars.githubusercontent.com/u/18619090?v=4"/></br>[exponentactivity](https://github.com/exponentactivity) | <img width="50" src="https://avatars.githubusercontent.com/u/16708935?v=4"/></br>[exprez135](https://github.com/exprez135) | <img width="50" src="https://avatars.githubusercontent.com/u/9768112?v=4"/></br>[fab4x](https://github.com/fab4x) |
| <img width="50" src="https://avatars.githubusercontent.com/u/47755037?v=4"/></br>[fabianski7](https://github.com/fabianski7) | <img width="50" src="https://avatars.githubusercontent.com/u/14201321?v=4"/></br>[rasperepodvipodvert](https://github.com/rasperepodvipodvert) | <img width="50" src="https://avatars.githubusercontent.com/u/748808?v=4"/></br>[gasolin](https://github.com/gasolin) | <img width="50" src="https://avatars.githubusercontent.com/u/47191051?v=4"/></br>[githubaccount073](https://github.com/githubaccount073) | <img width="50" src="https://avatars.githubusercontent.com/u/43672033?v=4"/></br>[hms5232](https://github.com/hms5232) |
| <img width="50" src="https://avatars.githubusercontent.com/u/11388094?v=4"/></br>[hydrandt](https://github.com/hydrandt) | <img width="50" src="https://avatars.githubusercontent.com/u/61012185?v=4"/></br>[iamtalwinder](https://github.com/iamtalwinder) | <img width="50" src="https://avatars.githubusercontent.com/u/557540?v=4"/></br>[jabdoa2](https://github.com/jabdoa2) | <img width="50" src="https://avatars.githubusercontent.com/u/29166402?v=4"/></br>[jduar](https://github.com/jduar) | <img width="50" src="https://avatars.githubusercontent.com/u/2678545?v=4"/></br>[jibedoubleve](https://github.com/jibedoubleve) |
| <img width="50" src="https://avatars.githubusercontent.com/u/53862536?v=4"/></br>[johanvanheusden](https://github.com/johanvanheusden) | <img width="50" src="https://avatars.githubusercontent.com/u/38327267?v=4"/></br>[jtagcat](https://github.com/jtagcat) | <img width="50" src="https://avatars.githubusercontent.com/u/61631665?v=4"/></br>[konhi](https://github.com/konhi) | <img width="50" src="https://avatars.githubusercontent.com/u/54991735?v=4"/></br>[krzysiekwie](https://github.com/krzysiekwie) | <img width="50" src="https://avatars.githubusercontent.com/u/12849008?v=4"/></br>[lighthousebulb](https://github.com/lighthousebulb) |
| <img width="50" src="https://avatars.githubusercontent.com/u/4140247?v=4"/></br>[luzpaz](https://github.com/luzpaz) | <img width="50" src="https://avatars.githubusercontent.com/u/29355048?v=4"/></br>[majsterkovic](https://github.com/majsterkovic) | <img width="50" src="https://avatars.githubusercontent.com/u/77744862?v=4"/></br>[mak2002](https://github.com/mak2002) | <img width="50" src="https://avatars.githubusercontent.com/u/30428258?v=4"/></br>[nmiquan](https://github.com/nmiquan) | <img width="50" src="https://avatars.githubusercontent.com/u/31123054?v=4"/></br>[nullpointer666](https://github.com/nullpointer666) |
| <img width="50" src="https://avatars.githubusercontent.com/u/2979926?v=4"/></br>[oscaretu](https://github.com/oscaretu) | <img width="50" src="https://avatars.githubusercontent.com/u/36965591?v=4"/></br>[oskarsh](https://github.com/oskarsh) | <img width="50" src="https://avatars.githubusercontent.com/u/52031346?v=4"/></br>[osso73](https://github.com/osso73) | <img width="50" src="https://avatars.githubusercontent.com/u/29743024?v=4"/></br>[over-soul](https://github.com/over-soul) | <img width="50" src="https://avatars.githubusercontent.com/u/42961947?v=4"/></br>[pensierocrea](https://github.com/pensierocrea) |
| <img width="50" src="https://avatars.githubusercontent.com/u/45542782?v=4"/></br>[pomeloy](https://github.com/pomeloy) | <img width="50" src="https://avatars.githubusercontent.com/u/10206967?v=4"/></br>[rhtenhove](https://github.com/rhtenhove) | <img width="50" src="https://avatars.githubusercontent.com/u/16728217?v=4"/></br>[rikanotank1](https://github.com/rikanotank1) | <img width="50" src="https://avatars.githubusercontent.com/u/24560368?v=4"/></br>[rxliuli](https://github.com/rxliuli) | <img width="50" src="https://avatars.githubusercontent.com/u/14062932?v=4"/></br>[simonsan](https://github.com/simonsan) |
| <img width="50" src="https://avatars.githubusercontent.com/u/5004545?v=4"/></br>[stellarpower](https://github.com/stellarpower) | <img width="50" src="https://avatars.githubusercontent.com/u/20983267?v=4"/></br>[suixinio](https://github.com/suixinio) | <img width="50" src="https://avatars.githubusercontent.com/u/12995773?v=4"/></br>[sumomo-99](https://github.com/sumomo-99) | <img width="50" src="https://avatars.githubusercontent.com/u/367170?v=4"/></br>[xtatsux](https://github.com/xtatsux) | <img width="50" src="https://avatars.githubusercontent.com/u/6908872?v=4"/></br>[taw00](https://github.com/taw00) |
| <img width="50" src="https://avatars.githubusercontent.com/u/10956653?v=4"/></br>[tcassaert](https://github.com/tcassaert) | <img width="50" src="https://avatars.githubusercontent.com/u/46327531?v=4"/></br>[victante](https://github.com/victante) | <img width="50" src="https://avatars.githubusercontent.com/u/7252567?v=4"/></br>[Voltinus](https://github.com/Voltinus) | <img width="50" src="https://avatars.githubusercontent.com/u/2216902?v=4"/></br>[xcffl](https://github.com/xcffl) | <img width="50" src="https://avatars.githubusercontent.com/u/46404814?v=4"/></br>[yourcontact](https://github.com/yourcontact) |
| <img width="50" src="https://avatars.githubusercontent.com/u/37692927?v=4"/></br>[zaoyifan](https://github.com/zaoyifan) | <img width="50" src="https://avatars.githubusercontent.com/u/10813608?v=4"/></br>[zawnk](https://github.com/zawnk) | <img width="50" src="https://avatars.githubusercontent.com/u/55245068?v=4"/></br>[zen-quo](https://github.com/zen-quo) | <img width="50" src="https://avatars.githubusercontent.com/u/23507174?v=4"/></br>[zozolina123](https://github.com/zozolina123) | <img width="50" src="https://avatars.githubusercontent.com/u/25315?v=4"/></br>[xcession](https://github.com/xcession) |
| <img width="50" src="https://avatars.githubusercontent.com/u/34542665?v=4"/></br>[paventyang](https://github.com/paventyang) | <img width="50" src="https://avatars.githubusercontent.com/u/608014?v=4"/></br>[jackytsu](https://github.com/jackytsu) | <img width="50" src="https://avatars.githubusercontent.com/u/1308646?v=4"/></br>[zhangmx](https://github.com/zhangmx) | | |
| <img width="50" src="https://avatars.githubusercontent.com/u/1285584?v=4"/></br>[laurent22](https://github.com/laurent22) | <img width="50" src="https://avatars.githubusercontent.com/u/223439?v=4"/></br>[tessus](https://github.com/tessus) | <img width="50" src="https://avatars.githubusercontent.com/u/2179547?v=4"/></br>[CalebJohn](https://github.com/CalebJohn) | <img width="50" src="https://avatars.githubusercontent.com/u/46334387?v=4"/></br>[personalizedrefrigerator](https://github.com/personalizedrefrigerator) | <img width="50" src="https://avatars.githubusercontent.com/u/995612?v=4"/></br>[roman-r-m](https://github.com/roman-r-m) |
| <img width="50" src="https://avatars.githubusercontent.com/u/1732810?v=4"/></br>[miciasto](https://github.com/miciasto) | <img width="50" src="https://avatars.githubusercontent.com/u/16041683?v=4"/></br>[ken1kob](https://github.com/ken1kob) | <img width="50" src="https://avatars.githubusercontent.com/u/29672555?v=4"/></br>[genneko](https://github.com/genneko) | <img width="50" src="https://avatars.githubusercontent.com/u/58074586?v=4"/></br>[Daeraxa](https://github.com/Daeraxa) | <img width="50" src="https://avatars.githubusercontent.com/u/4553672?v=4"/></br>[tanrax](https://github.com/tanrax) |
| <img width="50" src="https://avatars.githubusercontent.com/u/63491353?v=4"/></br>[j-krl](https://github.com/j-krl) | <img width="50" src="https://avatars.githubusercontent.com/u/62299611?v=4"/></br>[wh201906](https://github.com/wh201906) | <img width="50" src="https://avatars.githubusercontent.com/u/24863925?v=4"/></br>[JackGruber](https://github.com/JackGruber) | <img width="50" src="https://avatars.githubusercontent.com/u/30305957?v=4"/></br>[naviji](https://github.com/naviji) | <img width="50" src="https://avatars.githubusercontent.com/u/3542031?v=4"/></br>[PackElend](https://github.com/PackElend) |
| <img width="50" src="https://avatars.githubusercontent.com/u/32807437?v=4"/></br>[julien-me](https://github.com/julien-me) | <img width="50" src="https://avatars.githubusercontent.com/u/5051088?v=4"/></br>[pedr](https://github.com/pedr) | <img width="50" src="https://avatars.githubusercontent.com/u/4374338?v=4"/></br>[potatogim](https://github.com/potatogim) | <img width="50" src="https://avatars.githubusercontent.com/u/84130654?v=4"/></br>[JonatanWick](https://github.com/JonatanWick) | <img width="50" src="https://avatars.githubusercontent.com/u/2063957?v=4"/></br>[Ardakilic](https://github.com/Ardakilic) |
| <img width="50" src="https://avatars.githubusercontent.com/u/43657314?v=4"/></br>[milotype](https://github.com/milotype) | <img width="50" src="https://avatars.githubusercontent.com/u/44570278?v=4"/></br>[asrient](https://github.com/asrient) | <img width="50" src="https://avatars.githubusercontent.com/u/8701534?v=4"/></br>[rtmkrlv](https://github.com/rtmkrlv) | <img width="50" src="https://avatars.githubusercontent.com/u/10997189?v=4"/></br>[fmrtn](https://github.com/fmrtn) | <img width="50" src="https://avatars.githubusercontent.com/u/68117355?v=4"/></br>[Mr-Kanister](https://github.com/Mr-Kanister) |
| <img width="50" src="https://avatars.githubusercontent.com/u/4299398?v=4"/></br>[palerdot](https://github.com/palerdot) | <img width="50" src="https://avatars.githubusercontent.com/u/10927304?v=4"/></br>[matsest](https://github.com/matsest) | <img width="50" src="https://avatars.githubusercontent.com/u/6979755?v=4"/></br>[devonzuegel](https://github.com/devonzuegel) | <img width="50" src="https://avatars.githubusercontent.com/u/26695184?v=4"/></br>[anjulalk](https://github.com/anjulalk) | <img width="50" src="https://avatars.githubusercontent.com/u/16101778?v=4"/></br>[gabcoh](https://github.com/gabcoh) |
| <img width="50" src="https://avatars.githubusercontent.com/u/19213902?v=4"/></br>[hubertfilho](https://github.com/hubertfilho) | <img width="50" src="https://avatars.githubusercontent.com/u/6319051?v=4"/></br>[abonte](https://github.com/abonte) | <img width="50" src="https://avatars.githubusercontent.com/u/1685517?v=4"/></br>[Abijeet](https://github.com/Abijeet) | <img width="50" src="https://avatars.githubusercontent.com/u/27751740?v=4"/></br>[ishantgupta777](https://github.com/ishantgupta777) | <img width="50" src="https://avatars.githubusercontent.com/u/63025323?v=4"/></br>[ScriptInfra](https://github.com/ScriptInfra) |
| <img width="50" src="https://avatars.githubusercontent.com/u/6196533?v=4"/></br>[jd1378](https://github.com/jd1378) | <img width="50" src="https://avatars.githubusercontent.com/u/44024553?v=4"/></br>[rabeehrz](https://github.com/rabeehrz) | <img width="50" src="https://avatars.githubusercontent.com/u/35633575?v=4"/></br>[coderrsid](https://github.com/coderrsid) | <img width="50" src="https://avatars.githubusercontent.com/u/7415668?v=4"/></br>[mablin7](https://github.com/mablin7) | <img width="50" src="https://avatars.githubusercontent.com/u/608014?v=4"/></br>[jackytsu](https://github.com/jackytsu) |
| <img width="50" src="https://avatars.githubusercontent.com/u/77744862?v=4"/></br>[mak2002](https://github.com/mak2002) | <img width="50" src="https://avatars.githubusercontent.com/u/3985557?v=4"/></br>[XarisA](https://github.com/XarisA) | <img width="50" src="https://avatars.githubusercontent.com/u/208212?v=4"/></br>[foxmask](https://github.com/foxmask) | <img width="50" src="https://avatars.githubusercontent.com/u/6557454?v=4"/></br>[innocuo](https://github.com/innocuo) | <img width="50" src="https://avatars.githubusercontent.com/u/54268438?v=4"/></br>[Rahulm2310](https://github.com/Rahulm2310) |
| <img width="50" src="https://avatars.githubusercontent.com/u/8184424?v=4"/></br>[Ahmad45123](https://github.com/Ahmad45123) | <img width="50" src="https://avatars.githubusercontent.com/u/49979415?v=4"/></br>[jonath92](https://github.com/jonath92) | <img width="50" src="https://avatars.githubusercontent.com/u/1904967?v=4"/></br>[readingsnail](https://github.com/readingsnail) | <img width="50" src="https://avatars.githubusercontent.com/u/134083?v=4"/></br>[xavivars](https://github.com/xavivars) | <img width="50" src="https://avatars.githubusercontent.com/u/51550769?v=4"/></br>[rnbastos](https://github.com/rnbastos) |
| <img width="50" src="https://avatars.githubusercontent.com/u/4237724?v=4"/></br>[alexdevero](https://github.com/alexdevero) | <img width="50" src="https://avatars.githubusercontent.com/u/71190696?v=4"/></br>[Elaborendum](https://github.com/Elaborendum) | <img width="50" src="https://avatars.githubusercontent.com/u/42747216?v=4"/></br>[Mannivu](https://github.com/Mannivu) | <img width="50" src="https://avatars.githubusercontent.com/u/36989112?v=4"/></br>[nishantwrp](https://github.com/nishantwrp) | <img width="50" src="https://avatars.githubusercontent.com/u/35904727?v=4"/></br>[Runo-saduwa](https://github.com/Runo-saduwa) |
| <img width="50" src="https://avatars.githubusercontent.com/u/3250983?v=4"/></br>[shinglyu](https://github.com/shinglyu) | <img width="50" src="https://avatars.githubusercontent.com/u/30352484?v=4"/></br>[Tolu-Mals](https://github.com/Tolu-Mals) | <img width="50" src="https://avatars.githubusercontent.com/u/5365582?v=4"/></br>[marcosvega91](https://github.com/marcosvega91) | <img width="50" src="https://avatars.githubusercontent.com/u/99097412?v=4"/></br>[mrkaato0](https://github.com/mrkaato0) | <img width="50" src="https://avatars.githubusercontent.com/u/37639389?v=4"/></br>[petrz12](https://github.com/petrz12) |
| <img width="50" src="https://avatars.githubusercontent.com/u/4245227?v=4"/></br>[zblesk](https://github.com/zblesk) | <img width="50" src="https://avatars.githubusercontent.com/u/5730052?v=4"/></br>[vsimkus](https://github.com/vsimkus) | <img width="50" src="https://avatars.githubusercontent.com/u/20461071?v=4"/></br>[Vaso3](https://github.com/Vaso3) | <img width="50" src="https://avatars.githubusercontent.com/u/3194829?v=4"/></br>[moltenform](https://github.com/moltenform) | <img width="50" src="https://avatars.githubusercontent.com/u/33229141?v=4"/></br>[marph91](https://github.com/marph91) |
| <img width="50" src="https://avatars.githubusercontent.com/u/5199995?v=4"/></br>[zuphilip](https://github.com/zuphilip) | <img width="50" src="https://avatars.githubusercontent.com/u/10289737?v=4"/></br>[Retr0ve](https://github.com/Retr0ve) | <img width="50" src="https://avatars.githubusercontent.com/u/54576074?v=4"/></br>[Rishabh-malhotraa](https://github.com/Rishabh-malhotraa) | <img width="50" src="https://avatars.githubusercontent.com/u/559346?v=4"/></br>[metbril](https://github.com/metbril) | <img width="50" src="https://avatars.githubusercontent.com/u/36622934?v=4"/></br>[SFulpius](https://github.com/SFulpius) |
| <img width="50" src="https://avatars.githubusercontent.com/u/531704?v=4"/></br>[TaoK](https://github.com/TaoK) | <img width="50" src="https://avatars.githubusercontent.com/u/47623588?v=4"/></br>[WhiredPlanck](https://github.com/WhiredPlanck) | <img width="50" src="https://avatars.githubusercontent.com/u/32396?v=4"/></br>[ProgramFan](https://github.com/ProgramFan) | <img width="50" src="https://avatars.githubusercontent.com/u/32196447?v=4"/></br>[yaozeye](https://github.com/yaozeye) | <img width="50" src="https://avatars.githubusercontent.com/u/12264626?v=4"/></br>[ylc395](https://github.com/ylc395) |
| <img width="50" src="https://avatars.githubusercontent.com/u/8716226?v=4"/></br>[amandamcg](https://github.com/amandamcg) | <img width="50" src="https://avatars.githubusercontent.com/u/359140?v=4"/></br>[leematos](https://github.com/leematos) | <img width="50" src="https://avatars.githubusercontent.com/u/17768566?v=4"/></br>[RenatoXSR](https://github.com/RenatoXSR) | <img width="50" src="https://avatars.githubusercontent.com/u/54888685?v=4"/></br>[RedDocMD](https://github.com/RedDocMD) | <img width="50" src="https://avatars.githubusercontent.com/u/31567272?v=4"/></br>[t1011](https://github.com/t1011) |
| <img width="50" src="https://avatars.githubusercontent.com/u/44198148?v=4"/></br>[whalehub](https://github.com/whalehub) | <img width="50" src="https://avatars.githubusercontent.com/u/12906090?v=4"/></br>[amitsin6h](https://github.com/amitsin6h) | <img width="50" src="https://avatars.githubusercontent.com/u/628474?v=4"/></br>[Atalanttore](https://github.com/Atalanttore) | <img width="50" src="https://avatars.githubusercontent.com/u/5058349?v=4"/></br>[hieuthi](https://github.com/hieuthi) | <img width="50" src="https://avatars.githubusercontent.com/u/23281486?v=4"/></br>[martonpaulo](https://github.com/martonpaulo) |
| <img width="50" src="https://avatars.githubusercontent.com/u/390889?v=4"/></br>[mmahmoudian](https://github.com/mmahmoudian) | <img width="50" src="https://avatars.githubusercontent.com/u/168931?v=4"/></br>[bobchao](https://github.com/bobchao) | <img width="50" src="https://avatars.githubusercontent.com/u/4497566?v=4"/></br>[rc2dev](https://github.com/rc2dev) | <img width="50" src="https://avatars.githubusercontent.com/u/43534227?v=4"/></br>[Rishabhraghwendra18](https://github.com/Rishabhraghwendra18) | <img width="50" src="https://avatars.githubusercontent.com/u/7091080?v=4"/></br>[sinkuu](https://github.com/sinkuu) |
| <img width="50" src="https://avatars.githubusercontent.com/u/6734573?v=4"/></br>[stweil](https://github.com/stweil) | <img width="50" src="https://avatars.githubusercontent.com/u/59690052?v=4"/></br>[Subhra264](https://github.com/Subhra264) | <img width="50" src="https://avatars.githubusercontent.com/u/692072?v=4"/></br>[conyx](https://github.com/conyx) | <img width="50" src="https://avatars.githubusercontent.com/u/49116134?v=4"/></br>[anihm136](https://github.com/anihm136) | <img width="50" src="https://avatars.githubusercontent.com/u/937861?v=4"/></br>[archont00](https://github.com/archont00) |
| <img width="50" src="https://avatars.githubusercontent.com/u/32770029?v=4"/></br>[bradmcl](https://github.com/bradmcl) | <img width="50" src="https://avatars.githubusercontent.com/u/1340627?v=4"/></br>[jcgurango](https://github.com/jcgurango) | <img width="50" src="https://avatars.githubusercontent.com/u/36228623?v=4"/></br>[mrkaato](https://github.com/mrkaato) | <img width="50" src="https://avatars.githubusercontent.com/u/22592201?v=4"/></br>[tfinnberg](https://github.com/tfinnberg) | <img width="50" src="https://avatars.githubusercontent.com/u/63918341?v=4"/></br>[adarsh-sgh](https://github.com/adarsh-sgh) |
| <img width="50" src="https://avatars.githubusercontent.com/u/3870964?v=4"/></br>[marcushill](https://github.com/marcushill) | <img width="50" src="https://avatars.githubusercontent.com/u/102242?v=4"/></br>[nathanleiby](https://github.com/nathanleiby) | <img width="50" src="https://avatars.githubusercontent.com/u/13251?v=4"/></br>[piotrb](https://github.com/piotrb) | <img width="50" src="https://avatars.githubusercontent.com/u/226708?v=4"/></br>[RaphaelKimmig](https://github.com/RaphaelKimmig) | <img width="50" src="https://avatars.githubusercontent.com/u/10060747?v=4"/></br>[Wartijn](https://github.com/Wartijn) |
| <img width="50" src="https://avatars.githubusercontent.com/u/40672207?v=4"/></br>[xUser5000](https://github.com/xUser5000) | <img width="50" src="https://avatars.githubusercontent.com/u/41290751?v=4"/></br>[serenitatis](https://github.com/serenitatis) | <img width="50" src="https://avatars.githubusercontent.com/u/81777961?v=4"/></br>[k33pn3xtlvl](https://github.com/k33pn3xtlvl) | <img width="50" src="https://avatars.githubusercontent.com/u/17809291?v=4"/></br>[antontkv](https://github.com/antontkv) | <img width="50" src="https://avatars.githubusercontent.com/u/28987176?v=4"/></br>[infinity052](https://github.com/infinity052) |
| <img width="50" src="https://avatars.githubusercontent.com/u/55127997?v=4"/></br>[entrymaster](https://github.com/entrymaster) | <img width="50" src="https://avatars.githubusercontent.com/u/21161146?v=4"/></br>[BartBucknill](https://github.com/BartBucknill) | <img width="50" src="https://avatars.githubusercontent.com/u/94234459?v=4"/></br>[betty-alagwu](https://github.com/betty-alagwu) | <img width="50" src="https://avatars.githubusercontent.com/u/2494769?v=4"/></br>[mrwulf](https://github.com/mrwulf) | <img width="50" src="https://avatars.githubusercontent.com/u/60824?v=4"/></br>[brttbndr](https://github.com/brttbndr) |
| <img width="50" src="https://avatars.githubusercontent.com/u/606038?v=4"/></br>[cas--](https://github.com/cas--) | <img width="50" src="https://avatars.githubusercontent.com/u/560571?v=4"/></br>[chrisb86](https://github.com/chrisb86) | <img width="50" src="https://avatars.githubusercontent.com/u/1686759?v=4"/></br>[chrmoritz](https://github.com/chrmoritz) | <img width="50" src="https://avatars.githubusercontent.com/u/11857950?v=4"/></br>[djunho](https://github.com/djunho) | <img width="50" src="https://avatars.githubusercontent.com/u/1044056?v=4"/></br>[daniellandau](https://github.com/daniellandau) |
| <img width="50" src="https://avatars.githubusercontent.com/u/40627944?v=4"/></br>[krote5k](https://github.com/krote5k) | <img width="50" src="https://avatars.githubusercontent.com/u/5001259?v=4"/></br>[ethan42411](https://github.com/ethan42411) | <img width="50" src="https://avatars.githubusercontent.com/u/2733783?v=4"/></br>[JOJ0](https://github.com/JOJ0) | <img width="50" src="https://avatars.githubusercontent.com/u/17108695?v=4"/></br>[jalajcodes](https://github.com/jalajcodes) | <img width="50" src="https://avatars.githubusercontent.com/u/238088?v=4"/></br>[jblunck](https://github.com/jblunck) |
| <img width="50" src="https://avatars.githubusercontent.com/u/3140223?v=4"/></br>[jdrobertso](https://github.com/jdrobertso) | <img width="50" src="https://avatars.githubusercontent.com/u/37297218?v=4"/></br>[Jesssullivan](https://github.com/Jesssullivan) | <img width="50" src="https://avatars.githubusercontent.com/u/339645?v=4"/></br>[jmontane](https://github.com/jmontane) | <img width="50" src="https://avatars.githubusercontent.com/u/69011?v=4"/></br>[johanhammar](https://github.com/johanhammar) | <img width="50" src="https://avatars.githubusercontent.com/u/71817691?v=4"/></br>[krishna8421](https://github.com/krishna8421) |
| <img width="50" src="https://avatars.githubusercontent.com/u/118282653?v=4"/></br>[Linkosred](https://github.com/Linkosred) | <img width="50" src="https://avatars.githubusercontent.com/u/4168339?v=4"/></br>[solariz](https://github.com/solariz) | <img width="50" src="https://avatars.githubusercontent.com/u/25288?v=4"/></br>[maicki](https://github.com/maicki) | <img width="50" src="https://avatars.githubusercontent.com/u/2136373?v=4"/></br>[mjjzf](https://github.com/mjjzf) | <img width="50" src="https://avatars.githubusercontent.com/u/7561827?v=4"/></br>[popovoleksandr](https://github.com/popovoleksandr) |
| <img width="50" src="https://avatars.githubusercontent.com/u/2501211?v=4"/></br>[Philipp91](https://github.com/Philipp91) | <img width="50" src="https://avatars.githubusercontent.com/u/27608187?v=4"/></br>[rt-oliveira](https://github.com/rt-oliveira) | <img width="50" src="https://avatars.githubusercontent.com/u/2486806?v=4"/></br>[sebastienjust](https://github.com/sebastienjust) | <img width="50" src="https://avatars.githubusercontent.com/u/28362310?v=4"/></br>[sealch](https://github.com/sealch) | <img width="50" src="https://avatars.githubusercontent.com/u/34258070?v=4"/></br>[StarFang208](https://github.com/StarFang208) |
| <img width="50" src="https://avatars.githubusercontent.com/u/1782292?v=4"/></br>[SubodhDahal](https://github.com/SubodhDahal) | <img width="50" src="https://avatars.githubusercontent.com/u/5912371?v=4"/></br>[TobiasDev](https://github.com/TobiasDev) | <img width="50" src="https://avatars.githubusercontent.com/u/53571657?v=4"/></br>[tmclo](https://github.com/tmclo) | <img width="50" src="https://avatars.githubusercontent.com/u/13502069?v=4"/></br>[Whaell](https://github.com/Whaell) | <img width="50" src="https://avatars.githubusercontent.com/u/29891001?v=4"/></br>[jyuvaraj03](https://github.com/jyuvaraj03) |
| <img width="50" src="https://avatars.githubusercontent.com/u/15380913?v=4"/></br>[kowalskidev](https://github.com/kowalskidev) | <img width="50" src="https://avatars.githubusercontent.com/u/337455?v=4"/></br>[alexchee](https://github.com/alexchee) | <img width="50" src="https://avatars.githubusercontent.com/u/5077221?v=4"/></br>[axq](https://github.com/axq) | <img width="50" src="https://avatars.githubusercontent.com/u/15636584?v=4"/></br>[balmag](https://github.com/balmag) | <img width="50" src="https://avatars.githubusercontent.com/u/8808502?v=4"/></br>[barbowza](https://github.com/barbowza) |
| <img width="50" src="https://avatars.githubusercontent.com/u/42007357?v=4"/></br>[eresytter](https://github.com/eresytter) | <img width="50" src="https://avatars.githubusercontent.com/u/4346449?v=4"/></br>[kik0220](https://github.com/kik0220) | <img width="50" src="https://avatars.githubusercontent.com/u/4316805?v=4"/></br>[stingray-11](https://github.com/stingray-11) | <img width="50" src="https://avatars.githubusercontent.com/u/11711053?v=4"/></br>[lscolombo](https://github.com/lscolombo) | <img width="50" src="https://avatars.githubusercontent.com/u/29355048?v=4"/></br>[majsterkovic](https://github.com/majsterkovic) |
| <img width="50" src="https://avatars.githubusercontent.com/u/17399340?v=4"/></br>[pf-siedler](https://github.com/pf-siedler) | <img width="50" src="https://avatars.githubusercontent.com/u/17232523?v=4"/></br>[ruuti](https://github.com/ruuti) | <img width="50" src="https://avatars.githubusercontent.com/u/23638148?v=4"/></br>[s1nceri7y](https://github.com/s1nceri7y) | <img width="50" src="https://avatars.githubusercontent.com/u/10117386?v=4"/></br>[kornava](https://github.com/kornava) | <img width="50" src="https://avatars.githubusercontent.com/u/36303913?v=4"/></br>[sensor-freak](https://github.com/sensor-freak) |
| <img width="50" src="https://avatars.githubusercontent.com/u/34542665?v=4"/></br>[paventyang](https://github.com/paventyang) | <img width="50" src="https://avatars.githubusercontent.com/u/7471938?v=4"/></br>[ShuiHuo](https://github.com/ShuiHuo) | <img width="50" src="https://avatars.githubusercontent.com/u/11596277?v=4"/></br>[ikunya](https://github.com/ikunya) | <img width="50" src="https://avatars.githubusercontent.com/u/59133880?v=4"/></br>[bedwardly-down](https://github.com/bedwardly-down) | <img width="50" src="https://avatars.githubusercontent.com/u/250887?v=4"/></br>[fstanis](https://github.com/fstanis) |
| <img width="50" src="https://avatars.githubusercontent.com/u/116026761?v=4"/></br>[sammyhori](https://github.com/sammyhori) | <img width="50" src="https://avatars.githubusercontent.com/u/47456195?v=4"/></br>[hexclover](https://github.com/hexclover) | <img width="50" src="https://avatars.githubusercontent.com/u/45535789?v=4"/></br>[2jaeyeol](https://github.com/2jaeyeol) | <img width="50" src="https://avatars.githubusercontent.com/u/25622825?v=4"/></br>[thackeraaron](https://github.com/thackeraaron) | <img width="50" src="https://avatars.githubusercontent.com/u/32984653?v=4"/></br>[AIbnuHIbban](https://github.com/AIbnuHIbban) |
| <img width="50" src="https://avatars.githubusercontent.com/u/8325984?v=4"/></br>[asalthobaity](https://github.com/asalthobaity) | <img width="50" src="https://avatars.githubusercontent.com/u/63901956?v=4"/></br>[abhi-bhatra](https://github.com/abhi-bhatra) | <img width="50" src="https://avatars.githubusercontent.com/u/56785486?v=4"/></br>[iamabhi222](https://github.com/iamabhi222) | <img width="50" src="https://avatars.githubusercontent.com/u/69760168?v=4"/></br>[waditos](https://github.com/waditos) | <img width="50" src="https://avatars.githubusercontent.com/u/61756360?v=4"/></br>[sandstone991](https://github.com/sandstone991) |
| <img width="50" src="https://avatars.githubusercontent.com/u/63443657?v=4"/></br>[Aksh-Konda](https://github.com/Aksh-Konda) | <img width="50" src="https://avatars.githubusercontent.com/u/3660978?v=4"/></br>[alanfortlink](https://github.com/alanfortlink) | <img width="50" src="https://avatars.githubusercontent.com/u/32174181?v=4"/></br>[alecmaly](https://github.com/alecmaly) | <img width="50" src="https://avatars.githubusercontent.com/u/53372753?v=4"/></br>[AverageUser2](https://github.com/AverageUser2) | <img width="50" src="https://avatars.githubusercontent.com/u/51818821?v=4"/></br>[adw2019](https://github.com/adw2019) |
| <img width="50" src="https://avatars.githubusercontent.com/u/4056990?v=4"/></br>[afischer211](https://github.com/afischer211) | <img width="50" src="https://avatars.githubusercontent.com/u/61735677?v=4"/></br>[bablecopherye](https://github.com/bablecopherye) | <img width="50" src="https://avatars.githubusercontent.com/u/26230870?v=4"/></br>[a13xk](https://github.com/a13xk) | <img width="50" src="https://avatars.githubusercontent.com/u/14836659?v=4"/></br>[apankratov](https://github.com/apankratov) | <img width="50" src="https://avatars.githubusercontent.com/u/7045739?v=4"/></br>[teterkin](https://github.com/teterkin) |
| <img width="50" src="https://avatars.githubusercontent.com/u/215668?v=4"/></br>[avanderberg](https://github.com/avanderberg) | <img width="50" src="https://avatars.githubusercontent.com/u/4408379?v=4"/></br>[lex111](https://github.com/lex111) | <img width="50" src="https://avatars.githubusercontent.com/u/60134194?v=4"/></br>[Alkindi42](https://github.com/Alkindi42) | <img width="50" src="https://avatars.githubusercontent.com/u/7129815?v=4"/></br>[Jumanjii](https://github.com/Jumanjii) | <img width="50" src="https://avatars.githubusercontent.com/u/19962243?v=4"/></br>[AlphaJack](https://github.com/AlphaJack) |
| <img width="50" src="https://avatars.githubusercontent.com/u/65647302?v=4"/></br>[Lord-Aman](https://github.com/Lord-Aman) | <img width="50" src="https://avatars.githubusercontent.com/u/12948692?v=4"/></br>[aminvakil](https://github.com/aminvakil) | <img width="50" src="https://avatars.githubusercontent.com/u/14096959?v=4"/></br>[richtwin567](https://github.com/richtwin567) | <img width="50" src="https://avatars.githubusercontent.com/u/487182?v=4"/></br>[andrejilderda](https://github.com/andrejilderda) | <img width="50" src="https://avatars.githubusercontent.com/u/18169566?v=4"/></br>[deining](https://github.com/deining) |
| <img width="50" src="https://avatars.githubusercontent.com/u/922429?v=4"/></br>[adrynov](https://github.com/adrynov) | <img width="50" src="https://avatars.githubusercontent.com/u/94937?v=4"/></br>[andrewperry](https://github.com/andrewperry) | <img width="50" src="https://avatars.githubusercontent.com/u/5417051?v=4"/></br>[tekdel](https://github.com/tekdel) | <img width="50" src="https://avatars.githubusercontent.com/u/4471821?v=4"/></br>[fobo66](https://github.com/fobo66) | <img width="50" src="https://avatars.githubusercontent.com/u/7015947?v=4"/></br>[andzs](https://github.com/andzs) |
| <img width="50" src="https://avatars.githubusercontent.com/u/54475686?v=4"/></br>[pandeymangg](https://github.com/pandeymangg) | <img width="50" src="https://avatars.githubusercontent.com/u/25694659?v=4"/></br>[rasklaad](https://github.com/rasklaad) | <img width="50" src="https://avatars.githubusercontent.com/u/498326?v=4"/></br>[Shaxine](https://github.com/Shaxine) | <img width="50" src="https://avatars.githubusercontent.com/u/9095073?v=4"/></br>[antonio-ramadas](https://github.com/antonio-ramadas) | <img width="50" src="https://avatars.githubusercontent.com/u/28067395?v=4"/></br>[aprvsh](https://github.com/aprvsh) |
| <img width="50" src="https://avatars.githubusercontent.com/u/75756768?v=4"/></br>[aynp](https://github.com/aynp) | <img width="50" src="https://avatars.githubusercontent.com/u/201215?v=4"/></br>[assimd](https://github.com/assimd) | <img width="50" src="https://avatars.githubusercontent.com/u/26827848?v=4"/></br>[Atrate](https://github.com/Atrate) | <img width="50" src="https://avatars.githubusercontent.com/u/794314?v=4"/></br>[austindoupnik](https://github.com/austindoupnik) | <img width="50" src="https://avatars.githubusercontent.com/u/110668146?v=4"/></br>[BeeverTeeth](https://github.com/BeeverTeeth) |
| <img width="50" src="https://avatars.githubusercontent.com/u/16528381?v=4"/></br>[be-we](https://github.com/be-we) | <img width="50" src="https://avatars.githubusercontent.com/u/1899506?v=4"/></br>[ei8fdb](https://github.com/ei8fdb) | <img width="50" src="https://avatars.githubusercontent.com/u/7034200?v=4"/></br>[bimlas](https://github.com/bimlas) | <img width="50" src="https://avatars.githubusercontent.com/u/58605547?v=4"/></br>[bishoy-magdy](https://github.com/bishoy-magdy) | <img width="50" src="https://avatars.githubusercontent.com/u/1614?v=4"/></br>[brad](https://github.com/brad) |
| <img width="50" src="https://avatars.githubusercontent.com/u/47641641?v=4"/></br>[brenobaptista](https://github.com/brenobaptista) | <img width="50" src="https://avatars.githubusercontent.com/u/1001769?v=4"/></br>[CandleCandle](https://github.com/CandleCandle) | <img width="50" src="https://avatars.githubusercontent.com/u/16287077?v=4"/></br>[carlbordum](https://github.com/carlbordum) | <img width="50" src="https://avatars.githubusercontent.com/u/36130773?v=4"/></br>[carlosngo](https://github.com/carlosngo) | <img width="50" src="https://avatars.githubusercontent.com/u/20382?v=4"/></br>[carlosedp](https://github.com/carlosedp) |
| <img width="50" src="https://avatars.githubusercontent.com/u/105843?v=4"/></br>[chaifeng](https://github.com/chaifeng) | <img width="50" src="https://avatars.githubusercontent.com/u/549349?v=4"/></br>[charles-e](https://github.com/charles-e) | <img width="50" src="https://avatars.githubusercontent.com/u/19870089?v=4"/></br>[cyy53589](https://github.com/cyy53589) | <img width="50" src="https://avatars.githubusercontent.com/u/32337926?v=4"/></br>[Chillu1](https://github.com/Chillu1) | <img width="50" src="https://avatars.githubusercontent.com/u/2348463?v=4"/></br>[Techwolf12](https://github.com/Techwolf12) |
| <img width="50" src="https://avatars.githubusercontent.com/u/22433652?v=4"/></br>[christopher-o-toole](https://github.com/christopher-o-toole) | <img width="50" src="https://avatars.githubusercontent.com/u/2282880?v=4"/></br>[cloudtrends](https://github.com/cloudtrends) | <img width="50" src="https://avatars.githubusercontent.com/u/17257053?v=4"/></br>[idcristi](https://github.com/idcristi) | <img width="50" src="https://avatars.githubusercontent.com/u/15956322?v=4"/></br>[damienmascre](https://github.com/damienmascre) | <img width="50" src="https://avatars.githubusercontent.com/u/1102886?v=4"/></br>[da2x](https://github.com/da2x) |
| <img width="50" src="https://avatars.githubusercontent.com/u/26678?v=4"/></br>[danielb2](https://github.com/danielb2) | <img width="50" src="https://avatars.githubusercontent.com/u/12847693?v=4"/></br>[danil-tolkachev](https://github.com/danil-tolkachev) | <img width="50" src="https://avatars.githubusercontent.com/u/7279100?v=4"/></br>[darshani28](https://github.com/darshani28) | <img width="50" src="https://avatars.githubusercontent.com/u/26189247?v=4"/></br>[daukadolt](https://github.com/daukadolt) | <img width="50" src="https://avatars.githubusercontent.com/u/3041566?v=4"/></br>[DavidBeale](https://github.com/DavidBeale) |
| <img width="50" src="https://avatars.githubusercontent.com/u/28535750?v=4"/></br>[NeverMendel](https://github.com/NeverMendel) | <img width="50" src="https://avatars.githubusercontent.com/u/81250703?v=4"/></br>[Mr-DG-Wick](https://github.com/Mr-DG-Wick) | <img width="50" src="https://avatars.githubusercontent.com/u/2138893?v=4"/></br>[DG0lden](https://github.com/DG0lden) | <img width="50" src="https://avatars.githubusercontent.com/u/54697735?v=4"/></br>[deunlee](https://github.com/deunlee) | <img width="50" src="https://avatars.githubusercontent.com/u/11378282?v=4"/></br>[diego-betto](https://github.com/diego-betto) |
| <img width="50" src="https://avatars.githubusercontent.com/u/215270?v=4"/></br>[erdody](https://github.com/erdody) | <img width="50" src="https://avatars.githubusercontent.com/u/36959928?v=4"/></br>[diragb](https://github.com/diragb) | <img width="50" src="https://avatars.githubusercontent.com/u/10371667?v=4"/></br>[domgoodwin](https://github.com/domgoodwin) | <img width="50" src="https://avatars.githubusercontent.com/u/72066?v=4"/></br>[b4mboo](https://github.com/b4mboo) | <img width="50" src="https://avatars.githubusercontent.com/u/5131923?v=4"/></br>[donbowman](https://github.com/donbowman) |
| <img width="50" src="https://avatars.githubusercontent.com/u/60024671?v=4"/></br>[DeeJayLSP](https://github.com/DeeJayLSP) | <img width="50" src="https://avatars.githubusercontent.com/u/579727?v=4"/></br>[sirnacnud](https://github.com/sirnacnud) | <img width="50" src="https://avatars.githubusercontent.com/u/47756?v=4"/></br>[dflock](https://github.com/dflock) | <img width="50" src="https://avatars.githubusercontent.com/u/7990534?v=4"/></br>[drobilica](https://github.com/drobilica) | <img width="50" src="https://avatars.githubusercontent.com/u/21699905?v=4"/></br>[educbraga](https://github.com/educbraga) |
| <img width="50" src="https://avatars.githubusercontent.com/u/92958867?v=4"/></br>[eduebernal](https://github.com/eduebernal) | <img width="50" src="https://avatars.githubusercontent.com/u/67867099?v=4"/></br>[eduardokimmel](https://github.com/eduardokimmel) | <img width="50" src="https://avatars.githubusercontent.com/u/17415256?v=4"/></br>[ei-ke](https://github.com/ei-ke) | <img width="50" src="https://avatars.githubusercontent.com/u/1962738?v=4"/></br>[einverne](https://github.com/einverne) | <img width="50" src="https://avatars.githubusercontent.com/u/15069703?v=4"/></br>[etho201](https://github.com/etho201) |
| <img width="50" src="https://avatars.githubusercontent.com/u/16492558?v=4"/></br>[eodeluga](https://github.com/eodeluga) | <img width="50" src="https://avatars.githubusercontent.com/u/16875937?v=4"/></br>[fathyar](https://github.com/fathyar) | <img width="50" src="https://avatars.githubusercontent.com/u/73366988?v=4"/></br>[Fejby](https://github.com/Fejby) | <img width="50" src="https://avatars.githubusercontent.com/u/126302554?v=4"/></br>[fkinoshita](https://github.com/fkinoshita) | <img width="50" src="https://avatars.githubusercontent.com/u/3057302?v=4"/></br>[fer22f](https://github.com/fer22f) |
| <img width="50" src="https://avatars.githubusercontent.com/u/43272148?v=4"/></br>[fpindado](https://github.com/fpindado) | <img width="50" src="https://avatars.githubusercontent.com/u/1714374?v=4"/></br>[FleischKarussel](https://github.com/FleischKarussel) | <img width="50" src="https://avatars.githubusercontent.com/u/23738961?v=4"/></br>[easyteacher](https://github.com/easyteacher) | <img width="50" src="https://avatars.githubusercontent.com/u/110087?v=4"/></br>[halkeye](https://github.com/halkeye) | <img width="50" src="https://avatars.githubusercontent.com/u/19814827?v=4"/></br>[gmaubach](https://github.com/gmaubach) |
| <img width="50" src="https://avatars.githubusercontent.com/u/6190183?v=4"/></br>[gmag11](https://github.com/gmag11) | <img width="50" src="https://avatars.githubusercontent.com/u/6209647?v=4"/></br>[Jackymancs4](https://github.com/Jackymancs4) | <img width="50" src="https://avatars.githubusercontent.com/u/1501599?v=4"/></br>[gitstart](https://github.com/gitstart) | <img width="50" src="https://avatars.githubusercontent.com/u/297578?v=4"/></br>[Glandos](https://github.com/Glandos) | <img width="50" src="https://avatars.githubusercontent.com/u/24235344?v=4"/></br>[ggteixeira](https://github.com/ggteixeira) |
| <img width="50" src="https://avatars.githubusercontent.com/u/2257024?v=4"/></br>[gusbemacbe](https://github.com/gusbemacbe) | <img width="50" src="https://avatars.githubusercontent.com/u/64917442?v=4"/></br>[HOLLYwyh](https://github.com/HOLLYwyh) | <img width="50" src="https://avatars.githubusercontent.com/u/18524580?v=4"/></br>[Fvbor](https://github.com/Fvbor) | <img width="50" src="https://avatars.githubusercontent.com/u/16725441?v=4"/></br>[hamishmb](https://github.com/hamishmb) | <img width="50" src="https://avatars.githubusercontent.com/u/22606250?v=4"/></br>[bennetthanna](https://github.com/bennetthanna) |
| <img width="50" src="https://avatars.githubusercontent.com/u/78360007?v=4"/></br>[graueneko](https://github.com/graueneko) | <img width="50" src="https://avatars.githubusercontent.com/u/67231570?v=4"/></br>[harshitkathuria](https://github.com/harshitkathuria) | <img width="50" src="https://avatars.githubusercontent.com/u/1716229?v=4"/></br>[Vistaus](https://github.com/Vistaus) | <img width="50" src="https://avatars.githubusercontent.com/u/47787284?v=4"/></br>[gtlsgamr](https://github.com/gtlsgamr) | <img width="50" src="https://avatars.githubusercontent.com/u/32321396?v=4"/></br>[horaceyoung](https://github.com/horaceyoung) |
| <img width="50" src="https://avatars.githubusercontent.com/u/6509881?v=4"/></br>[ianjs](https://github.com/ianjs) | <img width="50" src="https://avatars.githubusercontent.com/u/19862172?v=4"/></br>[iahmedbacha](https://github.com/iahmedbacha) | <img width="50" src="https://avatars.githubusercontent.com/u/76095?v=4"/></br>[caseycs](https://github.com/caseycs) | <img width="50" src="https://avatars.githubusercontent.com/u/1533624?v=4"/></br>[IrvinDominin](https://github.com/IrvinDominin) | <img width="50" src="https://avatars.githubusercontent.com/u/33200024?v=4"/></br>[ishammahajan](https://github.com/ishammahajan) |
| <img width="50" src="https://avatars.githubusercontent.com/u/6916297?v=4"/></br>[ffadilaputra](https://github.com/ffadilaputra) | <img width="50" src="https://avatars.githubusercontent.com/u/64505041?v=4"/></br>[Iwantgreencard](https://github.com/Iwantgreencard) | <img width="50" src="https://avatars.githubusercontent.com/u/16137232?v=4"/></br>[j0hn-mc-clane](https://github.com/j0hn-mc-clane) | <img width="50" src="https://avatars.githubusercontent.com/u/19985741?v=4"/></br>[JRaiden16](https://github.com/JRaiden16) | <img width="50" src="https://avatars.githubusercontent.com/u/11466782?v=4"/></br>[jacobherrington](https://github.com/jacobherrington) |
| <img width="50" src="https://avatars.githubusercontent.com/u/9365179?v=4"/></br>[jamesadjinwa](https://github.com/jamesadjinwa) | <img width="50" src="https://avatars.githubusercontent.com/u/20801821?v=4"/></br>[jrwrigh](https://github.com/jrwrigh) | <img width="50" src="https://avatars.githubusercontent.com/u/7652978?v=4"/></br>[analogist](https://github.com/analogist) | <img width="50" src="https://avatars.githubusercontent.com/u/4995433?v=4"/></br>[jaredcrowe](https://github.com/jaredcrowe) | <img width="50" src="https://avatars.githubusercontent.com/u/936006?v=4"/></br>[jasonwilliams](https://github.com/jasonwilliams) |
| <img width="50" src="https://avatars.githubusercontent.com/u/4087105?v=4"/></br>[volatilevar](https://github.com/volatilevar) | <img width="50" src="https://avatars.githubusercontent.com/u/47724360?v=4"/></br>[innkuika](https://github.com/innkuika) | <img width="50" src="https://avatars.githubusercontent.com/u/163555?v=4"/></br>[JoelRSimpson](https://github.com/JoelRSimpson) | <img width="50" src="https://avatars.githubusercontent.com/u/6965062?v=4"/></br>[joeltaylor](https://github.com/joeltaylor) | <img width="50" src="https://avatars.githubusercontent.com/u/1133852?v=4"/></br>[thejohnfreeman](https://github.com/thejohnfreeman) |
| <img width="50" src="https://avatars.githubusercontent.com/u/242107?v=4"/></br>[exic](https://github.com/exic) | <img width="50" src="https://avatars.githubusercontent.com/u/13716151?v=4"/></br>[JonathanPlasse](https://github.com/JonathanPlasse) | <img width="50" src="https://avatars.githubusercontent.com/u/2520458?v=4"/></br>[joschaschmiedt](https://github.com/joschaschmiedt) | <img width="50" src="https://avatars.githubusercontent.com/u/1248504?v=4"/></br>[joesfer](https://github.com/joesfer) | <img width="50" src="https://avatars.githubusercontent.com/u/1586795?v=4"/></br>[joserebelo](https://github.com/joserebelo) |
| <img width="50" src="https://avatars.githubusercontent.com/u/6048003?v=4"/></br>[joybinchen](https://github.com/joybinchen) | <img width="50" src="https://avatars.githubusercontent.com/u/31921499?v=4"/></br>[Juvecu](https://github.com/Juvecu) | <img width="50" src="https://avatars.githubusercontent.com/u/20700283?v=4"/></br>[KaneGreen](https://github.com/KaneGreen) | <img width="50" src="https://avatars.githubusercontent.com/u/37601331?v=4"/></br>[kaustubhsh](https://github.com/kaustubhsh) | <img width="50" src="https://avatars.githubusercontent.com/u/1560189?v=4"/></br>[y-usuzumi](https://github.com/y-usuzumi) |
| <img width="50" src="https://avatars.githubusercontent.com/u/56685204?v=4"/></br>[kevinshu1995](https://github.com/kevinshu1995) | <img width="50" src="https://avatars.githubusercontent.com/u/98966350?v=4"/></br>[Kevin-vdberg](https://github.com/Kevin-vdberg) | <img width="50" src="https://avatars.githubusercontent.com/u/11942650?v=4"/></br>[kkoyung](https://github.com/kkoyung) | <img width="50" src="https://avatars.githubusercontent.com/u/1660460?v=4"/></br>[xuhcc](https://github.com/xuhcc) | <img width="50" src="https://avatars.githubusercontent.com/u/16933735?v=4"/></br>[kirtanprht](https://github.com/kirtanprht) |
| <img width="50" src="https://avatars.githubusercontent.com/u/37491732?v=4"/></br>[k0ur0x](https://github.com/k0ur0x) | <img width="50" src="https://avatars.githubusercontent.com/u/7824233?v=4"/></br>[kklas](https://github.com/kklas) | <img width="50" src="https://avatars.githubusercontent.com/u/8622992?v=4"/></br>[xmlangel](https://github.com/xmlangel) | <img width="50" src="https://avatars.githubusercontent.com/u/465678?v=4"/></br>[Letty](https://github.com/Letty) | <img width="50" src="https://avatars.githubusercontent.com/u/1055100?v=4"/></br>[troilus](https://github.com/troilus) |
| <img width="50" src="https://avatars.githubusercontent.com/u/47911535?v=4"/></br>[LightAPIs](https://github.com/LightAPIs) | <img width="50" src="https://avatars.githubusercontent.com/u/35413451?v=4"/></br>[Longhao-Chen](https://github.com/Longhao-Chen) | <img width="50" src="https://avatars.githubusercontent.com/u/50335724?v=4"/></br>[diogocaveiro](https://github.com/diogocaveiro) | <img width="50" src="https://avatars.githubusercontent.com/u/2599210?v=4"/></br>[lboullo0](https://github.com/lboullo0) | <img width="50" src="https://avatars.githubusercontent.com/u/1562062?v=4"/></br>[luisperezmarin](https://github.com/luisperezmarin) |
| <img width="50" src="https://avatars.githubusercontent.com/u/18382454?v=4"/></br>[MHolkamp](https://github.com/MHolkamp) | <img width="50" src="https://avatars.githubusercontent.com/u/15436007?v=4"/></br>[marc-bouvier](https://github.com/marc-bouvier) | <img width="50" src="https://avatars.githubusercontent.com/u/5699725?v=4"/></br>[mvonmaltitz](https://github.com/mvonmaltitz) | <img width="50" src="https://avatars.githubusercontent.com/u/11036464?v=4"/></br>[mlkood](https://github.com/mlkood) | <img width="50" src="https://avatars.githubusercontent.com/u/2480960?v=4"/></br>[plextoriano](https://github.com/plextoriano) |
| <img width="50" src="https://avatars.githubusercontent.com/u/5788516?v=4"/></br>[Marmo](https://github.com/Marmo) | <img width="50" src="https://avatars.githubusercontent.com/u/29300939?v=4"/></br>[mcejp](https://github.com/mcejp) | <img width="50" src="https://avatars.githubusercontent.com/u/640949?v=4"/></br>[freaktechnik](https://github.com/freaktechnik) | <img width="50" src="https://avatars.githubusercontent.com/u/79802125?v=4"/></br>[martinkorelic](https://github.com/martinkorelic) | <img width="50" src="https://avatars.githubusercontent.com/u/287105?v=4"/></br>[Petemir](https://github.com/Petemir) |
| <img width="50" src="https://avatars.githubusercontent.com/u/5218859?v=4"/></br>[matsair](https://github.com/matsair) | <img width="50" src="https://avatars.githubusercontent.com/u/7098804?v=4"/></br>[MattDemers](https://github.com/MattDemers) | <img width="50" src="https://avatars.githubusercontent.com/u/12831489?v=4"/></br>[mgroth0](https://github.com/mgroth0) | <img width="50" src="https://avatars.githubusercontent.com/u/21796?v=4"/></br>[silentmatt](https://github.com/silentmatt) | <img width="50" src="https://avatars.githubusercontent.com/u/76700192?v=4"/></br>[maxs-test](https://github.com/maxs-test) |
| <img width="50" src="https://avatars.githubusercontent.com/u/59669349?v=4"/></br>[MichBoi](https://github.com/MichBoi) | <img width="50" src="https://avatars.githubusercontent.com/u/3941344?v=4"/></br>[MikkCZ](https://github.com/MikkCZ) | <img width="50" src="https://avatars.githubusercontent.com/u/51273874?v=4"/></br>[MichipX](https://github.com/MichipX) | <img width="50" src="https://avatars.githubusercontent.com/u/59350?v=4"/></br>[Elleo](https://github.com/Elleo) | <img width="50" src="https://avatars.githubusercontent.com/u/14942380?v=4"/></br>[phucbm](https://github.com/phucbm) |
| <img width="50" src="https://avatars.githubusercontent.com/u/72992390?v=4"/></br>[miucci](https://github.com/miucci) | <img width="50" src="https://avatars.githubusercontent.com/u/40818895?v=4"/></br>[MovingEarth](https://github.com/MovingEarth) | <img width="50" src="https://avatars.githubusercontent.com/u/53177864?v=4"/></br>[MrTraduttore](https://github.com/MrTraduttore) | <img width="50" src="https://avatars.githubusercontent.com/u/48156230?v=4"/></br>[sanjarcode](https://github.com/sanjarcode) | <img width="50" src="https://avatars.githubusercontent.com/u/43955099?v=4"/></br>[Mustafa-ALD](https://github.com/Mustafa-ALD) |
| <img width="50" src="https://avatars.githubusercontent.com/u/1592048?v=4"/></br>[LeMyst](https://github.com/LeMyst) | <img width="50" src="https://avatars.githubusercontent.com/u/66901039?v=4"/></br>[matmolni](https://github.com/matmolni) | <img width="50" src="https://avatars.githubusercontent.com/u/9076687?v=4"/></br>[NJannasch](https://github.com/NJannasch) | <img width="50" src="https://avatars.githubusercontent.com/u/77619?v=4"/></br>[kna](https://github.com/kna) | <img width="50" src="https://avatars.githubusercontent.com/u/8016073?v=4"/></br>[zomglings](https://github.com/zomglings) |
| <img width="50" src="https://avatars.githubusercontent.com/u/63354547?v=4"/></br>[nicholas-10](https://github.com/nicholas-10) | <img width="50" src="https://avatars.githubusercontent.com/u/11778560?v=4"/></br>[nickhobbs94](https://github.com/nickhobbs94) | <img width="50" src="https://avatars.githubusercontent.com/u/10386884?v=4"/></br>[Frichetten](https://github.com/Frichetten) | <img width="50" src="https://avatars.githubusercontent.com/u/5541611?v=4"/></br>[nicolas-suzuki](https://github.com/nicolas-suzuki) | <img width="50" src="https://avatars.githubusercontent.com/u/15157120?v=4"/></br>[Nicryc](https://github.com/Nicryc) |
| <img width="50" src="https://avatars.githubusercontent.com/u/40800932?v=4"/></br>[nik-gautam](https://github.com/nik-gautam) | <img width="50" src="https://avatars.githubusercontent.com/u/48302704?v=4"/></br>[noah-nash](https://github.com/noah-nash) | <img width="50" src="https://avatars.githubusercontent.com/u/90026187?v=4"/></br>[OmGole](https://github.com/OmGole) | <img width="50" src="https://avatars.githubusercontent.com/u/12369770?v=4"/></br>[Ouvill](https://github.com/Ouvill) | <img width="50" src="https://avatars.githubusercontent.com/u/43815417?v=4"/></br>[shorty2380](https://github.com/shorty2380) |
| <img width="50" src="https://avatars.githubusercontent.com/u/15014287?v=4"/></br>[dist3r](https://github.com/dist3r) | <img width="50" src="https://avatars.githubusercontent.com/u/19418601?v=4"/></br>[rakleed](https://github.com/rakleed) | <img width="50" src="https://avatars.githubusercontent.com/u/7881932?v=4"/></br>[idle-code](https://github.com/idle-code) | <img width="50" src="https://avatars.githubusercontent.com/u/13076552?v=4"/></br>[Oaklight](https://github.com/Oaklight) | <img width="50" src="https://avatars.githubusercontent.com/u/53913724?v=4"/></br>[Perkolator](https://github.com/Perkolator) |
| <img width="50" src="https://avatars.githubusercontent.com/u/24394304?v=4"/></br>[petzi53](https://github.com/petzi53) | <img width="50" src="https://avatars.githubusercontent.com/u/29787?v=4"/></br>[phitsc](https://github.com/phitsc) | <img width="50" src="https://avatars.githubusercontent.com/u/56399446?v=4"/></br>[KowalskiPiotr98](https://github.com/KowalskiPiotr98) | <img width="50" src="https://avatars.githubusercontent.com/u/64375061?v=4"/></br>[Polaris66](https://github.com/Polaris66) | <img width="50" src="https://avatars.githubusercontent.com/u/6306608?v=4"/></br>[Diadlo](https://github.com/Diadlo) |
| <img width="50" src="https://avatars.githubusercontent.com/u/42793024?v=4"/></br>[pranavmodx](https://github.com/pranavmodx) | <img width="50" src="https://avatars.githubusercontent.com/u/50834839?v=4"/></br>[R3dError](https://github.com/R3dError) | <img width="50" src="https://avatars.githubusercontent.com/u/42652941?v=4"/></br>[rajprakash00](https://github.com/rajprakash00) | <img width="50" src="https://avatars.githubusercontent.com/u/32304956?v=4"/></br>[rahil1304](https://github.com/rahil1304) | <img width="50" src="https://avatars.githubusercontent.com/u/8257474?v=4"/></br>[rasulkireev](https://github.com/rasulkireev) |
| <img width="50" src="https://avatars.githubusercontent.com/u/17312341?v=4"/></br>[reinhart1010](https://github.com/reinhart1010) | <img width="50" src="https://avatars.githubusercontent.com/u/60484714?v=4"/></br>[Retew](https://github.com/Retew) | <img width="50" src="https://avatars.githubusercontent.com/u/10456131?v=4"/></br>[ambrt](https://github.com/ambrt) | <img width="50" src="https://avatars.githubusercontent.com/u/791713?v=4"/></br>[rio-codes](https://github.com/rio-codes) | <img width="50" src="https://avatars.githubusercontent.com/u/568673?v=4"/></br>[robmoffat](https://github.com/robmoffat) |
| <img width="50" src="https://avatars.githubusercontent.com/u/15892014?v=4"/></br>[Derkades](https://github.com/Derkades) | <img width="50" src="https://avatars.githubusercontent.com/u/49439044?v=4"/></br>[fourstepper](https://github.com/fourstepper) | <img width="50" src="https://avatars.githubusercontent.com/u/54365?v=4"/></br>[rodgco](https://github.com/rodgco) | <img width="50" src="https://avatars.githubusercontent.com/u/96014?v=4"/></br>[Ronnie76er](https://github.com/Ronnie76er) | <img width="50" src="https://avatars.githubusercontent.com/u/79168?v=4"/></br>[roryokane](https://github.com/roryokane) |
| <img width="50" src="https://avatars.githubusercontent.com/u/744655?v=4"/></br>[ruzaq](https://github.com/ruzaq) | <img width="50" src="https://avatars.githubusercontent.com/u/20490839?v=4"/></br>[szokesandor](https://github.com/szokesandor) | <img width="50" src="https://avatars.githubusercontent.com/u/10775512?v=4"/></br>[forsh4w](https://github.com/forsh4w) | <img width="50" src="https://avatars.githubusercontent.com/u/19328605?v=4"/></br>[SamuelBlickle](https://github.com/SamuelBlickle) | <img width="50" src="https://avatars.githubusercontent.com/u/80849457?v=4"/></br>[livingc0l0ur](https://github.com/livingc0l0ur) |
| <img width="50" src="https://avatars.githubusercontent.com/u/1776?v=4"/></br>[bronson](https://github.com/bronson) | <img width="50" src="https://avatars.githubusercontent.com/u/426959?v=4"/></br>[sebthom](https://github.com/sebthom) | <img width="50" src="https://avatars.githubusercontent.com/u/24606935?v=4"/></br>[semperor](https://github.com/semperor) | <img width="50" src="https://avatars.githubusercontent.com/u/18042424?v=4"/></br>[SeptemberHX](https://github.com/SeptemberHX) | <img width="50" src="https://avatars.githubusercontent.com/u/607938?v=4"/></br>[shawnaxsom](https://github.com/shawnaxsom) |
| <img width="50" src="https://avatars.githubusercontent.com/u/2786333?v=4"/></br>[hurutoriya](https://github.com/hurutoriya) | <img width="50" src="https://avatars.githubusercontent.com/u/60000624?v=4"/></br>[siddharthmagadum16](https://github.com/siddharthmagadum16) | <img width="50" src="https://avatars.githubusercontent.com/u/30827929?v=4"/></br>[5idereal](https://github.com/5idereal) | <img width="50" src="https://avatars.githubusercontent.com/u/43588516?v=4"/></br>[stephan-dev](https://github.com/stephan-dev) | <img width="50" src="https://avatars.githubusercontent.com/u/9937486?v=4"/></br>[SFoskitt](https://github.com/SFoskitt) |
| <img width="50" src="https://avatars.githubusercontent.com/u/24674127?v=4"/></br>[stephanoskomnenos](https://github.com/stephanoskomnenos) | <img width="50" src="https://avatars.githubusercontent.com/u/94064167?v=4"/></br>[WebSnke](https://github.com/WebSnke) | <img width="50" src="https://avatars.githubusercontent.com/u/505011?v=4"/></br>[kcrt](https://github.com/kcrt) | <img width="50" src="https://avatars.githubusercontent.com/u/538584?v=4"/></br>[xissy](https://github.com/xissy) | <img width="50" src="https://avatars.githubusercontent.com/u/164962?v=4"/></br>[tams](https://github.com/tams) |
| <img width="50" src="https://avatars.githubusercontent.com/u/466122?v=4"/></br>[Tekki](https://github.com/Tekki) | <img width="50" src="https://avatars.githubusercontent.com/u/13370356?v=4"/></br>[Teko-uy](https://github.com/Teko-uy) | <img width="50" src="https://avatars.githubusercontent.com/u/2112477?v=4"/></br>[ThatcherC](https://github.com/ThatcherC) | <img width="50" src="https://avatars.githubusercontent.com/u/21969426?v=4"/></br>[TheoDutch](https://github.com/TheoDutch) | <img width="50" src="https://avatars.githubusercontent.com/u/19636565?v=4"/></br>[Theta-Dev](https://github.com/Theta-Dev) |
| <img width="50" src="https://avatars.githubusercontent.com/u/12467511?v=4"/></br>[ThibaultJanBeyer](https://github.com/ThibaultJanBeyer) | <img width="50" src="https://avatars.githubusercontent.com/u/8731922?v=4"/></br>[tbroadley](https://github.com/tbroadley) | <img width="50" src="https://avatars.githubusercontent.com/u/114300?v=4"/></br>[Kriechi](https://github.com/Kriechi) | <img width="50" src="https://avatars.githubusercontent.com/u/3457339?v=4"/></br>[tkilaker](https://github.com/tkilaker) | <img width="50" src="https://avatars.githubusercontent.com/u/802148?v=4"/></br>[Archelyst](https://github.com/Archelyst) |
| <img width="50" src="https://avatars.githubusercontent.com/u/4201229?v=4"/></br>[tcyrus](https://github.com/tcyrus) | <img width="50" src="https://avatars.githubusercontent.com/u/834914?v=4"/></br>[tobias-grasse](https://github.com/tobias-grasse) | <img width="50" src="https://avatars.githubusercontent.com/u/6691273?v=4"/></br>[strobeltobias](https://github.com/strobeltobias) | <img width="50" src="https://avatars.githubusercontent.com/u/1677578?v=4"/></br>[kostegit](https://github.com/kostegit) | <img width="50" src="https://avatars.githubusercontent.com/u/9092682?v=4"/></br>[TomBursch](https://github.com/TomBursch) |
| <img width="50" src="https://avatars.githubusercontent.com/u/70296?v=4"/></br>[tbergeron](https://github.com/tbergeron) | <img width="50" src="https://avatars.githubusercontent.com/u/1117052?v=4"/></br>[tbjers](https://github.com/tbjers) | <img width="50" src="https://avatars.githubusercontent.com/u/238296?v=4"/></br>[trentlarson](https://github.com/trentlarson) | <img width="50" src="https://avatars.githubusercontent.com/u/10265443?v=4"/></br>[Ullas-Aithal](https://github.com/Ullas-Aithal) | <img width="50" src="https://avatars.githubusercontent.com/u/6104498?v=4"/></br>[vdeville](https://github.com/vdeville) |
| <img width="50" src="https://avatars.githubusercontent.com/u/2830093?v=4"/></br>[vassudanagunta](https://github.com/vassudanagunta) | <img width="50" src="https://avatars.githubusercontent.com/u/54314949?v=4"/></br>[vijayjoshi16](https://github.com/vijayjoshi16) | <img width="50" src="https://avatars.githubusercontent.com/u/13400593?v=4"/></br>[vjocw](https://github.com/vjocw) | <img width="50" src="https://avatars.githubusercontent.com/u/59287619?v=4"/></br>[max-keviv](https://github.com/max-keviv) | <img width="50" src="https://avatars.githubusercontent.com/u/598576?v=4"/></br>[vandreykiv](https://github.com/vandreykiv) |
| <img width="50" src="https://avatars.githubusercontent.com/u/4094814?v=4"/></br>[warddr](https://github.com/warddr) | <img width="50" src="https://avatars.githubusercontent.com/u/22241609?v=4"/></br>[westfalenyeti](https://github.com/westfalenyeti) | <img width="50" src="https://avatars.githubusercontent.com/u/26511487?v=4"/></br>[WisdomCode](https://github.com/WisdomCode) | <img width="50" src="https://avatars.githubusercontent.com/u/48159366?v=4"/></br>[X3NOOO](https://github.com/X3NOOO) | <img width="50" src="https://avatars.githubusercontent.com/u/1921957?v=4"/></br>[xsak](https://github.com/xsak) |
| | | | | |
<!-- CONTRIBUTORS-TABLE-AUTO-GENERATED -->
+3 -2
View File
@@ -11,8 +11,9 @@ module.exports = {
//
// '**/*.ts?(x)': () => 'npm run tsc',
'*.{js,jsx,ts,tsx}': [
'yarn run linter-precommit',
'yarn run checkIgnoredFiles',
'yarn run checkLibPaths',
'node packages/tools/checkIgnoredFiles.js',
'yarn run packageJsonLint',
'yarn run linter-precommit',
],
};
+3 -2
View File
@@ -24,6 +24,7 @@
"buildWebsiteTranslations": "node packages/tools/website/buildTranslations.js",
"buildWebsite": "node ./packages/tools/website/build.js && yarn run buildPluginDoc && yarn run buildSettingJsonSchema",
"checkLibPaths": "node ./packages/tools/checkLibPaths.js",
"checkIgnoredFiles": "node ./packages/tools/checkIgnoredFiles.js",
"circularDependencyCheck": "madge --warning --circular --extensions js ./",
"clean": "npm run clean --workspaces --if-present && node packages/tools/clean && yarn cache clean",
"dependencyTree": "madge",
@@ -33,7 +34,7 @@
"linter-precommit": "eslint --resolve-plugins-relative-to . --fix --ext .js --ext .jsx --ext .ts --ext .tsx",
"linter": "eslint --resolve-plugins-relative-to . --fix --quiet --ext .js --ext .jsx --ext .ts --ext .tsx",
"linter-interactive": "eslint-interactive --resolve-plugins-relative-to . --fix --quiet --ext .js --ext .jsx --ext .ts --ext .tsx",
"packageJsonLint": "npmPkgJsonLint --configFile .npmpackagejsonlintrc.json --quiet .",
"packageJsonLint": "node ./packages/tools/packageJsonLint.js",
"postinstall": "gulp build",
"publishAll": "git pull && yarn run buildParallel && lerna version --yes --no-private --no-git-tag-version && gulp completePublishAll",
"releaseAndroid": "PATH=\"/usr/local/opt/openjdk@11/bin:$PATH\" node packages/tools/release-android.js",
@@ -60,7 +61,7 @@
},
"husky": {
"hooks": {
"pre-commit": "lint-staged && yarn run packageJsonLint"
"pre-commit": "lint-staged"
}
},
"devDependencies": {
+1 -1
View File
@@ -50,7 +50,7 @@ class LinkSelector {
link: matches[n][0],
noteX: matches[n].index,
noteY: i,
}
},
);
});
}
+1 -1
View File
@@ -482,7 +482,7 @@ class AppGui {
if (this.linkSelector_.link) {
this.term_.moveTo(
this.linkSelector_.noteX + cursorOffsetX,
this.linkSelector_.noteY + cursorOffsetY
this.linkSelector_.noteY + cursorOffsetY,
);
shim.setTimeout(() => this.term_.term().inverse(this.linkSelector_.link), 50);
}
+1 -1
View File
@@ -173,7 +173,7 @@ class Command extends BaseCommand {
reg.db(),
sync.lockHandler(),
appTypeToLockType(Setting.value('appType')),
Setting.value('clientId')
Setting.value('clientId'),
);
migrationHandler.setLogger(cliUtils.stdoutLogger(this.stdout.bind(this)));
+1 -1
View File
@@ -39,7 +39,7 @@ async function createClients() {
// eslint-disable-next-line promise/prefer-await-to-then -- Old code before rule was applied
execCommand(client, 'config sync.target 2').then(() => {
return execCommand(client, `config sync.2.path ${syncDir}`);
})
}),
);
output.push(client);
}
+1 -1
View File
@@ -35,7 +35,7 @@
],
"owner": "Laurent Cozic"
},
"version": "2.12.0",
"version": "2.12.1",
"bin": "./main.js",
"engines": {
"node": ">=10.0.0"
+5 -3
View File
@@ -1,5 +1,6 @@
import shim from '@joplin/lib/shim';
const os = require('os');
import { readFile } from 'fs/promises';
const { filename } = require('@joplin/lib/path-utils');
import HtmlToMd from '@joplin/lib/HtmlToMd';
@@ -35,8 +36,8 @@ describe('HtmlToMd', () => {
htmlToMdOptions.preserveImageTagsWithSize = true;
}
const html = await shim.fsDriver().readFile(htmlPath);
let expectedMd = await shim.fsDriver().readFile(mdPath);
const html = await readFile(htmlPath, 'utf8');
let expectedMd = await readFile(mdPath, 'utf8');
let actualMd = await htmlToMd.parse(`<div>${html}</div>`, htmlToMdOptions);
@@ -47,11 +48,12 @@ describe('HtmlToMd', () => {
if (actualMd !== expectedMd) {
const result = [];
result.push('');
result.push(`Error converting file: ${htmlFilename}`);
result.push('--------------------------------- Got:');
result.push(actualMd.split('\n').map((l: string) => `"${l}"`).join('\n'));
// result.push('--------------------------------- Raw:');
// result.push(actualMd.split('\n'));
result.push('--------------------------------- Expected:');
result.push(expectedMd.split('\n').map((l: string) => `"${l}"`).join('\n'));
result.push('--------------------------------------------');
+1 -1
View File
@@ -248,7 +248,7 @@ describe('MdToHtml', () => {
const result = await mdToHtml.render(input, null, { bodyOnly: true, mapsToLine: true });
expect(result.html.trim()).toBe('<h1 id="head" class="maps-to-line" source-line="0" source-line-end="1">Head</h1>\n' +
'<p class="maps-to-line" source-line="1" source-line-end="2">Fruits</p>\n' +
'<ul>\n<li class="maps-to-line" source-line="2" source-line-end="3">Apple</li>\n</ul>'
'<ul>\n<li class="maps-to-line" source-line="2" source-line-end="3">Apple</li>\n</ul>',
);
}
}));
@@ -0,0 +1,384 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export2.dtd">
<en-export export-date="20230817T012118Z" application="Evernote/Windows" version="6.x">
<note><title>Dashboard | MassPay</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
<en-note><div><en-media hash="52de02640b588b40dcb0a920b9e089bb" type="image/png"/></div><div style="min-height: 250px; font-size: 16px; min-width: 100%; position: relative;"><div style="box-sizing: border-box; text-size-adjust: 100%; -webkit-tap-highlight-color: transparent;"><div style="box-sizing: border-box; text-align: left; background-color: rgb(255, 255, 255); -webkit-font-smoothing: antialiased; font-size: 14px;"><div style="box-sizing:border-box;"><div style="box-sizing:border-box;transition:all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1) 0s;transition-property:top, bottom, width;transition-duration:0.2s, 0.2s, 0.35s;transition-timing-function:linear, linear, ease;overflow-anchor:none;touch-action:auto;background-color:rgb(235, 236, 241);overflow:auto;"><div style="box-sizing:border-box;"><div style="box-sizing:border-box;"><div style="box-sizing:border-box;"><div style="box-sizing:border-box;flex-direction:column;min-width:0px;overflow-wrap:break-word;background-color:rgb(255, 255, 255);background-clip:border-box;box-shadow:rgba(39, 39, 39, 0.1) 0px 1px 15px 1px;border-radius:3px;"><div style="box-sizing:border-box;margin-bottom:0px;border-bottom:1px solid rgba(0, 0, 0, 0.125);border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0px 0px;border:0px;padding:15px 15px 0px;background-color:transparent;"><h4 style="box-sizing: border-box; font-size: 1.714em; margin-bottom: 12px; margin-top: 10px;"><span style="font-family: Montserrat, &quot;Helvetica Neue&quot;, Arial, sans-serif; line-height: 1.45em; color: rgb(44, 44, 44); font-weight: 400;">Last Transfer</span></h4></div><div style="box-sizing:border-box;flex:1 1 auto;min-height:1px;padding:15px 15px 10px;"><div style="box-sizing:border-box;"><div style="box-sizing:border-box;text-align:left;"><div style="box-sizing:border-box;display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px;"><div style="box-sizing: border-box; position: relative; width: 100%; padding-right: 15px; padding-left: 15px; flex: 0 0 16.6667%; max-width: 16.6667%;"><div style="box-sizing: border-box; transition: transform 0.4s ease 0s, box-shadow 0.4s ease 0s; float: left; margin: 8px auto 0px; border-radius: 50%; font-size: 0.7142em; background-color: rgb(255, 255, 255); position: relative; max-width: 65px; width: 65px; height: 65px; box-shadow: rgba(44, 168, 255, 0.5) 0px 9px 30px -6px;"><span style="font-family: Montserrat, &quot;Helvetica Neue&quot;, Arial, sans-serif; line-height: 1.5; color: rgb(44, 168, 255); font-weight: 400;"><en-media hash="b3d82d4e0af0fe302ee3e2339edfe13d" height="65" style="box-sizing:border-box;vertical-align:middle;border-style:none;max-width:100%;border-radius:3px;display:inline-block;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:1;font-family:" type="image/svg+xml" width="65"/></span></div></div><div style="box-sizing:border-box;position:relative;width:100%;padding-right:15px;padding-left:15px;flex:0 0 83.3333%;max-width:83.3333%;"><h5 style="box-sizing: border-box; font-size: 1.57em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin: 15px 0px 5px; padding: 0px 15px 0px 0px;"><span style="font-family: Montserrat, &quot;Helvetica Neue&quot;, Arial, sans-serif; line-height: 1.4em; color: rgb(44, 44, 44); font-weight: 700;">Next Day Bank Deposit / USD</span></h5><h6 style="box-sizing: border-box; margin-top: 0px; margin-bottom: 8px; text-transform: uppercase; font-size: 1em;"><span style="font-family: Montserrat, &quot;Helvetica Neue&quot;, Arial, sans-serif; line-height: 1.2; color: rgb(44, 44, 44); font-weight: 700;">March 5, 2023 04:28AM</span></h6></div></div></div></div></div><hr style="height:0px;overflow:visible;box-sizing:content-box;margin-top:16px;margin-bottom:16px;border-width:1px 0px 0px;border-right-style:initial;border-bottom-style:initial;border-left-style:initial;border-right-color:initial;border-bottom-color:initial;border-left-color:initial;border-image:initial;border-top-style:solid;border-top-color:rgba(0, 0, 0, 0.1);margin-right:0px;margin-left:0px;"/><div style="box-sizing:border-box;padding:0.75rem 1.25rem;border-top:1px solid rgba(0, 0, 0, 0.125);border-radius:0px 0px calc(0.25rem - 1px) calc(0.25rem - 1px);border:0px;background-color:transparent;"><div style="box-sizing:border-box;display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px;"><div style="box-sizing:border-box;position:relative;width:100%;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%;"><span style="font-size: 14px; font-family: Montserrat, &quot;Helvetica Neue&quot;, Arial, sans-serif; line-height: 1.5; color: rgb(44, 44, 44); font-weight: 400;">Processing</span></div><div style="box-sizing:border-box;position:relative;width:100%;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%;"><span style="font-size: 14px; font-family: Montserrat, &quot;Helvetica Neue&quot;, Arial, sans-serif; line-height: 1.5; color: rgb(44, 44, 44); font-weight: bolder; box-sizing:Line truncated
PHN2ZyBpZD0iQ2FwYV8xIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiBoZWln
aHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHdpZHRoPSI1MTIiIHhtbG5zPSJodHRwOi8v
d3d3LnczLm9yZy8yMDAwL3N2ZyI+PGc+PHBhdGggZD0ibTQ4MS45OTIgNDg4LjExMi00MS44LTU2
LjgzMXYtMjQyLjIyNmgxOS43MTZjOC4yODQgMCAxNS02LjcxNiAxNS0xNXYtNjAuNzk2YzAtOC4y
ODQtNi43MTYtMTUtMTUtMTVoLTMwLjY3N2wtMTY1LjY5OC05Ni4yM2MtNC42NTgtMi43MDUtMTAu
NDA4LTIuNzA1LTE1LjA2NiAwbC0xNjUuNjk5IDk2LjIzaC0zMC42NzZjLTguMjg0IDAtMTUgNi43
MTYtMTUgMTV2NjAuNzk2YzAgOC4yODQgNi43MTYgMTUgMTUgMTVoMTkuNzE2djI0Mi4yMjZsLTQx
Ljc5OSA1Ni44MzFjLTMuMzUyIDQuNTU3LTMuODU0IDEwLjYxMS0xLjMwMSAxNS42NTlzNy43Mjcg
OC4yMjkgMTMuMzg0IDguMjI5aDQyNy44MTdjNS42NTYgMCAxMC44MzItMy4xODIgMTMuMzg1LTgu
MjI5czIuMDUtMTEuMTAyLTEuMzAyLTE1LjY1OXptLTcxLjgtNjYuOTA4aC0zMC43OTZ2LTIzMi4x
NDloMzAuNzk2em0tMjQ3LjU4OCAwdi0yMzIuMTQ5aDE4Ni43OTJ2MjMyLjE0OGgtMTg2Ljc5Mnpt
OTMuMzk2LTM4OC44NTggMTEzLjQ5NiA2NS45MTNoLTIyNi45OTJ6bS0xODguOTA4IDk1LjkxM2gz
NzcuODE3djMwLjc5NmgtMzc3LjgxN3ptNjUuNTEyIDYwLjc5NnYyMzIuMTQ4aC0zMC43OTZ2LTIz
Mi4xNDh6bS02MC44NiAyOTIuOTQ1IDIyLjY1MS0zMC43OTZoMzIzLjIwOWwyMi42NTIgMzAuNzk2
eiIvPjxwYXRoIGQ9Im0yNzQuNDExIDI4OS45NzljLTExLjAyMS0zLjg5Ni0yMy4xODYtOC41ODMt
MjkuODQ5LTEzLjgwOS0xLjM5OS0xLjA5Ny0xLjk5LTQuMTQ1LTEuNDA1LTcuMjQ4LjMyLTEuNjk2
IDEuODAxLTcuMzYzIDcuNDQ0LTkuMDYzIDEwLjQzMi0zLjE0MyAxNy41MDcuOTY1IDIwLjA2NCAy
Ljg3OCA2LjYzNSA0Ljk2IDE2LjAzNSAzLjYwMiAyMC45OTYtMy4wMzMgNC45Ni02LjYzNSAzLjYw
My0xNi4wMzUtMy4wMzMtMjAuOTk2LTIuNTUyLTEuOTA4LTguNjczLTUuOTMyLTE3LjQyOS04LjI0
NXYtMy4wMDdjMC04LjI4NC02LjcxNi0xNS0xNS0xNXMtMTUgNi43MTYtMTUgMTV2My45MzNjLTE0
LjEzNSA0LjU2OC0yNC42NTEgMTYuNzM5LTI3LjUyMyAzMS45NzctMi43MDUgMTQuMzUxIDIuMDM2
IDI4LjMwMiAxMi4zNzIgMzYuNDA5IDEwLjA1MSA3Ljg4MyAyNC4zNzkgMTMuNTQ1IDM4LjM2NSAx
OC40ODkgMTAuMzAzIDMuNjQyIDEwLjYxMSAxMS41MDQgOS44NzcgMTUuODY2LTEuMjQzIDcuMzk2
LTcuNDY2IDE1LjM4OS0xOC4xOTIgMTUuNDYxLTExLjcwNi4wNzctMTQuNzY0LS40MDQtMjMuNDk0
LTYuMTE1LTYuOTMzLTQuNTM1LTE2LjIyOS0yLjU5MS0yMC43NjQgNC4zNDEtNC41MzUgNi45MzMt
Mi41OTEgMTYuMjI5IDQuMzQxIDIwLjc2NCA5LjUxMiA2LjIyMyAxNi43MTMgOS4wMzggMjUuMDE3
IDEwLjIyN3YzLjM2MmMwIDguMjg0IDYuNzE2IDE1IDE1IDE1czE1LTYuNzE2IDE1LTE1di00Ljk1
MWMxOC4yOTEtNS45MzIgMjkuOTg5LTIyLjEyOCAzMi42NzctMzguMTE3IDMuNjc1LTIxLjg1My04
LjE2Ni00MS41OTUtMjkuNDY0LTQ5LjEyM3oiLz48L2c+PC9zdmc+
</data><mime>image/svg+xml</mime><resource-attributes><source-url>https://members.masspay.io/assets/img/bank.svg</source-url><file-name>bank.svg</file-name></resource-attributes></resource><resource><data encoding="base64">
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
7l4AAAAASUVORK5CYII=
</data><mime>image/png</mime><width>1574</width><height>138</height><recognition><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE recoIndex PUBLIC "SYSTEM" "http://xml.evernote.com/pub/recoIndex.dtd"><recoIndex docType="unknown" objType="image" objID="52de02640b588b40dcb0a920b9e089bb" engineVersion="7.0.24.3-p2" recoType="service" lang="en" objWidth="1574" objHeight="138"><item x="9" y="3" w="103" h="19"><t w="65">Date/Time</t><t w="18">dateline</t></item><item x="9" y="57" w="41" h="11"><t w="88">March</t></item><item x="56" y="57" w="10" h="11"><t w="54">5,</t><t w="54">S,</t><t w="40">S.</t><t w="39">5.</t><t w="29">s</t></item><item x="69" y="57" w="32" h="11"><t w="79">2023</t><t w="36">2013</t></item><item x="107" y="57" w="61" h="11"><t w="67">04:28AM</t><t w="43">04:29AM</t><t w="34">04:23AM</t><t w="19">04: ?</t></item><item x="9" y="104" w="41" h="11"><t w="88">March</t></item><item x="56" y="105" w="13" h="11"><t w="49">4,</t><t w="39">4.</t><t w="21">I'm</t><t w="21">if</t><t w="12">Lt,</t></item><item x="72" y="104" w="32" h="11"><t w="79">2023</t></item><item x="108" y="104" w="58" h="11"><t w="51">05:22PM</t><t w="45">OS:22PM</t><t w="16">05:22PIII</t><t w="16">05:22PIlI</t><t w="16">05:21PIlI</t><t w="16">05:22P1</t><t w="16">05:22PIl</t><t w="16">05:22PlI</t></item><item x="270" y="4" w="112" h="20"><t w="70">Description</t></item><item x="270" y="59" w="31" h="10"><t w="88">Next</t></item><item x="308" y="59" w="26" h="13"><t w="89">Day</t></item><item x="338" y="57" w="35" h="11"><t w="95">Bank</t><t w="58">Sank</t></item><item x="378" y="59" w="53" h="13"><t w="86">Deposit</t></item><item x="435" y="57" w="103" h="13"><t w="59">Confirmation:</t><t w="50">I Confirmation:</t><t w="48">I Confirmation;</t><t w="46">Confirmation</t><t w="43">I Confirmation</t><t w="41">i ? Confirmation:</t><t w="39">i ? Confirmation;</t><t w="34">i ? Confirmation</t><t w="25">[confirmation</t></item><item x="545" y="57" w="146" h="13"><t w="52">llbwHOSZ06p7meW</t><t w="43">ILbwH05Z06p7meW</t><t w="43">ILbwHOSZ06p7meW</t></item><item x="270" y="104" w="62" h="13"><t w="92">February</t><t w="42">Februarv</t></item><item x="338" y="104" w="49" h="13"><t w="87">Payout</t></item><item x="920" y="5" w="83" h="15"><t w="76">Amount</t></item><item x="921" y="57" w="40" h="13"><t w="70">$12.50</t><t w="40">$11.50</t><t w="38">$12050</t></item><item x="966" y="57" w="29" h="11"><t w="82">USD</t></item><item x="921" y="102" w="40" h="13"><t w="64">$1350</t><t w="60">$13.50</t></item><item x="966" y="104" w="29" h="11"><t w="84">USD</t></item><item x="1094" y="6" w="34" h="14"><t w="88">Fee</t><t w="26">FPP</t></item><item x="1143" y="6" w="88" h="16"><t w="87">Received</t><t w="24">RPr:PiVPrl</t></item><item x="1115" y="57" w="13" h="13"><t w="56">$1</t><t w="37">Sl</t><t w="19">si</t></item><item x="1142" y="57" w="32" h="10"><t w="53">1250</t><t w="27">12.SOUSD</t><t w="24">1150</t><t w="23">12.50 USD</t><t w="14">Usa</t><t w="12">UFO</t></item><item x="1179" y="57" w="29" h="10"><t w="72">USD</t></item><item x="1110" y="102" w="16" h="13"><t w="55">$0</t><t w="39">so</t><t w="29">go</t></item><item x="1142" y="104" w="32" h="11"><t w="71">13.50</t><t w="29">13.SOUSD</t><t w="24">13.50 USD</t></item><item x="1179" y="104" w="29" h="11"><t w="80">USD</t></item><item x="1298" y="5" w="62" h="15"><t w="74">Status</t></item><item x="1299" y="57" w="74" h="14"><t w="86">Processing</t><t w="67">Precessing</t></item><item x="1298" y="103" w="77" h="14"><t w="70">Completed</t><t w="51">Complete</t></item><item x="1484" y="4" w="78" h="16"><t w="74">Balance</t></item><item x="1490" y="57" w="38" h="13"><t w="70">$0.00</t><t w="34">$0000</t><t w="30">$0.00USD</t><t w="25">$0.00 USD</t></item><item x="1533" y="57" w="29" h="10"><t w="80">USD</t></item><item x="1488" y="102" w="41" h="11"><t w="61">$13.50</t><t w="36">$13050</t><t w="33">$13.SOUSD</t><t w="28">$13.50 USD</t><t w="21">53.50</t><t w="19">513.50</t><t w="18">$1350</t></item><item x="1533" y="104" w="29" h="10"><t w="80">USD</t></item></recoIndex>
]]></recognition></resource></note></en-export>
@@ -0,0 +1,17 @@
![](:/RESOURCE_ID_1)
#### Last Transfer
<img src=":/RESOURCE_ID_2" width="65" height="65" alt="bank.svg"/>
##### **Next Day Bank Deposit / USD**
###### **March 5, 2023 04:28AM**
* * *
Processing
**Confirmation**: ILbwHO5Z06p7meW
![](https://joplinapp.org/images/logo-text.svg)
<img src="https://joplinapp.org/images/logo-text.svg" width="100" height="50"/>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export4.dtd">
<en-export export-date="20230811T195236Z" application="Evernote" version="10.58.8">
<note>
<title>DSCN0716.JPG</title>
<created>20130228T193612Z</created>
<updated>20230616T123049Z</updated>
<tag>Eye-Fi</tag>
<tag>2013-02-27</tag>
<tag>records</tag>
<note-attributes>
</note-attributes>
<content>
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note><en-media type="image/jpeg" hash="33c6ed66e09569ed167dec1e1fd66b87"/><br/><![CDATA[DSCN0716.JPG]]></en-note> ]]>
</content>
</note>
</en-export>
@@ -1,8 +0,0 @@
<div>
<table><tbody><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> ma_fonction<span style="color: black;">(</span><span style="color: black;">)</span>:
<span style="color: #483d8b;">"""
C'est une super fonction
"""</span>
<span style="color: #ff7700;font-weight:bold;">pass</span></pre></td></tr></tbody></table>
</div>
@@ -1,7 +0,0 @@
```
def ma_fonction():
"""
C'est une super fonction
"""
pass
```
@@ -0,0 +1,14 @@
<table>
<thead>
<tr>
<th>A</th>
<th>B</th>
</tr>
</thead>
<tbody>
<tr>
<td><blockquote><p>Finally, from so little sleeping and so much reading, his brain dried up and he went completely out of his mind.</p><p>- Miguel de Cervantes</p></blockquote></td>
<td>d</td>
</tr>
</tbody>
</table>
@@ -0,0 +1 @@
<table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td><blockquote><p>Finally, from so little sleeping and so much reading, his brain dried up and he went completely out of his mind.</p><p>- Miguel de Cervantes</p></blockquote></td><td>d</td></tr></tbody></table>
@@ -0,0 +1,15 @@
<table>
<thead>
<tr>
<th>Code</th><th>Description</th>
</tr>
<tr>
<td><pre><code>const test = "hello";</code></pre></td>
<td>abcd</td>
</tr>
<tr>
<td><pre><code>const test = "hello";</code></pre></td>
<td>abcd</td>
</tr>
</thead>
</table>
@@ -0,0 +1 @@
<table><thead><tr><th>Code</th><th>Description</th></tr><tr><td><pre><code>const test = "hello";</code></pre></td><td>abcd</td></tr><tr><td><pre><code>const test = "hello";</code></pre></td><td>abcd</td></tr></thead></table>
@@ -0,0 +1,22 @@
<div id="rendered-md">
<table class="jop-noMdConv">
<thead class="jop-noMdConv">
<tr class="jop-noMdConv">
<th class="jop-noMdConv">Code</th>
<th class="jop-noMdConv">Description</th>
</tr>
<tr class="jop-noMdConv">
<td class="jop-noMdConv">
<pre class="jop-noMdConv"><code class="jop-noMdConv">const test = "hello";</code></pre>
</td>
<td class="jop-noMdConv">abcda</td>
</tr>
<tr class="jop-noMdConv">
<td class="jop-noMdConv">
<pre class="jop-noMdConv"><code class="jop-noMdConv">const test = "hello";</code></pre>
</td>
<td class="jop-noMdConv">abcd</td>
</tr>
</thead>
</table
</div>
@@ -0,0 +1 @@
<table class="jop-noMdConv"><thead class="jop-noMdConv"><tr class="jop-noMdConv"><th class="jop-noMdConv">Code</th><th class="jop-noMdConv">Description</th></tr><tr class="jop-noMdConv"><td class="jop-noMdConv"><pre class="jop-noMdConv"><code class="">const test = "hello";</code></pre></td><td class="jop-noMdConv">abcda</td></tr><tr class="jop-noMdConv"><td class="jop-noMdConv"><pre class="jop-noMdConv"><code class="">const test = "hello";</code></pre></td><td class="jop-noMdConv">abcd</td></tr></thead></table>
@@ -0,0 +1,14 @@
<table>
<thead>
<tr>
<th>A</th>
<th>B</th>
</tr>
</thead>
<tbody>
<tr>
<td><h1>Testing</h1><p>hello</p></td>
<td>d</td>
</tr>
</tbody>
</table>
@@ -0,0 +1 @@
<table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td><h1>Testing</h1><p>hello</p></td><td>d</td></tr></tbody></table>
@@ -0,0 +1,14 @@
<table>
<thead>
<tr>
<th>A</th>
<th>B</th>
</tr>
</thead>
<tbody>
<tr>
<td>One line<hr/>Two line</td>
<td>d</td>
</tr>
</tbody>
</table>
@@ -0,0 +1 @@
<table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td>One line<hr>Two line</td><td>d</td></tr></tbody></table>
@@ -0,0 +1 @@
<table border="1" style="border-collapse: collapse; width: 100%;" data-mce-selected="1"><tbody><tr><td style="width: 50.0518%;">Header 1</td><td style="width: 50.0518%;">Header 2</td></tr><tr><td style="width: 50.0518%;"><br></td><td style="width: 50.0518%;"><ul><li>Check 1</li><li>Check 2</li></ul></td></tr></tbody></table>
@@ -0,0 +1 @@
<table border="1" style="border-collapse: collapse; width: 100%;" data-mce-selected="1"><tbody><tr><td style="width: 50.0518%;">Header 1</td><td style="width: 50.0518%;">Header 2</td></tr><tr><td style="width: 50.0518%;"><br></td><td style="width: 50.0518%;"><ul><li>Check 1</li><li>Check 2</li></ul></td></tr></tbody></table>
@@ -24,7 +24,7 @@ function newPluginService(appVersion = '1.4') {
{
dispatch: () => {},
getState: () => {},
}
},
);
return service;
}
@@ -19,7 +19,7 @@ function newPluginService(appVersion = '1.4') {
{
dispatch: () => {},
getState: () => {},
}
},
);
return service;
}
+1 -1
View File
@@ -19,7 +19,7 @@ export function newPluginService(appVersion = '1.4', options: PluginServiceOptio
{
dispatch: () => {},
getState: options.getState ? options.getState : () => {},
}
},
);
return service;
}
+3 -3
View File
@@ -10,7 +10,7 @@ delete require.cache[require.resolve('./paths')];
const NODE_ENV = process.env.NODE_ENV;
if (!NODE_ENV) {
throw new Error(
'The NODE_ENV environment variable is required but was not specified.'
'The NODE_ENV environment variable is required but was not specified.',
);
}
@@ -36,7 +36,7 @@ dotenvFiles.forEach(dotenvFile => {
require('dotenv-expand')(
require('dotenv').config({
path: dotenvFile,
})
}),
);
}
});
@@ -78,7 +78,7 @@ function getClientEnvironment(publicUrl) {
// This should only be used as an escape hatch. Normally you would put
// images into the `src` and `import` them in code to get their paths.
PUBLIC_URL: publicUrl,
}
},
);
// Stringify all values so we can feed into Webpack DefinePlugin
const stringified = {
+3 -3
View File
@@ -55,8 +55,8 @@ function getAdditionalModulePaths(options = {}) {
throw new Error(
chalk.red.bold(
'Your project\'s `baseUrl` can only be set to `src` or `node_modules`.' +
' Create React App does not support other values at this time.'
)
' Create React App does not support other values at this time.',
),
);
}
@@ -109,7 +109,7 @@ function getModules() {
if (hasTsConfig && hasJsConfig) {
throw new Error(
'You have both a tsconfig.json and a jsconfig.json. If you are using TypeScript please remove your jsconfig.json file.'
'You have both a tsconfig.json and a jsconfig.json. If you are using TypeScript please remove your jsconfig.json file.',
);
}
+1 -1
View File
@@ -55,7 +55,7 @@ const moduleFileExtensions = [
// Resolve file paths in the same order as webpack
const resolveModule = (resolveFn, filePath) => {
const extension = moduleFileExtensions.find(extension =>
fs.existsSync(resolveFn(`${filePath}.${extension}`))
fs.existsSync(resolveFn(`${filePath}.${extension}`)),
);
if (extension) {
+4 -4
View File
@@ -7,14 +7,14 @@ exports.resolveModuleName = (
moduleName,
containingFile,
compilerOptions,
resolutionHost
resolutionHost,
) => {
return resolveModuleName(
moduleName,
containingFile,
compilerOptions,
resolutionHost,
typescript.resolveModuleName
typescript.resolveModuleName,
);
};
@@ -23,13 +23,13 @@ exports.resolveTypeReferenceDirective = (
moduleName,
containingFile,
compilerOptions,
resolutionHost
resolutionHost,
) => {
return resolveModuleName(
moduleName,
containingFile,
compilerOptions,
resolutionHost,
typescript.resolveTypeReferenceDirective
typescript.resolveTypeReferenceDirective,
);
};
+8 -8
View File
@@ -46,15 +46,15 @@ if (process.env.HOST) {
console.log(
chalk.cyan(
`Attempting to bind to HOST environment variable: ${chalk.yellow(
chalk.bold(process.env.HOST)
)}`
)
chalk.bold(process.env.HOST),
)}`,
),
);
console.log(
'If this was unintentional, check that you haven\'t mistakenly set it in your shell.'
'If this was unintentional, check that you haven\'t mistakenly set it in your shell.',
);
console.log(
`Learn more here: ${chalk.yellow('https://bit.ly/CRA-advanced-config')}`
`Learn more here: ${chalk.yellow('https://bit.ly/CRA-advanced-config')}`,
);
console.log();
}
@@ -102,7 +102,7 @@ checkBrowsers(paths.appPath, isInteractive)
// Serve webpack assets generated by the compiler over a web server.
const serverConfig = createDevServerConfig(
proxyConfig,
urls.lanUrlForConfig
urls.lanUrlForConfig,
);
const devServer = new WebpackDevServer(compiler, serverConfig);
// Launch WebpackDevServer.
@@ -120,8 +120,8 @@ checkBrowsers(paths.appPath, isInteractive)
if (process.env.NODE_PATH) {
console.log(
chalk.yellow(
'Setting NODE_PATH to resolve modules absolutely has been deprecated in favor of setting baseUrl in jsconfig.json (or tsconfig.json if you are using TypeScript) and will be removed in a future major release of create-react-app.'
)
'Setting NODE_PATH to resolve modules absolutely has been deprecated in favor of setting baseUrl in jsconfig.json (or tsconfig.json if you are using TypeScript) and will be removed in a future major release of create-react-app.',
),
);
console.log();
}
+1 -1
View File
@@ -74,7 +74,7 @@ const pluginClasses = [
const appDefaultState = createAppDefaultState(
bridge().windowContentSize(),
resourceEditWatcherDefaultState
resourceEditWatcherDefaultState,
);
class Application extends BaseApplication {
@@ -71,36 +71,36 @@ class ClipperConfigScreenComponent extends React.Component {
webClipperStatusComps.push(
<p key="text_1" style={theme.textStyle}>
<b>{_('The web clipper service is enabled and set to auto-start.')}</b>
</p>
</p>,
);
if (this.props.clipperServer.startState === 'started') {
webClipperStatusComps.push(
<p key="text_2" style={theme.textStyle}>
{_('Status: Started on port %d', this.props.clipperServer.port)}
</p>
</p>,
);
} else {
webClipperStatusComps.push(
<p key="text_3" style={theme.textStyle}>
{_('Status: %s', this.props.clipperServer.startState)}
</p>
</p>,
);
}
webClipperStatusComps.push(
<button key="disable_button" style={buttonStyle} onClick={this.disableClipperServer_click}>
{_('Disable Web Clipper Service')}
</button>
</button>,
);
} else {
webClipperStatusComps.push(
<p key="text_4" style={theme.textStyle}>
{_('The web clipper service is not enabled.')}
</p>
</p>,
);
webClipperStatusComps.push(
<button key="enable_button" style={buttonStyle} onClick={this.enableClipperServer_click}>
{_('Enable Web Clipper Service')}
</button>
</button>,
);
}
@@ -21,8 +21,7 @@ import getDefaultPluginsInfo from '@joplin/lib/services/plugins/defaultPlugins/d
import JoplinCloudConfigScreen from '../JoplinCloudConfigScreen';
import ToggleAdvancedSettingsButton from './controls/ToggleAdvancedSettingsButton';
import shouldShowMissingPasswordWarning from '@joplin/lib/components/shared/config/shouldShowMissingPasswordWarning';
import shim from '@joplin/lib/shim';
import StyledLink from '../style/StyledLink';
import MacOSMissingPasswordHelpLink from './controls/MissingPasswordHelpLink';
const { KeymapConfigScreen } = require('../KeymapConfig/KeymapConfigScreen');
const settingKeyToControl: any = {
@@ -190,26 +189,15 @@ class ConfigScreenComponent extends React.Component<any, any> {
// saved yet).
const matchesSavedTarget = settings['sync.target'] === this.props.settings['sync.target'];
if (matchesSavedTarget && shouldShowMissingPasswordWarning(settings['sync.target'], settings)) {
const openMissingPasswordFAQ = () =>
bridge().openExternal('https://joplinapp.org/faq#why-did-my-sync-and-encryption-passwords-disappear-after-updating-joplin');
const macInfoLink = (
<StyledLink href="#"
onClick={openMissingPasswordFAQ}
style={theme.linkStyle}
>
{_('Help')}
</StyledLink>
);
// The FAQ section related to missing passwords is specific to MacOS/ARM -- only show it
// in that case.
const showMacInfoLink = shim.isMac() && process.arch === 'arm64';
settingComps.push(
<p key='missing-password-warning' style={warningStyle}>
{_('Warning: Missing password.')}{' '}{showMacInfoLink ? macInfoLink : null}
</p>
{_('%s: Missing password.', _('Warning'))}
{' '}
<MacOSMissingPasswordHelpLink
theme={theme}
text={_('Help')}
/>
</p>,
);
}
@@ -231,7 +219,7 @@ class ConfigScreenComponent extends React.Component<any, any> {
onClick={this.checkSyncConfig_}
/>
{statusComp}
</div>
</div>,
);
}
}
@@ -393,7 +381,7 @@ class ConfigScreenComponent extends React.Component<any, any> {
items.push(
<option value={e.key.toString()} key={e.key}>
{settingOptions[e.key]}
</option>
</option>,
);
}
@@ -0,0 +1,35 @@
import * as React from 'react';
import shim from '@joplin/lib/shim';
import bridge from '../../../services/bridge';
import StyledLink from '../../style/StyledLink';
interface Props {
theme: any;
text: string;
}
const openMissingPasswordFAQ = () =>
bridge().openExternal('https://joplinapp.org/faq#why-did-my-sync-and-encryption-passwords-disappear-after-updating-joplin');
// A link to a specific part of the FAQ related to passwords being cleared when upgrading
// to a MacOS/ARM release.
const MacOSMissingPasswordHelpLink: React.FunctionComponent<Props> = props => {
const macInfoLink = (
<StyledLink href="#"
onClick={openMissingPasswordFAQ}
style={props.theme.linkStyle}
>
{props.text}
</StyledLink>
);
// The FAQ section related to missing passwords is specific to MacOS/ARM -- only show it
// in that case.
const newArchitectureReleasedRecently = Date.now() <= Date.UTC(2023, 11); // 11 = December
const showMacInfoLink = shim.isMac() && process.arch === 'arm64' && newArchitectureReleasedRecently;
return showMacInfoLink ? macInfoLink : null;
};
export default MacOSMissingPasswordHelpLink;
@@ -29,7 +29,7 @@ const callHook = (isUpdate: boolean, pluginEnabled = true, pluginInstalledViaGUI
},
repoApi,
onPluginSettingsChange,
isUpdate
isUpdate,
);
describe('useOnInstallHandler', () => {
@@ -37,7 +37,7 @@ describe('useOnInstallHandler', () => {
beforeAll(() => {
(PluginService.instance as jest.Mock).mockReturnValue(pluginServiceInstance);
(defaultPluginSetting as jest.Mock).mockImplementation(
jest.requireActual('@joplin/lib/services/plugins/PluginService').defaultPluginSetting
jest.requireActual('@joplin/lib/services/plugins/PluginService').defaultPluginSetting,
);
});
+3 -3
View File
@@ -59,7 +59,7 @@ export default function DialogButtonRow(props: Props) {
buttonComps.push(
<button key={b.name} style={buttonStyle} onClick={() => onCustomButtonClick({ buttonName: b.name })} onKeyDown={onKeyDown}>
{b.label}
</button>
</button>,
);
}
}
@@ -68,7 +68,7 @@ export default function DialogButtonRow(props: Props) {
buttonComps.push(
<button disabled={props.okButtonDisabled} key="ok" style={buttonStyle} onClick={onOkButtonClick} ref={props.okButtonRef} onKeyDown={onKeyDown}>
{props.okButtonLabel ? props.okButtonLabel : _('OK')}
</button>
</button>,
);
}
@@ -76,7 +76,7 @@ export default function DialogButtonRow(props: Props) {
buttonComps.push(
<button disabled={props.cancelButtonDisabled} key="cancel" style={{ ...buttonStyle }} onClick={onCancelButtonClick}>
{props.cancelButtonLabel ? props.cancelButtonLabel : _('Cancel')}
</button>
</button>,
);
}
@@ -17,6 +17,7 @@ import Setting from '@joplin/lib/models/Setting';
import CommandService from '@joplin/lib/services/CommandService';
import { PublicPrivateKeyPair } from '@joplin/lib/services/e2ee/ppk';
import ToggleAdvancedSettingsButton from '../ConfigScreen/controls/ToggleAdvancedSettingsButton';
import MacOSMissingPasswordHelpLink from '../ConfigScreen/controls/MissingPasswordHelpLink';
interface Props {
themeId: any;
@@ -63,7 +64,7 @@ const EncryptionConfigScreen = (props: Props) => {
<tr key={mk.id}>
<td style={theme.textStyle}>{mk.id}</td>
<td><button onClick={() => onUpgradeMasterKey(mk)} style={theme.buttonStyle}>Upgrade</button></td>
</tr>
</tr>,
);
}
@@ -252,7 +253,16 @@ const EncryptionConfigScreen = (props: Props) => {
const buttonTitle = CommandService.instance().label('openMasterPasswordDialog');
const needPasswordMessage = !needMasterPassword ? null : (
<p className="needpassword">{_('Your password is needed to decrypt some of your data.')}<br/>{_('Please click on "%s" to proceed, or set the passwords in the "%s" list below.', buttonTitle, _('Encryption keys'))}</p>
<p className="needpassword">
{_('Your password is needed to decrypt some of your data.')}
<br/>
{_('Please click on "%s" to proceed, or set the passwords in the "%s" list below.', buttonTitle, _('Encryption keys'))}
<br/>
<MacOSMissingPasswordHelpLink
theme={theme}
text={_('%s: Missing password', _('Help'))}
/>
</p>
);
return (
@@ -299,7 +309,7 @@ const EncryptionConfigScreen = (props: Props) => {
rows.push(
<tr key={id}>
<td style={theme.textStyle}>{id}</td>
</tr>
</tr>,
);
}
+5 -5
View File
@@ -89,14 +89,14 @@ export default class ErrorBoundary extends React.Component<Props, State> {
<section key="message">
<h2>Message</h2>
<p>{this.state.error.message}</p>
</section>
</section>,
);
output.push(
<section key="versionInfo">
<h2>Version info</h2>
<pre>{versionInfo(packageInfo, this.state.plugins).message}</pre>
</section>
</section>,
);
if (this.state.pluginInfos.length) {
@@ -104,7 +104,7 @@ export default class ErrorBoundary extends React.Component<Props, State> {
<section key="pluginSettings">
<h2>Plugins</h2>
<pre>{JSON.stringify(this.state.pluginInfos, null, 4)}</pre>
</section>
</section>,
);
}
@@ -113,7 +113,7 @@ export default class ErrorBoundary extends React.Component<Props, State> {
<section key="stacktrace">
<h2>Stack trace</h2>
<pre>{this.state.error.stack}</pre>
</section>
</section>,
);
}
@@ -123,7 +123,7 @@ export default class ErrorBoundary extends React.Component<Props, State> {
<section key="componentStack">
<h2>Component stack</h2>
<pre>{this.state.errorInfo.componentStack}</pre>
</section>
</section>,
);
}
}
+1 -1
View File
@@ -53,7 +53,7 @@ const styleSelector = createSelector(
};
return output;
}
},
);
function platformAssets(type: string) {
+1 -1
View File
@@ -42,7 +42,7 @@ class ImportScreenComponent extends React.Component<Props, State> {
},
() => {
void this.doImport();
}
},
);
}
}
@@ -88,7 +88,7 @@ export const KeymapConfigScreen = ({ themeId }: KeymapConfigScreenProps) => {
<div>
{accelerator.split('+').map(part => <kbd style={styles.kbd} key={part}>{part}</kbd>).reduce(
(accumulator, part) => (accumulator.length ? [...accumulator, ' + ', part] : [part]),
[]
[],
)}
</div>
);
@@ -12,7 +12,7 @@ const useCommandStatus = (): [CommandStatus, (commandName: string)=> void, (comm
keymapService.getCommandNames().reduce((accumulator: CommandStatus, command: string) => {
accumulator[command] = false;
return accumulator;
}, {})
}, {}),
);
const disableStatus = (commandName: string) => setStatus(prevStatus => ({ ...prevStatus, [commandName]: false }));
@@ -608,37 +608,37 @@ class MainScreenComponent extends React.Component<Props, State> {
msg = this.renderNotificationMessage(
_('Safe mode is currently active. Note rendering and all plugins are temporarily disabled.'),
_('Disable safe mode and restart'),
onDisableSafeModeAndRestart
onDisableSafeModeAndRestart,
);
} else if (this.props.hasMissingSyncCredentials) {
msg = this.renderNotificationMessage(
_('The synchronisation password is missing.'),
_('Set the password'),
onViewSyncSettingsScreen
onViewSyncSettingsScreen,
);
} else if (this.props.shouldUpgradeSyncTarget) {
msg = this.renderNotificationMessage(
_('The sync target needs to be upgraded before Joplin can sync. The operation may take a few minutes to complete and the app needs to be restarted. To proceed please click on the link.'),
_('Restart and upgrade'),
onRestartAndUpgrade
onRestartAndUpgrade,
);
} else if (this.props.hasDisabledEncryptionItems) {
msg = this.renderNotificationMessage(
_('Some items cannot be decrypted.'),
_('View them now'),
onViewStatusScreen
onViewStatusScreen,
);
} else if (this.props.showNeedUpgradingMasterKeyMessage) {
msg = this.renderNotificationMessage(
_('One of your master keys use an obsolete encryption method.'),
_('View them now'),
onViewEncryptionConfigScreen
onViewEncryptionConfigScreen,
);
} else if (this.props.showShouldReencryptMessage) {
msg = this.renderNotificationMessage(
_('The default encryption method has been changed, you should re-encrypt your data.'),
_('More info'),
onViewEncryptionConfigScreen
onViewEncryptionConfigScreen,
);
} else if (this.showShareInvitationNotification(this.props)) {
const invitation = this.props.shareInvitations.find(inv => inv.status === 0);
@@ -649,25 +649,25 @@ class MainScreenComponent extends React.Component<Props, State> {
_('Accept'),
() => onInvitationRespond(invitation.id, invitation.share.folder_id, invitation.master_key, true),
_('Reject'),
() => onInvitationRespond(invitation.id, invitation.share.folder_id, invitation.master_key, false)
() => onInvitationRespond(invitation.id, invitation.share.folder_id, invitation.master_key, false),
);
} else if (this.props.hasDisabledSyncItems) {
msg = this.renderNotificationMessage(
_('Some items cannot be synchronised.'),
_('View them now'),
onViewStatusScreen
onViewStatusScreen,
);
} else if (this.props.showMissingMasterKeyMessage) {
msg = this.renderNotificationMessage(
_('One or more master keys need a password.'),
_('Set the password'),
onViewEncryptionConfigScreen
onViewEncryptionConfigScreen,
);
} else if (this.props.showInstallTemplatesPlugin) {
msg = this.renderNotificationMessage(
'The template feature has been moved to a plugin called "Templates".',
'Install plugin',
onViewPluginScreen
onViewPluginScreen,
);
}
@@ -3,7 +3,8 @@ import shim from '@joplin/lib/shim';
import { _ } from '@joplin/lib/locale';
import bridge from '../../../services/bridge';
import { openItemById } from '../../NoteEditor/utils/contextMenu';
const { parseResourceUrl, urlProtocol, fileUriToPath } = require('@joplin/lib/urlUtils');
const { parseResourceUrl, urlProtocol } = require('@joplin/lib/urlUtils');
import { fileUriToPath } from '@joplin/utils/url';
const { urlDecode } = require('@joplin/lib/string-utils');
export const declaration: CommandDeclaration = {
+4 -4
View File
@@ -301,7 +301,7 @@ function useMenu(props: Props) {
return menuUtils.commandsToMenuItems(
commandNames.concat(pluginCommandNames),
(commandName: string) => onMenuItemClickRef.current(commandName),
props.locale
props.locale,
);
// eslint-disable-next-line @seiyab/react-hooks/exhaustive-deps -- Old code before rule was applied
}, [commandNames, pluginCommandNames, props.locale]);
@@ -347,7 +347,7 @@ function useMenu(props: Props) {
if (type === 'notes') {
sortItems.push(
{ ...menuItemDic.toggleNotesSortOrderReverse, type: 'checkbox' },
{ ...menuItemDic.toggleNotesSortOrderField, visible: false }
{ ...menuItemDic.toggleNotesSortOrderField, visible: false },
);
} else {
sortItems.push({
@@ -391,7 +391,7 @@ function useMenu(props: Props) {
{
plugins: pluginsRef.current,
customCss: props.customCss,
}
},
);
},
});
@@ -414,7 +414,7 @@ function useMenu(props: Props) {
});
exportItems.push(
menuItemDic.exportPdf
menuItemDic.exportPdf,
);
// We need a dummy entry, otherwise the ternary operator to show a
@@ -68,7 +68,7 @@ export default function MultiNoteActions(props: MultiNoteActionsProps) {
itemComps.push(
<button key={item.label} style={styles.button} onClick={() => multiNotesButton_click(item)}>
{item.label}
</button>
</button>,
);
}
@@ -838,7 +838,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
click: async () => {
editorCutText();
},
})
}),
);
menu.append(
@@ -848,7 +848,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
click: async () => {
editorCopyText();
},
})
}),
);
menu.append(
@@ -858,7 +858,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
click: async () => {
editorPaste();
},
})
}),
);
const spellCheckerMenuItems = SpellCheckerService.instance().contextMenuItems(params.misspelledWord, params.dictionarySuggestions);
@@ -444,9 +444,7 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
.tox .tox-tbtn {
width: ${theme.toolbarHeight}px;
height: ${theme.toolbarHeight}px;
min-width: ${theme.toolbarHeight}px;
min-height: ${theme.toolbarHeight}px;
margin: 0;
}
@@ -750,13 +748,13 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
].concat(
pluginAssets
.filter((a: any) => a.mime === 'text/css')
.map((a: any) => a.path)
.map((a: any) => a.path),
);
const allJsFiles = [].concat(
pluginAssets
.filter((a: any) => a.mime === 'application/javascript')
.map((a: any) => a.path)
.map((a: any) => a.path),
);
@@ -1,10 +1,15 @@
import Setting from '@joplin/lib/models/Setting';
import { processPastedHtml } from './resourceHandling';
describe('resourceHandling', () => {
it('should sanitize pasted HTML', async () => {
Setting.setConstant('resourceDir', '/home/.config/joplin/resources');
const testCases = [
['Test: <style onload="evil()"></style>', 'Test: <style></style>'],
['<a href="javascript: alert()">test</a>', '<a href="#">test</a>'],
['<a href="file:///home/.config/joplin/resources/test.pdf">test</a>', '<a href="file:///home/.config/joplin/resources/test.pdf">test</a>'],
['<a href="file:///etc/passwd">evil.pdf</a>', '<a href="#">evil.pdf</a>'],
['<script >evil()</script>', ''],
['<script>evil()</script>', ''],
[
@@ -8,7 +8,7 @@ import ResourceFetcher from '@joplin/lib/services/ResourceFetcher';
import htmlUtils from '@joplin/lib/htmlUtils';
import rendererHtmlUtils, { extractHtmlBody } from '@joplin/renderer/htmlUtils';
import Logger from '@joplin/utils/Logger';
const { fileUriToPath } = require('@joplin/lib/urlUtils');
import { fileUriToPath } from '@joplin/utils/url';
const joplinRendererUtils = require('@joplin/renderer').utils;
const { clipboard } = require('electron');
const mimeUtils = require('@joplin/lib/mime-utils.js').mime;
@@ -179,6 +179,8 @@ export async function processPastedHtml(html: string) {
return extractHtmlBody(rendererHtmlUtils.sanitizeHtml(
htmlUtils.replaceImageUrls(html, (src: string) => {
return mappedResources[src];
})
}), {
allowedFilePrefixes: [Setting.value('resourceDir')],
},
));
}
@@ -56,7 +56,7 @@ const NoteList = (props: Props) => {
props.notes.length,
itemSize,
props.size,
listRef
listRef,
);
const [startNoteIndex, endNoteIndex, startLineIndex, endLineIndex, totalLineCount, visibleItemCount] = useVisibleRange(
@@ -64,7 +64,7 @@ const NoteList = (props: Props) => {
scrollTop,
props.size,
itemSize,
props.notes.length
props.notes.length,
);
const focusNote = useFocusNote(itemRefs);
@@ -76,7 +76,7 @@ const NoteList = (props: Props) => {
props.selectedFolderId,
props.uncompletedTodosOnTop,
props.showCompletedTodos,
props.notes
props.notes,
);
const renderedNotes = useRenderedNotes(
@@ -86,7 +86,7 @@ const NoteList = (props: Props) => {
props.selectedNoteIds,
listRenderer,
props.highlightedWords,
props.watchedNoteFiles
props.watchedNoteFiles,
);
const noteItemStyle = useMemo(() => {
@@ -115,7 +115,7 @@ const NoteList = (props: Props) => {
visibleItemCount,
props.notes.length,
listRenderer.flow,
itemsPerLine
itemsPerLine,
);
useItemCss(listRenderer.itemCss);
@@ -134,7 +134,7 @@ const NoteList = (props: Props) => {
props.dispatch,
props.watchedNoteFiles,
props.plugins,
props.customCss
props.customCss,
);
const { onDragStart, onDragOver, onDrop, dragOverTargetNoteIndex } = useDragAndDrop(props.parentFolderIsReadOnly,
@@ -148,7 +148,7 @@ const NoteList = (props: Props) => {
props.uncompletedTodosOnTop,
props.showCompletedTodos,
listRenderer.flow,
itemsPerLine
itemsPerLine,
);
const previousSelectedNoteIds = usePrevious(props.selectedNoteIds, []);
@@ -220,7 +220,7 @@ const NoteList = (props: Props) => {
highlightedWords={highlightedWords}
isProvisional={props.provisionalNoteIds.includes(note.id)}
flow={listRenderer.flow}
/>
/>,
);
}
@@ -17,7 +17,7 @@ const useDragAndDrop = (
uncompletedTodosOnTop: boolean,
showCompletedTodos: boolean,
flow: ItemFlow,
itemsPerLine: number
itemsPerLine: number,
) => {
const [dragOverTargetNoteIndex, setDragOverTargetNoteIndex] = useState(null);
@@ -19,7 +19,7 @@ const useOnKeyDown = (
visibleItemCount: number,
noteCount: number,
flow: ItemFlow,
itemsPerLine: number
itemsPerLine: number,
) => {
const scrollNoteIndex = useCallback((visibleItemCount: number, key: KeyboardEventKey, ctrlKey: boolean, metaKey: boolean, noteIndex: number) => {
if (flow === ItemFlow.TopToBottom) {
@@ -47,7 +47,7 @@ const useRenderedNotes = (startNoteIndex: number, endNoteIndex: number, notes: N
listRenderer.itemSize,
isSelected,
titleHtml,
isWatched
isWatched,
);
const view = await listRenderer.onRenderNote(viewProps);
@@ -51,7 +51,7 @@ describe('useVisibleRange', () => {
listSize,
itemSize,
noteCount,
flow
flow,
));
expect(result.current).toEqual(expected);
@@ -55,7 +55,7 @@ const NoteListItem = (props: NoteItemProps, ref: LegacyRef<HTMLDivElement>) => {
props.style,
props.itemSize,
props.onClick,
props.flow
props.flow,
);
useItemEventHandlers(rootElement, itemElement, onCheckboxChange);
@@ -13,7 +13,7 @@ const useOnContextMenu = (
dispatch: Dispatch,
watchedNoteFiles: string[],
plugins: PluginStates,
customCss: string
customCss: string,
) => {
return useCallback((event: any) => {
const currentNoteId = event.currentTarget.getAttribute('data-id');
@@ -231,7 +231,7 @@ class NotePropertiesDialog extends React.Component<Props, State> {
},
() => {
resolve();
}
},
);
});
}
@@ -88,7 +88,7 @@ class NoteRevisionViewerComponent extends React.PureComponent<Props, State> {
},
() => {
void this.reloadNote();
}
},
);
}
@@ -116,7 +116,7 @@ class NoteRevisionViewerComponent extends React.PureComponent<Props, State> {
},
() => {
void this.reloadNote();
}
},
);
}
}
@@ -198,7 +198,7 @@ class NoteRevisionViewerComponent extends React.PureComponent<Props, State> {
revisionListItems.push(
<option key={rev.id} value={rev.id}>
{`${time.formatMsToLocal(rev.item_updated_time)} (${stats})`}
</option>
</option>,
);
}
+4 -4
View File
@@ -275,28 +275,28 @@ export default class PromptDialog extends React.Component<Props, any> {
buttonComps.push(
<button key="create" disabled={!this.state.answer} style={styles.button} onClick={() => onClose(true, 'create')}>
{_('Create')}
</button>
</button>,
);
}
if (buttonTypes.indexOf('ok') >= 0) {
buttonComps.push(
<button key="ok" disabled={!this.state.answer} style={styles.button} onClick={() => onClose(true, 'ok')}>
{_('OK')}
</button>
</button>,
);
}
if (buttonTypes.indexOf('cancel') >= 0) {
buttonComps.push(
<button key="cancel" style={styles.button} onClick={() => onClose(false, 'cancel')}>
{_('Cancel')}
</button>
</button>,
);
}
if (buttonTypes.indexOf('clear') >= 0) {
buttonComps.push(
<button key="clear" style={styles.button} onClick={() => onClose(false, 'clear')}>
{_('Clear')}
</button>
</button>,
);
}
+1 -1
View File
@@ -111,7 +111,7 @@ const ResourceTableComp = (props: ResourceTable) => {
<td style={cellStyle} className="dataCell">
<button style={theme.buttonStyle} onClick={() => props.onResourceDelete(resource)}>{_('Delete')}</button>
</td>
</tr>
</tr>,
)}
</tbody>
</table>
+1 -1
View File
@@ -267,5 +267,5 @@ root.render(
<ErrorBoundary>
<Root />
</ErrorBoundary>
</Provider>
</Provider>,
);
+15 -15
View File
@@ -280,7 +280,7 @@ const SidebarComponent = (props: Props) => {
const menu = new Menu();
menu.append(
new MenuItem(menuUtils.commandToStatefulMenuItem('newFolder'))
new MenuItem(menuUtils.commandToStatefulMenuItem('newFolder')),
);
menu.popup({ window: bridge().window() });
@@ -314,13 +314,13 @@ const SidebarComponent = (props: Props) => {
if (itemType === BaseModel.TYPE_FOLDER && !item.encryption_applied) {
menu.append(
new MenuItem(menuUtils.commandToStatefulMenuItem('newFolder', itemId))
new MenuItem(menuUtils.commandToStatefulMenuItem('newFolder', itemId)),
);
}
if (itemType === BaseModel.TYPE_FOLDER) {
menu.append(
new MenuItem(menuUtils.commandToStatefulMenuItem('deleteFolder', itemId))
new MenuItem(menuUtils.commandToStatefulMenuItem('deleteFolder', itemId)),
);
} else {
menu.append(
@@ -342,7 +342,7 @@ const SidebarComponent = (props: Props) => {
});
}
},
})
}),
);
}
@@ -364,7 +364,7 @@ const SidebarComponent = (props: Props) => {
click: async () => {
await InteropServiceHelper.export(props.dispatch, module, { sourceFolderIds: [itemId], plugins: pluginsRef.current });
},
})
}),
);
}
@@ -386,7 +386,7 @@ const SidebarComponent = (props: Props) => {
new MenuItem({
label: _('Export'),
submenu: exportMenu,
})
}),
);
if (Setting.value('notes.perFolderSortOrderEnabled')) {
menu.append(new MenuItem({
@@ -404,13 +404,13 @@ const SidebarComponent = (props: Props) => {
click: () => {
clipboard.writeText(getFolderCallbackUrl(itemId));
},
})
}),
);
}
if (itemType === BaseModel.TYPE_TAG) {
menu.append(new MenuItem(
menuUtils.commandToStatefulMenuItem('renameTag', itemId)
menuUtils.commandToStatefulMenuItem('renameTag', itemId),
));
menu.append(
new MenuItem({
@@ -418,7 +418,7 @@ const SidebarComponent = (props: Props) => {
click: () => {
clipboard.writeText(getTagCallbackUrl(itemId));
},
})
}),
);
}
@@ -431,7 +431,7 @@ const SidebarComponent = (props: Props) => {
itemType === ModelType.Folder && location === MenuItemLocation.FolderContextMenu
) {
menu.append(
new MenuItem(menuUtils.commandToStatefulMenuItem(view.commandName, itemId))
new MenuItem(menuUtils.commandToStatefulMenuItem(view.commandName, itemId)),
);
}
}
@@ -705,7 +705,7 @@ const SidebarComponent = (props: Props) => {
onDrop: onFolderDrop_,
['data-folder-id']: '',
toggleblock: 1,
})
}),
);
const foldersStyle = useMemo(() => {
@@ -725,14 +725,14 @@ const SidebarComponent = (props: Props) => {
style={foldersStyle}
>
{folderItems}
</div>
</div>,
);
}
items.push(
renderHeader('tagHeader', _('Tags'), 'icon-tags', null, null, {
toggleblock: 1,
})
}),
);
if (props.tags.length) {
@@ -743,7 +743,7 @@ const SidebarComponent = (props: Props) => {
items.push(
<div className="tags" key="tag_items" style={{ display: props.tagHeaderIsExpanded ? 'block' : 'none' }}>
{tagItems}
</div>
</div>,
);
}
@@ -765,7 +765,7 @@ const SidebarComponent = (props: Props) => {
syncReportText.push(
<StyledSyncReportText key={i}>
{lines[i]}
</StyledSyncReportText>
</StyledSyncReportText>,
);
}
@@ -133,14 +133,14 @@ function StatusScreen(props: Props) {
<li style={theme.textStyle} key={`item_${n}`}>
<span>{text}</span>
{retryLink}
</li>
</li>,
);
} else {
itemsHtml.push(
<div style={theme.textStyle} key={`item_${n}`}>
<span>{text}</span>
{retryLink}
</div>
</div>,
);
}
}
+1 -1
View File
@@ -112,7 +112,7 @@ markJsUtils.markKeyword = (mark, keyword, stringUtils, extraOptions = null) => {
return true;
},
...extraOptions,
}
},
);
};
@@ -46,7 +46,7 @@ const style = createSelector(
output.buttonLabelSelected = { ...output.buttonLabel, color: theme.color };
return output;
}
},
);
module.exports = style;
+17 -17
View File
@@ -45,15 +45,15 @@ export default class NoteListUtils {
if (!hasEncrypted) {
menu.append(
new MenuItem(menuUtils.commandToStatefulMenuItem('setTags', noteIds) as any)
new MenuItem(menuUtils.commandToStatefulMenuItem('setTags', noteIds) as any),
);
menu.append(
new MenuItem(menuUtils.commandToStatefulMenuItem('moveToFolder', noteIds) as any)
new MenuItem(menuUtils.commandToStatefulMenuItem('moveToFolder', noteIds) as any),
);
menu.append(
new MenuItem(menuUtils.commandToStatefulMenuItem('duplicateNote', noteIds) as any)
new MenuItem(menuUtils.commandToStatefulMenuItem('duplicateNote', noteIds) as any),
);
if (singleNoteId) {
@@ -64,8 +64,8 @@ export default class NoteListUtils {
if (noteIds.length <= 1) {
menu.append(
new MenuItem(
menuUtils.commandToStatefulMenuItem('toggleNoteType', noteIds) as any
)
menuUtils.commandToStatefulMenuItem('toggleNoteType', noteIds) as any,
),
);
} else {
const switchNoteType = async (noteIds: string[], type: string) => {
@@ -84,7 +84,7 @@ export default class NoteListUtils {
click: async () => {
await switchNoteType(noteIds, 'note');
},
})
}),
);
menu.append(
@@ -93,7 +93,7 @@ export default class NoteListUtils {
click: async () => {
await switchNoteType(noteIds, 'todo');
},
})
}),
);
}
@@ -108,7 +108,7 @@ export default class NoteListUtils {
}
clipboard.writeText(links.join(' '));
},
})
}),
);
if (noteIds.length === 1) {
@@ -118,15 +118,15 @@ export default class NoteListUtils {
click: () => {
clipboard.writeText(getNoteCallbackUrl(noteIds[0]));
},
})
}),
);
}
if ([9, 10].includes(Setting.value('sync.target'))) {
menu.append(
new MenuItem(
menuUtils.commandToStatefulMenuItem('showShareNoteDialog', noteIds.slice()) as any
)
menuUtils.commandToStatefulMenuItem('showShareNoteDialog', noteIds.slice()) as any,
),
);
}
@@ -150,14 +150,14 @@ export default class NoteListUtils {
customCss: props.customCss,
});
},
})
}),
);
}
exportMenu.append(
new MenuItem(
menuUtils.commandToStatefulMenuItem('exportPdf', noteIds) as any
)
menuUtils.commandToStatefulMenuItem('exportPdf', noteIds) as any,
),
);
const exportMenuItem = new MenuItem({ label: _('Export'), submenu: exportMenu });
@@ -167,8 +167,8 @@ export default class NoteListUtils {
menu.append(
new MenuItem(
menuUtils.commandToStatefulMenuItem('deleteNote', noteIds) as any
)
menuUtils.commandToStatefulMenuItem('deleteNote', noteIds) as any,
),
);
const pluginViewInfos = pluginUtils.viewInfosByType(props.plugins, 'menuItem');
@@ -179,7 +179,7 @@ export default class NoteListUtils {
if (cmdService.isEnabled(info.view.commandName)) {
menu.append(
new MenuItem(menuUtils.commandToStatefulMenuItem(info.view.commandName, noteIds) as any)
new MenuItem(menuUtils.commandToStatefulMenuItem(info.view.commandName, noteIds) as any),
);
}
}
+1 -1
View File
@@ -31,7 +31,7 @@ const tasks = {
fn: async () => {
await compileSass(
`${__dirname}/style.scss`,
`${__dirname}/style.min.css`
`${__dirname}/style.min.css`,
);
},
},
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@joplin/app-desktop",
"version": "2.12.11",
"version": "2.12.14",
"description": "Joplin for Desktop",
"main": "main.js",
"private": true,
@@ -160,7 +160,7 @@
"node-notifier": "10.0.1",
"node-rsa": "1.1.1",
"pretty-bytes": "5.6.0",
"re-resizable": "6.9.9",
"re-resizable": "6.9.11",
"react": "18.2.0",
"react-datetime": "3.2.0",
"react-dom": "18.2.0",
@@ -108,7 +108,7 @@ function UserWebview(props: Props, ref: any) {
frameWindow(),
isReady,
postMessage,
props.html
props.html,
);
const contentSize = useContentSize(
@@ -117,14 +117,14 @@ function UserWebview(props: Props, ref: any) {
minWidth,
minHeight,
props.fitToContent,
isReady
isReady,
);
useSubmitHandler(
frameWindow(),
props.onSubmit,
props.onDismiss,
htmlHash
htmlHash,
);
useWebviewToPluginMessages(
@@ -132,14 +132,14 @@ function UserWebview(props: Props, ref: any) {
isReady,
props.pluginId,
props.viewId,
postMessage
postMessage,
);
useScriptLoader(
postMessage,
isReady,
props.scripts,
cssFilePath
cssFilePath,
);
return <StyledFrame
@@ -0,0 +1,21 @@
import { renderHook } from '@testing-library/react-hooks';
import useThemeCss from './useThemeCss';
import Setting from '@joplin/lib/models/Setting';
describe('useThemeCss', () => {
it('should return a different path when the theme changes', async () => {
const hookResult = renderHook(useThemeCss, {
initialProps: { pluginId: 'testid', themeId: Setting.THEME_DARK },
});
await hookResult.waitFor(() => {
expect(hookResult.result.current).toContain(`plugin_testid_theme_${Setting.THEME_DARK}.css`);
});
hookResult.rerender({ pluginId: 'testid', themeId: Setting.THEME_LIGHT });
await hookResult.waitFor(() => {
expect(hookResult.result.current).toContain(`plugin_testid_theme_${Setting.THEME_LIGHT}.css`);
});
});
});
@@ -36,16 +36,18 @@ export default function useThemeCss(dep: HookDependencies) {
const [cssFilePath, setCssFilePath] = useState('');
useEffect(() => {
if (cssFilePath) return () => {};
let cancelled = false;
async function createThemeStyleSheet() {
const theme = themeStyle(themeId);
const css = themeToCssVariables(theme);
const filePath = `${Setting.value('tempDir')}/plugin_${pluginId}_theme_${themeId}.css`;
await shim.fsDriver().writeFile(filePath, css, 'utf8');
if (cancelled) return;
if (!(await shim.fsDriver().exists(filePath))) {
await shim.fsDriver().writeFile(filePath, css, 'utf8');
if (cancelled) return;
}
setCssFilePath(filePath);
}
@@ -54,7 +56,7 @@ export default function useThemeCss(dep: HookDependencies) {
return () => {
cancelled = true;
};
}, [pluginId, themeId, cssFilePath]);
}, [pluginId, themeId]);
return cssFilePath;
}
+5 -5
View File
@@ -110,11 +110,11 @@ android {
applicationId "net.cozic.joplin"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 2097718
versionName "2.12.1"
// ndk {
// abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
// }
versionCode 2097719
versionName "2.12.2"
ndk {
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}
// https://github.com/react-native-community/react-native-camera/issues/2138
missingDimensionStrategy 'react-native-camera', 'general'
@@ -0,0 +1,56 @@
import * as React from 'react';
import { describe, it, expect, jest } from '@jest/globals';
import { fireEvent, render, screen, waitFor } from '@testing-library/react-native';
import '@testing-library/jest-native';
import Dropdown, { DropdownListItem } from './Dropdown';
describe('Dropdown', () => {
it('should open the dropdown on click', async () => {
const items: DropdownListItem[] = [];
for (let i = 0; i < 400; i++) {
items.push({ label: `Item ${i}`, value: `${i}` });
}
const onValueChange = jest.fn();
render(
<Dropdown
items={items}
selectedValue={'1'}
onValueChange={onValueChange}
/>,
);
// Should initially not show any other items
expect(screen.queryByText('Item 3')).toBeNull();
expect(screen.queryByText('Item 4')).toBeNull();
const openButton = screen.getByText('Item 1');
fireEvent.press(openButton);
// Other items should now be shown
await waitFor(() => {
expect(screen.getByText('Item 3')).not.toBeNull();
expect(screen.getByText('Item 4')).not.toBeNull();
});
// Pressing one of these items should hide the dropdown
fireEvent.press(screen.getByText('Item 4'));
// We haven't changed the selectedValue, so Item 301 should no longer be visible
await waitFor(() => {
expect(screen.queryByText('Item 4')).toBeNull();
});
expect(onValueChange).toHaveBeenLastCalledWith('4');
// The dropdown should still be clickable
fireEvent.press(screen.getByText('Item 1'));
await waitFor(() => {
expect(screen.queryByText('Item 2')).not.toBeNull();
});
});
});
+10 -7
View File
@@ -1,8 +1,7 @@
const React = require('react');
import { TouchableOpacity, TouchableWithoutFeedback, Dimensions, Text, Modal, View, LayoutRectangle, ViewStyle, TextStyle } from 'react-native';
import { TouchableOpacity, TouchableWithoutFeedback, Dimensions, Text, Modal, View, LayoutRectangle, ViewStyle, TextStyle, FlatList } from 'react-native';
import { Component } from 'react';
import { _ } from '@joplin/lib/locale';
const { ItemList } = require('./ItemList.js');
type ValueType = string;
export interface DropdownListItem {
@@ -122,7 +121,7 @@ class Dropdown extends Component<DropdownProps, DropdownState> {
this.setState({ listVisible: false });
};
const itemRenderer = (item: DropdownListItem) => {
const itemRenderer = ({ item }: { item: DropdownListItem }) => {
const key = item.value ? item.value.toString() : '__null'; // The top item ("Move item to notebook...") has a null value.
return (
<TouchableOpacity
@@ -194,11 +193,15 @@ class Dropdown extends Component<DropdownProps, DropdownState> {
<View
accessibilityRole='menu'
style={wrapperStyle}>
<ItemList
<FlatList
style={itemListStyle}
items={this.props.items}
itemHeight={itemHeight}
itemRenderer={itemRenderer}
data={this.props.items}
renderItem={itemRenderer}
getItemLayout={(_data, index) => ({
length: itemHeight,
offset: itemHeight * index,
index,
})}
/>
</View>
@@ -32,7 +32,7 @@ const FolderPicker: FunctionComponent<FolderPickerProps> = ({
const theme = themeStyle(themeId);
const addFolderChildren = (
folders: FolderEntityWithChildren[], pickerItems: DropdownListItem[], indent: number
folders: FolderEntityWithChildren[], pickerItems: DropdownListItem[], indent: number,
) => {
folders.sort((a, b) => {
const aTitle = a && a.title ? a.title : '';
-110
View File
@@ -1,110 +0,0 @@
const React = require('react');
const { View, ScrollView } = require('react-native');
class ItemList extends React.Component {
constructor() {
super();
this.scrollTop_ = 0;
}
itemCount(props = null) {
if (props === null) props = this.props;
return this.props.items ? this.props.items.length : this.props.itemComponents.length;
}
updateStateItemIndexes(props = null, height = null) {
if (props === null) props = this.props;
if (height === null) {
if (!this.state) return;
height = this.state.height;
}
const topItemIndex = Math.max(0, Math.floor(this.scrollTop_ / props.itemHeight));
const visibleItemCount = Math.ceil(height / props.itemHeight);
let bottomItemIndex = topItemIndex + visibleItemCount - 1;
if (bottomItemIndex >= this.itemCount(props)) bottomItemIndex = this.itemCount(props) - 1;
this.setState({
topItemIndex: topItemIndex,
bottomItemIndex: bottomItemIndex,
});
}
UNSAFE_componentWillMount() {
this.setState({
topItemIndex: 0,
bottomItemIndex: 0,
height: 0,
itemHeight: this.props.itemHeight ? this.props.itemHeight : 0,
});
this.updateStateItemIndexes();
}
UNSAFE_componentWillReceiveProps(newProps) {
if (newProps.itemHeight) {
this.setState({
itemHeight: newProps.itemHeight,
});
}
this.updateStateItemIndexes(newProps);
}
onScroll(event) {
this.scrollTop_ = Math.floor(event.nativeEvent.contentOffset.y);
this.updateStateItemIndexes();
}
onLayout(event) {
this.setState({ height: event.nativeEvent.layout.height });
this.updateStateItemIndexes(null, event.nativeEvent.layout.height);
}
render() {
const style = this.props.style ? this.props.style : {};
// if (!this.props.itemHeight) throw new Error('itemHeight is required');
let itemComps = [];
if (this.props.items) {
const items = this.props.items;
const blankItem = function(key, height) {
return <View key={key} style={{ height: height }}></View>;
};
itemComps = [blankItem('top', this.state.topItemIndex * this.props.itemHeight)];
for (let i = this.state.topItemIndex; i <= this.state.bottomItemIndex; i++) {
const itemComp = this.props.itemRenderer(items[i]);
itemComps.push(itemComp);
}
itemComps.push(blankItem('bottom', (items.length - this.state.bottomItemIndex - 1) * this.props.itemHeight));
} else {
itemComps = this.props.itemComponents;
}
return (
<ScrollView
scrollEventThrottle={500}
onLayout={event => {
this.onLayout(event);
}}
style={style}
onScroll={event => {
this.onScroll(event);
}}
>
{itemComps}
</ScrollView>
);
}
}
module.exports = { ItemList };
@@ -43,12 +43,12 @@ export default function NoteBodyViewer(props: Props) {
props.highlightedKeywords,
props.noteResources,
props.paddingBottom,
props.noteHash
props.noteHash,
);
const onResourceLongPress = useOnResourceLongPress(
props.onJoplinLinkClick,
dialogBoxRef
dialogBoxRef,
);
const onMessage = useOnMessage(
@@ -56,7 +56,7 @@ export default function NoteBodyViewer(props: Props) {
props.noteBody,
props.onMarkForDownload,
props.onJoplinLinkClick,
onResourceLongPress
onResourceLongPress,
);
const onLoadEnd = useCallback(() => {
@@ -125,7 +125,7 @@ export default function useSource(noteBody: string, noteMarkupLanguage: number,
noteMarkupLanguage,
bodyToRender,
rendererTheme,
mdOptions
mdOptions,
);
if (cancelled) return;
@@ -194,6 +194,12 @@ export default function useSource(noteBody: string, noteMarkupLanguage: number,
padding: 0;
}
`;
const defaultCss = `
code {
white-space: pre-wrap;
overflow-x: hidden;
}
`;
html =
`
@@ -203,7 +209,7 @@ export default function useSource(noteBody: string, noteMarkupLanguage: number,
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
${shim.mobilePlatform() === 'ios' ? iOSSpecificCss : ''}
${shim.mobilePlatform() === 'ios' ? `${iOSSpecificCss}\n${defaultCss}` : defaultCss}
</style>
${assetsToHeaders(result.pluginAssets, { asHtml: true })}
</head>
@@ -51,7 +51,7 @@ interface CodeMirrorResult extends CodeMirrorControl {
}
export function initCodeMirror(
parentElement: any, initialText: string, settings: EditorSettings
parentElement: any, initialText: string, settings: EditorSettings,
): CodeMirrorResult {
logMessage('Initializing CodeMirror...');
const theme = settings.themeData;
@@ -82,7 +82,7 @@ const computeDecorations = (view: EditorView) => {
for (const { from, to } of view.visibleRanges) {
ensureSyntaxTree(
view.state,
to
to,
)?.iterate({
from, to,
enter: node => {
@@ -4,6 +4,9 @@ import createEditor from './testUtil/createEditor';
import { toggleList } from './markdownCommands';
describe('markdownCommands.bulletedVsChecklist', () => {
jest.retryTimes(2);
const bulletedListPart = '- Test\n- This is a test.\n- 3\n- 4\n- 5';
const checklistPart = '- [ ] This is a checklist\n- [ ] with multiple items.\n- [ ] ☑';
const initialDocText = `${bulletedListPart}\n\n${checklistPart}`;
@@ -11,35 +14,35 @@ describe('markdownCommands.bulletedVsChecklist', () => {
it('should remove a checklist following a bulleted list without modifying the bulleted list', async () => {
const editor = await createEditor(
initialDocText, EditorSelection.cursor(bulletedListPart.length + 5), expectedTags
initialDocText, EditorSelection.cursor(bulletedListPart.length + 5), expectedTags,
);
toggleList(ListType.CheckList)(editor);
expect(editor.state.doc.toString()).toBe(
`${bulletedListPart}\n\nThis is a checklist\nwith multiple items.\n☑`
`${bulletedListPart}\n\nThis is a checklist\nwith multiple items.\n☑`,
);
});
it('should remove an unordered list following a checklist without modifying the checklist', async () => {
const editor = await createEditor(
initialDocText, EditorSelection.cursor(bulletedListPart.length - 5), expectedTags
initialDocText, EditorSelection.cursor(bulletedListPart.length - 5), expectedTags,
);
toggleList(ListType.UnorderedList)(editor);
expect(editor.state.doc.toString()).toBe(
`Test\nThis is a test.\n3\n4\n5\n\n${checklistPart}`
`Test\nThis is a test.\n3\n4\n5\n\n${checklistPart}`,
);
});
it('should replace a selection of unordered and task lists with a correctly-numbered list', async () => {
const editor = await createEditor(
initialDocText, EditorSelection.range(0, initialDocText.length), expectedTags
initialDocText, EditorSelection.range(0, initialDocText.length), expectedTags,
);
toggleList(ListType.OrderedList)(editor);
expect(editor.state.doc.toString()).toBe(
'1. Test\n2. This is a test.\n3. 3\n4. 4\n5. 5'
+ '\n\n6. This is a checklist\n7. with multiple items.\n8. ☑'
+ '\n\n6. This is a checklist\n7. with multiple items.\n8. ☑',
);
});
});
@@ -6,10 +6,13 @@ import createEditor from './testUtil/createEditor';
import { blockMathTagName } from './markdownMathParser';
describe('markdownCommands', () => {
jest.retryTimes(2);
it('should bold/italicize everything selected', async () => {
const initialDocText = 'Testing...';
const editor = await createEditor(
initialDocText, EditorSelection.range(0, initialDocText.length), []
initialDocText, EditorSelection.range(0, initialDocText.length), [],
);
toggleBolded(editor);
@@ -36,7 +39,7 @@ describe('markdownCommands', () => {
it('for a cursor, bolding, then italicizing, should produce a bold-italic region', async () => {
const initialDocText = '';
const editor = await createEditor(
initialDocText, EditorSelection.cursor(0), []
initialDocText, EditorSelection.cursor(0), [],
);
toggleBolded(editor);
@@ -110,14 +113,14 @@ describe('markdownCommands', () => {
const editor = await createEditor(
initialDocText,
EditorSelection.cursor('Testing...\n\n> This'.length),
['Blockquote']
['Blockquote'],
);
toggleHeaderLevel(1)(editor);
const mainSel = editor.state.selection.main;
expect(editor.state.doc.toString()).toBe(
'Testing...\n\n> # This is a test.\n> ...a test'
'Testing...\n\n> # This is a test.\n> ...a test',
);
expect(mainSel.empty).toBe(true);
expect(mainSel.from).toBe('Testing...\n\n> # This is a test.'.length);
@@ -125,7 +128,7 @@ describe('markdownCommands', () => {
toggleHeaderLevel(3)(editor);
expect(editor.state.doc.toString()).toBe(
'Testing...\n\n> ### This is a test.\n> ...a test'
'Testing...\n\n> ### This is a test.\n> ...a test',
);
});
@@ -135,9 +138,9 @@ describe('markdownCommands', () => {
initialDocText,
EditorSelection.range(
'Testing...\n\n> This'.length,
'Testing...\n\n> This is a test.\n> y = mx + b'.length
'Testing...\n\n> This is a test.\n> y = mx + b'.length,
),
['Blockquote']
['Blockquote'],
);
toggleMath(editor);
@@ -145,7 +148,7 @@ describe('markdownCommands', () => {
// Toggling math should surround the content in '$$'s
const mainSel = editor.state.selection.main;
expect(editor.state.doc.toString()).toEqual(
'Testing...\n\n> $$\n> This is a test.\n> y = mx + b\n> $$\n> ...a test'
'Testing...\n\n> $$\n> This is a test.\n> y = mx + b\n> $$\n> ...a test',
);
expect(mainSel.from).toBe('Testing...\n\n'.length);
expect(mainSel.to).toBe('Testing...\n\n> $$\n> This is a test.\n> y = mx + b\n> $$'.length);
@@ -157,7 +160,7 @@ describe('markdownCommands', () => {
const editor = await createEditor(
initialDocText,
EditorSelection.cursor('Testing...\n\n> $$\n> This is'.length),
['Blockquote', blockMathTagName]
['Blockquote', blockMathTagName],
);
// Toggling math should remove the '$$'s
@@ -174,12 +177,12 @@ describe('markdownCommands', () => {
updateLink('bar', 'https://example.com/')(editor);
expect(editor.state.doc.toString()).toBe(
'[bar](https://example.com/)'
'[bar](https://example.com/)',
);
updateLink('', 'https://example.com/')(editor);
expect(editor.state.doc.toString()).toBe(
'https://example.com/'
'https://example.com/',
);
});
@@ -225,7 +228,7 @@ describe('markdownCommands', () => {
toggleMath(editor);
editor.dispatch(editor.state.replaceSelection('f(x) = ...'));
expect(editor.state.doc.toString()).toBe(
'> Testing...> \n> \n> $$\n> f(x) = ...\n> $$'
'> Testing...> \n> \n> $$\n> f(x) = ...\n> $$',
);
// If we toggle math again, everything from the start of the line with the first
@@ -6,18 +6,21 @@ import { ListType } from '../types';
import createEditor from './testUtil/createEditor';
describe('markdownCommands.toggleList', () => {
jest.retryTimes(2);
it('should remove the same type of list', async () => {
const initialDocText = '- testing\n- this is a `test`\n';
const editor = await createEditor(
initialDocText,
EditorSelection.cursor(5),
['BulletList', 'InlineCode']
['BulletList', 'InlineCode'],
);
toggleList(ListType.UnorderedList)(editor);
expect(editor.state.doc.toString()).toBe(
'testing\nthis is a `test`\n'
'testing\nthis is a `test`\n',
);
});
@@ -26,12 +29,12 @@ describe('markdownCommands.toggleList', () => {
const editor = await createEditor(
initialDocText,
EditorSelection.cursor('Testing...\nThis is a'.length),
[]
[],
);
toggleList(ListType.OrderedList)(editor);
expect(editor.state.doc.toString()).toBe(
'Testing...\n1. This is a test\nof list toggling...'
'Testing...\n1. This is a test\nof list toggling...',
);
editor.setState(EditorState.create({
@@ -41,7 +44,7 @@ describe('markdownCommands.toggleList', () => {
toggleList(ListType.OrderedList)(editor);
expect(editor.state.doc.toString()).toBe(
'1. Testing...\n2. This is a test\n3. of list toggling...'
'1. Testing...\n2. This is a test\n3. of list toggling...',
);
});
@@ -51,12 +54,12 @@ describe('markdownCommands.toggleList', () => {
const editor = await createEditor(
unorderedListText,
EditorSelection.cursor(unorderedListText.length),
['BulletList']
['BulletList'],
);
toggleList(ListType.OrderedList)(editor);
expect(editor.state.doc.toString()).toBe(
'1. 1\n2. 2\n3. 3\n4. 4\n5. 5\n6. 6\n7. 7'
'1. 1\n2. 2\n3. 3\n4. 4\n5. 5\n6. 6\n7. 7',
);
});
@@ -154,12 +157,12 @@ describe('markdownCommands.toggleList', () => {
const editor = await createEditor(
initialDocText,
EditorSelection.cursor(0),
['OrderedList', 'BulletList']
['OrderedList', 'BulletList'],
);
toggleList(ListType.CheckList)(editor);
expect(editor.state.doc.toString()).toBe(
'- [ ] Foo\n- [ ] Bar\n- [ ] Baz\n\t- Test\n\t- of\n\t- sublists\n- [ ] Foo'
'- [ ] Foo\n- [ ] Bar\n- [ ] Baz\n\t- Test\n\t- of\n\t- sublists\n- [ ] Foo',
);
});
@@ -169,7 +172,7 @@ describe('markdownCommands.toggleList', () => {
const editor = await createEditor(
initialDocText,
EditorSelection.cursor(initialDocText.length),
['OrderedList']
['OrderedList'],
);
increaseIndent(editor);
@@ -177,12 +180,12 @@ describe('markdownCommands.toggleList', () => {
toggleList(ListType.CheckList)(editor);
expect(editor.state.doc.toString()).toBe(
'1. This\n2. is\n\t- [ ] '
'1. This\n2. is\n\t- [ ] ',
);
editor.dispatch(editor.state.replaceSelection('a test.'));
expect(editor.state.doc.toString()).toBe(
'1. This\n2. is\n\t- [ ] a test.'
'1. This\n2. is\n\t- [ ] a test.',
);
});
@@ -191,12 +194,12 @@ describe('markdownCommands.toggleList', () => {
const initialDocText = `${preSubListText}> \t* a\n> \t* test\n> * of list toggling`;
const editor = await createEditor(
initialDocText, EditorSelection.cursor(preSubListText.length + 3),
['BlockQuote', 'BulletList']
['BlockQuote', 'BulletList'],
);
toggleList(ListType.OrderedList)(editor);
expect(editor.state.doc.toString()).toBe(
'> # List test\n> * This\n> * is\n> \t1. a\n> \t2. test\n> * of list toggling'
'> # List test\n> * This\n> * is\n> \t1. a\n> \t2. test\n> * of list toggling',
);
expect(editor.state.selection.main.from).toBe(preSubListText.length);
});
@@ -250,7 +250,7 @@ export const toggleList = (listType: ListType): Command => {
sel = EditorSelection.range(
doc.line(newFromLineNo).from,
doc.line(newToLineNo).to
doc.line(newToLineNo).to,
);
computeSelectionProps();
}
@@ -299,7 +299,7 @@ export const toggleList = (listType: ListType): Command => {
const containerMatch = lineContent.match(containerRegex);
if (!containerMatch) {
throw new Error(
'Assertion failed: container regex does not match line content.'
'Assertion failed: container regex does not match line content.',
);
}
@@ -336,7 +336,7 @@ export const toggleList = (listType: ListType): Command => {
} else {
sel = EditorSelection.range(
sel.from,
sel.to + charsAdded
sel.to + charsAdded,
);
}
@@ -374,10 +374,10 @@ export const toggleHeaderLevel = (level: number): Command => {
`${level - 1 >= 1 ? `(?:^[#]{1,${level - 1}}\\s)|` : ''
// Check all number of #s higher than [level]
}(?:^[#]{${level + 1},}\\s)`
}(?:^[#]{${level + 1},}\\s)`,
),
'',
matchEmpty
matchEmpty,
);
view.dispatch(changes);
@@ -387,7 +387,7 @@ export const toggleHeaderLevel = (level: number): Command => {
// We want exactly [level] '#' characters.
new RegExp(`^[#]{${level}} `),
`${headerStr} `,
matchEmpty
matchEmpty,
);
view.dispatch(changes);
@@ -408,7 +408,7 @@ export const increaseIndent: Command = (view: EditorView): boolean => {
matchNothing,
// ...and thus always add indentUnit.
indentUnit,
matchEmpty
matchEmpty,
);
view.dispatch(changes);
@@ -429,7 +429,7 @@ export const decreaseIndent: Command = (view: EditorView): boolean => {
new RegExp(`^(?:[\\t]|[ ]{1,${getIndentUnit(view.state)}})`),
// Don't add new text
'',
matchEmpty
matchEmpty,
);
view.dispatch(changes);
@@ -27,6 +27,8 @@ const findNodesWithName = (editor: EditorState, nodeName: string) => {
describe('markdownMathParser', () => {
jest.retryTimes(2);
it('should parse inline math that contains space characters, numbers, and symbols', async () => {
const documentText = '$3 + 3$';
const editor = await createEditorState(documentText, [inlineMathTagName, 'number']);
@@ -143,7 +143,7 @@ const BlockMathConfig: MarkdownConfig = {
let stop;
let endMatch = mathBlockEndRegex.exec(
line.text.substring(mathStartMatch[0].length)
line.text.substring(mathStartMatch[0].length),
);
// If the math region ends immediately (on the same line),
@@ -183,7 +183,7 @@ const BlockMathConfig: MarkdownConfig = {
Math.min(lineEnd, stop + delimLen),
// The child of the container element should be the content element
[contentElem]
[contentElem],
);
cx.addElement(containerElement);
@@ -5,6 +5,9 @@ import { Text as DocumentText, EditorSelection, EditorState } from '@codemirror/
import { indentUnit } from '@codemirror/language';
describe('markdownReformatter', () => {
jest.retryTimes(2);
const boldSpec: RegionSpec = RegionSpec.of({
template: '**',
});
@@ -103,7 +106,7 @@ describe('markdownReformatter', () => {
});
const changes = toggleRegionFormatGlobally(
initialState, inlineCodeRegionSpec, blockCodeRegionSpec
initialState, inlineCodeRegionSpec, blockCodeRegionSpec,
);
const newState = initialState.update(changes).state;
@@ -117,7 +120,7 @@ describe('markdownReformatter', () => {
});
const changes = toggleRegionFormatGlobally(
initialState, inlineCodeRegionSpec, blockCodeRegionSpec
initialState, inlineCodeRegionSpec, blockCodeRegionSpec,
);
const newState = initialState.update(changes).state;
@@ -84,7 +84,7 @@ export enum MatchSide {
// Returns the length of a match for this in the given selection,
// -1 if no match is found.
export const findInlineMatch = (
doc: DocumentText, spec: RegionSpec, sel: SelectionRange, side: MatchSide
doc: DocumentText, spec: RegionSpec, sel: SelectionRange, side: MatchSide,
): number => {
const [regex, template] = (() => {
if (side === MatchSide.Start) {
@@ -182,7 +182,7 @@ export const isIndentationEquivalent = (state: EditorState, a: string, b: string
// Expands and returns a copy of [sel] to the smallest container node with name in [nodeNames].
export const growSelectionToNode = (
state: EditorState, sel: SelectionRange, nodeNames: string|string[]|null
state: EditorState, sel: SelectionRange, nodeNames: string|string[]|null,
): SelectionRange => {
if (!nodeNames) {
return sel;
@@ -235,7 +235,7 @@ export const growSelectionToNode = (
// If the selection is already surrounded by these characters, they are
// removed.
const toggleInlineRegionSurrounded = (
doc: DocumentText, sel: SelectionRange, spec: RegionSpec
doc: DocumentText, sel: SelectionRange, spec: RegionSpec,
): SelectionUpdate => {
let content = doc.sliceString(sel.from, sel.to);
const startMatchLen = findInlineMatch(doc, spec, sel, MatchSide.Start);
@@ -291,7 +291,7 @@ const toggleInlineRegionSurrounded = (
// Returns updated selections: For all selections in the given `EditorState`, toggles
// whether each is contained in an inline region of type [spec].
export const toggleInlineSelectionFormat = (
state: EditorState, spec: RegionSpec, sel: SelectionRange
state: EditorState, spec: RegionSpec, sel: SelectionRange,
): SelectionUpdate => {
const endMatchLen = findInlineMatch(state.doc, spec, sel, MatchSide.End);
@@ -315,7 +315,7 @@ export const toggleInlineSelectionFormat = (
// Like toggleInlineSelectionFormat, but for all selections in [state].
export const toggleInlineFormatGlobally = (
state: EditorState, spec: RegionSpec
state: EditorState, spec: RegionSpec,
): TransactionSpec => {
const changes = state.changeByRange((sel: SelectionRange) => {
return toggleInlineSelectionFormat(state, spec, sel);
@@ -328,13 +328,13 @@ export const toggleRegionFormatGlobally = (
state: EditorState,
inlineSpec: RegionSpec,
blockSpec: RegionSpec
blockSpec: RegionSpec,
): TransactionSpec => {
const doc = state.doc;
const preserveBlockQuotes = true;
const getMatchEndPoints = (
match: RegExpMatchArray, line: Line, inBlockQuote: boolean
match: RegExpMatchArray, line: Line, inBlockQuote: boolean,
): [startIdx: number, stopIdx: number] => {
const startIdx = line.from + match.index;
let stopIdx;
@@ -499,7 +499,7 @@ export const toggleRegionFormatGlobally = (
// Selection should now encompass all lines that were changed.
range: EditorSelection.range(
fromLine.from, toLine.to + charsAdded
fromLine.from, toLine.to + charsAdded,
),
};
});
@@ -515,7 +515,7 @@ export const toggleSelectedLinesStartWith = (
matchEmpty: boolean,
// Name associated with what [regex] matches (e.g. FencedCode)
nodeName?: string
nodeName?: string,
): TransactionSpec => {
const ignoreBlockQuotes = true;
const getLineContentStart = (line: Line): number => {
@@ -701,7 +701,7 @@ export const renumberList = (state: EditorState, sel: SelectionRange): Selection
} else {
sel = EditorSelection.range(
fromLine.from,
toLine.to + charsAdded
toLine.to + charsAdded,
);
}
@@ -229,7 +229,7 @@ for (const language of supportedLanguages) {
name: language.name,
alias: language.aliases,
support,
})
}),
);
}
@@ -10,7 +10,7 @@ import loadLangauges from './loadLanguages';
// Creates and returns a minimal editor with markdown extensions. Waits to return the editor
// until all syntax tree tags in `expectedSyntaxTreeTags` exist.
const createEditor = async (
initialText: string, initialSelection: SelectionRange, expectedSyntaxTreeTags: string[]
initialText: string, initialSelection: SelectionRange, expectedSyntaxTreeTags: string[],
): Promise<EditorView> => {
await loadLangauges();
@@ -10,7 +10,7 @@ const forceFullParse = (editorState: EditorState) => {
if (!syntaxTreeAvailable(editorState)) {
throw new Error(
`Unable to generate a syntax tree in ${timeout}. Is the editor configured to parse a language?`
`Unable to generate a syntax tree in ${timeout}. Is the editor configured to parse a language?`,
);
}
};
Loaded 100 of 214 files, more files were not shown because too many files have changed in this diff. Show more