Installing and Configuring a FHIR Server
The Management Portal provides a FHIR Server Management page that allows you to install a new FHIR server and then configure it.
Before installing a FHIR server, you must consider whether you want to customize it now or in the future. In many cases, a FHIR server using the Resource Repository cannot be customized unless you subclass the InteractionsStrategy before creating the endpoint. For example, modifying how bundles are processed or post-processing search results requires you to subclass the Resource Repository. For information about preparing for these customizations before installing the FHIR server, see Pre-Installation Subclassing.
Prerequisites for installing a new FHIR server:
-
To install a FHIR server, you must have a Foundation namespace. If you do not have a Foundation namespace, follow the procedure to create and activate a foundation namespace before you begin.
-
You can install more than one FHIR server in a particular Foundation namespace.
-
To install or configure a FHIR server, you must have the %HSAdmin_InstallationManagement resource and the %HS_DB_{NAMESPACE} role assigned for each Namespace you will interact with.
Installing a New FHIR Server
-
Rather than using the Management Portal, you may choose to install and configure a FHIR server programmatically.
-
You can also execute many of these tasks using the FHIR Server Management REST APIOpens in a new tab.
-
If you prefer, you can use a command-line interface to install a FHIR server.
-
If you plan to mirror your FHIR server, see Configuring Mirroring for Healthcare Products for special instructions.
To install and configure a new FHIR server using the Management Portal:
-
Open the FHIR Server Management page:
-
Navigate to Home > Health and click FHIR in the banner.
-
-
Click the + Add new server tile.
-
Fill out the basic configuration pane as follows:
NamespaceSelect the name of your foundation namespace from the dropdown.
NameEnter a name for your new FHIR server. Name is a required field when configuring a FHIR server in the Management Portal.
FHIR VersionSelect a core FHIR package from the FHIR Version dropdown.
Each package corresponds to a version of the HL7® FHIR® standard. So, for example, to configure a FHIR endpoint that supports FHIR R5, select the hl7.fhir.r5.core@5.0.0 package.
Choosing the core FHIR package automatically populates the URL field with an appropriate endpoint.
URLAn endpoint URL is automatically generated when you choose a FHIR version. You can edit the endpoint’s URL if desired, but ensure that it begins with a forward-slash (/).
Custom PackagesSelect any custom packages that you want your endpoint to support from the dropdown.
For more information about packages, see Profiles and FHIR Adaptations. In particular, for information about managing packages programmatically, see Package APIs.
-
Expand the Advanced Configuration pane of the dialog and configure the settings there using the following descriptions as a guide.
Note:Additional configuration options become available in Advanced Configuration once the FHIR server installation has completed.
First select a Data Organization Strategy and a database architecture:
Data Organization StrategySelect an interaction strategy from the dropdown. If you created a custom interaction strategy, it should appear in the dropdown for you to select.
-
For IRIS for Health and Health Connect, the default interaction strategy is HS.FHIRServer.Storage.JsonAdvSQL.InteractionsStrategy, which stores FHIR data as JSON in dynamic objects.
-
In a HealthShare ODS, always select HS.ODS.FHIR.Storage.InteractionsStrategy.
Use Namespace default databaseEach FHIR server has a resource database and a resource history database. The default location for these databases is in subfolders of the /mgr/ folder of your installation. If you select this checkbox, you can enter a custom location for each database in the Resource Database Location and Resource History Database Location fields.
Note:Because a FHIR repository can grow to a very large size, the FHIR server has a database expansion strategy built in. On disk, the FHIR resource database begins with an iris.dat file in a folder named:
resourceDatabaseLocation/FHIRServerNamespaceX001R
Upon expansion, additional folders containing iris.dat files are created with names that increment the number, for example:
MYFHIRSERVERX002R
Similarly, the first folder for a FHIR resource history database is named:
resourceHistoryDatabaseLocation/FHIRServerNamespaceX001V
Resource Database/Resource History DatabaseIf you did not select the default location for the FHIR server’s databases, edit the locations indicated in the Resource Database Location and Resource History Database Location fields. The resource history database contains previous versions of a resource; because these are not accessed as frequently, you could put this database on a slower, less expensive disk.
Which options appear under Interaction Strategy Settings depend upon which interaction strategy you selected under Data Organization Strategy. Select values for whichever options appear in your FHIR server installation:
SMART on FHIR CapabilitiesSpecify the server’s SMART on FHIR capabilities by entering them as a comma-delimited list into this field. This list does not control the functionality of the endpoint; rather, it specifies the capabilities that are returned in the JSON document when a client appends /.well-known/smart-configuration to the endpoint’s URL. For example:
launch-ehr, context-ehr-patient, permission-patient, client-public, client-confidential-symmetric
For more details about SMART on FHIR capabilities retrieved with Well-Known URIs, see FHIR Authorization Endpoint and Capabilities Discovery using Well-Known Uniform Resource Identifiers (URIs)Opens in a new tab.
Silence search parameter indexing errorsClick this checkbox to prevent search parameter indexing errors from aborting FHIR resource save.
Caution:Enable this setting only when strictly necessary.
Prematurely limit the number of resources...with _max_resultsClicking this checkbox makes FHIR search queries more efficient by adding a SQL operation TOP N where N is the value of the _maxresults search result parameter.
Caution:Use this setting only if you do not have PostProcessSearch() logic, since post processing filters could remove some or all of the hits from the results set, leading the query to return a number of hits fewer than _maxresults.
Refer to the hovertext for the field in the management portal for additional discussion of the tradeoffs in selecting this option.
Suppress FHIR AuditAllows a user with permissions to suppress FHIR auditing.
Functional List ConfigurationNote:The Functional List Configuration field displays only for FHIR endpoints that use or extend the HS.FHIRServer.Storage.JsonAdvSQL.InteractionsStrategyOpens in a new tab data organization strategy.
Comma-delimited string of configurations for functional lists. Each list element is a colon-delimited string of three items:
-
functional list name — the names available in the default interactions strategy are:
-
$current-problems
-
$current-medications
-
$current-allergies
-
$current-drug-allergies
-
-
list subject search parameter — can be patient, subject, or source
-
list subject resource type — for example, Patient
The default value is:
$current-problems:patient:Patient, $current-medications:patient:Patient, $current-allergies:patient:Patient, $current-drug-allergies:patient:Patient
-
-
Click Create to create the server and its associated endpoint. To start over instead, click Cancel.
It takes several minutes to create a FHIR server. When the configuration is complete, additional configuration options relating to authorization and requests become available.
If you expect to post Bundles containing 10,000 or more entries, you should increase the value of the Web Gateway Server Response Timeout parameter to avoid server timeouts interrupting your data loads.
Configuring an Existing FHIR Server
You can edit the configuration settings of an existing FHIR server using the FHIR Server Management page of the Management Portal.
-
These configuration settings can also be modified programmatically by setting the properties of the server’s ConfigData object.
-
You can also execute many of these tasks using the FHIR Server Management REST APIOpens in a new tab.
-
If you prefer, you can use a command-line interface to configure an existing FHIR server.
-
If you plan to mirror your FHIR server, see Configuring Mirroring for Healthcare Products for special instructions.
To edit the configuration settings of an existing FHIR server using the Management Portal:
-
Open the FHIR Server Management page:
-
Navigate to Home > Health and click FHIR in the banner.
-
-
In the tile for the desired server, open the menu and choose Edit.
The various configuration options are described in Basic Configuration Options and Advanced Configuration Options, below.
-
When you have finished modifying the configuration, click Save to save your changes. To start over instead, click Cancel.
If you expect to post Bundles containing 10,000 or more entries, you should increase the value of the Web Gateway Server Response Timeout parameter to avoid server timeouts interrupting your data loads.
Basic FHIR Server Configuration Options
You can modify the basic FHIR server configuration options using the following descriptions as a guide:
You cannot modify the namespace of an installed FHIR server.
Optionally change the server name in the Name field. Name is a required field when configuring a FHIR server in the Management Portal.
You cannot modify the FHIR version of an installed FHIR server.
Optionally edit the endpoint URL. Ensure that the URL begins with a slash (/).
-
If there are custom packages associated with the FHIR version of this server, you may select one from the Custom Packages dropdown.
-
If this dropdown is not present, there are no custom packages associated with this FHIR version.
For more information about packages, see Profiles and FHIR Adaptations. In particular, for information about managing packages programmatically, see Package APIs.
Enabling a custom package automatically triggers the system to re-index search tables when you save your changes.
Advanced FHIR Server Configuration Options
The Advanced Configuration pane of the dialog has four sections. Expand a section to edit the settings. Use the following descriptions as a guide.

You cannot edit the data organization strategy for an existing FHIR server. To use a different strategy, create a new server.
You cannot edit the database locations from the Management Portal once the databases contain resources.
To route FHIR requests through an interoperability production before they reach the FHIR server, select the package and name of the business service that will receive the requests. Unless the business service has a custom name, this entry is HS.FHIRServer.Interop.Service.
For a business service to appear in this dropdown, it must extend the HS.FHIRServer.Interop.ServiceOpens in a new tab class, and it must be included in an interoperability production in this namespace.
For more details, see Interoperability Productions and Adding Business Hosts.
Specifies the application (client) name that the FHIR server, as an OAuth resource server, uses to contact the OAuth 2.0 authorization server. Choose the desired OAuth client name from the dropdown list. For more information about OAuth 2.0 support, see OAuth 2.0 Authorization.
To configure the FHIR server such that a FHIR client requires a particular resource in order to send a request, select that resource from the dropdown.
Search result page size to use when a search does not contain a _count parameter.
Maximum search result page size to prevent an excessive user-specified page size.
Maximum number of resources that can be selected by a search before the server responds to the query with an error. This number only includes resources selected by the actual search; it does not include resources included using an _include search parameter. This value does not affect the size of pages returned by a search. Overly broad searches that select large numbers of resources take a lot of system resources to fulfill, and are probably more broad than the client actually needs.
Specifies what happens by default when a search request contains an unknown parameter:
-
To ignore an unknown parameter in a search request and return a bundle in which the OperationOutcome resource identifies the issue, specify lenient.
-
To reject a search request with an unknown parameter and return an error, specify strict.
A FHIR search request that includes the “prefer headerOpens in a new tab” overrides this default.
Maximum allowable number of resources to delete using conditional delete. If the conditional delete search finds more than this number of resources, then the conditional delete as a whole is rejected with an HTTP 412 “Precondition Failed” error.
Maximum number of seconds between requests to the service before any session data is considered stale.
When a client appends /.well-known/smart-configuration to the endpoint’s URL, a JSON document is returned that specifies the SMART on FHIR capabilities of the FHIR server. Specify those capabilities here by entering them as a comma-delimited list into this field. This list does not control the functionality of the endpoint, just the content returned in the JSON document.
For more details about SMART on FHIR capabilities retrieved with Well-Known URIs, see FHIR Authorization Endpoint and Capabilities Discovery using Well-Known Uniform Resource Identifiers (URIs)Opens in a new tab.
Click this checkbox to prevent search parameter indexing errors from aborting FHIR resource Save.
Enable this setting only when necessary.
The Functional List Configuration field displays only for FHIR endpoints that use or extend the HS.FHIRServer.Storage.JsonAdvSQL.InteractionsStrategyOpens in a new tab Data Organization Strategy.
Comma-delimited string of configurations for functional lists. Each list element is a colon-delimited string of three items:
-
functional list name — the names available in the default interactions strategy are:
-
$current-problems
-
$current-medications
-
$current-allergies
-
$current-drug-allergies
-
-
list subject search parameter — can be patient, subject, or source
-
list subject resource type — for example, Patient
The default value is:
$current-problems:patient:Patient,
$current-medications:patient:Patient,
$current-allergies:patient:Patient,
$current-drug-allergies:patient:Patient
Resetting a FHIR Server
You can reset a FHIR server. This deletes all data from the server but leaves the server itself intact.
Follow these steps to reset a FHIR server using the Management Portal:
-
Open the FHIR Server Management page:
-
Navigate to Home > Health and click FHIR in the banner.
-
-
In the tile for the server associated with the desired endpoint, open the menu and choose Reset.
-
In the Reset FHIR Data dialog that appears, click Execute.
Deleting a FHIR Endpoint
You can use the Management Portal either to delete both the FHIR server endpoint and the associated the FHIR data, or to just decommission the endpoint and retain the FHIR data.
-
You can decommission a FHIR endpoint programmatically by calling the DecommissionInstance()Opens in a new tab method of HS.FHIRServer.InstallerOpens in a new tab.
-
You can uninstall a FHIR endpoint programmatically by calling the UninstallInstance()Opens in a new tab method of HS.FHIRServer.InstallerOpens in a new tab.
-
You can also delete or decommission a FHIR endpoint using the FHIR Server Management REST APIOpens in a new tab.
-
If you prefer, you can use a command-line interface to delete or decommission a FHIR server.
To delete or decommission a FHIR endpoint using the Management Portal:
-
Open the FHIR Server Management page:
-
Navigate to Home > Health and click FHIR in the banner.
-
-
In the tile for the server associated with the desired endpoint, open the menu and choose Delete.
-
Decide whether to remove all data along with the endpoint, and select the corresponding radio button. The deletion options are:
-
Remove all data from the repository, delete the endpoint and FHIR server.
-
Decommission FHIR endpoint, don’t remove data.
-
-
Click Execute.
Installing a FHIR Server Programmatically
An application can install a FHIR server programmatically. The FHIR server must be installed first, only then can it be configured.
-
A FHIR server must run in a foundation namespace, therefore creating a foundation namespace is a prerequisite to installing a FHIR server.
-
You can also install a FHIR server programmatically using the FHIR Server Management REST APIOpens in a new tab.
Once you have a foundation namespace, call the methods of HS.FHIRServer.InstallerOpens in a new tab in the order shown below:
Prepares an existing foundation namespace for the FHIR server (it does not create a new foundation namespace). If called without an argument, the installer assumes that the active namespace is a foundation namespace and prepares it for the FHIR server.
Installs an instance of a FHIR Service into the current namespace. This method requires the following arguments:
-
Unique URL of the FHIR endpoint. Be sure the URL begins with a slash (/).
-
Classname of the FHIR server’s InteractionsStrategy.
-
List of FHIR packages, for example, the package for an Implementation Guide like US Core. For details, see pPackageList parameter.
There are also optional parameters that can be passed to the method. For complete details on these optional parameters, see InstallInstance()Opens in a new tab in the class reference.
pPackageList Parameter
The pPackageList parameter of the InstallInstance()Opens in a new tab method accepts a list of FHIR packages that have been loaded into the system. Often, a package corresponds to a specific Implementation GuideOpens in a new tab, but can also be the core metadata for a version of FHIR. By passing a list of packages to InstallInstance, you can configure an endpoint to support one or more packages. For more about packages, see Profiles and FHIR Adaptations.
To obtain a list of the packages that can be passed into the pPackageList parameter, use the GetAllPackages()Opens in a new tab method in HS.FHIRMeta.Storage.PackageOpens in a new tab. For example, the following code displays the identifiers of the available packages
set packages = ##class(HS.FHIRMeta.Storage.Package).GetAllPackages()
for i=1:1:packages.Count()
{ write packages.GetAt(i).id,! }
The result might look like:
hl7.fhir.r5.core@5.0.0
hl7.fhir.r4.core@4.0.1
hl7.fhir.us.core@3.1.0
hl7.fhir.r3.core@3.0.2
Pass in the appropriate package identifiers as arguments to the pPackageList parameter of InstallInstance()Opens in a new tab using $lb. For example:
Do ##class(HS.FHIRServer.Installer).InstallInstance(
myURL,
strategyClass,
$lb("hl7.fhir.r5.core@5.0.0"))
For details about the APIs used to create FHIR packages, see Package APIs.
Programmatic FHIR Server Install Example
The following ObjectScript code example installs a FHIR server that supports one package and uses the default storage strategy (Resource Repository).
Set appKey = "/myfhirserver/fhir/r5"
Set strategyClass = "HS.FHIRServer.Storage.JsonAdvSQL.InteractionsStrategy"
Set metadataPackages = $lb("hl7.fhir.r5.core@5.0.0")
//Install a Foundation namespace and change to it
Do ##class(HS.Util.Installer.Foundation).Install("FHIRNamespace")
Set $namespace = "FHIRNamespace"
// Install elements that are required for a FHIR-enabled namespace
Do ##class(HS.FHIRServer.Installer).InstallNamespace()
// Install an instance of a FHIR Service into the current namespace
Do ##class(HS.FHIRServer.Installer).InstallInstance(appKey, strategyClass, metadataPackages)
Configuring a FHIR Server Programmatically
You can also install a FHIR server programmatically using the FHIR Server Management REST APIOpens in a new tab.
Once you have installed a FHIR server, it can be configured programmatically using the UpdateInstance()Opens in a new tab method of HS.FHIRServer.InstallerOpens in a new tab. This method accepts several arguments that configure the server, including one that accepts the server’s HS.FHIRServer.API.ConfigDataOpens in a new tab object, which contains most of the server’s configuration options.
In addition to the options defined with the ConfigDataOpens in a new tab object, a few of the server’s settings (serviceConfigName, OAuthClient name, and enabled) are specified using a dedicated parameter of the UpdateInstance() method (as shown in the example below). For a list of these configuration options, see the class reference description for UpdateInstance()Opens in a new tab.
The following code configures an existing FHIR server using the UpdateInstance() method.
Set appKey = "/fhirendpoint/r5"
//Get and modify FHIR server's configuration object
Set strategy = ##class(HS.FHIRServer.API.InteractionsStrategy).GetStrategyForEndpoint(appKey)
Set configData = strategy.GetServiceConfigData()
Set configData.DefaultPreferHandling = "strict"
Set configData.DebugMode = 1
//stringify configData before updating FHIR Server
Set jsonConfigData = configData.AsJSONString()
// Define additional settings
Set enabled = 1
Set serviceConfigName = "HS.InteropPackage.myBusinessService"
Set oAuthClient = "OAuthClientName"
// Update FHIR Server
Do ##class(HS.FHIRServer.Installer).UpdateInstance(appKey, jsonConfigData, enabled, serviceConfigName, oAuthClient)
Like all InterSystems IRIS APIs that act on code in a repository, HS.FHIRServer.Installer.UpdateInstance()Opens in a new tab locks the repository to prevent simultaneous configuration activities and holds the lock until configuration is complete. Before performing configuration tasks on your FHIR server using methods other than InterSystems IRIS APIs, execute the Lock() method of the HS.FHIRServer.RepoOpens in a new tab class to lock the repository explicitly, as follows: ##class(HS.FHIRServer.Repo).Lock(). If you completely override an InterSystems IRIS method, remember to use the Lock() method to prevent conflicts.
FHIR Server Command Line Configuration Options
Developers who prefer a command line interface to the Management Portal can use Console Setup in the InterSystems Terminal to perform many of the same actions that are available in the user interface. To run the Console Setup, open the InterSystems Terminal and run:
do ##class(HS.FHIRServer.ConsoleSetup).Setup()
The following sections describe each option that is available in the Console Setup.
Installs a new FHIR server endpoint. You are presented with the following prompts:
-
Choose the Storage Strategy — Json is the Resource Repository.
-
Choose the FHIR version for this endpoint — Select the version of the core FHIR specification that your endpoint supports.
-
Enter any package numbers — Packages that have been imported are listed as possibilities. The endpoint can support multiple packages; to specify more than one package, separate the numbers by commas. You can add additional packages later, but you might need to run additional steps if you wait. Use the Upload a FHIR Metadata Package option to add a package to the list.
-
Do you want to create the default repository endpoint — Press Enter if you want to accept the default URL of the endpoint. If you want your endpoint to have a different URL, specify N, and enter the URL (be sure the URL begins with a slash).
-
Enter the OAuth Client Name for this Endpoint — If you are using OAuth 2.0 to secure the endpoint, enter the Client Name of the FHIR server. (From the point of view of an OAuth 2.0 authentication server, the FHIR server is a client whose type is a resource server.) For more information, see OAuth 2.0 Authorization.
-
Do you want to create separate database files for your FHIR data? — If you specify yes, FHIR data for the endpoint is stored separately from the FHIR data of other endpoints in the same namespace. If you specify no, all FHIR data is stored in the namespace’s database files, even if you have multiple endpoints. If you are creating separate database files, you can accept the default locations or specify alternate locations. The Versions Database contains previous versions of a resource; because these are not accessed as frequently, you could put the Versions Database on a slower, less expensive disk.
Adds a FHIR package to an existing endpoint so it can support the package’s profiles, search parameters, and other conformance resources. The FHIR package (an NPM-like package) that contains the conformance resources must be uploaded before you can use this option. You can use the Upload a FHIR Metadata Package option to import the FHIR package. Some common packages, for example the US Core Implementation Guide, are already available.
Note that enabling a package triggers the system to re-index search tables.
Displays the current configuration options of the FHIR server. To modify these configuration options, use the Configure a FHIRServer Endpoint option.
Allows you to configure the FHIR server endpoint by providing values for each configuration option. For a description of each configuration item, see Configuring a FHIR Server.
Deletes a FHIR server endpoint, but retains the FHIR data that has been collected by the endpoint. The SQL tables containing the FHIR data are retained. If you want to delete the endpoint and all of the FHIR data, use the Delete a FHIRServer Endpoint option.
Deletes a FHIR server endpoint and deletes the endpoint’s FHIR data. If you want to delete the endpoint, but retain the FHIR data that has been collected by the endpoint, use the Decommission a FHIRServer Endpoint option.
Updates the Capability Statement of the FHIR server. For more details, see Modifying the Capability Statement.
When you add new search parameters to an existing endpoint using a published or custom package, FHIR clients can use the new parameter to retrieve resources added to the repository after you applied the package. However, resources that existed before you added the new search parameter will not be returned until you re-index the endpoint. If an endpoint has collected a large volume of FHIR data, this option can take a long time to run as it re-processes all existing resources.
Used to import a FHIR package of JSON files that define conformance resources. You must use this option before the package can be applied to an endpoint. For information about preparing a custom FHIR package for uploading, see Creating a Custom Package.
Deletes a package from the list of available packages that can be applied to an endpoint. This does not delete the FHIR package’s JSON files from your local system. You cannot delete packages that have been applied to an endpoint.
Configuring the Profile Validation Server
When you create a FHIR endpoint, an external server named FHIR_Validation_Server is created to perform back-end functions related to profile validation. This server requires a Java 11 development kit. If your JAVA_HOME environment variable does not point to a Java 11 directory, you can use the Management Portal as follows:
-
If necessary, install a supported Java 11 JDK. Make a note of the directory where it has been installed.
-
In the Management Portal, navigate to System Administration > Configuration > Connectivity > External Language Servers.
-
If the FHIR_Validation_Server is running, click Stop.
-
Enter edit mode by clicking FHIR_Validation_Server.
-
On the Edit External Language Server page, in the Java Home Directory field, enter the path to your Java 11 directory.
-
Click Save.
-
Restart the FHIR_Validation_Server by clicking Start.
-
To ensure good performance when you execute validation operations related to previously-imported profiles (including those that are automatically imported), in the Terminal application, switch to your FHIR-enabled namespace and execute the following command:
do ##class(HS.FHIRServer.Installer).InitializeProfileValidator()
Do not set the JAVA_HOME environment variable directly to enable the FHIR_Validation_Server; doing so could affect other applications and processes that may rely on the previous value of JAVA_HOME.
Optimizing FHIR Server Search Performance
For a FHIR server that uses or extends the Resource Repository, you can optimize the performance of search interaction responses by running the Tune Table utility on the SQL search tables generated for that endpoint. By default, the names of these tables begin with HSFHIR. You can also set custom selectivity values for these tables manually.
When you install a new FHIR server that uses or extends the Resource Repository, a set of default selectivity values are assigned to searchable elements based on the element’s data type. These default selectivity values allow the server to select more efficient query plans when it retrieves resources in response to a search request. Selecting prospective results by beginning with the most selective query parameter minimizes the number of resources each subsequent selection operation must evaluate.
For example, consider the following search request:
GET [base]/Patient?family=halifax&gender=male
Probably, the Resource Repository contains fewer patients with the family name Halifax than patients who are male. Therefore, it is probably most efficient to find the Patients with the family name Halifax first, because then the operation to find males will only have to search through the small subset of patients named Halifax.
If you have upgraded to this version from a version prior to 2023.1 and you are using a preexisting FHIR server, you can set these default selectivity values for your search operations using the SetDefaultSearchTableSelectivities()Opens in a new tab method. Invoke this method in the Terminal, providing the relative path for your FHIR endpoint, as in the following example:
do ##class(HS.FHIRServer.Storage.SearchTableBuilder).SetDefaultSearchTableSelectivities("/csp/healthshare/hsods/fhir/r5")
However, for most preexisting FHIR servers, selectivity values generated by Tune Table are more useful than the default selectivity values set by this method.
The SetDefaultSearchTableSelectivities()Opens in a new tab method overwrites all existing optimizations made manually or using the Tune Table utility.