* [CHD-1050] [Worklists/Custom Fields] When displaying a multiple value custom field as a worklist column, all of the selected values will now be displayed.  Previously, only a single value per custom field was displayed based on what matched the search filters.
[Code Cleanup/Contexts/Custom Fields] Implemented a context for custom field records.
* [CHD-1086] [Custom Fields/Attachments] Implemented two new custom field types: file and multiple files. These types allow arbitrary attachments to be attached to records through custom fields. Internally, these fields use the attachments system and they store file IDs.
[Code Cleanup/Choosers/Attachments] Implemented the ability for the file chooser to operate in 'single selection' mode.  This is used by file-based custom fields.
* [Virtual Attendants/Scheduled Behavior] The 'Schedule behavior' and 'Unschedule behavior' actions in Virtual Attendants are now global. They are available in all events and plugin-provided events do not need to implement them. Additionally, the action names are wrapped in parentheses so they appear at the top of the list of available actions.
[Custom Fields/Attachments] Implemented file-based custom fields on profile properties.
* [Custom Fieldsets] Custom fieldsets may now be owned by the application.  These fieldsets are readable by all workers but only configurable by admins.
* [Virtual Attendants/Custom Script] The 'custom script' condition in Virtual Attendant outcomes now a placeholders menu and script tester.
[Code Cleanup/VA] DevblocksEventHelper::renderActionSetCustomField() now requires $trigger so the template can be customized based on the calling VA.
[Code Cleanup/Contexts] Implemented CerberusContexts::isReadableByActor() and CerberusContexts::isWriteableByActor().
[Code Cleanup/Calendars/Contexts] Converted readable/writeable checks on calendars to the new CerberusContext helpers.
* [Calendars/Virtual Attendants] Calendar records can now also be owned by Virtual Attendants or the Application.
* [CHD-3460] [Virtual Attendants/Calendars] All Virtual Attendant behaviors may now use 'calendar availability' as a condition in outcomes.  For example, this can be used to send different auto-replies based on availability.
* [CHD-2866] [Virtual Attendants] The 'new message on a watched conversation' event will now always include a ticket's owner even if they aren't a watcher.
* [Setup/Localization] A Setup->Configure->Localization page has been added for selecting the default date/time format for everywhere dates are displayed.  Admins can choose between 12hr or 24hr formats, and this selection will cover all workers that don't have an established preference.

* [CHD-3064] [CHD-2973] [Preferences/Localization] Each worker can choose their desired time format (12-hour or 24-hour) from the 'Settings' page in their worker menu.
[Code Cleanup] Fixed the link to 'Virtual Attendants' in the worker menu.
[Code Cleanup/Events] Added an abstract 'Before sending message' event since the same exact code is used by at least two different events now.
* [Virtual Attendant/Events] Added a new application-level 'Before sending worker message' event.  Previously this was only possible at the group level.
* [Virtual Attendant/Events] Added a new application-level 'After sending worker message' event.  Previously this was only possible at the group level.
* [CHD-3340] [Virtual Attendants/Mail] Virtual Attendant behaviors on the 'Before sending worker message' event may now add custom mail headers to the outgoing message.  This was requested as a way to force read receipts, among other workflows.