// Code generated by azure-service-operator-codegen. DO NOT EDIT.
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
package storage

import (
	v20240101s "github.com/Azure/azure-service-operator/v2/api/network/v1api20240101/storage"
	v20240301s "github.com/Azure/azure-service-operator/v2/api/network/v1api20240301/storage"
	"github.com/Azure/azure-service-operator/v2/pkg/genruntime"
	"github.com/Azure/azure-service-operator/v2/pkg/genruntime/conditions"
	"github.com/Azure/azure-service-operator/v2/pkg/genruntime/configmaps"
	"github.com/Azure/azure-service-operator/v2/pkg/genruntime/core"
	"github.com/Azure/azure-service-operator/v2/pkg/genruntime/secrets"
	"github.com/rotisserie/eris"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime/schema"
)

// +kubebuilder:rbac:groups=network.azure.com,resources=applicationgateways,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=network.azure.com,resources={applicationgateways/status,applicationgateways/finalizers},verbs=get;update;patch

// +kubebuilder:object:root=true
// +kubebuilder:resource:categories={azure,network}
// +kubebuilder:subresource:status
// +kubebuilder:storageversion
// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].status"
// +kubebuilder:printcolumn:name="Severity",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].severity"
// +kubebuilder:printcolumn:name="Reason",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].reason"
// +kubebuilder:printcolumn:name="Message",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].message"
// Storage version of v1api20220701.ApplicationGateway
// Generator information:
// - Generated from: /network/resource-manager/Microsoft.Network/stable/2022-07-01/applicationGateway.json
// - ARM URI: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}
type ApplicationGateway struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`
	Spec              ApplicationGateway_Spec   `json:"spec,omitempty"`
	Status            ApplicationGateway_STATUS `json:"status,omitempty"`
}

var _ conditions.Conditioner = &ApplicationGateway{}

// GetConditions returns the conditions of the resource
func (gateway *ApplicationGateway) GetConditions() conditions.Conditions {
	return gateway.Status.Conditions
}

// SetConditions sets the conditions on the resource status
func (gateway *ApplicationGateway) SetConditions(conditions conditions.Conditions) {
	gateway.Status.Conditions = conditions
}

var _ configmaps.Exporter = &ApplicationGateway{}

// ConfigMapDestinationExpressions returns the Spec.OperatorSpec.ConfigMapExpressions property
func (gateway *ApplicationGateway) ConfigMapDestinationExpressions() []*core.DestinationExpression {
	if gateway.Spec.OperatorSpec == nil {
		return nil
	}
	return gateway.Spec.OperatorSpec.ConfigMapExpressions
}

var _ secrets.Exporter = &ApplicationGateway{}

// SecretDestinationExpressions returns the Spec.OperatorSpec.SecretExpressions property
func (gateway *ApplicationGateway) SecretDestinationExpressions() []*core.DestinationExpression {
	if gateway.Spec.OperatorSpec == nil {
		return nil
	}
	return gateway.Spec.OperatorSpec.SecretExpressions
}

var _ genruntime.KubernetesResource = &ApplicationGateway{}

// AzureName returns the Azure name of the resource
func (gateway *ApplicationGateway) AzureName() string {
	return gateway.Spec.AzureName
}

// GetAPIVersion returns the ARM API version of the resource. This is always "2022-07-01"
func (gateway ApplicationGateway) GetAPIVersion() string {
	return "2022-07-01"
}

// GetResourceScope returns the scope of the resource
func (gateway *ApplicationGateway) GetResourceScope() genruntime.ResourceScope {
	return genruntime.ResourceScopeResourceGroup
}

// GetSpec returns the specification of this resource
func (gateway *ApplicationGateway) GetSpec() genruntime.ConvertibleSpec {
	return &gateway.Spec
}

// GetStatus returns the status of this resource
func (gateway *ApplicationGateway) GetStatus() genruntime.ConvertibleStatus {
	return &gateway.Status
}

// GetSupportedOperations returns the operations supported by the resource
func (gateway *ApplicationGateway) GetSupportedOperations() []genruntime.ResourceOperation {
	return []genruntime.ResourceOperation{
		genruntime.ResourceOperationDelete,
		genruntime.ResourceOperationGet,
		genruntime.ResourceOperationPut,
	}
}

// GetType returns the ARM Type of the resource. This is always "Microsoft.Network/applicationGateways"
func (gateway *ApplicationGateway) GetType() string {
	return "Microsoft.Network/applicationGateways"
}

// NewEmptyStatus returns a new empty (blank) status
func (gateway *ApplicationGateway) NewEmptyStatus() genruntime.ConvertibleStatus {
	return &ApplicationGateway_STATUS{}
}

// Owner returns the ResourceReference of the owner
func (gateway *ApplicationGateway) Owner() *genruntime.ResourceReference {
	if gateway.Spec.Owner == nil {
		return nil
	}

	group, kind := genruntime.LookupOwnerGroupKind(gateway.Spec)
	return gateway.Spec.Owner.AsResourceReference(group, kind)
}

// SetStatus sets the status of this resource
func (gateway *ApplicationGateway) SetStatus(status genruntime.ConvertibleStatus) error {
	// If we have exactly the right type of status, assign it
	if st, ok := status.(*ApplicationGateway_STATUS); ok {
		gateway.Status = *st
		return nil
	}

	// Convert status to required version
	var st ApplicationGateway_STATUS
	err := status.ConvertStatusTo(&st)
	if err != nil {
		return eris.Wrap(err, "failed to convert status")
	}

	gateway.Status = st
	return nil
}

// Hub marks that this ApplicationGateway is the hub type for conversion
func (gateway *ApplicationGateway) Hub() {}

// OriginalGVK returns a GroupValueKind for the original API version used to create the resource
func (gateway *ApplicationGateway) OriginalGVK() *schema.GroupVersionKind {
	return &schema.GroupVersionKind{
		Group:   GroupVersion.Group,
		Version: gateway.Spec.OriginalVersion,
		Kind:    "ApplicationGateway",
	}
}

// +kubebuilder:object:root=true
// Storage version of v1api20220701.ApplicationGateway
// Generator information:
// - Generated from: /network/resource-manager/Microsoft.Network/stable/2022-07-01/applicationGateway.json
// - ARM URI: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}
type ApplicationGatewayList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []ApplicationGateway `json:"items"`
}

// Storage version of v1api20220701.APIVersion
// +kubebuilder:validation:Enum={"2022-07-01"}
type APIVersion string

const APIVersion_Value = APIVersion("2022-07-01")

// Storage version of v1api20220701.ApplicationGateway_Spec
type ApplicationGateway_Spec struct {
	AuthenticationCertificates []ApplicationGatewayAuthenticationCertificate `json:"authenticationCertificates,omitempty"`
	AutoscaleConfiguration     *ApplicationGatewayAutoscaleConfiguration     `json:"autoscaleConfiguration,omitempty"`

	// AzureName: The name of the resource in Azure. This is often the same as the name of the resource in Kubernetes but it
	// doesn't have to be.
	AzureName                      string                                                                     `json:"azureName,omitempty"`
	BackendAddressPools            []ApplicationGatewayBackendAddressPool                                     `json:"backendAddressPools,omitempty"`
	BackendHttpSettingsCollection  []ApplicationGatewayBackendHttpSettings                                    `json:"backendHttpSettingsCollection,omitempty"`
	BackendSettingsCollection      []ApplicationGatewayBackendSettings                                        `json:"backendSettingsCollection,omitempty"`
	CustomErrorConfigurations      []ApplicationGatewayCustomError                                            `json:"customErrorConfigurations,omitempty"`
	EnableFips                     *bool                                                                      `json:"enableFips,omitempty"`
	EnableHttp2                    *bool                                                                      `json:"enableHttp2,omitempty"`
	FirewallPolicy                 *SubResource                                                               `json:"firewallPolicy,omitempty"`
	ForceFirewallPolicyAssociation *bool                                                                      `json:"forceFirewallPolicyAssociation,omitempty"`
	FrontendIPConfigurations       []ApplicationGatewayFrontendIPConfiguration                                `json:"frontendIPConfigurations,omitempty"`
	FrontendPorts                  []ApplicationGatewayFrontendPort                                           `json:"frontendPorts,omitempty"`
	GatewayIPConfigurations        []ApplicationGatewayIPConfiguration_ApplicationGateway_SubResourceEmbedded `json:"gatewayIPConfigurations,omitempty"`
	GlobalConfiguration            *ApplicationGatewayGlobalConfiguration                                     `json:"globalConfiguration,omitempty"`
	HttpListeners                  []ApplicationGatewayHttpListener                                           `json:"httpListeners,omitempty"`
	Identity                       *ManagedServiceIdentity                                                    `json:"identity,omitempty"`
	Listeners                      []ApplicationGatewayListener                                               `json:"listeners,omitempty"`
	LoadDistributionPolicies       []ApplicationGatewayLoadDistributionPolicy                                 `json:"loadDistributionPolicies,omitempty"`
	Location                       *string                                                                    `json:"location,omitempty"`
	OperatorSpec                   *ApplicationGatewayOperatorSpec                                            `json:"operatorSpec,omitempty"`
	OriginalVersion                string                                                                     `json:"originalVersion,omitempty"`

	// +kubebuilder:validation:Required
	// Owner: The owner of the resource. The owner controls where the resource goes when it is deployed. The owner also
	// controls the resources lifecycle. When the owner is deleted the resource will also be deleted. Owner is expected to be a
	// reference to a resources.azure.com/ResourceGroup resource
	Owner                               *genruntime.KnownResourceReference                     `group:"resources.azure.com" json:"owner,omitempty" kind:"ResourceGroup"`
	PrivateLinkConfigurations           []ApplicationGatewayPrivateLinkConfiguration           `json:"privateLinkConfigurations,omitempty"`
	Probes                              []ApplicationGatewayProbe                              `json:"probes,omitempty"`
	PropertyBag                         genruntime.PropertyBag                                 `json:"$propertyBag,omitempty"`
	RedirectConfigurations              []ApplicationGatewayRedirectConfiguration              `json:"redirectConfigurations,omitempty"`
	RequestRoutingRules                 []ApplicationGatewayRequestRoutingRule                 `json:"requestRoutingRules,omitempty"`
	RewriteRuleSets                     []ApplicationGatewayRewriteRuleSet                     `json:"rewriteRuleSets,omitempty"`
	RoutingRules                        []ApplicationGatewayRoutingRule                        `json:"routingRules,omitempty"`
	Sku                                 *ApplicationGatewaySku                                 `json:"sku,omitempty"`
	SslCertificates                     []ApplicationGatewaySslCertificate                     `json:"sslCertificates,omitempty"`
	SslPolicy                           *ApplicationGatewaySslPolicy                           `json:"sslPolicy,omitempty"`
	SslProfiles                         []ApplicationGatewaySslProfile                         `json:"sslProfiles,omitempty"`
	Tags                                map[string]string                                      `json:"tags,omitempty"`
	TrustedClientCertificates           []ApplicationGatewayTrustedClientCertificate           `json:"trustedClientCertificates,omitempty"`
	TrustedRootCertificates             []ApplicationGatewayTrustedRootCertificate             `json:"trustedRootCertificates,omitempty"`
	UrlPathMaps                         []ApplicationGatewayUrlPathMap                         `json:"urlPathMaps,omitempty"`
	WebApplicationFirewallConfiguration *ApplicationGatewayWebApplicationFirewallConfiguration `json:"webApplicationFirewallConfiguration,omitempty"`
	Zones                               []string                                               `json:"zones,omitempty"`
}

var _ genruntime.ConvertibleSpec = &ApplicationGateway_Spec{}

// ConvertSpecFrom populates our ApplicationGateway_Spec from the provided source
func (gateway *ApplicationGateway_Spec) ConvertSpecFrom(source genruntime.ConvertibleSpec) error {
	if source == gateway {
		return eris.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleSpec")
	}

	return source.ConvertSpecTo(gateway)
}

// ConvertSpecTo populates the provided destination from our ApplicationGateway_Spec
func (gateway *ApplicationGateway_Spec) ConvertSpecTo(destination genruntime.ConvertibleSpec) error {
	if destination == gateway {
		return eris.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleSpec")
	}

	return destination.ConvertSpecFrom(gateway)
}

// Storage version of v1api20220701.ApplicationGateway_STATUS
// Application gateway resource.
type ApplicationGateway_STATUS struct {
	AuthenticationCertificates          []ApplicationGatewayAuthenticationCertificate_STATUS                              `json:"authenticationCertificates,omitempty"`
	AutoscaleConfiguration              *ApplicationGatewayAutoscaleConfiguration_STATUS                                  `json:"autoscaleConfiguration,omitempty"`
	BackendAddressPools                 []ApplicationGatewayBackendAddressPool_STATUS                                     `json:"backendAddressPools,omitempty"`
	BackendHttpSettingsCollection       []ApplicationGatewayBackendHttpSettings_STATUS                                    `json:"backendHttpSettingsCollection,omitempty"`
	BackendSettingsCollection           []ApplicationGatewayBackendSettings_STATUS                                        `json:"backendSettingsCollection,omitempty"`
	Conditions                          []conditions.Condition                                                            `json:"conditions,omitempty"`
	CustomErrorConfigurations           []ApplicationGatewayCustomError_STATUS                                            `json:"customErrorConfigurations,omitempty"`
	EnableFips                          *bool                                                                             `json:"enableFips,omitempty"`
	EnableHttp2                         *bool                                                                             `json:"enableHttp2,omitempty"`
	Etag                                *string                                                                           `json:"etag,omitempty"`
	FirewallPolicy                      *SubResource_STATUS                                                               `json:"firewallPolicy,omitempty"`
	ForceFirewallPolicyAssociation      *bool                                                                             `json:"forceFirewallPolicyAssociation,omitempty"`
	FrontendIPConfigurations            []ApplicationGatewayFrontendIPConfiguration_STATUS                                `json:"frontendIPConfigurations,omitempty"`
	FrontendPorts                       []ApplicationGatewayFrontendPort_STATUS                                           `json:"frontendPorts,omitempty"`
	GatewayIPConfigurations             []ApplicationGatewayIPConfiguration_STATUS_ApplicationGateway_SubResourceEmbedded `json:"gatewayIPConfigurations,omitempty"`
	GlobalConfiguration                 *ApplicationGatewayGlobalConfiguration_STATUS                                     `json:"globalConfiguration,omitempty"`
	HttpListeners                       []ApplicationGatewayHttpListener_STATUS                                           `json:"httpListeners,omitempty"`
	Id                                  *string                                                                           `json:"id,omitempty"`
	Identity                            *ManagedServiceIdentity_STATUS                                                    `json:"identity,omitempty"`
	Listeners                           []ApplicationGatewayListener_STATUS                                               `json:"listeners,omitempty"`
	LoadDistributionPolicies            []ApplicationGatewayLoadDistributionPolicy_STATUS                                 `json:"loadDistributionPolicies,omitempty"`
	Location                            *string                                                                           `json:"location,omitempty"`
	Name                                *string                                                                           `json:"name,omitempty"`
	OperationalState                    *string                                                                           `json:"operationalState,omitempty"`
	PrivateEndpointConnections          []ApplicationGatewayPrivateEndpointConnection_STATUS                              `json:"privateEndpointConnections,omitempty"`
	PrivateLinkConfigurations           []ApplicationGatewayPrivateLinkConfiguration_STATUS                               `json:"privateLinkConfigurations,omitempty"`
	Probes                              []ApplicationGatewayProbe_STATUS                                                  `json:"probes,omitempty"`
	PropertyBag                         genruntime.PropertyBag                                                            `json:"$propertyBag,omitempty"`
	ProvisioningState                   *string                                                                           `json:"provisioningState,omitempty"`
	RedirectConfigurations              []ApplicationGatewayRedirectConfiguration_STATUS                                  `json:"redirectConfigurations,omitempty"`
	RequestRoutingRules                 []ApplicationGatewayRequestRoutingRule_STATUS                                     `json:"requestRoutingRules,omitempty"`
	ResourceGuid                        *string                                                                           `json:"resourceGuid,omitempty"`
	RewriteRuleSets                     []ApplicationGatewayRewriteRuleSet_STATUS                                         `json:"rewriteRuleSets,omitempty"`
	RoutingRules                        []ApplicationGatewayRoutingRule_STATUS                                            `json:"routingRules,omitempty"`
	Sku                                 *ApplicationGatewaySku_STATUS                                                     `json:"sku,omitempty"`
	SslCertificates                     []ApplicationGatewaySslCertificate_STATUS                                         `json:"sslCertificates,omitempty"`
	SslPolicy                           *ApplicationGatewaySslPolicy_STATUS                                               `json:"sslPolicy,omitempty"`
	SslProfiles                         []ApplicationGatewaySslProfile_STATUS                                             `json:"sslProfiles,omitempty"`
	Tags                                map[string]string                                                                 `json:"tags,omitempty"`
	TrustedClientCertificates           []ApplicationGatewayTrustedClientCertificate_STATUS                               `json:"trustedClientCertificates,omitempty"`
	TrustedRootCertificates             []ApplicationGatewayTrustedRootCertificate_STATUS                                 `json:"trustedRootCertificates,omitempty"`
	Type                                *string                                                                           `json:"type,omitempty"`
	UrlPathMaps                         []ApplicationGatewayUrlPathMap_STATUS                                             `json:"urlPathMaps,omitempty"`
	WebApplicationFirewallConfiguration *ApplicationGatewayWebApplicationFirewallConfiguration_STATUS                     `json:"webApplicationFirewallConfiguration,omitempty"`
	Zones                               []string                                                                          `json:"zones,omitempty"`
}

var _ genruntime.ConvertibleStatus = &ApplicationGateway_STATUS{}

// ConvertStatusFrom populates our ApplicationGateway_STATUS from the provided source
func (gateway *ApplicationGateway_STATUS) ConvertStatusFrom(source genruntime.ConvertibleStatus) error {
	if source == gateway {
		return eris.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleStatus")
	}

	return source.ConvertStatusTo(gateway)
}

// ConvertStatusTo populates the provided destination from our ApplicationGateway_STATUS
func (gateway *ApplicationGateway_STATUS) ConvertStatusTo(destination genruntime.ConvertibleStatus) error {
	if destination == gateway {
		return eris.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleStatus")
	}

	return destination.ConvertStatusFrom(gateway)
}

// Storage version of v1api20220701.ApplicationGatewayAuthenticationCertificate
// Authentication certificates of an application gateway.
type ApplicationGatewayAuthenticationCertificate struct {
	Data        *genruntime.SecretReference `json:"data,omitempty"`
	Name        *string                     `json:"name,omitempty"`
	PropertyBag genruntime.PropertyBag      `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayAuthenticationCertificate_STATUS
// Authentication certificates of an application gateway.
type ApplicationGatewayAuthenticationCertificate_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayAutoscaleConfiguration
// Application Gateway autoscale configuration.
type ApplicationGatewayAutoscaleConfiguration struct {
	MaxCapacity *int                   `json:"maxCapacity,omitempty"`
	MinCapacity *int                   `json:"minCapacity,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayAutoscaleConfiguration_STATUS
// Application Gateway autoscale configuration.
type ApplicationGatewayAutoscaleConfiguration_STATUS struct {
	MaxCapacity *int                   `json:"maxCapacity,omitempty"`
	MinCapacity *int                   `json:"minCapacity,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayBackendAddressPool
// Backend Address Pool of an application gateway.
type ApplicationGatewayBackendAddressPool struct {
	BackendAddresses []ApplicationGatewayBackendAddress `json:"backendAddresses,omitempty"`
	Name             *string                            `json:"name,omitempty"`
	PropertyBag      genruntime.PropertyBag             `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayBackendAddressPool_STATUS
// Backend Address Pool of an application gateway.
type ApplicationGatewayBackendAddressPool_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayBackendHttpSettings
// Backend address pool settings of an application gateway.
type ApplicationGatewayBackendHttpSettings struct {
	AffinityCookieName             *string                               `json:"affinityCookieName,omitempty"`
	AuthenticationCertificates     []SubResource                         `json:"authenticationCertificates,omitempty"`
	ConnectionDraining             *ApplicationGatewayConnectionDraining `json:"connectionDraining,omitempty"`
	CookieBasedAffinity            *string                               `json:"cookieBasedAffinity,omitempty"`
	HostName                       *string                               `json:"hostName,omitempty"`
	Name                           *string                               `json:"name,omitempty"`
	Path                           *string                               `json:"path,omitempty"`
	PickHostNameFromBackendAddress *bool                                 `json:"pickHostNameFromBackendAddress,omitempty"`
	Port                           *int                                  `json:"port,omitempty"`
	Probe                          *SubResource                          `json:"probe,omitempty"`
	ProbeEnabled                   *bool                                 `json:"probeEnabled,omitempty"`
	PropertyBag                    genruntime.PropertyBag                `json:"$propertyBag,omitempty"`
	Protocol                       *string                               `json:"protocol,omitempty"`
	RequestTimeout                 *int                                  `json:"requestTimeout,omitempty"`
	TrustedRootCertificates        []SubResource                         `json:"trustedRootCertificates,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayBackendHttpSettings_STATUS
// Backend address pool settings of an application gateway.
type ApplicationGatewayBackendHttpSettings_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayBackendSettings
// Backend address pool settings of an application gateway.
type ApplicationGatewayBackendSettings struct {
	HostName                       *string                `json:"hostName,omitempty"`
	Name                           *string                `json:"name,omitempty"`
	PickHostNameFromBackendAddress *bool                  `json:"pickHostNameFromBackendAddress,omitempty"`
	Port                           *int                   `json:"port,omitempty"`
	Probe                          *SubResource           `json:"probe,omitempty"`
	PropertyBag                    genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Protocol                       *string                `json:"protocol,omitempty"`
	Timeout                        *int                   `json:"timeout,omitempty"`
	TrustedRootCertificates        []SubResource          `json:"trustedRootCertificates,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayBackendSettings_STATUS
// Backend address pool settings of an application gateway.
type ApplicationGatewayBackendSettings_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayCustomError
// Customer error of an application gateway.
type ApplicationGatewayCustomError struct {
	CustomErrorPageUrl *string                `json:"customErrorPageUrl,omitempty"`
	PropertyBag        genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	StatusCode         *string                `json:"statusCode,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayCustomError_STATUS
// Customer error of an application gateway.
type ApplicationGatewayCustomError_STATUS struct {
	CustomErrorPageUrl *string                `json:"customErrorPageUrl,omitempty"`
	PropertyBag        genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	StatusCode         *string                `json:"statusCode,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayFrontendIPConfiguration
// Frontend IP configuration of an application gateway.
type ApplicationGatewayFrontendIPConfiguration struct {
	Name                      *string                `json:"name,omitempty"`
	PrivateIPAddress          *string                `json:"privateIPAddress,omitempty"`
	PrivateIPAllocationMethod *string                `json:"privateIPAllocationMethod,omitempty"`
	PrivateLinkConfiguration  *SubResource           `json:"privateLinkConfiguration,omitempty"`
	PropertyBag               genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	PublicIPAddress           *SubResource           `json:"publicIPAddress,omitempty"`
	Subnet                    *SubResource           `json:"subnet,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayFrontendIPConfiguration_STATUS
// Frontend IP configuration of an application gateway.
type ApplicationGatewayFrontendIPConfiguration_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayFrontendPort
// Frontend port of an application gateway.
type ApplicationGatewayFrontendPort struct {
	Name        *string                `json:"name,omitempty"`
	Port        *int                   `json:"port,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayFrontendPort_STATUS
// Frontend port of an application gateway.
type ApplicationGatewayFrontendPort_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayGlobalConfiguration
// Application Gateway global configuration.
type ApplicationGatewayGlobalConfiguration struct {
	EnableRequestBuffering  *bool                  `json:"enableRequestBuffering,omitempty"`
	EnableResponseBuffering *bool                  `json:"enableResponseBuffering,omitempty"`
	PropertyBag             genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayGlobalConfiguration_STATUS
// Application Gateway global configuration.
type ApplicationGatewayGlobalConfiguration_STATUS struct {
	EnableRequestBuffering  *bool                  `json:"enableRequestBuffering,omitempty"`
	EnableResponseBuffering *bool                  `json:"enableResponseBuffering,omitempty"`
	PropertyBag             genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayHttpListener
// Http listener of an application gateway.
type ApplicationGatewayHttpListener struct {
	CustomErrorConfigurations   []ApplicationGatewayCustomError `json:"customErrorConfigurations,omitempty"`
	FirewallPolicy              *SubResource                    `json:"firewallPolicy,omitempty"`
	FrontendIPConfiguration     *SubResource                    `json:"frontendIPConfiguration,omitempty"`
	FrontendPort                *SubResource                    `json:"frontendPort,omitempty"`
	HostName                    *string                         `json:"hostName,omitempty"`
	HostNames                   []string                        `json:"hostNames,omitempty"`
	Name                        *string                         `json:"name,omitempty"`
	PropertyBag                 genruntime.PropertyBag          `json:"$propertyBag,omitempty"`
	Protocol                    *string                         `json:"protocol,omitempty"`
	RequireServerNameIndication *bool                           `json:"requireServerNameIndication,omitempty"`
	SslCertificate              *SubResource                    `json:"sslCertificate,omitempty"`
	SslProfile                  *SubResource                    `json:"sslProfile,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayHttpListener_STATUS
// Http listener of an application gateway.
type ApplicationGatewayHttpListener_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayIPConfiguration_ApplicationGateway_SubResourceEmbedded
// IP configuration of an application gateway. Currently 1 public and 1 private IP configuration is allowed.
type ApplicationGatewayIPConfiguration_ApplicationGateway_SubResourceEmbedded struct {
	Name        *string                `json:"name,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Subnet      *SubResource           `json:"subnet,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayIPConfiguration_STATUS_ApplicationGateway_SubResourceEmbedded
// IP configuration of an application gateway. Currently 1 public and 1 private IP configuration is allowed.
type ApplicationGatewayIPConfiguration_STATUS_ApplicationGateway_SubResourceEmbedded struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayListener
// Listener of an application gateway.
type ApplicationGatewayListener struct {
	FrontendIPConfiguration *SubResource           `json:"frontendIPConfiguration,omitempty"`
	FrontendPort            *SubResource           `json:"frontendPort,omitempty"`
	Name                    *string                `json:"name,omitempty"`
	PropertyBag             genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Protocol                *string                `json:"protocol,omitempty"`
	SslCertificate          *SubResource           `json:"sslCertificate,omitempty"`
	SslProfile              *SubResource           `json:"sslProfile,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayListener_STATUS
// Listener of an application gateway.
type ApplicationGatewayListener_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayLoadDistributionPolicy
// Load Distribution Policy of an application gateway.
type ApplicationGatewayLoadDistributionPolicy struct {
	LoadDistributionAlgorithm *string                                    `json:"loadDistributionAlgorithm,omitempty"`
	LoadDistributionTargets   []ApplicationGatewayLoadDistributionTarget `json:"loadDistributionTargets,omitempty"`
	Name                      *string                                    `json:"name,omitempty"`
	PropertyBag               genruntime.PropertyBag                     `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayLoadDistributionPolicy_STATUS
// Load Distribution Policy of an application gateway.
type ApplicationGatewayLoadDistributionPolicy_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayOperatorSpec
// Details for configuring operator behavior. Fields in this struct are interpreted by the operator directly rather than being passed to Azure
type ApplicationGatewayOperatorSpec struct {
	ConfigMapExpressions []*core.DestinationExpression `json:"configMapExpressions,omitempty"`
	PropertyBag          genruntime.PropertyBag        `json:"$propertyBag,omitempty"`
	SecretExpressions    []*core.DestinationExpression `json:"secretExpressions,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayPrivateEndpointConnection_STATUS
// Private Endpoint connection on an application gateway.
type ApplicationGatewayPrivateEndpointConnection_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayPrivateLinkConfiguration
// Private Link Configuration on an application gateway.
type ApplicationGatewayPrivateLinkConfiguration struct {
	IpConfigurations []ApplicationGatewayPrivateLinkIpConfiguration `json:"ipConfigurations,omitempty"`
	Name             *string                                        `json:"name,omitempty"`
	PropertyBag      genruntime.PropertyBag                         `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayPrivateLinkConfiguration_STATUS
// Private Link Configuration on an application gateway.
type ApplicationGatewayPrivateLinkConfiguration_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayProbe
// Probe of the application gateway.
type ApplicationGatewayProbe struct {
	Host                                *string                                     `json:"host,omitempty"`
	Interval                            *int                                        `json:"interval,omitempty"`
	Match                               *ApplicationGatewayProbeHealthResponseMatch `json:"match,omitempty"`
	MinServers                          *int                                        `json:"minServers,omitempty"`
	Name                                *string                                     `json:"name,omitempty"`
	Path                                *string                                     `json:"path,omitempty"`
	PickHostNameFromBackendHttpSettings *bool                                       `json:"pickHostNameFromBackendHttpSettings,omitempty"`
	PickHostNameFromBackendSettings     *bool                                       `json:"pickHostNameFromBackendSettings,omitempty"`
	Port                                *int                                        `json:"port,omitempty"`
	PropertyBag                         genruntime.PropertyBag                      `json:"$propertyBag,omitempty"`
	Protocol                            *string                                     `json:"protocol,omitempty"`
	Timeout                             *int                                        `json:"timeout,omitempty"`
	UnhealthyThreshold                  *int                                        `json:"unhealthyThreshold,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayProbe_STATUS
// Probe of the application gateway.
type ApplicationGatewayProbe_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayRedirectConfiguration
// Redirect configuration of an application gateway.
type ApplicationGatewayRedirectConfiguration struct {
	IncludePath         *bool                  `json:"includePath,omitempty"`
	IncludeQueryString  *bool                  `json:"includeQueryString,omitempty"`
	Name                *string                `json:"name,omitempty"`
	PathRules           []SubResource          `json:"pathRules,omitempty"`
	PropertyBag         genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	RedirectType        *string                `json:"redirectType,omitempty"`
	RequestRoutingRules []SubResource          `json:"requestRoutingRules,omitempty"`
	TargetListener      *SubResource           `json:"targetListener,omitempty"`
	TargetUrl           *string                `json:"targetUrl,omitempty"`
	UrlPathMaps         []SubResource          `json:"urlPathMaps,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayRedirectConfiguration_STATUS
// Redirect configuration of an application gateway.
type ApplicationGatewayRedirectConfiguration_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayRequestRoutingRule
// Request routing rule of an application gateway.
type ApplicationGatewayRequestRoutingRule struct {
	BackendAddressPool     *SubResource           `json:"backendAddressPool,omitempty"`
	BackendHttpSettings    *SubResource           `json:"backendHttpSettings,omitempty"`
	HttpListener           *SubResource           `json:"httpListener,omitempty"`
	LoadDistributionPolicy *SubResource           `json:"loadDistributionPolicy,omitempty"`
	Name                   *string                `json:"name,omitempty"`
	Priority               *int                   `json:"priority,omitempty"`
	PropertyBag            genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	RedirectConfiguration  *SubResource           `json:"redirectConfiguration,omitempty"`
	RewriteRuleSet         *SubResource           `json:"rewriteRuleSet,omitempty"`
	RuleType               *string                `json:"ruleType,omitempty"`
	UrlPathMap             *SubResource           `json:"urlPathMap,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayRequestRoutingRule_STATUS
// Request routing rule of an application gateway.
type ApplicationGatewayRequestRoutingRule_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayRewriteRuleSet
// Rewrite rule set of an application gateway.
type ApplicationGatewayRewriteRuleSet struct {
	Name         *string                         `json:"name,omitempty"`
	PropertyBag  genruntime.PropertyBag          `json:"$propertyBag,omitempty"`
	RewriteRules []ApplicationGatewayRewriteRule `json:"rewriteRules,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayRewriteRuleSet_STATUS
// Rewrite rule set of an application gateway.
type ApplicationGatewayRewriteRuleSet_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayRoutingRule
// Routing rule of an application gateway.
type ApplicationGatewayRoutingRule struct {
	BackendAddressPool *SubResource           `json:"backendAddressPool,omitempty"`
	BackendSettings    *SubResource           `json:"backendSettings,omitempty"`
	Listener           *SubResource           `json:"listener,omitempty"`
	Name               *string                `json:"name,omitempty"`
	Priority           *int                   `json:"priority,omitempty"`
	PropertyBag        genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	RuleType           *string                `json:"ruleType,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayRoutingRule_STATUS
// Routing rule of an application gateway.
type ApplicationGatewayRoutingRule_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewaySku
// SKU of an application gateway.
type ApplicationGatewaySku struct {
	Capacity    *int                   `json:"capacity,omitempty"`
	Name        *string                `json:"name,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Tier        *string                `json:"tier,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewaySku_STATUS
// SKU of an application gateway.
type ApplicationGatewaySku_STATUS struct {
	Capacity    *int                   `json:"capacity,omitempty"`
	Name        *string                `json:"name,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Tier        *string                `json:"tier,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewaySslCertificate
// SSL certificates of an application gateway.
type ApplicationGatewaySslCertificate struct {
	Data             *genruntime.SecretReference `json:"data,omitempty"`
	KeyVaultSecretId *string                     `json:"keyVaultSecretId,omitempty"`
	Name             *string                     `json:"name,omitempty"`
	Password         *genruntime.SecretReference `json:"password,omitempty"`
	PropertyBag      genruntime.PropertyBag      `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewaySslCertificate_STATUS
// SSL certificates of an application gateway.
type ApplicationGatewaySslCertificate_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewaySslPolicy
// Application Gateway Ssl policy.
type ApplicationGatewaySslPolicy struct {
	CipherSuites         []string               `json:"cipherSuites,omitempty"`
	DisabledSslProtocols []string               `json:"disabledSslProtocols,omitempty"`
	MinProtocolVersion   *string                `json:"minProtocolVersion,omitempty"`
	PolicyName           *string                `json:"policyName,omitempty"`
	PolicyType           *string                `json:"policyType,omitempty"`
	PropertyBag          genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewaySslPolicy_STATUS
// Application Gateway Ssl policy.
type ApplicationGatewaySslPolicy_STATUS struct {
	CipherSuites         []string               `json:"cipherSuites,omitempty"`
	DisabledSslProtocols []string               `json:"disabledSslProtocols,omitempty"`
	MinProtocolVersion   *string                `json:"minProtocolVersion,omitempty"`
	PolicyName           *string                `json:"policyName,omitempty"`
	PolicyType           *string                `json:"policyType,omitempty"`
	PropertyBag          genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewaySslProfile
// SSL profile of an application gateway.
type ApplicationGatewaySslProfile struct {
	ClientAuthConfiguration   *ApplicationGatewayClientAuthConfiguration `json:"clientAuthConfiguration,omitempty"`
	Name                      *string                                    `json:"name,omitempty"`
	PropertyBag               genruntime.PropertyBag                     `json:"$propertyBag,omitempty"`
	SslPolicy                 *ApplicationGatewaySslPolicy               `json:"sslPolicy,omitempty"`
	TrustedClientCertificates []SubResource                              `json:"trustedClientCertificates,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewaySslProfile_STATUS
// SSL profile of an application gateway.
type ApplicationGatewaySslProfile_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayTrustedClientCertificate
// Trusted client certificates of an application gateway.
type ApplicationGatewayTrustedClientCertificate struct {
	Data        *genruntime.SecretReference `json:"data,omitempty"`
	Name        *string                     `json:"name,omitempty"`
	PropertyBag genruntime.PropertyBag      `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayTrustedClientCertificate_STATUS
// Trusted client certificates of an application gateway.
type ApplicationGatewayTrustedClientCertificate_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayTrustedRootCertificate
// Trusted Root certificates of an application gateway.
type ApplicationGatewayTrustedRootCertificate struct {
	Data             *genruntime.SecretReference `json:"data,omitempty"`
	KeyVaultSecretId *string                     `json:"keyVaultSecretId,omitempty"`
	Name             *string                     `json:"name,omitempty"`
	PropertyBag      genruntime.PropertyBag      `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayTrustedRootCertificate_STATUS
// Trusted Root certificates of an application gateway.
type ApplicationGatewayTrustedRootCertificate_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayUrlPathMap
// UrlPathMaps give a url path to the backend mapping information for PathBasedRouting.
type ApplicationGatewayUrlPathMap struct {
	DefaultBackendAddressPool     *SubResource                 `json:"defaultBackendAddressPool,omitempty"`
	DefaultBackendHttpSettings    *SubResource                 `json:"defaultBackendHttpSettings,omitempty"`
	DefaultLoadDistributionPolicy *SubResource                 `json:"defaultLoadDistributionPolicy,omitempty"`
	DefaultRedirectConfiguration  *SubResource                 `json:"defaultRedirectConfiguration,omitempty"`
	DefaultRewriteRuleSet         *SubResource                 `json:"defaultRewriteRuleSet,omitempty"`
	Name                          *string                      `json:"name,omitempty"`
	PathRules                     []ApplicationGatewayPathRule `json:"pathRules,omitempty"`
	PropertyBag                   genruntime.PropertyBag       `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayUrlPathMap_STATUS
// UrlPathMaps give a url path to the backend mapping information for PathBasedRouting.
type ApplicationGatewayUrlPathMap_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayWebApplicationFirewallConfiguration
// Application gateway web application firewall configuration.
type ApplicationGatewayWebApplicationFirewallConfiguration struct {
	DisabledRuleGroups     []ApplicationGatewayFirewallDisabledRuleGroup `json:"disabledRuleGroups,omitempty"`
	Enabled                *bool                                         `json:"enabled,omitempty"`
	Exclusions             []ApplicationGatewayFirewallExclusion         `json:"exclusions,omitempty"`
	FileUploadLimitInMb    *int                                          `json:"fileUploadLimitInMb,omitempty"`
	FirewallMode           *string                                       `json:"firewallMode,omitempty"`
	MaxRequestBodySize     *int                                          `json:"maxRequestBodySize,omitempty"`
	MaxRequestBodySizeInKb *int                                          `json:"maxRequestBodySizeInKb,omitempty"`
	PropertyBag            genruntime.PropertyBag                        `json:"$propertyBag,omitempty"`
	RequestBodyCheck       *bool                                         `json:"requestBodyCheck,omitempty"`
	RuleSetType            *string                                       `json:"ruleSetType,omitempty"`
	RuleSetVersion         *string                                       `json:"ruleSetVersion,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayWebApplicationFirewallConfiguration_STATUS
// Application gateway web application firewall configuration.
type ApplicationGatewayWebApplicationFirewallConfiguration_STATUS struct {
	DisabledRuleGroups     []ApplicationGatewayFirewallDisabledRuleGroup_STATUS `json:"disabledRuleGroups,omitempty"`
	Enabled                *bool                                                `json:"enabled,omitempty"`
	Exclusions             []ApplicationGatewayFirewallExclusion_STATUS         `json:"exclusions,omitempty"`
	FileUploadLimitInMb    *int                                                 `json:"fileUploadLimitInMb,omitempty"`
	FirewallMode           *string                                              `json:"firewallMode,omitempty"`
	MaxRequestBodySize     *int                                                 `json:"maxRequestBodySize,omitempty"`
	MaxRequestBodySizeInKb *int                                                 `json:"maxRequestBodySizeInKb,omitempty"`
	PropertyBag            genruntime.PropertyBag                               `json:"$propertyBag,omitempty"`
	RequestBodyCheck       *bool                                                `json:"requestBodyCheck,omitempty"`
	RuleSetType            *string                                              `json:"ruleSetType,omitempty"`
	RuleSetVersion         *string                                              `json:"ruleSetVersion,omitempty"`
}

// Storage version of v1api20220701.ManagedServiceIdentity
// Identity for the resource.
type ManagedServiceIdentity struct {
	PropertyBag            genruntime.PropertyBag        `json:"$propertyBag,omitempty"`
	Type                   *string                       `json:"type,omitempty"`
	UserAssignedIdentities []UserAssignedIdentityDetails `json:"userAssignedIdentities,omitempty"`
}

// AssignProperties_From_ManagedServiceIdentity populates our ManagedServiceIdentity from the provided source ManagedServiceIdentity
func (identity *ManagedServiceIdentity) AssignProperties_From_ManagedServiceIdentity(source *v20240301s.ManagedServiceIdentity) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(source.PropertyBag)

	// Type
	identity.Type = genruntime.ClonePointerToString(source.Type)

	// UserAssignedIdentities
	if source.UserAssignedIdentities != nil {
		userAssignedIdentityList := make([]UserAssignedIdentityDetails, len(source.UserAssignedIdentities))
		for userAssignedIdentityIndex, userAssignedIdentityItem := range source.UserAssignedIdentities {
			var userAssignedIdentity UserAssignedIdentityDetails
			err := userAssignedIdentity.AssignProperties_From_UserAssignedIdentityDetails(&userAssignedIdentityItem)
			if err != nil {
				return eris.Wrap(err, "calling AssignProperties_From_UserAssignedIdentityDetails() to populate field UserAssignedIdentities")
			}
			userAssignedIdentityList[userAssignedIdentityIndex] = userAssignedIdentity
		}
		identity.UserAssignedIdentities = userAssignedIdentityList
	} else {
		identity.UserAssignedIdentities = nil
	}

	// Update the property bag
	if len(propertyBag) > 0 {
		identity.PropertyBag = propertyBag
	} else {
		identity.PropertyBag = nil
	}

	// Invoke the augmentConversionForManagedServiceIdentity interface (if implemented) to customize the conversion
	var identityAsAny any = identity
	if augmentedIdentity, ok := identityAsAny.(augmentConversionForManagedServiceIdentity); ok {
		err := augmentedIdentity.AssignPropertiesFrom(source)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesFrom() for conversion")
		}
	}

	// No error
	return nil
}

// AssignProperties_To_ManagedServiceIdentity populates the provided destination ManagedServiceIdentity from our ManagedServiceIdentity
func (identity *ManagedServiceIdentity) AssignProperties_To_ManagedServiceIdentity(destination *v20240301s.ManagedServiceIdentity) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(identity.PropertyBag)

	// Type
	destination.Type = genruntime.ClonePointerToString(identity.Type)

	// UserAssignedIdentities
	if identity.UserAssignedIdentities != nil {
		userAssignedIdentityList := make([]v20240301s.UserAssignedIdentityDetails, len(identity.UserAssignedIdentities))
		for userAssignedIdentityIndex, userAssignedIdentityItem := range identity.UserAssignedIdentities {
			var userAssignedIdentity v20240301s.UserAssignedIdentityDetails
			err := userAssignedIdentityItem.AssignProperties_To_UserAssignedIdentityDetails(&userAssignedIdentity)
			if err != nil {
				return eris.Wrap(err, "calling AssignProperties_To_UserAssignedIdentityDetails() to populate field UserAssignedIdentities")
			}
			userAssignedIdentityList[userAssignedIdentityIndex] = userAssignedIdentity
		}
		destination.UserAssignedIdentities = userAssignedIdentityList
	} else {
		destination.UserAssignedIdentities = nil
	}

	// Update the property bag
	if len(propertyBag) > 0 {
		destination.PropertyBag = propertyBag
	} else {
		destination.PropertyBag = nil
	}

	// Invoke the augmentConversionForManagedServiceIdentity interface (if implemented) to customize the conversion
	var identityAsAny any = identity
	if augmentedIdentity, ok := identityAsAny.(augmentConversionForManagedServiceIdentity); ok {
		err := augmentedIdentity.AssignPropertiesTo(destination)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesTo() for conversion")
		}
	}

	// No error
	return nil
}

// Storage version of v1api20220701.ManagedServiceIdentity_STATUS
// Identity for the resource.
type ManagedServiceIdentity_STATUS struct {
	PrincipalId            *string                                                         `json:"principalId,omitempty"`
	PropertyBag            genruntime.PropertyBag                                          `json:"$propertyBag,omitempty"`
	TenantId               *string                                                         `json:"tenantId,omitempty"`
	Type                   *string                                                         `json:"type,omitempty"`
	UserAssignedIdentities map[string]ManagedServiceIdentity_UserAssignedIdentities_STATUS `json:"userAssignedIdentities,omitempty"`
}

// AssignProperties_From_ManagedServiceIdentity_STATUS populates our ManagedServiceIdentity_STATUS from the provided source ManagedServiceIdentity_STATUS
func (identity *ManagedServiceIdentity_STATUS) AssignProperties_From_ManagedServiceIdentity_STATUS(source *v20240301s.ManagedServiceIdentity_STATUS) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(source.PropertyBag)

	// PrincipalId
	identity.PrincipalId = genruntime.ClonePointerToString(source.PrincipalId)

	// TenantId
	identity.TenantId = genruntime.ClonePointerToString(source.TenantId)

	// Type
	identity.Type = genruntime.ClonePointerToString(source.Type)

	// UserAssignedIdentities
	if source.UserAssignedIdentities != nil {
		userAssignedIdentityMap := make(map[string]ManagedServiceIdentity_UserAssignedIdentities_STATUS, len(source.UserAssignedIdentities))
		for userAssignedIdentityKey, userAssignedIdentityValue := range source.UserAssignedIdentities {
			var userAssignedIdentity ManagedServiceIdentity_UserAssignedIdentities_STATUS
			err := userAssignedIdentity.AssignProperties_From_ManagedServiceIdentity_UserAssignedIdentities_STATUS(&userAssignedIdentityValue)
			if err != nil {
				return eris.Wrap(err, "calling AssignProperties_From_ManagedServiceIdentity_UserAssignedIdentities_STATUS() to populate field UserAssignedIdentities")
			}
			userAssignedIdentityMap[userAssignedIdentityKey] = userAssignedIdentity
		}
		identity.UserAssignedIdentities = userAssignedIdentityMap
	} else {
		identity.UserAssignedIdentities = nil
	}

	// Update the property bag
	if len(propertyBag) > 0 {
		identity.PropertyBag = propertyBag
	} else {
		identity.PropertyBag = nil
	}

	// Invoke the augmentConversionForManagedServiceIdentity_STATUS interface (if implemented) to customize the conversion
	var identityAsAny any = identity
	if augmentedIdentity, ok := identityAsAny.(augmentConversionForManagedServiceIdentity_STATUS); ok {
		err := augmentedIdentity.AssignPropertiesFrom(source)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesFrom() for conversion")
		}
	}

	// No error
	return nil
}

// AssignProperties_To_ManagedServiceIdentity_STATUS populates the provided destination ManagedServiceIdentity_STATUS from our ManagedServiceIdentity_STATUS
func (identity *ManagedServiceIdentity_STATUS) AssignProperties_To_ManagedServiceIdentity_STATUS(destination *v20240301s.ManagedServiceIdentity_STATUS) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(identity.PropertyBag)

	// PrincipalId
	destination.PrincipalId = genruntime.ClonePointerToString(identity.PrincipalId)

	// TenantId
	destination.TenantId = genruntime.ClonePointerToString(identity.TenantId)

	// Type
	destination.Type = genruntime.ClonePointerToString(identity.Type)

	// UserAssignedIdentities
	if identity.UserAssignedIdentities != nil {
		userAssignedIdentityMap := make(map[string]v20240301s.ManagedServiceIdentity_UserAssignedIdentities_STATUS, len(identity.UserAssignedIdentities))
		for userAssignedIdentityKey, userAssignedIdentityValue := range identity.UserAssignedIdentities {
			var userAssignedIdentity v20240301s.ManagedServiceIdentity_UserAssignedIdentities_STATUS
			err := userAssignedIdentityValue.AssignProperties_To_ManagedServiceIdentity_UserAssignedIdentities_STATUS(&userAssignedIdentity)
			if err != nil {
				return eris.Wrap(err, "calling AssignProperties_To_ManagedServiceIdentity_UserAssignedIdentities_STATUS() to populate field UserAssignedIdentities")
			}
			userAssignedIdentityMap[userAssignedIdentityKey] = userAssignedIdentity
		}
		destination.UserAssignedIdentities = userAssignedIdentityMap
	} else {
		destination.UserAssignedIdentities = nil
	}

	// Update the property bag
	if len(propertyBag) > 0 {
		destination.PropertyBag = propertyBag
	} else {
		destination.PropertyBag = nil
	}

	// Invoke the augmentConversionForManagedServiceIdentity_STATUS interface (if implemented) to customize the conversion
	var identityAsAny any = identity
	if augmentedIdentity, ok := identityAsAny.(augmentConversionForManagedServiceIdentity_STATUS); ok {
		err := augmentedIdentity.AssignPropertiesTo(destination)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesTo() for conversion")
		}
	}

	// No error
	return nil
}

// Storage version of v1api20220701.SubResource
// Reference to another ARM resource.
type SubResource struct {
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`

	// Reference: Resource ID.
	Reference *genruntime.ResourceReference `armReference:"Id" json:"reference,omitempty"`
}

// AssignProperties_From_SubResource populates our SubResource from the provided source SubResource
func (resource *SubResource) AssignProperties_From_SubResource(source *v20240301s.SubResource) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(source.PropertyBag)

	// Reference
	if source.Reference != nil {
		reference := source.Reference.Copy()
		resource.Reference = &reference
	} else {
		resource.Reference = nil
	}

	// Update the property bag
	if len(propertyBag) > 0 {
		resource.PropertyBag = propertyBag
	} else {
		resource.PropertyBag = nil
	}

	// Invoke the augmentConversionForSubResource interface (if implemented) to customize the conversion
	var resourceAsAny any = resource
	if augmentedResource, ok := resourceAsAny.(augmentConversionForSubResource); ok {
		err := augmentedResource.AssignPropertiesFrom(source)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesFrom() for conversion")
		}
	}

	// No error
	return nil
}

// AssignProperties_To_SubResource populates the provided destination SubResource from our SubResource
func (resource *SubResource) AssignProperties_To_SubResource(destination *v20240301s.SubResource) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(resource.PropertyBag)

	// Reference
	if resource.Reference != nil {
		reference := resource.Reference.Copy()
		destination.Reference = &reference
	} else {
		destination.Reference = nil
	}

	// Update the property bag
	if len(propertyBag) > 0 {
		destination.PropertyBag = propertyBag
	} else {
		destination.PropertyBag = nil
	}

	// Invoke the augmentConversionForSubResource interface (if implemented) to customize the conversion
	var resourceAsAny any = resource
	if augmentedResource, ok := resourceAsAny.(augmentConversionForSubResource); ok {
		err := augmentedResource.AssignPropertiesTo(destination)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesTo() for conversion")
		}
	}

	// No error
	return nil
}

// Storage version of v1api20220701.SubResource_STATUS
// Reference to another ARM resource.
type SubResource_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// AssignProperties_From_SubResource_STATUS populates our SubResource_STATUS from the provided source SubResource_STATUS
func (resource *SubResource_STATUS) AssignProperties_From_SubResource_STATUS(source *v20240101s.SubResource_STATUS) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(source.PropertyBag)

	// Id
	resource.Id = genruntime.ClonePointerToString(source.Id)

	// Update the property bag
	if len(propertyBag) > 0 {
		resource.PropertyBag = propertyBag
	} else {
		resource.PropertyBag = nil
	}

	// Invoke the augmentConversionForSubResource_STATUS interface (if implemented) to customize the conversion
	var resourceAsAny any = resource
	if augmentedResource, ok := resourceAsAny.(augmentConversionForSubResource_STATUS); ok {
		err := augmentedResource.AssignPropertiesFrom(source)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesFrom() for conversion")
		}
	}

	// No error
	return nil
}

// AssignProperties_To_SubResource_STATUS populates the provided destination SubResource_STATUS from our SubResource_STATUS
func (resource *SubResource_STATUS) AssignProperties_To_SubResource_STATUS(destination *v20240101s.SubResource_STATUS) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(resource.PropertyBag)

	// Id
	destination.Id = genruntime.ClonePointerToString(resource.Id)

	// Update the property bag
	if len(propertyBag) > 0 {
		destination.PropertyBag = propertyBag
	} else {
		destination.PropertyBag = nil
	}

	// Invoke the augmentConversionForSubResource_STATUS interface (if implemented) to customize the conversion
	var resourceAsAny any = resource
	if augmentedResource, ok := resourceAsAny.(augmentConversionForSubResource_STATUS); ok {
		err := augmentedResource.AssignPropertiesTo(destination)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesTo() for conversion")
		}
	}

	// No error
	return nil
}

// Storage version of v1api20220701.ApplicationGatewayBackendAddress
// Backend address of an application gateway.
type ApplicationGatewayBackendAddress struct {
	Fqdn        *string                `json:"fqdn,omitempty"`
	IpAddress   *string                `json:"ipAddress,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayClientAuthConfiguration
// Application gateway client authentication configuration.
type ApplicationGatewayClientAuthConfiguration struct {
	PropertyBag              genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	VerifyClientCertIssuerDN *bool                  `json:"verifyClientCertIssuerDN,omitempty"`
	VerifyClientRevocation   *string                `json:"verifyClientRevocation,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayConnectionDraining
// Connection draining allows open connections to a backend server to be active for a specified time after the backend
// server got removed from the configuration.
type ApplicationGatewayConnectionDraining struct {
	DrainTimeoutInSec *int                   `json:"drainTimeoutInSec,omitempty"`
	Enabled           *bool                  `json:"enabled,omitempty"`
	PropertyBag       genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayFirewallDisabledRuleGroup
// Allows to disable rules within a rule group or an entire rule group.
type ApplicationGatewayFirewallDisabledRuleGroup struct {
	PropertyBag   genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	RuleGroupName *string                `json:"ruleGroupName,omitempty"`
	Rules         []int                  `json:"rules,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayFirewallDisabledRuleGroup_STATUS
// Allows to disable rules within a rule group or an entire rule group.
type ApplicationGatewayFirewallDisabledRuleGroup_STATUS struct {
	PropertyBag   genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	RuleGroupName *string                `json:"ruleGroupName,omitempty"`
	Rules         []int                  `json:"rules,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayFirewallExclusion
// Allow to exclude some variable satisfy the condition for the WAF check.
type ApplicationGatewayFirewallExclusion struct {
	MatchVariable         *string                `json:"matchVariable,omitempty"`
	PropertyBag           genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Selector              *string                `json:"selector,omitempty"`
	SelectorMatchOperator *string                `json:"selectorMatchOperator,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayFirewallExclusion_STATUS
// Allow to exclude some variable satisfy the condition for the WAF check.
type ApplicationGatewayFirewallExclusion_STATUS struct {
	MatchVariable         *string                `json:"matchVariable,omitempty"`
	PropertyBag           genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Selector              *string                `json:"selector,omitempty"`
	SelectorMatchOperator *string                `json:"selectorMatchOperator,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayLoadDistributionTarget
// Load Distribution Target of an application gateway.
type ApplicationGatewayLoadDistributionTarget struct {
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`

	// Reference: Resource ID.
	Reference *genruntime.ResourceReference `armReference:"Id" json:"reference,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayPathRule
// Path rule of URL path map of an application gateway.
type ApplicationGatewayPathRule struct {
	BackendAddressPool     *SubResource           `json:"backendAddressPool,omitempty"`
	BackendHttpSettings    *SubResource           `json:"backendHttpSettings,omitempty"`
	FirewallPolicy         *SubResource           `json:"firewallPolicy,omitempty"`
	LoadDistributionPolicy *SubResource           `json:"loadDistributionPolicy,omitempty"`
	Name                   *string                `json:"name,omitempty"`
	Paths                  []string               `json:"paths,omitempty"`
	PropertyBag            genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	RedirectConfiguration  *SubResource           `json:"redirectConfiguration,omitempty"`
	RewriteRuleSet         *SubResource           `json:"rewriteRuleSet,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayPrivateLinkIpConfiguration
// The application gateway private link ip configuration.
type ApplicationGatewayPrivateLinkIpConfiguration struct {
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`

	// Reference: Resource ID.
	Reference *genruntime.ResourceReference `armReference:"Id" json:"reference,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayProbeHealthResponseMatch
// Application gateway probe health response match.
type ApplicationGatewayProbeHealthResponseMatch struct {
	Body        *string                `json:"body,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	StatusCodes []string               `json:"statusCodes,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayRewriteRule
// Rewrite rule of an application gateway.
type ApplicationGatewayRewriteRule struct {
	ActionSet    *ApplicationGatewayRewriteRuleActionSet  `json:"actionSet,omitempty"`
	Conditions   []ApplicationGatewayRewriteRuleCondition `json:"conditions,omitempty"`
	Name         *string                                  `json:"name,omitempty"`
	PropertyBag  genruntime.PropertyBag                   `json:"$propertyBag,omitempty"`
	RuleSequence *int                                     `json:"ruleSequence,omitempty"`
}

type augmentConversionForManagedServiceIdentity interface {
	AssignPropertiesFrom(src *v20240301s.ManagedServiceIdentity) error
	AssignPropertiesTo(dst *v20240301s.ManagedServiceIdentity) error
}

type augmentConversionForManagedServiceIdentity_STATUS interface {
	AssignPropertiesFrom(src *v20240301s.ManagedServiceIdentity_STATUS) error
	AssignPropertiesTo(dst *v20240301s.ManagedServiceIdentity_STATUS) error
}

type augmentConversionForSubResource interface {
	AssignPropertiesFrom(src *v20240301s.SubResource) error
	AssignPropertiesTo(dst *v20240301s.SubResource) error
}

type augmentConversionForSubResource_STATUS interface {
	AssignPropertiesFrom(src *v20240101s.SubResource_STATUS) error
	AssignPropertiesTo(dst *v20240101s.SubResource_STATUS) error
}

// Storage version of v1api20220701.ManagedServiceIdentity_UserAssignedIdentities_STATUS
type ManagedServiceIdentity_UserAssignedIdentities_STATUS struct {
	ClientId    *string                `json:"clientId,omitempty"`
	PrincipalId *string                `json:"principalId,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// AssignProperties_From_ManagedServiceIdentity_UserAssignedIdentities_STATUS populates our ManagedServiceIdentity_UserAssignedIdentities_STATUS from the provided source ManagedServiceIdentity_UserAssignedIdentities_STATUS
func (identities *ManagedServiceIdentity_UserAssignedIdentities_STATUS) AssignProperties_From_ManagedServiceIdentity_UserAssignedIdentities_STATUS(source *v20240301s.ManagedServiceIdentity_UserAssignedIdentities_STATUS) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(source.PropertyBag)

	// ClientId
	identities.ClientId = genruntime.ClonePointerToString(source.ClientId)

	// PrincipalId
	identities.PrincipalId = genruntime.ClonePointerToString(source.PrincipalId)

	// Update the property bag
	if len(propertyBag) > 0 {
		identities.PropertyBag = propertyBag
	} else {
		identities.PropertyBag = nil
	}

	// Invoke the augmentConversionForManagedServiceIdentity_UserAssignedIdentities_STATUS interface (if implemented) to customize the conversion
	var identitiesAsAny any = identities
	if augmentedIdentities, ok := identitiesAsAny.(augmentConversionForManagedServiceIdentity_UserAssignedIdentities_STATUS); ok {
		err := augmentedIdentities.AssignPropertiesFrom(source)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesFrom() for conversion")
		}
	}

	// No error
	return nil
}

// AssignProperties_To_ManagedServiceIdentity_UserAssignedIdentities_STATUS populates the provided destination ManagedServiceIdentity_UserAssignedIdentities_STATUS from our ManagedServiceIdentity_UserAssignedIdentities_STATUS
func (identities *ManagedServiceIdentity_UserAssignedIdentities_STATUS) AssignProperties_To_ManagedServiceIdentity_UserAssignedIdentities_STATUS(destination *v20240301s.ManagedServiceIdentity_UserAssignedIdentities_STATUS) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(identities.PropertyBag)

	// ClientId
	destination.ClientId = genruntime.ClonePointerToString(identities.ClientId)

	// PrincipalId
	destination.PrincipalId = genruntime.ClonePointerToString(identities.PrincipalId)

	// Update the property bag
	if len(propertyBag) > 0 {
		destination.PropertyBag = propertyBag
	} else {
		destination.PropertyBag = nil
	}

	// Invoke the augmentConversionForManagedServiceIdentity_UserAssignedIdentities_STATUS interface (if implemented) to customize the conversion
	var identitiesAsAny any = identities
	if augmentedIdentities, ok := identitiesAsAny.(augmentConversionForManagedServiceIdentity_UserAssignedIdentities_STATUS); ok {
		err := augmentedIdentities.AssignPropertiesTo(destination)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesTo() for conversion")
		}
	}

	// No error
	return nil
}

// Storage version of v1api20220701.UserAssignedIdentityDetails
// Information about the user assigned identity for the resource
type UserAssignedIdentityDetails struct {
	PropertyBag genruntime.PropertyBag       `json:"$propertyBag,omitempty"`
	Reference   genruntime.ResourceReference `armReference:"Reference" json:"reference,omitempty"`
}

// AssignProperties_From_UserAssignedIdentityDetails populates our UserAssignedIdentityDetails from the provided source UserAssignedIdentityDetails
func (details *UserAssignedIdentityDetails) AssignProperties_From_UserAssignedIdentityDetails(source *v20240301s.UserAssignedIdentityDetails) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(source.PropertyBag)

	// Reference
	details.Reference = source.Reference.Copy()

	// Update the property bag
	if len(propertyBag) > 0 {
		details.PropertyBag = propertyBag
	} else {
		details.PropertyBag = nil
	}

	// Invoke the augmentConversionForUserAssignedIdentityDetails interface (if implemented) to customize the conversion
	var detailsAsAny any = details
	if augmentedDetails, ok := detailsAsAny.(augmentConversionForUserAssignedIdentityDetails); ok {
		err := augmentedDetails.AssignPropertiesFrom(source)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesFrom() for conversion")
		}
	}

	// No error
	return nil
}

// AssignProperties_To_UserAssignedIdentityDetails populates the provided destination UserAssignedIdentityDetails from our UserAssignedIdentityDetails
func (details *UserAssignedIdentityDetails) AssignProperties_To_UserAssignedIdentityDetails(destination *v20240301s.UserAssignedIdentityDetails) error {
	// Clone the existing property bag
	propertyBag := genruntime.NewPropertyBag(details.PropertyBag)

	// Reference
	destination.Reference = details.Reference.Copy()

	// Update the property bag
	if len(propertyBag) > 0 {
		destination.PropertyBag = propertyBag
	} else {
		destination.PropertyBag = nil
	}

	// Invoke the augmentConversionForUserAssignedIdentityDetails interface (if implemented) to customize the conversion
	var detailsAsAny any = details
	if augmentedDetails, ok := detailsAsAny.(augmentConversionForUserAssignedIdentityDetails); ok {
		err := augmentedDetails.AssignPropertiesTo(destination)
		if err != nil {
			return eris.Wrap(err, "calling augmented AssignPropertiesTo() for conversion")
		}
	}

	// No error
	return nil
}

// Storage version of v1api20220701.ApplicationGatewayRewriteRuleActionSet
// Set of actions in the Rewrite Rule in Application Gateway.
type ApplicationGatewayRewriteRuleActionSet struct {
	PropertyBag                  genruntime.PropertyBag                  `json:"$propertyBag,omitempty"`
	RequestHeaderConfigurations  []ApplicationGatewayHeaderConfiguration `json:"requestHeaderConfigurations,omitempty"`
	ResponseHeaderConfigurations []ApplicationGatewayHeaderConfiguration `json:"responseHeaderConfigurations,omitempty"`
	UrlConfiguration             *ApplicationGatewayUrlConfiguration     `json:"urlConfiguration,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayRewriteRuleCondition
// Set of conditions in the Rewrite Rule in Application Gateway.
type ApplicationGatewayRewriteRuleCondition struct {
	IgnoreCase  *bool                  `json:"ignoreCase,omitempty"`
	Negate      *bool                  `json:"negate,omitempty"`
	Pattern     *string                `json:"pattern,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Variable    *string                `json:"variable,omitempty"`
}

type augmentConversionForManagedServiceIdentity_UserAssignedIdentities_STATUS interface {
	AssignPropertiesFrom(src *v20240301s.ManagedServiceIdentity_UserAssignedIdentities_STATUS) error
	AssignPropertiesTo(dst *v20240301s.ManagedServiceIdentity_UserAssignedIdentities_STATUS) error
}

type augmentConversionForUserAssignedIdentityDetails interface {
	AssignPropertiesFrom(src *v20240301s.UserAssignedIdentityDetails) error
	AssignPropertiesTo(dst *v20240301s.UserAssignedIdentityDetails) error
}

// Storage version of v1api20220701.ApplicationGatewayHeaderConfiguration
// Header configuration of the Actions set in Application Gateway.
type ApplicationGatewayHeaderConfiguration struct {
	HeaderName  *string                `json:"headerName,omitempty"`
	HeaderValue *string                `json:"headerValue,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20220701.ApplicationGatewayUrlConfiguration
// Url configuration of the Actions set in Application Gateway.
type ApplicationGatewayUrlConfiguration struct {
	ModifiedPath        *string                `json:"modifiedPath,omitempty"`
	ModifiedQueryString *string                `json:"modifiedQueryString,omitempty"`
	PropertyBag         genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Reroute             *bool                  `json:"reroute,omitempty"`
}

func init() {
	SchemeBuilder.Register(&ApplicationGateway{}, &ApplicationGatewayList{})
}
