cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
1,702 lines • 173 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Iotwireless = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [iotwireless](https://docs.aws.amazon.com/service-authorization/latest/reference/list_iotwireless.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Iotwireless extends shared_1.PolicyStatement {
/**
* Grants permission to link partner accounts with AWS account
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_AssociateAwsAccountWithPartnerAccount.html
*/
toAssociateAwsAccountWithPartnerAccount() {
return this.to('AssociateAwsAccountWithPartnerAccount');
}
/**
* Grants permission to associate the MulticastGroup with FuotaTask
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_AssociateMulticastGroupWithFuotaTask.html
*/
toAssociateMulticastGroupWithFuotaTask() {
return this.to('AssociateMulticastGroupWithFuotaTask');
}
/**
* Grants permission to associate the wireless device with FuotaTask
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_AssociateWirelessDeviceWithFuotaTask.html
*/
toAssociateWirelessDeviceWithFuotaTask() {
return this.to('AssociateWirelessDeviceWithFuotaTask');
}
/**
* Grants permission to associate the WirelessDevice with MulticastGroup
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_AssociateWirelessDeviceWithMulticastGroup.html
*/
toAssociateWirelessDeviceWithMulticastGroup() {
return this.to('AssociateWirelessDeviceWithMulticastGroup');
}
/**
* Grants permission to associate the wireless device with AWS IoT thing for a given wirelessDeviceId
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_AssociateWirelessDeviceWithThing.html
*/
toAssociateWirelessDeviceWithThing() {
return this.to('AssociateWirelessDeviceWithThing');
}
/**
* Grants permission to associate a WirelessGateway with the IoT Core Identity certificate
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_AssociateWirelessGatewayWithCertificate.html
*/
toAssociateWirelessGatewayWithCertificate() {
return this.to('AssociateWirelessGatewayWithCertificate');
}
/**
* Grants permission to associate the wireless gateway with AWS IoT thing for a given wirelessGatewayId
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_AssociateWirelessGatewayWithThing.html
*/
toAssociateWirelessGatewayWithThing() {
return this.to('AssociateWirelessGatewayWithThing');
}
/**
* Grants permission to cancel the MulticastGroup session
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CancelMulticastGroupSession.html
*/
toCancelMulticastGroupSession() {
return this.to('CancelMulticastGroupSession');
}
/**
* Grants permission to create a Destination resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateDestination.html
*/
toCreateDestination() {
return this.to('CreateDestination');
}
/**
* Grants permission to create a DeviceProfile resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateDeviceProfile.html
*/
toCreateDeviceProfile() {
return this.to('CreateDeviceProfile');
}
/**
* Grants permission to create a FuotaTask resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateFuotaTask.html
*/
toCreateFuotaTask() {
return this.to('CreateFuotaTask');
}
/**
* Grants permission to create a MulticastGroup resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateMulticastGroup.html
*/
toCreateMulticastGroup() {
return this.to('CreateMulticastGroup');
}
/**
* Grants permission to create a NetworkAnalyzerConfiguration resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateNetworkAnalyzerConfiguration.html
*/
toCreateNetworkAnalyzerConfiguration() {
return this.to('CreateNetworkAnalyzerConfiguration');
}
/**
* Grants permission to create a ServiceProfile resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateServiceProfile.html
*/
toCreateServiceProfile() {
return this.to('CreateServiceProfile');
}
/**
* Grants permission to create a WirelessDevice resource with given Destination
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateWirelessDevice.html
*/
toCreateWirelessDevice() {
return this.to('CreateWirelessDevice');
}
/**
* Grants permission to create a WirelessGateway resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateWirelessGateway.html
*/
toCreateWirelessGateway() {
return this.to('CreateWirelessGateway');
}
/**
* Grants permission to create a task for a given WirelessGateway
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateWirelessGatewayTask.html
*/
toCreateWirelessGatewayTask() {
return this.to('CreateWirelessGatewayTask');
}
/**
* Grants permission to create a WirelessGateway task definition
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateWirelessGatewayTaskDefinition.html
*/
toCreateWirelessGatewayTaskDefinition() {
return this.to('CreateWirelessGatewayTaskDefinition');
}
/**
* Grants permission to delete a Destination
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteDestination.html
*/
toDeleteDestination() {
return this.to('DeleteDestination');
}
/**
* Grants permission to delete a DeviceProfile
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteDeviceProfile.html
*/
toDeleteDeviceProfile() {
return this.to('DeleteDeviceProfile');
}
/**
* Grants permission to delete the FuotaTask
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteFuotaTask.html
*/
toDeleteFuotaTask() {
return this.to('DeleteFuotaTask');
}
/**
* Grants permission to delete the MulticastGroup
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteMulticastGroup.html
*/
toDeleteMulticastGroup() {
return this.to('DeleteMulticastGroup');
}
/**
* Grants permission to delete the NetworkAnalyzerConfiguration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteNetworkAnalyzerConfiguration.html
*/
toDeleteNetworkAnalyzerConfiguration() {
return this.to('DeleteNetworkAnalyzerConfiguration');
}
/**
* Grants permission to delete QueuedMessages
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteQueuedMessages.html
*/
toDeleteQueuedMessages() {
return this.to('DeleteQueuedMessages');
}
/**
* Grants permission to delete a ServiceProfile
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteServiceProfile.html
*/
toDeleteServiceProfile() {
return this.to('DeleteServiceProfile');
}
/**
* Grants permission to delete a WirelessDevice
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteWirelessDevice.html
*/
toDeleteWirelessDevice() {
return this.to('DeleteWirelessDevice');
}
/**
* Grants permission to delete the wireless device import task
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteWirelessDeviceImportTask.html
*/
toDeleteWirelessDeviceImportTask() {
return this.to('DeleteWirelessDeviceImportTask');
}
/**
* Grants permission to delete a WirelessGateway
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteWirelessGateway.html
*/
toDeleteWirelessGateway() {
return this.to('DeleteWirelessGateway');
}
/**
* Grants permission to delete task for a given WirelessGateway
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteWirelessGatewayTask.html
*/
toDeleteWirelessGatewayTask() {
return this.to('DeleteWirelessGatewayTask');
}
/**
* Grants permission to delete a WirelessGateway task definition
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeleteWirelessGatewayTaskDefinition.html
*/
toDeleteWirelessGatewayTaskDefinition() {
return this.to('DeleteWirelessGatewayTaskDefinition');
}
/**
* Grants permission to deregister wireless device
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DeregisterWirelessDevice.html
*/
toDeregisterWirelessDevice() {
return this.to('DeregisterWirelessDevice');
}
/**
* Grants permission to disassociate an AWS account from a partner account
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DisassociateAwsAccountFromPartnerAccount.html
*/
toDisassociateAwsAccountFromPartnerAccount() {
return this.to('DisassociateAwsAccountFromPartnerAccount');
}
/**
* Grants permission to disassociate the MulticastGroup from FuotaTask
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DisassociateMulticastGroupFromFuotaTask.html
*/
toDisassociateMulticastGroupFromFuotaTask() {
return this.to('DisassociateMulticastGroupFromFuotaTask');
}
/**
* Grants permission to disassociate the wireless device from FuotaTask
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DisassociateWirelessDeviceFromFuotaTask.html
*/
toDisassociateWirelessDeviceFromFuotaTask() {
return this.to('DisassociateWirelessDeviceFromFuotaTask');
}
/**
* Grants permission to disassociate the wireless device from MulticastGroup
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DisassociateWirelessDeviceFromMulticastGroup.html
*/
toDisassociateWirelessDeviceFromMulticastGroup() {
return this.to('DisassociateWirelessDeviceFromMulticastGroup');
}
/**
* Grants permission to disassociate a wireless device from a AWS IoT thing
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DisassociateWirelessDeviceFromThing.html
*/
toDisassociateWirelessDeviceFromThing() {
return this.to('DisassociateWirelessDeviceFromThing');
}
/**
* Grants permission to disassociate a WirelessGateway from a IoT Core Identity certificate
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DisassociateWirelessGatewayFromCertificate.html
*/
toDisassociateWirelessGatewayFromCertificate() {
return this.to('DisassociateWirelessGatewayFromCertificate');
}
/**
* Grants permission to disassociate a WirelessGateway from a IoT Core thing
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_DisassociateWirelessGatewayFromThing.html
*/
toDisassociateWirelessGatewayFromThing() {
return this.to('DisassociateWirelessGatewayFromThing');
}
/**
* Grants permission to get the Destination
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetDestination.html
*/
toGetDestination() {
return this.to('GetDestination');
}
/**
* Grants permission to get the DeviceProfile
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetDeviceProfile.html
*/
toGetDeviceProfile() {
return this.to('GetDeviceProfile');
}
/**
* Grants permission to get event configuration by resource types
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetEventConfigurationByResourceTypes.html
*/
toGetEventConfigurationByResourceTypes() {
return this.to('GetEventConfigurationByResourceTypes');
}
/**
* Grants permission to get the FuotaTask
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetFuotaTask.html
*/
toGetFuotaTask() {
return this.to('GetFuotaTask');
}
/**
* Grants permission to get log levels by resource types
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetLogLevelsByResourceTypes.html
*/
toGetLogLevelsByResourceTypes() {
return this.to('GetLogLevelsByResourceTypes');
}
/**
* Grants permission to get metric configuration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetMetricConfiguration.html
*/
toGetMetricConfiguration() {
return this.to('GetMetricConfiguration');
}
/**
* Grants permission to get metrics
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetMetrics.html
*/
toGetMetrics() {
return this.to('GetMetrics');
}
/**
* Grants permission to get the MulticastGroup
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetMulticastGroup.html
*/
toGetMulticastGroup() {
return this.to('GetMulticastGroup');
}
/**
* Grants permission to get the MulticastGroup session
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetMulticastGroupSession.html
*/
toGetMulticastGroupSession() {
return this.to('GetMulticastGroupSession');
}
/**
* Grants permission to get the NetworkAnalyzerConfiguration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetNetworkAnalyzerConfiguration.html
*/
toGetNetworkAnalyzerConfiguration() {
return this.to('GetNetworkAnalyzerConfiguration');
}
/**
* Grants permission to get the associated PartnerAccount
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetPartnerAccount.html
*/
toGetPartnerAccount() {
return this.to('GetPartnerAccount');
}
/**
* Grants permission to get position for a given resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetPosition.html
*/
toGetPosition() {
return this.to('GetPosition');
}
/**
* Grants permission to get position configuration for a given resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetPositionConfiguration.html
*/
toGetPositionConfiguration() {
return this.to('GetPositionConfiguration');
}
/**
* Grants permission to get position estimate
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetPositionEstimate.html
*/
toGetPositionEstimate() {
return this.to('GetPositionEstimate');
}
/**
* Grants permission to get an event configuration for an identifier
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetResourceEventConfiguration.html
*/
toGetResourceEventConfiguration() {
return this.to('GetResourceEventConfiguration');
}
/**
* Grants permission to get resource log level
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetResourceLogLevel.html
*/
toGetResourceLogLevel() {
return this.to('GetResourceLogLevel');
}
/**
* Grants permission to get position for a given resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetResourcePosition.html
*/
toGetResourcePosition() {
return this.to('GetResourcePosition');
}
/**
* Grants permission to retrieve the customer account specific endpoint for CUPS protocol connection or LoRaWAN Network Server (LNS) protocol connection, and optionally server trust certificate in PEM format
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetServiceEndpoint.html
*/
toGetServiceEndpoint() {
return this.to('GetServiceEndpoint');
}
/**
* Grants permission to get the ServiceProfile
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetServiceProfile.html
*/
toGetServiceProfile() {
return this.to('GetServiceProfile');
}
/**
* Grants permission to get the WirelessDevice
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetWirelessDevice.html
*/
toGetWirelessDevice() {
return this.to('GetWirelessDevice');
}
/**
* Grants permission to get the wireless device import task
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetWirelessDeviceImportTask.html
*/
toGetWirelessDeviceImportTask() {
return this.to('GetWirelessDeviceImportTask');
}
/**
* Grants permission to get statistics info for a given WirelessDevice
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetWirelessDeviceStatistics.html
*/
toGetWirelessDeviceStatistics() {
return this.to('GetWirelessDeviceStatistics');
}
/**
* Grants permission to get the WirelessGateway
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetWirelessGateway.html
*/
toGetWirelessGateway() {
return this.to('GetWirelessGateway');
}
/**
* Grants permission to get the IoT Core Identity certificate id associated with the WirelessGateway
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetWirelessGatewayCertificate.html
*/
toGetWirelessGatewayCertificate() {
return this.to('GetWirelessGatewayCertificate');
}
/**
* Grants permission to get Current firmware version and other information for the WirelessGateway
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetWirelessGatewayFirmwareInformation.html
*/
toGetWirelessGatewayFirmwareInformation() {
return this.to('GetWirelessGatewayFirmwareInformation');
}
/**
* Grants permission to get statistics info for a given WirelessGateway
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetWirelessGatewayStatistics.html
*/
toGetWirelessGatewayStatistics() {
return this.to('GetWirelessGatewayStatistics');
}
/**
* Grants permission to get the task for a given WirelessGateway
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetWirelessGatewayTask.html
*/
toGetWirelessGatewayTask() {
return this.to('GetWirelessGatewayTask');
}
/**
* Grants permission to get the given WirelessGateway task definition
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_GetWirelessGatewayTaskDefinition.html
*/
toGetWirelessGatewayTaskDefinition() {
return this.to('GetWirelessGatewayTaskDefinition');
}
/**
* Grants permission to list information of available Destinations based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListDestinations.html
*/
toListDestinations() {
return this.to('ListDestinations');
}
/**
* Grants permission to list information of available DeviceProfiles based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListDeviceProfiles.html
*/
toListDeviceProfiles() {
return this.to('ListDeviceProfiles');
}
/**
* Grants permission to list information of devices by wireless device import task based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListDevicesForWirelessDeviceImportTask.html
*/
toListDevicesForWirelessDeviceImportTask() {
return this.to('ListDevicesForWirelessDeviceImportTask');
}
/**
* Grants permission to list information of available event configurations based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListEventConfigurations.html
*/
toListEventConfigurations() {
return this.to('ListEventConfigurations');
}
/**
* Grants permission to list information of available FuotaTasks based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListFuotaTasks.html
*/
toListFuotaTasks() {
return this.to('ListFuotaTasks');
}
/**
* Grants permission to list information of available MulticastGroups based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListMulticastGroups.html
*/
toListMulticastGroups() {
return this.to('ListMulticastGroups');
}
/**
* Grants permission to list information of available MulticastGroups by FuotaTask based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListMulticastGroupsByFuotaTask.html
*/
toListMulticastGroupsByFuotaTask() {
return this.to('ListMulticastGroupsByFuotaTask');
}
/**
* Grants permission to list information of available NetworkAnalyzerConfigurations based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListNetworkAnalyzerConfigurations.html
*/
toListNetworkAnalyzerConfigurations() {
return this.to('ListNetworkAnalyzerConfigurations');
}
/**
* Grants permission to list the available partner accounts
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListPartnerAccounts.html
*/
toListPartnerAccounts() {
return this.to('ListPartnerAccounts');
}
/**
* Grants permission to list information of available position configurations based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListPositionConfigurations.html
*/
toListPositionConfigurations() {
return this.to('ListPositionConfigurations');
}
/**
* Grants permission to list the Queued Messages
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListQueuedMessages.html
*/
toListQueuedMessages() {
return this.to('ListQueuedMessages');
}
/**
* Grants permission to list information of available ServiceProfiles based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListServiceProfiles.html
*/
toListServiceProfiles() {
return this.to('ListServiceProfiles');
}
/**
* Grants permission to list all tags for a given resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to list wireless device import tasks information of based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListWirelessDeviceImportTasks.html
*/
toListWirelessDeviceImportTasks() {
return this.to('ListWirelessDeviceImportTasks');
}
/**
* Grants permission to list information of available WirelessDevices based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListWirelessDevices.html
*/
toListWirelessDevices() {
return this.to('ListWirelessDevices');
}
/**
* Grants permission to list information of available WirelessGateway task definitions based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListWirelessGatewayTaskDefinitions.html
*/
toListWirelessGatewayTaskDefinitions() {
return this.to('ListWirelessGatewayTaskDefinitions');
}
/**
* Grants permission to list information of available WirelessGateways based on the AWS account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ListWirelessGateways.html
*/
toListWirelessGateways() {
return this.to('ListWirelessGateways');
}
/**
* Grants permission to put position configuration for a given resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_PutPositionConfiguration.html
*/
toPutPositionConfiguration() {
return this.to('PutPositionConfiguration');
}
/**
* Grants permission to put resource log level
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_PutResourceLogLevel.html
*/
toPutResourceLogLevel() {
return this.to('PutResourceLogLevel');
}
/**
* Grants permission to reset all resource log levels
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ResetAllResourceLogLevels.html
*/
toResetAllResourceLogLevels() {
return this.to('ResetAllResourceLogLevels');
}
/**
* Grants permission to reset resource log level
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_ResetResourceLogLevel.html
*/
toResetResourceLogLevel() {
return this.to('ResetResourceLogLevel');
}
/**
* Grants permission to send data to the MulticastGroup
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_SendDataToMulticastGroup.html
*/
toSendDataToMulticastGroup() {
return this.to('SendDataToMulticastGroup');
}
/**
* Grants permission to send the decrypted application data frame to the target device
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_SendDataToWirelessDevice.html
*/
toSendDataToWirelessDevice() {
return this.to('SendDataToWirelessDevice');
}
/**
* Grants permission to associate the WirelessDevices with MulticastGroup
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_StartBulkAssociateWirelessDeviceWithMulticastGroup.html
*/
toStartBulkAssociateWirelessDeviceWithMulticastGroup() {
return this.to('StartBulkAssociateWirelessDeviceWithMulticastGroup');
}
/**
* Grants permission to bulk disassociate the WirelessDevices from MulticastGroup
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_StartBulkDisassociateWirelessDeviceFromMulticastGroup.html
*/
toStartBulkDisassociateWirelessDeviceFromMulticastGroup() {
return this.to('StartBulkDisassociateWirelessDeviceFromMulticastGroup');
}
/**
* Grants permission to start the FuotaTask
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_StartFuotaTask.html
*/
toStartFuotaTask() {
return this.to('StartFuotaTask');
}
/**
* Grants permission to start the MulticastGroup session
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_StartMulticastGroupSession.html
*/
toStartMulticastGroupSession() {
return this.to('StartMulticastGroupSession');
}
/**
* Grants permission to start NetworkAnalyzer stream
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot/latest/developerguide/connect-iot-lorawan-network-analyzer-api.html
*/
toStartNetworkAnalyzerStream() {
return this.to('StartNetworkAnalyzerStream');
}
/**
* Grants permission to start the single wireless device import task
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_StartSingleWirelessDeviceImportTask.html
*/
toStartSingleWirelessDeviceImportTask() {
return this.to('StartSingleWirelessDeviceImportTask');
}
/**
* Grants permission to start the wireless device import task
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_StartWirelessDeviceImportTask.html
*/
toStartWirelessDeviceImportTask() {
return this.to('StartWirelessDeviceImportTask');
}
/**
* Grants permission to tag a given resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to simulate a provisioned device to send an uplink data with payload of 'Hello'
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_TestWirelessDevice.html
*/
toTestWirelessDevice() {
return this.to('TestWirelessDevice');
}
/**
* Grants permission to remove the given tags from the resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update a Destination resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateDestination.html
*/
toUpdateDestination() {
return this.to('UpdateDestination');
}
/**
* Grants permission to update event configuration by resource types
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateEventConfigurationByResourceTypes.html
*/
toUpdateEventConfigurationByResourceTypes() {
return this.to('UpdateEventConfigurationByResourceTypes');
}
/**
* Grants permission to update the FuotaTask
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateFuotaTask.html
*/
toUpdateFuotaTask() {
return this.to('UpdateFuotaTask');
}
/**
* Grants permission to update log levels by resource types
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateLogLevelsByResourceTypes.html
*/
toUpdateLogLevelsByResourceTypes() {
return this.to('UpdateLogLevelsByResourceTypes');
}
/**
* Grants permission to update metric configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateMetricConfiguration.html
*/
toUpdateMetricConfiguration() {
return this.to('UpdateMetricConfiguration');
}
/**
* Grants permission to update the MulticastGroup
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateMulticastGroup.html
*/
toUpdateMulticastGroup() {
return this.to('UpdateMulticastGroup');
}
/**
* Grants permission to update the NetworkAnalyzerConfiguration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateNetworkAnalyzerConfiguration.html
*/
toUpdateNetworkAnalyzerConfiguration() {
return this.to('UpdateNetworkAnalyzerConfiguration');
}
/**
* Grants permission to update a partner account
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdatePartnerAccount.html
*/
toUpdatePartnerAccount() {
return this.to('UpdatePartnerAccount');
}
/**
* Grants permission to update position for a given resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdatePosition.html
*/
toUpdatePosition() {
return this.to('UpdatePosition');
}
/**
* Grants permission to update an event configuration for an identifier
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateResourceEventConfiguration.html
*/
toUpdateResourceEventConfiguration() {
return this.to('UpdateResourceEventConfiguration');
}
/**
* Grants permission to update position for a given resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateResourcePosition.html
*/
toUpdateResourcePosition() {
return this.to('UpdateResourcePosition');
}
/**
* Grants permission to update a WirelessDevice resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateWirelessDevice.html
*/
toUpdateWirelessDevice() {
return this.to('UpdateWirelessDevice');
}
/**
* Grants permission to update a wireless device import task
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateWirelessDeviceImportTask.html
*/
toUpdateWirelessDeviceImportTask() {
return this.to('UpdateWirelessDeviceImportTask');
}
/**
* Grants permission to update a WirelessGateway resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_UpdateWirelessGateway.html
*/
toUpdateWirelessGateway() {
return this.to('UpdateWirelessGateway');
}
/**
* Adds a resource of type Destination to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateDestination.html
*
* @param destinationName - Identifier for the destinationName.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onDestination(destinationName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:Destination/${destinationName}`);
}
/**
* Adds a resource of type DeviceProfile to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateDeviceProfile.html
*
* @param deviceProfileId - Identifier for the deviceProfileId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onDeviceProfile(deviceProfileId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:DeviceProfile/${deviceProfileId}`);
}
/**
* Adds a resource of type FuotaTask to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateFuotaTask.html
*
* @param fuotaTaskId - Identifier for the fuotaTaskId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onFuotaTask(fuotaTaskId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:FuotaTask/${fuotaTaskId}`);
}
/**
* Adds a resource of type ImportTask to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_StartWirelessDeviceImportTask.html
*
* @param importTaskId - Identifier for the importTaskId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onImportTask(importTaskId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:ImportTask/${importTaskId}`);
}
/**
* Adds a resource of type MulticastGroup to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateMulticastGroup.html
*
* @param multicastGroupId - Identifier for the multicastGroupId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onMulticastGroup(multicastGroupId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:MulticastGroup/${multicastGroupId}`);
}
/**
* Adds a resource of type NetworkAnalyzerConfiguration to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateNetworkAnalyzerConfiguration.html
*
* @param networkAnalyzerConfigurationName - Identifier for the networkAnalyzerConfigurationName.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onNetworkAnalyzerConfiguration(networkAnalyzerConfigurationName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:NetworkAnalyzerConfiguration/${networkAnalyzerConfigurationName}`);
}
/**
* Adds a resource of type ServiceProfile to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateServiceProfile.html
*
* @param serviceProfileId - Identifier for the serviceProfileId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onServiceProfile(serviceProfileId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:ServiceProfile/${serviceProfileId}`);
}
/**
* Adds a resource of type SidewalkAccount to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_AssociateAwsAccountWithPartnerAccount.html
*
* @param sidewalkAccountId - Identifier for the sidewalkAccountId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onSidewalkAccount(sidewalkAccountId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:SidewalkAccount/${sidewalkAccountId}`);
}
/**
* Adds a resource of type WirelessDevice to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateWirelessDevice.html
*
* @param wirelessDeviceId - Identifier for the wirelessDeviceId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onWirelessDevice(wirelessDeviceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:WirelessDevice/${wirelessDeviceId}`);
}
/**
* Adds a resource of type WirelessGateway to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateWirelessGateway.html
*
* @param wirelessGatewayId - Identifier for the wirelessGatewayId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onWirelessGateway(wirelessGatewayId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:WirelessGateway/${wirelessGatewayId}`);
}
/**
* Adds a resource of type WirelessGatewayTaskDefinition to the statement
*
* https://docs.aws.amazon.com/iot-wireless/latest/apireference/API_CreateWirelessGatewayTaskDefinition.html
*
* @param wirelessGatewayTaskDefinitionId - Identifier for the wirelessGatewayTaskDefinitionId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onWirelessGatewayTaskDefinition(wirelessGatewayTaskDefinitionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iotwireless:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:WirelessGatewayTaskDefinition/${wirelessGatewayTaskDefinitionId}`);
}
/**
* Adds a resource of type cert to the statement
*
* https://docs.aws.amazon.com/iot/latest/developerguide/x509-client-certs.html
*
* @param certificate - Identifier for the certificate.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*/
onCert(certificate, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iot:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:cert/${certificate}`);
}
/**
* Adds a resource of type thing to the statement
*
* https://docs.aws.amazon.com/iot/latest/developerguide/thing-registry.html
*
* @param thingName - Identifier for the thingName.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*/
onThing(thingName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iot:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:thing/${thingName}`);
}
/**
* Filters access by a tag key that is present in the request that the user makes to IoT Wireless
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toAssociateAwsAccountWithPartnerAccount()
* - .toCreateDestination()
* - .toCreateDeviceProfile()
* - .toCreateFuotaTask()
* - .toCreateMulticastGroup()
* - .toCreateNetworkAnalyzerConfiguration()
* - .toCreateServiceProfile()
* - .toCreateWirelessDevice()
* - .toCreateWirelessGateway()
* - .toCreateWirelessGatewayTaskDefinition()
* - .toStartSingleWirelessDeviceImportTask()
* - .toStartWirelessDeviceImportTask()
* - .toTagResource()
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsRequestTag(tagKey, value, operator) {
return this.if(`aws:RequestTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by tag key component of a tag attached to an IoT Wireless resource
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
*
* Applies to actions:
* - .toAssociateMulticastGroupWithFuotaTask()
* - .toAssociateWirelessDeviceWithFuotaTask()
* - .toAssociateWirelessDeviceWithMulticastGroup()
* - .toAssociateWirelessDeviceWithThing()
* - .toAssociateWirelessGatewayWithCertificate()
* - .toAssociateWirelessGatewayWithThing()
* - .toCancelMulticastGroupSession()
* - .toCreateNetworkAnalyzerConfiguration()
* - .toCreateWirelessDevice()
* - .toCreateWirelessGatewayTask()
* - .toDeleteDestination()
* - .toDeleteDeviceProfile()
* - .toDeleteFuotaTask()
* - .toDeleteMulticastGroup()
* - .toDeleteNetworkAnalyzerConfiguration()
* - .toDeleteServiceProfile()
* - .toDeleteWirelessDevice()
* - .toDeleteWirelessDeviceImportTask()
* - .toDeleteWirelessGateway()
* - .toDeleteWirelessGatewayTask()
* - .toDeleteWirelessGatewayTaskDefinition()
* - .toDeregisterWirelessDevice()
* - .toDisassociateAwsAccountFromPartnerAccount()
* - .toDisassociateMulticastGroupFromFuotaTask()
* - .toDisassociateWirelessDeviceFromFuotaTask()
* - .toDisassociateWirelessDeviceFromMulticastGroup()
* - .toDisassociateWirelessDeviceFromThing()
* - .toDisassociateWirelessGatewayFromCertificate()
* - .toDisassociateWirelessGatewayFromThing()
* - .toGetDestination()
* - .toGetDeviceProfile()
* - .toGetFuotaTask()
* - .toGetMulticastGroup()
* - .toGetMulticastGroupSession()
* - .toGetNetworkAnalyzerConfiguration()
* - .toGetPartnerAccount()
* - .toGetPosition()
* - .toGetPositionConfiguration()
* - .toGetResourceEventConfiguration()
* - .toGetResourceLogLevel()
* - .toGetResourcePosition()
* - .toGetServiceProfile()
* - .toGetWirelessDevice()
* - .toGetWirelessDeviceImportTask()
* - .toGetWirelessDeviceStatistics()
* - .toGetWirelessGateway()
* - .toGetWirelessGatewayCertificate()
* - .toGetWirelessGatewayFirmwareInformation()
* - .toGetWirelessGatewayStatistics()
* - .toGetWirelessGatewayTask()
* - .toGetWirelessGatewayTaskDefinition()
* - .toListDevicesForWirelessDeviceImportTask()
* - .toListMulticastGroupsByFuotaTask()
* - .toListTagsForResource()
* - .toPutPositionConfiguration()
* - .toPutResourceLogLevel()
* - .toResetResourceLogLevel()
* - .toSendDataToMulticastGroup()
* - .toSendDataToWirelessDevice()
* - .toStartBulkAssociateWirelessDeviceWithMulticastGroup()
* - .toStartBulkDisassociateWirelessDeviceFromMulticastGroup()
* - .toStartFuotaTask()
* - .toStartMulticastGroupSession()
* - .toStartNetworkAnalyzerStream()
* - .toStartSingleWirelessDeviceImportTask()
* - .toStartWirelessDeviceImportTask()
* - .toTagResource()
* - .toTestWirelessDevice()
* - .toUntagResource()
* - .toUpdateDestination()
* - .toUpdateFuotaTask()
* - .toUpdateMulticastGroup()
* - .toUpdateNetworkAnalyzerConfiguration()
* - .toUpdatePartnerAccount()
* - .toUpdatePosition()
* - .toUpdateResourceEventConfiguration()
* - .toUpdateResourcePosition()
* - .toUpdateWirelessDevice()
* - .toUpdateWirelessDeviceImportTask()
* - .toUpdateWirelessGateway()
*
* Applies to resource types:
* - Destination
* - DeviceProfile
* - FuotaTask
* - ImportTask
* - MulticastGroup
* - NetworkAnalyzerConfiguration
* - ServiceProfile
* - SidewalkAccount
* - WirelessDevice
* - WirelessGateway
* - WirelessGatewayTaskDefinition
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsResourceTag(tagKey, value, operator) {
return this.if(`aws:ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by the list of all the tag key names associated with the resource in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toAssociateAwsAccountWithPartnerAccount()
* - .toCreateDestination()
* - .toCreateDeviceProfile()
* - .toCreateFuotaTask()
* - .toCreateMulticastGroup()
* - .toCreateNetworkAnalyzerConfiguration()
* - .toCreateServiceProfile()
* - .toCreateWirelessDevice()
* - .toCreateWirelessGateway()
* - .toCreateWirelessGatewayTaskDefinition()
* - .toStartSingleWirelessDeviceImportTask()
* - .toStartWirelessDeviceImportTask()
* - .toTagResource()
* - .toUntagResource()
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsTagKeys(value, operator) {
return this.if(`aws:TagKeys`, value, operator ?? 'StringLike');
}
/**
* Filters access by destination name associated with the IoT Wireless resource
*
* https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiotwireless.html
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifDestinationName(value, operator) {
return this.if(`DestinationName`, value, operator ?? 'StringLike');
}
/**
* Filters access by device profile id associated with the IoT Wireless resource
*
* https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiotwireless.html
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifDeviceProfileId(value, operator) {
return this.if(`DeviceProfileId`, value, operator ?? 'StringLike');
}
/**
* Filters access by service profile id associated with the IoT Wireless resource
*
* https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiotwireless.html
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifServiceProfileId(value, operator) {
return this.if(`ServiceProfileId`, value, operator ?? 'StringLike');
}
/**
* Statement provider for service [iotwireless](https://docs.aws.amazon.com/service-authorization/latest/reference/list_iotwireless.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'iotwireless';
this.accessLevelList = {
Write: [
'AssociateAwsAccountWithPartnerAccount',
'AssociateMulticastGroupWithFuotaTask',
'AssociateWirelessDeviceWithFuotaTask',
'AssociateWirelessDeviceWithMulticastGroup',
'AssociateWirelessDeviceWithThing',
'AssociateWirelessGatewayWithCertificate',
'AssociateWirelessGatewayWithThing',
'CancelMulticastGroupSession',
'CreateDestination',
'CreateDeviceProfile',
'CreateFuotaTask',
'CreateMulticastGroup',
'CreateNetworkAnalyzerConfiguration',
'CreateServiceProfile',
'CreateWirelessDevice',
'CreateWirelessGateway',
'CreateWirelessGatewayTask',
'CreateWirelessGatewayTaskDefinition',
'DeleteDestination',
'DeleteDeviceProfile',
'DeleteFuotaTask',
'DeleteMulticastGroup',
'DeleteNetworkAnalyzerConfiguration',
'DeleteQueuedMessages',
'DeleteServiceProfile',
'DeleteWirelessDevice',
'DeleteWirelessDeviceImportTask',
'DeleteWirelessGateway',
'DeleteWirelessGatewayTask',
'DeleteWirelessGatewayTaskDefinition',
'DeregisterWirelessDevice',
'DisassociateAwsAccountFromPartnerAccount',
'DisassociateMulticastGroupFromFuotaTask',
'DisassociateWirelessDeviceFromFuotaTask',
'DisassociateWirelessDeviceFromMulticastGroup',
'DisassociateWirelessDeviceFromThing',
'DisassociateWirelessGatewayFromCertificate',
'DisassociateWirelessGatewayFromThing',
'PutPositionConfiguration',
'PutResourceLogLevel',
'ResetAllResourceLogLevels',
'ResetResourceLogLevel',
'SendDataToMulticastGroup',
'SendDataToWirelessDevice',
'StartBulkAssociateWirelessDeviceWithMulticastGroup',
'StartBulkDisassociateWirelessDeviceFromMulticastGroup',
'StartFuotaTask',
'StartMulticastGroupSession',
'StartNetworkAnalyzerStream',
'StartSingleWirelessDeviceImportTask',
'StartWirelessDeviceImportTask',
'TagResource',
'TestWirelessDevice',
'UntagResource',
'UpdateDestination',
'UpdateEventConfigurationByResourceTypes',
'UpdateFuotaTask',
'UpdateLogLevelsByResourceTypes',
'UpdateMetricConfiguration',
'UpdateMulticastGroup',
'UpdateNetworkAnalyzerConfiguration',
'UpdatePartnerAccount',
'UpdatePosition',
'UpdateResourceEventConfiguration',
'UpdateResourcePosition',
'UpdateWirelessDevice',
'UpdateWirelessDeviceImportTask',
'UpdateWirelessGateway'
],
Read: [
'GetDestination',
'GetDeviceProfile',
'GetEventConfigurationByResourceTypes',
'GetFuotaTask',
'GetLogLevelsByResourceTypes',
'GetMetricConfiguration',
'GetMetrics',
'GetMulticastGroup',
'GetMulticastGroupSession',
'GetNetworkAnalyzerConfiguration',
'GetPartnerAccount',
'GetPosition',
'GetPositionConfiguration',
'GetPositionEstimate',
'GetResourceEventConfiguration',
'GetResourceLogLevel',
'GetResourcePosition',
'GetServiceEndpoint',
'GetServiceProfile',
'GetWirelessDevice',
'GetWirelessDeviceImportTask',
'GetWirelessDeviceStatistics',
'GetWirelessGateway',
'GetWirelessGatewayCertificate',
'GetWirelessGatewayFirmwareInformation',
'GetWirelessGatewayStatistics',
'GetWirelessGatewayTask',
'GetWirelessGatewayTaskDefinition',
'ListDestinations',
'ListDeviceProfiles',
'ListDevicesForWirelessDeviceImportTask',
'ListEventConfigurations',
'ListFuotaTasks',
'ListMulticastGroups',
'ListMulticastGroupsByFuotaTask',
'ListNetworkAnalyzerConfigurations',
'ListPartnerAccounts',
'ListPositionConfigurations',
'ListQueuedMessages',
'ListServiceProfiles',
'ListTagsForResource',
'ListWirelessDeviceImportTasks',
'ListWirelessDevices',
'ListWirelessGatewayTaskDefinitions',
'ListWirelessGateways'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.Iotwireless = Iotwireless;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90d2lyZWxlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpb3R3aXJlbGVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEsV0FBWSxTQUFRLHdCQUFlO0lBRzlDOzs7Ozs7Ozs7O09BVUc7SUFDSSx1Q0FBdUM7UUFDNUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNDQUFzQztRQUMzQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksc0NBQXNDO1FBQzNDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwyQ0FBMkM7UUFDaEQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtDQUFrQztRQUN2QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kseUNBQXlDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQ0FBbUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDZCQUE2QjtRQUNsQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUks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QixxQkFBcUI7Z0JBQ3JCLG9CQUFvQjtnQkFDcEIsbUJBQW1CO2dCQUNuQixtQkFBbUI7Z0JBQ25CLDZCQUE2QjtnQkFDN0IsNkJBQTZCO2dCQUM3QixvQkFBb0I7Z0JBQ3BCLCtCQUErQjtnQkFDL0IsdUNBQXVDO2dCQUN2Qyw4QkFBOEI7Z0JBQzlCLHdCQUF3QjtnQkFDeEIsa0NBQWtDO2dCQUNsQyxrQkFBa0I7Z0JBQ2xCLG9CQUFvQjtnQkFDcEIsd0NBQXdDO2dCQUN4Qyx5QkFBeUI7Z0JBQ3pCLGdCQUFnQjtnQkFDaEIscUJBQXFCO2dCQUNyQixnQ0FBZ0M7Z0JBQ2hDLG1DQUFtQztnQkFDbkMscUJBQXFCO2dCQUNyQiw0QkFBNEI7Z0JBQzVCLG9CQUFvQjtnQkFDcEIscUJBQXFCO2dCQUNyQixxQkFBcUI7Z0JBQ3JCLCtCQUErQjtnQkFDL0IscUJBQXFCO2dCQUNyQixvQ0FBb0M7Z0JBQ3BDLHNCQUFzQjthQUN2QjtZQUNELE9BQU8sRUFBRTtnQkFDUCxhQUFhO2dCQUNiLGVBQWU7YUFDaEI7U0FDRixDQUFDO0lBdWFGLENBQUM7Q0FDRjtBQWh5REQsa0NBZ3lEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjY2Vzc0xldmVsTGlzdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbaW90d2lyZWxlc3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2lvdHdpcmVsZXNzLmh0bWwpLlxuICpcbiAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICovXG5leHBvcnQgY2xhc3MgSW90d2lyZWxlc3MgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdpb3R3aXJlbGVzcyc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpbmsgcGFydG5lciBhY2NvdW50cyB3aXRoIEFXUyBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVBd3NBY2NvdW50V2l0aFBhcnRuZXJBY2NvdW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZUF3c0FjY291bnRXaXRoUGFydG5lckFjY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZUF3c0FjY291bnRXaXRoUGFydG5lckFjY291bnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgdGhlIE11bHRpY2FzdEdyb3VwIHdpdGggRnVvdGFUYXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVNdWx0aWNhc3RHcm91cFdpdGhGdW90YVRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlTXVsdGljYXN0R3JvdXBXaXRoRnVvdGFUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVNdWx0aWNhc3RHcm91cFdpdGhGdW90YVRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgdGhlIHdpcmVsZXNzIGRldmljZSB3aXRoIEZ1b3RhVGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfQXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VXaXRoRnVvdGFUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlV2l0aEZ1b3RhVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VXaXRoRnVvdGFUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIHRoZSBXaXJlbGVzc0RldmljZSB3aXRoIE11bHRpY2FzdEdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVXaXJlbGVzc0RldmljZVdpdGhNdWx0aWNhc3RHcm91cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVXaXJlbGVzc0RldmljZVdpdGhNdWx0aWNhc3RHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VXaXRoTXVsdGljYXN0R3JvdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgdGhlIHdpcmVsZXNzIGRldmljZSB3aXRoIEFXUyBJb1QgdGhpbmcgZm9yIGEgZ2l2ZW4gd2lyZWxlc3NEZXZpY2VJZFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfQXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VXaXRoVGhpbmcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VXaXRoVGhpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlV2l0aFRoaW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGEgV2lyZWxlc3NHYXRld2F5IHdpdGggdGhlIElvVCBDb3JlIElkZW50aXR5IGNlcnRpZmljYXRlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVXaXJlbGVzc0dhdGV3YXlXaXRoQ2VydGlmaWNhdGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlV2lyZWxlc3NHYXRld2F5V2l0aENlcnRpZmljYXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVXaXJlbGVzc0dhdGV3YXlXaXRoQ2VydGlmaWNhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgdGhlIHdpcmVsZXNzIGdhdGV3YXkgd2l0aCBBV1MgSW9UIHRoaW5nIGZvciBhIGdpdmVuIHdpcmVsZXNzR2F0ZXdheUlkXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVXaXJlbGVzc0dhdGV3YXlXaXRoVGhpbmcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlV2lyZWxlc3NHYXRld2F5V2l0aFRoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVXaXJlbGVzc0dhdGV3YXlXaXRoVGhpbmcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgdGhlIE11bHRpY2FzdEdyb3VwIHNlc3Npb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0NhbmNlbE11bHRpY2FzdEdyb3VwU2Vzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxNdWx0aWNhc3RHcm91cFNlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbE11bHRpY2FzdEdyb3VwU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIERlc3RpbmF0aW9uIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9DcmVhdGVEZXN0aW5hdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVEZXN0aW5hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRGVzdGluYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBEZXZpY2VQcm9maWxlIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9DcmVhdGVEZXZpY2VQcm9maWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZURldmljZVByb2ZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZURldmljZVByb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBGdW90YVRhc2sgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0NyZWF0ZUZ1b3RhVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVGdW90YVRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUZ1b3RhVGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIE11bHRpY2FzdEdyb3VwIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9DcmVhdGVNdWx0aWNhc3RHcm91cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVNdWx0aWNhc3RHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTXVsdGljYXN0R3JvdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBOZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9uIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9DcmVhdGVOZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBTZXJ2aWNlUHJvZmlsZSByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfQ3JlYXRlU2VydmljZVByb2ZpbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlU2VydmljZVByb2ZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVNlcnZpY2VQcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgV2lyZWxlc3NEZXZpY2UgcmVzb3VyY2Ugd2l0aCBnaXZlbiBEZXN0aW5hdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfQ3JlYXRlV2lyZWxlc3NEZXZpY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlV2lyZWxlc3NEZXZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVdpcmVsZXNzRGV2aWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgV2lyZWxlc3NHYXRld2F5IHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9DcmVhdGVXaXJlbGVzc0dhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlV2lyZWxlc3NHYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVXaXJlbGVzc0dhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB0YXNrIGZvciBhIGdpdmVuIFdpcmVsZXNzR2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfQ3JlYXRlV2lyZWxlc3NHYXRld2F5VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVXaXJlbGVzc0dhdGV3YXlUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVXaXJlbGVzc0dhdGV3YXlUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgV2lyZWxlc3NHYXRld2F5IHRhc2sgZGVmaW5pdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfQ3JlYXRlV2lyZWxlc3NHYXRld2F5VGFza0RlZmluaXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlV2lyZWxlc3NHYXRld2F5VGFza0RlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVdpcmVsZXNzR2F0ZXdheVRhc2tEZWZpbml0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgRGVzdGluYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0RlbGV0ZURlc3RpbmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZURlc3RpbmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVEZXN0aW5hdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIERldmljZVByb2ZpbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0RlbGV0ZURldmljZVByb2ZpbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRGV2aWNlUHJvZmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlRGV2aWNlUHJvZmlsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgRnVvdGFUYXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9EZWxldGVGdW90YVRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRnVvdGFUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVGdW90YVRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIE11bHRpY2FzdEdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9EZWxldGVNdWx0aWNhc3RHcm91cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVNdWx0aWNhc3RHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTXVsdGljYXN0R3JvdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIE5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0RlbGV0ZU5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTmV0d29ya0FuYWx5emVyQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTmV0d29ya0FuYWx5emVyQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBRdWV1ZWRNZXNzYWdlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfRGVsZXRlUXVldWVkTWVzc2FnZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUXVldWVkTWVzc2FnZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVF1ZXVlZE1lc3NhZ2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgU2VydmljZVByb2ZpbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0RlbGV0ZVNlcnZpY2VQcm9maWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVNlcnZpY2VQcm9maWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVTZXJ2aWNlUHJvZmlsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIFdpcmVsZXNzRGV2aWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9EZWxldGVXaXJlbGVzc0RldmljZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVXaXJlbGVzc0RldmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlV2lyZWxlc3NEZXZpY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHdpcmVsZXNzIGRldmljZSBpbXBvcnQgdGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfRGVsZXRlV2lyZWxlc3NEZXZpY2VJbXBvcnRUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlV2lyZWxlc3NEZXZpY2VJbXBvcnRUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgV2lyZWxlc3NHYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9EZWxldGVXaXJlbGVzc0dhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlV2lyZWxlc3NHYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVXaXJlbGVzc0dhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGFzayBmb3IgYSBnaXZlbiBXaXJlbGVzc0dhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0RlbGV0ZVdpcmVsZXNzR2F0ZXdheVRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlV2lyZWxlc3NHYXRld2F5VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlV2lyZWxlc3NHYXRld2F5VGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIFdpcmVsZXNzR2F0ZXdheSB0YXNrIGRlZmluaXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0RlbGV0ZVdpcmVsZXNzR2F0ZXdheVRhc2tEZWZpbml0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVdpcmVsZXNzR2F0ZXdheVRhc2tEZWZpbml0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlcmVnaXN0ZXIgd2lyZWxlc3MgZGV2aWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9EZXJlZ2lzdGVyV2lyZWxlc3NEZXZpY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVyZWdpc3RlcldpcmVsZXNzRGV2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXJlZ2lzdGVyV2lyZWxlc3NEZXZpY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYW4gQVdTIGFjY291bnQgZnJvbSBhIHBhcnRuZXIgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlQXdzQWNjb3VudEZyb21QYXJ0bmVyQWNjb3VudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVBd3NBY2NvdW50RnJvbVBhcnRuZXJBY2NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVBd3NBY2NvdW50RnJvbVBhcnRuZXJBY2NvdW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIHRoZSBNdWx0aWNhc3RHcm91cCBmcm9tIEZ1b3RhVGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlTXVsdGljYXN0R3JvdXBGcm9tRnVvdGFUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZU11bHRpY2FzdEdyb3VwRnJvbUZ1b3RhVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlTXVsdGljYXN0R3JvdXBGcm9tRnVvdGFUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIHRoZSB3aXJlbGVzcyBkZXZpY2UgZnJvbSBGdW90YVRhc2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0Rpc2Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlRnJvbUZ1b3RhVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVXaXJlbGVzc0RldmljZUZyb21GdW90YVRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlRnJvbUZ1b3RhVGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSB0aGUgd2lyZWxlc3MgZGV2aWNlIGZyb20gTXVsdGljYXN0R3JvdXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0Rpc2Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlRnJvbU11bHRpY2FzdEdyb3VwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlRnJvbU11bHRpY2FzdEdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVXaXJlbGVzc0RldmljZUZyb21NdWx0aWNhc3RHcm91cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSBhIHdpcmVsZXNzIGRldmljZSBmcm9tIGEgQVdTIElvVCB0aGluZ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VGcm9tVGhpbmcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VGcm9tVGhpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlRnJvbVRoaW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGEgV2lyZWxlc3NHYXRld2F5IGZyb20gYSBJb1QgQ29yZSBJZGVudGl0eSBjZXJ0aWZpY2F0ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlV2lyZWxlc3NHYXRld2F5RnJvbUNlcnRpZmljYXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZVdpcmVsZXNzR2F0ZXdheUZyb21DZXJ0aWZpY2F0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlV2lyZWxlc3NHYXRld2F5RnJvbUNlcnRpZmljYXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGEgV2lyZWxlc3NHYXRld2F5IGZyb20gYSBJb1QgQ29yZSB0aGluZ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlV2lyZWxlc3NHYXRld2F5RnJvbVRoaW5nLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZVdpcmVsZXNzR2F0ZXdheUZyb21UaGluZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlV2lyZWxlc3NHYXRld2F5RnJvbVRoaW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBEZXN0aW5hdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9HZXREZXN0aW5hdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREZXN0aW5hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RGVzdGluYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIERldmljZVByb2ZpbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfR2V0RGV2aWNlUHJvZmlsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREZXZpY2VQcm9maWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREZXZpY2VQcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGV2ZW50IGNvbmZpZ3VyYXRpb24gYnkgcmVzb3VyY2UgdHlwZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfR2V0RXZlbnRDb25maWd1cmF0aW9uQnlSZXNvdXJjZVR5cGVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEV2ZW50Q29uZmlndXJhdGlvbkJ5UmVzb3VyY2VUeXBlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RXZlbnRDb25maWd1cmF0aW9uQnlSZXNvdXJjZVR5cGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBGdW90YVRhc2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfR2V0RnVvdGFUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEZ1b3RhVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RnVvdGFUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGxvZyBsZXZlbHMgYnkgcmVzb3VyY2UgdHlwZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfR2V0TG9nTGV2ZWxzQnlSZXNvdXJjZVR5cGVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldExvZ0xldmVsc0J5UmVzb3VyY2VUeXBlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TG9nTGV2ZWxzQnlSZXNvdXJjZVR5cGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IG1ldHJpYyBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0dldE1ldHJpY0NvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TWV0cmljQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TWV0cmljQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBtZXRyaWNzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0dldE1ldHJpY3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TWV0cmljcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TWV0cmljcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgTXVsdGljYXN0R3JvdXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfR2V0TXVsdGljYXN0R3JvdXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TXVsdGljYXN0R3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE11bHRpY2FzdEdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBNdWx0aWNhc3RHcm91cCBzZXNzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0dldE11bHRpY2FzdEdyb3VwU2Vzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRNdWx0aWNhc3RHcm91cFNlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE11bHRpY2FzdEdyb3VwU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgTmV0d29ya0FuYWx5emVyQ29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9HZXROZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIGFzc29jaWF0ZWQgUGFydG5lckFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfR2V0UGFydG5lckFjY291bnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UGFydG5lckFjY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFBhcnRuZXJBY2NvdW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHBvc2l0aW9uIGZvciBhIGdpdmVuIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0dldFBvc2l0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRQb3NpdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBwb3NpdGlvbiBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0dldFBvc2l0aW9uQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRQb3NpdGlvbkNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFBvc2l0aW9uQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBwb3NpdGlvbiBlc3RpbWF0ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9HZXRQb3NpdGlvbkVzdGltYXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFBvc2l0aW9uRXN0aW1hdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFBvc2l0aW9uRXN0aW1hdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYW4gZXZlbnQgY29uZmlndXJhdGlvbiBmb3IgYW4gaWRlbnRpZmllclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9HZXRSZXNvdXJjZUV2ZW50Q29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRSZXNvdXJjZUV2ZW50Q29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UmVzb3VyY2VFdmVudENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgcmVzb3VyY2UgbG9nIGxldmVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0dldFJlc291cmNlTG9nTGV2ZWwuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UmVzb3VyY2VMb2dMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UmVzb3VyY2VMb2dMZXZlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBwb3NpdGlvbiBmb3IgYSBnaXZlbiByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9HZXRSZXNvdXJjZVBvc2l0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFJlc291cmNlUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFJlc291cmNlUG9zaXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgY3VzdG9tZXIgYWNjb3VudCBzcGVjaWZpYyBlbmRwb2ludCBmb3IgQ1VQUyBwcm90b2NvbCBjb25uZWN0aW9uIG9yIExvUmFXQU4gTmV0d29yayBTZXJ2ZXIgKExOUykgcHJvdG9jb2wgY29ubmVjdGlvbiwgYW5kIG9wdGlvbmFsbHkgc2VydmVyIHRydXN0IGNlcnRpZmljYXRlIGluIFBFTSBmb3JtYXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfR2V0U2VydmljZUVuZHBvaW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNlcnZpY2VFbmRwb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U2VydmljZUVuZHBvaW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBTZXJ2aWNlUHJvZmlsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9HZXRTZXJ2aWNlUHJvZmlsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRTZXJ2aWNlUHJvZmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U2VydmljZVByb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIFdpcmVsZXNzRGV2aWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0dldFdpcmVsZXNzRGV2aWNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFdpcmVsZXNzRGV2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRXaXJlbGVzc0RldmljZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgd2lyZWxlc3MgZGV2aWNlIGltcG9ydCB0YXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0dldFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRXaXJlbGVzc0RldmljZUltcG9ydFRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBzdGF0aXN0aWNzIGluZm8gZm9yIGEgZ2l2ZW4gV2lyZWxlc3NEZXZpY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfR2V0V2lyZWxlc3NEZXZpY2VTdGF0aXN0aWNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFdpcmVsZXNzRGV2aWNlU3RhdGlzdGljcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0V2lyZWxlc3NEZXZpY2VTdGF0aXN0aWNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBXaXJlbGVzc0dhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfR2V0V2lyZWxlc3NHYXRld2F5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFdpcmVsZXNzR2F0ZXdheSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0V2lyZWxlc3NHYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBJb1QgQ29yZSBJZGVudGl0eSBjZXJ0aWZpY2F0ZSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIFdpcmVsZXNzR2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9HZXRXaXJlbGVzc0dhdGV3YXlDZXJ0aWZpY2F0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRXaXJlbGVzc0dhdGV3YXlDZXJ0aWZpY2F0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0V2lyZWxlc3NHYXRld2F5Q2VydGlmaWNhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgQ3VycmVudCBmaXJtd2FyZSB2ZXJzaW9uIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIFdpcmVsZXNzR2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9HZXRXaXJlbGVzc0dhdGV3YXlGaXJtd2FyZUluZm9ybWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFdpcmVsZXNzR2F0ZXdheUZpcm13YXJlSW5mb3JtYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFdpcmVsZXNzR2F0ZXdheUZpcm13YXJlSW5mb3JtYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgc3RhdGlzdGljcyBpbmZvIGZvciBhIGdpdmVuIFdpcmVsZXNzR2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9HZXRXaXJlbGVzc0dhdGV3YXlTdGF0aXN0aWNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFdpcmVsZXNzR2F0ZXdheVN0YXRpc3RpY3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFdpcmVsZXNzR2F0ZXdheVN0YXRpc3RpY3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIHRhc2sgZm9yIGEgZ2l2ZW4gV2lyZWxlc3NHYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0dldFdpcmVsZXNzR2F0ZXdheVRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0V2lyZWxlc3NHYXRld2F5VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0V2lyZWxlc3NHYXRld2F5VGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgZ2l2ZW4gV2lyZWxlc3NHYXRld2F5IHRhc2sgZGVmaW5pdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9HZXRXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0V2lyZWxlc3NHYXRld2F5VGFza0RlZmluaXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIG9mIGF2YWlsYWJsZSBEZXN0aW5hdGlvbnMgYmFzZWQgb24gdGhlIEFXUyBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0xpc3REZXN0aW5hdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdERlc3RpbmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdERlc3RpbmF0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW5mb3JtYXRpb24gb2YgYXZhaWxhYmxlIERldmljZVByb2ZpbGVzIGJhc2VkIG9uIHRoZSBBV1MgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9MaXN0RGV2aWNlUHJvZmlsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdERldmljZVByb2ZpbGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RGV2aWNlUHJvZmlsZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIG9mIGRldmljZXMgYnkgd2lyZWxlc3MgZGV2aWNlIGltcG9ydCB0YXNrIGJhc2VkIG9uIHRoZSBBV1MgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9MaXN0RGV2aWNlc0ZvcldpcmVsZXNzRGV2aWNlSW1wb3J0VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RGV2aWNlc0ZvcldpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdERldmljZXNGb3JXaXJlbGVzc0RldmljZUltcG9ydFRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIG9mIGF2YWlsYWJsZSBldmVudCBjb25maWd1cmF0aW9ucyBiYXNlZCBvbiB0aGUgQVdTIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfTGlzdEV2ZW50Q29uZmlndXJhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEV2ZW50Q29uZmlndXJhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RFdmVudENvbmZpZ3VyYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBpbmZvcm1hdGlvbiBvZiBhdmFpbGFibGUgRnVvdGFUYXNrcyBiYXNlZCBvbiB0aGUgQVdTIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfTGlzdEZ1b3RhVGFza3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEZ1b3RhVGFza3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RGdW90YVRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBpbmZvcm1hdGlvbiBvZiBhdmFpbGFibGUgTXVsdGljYXN0R3JvdXBzIGJhc2VkIG9uIHRoZSBBV1MgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9MaXN0TXVsdGljYXN0R3JvdXBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RNdWx0aWNhc3RHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RNdWx0aWNhc3RHcm91cHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIG9mIGF2YWlsYWJsZSBNdWx0aWNhc3RHcm91cHMgYnkgRnVvdGFUYXNrIGJhc2VkIG9uIHRoZSBBV1MgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9MaXN0TXVsdGljYXN0R3JvdXBzQnlGdW90YVRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdE11bHRpY2FzdEdyb3Vwc0J5RnVvdGFUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TXVsdGljYXN0R3JvdXBzQnlGdW90YVRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIG9mIGF2YWlsYWJsZSBOZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9ucyBiYXNlZCBvbiB0aGUgQVdTIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfTGlzdE5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3ROZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdE5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0aGUgYXZhaWxhYmxlIHBhcnRuZXIgYWNjb3VudHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfTGlzdFBhcnRuZXJBY2NvdW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UGFydG5lckFjY291bnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UGFydG5lckFjY291bnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBpbmZvcm1hdGlvbiBvZiBhdmFpbGFibGUgcG9zaXRpb24gY29uZmlndXJhdGlvbnMgYmFzZWQgb24gdGhlIEFXUyBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0xpc3RQb3NpdGlvbkNvbmZpZ3VyYXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RQb3NpdGlvbkNvbmZpZ3VyYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UG9zaXRpb25Db25maWd1cmF0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIFF1ZXVlZCBNZXNzYWdlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9MaXN0UXVldWVkTWVzc2FnZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFF1ZXVlZE1lc3NhZ2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UXVldWVkTWVzc2FnZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIG9mIGF2YWlsYWJsZSBTZXJ2aWNlUHJvZmlsZXMgYmFzZWQgb24gdGhlIEFXUyBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0xpc3RTZXJ2aWNlUHJvZmlsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFNlcnZpY2VQcm9maWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFNlcnZpY2VQcm9maWxlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHRhZ3MgZm9yIGEgZ2l2ZW4gcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfTGlzdFRhZ3NGb3JSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFnc0ZvclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFnc0ZvclJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB3aXJlbGVzcyBkZXZpY2UgaW1wb3J0IHRhc2tzIGluZm9ybWF0aW9uIG9mIGJhc2VkIG9uIHRoZSBBV1MgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9MaXN0V2lyZWxlc3NEZXZpY2VJbXBvcnRUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0V2lyZWxlc3NEZXZpY2VJbXBvcnRUYXNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFza3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIG9mIGF2YWlsYWJsZSBXaXJlbGVzc0RldmljZXMgYmFzZWQgb24gdGhlIEFXUyBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0xpc3RXaXJlbGVzc0RldmljZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFdpcmVsZXNzRGV2aWNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFdpcmVsZXNzRGV2aWNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW5mb3JtYXRpb24gb2YgYXZhaWxhYmxlIFdpcmVsZXNzR2F0ZXdheSB0YXNrIGRlZmluaXRpb25zIGJhc2VkIG9uIHRoZSBBV1MgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9MaXN0V2lyZWxlc3NHYXRld2F5VGFza0RlZmluaXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIG9mIGF2YWlsYWJsZSBXaXJlbGVzc0dhdGV3YXlzIGJhc2VkIG9uIHRoZSBBV1MgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9MaXN0V2lyZWxlc3NHYXRld2F5cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0V2lyZWxlc3NHYXRld2F5cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFdpcmVsZXNzR2F0ZXdheXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwdXQgcG9zaXRpb24gY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfUHV0UG9zaXRpb25Db25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFBvc2l0aW9uQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0UG9zaXRpb25Db25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHV0IHJlc291cmNlIGxvZyBsZXZlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfUHV0UmVzb3VyY2VMb2dMZXZlbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRSZXNvdXJjZUxvZ0xldmVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRSZXNvdXJjZUxvZ0xldmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzZXQgYWxsIHJlc291cmNlIGxvZyBsZXZlbHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX1Jlc2V0QWxsUmVzb3VyY2VMb2dMZXZlbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVzZXRBbGxSZXNvdXJjZUxvZ0xldmVscygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVzZXRBbGxSZXNvdXJjZUxvZ0xldmVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlc2V0IHJlc291cmNlIGxvZyBsZXZlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfUmVzZXRSZXNvdXJjZUxvZ0xldmVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Jlc2V0UmVzb3VyY2VMb2dMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVzZXRSZXNvdXJjZUxvZ0xldmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VuZCBkYXRhIHRvIHRoZSBNdWx0aWNhc3RHcm91cFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfU2VuZERhdGFUb011bHRpY2FzdEdyb3VwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1NlbmREYXRhVG9NdWx0aWNhc3RHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VuZERhdGFUb011bHRpY2FzdEdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VuZCB0aGUgZGVjcnlwdGVkIGFwcGxpY2F0aW9uIGRhdGEgZnJhbWUgdG8gdGhlIHRhcmdldCBkZXZpY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX1NlbmREYXRhVG9XaXJlbGVzc0RldmljZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TZW5kRGF0YVRvV2lyZWxlc3NEZXZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NlbmREYXRhVG9XaXJlbGVzc0RldmljZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSB0aGUgV2lyZWxlc3NEZXZpY2VzIHdpdGggTXVsdGljYXN0R3JvdXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX1N0YXJ0QnVsa0Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlV2l0aE11bHRpY2FzdEdyb3VwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0QnVsa0Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlV2l0aE11bHRpY2FzdEdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydEJ1bGtBc3NvY2lhdGVXaXJlbGVzc0RldmljZVdpdGhNdWx0aWNhc3RHcm91cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGJ1bGsgZGlzYXNzb2NpYXRlIHRoZSBXaXJlbGVzc0RldmljZXMgZnJvbSBNdWx0aWNhc3RHcm91cFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfU3RhcnRCdWxrRGlzYXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VGcm9tTXVsdGljYXN0R3JvdXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRCdWxrRGlzYXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VGcm9tTXVsdGljYXN0R3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0QnVsa0Rpc2Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlRnJvbU11bHRpY2FzdEdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgdGhlIEZ1b3RhVGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfU3RhcnRGdW90YVRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRGdW90YVRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0RnVvdGFUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgdGhlIE11bHRpY2FzdEdyb3VwIHNlc3Npb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX1N0YXJ0TXVsdGljYXN0R3JvdXBTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0TXVsdGljYXN0R3JvdXBTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydE11bHRpY2FzdEdyb3VwU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IE5ldHdvcmtBbmFseXplciBzdHJlYW1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jb25uZWN0LWlvdC1sb3Jhd2FuLW5ldHdvcmstYW5hbHl6ZXItYXBpLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0TmV0d29ya0FuYWx5emVyU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydE5ldHdvcmtBbmFseXplclN0cmVhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IHRoZSBzaW5nbGUgd2lyZWxlc3MgZGV2aWNlIGltcG9ydCB0YXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9TdGFydFNpbmdsZVdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFNpbmdsZVdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRTaW5nbGVXaXJlbGVzc0RldmljZUltcG9ydFRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCB0aGUgd2lyZWxlc3MgZGV2aWNlIGltcG9ydCB0YXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9TdGFydFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRXaXJlbGVzc0RldmljZUltcG9ydFRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB0YWcgYSBnaXZlbiByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfVGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1RhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2ltdWxhdGUgYSBwcm92aXNpb25lZCBkZXZpY2UgdG8gc2VuZCBhbiB1cGxpbmsgZGF0YSB3aXRoIHBheWxvYWQgb2YgJ0hlbGxvJ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfVGVzdFdpcmVsZXNzRGV2aWNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Rlc3RXaXJlbGVzc0RldmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVGVzdFdpcmVsZXNzRGV2aWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVtb3ZlIHRoZSBnaXZlbiB0YWdzIGZyb20gdGhlIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBEZXN0aW5hdGlvbiByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfVXBkYXRlRGVzdGluYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlRGVzdGluYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZURlc3RpbmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGV2ZW50IGNvbmZpZ3VyYXRpb24gYnkgcmVzb3VyY2UgdHlwZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX1VwZGF0ZUV2ZW50Q29uZmlndXJhdGlvbkJ5UmVzb3VyY2VUeXBlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVFdmVudENvbmZpZ3VyYXRpb25CeVJlc291cmNlVHlwZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUV2ZW50Q29uZmlndXJhdGlvbkJ5UmVzb3VyY2VUeXBlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgRnVvdGFUYXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9VcGRhdGVGdW90YVRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlRnVvdGFUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVGdW90YVRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgbG9nIGxldmVscyBieSByZXNvdXJjZSB0eXBlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfVXBkYXRlTG9nTGV2ZWxzQnlSZXNvdXJjZVR5cGVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUxvZ0xldmVsc0J5UmVzb3VyY2VUeXBlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTG9nTGV2ZWxzQnlSZXNvdXJjZVR5cGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIG1ldHJpYyBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9VcGRhdGVNZXRyaWNDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZU1ldHJpY0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU1ldHJpY0NvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIE11bHRpY2FzdEdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9VcGRhdGVNdWx0aWNhc3RHcm91cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVNdWx0aWNhc3RHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTXVsdGljYXN0R3JvdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIE5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX1VwZGF0ZU5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlTmV0d29ya0FuYWx5emVyQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTmV0d29ya0FuYWx5emVyQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHBhcnRuZXIgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfVXBkYXRlUGFydG5lckFjY291bnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlUGFydG5lckFjY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVBhcnRuZXJBY2NvdW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHBvc2l0aW9uIGZvciBhIGdpdmVuIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9VcGRhdGVQb3NpdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUG9zaXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYW4gZXZlbnQgY29uZmlndXJhdGlvbiBmb3IgYW4gaWRlbnRpZmllclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfVXBkYXRlUmVzb3VyY2VFdmVudENvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlUmVzb3VyY2VFdmVudENvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVJlc291cmNlRXZlbnRDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHBvc2l0aW9uIGZvciBhIGdpdmVuIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9VcGRhdGVSZXNvdXJjZVBvc2l0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVJlc291cmNlUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVJlc291cmNlUG9zaXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBXaXJlbGVzc0RldmljZSByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfVXBkYXRlV2lyZWxlc3NEZXZpY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlV2lyZWxlc3NEZXZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVdpcmVsZXNzRGV2aWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgd2lyZWxlc3MgZGV2aWNlIGltcG9ydCB0YXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9VcGRhdGVXaXJlbGVzc0RldmljZUltcG9ydFRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlV2lyZWxlc3NEZXZpY2VJbXBvcnRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVXaXJlbGVzc0RldmljZUltcG9ydFRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBXaXJlbGVzc0dhdGV3YXkgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX1VwZGF0ZVdpcmVsZXNzR2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVXaXJlbGVzc0dhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVdpcmVsZXNzR2F0ZXdheScpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFjY2Vzc0xldmVsTGlzdDogQWNjZXNzTGV2ZWxMaXN0ID0ge1xuICAgIFdyaXRlOiBbXG4gICAgICAnQXNzb2NpYXRlQXdzQWNjb3VudFdpdGhQYXJ0bmVyQWNjb3VudCcsXG4gICAgICAnQXNzb2NpYXRlTXVsdGljYXN0R3JvdXBXaXRoRnVvdGFUYXNrJyxcbiAgICAgICdBc3NvY2lhdGVXaXJlbGVzc0RldmljZVdpdGhGdW90YVRhc2snLFxuICAgICAgJ0Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlV2l0aE11bHRpY2FzdEdyb3VwJyxcbiAgICAgICdBc3NvY2lhdGVXaXJlbGVzc0RldmljZVdpdGhUaGluZycsXG4gICAgICAnQXNzb2NpYXRlV2lyZWxlc3NHYXRld2F5V2l0aENlcnRpZmljYXRlJyxcbiAgICAgICdBc3NvY2lhdGVXaXJlbGVzc0dhdGV3YXlXaXRoVGhpbmcnLFxuICAgICAgJ0NhbmNlbE11bHRpY2FzdEdyb3VwU2Vzc2lvbicsXG4gICAgICAnQ3JlYXRlRGVzdGluYXRpb24nLFxuICAgICAgJ0NyZWF0ZURldmljZVByb2ZpbGUnLFxuICAgICAgJ0NyZWF0ZUZ1b3RhVGFzaycsXG4gICAgICAnQ3JlYXRlTXVsdGljYXN0R3JvdXAnLFxuICAgICAgJ0NyZWF0ZU5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24nLFxuICAgICAgJ0NyZWF0ZVNlcnZpY2VQcm9maWxlJyxcbiAgICAgICdDcmVhdGVXaXJlbGVzc0RldmljZScsXG4gICAgICAnQ3JlYXRlV2lyZWxlc3NHYXRld2F5JyxcbiAgICAgICdDcmVhdGVXaXJlbGVzc0dhdGV3YXlUYXNrJyxcbiAgICAgICdDcmVhdGVXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbicsXG4gICAgICAnRGVsZXRlRGVzdGluYXRpb24nLFxuICAgICAgJ0RlbGV0ZURldmljZVByb2ZpbGUnLFxuICAgICAgJ0RlbGV0ZUZ1b3RhVGFzaycsXG4gICAgICAnRGVsZXRlTXVsdGljYXN0R3JvdXAnLFxuICAgICAgJ0RlbGV0ZU5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24nLFxuICAgICAgJ0RlbGV0ZVF1ZXVlZE1lc3NhZ2VzJyxcbiAgICAgICdEZWxldGVTZXJ2aWNlUHJvZmlsZScsXG4gICAgICAnRGVsZXRlV2lyZWxlc3NEZXZpY2UnLFxuICAgICAgJ0RlbGV0ZVdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaycsXG4gICAgICAnRGVsZXRlV2lyZWxlc3NHYXRld2F5JyxcbiAgICAgICdEZWxldGVXaXJlbGVzc0dhdGV3YXlUYXNrJyxcbiAgICAgICdEZWxldGVXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbicsXG4gICAgICAnRGVyZWdpc3RlcldpcmVsZXNzRGV2aWNlJyxcbiAgICAgICdEaXNhc3NvY2lhdGVBd3NBY2NvdW50RnJvbVBhcnRuZXJBY2NvdW50JyxcbiAgICAgICdEaXNhc3NvY2lhdGVNdWx0aWNhc3RHcm91cEZyb21GdW90YVRhc2snLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlRnJvbUZ1b3RhVGFzaycsXG4gICAgICAnRGlzYXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VGcm9tTXVsdGljYXN0R3JvdXAnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlRnJvbVRoaW5nJyxcbiAgICAgICdEaXNhc3NvY2lhdGVXaXJlbGVzc0dhdGV3YXlGcm9tQ2VydGlmaWNhdGUnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVdpcmVsZXNzR2F0ZXdheUZyb21UaGluZycsXG4gICAgICAnUHV0UG9zaXRpb25Db25maWd1cmF0aW9uJyxcbiAgICAgICdQdXRSZXNvdXJjZUxvZ0xldmVsJyxcbiAgICAgICdSZXNldEFsbFJlc291cmNlTG9nTGV2ZWxzJyxcbiAgICAgICdSZXNldFJlc291cmNlTG9nTGV2ZWwnLFxuICAgICAgJ1NlbmREYXRhVG9NdWx0aWNhc3RHcm91cCcsXG4gICAgICAnU2VuZERhdGFUb1dpcmVsZXNzRGV2aWNlJyxcbiAgICAgICdTdGFydEJ1bGtBc3NvY2lhdGVXaXJlbGVzc0RldmljZVdpdGhNdWx0aWNhc3RHcm91cCcsXG4gICAgICAnU3RhcnRCdWxrRGlzYXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VGcm9tTXVsdGljYXN0R3JvdXAnLFxuICAgICAgJ1N0YXJ0RnVvdGFUYXNrJyxcbiAgICAgICdTdGFydE11bHRpY2FzdEdyb3VwU2Vzc2lvbicsXG4gICAgICAnU3RhcnROZXR3b3JrQW5hbHl6ZXJTdHJlYW0nLFxuICAgICAgJ1N0YXJ0U2luZ2xlV2lyZWxlc3NEZXZpY2VJbXBvcnRUYXNrJyxcbiAgICAgICdTdGFydFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaycsXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1Rlc3RXaXJlbGVzc0RldmljZScsXG4gICAgICAnVW50YWdSZXNvdXJjZScsXG4gICAgICAnVXBkYXRlRGVzdGluYXRpb24nLFxuICAgICAgJ1VwZGF0ZUV2ZW50Q29uZmlndXJhdGlvbkJ5UmVzb3VyY2VUeXBlcycsXG4gICAgICAnVXBkYXRlRnVvdGFUYXNrJyxcbiAgICAgICdVcGRhdGVMb2dMZXZlbHNCeVJlc291cmNlVHlwZXMnLFxuICAgICAgJ1VwZGF0ZU1ldHJpY0NvbmZpZ3VyYXRpb24nLFxuICAgICAgJ1VwZGF0ZU11bHRpY2FzdEdyb3VwJyxcbiAgICAgICdVcGRhdGVOZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9uJyxcbiAgICAgICdVcGRhdGVQYXJ0bmVyQWNjb3VudCcsXG4gICAgICAnVXBkYXRlUG9zaXRpb24nLFxuICAgICAgJ1VwZGF0ZVJlc291cmNlRXZlbnRDb25maWd1cmF0aW9uJyxcbiAgICAgICdVcGRhdGVSZXNvdXJjZVBvc2l0aW9uJyxcbiAgICAgICdVcGRhdGVXaXJlbGVzc0RldmljZScsXG4gICAgICAnVXBkYXRlV2lyZWxlc3NEZXZpY2VJbXBvcnRUYXNrJyxcbiAgICAgICdVcGRhdGVXaXJlbGVzc0dhdGV3YXknXG4gICAgXSxcbiAgICBSZWFkOiBbXG4gICAgICAnR2V0RGVzdGluYXRpb24nLFxuICAgICAgJ0dldERldmljZVByb2ZpbGUnLFxuICAgICAgJ0dldEV2ZW50Q29uZmlndXJhdGlvbkJ5UmVzb3VyY2VUeXBlcycsXG4gICAgICAnR2V0RnVvdGFUYXNrJyxcbiAgICAgICdHZXRMb2dMZXZlbHNCeVJlc291cmNlVHlwZXMnLFxuICAgICAgJ0dldE1ldHJpY0NvbmZpZ3VyYXRpb24nLFxuICAgICAgJ0dldE1ldHJpY3MnLFxuICAgICAgJ0dldE11bHRpY2FzdEdyb3VwJyxcbiAgICAgICdHZXRNdWx0aWNhc3RHcm91cFNlc3Npb24nLFxuICAgICAgJ0dldE5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24nLFxuICAgICAgJ0dldFBhcnRuZXJBY2NvdW50JyxcbiAgICAgICdHZXRQb3NpdGlvbicsXG4gICAgICAnR2V0UG9zaXRpb25Db25maWd1cmF0aW9uJyxcbiAgICAgICdHZXRQb3NpdGlvbkVzdGltYXRlJyxcbiAgICAgICdHZXRSZXNvdXJjZUV2ZW50Q29uZmlndXJhdGlvbicsXG4gICAgICAnR2V0UmVzb3VyY2VMb2dMZXZlbCcsXG4gICAgICAnR2V0UmVzb3VyY2VQb3NpdGlvbicsXG4gICAgICAnR2V0U2VydmljZUVuZHBvaW50JyxcbiAgICAgICdHZXRTZXJ2aWNlUHJvZmlsZScsXG4gICAgICAnR2V0V2lyZWxlc3NEZXZpY2UnLFxuICAgICAgJ0dldFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaycsXG4gICAgICAnR2V0V2lyZWxlc3NEZXZpY2VTdGF0aXN0aWNzJyxcbiAgICAgICdHZXRXaXJlbGVzc0dhdGV3YXknLFxuICAgICAgJ0dldFdpcmVsZXNzR2F0ZXdheUNlcnRpZmljYXRlJyxcbiAgICAgICdHZXRXaXJlbGVzc0dhdGV3YXlGaXJtd2FyZUluZm9ybWF0aW9uJyxcbiAgICAgICdHZXRXaXJlbGVzc0dhdGV3YXlTdGF0aXN0aWNzJyxcbiAgICAgICdHZXRXaXJlbGVzc0dhdGV3YXlUYXNrJyxcbiAgICAgICdHZXRXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbicsXG4gICAgICAnTGlzdERlc3RpbmF0aW9ucycsXG4gICAgICAnTGlzdERldmljZVByb2ZpbGVzJyxcbiAgICAgICdMaXN0RGV2aWNlc0ZvcldpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaycsXG4gICAgICAnTGlzdEV2ZW50Q29uZmlndXJhdGlvbnMnLFxuICAgICAgJ0xpc3RGdW90YVRhc2tzJyxcbiAgICAgICdMaXN0TXVsdGljYXN0R3JvdXBzJyxcbiAgICAgICdMaXN0TXVsdGljYXN0R3JvdXBzQnlGdW90YVRhc2snLFxuICAgICAgJ0xpc3ROZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9ucycsXG4gICAgICAnTGlzdFBhcnRuZXJBY2NvdW50cycsXG4gICAgICAnTGlzdFBvc2l0aW9uQ29uZmlndXJhdGlvbnMnLFxuICAgICAgJ0xpc3RRdWV1ZWRNZXNzYWdlcycsXG4gICAgICAnTGlzdFNlcnZpY2VQcm9maWxlcycsXG4gICAgICAnTGlzdFRhZ3NGb3JSZXNvdXJjZScsXG4gICAgICAnTGlzdFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFza3MnLFxuICAgICAgJ0xpc3RXaXJlbGVzc0RldmljZXMnLFxuICAgICAgJ0xpc3RXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbnMnLFxuICAgICAgJ0xpc3RXaXJlbGVzc0dhdGV3YXlzJ1xuICAgIF0sXG4gICAgVGFnZ2luZzogW1xuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgRGVzdGluYXRpb24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0NyZWF0ZURlc3RpbmF0aW9uLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGRlc3RpbmF0aW9uTmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSBkZXN0aW5hdGlvbk5hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkRlc3RpbmF0aW9uKGRlc3RpbmF0aW9uTmFtZTogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmlvdHdpcmVsZXNzOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpEZXN0aW5hdGlvbi8keyBkZXN0aW5hdGlvbk5hbWUgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIERldmljZVByb2ZpbGUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0NyZWF0ZURldmljZVByb2ZpbGUuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlUHJvZmlsZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGRldmljZVByb2ZpbGVJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uRGV2aWNlUHJvZmlsZShkZXZpY2VQcm9maWxlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTppb3R3aXJlbGVzczokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06RGV2aWNlUHJvZmlsZS8keyBkZXZpY2VQcm9maWxlSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIEZ1b3RhVGFzayB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfQ3JlYXRlRnVvdGFUYXNrLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGZ1b3RhVGFza0lkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZ1b3RhVGFza0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25GdW90YVRhc2soZnVvdGFUYXNrSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTppb3R3aXJlbGVzczokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06RnVvdGFUYXNrLyR7IGZ1b3RhVGFza0lkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBJbXBvcnRUYXNrIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9TdGFydFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzay5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBpbXBvcnRUYXNrSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgaW1wb3J0VGFza0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25JbXBvcnRUYXNrKGltcG9ydFRhc2tJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmlvdHdpcmVsZXNzOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpJbXBvcnRUYXNrLyR7IGltcG9ydFRhc2tJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgTXVsdGljYXN0R3JvdXAgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90LXdpcmVsZXNzL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX0NyZWF0ZU11bHRpY2FzdEdyb3VwLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIG11bHRpY2FzdEdyb3VwSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbXVsdGljYXN0R3JvdXBJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTXVsdGljYXN0R3JvdXAobXVsdGljYXN0R3JvdXBJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmlvdHdpcmVsZXNzOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpNdWx0aWNhc3RHcm91cC8keyBtdWx0aWNhc3RHcm91cElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBOZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9uIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9DcmVhdGVOZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9uLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIG5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb25OYW1lIC0gSWRlbnRpZmllciBmb3IgdGhlIG5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb25OYW1lLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25OZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9uKG5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb25OYW1lOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06aW90d2lyZWxlc3M6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9Ok5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24vJHsgbmV0d29ya0FuYWx5emVyQ29uZmlndXJhdGlvbk5hbWUgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIFNlcnZpY2VQcm9maWxlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9DcmVhdGVTZXJ2aWNlUHJvZmlsZS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlUHJvZmlsZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHNlcnZpY2VQcm9maWxlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblNlcnZpY2VQcm9maWxlKHNlcnZpY2VQcm9maWxlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTppb3R3aXJlbGVzczokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06U2VydmljZVByb2ZpbGUvJHsgc2VydmljZVByb2ZpbGVJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgU2lkZXdhbGtBY2NvdW50IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2lvdC13aXJlbGVzcy9sYXRlc3QvYXBpcmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVBd3NBY2NvdW50V2l0aFBhcnRuZXJBY2NvdW50Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHNpZGV3YWxrQWNjb3VudElkIC0gSWRlbnRpZmllciBmb3IgdGhlIHNpZGV3YWxrQWNjb3VudElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25TaWRld2Fsa0FjY291bnQoc2lkZXdhbGtBY2NvdW50SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTppb3R3aXJlbGVzczokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06U2lkZXdhbGtBY2NvdW50LyR7IHNpZGV3YWxrQWNjb3VudElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBXaXJlbGVzc0RldmljZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfQ3JlYXRlV2lyZWxlc3NEZXZpY2UuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gd2lyZWxlc3NEZXZpY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB3aXJlbGVzc0RldmljZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25XaXJlbGVzc0RldmljZSh3aXJlbGVzc0RldmljZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06aW90d2lyZWxlc3M6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OldpcmVsZXNzRGV2aWNlLyR7IHdpcmVsZXNzRGV2aWNlSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIFdpcmVsZXNzR2F0ZXdheSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfQ3JlYXRlV2lyZWxlc3NHYXRld2F5Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHdpcmVsZXNzR2F0ZXdheUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHdpcmVsZXNzR2F0ZXdheUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25XaXJlbGVzc0dhdGV3YXkod2lyZWxlc3NHYXRld2F5SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTppb3R3aXJlbGVzczokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06V2lyZWxlc3NHYXRld2F5LyR7IHdpcmVsZXNzR2F0ZXdheUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3Qtd2lyZWxlc3MvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfQ3JlYXRlV2lyZWxlc3NHYXRld2F5VGFza0RlZmluaXRpb24uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gd2lyZWxlc3NHYXRld2F5VGFza0RlZmluaXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSB3aXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25XaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbih3aXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06aW90d2lyZWxlc3M6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OldpcmVsZXNzR2F0ZXdheVRhc2tEZWZpbml0aW9uLyR7IHdpcmVsZXNzR2F0ZXdheVRhc2tEZWZpbml0aW9uSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGNlcnQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW90L2xhdGVzdC9kZXZlbG9wZXJndWlkZS94NTA5LWNsaWVudC1jZXJ0cy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjZXJ0aWZpY2F0ZSAtIElkZW50aWZpZXIgZm9yIHRoZSBjZXJ0aWZpY2F0ZS5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqL1xuICBwdWJsaWMgb25DZXJ0KGNlcnRpZmljYXRlOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06aW90OiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjZXJ0LyR7IGNlcnRpZmljYXRlIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB0aGluZyB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pb3QvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3RoaW5nLXJlZ2lzdHJ5Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHRoaW5nTmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSB0aGluZ05hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uVGhpbmcodGhpbmdOYW1lOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06aW90OiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp0aGluZy8keyB0aGluZ05hbWUgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGEgdGFnIGtleSB0aGF0IGlzIHByZXNlbnQgaW4gdGhlIHJlcXVlc3QgdGhhdCB0aGUgdXNlciBtYWtlcyB0byBJb1QgV2lyZWxlc3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlcXVlc3R0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZUF3c0FjY291bnRXaXRoUGFydG5lckFjY291bnQoKVxuICAgKiAtIC50b0NyZWF0ZURlc3RpbmF0aW9uKClcbiAgICogLSAudG9DcmVhdGVEZXZpY2VQcm9maWxlKClcbiAgICogLSAudG9DcmVhdGVGdW90YVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZU11bHRpY2FzdEdyb3VwKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9DcmVhdGVTZXJ2aWNlUHJvZmlsZSgpXG4gICAqIC0gLnRvQ3JlYXRlV2lyZWxlc3NEZXZpY2UoKVxuICAgKiAtIC50b0NyZWF0ZVdpcmVsZXNzR2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlV2lyZWxlc3NHYXRld2F5VGFza0RlZmluaXRpb24oKVxuICAgKiAtIC50b1N0YXJ0U2luZ2xlV2lyZWxlc3NEZXZpY2VJbXBvcnRUYXNrKClcbiAgICogLSAudG9TdGFydFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaygpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGFnIGtleSBjb21wb25lbnQgb2YgYSB0YWcgYXR0YWNoZWQgdG8gYW4gSW9UIFdpcmVsZXNzIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXNvdXJjZXRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlTXVsdGljYXN0R3JvdXBXaXRoRnVvdGFUYXNrKClcbiAgICogLSAudG9Bc3NvY2lhdGVXaXJlbGVzc0RldmljZVdpdGhGdW90YVRhc2soKVxuICAgKiAtIC50b0Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlV2l0aE11bHRpY2FzdEdyb3VwKClcbiAgICogLSAudG9Bc3NvY2lhdGVXaXJlbGVzc0RldmljZVdpdGhUaGluZygpXG4gICAqIC0gLnRvQXNzb2NpYXRlV2lyZWxlc3NHYXRld2F5V2l0aENlcnRpZmljYXRlKClcbiAgICogLSAudG9Bc3NvY2lhdGVXaXJlbGVzc0dhdGV3YXlXaXRoVGhpbmcoKVxuICAgKiAtIC50b0NhbmNlbE11bHRpY2FzdEdyb3VwU2Vzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0FuYWx5emVyQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlV2lyZWxlc3NEZXZpY2UoKVxuICAgKiAtIC50b0NyZWF0ZVdpcmVsZXNzR2F0ZXdheVRhc2soKVxuICAgKiAtIC50b0RlbGV0ZURlc3RpbmF0aW9uKClcbiAgICogLSAudG9EZWxldGVEZXZpY2VQcm9maWxlKClcbiAgICogLSAudG9EZWxldGVGdW90YVRhc2soKVxuICAgKiAtIC50b0RlbGV0ZU11bHRpY2FzdEdyb3VwKClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrQW5hbHl6ZXJDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9EZWxldGVTZXJ2aWNlUHJvZmlsZSgpXG4gICAqIC0gLnRvRGVsZXRlV2lyZWxlc3NEZXZpY2UoKVxuICAgKiAtIC50b0RlbGV0ZVdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaygpXG4gICAqIC0gLnRvRGVsZXRlV2lyZWxlc3NHYXRld2F5KClcbiAgICogLSAudG9EZWxldGVXaXJlbGVzc0dhdGV3YXlUYXNrKClcbiAgICogLSAudG9EZWxldGVXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbigpXG4gICAqIC0gLnRvRGVyZWdpc3RlcldpcmVsZXNzRGV2aWNlKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVBd3NBY2NvdW50RnJvbVBhcnRuZXJBY2NvdW50KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNdWx0aWNhc3RHcm91cEZyb21GdW90YVRhc2soKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlRnJvbUZ1b3RhVGFzaygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VGcm9tTXVsdGljYXN0R3JvdXAoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVdpcmVsZXNzRGV2aWNlRnJvbVRoaW5nKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVXaXJlbGVzc0dhdGV3YXlGcm9tQ2VydGlmaWNhdGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVdpcmVsZXNzR2F0ZXdheUZyb21UaGluZygpXG4gICAqIC0gLnRvR2V0RGVzdGluYXRpb24oKVxuICAgKiAtIC50b0dldERldmljZVByb2ZpbGUoKVxuICAgKiAtIC50b0dldEZ1b3RhVGFzaygpXG4gICAqIC0gLnRvR2V0TXVsdGljYXN0R3JvdXAoKVxuICAgKiAtIC50b0dldE11bHRpY2FzdEdyb3VwU2Vzc2lvbigpXG4gICAqIC0gLnRvR2V0TmV0d29ya0FuYWx5emVyQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0UGFydG5lckFjY291bnQoKVxuICAgKiAtIC50b0dldFBvc2l0aW9uKClcbiAgICogLSAudG9HZXRQb3NpdGlvbkNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0dldFJlc291cmNlRXZlbnRDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9HZXRSZXNvdXJjZUxvZ0xldmVsKClcbiAgICogLSAudG9HZXRSZXNvdXJjZVBvc2l0aW9uKClcbiAgICogLSAudG9HZXRTZXJ2aWNlUHJvZmlsZSgpXG4gICAqIC0gLnRvR2V0V2lyZWxlc3NEZXZpY2UoKVxuICAgKiAtIC50b0dldFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaygpXG4gICAqIC0gLnRvR2V0V2lyZWxlc3NEZXZpY2VTdGF0aXN0aWNzKClcbiAgICogLSAudG9HZXRXaXJlbGVzc0dhdGV3YXkoKVxuICAgKiAtIC50b0dldFdpcmVsZXNzR2F0ZXdheUNlcnRpZmljYXRlKClcbiAgICogLSAudG9HZXRXaXJlbGVzc0dhdGV3YXlGaXJtd2FyZUluZm9ybWF0aW9uKClcbiAgICogLSAudG9HZXRXaXJlbGVzc0dhdGV3YXlTdGF0aXN0aWNzKClcbiAgICogLSAudG9HZXRXaXJlbGVzc0dhdGV3YXlUYXNrKClcbiAgICogLSAudG9HZXRXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbigpXG4gICAqIC0gLnRvTGlzdERldmljZXNGb3JXaXJlbGVzc0RldmljZUltcG9ydFRhc2soKVxuICAgKiAtIC50b0xpc3RNdWx0aWNhc3RHcm91cHNCeUZ1b3RhVGFzaygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvUHV0UG9zaXRpb25Db25maWd1cmF0aW9uKClcbiAgICogLSAudG9QdXRSZXNvdXJjZUxvZ0xldmVsKClcbiAgICogLSAudG9SZXNldFJlc291cmNlTG9nTGV2ZWwoKVxuICAgKiAtIC50b1NlbmREYXRhVG9NdWx0aWNhc3RHcm91cCgpXG4gICAqIC0gLnRvU2VuZERhdGFUb1dpcmVsZXNzRGV2aWNlKClcbiAgICogLSAudG9TdGFydEJ1bGtBc3NvY2lhdGVXaXJlbGVzc0RldmljZVdpdGhNdWx0aWNhc3RHcm91cCgpXG4gICAqIC0gLnRvU3RhcnRCdWxrRGlzYXNzb2NpYXRlV2lyZWxlc3NEZXZpY2VGcm9tTXVsdGljYXN0R3JvdXAoKVxuICAgKiAtIC50b1N0YXJ0RnVvdGFUYXNrKClcbiAgICogLSAudG9TdGFydE11bHRpY2FzdEdyb3VwU2Vzc2lvbigpXG4gICAqIC0gLnRvU3RhcnROZXR3b3JrQW5hbHl6ZXJTdHJlYW0oKVxuICAgKiAtIC50b1N0YXJ0U2luZ2xlV2lyZWxlc3NEZXZpY2VJbXBvcnRUYXNrKClcbiAgICogLSAudG9TdGFydFdpcmVsZXNzRGV2aWNlSW1wb3J0VGFzaygpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1Rlc3RXaXJlbGVzc0RldmljZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlRGVzdGluYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZUZ1b3RhVGFzaygpXG4gICAqIC0gLnRvVXBkYXRlTXVsdGljYXN0R3JvdXAoKVxuICAgKiAtIC50b1VwZGF0ZU5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVBhcnRuZXJBY2NvdW50KClcbiAgICogLSAudG9VcGRhdGVQb3NpdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlUmVzb3VyY2VFdmVudENvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVJlc291cmNlUG9zaXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVdpcmVsZXNzRGV2aWNlKClcbiAgICogLSAudG9VcGRhdGVXaXJlbGVzc0RldmljZUltcG9ydFRhc2soKVxuICAgKiAtIC50b1VwZGF0ZVdpcmVsZXNzR2F0ZXdheSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gRGVzdGluYXRpb25cbiAgICogLSBEZXZpY2VQcm9maWxlXG4gICAqIC0gRnVvdGFUYXNrXG4gICAqIC0gSW1wb3J0VGFza1xuICAgKiAtIE11bHRpY2FzdEdyb3VwXG4gICAqIC0gTmV0d29ya0FuYWx5emVyQ29uZmlndXJhdGlvblxuICAgKiAtIFNlcnZpY2VQcm9maWxlXG4gICAqIC0gU2lkZXdhbGtBY2NvdW50XG4gICAqIC0gV2lyZWxlc3NEZXZpY2VcbiAgICogLSBXaXJlbGVzc0dhdGV3YXlcbiAgICogLSBXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbGlzdCBvZiBhbGwgdGhlIHRhZyBrZXkgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZSBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtdGFna2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlQXdzQWNjb3VudFdpdGhQYXJ0bmVyQWNjb3VudCgpXG4gICAqIC0gLnRvQ3JlYXRlRGVzdGluYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZURldmljZVByb2ZpbGUoKVxuICAgKiAtIC50b0NyZWF0ZUZ1b3RhVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlTXVsdGljYXN0R3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtBbmFseXplckNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVNlcnZpY2VQcm9maWxlKClcbiAgICogLSAudG9DcmVhdGVXaXJlbGVzc0RldmljZSgpXG4gICAqIC0gLnRvQ3JlYXRlV2lyZWxlc3NHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVXaXJlbGVzc0dhdGV3YXlUYXNrRGVmaW5pdGlvbigpXG4gICAqIC0gLnRvU3RhcnRTaW5nbGVXaXJlbGVzc0RldmljZUltcG9ydFRhc2soKVxuICAgKiAtIC50b1N0YXJ0V2lyZWxlc3NEZXZpY2VJbXBvcnRUYXNrKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzVGFnS2V5cyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlRhZ0tleXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBkZXN0aW5hdGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSW9UIFdpcmVsZXNzIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2F3c2lvdHdpcmVsZXNzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZEZXN0aW5hdGlvbk5hbWUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYERlc3RpbmF0aW9uTmFtZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGRldmljZSBwcm9maWxlIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgSW9UIFdpcmVsZXNzIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2F3c2lvdHdpcmVsZXNzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZEZXZpY2VQcm9maWxlSWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYERldmljZVByb2ZpbGVJZGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHNlcnZpY2UgcHJvZmlsZSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIElvVCBXaXJlbGVzcyByZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hd3Npb3R3aXJlbGVzcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmU2VydmljZVByb2ZpbGVJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU2VydmljZVByb2ZpbGVJZGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbaW90d2lyZWxlc3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2lvdHdpcmVsZXNzLmh0bWwpLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcHM/OiBpYW0uUG9saWN5U3RhdGVtZW50UHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbn1cbiJdfQ==