diff --git a/release-notes/5.59.0.md b/release-notes/5.59.0.md new file mode 100644 index 000000000000..f1b190fa2fb5 --- /dev/null +++ b/release-notes/5.59.0.md @@ -0,0 +1,351 @@ +# CiviCRM 5.59.0 + +Released March 8, 2023; + +- **[Features](#features)** +- **[Bugs resolved](#bugs)** +- **[Miscellany](#misc)** +- **[Credits](#credits)** + +## Features + +## Bugs resolved + +### Core CiviCRM + +- **Use correct var for joomla synchronizeUFMatch ([25658](https://github.com/civicrm/civicrm-core/pull/25658))** + +- **PEAR Exception handling - Mitigation of scenario where an import table has been deleted and the metadata is out of date ([25633](https://github.com/civicrm/civicrm-core/pull/25633))** + +- **Fix custom field bug on UFMatch sync ([25549](https://github.com/civicrm/civicrm-core/pull/25549))** + +- **Add APIv4 Pledge Autocomplete ([25598](https://github.com/civicrm/civicrm-core/pull/25598))** + +- **Status Check - Tweak severity of timezone warning ([25583](https://github.com/civicrm/civicrm-core/pull/25583))** + +- **dev/core#4119 Only generate error on blank confirm_title if confirmat… ([25578](https://github.com/civicrm/civicrm-core/pull/25578))** + +- **dev/core#4080 Fix wrong pdf format selection for invoice, when configured ([25547](https://github.com/civicrm/civicrm-core/pull/25547))** + +- **(dev/core#4109) Fix tokens like `{contact.email_primary.email}` ([25548](https://github.com/civicrm/civicrm-core/pull/25548))** + +- **dev/core#4116 Add in rebuilding log table schema when modifying schema ([25555](https://github.com/civicrm/civicrm-core/pull/25555))** + +- **CiviTestListener - Headless tests should initialize timezone ([25534](https://github.com/civicrm/civicrm-core/pull/25534))** + +- **dev/core#4068 Prevent adding in addSelectWhereClause for civicrm_group when filtering by a group as unneded for reports ([25525](https://github.com/civicrm/civicrm-core/pull/25525))** + +- **Backport 25520 ([25523](https://github.com/civicrm/civicrm-core/pull/25523))** + +- **[REF] Use Civi::statics in CRM_Utils_File instead of php static ([25498](https://github.com/civicrm/civicrm-core/pull/25498))** + +- **[REF][PHP8.2] Remove dynamic property in CRM_Contribute_Form_ContributionPageTranslationTest ([25489](https://github.com/civicrm/civicrm-core/pull/25489))** + +- **[REF][PHP8.2] Declare properties on CRM_Member_Import_Parser_MembershipTest ([25491](https://github.com/civicrm/civicrm-core/pull/25491))** + +- **[REF][PHP8.2] Refactor CRM_Contact_BAO_ContactType_ContactSearchTest to not use dynamic properties ([25406](https://github.com/civicrm/civicrm-core/pull/25406))** + +- **(REF) CRM_Upgrade_Headless - The pre-up and post-up msgs should have same formatting ([25488](https://github.com/civicrm/civicrm-core/pull/25488))** + +- **[REF] Add in function to retrieve Pre Upgrade messages in headless ([25414](https://github.com/civicrm/civicrm-core/pull/25414))** + +- **5.58 ([25484](https://github.com/civicrm/civicrm-core/pull/25484))** + +- **[REF][PHP8.2] Declare properties in CRM_Contact_BAO_ContactType_ContactTest ([25478](https://github.com/civicrm/civicrm-core/pull/25478))** + +- **Fix typo in upgrade message ([25481](https://github.com/civicrm/civicrm-core/pull/25481))** + +- **5.58 ([25483](https://github.com/civicrm/civicrm-core/pull/25483))** + +- **Prevent PHP warnings when no WordPress user is found ([25477](https://github.com/civicrm/civicrm-core/pull/25477))** + +- **[REF][PHP8.2] Tidy up CRM_Batch_Form_EntryTest ([25455](https://github.com/civicrm/civicrm-core/pull/25455))** + +- **Fix exception type in upgrade snapshot ([25480](https://github.com/civicrm/civicrm-core/pull/25480))** + +- **[REF][PHP8.2] Tidy, and PHP8.2 compatiability for api_v3_CustomValueContactTypeTest ([25479](https://github.com/civicrm/civicrm-core/pull/25479))** + +- **simplify calculation of lifetime memberships in CRM_Price_BAO_PriceSet ([25456](https://github.com/civicrm/civicrm-core/pull/25456))** + +- **Fix slow queries in snapshot process ([25420](https://github.com/civicrm/civicrm-core/pull/25420))** + +- **dev/core#4096 Rename Primary Email to Is Primary ([25473](https://github.com/civicrm/civicrm-core/pull/25473))** + +- **Do not crash the whole SearchKit UI if one entity fails ([25433](https://github.com/civicrm/civicrm-core/pull/25433))** + +- **Add dontub to contributor-key.yml ([25475](https://github.com/civicrm/civicrm-core/pull/25475))** + +- **Increase timeout on imap ([25418](https://github.com/civicrm/civicrm-core/pull/25418))** + +- **5.58 to master ([25468](https://github.com/civicrm/civicrm-core/pull/25468))** + +- **Ensure useful exception thrown for all Smarty errors from user strings ([25334](https://github.com/civicrm/civicrm-core/pull/25334))** + +- **php8 - don't pass null to htmlspecialchars on profile admin page ([25463](https://github.com/civicrm/civicrm-core/pull/25463))** + +- **dev/core#4097 - Add deprecation notice as per comments at #25448 ([25462](https://github.com/civicrm/civicrm-core/pull/25462))** + +- **Smarty notice fix - check array key exists before querying ([25453](https://github.com/civicrm/civicrm-core/pull/25453))** + +- **(dev/core#4074) Make CRM_Core_BAO_CMSUser CMS agnostic ([25323](https://github.com/civicrm/civicrm-core/pull/25323))** + +- **dev/core#4097 Fix empty string $amount error ([25448](https://github.com/civicrm/civicrm-core/pull/25448))** + +- **Report tpl enotices fix ([25452](https://github.com/civicrm/civicrm-core/pull/25452))** + +- **Fix some more smarty assignments to assign even when FALSE ([25459](https://github.com/civicrm/civicrm-core/pull/25459))** + +- **Do not attempt to format custom value of empty string ([25451](https://github.com/civicrm/civicrm-core/pull/25451))** + +- **[REF][PHP8.2] Tidy up of CRM_Report_Form_Member_DetailTest ([25450](https://github.com/civicrm/civicrm-core/pull/25450))** + +- **[REF][PHP8.2] Declare missing property on CRM_Utils_HookTest ([25447](https://github.com/civicrm/civicrm-core/pull/25447))** + +- **[REF][PHP8.2] Avoid dynamic properties in CRM_Event_BAO_ParticipantTest ([25449](https://github.com/civicrm/civicrm-core/pull/25449))** + +- **[REF][PHP8.2] Fix Dynamic property payment instrument id on back offi… ([25426](https://github.com/civicrm/civicrm-core/pull/25426))** + +- **Fix display of custom data in cases ([25440](https://github.com/civicrm/civicrm-core/pull/25440))** + +- **dev/translation#76 Allow extension gettext mo files to live in the I18N resource dir ([25419](https://github.com/civicrm/civicrm-core/pull/25419))** + +- **(dev/backdrop#77) Fix fatal error with password validation ([25371](https://github.com/civicrm/civicrm-core/pull/25371))** + +- **APIv4 - Support autocompletes of the Entity entity ([25409](https://github.com/civicrm/civicrm-core/pull/25409))** + +- **[REF][PHP8.2] Declare system property in tests ([25401](https://github.com/civicrm/civicrm-core/pull/25401))** + +- **(NFC) Speed up random tests by 55-60% ([25439](https://github.com/civicrm/civicrm-core/pull/25439))** + +- **[REF][PHP8.2] Declare file property in CRM_Extension_InfoTest ([25405](https://github.com/civicrm/civicrm-core/pull/25405))** + +- **[REF][PHP8.2] Declare properties in CRM_Activity_Page_AJAXTest ([25443](https://github.com/civicrm/civicrm-core/pull/25443))** + +- **[REF][PHP8.2] Refactor CRM_Case_BAO_CaseTest to use const ([25442](https://github.com/civicrm/civicrm-core/pull/25442))** + +- **5.58 ([25425](https://github.com/civicrm/civicrm-core/pull/25425))** + +- **dev/core#4088 Convert api4 helper functionality to a trait & make available ([25412](https://github.com/civicrm/civicrm-core/pull/25412))** + +- **Update polyfill packages ([25417](https://github.com/civicrm/civicrm-core/pull/25417))** + +- **CaseActivityTest - Fix quiet regressions ([25416](https://github.com/civicrm/civicrm-core/pull/25416))** + +- **CustomFields - Drop unused column 'mask' ([25396](https://github.com/civicrm/civicrm-core/pull/25396))** + +- **[NFC] Incorrect docblock in CRM_Contribute_PseudoConstant::contributionPage() ([25398](https://github.com/civicrm/civicrm-core/pull/25398))** + +- **[REF][PHP8.2] Declare processor property in CRM_Case_XMLProcessorTest ([25407](https://github.com/civicrm/civicrm-core/pull/25407))** + +- **(dev/core#4088) ClassScanner - Move test registration ([25415](https://github.com/civicrm/civicrm-core/pull/25415))** + +- **[REF] Use civi::statics to get activityinfos in case activity view ([25404](https://github.com/civicrm/civicrm-core/pull/25404))** + +- **[REF] Regen following #25211 ([25413](https://github.com/civicrm/civicrm-core/pull/25413))** + +- **luxembourg-provices added missing provices, updated outdated ISO code… ([25211](https://github.com/civicrm/civicrm-core/pull/25211))** + +- **Smarty Mixin - Allow extensions to enable Smarty via mixin ([25369](https://github.com/civicrm/civicrm-core/pull/25369))** + +- **CustomField - Fix smarty notices on field create/edit form ([25397](https://github.com/civicrm/civicrm-core/pull/25397))** + +- **[REF][PHP8.2] Avoid dynamic property in ReportTest ([25399](https://github.com/civicrm/civicrm-core/pull/25399))** + +- **dev/core#2985 Original value is displayed after setting custom event field blank ([25229](https://github.com/civicrm/civicrm-core/pull/25229))** + +- **5.58 ([25394](https://github.com/civicrm/civicrm-core/pull/25394))** + +- **Undefined array keys on case activity view ([25381](https://github.com/civicrm/civicrm-core/pull/25381))** + +- **[REF][PHP8.2] Fix Deprecated Dynamic class properties in Legacy custo… ([25393](https://github.com/civicrm/civicrm-core/pull/25393))** + +- **Make otherwise unused form function private ([25389](https://github.com/civicrm/civicrm-core/pull/25389))** + +- **(dev/core#4055) ClassLoader - Use separate cache IDs for different configurations of modules ([25379](https://github.com/civicrm/civicrm-core/pull/25379))** + +- **Undefined `accessKey` on case activity view ([25382](https://github.com/civicrm/civicrm-core/pull/25382))** + +- **Paypal cancel/notify/return URLs ([25376](https://github.com/civicrm/civicrm-core/pull/25376))** + +- **[REF][PHP8.2] Avoid dynamic property in CRM_SMS_ProviderTest ([25388](https://github.com/civicrm/civicrm-core/pull/25388))** + +- **5.58 ([25386](https://github.com/civicrm/civicrm-core/pull/25386))** + +- **Enhance metadata for OptionGroups ([25188](https://github.com/civicrm/civicrm-core/pull/25188))** + +- **(NFC) Mixin Tests - Add more type-hints ([25384](https://github.com/civicrm/civicrm-core/pull/25384))** + +- **dev/core#4088 Superficial cleanup on Api4testBase ([25378](https://github.com/civicrm/civicrm-core/pull/25378))** + +- **[REF][PHP8.2] Fix Eway Single Payment Processor extension for dynamic… ([25354](https://github.com/civicrm/civicrm-core/pull/25354))** + +- **[REF][PHP8.2] Use const instead of dynamic property: CRM_Contribute_BAO_ContributionPageTest ([25372](https://github.com/civicrm/civicrm-core/pull/25372))** + +- **[REF][PHP8.2] Declare $file property in CRM_Utils_ZipTest ([25373](https://github.com/civicrm/civicrm-core/pull/25373))** + +- **[REF][PHP8.2] Avoid dynamic properties in api_v3_EventTest ([25375](https://github.com/civicrm/civicrm-core/pull/25375))** + +- **Php8.2 Contact import Map Field screen - remove undefined property usage (mutliple) ([25298](https://github.com/civicrm/civicrm-core/pull/25298))** + +- **Pass metadata values rather than convoluted array to `processCustomFields` ([25318](https://github.com/civicrm/civicrm-core/pull/25318))** + +- **Remove a couple of legacy uses of `contributeMode` ([25239](https://github.com/civicrm/civicrm-core/pull/25239))** + +- **Deprecate meaningless parameter ([25259](https://github.com/civicrm/civicrm-core/pull/25259))** + +- **Civix upgrade on event cart ([25361](https://github.com/civicrm/civicrm-core/pull/25361))** + +- **(dev/core#4084) Assign participant_status_id in both edit/create modes ([25366](https://github.com/civicrm/civicrm-core/pull/25366))** + +- **Greenwich - Run `civix upgrade` ([25249](https://github.com/civicrm/civicrm-core/pull/25249))** + +- **Flexmailer - Re-run civix upgrade ([25357](https://github.com/civicrm/civicrm-core/pull/25357))** + +- **dev/core#2542 Avoid collision with Bootstrap for .disabled links ([24665](https://github.com/civicrm/civicrm-core/pull/24665))** + +- **Run civix upgrade on oauth ([25358](https://github.com/civicrm/civicrm-core/pull/25358))** + +- **[REF][PHP8.2] Fix creation of dynamic properties in Payflow Pro exten… ([25355](https://github.com/civicrm/civicrm-core/pull/25355))** + +- **(NFC) Another batch of PHPDoc fixes ([25351](https://github.com/civicrm/civicrm-core/pull/25351))** + +- **Queues - Ensure that queue timings work, even with bad tzdata ([25363](https://github.com/civicrm/civicrm-core/pull/25363))** + +- **Remove code for legacy php versions - `assign_by_ref` with an object ([25247](https://github.com/civicrm/civicrm-core/pull/25247))** + +- **(NFC) Cleanup Gitlab references ([25365](https://github.com/civicrm/civicrm-core/pull/25365))** + +- **Civix upgrade message_admin ([25359](https://github.com/civicrm/civicrm-core/pull/25359))** + +- **Remove code deprecated in 2019 ([25262](https://github.com/civicrm/civicrm-core/pull/25262))** + +- **(REF) Tidy up properties in CRM_Core_ResourcesTest ([25349](https://github.com/civicrm/civicrm-core/pull/25349))** + +- **dev/core#4081 Ensure that if using the API to update an event templat… ([25356](https://github.com/civicrm/civicrm-core/pull/25356))** + +- **Disable extern/soap.php. Remove implementation and tests. ([25317](https://github.com/civicrm/civicrm-core/pull/25317))** + +- **[REF][PHP8.2] Avoid dynamic properties in module tests ([25348](https://github.com/civicrm/civicrm-core/pull/25348))** + +- **(REF) Tidy up of CRM_Extension_ManagerTest ([25350](https://github.com/civicrm/civicrm-core/pull/25350))** + +- **[REF][PHP8.2] Fix PHP8.2 creation of dynamic properties in the elavon… ([25353](https://github.com/civicrm/civicrm-core/pull/25353))** + +- **Scheduled jobs: Warnting text if runInNonProductionEnvironment=TRUE ([25307](https://github.com/civicrm/civicrm-core/pull/25307))** + +- **[REF][PHP8.2] Avoid dynamic properties in api_v3_GroupOrganizationTest ([25352](https://github.com/civicrm/civicrm-core/pull/25352))** + +- **[REF][PHP8.2] Avoid dynamic properties in api_v3_ContactTypeTest ([25342](https://github.com/civicrm/civicrm-core/pull/25342))** + +- **[REF][PHP8.2] Avoid dynamic properties in CRM_Contact_BAO_ContactType_RelationshipTest ([25347](https://github.com/civicrm/civicrm-core/pull/25347))** + +- **[REF][PHP8.2] Move to standard varaibles in CRM_Price_BAO_PriceFieldValueTest to avoid dynamic properties ([25343](https://github.com/civicrm/civicrm-core/pull/25343))** + +- **5.58 ([25346](https://github.com/civicrm/civicrm-core/pull/25346))** + +- **[REF][PHP8.2] Use const instead of dynamic property api_v3_CaseTypeTest ([25345](https://github.com/civicrm/civicrm-core/pull/25345))** + +- **Remove error suppression operator from test ([25344](https://github.com/civicrm/civicrm-core/pull/25344))** + +- **Fix failure when changing processor type on add Payment Processor screen ([25340](https://github.com/civicrm/civicrm-core/pull/25340))** + +- **Standardise Type on `includedGroups` parameter ([25330](https://github.com/civicrm/civicrm-core/pull/25330))** + +- **PHP 8.1 compatibility when enabling logging ([25339](https://github.com/civicrm/civicrm-core/pull/25339))** + +- **Php 8.2 - undefined property fix in test class ([25332](https://github.com/civicrm/civicrm-core/pull/25332))** + +- **dev/core#1984 fix custom fields sometimes missing from profiles ([25321](https://github.com/civicrm/civicrm-core/pull/25321))** + +- **(REF) Fix field name when doing DAO find in MergerTest ([25337](https://github.com/civicrm/civicrm-core/pull/25337))** + +- **NFC superficial prelminary cleanup in test class ([25333](https://github.com/civicrm/civicrm-core/pull/25333))** + +- **dev/drupal#153 include name when fetching UFGroups so validation can use it ([25336](https://github.com/civicrm/civicrm-core/pull/25336))** + +- **php8.2 - Fix undefined property, general test cleanup ([25312](https://github.com/civicrm/civicrm-core/pull/25312))** + +- **[Ref] MembershipView page - Remove redundant financialacl check ([23230](https://github.com/civicrm/civicrm-core/pull/23230))** + +- **Remove unused method in CRM_Contact_Form_Task_PDFLetterCommon ([25326](https://github.com/civicrm/civicrm-core/pull/25326))** + +- **[REF][PHP8.2] Avoid dynamic properties in CRM_Case_XMLProcessor_ProcessTest ([25325](https://github.com/civicrm/civicrm-core/pull/25325))** + +- **(REF) Tidy-up unreachable return ([25324](https://github.com/civicrm/civicrm-core/pull/25324))** + +- **Add Report Instance apiv4 ([25226](https://github.com/civicrm/civicrm-core/pull/25226))** + +- **(dev/core#2301) Profiles - Add Drupal 8+ specific check and extract to CRM_Utils_System ([25315](https://github.com/civicrm/civicrm-core/pull/25315))** + +- **5.58 ([25319](https://github.com/civicrm/civicrm-core/pull/25319))** + +- **Php 8.2 fix undefined property, move test to appropriate extension ([25313](https://github.com/civicrm/civicrm-core/pull/25313))** + +- **added myself to contributor-key.yml ([25314](https://github.com/civicrm/civicrm-core/pull/25314))** + +- **[NFC] Remove broken test ([25279](https://github.com/civicrm/civicrm-core/pull/25279))** + +- **typo: dlass --> class ([25308](https://github.com/civicrm/civicrm-core/pull/25308))** + +- **[REF][PHP8.2] Avoid dynamic properties in api_v3_NoteTest ([25310](https://github.com/civicrm/civicrm-core/pull/25310))** + +- **[REF][PHP8.2] Avoid dynamic properties in CRM_Contact_Page_DedupeException ([25301](https://github.com/civicrm/civicrm-core/pull/25301))** + +- **[REF][PHP8.2] Avoid dynamic properties in CRM_Extension_Container_Static ([25311](https://github.com/civicrm/civicrm-core/pull/25311))** + +- **[REF] [Merge custom fields] Copy complex function into merger class, ready to disentangle as little shared code is really used ([25219](https://github.com/civicrm/civicrm-core/pull/25219))** + +- **Run Civix upgrade on afform/core with template patch applied ([25250](https://github.com/civicrm/civicrm-core/pull/25250))** + +- **5.58 to master ([25304](https://github.com/civicrm/civicrm-core/pull/25304))** + +- **[REF][PHP8.2] Avoid dynamic properties in queue tests ([25299](https://github.com/civicrm/civicrm-core/pull/25299))** + +- **[REF][PHP8.2] Avoid dynamic properties in CRM_Core_I18n_Form ([25297](https://github.com/civicrm/civicrm-core/pull/25297))** + +- **(dev/core#3844) Dummy payment processor should be flagged as such on … ([25282](https://github.com/civicrm/civicrm-core/pull/25282))** + +- **(NFC) Reference classes with correct case ([25295](https://github.com/civicrm/civicrm-core/pull/25295))** + +- **(REF) Remove _prefElement dynamic property ([25293](https://github.com/civicrm/civicrm-core/pull/25293))** + +- **[REF][PHP8.2] Avoid dynamic properties in CRM_Case_Form_CaseView ([25292](https://github.com/civicrm/civicrm-core/pull/25292))** + +- **dev/core#2559 Support tenancy in OAuth providers ([25214](https://github.com/civicrm/civicrm-core/pull/25214))** + +- **Fix Undefined index: name Notice in civicrm_api3_message_template_send ([25288](https://github.com/civicrm/civicrm-core/pull/25288))** + +- **5.58 ([25290](https://github.com/civicrm/civicrm-core/pull/25290))** + +- **avoid empty error message when submitting PCP page. ([25277](https://github.com/civicrm/civicrm-core/pull/25277))** + +- **[NFC] Test classname should match filename ([25283](https://github.com/civicrm/civicrm-core/pull/25283))** + +- **Unconditionally assign `registerClosed` on event info page ([25251](https://github.com/civicrm/civicrm-core/pull/25251))** + +- **[NFC/Unit tests] Deprecated theme in unit test base class ([76](https://github.com/civicrm/civicrm-drupal-8/pull/76))** + +- **dev/drupal#153 get UFGroup name for validate method ([77](https://github.com/civicrm/civicrm-drupal-8/pull/77))** + +- **NFC - Update tested up to value for WP sites ([287](https://github.com/civicrm/civicrm-wordpress/pull/287))** + +- **[REF] Disable Soap wp reset options ([288](https://github.com/civicrm/civicrm-wordpress/pull/288))** + +- **dev/joomla#35: J4 permission fix ([67](https://github.com/civicrm/civicrm-joomla/pull/67))** + +- **[REF] Upgrade Smarty to 2.6.32 ([359](https://github.com/civicrm/civicrm-packages/pull/359))** + +- **Update class_image.php for PHP8 ([358](https://github.com/civicrm/civicrm-packages/pull/358))** + +## Miscellany + +## Credits + +This release was developed by the following code authors: + +AGH Strategies - Andie Hunt; BrightMinded Ltd - Bradley Taylor; Christian Wach; Circle Interactive - Pradeep Nayak; CiviCRM - Coleman Watts, Tim Otten; CiviDesk - Yashodha Chaku; Coop SymbioTIC - Mathieu Lutfy; Dave D; dependabot[bot]; Freeform Solutions - Herb van den Dool; jmacarthur98; JMA Consulting - Monish Deb, Seamus Lee; John Kingsnorth; Megaphone Technology Consulting - Jon Goldberg; Michael-Labriola; MJW Consulting - Matthew Wire; Progressive Technology Project - Jamie McClelland; redcuillin; Squiffle Consulting - Aidan Saunders; Stephen Palmstrom; SYSTOPIA - Johannes Franz; Tadpole Collective - Kevin Cristiano; Wikimedia Foundation - Eileen McNaughton; Wildsight - Lars Sanders-Green + +Most authors also reviewed code for this release; in addition, the following +reviewers contributed their comments: + +Artful Robot - Rich Lott; Australian Greens - Andrew Cormick-Dockery; Betty Dolfing; BrightMinded Ltd - Bradley Taylor; Christian Wach; civibot[bot]; CiviCoop - Klaas Eikelboom; civicrm-builder; CiviCRM - Coleman Watts, Tim Otten; CiviDesk - Yashodha Chaku; Coop SymbioTIC - Mathieu Lutfy; Dave D; Freeform Solutions - Herb van den Dool; JMA Consulting - Joe Murray, Monish Deb, Seamus Lee; John Kingsnorth; Megaphone Technology Consulting - Jon Goldberg; MJW Consulting - Matthew Wire; Nicol Wistreich; Squiffle Consulting - Aidan Saunders; Stephen Palmstrom; SYSTOPIA - Johannes Franz; Tadpole Collective - Kevin Cristiano; Wikimedia Foundation - Eileen McNaughton; Wildsight - Lars Sanders-Green \ No newline at end of file