develop b07f7c893be7 cached
329 files
1.6 MB
410.3k tokens
613 symbols
1 requests
Download .txt
Showing preview only (1,718K chars total). Download the full file or copy to clipboard to get everything.
Repository: douglascayers-org/sfdx-mass-action-scheduler
Branch: develop
Commit: b07f7c893be7
Files: 329
Total size: 1.6 MB

Directory structure:
gitextract_80zxm3lv/

├── .forceignore
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── BUG_REPORT.md
│   │   ├── DOCUMENTATION_REQUEST.md
│   │   └── FEATURE_REQUEST.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       └── main.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── _config.yml
├── _layouts/
│   └── default.html
├── config/
│   └── project-scratch-def.json
├── force-app/
│   └── main/
│       └── default/
│           ├── applications/
│           │   ├── Mass_Action_Scheduler.app-meta.xml
│           │   └── Mass_Action_Scheduler_Lightning.app-meta.xml
│           ├── aura/
│           │   ├── LC_API/
│           │   │   ├── LC_API.cmp
│           │   │   ├── LC_API.cmp-meta.xml
│           │   │   ├── LC_APIController.js
│           │   │   ├── LC_APIHelper.js
│           │   │   └── LC_APIRenderer.js
│           │   ├── LC_URL/
│           │   │   ├── LC_URL.cmp
│           │   │   ├── LC_URL.cmp-meta.xml
│           │   │   └── LC_URLController.js
│           │   ├── MA_CheckForPackageUpdatesCmp/
│           │   │   ├── MA_CheckForPackageUpdatesCmp.cmp
│           │   │   ├── MA_CheckForPackageUpdatesCmp.cmp-meta.xml
│           │   │   └── MA_CheckForPackageUpdatesCmpController.js
│           │   ├── MA_DevelopedByCmp/
│           │   │   ├── MA_DevelopedByCmp.cmp
│           │   │   └── MA_DevelopedByCmp.cmp-meta.xml
│           │   ├── MA_EditConfigCmp/
│           │   │   ├── MA_EditConfigCmp.cmp
│           │   │   ├── MA_EditConfigCmp.cmp-meta.xml
│           │   │   ├── MA_EditConfigCmp.css
│           │   │   ├── MA_EditConfigCmpController.js
│           │   │   └── MA_EditConfigCmpHelper.js
│           │   ├── MA_FlowStagePathCmp/
│           │   │   ├── MA_FlowStagePathCmp.cmp
│           │   │   ├── MA_FlowStagePathCmp.cmp-meta.xml
│           │   │   ├── MA_FlowStagePathCmp.design
│           │   │   └── MA_FlowStagePathCmpController.js
│           │   ├── MA_RunConfigCmp/
│           │   │   ├── MA_RunConfigCmp.cmp
│           │   │   ├── MA_RunConfigCmp.cmp-meta.xml
│           │   │   ├── MA_RunConfigCmpController.js
│           │   │   └── MA_RunConfigCmpHelper.js
│           │   ├── MA_WizardCoachingCmp/
│           │   │   ├── MA_WizardCoachingCmp.cmp
│           │   │   └── MA_WizardCoachingCmp.cmp-meta.xml
│           │   ├── defaultTokens/
│           │   │   ├── defaultTokens.tokens
│           │   │   └── defaultTokens.tokens-meta.xml
│           │   ├── lax/
│           │   │   ├── lax.cmp
│           │   │   ├── lax.cmp-meta.xml
│           │   │   ├── laxController.js
│           │   │   └── laxHelper.js
│           │   ├── slds_label/
│           │   │   ├── slds_label.cmp
│           │   │   └── slds_label.cmp-meta.xml
│           │   ├── slds_section/
│           │   │   ├── slds_section.cmp
│           │   │   └── slds_section.cmp-meta.xml
│           │   ├── strike_evt/
│           │   │   ├── strike_evt.evt
│           │   │   └── strike_evt.evt-meta.xml
│           │   └── strike_wizard/
│           │       ├── strike_wizard.cmp
│           │       ├── strike_wizard.cmp-meta.xml
│           │       ├── strike_wizard.css
│           │       ├── strike_wizardController.js
│           │       └── strike_wizardHelper.js
│           ├── classes/
│           │   ├── LC_URLController.cls
│           │   ├── LC_URLController.cls-meta.xml
│           │   ├── LC_URLControllerTest.cls
│           │   ├── LC_URLControllerTest.cls-meta.xml
│           │   ├── LC_VisualforceDomainController.cls
│           │   ├── LC_VisualforceDomainController.cls-meta.xml
│           │   ├── LC_VisualforceDomainControllerTest.cls
│           │   ├── LC_VisualforceDomainControllerTest.cls-meta.xml
│           │   ├── MA_AnonymousApexExecuteResult.cls
│           │   ├── MA_AnonymousApexExecuteResult.cls-meta.xml
│           │   ├── MA_AsyncApexJobMock.cls
│           │   ├── MA_AsyncApexJobMock.cls-meta.xml
│           │   ├── MA_BatchApexErrorEventInvocable.cls
│           │   ├── MA_BatchApexErrorEventInvocable.cls-meta.xml
│           │   ├── MA_BatchApexErrorEventInvocableTest.cls
│           │   ├── MA_BatchApexErrorEventInvocableTest.cls-meta.xml
│           │   ├── MA_BatchApexStatusEventTriggerHandler.cls
│           │   ├── MA_BatchApexStatusEventTriggerHandler.cls-meta.xml
│           │   ├── MA_BatchApexStatusEventTriggerTest.cls
│           │   ├── MA_BatchApexStatusEventTriggerTest.cls-meta.xml
│           │   ├── MA_EditConfigCmpController.cls
│           │   ├── MA_EditConfigCmpController.cls-meta.xml
│           │   ├── MA_EditConfigCmpControllerTest.cls
│           │   ├── MA_EditConfigCmpControllerTest.cls-meta.xml
│           │   ├── MA_EditConfigRestController.cls
│           │   ├── MA_EditConfigRestController.cls-meta.xml
│           │   ├── MA_EditConfigRestControllerTest.cls
│           │   ├── MA_EditConfigRestControllerTest.cls-meta.xml
│           │   ├── MA_Exceptions.cls
│           │   ├── MA_Exceptions.cls-meta.xml
│           │   ├── MA_ExceptionsTest.cls
│           │   ├── MA_ExceptionsTest.cls-meta.xml
│           │   ├── MA_HttpCalloutMock.cls
│           │   ├── MA_HttpCalloutMock.cls-meta.xml
│           │   ├── MA_InstallHandler.cls
│           │   ├── MA_InstallHandler.cls-meta.xml
│           │   ├── MA_InstallHandlerTest.cls
│           │   ├── MA_InstallHandlerTest.cls-meta.xml
│           │   ├── MA_IterableSourceBatchable.cls
│           │   ├── MA_IterableSourceBatchable.cls-meta.xml
│           │   ├── MA_IterableSourceBatchableTest.cls
│           │   ├── MA_IterableSourceBatchableTest.cls-meta.xml
│           │   ├── MA_JobChangeEvent.cls
│           │   ├── MA_JobChangeEvent.cls-meta.xml
│           │   ├── MA_JobChangeEventTriggerHandler.cls
│           │   ├── MA_JobChangeEventTriggerHandler.cls-meta.xml
│           │   ├── MA_JobChangeEventTriggerHandlerTest.cls
│           │   ├── MA_JobChangeEventTriggerHandlerTest.cls-meta.xml
│           │   ├── MA_ListViewDescribeResult.cls
│           │   ├── MA_ListViewDescribeResult.cls-meta.xml
│           │   ├── MA_ListViewDescribeResultTest.cls
│           │   ├── MA_ListViewDescribeResultTest.cls-meta.xml
│           │   ├── MA_ListViewSourceBatchable.cls
│           │   ├── MA_ListViewSourceBatchable.cls-meta.xml
│           │   ├── MA_ListViewSourceBatchableTest.cls
│           │   ├── MA_ListViewSourceBatchableTest.cls-meta.xml
│           │   ├── MA_MapUtils.cls
│           │   ├── MA_MapUtils.cls-meta.xml
│           │   ├── MA_MapUtilsTest.cls
│           │   ├── MA_MapUtilsTest.cls-meta.xml
│           │   ├── MA_MassActionBatchEnqueuer.cls
│           │   ├── MA_MassActionBatchEnqueuer.cls-meta.xml
│           │   ├── MA_MassActionBatchUtils.cls
│           │   ├── MA_MassActionBatchUtils.cls-meta.xml
│           │   ├── MA_MassActionBatchUtilsTest.cls
│           │   ├── MA_MassActionBatchUtilsTest.cls-meta.xml
│           │   ├── MA_MassActionConfigTriggerHandler.cls
│           │   ├── MA_MassActionConfigTriggerHandler.cls-meta.xml
│           │   ├── MA_MassActionConfigTriggerHandlerTest.cls
│           │   ├── MA_MassActionConfigTriggerHandlerTest.cls-meta.xml
│           │   ├── MA_MassActionConfigWrapper.cls
│           │   ├── MA_MassActionConfigWrapper.cls-meta.xml
│           │   ├── MA_MassActionLogTriggerHandler.cls
│           │   ├── MA_MassActionLogTriggerHandler.cls-meta.xml
│           │   ├── MA_MassActionLogTriggerHandlerTest.cls
│           │   ├── MA_MassActionLogTriggerHandlerTest.cls-meta.xml
│           │   ├── MA_MassActionSchedulable.cls
│           │   ├── MA_MassActionSchedulable.cls-meta.xml
│           │   ├── MA_MassActionSchedulableTest.cls
│           │   ├── MA_MassActionSchedulableTest.cls-meta.xml
│           │   ├── MA_MassActionScheduleUtils.cls
│           │   ├── MA_MassActionScheduleUtils.cls-meta.xml
│           │   ├── MA_MassActionScheduleUtilsTest.cls
│           │   ├── MA_MassActionScheduleUtilsTest.cls-meta.xml
│           │   ├── MA_MassActionUtils.cls
│           │   ├── MA_MassActionUtils.cls-meta.xml
│           │   ├── MA_MetadataDeployCallback.cls
│           │   ├── MA_MetadataDeployCallback.cls-meta.xml
│           │   ├── MA_MetadataDeployCallbackTest.cls
│           │   ├── MA_MetadataDeployCallbackTest.cls-meta.xml
│           │   ├── MA_NamespaceUtils.cls
│           │   ├── MA_NamespaceUtils.cls-meta.xml
│           │   ├── MA_ReportService.cls
│           │   ├── MA_ReportService.cls-meta.xml
│           │   ├── MA_ReportServiceTest.cls
│           │   ├── MA_ReportServiceTest.cls-meta.xml
│           │   ├── MA_ReportSourceBatchable.cls
│           │   ├── MA_ReportSourceBatchable.cls-meta.xml
│           │   ├── MA_ReportSourceBatchableTest.cls
│           │   ├── MA_ReportSourceBatchableTest.cls-meta.xml
│           │   ├── MA_RunConfigCmpController.cls
│           │   ├── MA_RunConfigCmpController.cls-meta.xml
│           │   ├── MA_RunConfigCmpControllerTest.cls
│           │   ├── MA_RunConfigCmpControllerTest.cls-meta.xml
│           │   ├── MA_RunConfigInvocable.cls
│           │   ├── MA_RunConfigInvocable.cls-meta.xml
│           │   ├── MA_RunConfigInvocableTest.cls
│           │   ├── MA_RunConfigInvocableTest.cls-meta.xml
│           │   ├── MA_SetConfigUniqueNameBatchable.cls
│           │   ├── MA_SetConfigUniqueNameBatchable.cls-meta.xml
│           │   ├── MA_SetConfigUniqueNameBatchableTest.cls
│           │   ├── MA_SetConfigUniqueNameBatchableTest.cls-meta.xml
│           │   ├── MA_SetupAuthWizardPageController.cls
│           │   ├── MA_SetupAuthWizardPageController.cls-meta.xml
│           │   ├── MA_SetupAuthWizardPageControllerTest.cls
│           │   ├── MA_SetupAuthWizardPageControllerTest.cls-meta.xml
│           │   ├── MA_SoqlQueryExecuteResult.cls
│           │   ├── MA_SoqlQueryExecuteResult.cls-meta.xml
│           │   ├── MA_SoqlQueryExecuteResultTest.cls
│           │   ├── MA_SoqlQueryExecuteResultTest.cls-meta.xml
│           │   ├── MA_SoqlSourceBatchable.cls
│           │   ├── MA_SoqlSourceBatchable.cls-meta.xml
│           │   ├── MA_SoqlSourceBatchableTest.cls
│           │   ├── MA_SoqlSourceBatchableTest.cls-meta.xml
│           │   ├── MA_SoqlSourceIterable.cls
│           │   ├── MA_SoqlSourceIterable.cls-meta.xml
│           │   ├── MA_SoqlSourceIterableTest.cls
│           │   ├── MA_SoqlSourceIterableTest.cls-meta.xml
│           │   ├── MA_StringUtils.cls
│           │   ├── MA_StringUtils.cls-meta.xml
│           │   ├── MA_StringUtilsTest.cls
│           │   ├── MA_StringUtilsTest.cls-meta.xml
│           │   ├── MA_UpgradeMassActionLogsBatchable.cls
│           │   ├── MA_UpgradeMassActionLogsBatchable.cls-meta.xml
│           │   ├── MA_UpgradeMassActionLogsBatchableTest.cls
│           │   ├── MA_UpgradeMassActionLogsBatchableTest.cls-meta.xml
│           │   ├── MA_UpgradePageLayoutsService.cls
│           │   ├── MA_UpgradePageLayoutsService.cls-meta.xml
│           │   ├── MA_UpgradePageLayoutsServiceTest.cls
│           │   ├── MA_UpgradePageLayoutsServiceTest.cls-meta.xml
│           │   ├── MA_XMLUtils.cls
│           │   ├── MA_XMLUtils.cls-meta.xml
│           │   ├── MA_XMLUtilsTest.cls
│           │   └── MA_XMLUtilsTest.cls-meta.xml
│           ├── contentassets/
│           │   ├── maslogominimal.asset
│           │   └── maslogominimal.asset-meta.xml
│           ├── flexipages/
│           │   ├── Mass_Action_Configuration_Record_Page.flexipage-meta.xml
│           │   ├── Mass_Action_Configuration_Record_Page_One_Column.flexipage-meta.xml
│           │   └── Mass_Action_Log_Record_Page.flexipage-meta.xml
│           ├── flows/
│           │   ├── MAS_Batch_Apex_Error_Event.flow-meta.xml
│           │   ├── MAS_Mass_Action_Configuration.flow-meta.xml
│           │   └── MAS_Run_Mass_Action_Flow.flow-meta.xml
│           ├── layouts/
│           │   ├── Mass_Action_Configuration__c-Mass Action Configuration Layout.layout-meta.xml
│           │   ├── Mass_Action_Log__c-Mass Action Child Log Layout.layout-meta.xml
│           │   ├── Mass_Action_Log__c-Mass Action Log Layout.layout-meta.xml
│           │   ├── Mass_Action_Log__c-Mass Action Parent Log Layout.layout-meta.xml
│           │   └── Mass_Action_Mapping__c-Mass Action Mapping Layout.layout-meta.xml
│           ├── namedCredentials/
│           │   └── Mass_Action_Test_Named_Credential.namedCredential-meta.xml
│           ├── notificationtypes/
│           │   └── Mass_Action_Notification.notiftype-meta.xml
│           ├── objects/
│           │   ├── Mass_Action_Batch_Apex_Status_Event__e/
│           │   │   ├── Mass_Action_Batch_Apex_Status_Event__e.object-meta.xml
│           │   │   └── fields/
│           │   │       ├── Job_ID__c.field-meta.xml
│           │   │       ├── Job_Scope__c.field-meta.xml
│           │   │       ├── Long_Message__c.field-meta.xml
│           │   │       ├── Message_Type__c.field-meta.xml
│           │   │       ├── Message__c.field-meta.xml
│           │   │       ├── Phase__c.field-meta.xml
│           │   │       └── Timestamp__c.field-meta.xml
│           │   ├── Mass_Action_Configuration__c/
│           │   │   ├── Mass_Action_Configuration__c.object-meta.xml
│           │   │   ├── compactLayouts/
│           │   │   │   └── Default_Compact_Layout.compactLayout-meta.xml
│           │   │   ├── fields/
│           │   │   │   ├── Active__c.field-meta.xml
│           │   │   │   ├── Batch_Size__c.field-meta.xml
│           │   │   │   ├── Description__c.field-meta.xml
│           │   │   │   ├── DeveloperName__c.field-meta.xml
│           │   │   │   ├── Last_Run_Completed_Date__c.field-meta.xml
│           │   │   │   ├── Last_Run_Completed_With_Errors__c.field-meta.xml
│           │   │   │   ├── Named_Credential__c.field-meta.xml
│           │   │   │   ├── Schedule_Cron__c.field-meta.xml
│           │   │   │   ├── Schedule_DayOfMonth__c.field-meta.xml
│           │   │   │   ├── Schedule_DayOfWeek__c.field-meta.xml
│           │   │   │   ├── Schedule_Frequency__c.field-meta.xml
│           │   │   │   ├── Schedule_HourOfDay__c.field-meta.xml
│           │   │   │   ├── Schedule_MinuteOfHour__c.field-meta.xml
│           │   │   │   ├── Schedule_MonthOfYear__c.field-meta.xml
│           │   │   │   ├── Schedule_SecondOfMinute__c.field-meta.xml
│           │   │   │   ├── Source_Apex_Class__c.field-meta.xml
│           │   │   │   ├── Source_List_View_ID__c.field-meta.xml
│           │   │   │   ├── Source_Report_Column_Name__c.field-meta.xml
│           │   │   │   ├── Source_Report_ID__c.field-meta.xml
│           │   │   │   ├── Source_SOQL_Query__c.field-meta.xml
│           │   │   │   ├── Source_Type__c.field-meta.xml
│           │   │   │   ├── Target_Action_Name__c.field-meta.xml
│           │   │   │   ├── Target_Apex_Script__c.field-meta.xml
│           │   │   │   ├── Target_SObject_Type__c.field-meta.xml
│           │   │   │   └── Target_Type__c.field-meta.xml
│           │   │   └── listViews/
│           │   │       └── All.listView-meta.xml
│           │   ├── Mass_Action_Job_Change_Event__e/
│           │   │   ├── Mass_Action_Job_Change_Event__e.object-meta.xml
│           │   │   └── fields/
│           │   │       └── Payload__c.field-meta.xml
│           │   ├── Mass_Action_Log__c/
│           │   │   ├── Mass_Action_Log__c.object-meta.xml
│           │   │   ├── compactLayouts/
│           │   │   │   ├── Child_Log_Compact_Layout.compactLayout-meta.xml
│           │   │   │   ├── Default_Compact_Layout.compactLayout-meta.xml
│           │   │   │   └── Parent_Log_Compact_Layout.compactLayout-meta.xml
│           │   │   ├── fields/
│           │   │   │   ├── Batch_Success_Percentage__c.field-meta.xml
│           │   │   │   ├── Batch_Success_Rate__c.field-meta.xml
│           │   │   │   ├── Failed_Batches__c.field-meta.xml
│           │   │   │   ├── Job_ID__c.field-meta.xml
│           │   │   │   ├── Job_Scope__c.field-meta.xml
│           │   │   │   ├── Long_Message__c.field-meta.xml
│           │   │   │   ├── Mass_Action_Configuration__c.field-meta.xml
│           │   │   │   ├── Message_Type__c.field-meta.xml
│           │   │   │   ├── Message__c.field-meta.xml
│           │   │   │   ├── Parent_Log_Configuration__c.field-meta.xml
│           │   │   │   ├── Parent_Log__c.field-meta.xml
│           │   │   │   ├── Processed_Batches__c.field-meta.xml
│           │   │   │   ├── Submitted_Date__c.field-meta.xml
│           │   │   │   ├── Timestamp__c.field-meta.xml
│           │   │   │   └── Total_Batches__c.field-meta.xml
│           │   │   ├── listViews/
│           │   │   │   ├── All.listView-meta.xml
│           │   │   │   └── All_Parent_Logs.listView-meta.xml
│           │   │   └── recordTypes/
│           │   │       ├── Child_Log.recordType-meta.xml
│           │   │       └── Parent_Log.recordType-meta.xml
│           │   └── Mass_Action_Mapping__c/
│           │       ├── Mass_Action_Mapping__c.object-meta.xml
│           │       ├── compactLayouts/
│           │       │   └── Default_Compact_Layout.compactLayout-meta.xml
│           │       └── fields/
│           │           ├── Mass_Action_Configuration__c.field-meta.xml
│           │           ├── Source_Field_Name__c.field-meta.xml
│           │           └── Target_Field_Name__c.field-meta.xml
│           ├── pages/
│           │   ├── LC_APIPage.page
│           │   ├── LC_APIPage.page-meta.xml
│           │   ├── LC_VisualforceDomainPage.page
│           │   ├── LC_VisualforceDomainPage.page-meta.xml
│           │   ├── MA_SetupAuthWizardPage.page
│           │   └── MA_SetupAuthWizardPage.page-meta.xml
│           ├── permissionsets/
│           │   └── Mass_Action_Admin.permissionset-meta.xml
│           ├── quickActions/
│           │   ├── Mass_Action_Configuration__c.Quick_Edit.quickAction-meta.xml
│           │   ├── Mass_Action_Configuration__c.Run.quickAction-meta.xml
│           │   └── Mass_Action_Configuration__c.Run_via_Flow.quickAction-meta.xml
│           ├── reports/
│           │   ├── Mass_Action_Test_Reports/
│           │   │   └── MA_Test_Account_Report.report-meta.xml
│           │   └── Mass_Action_Test_Reports.reportFolder-meta.xml
│           ├── staticresources/
│           │   ├── MA_SalesforceSecurityLogo.resource-meta.xml
│           │   ├── jquery.js
│           │   ├── jquery.resource-meta.xml
│           │   ├── jsforce.js
│           │   ├── jsforce.resource-meta.xml
│           │   ├── penpal.js
│           │   └── penpal.resource-meta.xml
│           ├── tabs/
│           │   ├── MA_SetupAuthWizardPageTab.tab-meta.xml
│           │   ├── Mass_Action_Configuration__c.tab-meta.xml
│           │   └── Mass_Action_Log__c.tab-meta.xml
│           ├── testSuites/
│           │   └── Mass_Action_Scheduler_Test_Suite.testSuite-meta.xml
│           └── triggers/
│               ├── MA_BatchApexStatusEventTrigger.trigger
│               ├── MA_BatchApexStatusEventTrigger.trigger-meta.xml
│               ├── MA_JobChangeEventTrigger.trigger
│               ├── MA_JobChangeEventTrigger.trigger-meta.xml
│               ├── MA_MassActionConfigTrigger.trigger
│               ├── MA_MassActionConfigTrigger.trigger-meta.xml
│               ├── MA_MassActionLogTrigger.trigger
│               └── MA_MassActionLogTrigger.trigger-meta.xml
├── licenses/
│   ├── appiphony.txt
│   ├── jquery.txt
│   ├── jsforce.txt
│   ├── penpal.txt
│   ├── sfdc-lax.txt
│   └── soql-parser.txt
├── manifest/
│   └── package.xml
├── scripts/
│   ├── create-scratch-org.sh
│   └── recreate-manifest.sh
└── sfdx-project.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .forceignore
================================================
# List files or directories below to ignore them when running force:source:push, force:source:pull, and force:source:status
# More information: https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_exclude_source.htm
#

package.xml

# LWC configuration files
**/jsconfig.json
**/.eslintrc.json

# LWC Jest
**/__tests__/**

# Profiles
**/*.profile

# Demo metadata not core to the project but may be deployed
# in an org as I test the application in a browser.
**DEMO_**

================================================
FILE: .github/CODEOWNERS
================================================
#
# Code Owners File Format
# https://help.github.com/articles/about-code-owners/
#
# A CODEOWNERS file uses a pattern that follows the same rules used in gitignore files.
# The pattern is followed by one or more GitHub usernames or team names using the
# standard @username or @org/team-name format. You can also refer to a user by an
# email address that has been added to their GitHub account, for example user@example.com.
#

*       @douglascayers


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: https://www.paypal.me/douglascayers/ # Replace with a single custom sponsorship URL


================================================
FILE: .github/ISSUE_TEMPLATE/BUG_REPORT.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: "discussion \U0001F4AC"
assignees: douglascayers

---

<!--
NOTICE: While GitHub is the preferred channel for reporting issues/feedback, please use the [Trailblazer community group](https://success.salesforce.com/_ui/core/chatter/groups/GroupProfilePage?g=0F93A000000LhvN) to ask questions about how to use Mass Action Scheduler or to share how you're using the app at your company.

NOTICE: Your issue may already be reported. Before opening a new issue, please see our [Frequently Asked Questions](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Frequently-Asked-Questions) and search the [issue tracker](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/issues).
-->

## Summary
<!-- Short summary of what is going on or to provide context. -->


## Version of Mass Action Scheduler
<!-- See https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler#packaged-release-history for latest version of the app. -->


## Steps To Reproduce
<!-- Help me, help you by telling me exactly how to reproduce the issue. -->

1. List steps that cause the issue
2. Screen shots are also helpful


## Expected Behavior
<!-- Describe what should have happened. -->


## Actual Result
<!-- Describe what actually happened instead. -->


## Source Type
<!-- If applicable, indicate which source type your configuration is using by placing an X in the brackets. -->

- [ ] Reports
- [ ] List Views
- [ ] SOQL Queries


## Action Type
<!-- If applicable, indicate which action type your configuration is using by placing an X in the brackets. -->

- [ ] Process Builder & Flows
- [ ] Workflow Rules
- [ ] Email Alerts
- [ ] Quick Actions
- [ ] Apex


## Does your configuration use Named Credentials?

<!--
NOTICE: Since [Release 2.0](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Upgrading-to-Release-2.0#get-started-faster-with-optional-named-credentials), Named Credentials are optional. Please try your configuration without assigning a Named Credential and see if your issue still occurs.

When using Named Credentials, make sure that you've enabled [My Domain](https://trailhead.salesforce.com/en/content/learn/modules/identity_login/identity_login_my_domain) and have followed [these setup instructions](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Specify-the-Context-User-via-Named-Credentials).
-->


================================================
FILE: .github/ISSUE_TEMPLATE/DOCUMENTATION_REQUEST.md
================================================
---
name: Documentation request
about: Suggest a change to documentation
title: ''
labels: documentation 📓
assignees: ''

---

<!--
  Documentation lives in the project wiki at
  https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki
-->

## Is your documentation request related to an existing wiki page? If yes, which pages?
<!-- Please paste the links to the wiki pages here -->


## Describe the documentation change you're offering or requesting.
<!-- A clear and concise description of what you want to happen. -->



================================================
FILE: .github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement ✨
assignees: ''

---

## Is your feature request related to a problem? Please describe.
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->


## Describe the solution you'd like.
<!-- A clear and concise description of what you want to happen. -->


## Describe alternatives you've considered.
<!-- A clear and concise description of any alternative solutions or features you've considered. -->


## Additional context.
<!-- Add any other context or screenshots about the feature request here. -->



================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
### What does this pull request do?


### What issues does this pull request fix or reference?


================================================
FILE: .github/workflows/main.yml
================================================
name: CI

on:
  # Trigger the workflow on push or pull request,
  # but only for the master branch.
  push:
    branches:
      - main
      - develop
  pull_request:
    branches:
      - main
      - develop

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - name: Create Auth URL to DevHub from secrets
      run: echo ${{ secrets.SFDX_DEVHUB_URL }} > ./SFDX_DEVHUB_URL.txt

    - name: Restore npm Cache
      id: cache
      uses: actions/cache@v3
      with:
        path: ~/.npm
        key: ${{ runner.os }}-npm

    - name: Install Salesforce CLI
      if: steps.cache.outputs.cache-hit != 'true'
      run: npm install sfdx-cli npx

    - name: Update Dependencies
      run: |
        npm update sfdx-cli npx
        npx sfdx-cli --version
        npx sfdx-cli plugins --core

    - name: Authorize DevHub
      run: npx sfdx-cli force:auth:sfdxurl:store --sfdxurlfile ./SFDX_DEVHUB_URL.txt --setalias devhub --setdefaultdevhubusername

    - name: Create Scratch Org
      run: npx sfdx-cli force:org:create --targetdevhubusername devhub --setalias ciorg --setdefaultusername --definitionfile config/project-scratch-def.json --durationdays 1

    - name: Push Source
      run: npx sfdx-cli force:source:push --targetusername ciorg

    - name: Assign Permission Set
      run: npx sfdx-cli force:user:permset:assign --targetusername ciorg --permsetname Mass_Action_Admin

    - name: Load Test Data
      # The test account name, "dca_mass_action: MA Test Account", includes a colon ":", which breaks the yaml parser.
      # As workaround, I put the test name as a secret and bind that to the query instead.
      run: npx sfdx-cli force:data:record:create --targetusername ciorg --sobjecttype Account --values "Name='${{ secrets.TEST_ACCOUNT_NAME_FOR_APEX_TESTS }}'"

    - name: Run Apex Tests
      run: npx sfdx-cli force:apex:test:run --targetusername ciorg --codecoverage --resultformat human --suitenames Mass_Action_Scheduler_Test_Suite --outputdir ./test-results/apex --wait 20

    - name: Collect Flow Test Coverage
      run: |
        npx sfdx-cli force:data:soql:query --targetusername ciorg --usetoolingapi --query "SELECT FlowVersionId, FlowVersion.Definition.DeveloperName, MAX(NumElementsCovered) ItemsCovered, MIN(NumElementsNotCovered) ItemsNotCovered FROM FlowTestCoverage WHERE FlowVersionId IN (SELECT ActiveVersionId FROM FlowDefinition) GROUP BY FlowVersionId, FlowVersion.Definition.DeveloperName" --json | jq -r '[ .result.records[] | ( .ItemsCovered + .ItemsNotCovered ) as $totalLines | ( ( .ItemsCovered / $totalLines * 100 ) | floor ) as $coveredPercent | { id: .FlowVersionId, name: ( .DeveloperName + ".flow-meta.xml" ), totalLines: $totalLines, totalCovered: .ItemsCovered, coveredPercent: $coveredPercent } ]' > ./test-results/apex/test-result-flowcoverage.json
        npx sfdx-cli force:data:soql:query --targetusername ciorg --usetoolingapi --query "SELECT ActiveVersionId, DeveloperName FROM FlowDefinition WHERE ActiveVersionId NOT IN ( SELECT FlowVersionId FROM FlowTestCoverage ) AND ActiveVersion.ProcessType IN ( 'AutoLaunchedFlow', 'CustomEvent', 'InvocableProcess', 'Workflow' )" --json | jq -r '[ .result.records[] | { id: .ActiveVersionId, name: ( .DeveloperName + ".flow-meta.xml" ), totalLines: 0, totalCovered: 0, coveredPercent: 0 } ]' > ./test-results/apex/test-result-noflowcoverage.json

    - name: Upload Code Coverage
      # Uploads code coverage results to Codecov.io.
      # https://codecov.io/gh/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler
      uses: codecov/codecov-action@v2
      with:
        token: ${{ secrets.CODECOV_TOKEN }}

    - name: Delete Scratch Org
      run: npx sfdx-cli force:org:delete --targetdevhubusername devhub --targetusername ciorg --noprompt


================================================
FILE: .gitignore
================================================
# Salesforce DX configuration files.
.sfdx/
.sf/

# IlluminatedCloud configuration files.
.idea/
IlluminatedCloud/
*.iml

# Visual Studio Code configuration files.
.vscode/

# A temp directory where build scripts convert
# source files to metadata format.
mdapi/

================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Salesforce Open Source Community Code of Conduct

## About the Code of Conduct

Equality is a core value at Salesforce. We believe a diverse and inclusive
community fosters innovation and creativity, and are committed to building a
culture where everyone feels included.

Salesforce open-source projects are committed to providing a friendly, safe, and
welcoming environment for all, regardless of gender identity and expression,
sexual orientation, disability, physical appearance, body size, ethnicity, nationality, 
race, age, religion, level of experience, education, socioeconomic status, or 
other similar personal characteristics.

The goal of this code of conduct is to specify a baseline standard of behavior so
that people with different social values and communication styles can work
together effectively, productively, and respectfully in our open source community.
It also establishes a mechanism for reporting issues and resolving conflicts.

All questions and reports of abusive, harassing, or otherwise unacceptable behavior
in a Salesforce open-source project may be reported by contacting the Salesforce
Open Source Conduct Committee at ossconduct@salesforce.com.

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of gender 
identity and expression, sexual orientation, disability, physical appearance, 
body size, ethnicity, nationality, race, age, religion, level of experience, education, 
socioeconomic status, or other similar personal characteristics.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy toward other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Personal attacks, insulting/derogatory comments, or trolling
* Public or private harassment
* Publishing, or threatening to publish, others' private information—such as
a physical or electronic address—without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
* Advocating for or encouraging any of the above behaviors

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned with this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project email
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the Salesforce Open Source Conduct Committee 
at ossconduct@salesforce.com. All complaints will be reviewed and investigated 
and will result in a response that is deemed necessary and appropriate to the 
circumstances. The committee is obligated to maintain confidentiality with 
regard to the reporter of an incident. Further details of specific enforcement 
policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership and the Salesforce Open Source Conduct 
Committee.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][contributor-covenant-home],
version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html. 
It includes adaptions and additions from [Go Community Code of Conduct][golang-coc], 
[CNCF Code of Conduct][cncf-coc], and [Microsoft Open Source Code of Conduct][microsoft-coc].

This Code of Conduct is licensed under the [Creative Commons Attribution 3.0 License][cc-by-3-us].

[contributor-covenant-home]: https://www.contributor-covenant.org (https://www.contributor-covenant.org/)
[golang-coc]: https://golang.org/conduct
[cncf-coc]: https://github.com/cncf/foundation/blob/master/code-of-conduct.md
[microsoft-coc]: https://opensource.microsoft.com/codeofconduct/
[cc-by-3-us]: https://creativecommons.org/licenses/by/3.0/us/


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Mass Action Scheduler

:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:

The following is a set of guidelines for contributing to Mass Action Scheduler and its packages,
which are hosted in the [Salesforce Mass Action Scheduler](https://github.com/sfdx-mass-action-scheduler) organization on GitHub.

## Table of Contents

[Code of Conduct](#code-of-conduct)

[How Can I Contribute?](#how-can-i-contribute)
  * [Reporting Bugs](#reporting-bugs)
  * [Suggesting Enhancements](#suggesting-enhancements)
  * [Pull Requests](#pull-requests)

[Styleguides](#styleguides)

[Additional Notes](#additional-notes)


## Code of Conduct

This project and everyone participating in it is governed by the [Code of Conduct](CODE_OF_CONDUCT.md).
By participating, you are expected to uphold this code.


## How Can I Contribute?

### Reporting Bugs

This section guides you through submitting a bug report for Mass Action Scheduler.
Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:.

Before creating bug reports, please check [this list](#before-submitting-a-bug-report) as you might find out that you don't need to create one.

When you are creating a bug report, please include as many details as possible.
Fill out [the template](.github/ISSUE_TEMPLATE/BUG_REPORT.md), the information it asks for helps us resolve issues faster.

> **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one.

#### Before Submitting A Bug Report

* Read the [wiki](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki) for documentation and usage.
* Check the [FAQ](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Frequently-Asked-Questions). Your question might already be answered.
* Review conversations in the [community group](https://success.salesforce.com/_ui/core/chatter/groups/GroupProfilePage?g=0F93A000000LhvN). Your issue might already have been discussed.
* Perform a [cursory search](https://github.com/search?utf8=%E2%9C%93&q=repo%3Asfdx-mass-action-scheduler%2Fsfdx-mass-action-scheduler&type=issues) to see if the problem has already been reported. If it has **and the issue is still open**, add a comment to the existing issue instead of opening a new one.

#### How Do I Submit A (Good) Bug Report?

Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/).

* **Use a clear and descriptive title** for the issue to identify the problem.
* **Describe the exact steps which reproduce the problem** in as many details as possible. For example, when listing steps, **don't just say what you did, but explain how you did it**.
* **Provide specific examples to demonstrate the steps**.
* **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior.
* **Explain which behavior you expected to see instead and why.**
* **Include screenshots and animated GIFs** which show you following the described steps and clearly demonstrate the problem.
* **Include any error messages and information from Mass Action Logs.**

### Suggesting Enhancements

This section guides you through submitting an enhancement suggestion for Mass Action Scheduler,
including completely new features and minor improvements to existing functionality.
Following these guidelines helps maintainers and the community understand your suggestion :pencil: and find related suggestions :mag_right:.

Before creating enhancement suggestions, please check [this list](#before-submitting-an-enhancement-suggestion) as you might find out that you don't need to create one.

When you are creating an enhancement suggestion, please include as many details as possible.
Fill out [the template](.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md), including how you imagine you would use the requested feature.

#### Before Submitting An Enhancement Suggestion

* Read the [wiki](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki) for documentation and usage. The feature might already exist.
* Perform a [cursory search](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22enhancement+%E2%9C%A8%22) to see if the enhancement has already been requested. If it has **and the request is still open**, add a comment to the existing request instead of opening a new one.

#### How Do I Submit A (Good) Enhancement Suggestion?

Enhancements are tracked as [GitHub issues](https://guides.github.com/features/issues/).

* **Use a clear and descriptive title** for the issue to identify the suggestion.
* **Provide a step-by-step description** of the suggested enhancement in as many details as possible.
* **Describe the current behavior** and **explain which behavior you expected to see instead** and why.
* **Explain why this enhancement would be useful.**
* **Include screenshots and animated GIFs** which help you demonstrate the steps or point out the part of Mass Action Scheduler which the suggestion is related to.
* **Specify which version of Mass Action Scheduler you're using.** Determine the version number by going to Setup, search for `Installed` in the Quick Find box, then click **Installed Packages**.

### Pull Requests

Please follow these steps to have your contribution considered by the maintainers. We follow the [GitHub Flow](https://guides.github.com/introduction/flow/) to submit pull requests from feature branches from forks of this project.

1. Fork the repo
    * https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler
2. Check out a new branch and name it to what you intend to do
    * Use one branch per fix / feature
3. Commit your changes
    * Follow the [styleguides](#styleguides)
    * Provide a git message that explains what you've done
    * Commit to your forked repository
4. Push to the branch of your forked repository
5. Make a pull request to the main repository
    * Follow all instructions in the [template](.github/PULL_REQUEST_TEMPLATE.md)

While the prerequisites above must be satisfied prior to having your pull request reviewed,
the reviewer(s) may ask you to complete additional design work, tests, or other changes before your pull request can be ultimately accepted.


## Styleguides

Follow the coding convention and standards of the code in the project.


## Additional Notes

### Issue and Pull Request Labels

Labels help us track and manage issues and pull requests.
Refer to the full list of labels and their descriptions [here](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/labels).

[GitHub search](https://help.github.com/articles/searching-issues/) makes it easy to use labels for finding groups of issues or pull requests you're interested in.
We encourage you to read about [other search filters](https://help.github.com/articles/searching-issues/) which will help you write more focused queries.



================================================
FILE: LICENSE
================================================
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


================================================
FILE: README.md
================================================
<!-- SHIELDS -->
[![Latest Version][version-shield]][version-url]
[![Salesforce Community Support][community-shield]][community-url]
[![Sponsor][sponsor-shield]][sponsor-url]
[![License][license-shield]][license-url]
[![Build Status][cicd-shield]][cicd-url]
[![Code Coverage][codecov-shield]][codecov-url]

<!-- PROJECT LOGO -->
<p align="center">
  <a href="https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/">
    <img src="images/mas-logo.png" alt="Mass Action Scheduler Logo" border="0" />
  </a>
  <br />
  Declaratively schedule process automation from reports and list views!
  <br />
  <a href="https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki"><strong>Explore the docs »</strong></a>
  <br />
  <br />
  <a href="https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Examples">View Examples</a>
  ·
  <a href="https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/issues">Report Bug</a>
  ·
  <a href="https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/issues">Request Feature</a>
</p>

## 📝 Table of Contents

* [About the Project](#-about-the-project)
* [Features](#-features)
* [Roadmap](#-roadmap)
* [Documentation and Discussion](#-documentation-and--discussion)
* [Getting Started](#-getting-started)
  - [Prerequisites](#-prerequisites)
  - [Install Package](#-install-package)
* [Sponsoring](#-sponsoring)
* [Contributing](#-contributing)
* [Authors](#️-authors)
* [Acknowledgements](#-acknowledgements)
* [License](#-license)

## 🧐 About the Project

#### 🗣 Ethos

Mass Action Scheduler is a [free-as-in-speech](https://www.howtogeek.com/howto/31717/what-do-the-phrases-free-speech-vs.-free-beer-really-mean/) and [open source](https://opensource.com/resources/what-open-source) developed passion project of [Doug Ayers](https://douglascayers.com).

#### 💪 Mission

Put the power of [Batch Apex](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_batch.htm) within reach of [declarative configuration](https://help.salesforce.com/articleView?id=extend_click_intro.htm&type=5).

#### 🚀 Value Proposition

Declaratively schedule Process Builder, Flows, Quick Actions, Email Alerts, Workflow Rules, or Apex to process records from Reports, List Views, SOQL, or Apex.

No more waiting for records to be updated or creating clever workarounds to cause records to be updated to cause these actions to fire.

##### Choose source data to process

![image](https://raw.githubusercontent.com/wiki/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/images/sources-choose-source.png)

##### Choose an action to automate

![image](https://raw.githubusercontent.com/wiki/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/images/actions-choose-action.png)

##### Map fields as inputs to selected action

![image](https://raw.githubusercontent.com/wiki/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/images/field-mappings-choose-fields.png)

##### Choose how often to automate action

![image](https://raw.githubusercontent.com/wiki/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/images/schedule-choose-scheduled.png)

##### Receive near real-time updates on batch job successes and failures

![image](https://raw.githubusercontent.com/wiki/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/images/related-logs-of-parent-log-with-errors.png)

#### 💡 Inspiration

This project is inspired by the following IdeaExchange ideas. Please vote them up to increase chances this functionality becomes standard on the Salesforce platform. Thank you!

Inspired by Marie Chandra's idea [Ability to Schedule when Process Builder Triggers](https://success.salesforce.com/ideaView?id=08730000000DjEmAAK).

Inspired by Narender Singh's idea [Ability to schedule flows, workflows and processes in process builder](https://success.salesforce.com/ideaView?id=0873A000000EA71QAG).

## 🎈 Features

**Declarative** - no code necessary, never write Batch Apex again for queries that can be expressed in a report or list view and actions that can be expressed with a declarative alternative.

**On Platform** - everything happens in Salesforce so no exporting or uploading data necessary.

**Timely** - run actions [manually](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/On-Demand-Scheduling) or [schedule](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Scheduling) hourly, daily, weekly, or any time in between.

**Versatile** - explore the many [data sources](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Sources) and [actions](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Actions) that can be [scheduled](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Scheduling) with Mass Action Scheduler.

## 🗺 Roadmap

See the [open issues](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/issues) for a list of proposed features (and known issues).

See the [open milestones](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/milestones?state=open) for a list of upcoming planned releases.

## 📘 Documentation and 💬 Discussion

Read the [wiki](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki) for documentation on Mass Action Scheduler.

Read the [FAQ](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Frequently-Asked-Questions) to troubleshoot common technical issues.

Join our [community group](https://success.salesforce.com/_ui/core/chatter/groups/GroupProfilePage?g=0F93A000000LhvN) to discuss and solution with other Mass Action Scheduler users.

Raise well defined issues and ideas via the [issue tracker](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/issues).

## 👋 Getting Started

### 🚨 Prerequisites

There are a few items you need to setup before installing and using this app.

1. You will need to [Enable Lightning Experience](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Prerequisites#1-enable-lightning-experience) because we are using Lightning Components.
2. You will need to [Enable My Domain](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Prerequisites#2-enable-my-domain) because we are using Lightning Components.
3. You will need to [Allow IFraming of Visualforce Pages with Clickjack Protection](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Prerequisites#3-allow-iframing-of-visualforce-pages-with-clickjack-protection) because we iframe pages in Lightning Components.

Please see the [instructions in the wiki](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Prerequisites) for screen shots and step-by-steps.

### 📦 Install Package

1. See the [Release Notes](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Release-Notes) for install links to each package version.
2. Assign the **Mass Action Admin** permission set to users who will configure mass actions.
3. Finish reviewing the [Getting Started](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Getting-Started) instructions.

## 💎 Sponsoring

Mass Action Scheduler is a [free-as-in-speech](https://www.howtogeek.com/howto/31717/what-do-the-phrases-free-speech-vs.-free-beer-really-mean/) and [open source](https://opensource.com/resources/what-open-source) developed passion project of [Doug Ayers](https://douglascayers.com).

If you've found value in my open source projects, please consider showing your support:
  * ⭐️ [Star](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler) this project on GitHub
  * 📣 [Tweet](https://twitter.com/intent/tweet/?url=https%3A%2F%2Fgithub.com%2Fsfdx-mass-action-scheduler%2Fsfdx-mass-action-scheduler&text=%F0%9F%9A%80%20Declaratively%20schedule%20Process%20Builder%2C%20Flows%2C%20Quick%20Actions%2C%20Email%20Alerts%2C%20Workflow%20Rules%2C%20or%20Apex%20to%20process%20records%20from%20Reports%2C%20List%20Views%2C%20SOQL%2C%20or%20Apex%20with%20%23MassActionScheduler%20by%20%40DouglasCAyers&related=douglascayers%2Csalesforcedevs&hashtags=salesforce) this project to your followers
  * Contribute a ☕️ or 🌮 via my [virtual tip jar on PayPal](https://www.paypal.me/douglascayers/)

Thank you! ❤️

https://douglascayers.com/thanks-for-your-support/

## 🙏 Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.

Please see the [guidelines for contributing](CONTRIBUTING.md) for more details.

For documentation contributions (the [wiki](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki)), please [open an issue](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/issues) with your suggested changes.

For code contributions, please follow the [GitHub flow](https://help.github.com/en/articles/github-flow):
1. Fork this project and [install the source code](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Install-Source-Code).
2. Create your feature branch (`git checkout -b feature/AmazingFeature`).
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`).
4. Push to your feature branch (`git push origin feature/AmazingFeature`).
5. Open a pull request to the `develop` branch.

## ✍️ Authors

[Doug Ayers](https://douglascayers.com) develops and maintains the project.

See also the list of [contributors](https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/contributors) who participated in this project.

## 🎉 Acknowledgements

[Appiphony](http://www.lightningstrike.io) for developing the Strike Wizard component based on Lightning Design System [Path blueprint](https://www.lightningdesignsystem.com/components/path/).

[Salesforce Foundation](https://github.com/SalesforceFoundation/CampaignTools) for developing tools for querying Salesforce Reports API in Apex.

[Shinichi Tomita](https://twitter.com/stomita) for developing [jsforce](https://jsforce.github.io/) and [soql-parse](https://github.com/stomita/soql-parse) libraries for easy use of Salesforce REST APIs in JavaScript.

[jQuery](https://jquery.com/) for developing jQuery library.

[Aaron Hardy](https://twitter.com/aaronius) for developing [Penpal](https://github.com/Aaronius/penpal), a promise-based library for securely communicating with iframes via postMessage.

## 👀 License

The source code is licensed under the [BSD 3-Clause License](LICENSE).

<!-- MARKDOWN LINKS & IMAGES -->

[version-shield]: https://img.shields.io/github/tag/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler.svg?label=release&color=green
[version-url]: https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Release-Notes

[license-shield]: https://img.shields.io/github/license/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler.svg?label=license&color=green
[license-url]: LICENSE

[community-shield]: https://img.shields.io/badge/-Join_our_Community-blue.svg?logo=salesforce&logoColor=white
[community-url]: https://success.salesforce.com/_ui/core/chatter/groups/GroupProfilePage?g=0F93A000000LhvN

[cicd-shield]: https://img.shields.io/github/workflow/status/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/CI?logo=github
[cicd-url]: https://circleci.com/gh/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler

[codecov-shield]: https://img.shields.io/codecov/c/github/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler.svg?logo=codecov
[codecov-url]: https://codecov.io/gh/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler

<!-- https://stackoverflow.com/questions/42679712/why-does-the-red-heart-emoji-require-two-code-points-but-the-other-colored-hear -->
[sponsor-shield]: https://img.shields.io/badge/-💜_Sponsor_this_project-ff69b4.svg
[sponsor-url]: https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/blob/master/README.md#-sponsoring


================================================
FILE: _config.yml
================================================
theme: jekyll-theme-cayman
title: Mass Action Scheduler


================================================
FILE: _layouts/default.html
================================================
<!DOCTYPE html>
<html lang="{{ site.lang | default: "en-US" }}">

<head>

    <meta charset="UTF-8">

    {% seo %}

    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="theme-color" content="#157878">

    <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}">

</head>

<body>

    <section class="page-header">

        <h1 class="project-name">{{ site.title | default: site.github.repository_name }}</h1>
        <h2 class="project-tagline">{{ site.description | default: site.github.project_tagline }}</h2>

        {% if site.github.is_project_page %}
            <a href="{{ site.github.repository_url }}" class="btn">View on GitHub</a>
            <a href="#-getting-started" class="btn">Install Package</a>
            <a href="{{ site.github.repository_url }}/wiki" class="btn">Documentation</a>
            <a href="#-sponsoring" class="btn">❤️ Sponsor</a>
        {% endif %}

        {% if site.show_downloads %}
            <a href="{{ site.github.zip_url }}" class="btn">Download .zip</a>
            <a href="{{ site.github.tar_url }}" class="btn">Download .tar.gz</a>
        {% endif %}

    </section>

    <section class="main-content">

        {{ content }}

        <footer class="site-footer">
            {% if site.github.is_project_page %}
                <span class="site-footer-owner">
                    <a href="{{ site.github.repository_url }}">{{ site.github.repository_name }}</a>
                    is maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a>.
                </span>
            {% endif %}
            <span class="site-footer-credits">
                This page was generated by <a href="https://pages.github.com">GitHub Pages</a>.
            </span>
        </footer>

    </section>

</body>

</html>


================================================
FILE: config/project-scratch-def.json
================================================
{
    "orgName": "Mass Action Scheduler",
    "edition": "Enterprise",
    "hasSampleData": false,
    "features": [],
    "settings": {
        "mobileSettings": {
            "enableS1EncryptedStoragePref2": false
        },
        "securitySettings": {
            "sessionSettings": {
                "enableClickjackNonsetupUser": false,
                "enableClickjackNonsetupUserHeaderless": false
            }
        }
    }
}


================================================
FILE: force-app/main/default/applications/Mass_Action_Scheduler.app-meta.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<CustomApplication xmlns="http://soap.sforce.com/2006/04/metadata">
    <defaultLandingTab>Mass_Action_Configuration__c</defaultLandingTab>
    <description>Declaratively schedule records from Reports or List Views to be processed by Workflow Rules, Process Builder, Flows, and Apex. https://douglascayers.com</description>
    <isNavAutoTempTabsDisabled>false</isNavAutoTempTabsDisabled>
    <isNavPersonalizationDisabled>false</isNavPersonalizationDisabled>
    <label>Mass Action Scheduler</label>
    <tabs>Mass_Action_Configuration__c</tabs>
    <tabs>MA_SetupAuthWizardPageTab</tabs>
    <tabs>Mass_Action_Log__c</tabs>
    <tabs>standard-report</tabs>
</CustomApplication>


================================================
FILE: force-app/main/default/applications/Mass_Action_Scheduler_Lightning.app-meta.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<CustomApplication xmlns="http://soap.sforce.com/2006/04/metadata">
    <actionOverrides>
        <actionName>View</actionName>
        <comment>Action override created by Lightning App Builder during activation.</comment>
        <content>Mass_Action_Configuration_Record_Page_One_Column</content>
        <formFactor>Large</formFactor>
        <skipRecordTypeSelect>false</skipRecordTypeSelect>
        <type>Flexipage</type>
        <pageOrSobjectType>Mass_Action_Configuration__c</pageOrSobjectType>
    </actionOverrides>
    <actionOverrides>
        <actionName>View</actionName>
        <comment>Action override created by Lightning App Builder during activation.</comment>
        <content>Mass_Action_Log_Record_Page</content>
        <formFactor>Large</formFactor>
        <skipRecordTypeSelect>false</skipRecordTypeSelect>
        <type>Flexipage</type>
        <pageOrSobjectType>Mass_Action_Log__c</pageOrSobjectType>
    </actionOverrides>
    <brand>
        <headerColor>#2C94BA</headerColor>
        <logo>maslogominimal</logo>
        <logoVersion>1</logoVersion>
        <shouldOverrideOrgTheme>true</shouldOverrideOrgTheme>
    </brand>
    <description>Declaratively schedule process automation from reports and list views</description>
    <formFactors>Large</formFactors>
    <isNavAutoTempTabsDisabled>false</isNavAutoTempTabsDisabled>
    <isNavPersonalizationDisabled>false</isNavPersonalizationDisabled>
    <label>Mass Action Scheduler</label>
    <navType>Standard</navType>
    <setupExperience>all</setupExperience>
    <tabs>Mass_Action_Configuration__c</tabs>
    <tabs>MA_SetupAuthWizardPageTab</tabs>
    <tabs>Mass_Action_Log__c</tabs>
    <tabs>standard-report</tabs>
    <uiType>Lightning</uiType>
</CustomApplication>


================================================
FILE: force-app/main/default/aura/LC_API/LC_API.cmp
================================================
<!--
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/douglascayers/sfdx-lightning-api-component
License: BSD 3-Clause License
 -->
<aura:component controller="LC_VisualforceDomainController">

    <ltng:require scripts="{!$Resource.penpal}"
                  afterScriptsLoaded="{!c.onScriptsLoaded}"/>

    <aura:attribute name="iframeSrc"
                    type="String"
                    access="private"
                    description="Which visualforce page to load for bridging API calls."/>

    <aura:attribute name="penpalFrameCreated"
                    type="Boolean"
                    access="private"
                    default="false"
                    description="Has the Penpal iframe been created?"/>

    <aura:attribute name="penpalFrameConnected"
                    type="Boolean"
                    access="private"
                    default="false"
                    description="Has the Penpal iframe been connected?"/>

    <aura:handler name="init" value="{!this}" action="{!c.onInit}"/>

    <aura:handler name="render" value="{!this}" action="{!c.onRender}"/>

    <!--
        Makes a Salesforce REST API request and returns a promise that resolves to the response.

        @param request
            JSON object with properties:
            'url'     (String, required) The Salesforce REST endpoint to call.
            'method'  (String, optional) The http method like 'get' or 'post'. Default is 'get'.
            'body'    (String, optional) The request body, varies by the endpoint you're calling.
            'headers' (Map, optional)    String key-value pairs of http headers to send.
                                         Default is { 'Content-Type' : 'application/json' }.
                                         Your headers are merged with the default headers,
                                         overwriting any existing keys.

        Example usage:
            component.find( 'lcAPI' ).restRequest({
                'url' : '/services/data/v54.0/sobjects/Account',
                'method' : 'post',
                'body' : JSON.stringify({
                    'Name' : 'Salesforce',
                    'BillingStreet' : '1 Market Street',
                    'BillingCity' : 'San Francisco',
                    'BillingState' : 'CA'
                }),
                'headers' : {
                    'Sforce-Query-Options' : 'batchSize=200'
                }
            }).then( $A.getCallback( function( response ) {
                // handle response
            })).catch( $A.getCallback( function( err ) {
                // handle error
            }));
     -->
    <aura:method name="restRequest" action="{!c.onRestRequest}">
        <aura:attribute name="request"
                        type="Map"
                        required="true"
                        description="Supports these keys: url (string), method (string), body (string), headers (map)."/>
    </aura:method>

    <!--
        Makes a JavaScript Fetch request and returns a promise that resolves to the response.
        https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch

        @param request
            JSON object with properties:
            'url'     (String, required) The url to fetch.
            'options' (Map, optional)    The init options for the request.

        Example usage:
            component.find( 'lcAPI' ).fetchRequest({
                'url' : 'https://example.com',
                'options': {
                    'method' : 'GET',
                    'headers' : {
                        'Accepts' : 'application/json'
                    }
                }
            }).then( $A.getCallback( function( response ) {
                // handle response
            })).catch( $A.getCallback( function( err ) {
                // handle error
            }));
     -->
    <aura:method name="fetchRequest" action="{!c.onFetchRequest}">
        <aura:attribute name="request"
                        type="Map"
                        required="true"
                        description="Supports these keys: url (string), options (map)."/>
    </aura:method>

    <div aura:id="penpalFrameContainer" class="slds-hide">
        {!v.body}
    </div>

</aura:component>
<!--
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->

================================================
FILE: force-app/main/default/aura/LC_API/LC_API.cmp-meta.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<AuraDefinitionBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>54.0</apiVersion>
    <description>LC_API</description>
</AuraDefinitionBundle>


================================================
FILE: force-app/main/default/aura/LC_API/LC_APIController.js
================================================
/*
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/douglascayers/sfdx-lightning-api-component
License: BSD 3-Clause License
 */
({
    /**
     * Called once during component initialization phase.
     */
    onInit: function( component, event, helper ) {
        helper._penpal = {};
        helper.makeApexRequest( component, 'c.getVisualforceDomainURL' ).then( $A.getCallback( function( vfDomainURL ) {
            component.set( 'v.iframeSrc', `${vfDomainURL}/apex/LC_APIPage` );
        })).catch( $A.getCallback( function( err ) {
            console.error( 'LC_API: Error determining visualforce domain', err );
        }));
    },

    /**
     * Called once after ltng:require has loaded scripts.
     */
    onScriptsLoaded: function( component, event, helper ) {

    },

    /**
     * Called each time the component renders itself.
     */
    onRender: function( component, event, helper ) {

        const isPenpalFrameCreated = component.get( 'v.penpalFrameCreated' );

        // For Penpal to operate correctly, you must ensure that `connectToChild`
        // is called before the iframe has called `connectToParent`.
        // Since the iframe source is calculated asynchronously,
        // we listen to the component's render events and each time
        // check if the iframe source is ready, and if so, then we initialize
        // penpal to connect this component to the iframe.
        // Since we only want to do this once, we also set the initialized flag.
        if ( !isPenpalFrameCreated ) {

            const container = component.find( 'penpalFrameContainer' );
            const iframeSrc = component.get( 'v.iframeSrc' );

            // Ensure the container element has rendered otherwise we can't
            // append child elements to it. And wait for the iframe source to
            // be available otherwise no reason to create the iframe element.
            if ( !$A.util.isEmpty( container ) && !$A.util.isEmpty( iframeSrc ) ) {

                $A.createComponent(
                    "aura:html",
                    {
                        "aura:id": "penpalFrame",
                        "tag": "iframe",
                        "HTMLAttributes": {
                            "src": iframeSrc
                        }
                    },
                    function( iframeCmp, status, errorMessage ) {

                        // This callback happened asynchronously, so make one
                        // more check on whether the penpal frame has been initialized or not
                        // in the off chance a separate render cycle got here before this one.
                        const isPenpalFrameCreated = component.get( 'v.penpalFrameCreated' );

                        if ( isPenpalFrameCreated ) {

                            console.log( 'LC_API: iframe is already initialized' );

                        } else if ( status === 'SUCCESS' ) {

                            // At this point, the iframe component has been constructed
                            // but not yet been rendered, so we don't have access to the
                            // HTML iframe element yet. We need to wait for another render cycle,
                            // that is, we need to wait for the render() method to be called again
                            // after we append the new iframe component to the body of its container.
                            // Once we're able to find the 'penpalFrame' on the page then
                            // we can proceed with the rest of the penpal initialization.

                            component.set( 'v.penpalFrameCreated', true );

                            container.set( 'v.body', [ iframeCmp ] );

                            console.info( 'LC_API: iframe initialized' );

                        } else if ( status === 'INCOMPLETE' ) {

                            console.warn( 'LC_API: No response from server or client is offline' );

                        } else if ( status === 'ERROR' ) {

                            console.error( 'LC_API: Error creating iframe: ' + errorMessage );

                        }

                    }
                );

            } // else, iframe source is empty, keep waiting

        } else {

            const isPenpalFrameConnected = component.get( 'v.penpalFrameConnected' );
            const iframeCmp = component.find( 'penpalFrame' );

            if ( !$A.util.isEmpty( iframeCmp ) && !isPenpalFrameConnected ) {

                const connection = Penpal.connectToChild({
                    // The iframe to which a connection should be made
                    iframe: iframeCmp.getElement()
                });

                helper._penpal.connection = connection;

                connection.promise.then( $A.getCallback( function( child ) {

                    // Cache a reference to the child so that we can
                    // use it in the restRequest/fetchRequest methods,
                    // as well as be able to destroy it when this component unrenders.
                    helper._penpal.child = child;
                    console.info( 'LC_API: connected to iframe ' + iframeCmp.getGlobalId() );
                    component.set( 'v.penpalFrameConnected', true );

                })).catch( $A.getCallback( function( err ) {

                    console.error( 'LC_API: Error establishing connection to iframe ' + iframeCmp.getGlobalId(), err );
                    component.set( 'v.penpalFrameConnected', false );

                }));

            }

        }

    },

    onRestRequest: function( component, event, helper ) {
        const params = event.getParam( 'arguments' );
        return helper.handleRestRequest( component, params.request );
    },

    onFetchRequest: function( component, event, helper ) {
        const params = event.getParam( 'arguments' );
        return helper.handleFetchRequest( component, params.request );
    }
})
/*
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

================================================
FILE: force-app/main/default/aura/LC_API/LC_APIHelper.js
================================================
/*
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/douglascayers/sfdx-lightning-api-component
License: BSD 3-Clause License
 */
({
    handleRestRequest: function( component, request ) {

        const helper = this;

        const defaultRequest = {
            'method' : 'get'
        };

        const defaultHeaders = {
            'Content-Type': 'application/json'
        };

        request = Object.assign( {}, defaultRequest, request );
        request.headers = Object.assign( {}, defaultHeaders, request.headers );

        return helper.getPenpalChild().then( $A.getCallback( function( child ) {
            return helper.makePenpalRequest( 'rest', child, request );
        }));

    },

    handleFetchRequest: function( component, request ) {

        const helper = this;

        return helper.getPenpalChild().then( $A.getCallback( function( child ) {
            return helper.makePenpalRequest( 'fetch', child, request );
        }));

    },

    // ------------------------------------------------------------

    /**
     * For internal use.
     * Returns a promise waiting for the parent-child penpal handshake to complete
     * then resolves with reference to the penpal child for making requests.
     */
    getPenpalChild: function() {

        const helper = this;

        return new Promise( $A.getCallback( function( resolve, reject ) {

            let child = helper._penpal.child;

            if ( child ) {

                resolve( child );

            } else {

                // all time values in milliseconds
                const timeout = 10000; // ten seconds
                const pollFrequency = 500; // half a second
                const startTime = new Date().getTime();
                const endTime = startTime + timeout;

                const timerId = setInterval( $A.getCallback( function() {

                    child = helper._penpal.child;

                    if ( child ) {

                        // parent-child penpal handshake now complete
                        clearInterval( timerId );
                        resolve( child );

                    } else {

                        // check if we have exceeded our timeout
                        const currentTime = new Date().getTime();
                        if ( currentTime > endTime ) {
                            clearInterval( timerId );
                            reject( 'LC_API: Timeout trying to establish connection to iframe' );
                        }
                        // else, keep polling

                    }

                }), pollFrequency );

            }

        }));

    },

    /**
     * For internal use.
     * Returns a promise waiting for the parent-child penpal request to complete
     * then resolves with response from the child iframe.
     */
    makePenpalRequest: function( requestType, child, request ) {

        let p;

        if ( requestType === 'rest' ) {
            p = child.restRequest( request );
        } else if ( requestType === 'fetch' ) {
            p = child.fetchRequest( request );
        } else {
            p = Promise.resolve({
                success: false,
                data: 'LC_API: Invalid request type: ' + requestType
            });
        }

        return p.then( $A.getCallback( function( response ) {
            if ( response.success ) {
                return response.data;
            } else {
                return Promise.reject( response.data );
            }
        }));

    },

    /**
     * For internal use.
     * Returns a promise waiting for the Apex request to complete
     * then resolves with the JSON response, or rejects if any error.
     *
     * @param component
     *      (required) Reference to the component who has access to the Aura Enabled method specified by `actionName`.
     * @param actionName
     *      (required) Name of the Aura Enabled Apex method in form `c.methodName`.
     * @param params
     *      (optional) JSON map of request parameters to pass to the Apex action.
     * @param options
     *      (optional) JSON map of options to customize the request.
     *      `background` set to true will execute request in background thread.
     *      `storable` set to true will cache the response.
     */
    makeApexRequest: function( component, actionName, params, options ) {

        const helper = this;

        return new Promise( $A.getCallback( function( resolve, reject ) {

            const action = component.get( actionName );

            if ( params ) {
                action.setParams( params );
            }

            if ( options ) {
                if ( options.background ) { action.setBackground(); }
                if ( options.storable )   { action.setStorable(); }
            }

            action.setCallback( helper, function( response ) {
                if ( component.isValid() && response.getState() === 'SUCCESS' ) {

                    resolve( response.getReturnValue() );

                } else {

                    console.error( 'Error calling action "' + actionName + '" with state: ' + response.getState() );

                    helper.logActionErrors( response.getError() );

                    reject( response.getError() );

                }
            });

            $A.enqueueAction( action );

        }));

    },

    /**
     * For internal use.
     * Logs to console errors object.
     * Errors may be a String or Array.
     */
    logActionErrors: function( errors ) {
        if ( errors ) {
            if ( errors.length > 0 ) {
                for ( var i = 0; i < errors.length; i++ ) {
                    console.error( 'Error: ' + errors[i].message );
                }
            } else {
                console.error( 'Error: ' + errors );
            }
        } else {
            console.error( 'Unknown error' );
        }
    }

})
/*
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/


================================================
FILE: force-app/main/default/aura/LC_API/LC_APIRenderer.js
================================================
/*
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/douglascayers/sfdx-lightning-api-component
License: BSD 3-Clause License
 */
({
    unrender: function( component, helper ) {
        this.superUnrender();
        // When component unrenders then cleanup penpal
        // resources by destroying the connection and nulling out
        // the helper's cached reference to the connection and child.
        // This ensures that the helper.handleXyzRequest(..) methods
        // wait appropriately for the new parent-child handshake to complete
        // when this component is re-initialized and scripts are loaded.
        if ( helper._penpal && helper._penpal.connection ) {
            helper._penpal.connection.destroy();
            helper._penpal = {};
        }
    }
})
/*
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

================================================
FILE: force-app/main/default/aura/LC_URL/LC_URL.cmp
================================================
<!--
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/douglascayers/sfdx-lightning-api-component
License: BSD 3-Clause License
-->
<aura:component controller="LC_URLController">

    <!--
        Simple service component to obtain Salesforce URLs.
        https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_url.htm
     -->

    <c:lax context="{!this}"/>

    <aura:method name="getUrlInfo" action="{!c.onGetUrlInfo}"/>

</aura:component>
<!--
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->

================================================
FILE: force-app/main/default/aura/LC_URL/LC_URL.cmp-meta.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<AuraDefinitionBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>54.0</apiVersion>
    <description>LC_URL</description>
</AuraDefinitionBundle>


================================================
FILE: force-app/main/default/aura/LC_URL/LC_URLController.js
================================================
/*
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/douglascayers/sfdx-lightning-api-component
License: BSD 3-Clause License
 */
({
    onGetUrlInfo: function( component, event, helper ) {
        return component.lax.enqueue( 'c.getUrlInfo' );
    }
})
/*
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

================================================
FILE: force-app/main/default/aura/MA_CheckForPackageUpdatesCmp/MA_CheckForPackageUpdatesCmp.cmp
================================================
<!--
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler
License: BSD 3-Clause License
-->
<aura:component implements="flexipage:availableForAllPageTypes" access="global">

    <aura:attribute name="upgradeAvailable" type="Boolean" default="false" access="private"/>

    <aura:attribute name="linkToInstalledVersion" type="String" access="private"/>
    <aura:attribute name="installedVersionNumber" type="String" access="private"/>

    <aura:attribute name="linkToLatestVersion" type="String" access="private"/>
    <aura:attribute name="latestVersionNumber" type="String" access="private"/>

    <c:LC_API aura:id="lc_api"/>

    <aura:handler name="init" value="{!this}" action="{!c.onInit}"/>

    <aura:if isTrue="{!v.upgradeAvailable}">
        <div class="slds-var-p-around_xx-small slds-var-m-bottom_x-small slds-text-align_center slds-theme_success">
            A new version is available.
            You're on version <a href="{!v.linkToInstalledVersion}" target="_blank" rel="noopener noreferrer">{!v.installedVersionNumber}</a>.
            Upgrade to version <a href="{!v.linkToLatestVersion}" target="_blank" rel="noopener noreferrer">{!v.latestVersionNumber}</a>.
        </div>
    </aura:if>

</aura:component>
<!--
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->

================================================
FILE: force-app/main/default/aura/MA_CheckForPackageUpdatesCmp/MA_CheckForPackageUpdatesCmp.cmp-meta.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<AuraDefinitionBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>54.0</apiVersion>
    <description>MA_CheckForPackageUpdatesCmp</description>
</AuraDefinitionBundle>


================================================
FILE: force-app/main/default/aura/MA_CheckForPackageUpdatesCmp/MA_CheckForPackageUpdatesCmpController.js
================================================
({
    onInit: function( component, event, helper ) {

        let promises = [];
        let lcApi = component.find( 'lc_api' );

        // get the latest package version available
        promises.push(
            lcApi.fetchRequest({
                'url' : 'https://gist.githubusercontent.com/douglascayers/e96c53304dc78dc83e59a85753f29111/raw/sfdx-mass-action-scheduler-version.js'
            }).then( $A.getCallback( function( response ) {
                return response;
            }))
        );

        // get the currently installed package version
        promises.push(
            lcApi.restRequest({
                'url' : '/services/data/v54.0/tooling/query?q=SELECT+Id,+SubscriberPackageId,+SubscriberPackage.Name,+SubscriberPackage.NamespacePrefix,+SubscriberPackageVersion.MajorVersion,+SubscriberPackageVersion.MinorVersion+FROM+InstalledSubscriberPackage'
            }).then( $A.getCallback( function( response ) {
                // The InstalledSubscriberPackage object doesn't support WHERE clause filtering on the package's namespace
                // so we have to filter the results ourselves
                return response.records.find( ( record ) => {
                    return ( record.SubscriberPackage.NamespacePrefix === 'dca_mass_action' );
                });
            }))
        );

        // notify user if there's a newer package version to upgrade to
        Promise.all( promises ).then( $A.getCallback( function( results ) {

            let linkToLatest = ( results[0] && results[0].url );
            let linkToInstalled = ( results[1] && `/${results[1].Id}` );

            let latestVersion = ( results[0] && results[0].version );
            let installedVersion = ( results[1] && `${results[1].SubscriberPackageVersion.MajorVersion}.${results[1].SubscriberPackageVersion.MinorVersion}` );

            if ( latestVersion > installedVersion ) {

                component.set( 'v.upgradeAvailable', true );

                component.set( 'v.linkToInstalledVersion', linkToInstalled );
                component.set( 'v.installedVersionNumber', installedVersion );

                component.set( 'v.linkToLatestVersion', linkToLatest );
                component.set( 'v.latestVersionNumber', latestVersion );

            }

        })).catch( $A.getCallback( function( error ) {

            component.set( 'v.upgradeAvailable', false );
            console.error( 'MA_CheckForPackageUpdatesCmp.onInit: error=' + JSON.stringify( error, null, 2 ) );

        }));

    }
})

================================================
FILE: force-app/main/default/aura/MA_DevelopedByCmp/MA_DevelopedByCmp.cmp
================================================
<!--
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler
License: BSD 3-Clause License
-->
<aura:component implements="flexipage:availableForAllPageTypes" access="global">

    <div class="slds-theme_shade slds-box slds-box_small slds-var-m-vertical_medium slds-text-align_center">
        <span><a href="https://sfdx-mass-action-scheduler.github.io/sfdx-mass-action-scheduler/" target="_blank" rel="noopener noreferrer">Mass Action Scheduler</a></span>
        <span class="slds-var-m-horizontal_xx-small">️is developed with love by</span>
        <span><a href="https://douglascayers.com" target="_blank" rel="noopener noreferrer">Doug Ayers</a></span>
    </div>

</aura:component>
<!--
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->

================================================
FILE: force-app/main/default/aura/MA_DevelopedByCmp/MA_DevelopedByCmp.cmp-meta.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<AuraDefinitionBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>54.0</apiVersion>
    <description>MA_DevelopedByCmp</description>
</AuraDefinitionBundle>


================================================
FILE: force-app/main/default/aura/MA_EditConfigCmp/MA_EditConfigCmp.cmp
================================================
<!--
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler
License: BSD 3-Clause License
-->
<aura:component controller="MA_EditConfigCmpController" implements="flexipage:availableForRecordHome,force:hasRecordId,lightning:actionOverride" access="global">

    <aura:attribute name="didInitConfig"
                    type="Boolean"
                    description="Track if onInit has loaded the configuration record yet."
                    default="false"/>

    <aura:attribute name="objectDescribe"
                    type="Object"
                    description="SObject and Field describe info"/>

    <aura:attribute name="recordId"
                    type="String"
                    description="The ID of the record to be displayed. Provided by force:hasRecordId interface."/>

    <aura:attribute name="record"
                    type="Object"
                    description="The record object to be displayed. This is a wrapper object and not the sobject."/>

    <aura:attribute name="spinnerTimerIds"
                    type="String[]"
                    description="To minimize flickering of the spinner, delay hiding spinner when another async action starts."/>

    <c:LC_API aura:id="lc_api"/>
    <c:LC_URL aura:id="lc_url"/>

    <aura:attribute name="urlInfo"
                    type="Map"
                    description="Info from LC_URL component."/>

    <!-- Lightning Data Service -->

    <!--
        This allows us to know when the record is changed outside this component,
        such as when the user might click the standard 'Edit' button and save the record.
        If we don't reload this component then upon saving the record via the component
        we could overwrite, undoing, the outside changes.
     -->

    <aura:attribute name="ldsComplexRecord"
                    type="Object"
                    description="The complex record. Used only with Lightning Data Service to detect when record changes outside this component."/>

    <aura:attribute name="ldsSimpleRecord"
                    type="Mass_Action_Configuration__c"
                    description="The simple record. Used only with Lightning Data Service to detect when record changes outside this component."/>

    <force:recordData aura:id="lds"
        recordId="{!v.recordId}"
        fields="Id"
        mode="EDIT"
        targetRecord="{!v.ldsComplexRecord}"
        targetFields="{!v.ldsSimpleRecord}"
        recordUpdated="{!c.onInit}"/>

    <!-- Wizard Attributes -->

    <aura:attribute name="wizardActiveStageIndex"
                    type="Integer"
                    description="In the Wizard, which stage is user actively on."
                    default="0"/>

    <aura:attribute name="wizardStageNames"
                    type="String[]"
                    description="In the Wizard, the names of the stages."
                    default="[ 'Details', 'Choose Source', 'Choose Action', 'Field Mappings', 'Schedule' ]"/>

    <!-- Source Attributes -->

    <aura:attribute name="sourceType"
                    type="String"
                    description="For tracking changes to source type. If bind to property of sobject then change handler is called when any field on record changes."/>

    <aura:attribute name="sourceTypeURL"
                    type="String"
                    description="URL to the selected report or list view so user can verify their selection."/>

    <aura:attribute name="sourceFields"
                    type="Map[]"
                    description="During field mapping stage, these are the assignable source fields."/>

    <aura:attribute name="sourceFieldsInputType"
                    type="String"
                    default="text"
                    description="Input field variant for user to specify source field mappings. Options: TEXT, COMBOBOX"/>

    <!-- Source Type : Reports -->

    <aura:attribute name="sourceReportFolders"
                    type="Map[]"
                    description="Folder select options to narrow down search of a report. User must choose one to drive report filtering."/>

    <aura:attribute name="sourceReportFolderId"
                    type="String"
                    description="Selected report folder id."/>

    <aura:attribute name="sourceReports"
                    type="Map[]"
                    description="Report select options within the currently selected report."/>

    <aura:attribute name="sourceReportId"
                    type="String"
                    description="Selected report id."/>

    <aura:attribute name="sourceReport"
                    type="Object"
                    description="Details about the selected report, like name and folder."/>

    <aura:attribute name="sourceReportColumns"
                    type="Map[]"
                    description="Column select options from the selected source report. User must choose one to drive sorting and pagination."/>

    <aura:attribute name="sourceReportColumnName"
                    type="String"
                    description="Selected report column."/>

    <!-- Source Type : List Views -->

    <aura:attribute name="sourceListViewSobjectTypes"
                    type="Map[]"
                    description="SObject select options to narrow down search of a list view. User must choose one to drive list view filtering."/>

    <aura:attribute name="sourceListViewSobjectType"
                    type="String"
                    description="Selected list view sobject type."/>

    <aura:attribute name="sourceListViews"
                    type="Map[]"
                    description="List View select options within the currently selected sobject."/>

    <aura:attribute name="sourceListViewId"
                    type="String"
                    description="Selected list view id."/>

    <aura:attribute name="sourceListView"
                    type="Object"
                    description="Details about the selected list view, like name and sobject type."/>

    <!-- Target Attributes -->

    <aura:attribute name="targetType"
                    type="String"
                    description="For tracking changes to target type. If bind to property of sobject then change handler is called when any field on record changes."/>

    <aura:attribute name="targetTypeRequiresSobject"
                    type="Boolean"
                    description="Indicates if selected target type requires user to select a specific object to know available actions. For example, Apex does not but Email Alerts do."/>

    <aura:attribute name="targetTypeRequiresAction"
                    type="Boolean"
                    description="Indicates if selected target type requires user to select a specific action to invoke. For example, Workflows do not but Quick Actions do."/>

    <aura:attribute name="targetSobjectTypes"
                    type="Map[]"
                    description="Object name select options of objects that have custom actions (e.g. objects with custom Email Alerts or Quick Actions)."/>

    <aura:attribute name="targetSobjectType"
                    type="String"
                    description="Selected sobject type."/>

    <aura:attribute name="targetApexTypes"
                    type="Map[]"
                    default="[
                        {
                            'label': 'Invocable Method',
                            'value': 'Invocable'
                        },
                        {
                            'label': 'Anonymous Block',
                            'value': 'Anonymous'
                        }
                    ]"
                    description="Apex Type select options."/>

    <aura:attribute name="targetApexType"
                    type="String"
                    description="Selected apex type."/>

    <aura:attribute name="isValidToRenderTargetInvocableActions"
                    type="Boolean"
                    description="Indicates conditions are met to fetch and show the target invocable action select options."/>

    <aura:attribute name="targetNamedCredentials"
                    type="Map[]"
                    description="SObject select options of Named Credentials to choose for making API callout to REST API to execute target action."/>

    <aura:attribute name="targetInvocableActions"
                    type="Map[]"
                    description="Action select options within the currently selected target type and target sobject."/>

    <aura:attribute name="targetInvocableAction"
                    type="String"
                    description="The selected action name from the target invocable actions select options."/>

    <aura:attribute name="targetFields"
                    type="Map[]"
                    description="During field mapping stage, these are the assignable target fields."/>

    <aura:attribute name="targetFieldMappings"
                    type="Map[]"
                    description="Array of input arguments for target action to map source fields to."/>

    <!-- Schedule Option Attributes -->

    <aura:attribute name="scheduleOptionsHourOfDay"
                    type="Map[]"
                    description="Hour of Day in Cron schedule expression."/>

    <aura:attribute name="scheduleOptionsDayOfMonth"
                    type="Map[]"
                    description="Day of Month in Cron schedule expression."/>

    <aura:attribute name="scheduleOptionsDayOfWeek"
                    type="Map[]"
                    description="Weekday in Cron schedule expression."/>

    <aura:attribute name="scheduleOptionsMonthOfYear"
                    type="Map[]"
                    description="Month of Year in Cron schedule expression."/>

    <!-- Schedule Selection Attributes -->

    <aura:attribute name="scheduleSelectionsFrequency"
                    type="String"
                    description="The selected values from the radioGroup. ODDITY: The type of this attribute must be String for initial value to be selected by lightning:radioGroup; but note that if user makes a selection then an array is bound to this attribute."/>

    <aura:attribute name="scheduleSelectionsHourOfDay"
                    type="String[]"
                    description="The selected values from the checkboxGroup. When save record need to convert list to csv string."/>

    <aura:attribute name="scheduleSelectionsDayOfMonth"
                    type="String[]"
                    description="The selected values from the dual listbox. When save record need to convert list to csv string."/>

    <aura:attribute name="scheduleSelectionsDayOfWeek"
                    type="String[]"
                    description="The selected values from the checkboxGroup. When save record need to convert list to csv string."/>

    <aura:attribute name="scheduleSelectionsMonthOfYear"
                    type="String[]"
                    description="The selected values from the checkboxGroup. When save record need to convert list to csv string."/>

    <!-- Events -->

    <aura:handler name="init" value="{!this}" action="{!c.onInit}"/>

    <aura:handler name="change" value="{!v.sourceType}" action="{!c.handleSourceTypeChange}"/>
    <aura:handler name="change" value="{!v.targetType}" action="{!c.handleTargetTypeChange}"/>

    <aura:handler name="change" value="{!v.sourceReportFolderId}" action="{!c.handleSourceReportFolderChange}"/>
    <aura:handler name="change" value="{!v.sourceReportId}" action="{!c.handleSourceReportChange}"/>

    <aura:handler name="change" value="{!v.sourceListViewSobjectType}" action="{!c.handleSourceListViewSobjectTypeChange}"/>
    <aura:handler name="change" value="{!v.sourceListViewId}" action="{!c.handleSourceListViewChange}"/>

    <aura:handler name="change" value="{!v.targetTypeRequiresSobject}" action="{!c.handleTargetTypeRequiresSobjectChange}"/>
    <aura:handler name="change" value="{!v.targetSobjectType}" action="{!c.handleTargetSobjectTypeChange}"/>

    <aura:handler name="change" value="{!v.targetApexType}" action="{!c.handleTargetApexTypeChange}"/>

    <!-- Markup -->

    <div class="slds-theme_default slds-box slds-box_xx-small">

        <lightning:spinner aura:id="spinner" variant="brand"/>

        <div class="slds-grid slds-var-p-around_medium">
            <div class="slds-col">

                <c:strike_wizard aura:id="wizard"
                    stageNames="{!v.wizardStageNames}"
                    activeChevron="{!v.wizardActiveStageIndex}"
                    displayMode="wizard"
                    collapseExpandButton="true"
                    toggleBodyView="false"
                    disableForwardNavOnIncomplete="true"
                    processComplete="false">

                    <div class="slds-box">

                            <!-- Stage: Details -->

                            <aura:if isTrue="{!equals( v.wizardActiveStageIndex, 0 )}">

                                <c:MA_WizardCoachingCmp>

                                    <aura:set attribute="leftTitle" value="About This Step"/>
                                    <aura:set attribute="leftContent">
                                        <p>
                                            Describe the purpose of this Mass Action Configuration.
                                            Your future self and those that come after you will appreciate it.
                                        </p>
                                        <p>
                                            Pro Tip: After you've saved this record, use the <a href="https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/How-to-Customize-the-Quick-Edit-Page-Layout" target="_blank" rel="noopener noreferrer">Quick Edit</a> button to edit details
                                            without needing to step through the entire wizard each time.
                                        </p>
                                        <p>
                                            Each step of this wizard includes tips and advice.
                                            You can also find more documentation, examples, and support at these resources:
                                        </p>
                                        <p>
                                            <ul>
                                                <li>For discussion and feedback <a href="https://success.salesforce.com/_ui/core/chatter/groups/GroupProfilePage?g=0F93A000000LhvN" target="_blank" rel="noopener noreferrer">post in the community group</a> or raise well defined issues and ideas via the <a href="https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/issues" target="_blank" rel="noopener noreferrer">Issues feature</a>.</li>
                                                <li>Read the <a href="https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki" target="_blank" rel="noopener noreferrer">wiki page</a> for further documentation on Mass Action Scheduler.</li>
                                                <li>Read the <a href="https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Frequently-Asked-Questions" target="_blank" rel="noopener noreferrer">FAQ page</a> to help troubleshoot technical issues.</li>
                                            </ul>
                                        </p>
                                    </aura:set>

                                    <aura:set attribute="rightTitle" value="Guidance"/>
                                    <aura:set attribute="rightContent">
                                        <p>
                                            <b>Active</b> configurations can be run manually or on a schedule.
                                        </p>
                                        <p>
                                            <b>Inactive</b> configurations do not run.
                                            If a configuration is scheduled, it's Apex job is unscheduled for future runs until you re-activate it again.
                                        </p>
                                        <p>
                                            <b>Batch Size</b> controls the number of times the target action from the Choose Action step is invoked per save transaction.
                                            As when using Data Loader, you may need to reduce the batch size to stay within <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_gov_limits.htm" target="_blank" rel="noopener noreferrer">governor limits</a>.
                                        </p>
                                        <p>
                                            <b>Named Credential</b> is optional and is a way to <a href="https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/wiki/Specify-the-Running-User-via-Named-Credentials" target="_blank" rel="noopener noreferrer">specify the running user</a> performing the actions.
                                            That is to say the user who has their name stamped as the "Last Modified By" on any updated records
                                            by the target action from the Choose Action step.
                                            If not specified, then the user who last activates the configuration, or who manually runs it, is the running user.
                                        </p>
                                    </aura:set>

                                </c:MA_WizardCoachingCmp>

                            </aura:if>

                            <!-- Stage: Choose Source -->

                            <aura:if isTrue="{!equals( v.wizardActiveStageIndex, 1 )}">

                                <c:MA_WizardCoachingCmp>

                                    <aura:set attribute="leftTitle" value="About This Step"/>
                                    <aura:set attribute="leftContent">
                                        <p>
                                            Select the source of the records you want to process.
                                        </p>
                                        <p>
                                            <b>List Views</b> are easy to create and support simple filter criteria.
                                            Learn how to create list views with the <a href="https://trailhead.salesforce.com/content/learn/modules/lex_customization/lex_customization_list?trail_id=lex_admin_implementation" target="_blank" rel="noopener noreferrer">Create and Customize List Views</a> unit on Trailhead.
                                        </p>
                                        <p>
                                            <b>Reports</b> are powerful and support complex filter criteria
                                            like <a href="https://help.salesforce.com/articleView?id=reports_cross_filters_create.htm" target="_blank" rel="noopener noreferrer">Cross Filters</a>.
                                            Learn how to create reports with the <a href="https://trailhead.salesforce.com/content/learn/modules/lex_implementation_reports_dashboards?trail_id=lex_admin_implementation" target="_blank" rel="noopener noreferrer">Reports &amp; Dashboards for Lightning Experience</a> module on Trailhead.
                                        </p>
                                        <p>
                                            <b>SOQL</b> queries are an advanced technique to search for specific records. Simple queries can be helpful when you don't want to deal with the overhead of creating a list view or a report.
                                            Learn how to write SOQL queries with the <a href="https://trailhead.salesforce.com/en/content/learn/modules/apex_database/apex_database_soql?trail_id=force_com_dev_beginner" target="_blank" rel="noopener noreferrer">Write SOQL Queries</a> unit on Trailhead.
                                        </p>
                                        <p>
                                            <b>Apex</b> classes that implement <code class="keyword">Iterable&lt;Map&lt;String, Object&gt;&gt;</code> are an advanced technique that give you full control over what the source data is.
                                            For example, if you need to make multiple SOQL queries, apply complex data filtering, or retrieve data from an external web service with http callouts.
                                            Learn how to develop custom iterators with the <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_iterable.htm" target="_blank" rel="noopener noreferrer">Apex Developer Guide</a>.
                                        </p>
                                    </aura:set>

                                    <aura:set attribute="rightTitle" value="Guidance"/>
                                    <aura:set attribute="rightContent">

                                        <p>
                                            <p>
                                                <b>Stay within limits</b>. If your source type would return more than its record limit then either modify filters to reduce the row count or use a different source type.
                                                For example, a report that returns 30 thousand records would need to be split into three smaller reports or switch to another source type.
                                            </p>
                                            <table class="slds-table slds-table_cell-buffer slds-table_bordered slds-table_col-bordered">
                                                <thead>
                                                    <tr class="slds-line-height_reset">
                                                        <th class="slds-text-title_caps slds-nowrap">Source Type</th>
                                                        <th class="slds-text-title_caps slds-cell-wrap">Limits</th>
                                                    </tr>
                                                </thead>
                                                <tbody>
                                                    <tr>
                                                        <td class="slds-nowrap"><b>List Views</b></td>
                                                        <td class="slds-cell-wrap">Up to 50 million records.</td>
                                                    </tr>
                                                    <tr>
                                                        <td class="slds-nowrap"><b>Reports</b></td>
                                                        <td class="slds-cell-wrap">
                                                            Up to 10 thousand records.
                                                            <br/>
                                                            <a href="https://help.salesforce.com/articleView?id=reports_changing_format.htm" target="_blank" rel="noopener noreferrer">Tabular report format</a> only.
                                                            <br/>
                                                            Report must be saved in a <a href="https://trailhead.salesforce.com/content/learn/projects/create-reports-and-dashboards-for-sales-and-marketing-managers?trail_id=learn-admin-essentials" target="_blank" rel="noopener noreferrer">custom folder</a>.
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td class="slds-nowrap"><b>SOQL</b></td>
                                                        <td class="slds-cell-wrap">Up to 50 million records.</td>
                                                    </tr>
                                                    <tr>
                                                        <td class="slds-nowrap"><b>Apex</b></td>
                                                        <td class="slds-cell-wrap">
                                                            Up to 50 million records.
                                                            <br/>
                                                            Class must implement <code class="keyword">Iterable&lt;Map&lt;String, Object&gt;&gt;</code> and provide a no-argument constructor.
                                                        </td>
                                                    </tr>
                                                </tbody>
                                            </table>
                                        </p>

                                        <p>
                                            <b>Alias SOQL aggregate functions</b>. Aggregate functions like <code class="keyword">COUNT</code>, <code class="keyword">MIN</code>, <code class="keyword">MAX</code>, <code class="keyword">AVG</code>, <code class="keyword">SUM</code> and others
                                            must be <a href="https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_groupby_alias.htm" target="_blank" rel="noopener noreferrer">aliased</a> to be selectable in the Field Mappings step.
                                            For example, consider the query <code class="keyword">SELECT COUNT(Id) <b>RecordCount</b>, Type FROM Account GROUP BY Type</code>.
                                            Without the <b>RecordCount</b> alias then only the <b>Type</b> field would be available on the Field Mappings step.
                                        </p>

                                        <p>
                                            <b>Test your data source before automating</b>.
                                            Confirm fields and filters by first previewing list views and running reports.
                                            Execute SOQL queries in a tool like <a href="https://help.salesforce.com/articleView?id=code_dev_console_tab_query_editor.htm" target="_blank" rel="noopener noreferrer">Developer Console</a> or <a href="https://developer.salesforce.com/docs/atlas.en-us.dataLoader.meta/dataLoader/data_loader.htm" target="_blank" rel="noopener noreferrer">Data Loader</a>.
                                        </p>

                                    </aura:set>

                                </c:MA_WizardCoachingCmp>

                            </aura:if>

                            <!-- Stage: Choose Action -->

                            <aura:if isTrue="{!equals( v.wizardActiveStageIndex, 2 )}">

                                <c:MA_WizardCoachingCmp>

                                    <aura:set attribute="leftTitle" value="About This Step"/>
                                    <aura:set attribute="leftContent">
                                        <p>
                                            Select the target action you want to process the source records.
                                        </p>
                                        <p>
                                            Note, Process Builders and Flows are grouped together because the <a href="https://developer.salesforce.com/docs/atlas.en-us.api_action.meta/api_action/actions_obj_flow.htm" target="_blank" rel="noopener noreferrer">REST API</a> does not distinguish between them.
                                            You may like to use a naming convention to help you tell them apart. For example, adding the word "Flow" to the names of your flows (e.g. "My Account Flow").
                                        </p>
                                        <p>
                                            If you don't see the action you want listed, ensure that it is <b>active</b> and is a <b>supported type</b>.
                                        </p>
                                    </aura:set>

                                    <aura:set attribute="rightTitle" value="Guidance"/>
                                    <aura:set attribute="rightContent">
                                        <p>
                                            <table class="slds-table slds-table_cell-buffer slds-table_bordered">
                                                <thead>
                                                    <tr class="slds-line-height_reset">
                                                        <th class="slds-text-title_caps slds-nowrap">Action Type</th>
                                                        <th class="slds-text-title_caps slds-cell-wrap">Supported Types</th>
                                                    </tr>
                                                </thead>
                                                <tbody>
                                                    <tr>
                                                        <td class="slds-nowrap"><b>Process Builder</b></td>
                                                        <td class="slds-cell-wrap">Processes that start when <a href="https://help.salesforce.com/articleView?id=process_start.htm" target="_blank" rel="noopener noreferrer">invoked by another process</a>, not when a record is created or updated.</td>
                                                    </tr>
                                                    <tr>
                                                        <td class="slds-nowrap"><b>Flows</b></td>
                                                        <td class="slds-cell-wrap">Autolaunched flows. Flows that <a href="https://help.salesforce.com/articleView?id=flow_concepts_type.htm" target="_blank" rel="noopener noreferrer">don't require user interaction</a> like screens.</td>
                                                    </tr>
                                                    <tr>
                                                        <td class="slds-nowrap"><b>Quick Actions</b></td>
                                                        <td class="slds-cell-wrap">Create a Record, Update a Record, and Log a Call types.</td>
                                                    </tr>
                                                    <tr>
                                                        <td class="slds-nowrap"><b>Email Alerts</b></td>
                                                        <td class="slds-cell-wrap">All</td>
                                                    </tr>
                                                    <tr>
                                                        <td class="slds-nowrap"><b>Workflow Rules</b></td>
                                                        <td class="slds-cell-wrap">Active rules.</td>
                                                    </tr>
                                                    <tr>
                                                        <td class="slds-nowrap"><b>Apex</b></td>
                                                        <td class="slds-cell-wrap">
                                                            <p>
                                                                Classes annotated with <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_annotation_InvocableMethod.htm" target="_blank" rel="noopener noreferrer">@InvocableMethod</a> or <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_anonymous_block.htm" target="_blank" rel="noopener noreferrer">anonymous blocks</a>.
                                                            </p>
                                                            <p>
                                                                For anonymous blocks, your script must include the following method definition,
                                                                which will be passed the current batch of source records. Each execution of your script occurs in its own transaction.
                                                                <code class="block">
                                                                    void execute( List&lt;Map&lt;String, Object&gt;&gt; sourceRecordsBatch ) {
                                                                    &nbsp;&nbsp;&nbsp;&nbsp;// your logic here
                                                                    }
                                                                </code>
                                                            </p>
                                                            <p>
                                                                Apex classes and anonymous blocks are invoked once per batch of source records, just like the <code class="keyword">execute</code> method of a <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_batch_interface.htm" target="_blank" rel="noopener noreferrer">Batchable Class</a> or a <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_bulk.htm" target="_blank" rel="noopener noreferrer">Bulk Trigger</a>.
                                                                However, unlike batchable or trigger code, no state is preserved within the script between executions. Though you may choose to manage and preserve state yourself between executions via DML to records or custom settings.
                                                            </p>
                                                        </td>
                                                    </tr>
                                                </tbody>
                                            </table>
                                        </p>
                                    </aura:set>

                                </c:MA_WizardCoachingCmp>

                            </aura:if>

                            <!-- Stage: Field Mappings -->

                            <aura:if isTrue="{!equals( v.wizardActiveStageIndex, 3 )}">

                                <c:MA_WizardCoachingCmp>

                                    <aura:set attribute="leftTitle" value="About This Step"/>
                                    <aura:set attribute="leftContent">
                                        <p>
                                            Map source fields as inputs to the target action.
                                        </p>
                                        <p>
                                            For example, some action types like Process Builder, Workflow Rules, and Email Alerts require a record ID to be mapped to them from the source data.
                                        </p>
                                    </aura:set>

                                    <aura:set attribute="rightTitle" value="Guidance"/>
                                    <aura:set attribute="rightContent">
                                        <p>
                                            <b>Don't see the Source Field you're looking for?</b>
                                            <ul>
                                                <li>Confirm the field is included in your source type.</li>
                                                <li>Ensure that your user has <a href="https://trailhead.salesforce.com/content/learn/modules/data_security?trail_id=security" target="_blank" rel="noopener noreferrer">read object and field permissions</a>.</li>
                                                <li>If using a Named Credential, ensure that user also has appropriate object and field permissions.</li>
                                                <li>
                                                    If using SOQL, alias the aggregate functions. Aggregate functions like <code class="keyword">COUNT</code>, <code class="keyword">MIN</code>, <code class="keyword">MAX</code>, <code class="keyword">AVG</code>, <code class="keyword">SUM</code> and others
                                                    must be <a href="https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_groupby_alias.htm" target="_blank" rel="noopener noreferrer">aliased</a> to be selectable in the Field Mappings step.
                                                    For example, consider the query <code class="keyword">SELECT COUNT(Id) <b>RecordCount</b>, Type FROM Account GROUP BY Type</code>.
                                                    Without the <b>RecordCount</b> alias then only the <b>Type</b> field would be available on the Field Mappings step.
                                                </li>
                                                <li>
                                                    If using SOQL, child relationship queries are not shown in the Field Mappings step.
                                                    For example, consider the query <code class="keyword">SELECT Id, Name, ( SELECT FirstName FROM Contacts ) FROM Account</code>.
                                                    The child relationship query <code class="keyword">SELECT FirstName FROM Contacts</code> is ignored.
                                                    Therefore, and for performance, do not use child relationship queries in your <code class="keyword">SELECT</code> statement.
                                                </li>
                                            </ul>
                                        </p>
                                        <p>
                                            <b>Don't see the Target Field you're looking for?</b>
                                            <ul>
                                                <li>For Flows, ensure the variable's <a href="https://help.salesforce.com/articleView?id=flow_ref_resources_variable.htm" target="_blank" rel="noopener noreferrer">Availability Outside the Flow</a> has <b>Available for input</b> selected.</li>
                                                <li>For Quick Actions, ensure the field is on the <a href="https://help.salesforce.com/articleView?id=action_layout_editor_about.htm" target="_blank" rel="noopener noreferrer">action's layout</a>.</li>
                                                <li>For Invocable Apex, ensure the class variable has the <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_annotation_InvocableVariable.htm" target="_blank" rel="noopener noreferrer">@InvocableVariable</a> annotation.</li>
                                                <li>For Anonymous Apex, the field mappings step is not used. Instead, your script handles all field mapping and logic within its <code class="keyword">execute</code> method.</li>
                                            </ul>
                                        </p>
                                    </aura:set>

                                </c:MA_WizardCoachingCmp>

                            </aura:if>

                            <!-- Stage: Schedule -->

                            <aura:if isTrue="{!equals( v.wizardActiveStageIndex, 4 )}">

                                <c:MA_WizardCoachingCmp>

                                    <aura:set attribute="leftTitle" value="About This Step"/>
                                    <aura:set attribute="leftContent">
                                        <p>
                                            Choose the schedule frequency when to run this Mass Action Configuration.
                                        </p>
                                        <p>
                                            <b>On Demand</b> runs only when you click the <b>Run</b> button or if you use Process Builder, Flow, or Apex to
                                            invoke the provided <code class="keyword">MA_RunConfigInvocable</code> invocable Apex class (labeled "MAS: Run Mass Action").
                                        </p>
                                        <p>
                                            <b>Scheduled</b> provides simple options to choose the hour, day, month, and year to run the configuration repeatedly.
                                        </p>
                                        <p>
                                            <b>Custom</b> allows you to specify your own cron expression which allows more advanced options than the provided simple scheduler.
                                            Learn more about how to write cron expressions in the "Using the System.Schedule Method" section of the <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_scheduler.htm" target="_blank" rel="noopener noreferrer">Apex Scheduler</a> documentation.
                                        </p>
                                        <p>
                                            Note, only <b>active</b> configurations will run regardless the schedule frequency chosen.
                                        </p>
                                    </aura:set>

                                    <aura:set attribute="rightTitle" value="Guidance"/>
                                    <aura:set attribute="rightContent">
                                        <p>
                                            Salesforce has a limit on the number of scheduled Apex jobs at one time. Traditionally this is 100 scheduled jobs.
                                            If you encounter an error trying to save an active configuration with a scheduled or custom frequency,
                                            you may have reached the limit and need to either deactivate other configurations or unschedule other Apex jobs in your org.
                                            Learn more about these limits in the "Apex Scheduler Limits" section of the <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_scheduler.htm" target="_blank" rel="noopener noreferrer">Apex Scheduler</a> documentation.
                                        </p>
                                        <p>
                                            <b>Example cron expressions for custom schedule frequency:</b>
                                                <table class="slds-table slds-table_cell-buffer slds-table_bordered">
                                                    <thead>
                                                        <tr class="slds-line-height_reset">
                                                            <th class="slds-text-title_caps slds-nowrap">Expression</th>
                                                            <th class="slds-text-title_caps slds-cell-wrap">Description</th>
                                                        </tr>
                                                    </thead>
                                                    <tbody>
                                                        <tr>
                                                            <td class="slds-nowrap"><code>0 0 13 * * ?</code></td>
                                                            <td class="slds-cell-wrap">Runs every day at 1 PM.</td>
                                                        </tr>
                                                        <tr>
                                                            <td class="slds-nowrap"><code>0 0 22 ? * 6L</code></td>
                                                            <td class="slds-cell-wrap">Runs the last Friday of every month at 10 PM.</td>
                                                        </tr>
                                                        <tr>
                                                            <td class="slds-nowrap"><code>0 0 10 ? * MON-FRI	</code></td>
                                                            <td class="slds-cell-wrap">Runs Monday through Friday at 10 AM.</td>
                                                        </tr>
                                                        <tr>
                                                            <td class="slds-nowrap"><code>0 0 20 * * ? 2010</code></td>
                                                            <td class="slds-cell-wrap">Runs every day at 8 PM during the year 2010.</td>
                                                        </tr>
                                                        <tr>
                                                            <td class="slds-nowrap"><code>0 0 8 13 2 ?</code></td>
                                                            <td class="slds-cell-wrap">Runs every 13th of February at 8 AM.</td>
                                                        </tr>
                                                    </tbody>
                                                </table>
                                        </p>
                                    </aura:set>

                                </c:MA_WizardCoachingCmp>

                            </aura:if>

                    </div>

                </c:strike_wizard>

            </div>
        </div>

        <!-- avoid showing form until have data for input labels and values, also avoids errors in debug mode -->
        <aura:if isTrue="{!and( not( empty( v.record ) ), not( empty( v.objectDescribe ) ) )}">

            <!-- Stage: Details -->

            <aura:if isTrue="{!equals( v.wizardActiveStageIndex, 0 )}">

                <div class="slds-grid slds-var-p-horizontal_medium">

                    <div class="slds-col">
                        <c:slds_section title="Detail Information"/>
                    </div>

                </div>

                <div class="slds-grid slds-var-p-horizontal_medium">

                    <div class="slds-col">
                        <div class="slds-form slds-form_stacked">

                            <c:slds_label label="{!v.objectDescribe.fields.Name.label}"
                                          helpText="{!v.objectDescribe.fields.Name.helpText}"/>
                            <lightning:input aura:id="inputName"
                                name="inputName"
                                variant="label-hidden"
                                label="{!v.objectDescribe.fields.Name.label}"
                                value="{!v.record.name}"
                                required="true"
                                type="text"
                                messageWhenValueMissing="Name is required."
                                class="slds-var-p-top_x-small"
                                onblur="{!c.handleInputNameFieldBlur}"/>

                            <c:slds_label label="{!v.objectDescribe.fields.DeveloperName__c.label}"
                                          helpText="{!v.objectDescribe.fields.DeveloperName__c.helpText}"/>
                            <lightning:input aura:id="inputDeveloperName"
                                name="inputDeveloperName"
                                variant="label-hidden"
                                label="{!v.objectDescribe.fields.DeveloperName__c.label}"
                                value="{!v.record.developerName}"
                                required="true"
                                type="text"
                                messageWhenValueMissing="Unique Name is required."
                                class="slds-var-p-top_x-small"/>

                            <c:slds_label label="{!v.objectDescribe.fields.Description__c.label}"
                                          helpText="{!v.objectDescribe.fields.Description__c.helpText}"/>
                            <lightning:textarea aura:id="inputDescription"
                                name="inputDescription"
                                variant="label-hidden"
                                label="{!v.objectDescribe.fields.Description__c.label}"
                                value="{!v.record.description}"
                                required="false"
                                class="slds-var-p-top_x-small"/>

                            <c:slds_label label="{!v.objectDescribe.fields.Active__c.label}"
                                          helpText="{!v.objectDescribe.fields.Active__c.helpText}"/>
                            <lightning:input aura:id="inputActive"
                                name="inputActive"
                                variant="label-hidden"
                                label="{!v.objectDescribe.fields.Active__c.label}"
                                value="{!v.record.active}"
                                checked="{!v.record.active}"
                                required="false"
                                type="checkbox"
                                class="slds-var-p-top_x-small"/>

                            <c:slds_label label="{!v.objectDescribe.fields.Batch_Size__c.label}"
                                          helpText="{!v.objectDescribe.fields.Batch_Size__c.helpText}"/>
                            <lightning:input aura:id="inputBatchSize"
                                name="inputBatchSize"
                                variant="label-hidden"
                                label="{!v.objectDescribe.fields.Batch_Size__c.label}"
                                value="{!v.record.batchSize}"
                                required="true"
                                type="number"
                                min="1"
                                max="200"
                                messageWhenValueMissing="Batch Size is required."
                                messageWhenRangeUnderflow="Batch Size must be between 1 and 200."
                                messageWhenRangeOverflow="Batch Size must be between 1 and 200."
                                class="slds-var-p-top_x-small"/>

                            <c:slds_label label="{!v.objectDescribe.fields.Named_Credential__c.label}"
                                          helpText="{!v.objectDescribe.fields.Named_Credential__c.helpText}"/>
                            <lightning:combobox aura:id="inputNamedCredential"
                                name="inputNamedCredential"
                                variant="label-hidden"
                                label="{!v.objectDescribe.fields.Named_Credential__c.label}"
                                value="{!v.record.namedCredential}"
                                required="false"
                                options="{!v.targetNamedCredentials}"
                                placeholder="Select a Named Credential"
                                class="slds-var-p-top_x-small"/>

                        </div>
                    </div>

                </div>

            </aura:if>

            <!-- Stage: Choose Source -->

            <aura:if isTrue="{!equals( v.wizardActiveStageIndex, 1 )}">

                <div class="slds-grid slds-var-p-horizontal_medium">

                    <div class="slds-col">
                        <c:slds_section title="Source Information"/>
                    </div>

                </div>

                <div class="slds-grid slds-var-p-horizontal_medium">

                    <div class="slds-col">
                        <div class="slds-form slds-form_stacked">

                            <c:slds_label label="{!v.objectDescribe.fields.Source_Type__c.label}"
                                          helpText="{!v.objectDescribe.fields.Source_Type__c.helpText}"/>
                            <lightning:combobox aura:id="inputSourceType"
                                name="inputSourceType"
                                variant="label-hidden"
                                label="{!v.objectDescribe.fields.Source_Type__c.label}"
                                value="{!v.sourceType}"
                                options="{!v.objectDescribe.fields.Source_Type__c.picklistValues}"
                                placeholder="Select a Source Type"
                                required="true"
                                messageWhenValueMissing="Source Type is required."
                                class="slds-var-p-top_x-small"/>

                            <aura:if isTrue="{!equals( v.sourceType, 'Report' )}">

                                <c:slds_label label="Report Folder"
                                              helpText="Choose a folder that has the report to use as the source records."/>
                                <lightning:combobox aura:id="inputSourceReportFolder"
                                    name="inputSourceReportFolder"
                                    variant="label-hidden"
                                    label="Report Folder"
                                    value="{!v.sourceReportFolderId}"
                                    options="{!v.sourceReportFolders}"
                                    placeholder="Select a Report Folder"
                                    required="true"
                                    messageWhenValueMissing="Report Folder is required."
                                    class="slds-var-p-top_x-small"/>

                                <c:slds_label label="Report (tabular format only)"
                                              helpText="{!v.objectDescribe.fields.Source_Report_ID__c.helpText}"/>
                                <lightning:combobox aura:id="inputSourceReport"
                                    name="inputSourceReport"
                                    variant="label-hidden"
                                    label="Report (tabular format only)"
                                    value="{!v.sourceReportId}"
                                    options="{!v.sourceReports}"
                                    placeholder="Select a Tabular Report"
                                    required="true"
                                    messageWhenValueMissing="Report is required."
                                    class="slds-var-p-top_x-small"/>

                                <c:slds_label label="Report Column - choose a column that uniquely identifies each record in the report"
                                              helpText="{!v.objectDescribe.fields.Source_Report_Column_Name__c.helpText}"/>
                                <lightning:combobox aura:id="inputSourceReportColumn"
                                    name="inputSourceReportColumn"
                                    variant="label-hidden"
                                    label="Report Column - choose a column that uniquely identifies each record in the report"
                                    value="{!v.sourceReportColumnName}"
                                    options="{!v.sourceReportColumns}"
                                    placeholder="Select a Report Column"
                                    required="true"
                                    messageWhenValueMissing="Report Column is required."
                                    class="slds-var-p-top_x-small"/>

                            </aura:if>

                            <aura:if isTrue="{!equals( v.sourceType, 'ListView' )}">

                                <c:slds_label label="Object"
                                              helpText="Choose an object that has the list view to use as the source records."/>
                                <lightning:combobox aura:id="inputSourceListViewSobjectType"
                                    name="inputSourceListViewSobjectType"
                                    variant="label-hidden"
                                    label="Object"
                                    value="{!v.sourceListViewSobjectType}"
                                    options="{!v.sourceListViewSobjectTypes}"
                                    placeholder="Select an Object"
                                    required="true"
                                    messageWhenValueMissing="Object is required."
                                    class="slds-var-p-top_x-small"/>

                                <c:slds_label label="List View"
                                              helpText="{!v.objectDescribe.fields.Source_List_View_ID__c.helpText}"/>
                                <lightning:combobox aura:id="inputSourceListView"
                                    name="inputSourceListView"
                                    variant="label-hidden"
                                    label="List View"
                                    value="{!v.sourceListViewId}"
                                    options="{!v.sourceListViews}"
                                    placeholder="Select a List View"
                                    required="true"
                                    messageWhenValueMissing="List View is required."
                                    class="slds-var-p-top_x-small"/>

                            </aura:if>

                            <aura:if isTrue="{!equals( v.sourceType, 'SOQL' )}">

                                <c:slds_label label="SOQL Query"
                                              helpText="{!v.objectDescribe.fields.Source_SOQL_Query__c.helpText}"/>
                                <lightning:textarea aura:id="inputSourceSoqlQuery"
                                    name="inputSourceSoqlQuery"
                                    variant="label-hidden"
                                    label="{!v.objectDescribe.fields.Source_SOQL_Query__c.label}"
                                    value="{!v.record.sourceSoqlQuery}"
                                    required="true"
                                    onblur="{!c.handleOnBlurInputSourceSoqlQuery}"
                                    maxlength="{!v.objectDescribe.fields.Source_SOQL_Query__c.length}"
                                    messageWhenValueMissing="SOQL Query is required."
                                    messageWhenTooLong="SOQL Query is too long."
                                    class="slds-var-p-top_x-small slds-text-font_monospace"/>

                            </aura:if>

                            <aura:if isTrue="{!equals( v.sourceType, 'Apex' )}">

                                <c:slds_label label="Apex Class"
                                              helpText="{!v.objectDescribe.fields.Source_Apex_Class__c.helpText}"/>
                                <lightning:input aura:id="inputSourceApexClass"
                                    name="inputSourceApexClass"
                                    variant="label-hidden"
                                    label="{!v.objectDescribe.fields.Source_Apex_Class__c.label}"
                                    value="{!v.record.sourceApexClass}"
                                    required="true"
                                    messageWhenValueMissing="Apex Class is required."
                                    class="slds-var-p-top_x-small"/>

                            </aura:if>

                            <aura:if isTrue="{!not(empty(v.sourceTypeURL))}">

                                <div class="slds-form-element">
                                    <div class="slds-form-element__control">
                                        <a href="{!v.sourceTypeURL}" target="_blank" rel="noopener noreferrer">View selected source to confirm fields and filters</a>
                                    </div>
                                </div>

                            </aura:if>

                        </div>
                    </div>

                </div>

            </aura:if>

            <!-- Stage: Choose Action -->

            <aura:if isTrue="{!equals( v.wizardActiveStageIndex, 2 )}">

                <div class="slds-grid slds-var-p-horizontal_medium">

                    <div class="slds-col">
                        <c:slds_section title="Action Information"/>
                    </div>

                </div>

                <div class="slds-grid slds-var-p-horizontal_medium">

                    <div class="slds-col">
                        <div class="slds-form slds-form_stacked">

                            <c:slds_label label="Action Type"
                                          helpText="{!v.objectDescribe.fields.Target_Type__c.helpText}"/>
                            <lightning:combobox aura:id="inputTargetType"
                                name="inputTargetType"
                                variant="label-hidden"
                                label="Action Type"
                                value="{!v.targetType}"
                                options="{!v.objectDescribe.fields.Target_Type__c.picklistValues}"
                                placeholder="Select an Action Type"
                                required="true"
                                messageWhenValueMissing="Action Type is required."
                                class="slds-var-p-top_x-small"/>

                            <aura:if isTrue="{!equals( v.targetType, 'Workflow' )}">

                                <div class="slds-form-element slds-var-p-top_x-small">

                                    <label class="slds-form-element__label">
                                        <abbr title="required" class="slds-required">*</abbr>
                                        Action
                                    </label>

                                    <div class="slds-input" disabled="disabled">
                                        For each source record, all <b>active</b> Workflow Rules will run whose <b>Rule Criteria</b> matches the record.
                                        <br/>
                                        <b>Evaluation Criteria</b>, which normally decides when a rule fires, is ignored because you are explicitly running the rules with Mass Action Scheduler.
                                        <br/>
                                        Learn more with the <a href="https://help.salesforce.com/articleView?id=workflow_rules_define.htm" target="_blank" rel="noopener noreferrer">Set the Criteria for Your Workflow Rule</a> help article.
                                    </div>

                                </div>

                            </aura:if>

                            <aura:if isTrue="{!equals( v.targetType, 'Apex' )}">

                                <c:slds_label label="Apex Type"
                                              helpText="Choose how to invoke the Apex code. Supported types include invocable Apex methods annotated with @InvocableMethod, or anonymous blocks."/>
                                <lightning:combobox aura:id="inputTargetApexType"
                                    name="inputTargetApexType"
                                    variant="label-hidden"
                                    label="Apex Type"
                                    value="{!v.targetApexType}"
                                    options="{!v.targetApexTypes}"
                                    placeholder="Select an Apex Type"
                                    required="true"
                                    messageWhenValueMissing="Apex Type is required."
                                    class="slds-var-p-top_x-small"/>

                                <aura:if isTrue="{!equals( v.targetApexType, 'Anonymous' )}">
                                    <c:slds_label label="Apex Code"
                                                  helpText="{!v.objectDescribe.fields.Target_Apex_Script__c.helpText}"/>
                                    <lightning:textarea aura:id="inputTargetApexScript"
                                        name="inputTargetApexScript"
                                        variant="label-hidden"
                                        label="{!v.objectDescribe.fields.Target_Apex_Script__c.label}"
                                        value="{!v.record.targetApexScript}"
                                        required="true"
                                        onblur="{!c.handleOnBlurInputTargetApexScript}"
                                        maxlength="{!v.objectDescribe.fields.Target_Apex_Script__c.length}"
                                        messageWhenValueMissing="Apex code is required."
                                        messageWhenTooLong="Apex code is too long."
                                        class="slds-var-p-top_x-small slds-text-font_monospace"/>
                                </aura:if>

                            </aura:if>

                            <aura:if isTrue="{!v.targetTypeRequiresSobject}">
                                <c:slds_label label="Object"
                                              helpText="Choose an object that has the custom actions to run on the source records."/>
                                <lightning:combobox aura:id="inputTargetSobjectType"
                                    name="inputTargetSobjectType"
                                    variant="label-hidden"
                                    label="Object"
                                    value="{!v.targetSobjectType}"
                                    options="{!v.targetSobjectTypes}"
                                    placeholder="Select an Object"
                                    required="true"
                                    messageWhenValueMissing="Object is required."
                                    class="slds-var-p-top_x-small"/>
                            </aura:if>

                            <aura:if isTrue="{!v.isValidToRenderTargetInvocableActions}">
                                <c:slds_label label="Action"
                                              helpText="Choose the specific action to run on the source records."/>
                                <lightning:combobox aura:id="inputTargetAction"
                                    name="inputTargetAction"
                                    variant="label-hidden"
                                    label="Action"
                                    value="{!v.targetInvocableAction}"
                                    options="{!v.targetInvocableActions}"
                                    placeholder="Select an Action"
                                    required="true"
                                    messageWhenValueMissing="Action is required."
                                    class="slds-var-p-top_x-small"/>
                            </aura:if>

                        </div>
                    </div>

                </div>

            </aura:if>

            <!-- Stage: Field Mappings -->

            <aura:if isTrue="{!equals( v.wizardActiveStageIndex, 3 )}">

                <div class="slds-grid slds-var-p-horizontal_medium">

                    <div class="slds-col">
                        <c:slds_section title="Field Mappings"/>
                    </div>

                </div>

                <div class="slds-var-p-horizontal_medium">

                    <aura:if isTrue="{!empty(v.targetFieldMappings)}">

                        <p>
                            The selected action type has no fields to map.
                            <br/>
                            You may proceed to schedule this configuration.
                        </p>

                    </aura:if>

                    <aura:if isTrue="{!not(empty(v.targetFieldMappings))}">

                        <table class="slds-table slds-table_bordered">
                            <thead>
                                <tr class="slds-text-title_caps">
                                    <th scope="col">Source Field</th>
                                    <th scope="col">Target Field</th>
                                </tr>
                            </thead>
                            <tbody>
                                <aura:iteration var="targetFieldMapping" items="{!v.targetFieldMappings}" indexVar="index">
                                    <tr>
                                        <td width="50%">

                                            <aura:if isTrue="{!equals( v.sourceFieldsInputType, 'text' )}">

                                                <lightning:input aura:id="inputMappingSourceFieldName"
                                                    name="inputMappingSourceFieldName"
                                                    label="{!targetFieldMapping.targetField.label}"
                                                    variant="label-hidden"
                                                    value="{!targetFieldMapping.sourceFieldName}"
                                                    placeholder="Enter source field name"
                                                    required="{!targetFieldMapping.targetField.required}"/>

                                            </aura:if>

                                            <aura:if isTrue="{!equals( v.sourceFieldsInputType, 'combobox' )}">

                                                <lightning:combobox aura:id="inputMappingSourceFieldName"
                                                    name="inputMappingSourceFieldName"
                                                    label="{!targetFieldMapping.targetField.label}"
                                                    variant="label-hidden"
                                                    value="{!targetFieldMapping.sourceFieldName}"
                                                    options="{!v.sourceFields}"
                                                    placeholder="Select a Field"
                                                    required="{!targetFieldMapping.targetField.required}"/>

                                            </aura:if>

                                        </td>
                                        <td width="50%">

                                            <aura:if isTrue="{!targetFieldMapping.targetField.required}">

                                                <abbr class="slds-required" title="required">*</abbr>

                                                <aura:set attribute="else">

                                                    <span class="slds-var-m-right_xxx-small" style="opacity:0">*</span>

                                                </aura:set>

                                            </aura:if>

                                            <span class="slds-var-m-right_xx-small">{!targetFieldMapping.targetField.label}</span>

                                            <aura:if isTrue="{!not(empty(targetFieldMapping.targetField.description))}">
                                                <lightning:helptext content="{!targetFieldMapping.targetField.description}"/>
                                            </aura:if>

                                        </td>
                                    </tr>
                                </aura:iteration>
                            </tbody>
                        </table>

                    </aura:if>

                </div>

            </aura:if>

            <!-- Stage: Schedule -->

            <aura:if isTrue="{!equals( v.wizardActiveStageIndex, 4 )}">

                <div class="slds-grid slds-var-p-horizontal_medium">

                    <div class="slds-col">
                        <c:slds_section title="Schedule Information"/>
                    </div>

                </div>

                <div class="slds-grid slds-var-p-horizontal_medium">

                    <div class="slds-col">
                        <div class="slds-form slds-form_stacked">

                            <c:slds_label label="{!v.objectDescribe.fields.Schedule_Frequency__c.label}"
                                          helpText="{!v.objectDescribe.fields.Schedule_Frequency__c.helpText}"/>
                            <lightning:radioGroup aura:id="inputScheduleFrequency"
                                name="inputScheduleFrequency"
                                variant="label-hidden"
                                label="{!v.objectDescribe.fields.Schedule_Frequency__c.label}"
                                value="{!v.scheduleSelectionsFrequency}"
                                options="{!v.objectDescribe.fields.Schedule_Frequency__c.picklistValues}"
                                type="button"
                                required="true"
                                messageWhenValueMissing="Schedule Frequency is required."
                                class="slds-var-p-top_x-small label-hidden"/>

                            <!--
                                Unfortunately, the radioGroup component changes the value type to an array,
                                so even though my source value is a single string I need to check both data types
                                or introduce a shadow variable to bind to the radio group and use change events
                                to copy the newly selected value; neither of which I want to do
                                https://org62.lightning.force.com/one/one.app#/sObject/0D50M00003LvvAqSAJ/view
                             -->
                            <aura:if isTrue="{!or( equals( v.scheduleSelectionsFrequency, 'Scheduled' ), and( not( empty( v.scheduleSelectionsFrequency ) ), equals( v.scheduleSelectionsFrequency[0], 'Scheduled' ) ) )}">

                                <div class="slds-var-p-top_medium">

                                    <p>
                                        Select the hours, days of month or weekdays, and months
                                        that you want to schedule the action to run.
                                    </p>

                                    <div class="slds-grid">

                                        <div class="slds-col slds-var-m-vertical_medium">

                                            <c:slds_label label="{!v.objectDescribe.fields.Schedule_HourOfDay__c.label}"
                                                          helpText="{!v.objectDescribe.fields.Schedule_HourOfDay__c.helpText}"/>
                                            <lightning:dualListbox aura:id="inputScheduleHourOfDay"
                                                name="inputScheduleHourOfDay"
                                                variant="label-hidden"
                                                label="{!v.objectDescribe.fields.Schedule_HourOfDay__c.label}"
                                                sourceLabel="Available Options"
                                                selectedLabel="Selected Options"
                                                options="{!v.scheduleOptionsHourOfDay}"
                                                value="{!v.scheduleSelectionsHourOfDay}"
                                                required="true"
                                                onchange="{!c.handleInputListBoxChanged}"/>

                                        </div>

                                    </div>

                                    <div class="slds-grid">

                                        <div class="slds-col slds-var-m-vertical_medium">

                                            <c:slds_label label="{!v.objectDescribe.fields.Schedule_DayOfWeek__c.label}"
                                                          helpText="{!v.objectDescribe.fields.Schedule_DayOfWeek__c.helpText}"/>
                                            <lightning:dualListbox aura:id="inputScheduleWeekday"
                                                name="inputScheduleWeekday"
                                                variant="label-hidden"
                                                label="{!v.objectDescribe.fields.Schedule_DayOfWeek__c.label}"
                                                sourceLabel="Available Options"
                                                selectedLabel="Selected Options"
                                                options="{!v.scheduleOptionsDayOfWeek}"
                                                value="{!v.scheduleSelectionsDayOfWeek}"
                                                onchange="{!c.handleInputListBoxChanged}"/>

                                        </div>

                                    </div>

                                    <div class="slds-grid">

                                        <div class="slds-col slds-var-m-vertical_medium">

                                            <c:slds_label label="{!v.objectDescribe.fields.Schedule_DayOfMonth__c.label}"
                                                          helpText="{!v.objectDescribe.fields.Schedule_DayOfMonth__c.helpText}"/>
                                            <lightning:dualListbox aura:id="inputScheduleDayOfMonth"
                                                name="inputScheduleDayOfMonth"
                                                variant="label-hidden"
                                                label="{!v.objectDescribe.fields.Schedule_DayOfMonth__c.label}"
                                                sourceLabel="Available Options"
                                                selectedLabel="Selected Options"
                                                options="{!v.scheduleOptionsDayOfMonth}"
                                                value="{!v.scheduleSelectionsDayOfMonth}"
                                                onchange="{!c.handleInputListBoxChanged}"/>

                                        </div>

                                    </div>

                                    <div class="slds-grid">

                                        <div class="slds-col slds-var-m-vertical_medium">

                                            <c:slds_label label="{!v.objectDescribe.fields.Schedule_MonthOfYear__c.label}"
                                                          helpText="{!v.objectDescribe.fields.Schedule_MonthOfYear__c.helpText}"/>
                                            <lightning:dualListbox aura:id="inputScheduleMonthOfYear"
                                                name="inputScheduleMonthOfYear"
                                                variant="label-hidden"
                                                label="{!v.objectDescribe.fields.Schedule_MonthOfYear__c.label}"
                                                sourceLabel="Available Options"
                                                selectedLabel="Selected Options"
                                                options="{!v.scheduleOptionsMonthOfYear}"
                                                value="{!v.scheduleSelectionsMonthOfYear}"
                                                required="true"
                                                onchange="{!c.handleInputListBoxChanged}"/>

                                        </div>

                                    </div>

                                </div>

                            </aura:if>

                            <aura:if isTrue="{!or( equals( v.scheduleSelectionsFrequency, 'Custom' ), and( not( empty( v.scheduleSelectionsFrequency ) ), equals( v.scheduleSelectionsFrequency[0], 'Custom' ) ) )}">

                                <div class="slds-var-p-top_medium">

                                    <c:slds_label label="{!v.objectDescribe.fields.Schedule_Cron__c.label}"
                                                  helpText="{!v.objectDescribe.fields.Schedule_Cron__c.helpText}"/>
                                    <lightning:input aura:id="inputScheduleCron"
                                         name="inputScheduleCron"
                                         variant="label-hidden"
                                         label="{!v.objectDescribe.fields.Schedule_Cron__c.label}"
                                         type="text"
                                         value="{!v.record.scheduleCron}"
                                         required="true"/>

                                    <div class="slds-var-m-vertical_small">
                                        Please refer to the <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_scheduler.htm" target="_blank" rel="noopener noreferrer">Apex Scheduler Developer Documentation</a>
                                        for details on creating a cron expression.
                                    </div>

                                </div>

                            </aura:if>

                        </div>
                    </div>

                </div>

            </aura:if>

            <!-- Navigation Controls -->

            <div class="slds-grid slds-var-p-around_medium slds-var-m-top_medium slds-grid_pull-padded-medium slds-grid_align-center">

                <div class="slds-col slds-var-p-horizontal_medium">
                    <lightning:button aura:id="wizardPreviousButton"
                        label="Previous"
                        title="Previous"
                        variant="neutral"
                        disabled="{!not( greaterthan( v.wizardActiveStageIndex, 0 ) )}"
                        onclick="{!c.handleNavigationButtonClick}"/>
                </div>

                <aura:if isTrue="{!lessthan( v.wizardActiveStageIndex, ( v.wizardStageNames.length - 1 ) )}">

                    <div class="slds-col slds-var-p-horizontal_medium">
                        <lightning:button aura:id="wizardNextButton"
                            label="Next"
                            title="Next"
                            variant="brand"
                            disabled="{!not( lessthan( v.wizardActiveStageIndex, ( v.wizardStageNames.length - 1 ) ) )}"
                            onclick="{!c.handleNavigationButtonClick}"/>
                    </div>

                </aura:if>

                <aura:if isTrue="{!equals( v.wizardActiveStageIndex, ( v.wizardStageNames.length - 1 ) )}">

                    <div class="slds-col slds-var-p-horizontal_medium">
                        <lightning:button aura:id="wizardSaveButton"
                            label="Save"
                            title="Save"
                            variant="brand"
                            onclick="{!c.handleSaveButtonClick}"/>
                    </div>

                </aura:if>

            </div>

            <aura:set attribute="else">

                <lightning:spinner variant="brand" size="large"/>

            </aura:set>

        </aura:if>

    </div>

</aura:component>
<!--
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->

================================================
FILE: force-app/main/default/aura/MA_EditConfigCmp/MA_EditConfigCmp.cmp-meta.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<AuraDefinitionBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>54.0</apiVersion>
    <description>MA_EditConfigCmp</description>
</AuraDefinitionBundle>


================================================
FILE: force-app/main/default/aura/MA_EditConfigCmp/MA_EditConfigCmp.css
================================================
/*
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler
License: BSD 3-Clause License
 */

/**
 * Make it more obvious that the user can
 * click to select an option from the picklist.
 */
.THIS lightning-combobox * {
    cursor: pointer;
}

/**
 * W-5212157
 * https://salesforce.stackexchange.com/questions/220616/summer-18-lightning-input-variant-label-hidden-hides-the-label-but-occupies-th/221202#221202
 */
.THIS .label-hidden > label,
.THIS .label-hidden legend {
    display: none;
}

/**
 * The strike_wizard component applies this class
 * to the chevrons that are incomplete. To further
 * express to users they cannot jump ahead then
 * change mouse cursor on hover.
 */
.THIS .slds-is-incomplete * {
    cursor: not-allowed;
}

/**
 * Styling copied from Trailhead website.
 */
.THIS .keyword {
    color: #d14;
    background-color: #f7f7f9;
    border: t(borderWidthThin) solid #e1e1e8;
    border-radius: t(borderRadiusSmall);
    padding: t(varSpacingXxxSmall) t(varSpacingXxSmall);
}

/**
 * Renders newlines and whitespace indentation
 * similar to the <pre> tag but without the
 * ridiculous leading whitespace.
 */
.THIS code.block {
    color: #d14;
    white-space: pre-line;
    display: block;
}

/**
 * This CSS selector places the tag name after our class name
 * because the `class` attribute we put on <lightning:textarea>
 * is applied to the outer DOM element and not on the actual
 * `textarea` tag within the component. Therefore, our selector
 * needs to cascade to the `textarea` elements in the component.
 */
.THIS textarea[name="inputTargetApexScript"],
.THIS textarea[name="inputSourceSoqlQuery"] {
    height: 200px;
}

/*
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

================================================
FILE: force-app/main/default/aura/MA_EditConfigCmp/MA_EditConfigCmpController.js
================================================
/*
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler
License: BSD 3-Clause License
 */
({
    onInit : function( component, event, helper ) {

        var recordId = component.get( 'v.recordId' );

        // initialize wizard to first step
        var wizard = component.find( 'wizard' );
        wizard.moveToStage( 0 );
        component.set( 'v.wizardActiveStageIndex', 0 );

        Promise.resolve()
            .then( $A.getCallback( function() {

                let promises = [];

                promises.push( helper.getObjectDescribeAsync( component )
                    .then( $A.getCallback( function( objectDescribe ) {

                        component.set( 'v.objectDescribe', objectDescribe );

                    })).catch( $A.getCallback( function( err ) {

                        helper.toastMessage( 'Error Getting Object Describe', err, 'error' );

                    }))
                );

                promises.push( helper.getRecordAsync( component, recordId )
                    .then( $A.getCallback( function( record ) {

                        component.set( 'v.record', record );
                        component.set( 'v.sourceType', record.sourceType );
                        component.set( 'v.targetType', record.targetType );
                        component.set( 'v.targetSobjectType', record.targetSobjectType );
                        component.set( 'v.targetInvocableAction', record.targetActionName );

                        if ( record.targetType === 'Apex' ) {

                            if ( !$A.util.isEmpty( record.targetActionName ) ) {
                                component.set( 'v.targetApexType', 'Invocable' );
                            }
                            else if ( !$A.util.isEmpty( record.targetApexScript ) ) {
                                component.set( 'v.targetApexType', 'Anonymous' );
                            }

                        }

                        helper.initScheduleOptions( component );

                        return record;

                    })).then( $A.getCallback( function( record ) {

                        if ( !$A.util.isUndefinedOrNull( record.sourceReportID ) ) {

                            return helper.getReportAsync( component, record.sourceReportID )
                                .then( $A.getCallback( function( report ) {

                                    if ( !$A.util.isUndefinedOrNull( report ) ) {
                                        component.set( 'v.sourceReport', report );
                                        component.set( 'v.sourceReportId', ( report.Id && report.Id.substring( 0, 15 ) ) );
                                        component.set( 'v.sourceReportFolderId', ( report.OwnerId && report.OwnerId.substring( 0, 15 ) ) );
                                        component.set( 'v.sourceReportColumnName', record.sourceReportColumnName );
                                    }

                                })).catch( $A.getCallback( function( err ) {

                                    helper.toastMessage( 'Error Getting Report', err, 'error' );

                                }));

                        }

                        if ( !$A.util.isUndefinedOrNull( record.sourceListViewID ) ) {

                            return helper.getListViewAsync( component, record.sourceListViewID )
                                .then( $A.getCallback( function( listView ) {

                                    if ( !$A.util.isUndefinedOrNull( listView ) ) {
                                        component.set( 'v.sourceListView', listView );
                                        component.set( 'v.sourceListViewId', ( listView.Id && listView.Id.substring( 0, 15 ) ) );
                                        component.set( 'v.sourceListViewSobjectType', listView.SobjectType );
                                    }

                                })).catch( $A.getCallback( function( err ) {

                                    helper.toastMessage( 'Error Getting List View', err, 'error' );

                                }));

                        }

                    })).then( $A.getCallback( function() {

                        // avoid race condition where as the page loads,
                        // several change handlers call controller methods
                        // and those methods end up reading/writing attribtues
                        // before the above async operations have completed.
                        // https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler/issues/94

                        component.set( 'v.didInitConfig', true );

                        return Promise.all([
                            helper.handleSourceTypeChange( component ),
                            helper.handleTargetTypeChange( component )
                        ]);

                    })).catch( $A.getCallback( function( err ) {

                        helper.toastMessage( 'Error Getting Mass Action Configuration', err, 'error' );

                    }))
                );

                promises.push( helper.getNamedCredentialsAsync( component )
                    .then( $A.getCallback( function( namedCredentials ) {

                        var emptyOption = {
                            'label': '--None--',
                            'value': null
                        };

                        component.set( 'v.targetNamedCredentials', [ emptyOption ].concat( namedCredentials ) );

                    })).catch( $A.getCallback( function( err ) {

                        helper.toastMessage( 'Error Getting Named Credentials', err, 'error' );

                    }))
                );

                return Promise.all( promises );

            })).catch( $A.getCallback( function( err ) {

                helper.toastMessage( 'Error initializing component', err, 'error' );

            }));

    },

    handleNavigationButtonClick : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        var wizard = component.find( 'wizard' );
        var currentStageIndex = wizard.get( 'v.activeChevron' );

        var button = event.getSource();
        var buttonLabel = button.get( 'v.label' );

        if ( buttonLabel == 'Previous' ) {

            wizard.moveToStage( currentStageIndex - 1 );

        } else if ( buttonLabel == 'Next' ) {

            var inputCmps = []; // fields to validate to proceed to next step

            if ( currentStageIndex === 0 ) {                // Details

                inputCmps = [
                    component.find( 'inputName' ),
                    component.find( 'inputDeveloperName' ),
                    component.find( 'inputDescription' ),
                    component.find( 'inputActive' ),
                    component.find( 'inputBatchSize' ),
                    component.find( 'inputNamedCredential' )
                ];

            } else if ( currentStageIndex === 1 ) {         // Choose Source

                inputCmps = [
                    component.find( 'inputSourceType' ),
                    component.find( 'inputSourceReportFolder' ),
                    component.find( 'inputSourceReport' ),
                    component.find( 'inputSourceReportColumn' ),
                    component.find( 'inputSourceListViewSobjectType' ),
                    component.find( 'inputSourceListView' ),
                    component.find( 'inputSourceSoqlQuery' ),
                    component.find( 'inputSourceApexClass' )
                ];

            } else if ( currentStageIndex === 2 ) {         // Choose Action

                inputCmps = [
                    component.find( 'inputTargetType' ),
                    component.find( 'inputTargetSobjectType' ),
                    component.find( 'inputTargetAction' ),
                    component.find( 'inputTargetApexType' ),
                    component.find( 'inputTargetApexScript' )
                ];

            } else if ( currentStageIndex === 3 ) {         // Field Mappings

                var inputSourceFieldNames = component.find( 'inputMappingSourceFieldName' );

                if ( $A.util.isArray( inputSourceFieldNames ) ) {
                    for ( var i = 0; i < inputSourceFieldNames.length; i++ ) {
                        inputCmps.push( inputSourceFieldNames[i] );
                    }
                } else {
                    inputCmps.push( inputSourceFieldNames );
                }

            }

            helper.validateInputsAsync( component, inputCmps )
                .then( $A.getCallback( function( validationResult ) {

                    var isValidToProceed = !validationResult.hasErrors;

                    if ( isValidToProceed ) {

                        return Promise.resolve()
                            .then( $A.getCallback( function() {

                                // if advancing to field mappings section then
                                // determine the action inputs and any current mappings
                                if ( currentStageIndex === 2 ) {

                                    return helper.renderTargetFieldMappingsAsync( component );
                                }

                            })).then( $A.getCallback( function() {

                                wizard.advanceProgress();

                            }));

                    } else {

                        validationResult.components.forEach( function( validationComponentResult ) {
                            if ( validationComponentResult.hasError ) {
                                helper.toastMessage( 'Step Incomplete', validationComponentResult.messageWhenInvalid, 'error' );
                                validationComponentResult.component.reportValidity();
                            }
                        });

                    }

                })).catch( $A.getCallback( function( err ) {

                    helper.toastMessage( 'Error Advancing to Next Step', err, 'error' );

                }));

        }

    },

    handleSaveButtonClick : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        var inputCmps = [
            component.find( 'inputScheduleFrequency' ),
            component.find( 'inputScheduleHourOfDay' ),
            component.find( 'inputScheduleWeekday' ),
            component.find( 'inputScheduleDayOfMonth' ),
            component.find( 'inputScheduleMonthOfYear' ),
            component.find( 'inputScheduleCron' )
        ];

        helper.validateInputsAsync( component, inputCmps )
            .then( $A.getCallback( function( validationResult ) {

                var isValidToSave = !validationResult.hasErrors;

                if ( isValidToSave ) {

                    return helper.saveRecordAsync( component )
                        .then( $A.getCallback( function( result ) {

                            if ( result.success ) {

                                helper.toastMessage( 'Save Successful', '', 'success' );

                                // Cause lightning data service to invalidate it's cache.
                                // I added this after realizing the compact layout was not
                                // picking up changes to fields by this component.
                                // I started out firing the force:refreshView event but
                                // that only worked if the record already existed, if we
                                // just saved a new record then we needed to still navigate to it.
                                // And I didn't know how to listen for the refreshView event to complete
                                // but I did find that I could use a callback in the LDS reloadRecord method.
                                var lds = component.find( 'lds' );
                                lds.set( 'v.recordId', result.recordId );
                                lds.reloadRecord( true, function() {
                                    helper.navigateToRecord( result.recordId );
                                });

                            } else {

                                helper.toastMessage( 'Save Failed', '', 'error' );

                            }

                        }));

                } else {

                    validationResult.components.forEach( function( validationComponentResult ) {
                        if ( validationComponentResult.hasError ) {
                            helper.toastMessage( 'Step Incomplete', validationComponentResult.messageWhenInvalid, 'error' );
                            validationComponentResult.component.reportValidity();
                        }
                    });

                }

            })).catch( $A.getCallback( function( err ) {

                helper.toastMessage( 'Error Saving Configuration', err, 'error' );

            }));

    },

    // ----------------------------------------------------------------------------------

    handleInputNameFieldBlur : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        var inputCmp = event.getSource();
        var inputValue = inputCmp.get( 'v.value' );

        // predict the developer name from the name, a familiar feature to admins
        if ( !helper.isEmpty( inputValue ) && helper.isEmpty( component.get( 'v.record.developerName' ) ) ) {
            component.set( 'v.record.developerName', inputValue.trim().replace( /[ ]+/g, '_' ) );
        }

    },

    handleOnBlurInputSourceSoqlQuery : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        var inputCmp = event.getSource();
        var inputValue = inputCmp.get( 'v.value' );

        if ( !$A.util.isUndefinedOrNull( inputValue ) ) {
            inputCmp.set( 'v.value', inputValue.trim() );
        }

    },

    handleOnBlurInputTargetApexScript : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        var inputCmp = event.getSource();
        var inputValue = inputCmp.get( 'v.value' );

        if ( !$A.util.isUndefinedOrNull( inputValue ) ) {
            inputCmp.set( 'v.value', inputValue.trim() );
        }

    },

    handleInputListBoxChanged : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        var selectedOptions = event.getParam( 'value' );

        if ( !helper.isEmpty( selectedOptions ) ) {
            selectedOptions.sort();
        }

    },

    // ----------------------------------------------------------------------------------

    handleSourceTypeChange : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        helper.handleSourceTypeChange( component );

    },

    // ----------------------------------------------------------------------------------

    handleSourceReportFolderChange : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        helper.handleSourceReportFolderChange( component );

    },

    handleSourceReportChange : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        helper.handleSourceReportChange( component );

    },

    // -----------------------------------------------------------------

    handleSourceListViewSobjectTypeChange : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        helper.handleSourceListViewSobjectTypeChange( component );

    },

    handleSourceListViewChange : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        helper.handleSourceListViewChange( component );

    },

    // ----------------------------------------------------------------------------------

    handleTargetTypeChange : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        helper.handleTargetTypeChange( component );

    },

    handleTargetApexTypeChange : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        helper.handleTargetTypeChange( component );

    },

    handleTargetSobjectTypeChange : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        helper.renderTargetInvocableActions( component );

    },

    handleTargetTypeRequiresSobjectChange : function( component, event, helper ) {

        if ( component.get( 'v.didInitConfig' ) !== true ) {
            return;
        }

        helper.renderTargetSobjectTypes( component );

    }

})
/*
BSD 3-Clause License

Copyright (c) 2017-2023, Doug Ayers, douglascayers.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

================================================
FILE: force-app/main/default/aura/MA_EditConfigCmp/MA_EditConfigCmpHelper.js
================================================
/*
Author: Doug Ayers
Website: https://douglascayers.com
GitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-mass-action-scheduler
License: BSD 3-Clause License
 */
({
    initScheduleOptions : function( component ) {

        var helper = this;

        var scheduleOptionsHourOfDay = [];
        var scheduleOptionsDayOfMonth = [];
        var scheduleOptionsMonthOfYear = [];
        var scheduleOptionsDayOfWeek = [];

        for ( let i = 0; i < 24; i++ ) {
            scheduleOptionsHourOfDay.push({
                'label' : ( i == 0 ? '12:00 AM' : i == 12 ? '12:00 PM' : ( i < 12 ? i + ':00 AM' : ( i - 12 ) + ':00 PM' ) ).padStart( 8, '0' ),
                'value' : i.toString().padStart( 2, '0' ) + '.' + i.toString()
            });
        }

        for ( let i = 1; i <= 31; i++ ) {
            scheduleOptionsDayOfMonth.push({
                'label' : i.toString(),
                'value' : i.toString().padStart( 2, '0' ) + '.' + i.toString()
            });
        }

        var monthValues = [ 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC' ];
        var localeMonthNames = $A.get( '$Locale.nameOfMonths' );
        for ( let i = 0; i < localeMonthNames.length; i++ ) {
            if ( !helper.isEmpty( localeMonthNames[i].fullName ) ) {
                scheduleOptionsMonthOfYear.push({
                    'label' : localeMonthNames[i].fullName.toUpperCase(),               // display in user's locale
                    'value' : i.toString().padStart( 2, '0' ) + '.' + monthValues[i]    // but capture in english for cron expr.
                });                                                                     // left pad with number for easy sorting
            }
        }

        var weekdayValues = [ 'SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT' ];
        var localeWeekdayNames = $A.get( '$Locale.nameOfWeekdays' );
        for ( let i = 0; i < localeWeekdayNames.length; i++ ) {
            if ( !helper.isEmpty( localeWeekdayNames[i].fullName ) ) {
                scheduleOptionsDayOfWeek.push({
                    'label' : localeWeekdayNames[i].fullName.toUpperCase(),             // display in user's locale
                    'value' : i.toString().padStart( 2, '0' ) + '.' + weekdayValues[i]  // but capture in english for cron expr.
                });                                                                     // left pad with number for easy sorting
            }
        }

        component.set( 'v.scheduleOptionsHourOfDay', scheduleOptionsHourOfDay );
        component.set( 'v.scheduleOptionsDayOfMonth', scheduleOptionsDayOfMonth );
        component.set( 'v.scheduleOptionsMonthOfYear', scheduleOptionsMonthOfYear );
        component.set( 'v.scheduleOptionsDayOfWeek', scheduleOptionsDayOfWeek );

        var record = component.get( 'v.record' );

        component.set( 'v.scheduleSelectionsFrequency', record.scheduleFrequency );

        // add the "NN." prefix to the values used for sorting
        // so match the schedule options format so the selections are visually shown on the config page

        // exactly one of dayOfMonth or dayOfWeek must be specified and the other must be '?',
        // in our case, '?' means no selections for that value as the other field was specified

        if ( !$A.util.isUndefinedOrNull( record.scheduleHourOfDay ) ) {
            component.set( 'v.scheduleSelectionsHourOfDay', record.scheduleHourOfDay.split(',').map( function( hourOfDay ) { return hourOfDay.padStart( 2, '0' ) + '.' + hourOfDay; } ) );
        } else {
            component.set( 'v.scheduleSelectionsHourOfDay', [] );
        }

        if ( !$A.util.isUndefinedOrNull( record.scheduleDayOfMonth ) && record.scheduleDayOfMonth != '?' ) {
            component.set( 'v.scheduleSelectionsDayOfMonth', record.scheduleDayOfMonth.split(',').map( function( dayOfMonth ) { return dayOfMonth.padStart( 2, '0' ) + '.' + dayOfMonth; } ) );
        } else {
            component.set( 'v.scheduleSelectionsDayOfMonth', [] );
        }

        if ( !$A.util.isUndefinedOrNull( record.scheduleMonthOfYear ) ) {
            component.set( 'v.scheduleSelectionsMonthOfYear', record.scheduleMonthOfYear.split(',').map( function( monthOfYear ) { return monthValues.indexOf( monthOfYear ).toString().padStart( 2, '0' ) + '.' + monthOfYear; } ) );
        } else {
            component.set( 'v.scheduleSelectionsMonthOfYear', [] );
        }

        if ( !$A.util.isUndefinedOrNull( record.scheduleDayOfWeek ) && record.scheduleDayOfWeek != '?' ) {
            component.set( 'v.scheduleSelectionsDayOfWeek', record.scheduleDayOfWeek.split(',').map( function( dayOfWeek ) { return weekdayValues.indexOf( dayOfWeek ).toString().padStart( 2, '0' ) + '.' + dayOfWeek; } ) );
        } else {
            component.set( 'v.scheduleSelectionsDayOfWeek', [] );
        }

    },

    // ----------------------------------------------------------------------------------

    handleSourceTypeChange : function( component ) {

        var helper = this;

        var promises = [];

        var sourceType = component.get( 'v.sourceType' );
        var record = component.get( 'v.record' );

        if ( sourceType != 'Report' ) {

            record.sourceReportID = null;
            record.sourceReportColumnName = null;

            component.set( 'v.sourceReport', null );
            component.set( 'v.sourceReportId', null );
            component.set( 'v.sourceReportFolderId', null );
            component.set( 'v.sourceReportColumns', null );
            component.set( 'v.sourceReportColumnName', null );

        } else {

            if ( helper.isEmpty( component.get( 'v.sourceReportFolders' ) ) ) {

                promises.push( helper.getReportFoldersAsync( component )
                    .then( $A.getCallback( function( reportFolders ) {

                        component.set( 'v.sourceReportFolders', reportFolders );
                        helper.handleSourceReportFolderChange( component );

                    })).catch( $A.getCallback( function( err ) {

                        helper.toastMessage( 'Error Getting Report Folders', err, 'error' );

                    }))
                );

            }

        }

        if ( sourceType != 'ListView' ) {

            record.sourceListViewID = null;

            component.set( 'v.sourceListView', null );
            component.set( 'v.sourceListViewId', null );
            component.set( 'v.sourceListViewSobjectType', null );

        } else {

            if ( helper.isEmpty( component.get( 'v.sourceListViewSobjectTypes' ) ) ) {

                promises.push( helper.getObjectNamesWithListViewsAsync( component )
                    .then( $A.getCallback( function( objectNames ) {

                        component.set( 'v.sourceListViewSobjectTypes', objectNames );
                        helper.handleSourceListViewSobjectTypeChange( component );

                    })).catch( $A.getCallback( function( err ) {

                        helper.toastMessage( 'Error Getting Object Names', err, 'error' );

                    }))
                );

            }

        }

        if ( sourceType != 'SOQL' ) {

            record.sourceSoqlQuery = null;

        }

        component.set( 'v.record', record );
        component.set( 'v.sourceTypeURL', null );

        return Promise.all( promises );

    },

    handleSourceReportFolderChange : function( component ) {

        var helper = this;

        var promises = [];

        var sourceType = component.get( 'v.sourceType' );
        var report = component.get( 'v.sourceReport' );
        var folderId = component.get( 'v.sourceReportFolderId' );

        if ( sourceType == 'Report' ) {

            var reportFolderId = report && report.OwnerId && report.OwnerId.substring( 0, 15 );
            folderId = folderId && folderId.substring( 0, 15 );

            if ( folderId != reportFolderId ) {

                component.set( 'v.sourceReport', null );
                component.set( 'v.sourceReportId', null );
                component.set( 'v.sourceReportColumnName', null );
                component.set( 'v.record.sourceReportID', null );
                component.set( 'v.record.sourceReportColumnName', null );

            }

            promises.push( helper.getReportsByFolderAsync( component, folderId )
                .then( $A.getCallback( function( reports ) {

                    component.set( 'v.sourceReports', reports );
                    return helper.handleSourceReportChange( component );

                })).catch( $A.getCallback( function( err ) {

                    helper.toastMessage( 'Error Getting Reports By Folder', err, 'error' );

                }))
            );

        }

        return Promise.all( promises );

    },

    handleSourceReportChange : function( component ) {

        var helper = this;

        var promises = [];

        var sourceType = component.get( 'v.sourceType' );
        var reportId = component.get( 'v.sourceReportId' );

        if ( sourceType == 'Report' ) {

            if ( helper.isEmpty( reportId ) ) {

                component.set( 'v.sourceTypeURL', null );
                component.set( 'v.sourceReport', null );
                component.set( 'v.sourceReportColumns', null );
                component.set( 'v.sourceReportColumnName', null );
                component.set( 'v.record.sourceReportID', null );
                component.set( 'v.record.sourceReportColumnName', null );

            } else {

                promises.push( helper.getReportAsync( component, reportId )
                    .then( $A.getCallback( function( report ) {

                        component.set( 'v.sourceTypeURL', '/lightning/r/Report/' + report.Id + '/view' );
                        component.set( 'v.sourceReport', report );
                        component.set( 'v.record.sourceReportID', ( report.Id && report.Id.substring( 0, 15 ) ) );

                    })).catch( $A.getCallback( function( err ) {

                        helper.toastMessage( 'Error Getting Report', err, 'error' );

                    }))
                );

                promises.push( helper.getReportColumnsAsync( component, reportId )
                    .then( $A.getCallback( function( reportColumns ) {

                        component.set( 'v.sourceReportColumns', reportColumns );

                        var columnName = component.get( 'v.sourceReportColumnName' );
                        var columnFound = false;

                        for ( var
Download .txt
gitextract_80zxm3lv/

├── .forceignore
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── BUG_REPORT.md
│   │   ├── DOCUMENTATION_REQUEST.md
│   │   └── FEATURE_REQUEST.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       └── main.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── _config.yml
├── _layouts/
│   └── default.html
├── config/
│   └── project-scratch-def.json
├── force-app/
│   └── main/
│       └── default/
│           ├── applications/
│           │   ├── Mass_Action_Scheduler.app-meta.xml
│           │   └── Mass_Action_Scheduler_Lightning.app-meta.xml
│           ├── aura/
│           │   ├── LC_API/
│           │   │   ├── LC_API.cmp
│           │   │   ├── LC_API.cmp-meta.xml
│           │   │   ├── LC_APIController.js
│           │   │   ├── LC_APIHelper.js
│           │   │   └── LC_APIRenderer.js
│           │   ├── LC_URL/
│           │   │   ├── LC_URL.cmp
│           │   │   ├── LC_URL.cmp-meta.xml
│           │   │   └── LC_URLController.js
│           │   ├── MA_CheckForPackageUpdatesCmp/
│           │   │   ├── MA_CheckForPackageUpdatesCmp.cmp
│           │   │   ├── MA_CheckForPackageUpdatesCmp.cmp-meta.xml
│           │   │   └── MA_CheckForPackageUpdatesCmpController.js
│           │   ├── MA_DevelopedByCmp/
│           │   │   ├── MA_DevelopedByCmp.cmp
│           │   │   └── MA_DevelopedByCmp.cmp-meta.xml
│           │   ├── MA_EditConfigCmp/
│           │   │   ├── MA_EditConfigCmp.cmp
│           │   │   ├── MA_EditConfigCmp.cmp-meta.xml
│           │   │   ├── MA_EditConfigCmp.css
│           │   │   ├── MA_EditConfigCmpController.js
│           │   │   └── MA_EditConfigCmpHelper.js
│           │   ├── MA_FlowStagePathCmp/
│           │   │   ├── MA_FlowStagePathCmp.cmp
│           │   │   ├── MA_FlowStagePathCmp.cmp-meta.xml
│           │   │   ├── MA_FlowStagePathCmp.design
│           │   │   └── MA_FlowStagePathCmpController.js
│           │   ├── MA_RunConfigCmp/
│           │   │   ├── MA_RunConfigCmp.cmp
│           │   │   ├── MA_RunConfigCmp.cmp-meta.xml
│           │   │   ├── MA_RunConfigCmpController.js
│           │   │   └── MA_RunConfigCmpHelper.js
│           │   ├── MA_WizardCoachingCmp/
│           │   │   ├── MA_WizardCoachingCmp.cmp
│           │   │   └── MA_WizardCoachingCmp.cmp-meta.xml
│           │   ├── defaultTokens/
│           │   │   ├── defaultTokens.tokens
│           │   │   └── defaultTokens.tokens-meta.xml
│           │   ├── lax/
│           │   │   ├── lax.cmp
│           │   │   ├── lax.cmp-meta.xml
│           │   │   ├── laxController.js
│           │   │   └── laxHelper.js
│           │   ├── slds_label/
│           │   │   ├── slds_label.cmp
│           │   │   └── slds_label.cmp-meta.xml
│           │   ├── slds_section/
│           │   │   ├── slds_section.cmp
│           │   │   └── slds_section.cmp-meta.xml
│           │   ├── strike_evt/
│           │   │   ├── strike_evt.evt
│           │   │   └── strike_evt.evt-meta.xml
│           │   └── strike_wizard/
│           │       ├── strike_wizard.cmp
│           │       ├── strike_wizard.cmp-meta.xml
│           │       ├── strike_wizard.css
│           │       ├── strike_wizardController.js
│           │       └── strike_wizardHelper.js
│           ├── classes/
│           │   ├── LC_URLController.cls
│           │   ├── LC_URLController.cls-meta.xml
│           │   ├── LC_URLControllerTest.cls
│           │   ├── LC_URLControllerTest.cls-meta.xml
│           │   ├── LC_VisualforceDomainController.cls
│           │   ├── LC_VisualforceDomainController.cls-meta.xml
│           │   ├── LC_VisualforceDomainControllerTest.cls
│           │   ├── LC_VisualforceDomainControllerTest.cls-meta.xml
│           │   ├── MA_AnonymousApexExecuteResult.cls
│           │   ├── MA_AnonymousApexExecuteResult.cls-meta.xml
│           │   ├── MA_AsyncApexJobMock.cls
│           │   ├── MA_AsyncApexJobMock.cls-meta.xml
│           │   ├── MA_BatchApexErrorEventInvocable.cls
│           │   ├── MA_BatchApexErrorEventInvocable.cls-meta.xml
│           │   ├── MA_BatchApexErrorEventInvocableTest.cls
│           │   ├── MA_BatchApexErrorEventInvocableTest.cls-meta.xml
│           │   ├── MA_BatchApexStatusEventTriggerHandler.cls
│           │   ├── MA_BatchApexStatusEventTriggerHandler.cls-meta.xml
│           │   ├── MA_BatchApexStatusEventTriggerTest.cls
│           │   ├── MA_BatchApexStatusEventTriggerTest.cls-meta.xml
│           │   ├── MA_EditConfigCmpController.cls
│           │   ├── MA_EditConfigCmpController.cls-meta.xml
│           │   ├── MA_EditConfigCmpControllerTest.cls
│           │   ├── MA_EditConfigCmpControllerTest.cls-meta.xml
│           │   ├── MA_EditConfigRestController.cls
│           │   ├── MA_EditConfigRestController.cls-meta.xml
│           │   ├── MA_EditConfigRestControllerTest.cls
│           │   ├── MA_EditConfigRestControllerTest.cls-meta.xml
│           │   ├── MA_Exceptions.cls
│           │   ├── MA_Exceptions.cls-meta.xml
│           │   ├── MA_ExceptionsTest.cls
│           │   ├── MA_ExceptionsTest.cls-meta.xml
│           │   ├── MA_HttpCalloutMock.cls
│           │   ├── MA_HttpCalloutMock.cls-meta.xml
│           │   ├── MA_InstallHandler.cls
│           │   ├── MA_InstallHandler.cls-meta.xml
│           │   ├── MA_InstallHandlerTest.cls
│           │   ├── MA_InstallHandlerTest.cls-meta.xml
│           │   ├── MA_IterableSourceBatchable.cls
│           │   ├── MA_IterableSourceBatchable.cls-meta.xml
│           │   ├── MA_IterableSourceBatchableTest.cls
│           │   ├── MA_IterableSourceBatchableTest.cls-meta.xml
│           │   ├── MA_JobChangeEvent.cls
│           │   ├── MA_JobChangeEvent.cls-meta.xml
│           │   ├── MA_JobChangeEventTriggerHandler.cls
│           │   ├── MA_JobChangeEventTriggerHandler.cls-meta.xml
│           │   ├── MA_JobChangeEventTriggerHandlerTest.cls
│           │   ├── MA_JobChangeEventTriggerHandlerTest.cls-meta.xml
│           │   ├── MA_ListViewDescribeResult.cls
│           │   ├── MA_ListViewDescribeResult.cls-meta.xml
│           │   ├── MA_ListViewDescribeResultTest.cls
│           │   ├── MA_ListViewDescribeResultTest.cls-meta.xml
│           │   ├── MA_ListViewSourceBatchable.cls
│           │   ├── MA_ListViewSourceBatchable.cls-meta.xml
│           │   ├── MA_ListViewSourceBatchableTest.cls
│           │   ├── MA_ListViewSourceBatchableTest.cls-meta.xml
│           │   ├── MA_MapUtils.cls
│           │   ├── MA_MapUtils.cls-meta.xml
│           │   ├── MA_MapUtilsTest.cls
│           │   ├── MA_MapUtilsTest.cls-meta.xml
│           │   ├── MA_MassActionBatchEnqueuer.cls
│           │   ├── MA_MassActionBatchEnqueuer.cls-meta.xml
│           │   ├── MA_MassActionBatchUtils.cls
│           │   ├── MA_MassActionBatchUtils.cls-meta.xml
│           │   ├── MA_MassActionBatchUtilsTest.cls
│           │   ├── MA_MassActionBatchUtilsTest.cls-meta.xml
│           │   ├── MA_MassActionConfigTriggerHandler.cls
│           │   ├── MA_MassActionConfigTriggerHandler.cls-meta.xml
│           │   ├── MA_MassActionConfigTriggerHandlerTest.cls
│           │   ├── MA_MassActionConfigTriggerHandlerTest.cls-meta.xml
│           │   ├── MA_MassActionConfigWrapper.cls
│           │   ├── MA_MassActionConfigWrapper.cls-meta.xml
│           │   ├── MA_MassActionLogTriggerHandler.cls
│           │   ├── MA_MassActionLogTriggerHandler.cls-meta.xml
│           │   ├── MA_MassActionLogTriggerHandlerTest.cls
│           │   ├── MA_MassActionLogTriggerHandlerTest.cls-meta.xml
│           │   ├── MA_MassActionSchedulable.cls
│           │   ├── MA_MassActionSchedulable.cls-meta.xml
│           │   ├── MA_MassActionSchedulableTest.cls
│           │   ├── MA_MassActionSchedulableTest.cls-meta.xml
│           │   ├── MA_MassActionScheduleUtils.cls
│           │   ├── MA_MassActionScheduleUtils.cls-meta.xml
│           │   ├── MA_MassActionScheduleUtilsTest.cls
│           │   ├── MA_MassActionScheduleUtilsTest.cls-meta.xml
│           │   ├── MA_MassActionUtils.cls
│           │   ├── MA_MassActionUtils.cls-meta.xml
│           │   ├── MA_MetadataDeployCallback.cls
│           │   ├── MA_MetadataDeployCallback.cls-meta.xml
│           │   ├── MA_MetadataDeployCallbackTest.cls
│           │   ├── MA_MetadataDeployCallbackTest.cls-meta.xml
│           │   ├── MA_NamespaceUtils.cls
│           │   ├── MA_NamespaceUtils.cls-meta.xml
│           │   ├── MA_ReportService.cls
│           │   ├── MA_ReportService.cls-meta.xml
│           │   ├── MA_ReportServiceTest.cls
│           │   ├── MA_ReportServiceTest.cls-meta.xml
│           │   ├── MA_ReportSourceBatchable.cls
│           │   ├── MA_ReportSourceBatchable.cls-meta.xml
│           │   ├── MA_ReportSourceBatchableTest.cls
│           │   ├── MA_ReportSourceBatchableTest.cls-meta.xml
│           │   ├── MA_RunConfigCmpController.cls
│           │   ├── MA_RunConfigCmpController.cls-meta.xml
│           │   ├── MA_RunConfigCmpControllerTest.cls
│           │   ├── MA_RunConfigCmpControllerTest.cls-meta.xml
│           │   ├── MA_RunConfigInvocable.cls
│           │   ├── MA_RunConfigInvocable.cls-meta.xml
│           │   ├── MA_RunConfigInvocableTest.cls
│           │   ├── MA_RunConfigInvocableTest.cls-meta.xml
│           │   ├── MA_SetConfigUniqueNameBatchable.cls
│           │   ├── MA_SetConfigUniqueNameBatchable.cls-meta.xml
│           │   ├── MA_SetConfigUniqueNameBatchableTest.cls
│           │   ├── MA_SetConfigUniqueNameBatchableTest.cls-meta.xml
│           │   ├── MA_SetupAuthWizardPageController.cls
│           │   ├── MA_SetupAuthWizardPageController.cls-meta.xml
│           │   ├── MA_SetupAuthWizardPageControllerTest.cls
│           │   ├── MA_SetupAuthWizardPageControllerTest.cls-meta.xml
│           │   ├── MA_SoqlQueryExecuteResult.cls
│           │   ├── MA_SoqlQueryExecuteResult.cls-meta.xml
│           │   ├── MA_SoqlQueryExecuteResultTest.cls
│           │   ├── MA_SoqlQueryExecuteResultTest.cls-meta.xml
│           │   ├── MA_SoqlSourceBatchable.cls
│           │   ├── MA_SoqlSourceBatchable.cls-meta.xml
│           │   ├── MA_SoqlSourceBatchableTest.cls
│           │   ├── MA_SoqlSourceBatchableTest.cls-meta.xml
│           │   ├── MA_SoqlSourceIterable.cls
│           │   ├── MA_SoqlSourceIterable.cls-meta.xml
│           │   ├── MA_SoqlSourceIterableTest.cls
│           │   ├── MA_SoqlSourceIterableTest.cls-meta.xml
│           │   ├── MA_StringUtils.cls
│           │   ├── MA_StringUtils.cls-meta.xml
│           │   ├── MA_StringUtilsTest.cls
│           │   ├── MA_StringUtilsTest.cls-meta.xml
│           │   ├── MA_UpgradeMassActionLogsBatchable.cls
│           │   ├── MA_UpgradeMassActionLogsBatchable.cls-meta.xml
│           │   ├── MA_UpgradeMassActionLogsBatchableTest.cls
│           │   ├── MA_UpgradeMassActionLogsBatchableTest.cls-meta.xml
│           │   ├── MA_UpgradePageLayoutsService.cls
│           │   ├── MA_UpgradePageLayoutsService.cls-meta.xml
│           │   ├── MA_UpgradePageLayoutsServiceTest.cls
│           │   ├── MA_UpgradePageLayoutsServiceTest.cls-meta.xml
│           │   ├── MA_XMLUtils.cls
│           │   ├── MA_XMLUtils.cls-meta.xml
│           │   ├── MA_XMLUtilsTest.cls
│           │   └── MA_XMLUtilsTest.cls-meta.xml
│           ├── contentassets/
│           │   ├── maslogominimal.asset
│           │   └── maslogominimal.asset-meta.xml
│           ├── flexipages/
│           │   ├── Mass_Action_Configuration_Record_Page.flexipage-meta.xml
│           │   ├── Mass_Action_Configuration_Record_Page_One_Column.flexipage-meta.xml
│           │   └── Mass_Action_Log_Record_Page.flexipage-meta.xml
│           ├── flows/
│           │   ├── MAS_Batch_Apex_Error_Event.flow-meta.xml
│           │   ├── MAS_Mass_Action_Configuration.flow-meta.xml
│           │   └── MAS_Run_Mass_Action_Flow.flow-meta.xml
│           ├── layouts/
│           │   ├── Mass_Action_Configuration__c-Mass Action Configuration Layout.layout-meta.xml
│           │   ├── Mass_Action_Log__c-Mass Action Child Log Layout.layout-meta.xml
│           │   ├── Mass_Action_Log__c-Mass Action Log Layout.layout-meta.xml
│           │   ├── Mass_Action_Log__c-Mass Action Parent Log Layout.layout-meta.xml
│           │   └── Mass_Action_Mapping__c-Mass Action Mapping Layout.layout-meta.xml
│           ├── namedCredentials/
│           │   └── Mass_Action_Test_Named_Credential.namedCredential-meta.xml
│           ├── notificationtypes/
│           │   └── Mass_Action_Notification.notiftype-meta.xml
│           ├── objects/
│           │   ├── Mass_Action_Batch_Apex_Status_Event__e/
│           │   │   ├── Mass_Action_Batch_Apex_Status_Event__e.object-meta.xml
│           │   │   └── fields/
│           │   │       ├── Job_ID__c.field-meta.xml
│           │   │       ├── Job_Scope__c.field-meta.xml
│           │   │       ├── Long_Message__c.field-meta.xml
│           │   │       ├── Message_Type__c.field-meta.xml
│           │   │       ├── Message__c.field-meta.xml
│           │   │       ├── Phase__c.field-meta.xml
│           │   │       └── Timestamp__c.field-meta.xml
│           │   ├── Mass_Action_Configuration__c/
│           │   │   ├── Mass_Action_Configuration__c.object-meta.xml
│           │   │   ├── compactLayouts/
│           │   │   │   └── Default_Compact_Layout.compactLayout-meta.xml
│           │   │   ├── fields/
│           │   │   │   ├── Active__c.field-meta.xml
│           │   │   │   ├── Batch_Size__c.field-meta.xml
│           │   │   │   ├── Description__c.field-meta.xml
│           │   │   │   ├── DeveloperName__c.field-meta.xml
│           │   │   │   ├── Last_Run_Completed_Date__c.field-meta.xml
│           │   │   │   ├── Last_Run_Completed_With_Errors__c.field-meta.xml
│           │   │   │   ├── Named_Credential__c.field-meta.xml
│           │   │   │   ├── Schedule_Cron__c.field-meta.xml
│           │   │   │   ├── Schedule_DayOfMonth__c.field-meta.xml
│           │   │   │   ├── Schedule_DayOfWeek__c.field-meta.xml
│           │   │   │   ├── Schedule_Frequency__c.field-meta.xml
│           │   │   │   ├── Schedule_HourOfDay__c.field-meta.xml
│           │   │   │   ├── Schedule_MinuteOfHour__c.field-meta.xml
│           │   │   │   ├── Schedule_MonthOfYear__c.field-meta.xml
│           │   │   │   ├── Schedule_SecondOfMinute__c.field-meta.xml
│           │   │   │   ├── Source_Apex_Class__c.field-meta.xml
│           │   │   │   ├── Source_List_View_ID__c.field-meta.xml
│           │   │   │   ├── Source_Report_Column_Name__c.field-meta.xml
│           │   │   │   ├── Source_Report_ID__c.field-meta.xml
│           │   │   │   ├── Source_SOQL_Query__c.field-meta.xml
│           │   │   │   ├── Source_Type__c.field-meta.xml
│           │   │   │   ├── Target_Action_Name__c.field-meta.xml
│           │   │   │   ├── Target_Apex_Script__c.field-meta.xml
│           │   │   │   ├── Target_SObject_Type__c.field-meta.xml
│           │   │   │   └── Target_Type__c.field-meta.xml
│           │   │   └── listViews/
│           │   │       └── All.listView-meta.xml
│           │   ├── Mass_Action_Job_Change_Event__e/
│           │   │   ├── Mass_Action_Job_Change_Event__e.object-meta.xml
│           │   │   └── fields/
│           │   │       └── Payload__c.field-meta.xml
│           │   ├── Mass_Action_Log__c/
│           │   │   ├── Mass_Action_Log__c.object-meta.xml
│           │   │   ├── compactLayouts/
│           │   │   │   ├── Child_Log_Compact_Layout.compactLayout-meta.xml
│           │   │   │   ├── Default_Compact_Layout.compactLayout-meta.xml
│           │   │   │   └── Parent_Log_Compact_Layout.compactLayout-meta.xml
│           │   │   ├── fields/
│           │   │   │   ├── Batch_Success_Percentage__c.field-meta.xml
│           │   │   │   ├── Batch_Success_Rate__c.field-meta.xml
│           │   │   │   ├── Failed_Batches__c.field-meta.xml
│           │   │   │   ├── Job_ID__c.field-meta.xml
│           │   │   │   ├── Job_Scope__c.field-meta.xml
│           │   │   │   ├── Long_Message__c.field-meta.xml
│           │   │   │   ├── Mass_Action_Configuration__c.field-meta.xml
│           │   │   │   ├── Message_Type__c.field-meta.xml
│           │   │   │   ├── Message__c.field-meta.xml
│           │   │   │   ├── Parent_Log_Configuration__c.field-meta.xml
│           │   │   │   ├── Parent_Log__c.field-meta.xml
│           │   │   │   ├── Processed_Batches__c.field-meta.xml
│           │   │   │   ├── Submitted_Date__c.field-meta.xml
│           │   │   │   ├── Timestamp__c.field-meta.xml
│           │   │   │   └── Total_Batches__c.field-meta.xml
│           │   │   ├── listViews/
│           │   │   │   ├── All.listView-meta.xml
│           │   │   │   └── All_Parent_Logs.listView-meta.xml
│           │   │   └── recordTypes/
│           │   │       ├── Child_Log.recordType-meta.xml
│           │   │       └── Parent_Log.recordType-meta.xml
│           │   └── Mass_Action_Mapping__c/
│           │       ├── Mass_Action_Mapping__c.object-meta.xml
│           │       ├── compactLayouts/
│           │       │   └── Default_Compact_Layout.compactLayout-meta.xml
│           │       └── fields/
│           │           ├── Mass_Action_Configuration__c.field-meta.xml
│           │           ├── Source_Field_Name__c.field-meta.xml
│           │           └── Target_Field_Name__c.field-meta.xml
│           ├── pages/
│           │   ├── LC_APIPage.page
│           │   ├── LC_APIPage.page-meta.xml
│           │   ├── LC_VisualforceDomainPage.page
│           │   ├── LC_VisualforceDomainPage.page-meta.xml
│           │   ├── MA_SetupAuthWizardPage.page
│           │   └── MA_SetupAuthWizardPage.page-meta.xml
│           ├── permissionsets/
│           │   └── Mass_Action_Admin.permissionset-meta.xml
│           ├── quickActions/
│           │   ├── Mass_Action_Configuration__c.Quick_Edit.quickAction-meta.xml
│           │   ├── Mass_Action_Configuration__c.Run.quickAction-meta.xml
│           │   └── Mass_Action_Configuration__c.Run_via_Flow.quickAction-meta.xml
│           ├── reports/
│           │   ├── Mass_Action_Test_Reports/
│           │   │   └── MA_Test_Account_Report.report-meta.xml
│           │   └── Mass_Action_Test_Reports.reportFolder-meta.xml
│           ├── staticresources/
│           │   ├── MA_SalesforceSecurityLogo.resource-meta.xml
│           │   ├── jquery.js
│           │   ├── jquery.resource-meta.xml
│           │   ├── jsforce.js
│           │   ├── jsforce.resource-meta.xml
│           │   ├── penpal.js
│           │   └── penpal.resource-meta.xml
│           ├── tabs/
│           │   ├── MA_SetupAuthWizardPageTab.tab-meta.xml
│           │   ├── Mass_Action_Configuration__c.tab-meta.xml
│           │   └── Mass_Action_Log__c.tab-meta.xml
│           ├── testSuites/
│           │   └── Mass_Action_Scheduler_Test_Suite.testSuite-meta.xml
│           └── triggers/
│               ├── MA_BatchApexStatusEventTrigger.trigger
│               ├── MA_BatchApexStatusEventTrigger.trigger-meta.xml
│               ├── MA_JobChangeEventTrigger.trigger
│               ├── MA_JobChangeEventTrigger.trigger-meta.xml
│               ├── MA_MassActionConfigTrigger.trigger
│               ├── MA_MassActionConfigTrigger.trigger-meta.xml
│               ├── MA_MassActionLogTrigger.trigger
│               └── MA_MassActionLogTrigger.trigger-meta.xml
├── licenses/
│   ├── appiphony.txt
│   ├── jquery.txt
│   ├── jsforce.txt
│   ├── penpal.txt
│   ├── sfdc-lax.txt
│   └── soql-parser.txt
├── manifest/
│   └── package.xml
├── scripts/
│   ├── create-scratch-org.sh
│   └── recreate-manifest.sh
└── sfdx-project.json
Download .txt
SYMBOL INDEX (613 symbols across 4 files)

FILE: force-app/main/default/aura/lax/laxHelper.js
  function actionRouter (line 111) | function actionRouter(resolve, reject, finallyCallback) {
  function createComponentActionRouter (line 159) | function createComponentActionRouter(resolve, reject) {
  function ldsActionRouter (line 215) | function ldsActionRouter(resolve, reject) {
  function getNewRecordCallback (line 508) | function getNewRecordCallback () {
  function ApexActionError (line 897) | function ApexActionError(message, entries, action) {
  function IncompleteActionError (line 907) | function IncompleteActionError(message, entries, action) {
  function LdsActionError (line 916) | function LdsActionError(message, entries, action) {
  function CreateComponentError (line 925) | function CreateComponentError(message, entries, action) {

FILE: force-app/main/default/staticresources/jquery.js
  function m (line 2) | function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n...
  function x (line 2) | function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof...
  function C (line 2) | function C(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!y(e...
  function oe (line 2) | function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeTy...
  function ae (line 2) | function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLengt...
  function se (line 2) | function se(e){return e[b]=!0,e}
  function ue (line 2) | function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(...
  function le (line 2) | function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[...
  function ce (line 2) | function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourc...
  function fe (line 2) | function fe(e){return function(t){return"input"===t.nodeName.toLowerCase...
  function pe (line 2) | function pe(e){return function(t){var n=t.nodeName.toLowerCase();return(...
  function de (line 2) | function de(e){return function(t){return"form"in t?t.parentNode&&!1===t....
  function he (line 2) | function he(e){return se(function(t){return t=+t,se(function(n,r){var i,...
  function ge (line 2) | function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}
  function ye (line 2) | function ye(){}
  function ve (line 2) | function ve(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}
  function me (line 2) | function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&"parentNode"===o,s=C...
  function xe (line 2) | function xe(e){return e.length>1?function(t,n,r){var i=e.length;while(i-...
  function be (line 2) | function be(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}
  function we (line 2) | function we(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(...
  function Te (line 2) | function Te(e,t,n,r,i,o){return r&&!r[b]&&(r=Te(r)),i&&!i[b]&&(i=Te(i,o)...
  function Ce (line 2) | function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.r...
  function Ee (line 2) | function Ee(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,s,u,c){var...
  function N (line 2) | function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerC...
  function j (line 2) | function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,...
  function P (line 2) | function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}
  function R (line 2) | function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!...
  function I (line 2) | function I(e){return e}
  function W (line 2) | function W(e){throw e}
  function $ (line 2) | function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n...
  function a (line 2) | function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(...
  function _ (line 2) | function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventLi...
  function V (line 2) | function V(e,t){return t.toUpperCase()}
  function G (line 2) | function G(e){return e.replace(X,"ms-").replace(U,V)}
  function Q (line 2) | function Q(){this.expando=w.expando+Q.uid++}
  function te (line 2) | function te(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""...
  function ne (line 2) | function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.re...
  function ue (line 2) | function ue(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:functio...
  function ce (line 2) | function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t...
  function fe (line 2) | function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&...
  function ye (line 2) | function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagNa...
  function ve (line 2) | function ve(e,t){for(var n=0,r=e.length;n<r;n++)J.set(e[n],"globalEval",...
  function xe (line 2) | function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),...
  function Ee (line 2) | function Ee(){return!0}
  function ke (line 2) | function ke(){return!1}
  function Se (line 2) | function Se(){try{return r.activeElement}catch(e){}}
  function De (line 2) | function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof...
  function Le (line 2) | function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"...
  function He (line 2) | function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}
  function Oe (line 2) | function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.sli...
  function Pe (line 2) | function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&...
  function Me (line 2) | function Me(e,t){var n=t.nodeName.toLowerCase();"input"===n&&pe.test(e.t...
  function Re (line 2) | function Re(e,t,n,r){t=a.apply([],t);var i,o,s,u,l,c,f=0,p=e.length,d=p-...
  function Ie (line 2) | function Ie(e,t,n){for(var r,i=t?w.filter(t,e):e,o=0;null!=(r=i[o]);o++)...
  function t (line 2) | function t(){if(c){l.style.cssText="position:absolute;left:-11111px;widt...
  function n (line 2) | function n(e){return Math.round(parseFloat(e))}
  function Fe (line 2) | function Fe(e,t,n){var r,i,o,a,s=e.style;return(n=n||$e(e))&&(""!==(a=n....
  function _e (line 2) | function _e(e,t){return{get:function(){if(!e())return(this.get=t).apply(...
  function Qe (line 2) | function Qe(e){if(e in Ye)return e;var t=e[0].toUpperCase()+e.slice(1),n...
  function Je (line 2) | function Je(e){var t=w.cssProps[e];return t||(t=w.cssProps[e]=Qe(e)||e),t}
  function Ke (line 2) | function Ke(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[...
  function Ze (line 2) | function Ze(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border...
  function et (line 2) | function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"box...
  function tt (line 2) | function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}
  function at (line 2) | function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnima...
  function st (line 2) | function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}
  function ut (line 2) | function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin...
  function lt (line 2) | function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["...
  function ct (line 2) | function ct(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=thi...
  function ft (line 2) | function ft(e,t){var n,r,i,o,a;for(n in e)if(r=G(n),i=t[r],o=e[n],Array....
  function pt (line 2) | function pt(e,t,n){var r,i,o=0,a=pt.prefilters.length,s=w.Deferred().alw...
  function vt (line 2) | function vt(e){return(e.match(M)||[]).join(" ")}
  function mt (line 2) | function mt(e){return e.getAttribute&&e.getAttribute("class")||""}
  function xt (line 2) | function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||...
  function jt (line 2) | function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n|...
  function Ft (line 2) | function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var ...
  function _t (line 2) | function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!...
  function zt (line 2) | function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)voi...
  function Xt (line 2) | function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[...
  function Ut (line 2) | function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])fo...
  function k (line 2) | function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=vo...

FILE: force-app/main/default/staticresources/jsforce.js
  function t (line 1) | function t(e,n,r){function i(s,a){if(!n[s]){if(!e[s]){var u="function"==...
  function i (line 1) | function i(t){var e=l.clone(t);return e.success="true"===e.success,e}
  function o (line 1) | function o(t){var e=i(t);return e.created="true"===e.created,e}
  function s (line 1) | function s(t){var e=l.clone(t);return delete e.$,e}
  function r (line 2) | function r(t){var e={};return t.split(/\n/).forEach(function(t){var n=t....
  function s (line 2) | function s(i){var s={client:t.client,method:e.method,data:i};if(e.header...
  function r (line 2) | function r(t,e,n){var r=screen.width/2-e/2,i=screen.height/2-n/2;return ...
  function i (line 2) | function i(){var t=o(),e=localStorage.getItem("jsforce_state");if(t&&e&&...
  function o (line 2) | function o(){var t;if(window.location.hash){if(t=u.parse(window.location...
  function r (line 2) | function r(t){var e=(t.getAllResponseHeaders()||"").split(/[\r\n]+/);ret...
  function r (line 2) | function r(t,e){return e=Array.prototype.slice.apply(e),t+"("+s.map(e,fu...
  function r (line 2) | function r(t,e){t.oauth2.refreshToken(t.refreshToken,function(n,r){if(n)...
  function i (line 2) | function i(t){if(h.isString(t)){if("{"===t[0])return JSON.parse(t);var e...
  function o (line 2) | function o(t){function e(t){return t<10?"0"+t:t}return t.getUTCFullYear(...
  function s (line 2) | function s(t){var e=t.split("/"),n=e.pop(),r=e.pop();return{id:n,organiz...
  function a (line 2) | function a(t,e){return function(n,r){n.login(t,e,function(t){return t?r(...
  function u (line 2) | function u(t){return t&&String(t).replace(/&/g,"&amp;").replace(/</g,"&l...
  function r (line 3) | function r(t,e){return e=a.extend({},e,{columns:!0}),c(t,e)}
  function i (line 3) | function i(t,e){return e=a.extend({},e,{header:!0}),h(t,e)}
  function o (line 3) | function o(t){return t=a.extend({},t,{columns:!0}),u(t)}
  function s (line 3) | function s(t){return t=a.extend({},t,{header:!0}),l(t)}
  function r (line 3) | function r(t){return(t<10?"0":"")+t}
  function i (line 3) | function i(t){return function(e){return new s(t+":"+e)}}
  function r (line 3) | function r(t){return JSON.parse(t)}
  function i (line 3) | function i(e){var n={};if(t("xml2js").parseString(e,{explicitArray:!1},f...
  function o (line 3) | function o(e){return t("./csv").parseCSV(e)}
  function s (line 3) | function s(t){return t}
  function r (line 3) | function r(t){return function(e){this.log(t,e)}}
  function t (line 3) | function t(t){var n=r._parent._config.table;return i.debug('finding tabl...
  function e (line 3) | function e(t){i.debug("describe cache: "+t);var e=s.defer();return a.des...
  function n (line 3) | function n(t,r){i.debug('expanding field "'+r+'" in "'+t+'"...');var a=r...
  function r (line 3) | function r(t,e){return Object.keys(t).reduce(function(t,n){var i=t[n],o=...
  function i (line 3) | function i(t,e){var n=new a;return n.on("pipe",function(r){r.unpipe(n),r...
  function n (line 3) | function n(t,e){if(c.isString(t)){var n=/^\$\{(\w+)\}$/.exec(t);return n...
  function r (line 3) | function r(t,e){if(a.isArray(t))return t.map(function(t){return r(t,e&&e...
  function i (line 3) | function i(t,e){var n=e.shift();if(n){for(var r in t)if(n.test(r))return...
  function o (line 3) | function o(t,e){if(a.isObject(t)&&(e=t,t=null),a.isArray(e))return a.map...
  function r (line 4) | function r(t){var e=["SELECT ",i(t.fields,t.includes)," FROM ",t.table]....
  function i (line 4) | function i(t,e){return e=h.map(h.values(e||{}),function(t){return"("+r(t...
  function o (line 4) | function o(t,e,n){if(h.isString(t))return t;t=t||[],e=e||"AND",n=n||0,t=...
  function s (line 4) | function s(t,e){var n="$eq";if(h.isArray(e))n="$in";else if(h.isObject(e...
  function a (line 4) | function a(t){return c(t)?t.length>0?"("+t.map(a).join(", ")+")":void 0:...
  function u (line 4) | function u(t){return String(t||"").replace(/'/g,"\\'")}
  function c (line 4) | function c(t){return h.isObject(t)&&h.isFunction(t.pop)}
  function l (line 4) | function l(t){if(t=t||[],h.isString(t)){if(/,|\s+(asc|desc)\s*$/.test(t)...
  function r (line 4) | function r(t,e){var n=t.then;return t.then=function(){e();var i=n.apply(...
  function i (line 4) | function i(t){var e=/(\w+)\.(visual\.force|salesforce)\.com$/.exec(t);re...
  function r (line 4) | function r(){if(u.length)throw u.shift()}
  function i (line 4) | function i(t){var e;e=a.length?a.pop():new o,e.task=t,s(e)}
  function o (line 4) | function o(){this.task=null}
  function n (line 4) | function n(t){a.length||(s(),u=!0),a[a.length]=t}
  function r (line 4) | function r(){for(;c<a.length;){var t=c;if(c+=1,a[t].call(),c>l){for(var ...
  function i (line 4) | function i(t){var e=1,n=new p(t),r=document.createTextNode("");return n....
  function o (line 4) | function o(t){return function(){function e(){clearTimeout(n),clearInterv...
  function r (line 4) | function r(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. L...
  function i (line 4) | function i(t){var e=r(t),n=e[0],i=e[1];return 3*(n+i)/4-i}
  function o (line 4) | function o(t,e,n){return 3*(e+n)/4-n}
  function s (line 4) | function s(t){for(var e,n=r(t),i=n[0],s=n[1],a=new p(o(t,i,s)),u=0,c=s>0...
  function a (line 4) | function a(t){return l[t>>18&63]+l[t>>12&63]+l[t>>6&63]+l[63&t]}
  function u (line 4) | function u(t,e,n){for(var r,i=[],o=e;o<n;o+=3)r=(t[o]<<16&16711680)+(t[o...
  function c (line 4) | function c(t){for(var e,n=t.length,r=n%3,i=[],o=16383,s=0,a=n-r;s<a;s+=o...
  function r (line 4) | function r(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:U...
  function i (line 4) | function i(t){if(t>Q)throw new RangeError("Invalid typed array length");...
  function o (line 4) | function o(t,e,n){if("number"==typeof t){if("string"==typeof e)throw new...
  function s (line 4) | function s(t,e,n){if("number"==typeof t)throw new TypeError('"value" arg...
  function a (line 4) | function a(t){if("number"!=typeof t)throw new TypeError('"size" argument...
  function u (line 4) | function u(t,e,n){return a(t),t<=0?i(t):void 0!==e?"string"==typeof n?i(...
  function c (line 4) | function c(t){return a(t),i(t<0?0:0|d(t))}
  function l (line 4) | function l(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!o.isEncoding(...
  function h (line 4) | function h(t){for(var e=t.length<0?0:0|d(t.length),n=i(e),r=0;r<e;r+=1)n...
  function p (line 4) | function p(t,e,n){if(e<0||t.byteLength<e)throw new RangeError('"offset" ...
  function f (line 4) | function f(t){if(o.isBuffer(t)){var e=0|d(t.length),n=i(e);return 0===n....
  function d (line 4) | function d(t){if(t>=Q)throw new RangeError("Attempt to allocate Buffer l...
  function y (line 4) | function y(t){return+t!=t&&(t=0),o.alloc(+t)}
  function m (line 4) | function m(t,e){if(o.isBuffer(t))return t.length;if(ArrayBuffer.isView(t...
  function _ (line 4) | function _(t,e,n){var r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)ret...
  function g (line 4) | function g(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}
  function v (line 4) | function v(t,e,n,r,i){if(0===t.length)return-1;if("string"==typeof n?(r=...
  function b (line 4) | function b(t,e,n,r,i){function o(t,e){return 1===s?t[e]:t.readUInt16BE(e...
  function w (line 4) | function w(t,e,n,r){n=Number(n)||0;var i=t.length-n;r?(r=Number(r),r>i&&...
  function E (line 4) | function E(t,e,n,r){return V(B(e,t.length-n),t,n,r)}
  function T (line 4) | function T(t,e,n,r){return V(X(e),t,n,r)}
  function x (line 4) | function x(t,e,n,r){return T(t,e,n,r)}
  function S (line 4) | function S(t,e,n,r){return V(H(e),t,n,r)}
  function C (line 4) | function C(t,e,n,r){return V(z(e,t.length-n),t,n,r)}
  function I (line 4) | function I(t,e,n){return 0===e&&n===t.length?$.fromByteArray(t):$.fromBy...
  function N (line 4) | function N(t,e,n){n=Math.min(t.length,n);for(var r=[],i=e;i<n;){var o=t[...
  function O (line 4) | function O(t){var e=t.length;if(e<=J)return String.fromCharCode.apply(St...
  function A (line 4) | function A(t,e,n){var r="";n=Math.min(t.length,n);for(var i=e;i<n;++i)r+...
  function D (line 4) | function D(t,e,n){var r="";n=Math.min(t.length,n);for(var i=e;i<n;++i)r+...
  function j (line 4) | function j(t,e,n){var r=t.length;(!e||e<0)&&(e=0),(!n||n<0||n>r)&&(n=r);...
  function k (line 4) | function k(t,e,n){for(var r=t.slice(e,n),i="",o=0;o<r.length;o+=2)i+=Str...
  function L (line 4) | function L(t,e,n){if(t%1!==0||t<0)throw new RangeError("offset is not ui...
  function R (line 4) | function R(t,e,n,r,i,s){if(!o.isBuffer(t))throw new TypeError('"buffer" ...
  function M (line 4) | function M(t,e,n,r,i,o){if(n+r>t.length)throw new RangeError("Index out ...
  function U (line 4) | function U(t,e,n,r,i){return e=+e,n>>>=0,i||M(t,e,n,4,3.4028234663852886...
  function q (line 4) | function q(t,e,n,r,i){return e=+e,n>>>=0,i||M(t,e,n,8,1.7976931348623157...
  function P (line 4) | function P(t){if(t=t.split("=")[0],t=t.trim().replace(K,""),t.length<2)r...
  function F (line 4) | function F(t){return t<16?"0"+t.toString(16):t.toString(16)}
  function B (line 4) | function B(t,e){e=e||1/0;for(var n,r=t.length,i=null,o=[],s=0;s<r;++s){i...
  function X (line 4) | function X(t){for(var e=[],n=0;n<t.length;++n)e.push(255&t.charCodeAt(n)...
  function z (line 4) | function z(t,e){for(var n,r,i,o=[],s=0;s<t.length&&!((e-=2)<0);++s)n=t.c...
  function H (line 4) | function H(t){return $.toByteArray(P(t))}
  function V (line 4) | function V(t,e,n,r){for(var i=0;i<r&&!(i+n>=e.length||i>=t.length);++i)e...
  function W (line 4) | function W(t){return t instanceof ArrayBuffer||null!=t&&null!=t.construc...
  function G (line 4) | function G(t){return t!==t}
  function e (line 4) | function e(t){return Array.isArray?Array.isArray(t):"[object Array]"===m...
  function r (line 4) | function r(t){return"boolean"==typeof t}
  function i (line 4) | function i(t){return null===t}
  function o (line 4) | function o(t){return null==t}
  function s (line 4) | function s(t){return"number"==typeof t}
  function a (line 4) | function a(t){return"string"==typeof t}
  function u (line 4) | function u(t){return"symbol"==typeof t}
  function c (line 4) | function c(t){return void 0===t}
  function l (line 4) | function l(t){return"[object RegExp]"===m(t)}
  function h (line 4) | function h(t){return"object"==typeof t&&null!==t}
  function p (line 4) | function p(t){return"[object Date]"===m(t)}
  function f (line 4) | function f(t){return"[object Error]"===m(t)||t instanceof Error}
  function d (line 4) | function d(t){return"function"==typeof t}
  function y (line 4) | function y(t){return null===t||"boolean"==typeof t||"number"==typeof t||...
  function m (line 4) | function m(t){return Object.prototype.toString.call(t)}
  function r (line 5) | function r(){this._events&&Object.prototype.hasOwnProperty.call(this,"_e...
  function i (line 5) | function i(t){return void 0===t._maxListeners?r.defaultMaxListeners:t._m...
  function o (line 5) | function o(t,e,n){if(e)t.call(n);else for(var r=t.length,i=m(t,r),o=0;o<...
  function s (line 5) | function s(t,e,n,r){if(e)t.call(n,r);else for(var i=t.length,o=m(t,i),s=...
  function a (line 5) | function a(t,e,n,r,i){if(e)t.call(n,r,i);else for(var o=t.length,s=m(t,o...
  function u (line 5) | function u(t,e,n,r,i,o){if(e)t.call(n,r,i,o);else for(var s=t.length,a=m...
  function c (line 5) | function c(t,e,n,r){if(e)t.apply(n,r);else for(var i=t.length,o=m(t,i),s...
  function l (line 5) | function l(t,e,n,r){var o,s,a;if("function"!=typeof n)throw new TypeErro...
  function h (line 5) | function h(){if(!this.fired)switch(this.target.removeListener(this.type,...
  function p (line 5) | function p(t,e,n){var r={fired:!1,wrapFn:void 0,target:t,type:e,listener...
  function f (line 5) | function f(t,e,n){var r=t._events;if(!r)return[];var i=r[e];return i?"fu...
  function d (line 5) | function d(t){var e=this._events;if(e){var n=e[t];if("function"==typeof ...
  function y (line 5) | function y(t,e){for(var n=e,r=n+1,i=t.length;r<i;n+=1,r+=1)t[n]=t[r];t.p...
  function m (line 5) | function m(t,e){for(var n=new Array(e),r=0;r<e;++r)n[r]=t[r];return n}
  function _ (line 5) | function _(t){for(var e=new Array(t.length),n=0;n<e.length;++n)e[n]=t[n]...
  function g (line 5) | function g(t){var e=function(){};return e.prototype=t,new e}
  function v (line 5) | function v(t){var e=[];for(var n in t)Object.prototype.hasOwnProperty.ca...
  function b (line 5) | function b(t){var e=this;return function(){return e.apply(t,arguments)}}
  function r (line 6) | function r(t,e){if(t.indexOf)return t.indexOf(e);for(var n=0;n<t.length;...
  function i (line 6) | function i(){}
  function r (line 6) | function r(t){return!!t.constructor&&"function"==typeof t.constructor.is...
  function i (line 6) | function i(t){return"function"==typeof t.readFloatLE&&"function"==typeof...
  function n (line 6) | function n(t,e){return null==t?void 0:t[e]}
  function r (line 6) | function r(t){var e=!1;if(null!=t&&"function"!=typeof t.toString)try{e=!...
  function i (line 6) | function i(t){var e=-1,n=t?t.length:0;for(this.clear();++e<n;){var r=t[e...
  function o (line 6) | function o(){this.__data__=mt?mt(null):{}}
  function s (line 6) | function s(t){return this.has(t)&&delete this.__data__[t]}
  function a (line 6) | function a(t){var e=this.__data__;if(mt){var n=e[t];return n===z?void 0:...
  function u (line 6) | function u(t){var e=this.__data__;return mt?void 0!==e[t]:lt.call(e,t)}
  function c (line 6) | function c(t,e){var n=this.__data__;return n[t]=mt&&void 0===e?z:e,this}
  function l (line 6) | function l(t){var e=-1,n=t?t.length:0;for(this.clear();++e<n;){var r=t[e...
  function h (line 6) | function h(){this.__data__=[]}
  function p (line 6) | function p(t){var e=this.__data__,n=E(e,t);if(n<0)return!1;var r=e.lengt...
  function f (line 6) | function f(t){var e=this.__data__,n=E(e,t);return n<0?void 0:e[n][1]}
  function d (line 6) | function d(t){return E(this.__data__,t)>-1}
  function y (line 6) | function y(t,e){var n=this.__data__,r=E(n,t);return r<0?n.push([t,e]):n[...
  function m (line 6) | function m(t){var e=-1,n=t?t.length:0;for(this.clear();++e<n;){var r=t[e...
  function _ (line 6) | function _(){this.__data__={hash:new i,map:new(yt||l),string:new i}}
  function g (line 6) | function g(t){return I(this,t)["delete"](t)}
  function v (line 6) | function v(t){return I(this,t).get(t)}
  function b (line 6) | function b(t){return I(this,t).has(t)}
  function w (line 6) | function w(t,e){
  function E (line 7) | function E(t,e){for(var n=t.length;n--;)if(R(t[n][0],e))return n;return-1}
  function T (line 7) | function T(t,e){e=O(e,t)?[e]:C(e);for(var n=0,r=e.length;null!=t&&n<r;)t...
  function x (line 7) | function x(t){if(!U(t)||D(t))return!1;var e=M(t)||r(t)?pt:tt;return e.te...
  function S (line 7) | function S(t){if("string"==typeof t)return t;if(P(t))return gt?gt.call(t...
  function C (line 7) | function C(t){return bt(t)?t:vt(t)}
  function I (line 7) | function I(t,e){var n=t.__data__;return A(e)?n["string"==typeof e?"strin...
  function N (line 7) | function N(t,e){var r=n(t,e);return x(r)?r:void 0}
  function O (line 7) | function O(t,e){if(bt(t))return!1;var n=typeof t;return!("number"!=n&&"s...
  function A (line 7) | function A(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e...
  function D (line 7) | function D(t){return!!ut&&ut in t}
  function j (line 7) | function j(t){if("string"==typeof t||P(t))return t;var e=t+"";return"0"=...
  function k (line 7) | function k(t){if(null!=t){try{return ct.call(t)}catch(e){}try{return t+"...
  function L (line 7) | function L(t,e){if("function"!=typeof t||e&&"function"!=typeof e)throw n...
  function R (line 7) | function R(t,e){return t===e||t!==t&&e!==e}
  function M (line 7) | function M(t){var e=U(t)?ht.call(t):"";return e==V||e==W}
  function U (line 7) | function U(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}
  function q (line 7) | function q(t){return!!t&&"object"==typeof t}
  function P (line 7) | function P(t){return"symbol"==typeof t||q(t)&&ht.call(t)==G}
  function F (line 7) | function F(t){return null==t?"":S(t)}
  function B (line 7) | function B(t,e,n){var r=null==t?void 0:T(t,e);return void 0===r?n:r}
  function i (line 7) | function i(t,e){return t.push.apply(t,e),t}
  function o (line 7) | function o(t,e,n,r){for(var i=t.length,o=n+(r?1:-1);r?o--:++o<i;)if(e(t[...
  function s (line 7) | function s(t){return function(e){return null==e?re:e[t]}}
  function a (line 7) | function a(t){return function(e){return null==t?re:t[e]}}
  function u (line 7) | function u(t,e,n,r,i){return i(t,function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)...
  function c (line 7) | function c(t,e){return A(e,function(e){return t[e]})}
  function l (line 7) | function l(t,e){return function(n){return t(e(n))}}
  function h (line 7) | function h(t){return t instanceof p?t:new p(t)}
  function p (line 7) | function p(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e}
  function f (line 7) | function f(t,e,n){var r=t[e];Ue.call(t,e)&&It(r,n)&&(n!==re||e in t)||d(...
  function d (line 7) | function d(t,e,n){t[e]=n}
  function y (line 7) | function y(t,e,n){if("function"!=typeof t)throw new TypeError(oe);return...
  function m (line 7) | function m(t,e){var n=!0;return Ge(t,function(t,r,i){return n=!!e(t,r,i)...
  function _ (line 7) | function _(t,e,n){for(var r=-1,i=t.length;++r<i;){var o=t[r],s=e(o);if(n...
  function g (line 7) | function g(t,e){var n=[];return Ge(t,function(t,r,i){e(t,r,i)&&n.push(t)...
  function v (line 7) | function v(t,e,n,r,o){var s=-1,a=t.length;for(n||(n=Q),o||(o=[]);++s<a;)...
  function b (line 7) | function b(t,e){return t&&$e(t,e,hn)}
  function w (line 7) | function w(t,e){return g(e,function(e){return kt(t[e])})}
  function E (line 7) | function E(t){return tt(t)}
  function T (line 7) | function T(t,e){return t>e}
  function x (line 7) | function x(t){return Mt(t)&&E(t)==me}
  function S (line 7) | function S(t,e,n,r,i){return t===e||(null==t||null==e||!Mt(t)&&!Mt(e)?t!...
  function C (line 7) | function C(t,e,n,r,i,o){var s=nn(t),a=nn(e),u=s?fe:E(t),c=a?fe:E(e);u=u=...
  function I (line 7) | function I(t){return Mt(t)&&E(t)==Te}
  function N (line 7) | function N(t){return"function"==typeof t?t:null==t?Yt:("object"==typeof ...
  function O (line 7) | function O(t,e){return t<e}
  function A (line 7) | function A(t,e){var n=-1,r=Nt(t)?Array(t.length):[];return Ge(t,function...
  function D (line 7) | function D(t){var e=He(t);return function(n){var r=e.length;if(null==n)r...
  function j (line 7) | function j(t,e){return t=Object(t),vt(e,function(e,n){return n in t&&(e[...
  function k (line 7) | function k(t,e){return Qe(et(t,e,Yt),t+"")}
  function L (line 7) | function L(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),n=n>i?i:n,n<0&...
  function R (line 7) | function R(t){return L(t,0,t.length)}
  function M (line 7) | function M(t,e){var n;return Ge(t,function(t,r,i){return n=e(t,r,i),!n})...
  function U (line 7) | function U(t,e){var n=t;return vt(e,function(t,e){return e.func.apply(e....
  function q (line 7) | function q(t,e){if(t!==e){var n=t!==re,r=null===t,i=t===t,o=!1,s=e!==re,...
  function P (line 7) | function P(t,e,n,r){var i=!n;n||(n={});for(var o=-1,s=e.length;++o<s;){v...
  function F (line 7) | function F(t){return k(function(e,n){var r=-1,i=n.length,o=i>1?n[i-1]:re...
  function B (line 7) | function B(t,e){return function(n,r){if(null==n)return n;if(!Nt(n))retur...
  function X (line 7) | function X(t){return function(e,n,r){for(var i=-1,o=Object(e),s=r(e),a=s...
  function z (line 7) | function z(t){return function(){var e=arguments,n=We(t.prototype),r=t.ap...
  function H (line 7) | function H(t){return function(e,n,r){var i=Object(e);if(!Nt(e)){var o=N(...
  function V (line 7) | function V(t,e,n,r){function i(){for(var e=-1,a=arguments.length,u=-1,c=...
  function W (line 7) | function W(t,e,n,r,i,o){var s=n&se,a=t.length,u=e.length;if(a!=u&&!(s&&u...
  function G (line 7) | function G(t,e,n,r,i,o,s){switch(n){case ye:case me:case be:return It(+t...
  function $ (line 7) | function $(t,e,n,r,i,o){var s=n&se,a=hn(t),u=a.length,c=hn(e),l=c.length...
  function Y (line 7) | function Y(t){return Qe(et(t,re,ot),t+"")}
  function Q (line 7) | function Q(t){return nn(t)||en(t)}
  function J (line 7) | function J(t,e){var n=typeof t;return e=null==e?he:e,!!e&&("number"==n||...
  function K (line 7) | function K(t,e,n){if(!Rt(n))return!1;var r=typeof e;return!!("number"==r...
  function Z (line 7) | function Z(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);retur...
  function tt (line 7) | function tt(t){return Pe.call(t)}
  function et (line 7) | function et(t,e,n){return e=Ve(e===re?t.length-1:e,0),function(){for(var...
  function nt (line 7) | function nt(t){return g(t,Boolean)}
  function rt (line 7) | function rt(){var t=arguments.length;if(!t)return[];for(var e=Array(t-1)...
  function it (line 7) | function it(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n...
  function ot (line 7) | function ot(t){var e=null==t?0:t.length;return e?v(t,1):[]}
  function st (line 7) | function st(t){var e=null==t?0:t.length;return e?v(t,le):[]}
  function at (line 7) | function at(t){return t&&t.length?t[0]:re}
  function ut (line 7) | function ut(t,e,n){var r=null==t?0:t.length;n="number"==typeof n?n<0?Ve(...
  function ct (line 7) | function ct(t){var e=null==t?0:t.length;return e?t[e-1]:re}
  function lt (line 7) | function lt(t,e,n){var r=null==t?0:t.length;return e=null==e?0:+e,n=n===...
  function ht (line 7) | function ht(t){var e=h(t);return e.__chain__=!0,e}
  function pt (line 7) | function pt(t,e){return e(t),t}
  function ft (line 7) | function ft(t,e){return e(t)}
  function dt (line 7) | function dt(){return U(this.__wrapped__,this.__actions__)}
  function yt (line 7) | function yt(t,e,n){return e=n?re:e,m(t,N(e))}
  function mt (line 7) | function mt(t,e){return g(t,N(e))}
  function _t (line 7) | function _t(t,e){return Ge(t,N(e))}
  function gt (line 7) | function gt(t,e){return A(t,N(e))}
  function vt (line 7) | function vt(t,e,n){return u(t,N(e),n,arguments.length<3,Ge)}
  function bt (line 7) | function bt(t){return null==t?0:(t=Nt(t)?t:He(t),t.length)}
  function wt (line 7) | function wt(t,e,n){return e=n?re:e,M(t,N(e))}
  function Et (line 7) | function Et(t,e){var n=0;return e=N(e),A(A(t,function(t,r,i){return{valu...
  function Tt (line 7) | function Tt(t,e){var n;if("function"!=typeof e)throw new TypeError(oe);r...
  function xt (line 7) | function xt(t){if("function"!=typeof t)throw new TypeError(oe);return fu...
  function St (line 7) | function St(t){return Tt(2,t)}
  function Ct (line 7) | function Ct(t){return Rt(t)?nn(t)?R(t):P(t,He(t)):t}
  function It (line 7) | function It(t,e){return t===e||t!==t&&e!==e}
  function Nt (line 7) | function Nt(t){return null!=t&&Lt(t.length)&&!kt(t)}
  function Ot (line 7) | function Ot(t){return t===!0||t===!1||Mt(t)&&E(t)==ye}
  function At (line 7) | function At(t){return Nt(t)&&(nn(t)||Ft(t)||kt(t.splice)||en(t))?!t.leng...
  function Dt (line 7) | function Dt(t,e){return S(t,e)}
  function jt (line 7) | function jt(t){return"number"==typeof t&&ze(t)}
  function kt (line 7) | function kt(t){if(!Rt(t))return!1;var e=E(t);return e==ge||e==ve||e==de|...
  function Lt (line 7) | function Lt(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=he}
  function Rt (line 7) | function Rt(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}
  function Mt (line 7) | function Mt(t){return null!=t&&"object"==typeof t}
  function Ut (line 7) | function Ut(t){return Pt(t)&&t!=+t}
  function qt (line 7) | function qt(t){return null===t}
  function Pt (line 7) | function Pt(t){return"number"==typeof t||Mt(t)&&E(t)==be}
  function Ft (line 7) | function Ft(t){return"string"==typeof t||!nn(t)&&Mt(t)&&E(t)==xe}
  function Bt (line 7) | function Bt(t){return t===re}
  function Xt (line 7) | function Xt(t){return Nt(t)?t.length?R(t):[]:Gt(t)}
  function zt (line 7) | function zt(t){return"string"==typeof t?t:null==t?"":t+""}
  function Ht (line 7) | function Ht(t,e){var n=We(t);return null==e?n:un(n,e)}
  function Vt (line 7) | function Vt(t,e){return null!=t&&Ue.call(t,e)}
  function Wt (line 7) | function Wt(t,e,n){var r=null==t?re:t[e];return r===re&&(r=n),kt(r)?r.ca...
  function Gt (line 7) | function Gt(t){return null==t?[]:c(t,hn(t))}
  function $t (line 7) | function $t(t){return t=zt(t),t&&Ce.test(t)?t.replace(Se,Le):t}
  function Yt (line 7) | function Yt(t){return t}
  function Qt (line 7) | function Qt(t){return D(un({},t))}
  function Jt (line 7) | function Jt(t,e,n){var r=hn(e),o=w(e,r);null!=n||Rt(e)&&(o.length||!r.le...
  function Kt (line 7) | function Kt(){return De._===this&&(De._=Fe),this}
  function Zt (line 7) | function Zt(){}
  function te (line 7) | function te(t){var e=++qe;return zt(t)+e}
  function ee (line 7) | function ee(t){return t&&t.length?_(t,Yt,T):re}
  function ne (line 7) | function ne(t){return t&&t.length?_(t,Yt,O):re}
  function t (line 7) | function t(){}
  function r (line 7) | function r(t,e){var n=this;return n instanceof r?(u.Readable.call(n,e),n...
  function i (line 7) | function i(t){return s(t,{objectMode:!0,highWaterMark:16})}
  function o (line 7) | function o(t){return s(t)}
  function s (line 7) | function s(t,e){if(!t||"function"==typeof t||t._readableState)return t;v...
  function e (line 7) | function e(){i._forward()}
  function n (line 7) | function n(){t._readableState.ended||i.destroy()}
  function r (line 7) | function r(){i._current=null,t.removeListener("readable",e),t.removeList...
  function e (line 7) | function e(r){t.removeListener("error",e),n.destroy(r)}
  function n (line 7) | function n(e,n,r,i){if("function"!=typeof e)throw new TypeError('"callba...
  function r (line 7) | function r(){throw new Error("setTimeout has not been defined")}
  function i (line 7) | function i(){throw new Error("clearTimeout has not been defined")}
  function o (line 7) | function o(t){if(h===setTimeout)return setTimeout(t,0);if((h===r||!h)&&s...
  function s (line 7) | function s(t){if(p===clearTimeout)return clearTimeout(t);if((p===i||!p)&...
  function a (line 7) | function a(){m&&d&&(m=!1,d.length?y=d.concat(y):_=-1,y.length&&u())}
  function u (line 7) | function u(){if(!m){var t=o(a);m=!0;for(var e=y.length;e;){for(d=y,y=[];...
  function c (line 7) | function c(t,e){this.fun=t,this.array=e}
  function l (line 7) | function l(){}
  function r (line 7) | function r(){}
  function i (line 7) | function i(t){try{return t.then}catch(e){return _=e,g}}
  function o (line 7) | function o(t,e){try{return t(e)}catch(n){return _=n,g}}
  function s (line 7) | function s(t,e,n){try{t(e,n)}catch(r){return _=r,g}}
  function a (line 7) | function a(t){if("object"!=typeof this)throw new TypeError("Promises mus...
  function u (line 7) | function u(t,e,n){return new t.constructor(function(i,o){var s=new a(r);...
  function c (line 7) | function c(t,e){for(;3===t._65;)t=t._55;return a._37&&a._37(t),0===t._65...
  function l (line 7) | function l(t,e){m(function(){var n=1===t._65?e.onFulfilled:e.onRejected;...
  function h (line 7) | function h(t,e){if(e===t)return p(t,new TypeError("A promise cannot be r...
  function p (line 7) | function p(t,e){t._65=2,t._55=e,a._87&&a._87(t,e),f(t)}
  function f (line 7) | function f(t){if(1===t._40&&(c(t,t._72),t._72=null),2===t._40){for(var e...
  function d (line 7) | function d(t,e,n){this.onFulfilled="function"==typeof t?t:null,this.onRe...
  function y (line 7) | function y(t,e){var n=!1,r=s(t,function(t){n||(n=!0,h(e,t))},function(t)...
  function r (line 7) | function r(t){var e=new i(i._61);return e._65=1,e._55=t,e}
  function r (line 7) | function r(s,a){if(a&&("object"==typeof a||"function"==typeof a)){if(a i...
  function r (line 7) | function r(t,e){return Object.prototype.hasOwnProperty.call(t,e)}
  function r (line 7) | function r(t,e){if(t.map)return t.map(e);for(var n=[],r=0;r<t.length;r++...
  function r (line 7) | function r(t){return this instanceof r?(c.call(this,t),l.call(this,t),t&...
  function i (line 7) | function i(){this.allowHalfOpen||this._writableState.ended||s.nextTick(o...
  function o (line 7) | function o(t){t.end()}
  function r (line 7) | function r(t){return this instanceof r?void i.call(this,t):new r(t)}
  function i (line 7) | function i(t){return U.from(t)}
  function o (line 7) | function o(t){return U.isBuffer(t)||t instanceof q}
  function s (line 7) | function s(t,e,n){return"function"==typeof t.prependListener?t.prependLi...
  function a (line 7) | function a(e,n){k=k||t("./_stream_duplex"),e=e||{};var r=n instanceof k;...
  function u (line 7) | function u(e){return k=k||t("./_stream_duplex"),this instanceof u?(this....
  function c (line 7) | function c(t,e,n,r,o){var s=t._readableState;if(null===e)s.reading=!1,y(...
  function l (line 7) | function l(t,e,n,r){e.flowing&&0===e.length&&!e.sync?(t.emit("data",n),t...
  function h (line 7) | function h(t,e){var n;return o(e)||"string"==typeof e||void 0===e||t.obj...
  function p (line 7) | function p(t){return!t.ended&&(t.needReadable||t.length<t.highWaterMark|...
  function f (line 7) | function f(t){return t>=W?t=W:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t...
  function d (line 7) | function d(t,e){return t<=0||0===e.length&&e.ended?0:e.objectMode?1:t!==...
  function y (line 7) | function y(t,e){if(!e.ended){if(e.decoder){var n=e.decoder.end();n&&n.le...
  function m (line 7) | function m(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable...
  function _ (line 7) | function _(t){B("emit readable"),t.emit("readable"),x(t)}
  function g (line 7) | function g(t,e){e.readingMore||(e.readingMore=!0,j.nextTick(v,t,e))}
  function v (line 7) | function v(t,e){for(var n=e.length;!e.reading&&!e.flowing&&!e.ended&&e.l...
  function b (line 7) | function b(t){return function(){var e=t._readableState;B("pipeOnDrain",e...
  function w (line 7) | function w(t){B("readable nexttick read 0"),t.read(0)}
  function E (line 7) | function E(t,e){e.resumeScheduled||(e.resumeScheduled=!0,j.nextTick(T,t,...
  function T (line 7) | function T(t,e){e.reading||(B("resume read 0"),t.read(0)),e.resumeSchedu...
  function x (line 7) | function x(t){var e=t._readableState;for(B("flow",e.flowing);e.flowing&&...
  function S (line 7) | function S(t,e){if(0===e.length)return null;var n;return e.objectMode?n=...
  function C (line 7) | function C(t,e,n){var r;return t<e.head.data.length?(r=e.head.data.slice...
  function I (line 7) | function I(t,e){var n=e.head,r=1,i=n.data;for(t-=i.length;n=n.next;){var...
  function N (line 7) | function N(t,e){
  function O (line 8) | function O(t){var e=t._readableState;if(e.length>0)throw new Error('"end...
  function A (line 8) | function A(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=...
  function D (line 8) | function D(t,e){for(var n=0,r=t.length;n<r;n++)if(t[n]===e)return n;retu...
  function r (line 8) | function r(t,e){B("onunpipe"),t===p&&e&&e.hasUnpiped===!1&&(e.hasUnpiped...
  function i (line 8) | function i(){B("onend"),t.end()}
  function o (line 8) | function o(){B("cleanup"),t.removeListener("close",c),t.removeListener("...
  function a (line 8) | function a(e){B("ondata"),g=!1;var n=t.write(e);!1!==n||g||((1===f.pipes...
  function u (line 8) | function u(e){B("onerror",e),h(),t.removeListener("error",u),0===R(t,"er...
  function c (line 8) | function c(){t.removeListener("finish",l),h()}
  function l (line 8) | function l(){B("onfinish"),t.removeListener("close",c),h()}
  function h (line 8) | function h(){B("unpipe"),p.unpipe(t)}
  function r (line 8) | function r(t,e){var n=this._transformState;n.transforming=!1;var r=n.wri...
  function i (line 8) | function i(t){return this instanceof i?(a.call(this,t),this._transformSt...
  function o (line 8) | function o(){var t=this;"function"==typeof this._flush?this._flush(funct...
  function s (line 8) | function s(t,e,n){if(e)return t.emit("error",e);if(null!=n&&t.push(n),t....
  function o (line 8) | function o(t){var e=this;this.next=null,this.entry=null,this.finish=func...
  function s (line 8) | function s(t){return L.from(t)}
  function a (line 8) | function a(t){return L.isBuffer(t)||t instanceof R}
  function u (line 8) | function u(){}
  function c (line 8) | function c(e,n){O=O||t("./_stream_duplex"),e=e||{};var r=n instanceof O;...
  function l (line 8) | function l(e){return O=O||t("./_stream_duplex"),U.call(l,this)||this ins...
  function h (line 8) | function h(t,e){var n=new Error("write after end");t.emit("error",n),N.n...
  function p (line 8) | function p(t,e,n,r){var i=!0,o=!1;return null===n?o=new TypeError("May n...
  function f (line 8) | function f(t,e,n){return t.objectMode||t.decodeStrings===!1||"string"!=t...
  function d (line 8) | function d(t,e,n,r,i,o){if(!n){var s=f(e,r,i);r!==s&&(n=!0,i="buffer",r=...
  function y (line 8) | function y(t,e,n,r,i,o,s){e.writelen=r,e.writecb=s,e.writing=!0,e.sync=!...
  function m (line 8) | function m(t,e,n,r,i){--e.pendingcb,n?(N.nextTick(i,r),N.nextTick(S,t,e)...
  function _ (line 8) | function _(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writele...
  function g (line 8) | function g(t,e){var n=t._writableState,r=n.sync,i=n.writecb;if(_(n),e)m(...
  function v (line 8) | function v(t,e,n,r){n||b(t,e),e.pendingcb--,r(),S(t,e)}
  function b (line 8) | function b(t,e){0===e.length&&e.needDrain&&(e.needDrain=!1,t.emit("drain...
  function w (line 8) | function w(t,e){e.bufferProcessing=!0;var n=e.bufferedRequest;if(t._writ...
  function E (line 8) | function E(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!...
  function T (line 8) | function T(t,e){t._final(function(n){e.pendingcb--,n&&t.emit("error",n),...
  function x (line 8) | function x(t,e){e.prefinished||e.finalCalled||("function"==typeof t._fin...
  function S (line 8) | function S(t,e){var n=E(e);return n&&(x(t,e),0===e.pendingcb&&(e.finishe...
  function C (line 8) | function C(t,e,n){e.ending=!0,S(t,e),n&&(e.finished?N.nextTick(n):t.once...
  function I (line 8) | function I(t,e,n){var r=t.entry;for(t.entry=null;r;){var i=r.callback;e....
  function r (line 8) | function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a ...
  function i (line 8) | function i(t,e,n){t.copy(e,n)}
  function t (line 8) | function t(){r(this,t),this.head=null,this.tail=null,this.length=0}
  function r (line 8) | function r(t,e){var n=this,r=this._readableState&&this._readableState.de...
  function i (line 8) | function i(){this._readableState&&(this._readableState.destroyed=!1,this...
  function o (line 8) | function o(t,e){t.emit("error",e)}
  function r (line 8) | function r(t,e){for(var n in t)e[n]=t[n]}
  function i (line 8) | function i(t,e,n){return s(t,e,n)}
  function r (line 8) | function r(t,e){if(!(this instanceof r))return new r(t,e);var i=this;o(i...
  function i (line 8) | function i(t){for(var e=Math.max(n.MAX_BUFFER_LENGTH,10),r=0,i=0,o=A.len...
  function o (line 8) | function o(t){for(var e=0,n=A.length;e<n;e++)t[A[e]]=""}
  function s (line 8) | function s(t){m(t),""!==t.cdata&&(y(t,"oncdata",t.cdata),t.cdata=""),""!...
  function a (line 8) | function a(t,e){return new u(t,e)}
  function u (line 8) | function u(t,e){if(!(this instanceof u))return new u(t,e);D.apply(this),...
  function c (line 8) | function c(t){return" "===t||"\n"===t||"\r"===t||"\t"===t}
  function l (line 8) | function l(t){return'"'===t||"'"===t}
  function h (line 8) | function h(t){return">"===t||c(t)}
  function p (line 8) | function p(t,e){return t.test(e)}
  function f (line 8) | function f(t,e){return!p(t,e)}
  function d (line 8) | function d(t,e,n){t[e]&&t[e](n)}
  function y (line 8) | function y(t,e,n){t.textNode&&m(t),d(t,e,n)}
  function m (line 8) | function m(t){t.textNode=_(t.opt,t.textNode),t.textNode&&d(t,"ontext",t....
  function _ (line 8) | function _(t,e){return t.trim&&(e=e.trim()),t.normalize&&(e=e.replace(/\...
  function g (line 8) | function g(t,e){return m(t),t.trackPosition&&(e+="\nLine: "+t.line+"\nCo...
  function v (line 8) | function v(t){return t.sawRoot&&!t.closedRoot&&b(t,"Unclosed root tag"),...
  function b (line 8) | function b(t,e){if("object"!=typeof t||!(t instanceof r))throw new Error...
  function w (line 8) | function w(t){t.strict||(t.tagName=t.tagName[t.looseCase]());var e=t.tag...
  function E (line 8) | function E(t,e){var n=t.indexOf(":"),r=n<0?["",t]:t.split(":"),i=r[0],o=...
  function T (line 8) | function T(t){if(t.strict||(t.attribName=t.attribName[t.looseCase]()),t....
  function x (line 8) | function x(t,e){if(t.opt.xmlns){var n=t.tag,r=E(t.tagName);n.prefix=r.pr...
  function S (line 8) | function S(t){if(!t.tagName)return b(t,"Weird empty close tag."),t.textN...
  function C (line 8) | function C(t){var e,n=t.entity,r=n.toLowerCase(),i="";return t.ENTITIES[...
  function I (line 8) | function I(t,e){"<"===e?(t.state=z.OPEN_WAKA,t.startTagPosition=t.positi...
  function N (line 8) | function N(t,e){var n="";return e<t.length&&(n=t.charAt(e)),n}
  function O (line 8) | function O(t){var e=this;if(this.error)throw this.error;if(e.closed)retu...
  function e (line 9) | function e(){}
  function r (line 9) | function r(){i.call(this)}
  function n (line 9) | function n(e){t.writable&&!1===t.write(e)&&c.pause&&c.pause()}
  function r (line 9) | function r(){c.readable&&c.resume&&c.resume()}
  function o (line 9) | function o(){l||(l=!0,t.end())}
  function s (line 9) | function s(){l||(l=!0,"function"==typeof t.destroy&&t.destroy())}
  function a (line 9) | function a(t){if(u(),0===i.listenerCount(this,"error"))throw t}
  function u (line 9) | function u(){c.removeListener("data",n),t.removeListener("drain",r),c.re...
  function r (line 9) | function r(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"u...
  function i (line 9) | function i(t){var e=r(t);if("string"!=typeof e&&(g.isEncoding===v||!v(t)...
  function o (line 9) | function o(t){this.encoding=i(t);var e;switch(this.encoding){case"utf16l...
  function s (line 9) | function s(t){return t<=127?0:t>>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===...
  function a (line 9) | function a(t,e,n){var r=e.length-1;if(r<n)return 0;var i=s(e[r]);return ...
  function u (line 9) | function u(t,e,n){if(128!==(192&e[0]))return t.lastNeed=0,"�";if(t.lastN...
  function c (line 9) | function c(t){var e=this.lastTotal-this.lastNeed,n=u(this,t,e);return vo...
  function l (line 9) | function l(t,e){var n=a(this,t,e);if(!this.lastNeed)return t.toString("u...
  function h (line 9) | function h(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+...
  function p (line 9) | function p(t,e){if((t.length-e)%2===0){var n=t.toString("utf16le",e);if(...
  function f (line 9) | function f(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var n...
  function d (line 9) | function d(t,e){var n=(t.length-e)%3;return 0===n?t.toString("base64",e)...
  function y (line 9) | function y(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+...
  function m (line 9) | function m(t){return t.toString(this.encoding)}
  function _ (line 9) | function _(t){return t&&t.length?this.write(t):""}
  function i (line 9) | function i(t,e){this._id=t,this._clearFn=e}
  function n (line 9) | function n(t,e){function n(){if(!i){if(r("throwDeprecation"))throw new E...
  function r (line 9) | function r(e){try{if(!t.localStorage)return!1}catch(n){return!1}var r=t....
  function i (line 9) | function i(t,e){var r={seen:[],stylize:s};return arguments.length>=3&&(r...
  function o (line 9) | function o(t,e){var n=i.styles[e];return n?"["+i.colors[n][0]+"m"+t+"[...
  function s (line 9) | function s(t,e){return t}
  function a (line 9) | function a(t){var e={};return t.forEach(function(t,n){e[t]=!0}),e}
  function u (line 9) | function u(t,e,r){if(t.customInspect&&e&&C(e.inspect)&&e.inspect!==n.ins...
  function c (line 9) | function c(t,e){if(w(e))return t.stylize("undefined","undefined");if(v(e...
  function l (line 9) | function l(t){return"["+Error.prototype.toString.call(t)+"]"}
  function h (line 9) | function h(t,e,n,r,i){for(var o=[],s=0,a=e.length;s<a;++s)D(e,String(s))...
  function p (line 9) | function p(t,e,n,r,i,o){var s,a,c;if(c=Object.getOwnPropertyDescriptor(e...
  function f (line 9) | function f(t,e,n){var r=0,i=t.reduce(function(t,e){return r++,e.indexOf(...
  function d (line 9) | function d(t){return Array.isArray(t)}
  function y (line 9) | function y(t){return"boolean"==typeof t}
  function m (line 9) | function m(t){return null===t}
  function _ (line 9) | function _(t){return null==t}
  function g (line 9) | function g(t){return"number"==typeof t}
  function v (line 9) | function v(t){return"string"==typeof t}
  function b (line 9) | function b(t){return"symbol"==typeof t}
  function w (line 9) | function w(t){return void 0===t}
  function E (line 9) | function E(t){return T(t)&&"[object RegExp]"===N(t)}
  function T (line 9) | function T(t){return"object"==typeof t&&null!==t}
  function x (line 9) | function x(t){return T(t)&&"[object Date]"===N(t)}
  function S (line 9) | function S(t){return T(t)&&("[object Error]"===N(t)||t instanceof Error)}
  function C (line 9) | function C(t){return"function"==typeof t}
  function I (line 9) | function I(t){return null===t||"boolean"==typeof t||"number"==typeof t||...
  function N (line 9) | function N(t){return Object.prototype.toString.call(t)}
  function O (line 9) | function O(t){return t<10?"0"+t.toString(10):t.toString(10)}
  function A (line 9) | function A(){var t=new Date,e=[O(t.getHours()),O(t.getMinutes()),O(t.get...
  function D (line 9) | function D(t,e){return Object.prototype.hasOwnProperty.call(t,e)}
  function o (line 9) | function o(){if(!s){if(e.throwDeprecation)throw new Error(i);e.traceDepr...
  function t (line 9) | function t(t){var e,n,i;this.options={},n=r[.2];for(e in n)a.call(n,e)&&...
  function n (line 9) | function n(){this.constructor=t}
  function i (line 9) | function i(t){this.parseString=l(this.parseString,this),this.reset=l(thi...
  function n (line 9) | function n(){this.constructor=t}
  function e (line 9) | function e(t){this.message=t}
  function t (line 9) | function t(t,e,n){if(this.options=t.options,this.stringify=t.stringify,n...
  function n (line 9) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n){if(e.__super__.constructor.call(this,t),null==n)throw ne...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n){if(e.__super__.constructor.call(this,t),null==n)throw ne...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n,r,i,o,s){if(e.__super__.constructor.call(this,t),null==n)...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n,r){if(e.__super__.constructor.call(this,t),null==n)throw ...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n,r,o){if(e.__super__.constructor.call(this,t),null==r)thro...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n,r){if(e.__super__.constructor.call(this,t),null==n)throw ...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n,r,o){var s;e.__super__.constructor.call(this,t),i(n)&&(s=...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n,r){var i,o;e.__super__.constructor.call(this,t),this.docu...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t){e.__super__.constructor.call(this,null),t||(t={}),t.writer...
  function t (line 10) | function t(t,e,n){var r;t||(t={}),t.writer?b(t.writer)&&(r=t.writer,t.wr...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n,r){if(e.__super__.constructor.call(this,t),null==n)throw ...
  function e (line 10) | function e(e){this.parent=e,this.parent&&(this.options=this.parent.optio...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n,r){if(e.__super__.constructor.call(this,t),null==n)throw ...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n){if(e.__super__.constructor.call(this,t),null==n)throw ne...
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t,n){e.__super__.constructor.call(this,n),this.stream=t}
  function n (line 10) | function n(){this.constructor=t}
  function e (line 10) | function e(t){e.__super__.constructor.call(this,t)}
  function t (line 11) | function t(t){this.assertLegalChar=n(this.assertLegalChar,this);var e,i,...
  function n (line 11) | function n(){this.constructor=t}
  function e (line 11) | function e(t,n){if(e.__super__.constructor.call(this,t),null==n)throw ne...
  function t (line 11) | function t(t){var e,r,i,o,s,a,u,c,l;t||(t={}),this.pretty=t.pretty||!1,t...

FILE: force-app/main/default/staticresources/penpal.js
  method destroy (line 6) | destroy(){n=true;e.forEach(e=>{e()})}
  method onDestroy (line 6) | onDestroy(t){n?t():e.push(t)}
Condensed preview — 329 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,714K chars).
[
  {
    "path": ".forceignore",
    "chars": 497,
    "preview": "# List files or directories below to ignore them when running force:source:push, force:source:pull, and force:source:sta"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 453,
    "preview": "#\n# Code Owners File Format\n# https://help.github.com/articles/about-code-owners/\n#\n# A CODEOWNERS file uses a pattern t"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 723,
    "preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/BUG_REPORT.md",
    "chars": 2505,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: \"discussion \\U0001F4AC\"\nassignees: doug"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/DOCUMENTATION_REQUEST.md",
    "chars": 545,
    "preview": "---\nname: Documentation request\nabout: Suggest a change to documentation\ntitle: ''\nlabels: documentation 📓\nassignees: ''"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/FEATURE_REQUEST.md",
    "chars": 645,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement ✨\nassignees: ''\n\n---\n\n##"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 95,
    "preview": "### What does this pull request do?\n\n\n### What issues does this pull request fix or reference?\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "chars": 3802,
    "preview": "name: CI\n\non:\n  # Trigger the workflow on push or pull request,\n  # but only for the master branch.\n  push:\n    branches"
  },
  {
    "path": ".gitignore",
    "chars": 262,
    "preview": "# Salesforce DX configuration files.\n.sfdx/\n.sf/\n\n# IlluminatedCloud configuration files.\n.idea/\nIlluminatedCloud/\n*.iml"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5155,
    "preview": "# Salesforce Open Source Community Code of Conduct\n\n## About the Code of Conduct\n\nEquality is a core value at Salesforce"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 7182,
    "preview": "# Contributing to Mass Action Scheduler\n\n:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:\n\nThe"
  },
  {
    "path": "LICENSE",
    "chars": 1534,
    "preview": "BSD 3-Clause License\n\nCopyright (c) 2017-2023, Doug Ayers, douglascayers.com\nAll rights reserved.\n\nRedistribution and us"
  },
  {
    "path": "README.md",
    "chars": 12171,
    "preview": "<!-- SHIELDS -->\n[![Latest Version][version-shield]][version-url]\n[![Salesforce Community Support][community-shield]][co"
  },
  {
    "path": "_config.yml",
    "chars": 56,
    "preview": "theme: jekyll-theme-cayman\ntitle: Mass Action Scheduler\n"
  },
  {
    "path": "_layouts/default.html",
    "chars": 1886,
    "preview": "<!DOCTYPE html>\n<html lang=\"{{ site.lang | default: \"en-US\" }}\">\n\n<head>\n\n    <meta charset=\"UTF-8\">\n\n    {% seo %}\n\n   "
  },
  {
    "path": "config/project-scratch-def.json",
    "chars": 439,
    "preview": "{\n    \"orgName\": \"Mass Action Scheduler\",\n    \"edition\": \"Enterprise\",\n    \"hasSampleData\": false,\n    \"features\": [],\n "
  },
  {
    "path": "force-app/main/default/applications/Mass_Action_Scheduler.app-meta.xml",
    "chars": 719,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<CustomApplication xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <defaultL"
  },
  {
    "path": "force-app/main/default/applications/Mass_Action_Scheduler_Lightning.app-meta.xml",
    "chars": 1797,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<CustomApplication xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <actionOv"
  },
  {
    "path": "force-app/main/default/aura/LC_API/LC_API.cmp",
    "chars": 5863,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/douglascayers/sfdx-lightning-api-c"
  },
  {
    "path": "force-app/main/default/aura/LC_API/LC_API.cmp-meta.xml",
    "chars": 206,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/LC_API/LC_APIController.js",
    "chars": 7551,
    "preview": "/*\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/douglascayers/sfdx-lightning-api-com"
  },
  {
    "path": "force-app/main/default/aura/LC_API/LC_APIHelper.js",
    "chars": 7476,
    "preview": "/*\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/douglascayers/sfdx-lightning-api-com"
  },
  {
    "path": "force-app/main/default/aura/LC_API/LC_APIRenderer.js",
    "chars": 2352,
    "preview": "/*\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/douglascayers/sfdx-lightning-api-com"
  },
  {
    "path": "force-app/main/default/aura/LC_URL/LC_URL.cmp",
    "chars": 2056,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/douglascayers/sfdx-lightning-api-c"
  },
  {
    "path": "force-app/main/default/aura/LC_URL/LC_URL.cmp-meta.xml",
    "chars": 206,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/LC_URL/LC_URLController.js",
    "chars": 1825,
    "preview": "/*\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/douglascayers/sfdx-lightning-api-com"
  },
  {
    "path": "force-app/main/default/aura/MA_CheckForPackageUpdatesCmp/MA_CheckForPackageUpdatesCmp.cmp",
    "chars": 2857,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-ma"
  },
  {
    "path": "force-app/main/default/aura/MA_CheckForPackageUpdatesCmp/MA_CheckForPackageUpdatesCmp.cmp-meta.xml",
    "chars": 228,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/MA_CheckForPackageUpdatesCmp/MA_CheckForPackageUpdatesCmpController.js",
    "chars": 2536,
    "preview": "({\n    onInit: function( component, event, helper ) {\n\n        let promises = [];\n        let lcApi = component.find( 'l"
  },
  {
    "path": "force-app/main/default/aura/MA_DevelopedByCmp/MA_DevelopedByCmp.cmp",
    "chars": 2310,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-ma"
  },
  {
    "path": "force-app/main/default/aura/MA_DevelopedByCmp/MA_DevelopedByCmp.cmp-meta.xml",
    "chars": 217,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/MA_EditConfigCmp/MA_EditConfigCmp.cmp",
    "chars": 85193,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-ma"
  },
  {
    "path": "force-app/main/default/aura/MA_EditConfigCmp/MA_EditConfigCmp.cmp-meta.xml",
    "chars": 216,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/MA_EditConfigCmp/MA_EditConfigCmp.css",
    "chars": 3281,
    "preview": "/*\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-mass"
  },
  {
    "path": "force-app/main/default/aura/MA_EditConfigCmp/MA_EditConfigCmpController.js",
    "chars": 19008,
    "preview": "/*\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-mass"
  },
  {
    "path": "force-app/main/default/aura/MA_EditConfigCmp/MA_EditConfigCmpHelper.js",
    "chars": 65862,
    "preview": "/*\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-mass"
  },
  {
    "path": "force-app/main/default/aura/MA_FlowStagePathCmp/MA_FlowStagePathCmp.cmp",
    "chars": 2472,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-ma"
  },
  {
    "path": "force-app/main/default/aura/MA_FlowStagePathCmp/MA_FlowStagePathCmp.cmp-meta.xml",
    "chars": 219,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/MA_FlowStagePathCmp/MA_FlowStagePathCmp.design",
    "chars": 2019,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-ma"
  },
  {
    "path": "force-app/main/default/aura/MA_FlowStagePathCmp/MA_FlowStagePathCmpController.js",
    "chars": 2832,
    "preview": "/*\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-mass"
  },
  {
    "path": "force-app/main/default/aura/MA_RunConfigCmp/MA_RunConfigCmp.cmp",
    "chars": 3437,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-ma"
  },
  {
    "path": "force-app/main/default/aura/MA_RunConfigCmp/MA_RunConfigCmp.cmp-meta.xml",
    "chars": 215,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/MA_RunConfigCmp/MA_RunConfigCmpController.js",
    "chars": 984,
    "preview": "({\n    onInit : function( component, event, helper ) {\n\n        helper.enqueueAction( component, 'c.getConfiguration', {"
  },
  {
    "path": "force-app/main/default/aura/MA_RunConfigCmp/MA_RunConfigCmpHelper.js",
    "chars": 5004,
    "preview": "({\n    // -----------------------------------------------------------------\n\n    showSpinner : function( component ) {\n\n"
  },
  {
    "path": "force-app/main/default/aura/MA_WizardCoachingCmp/MA_WizardCoachingCmp.cmp",
    "chars": 2744,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-ma"
  },
  {
    "path": "force-app/main/default/aura/MA_WizardCoachingCmp/MA_WizardCoachingCmp.cmp-meta.xml",
    "chars": 220,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/defaultTokens/defaultTokens.tokens",
    "chars": 2557,
    "preview": "<!--\nStrike by Appiphony\n\nVersion: 1.0.0\nWebsite: http://www.lightningstrike.io\nGitHub: https://github.com/appiphony/Str"
  },
  {
    "path": "force-app/main/default/aura/defaultTokens/defaultTokens.tokens-meta.xml",
    "chars": 228,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/lax/lax.cmp",
    "chars": 1521,
    "preview": "<!--\n    MIT License\n\n    Copyright (c) 2017 Ruslan Kurchenko\n\n    Permission is hereby granted, free of charge, to any "
  },
  {
    "path": "force-app/main/default/aura/lax/lax.cmp-meta.xml",
    "chars": 203,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/lax/laxController.js",
    "chars": 1579,
    "preview": "/**\n * @license\n * MIT License\n * Copyright (c) 2017 Ruslan Kurchenko\n *\n * Permission is hereby granted, free of charge"
  },
  {
    "path": "force-app/main/default/aura/lax/laxHelper.js",
    "chars": 35604,
    "preview": "/**\n * @license\n * MIT License\n * Copyright (c) 2017 Ruslan Kurchenko\n *\n * Permission is hereby granted, free of charge"
  },
  {
    "path": "force-app/main/default/aura/slds_label/slds_label.cmp",
    "chars": 2238,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-ma"
  },
  {
    "path": "force-app/main/default/aura/slds_label/slds_label.cmp-meta.xml",
    "chars": 210,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/slds_section/slds_section.cmp",
    "chars": 2149,
    "preview": "<!--\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/sfdx-mass-action-scheduler/sfdx-ma"
  },
  {
    "path": "force-app/main/default/aura/slds_section/slds_section.cmp-meta.xml",
    "chars": 212,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/strike_evt/strike_evt.evt",
    "chars": 1753,
    "preview": "<!--\nStrike by Appiphony\n\nVersion: 1.0.0\nWebsite: http://www.lightningstrike.io\nGitHub: https://github.com/appiphony/Str"
  },
  {
    "path": "force-app/main/default/aura/strike_evt/strike_evt.evt-meta.xml",
    "chars": 210,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/strike_wizard/strike_wizard.cmp",
    "chars": 8105,
    "preview": "<!--\nStrike by Appiphony\n\nVersion: 0.8.0\nWebsite: http://www.lightningstrike.io\nGitHub: https://github.com/appiphony/Str"
  },
  {
    "path": "force-app/main/default/aura/strike_wizard/strike_wizard.cmp-meta.xml",
    "chars": 228,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AuraDefinitionBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVe"
  },
  {
    "path": "force-app/main/default/aura/strike_wizard/strike_wizard.css",
    "chars": 2776,
    "preview": "/*\nStrike by Appiphony\n\nVersion: 0.8.0\nWebsite: http://www.lightningstrike.io\nGitHub: https://github.com/appiphony/Strik"
  },
  {
    "path": "force-app/main/default/aura/strike_wizard/strike_wizardController.js",
    "chars": 3295,
    "preview": "/*\nStrike by Appiphony\n\nVersion: 0.8.0\nWebsite: http://www.lightningstrike.io\nGitHub: https://github.com/appiphony/Strik"
  },
  {
    "path": "force-app/main/default/aura/strike_wizard/strike_wizardHelper.js",
    "chars": 14264,
    "preview": "/*\nStrike by Appiphony\n\nVersion: 0.8.0\nWebsite: http://www.lightningstrike.io\nGitHub: https://github.com/appiphony/Strik"
  },
  {
    "path": "force-app/main/default/classes/LC_URLController.cls",
    "chars": 2580,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/LC_URLController.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/LC_URLControllerTest.cls",
    "chars": 2435,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/LC_URLControllerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/LC_VisualforceDomainController.cls",
    "chars": 2343,
    "preview": "/*\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/douglascayers/sfdx-lightning-api-com"
  },
  {
    "path": "force-app/main/default/classes/LC_VisualforceDomainController.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/LC_VisualforceDomainControllerTest.cls",
    "chars": 2712,
    "preview": "/*\nAuthor: Doug Ayers\nWebsite: https://douglascayers.com\nGitHub: https://github.com/douglascayers/sfdx-lightning-api-com"
  },
  {
    "path": "force-app/main/default/classes/LC_VisualforceDomainControllerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_AnonymousApexExecuteResult.cls",
    "chars": 2308,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_AnonymousApexExecuteResult.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_AsyncApexJobMock.cls",
    "chars": 4633,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_AsyncApexJobMock.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_BatchApexErrorEventInvocable.cls",
    "chars": 8963,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_BatchApexErrorEventInvocable.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_BatchApexErrorEventInvocableTest.cls",
    "chars": 5167,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_BatchApexErrorEventInvocableTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_BatchApexStatusEventTriggerHandler.cls",
    "chars": 8185,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_BatchApexStatusEventTriggerHandler.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_BatchApexStatusEventTriggerTest.cls",
    "chars": 7832,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_BatchApexStatusEventTriggerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_EditConfigCmpController.cls",
    "chars": 2850,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_EditConfigCmpController.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_EditConfigCmpControllerTest.cls",
    "chars": 4290,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_EditConfigCmpControllerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_EditConfigRestController.cls",
    "chars": 30053,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_EditConfigRestController.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_EditConfigRestControllerTest.cls",
    "chars": 39820,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_EditConfigRestControllerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_Exceptions.cls",
    "chars": 8967,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_Exceptions.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_ExceptionsTest.cls",
    "chars": 8206,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_ExceptionsTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_HttpCalloutMock.cls",
    "chars": 18414,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_HttpCalloutMock.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_InstallHandler.cls",
    "chars": 2651,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_InstallHandler.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_InstallHandlerTest.cls",
    "chars": 2528,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_InstallHandlerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_IterableSourceBatchable.cls",
    "chars": 4255,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_IterableSourceBatchable.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_IterableSourceBatchableTest.cls",
    "chars": 11533,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_IterableSourceBatchableTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_JobChangeEvent.cls",
    "chars": 2289,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_JobChangeEvent.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_JobChangeEventTriggerHandler.cls",
    "chars": 3838,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_JobChangeEventTriggerHandler.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_JobChangeEventTriggerHandlerTest.cls",
    "chars": 8263,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_JobChangeEventTriggerHandlerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_ListViewDescribeResult.cls",
    "chars": 2779,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_ListViewDescribeResult.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_ListViewDescribeResultTest.cls",
    "chars": 2412,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_ListViewDescribeResultTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_ListViewSourceBatchable.cls",
    "chars": 5568,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_ListViewSourceBatchable.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_ListViewSourceBatchableTest.cls",
    "chars": 12394,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_ListViewSourceBatchableTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MapUtils.cls",
    "chars": 5817,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MapUtils.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MapUtilsTest.cls",
    "chars": 6517,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MapUtilsTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionBatchEnqueuer.cls",
    "chars": 2065,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionBatchEnqueuer.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionBatchUtils.cls",
    "chars": 16368,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionBatchUtils.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionBatchUtilsTest.cls",
    "chars": 16286,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionBatchUtilsTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionConfigTriggerHandler.cls",
    "chars": 9644,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionConfigTriggerHandler.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionConfigTriggerHandlerTest.cls",
    "chars": 7933,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionConfigTriggerHandlerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionConfigWrapper.cls",
    "chars": 9340,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionConfigWrapper.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionLogTriggerHandler.cls",
    "chars": 5865,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionLogTriggerHandler.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionLogTriggerHandlerTest.cls",
    "chars": 6606,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionLogTriggerHandlerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionSchedulable.cls",
    "chars": 3336,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionSchedulable.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionSchedulableTest.cls",
    "chars": 4821,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionSchedulableTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionScheduleUtils.cls",
    "chars": 5452,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionScheduleUtils.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionScheduleUtilsTest.cls",
    "chars": 6892,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionScheduleUtilsTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionUtils.cls",
    "chars": 51577,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MassActionUtils.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MetadataDeployCallback.cls",
    "chars": 2508,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MetadataDeployCallback.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_MetadataDeployCallbackTest.cls",
    "chars": 3816,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_MetadataDeployCallbackTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_NamespaceUtils.cls",
    "chars": 2498,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_NamespaceUtils.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_ReportService.cls",
    "chars": 12885,
    "preview": "/*\n    Copyright (c) 2015 Salesforce.org\n    All rights reserved.\n\n    Redistribution and use in source and binary forms"
  },
  {
    "path": "force-app/main/default/classes/MA_ReportService.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_ReportServiceTest.cls",
    "chars": 10176,
    "preview": "/*\n    Copyright (c) 2015 Salesforce.org\n    All rights reserved.\n\n    Redistribution and use in source and binary forms"
  },
  {
    "path": "force-app/main/default/classes/MA_ReportServiceTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_ReportSourceBatchable.cls",
    "chars": 8892,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_ReportSourceBatchable.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_ReportSourceBatchableTest.cls",
    "chars": 14457,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_ReportSourceBatchableTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_RunConfigCmpController.cls",
    "chars": 2997,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_RunConfigCmpController.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_RunConfigCmpControllerTest.cls",
    "chars": 9725,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_RunConfigCmpControllerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_RunConfigInvocable.cls",
    "chars": 5520,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_RunConfigInvocable.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_RunConfigInvocableTest.cls",
    "chars": 4783,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_RunConfigInvocableTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_SetConfigUniqueNameBatchable.cls",
    "chars": 6916,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_SetConfigUniqueNameBatchable.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_SetConfigUniqueNameBatchableTest.cls",
    "chars": 4735,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_SetConfigUniqueNameBatchableTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_SetupAuthWizardPageController.cls",
    "chars": 2054,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_SetupAuthWizardPageController.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_SetupAuthWizardPageControllerTest.cls",
    "chars": 2295,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_SetupAuthWizardPageControllerTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlQueryExecuteResult.cls",
    "chars": 2295,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlQueryExecuteResult.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlQueryExecuteResultTest.cls",
    "chars": 2354,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlQueryExecuteResultTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlSourceBatchable.cls",
    "chars": 5282,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlSourceBatchable.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlSourceBatchableTest.cls",
    "chars": 10197,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlSourceBatchableTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlSourceIterable.cls",
    "chars": 4877,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlSourceIterable.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlSourceIterableTest.cls",
    "chars": 5121,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_SoqlSourceIterableTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_StringUtils.cls",
    "chars": 3813,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_StringUtils.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_StringUtilsTest.cls",
    "chars": 6405,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_StringUtilsTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_UpgradeMassActionLogsBatchable.cls",
    "chars": 13355,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_UpgradeMassActionLogsBatchable.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_UpgradeMassActionLogsBatchableTest.cls",
    "chars": 7305,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  },
  {
    "path": "force-app/main/default/classes/MA_UpgradeMassActionLogsBatchableTest.cls-meta.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ApexClass xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <apiVersion>54.0<"
  },
  {
    "path": "force-app/main/default/classes/MA_UpgradePageLayoutsService.cls",
    "chars": 13908,
    "preview": "/**\n * Author: Doug Ayers\n * Website: https://douglascayers.com\n * GitHub: https://github.com/sfdx-mass-action-scheduler"
  }
]

// ... and 129 more files (download for full content)

About this extraction

This page contains the full source code of the douglascayers-org/sfdx-mass-action-scheduler GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 329 files (1.6 MB), approximately 410.3k tokens, and a symbol index with 613 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!