Regen all docs. (#700)

* Stop recursing if discovery == {}

* Generate docs with 'make docs'.
diff --git a/docs/dyn/dlp_v2.projects.content.html b/docs/dyn/dlp_v2.projects.content.html
new file mode 100644
index 0000000..d93cf1b
--- /dev/null
+++ b/docs/dyn/dlp_v2.projects.content.html
@@ -0,0 +1,9738 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="dlp_v2.html">Cloud Data Loss Prevention (DLP) API</a> . <a href="dlp_v2.projects.html">projects</a> . <a href="dlp_v2.projects.content.html">content</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="#deidentify">deidentify(parent, body, x__xgafv=None)</a></code></p>
+<p class="firstline">De-identifies potentially sensitive info from a ContentItem.</p>
+<p class="toc_element">
+  <code><a href="#inspect">inspect(parent, body, x__xgafv=None)</a></code></p>
+<p class="firstline">Finds potentially sensitive info in content.</p>
+<p class="toc_element">
+  <code><a href="#reidentify">reidentify(parent, body, x__xgafv=None)</a></code></p>
+<p class="firstline">Re-identifies content that has been de-identified.</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="deidentify">deidentify(parent, body, x__xgafv=None)</code>
+  <pre>De-identifies potentially sensitive info from a ContentItem.
+This method has limits on input size and output size.
+See https://cloud.google.com/dlp/docs/deidentify-sensitive-data to
+learn more.
+
+When no InfoTypes or CustomInfoTypes are specified in this request, the
+system will automatically choose what detectors to run. By default this may
+be all types, but may change over time as detectors are updated.
+
+Args:
+  parent: string, The parent resource name, for example projects/my-project-id. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # Request to de-identify a list of items.
+    "deidentifyTemplateName": "A String", # Optional template to use. Any configuration directly specified in
+        # deidentify_config will override those set in the template. Singular fields
+        # that are set in this request will replace their corresponding fields in the
+        # template. Repeated fields are appended. Singular sub-messages and groups
+        # are recursively merged.
+    "inspectTemplateName": "A String", # Optional template to use. Any configuration directly specified in
+        # inspect_config will override those set in the template. Singular fields
+        # that are set in this request will replace their corresponding fields in the
+        # template. Repeated fields are appended. Singular sub-messages and groups
+        # are recursively merged.
+    "deidentifyConfig": { # The configuration that controls how the data will change. # Configuration for the de-identification of the content item.
+        # Items specified here will override the template referenced by the
+        # deidentify_template_name argument.
+      "infoTypeTransformations": { # A type of transformation that will scan unstructured text and # Treat the dataset as free-form text and apply the same free text
+          # transformation everywhere.
+          # apply various `PrimitiveTransformation`s to each finding, where the
+          # transformation is applied to only values that were identified as a specific
+          # info_type.
+        "transformations": [ # Transformation for each infoType. Cannot specify more than one
+            # for a given infoType. [required]
+          { # A transformation to apply to text that is identified as a specific
+              # info_type.
+            "primitiveTransformation": { # A rule for transforming a value. # Primitive transformation to apply to the infoType. [required]
+              "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                  # fixed character. Masking can start from the beginning or end of the string.
+                  # This can be used on data of any type (numbers, longs, and so on) and when
+                  # de-identifying structured data we'll attempt to preserve the original data's
+                  # type. (This allows you to take a long like 123 and modify it to a string like
+                  # **3.
+                "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                    # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                    # mask 5 chars with * we would produce ***-*55-5555.
+                  { # Characters to skip when doing deidentification of a value. These will be left
+                      # alone and skipped.
+                    "commonCharactersToIgnore": "A String",
+                    "charactersToSkip": "A String",
+                  },
+                ],
+                "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                    # masked. Skipped characters do not count towards this tally.
+                "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                    # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                    # code or credit card number. String must have length 1. If not supplied, we
+                    # will default to "*" for strings, 0 for digits.
+                "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                    # '0', number_to_mask is 14, and `reverse_order` is false, then
+                    # 1234-5678-9012-3456 -> 00000000000000-3456
+                    # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                    # is true, then 12345 -> 12***
+              },
+              "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                  # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                  # output would be 'My phone number is '.
+              },
+              "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                  # input. Outputs a base64 encoded representation of the encrypted output.
+                  # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                    # referential integrity such that the same identifier in two different
+                    # contexts will be given a distinct surrogate. The context is appended to
+                    # plaintext value being encrypted. On decryption the provided context is
+                    # validated against the value used during encryption. If a context was
+                    # provided during encryption, same context must be provided during decryption
+                    # as well.
+                    #
+                    # If the context is not set, plaintext would be used as is for encryption.
+                    # If the context is set but:
+                    #
+                    # 1. there is no record present when transforming a given value or
+                    # 2. the field is not present when transforming a given value,
+                    #
+                    # plaintext would be used as is for encryption.
+                    #
+                    # Note that case (1) is expected when an `InfoTypeTransformation` is
+                    # applied to both structured and non-structured `ContentItem`s.
+                  "name": "A String", # Name describing the field.
+                },
+                "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                    # This annotation will be applied to the surrogate by prefixing it with
+                    # the name of the custom info type followed by the number of
+                    # characters comprising the surrogate. The following scheme defines the
+                    # format: <info type name>(<surrogate character count>):<surrogate>
+                    #
+                    # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                    # the surrogate is 'abc', the full replacement value
+                    # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                    #
+                    # This annotation identifies the surrogate when inspecting content using the
+                    # custom info type 'Surrogate'. This facilitates reversal of the
+                    # surrogate when it occurs in free text.
+                    #
+                    # In order for inspection to work properly, the name of this info type must
+                    # not occur naturally anywhere in your data; otherwise, inspection may either
+                    #
+                    # - reverse a surrogate that does not correspond to an actual identifier
+                    # - be unable to parse the surrogate and result in an error
+                    #
+                    # Therefore, choose your custom info type name carefully after considering
+                    # what your data looks like. One way to select a name that has a high chance
+                    # of yielding reliable detection is to include one or more unicode characters
+                    # that are highly improbable to exist in your data.
+                    # For example, assuming your data is entered from a regular ASCII keyboard,
+                    # the symbol with the hex code point 29DD might be used like so:
+                    # ⧝MY_TOKEN_TYPE
+                  "name": "A String", # Name of the information type. Either a name of your choosing when
+                      # creating a CustomInfoType, or one of the names listed
+                      # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                      # a built-in type. InfoType names should conform to the pattern
+                      # [a-zA-Z0-9_]{1,64}.
+                },
+              },
+              "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                  # Bucketing transformation can provide all of this functionality,
+                  # but requires more configuration. This message is provided as a convenience to
+                  # the user for simple bucketing strategies.
+                  #
+                  # The transformed value will be a hyphenated string of
+                  # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                  # all values that are within this bucket will be replaced with "10-20".
+                  #
+                  # This can be used on data of type: double, long.
+                  #
+                  # If the bound Value type differs from the type of data
+                  # being transformed, we will first attempt converting the type of the data to
+                  # be transformed to match the type of the bound before comparing.
+                  #
+                  # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                    # grouped together into a single bucket; for example if `lower_bound` = 10,
+                    # then all values less than 10 are replaced with the value “-10”. [Required].
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+                "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                    # grouped together into a single bucket; for example if `upper_bound` = 89,
+                    # then all values greater than 89 are replaced with the value “89+”.
+                    # [Required].
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+                "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                    # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                    # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                    # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+              },
+              "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+              },
+              "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                  # portion of the value.
+                "partToExtract": "A String",
+              },
+              "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                  # Uses SHA-256.
+                  # The key size must be either 32 or 64 bytes.
+                  # Outputs a base64 encoded representation of the hashed output
+                  # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                  # Currently, only string and integer values can be hashed.
+                  # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+              },
+              "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                  # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                  # to learn more.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                    # results in the same shift for the same context and crypto_key.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                    # [Required]
+                "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                    # range (inclusive ends). Negative means shift to earlier in time. Must not
+                    # be more than 365250 days (1000 years) each direction.
+                    #
+                    # For example, 3 means shift date to at most 3 days into the future.
+                    # [Required]
+                "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                    # If set, must also set method. If set, shift will be consistent for the
+                    # given context.
+                  "name": "A String", # Name describing the field.
+                },
+              },
+              "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                  # replacement values are dynamically provided by the user for custom behavior,
+                  # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                  # This can be used on
+                  # data of type: number, long, string, timestamp.
+                  # If the bound `Value` type differs from the type of data being transformed, we
+                  # will first attempt converting the type of the data to be transformed to match
+                  # the type of the bound before comparing.
+                  # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                  { # Bucket is represented as a range, along with replacement values.
+                    "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                    "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                        # the default behavior will be to hyphenate the min-max range.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                    "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                        # used.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                  },
+                ],
+              },
+              "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                  # (FPE) with the FFX mode of operation; however when used in the
+                  # `ReidentifyContent` API method, it serves the opposite function by reversing
+                  # the surrogate back into the original identifier. The identifier must be
+                  # encoded as ASCII. For a given crypto key and context, the same identifier
+                  # will be replaced with the same surrogate. Identifiers must be at least two
+                  # characters long. In the case that the identifier is the empty string, it will
+                  # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                  # more.
+                  #
+                  # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                  # do not require preserving the input alphabet space and size, plus warrant
+                  # referential integrity.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+                "commonAlphabet": "A String",
+                "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                    # that the FFX mode natively supports. This happens before/after
+                    # encryption/decryption.
+                    # Each character listed must appear only once.
+                    # Number of characters must be in the range [2, 62].
+                    # This must be encoded as ASCII.
+                    # The order of characters does not matter.
+                "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                    # identifier in two different contexts won't be given the same surrogate. If
+                    # the context is not set, a default tweak will be used.
+                    #
+                    # If the context is set but:
+                    #
+                    # 1. there is no record present when transforming a given value or
+                    # 1. the field is not present when transforming a given value,
+                    #
+                    # a default tweak will be used.
+                    #
+                    # Note that case (1) is expected when an `InfoTypeTransformation` is
+                    # applied to both structured and non-structured `ContentItem`s.
+                    # Currently, the referenced field may be of value type integer or string.
+                    #
+                    # The tweak is constructed as a sequence of bytes in big endian byte order
+                    # such that:
+                    #
+                    # - a 64 bit integer is encoded followed by a single byte of value 1
+                    # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                  "name": "A String", # Name describing the field.
+                },
+                "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                    # This annotation will be applied to the surrogate by prefixing it with
+                    # the name of the custom infoType followed by the number of
+                    # characters comprising the surrogate. The following scheme defines the
+                    # format: info_type_name(surrogate_character_count):surrogate
+                    #
+                    # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                    # the surrogate is 'abc', the full replacement value
+                    # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                    #
+                    # This annotation identifies the surrogate when inspecting content using the
+                    # custom infoType
+                    # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                    # This facilitates reversal of the surrogate when it occurs in free text.
+                    #
+                    # In order for inspection to work properly, the name of this infoType must
+                    # not occur naturally anywhere in your data; otherwise, inspection may
+                    # find a surrogate that does not correspond to an actual identifier.
+                    # Therefore, choose your custom infoType name carefully after considering
+                    # what your data looks like. One way to select a name that has a high chance
+                    # of yielding reliable detection is to include one or more unicode characters
+                    # that are highly improbable to exist in your data.
+                    # For example, assuming your data is entered from a regular ASCII keyboard,
+                    # the symbol with the hex code point 29DD might be used like so:
+                    # ⧝MY_TOKEN_TYPE
+                  "name": "A String", # Name of the information type. Either a name of your choosing when
+                      # creating a CustomInfoType, or one of the names listed
+                      # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                      # a built-in type. InfoType names should conform to the pattern
+                      # [a-zA-Z0-9_]{1,64}.
+                },
+              },
+              "replaceConfig": { # Replace each input value with a given `Value`.
+                "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+              },
+            },
+            "infoTypes": [ # InfoTypes to apply the transformation to. An empty list will cause
+                # this transformation to apply to all findings that correspond to
+                # infoTypes that were requested in `InspectConfig`.
+              { # Type of information detected by the API.
+                "name": "A String", # Name of the information type. Either a name of your choosing when
+                    # creating a CustomInfoType, or one of the names listed
+                    # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                    # a built-in type. InfoType names should conform to the pattern
+                    # [a-zA-Z0-9_]{1,64}.
+              },
+            ],
+          },
+        ],
+      },
+      "recordTransformations": { # A type of transformation that is applied over structured data such as a # Treat the dataset as structured. Transformations can be applied to
+          # specific locations within structured datasets, such as transforming
+          # a column within a table.
+          # table.
+        "recordSuppressions": [ # Configuration defining which records get suppressed entirely. Records that
+            # match any suppression rule are omitted from the output [optional].
+          { # Configuration to suppress records whose suppression conditions evaluate to
+              # true.
+            "condition": { # A condition for determining whether a transformation should be applied to # A condition that when it evaluates to true will result in the record being
+                # evaluated to be suppressed from the transformed content.
+                # a field.
+              "expressions": { # An expression, consisting or an operator and conditions. # An expression.
+                "conditions": { # A collection of conditions.
+                  "conditions": [
+                    { # The field type of `value` and `field` do not need to match to be
+                        # considered equal, but not all comparisons are possible.
+                        # EQUAL_TO and NOT_EQUAL_TO attempt to compare even with incompatible types,
+                        # but all other comparisons are invalid with incompatible types.
+                        # A `value` of type:
+                        #
+                        # - `string` can be compared against all other types
+                        # - `boolean` can only be compared against other booleans
+                        # - `integer` can be compared against doubles or a string if the string value
+                        # can be parsed as an integer.
+                        # - `double` can be compared against integers or a string if the string can
+                        # be parsed as a double.
+                        # - `Timestamp` can be compared against strings in RFC 3339 date string
+                        # format.
+                        # - `TimeOfDay` can be compared against timestamps and strings in the format
+                        # of 'HH:mm:ss'.
+                        #
+                        # If we fail to compare do to type mismatch, a warning will be given and
+                        # the condition will evaluate to false.
+                      "operator": "A String", # Operator used to compare the field or infoType to the value. [required]
+                      "field": { # General identifier of a data field in a storage service. # Field within the record this condition is evaluated against. [required]
+                        "name": "A String", # Name describing the field.
+                      },
+                      "value": { # Set of primitive values supported by the system. # Value to compare against. [Required, except for `EXISTS` tests.]
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                    },
+                  ],
+                },
+                "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently
+                    # only supported value is `AND`.
+              },
+            },
+          },
+        ],
+        "fieldTransformations": [ # Transform the record by applying various field transformations.
+          { # The transformation to apply to the field.
+            "infoTypeTransformations": { # A type of transformation that will scan unstructured text and # Treat the contents of the field as free text, and selectively
+                # transform content that matches an `InfoType`.
+                # apply various `PrimitiveTransformation`s to each finding, where the
+                # transformation is applied to only values that were identified as a specific
+                # info_type.
+              "transformations": [ # Transformation for each infoType. Cannot specify more than one
+                  # for a given infoType. [required]
+                { # A transformation to apply to text that is identified as a specific
+                    # info_type.
+                  "primitiveTransformation": { # A rule for transforming a value. # Primitive transformation to apply to the infoType. [required]
+                    "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                        # fixed character. Masking can start from the beginning or end of the string.
+                        # This can be used on data of any type (numbers, longs, and so on) and when
+                        # de-identifying structured data we'll attempt to preserve the original data's
+                        # type. (This allows you to take a long like 123 and modify it to a string like
+                        # **3.
+                      "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                          # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                          # mask 5 chars with * we would produce ***-*55-5555.
+                        { # Characters to skip when doing deidentification of a value. These will be left
+                            # alone and skipped.
+                          "commonCharactersToIgnore": "A String",
+                          "charactersToSkip": "A String",
+                        },
+                      ],
+                      "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                          # masked. Skipped characters do not count towards this tally.
+                      "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                          # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                          # code or credit card number. String must have length 1. If not supplied, we
+                          # will default to "*" for strings, 0 for digits.
+                      "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                          # '0', number_to_mask is 14, and `reverse_order` is false, then
+                          # 1234-5678-9012-3456 -> 00000000000000-3456
+                          # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                          # is true, then 12345 -> 12***
+                    },
+                    "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                        # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                        # output would be 'My phone number is '.
+                    },
+                    "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                        # input. Outputs a base64 encoded representation of the encrypted output.
+                        # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+                      "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                          # a key encryption key (KEK) stored by KMS).
+                          # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                          # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                          # unwrap the data crypto key.
+                        "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                            # The wrapped key must be a 128/192/256 bit key.
+                            # Authorization requires the following IAM permissions when sending a request
+                            # to perform a crypto transformation using a kms-wrapped crypto key:
+                            # dlp.kms.encrypt
+                          "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                          "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                        },
+                        "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                            # leaking the key. Choose another type of key if possible.
+                          "key": "A String", # A 128/192/256 bit key. [required]
+                        },
+                        "transient": { # Use this to have a random data crypto key generated.
+                            # It will be discarded after the request finishes.
+                          "name": "A String", # Name of the key. [required]
+                              # This is an arbitrary string used to differentiate different keys.
+                              # A unique key is generated per name: two separate `TransientCryptoKey`
+                              # protos share the same generated key if their names are the same.
+                              # When the data crypto key is generated, this name is not used in any way
+                              # (repeating the api call will result in a different key being generated).
+                        },
+                      },
+                      "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                          # referential integrity such that the same identifier in two different
+                          # contexts will be given a distinct surrogate. The context is appended to
+                          # plaintext value being encrypted. On decryption the provided context is
+                          # validated against the value used during encryption. If a context was
+                          # provided during encryption, same context must be provided during decryption
+                          # as well.
+                          #
+                          # If the context is not set, plaintext would be used as is for encryption.
+                          # If the context is set but:
+                          #
+                          # 1. there is no record present when transforming a given value or
+                          # 2. the field is not present when transforming a given value,
+                          #
+                          # plaintext would be used as is for encryption.
+                          #
+                          # Note that case (1) is expected when an `InfoTypeTransformation` is
+                          # applied to both structured and non-structured `ContentItem`s.
+                        "name": "A String", # Name describing the field.
+                      },
+                      "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                          # This annotation will be applied to the surrogate by prefixing it with
+                          # the name of the custom info type followed by the number of
+                          # characters comprising the surrogate. The following scheme defines the
+                          # format: <info type name>(<surrogate character count>):<surrogate>
+                          #
+                          # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                          # the surrogate is 'abc', the full replacement value
+                          # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                          #
+                          # This annotation identifies the surrogate when inspecting content using the
+                          # custom info type 'Surrogate'. This facilitates reversal of the
+                          # surrogate when it occurs in free text.
+                          #
+                          # In order for inspection to work properly, the name of this info type must
+                          # not occur naturally anywhere in your data; otherwise, inspection may either
+                          #
+                          # - reverse a surrogate that does not correspond to an actual identifier
+                          # - be unable to parse the surrogate and result in an error
+                          #
+                          # Therefore, choose your custom info type name carefully after considering
+                          # what your data looks like. One way to select a name that has a high chance
+                          # of yielding reliable detection is to include one or more unicode characters
+                          # that are highly improbable to exist in your data.
+                          # For example, assuming your data is entered from a regular ASCII keyboard,
+                          # the symbol with the hex code point 29DD might be used like so:
+                          # ⧝MY_TOKEN_TYPE
+                        "name": "A String", # Name of the information type. Either a name of your choosing when
+                            # creating a CustomInfoType, or one of the names listed
+                            # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                            # a built-in type. InfoType names should conform to the pattern
+                            # [a-zA-Z0-9_]{1,64}.
+                      },
+                    },
+                    "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                        # Bucketing transformation can provide all of this functionality,
+                        # but requires more configuration. This message is provided as a convenience to
+                        # the user for simple bucketing strategies.
+                        #
+                        # The transformed value will be a hyphenated string of
+                        # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                        # all values that are within this bucket will be replaced with "10-20".
+                        #
+                        # This can be used on data of type: double, long.
+                        #
+                        # If the bound Value type differs from the type of data
+                        # being transformed, we will first attempt converting the type of the data to
+                        # be transformed to match the type of the bound before comparing.
+                        #
+                        # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                      "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                          # grouped together into a single bucket; for example if `lower_bound` = 10,
+                          # then all values less than 10 are replaced with the value “-10”. [Required].
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                      "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                          # grouped together into a single bucket; for example if `upper_bound` = 89,
+                          # then all values greater than 89 are replaced with the value “89+”.
+                          # [Required].
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                      "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                          # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                          # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                          # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+                    },
+                    "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+                    },
+                    "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                        # portion of the value.
+                      "partToExtract": "A String",
+                    },
+                    "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                        # Uses SHA-256.
+                        # The key size must be either 32 or 64 bytes.
+                        # Outputs a base64 encoded representation of the hashed output
+                        # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                        # Currently, only string and integer values can be hashed.
+                        # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+                      "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                          # a key encryption key (KEK) stored by KMS).
+                          # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                          # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                          # unwrap the data crypto key.
+                        "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                            # The wrapped key must be a 128/192/256 bit key.
+                            # Authorization requires the following IAM permissions when sending a request
+                            # to perform a crypto transformation using a kms-wrapped crypto key:
+                            # dlp.kms.encrypt
+                          "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                          "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                        },
+                        "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                            # leaking the key. Choose another type of key if possible.
+                          "key": "A String", # A 128/192/256 bit key. [required]
+                        },
+                        "transient": { # Use this to have a random data crypto key generated.
+                            # It will be discarded after the request finishes.
+                          "name": "A String", # Name of the key. [required]
+                              # This is an arbitrary string used to differentiate different keys.
+                              # A unique key is generated per name: two separate `TransientCryptoKey`
+                              # protos share the same generated key if their names are the same.
+                              # When the data crypto key is generated, this name is not used in any way
+                              # (repeating the api call will result in a different key being generated).
+                        },
+                      },
+                    },
+                    "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                        # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                        # to learn more.
+                      "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                          # results in the same shift for the same context and crypto_key.
+                          # a key encryption key (KEK) stored by KMS).
+                          # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                          # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                          # unwrap the data crypto key.
+                        "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                            # The wrapped key must be a 128/192/256 bit key.
+                            # Authorization requires the following IAM permissions when sending a request
+                            # to perform a crypto transformation using a kms-wrapped crypto key:
+                            # dlp.kms.encrypt
+                          "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                          "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                        },
+                        "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                            # leaking the key. Choose another type of key if possible.
+                          "key": "A String", # A 128/192/256 bit key. [required]
+                        },
+                        "transient": { # Use this to have a random data crypto key generated.
+                            # It will be discarded after the request finishes.
+                          "name": "A String", # Name of the key. [required]
+                              # This is an arbitrary string used to differentiate different keys.
+                              # A unique key is generated per name: two separate `TransientCryptoKey`
+                              # protos share the same generated key if their names are the same.
+                              # When the data crypto key is generated, this name is not used in any way
+                              # (repeating the api call will result in a different key being generated).
+                        },
+                      },
+                      "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                          # [Required]
+                      "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                          # range (inclusive ends). Negative means shift to earlier in time. Must not
+                          # be more than 365250 days (1000 years) each direction.
+                          #
+                          # For example, 3 means shift date to at most 3 days into the future.
+                          # [Required]
+                      "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                          # If set, must also set method. If set, shift will be consistent for the
+                          # given context.
+                        "name": "A String", # Name describing the field.
+                      },
+                    },
+                    "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                        # replacement values are dynamically provided by the user for custom behavior,
+                        # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                        # This can be used on
+                        # data of type: number, long, string, timestamp.
+                        # If the bound `Value` type differs from the type of data being transformed, we
+                        # will first attempt converting the type of the data to be transformed to match
+                        # the type of the bound before comparing.
+                        # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                      "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                        { # Bucket is represented as a range, along with replacement values.
+                          "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                              # Note that for the purposes of inspection or transformation, the number
+                              # of bytes considered to comprise a 'Value' is based on its representation
+                              # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                              # 123456789, the number of bytes would be counted as 9, even though an
+                              # int64 only holds up to 8 bytes of data.
+                            "floatValue": 3.14,
+                            "timestampValue": "A String",
+                            "dayOfWeekValue": "A String",
+                            "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                # types are google.type.Date and `google.protobuf.Timestamp`.
+                              "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                  # to allow the value "24:00:00" for scenarios like business closing time.
+                              "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                              "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                  # allow the value 60 if it allows leap-seconds.
+                              "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                            },
+                            "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                # and time zone are either specified elsewhere or are not significant. The date
+                                # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                #
+                                # * A full date, with non-zero year, month and day values
+                                # * A month and day value, with a zero year, e.g. an anniversary
+                                # * A year on its own, with zero month and day values
+                                # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                #
+                                # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                              "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                  # a year.
+                              "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                  # if specifying a year by itself or a year and month where the day is not
+                                  # significant.
+                              "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                  # month and day.
+                            },
+                            "stringValue": "A String",
+                            "booleanValue": True or False,
+                            "integerValue": "A String",
+                          },
+                          "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                              # the default behavior will be to hyphenate the min-max range.
+                              # Note that for the purposes of inspection or transformation, the number
+                              # of bytes considered to comprise a 'Value' is based on its representation
+                              # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                              # 123456789, the number of bytes would be counted as 9, even though an
+                              # int64 only holds up to 8 bytes of data.
+                            "floatValue": 3.14,
+                            "timestampValue": "A String",
+                            "dayOfWeekValue": "A String",
+                            "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                # types are google.type.Date and `google.protobuf.Timestamp`.
+                              "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                  # to allow the value "24:00:00" for scenarios like business closing time.
+                              "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                              "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                  # allow the value 60 if it allows leap-seconds.
+                              "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                            },
+                            "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                # and time zone are either specified elsewhere or are not significant. The date
+                                # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                #
+                                # * A full date, with non-zero year, month and day values
+                                # * A month and day value, with a zero year, e.g. an anniversary
+                                # * A year on its own, with zero month and day values
+                                # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                #
+                                # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                              "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                  # a year.
+                              "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                  # if specifying a year by itself or a year and month where the day is not
+                                  # significant.
+                              "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                  # month and day.
+                            },
+                            "stringValue": "A String",
+                            "booleanValue": True or False,
+                            "integerValue": "A String",
+                          },
+                          "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                              # used.
+                              # Note that for the purposes of inspection or transformation, the number
+                              # of bytes considered to comprise a 'Value' is based on its representation
+                              # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                              # 123456789, the number of bytes would be counted as 9, even though an
+                              # int64 only holds up to 8 bytes of data.
+                            "floatValue": 3.14,
+                            "timestampValue": "A String",
+                            "dayOfWeekValue": "A String",
+                            "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                # types are google.type.Date and `google.protobuf.Timestamp`.
+                              "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                  # to allow the value "24:00:00" for scenarios like business closing time.
+                              "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                              "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                  # allow the value 60 if it allows leap-seconds.
+                              "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                            },
+                            "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                # and time zone are either specified elsewhere or are not significant. The date
+                                # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                #
+                                # * A full date, with non-zero year, month and day values
+                                # * A month and day value, with a zero year, e.g. an anniversary
+                                # * A year on its own, with zero month and day values
+                                # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                #
+                                # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                              "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                  # a year.
+                              "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                  # if specifying a year by itself or a year and month where the day is not
+                                  # significant.
+                              "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                  # month and day.
+                            },
+                            "stringValue": "A String",
+                            "booleanValue": True or False,
+                            "integerValue": "A String",
+                          },
+                        },
+                      ],
+                    },
+                    "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                        # (FPE) with the FFX mode of operation; however when used in the
+                        # `ReidentifyContent` API method, it serves the opposite function by reversing
+                        # the surrogate back into the original identifier. The identifier must be
+                        # encoded as ASCII. For a given crypto key and context, the same identifier
+                        # will be replaced with the same surrogate. Identifiers must be at least two
+                        # characters long. In the case that the identifier is the empty string, it will
+                        # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                        # more.
+                        #
+                        # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                        # do not require preserving the input alphabet space and size, plus warrant
+                        # referential integrity.
+                      "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                          # a key encryption key (KEK) stored by KMS).
+                          # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                          # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                          # unwrap the data crypto key.
+                        "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                            # The wrapped key must be a 128/192/256 bit key.
+                            # Authorization requires the following IAM permissions when sending a request
+                            # to perform a crypto transformation using a kms-wrapped crypto key:
+                            # dlp.kms.encrypt
+                          "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                          "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                        },
+                        "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                            # leaking the key. Choose another type of key if possible.
+                          "key": "A String", # A 128/192/256 bit key. [required]
+                        },
+                        "transient": { # Use this to have a random data crypto key generated.
+                            # It will be discarded after the request finishes.
+                          "name": "A String", # Name of the key. [required]
+                              # This is an arbitrary string used to differentiate different keys.
+                              # A unique key is generated per name: two separate `TransientCryptoKey`
+                              # protos share the same generated key if their names are the same.
+                              # When the data crypto key is generated, this name is not used in any way
+                              # (repeating the api call will result in a different key being generated).
+                        },
+                      },
+                      "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+                      "commonAlphabet": "A String",
+                      "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                          # that the FFX mode natively supports. This happens before/after
+                          # encryption/decryption.
+                          # Each character listed must appear only once.
+                          # Number of characters must be in the range [2, 62].
+                          # This must be encoded as ASCII.
+                          # The order of characters does not matter.
+                      "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                          # identifier in two different contexts won't be given the same surrogate. If
+                          # the context is not set, a default tweak will be used.
+                          #
+                          # If the context is set but:
+                          #
+                          # 1. there is no record present when transforming a given value or
+                          # 1. the field is not present when transforming a given value,
+                          #
+                          # a default tweak will be used.
+                          #
+                          # Note that case (1) is expected when an `InfoTypeTransformation` is
+                          # applied to both structured and non-structured `ContentItem`s.
+                          # Currently, the referenced field may be of value type integer or string.
+                          #
+                          # The tweak is constructed as a sequence of bytes in big endian byte order
+                          # such that:
+                          #
+                          # - a 64 bit integer is encoded followed by a single byte of value 1
+                          # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                        "name": "A String", # Name describing the field.
+                      },
+                      "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                          # This annotation will be applied to the surrogate by prefixing it with
+                          # the name of the custom infoType followed by the number of
+                          # characters comprising the surrogate. The following scheme defines the
+                          # format: info_type_name(surrogate_character_count):surrogate
+                          #
+                          # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                          # the surrogate is 'abc', the full replacement value
+                          # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                          #
+                          # This annotation identifies the surrogate when inspecting content using the
+                          # custom infoType
+                          # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                          # This facilitates reversal of the surrogate when it occurs in free text.
+                          #
+                          # In order for inspection to work properly, the name of this infoType must
+                          # not occur naturally anywhere in your data; otherwise, inspection may
+                          # find a surrogate that does not correspond to an actual identifier.
+                          # Therefore, choose your custom infoType name carefully after considering
+                          # what your data looks like. One way to select a name that has a high chance
+                          # of yielding reliable detection is to include one or more unicode characters
+                          # that are highly improbable to exist in your data.
+                          # For example, assuming your data is entered from a regular ASCII keyboard,
+                          # the symbol with the hex code point 29DD might be used like so:
+                          # ⧝MY_TOKEN_TYPE
+                        "name": "A String", # Name of the information type. Either a name of your choosing when
+                            # creating a CustomInfoType, or one of the names listed
+                            # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                            # a built-in type. InfoType names should conform to the pattern
+                            # [a-zA-Z0-9_]{1,64}.
+                      },
+                    },
+                    "replaceConfig": { # Replace each input value with a given `Value`.
+                      "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                    },
+                  },
+                  "infoTypes": [ # InfoTypes to apply the transformation to. An empty list will cause
+                      # this transformation to apply to all findings that correspond to
+                      # infoTypes that were requested in `InspectConfig`.
+                    { # Type of information detected by the API.
+                      "name": "A String", # Name of the information type. Either a name of your choosing when
+                          # creating a CustomInfoType, or one of the names listed
+                          # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                          # a built-in type. InfoType names should conform to the pattern
+                          # [a-zA-Z0-9_]{1,64}.
+                    },
+                  ],
+                },
+              ],
+            },
+            "primitiveTransformation": { # A rule for transforming a value. # Apply the transformation to the entire field.
+              "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                  # fixed character. Masking can start from the beginning or end of the string.
+                  # This can be used on data of any type (numbers, longs, and so on) and when
+                  # de-identifying structured data we'll attempt to preserve the original data's
+                  # type. (This allows you to take a long like 123 and modify it to a string like
+                  # **3.
+                "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                    # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                    # mask 5 chars with * we would produce ***-*55-5555.
+                  { # Characters to skip when doing deidentification of a value. These will be left
+                      # alone and skipped.
+                    "commonCharactersToIgnore": "A String",
+                    "charactersToSkip": "A String",
+                  },
+                ],
+                "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                    # masked. Skipped characters do not count towards this tally.
+                "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                    # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                    # code or credit card number. String must have length 1. If not supplied, we
+                    # will default to "*" for strings, 0 for digits.
+                "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                    # '0', number_to_mask is 14, and `reverse_order` is false, then
+                    # 1234-5678-9012-3456 -> 00000000000000-3456
+                    # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                    # is true, then 12345 -> 12***
+              },
+              "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                  # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                  # output would be 'My phone number is '.
+              },
+              "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                  # input. Outputs a base64 encoded representation of the encrypted output.
+                  # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                    # referential integrity such that the same identifier in two different
+                    # contexts will be given a distinct surrogate. The context is appended to
+                    # plaintext value being encrypted. On decryption the provided context is
+                    # validated against the value used during encryption. If a context was
+                    # provided during encryption, same context must be provided during decryption
+                    # as well.
+                    #
+                    # If the context is not set, plaintext would be used as is for encryption.
+                    # If the context is set but:
+                    #
+                    # 1. there is no record present when transforming a given value or
+                    # 2. the field is not present when transforming a given value,
+                    #
+                    # plaintext would be used as is for encryption.
+                    #
+                    # Note that case (1) is expected when an `InfoTypeTransformation` is
+                    # applied to both structured and non-structured `ContentItem`s.
+                  "name": "A String", # Name describing the field.
+                },
+                "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                    # This annotation will be applied to the surrogate by prefixing it with
+                    # the name of the custom info type followed by the number of
+                    # characters comprising the surrogate. The following scheme defines the
+                    # format: <info type name>(<surrogate character count>):<surrogate>
+                    #
+                    # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                    # the surrogate is 'abc', the full replacement value
+                    # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                    #
+                    # This annotation identifies the surrogate when inspecting content using the
+                    # custom info type 'Surrogate'. This facilitates reversal of the
+                    # surrogate when it occurs in free text.
+                    #
+                    # In order for inspection to work properly, the name of this info type must
+                    # not occur naturally anywhere in your data; otherwise, inspection may either
+                    #
+                    # - reverse a surrogate that does not correspond to an actual identifier
+                    # - be unable to parse the surrogate and result in an error
+                    #
+                    # Therefore, choose your custom info type name carefully after considering
+                    # what your data looks like. One way to select a name that has a high chance
+                    # of yielding reliable detection is to include one or more unicode characters
+                    # that are highly improbable to exist in your data.
+                    # For example, assuming your data is entered from a regular ASCII keyboard,
+                    # the symbol with the hex code point 29DD might be used like so:
+                    # ⧝MY_TOKEN_TYPE
+                  "name": "A String", # Name of the information type. Either a name of your choosing when
+                      # creating a CustomInfoType, or one of the names listed
+                      # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                      # a built-in type. InfoType names should conform to the pattern
+                      # [a-zA-Z0-9_]{1,64}.
+                },
+              },
+              "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                  # Bucketing transformation can provide all of this functionality,
+                  # but requires more configuration. This message is provided as a convenience to
+                  # the user for simple bucketing strategies.
+                  #
+                  # The transformed value will be a hyphenated string of
+                  # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                  # all values that are within this bucket will be replaced with "10-20".
+                  #
+                  # This can be used on data of type: double, long.
+                  #
+                  # If the bound Value type differs from the type of data
+                  # being transformed, we will first attempt converting the type of the data to
+                  # be transformed to match the type of the bound before comparing.
+                  #
+                  # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                    # grouped together into a single bucket; for example if `lower_bound` = 10,
+                    # then all values less than 10 are replaced with the value “-10”. [Required].
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+                "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                    # grouped together into a single bucket; for example if `upper_bound` = 89,
+                    # then all values greater than 89 are replaced with the value “89+”.
+                    # [Required].
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+                "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                    # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                    # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                    # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+              },
+              "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+              },
+              "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                  # portion of the value.
+                "partToExtract": "A String",
+              },
+              "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                  # Uses SHA-256.
+                  # The key size must be either 32 or 64 bytes.
+                  # Outputs a base64 encoded representation of the hashed output
+                  # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                  # Currently, only string and integer values can be hashed.
+                  # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+              },
+              "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                  # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                  # to learn more.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                    # results in the same shift for the same context and crypto_key.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                    # [Required]
+                "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                    # range (inclusive ends). Negative means shift to earlier in time. Must not
+                    # be more than 365250 days (1000 years) each direction.
+                    #
+                    # For example, 3 means shift date to at most 3 days into the future.
+                    # [Required]
+                "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                    # If set, must also set method. If set, shift will be consistent for the
+                    # given context.
+                  "name": "A String", # Name describing the field.
+                },
+              },
+              "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                  # replacement values are dynamically provided by the user for custom behavior,
+                  # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                  # This can be used on
+                  # data of type: number, long, string, timestamp.
+                  # If the bound `Value` type differs from the type of data being transformed, we
+                  # will first attempt converting the type of the data to be transformed to match
+                  # the type of the bound before comparing.
+                  # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                  { # Bucket is represented as a range, along with replacement values.
+                    "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                    "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                        # the default behavior will be to hyphenate the min-max range.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                    "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                        # used.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                  },
+                ],
+              },
+              "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                  # (FPE) with the FFX mode of operation; however when used in the
+                  # `ReidentifyContent` API method, it serves the opposite function by reversing
+                  # the surrogate back into the original identifier. The identifier must be
+                  # encoded as ASCII. For a given crypto key and context, the same identifier
+                  # will be replaced with the same surrogate. Identifiers must be at least two
+                  # characters long. In the case that the identifier is the empty string, it will
+                  # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                  # more.
+                  #
+                  # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                  # do not require preserving the input alphabet space and size, plus warrant
+                  # referential integrity.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+                "commonAlphabet": "A String",
+                "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                    # that the FFX mode natively supports. This happens before/after
+                    # encryption/decryption.
+                    # Each character listed must appear only once.
+                    # Number of characters must be in the range [2, 62].
+                    # This must be encoded as ASCII.
+                    # The order of characters does not matter.
+                "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                    # identifier in two different contexts won't be given the same surrogate. If
+                    # the context is not set, a default tweak will be used.
+                    #
+                    # If the context is set but:
+                    #
+                    # 1. there is no record present when transforming a given value or
+                    # 1. the field is not present when transforming a given value,
+                    #
+                    # a default tweak will be used.
+                    #
+                    # Note that case (1) is expected when an `InfoTypeTransformation` is
+                    # applied to both structured and non-structured `ContentItem`s.
+                    # Currently, the referenced field may be of value type integer or string.
+                    #
+                    # The tweak is constructed as a sequence of bytes in big endian byte order
+                    # such that:
+                    #
+                    # - a 64 bit integer is encoded followed by a single byte of value 1
+                    # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                  "name": "A String", # Name describing the field.
+                },
+                "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                    # This annotation will be applied to the surrogate by prefixing it with
+                    # the name of the custom infoType followed by the number of
+                    # characters comprising the surrogate. The following scheme defines the
+                    # format: info_type_name(surrogate_character_count):surrogate
+                    #
+                    # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                    # the surrogate is 'abc', the full replacement value
+                    # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                    #
+                    # This annotation identifies the surrogate when inspecting content using the
+                    # custom infoType
+                    # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                    # This facilitates reversal of the surrogate when it occurs in free text.
+                    #
+                    # In order for inspection to work properly, the name of this infoType must
+                    # not occur naturally anywhere in your data; otherwise, inspection may
+                    # find a surrogate that does not correspond to an actual identifier.
+                    # Therefore, choose your custom infoType name carefully after considering
+                    # what your data looks like. One way to select a name that has a high chance
+                    # of yielding reliable detection is to include one or more unicode characters
+                    # that are highly improbable to exist in your data.
+                    # For example, assuming your data is entered from a regular ASCII keyboard,
+                    # the symbol with the hex code point 29DD might be used like so:
+                    # ⧝MY_TOKEN_TYPE
+                  "name": "A String", # Name of the information type. Either a name of your choosing when
+                      # creating a CustomInfoType, or one of the names listed
+                      # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                      # a built-in type. InfoType names should conform to the pattern
+                      # [a-zA-Z0-9_]{1,64}.
+                },
+              },
+              "replaceConfig": { # Replace each input value with a given `Value`.
+                "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+              },
+            },
+            "condition": { # A condition for determining whether a transformation should be applied to # Only apply the transformation if the condition evaluates to true for the
+                # given `RecordCondition`. The conditions are allowed to reference fields
+                # that are not used in the actual transformation. [optional]
+                #
+                # Example Use Cases:
+                #
+                # - Apply a different bucket transformation to an age column if the zip code
+                # column for the same record is within a specific range.
+                # - Redact a field if the date of birth field is greater than 85.
+                # a field.
+              "expressions": { # An expression, consisting or an operator and conditions. # An expression.
+                "conditions": { # A collection of conditions.
+                  "conditions": [
+                    { # The field type of `value` and `field` do not need to match to be
+                        # considered equal, but not all comparisons are possible.
+                        # EQUAL_TO and NOT_EQUAL_TO attempt to compare even with incompatible types,
+                        # but all other comparisons are invalid with incompatible types.
+                        # A `value` of type:
+                        #
+                        # - `string` can be compared against all other types
+                        # - `boolean` can only be compared against other booleans
+                        # - `integer` can be compared against doubles or a string if the string value
+                        # can be parsed as an integer.
+                        # - `double` can be compared against integers or a string if the string can
+                        # be parsed as a double.
+                        # - `Timestamp` can be compared against strings in RFC 3339 date string
+                        # format.
+                        # - `TimeOfDay` can be compared against timestamps and strings in the format
+                        # of 'HH:mm:ss'.
+                        #
+                        # If we fail to compare do to type mismatch, a warning will be given and
+                        # the condition will evaluate to false.
+                      "operator": "A String", # Operator used to compare the field or infoType to the value. [required]
+                      "field": { # General identifier of a data field in a storage service. # Field within the record this condition is evaluated against. [required]
+                        "name": "A String", # Name describing the field.
+                      },
+                      "value": { # Set of primitive values supported by the system. # Value to compare against. [Required, except for `EXISTS` tests.]
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                    },
+                  ],
+                },
+                "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently
+                    # only supported value is `AND`.
+              },
+            },
+            "fields": [ # Input field(s) to apply the transformation to. [required]
+              { # General identifier of a data field in a storage service.
+                "name": "A String", # Name describing the field.
+              },
+            ],
+          },
+        ],
+      },
+    },
+    "inspectConfig": { # Configuration description of the scanning process. # Configuration for the inspector.
+        # Items specified here will override the template referenced by the
+        # inspect_template_name argument.
+        # When used with redactContent only info_types and min_likelihood are currently
+        # used.
+      "excludeInfoTypes": True or False, # When true, excludes type information of the findings.
+      "limits": {
+        "maxFindingsPerRequest": 42, # Max number of findings that will be returned per request/job.
+            # When set within `InspectContentRequest`, the maximum returned is 2000
+            # regardless if this is set higher.
+        "maxFindingsPerInfoType": [ # Configuration of findings limit given for specified infoTypes.
+          { # Max findings configuration per infoType, per content item or long
+              # running DlpJob.
+            "infoType": { # Type of information detected by the API. # Type of information the findings limit applies to. Only one limit per
+                # info_type should be provided. If InfoTypeLimit does not have an
+                # info_type, the DLP API applies the limit against all info_types that
+                # are found but not specified in another InfoTypeLimit.
+              "name": "A String", # Name of the information type. Either a name of your choosing when
+                  # creating a CustomInfoType, or one of the names listed
+                  # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                  # a built-in type. InfoType names should conform to the pattern
+                  # [a-zA-Z0-9_]{1,64}.
+            },
+            "maxFindings": 42, # Max findings limit for the given infoType.
+          },
+        ],
+        "maxFindingsPerItem": 42, # Max number of findings that will be returned for each item scanned.
+            # When set within `InspectDataSourceRequest`,
+            # the maximum returned is 2000 regardless if this is set higher.
+            # When set within `InspectContentRequest`, this field is ignored.
+      },
+      "minLikelihood": "A String", # Only returns findings equal or above this threshold. The default is
+          # POSSIBLE.
+          # See https://cloud.google.com/dlp/docs/likelihood to learn more.
+      "customInfoTypes": [ # CustomInfoTypes provided by the user. See
+          # https://cloud.google.com/dlp/docs/creating-custom-infotypes to learn more.
+        { # Custom information type provided by the user. Used to find domain-specific
+            # sensitive information configurable to the data in question.
+          "regex": { # Message defining a custom regular expression. # Regular expression based CustomInfoType.
+            "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                # google/re2 repository on GitHub.
+            "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                # specified, the entire match is returned. No more than 3 may be included.
+              42,
+            ],
+          },
+          "surrogateType": { # Message for detecting output from deidentification transformations # Message for detecting output from deidentification transformations that
+              # support reversing.
+              # such as
+              # [`CryptoReplaceFfxFpeConfig`](/dlp/docs/reference/rest/v2/organizations.deidentifyTemplates#cryptoreplaceffxfpeconfig).
+              # These types of transformations are
+              # those that perform pseudonymization, thereby producing a "surrogate" as
+              # output. This should be used in conjunction with a field on the
+              # transformation such as `surrogate_info_type`. This CustomInfoType does
+              # not support the use of `detection_rules`.
+          },
+          "infoType": { # Type of information detected by the API. # CustomInfoType can either be a new infoType, or an extension of built-in
+              # infoType, when the name matches one of existing infoTypes and that infoType
+              # is specified in `InspectContent.info_types` field. Specifying the latter
+              # adds findings to the one detected by the system. If built-in info type is
+              # not specified in `InspectContent.info_types` list then the name is treated
+              # as a custom info type.
+            "name": "A String", # Name of the information type. Either a name of your choosing when
+                # creating a CustomInfoType, or one of the names listed
+                # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                # a built-in type. InfoType names should conform to the pattern
+                # [a-zA-Z0-9_]{1,64}.
+          },
+          "dictionary": { # Custom information type based on a dictionary of words or phrases. This can # A list of phrases to detect as a CustomInfoType.
+              # be used to match sensitive information specific to the data, such as a list
+              # of employee IDs or job titles.
+              #
+              # Dictionary words are case-insensitive and all characters other than letters
+              # and digits in the unicode [Basic Multilingual
+              # Plane](https://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane)
+              # will be replaced with whitespace when scanning for matches, so the
+              # dictionary phrase "Sam Johnson" will match all three phrases "sam johnson",
+              # "Sam, Johnson", and "Sam (Johnson)". Additionally, the characters
+              # surrounding any match must be of a different type than the adjacent
+              # characters within the word, so letters must be next to non-letters and
+              # digits next to non-digits. For example, the dictionary word "jen" will
+              # match the first three letters of the text "jen123" but will return no
+              # matches for "jennifer".
+              #
+              # Dictionary words containing a large number of characters that are not
+              # letters or digits may result in unexpected findings because such characters
+              # are treated as whitespace. The
+              # [limits](https://cloud.google.com/dlp/limits) page contains details about
+              # the size limits of dictionaries. For dictionaries that do not fit within
+              # these constraints, consider using `LargeCustomDictionaryConfig` in the
+              # `StoredInfoType` API.
+            "wordList": { # Message defining a list of words or phrases to search for in the data. # List of words or phrases to search for.
+              "words": [ # Words or phrases defining the dictionary. The dictionary must contain
+                  # at least one phrase and every phrase must contain at least 2 characters
+                  # that are letters or digits. [required]
+                "A String",
+              ],
+            },
+            "cloudStoragePath": { # Message representing a single file or path in Cloud Storage. # Newline-delimited file of words in Cloud Storage. Only a single file
+                # is accepted.
+              "path": "A String", # A url representing a file or path (no wildcards) in Cloud Storage.
+                  # Example: gs://[BUCKET_NAME]/dictionary.txt
+            },
+          },
+          "storedType": { # A reference to a StoredInfoType to use with scanning. # Load an existing `StoredInfoType` resource for use in
+              # `InspectDataSource`. Not currently supported in `InspectContent`.
+            "name": "A String", # Resource name of the requested `StoredInfoType`, for example
+                # `organizations/433245324/storedInfoTypes/432452342` or
+                # `projects/project-id/storedInfoTypes/432452342`.
+            "createTime": "A String", # Timestamp indicating when the version of the `StoredInfoType` used for
+                # inspection was created. Output-only field, populated by the system.
+          },
+          "detectionRules": [ # Set of detection rules to apply to all findings of this CustomInfoType.
+              # Rules are applied in order that they are specified. Not supported for the
+              # `surrogate_type` CustomInfoType.
+            { # Deprecated; use `InspectionRuleSet` instead. Rule for modifying a
+                # `CustomInfoType` to alter behavior under certain circumstances, depending
+                # on the specific details of the rule. Not supported for the `surrogate_type`
+                # custom infoType.
+              "hotwordRule": { # The rule that adjusts the likelihood of findings within a certain # Hotword-based detection rule.
+                  # proximity of hotwords.
+                "proximity": { # Message for specifying a window around a finding to apply a detection # Proximity of the finding within which the entire hotword must reside.
+                    # The total length of the window cannot exceed 1000 characters. Note that
+                    # the finding itself will be included in the window, so that hotwords may
+                    # be used to match substrings of the finding itself. For example, the
+                    # certainty of a phone number regex "\(\d{3}\) \d{3}-\d{4}" could be
+                    # adjusted upwards if the area code is known to be the local area code of
+                    # a company office using the hotword regex "\(xxx\)", where "xxx"
+                    # is the area code in question.
+                    # rule.
+                  "windowAfter": 42, # Number of characters after the finding to consider.
+                  "windowBefore": 42, # Number of characters before the finding to consider.
+                },
+                "hotwordRegex": { # Message defining a custom regular expression. # Regular expression pattern defining what qualifies as a hotword.
+                  "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                      # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                      # google/re2 repository on GitHub.
+                  "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                      # specified, the entire match is returned. No more than 3 may be included.
+                    42,
+                  ],
+                },
+                "likelihoodAdjustment": { # Message for specifying an adjustment to the likelihood of a finding as # Likelihood adjustment to apply to all matching findings.
+                    # part of a detection rule.
+                  "relativeLikelihood": 42, # Increase or decrease the likelihood by the specified number of
+                      # levels. For example, if a finding would be `POSSIBLE` without the
+                      # detection rule and `relative_likelihood` is 1, then it is upgraded to
+                      # `LIKELY`, while a value of -1 would downgrade it to `UNLIKELY`.
+                      # Likelihood may never drop below `VERY_UNLIKELY` or exceed
+                      # `VERY_LIKELY`, so applying an adjustment of 1 followed by an
+                      # adjustment of -1 when base likelihood is `VERY_LIKELY` will result in
+                      # a final likelihood of `LIKELY`.
+                  "fixedLikelihood": "A String", # Set the likelihood of a finding to a fixed value.
+                },
+              },
+            },
+          ],
+          "exclusionType": "A String", # If set to EXCLUSION_TYPE_EXCLUDE this infoType will not cause a finding
+              # to be returned. It still can be used for rules matching.
+          "likelihood": "A String", # Likelihood to return for this CustomInfoType. This base value can be
+              # altered by a detection rule if the finding meets the criteria specified by
+              # the rule. Defaults to `VERY_LIKELY` if not specified.
+        },
+      ],
+      "includeQuote": True or False, # When true, a contextual quote from the data that triggered a finding is
+          # included in the response; see Finding.quote.
+      "ruleSet": [ # Set of rules to apply to the findings for this InspectConfig.
+          # Exclusion rules, contained in the set are executed in the end, other
+          # rules are executed in the order they are specified for each info type.
+        { # Rule set for modifying a set of infoTypes to alter behavior under certain
+            # circumstances, depending on the specific details of the rules within the set.
+          "rules": [ # Set of rules to be applied to infoTypes. The rules are applied in order.
+            { # A single inspection rule to be applied to infoTypes, specified in
+                # `InspectionRuleSet`.
+              "hotwordRule": { # The rule that adjusts the likelihood of findings within a certain # Hotword-based detection rule.
+                  # proximity of hotwords.
+                "proximity": { # Message for specifying a window around a finding to apply a detection # Proximity of the finding within which the entire hotword must reside.
+                    # The total length of the window cannot exceed 1000 characters. Note that
+                    # the finding itself will be included in the window, so that hotwords may
+                    # be used to match substrings of the finding itself. For example, the
+                    # certainty of a phone number regex "\(\d{3}\) \d{3}-\d{4}" could be
+                    # adjusted upwards if the area code is known to be the local area code of
+                    # a company office using the hotword regex "\(xxx\)", where "xxx"
+                    # is the area code in question.
+                    # rule.
+                  "windowAfter": 42, # Number of characters after the finding to consider.
+                  "windowBefore": 42, # Number of characters before the finding to consider.
+                },
+                "hotwordRegex": { # Message defining a custom regular expression. # Regular expression pattern defining what qualifies as a hotword.
+                  "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                      # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                      # google/re2 repository on GitHub.
+                  "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                      # specified, the entire match is returned. No more than 3 may be included.
+                    42,
+                  ],
+                },
+                "likelihoodAdjustment": { # Message for specifying an adjustment to the likelihood of a finding as # Likelihood adjustment to apply to all matching findings.
+                    # part of a detection rule.
+                  "relativeLikelihood": 42, # Increase or decrease the likelihood by the specified number of
+                      # levels. For example, if a finding would be `POSSIBLE` without the
+                      # detection rule and `relative_likelihood` is 1, then it is upgraded to
+                      # `LIKELY`, while a value of -1 would downgrade it to `UNLIKELY`.
+                      # Likelihood may never drop below `VERY_UNLIKELY` or exceed
+                      # `VERY_LIKELY`, so applying an adjustment of 1 followed by an
+                      # adjustment of -1 when base likelihood is `VERY_LIKELY` will result in
+                      # a final likelihood of `LIKELY`.
+                  "fixedLikelihood": "A String", # Set the likelihood of a finding to a fixed value.
+                },
+              },
+              "exclusionRule": { # The rule that specifies conditions when findings of infoTypes specified in # Exclusion rule.
+                  # `InspectionRuleSet` are removed from results.
+                "regex": { # Message defining a custom regular expression. # Regular expression which defines the rule.
+                  "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                      # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                      # google/re2 repository on GitHub.
+                  "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                      # specified, the entire match is returned. No more than 3 may be included.
+                    42,
+                  ],
+                },
+                "excludeInfoTypes": { # List of exclude infoTypes. # Set of infoTypes for which findings would affect this rule.
+                  "infoTypes": [ # InfoType list in ExclusionRule rule drops a finding when it overlaps or
+                      # contained within with a finding of an infoType from this list. For
+                      # example, for `InspectionRuleSet.info_types` containing "PHONE_NUMBER"` and
+                      # `exclusion_rule` containing `exclude_info_types.info_types` with
+                      # "EMAIL_ADDRESS" the phone number findings are dropped if they overlap
+                      # with EMAIL_ADDRESS finding.
+                      # That leads to "555-222-2222@example.org" to generate only a single
+                      # finding, namely email address.
+                    { # Type of information detected by the API.
+                      "name": "A String", # Name of the information type. Either a name of your choosing when
+                          # creating a CustomInfoType, or one of the names listed
+                          # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                          # a built-in type. InfoType names should conform to the pattern
+                          # [a-zA-Z0-9_]{1,64}.
+                    },
+                  ],
+                },
+                "dictionary": { # Custom information type based on a dictionary of words or phrases. This can # Dictionary which defines the rule.
+                    # be used to match sensitive information specific to the data, such as a list
+                    # of employee IDs or job titles.
+                    #
+                    # Dictionary words are case-insensitive and all characters other than letters
+                    # and digits in the unicode [Basic Multilingual
+                    # Plane](https://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane)
+                    # will be replaced with whitespace when scanning for matches, so the
+                    # dictionary phrase "Sam Johnson" will match all three phrases "sam johnson",
+                    # "Sam, Johnson", and "Sam (Johnson)". Additionally, the characters
+                    # surrounding any match must be of a different type than the adjacent
+                    # characters within the word, so letters must be next to non-letters and
+                    # digits next to non-digits. For example, the dictionary word "jen" will
+                    # match the first three letters of the text "jen123" but will return no
+                    # matches for "jennifer".
+                    #
+                    # Dictionary words containing a large number of characters that are not
+                    # letters or digits may result in unexpected findings because such characters
+                    # are treated as whitespace. The
+                    # [limits](https://cloud.google.com/dlp/limits) page contains details about
+                    # the size limits of dictionaries. For dictionaries that do not fit within
+                    # these constraints, consider using `LargeCustomDictionaryConfig` in the
+                    # `StoredInfoType` API.
+                  "wordList": { # Message defining a list of words or phrases to search for in the data. # List of words or phrases to search for.
+                    "words": [ # Words or phrases defining the dictionary. The dictionary must contain
+                        # at least one phrase and every phrase must contain at least 2 characters
+                        # that are letters or digits. [required]
+                      "A String",
+                    ],
+                  },
+                  "cloudStoragePath": { # Message representing a single file or path in Cloud Storage. # Newline-delimited file of words in Cloud Storage. Only a single file
+                      # is accepted.
+                    "path": "A String", # A url representing a file or path (no wildcards) in Cloud Storage.
+                        # Example: gs://[BUCKET_NAME]/dictionary.txt
+                  },
+                },
+                "matchingType": "A String", # How the rule is applied, see MatchingType documentation for details.
+              },
+            },
+          ],
+          "infoTypes": [ # List of infoTypes this rule set is applied to.
+            { # Type of information detected by the API.
+              "name": "A String", # Name of the information type. Either a name of your choosing when
+                  # creating a CustomInfoType, or one of the names listed
+                  # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                  # a built-in type. InfoType names should conform to the pattern
+                  # [a-zA-Z0-9_]{1,64}.
+            },
+          ],
+        },
+      ],
+      "contentOptions": [ # List of options defining data content to scan.
+          # If empty, text, images, and other content will be included.
+        "A String",
+      ],
+      "infoTypes": [ # Restricts what info_types to look for. The values must correspond to
+          # InfoType values returned by ListInfoTypes or listed at
+          # https://cloud.google.com/dlp/docs/infotypes-reference.
+          #
+          # When no InfoTypes or CustomInfoTypes are specified in a request, the
+          # system may automatically choose what detectors to run. By default this may
+          # be all types, but may change over time as detectors are updated.
+          #
+          # The special InfoType name "ALL_BASIC" can be used to trigger all detectors,
+          # but may change over time as new InfoTypes are added. If you need precise
+          # control and predictability as to what detectors are run you should specify
+          # specific InfoTypes listed in the reference.
+        { # Type of information detected by the API.
+          "name": "A String", # Name of the information type. Either a name of your choosing when
+              # creating a CustomInfoType, or one of the names listed
+              # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+              # a built-in type. InfoType names should conform to the pattern
+              # [a-zA-Z0-9_]{1,64}.
+        },
+      ],
+    },
+    "item": { # Container structure for the content to inspect. # The item to de-identify. Will be treated as text.
+      "table": { # Structured content to inspect. Up to 50,000 `Value`s per request allowed. # Structured content for inspection. See
+          # https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
+          # learn more.
+          # See https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
+          # learn more.
+        "headers": [
+          { # General identifier of a data field in a storage service.
+            "name": "A String", # Name describing the field.
+          },
+        ],
+        "rows": [
+          {
+            "values": [
+              { # Set of primitive values supported by the system.
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+            ],
+          },
+        ],
+      },
+      "byteItem": { # Container for bytes to inspect or redact. # Content data to inspect or redact. Replaces `type` and `data`.
+        "type": "A String", # The type of data stored in the bytes string. Default will be TEXT_UTF8.
+        "data": "A String", # Content data to inspect or redact.
+      },
+      "value": "A String", # String data to inspect or redact.
+    },
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Results of de-identifying a ContentItem.
+    "overview": { # Overview of the modifications that occurred. # An overview of the changes that were made on the `item`.
+      "transformationSummaries": [ # Transformations applied to the dataset.
+        { # Summary of a single transformation.
+            # Only one of 'transformation', 'field_transformation', or 'record_suppress'
+            # will be set.
+          "infoType": { # Type of information detected by the API. # Set if the transformation was limited to a specific InfoType.
+            "name": "A String", # Name of the information type. Either a name of your choosing when
+                # creating a CustomInfoType, or one of the names listed
+                # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                # a built-in type. InfoType names should conform to the pattern
+                # [a-zA-Z0-9_]{1,64}.
+          },
+          "recordSuppress": { # Configuration to suppress records whose suppression conditions evaluate to # The specific suppression option these stats apply to.
+              # true.
+            "condition": { # A condition for determining whether a transformation should be applied to # A condition that when it evaluates to true will result in the record being
+                # evaluated to be suppressed from the transformed content.
+                # a field.
+              "expressions": { # An expression, consisting or an operator and conditions. # An expression.
+                "conditions": { # A collection of conditions.
+                  "conditions": [
+                    { # The field type of `value` and `field` do not need to match to be
+                        # considered equal, but not all comparisons are possible.
+                        # EQUAL_TO and NOT_EQUAL_TO attempt to compare even with incompatible types,
+                        # but all other comparisons are invalid with incompatible types.
+                        # A `value` of type:
+                        #
+                        # - `string` can be compared against all other types
+                        # - `boolean` can only be compared against other booleans
+                        # - `integer` can be compared against doubles or a string if the string value
+                        # can be parsed as an integer.
+                        # - `double` can be compared against integers or a string if the string can
+                        # be parsed as a double.
+                        # - `Timestamp` can be compared against strings in RFC 3339 date string
+                        # format.
+                        # - `TimeOfDay` can be compared against timestamps and strings in the format
+                        # of 'HH:mm:ss'.
+                        #
+                        # If we fail to compare do to type mismatch, a warning will be given and
+                        # the condition will evaluate to false.
+                      "operator": "A String", # Operator used to compare the field or infoType to the value. [required]
+                      "field": { # General identifier of a data field in a storage service. # Field within the record this condition is evaluated against. [required]
+                        "name": "A String", # Name describing the field.
+                      },
+                      "value": { # Set of primitive values supported by the system. # Value to compare against. [Required, except for `EXISTS` tests.]
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                    },
+                  ],
+                },
+                "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently
+                    # only supported value is `AND`.
+              },
+            },
+          },
+          "results": [
+            { # A collection that informs the user the number of times a particular
+                # `TransformationResultCode` and error details occurred.
+              "count": "A String",
+              "code": "A String",
+              "details": "A String", # A place for warnings or errors to show up if a transformation didn't
+                  # work as expected.
+            },
+          ],
+          "field": { # General identifier of a data field in a storage service. # Set if the transformation was limited to a specific FieldId.
+            "name": "A String", # Name describing the field.
+          },
+          "fieldTransformations": [ # The field transformation that was applied.
+              # If multiple field transformations are requested for a single field,
+              # this list will contain all of them; otherwise, only one is supplied.
+            { # The transformation to apply to the field.
+              "infoTypeTransformations": { # A type of transformation that will scan unstructured text and # Treat the contents of the field as free text, and selectively
+                  # transform content that matches an `InfoType`.
+                  # apply various `PrimitiveTransformation`s to each finding, where the
+                  # transformation is applied to only values that were identified as a specific
+                  # info_type.
+                "transformations": [ # Transformation for each infoType. Cannot specify more than one
+                    # for a given infoType. [required]
+                  { # A transformation to apply to text that is identified as a specific
+                      # info_type.
+                    "primitiveTransformation": { # A rule for transforming a value. # Primitive transformation to apply to the infoType. [required]
+                      "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                          # fixed character. Masking can start from the beginning or end of the string.
+                          # This can be used on data of any type (numbers, longs, and so on) and when
+                          # de-identifying structured data we'll attempt to preserve the original data's
+                          # type. (This allows you to take a long like 123 and modify it to a string like
+                          # **3.
+                        "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                            # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                            # mask 5 chars with * we would produce ***-*55-5555.
+                          { # Characters to skip when doing deidentification of a value. These will be left
+                              # alone and skipped.
+                            "commonCharactersToIgnore": "A String",
+                            "charactersToSkip": "A String",
+                          },
+                        ],
+                        "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                            # masked. Skipped characters do not count towards this tally.
+                        "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                            # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                            # code or credit card number. String must have length 1. If not supplied, we
+                            # will default to "*" for strings, 0 for digits.
+                        "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                            # '0', number_to_mask is 14, and `reverse_order` is false, then
+                            # 1234-5678-9012-3456 -> 00000000000000-3456
+                            # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                            # is true, then 12345 -> 12***
+                      },
+                      "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                          # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                          # output would be 'My phone number is '.
+                      },
+                      "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                          # input. Outputs a base64 encoded representation of the encrypted output.
+                          # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+                        "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                            # a key encryption key (KEK) stored by KMS).
+                            # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                            # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                            # unwrap the data crypto key.
+                          "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                              # The wrapped key must be a 128/192/256 bit key.
+                              # Authorization requires the following IAM permissions when sending a request
+                              # to perform a crypto transformation using a kms-wrapped crypto key:
+                              # dlp.kms.encrypt
+                            "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                            "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                          },
+                          "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                              # leaking the key. Choose another type of key if possible.
+                            "key": "A String", # A 128/192/256 bit key. [required]
+                          },
+                          "transient": { # Use this to have a random data crypto key generated.
+                              # It will be discarded after the request finishes.
+                            "name": "A String", # Name of the key. [required]
+                                # This is an arbitrary string used to differentiate different keys.
+                                # A unique key is generated per name: two separate `TransientCryptoKey`
+                                # protos share the same generated key if their names are the same.
+                                # When the data crypto key is generated, this name is not used in any way
+                                # (repeating the api call will result in a different key being generated).
+                          },
+                        },
+                        "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                            # referential integrity such that the same identifier in two different
+                            # contexts will be given a distinct surrogate. The context is appended to
+                            # plaintext value being encrypted. On decryption the provided context is
+                            # validated against the value used during encryption. If a context was
+                            # provided during encryption, same context must be provided during decryption
+                            # as well.
+                            #
+                            # If the context is not set, plaintext would be used as is for encryption.
+                            # If the context is set but:
+                            #
+                            # 1. there is no record present when transforming a given value or
+                            # 2. the field is not present when transforming a given value,
+                            #
+                            # plaintext would be used as is for encryption.
+                            #
+                            # Note that case (1) is expected when an `InfoTypeTransformation` is
+                            # applied to both structured and non-structured `ContentItem`s.
+                          "name": "A String", # Name describing the field.
+                        },
+                        "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                            # This annotation will be applied to the surrogate by prefixing it with
+                            # the name of the custom info type followed by the number of
+                            # characters comprising the surrogate. The following scheme defines the
+                            # format: <info type name>(<surrogate character count>):<surrogate>
+                            #
+                            # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                            # the surrogate is 'abc', the full replacement value
+                            # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                            #
+                            # This annotation identifies the surrogate when inspecting content using the
+                            # custom info type 'Surrogate'. This facilitates reversal of the
+                            # surrogate when it occurs in free text.
+                            #
+                            # In order for inspection to work properly, the name of this info type must
+                            # not occur naturally anywhere in your data; otherwise, inspection may either
+                            #
+                            # - reverse a surrogate that does not correspond to an actual identifier
+                            # - be unable to parse the surrogate and result in an error
+                            #
+                            # Therefore, choose your custom info type name carefully after considering
+                            # what your data looks like. One way to select a name that has a high chance
+                            # of yielding reliable detection is to include one or more unicode characters
+                            # that are highly improbable to exist in your data.
+                            # For example, assuming your data is entered from a regular ASCII keyboard,
+                            # the symbol with the hex code point 29DD might be used like so:
+                            # ⧝MY_TOKEN_TYPE
+                          "name": "A String", # Name of the information type. Either a name of your choosing when
+                              # creating a CustomInfoType, or one of the names listed
+                              # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                              # a built-in type. InfoType names should conform to the pattern
+                              # [a-zA-Z0-9_]{1,64}.
+                        },
+                      },
+                      "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                          # Bucketing transformation can provide all of this functionality,
+                          # but requires more configuration. This message is provided as a convenience to
+                          # the user for simple bucketing strategies.
+                          #
+                          # The transformed value will be a hyphenated string of
+                          # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                          # all values that are within this bucket will be replaced with "10-20".
+                          #
+                          # This can be used on data of type: double, long.
+                          #
+                          # If the bound Value type differs from the type of data
+                          # being transformed, we will first attempt converting the type of the data to
+                          # be transformed to match the type of the bound before comparing.
+                          #
+                          # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                        "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                            # grouped together into a single bucket; for example if `lower_bound` = 10,
+                            # then all values less than 10 are replaced with the value “-10”. [Required].
+                            # Note that for the purposes of inspection or transformation, the number
+                            # of bytes considered to comprise a 'Value' is based on its representation
+                            # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                            # 123456789, the number of bytes would be counted as 9, even though an
+                            # int64 only holds up to 8 bytes of data.
+                          "floatValue": 3.14,
+                          "timestampValue": "A String",
+                          "dayOfWeekValue": "A String",
+                          "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                              # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                              # types are google.type.Date and `google.protobuf.Timestamp`.
+                            "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                # to allow the value "24:00:00" for scenarios like business closing time.
+                            "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                            "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                # allow the value 60 if it allows leap-seconds.
+                            "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                          },
+                          "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                              # and time zone are either specified elsewhere or are not significant. The date
+                              # is relative to the Proleptic Gregorian Calendar. This can represent:
+                              #
+                              # * A full date, with non-zero year, month and day values
+                              # * A month and day value, with a zero year, e.g. an anniversary
+                              # * A year on its own, with zero month and day values
+                              # * A year and month value, with a zero day, e.g. a credit card expiration date
+                              #
+                              # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                            "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                # a year.
+                            "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                # if specifying a year by itself or a year and month where the day is not
+                                # significant.
+                            "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                # month and day.
+                          },
+                          "stringValue": "A String",
+                          "booleanValue": True or False,
+                          "integerValue": "A String",
+                        },
+                        "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                            # grouped together into a single bucket; for example if `upper_bound` = 89,
+                            # then all values greater than 89 are replaced with the value “89+”.
+                            # [Required].
+                            # Note that for the purposes of inspection or transformation, the number
+                            # of bytes considered to comprise a 'Value' is based on its representation
+                            # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                            # 123456789, the number of bytes would be counted as 9, even though an
+                            # int64 only holds up to 8 bytes of data.
+                          "floatValue": 3.14,
+                          "timestampValue": "A String",
+                          "dayOfWeekValue": "A String",
+                          "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                              # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                              # types are google.type.Date and `google.protobuf.Timestamp`.
+                            "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                # to allow the value "24:00:00" for scenarios like business closing time.
+                            "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                            "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                # allow the value 60 if it allows leap-seconds.
+                            "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                          },
+                          "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                              # and time zone are either specified elsewhere or are not significant. The date
+                              # is relative to the Proleptic Gregorian Calendar. This can represent:
+                              #
+                              # * A full date, with non-zero year, month and day values
+                              # * A month and day value, with a zero year, e.g. an anniversary
+                              # * A year on its own, with zero month and day values
+                              # * A year and month value, with a zero day, e.g. a credit card expiration date
+                              #
+                              # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                            "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                # a year.
+                            "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                # if specifying a year by itself or a year and month where the day is not
+                                # significant.
+                            "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                # month and day.
+                          },
+                          "stringValue": "A String",
+                          "booleanValue": True or False,
+                          "integerValue": "A String",
+                        },
+                        "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                            # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                            # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                            # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+                      },
+                      "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+                      },
+                      "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                          # portion of the value.
+                        "partToExtract": "A String",
+                      },
+                      "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                          # Uses SHA-256.
+                          # The key size must be either 32 or 64 bytes.
+                          # Outputs a base64 encoded representation of the hashed output
+                          # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                          # Currently, only string and integer values can be hashed.
+                          # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+                        "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                            # a key encryption key (KEK) stored by KMS).
+                            # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                            # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                            # unwrap the data crypto key.
+                          "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                              # The wrapped key must be a 128/192/256 bit key.
+                              # Authorization requires the following IAM permissions when sending a request
+                              # to perform a crypto transformation using a kms-wrapped crypto key:
+                              # dlp.kms.encrypt
+                            "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                            "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                          },
+                          "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                              # leaking the key. Choose another type of key if possible.
+                            "key": "A String", # A 128/192/256 bit key. [required]
+                          },
+                          "transient": { # Use this to have a random data crypto key generated.
+                              # It will be discarded after the request finishes.
+                            "name": "A String", # Name of the key. [required]
+                                # This is an arbitrary string used to differentiate different keys.
+                                # A unique key is generated per name: two separate `TransientCryptoKey`
+                                # protos share the same generated key if their names are the same.
+                                # When the data crypto key is generated, this name is not used in any way
+                                # (repeating the api call will result in a different key being generated).
+                          },
+                        },
+                      },
+                      "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                          # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                          # to learn more.
+                        "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                            # results in the same shift for the same context and crypto_key.
+                            # a key encryption key (KEK) stored by KMS).
+                            # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                            # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                            # unwrap the data crypto key.
+                          "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                              # The wrapped key must be a 128/192/256 bit key.
+                              # Authorization requires the following IAM permissions when sending a request
+                              # to perform a crypto transformation using a kms-wrapped crypto key:
+                              # dlp.kms.encrypt
+                            "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                            "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                          },
+                          "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                              # leaking the key. Choose another type of key if possible.
+                            "key": "A String", # A 128/192/256 bit key. [required]
+                          },
+                          "transient": { # Use this to have a random data crypto key generated.
+                              # It will be discarded after the request finishes.
+                            "name": "A String", # Name of the key. [required]
+                                # This is an arbitrary string used to differentiate different keys.
+                                # A unique key is generated per name: two separate `TransientCryptoKey`
+                                # protos share the same generated key if their names are the same.
+                                # When the data crypto key is generated, this name is not used in any way
+                                # (repeating the api call will result in a different key being generated).
+                          },
+                        },
+                        "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                            # [Required]
+                        "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                            # range (inclusive ends). Negative means shift to earlier in time. Must not
+                            # be more than 365250 days (1000 years) each direction.
+                            #
+                            # For example, 3 means shift date to at most 3 days into the future.
+                            # [Required]
+                        "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                            # If set, must also set method. If set, shift will be consistent for the
+                            # given context.
+                          "name": "A String", # Name describing the field.
+                        },
+                      },
+                      "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                          # replacement values are dynamically provided by the user for custom behavior,
+                          # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                          # This can be used on
+                          # data of type: number, long, string, timestamp.
+                          # If the bound `Value` type differs from the type of data being transformed, we
+                          # will first attempt converting the type of the data to be transformed to match
+                          # the type of the bound before comparing.
+                          # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                        "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                          { # Bucket is represented as a range, along with replacement values.
+                            "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                                # Note that for the purposes of inspection or transformation, the number
+                                # of bytes considered to comprise a 'Value' is based on its representation
+                                # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                                # 123456789, the number of bytes would be counted as 9, even though an
+                                # int64 only holds up to 8 bytes of data.
+                              "floatValue": 3.14,
+                              "timestampValue": "A String",
+                              "dayOfWeekValue": "A String",
+                              "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                  # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                  # types are google.type.Date and `google.protobuf.Timestamp`.
+                                "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                    # to allow the value "24:00:00" for scenarios like business closing time.
+                                "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                                "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                    # allow the value 60 if it allows leap-seconds.
+                                "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                              },
+                              "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                  # and time zone are either specified elsewhere or are not significant. The date
+                                  # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                  #
+                                  # * A full date, with non-zero year, month and day values
+                                  # * A month and day value, with a zero year, e.g. an anniversary
+                                  # * A year on its own, with zero month and day values
+                                  # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                  #
+                                  # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                                "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                    # a year.
+                                "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                    # if specifying a year by itself or a year and month where the day is not
+                                    # significant.
+                                "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                    # month and day.
+                              },
+                              "stringValue": "A String",
+                              "booleanValue": True or False,
+                              "integerValue": "A String",
+                            },
+                            "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                                # the default behavior will be to hyphenate the min-max range.
+                                # Note that for the purposes of inspection or transformation, the number
+                                # of bytes considered to comprise a 'Value' is based on its representation
+                                # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                                # 123456789, the number of bytes would be counted as 9, even though an
+                                # int64 only holds up to 8 bytes of data.
+                              "floatValue": 3.14,
+                              "timestampValue": "A String",
+                              "dayOfWeekValue": "A String",
+                              "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                  # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                  # types are google.type.Date and `google.protobuf.Timestamp`.
+                                "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                    # to allow the value "24:00:00" for scenarios like business closing time.
+                                "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                                "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                    # allow the value 60 if it allows leap-seconds.
+                                "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                              },
+                              "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                  # and time zone are either specified elsewhere or are not significant. The date
+                                  # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                  #
+                                  # * A full date, with non-zero year, month and day values
+                                  # * A month and day value, with a zero year, e.g. an anniversary
+                                  # * A year on its own, with zero month and day values
+                                  # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                  #
+                                  # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                                "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                    # a year.
+                                "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                    # if specifying a year by itself or a year and month where the day is not
+                                    # significant.
+                                "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                    # month and day.
+                              },
+                              "stringValue": "A String",
+                              "booleanValue": True or False,
+                              "integerValue": "A String",
+                            },
+                            "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                                # used.
+                                # Note that for the purposes of inspection or transformation, the number
+                                # of bytes considered to comprise a 'Value' is based on its representation
+                                # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                                # 123456789, the number of bytes would be counted as 9, even though an
+                                # int64 only holds up to 8 bytes of data.
+                              "floatValue": 3.14,
+                              "timestampValue": "A String",
+                              "dayOfWeekValue": "A String",
+                              "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                  # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                  # types are google.type.Date and `google.protobuf.Timestamp`.
+                                "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                    # to allow the value "24:00:00" for scenarios like business closing time.
+                                "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                                "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                    # allow the value 60 if it allows leap-seconds.
+                                "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                              },
+                              "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                  # and time zone are either specified elsewhere or are not significant. The date
+                                  # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                  #
+                                  # * A full date, with non-zero year, month and day values
+                                  # * A month and day value, with a zero year, e.g. an anniversary
+                                  # * A year on its own, with zero month and day values
+                                  # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                  #
+                                  # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                                "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                    # a year.
+                                "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                    # if specifying a year by itself or a year and month where the day is not
+                                    # significant.
+                                "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                    # month and day.
+                              },
+                              "stringValue": "A String",
+                              "booleanValue": True or False,
+                              "integerValue": "A String",
+                            },
+                          },
+                        ],
+                      },
+                      "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                          # (FPE) with the FFX mode of operation; however when used in the
+                          # `ReidentifyContent` API method, it serves the opposite function by reversing
+                          # the surrogate back into the original identifier. The identifier must be
+                          # encoded as ASCII. For a given crypto key and context, the same identifier
+                          # will be replaced with the same surrogate. Identifiers must be at least two
+                          # characters long. In the case that the identifier is the empty string, it will
+                          # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                          # more.
+                          #
+                          # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                          # do not require preserving the input alphabet space and size, plus warrant
+                          # referential integrity.
+                        "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                            # a key encryption key (KEK) stored by KMS).
+                            # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                            # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                            # unwrap the data crypto key.
+                          "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                              # The wrapped key must be a 128/192/256 bit key.
+                              # Authorization requires the following IAM permissions when sending a request
+                              # to perform a crypto transformation using a kms-wrapped crypto key:
+                              # dlp.kms.encrypt
+                            "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                            "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                          },
+                          "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                              # leaking the key. Choose another type of key if possible.
+                            "key": "A String", # A 128/192/256 bit key. [required]
+                          },
+                          "transient": { # Use this to have a random data crypto key generated.
+                              # It will be discarded after the request finishes.
+                            "name": "A String", # Name of the key. [required]
+                                # This is an arbitrary string used to differentiate different keys.
+                                # A unique key is generated per name: two separate `TransientCryptoKey`
+                                # protos share the same generated key if their names are the same.
+                                # When the data crypto key is generated, this name is not used in any way
+                                # (repeating the api call will result in a different key being generated).
+                          },
+                        },
+                        "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+                        "commonAlphabet": "A String",
+                        "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                            # that the FFX mode natively supports. This happens before/after
+                            # encryption/decryption.
+                            # Each character listed must appear only once.
+                            # Number of characters must be in the range [2, 62].
+                            # This must be encoded as ASCII.
+                            # The order of characters does not matter.
+                        "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                            # identifier in two different contexts won't be given the same surrogate. If
+                            # the context is not set, a default tweak will be used.
+                            #
+                            # If the context is set but:
+                            #
+                            # 1. there is no record present when transforming a given value or
+                            # 1. the field is not present when transforming a given value,
+                            #
+                            # a default tweak will be used.
+                            #
+                            # Note that case (1) is expected when an `InfoTypeTransformation` is
+                            # applied to both structured and non-structured `ContentItem`s.
+                            # Currently, the referenced field may be of value type integer or string.
+                            #
+                            # The tweak is constructed as a sequence of bytes in big endian byte order
+                            # such that:
+                            #
+                            # - a 64 bit integer is encoded followed by a single byte of value 1
+                            # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                          "name": "A String", # Name describing the field.
+                        },
+                        "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                            # This annotation will be applied to the surrogate by prefixing it with
+                            # the name of the custom infoType followed by the number of
+                            # characters comprising the surrogate. The following scheme defines the
+                            # format: info_type_name(surrogate_character_count):surrogate
+                            #
+                            # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                            # the surrogate is 'abc', the full replacement value
+                            # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                            #
+                            # This annotation identifies the surrogate when inspecting content using the
+                            # custom infoType
+                            # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                            # This facilitates reversal of the surrogate when it occurs in free text.
+                            #
+                            # In order for inspection to work properly, the name of this infoType must
+                            # not occur naturally anywhere in your data; otherwise, inspection may
+                            # find a surrogate that does not correspond to an actual identifier.
+                            # Therefore, choose your custom infoType name carefully after considering
+                            # what your data looks like. One way to select a name that has a high chance
+                            # of yielding reliable detection is to include one or more unicode characters
+                            # that are highly improbable to exist in your data.
+                            # For example, assuming your data is entered from a regular ASCII keyboard,
+                            # the symbol with the hex code point 29DD might be used like so:
+                            # ⧝MY_TOKEN_TYPE
+                          "name": "A String", # Name of the information type. Either a name of your choosing when
+                              # creating a CustomInfoType, or one of the names listed
+                              # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                              # a built-in type. InfoType names should conform to the pattern
+                              # [a-zA-Z0-9_]{1,64}.
+                        },
+                      },
+                      "replaceConfig": { # Replace each input value with a given `Value`.
+                        "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                            # Note that for the purposes of inspection or transformation, the number
+                            # of bytes considered to comprise a 'Value' is based on its representation
+                            # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                            # 123456789, the number of bytes would be counted as 9, even though an
+                            # int64 only holds up to 8 bytes of data.
+                          "floatValue": 3.14,
+                          "timestampValue": "A String",
+                          "dayOfWeekValue": "A String",
+                          "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                              # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                              # types are google.type.Date and `google.protobuf.Timestamp`.
+                            "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                # to allow the value "24:00:00" for scenarios like business closing time.
+                            "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                            "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                # allow the value 60 if it allows leap-seconds.
+                            "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                          },
+                          "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                              # and time zone are either specified elsewhere or are not significant. The date
+                              # is relative to the Proleptic Gregorian Calendar. This can represent:
+                              #
+                              # * A full date, with non-zero year, month and day values
+                              # * A month and day value, with a zero year, e.g. an anniversary
+                              # * A year on its own, with zero month and day values
+                              # * A year and month value, with a zero day, e.g. a credit card expiration date
+                              #
+                              # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                            "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                # a year.
+                            "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                # if specifying a year by itself or a year and month where the day is not
+                                # significant.
+                            "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                # month and day.
+                          },
+                          "stringValue": "A String",
+                          "booleanValue": True or False,
+                          "integerValue": "A String",
+                        },
+                      },
+                    },
+                    "infoTypes": [ # InfoTypes to apply the transformation to. An empty list will cause
+                        # this transformation to apply to all findings that correspond to
+                        # infoTypes that were requested in `InspectConfig`.
+                      { # Type of information detected by the API.
+                        "name": "A String", # Name of the information type. Either a name of your choosing when
+                            # creating a CustomInfoType, or one of the names listed
+                            # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                            # a built-in type. InfoType names should conform to the pattern
+                            # [a-zA-Z0-9_]{1,64}.
+                      },
+                    ],
+                  },
+                ],
+              },
+              "primitiveTransformation": { # A rule for transforming a value. # Apply the transformation to the entire field.
+                "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                    # fixed character. Masking can start from the beginning or end of the string.
+                    # This can be used on data of any type (numbers, longs, and so on) and when
+                    # de-identifying structured data we'll attempt to preserve the original data's
+                    # type. (This allows you to take a long like 123 and modify it to a string like
+                    # **3.
+                  "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                      # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                      # mask 5 chars with * we would produce ***-*55-5555.
+                    { # Characters to skip when doing deidentification of a value. These will be left
+                        # alone and skipped.
+                      "commonCharactersToIgnore": "A String",
+                      "charactersToSkip": "A String",
+                    },
+                  ],
+                  "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                      # masked. Skipped characters do not count towards this tally.
+                  "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                      # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                      # code or credit card number. String must have length 1. If not supplied, we
+                      # will default to "*" for strings, 0 for digits.
+                  "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                      # '0', number_to_mask is 14, and `reverse_order` is false, then
+                      # 1234-5678-9012-3456 -> 00000000000000-3456
+                      # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                      # is true, then 12345 -> 12***
+                },
+                "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                    # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                    # output would be 'My phone number is '.
+                },
+                "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                    # input. Outputs a base64 encoded representation of the encrypted output.
+                    # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+                  "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                      # a key encryption key (KEK) stored by KMS).
+                      # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                      # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                      # unwrap the data crypto key.
+                    "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                        # The wrapped key must be a 128/192/256 bit key.
+                        # Authorization requires the following IAM permissions when sending a request
+                        # to perform a crypto transformation using a kms-wrapped crypto key:
+                        # dlp.kms.encrypt
+                      "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                      "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                    },
+                    "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                        # leaking the key. Choose another type of key if possible.
+                      "key": "A String", # A 128/192/256 bit key. [required]
+                    },
+                    "transient": { # Use this to have a random data crypto key generated.
+                        # It will be discarded after the request finishes.
+                      "name": "A String", # Name of the key. [required]
+                          # This is an arbitrary string used to differentiate different keys.
+                          # A unique key is generated per name: two separate `TransientCryptoKey`
+                          # protos share the same generated key if their names are the same.
+                          # When the data crypto key is generated, this name is not used in any way
+                          # (repeating the api call will result in a different key being generated).
+                    },
+                  },
+                  "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                      # referential integrity such that the same identifier in two different
+                      # contexts will be given a distinct surrogate. The context is appended to
+                      # plaintext value being encrypted. On decryption the provided context is
+                      # validated against the value used during encryption. If a context was
+                      # provided during encryption, same context must be provided during decryption
+                      # as well.
+                      #
+                      # If the context is not set, plaintext would be used as is for encryption.
+                      # If the context is set but:
+                      #
+                      # 1. there is no record present when transforming a given value or
+                      # 2. the field is not present when transforming a given value,
+                      #
+                      # plaintext would be used as is for encryption.
+                      #
+                      # Note that case (1) is expected when an `InfoTypeTransformation` is
+                      # applied to both structured and non-structured `ContentItem`s.
+                    "name": "A String", # Name describing the field.
+                  },
+                  "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                      # This annotation will be applied to the surrogate by prefixing it with
+                      # the name of the custom info type followed by the number of
+                      # characters comprising the surrogate. The following scheme defines the
+                      # format: <info type name>(<surrogate character count>):<surrogate>
+                      #
+                      # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                      # the surrogate is 'abc', the full replacement value
+                      # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                      #
+                      # This annotation identifies the surrogate when inspecting content using the
+                      # custom info type 'Surrogate'. This facilitates reversal of the
+                      # surrogate when it occurs in free text.
+                      #
+                      # In order for inspection to work properly, the name of this info type must
+                      # not occur naturally anywhere in your data; otherwise, inspection may either
+                      #
+                      # - reverse a surrogate that does not correspond to an actual identifier
+                      # - be unable to parse the surrogate and result in an error
+                      #
+                      # Therefore, choose your custom info type name carefully after considering
+                      # what your data looks like. One way to select a name that has a high chance
+                      # of yielding reliable detection is to include one or more unicode characters
+                      # that are highly improbable to exist in your data.
+                      # For example, assuming your data is entered from a regular ASCII keyboard,
+                      # the symbol with the hex code point 29DD might be used like so:
+                      # ⧝MY_TOKEN_TYPE
+                    "name": "A String", # Name of the information type. Either a name of your choosing when
+                        # creating a CustomInfoType, or one of the names listed
+                        # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                        # a built-in type. InfoType names should conform to the pattern
+                        # [a-zA-Z0-9_]{1,64}.
+                  },
+                },
+                "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                    # Bucketing transformation can provide all of this functionality,
+                    # but requires more configuration. This message is provided as a convenience to
+                    # the user for simple bucketing strategies.
+                    #
+                    # The transformed value will be a hyphenated string of
+                    # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                    # all values that are within this bucket will be replaced with "10-20".
+                    #
+                    # This can be used on data of type: double, long.
+                    #
+                    # If the bound Value type differs from the type of data
+                    # being transformed, we will first attempt converting the type of the data to
+                    # be transformed to match the type of the bound before comparing.
+                    #
+                    # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                  "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                      # grouped together into a single bucket; for example if `lower_bound` = 10,
+                      # then all values less than 10 are replaced with the value “-10”. [Required].
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                  "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                      # grouped together into a single bucket; for example if `upper_bound` = 89,
+                      # then all values greater than 89 are replaced with the value “89+”.
+                      # [Required].
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                  "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                      # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                      # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                      # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+                },
+                "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+                },
+                "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                    # portion of the value.
+                  "partToExtract": "A String",
+                },
+                "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                    # Uses SHA-256.
+                    # The key size must be either 32 or 64 bytes.
+                    # Outputs a base64 encoded representation of the hashed output
+                    # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                    # Currently, only string and integer values can be hashed.
+                    # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+                  "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                      # a key encryption key (KEK) stored by KMS).
+                      # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                      # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                      # unwrap the data crypto key.
+                    "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                        # The wrapped key must be a 128/192/256 bit key.
+                        # Authorization requires the following IAM permissions when sending a request
+                        # to perform a crypto transformation using a kms-wrapped crypto key:
+                        # dlp.kms.encrypt
+                      "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                      "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                    },
+                    "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                        # leaking the key. Choose another type of key if possible.
+                      "key": "A String", # A 128/192/256 bit key. [required]
+                    },
+                    "transient": { # Use this to have a random data crypto key generated.
+                        # It will be discarded after the request finishes.
+                      "name": "A String", # Name of the key. [required]
+                          # This is an arbitrary string used to differentiate different keys.
+                          # A unique key is generated per name: two separate `TransientCryptoKey`
+                          # protos share the same generated key if their names are the same.
+                          # When the data crypto key is generated, this name is not used in any way
+                          # (repeating the api call will result in a different key being generated).
+                    },
+                  },
+                },
+                "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                    # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                    # to learn more.
+                  "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                      # results in the same shift for the same context and crypto_key.
+                      # a key encryption key (KEK) stored by KMS).
+                      # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                      # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                      # unwrap the data crypto key.
+                    "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                        # The wrapped key must be a 128/192/256 bit key.
+                        # Authorization requires the following IAM permissions when sending a request
+                        # to perform a crypto transformation using a kms-wrapped crypto key:
+                        # dlp.kms.encrypt
+                      "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                      "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                    },
+                    "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                        # leaking the key. Choose another type of key if possible.
+                      "key": "A String", # A 128/192/256 bit key. [required]
+                    },
+                    "transient": { # Use this to have a random data crypto key generated.
+                        # It will be discarded after the request finishes.
+                      "name": "A String", # Name of the key. [required]
+                          # This is an arbitrary string used to differentiate different keys.
+                          # A unique key is generated per name: two separate `TransientCryptoKey`
+                          # protos share the same generated key if their names are the same.
+                          # When the data crypto key is generated, this name is not used in any way
+                          # (repeating the api call will result in a different key being generated).
+                    },
+                  },
+                  "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                      # [Required]
+                  "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                      # range (inclusive ends). Negative means shift to earlier in time. Must not
+                      # be more than 365250 days (1000 years) each direction.
+                      #
+                      # For example, 3 means shift date to at most 3 days into the future.
+                      # [Required]
+                  "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                      # If set, must also set method. If set, shift will be consistent for the
+                      # given context.
+                    "name": "A String", # Name describing the field.
+                  },
+                },
+                "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                    # replacement values are dynamically provided by the user for custom behavior,
+                    # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                    # This can be used on
+                    # data of type: number, long, string, timestamp.
+                    # If the bound `Value` type differs from the type of data being transformed, we
+                    # will first attempt converting the type of the data to be transformed to match
+                    # the type of the bound before comparing.
+                    # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                  "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                    { # Bucket is represented as a range, along with replacement values.
+                      "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                      "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                          # the default behavior will be to hyphenate the min-max range.
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                      "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                          # used.
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                    },
+                  ],
+                },
+                "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                    # (FPE) with the FFX mode of operation; however when used in the
+                    # `ReidentifyContent` API method, it serves the opposite function by reversing
+                    # the surrogate back into the original identifier. The identifier must be
+                    # encoded as ASCII. For a given crypto key and context, the same identifier
+                    # will be replaced with the same surrogate. Identifiers must be at least two
+                    # characters long. In the case that the identifier is the empty string, it will
+                    # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                    # more.
+                    #
+                    # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                    # do not require preserving the input alphabet space and size, plus warrant
+                    # referential integrity.
+                  "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                      # a key encryption key (KEK) stored by KMS).
+                      # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                      # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                      # unwrap the data crypto key.
+                    "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                        # The wrapped key must be a 128/192/256 bit key.
+                        # Authorization requires the following IAM permissions when sending a request
+                        # to perform a crypto transformation using a kms-wrapped crypto key:
+                        # dlp.kms.encrypt
+                      "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                      "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                    },
+                    "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                        # leaking the key. Choose another type of key if possible.
+                      "key": "A String", # A 128/192/256 bit key. [required]
+                    },
+                    "transient": { # Use this to have a random data crypto key generated.
+                        # It will be discarded after the request finishes.
+                      "name": "A String", # Name of the key. [required]
+                          # This is an arbitrary string used to differentiate different keys.
+                          # A unique key is generated per name: two separate `TransientCryptoKey`
+                          # protos share the same generated key if their names are the same.
+                          # When the data crypto key is generated, this name is not used in any way
+                          # (repeating the api call will result in a different key being generated).
+                    },
+                  },
+                  "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+                  "commonAlphabet": "A String",
+                  "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                      # that the FFX mode natively supports. This happens before/after
+                      # encryption/decryption.
+                      # Each character listed must appear only once.
+                      # Number of characters must be in the range [2, 62].
+                      # This must be encoded as ASCII.
+                      # The order of characters does not matter.
+                  "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                      # identifier in two different contexts won't be given the same surrogate. If
+                      # the context is not set, a default tweak will be used.
+                      #
+                      # If the context is set but:
+                      #
+                      # 1. there is no record present when transforming a given value or
+                      # 1. the field is not present when transforming a given value,
+                      #
+                      # a default tweak will be used.
+                      #
+                      # Note that case (1) is expected when an `InfoTypeTransformation` is
+                      # applied to both structured and non-structured `ContentItem`s.
+                      # Currently, the referenced field may be of value type integer or string.
+                      #
+                      # The tweak is constructed as a sequence of bytes in big endian byte order
+                      # such that:
+                      #
+                      # - a 64 bit integer is encoded followed by a single byte of value 1
+                      # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                    "name": "A String", # Name describing the field.
+                  },
+                  "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                      # This annotation will be applied to the surrogate by prefixing it with
+                      # the name of the custom infoType followed by the number of
+                      # characters comprising the surrogate. The following scheme defines the
+                      # format: info_type_name(surrogate_character_count):surrogate
+                      #
+                      # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                      # the surrogate is 'abc', the full replacement value
+                      # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                      #
+                      # This annotation identifies the surrogate when inspecting content using the
+                      # custom infoType
+                      # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                      # This facilitates reversal of the surrogate when it occurs in free text.
+                      #
+                      # In order for inspection to work properly, the name of this infoType must
+                      # not occur naturally anywhere in your data; otherwise, inspection may
+                      # find a surrogate that does not correspond to an actual identifier.
+                      # Therefore, choose your custom infoType name carefully after considering
+                      # what your data looks like. One way to select a name that has a high chance
+                      # of yielding reliable detection is to include one or more unicode characters
+                      # that are highly improbable to exist in your data.
+                      # For example, assuming your data is entered from a regular ASCII keyboard,
+                      # the symbol with the hex code point 29DD might be used like so:
+                      # ⧝MY_TOKEN_TYPE
+                    "name": "A String", # Name of the information type. Either a name of your choosing when
+                        # creating a CustomInfoType, or one of the names listed
+                        # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                        # a built-in type. InfoType names should conform to the pattern
+                        # [a-zA-Z0-9_]{1,64}.
+                  },
+                },
+                "replaceConfig": { # Replace each input value with a given `Value`.
+                  "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                },
+              },
+              "condition": { # A condition for determining whether a transformation should be applied to # Only apply the transformation if the condition evaluates to true for the
+                  # given `RecordCondition`. The conditions are allowed to reference fields
+                  # that are not used in the actual transformation. [optional]
+                  #
+                  # Example Use Cases:
+                  #
+                  # - Apply a different bucket transformation to an age column if the zip code
+                  # column for the same record is within a specific range.
+                  # - Redact a field if the date of birth field is greater than 85.
+                  # a field.
+                "expressions": { # An expression, consisting or an operator and conditions. # An expression.
+                  "conditions": { # A collection of conditions.
+                    "conditions": [
+                      { # The field type of `value` and `field` do not need to match to be
+                          # considered equal, but not all comparisons are possible.
+                          # EQUAL_TO and NOT_EQUAL_TO attempt to compare even with incompatible types,
+                          # but all other comparisons are invalid with incompatible types.
+                          # A `value` of type:
+                          #
+                          # - `string` can be compared against all other types
+                          # - `boolean` can only be compared against other booleans
+                          # - `integer` can be compared against doubles or a string if the string value
+                          # can be parsed as an integer.
+                          # - `double` can be compared against integers or a string if the string can
+                          # be parsed as a double.
+                          # - `Timestamp` can be compared against strings in RFC 3339 date string
+                          # format.
+                          # - `TimeOfDay` can be compared against timestamps and strings in the format
+                          # of 'HH:mm:ss'.
+                          #
+                          # If we fail to compare do to type mismatch, a warning will be given and
+                          # the condition will evaluate to false.
+                        "operator": "A String", # Operator used to compare the field or infoType to the value. [required]
+                        "field": { # General identifier of a data field in a storage service. # Field within the record this condition is evaluated against. [required]
+                          "name": "A String", # Name describing the field.
+                        },
+                        "value": { # Set of primitive values supported by the system. # Value to compare against. [Required, except for `EXISTS` tests.]
+                            # Note that for the purposes of inspection or transformation, the number
+                            # of bytes considered to comprise a 'Value' is based on its representation
+                            # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                            # 123456789, the number of bytes would be counted as 9, even though an
+                            # int64 only holds up to 8 bytes of data.
+                          "floatValue": 3.14,
+                          "timestampValue": "A String",
+                          "dayOfWeekValue": "A String",
+                          "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                              # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                              # types are google.type.Date and `google.protobuf.Timestamp`.
+                            "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                # to allow the value "24:00:00" for scenarios like business closing time.
+                            "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                            "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                # allow the value 60 if it allows leap-seconds.
+                            "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                          },
+                          "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                              # and time zone are either specified elsewhere or are not significant. The date
+                              # is relative to the Proleptic Gregorian Calendar. This can represent:
+                              #
+                              # * A full date, with non-zero year, month and day values
+                              # * A month and day value, with a zero year, e.g. an anniversary
+                              # * A year on its own, with zero month and day values
+                              # * A year and month value, with a zero day, e.g. a credit card expiration date
+                              #
+                              # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                            "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                # a year.
+                            "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                # if specifying a year by itself or a year and month where the day is not
+                                # significant.
+                            "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                # month and day.
+                          },
+                          "stringValue": "A String",
+                          "booleanValue": True or False,
+                          "integerValue": "A String",
+                        },
+                      },
+                    ],
+                  },
+                  "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently
+                      # only supported value is `AND`.
+                },
+              },
+              "fields": [ # Input field(s) to apply the transformation to. [required]
+                { # General identifier of a data field in a storage service.
+                  "name": "A String", # Name describing the field.
+                },
+              ],
+            },
+          ],
+          "transformedBytes": "A String", # Total size in bytes that were transformed in some way.
+          "transformation": { # A rule for transforming a value. # The specific transformation these stats apply to.
+            "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                # fixed character. Masking can start from the beginning or end of the string.
+                # This can be used on data of any type (numbers, longs, and so on) and when
+                # de-identifying structured data we'll attempt to preserve the original data's
+                # type. (This allows you to take a long like 123 and modify it to a string like
+                # **3.
+              "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                  # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                  # mask 5 chars with * we would produce ***-*55-5555.
+                { # Characters to skip when doing deidentification of a value. These will be left
+                    # alone and skipped.
+                  "commonCharactersToIgnore": "A String",
+                  "charactersToSkip": "A String",
+                },
+              ],
+              "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                  # masked. Skipped characters do not count towards this tally.
+              "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                  # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                  # code or credit card number. String must have length 1. If not supplied, we
+                  # will default to "*" for strings, 0 for digits.
+              "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                  # '0', number_to_mask is 14, and `reverse_order` is false, then
+                  # 1234-5678-9012-3456 -> 00000000000000-3456
+                  # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                  # is true, then 12345 -> 12***
+            },
+            "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                # output would be 'My phone number is '.
+            },
+            "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                # input. Outputs a base64 encoded representation of the encrypted output.
+                # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+              "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                  # a key encryption key (KEK) stored by KMS).
+                  # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                  # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                  # unwrap the data crypto key.
+                "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                    # The wrapped key must be a 128/192/256 bit key.
+                    # Authorization requires the following IAM permissions when sending a request
+                    # to perform a crypto transformation using a kms-wrapped crypto key:
+                    # dlp.kms.encrypt
+                  "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                  "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                },
+                "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                    # leaking the key. Choose another type of key if possible.
+                  "key": "A String", # A 128/192/256 bit key. [required]
+                },
+                "transient": { # Use this to have a random data crypto key generated.
+                    # It will be discarded after the request finishes.
+                  "name": "A String", # Name of the key. [required]
+                      # This is an arbitrary string used to differentiate different keys.
+                      # A unique key is generated per name: two separate `TransientCryptoKey`
+                      # protos share the same generated key if their names are the same.
+                      # When the data crypto key is generated, this name is not used in any way
+                      # (repeating the api call will result in a different key being generated).
+                },
+              },
+              "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                  # referential integrity such that the same identifier in two different
+                  # contexts will be given a distinct surrogate. The context is appended to
+                  # plaintext value being encrypted. On decryption the provided context is
+                  # validated against the value used during encryption. If a context was
+                  # provided during encryption, same context must be provided during decryption
+                  # as well.
+                  #
+                  # If the context is not set, plaintext would be used as is for encryption.
+                  # If the context is set but:
+                  #
+                  # 1. there is no record present when transforming a given value or
+                  # 2. the field is not present when transforming a given value,
+                  #
+                  # plaintext would be used as is for encryption.
+                  #
+                  # Note that case (1) is expected when an `InfoTypeTransformation` is
+                  # applied to both structured and non-structured `ContentItem`s.
+                "name": "A String", # Name describing the field.
+              },
+              "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                  # This annotation will be applied to the surrogate by prefixing it with
+                  # the name of the custom info type followed by the number of
+                  # characters comprising the surrogate. The following scheme defines the
+                  # format: <info type name>(<surrogate character count>):<surrogate>
+                  #
+                  # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                  # the surrogate is 'abc', the full replacement value
+                  # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                  #
+                  # This annotation identifies the surrogate when inspecting content using the
+                  # custom info type 'Surrogate'. This facilitates reversal of the
+                  # surrogate when it occurs in free text.
+                  #
+                  # In order for inspection to work properly, the name of this info type must
+                  # not occur naturally anywhere in your data; otherwise, inspection may either
+                  #
+                  # - reverse a surrogate that does not correspond to an actual identifier
+                  # - be unable to parse the surrogate and result in an error
+                  #
+                  # Therefore, choose your custom info type name carefully after considering
+                  # what your data looks like. One way to select a name that has a high chance
+                  # of yielding reliable detection is to include one or more unicode characters
+                  # that are highly improbable to exist in your data.
+                  # For example, assuming your data is entered from a regular ASCII keyboard,
+                  # the symbol with the hex code point 29DD might be used like so:
+                  # ⧝MY_TOKEN_TYPE
+                "name": "A String", # Name of the information type. Either a name of your choosing when
+                    # creating a CustomInfoType, or one of the names listed
+                    # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                    # a built-in type. InfoType names should conform to the pattern
+                    # [a-zA-Z0-9_]{1,64}.
+              },
+            },
+            "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                # Bucketing transformation can provide all of this functionality,
+                # but requires more configuration. This message is provided as a convenience to
+                # the user for simple bucketing strategies.
+                #
+                # The transformed value will be a hyphenated string of
+                # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                # all values that are within this bucket will be replaced with "10-20".
+                #
+                # This can be used on data of type: double, long.
+                #
+                # If the bound Value type differs from the type of data
+                # being transformed, we will first attempt converting the type of the data to
+                # be transformed to match the type of the bound before comparing.
+                #
+                # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+              "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                  # grouped together into a single bucket; for example if `lower_bound` = 10,
+                  # then all values less than 10 are replaced with the value “-10”. [Required].
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+              "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                  # grouped together into a single bucket; for example if `upper_bound` = 89,
+                  # then all values greater than 89 are replaced with the value “89+”.
+                  # [Required].
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+              "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                  # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                  # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                  # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+            },
+            "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+            },
+            "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                # portion of the value.
+              "partToExtract": "A String",
+            },
+            "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                # Uses SHA-256.
+                # The key size must be either 32 or 64 bytes.
+                # Outputs a base64 encoded representation of the hashed output
+                # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                # Currently, only string and integer values can be hashed.
+                # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+              "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                  # a key encryption key (KEK) stored by KMS).
+                  # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                  # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                  # unwrap the data crypto key.
+                "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                    # The wrapped key must be a 128/192/256 bit key.
+                    # Authorization requires the following IAM permissions when sending a request
+                    # to perform a crypto transformation using a kms-wrapped crypto key:
+                    # dlp.kms.encrypt
+                  "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                  "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                },
+                "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                    # leaking the key. Choose another type of key if possible.
+                  "key": "A String", # A 128/192/256 bit key. [required]
+                },
+                "transient": { # Use this to have a random data crypto key generated.
+                    # It will be discarded after the request finishes.
+                  "name": "A String", # Name of the key. [required]
+                      # This is an arbitrary string used to differentiate different keys.
+                      # A unique key is generated per name: two separate `TransientCryptoKey`
+                      # protos share the same generated key if their names are the same.
+                      # When the data crypto key is generated, this name is not used in any way
+                      # (repeating the api call will result in a different key being generated).
+                },
+              },
+            },
+            "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                # to learn more.
+              "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                  # results in the same shift for the same context and crypto_key.
+                  # a key encryption key (KEK) stored by KMS).
+                  # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                  # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                  # unwrap the data crypto key.
+                "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                    # The wrapped key must be a 128/192/256 bit key.
+                    # Authorization requires the following IAM permissions when sending a request
+                    # to perform a crypto transformation using a kms-wrapped crypto key:
+                    # dlp.kms.encrypt
+                  "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                  "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                },
+                "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                    # leaking the key. Choose another type of key if possible.
+                  "key": "A String", # A 128/192/256 bit key. [required]
+                },
+                "transient": { # Use this to have a random data crypto key generated.
+                    # It will be discarded after the request finishes.
+                  "name": "A String", # Name of the key. [required]
+                      # This is an arbitrary string used to differentiate different keys.
+                      # A unique key is generated per name: two separate `TransientCryptoKey`
+                      # protos share the same generated key if their names are the same.
+                      # When the data crypto key is generated, this name is not used in any way
+                      # (repeating the api call will result in a different key being generated).
+                },
+              },
+              "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                  # [Required]
+              "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                  # range (inclusive ends). Negative means shift to earlier in time. Must not
+                  # be more than 365250 days (1000 years) each direction.
+                  #
+                  # For example, 3 means shift date to at most 3 days into the future.
+                  # [Required]
+              "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                  # If set, must also set method. If set, shift will be consistent for the
+                  # given context.
+                "name": "A String", # Name describing the field.
+              },
+            },
+            "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                # replacement values are dynamically provided by the user for custom behavior,
+                # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                # This can be used on
+                # data of type: number, long, string, timestamp.
+                # If the bound `Value` type differs from the type of data being transformed, we
+                # will first attempt converting the type of the data to be transformed to match
+                # the type of the bound before comparing.
+                # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+              "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                { # Bucket is represented as a range, along with replacement values.
+                  "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                  "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                      # the default behavior will be to hyphenate the min-max range.
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                  "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                      # used.
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                },
+              ],
+            },
+            "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                # (FPE) with the FFX mode of operation; however when used in the
+                # `ReidentifyContent` API method, it serves the opposite function by reversing
+                # the surrogate back into the original identifier. The identifier must be
+                # encoded as ASCII. For a given crypto key and context, the same identifier
+                # will be replaced with the same surrogate. Identifiers must be at least two
+                # characters long. In the case that the identifier is the empty string, it will
+                # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                # more.
+                #
+                # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                # do not require preserving the input alphabet space and size, plus warrant
+                # referential integrity.
+              "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                  # a key encryption key (KEK) stored by KMS).
+                  # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                  # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                  # unwrap the data crypto key.
+                "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                    # The wrapped key must be a 128/192/256 bit key.
+                    # Authorization requires the following IAM permissions when sending a request
+                    # to perform a crypto transformation using a kms-wrapped crypto key:
+                    # dlp.kms.encrypt
+                  "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                  "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                },
+                "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                    # leaking the key. Choose another type of key if possible.
+                  "key": "A String", # A 128/192/256 bit key. [required]
+                },
+                "transient": { # Use this to have a random data crypto key generated.
+                    # It will be discarded after the request finishes.
+                  "name": "A String", # Name of the key. [required]
+                      # This is an arbitrary string used to differentiate different keys.
+                      # A unique key is generated per name: two separate `TransientCryptoKey`
+                      # protos share the same generated key if their names are the same.
+                      # When the data crypto key is generated, this name is not used in any way
+                      # (repeating the api call will result in a different key being generated).
+                },
+              },
+              "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+              "commonAlphabet": "A String",
+              "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                  # that the FFX mode natively supports. This happens before/after
+                  # encryption/decryption.
+                  # Each character listed must appear only once.
+                  # Number of characters must be in the range [2, 62].
+                  # This must be encoded as ASCII.
+                  # The order of characters does not matter.
+              "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                  # identifier in two different contexts won't be given the same surrogate. If
+                  # the context is not set, a default tweak will be used.
+                  #
+                  # If the context is set but:
+                  #
+                  # 1. there is no record present when transforming a given value or
+                  # 1. the field is not present when transforming a given value,
+                  #
+                  # a default tweak will be used.
+                  #
+                  # Note that case (1) is expected when an `InfoTypeTransformation` is
+                  # applied to both structured and non-structured `ContentItem`s.
+                  # Currently, the referenced field may be of value type integer or string.
+                  #
+                  # The tweak is constructed as a sequence of bytes in big endian byte order
+                  # such that:
+                  #
+                  # - a 64 bit integer is encoded followed by a single byte of value 1
+                  # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                "name": "A String", # Name describing the field.
+              },
+              "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                  # This annotation will be applied to the surrogate by prefixing it with
+                  # the name of the custom infoType followed by the number of
+                  # characters comprising the surrogate. The following scheme defines the
+                  # format: info_type_name(surrogate_character_count):surrogate
+                  #
+                  # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                  # the surrogate is 'abc', the full replacement value
+                  # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                  #
+                  # This annotation identifies the surrogate when inspecting content using the
+                  # custom infoType
+                  # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                  # This facilitates reversal of the surrogate when it occurs in free text.
+                  #
+                  # In order for inspection to work properly, the name of this infoType must
+                  # not occur naturally anywhere in your data; otherwise, inspection may
+                  # find a surrogate that does not correspond to an actual identifier.
+                  # Therefore, choose your custom infoType name carefully after considering
+                  # what your data looks like. One way to select a name that has a high chance
+                  # of yielding reliable detection is to include one or more unicode characters
+                  # that are highly improbable to exist in your data.
+                  # For example, assuming your data is entered from a regular ASCII keyboard,
+                  # the symbol with the hex code point 29DD might be used like so:
+                  # ⧝MY_TOKEN_TYPE
+                "name": "A String", # Name of the information type. Either a name of your choosing when
+                    # creating a CustomInfoType, or one of the names listed
+                    # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                    # a built-in type. InfoType names should conform to the pattern
+                    # [a-zA-Z0-9_]{1,64}.
+              },
+            },
+            "replaceConfig": { # Replace each input value with a given `Value`.
+              "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+            },
+          },
+        },
+      ],
+      "transformedBytes": "A String", # Total size in bytes that were transformed in some way.
+    },
+    "item": { # Container structure for the content to inspect. # The de-identified item.
+      "table": { # Structured content to inspect. Up to 50,000 `Value`s per request allowed. # Structured content for inspection. See
+          # https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
+          # learn more.
+          # See https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
+          # learn more.
+        "headers": [
+          { # General identifier of a data field in a storage service.
+            "name": "A String", # Name describing the field.
+          },
+        ],
+        "rows": [
+          {
+            "values": [
+              { # Set of primitive values supported by the system.
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+            ],
+          },
+        ],
+      },
+      "byteItem": { # Container for bytes to inspect or redact. # Content data to inspect or redact. Replaces `type` and `data`.
+        "type": "A String", # The type of data stored in the bytes string. Default will be TEXT_UTF8.
+        "data": "A String", # Content data to inspect or redact.
+      },
+      "value": "A String", # String data to inspect or redact.
+    },
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="inspect">inspect(parent, body, x__xgafv=None)</code>
+  <pre>Finds potentially sensitive info in content.
+This method has limits on input size, processing time, and output size.
+
+When no InfoTypes or CustomInfoTypes are specified in this request, the
+system will automatically choose what detectors to run. By default this may
+be all types, but may change over time as detectors are updated.
+
+For how to guides, see https://cloud.google.com/dlp/docs/inspecting-images
+and https://cloud.google.com/dlp/docs/inspecting-text,
+
+Args:
+  parent: string, The parent resource name, for example projects/my-project-id. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # Request to search for potentially sensitive info in a ContentItem.
+    "item": { # Container structure for the content to inspect. # The item to inspect.
+      "table": { # Structured content to inspect. Up to 50,000 `Value`s per request allowed. # Structured content for inspection. See
+          # https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
+          # learn more.
+          # See https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
+          # learn more.
+        "headers": [
+          { # General identifier of a data field in a storage service.
+            "name": "A String", # Name describing the field.
+          },
+        ],
+        "rows": [
+          {
+            "values": [
+              { # Set of primitive values supported by the system.
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+            ],
+          },
+        ],
+      },
+      "byteItem": { # Container for bytes to inspect or redact. # Content data to inspect or redact. Replaces `type` and `data`.
+        "type": "A String", # The type of data stored in the bytes string. Default will be TEXT_UTF8.
+        "data": "A String", # Content data to inspect or redact.
+      },
+      "value": "A String", # String data to inspect or redact.
+    },
+    "inspectConfig": { # Configuration description of the scanning process. # Configuration for the inspector. What specified here will override
+        # the template referenced by the inspect_template_name argument.
+        # When used with redactContent only info_types and min_likelihood are currently
+        # used.
+      "excludeInfoTypes": True or False, # When true, excludes type information of the findings.
+      "limits": {
+        "maxFindingsPerRequest": 42, # Max number of findings that will be returned per request/job.
+            # When set within `InspectContentRequest`, the maximum returned is 2000
+            # regardless if this is set higher.
+        "maxFindingsPerInfoType": [ # Configuration of findings limit given for specified infoTypes.
+          { # Max findings configuration per infoType, per content item or long
+              # running DlpJob.
+            "infoType": { # Type of information detected by the API. # Type of information the findings limit applies to. Only one limit per
+                # info_type should be provided. If InfoTypeLimit does not have an
+                # info_type, the DLP API applies the limit against all info_types that
+                # are found but not specified in another InfoTypeLimit.
+              "name": "A String", # Name of the information type. Either a name of your choosing when
+                  # creating a CustomInfoType, or one of the names listed
+                  # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                  # a built-in type. InfoType names should conform to the pattern
+                  # [a-zA-Z0-9_]{1,64}.
+            },
+            "maxFindings": 42, # Max findings limit for the given infoType.
+          },
+        ],
+        "maxFindingsPerItem": 42, # Max number of findings that will be returned for each item scanned.
+            # When set within `InspectDataSourceRequest`,
+            # the maximum returned is 2000 regardless if this is set higher.
+            # When set within `InspectContentRequest`, this field is ignored.
+      },
+      "minLikelihood": "A String", # Only returns findings equal or above this threshold. The default is
+          # POSSIBLE.
+          # See https://cloud.google.com/dlp/docs/likelihood to learn more.
+      "customInfoTypes": [ # CustomInfoTypes provided by the user. See
+          # https://cloud.google.com/dlp/docs/creating-custom-infotypes to learn more.
+        { # Custom information type provided by the user. Used to find domain-specific
+            # sensitive information configurable to the data in question.
+          "regex": { # Message defining a custom regular expression. # Regular expression based CustomInfoType.
+            "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                # google/re2 repository on GitHub.
+            "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                # specified, the entire match is returned. No more than 3 may be included.
+              42,
+            ],
+          },
+          "surrogateType": { # Message for detecting output from deidentification transformations # Message for detecting output from deidentification transformations that
+              # support reversing.
+              # such as
+              # [`CryptoReplaceFfxFpeConfig`](/dlp/docs/reference/rest/v2/organizations.deidentifyTemplates#cryptoreplaceffxfpeconfig).
+              # These types of transformations are
+              # those that perform pseudonymization, thereby producing a "surrogate" as
+              # output. This should be used in conjunction with a field on the
+              # transformation such as `surrogate_info_type`. This CustomInfoType does
+              # not support the use of `detection_rules`.
+          },
+          "infoType": { # Type of information detected by the API. # CustomInfoType can either be a new infoType, or an extension of built-in
+              # infoType, when the name matches one of existing infoTypes and that infoType
+              # is specified in `InspectContent.info_types` field. Specifying the latter
+              # adds findings to the one detected by the system. If built-in info type is
+              # not specified in `InspectContent.info_types` list then the name is treated
+              # as a custom info type.
+            "name": "A String", # Name of the information type. Either a name of your choosing when
+                # creating a CustomInfoType, or one of the names listed
+                # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                # a built-in type. InfoType names should conform to the pattern
+                # [a-zA-Z0-9_]{1,64}.
+          },
+          "dictionary": { # Custom information type based on a dictionary of words or phrases. This can # A list of phrases to detect as a CustomInfoType.
+              # be used to match sensitive information specific to the data, such as a list
+              # of employee IDs or job titles.
+              #
+              # Dictionary words are case-insensitive and all characters other than letters
+              # and digits in the unicode [Basic Multilingual
+              # Plane](https://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane)
+              # will be replaced with whitespace when scanning for matches, so the
+              # dictionary phrase "Sam Johnson" will match all three phrases "sam johnson",
+              # "Sam, Johnson", and "Sam (Johnson)". Additionally, the characters
+              # surrounding any match must be of a different type than the adjacent
+              # characters within the word, so letters must be next to non-letters and
+              # digits next to non-digits. For example, the dictionary word "jen" will
+              # match the first three letters of the text "jen123" but will return no
+              # matches for "jennifer".
+              #
+              # Dictionary words containing a large number of characters that are not
+              # letters or digits may result in unexpected findings because such characters
+              # are treated as whitespace. The
+              # [limits](https://cloud.google.com/dlp/limits) page contains details about
+              # the size limits of dictionaries. For dictionaries that do not fit within
+              # these constraints, consider using `LargeCustomDictionaryConfig` in the
+              # `StoredInfoType` API.
+            "wordList": { # Message defining a list of words or phrases to search for in the data. # List of words or phrases to search for.
+              "words": [ # Words or phrases defining the dictionary. The dictionary must contain
+                  # at least one phrase and every phrase must contain at least 2 characters
+                  # that are letters or digits. [required]
+                "A String",
+              ],
+            },
+            "cloudStoragePath": { # Message representing a single file or path in Cloud Storage. # Newline-delimited file of words in Cloud Storage. Only a single file
+                # is accepted.
+              "path": "A String", # A url representing a file or path (no wildcards) in Cloud Storage.
+                  # Example: gs://[BUCKET_NAME]/dictionary.txt
+            },
+          },
+          "storedType": { # A reference to a StoredInfoType to use with scanning. # Load an existing `StoredInfoType` resource for use in
+              # `InspectDataSource`. Not currently supported in `InspectContent`.
+            "name": "A String", # Resource name of the requested `StoredInfoType`, for example
+                # `organizations/433245324/storedInfoTypes/432452342` or
+                # `projects/project-id/storedInfoTypes/432452342`.
+            "createTime": "A String", # Timestamp indicating when the version of the `StoredInfoType` used for
+                # inspection was created. Output-only field, populated by the system.
+          },
+          "detectionRules": [ # Set of detection rules to apply to all findings of this CustomInfoType.
+              # Rules are applied in order that they are specified. Not supported for the
+              # `surrogate_type` CustomInfoType.
+            { # Deprecated; use `InspectionRuleSet` instead. Rule for modifying a
+                # `CustomInfoType` to alter behavior under certain circumstances, depending
+                # on the specific details of the rule. Not supported for the `surrogate_type`
+                # custom infoType.
+              "hotwordRule": { # The rule that adjusts the likelihood of findings within a certain # Hotword-based detection rule.
+                  # proximity of hotwords.
+                "proximity": { # Message for specifying a window around a finding to apply a detection # Proximity of the finding within which the entire hotword must reside.
+                    # The total length of the window cannot exceed 1000 characters. Note that
+                    # the finding itself will be included in the window, so that hotwords may
+                    # be used to match substrings of the finding itself. For example, the
+                    # certainty of a phone number regex "\(\d{3}\) \d{3}-\d{4}" could be
+                    # adjusted upwards if the area code is known to be the local area code of
+                    # a company office using the hotword regex "\(xxx\)", where "xxx"
+                    # is the area code in question.
+                    # rule.
+                  "windowAfter": 42, # Number of characters after the finding to consider.
+                  "windowBefore": 42, # Number of characters before the finding to consider.
+                },
+                "hotwordRegex": { # Message defining a custom regular expression. # Regular expression pattern defining what qualifies as a hotword.
+                  "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                      # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                      # google/re2 repository on GitHub.
+                  "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                      # specified, the entire match is returned. No more than 3 may be included.
+                    42,
+                  ],
+                },
+                "likelihoodAdjustment": { # Message for specifying an adjustment to the likelihood of a finding as # Likelihood adjustment to apply to all matching findings.
+                    # part of a detection rule.
+                  "relativeLikelihood": 42, # Increase or decrease the likelihood by the specified number of
+                      # levels. For example, if a finding would be `POSSIBLE` without the
+                      # detection rule and `relative_likelihood` is 1, then it is upgraded to
+                      # `LIKELY`, while a value of -1 would downgrade it to `UNLIKELY`.
+                      # Likelihood may never drop below `VERY_UNLIKELY` or exceed
+                      # `VERY_LIKELY`, so applying an adjustment of 1 followed by an
+                      # adjustment of -1 when base likelihood is `VERY_LIKELY` will result in
+                      # a final likelihood of `LIKELY`.
+                  "fixedLikelihood": "A String", # Set the likelihood of a finding to a fixed value.
+                },
+              },
+            },
+          ],
+          "exclusionType": "A String", # If set to EXCLUSION_TYPE_EXCLUDE this infoType will not cause a finding
+              # to be returned. It still can be used for rules matching.
+          "likelihood": "A String", # Likelihood to return for this CustomInfoType. This base value can be
+              # altered by a detection rule if the finding meets the criteria specified by
+              # the rule. Defaults to `VERY_LIKELY` if not specified.
+        },
+      ],
+      "includeQuote": True or False, # When true, a contextual quote from the data that triggered a finding is
+          # included in the response; see Finding.quote.
+      "ruleSet": [ # Set of rules to apply to the findings for this InspectConfig.
+          # Exclusion rules, contained in the set are executed in the end, other
+          # rules are executed in the order they are specified for each info type.
+        { # Rule set for modifying a set of infoTypes to alter behavior under certain
+            # circumstances, depending on the specific details of the rules within the set.
+          "rules": [ # Set of rules to be applied to infoTypes. The rules are applied in order.
+            { # A single inspection rule to be applied to infoTypes, specified in
+                # `InspectionRuleSet`.
+              "hotwordRule": { # The rule that adjusts the likelihood of findings within a certain # Hotword-based detection rule.
+                  # proximity of hotwords.
+                "proximity": { # Message for specifying a window around a finding to apply a detection # Proximity of the finding within which the entire hotword must reside.
+                    # The total length of the window cannot exceed 1000 characters. Note that
+                    # the finding itself will be included in the window, so that hotwords may
+                    # be used to match substrings of the finding itself. For example, the
+                    # certainty of a phone number regex "\(\d{3}\) \d{3}-\d{4}" could be
+                    # adjusted upwards if the area code is known to be the local area code of
+                    # a company office using the hotword regex "\(xxx\)", where "xxx"
+                    # is the area code in question.
+                    # rule.
+                  "windowAfter": 42, # Number of characters after the finding to consider.
+                  "windowBefore": 42, # Number of characters before the finding to consider.
+                },
+                "hotwordRegex": { # Message defining a custom regular expression. # Regular expression pattern defining what qualifies as a hotword.
+                  "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                      # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                      # google/re2 repository on GitHub.
+                  "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                      # specified, the entire match is returned. No more than 3 may be included.
+                    42,
+                  ],
+                },
+                "likelihoodAdjustment": { # Message for specifying an adjustment to the likelihood of a finding as # Likelihood adjustment to apply to all matching findings.
+                    # part of a detection rule.
+                  "relativeLikelihood": 42, # Increase or decrease the likelihood by the specified number of
+                      # levels. For example, if a finding would be `POSSIBLE` without the
+                      # detection rule and `relative_likelihood` is 1, then it is upgraded to
+                      # `LIKELY`, while a value of -1 would downgrade it to `UNLIKELY`.
+                      # Likelihood may never drop below `VERY_UNLIKELY` or exceed
+                      # `VERY_LIKELY`, so applying an adjustment of 1 followed by an
+                      # adjustment of -1 when base likelihood is `VERY_LIKELY` will result in
+                      # a final likelihood of `LIKELY`.
+                  "fixedLikelihood": "A String", # Set the likelihood of a finding to a fixed value.
+                },
+              },
+              "exclusionRule": { # The rule that specifies conditions when findings of infoTypes specified in # Exclusion rule.
+                  # `InspectionRuleSet` are removed from results.
+                "regex": { # Message defining a custom regular expression. # Regular expression which defines the rule.
+                  "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                      # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                      # google/re2 repository on GitHub.
+                  "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                      # specified, the entire match is returned. No more than 3 may be included.
+                    42,
+                  ],
+                },
+                "excludeInfoTypes": { # List of exclude infoTypes. # Set of infoTypes for which findings would affect this rule.
+                  "infoTypes": [ # InfoType list in ExclusionRule rule drops a finding when it overlaps or
+                      # contained within with a finding of an infoType from this list. For
+                      # example, for `InspectionRuleSet.info_types` containing "PHONE_NUMBER"` and
+                      # `exclusion_rule` containing `exclude_info_types.info_types` with
+                      # "EMAIL_ADDRESS" the phone number findings are dropped if they overlap
+                      # with EMAIL_ADDRESS finding.
+                      # That leads to "555-222-2222@example.org" to generate only a single
+                      # finding, namely email address.
+                    { # Type of information detected by the API.
+                      "name": "A String", # Name of the information type. Either a name of your choosing when
+                          # creating a CustomInfoType, or one of the names listed
+                          # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                          # a built-in type. InfoType names should conform to the pattern
+                          # [a-zA-Z0-9_]{1,64}.
+                    },
+                  ],
+                },
+                "dictionary": { # Custom information type based on a dictionary of words or phrases. This can # Dictionary which defines the rule.
+                    # be used to match sensitive information specific to the data, such as a list
+                    # of employee IDs or job titles.
+                    #
+                    # Dictionary words are case-insensitive and all characters other than letters
+                    # and digits in the unicode [Basic Multilingual
+                    # Plane](https://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane)
+                    # will be replaced with whitespace when scanning for matches, so the
+                    # dictionary phrase "Sam Johnson" will match all three phrases "sam johnson",
+                    # "Sam, Johnson", and "Sam (Johnson)". Additionally, the characters
+                    # surrounding any match must be of a different type than the adjacent
+                    # characters within the word, so letters must be next to non-letters and
+                    # digits next to non-digits. For example, the dictionary word "jen" will
+                    # match the first three letters of the text "jen123" but will return no
+                    # matches for "jennifer".
+                    #
+                    # Dictionary words containing a large number of characters that are not
+                    # letters or digits may result in unexpected findings because such characters
+                    # are treated as whitespace. The
+                    # [limits](https://cloud.google.com/dlp/limits) page contains details about
+                    # the size limits of dictionaries. For dictionaries that do not fit within
+                    # these constraints, consider using `LargeCustomDictionaryConfig` in the
+                    # `StoredInfoType` API.
+                  "wordList": { # Message defining a list of words or phrases to search for in the data. # List of words or phrases to search for.
+                    "words": [ # Words or phrases defining the dictionary. The dictionary must contain
+                        # at least one phrase and every phrase must contain at least 2 characters
+                        # that are letters or digits. [required]
+                      "A String",
+                    ],
+                  },
+                  "cloudStoragePath": { # Message representing a single file or path in Cloud Storage. # Newline-delimited file of words in Cloud Storage. Only a single file
+                      # is accepted.
+                    "path": "A String", # A url representing a file or path (no wildcards) in Cloud Storage.
+                        # Example: gs://[BUCKET_NAME]/dictionary.txt
+                  },
+                },
+                "matchingType": "A String", # How the rule is applied, see MatchingType documentation for details.
+              },
+            },
+          ],
+          "infoTypes": [ # List of infoTypes this rule set is applied to.
+            { # Type of information detected by the API.
+              "name": "A String", # Name of the information type. Either a name of your choosing when
+                  # creating a CustomInfoType, or one of the names listed
+                  # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                  # a built-in type. InfoType names should conform to the pattern
+                  # [a-zA-Z0-9_]{1,64}.
+            },
+          ],
+        },
+      ],
+      "contentOptions": [ # List of options defining data content to scan.
+          # If empty, text, images, and other content will be included.
+        "A String",
+      ],
+      "infoTypes": [ # Restricts what info_types to look for. The values must correspond to
+          # InfoType values returned by ListInfoTypes or listed at
+          # https://cloud.google.com/dlp/docs/infotypes-reference.
+          #
+          # When no InfoTypes or CustomInfoTypes are specified in a request, the
+          # system may automatically choose what detectors to run. By default this may
+          # be all types, but may change over time as detectors are updated.
+          #
+          # The special InfoType name "ALL_BASIC" can be used to trigger all detectors,
+          # but may change over time as new InfoTypes are added. If you need precise
+          # control and predictability as to what detectors are run you should specify
+          # specific InfoTypes listed in the reference.
+        { # Type of information detected by the API.
+          "name": "A String", # Name of the information type. Either a name of your choosing when
+              # creating a CustomInfoType, or one of the names listed
+              # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+              # a built-in type. InfoType names should conform to the pattern
+              # [a-zA-Z0-9_]{1,64}.
+        },
+      ],
+    },
+    "inspectTemplateName": "A String", # Optional template to use. Any configuration directly specified in
+        # inspect_config will override those set in the template. Singular fields
+        # that are set in this request will replace their corresponding fields in the
+        # template. Repeated fields are appended. Singular sub-messages and groups
+        # are recursively merged.
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Results of inspecting an item.
+    "result": { # All the findings for a single scanned item. # The findings.
+      "findingsTruncated": True or False, # If true, then this item might have more findings than were returned,
+          # and the findings returned are an arbitrary subset of all findings.
+          # The findings list might be truncated because the input items were too
+          # large, or because the server reached the maximum amount of resources
+          # allowed for a single API call. For best results, divide the input into
+          # smaller batches.
+      "findings": [ # List of findings for an item.
+        { # Represents a piece of potentially sensitive content.
+          "infoType": { # Type of information detected by the API. # The type of content that might have been found.
+              # Provided if `excluded_types` is false.
+            "name": "A String", # Name of the information type. Either a name of your choosing when
+                # creating a CustomInfoType, or one of the names listed
+                # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                # a built-in type. InfoType names should conform to the pattern
+                # [a-zA-Z0-9_]{1,64}.
+          },
+          "quote": "A String", # The content that was found. Even if the content is not textual, it
+              # may be converted to a textual representation here.
+              # Provided if `include_quote` is true and the finding is
+              # less than or equal to 4096 bytes long. If the finding exceeds 4096 bytes
+              # in length, the quote may be omitted.
+          "quoteInfo": { # Message for infoType-dependent details parsed from quote. # Contains data parsed from quotes. Only populated if include_quote was set
+              # to true and a supported infoType was requested. Currently supported
+              # infoTypes: DATE, DATE_OF_BIRTH and TIME.
+            "dateTime": { # Message for a date time object. # The date time indicated by the quote.
+                # e.g. 2018-01-01, 5th August.
+              "dayOfWeek": "A String",
+              "timeZone": {
+                "offsetMinutes": 42, # Set only if the offset can be determined. Positive for time ahead of UTC.
+                    # E.g. For "UTC-9", this value is -540.
+              },
+              "date": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day # One or more of the following must be set. All fields are optional, but
+                  # when set must be valid date or time values.
+                  # and time zone are either specified elsewhere or are not significant. The date
+                  # is relative to the Proleptic Gregorian Calendar. This can represent:
+                  #
+                  # * A full date, with non-zero year, month and day values
+                  # * A month and day value, with a zero year, e.g. an anniversary
+                  # * A year on its own, with zero month and day values
+                  # * A year and month value, with a zero day, e.g. a credit card expiration date
+                  #
+                  # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                    # a year.
+                "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                    # if specifying a year by itself or a year and month where the day is not
+                    # significant.
+                "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                    # month and day.
+              },
+              "time": { # Represents a time of day. The date and time zone are either not significant
+                  # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                  # types are google.type.Date and `google.protobuf.Timestamp`.
+                "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                    # to allow the value "24:00:00" for scenarios like business closing time.
+                "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                    # allow the value 60 if it allows leap-seconds.
+                "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+              },
+            },
+          },
+          "location": { # Specifies the location of the finding. # Where the content was found.
+            "byteRange": { # Generic half-open interval [start, end) # Zero-based byte offsets delimiting the finding.
+                # These are relative to the finding's containing element.
+                # Note that when the content is not textual, this references
+                # the UTF-8 encoded textual representation of the content.
+                # Omitted if content is an image.
+              "start": "A String", # Index of the first character of the range (inclusive).
+              "end": "A String", # Index of the last character of the range (exclusive).
+            },
+            "codepointRange": { # Generic half-open interval [start, end) # Unicode character offsets delimiting the finding.
+                # These are relative to the finding's containing element.
+                # Provided when the content is text.
+              "start": "A String", # Index of the first character of the range (inclusive).
+              "end": "A String", # Index of the last character of the range (exclusive).
+            },
+            "contentLocations": [ # List of nested objects pointing to the precise location of the finding
+                # within the file or record.
+              { # Findings container location data.
+                "containerName": "A String", # Name of the container where the finding is located.
+                    # The top level name is the source file name or table name. Names of some
+                    # common storage containers are formatted as follows:
+                    #
+                    # * BigQuery tables:  `<project_id>:<dataset_id>.<table_id>`
+                    # * Cloud Storage files: `gs://<bucket>/<path>`
+                    # * Datastore namespace: <namespace>
+                    #
+                    # Nested names could be absent if the embedded object has no string
+                    # identifier (for an example an image contained within a document).
+                "containerVersion": "A String", # Findings container version, if available
+                    # ("generation" for Google Cloud Storage).
+                "containerTimestamp": "A String", # Findings container modification timestamp, if applicable.
+                    # For Google Cloud Storage contains last file modification timestamp.
+                    # For BigQuery table contains last_modified_time property.
+                    # For Datastore - not populated.
+                "documentLocation": { # Location of a finding within a document. # Location data for document files.
+                  "fileOffset": "A String", # Offset of the line, from the beginning of the file, where the finding
+                      # is located.
+                },
+                "imageLocation": { # Location of the finding within an image. # Location within an image's pixels.
+                  "boundingBoxes": [ # Bounding boxes locating the pixels within the image containing the finding.
+                    { # Bounding box encompassing detected text within an image.
+                      "width": 42, # Width of the bounding box in pixels.
+                      "top": 42, # Top coordinate of the bounding box. (0,0) is upper left.
+                      "left": 42, # Left coordinate of the bounding box. (0,0) is upper left.
+                      "height": 42, # Height of the bounding box in pixels.
+                    },
+                  ],
+                },
+                "recordLocation": { # Location of a finding within a row or record. # Location within a row or record of a database table.
+                  "fieldId": { # General identifier of a data field in a storage service. # Field id of the field containing the finding.
+                    "name": "A String", # Name describing the field.
+                  },
+                  "tableLocation": { # Location of a finding within a table. # Location within a `ContentItem.Table`.
+                    "rowIndex": "A String", # The zero-based index of the row where the finding is located.
+                  },
+                  "recordKey": { # Message for a unique key indicating a record that contains a finding. # Key of the finding.
+                    "bigQueryKey": { # Row key for identifying a record in BigQuery table.
+                      "tableReference": { # Message defining the location of a BigQuery table. A table is uniquely # Complete BigQuery table reference.
+                          # identified  by its project_id, dataset_id, and table_name. Within a query
+                          # a table is often referenced with a string in the format of:
+                          # `<project_id>:<dataset_id>.<table_id>` or
+                          # `<project_id>.<dataset_id>.<table_id>`.
+                        "projectId": "A String", # The Google Cloud Platform project ID of the project containing the table.
+                            # If omitted, project ID is inferred from the API call.
+                        "tableId": "A String", # Name of the table.
+                        "datasetId": "A String", # Dataset ID of the table.
+                      },
+                      "rowNumber": "A String", # Absolute number of the row from the beginning of the table at the time
+                          # of scanning.
+                    },
+                    "idValues": [ # Values of identifying columns in the given row. Order of values matches
+                        # the order of field identifiers specified in the scanning request.
+                      "A String",
+                    ],
+                    "datastoreKey": { # Record key for a finding in Cloud Datastore.
+                      "entityKey": { # A unique identifier for a Datastore entity. # Datastore entity key.
+                          # If a key's partition ID or any of its path kinds or names are
+                          # reserved/read-only, the key is reserved/read-only.
+                          # A reserved/read-only key is forbidden in certain documented contexts.
+                        "path": [ # The entity path.
+                            # An entity path consists of one or more elements composed of a kind and a
+                            # string or numerical identifier, which identify entities. The first
+                            # element identifies a _root entity_, the second element identifies
+                            # a _child_ of the root entity, the third element identifies a child of the
+                            # second entity, and so forth. The entities identified by all prefixes of
+                            # the path are called the element's _ancestors_.
+                            #
+                            # A path can never be empty, and a path can have at most 100 elements.
+                          { # A (kind, ID/name) pair used to construct a key path.
+                              #
+                              # If either name or ID is set, the element is complete.
+                              # If neither is set, the element is incomplete.
+                            "kind": "A String", # The kind of the entity.
+                                # A kind matching regex `__.*__` is reserved/read-only.
+                                # A kind must not contain more than 1500 bytes when UTF-8 encoded.
+                                # Cannot be `""`.
+                            "name": "A String", # The name of the entity.
+                                # A name matching regex `__.*__` is reserved/read-only.
+                                # A name must not be more than 1500 bytes when UTF-8 encoded.
+                                # Cannot be `""`.
+                            "id": "A String", # The auto-allocated ID of the entity.
+                                # Never equal to zero. Values less than zero are discouraged and may not
+                                # be supported in the future.
+                          },
+                        ],
+                        "partitionId": { # Datastore partition ID. # Entities are partitioned into subsets, currently identified by a project
+                            # ID and namespace ID.
+                            # Queries are scoped to a single partition.
+                            # A partition ID identifies a grouping of entities. The grouping is always
+                            # by project and namespace, however the namespace ID may be empty.
+                            #
+                            # A partition ID contains several dimensions:
+                            # project ID and namespace ID.
+                          "projectId": "A String", # The ID of the project to which the entities belong.
+                          "namespaceId": "A String", # If not empty, the ID of the namespace to which the entities belong.
+                        },
+                      },
+                    },
+                  },
+                },
+              },
+            ],
+          },
+          "likelihood": "A String", # Confidence of how likely it is that the `info_type` is correct.
+          "createTime": "A String", # Timestamp when finding was detected.
+        },
+      ],
+    },
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="reidentify">reidentify(parent, body, x__xgafv=None)</code>
+  <pre>Re-identifies content that has been de-identified.
+See
+https://cloud.google.com/dlp/docs/pseudonymization#re-identification_in_free_text_code_example
+to learn more.
+
+Args:
+  parent: string, The parent resource name. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # Request to re-identify an item.
+    "reidentifyConfig": { # The configuration that controls how the data will change. # Configuration for the re-identification of the content item.
+        # This field shares the same proto message type that is used for
+        # de-identification, however its usage here is for the reversal of the
+        # previous de-identification. Re-identification is performed by examining
+        # the transformations used to de-identify the items and executing the
+        # reverse. This requires that only reversible transformations
+        # be provided here. The reversible transformations are:
+        # 
+        #  - `CryptoReplaceFfxFpeConfig`
+      "infoTypeTransformations": { # A type of transformation that will scan unstructured text and # Treat the dataset as free-form text and apply the same free text
+          # transformation everywhere.
+          # apply various `PrimitiveTransformation`s to each finding, where the
+          # transformation is applied to only values that were identified as a specific
+          # info_type.
+        "transformations": [ # Transformation for each infoType. Cannot specify more than one
+            # for a given infoType. [required]
+          { # A transformation to apply to text that is identified as a specific
+              # info_type.
+            "primitiveTransformation": { # A rule for transforming a value. # Primitive transformation to apply to the infoType. [required]
+              "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                  # fixed character. Masking can start from the beginning or end of the string.
+                  # This can be used on data of any type (numbers, longs, and so on) and when
+                  # de-identifying structured data we'll attempt to preserve the original data's
+                  # type. (This allows you to take a long like 123 and modify it to a string like
+                  # **3.
+                "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                    # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                    # mask 5 chars with * we would produce ***-*55-5555.
+                  { # Characters to skip when doing deidentification of a value. These will be left
+                      # alone and skipped.
+                    "commonCharactersToIgnore": "A String",
+                    "charactersToSkip": "A String",
+                  },
+                ],
+                "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                    # masked. Skipped characters do not count towards this tally.
+                "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                    # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                    # code or credit card number. String must have length 1. If not supplied, we
+                    # will default to "*" for strings, 0 for digits.
+                "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                    # '0', number_to_mask is 14, and `reverse_order` is false, then
+                    # 1234-5678-9012-3456 -> 00000000000000-3456
+                    # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                    # is true, then 12345 -> 12***
+              },
+              "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                  # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                  # output would be 'My phone number is '.
+              },
+              "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                  # input. Outputs a base64 encoded representation of the encrypted output.
+                  # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                    # referential integrity such that the same identifier in two different
+                    # contexts will be given a distinct surrogate. The context is appended to
+                    # plaintext value being encrypted. On decryption the provided context is
+                    # validated against the value used during encryption. If a context was
+                    # provided during encryption, same context must be provided during decryption
+                    # as well.
+                    #
+                    # If the context is not set, plaintext would be used as is for encryption.
+                    # If the context is set but:
+                    #
+                    # 1. there is no record present when transforming a given value or
+                    # 2. the field is not present when transforming a given value,
+                    #
+                    # plaintext would be used as is for encryption.
+                    #
+                    # Note that case (1) is expected when an `InfoTypeTransformation` is
+                    # applied to both structured and non-structured `ContentItem`s.
+                  "name": "A String", # Name describing the field.
+                },
+                "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                    # This annotation will be applied to the surrogate by prefixing it with
+                    # the name of the custom info type followed by the number of
+                    # characters comprising the surrogate. The following scheme defines the
+                    # format: <info type name>(<surrogate character count>):<surrogate>
+                    #
+                    # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                    # the surrogate is 'abc', the full replacement value
+                    # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                    #
+                    # This annotation identifies the surrogate when inspecting content using the
+                    # custom info type 'Surrogate'. This facilitates reversal of the
+                    # surrogate when it occurs in free text.
+                    #
+                    # In order for inspection to work properly, the name of this info type must
+                    # not occur naturally anywhere in your data; otherwise, inspection may either
+                    #
+                    # - reverse a surrogate that does not correspond to an actual identifier
+                    # - be unable to parse the surrogate and result in an error
+                    #
+                    # Therefore, choose your custom info type name carefully after considering
+                    # what your data looks like. One way to select a name that has a high chance
+                    # of yielding reliable detection is to include one or more unicode characters
+                    # that are highly improbable to exist in your data.
+                    # For example, assuming your data is entered from a regular ASCII keyboard,
+                    # the symbol with the hex code point 29DD might be used like so:
+                    # ⧝MY_TOKEN_TYPE
+                  "name": "A String", # Name of the information type. Either a name of your choosing when
+                      # creating a CustomInfoType, or one of the names listed
+                      # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                      # a built-in type. InfoType names should conform to the pattern
+                      # [a-zA-Z0-9_]{1,64}.
+                },
+              },
+              "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                  # Bucketing transformation can provide all of this functionality,
+                  # but requires more configuration. This message is provided as a convenience to
+                  # the user for simple bucketing strategies.
+                  #
+                  # The transformed value will be a hyphenated string of
+                  # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                  # all values that are within this bucket will be replaced with "10-20".
+                  #
+                  # This can be used on data of type: double, long.
+                  #
+                  # If the bound Value type differs from the type of data
+                  # being transformed, we will first attempt converting the type of the data to
+                  # be transformed to match the type of the bound before comparing.
+                  #
+                  # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                    # grouped together into a single bucket; for example if `lower_bound` = 10,
+                    # then all values less than 10 are replaced with the value “-10”. [Required].
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+                "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                    # grouped together into a single bucket; for example if `upper_bound` = 89,
+                    # then all values greater than 89 are replaced with the value “89+”.
+                    # [Required].
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+                "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                    # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                    # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                    # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+              },
+              "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+              },
+              "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                  # portion of the value.
+                "partToExtract": "A String",
+              },
+              "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                  # Uses SHA-256.
+                  # The key size must be either 32 or 64 bytes.
+                  # Outputs a base64 encoded representation of the hashed output
+                  # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                  # Currently, only string and integer values can be hashed.
+                  # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+              },
+              "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                  # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                  # to learn more.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                    # results in the same shift for the same context and crypto_key.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                    # [Required]
+                "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                    # range (inclusive ends). Negative means shift to earlier in time. Must not
+                    # be more than 365250 days (1000 years) each direction.
+                    #
+                    # For example, 3 means shift date to at most 3 days into the future.
+                    # [Required]
+                "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                    # If set, must also set method. If set, shift will be consistent for the
+                    # given context.
+                  "name": "A String", # Name describing the field.
+                },
+              },
+              "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                  # replacement values are dynamically provided by the user for custom behavior,
+                  # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                  # This can be used on
+                  # data of type: number, long, string, timestamp.
+                  # If the bound `Value` type differs from the type of data being transformed, we
+                  # will first attempt converting the type of the data to be transformed to match
+                  # the type of the bound before comparing.
+                  # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                  { # Bucket is represented as a range, along with replacement values.
+                    "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                    "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                        # the default behavior will be to hyphenate the min-max range.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                    "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                        # used.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                  },
+                ],
+              },
+              "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                  # (FPE) with the FFX mode of operation; however when used in the
+                  # `ReidentifyContent` API method, it serves the opposite function by reversing
+                  # the surrogate back into the original identifier. The identifier must be
+                  # encoded as ASCII. For a given crypto key and context, the same identifier
+                  # will be replaced with the same surrogate. Identifiers must be at least two
+                  # characters long. In the case that the identifier is the empty string, it will
+                  # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                  # more.
+                  #
+                  # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                  # do not require preserving the input alphabet space and size, plus warrant
+                  # referential integrity.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+                "commonAlphabet": "A String",
+                "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                    # that the FFX mode natively supports. This happens before/after
+                    # encryption/decryption.
+                    # Each character listed must appear only once.
+                    # Number of characters must be in the range [2, 62].
+                    # This must be encoded as ASCII.
+                    # The order of characters does not matter.
+                "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                    # identifier in two different contexts won't be given the same surrogate. If
+                    # the context is not set, a default tweak will be used.
+                    #
+                    # If the context is set but:
+                    #
+                    # 1. there is no record present when transforming a given value or
+                    # 1. the field is not present when transforming a given value,
+                    #
+                    # a default tweak will be used.
+                    #
+                    # Note that case (1) is expected when an `InfoTypeTransformation` is
+                    # applied to both structured and non-structured `ContentItem`s.
+                    # Currently, the referenced field may be of value type integer or string.
+                    #
+                    # The tweak is constructed as a sequence of bytes in big endian byte order
+                    # such that:
+                    #
+                    # - a 64 bit integer is encoded followed by a single byte of value 1
+                    # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                  "name": "A String", # Name describing the field.
+                },
+                "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                    # This annotation will be applied to the surrogate by prefixing it with
+                    # the name of the custom infoType followed by the number of
+                    # characters comprising the surrogate. The following scheme defines the
+                    # format: info_type_name(surrogate_character_count):surrogate
+                    #
+                    # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                    # the surrogate is 'abc', the full replacement value
+                    # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                    #
+                    # This annotation identifies the surrogate when inspecting content using the
+                    # custom infoType
+                    # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                    # This facilitates reversal of the surrogate when it occurs in free text.
+                    #
+                    # In order for inspection to work properly, the name of this infoType must
+                    # not occur naturally anywhere in your data; otherwise, inspection may
+                    # find a surrogate that does not correspond to an actual identifier.
+                    # Therefore, choose your custom infoType name carefully after considering
+                    # what your data looks like. One way to select a name that has a high chance
+                    # of yielding reliable detection is to include one or more unicode characters
+                    # that are highly improbable to exist in your data.
+                    # For example, assuming your data is entered from a regular ASCII keyboard,
+                    # the symbol with the hex code point 29DD might be used like so:
+                    # ⧝MY_TOKEN_TYPE
+                  "name": "A String", # Name of the information type. Either a name of your choosing when
+                      # creating a CustomInfoType, or one of the names listed
+                      # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                      # a built-in type. InfoType names should conform to the pattern
+                      # [a-zA-Z0-9_]{1,64}.
+                },
+              },
+              "replaceConfig": { # Replace each input value with a given `Value`.
+                "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+              },
+            },
+            "infoTypes": [ # InfoTypes to apply the transformation to. An empty list will cause
+                # this transformation to apply to all findings that correspond to
+                # infoTypes that were requested in `InspectConfig`.
+              { # Type of information detected by the API.
+                "name": "A String", # Name of the information type. Either a name of your choosing when
+                    # creating a CustomInfoType, or one of the names listed
+                    # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                    # a built-in type. InfoType names should conform to the pattern
+                    # [a-zA-Z0-9_]{1,64}.
+              },
+            ],
+          },
+        ],
+      },
+      "recordTransformations": { # A type of transformation that is applied over structured data such as a # Treat the dataset as structured. Transformations can be applied to
+          # specific locations within structured datasets, such as transforming
+          # a column within a table.
+          # table.
+        "recordSuppressions": [ # Configuration defining which records get suppressed entirely. Records that
+            # match any suppression rule are omitted from the output [optional].
+          { # Configuration to suppress records whose suppression conditions evaluate to
+              # true.
+            "condition": { # A condition for determining whether a transformation should be applied to # A condition that when it evaluates to true will result in the record being
+                # evaluated to be suppressed from the transformed content.
+                # a field.
+              "expressions": { # An expression, consisting or an operator and conditions. # An expression.
+                "conditions": { # A collection of conditions.
+                  "conditions": [
+                    { # The field type of `value` and `field` do not need to match to be
+                        # considered equal, but not all comparisons are possible.
+                        # EQUAL_TO and NOT_EQUAL_TO attempt to compare even with incompatible types,
+                        # but all other comparisons are invalid with incompatible types.
+                        # A `value` of type:
+                        #
+                        # - `string` can be compared against all other types
+                        # - `boolean` can only be compared against other booleans
+                        # - `integer` can be compared against doubles or a string if the string value
+                        # can be parsed as an integer.
+                        # - `double` can be compared against integers or a string if the string can
+                        # be parsed as a double.
+                        # - `Timestamp` can be compared against strings in RFC 3339 date string
+                        # format.
+                        # - `TimeOfDay` can be compared against timestamps and strings in the format
+                        # of 'HH:mm:ss'.
+                        #
+                        # If we fail to compare do to type mismatch, a warning will be given and
+                        # the condition will evaluate to false.
+                      "operator": "A String", # Operator used to compare the field or infoType to the value. [required]
+                      "field": { # General identifier of a data field in a storage service. # Field within the record this condition is evaluated against. [required]
+                        "name": "A String", # Name describing the field.
+                      },
+                      "value": { # Set of primitive values supported by the system. # Value to compare against. [Required, except for `EXISTS` tests.]
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                    },
+                  ],
+                },
+                "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently
+                    # only supported value is `AND`.
+              },
+            },
+          },
+        ],
+        "fieldTransformations": [ # Transform the record by applying various field transformations.
+          { # The transformation to apply to the field.
+            "infoTypeTransformations": { # A type of transformation that will scan unstructured text and # Treat the contents of the field as free text, and selectively
+                # transform content that matches an `InfoType`.
+                # apply various `PrimitiveTransformation`s to each finding, where the
+                # transformation is applied to only values that were identified as a specific
+                # info_type.
+              "transformations": [ # Transformation for each infoType. Cannot specify more than one
+                  # for a given infoType. [required]
+                { # A transformation to apply to text that is identified as a specific
+                    # info_type.
+                  "primitiveTransformation": { # A rule for transforming a value. # Primitive transformation to apply to the infoType. [required]
+                    "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                        # fixed character. Masking can start from the beginning or end of the string.
+                        # This can be used on data of any type (numbers, longs, and so on) and when
+                        # de-identifying structured data we'll attempt to preserve the original data's
+                        # type. (This allows you to take a long like 123 and modify it to a string like
+                        # **3.
+                      "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                          # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                          # mask 5 chars with * we would produce ***-*55-5555.
+                        { # Characters to skip when doing deidentification of a value. These will be left
+                            # alone and skipped.
+                          "commonCharactersToIgnore": "A String",
+                          "charactersToSkip": "A String",
+                        },
+                      ],
+                      "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                          # masked. Skipped characters do not count towards this tally.
+                      "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                          # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                          # code or credit card number. String must have length 1. If not supplied, we
+                          # will default to "*" for strings, 0 for digits.
+                      "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                          # '0', number_to_mask is 14, and `reverse_order` is false, then
+                          # 1234-5678-9012-3456 -> 00000000000000-3456
+                          # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                          # is true, then 12345 -> 12***
+                    },
+                    "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                        # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                        # output would be 'My phone number is '.
+                    },
+                    "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                        # input. Outputs a base64 encoded representation of the encrypted output.
+                        # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+                      "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                          # a key encryption key (KEK) stored by KMS).
+                          # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                          # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                          # unwrap the data crypto key.
+                        "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                            # The wrapped key must be a 128/192/256 bit key.
+                            # Authorization requires the following IAM permissions when sending a request
+                            # to perform a crypto transformation using a kms-wrapped crypto key:
+                            # dlp.kms.encrypt
+                          "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                          "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                        },
+                        "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                            # leaking the key. Choose another type of key if possible.
+                          "key": "A String", # A 128/192/256 bit key. [required]
+                        },
+                        "transient": { # Use this to have a random data crypto key generated.
+                            # It will be discarded after the request finishes.
+                          "name": "A String", # Name of the key. [required]
+                              # This is an arbitrary string used to differentiate different keys.
+                              # A unique key is generated per name: two separate `TransientCryptoKey`
+                              # protos share the same generated key if their names are the same.
+                              # When the data crypto key is generated, this name is not used in any way
+                              # (repeating the api call will result in a different key being generated).
+                        },
+                      },
+                      "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                          # referential integrity such that the same identifier in two different
+                          # contexts will be given a distinct surrogate. The context is appended to
+                          # plaintext value being encrypted. On decryption the provided context is
+                          # validated against the value used during encryption. If a context was
+                          # provided during encryption, same context must be provided during decryption
+                          # as well.
+                          #
+                          # If the context is not set, plaintext would be used as is for encryption.
+                          # If the context is set but:
+                          #
+                          # 1. there is no record present when transforming a given value or
+                          # 2. the field is not present when transforming a given value,
+                          #
+                          # plaintext would be used as is for encryption.
+                          #
+                          # Note that case (1) is expected when an `InfoTypeTransformation` is
+                          # applied to both structured and non-structured `ContentItem`s.
+                        "name": "A String", # Name describing the field.
+                      },
+                      "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                          # This annotation will be applied to the surrogate by prefixing it with
+                          # the name of the custom info type followed by the number of
+                          # characters comprising the surrogate. The following scheme defines the
+                          # format: <info type name>(<surrogate character count>):<surrogate>
+                          #
+                          # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                          # the surrogate is 'abc', the full replacement value
+                          # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                          #
+                          # This annotation identifies the surrogate when inspecting content using the
+                          # custom info type 'Surrogate'. This facilitates reversal of the
+                          # surrogate when it occurs in free text.
+                          #
+                          # In order for inspection to work properly, the name of this info type must
+                          # not occur naturally anywhere in your data; otherwise, inspection may either
+                          #
+                          # - reverse a surrogate that does not correspond to an actual identifier
+                          # - be unable to parse the surrogate and result in an error
+                          #
+                          # Therefore, choose your custom info type name carefully after considering
+                          # what your data looks like. One way to select a name that has a high chance
+                          # of yielding reliable detection is to include one or more unicode characters
+                          # that are highly improbable to exist in your data.
+                          # For example, assuming your data is entered from a regular ASCII keyboard,
+                          # the symbol with the hex code point 29DD might be used like so:
+                          # ⧝MY_TOKEN_TYPE
+                        "name": "A String", # Name of the information type. Either a name of your choosing when
+                            # creating a CustomInfoType, or one of the names listed
+                            # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                            # a built-in type. InfoType names should conform to the pattern
+                            # [a-zA-Z0-9_]{1,64}.
+                      },
+                    },
+                    "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                        # Bucketing transformation can provide all of this functionality,
+                        # but requires more configuration. This message is provided as a convenience to
+                        # the user for simple bucketing strategies.
+                        #
+                        # The transformed value will be a hyphenated string of
+                        # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                        # all values that are within this bucket will be replaced with "10-20".
+                        #
+                        # This can be used on data of type: double, long.
+                        #
+                        # If the bound Value type differs from the type of data
+                        # being transformed, we will first attempt converting the type of the data to
+                        # be transformed to match the type of the bound before comparing.
+                        #
+                        # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                      "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                          # grouped together into a single bucket; for example if `lower_bound` = 10,
+                          # then all values less than 10 are replaced with the value “-10”. [Required].
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                      "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                          # grouped together into a single bucket; for example if `upper_bound` = 89,
+                          # then all values greater than 89 are replaced with the value “89+”.
+                          # [Required].
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                      "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                          # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                          # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                          # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+                    },
+                    "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+                    },
+                    "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                        # portion of the value.
+                      "partToExtract": "A String",
+                    },
+                    "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                        # Uses SHA-256.
+                        # The key size must be either 32 or 64 bytes.
+                        # Outputs a base64 encoded representation of the hashed output
+                        # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                        # Currently, only string and integer values can be hashed.
+                        # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+                      "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                          # a key encryption key (KEK) stored by KMS).
+                          # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                          # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                          # unwrap the data crypto key.
+                        "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                            # The wrapped key must be a 128/192/256 bit key.
+                            # Authorization requires the following IAM permissions when sending a request
+                            # to perform a crypto transformation using a kms-wrapped crypto key:
+                            # dlp.kms.encrypt
+                          "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                          "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                        },
+                        "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                            # leaking the key. Choose another type of key if possible.
+                          "key": "A String", # A 128/192/256 bit key. [required]
+                        },
+                        "transient": { # Use this to have a random data crypto key generated.
+                            # It will be discarded after the request finishes.
+                          "name": "A String", # Name of the key. [required]
+                              # This is an arbitrary string used to differentiate different keys.
+                              # A unique key is generated per name: two separate `TransientCryptoKey`
+                              # protos share the same generated key if their names are the same.
+                              # When the data crypto key is generated, this name is not used in any way
+                              # (repeating the api call will result in a different key being generated).
+                        },
+                      },
+                    },
+                    "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                        # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                        # to learn more.
+                      "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                          # results in the same shift for the same context and crypto_key.
+                          # a key encryption key (KEK) stored by KMS).
+                          # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                          # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                          # unwrap the data crypto key.
+                        "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                            # The wrapped key must be a 128/192/256 bit key.
+                            # Authorization requires the following IAM permissions when sending a request
+                            # to perform a crypto transformation using a kms-wrapped crypto key:
+                            # dlp.kms.encrypt
+                          "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                          "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                        },
+                        "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                            # leaking the key. Choose another type of key if possible.
+                          "key": "A String", # A 128/192/256 bit key. [required]
+                        },
+                        "transient": { # Use this to have a random data crypto key generated.
+                            # It will be discarded after the request finishes.
+                          "name": "A String", # Name of the key. [required]
+                              # This is an arbitrary string used to differentiate different keys.
+                              # A unique key is generated per name: two separate `TransientCryptoKey`
+                              # protos share the same generated key if their names are the same.
+                              # When the data crypto key is generated, this name is not used in any way
+                              # (repeating the api call will result in a different key being generated).
+                        },
+                      },
+                      "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                          # [Required]
+                      "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                          # range (inclusive ends). Negative means shift to earlier in time. Must not
+                          # be more than 365250 days (1000 years) each direction.
+                          #
+                          # For example, 3 means shift date to at most 3 days into the future.
+                          # [Required]
+                      "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                          # If set, must also set method. If set, shift will be consistent for the
+                          # given context.
+                        "name": "A String", # Name describing the field.
+                      },
+                    },
+                    "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                        # replacement values are dynamically provided by the user for custom behavior,
+                        # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                        # This can be used on
+                        # data of type: number, long, string, timestamp.
+                        # If the bound `Value` type differs from the type of data being transformed, we
+                        # will first attempt converting the type of the data to be transformed to match
+                        # the type of the bound before comparing.
+                        # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                      "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                        { # Bucket is represented as a range, along with replacement values.
+                          "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                              # Note that for the purposes of inspection or transformation, the number
+                              # of bytes considered to comprise a 'Value' is based on its representation
+                              # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                              # 123456789, the number of bytes would be counted as 9, even though an
+                              # int64 only holds up to 8 bytes of data.
+                            "floatValue": 3.14,
+                            "timestampValue": "A String",
+                            "dayOfWeekValue": "A String",
+                            "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                # types are google.type.Date and `google.protobuf.Timestamp`.
+                              "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                  # to allow the value "24:00:00" for scenarios like business closing time.
+                              "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                              "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                  # allow the value 60 if it allows leap-seconds.
+                              "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                            },
+                            "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                # and time zone are either specified elsewhere or are not significant. The date
+                                # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                #
+                                # * A full date, with non-zero year, month and day values
+                                # * A month and day value, with a zero year, e.g. an anniversary
+                                # * A year on its own, with zero month and day values
+                                # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                #
+                                # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                              "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                  # a year.
+                              "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                  # if specifying a year by itself or a year and month where the day is not
+                                  # significant.
+                              "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                  # month and day.
+                            },
+                            "stringValue": "A String",
+                            "booleanValue": True or False,
+                            "integerValue": "A String",
+                          },
+                          "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                              # the default behavior will be to hyphenate the min-max range.
+                              # Note that for the purposes of inspection or transformation, the number
+                              # of bytes considered to comprise a 'Value' is based on its representation
+                              # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                              # 123456789, the number of bytes would be counted as 9, even though an
+                              # int64 only holds up to 8 bytes of data.
+                            "floatValue": 3.14,
+                            "timestampValue": "A String",
+                            "dayOfWeekValue": "A String",
+                            "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                # types are google.type.Date and `google.protobuf.Timestamp`.
+                              "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                  # to allow the value "24:00:00" for scenarios like business closing time.
+                              "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                              "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                  # allow the value 60 if it allows leap-seconds.
+                              "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                            },
+                            "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                # and time zone are either specified elsewhere or are not significant. The date
+                                # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                #
+                                # * A full date, with non-zero year, month and day values
+                                # * A month and day value, with a zero year, e.g. an anniversary
+                                # * A year on its own, with zero month and day values
+                                # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                #
+                                # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                              "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                  # a year.
+                              "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                  # if specifying a year by itself or a year and month where the day is not
+                                  # significant.
+                              "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                  # month and day.
+                            },
+                            "stringValue": "A String",
+                            "booleanValue": True or False,
+                            "integerValue": "A String",
+                          },
+                          "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                              # used.
+                              # Note that for the purposes of inspection or transformation, the number
+                              # of bytes considered to comprise a 'Value' is based on its representation
+                              # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                              # 123456789, the number of bytes would be counted as 9, even though an
+                              # int64 only holds up to 8 bytes of data.
+                            "floatValue": 3.14,
+                            "timestampValue": "A String",
+                            "dayOfWeekValue": "A String",
+                            "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                # types are google.type.Date and `google.protobuf.Timestamp`.
+                              "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                  # to allow the value "24:00:00" for scenarios like business closing time.
+                              "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                              "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                  # allow the value 60 if it allows leap-seconds.
+                              "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                            },
+                            "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                # and time zone are either specified elsewhere or are not significant. The date
+                                # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                #
+                                # * A full date, with non-zero year, month and day values
+                                # * A month and day value, with a zero year, e.g. an anniversary
+                                # * A year on its own, with zero month and day values
+                                # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                #
+                                # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                              "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                  # a year.
+                              "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                  # if specifying a year by itself or a year and month where the day is not
+                                  # significant.
+                              "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                  # month and day.
+                            },
+                            "stringValue": "A String",
+                            "booleanValue": True or False,
+                            "integerValue": "A String",
+                          },
+                        },
+                      ],
+                    },
+                    "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                        # (FPE) with the FFX mode of operation; however when used in the
+                        # `ReidentifyContent` API method, it serves the opposite function by reversing
+                        # the surrogate back into the original identifier. The identifier must be
+                        # encoded as ASCII. For a given crypto key and context, the same identifier
+                        # will be replaced with the same surrogate. Identifiers must be at least two
+                        # characters long. In the case that the identifier is the empty string, it will
+                        # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                        # more.
+                        #
+                        # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                        # do not require preserving the input alphabet space and size, plus warrant
+                        # referential integrity.
+                      "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                          # a key encryption key (KEK) stored by KMS).
+                          # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                          # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                          # unwrap the data crypto key.
+                        "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                            # The wrapped key must be a 128/192/256 bit key.
+                            # Authorization requires the following IAM permissions when sending a request
+                            # to perform a crypto transformation using a kms-wrapped crypto key:
+                            # dlp.kms.encrypt
+                          "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                          "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                        },
+                        "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                            # leaking the key. Choose another type of key if possible.
+                          "key": "A String", # A 128/192/256 bit key. [required]
+                        },
+                        "transient": { # Use this to have a random data crypto key generated.
+                            # It will be discarded after the request finishes.
+                          "name": "A String", # Name of the key. [required]
+                              # This is an arbitrary string used to differentiate different keys.
+                              # A unique key is generated per name: two separate `TransientCryptoKey`
+                              # protos share the same generated key if their names are the same.
+                              # When the data crypto key is generated, this name is not used in any way
+                              # (repeating the api call will result in a different key being generated).
+                        },
+                      },
+                      "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+                      "commonAlphabet": "A String",
+                      "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                          # that the FFX mode natively supports. This happens before/after
+                          # encryption/decryption.
+                          # Each character listed must appear only once.
+                          # Number of characters must be in the range [2, 62].
+                          # This must be encoded as ASCII.
+                          # The order of characters does not matter.
+                      "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                          # identifier in two different contexts won't be given the same surrogate. If
+                          # the context is not set, a default tweak will be used.
+                          #
+                          # If the context is set but:
+                          #
+                          # 1. there is no record present when transforming a given value or
+                          # 1. the field is not present when transforming a given value,
+                          #
+                          # a default tweak will be used.
+                          #
+                          # Note that case (1) is expected when an `InfoTypeTransformation` is
+                          # applied to both structured and non-structured `ContentItem`s.
+                          # Currently, the referenced field may be of value type integer or string.
+                          #
+                          # The tweak is constructed as a sequence of bytes in big endian byte order
+                          # such that:
+                          #
+                          # - a 64 bit integer is encoded followed by a single byte of value 1
+                          # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                        "name": "A String", # Name describing the field.
+                      },
+                      "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                          # This annotation will be applied to the surrogate by prefixing it with
+                          # the name of the custom infoType followed by the number of
+                          # characters comprising the surrogate. The following scheme defines the
+                          # format: info_type_name(surrogate_character_count):surrogate
+                          #
+                          # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                          # the surrogate is 'abc', the full replacement value
+                          # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                          #
+                          # This annotation identifies the surrogate when inspecting content using the
+                          # custom infoType
+                          # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                          # This facilitates reversal of the surrogate when it occurs in free text.
+                          #
+                          # In order for inspection to work properly, the name of this infoType must
+                          # not occur naturally anywhere in your data; otherwise, inspection may
+                          # find a surrogate that does not correspond to an actual identifier.
+                          # Therefore, choose your custom infoType name carefully after considering
+                          # what your data looks like. One way to select a name that has a high chance
+                          # of yielding reliable detection is to include one or more unicode characters
+                          # that are highly improbable to exist in your data.
+                          # For example, assuming your data is entered from a regular ASCII keyboard,
+                          # the symbol with the hex code point 29DD might be used like so:
+                          # ⧝MY_TOKEN_TYPE
+                        "name": "A String", # Name of the information type. Either a name of your choosing when
+                            # creating a CustomInfoType, or one of the names listed
+                            # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                            # a built-in type. InfoType names should conform to the pattern
+                            # [a-zA-Z0-9_]{1,64}.
+                      },
+                    },
+                    "replaceConfig": { # Replace each input value with a given `Value`.
+                      "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                    },
+                  },
+                  "infoTypes": [ # InfoTypes to apply the transformation to. An empty list will cause
+                      # this transformation to apply to all findings that correspond to
+                      # infoTypes that were requested in `InspectConfig`.
+                    { # Type of information detected by the API.
+                      "name": "A String", # Name of the information type. Either a name of your choosing when
+                          # creating a CustomInfoType, or one of the names listed
+                          # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                          # a built-in type. InfoType names should conform to the pattern
+                          # [a-zA-Z0-9_]{1,64}.
+                    },
+                  ],
+                },
+              ],
+            },
+            "primitiveTransformation": { # A rule for transforming a value. # Apply the transformation to the entire field.
+              "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                  # fixed character. Masking can start from the beginning or end of the string.
+                  # This can be used on data of any type (numbers, longs, and so on) and when
+                  # de-identifying structured data we'll attempt to preserve the original data's
+                  # type. (This allows you to take a long like 123 and modify it to a string like
+                  # **3.
+                "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                    # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                    # mask 5 chars with * we would produce ***-*55-5555.
+                  { # Characters to skip when doing deidentification of a value. These will be left
+                      # alone and skipped.
+                    "commonCharactersToIgnore": "A String",
+                    "charactersToSkip": "A String",
+                  },
+                ],
+                "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                    # masked. Skipped characters do not count towards this tally.
+                "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                    # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                    # code or credit card number. String must have length 1. If not supplied, we
+                    # will default to "*" for strings, 0 for digits.
+                "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                    # '0', number_to_mask is 14, and `reverse_order` is false, then
+                    # 1234-5678-9012-3456 -> 00000000000000-3456
+                    # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                    # is true, then 12345 -> 12***
+              },
+              "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                  # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                  # output would be 'My phone number is '.
+              },
+              "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                  # input. Outputs a base64 encoded representation of the encrypted output.
+                  # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                    # referential integrity such that the same identifier in two different
+                    # contexts will be given a distinct surrogate. The context is appended to
+                    # plaintext value being encrypted. On decryption the provided context is
+                    # validated against the value used during encryption. If a context was
+                    # provided during encryption, same context must be provided during decryption
+                    # as well.
+                    #
+                    # If the context is not set, plaintext would be used as is for encryption.
+                    # If the context is set but:
+                    #
+                    # 1. there is no record present when transforming a given value or
+                    # 2. the field is not present when transforming a given value,
+                    #
+                    # plaintext would be used as is for encryption.
+                    #
+                    # Note that case (1) is expected when an `InfoTypeTransformation` is
+                    # applied to both structured and non-structured `ContentItem`s.
+                  "name": "A String", # Name describing the field.
+                },
+                "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                    # This annotation will be applied to the surrogate by prefixing it with
+                    # the name of the custom info type followed by the number of
+                    # characters comprising the surrogate. The following scheme defines the
+                    # format: <info type name>(<surrogate character count>):<surrogate>
+                    #
+                    # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                    # the surrogate is 'abc', the full replacement value
+                    # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                    #
+                    # This annotation identifies the surrogate when inspecting content using the
+                    # custom info type 'Surrogate'. This facilitates reversal of the
+                    # surrogate when it occurs in free text.
+                    #
+                    # In order for inspection to work properly, the name of this info type must
+                    # not occur naturally anywhere in your data; otherwise, inspection may either
+                    #
+                    # - reverse a surrogate that does not correspond to an actual identifier
+                    # - be unable to parse the surrogate and result in an error
+                    #
+                    # Therefore, choose your custom info type name carefully after considering
+                    # what your data looks like. One way to select a name that has a high chance
+                    # of yielding reliable detection is to include one or more unicode characters
+                    # that are highly improbable to exist in your data.
+                    # For example, assuming your data is entered from a regular ASCII keyboard,
+                    # the symbol with the hex code point 29DD might be used like so:
+                    # ⧝MY_TOKEN_TYPE
+                  "name": "A String", # Name of the information type. Either a name of your choosing when
+                      # creating a CustomInfoType, or one of the names listed
+                      # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                      # a built-in type. InfoType names should conform to the pattern
+                      # [a-zA-Z0-9_]{1,64}.
+                },
+              },
+              "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                  # Bucketing transformation can provide all of this functionality,
+                  # but requires more configuration. This message is provided as a convenience to
+                  # the user for simple bucketing strategies.
+                  #
+                  # The transformed value will be a hyphenated string of
+                  # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                  # all values that are within this bucket will be replaced with "10-20".
+                  #
+                  # This can be used on data of type: double, long.
+                  #
+                  # If the bound Value type differs from the type of data
+                  # being transformed, we will first attempt converting the type of the data to
+                  # be transformed to match the type of the bound before comparing.
+                  #
+                  # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                    # grouped together into a single bucket; for example if `lower_bound` = 10,
+                    # then all values less than 10 are replaced with the value “-10”. [Required].
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+                "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                    # grouped together into a single bucket; for example if `upper_bound` = 89,
+                    # then all values greater than 89 are replaced with the value “89+”.
+                    # [Required].
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+                "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                    # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                    # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                    # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+              },
+              "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+              },
+              "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                  # portion of the value.
+                "partToExtract": "A String",
+              },
+              "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                  # Uses SHA-256.
+                  # The key size must be either 32 or 64 bytes.
+                  # Outputs a base64 encoded representation of the hashed output
+                  # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                  # Currently, only string and integer values can be hashed.
+                  # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+              },
+              "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                  # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                  # to learn more.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                    # results in the same shift for the same context and crypto_key.
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                    # [Required]
+                "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                    # range (inclusive ends). Negative means shift to earlier in time. Must not
+                    # be more than 365250 days (1000 years) each direction.
+                    #
+                    # For example, 3 means shift date to at most 3 days into the future.
+                    # [Required]
+                "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                    # If set, must also set method. If set, shift will be consistent for the
+                    # given context.
+                  "name": "A String", # Name describing the field.
+                },
+              },
+              "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                  # replacement values are dynamically provided by the user for custom behavior,
+                  # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                  # This can be used on
+                  # data of type: number, long, string, timestamp.
+                  # If the bound `Value` type differs from the type of data being transformed, we
+                  # will first attempt converting the type of the data to be transformed to match
+                  # the type of the bound before comparing.
+                  # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                  { # Bucket is represented as a range, along with replacement values.
+                    "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                    "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                        # the default behavior will be to hyphenate the min-max range.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                    "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                        # used.
+                        # Note that for the purposes of inspection or transformation, the number
+                        # of bytes considered to comprise a 'Value' is based on its representation
+                        # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                        # 123456789, the number of bytes would be counted as 9, even though an
+                        # int64 only holds up to 8 bytes of data.
+                      "floatValue": 3.14,
+                      "timestampValue": "A String",
+                      "dayOfWeekValue": "A String",
+                      "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                          # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                          # types are google.type.Date and `google.protobuf.Timestamp`.
+                        "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                            # to allow the value "24:00:00" for scenarios like business closing time.
+                        "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                        "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                            # allow the value 60 if it allows leap-seconds.
+                        "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                      },
+                      "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                          # and time zone are either specified elsewhere or are not significant. The date
+                          # is relative to the Proleptic Gregorian Calendar. This can represent:
+                          #
+                          # * A full date, with non-zero year, month and day values
+                          # * A month and day value, with a zero year, e.g. an anniversary
+                          # * A year on its own, with zero month and day values
+                          # * A year and month value, with a zero day, e.g. a credit card expiration date
+                          #
+                          # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                        "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                            # a year.
+                        "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                            # if specifying a year by itself or a year and month where the day is not
+                            # significant.
+                        "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                            # month and day.
+                      },
+                      "stringValue": "A String",
+                      "booleanValue": True or False,
+                      "integerValue": "A String",
+                    },
+                  },
+                ],
+              },
+              "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                  # (FPE) with the FFX mode of operation; however when used in the
+                  # `ReidentifyContent` API method, it serves the opposite function by reversing
+                  # the surrogate back into the original identifier. The identifier must be
+                  # encoded as ASCII. For a given crypto key and context, the same identifier
+                  # will be replaced with the same surrogate. Identifiers must be at least two
+                  # characters long. In the case that the identifier is the empty string, it will
+                  # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                  # more.
+                  #
+                  # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                  # do not require preserving the input alphabet space and size, plus warrant
+                  # referential integrity.
+                "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                    # a key encryption key (KEK) stored by KMS).
+                    # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                    # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                    # unwrap the data crypto key.
+                  "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                      # The wrapped key must be a 128/192/256 bit key.
+                      # Authorization requires the following IAM permissions when sending a request
+                      # to perform a crypto transformation using a kms-wrapped crypto key:
+                      # dlp.kms.encrypt
+                    "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                    "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                  },
+                  "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                      # leaking the key. Choose another type of key if possible.
+                    "key": "A String", # A 128/192/256 bit key. [required]
+                  },
+                  "transient": { # Use this to have a random data crypto key generated.
+                      # It will be discarded after the request finishes.
+                    "name": "A String", # Name of the key. [required]
+                        # This is an arbitrary string used to differentiate different keys.
+                        # A unique key is generated per name: two separate `TransientCryptoKey`
+                        # protos share the same generated key if their names are the same.
+                        # When the data crypto key is generated, this name is not used in any way
+                        # (repeating the api call will result in a different key being generated).
+                  },
+                },
+                "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+                "commonAlphabet": "A String",
+                "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                    # that the FFX mode natively supports. This happens before/after
+                    # encryption/decryption.
+                    # Each character listed must appear only once.
+                    # Number of characters must be in the range [2, 62].
+                    # This must be encoded as ASCII.
+                    # The order of characters does not matter.
+                "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                    # identifier in two different contexts won't be given the same surrogate. If
+                    # the context is not set, a default tweak will be used.
+                    #
+                    # If the context is set but:
+                    #
+                    # 1. there is no record present when transforming a given value or
+                    # 1. the field is not present when transforming a given value,
+                    #
+                    # a default tweak will be used.
+                    #
+                    # Note that case (1) is expected when an `InfoTypeTransformation` is
+                    # applied to both structured and non-structured `ContentItem`s.
+                    # Currently, the referenced field may be of value type integer or string.
+                    #
+                    # The tweak is constructed as a sequence of bytes in big endian byte order
+                    # such that:
+                    #
+                    # - a 64 bit integer is encoded followed by a single byte of value 1
+                    # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                  "name": "A String", # Name describing the field.
+                },
+                "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                    # This annotation will be applied to the surrogate by prefixing it with
+                    # the name of the custom infoType followed by the number of
+                    # characters comprising the surrogate. The following scheme defines the
+                    # format: info_type_name(surrogate_character_count):surrogate
+                    #
+                    # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                    # the surrogate is 'abc', the full replacement value
+                    # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                    #
+                    # This annotation identifies the surrogate when inspecting content using the
+                    # custom infoType
+                    # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                    # This facilitates reversal of the surrogate when it occurs in free text.
+                    #
+                    # In order for inspection to work properly, the name of this infoType must
+                    # not occur naturally anywhere in your data; otherwise, inspection may
+                    # find a surrogate that does not correspond to an actual identifier.
+                    # Therefore, choose your custom infoType name carefully after considering
+                    # what your data looks like. One way to select a name that has a high chance
+                    # of yielding reliable detection is to include one or more unicode characters
+                    # that are highly improbable to exist in your data.
+                    # For example, assuming your data is entered from a regular ASCII keyboard,
+                    # the symbol with the hex code point 29DD might be used like so:
+                    # ⧝MY_TOKEN_TYPE
+                  "name": "A String", # Name of the information type. Either a name of your choosing when
+                      # creating a CustomInfoType, or one of the names listed
+                      # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                      # a built-in type. InfoType names should conform to the pattern
+                      # [a-zA-Z0-9_]{1,64}.
+                },
+              },
+              "replaceConfig": { # Replace each input value with a given `Value`.
+                "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                    # Note that for the purposes of inspection or transformation, the number
+                    # of bytes considered to comprise a 'Value' is based on its representation
+                    # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                    # 123456789, the number of bytes would be counted as 9, even though an
+                    # int64 only holds up to 8 bytes of data.
+                  "floatValue": 3.14,
+                  "timestampValue": "A String",
+                  "dayOfWeekValue": "A String",
+                  "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                      # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                      # types are google.type.Date and `google.protobuf.Timestamp`.
+                    "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                        # to allow the value "24:00:00" for scenarios like business closing time.
+                    "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                    "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                        # allow the value 60 if it allows leap-seconds.
+                    "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                  },
+                  "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                      # and time zone are either specified elsewhere or are not significant. The date
+                      # is relative to the Proleptic Gregorian Calendar. This can represent:
+                      #
+                      # * A full date, with non-zero year, month and day values
+                      # * A month and day value, with a zero year, e.g. an anniversary
+                      # * A year on its own, with zero month and day values
+                      # * A year and month value, with a zero day, e.g. a credit card expiration date
+                      #
+                      # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                    "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                        # a year.
+                    "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                        # if specifying a year by itself or a year and month where the day is not
+                        # significant.
+                    "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                        # month and day.
+                  },
+                  "stringValue": "A String",
+                  "booleanValue": True or False,
+                  "integerValue": "A String",
+                },
+              },
+            },
+            "condition": { # A condition for determining whether a transformation should be applied to # Only apply the transformation if the condition evaluates to true for the
+                # given `RecordCondition`. The conditions are allowed to reference fields
+                # that are not used in the actual transformation. [optional]
+                #
+                # Example Use Cases:
+                #
+                # - Apply a different bucket transformation to an age column if the zip code
+                # column for the same record is within a specific range.
+                # - Redact a field if the date of birth field is greater than 85.
+                # a field.
+              "expressions": { # An expression, consisting or an operator and conditions. # An expression.
+                "conditions": { # A collection of conditions.
+                  "conditions": [
+                    { # The field type of `value` and `field` do not need to match to be
+                        # considered equal, but not all comparisons are possible.
+                        # EQUAL_TO and NOT_EQUAL_TO attempt to compare even with incompatible types,
+                        # but all other comparisons are invalid with incompatible types.
+                        # A `value` of type:
+                        #
+                        # - `string` can be compared against all other types
+                        # - `boolean` can only be compared against other booleans
+                        # - `integer` can be compared against doubles or a string if the string value
+                        # can be parsed as an integer.
+                        # - `double` can be compared against integers or a string if the string can
+                        # be parsed as a double.
+                        # - `Timestamp` can be compared against strings in RFC 3339 date string
+                        # format.
+                        # - `TimeOfDay` can be compared against timestamps and strings in the format
+                        # of 'HH:mm:ss'.
+                        #
+                        # If we fail to compare do to type mismatch, a warning will be given and
+                        # the condition will evaluate to false.
+                      "operator": "A String", # Operator used to compare the field or infoType to the value. [required]
+                      "field": { # General identifier of a data field in a storage service. # Field within the record this condition is evaluated against. [required]
+                        "name": "A String", # Name describing the field.
+                      },
+                      "value": { # Set of primitive values supported by the system. # Value to compare against. [Required, except for `EXISTS` tests.]
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                    },
+                  ],
+                },
+                "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently
+                    # only supported value is `AND`.
+              },
+            },
+            "fields": [ # Input field(s) to apply the transformation to. [required]
+              { # General identifier of a data field in a storage service.
+                "name": "A String", # Name describing the field.
+              },
+            ],
+          },
+        ],
+      },
+    },
+    "reidentifyTemplateName": "A String", # Optional template to use. References an instance of `DeidentifyTemplate`.
+        # Any configuration directly specified in `reidentify_config` or
+        # `inspect_config` will override those set in the template. Singular fields
+        # that are set in this request will replace their corresponding fields in the
+        # template. Repeated fields are appended. Singular sub-messages and groups
+        # are recursively merged.
+    "inspectConfig": { # Configuration description of the scanning process. # Configuration for the inspector.
+        # When used with redactContent only info_types and min_likelihood are currently
+        # used.
+      "excludeInfoTypes": True or False, # When true, excludes type information of the findings.
+      "limits": {
+        "maxFindingsPerRequest": 42, # Max number of findings that will be returned per request/job.
+            # When set within `InspectContentRequest`, the maximum returned is 2000
+            # regardless if this is set higher.
+        "maxFindingsPerInfoType": [ # Configuration of findings limit given for specified infoTypes.
+          { # Max findings configuration per infoType, per content item or long
+              # running DlpJob.
+            "infoType": { # Type of information detected by the API. # Type of information the findings limit applies to. Only one limit per
+                # info_type should be provided. If InfoTypeLimit does not have an
+                # info_type, the DLP API applies the limit against all info_types that
+                # are found but not specified in another InfoTypeLimit.
+              "name": "A String", # Name of the information type. Either a name of your choosing when
+                  # creating a CustomInfoType, or one of the names listed
+                  # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                  # a built-in type. InfoType names should conform to the pattern
+                  # [a-zA-Z0-9_]{1,64}.
+            },
+            "maxFindings": 42, # Max findings limit for the given infoType.
+          },
+        ],
+        "maxFindingsPerItem": 42, # Max number of findings that will be returned for each item scanned.
+            # When set within `InspectDataSourceRequest`,
+            # the maximum returned is 2000 regardless if this is set higher.
+            # When set within `InspectContentRequest`, this field is ignored.
+      },
+      "minLikelihood": "A String", # Only returns findings equal or above this threshold. The default is
+          # POSSIBLE.
+          # See https://cloud.google.com/dlp/docs/likelihood to learn more.
+      "customInfoTypes": [ # CustomInfoTypes provided by the user. See
+          # https://cloud.google.com/dlp/docs/creating-custom-infotypes to learn more.
+        { # Custom information type provided by the user. Used to find domain-specific
+            # sensitive information configurable to the data in question.
+          "regex": { # Message defining a custom regular expression. # Regular expression based CustomInfoType.
+            "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                # google/re2 repository on GitHub.
+            "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                # specified, the entire match is returned. No more than 3 may be included.
+              42,
+            ],
+          },
+          "surrogateType": { # Message for detecting output from deidentification transformations # Message for detecting output from deidentification transformations that
+              # support reversing.
+              # such as
+              # [`CryptoReplaceFfxFpeConfig`](/dlp/docs/reference/rest/v2/organizations.deidentifyTemplates#cryptoreplaceffxfpeconfig).
+              # These types of transformations are
+              # those that perform pseudonymization, thereby producing a "surrogate" as
+              # output. This should be used in conjunction with a field on the
+              # transformation such as `surrogate_info_type`. This CustomInfoType does
+              # not support the use of `detection_rules`.
+          },
+          "infoType": { # Type of information detected by the API. # CustomInfoType can either be a new infoType, or an extension of built-in
+              # infoType, when the name matches one of existing infoTypes and that infoType
+              # is specified in `InspectContent.info_types` field. Specifying the latter
+              # adds findings to the one detected by the system. If built-in info type is
+              # not specified in `InspectContent.info_types` list then the name is treated
+              # as a custom info type.
+            "name": "A String", # Name of the information type. Either a name of your choosing when
+                # creating a CustomInfoType, or one of the names listed
+                # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                # a built-in type. InfoType names should conform to the pattern
+                # [a-zA-Z0-9_]{1,64}.
+          },
+          "dictionary": { # Custom information type based on a dictionary of words or phrases. This can # A list of phrases to detect as a CustomInfoType.
+              # be used to match sensitive information specific to the data, such as a list
+              # of employee IDs or job titles.
+              #
+              # Dictionary words are case-insensitive and all characters other than letters
+              # and digits in the unicode [Basic Multilingual
+              # Plane](https://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane)
+              # will be replaced with whitespace when scanning for matches, so the
+              # dictionary phrase "Sam Johnson" will match all three phrases "sam johnson",
+              # "Sam, Johnson", and "Sam (Johnson)". Additionally, the characters
+              # surrounding any match must be of a different type than the adjacent
+              # characters within the word, so letters must be next to non-letters and
+              # digits next to non-digits. For example, the dictionary word "jen" will
+              # match the first three letters of the text "jen123" but will return no
+              # matches for "jennifer".
+              #
+              # Dictionary words containing a large number of characters that are not
+              # letters or digits may result in unexpected findings because such characters
+              # are treated as whitespace. The
+              # [limits](https://cloud.google.com/dlp/limits) page contains details about
+              # the size limits of dictionaries. For dictionaries that do not fit within
+              # these constraints, consider using `LargeCustomDictionaryConfig` in the
+              # `StoredInfoType` API.
+            "wordList": { # Message defining a list of words or phrases to search for in the data. # List of words or phrases to search for.
+              "words": [ # Words or phrases defining the dictionary. The dictionary must contain
+                  # at least one phrase and every phrase must contain at least 2 characters
+                  # that are letters or digits. [required]
+                "A String",
+              ],
+            },
+            "cloudStoragePath": { # Message representing a single file or path in Cloud Storage. # Newline-delimited file of words in Cloud Storage. Only a single file
+                # is accepted.
+              "path": "A String", # A url representing a file or path (no wildcards) in Cloud Storage.
+                  # Example: gs://[BUCKET_NAME]/dictionary.txt
+            },
+          },
+          "storedType": { # A reference to a StoredInfoType to use with scanning. # Load an existing `StoredInfoType` resource for use in
+              # `InspectDataSource`. Not currently supported in `InspectContent`.
+            "name": "A String", # Resource name of the requested `StoredInfoType`, for example
+                # `organizations/433245324/storedInfoTypes/432452342` or
+                # `projects/project-id/storedInfoTypes/432452342`.
+            "createTime": "A String", # Timestamp indicating when the version of the `StoredInfoType` used for
+                # inspection was created. Output-only field, populated by the system.
+          },
+          "detectionRules": [ # Set of detection rules to apply to all findings of this CustomInfoType.
+              # Rules are applied in order that they are specified. Not supported for the
+              # `surrogate_type` CustomInfoType.
+            { # Deprecated; use `InspectionRuleSet` instead. Rule for modifying a
+                # `CustomInfoType` to alter behavior under certain circumstances, depending
+                # on the specific details of the rule. Not supported for the `surrogate_type`
+                # custom infoType.
+              "hotwordRule": { # The rule that adjusts the likelihood of findings within a certain # Hotword-based detection rule.
+                  # proximity of hotwords.
+                "proximity": { # Message for specifying a window around a finding to apply a detection # Proximity of the finding within which the entire hotword must reside.
+                    # The total length of the window cannot exceed 1000 characters. Note that
+                    # the finding itself will be included in the window, so that hotwords may
+                    # be used to match substrings of the finding itself. For example, the
+                    # certainty of a phone number regex "\(\d{3}\) \d{3}-\d{4}" could be
+                    # adjusted upwards if the area code is known to be the local area code of
+                    # a company office using the hotword regex "\(xxx\)", where "xxx"
+                    # is the area code in question.
+                    # rule.
+                  "windowAfter": 42, # Number of characters after the finding to consider.
+                  "windowBefore": 42, # Number of characters before the finding to consider.
+                },
+                "hotwordRegex": { # Message defining a custom regular expression. # Regular expression pattern defining what qualifies as a hotword.
+                  "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                      # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                      # google/re2 repository on GitHub.
+                  "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                      # specified, the entire match is returned. No more than 3 may be included.
+                    42,
+                  ],
+                },
+                "likelihoodAdjustment": { # Message for specifying an adjustment to the likelihood of a finding as # Likelihood adjustment to apply to all matching findings.
+                    # part of a detection rule.
+                  "relativeLikelihood": 42, # Increase or decrease the likelihood by the specified number of
+                      # levels. For example, if a finding would be `POSSIBLE` without the
+                      # detection rule and `relative_likelihood` is 1, then it is upgraded to
+                      # `LIKELY`, while a value of -1 would downgrade it to `UNLIKELY`.
+                      # Likelihood may never drop below `VERY_UNLIKELY` or exceed
+                      # `VERY_LIKELY`, so applying an adjustment of 1 followed by an
+                      # adjustment of -1 when base likelihood is `VERY_LIKELY` will result in
+                      # a final likelihood of `LIKELY`.
+                  "fixedLikelihood": "A String", # Set the likelihood of a finding to a fixed value.
+                },
+              },
+            },
+          ],
+          "exclusionType": "A String", # If set to EXCLUSION_TYPE_EXCLUDE this infoType will not cause a finding
+              # to be returned. It still can be used for rules matching.
+          "likelihood": "A String", # Likelihood to return for this CustomInfoType. This base value can be
+              # altered by a detection rule if the finding meets the criteria specified by
+              # the rule. Defaults to `VERY_LIKELY` if not specified.
+        },
+      ],
+      "includeQuote": True or False, # When true, a contextual quote from the data that triggered a finding is
+          # included in the response; see Finding.quote.
+      "ruleSet": [ # Set of rules to apply to the findings for this InspectConfig.
+          # Exclusion rules, contained in the set are executed in the end, other
+          # rules are executed in the order they are specified for each info type.
+        { # Rule set for modifying a set of infoTypes to alter behavior under certain
+            # circumstances, depending on the specific details of the rules within the set.
+          "rules": [ # Set of rules to be applied to infoTypes. The rules are applied in order.
+            { # A single inspection rule to be applied to infoTypes, specified in
+                # `InspectionRuleSet`.
+              "hotwordRule": { # The rule that adjusts the likelihood of findings within a certain # Hotword-based detection rule.
+                  # proximity of hotwords.
+                "proximity": { # Message for specifying a window around a finding to apply a detection # Proximity of the finding within which the entire hotword must reside.
+                    # The total length of the window cannot exceed 1000 characters. Note that
+                    # the finding itself will be included in the window, so that hotwords may
+                    # be used to match substrings of the finding itself. For example, the
+                    # certainty of a phone number regex "\(\d{3}\) \d{3}-\d{4}" could be
+                    # adjusted upwards if the area code is known to be the local area code of
+                    # a company office using the hotword regex "\(xxx\)", where "xxx"
+                    # is the area code in question.
+                    # rule.
+                  "windowAfter": 42, # Number of characters after the finding to consider.
+                  "windowBefore": 42, # Number of characters before the finding to consider.
+                },
+                "hotwordRegex": { # Message defining a custom regular expression. # Regular expression pattern defining what qualifies as a hotword.
+                  "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                      # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                      # google/re2 repository on GitHub.
+                  "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                      # specified, the entire match is returned. No more than 3 may be included.
+                    42,
+                  ],
+                },
+                "likelihoodAdjustment": { # Message for specifying an adjustment to the likelihood of a finding as # Likelihood adjustment to apply to all matching findings.
+                    # part of a detection rule.
+                  "relativeLikelihood": 42, # Increase or decrease the likelihood by the specified number of
+                      # levels. For example, if a finding would be `POSSIBLE` without the
+                      # detection rule and `relative_likelihood` is 1, then it is upgraded to
+                      # `LIKELY`, while a value of -1 would downgrade it to `UNLIKELY`.
+                      # Likelihood may never drop below `VERY_UNLIKELY` or exceed
+                      # `VERY_LIKELY`, so applying an adjustment of 1 followed by an
+                      # adjustment of -1 when base likelihood is `VERY_LIKELY` will result in
+                      # a final likelihood of `LIKELY`.
+                  "fixedLikelihood": "A String", # Set the likelihood of a finding to a fixed value.
+                },
+              },
+              "exclusionRule": { # The rule that specifies conditions when findings of infoTypes specified in # Exclusion rule.
+                  # `InspectionRuleSet` are removed from results.
+                "regex": { # Message defining a custom regular expression. # Regular expression which defines the rule.
+                  "pattern": "A String", # Pattern defining the regular expression. Its syntax
+                      # (https://github.com/google/re2/wiki/Syntax) can be found under the
+                      # google/re2 repository on GitHub.
+                  "groupIndexes": [ # The index of the submatch to extract as findings. When not
+                      # specified, the entire match is returned. No more than 3 may be included.
+                    42,
+                  ],
+                },
+                "excludeInfoTypes": { # List of exclude infoTypes. # Set of infoTypes for which findings would affect this rule.
+                  "infoTypes": [ # InfoType list in ExclusionRule rule drops a finding when it overlaps or
+                      # contained within with a finding of an infoType from this list. For
+                      # example, for `InspectionRuleSet.info_types` containing "PHONE_NUMBER"` and
+                      # `exclusion_rule` containing `exclude_info_types.info_types` with
+                      # "EMAIL_ADDRESS" the phone number findings are dropped if they overlap
+                      # with EMAIL_ADDRESS finding.
+                      # That leads to "555-222-2222@example.org" to generate only a single
+                      # finding, namely email address.
+                    { # Type of information detected by the API.
+                      "name": "A String", # Name of the information type. Either a name of your choosing when
+                          # creating a CustomInfoType, or one of the names listed
+                          # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                          # a built-in type. InfoType names should conform to the pattern
+                          # [a-zA-Z0-9_]{1,64}.
+                    },
+                  ],
+                },
+                "dictionary": { # Custom information type based on a dictionary of words or phrases. This can # Dictionary which defines the rule.
+                    # be used to match sensitive information specific to the data, such as a list
+                    # of employee IDs or job titles.
+                    #
+                    # Dictionary words are case-insensitive and all characters other than letters
+                    # and digits in the unicode [Basic Multilingual
+                    # Plane](https://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane)
+                    # will be replaced with whitespace when scanning for matches, so the
+                    # dictionary phrase "Sam Johnson" will match all three phrases "sam johnson",
+                    # "Sam, Johnson", and "Sam (Johnson)". Additionally, the characters
+                    # surrounding any match must be of a different type than the adjacent
+                    # characters within the word, so letters must be next to non-letters and
+                    # digits next to non-digits. For example, the dictionary word "jen" will
+                    # match the first three letters of the text "jen123" but will return no
+                    # matches for "jennifer".
+                    #
+                    # Dictionary words containing a large number of characters that are not
+                    # letters or digits may result in unexpected findings because such characters
+                    # are treated as whitespace. The
+                    # [limits](https://cloud.google.com/dlp/limits) page contains details about
+                    # the size limits of dictionaries. For dictionaries that do not fit within
+                    # these constraints, consider using `LargeCustomDictionaryConfig` in the
+                    # `StoredInfoType` API.
+                  "wordList": { # Message defining a list of words or phrases to search for in the data. # List of words or phrases to search for.
+                    "words": [ # Words or phrases defining the dictionary. The dictionary must contain
+                        # at least one phrase and every phrase must contain at least 2 characters
+                        # that are letters or digits. [required]
+                      "A String",
+                    ],
+                  },
+                  "cloudStoragePath": { # Message representing a single file or path in Cloud Storage. # Newline-delimited file of words in Cloud Storage. Only a single file
+                      # is accepted.
+                    "path": "A String", # A url representing a file or path (no wildcards) in Cloud Storage.
+                        # Example: gs://[BUCKET_NAME]/dictionary.txt
+                  },
+                },
+                "matchingType": "A String", # How the rule is applied, see MatchingType documentation for details.
+              },
+            },
+          ],
+          "infoTypes": [ # List of infoTypes this rule set is applied to.
+            { # Type of information detected by the API.
+              "name": "A String", # Name of the information type. Either a name of your choosing when
+                  # creating a CustomInfoType, or one of the names listed
+                  # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                  # a built-in type. InfoType names should conform to the pattern
+                  # [a-zA-Z0-9_]{1,64}.
+            },
+          ],
+        },
+      ],
+      "contentOptions": [ # List of options defining data content to scan.
+          # If empty, text, images, and other content will be included.
+        "A String",
+      ],
+      "infoTypes": [ # Restricts what info_types to look for. The values must correspond to
+          # InfoType values returned by ListInfoTypes or listed at
+          # https://cloud.google.com/dlp/docs/infotypes-reference.
+          #
+          # When no InfoTypes or CustomInfoTypes are specified in a request, the
+          # system may automatically choose what detectors to run. By default this may
+          # be all types, but may change over time as detectors are updated.
+          #
+          # The special InfoType name "ALL_BASIC" can be used to trigger all detectors,
+          # but may change over time as new InfoTypes are added. If you need precise
+          # control and predictability as to what detectors are run you should specify
+          # specific InfoTypes listed in the reference.
+        { # Type of information detected by the API.
+          "name": "A String", # Name of the information type. Either a name of your choosing when
+              # creating a CustomInfoType, or one of the names listed
+              # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+              # a built-in type. InfoType names should conform to the pattern
+              # [a-zA-Z0-9_]{1,64}.
+        },
+      ],
+    },
+    "inspectTemplateName": "A String", # Optional template to use. Any configuration directly specified in
+        # `inspect_config` will override those set in the template. Singular fields
+        # that are set in this request will replace their corresponding fields in the
+        # template. Repeated fields are appended. Singular sub-messages and groups
+        # are recursively merged.
+    "item": { # Container structure for the content to inspect. # The item to re-identify. Will be treated as text.
+      "table": { # Structured content to inspect. Up to 50,000 `Value`s per request allowed. # Structured content for inspection. See
+          # https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
+          # learn more.
+          # See https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
+          # learn more.
+        "headers": [
+          { # General identifier of a data field in a storage service.
+            "name": "A String", # Name describing the field.
+          },
+        ],
+        "rows": [
+          {
+            "values": [
+              { # Set of primitive values supported by the system.
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+            ],
+          },
+        ],
+      },
+      "byteItem": { # Container for bytes to inspect or redact. # Content data to inspect or redact. Replaces `type` and `data`.
+        "type": "A String", # The type of data stored in the bytes string. Default will be TEXT_UTF8.
+        "data": "A String", # Content data to inspect or redact.
+      },
+      "value": "A String", # String data to inspect or redact.
+    },
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Results of re-identifying a item.
+    "overview": { # Overview of the modifications that occurred. # An overview of the changes that were made to the `item`.
+      "transformationSummaries": [ # Transformations applied to the dataset.
+        { # Summary of a single transformation.
+            # Only one of 'transformation', 'field_transformation', or 'record_suppress'
+            # will be set.
+          "infoType": { # Type of information detected by the API. # Set if the transformation was limited to a specific InfoType.
+            "name": "A String", # Name of the information type. Either a name of your choosing when
+                # creating a CustomInfoType, or one of the names listed
+                # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                # a built-in type. InfoType names should conform to the pattern
+                # [a-zA-Z0-9_]{1,64}.
+          },
+          "recordSuppress": { # Configuration to suppress records whose suppression conditions evaluate to # The specific suppression option these stats apply to.
+              # true.
+            "condition": { # A condition for determining whether a transformation should be applied to # A condition that when it evaluates to true will result in the record being
+                # evaluated to be suppressed from the transformed content.
+                # a field.
+              "expressions": { # An expression, consisting or an operator and conditions. # An expression.
+                "conditions": { # A collection of conditions.
+                  "conditions": [
+                    { # The field type of `value` and `field` do not need to match to be
+                        # considered equal, but not all comparisons are possible.
+                        # EQUAL_TO and NOT_EQUAL_TO attempt to compare even with incompatible types,
+                        # but all other comparisons are invalid with incompatible types.
+                        # A `value` of type:
+                        #
+                        # - `string` can be compared against all other types
+                        # - `boolean` can only be compared against other booleans
+                        # - `integer` can be compared against doubles or a string if the string value
+                        # can be parsed as an integer.
+                        # - `double` can be compared against integers or a string if the string can
+                        # be parsed as a double.
+                        # - `Timestamp` can be compared against strings in RFC 3339 date string
+                        # format.
+                        # - `TimeOfDay` can be compared against timestamps and strings in the format
+                        # of 'HH:mm:ss'.
+                        #
+                        # If we fail to compare do to type mismatch, a warning will be given and
+                        # the condition will evaluate to false.
+                      "operator": "A String", # Operator used to compare the field or infoType to the value. [required]
+                      "field": { # General identifier of a data field in a storage service. # Field within the record this condition is evaluated against. [required]
+                        "name": "A String", # Name describing the field.
+                      },
+                      "value": { # Set of primitive values supported by the system. # Value to compare against. [Required, except for `EXISTS` tests.]
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                    },
+                  ],
+                },
+                "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently
+                    # only supported value is `AND`.
+              },
+            },
+          },
+          "results": [
+            { # A collection that informs the user the number of times a particular
+                # `TransformationResultCode` and error details occurred.
+              "count": "A String",
+              "code": "A String",
+              "details": "A String", # A place for warnings or errors to show up if a transformation didn't
+                  # work as expected.
+            },
+          ],
+          "field": { # General identifier of a data field in a storage service. # Set if the transformation was limited to a specific FieldId.
+            "name": "A String", # Name describing the field.
+          },
+          "fieldTransformations": [ # The field transformation that was applied.
+              # If multiple field transformations are requested for a single field,
+              # this list will contain all of them; otherwise, only one is supplied.
+            { # The transformation to apply to the field.
+              "infoTypeTransformations": { # A type of transformation that will scan unstructured text and # Treat the contents of the field as free text, and selectively
+                  # transform content that matches an `InfoType`.
+                  # apply various `PrimitiveTransformation`s to each finding, where the
+                  # transformation is applied to only values that were identified as a specific
+                  # info_type.
+                "transformations": [ # Transformation for each infoType. Cannot specify more than one
+                    # for a given infoType. [required]
+                  { # A transformation to apply to text that is identified as a specific
+                      # info_type.
+                    "primitiveTransformation": { # A rule for transforming a value. # Primitive transformation to apply to the infoType. [required]
+                      "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                          # fixed character. Masking can start from the beginning or end of the string.
+                          # This can be used on data of any type (numbers, longs, and so on) and when
+                          # de-identifying structured data we'll attempt to preserve the original data's
+                          # type. (This allows you to take a long like 123 and modify it to a string like
+                          # **3.
+                        "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                            # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                            # mask 5 chars with * we would produce ***-*55-5555.
+                          { # Characters to skip when doing deidentification of a value. These will be left
+                              # alone and skipped.
+                            "commonCharactersToIgnore": "A String",
+                            "charactersToSkip": "A String",
+                          },
+                        ],
+                        "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                            # masked. Skipped characters do not count towards this tally.
+                        "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                            # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                            # code or credit card number. String must have length 1. If not supplied, we
+                            # will default to "*" for strings, 0 for digits.
+                        "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                            # '0', number_to_mask is 14, and `reverse_order` is false, then
+                            # 1234-5678-9012-3456 -> 00000000000000-3456
+                            # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                            # is true, then 12345 -> 12***
+                      },
+                      "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                          # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                          # output would be 'My phone number is '.
+                      },
+                      "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                          # input. Outputs a base64 encoded representation of the encrypted output.
+                          # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+                        "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                            # a key encryption key (KEK) stored by KMS).
+                            # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                            # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                            # unwrap the data crypto key.
+                          "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                              # The wrapped key must be a 128/192/256 bit key.
+                              # Authorization requires the following IAM permissions when sending a request
+                              # to perform a crypto transformation using a kms-wrapped crypto key:
+                              # dlp.kms.encrypt
+                            "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                            "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                          },
+                          "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                              # leaking the key. Choose another type of key if possible.
+                            "key": "A String", # A 128/192/256 bit key. [required]
+                          },
+                          "transient": { # Use this to have a random data crypto key generated.
+                              # It will be discarded after the request finishes.
+                            "name": "A String", # Name of the key. [required]
+                                # This is an arbitrary string used to differentiate different keys.
+                                # A unique key is generated per name: two separate `TransientCryptoKey`
+                                # protos share the same generated key if their names are the same.
+                                # When the data crypto key is generated, this name is not used in any way
+                                # (repeating the api call will result in a different key being generated).
+                          },
+                        },
+                        "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                            # referential integrity such that the same identifier in two different
+                            # contexts will be given a distinct surrogate. The context is appended to
+                            # plaintext value being encrypted. On decryption the provided context is
+                            # validated against the value used during encryption. If a context was
+                            # provided during encryption, same context must be provided during decryption
+                            # as well.
+                            #
+                            # If the context is not set, plaintext would be used as is for encryption.
+                            # If the context is set but:
+                            #
+                            # 1. there is no record present when transforming a given value or
+                            # 2. the field is not present when transforming a given value,
+                            #
+                            # plaintext would be used as is for encryption.
+                            #
+                            # Note that case (1) is expected when an `InfoTypeTransformation` is
+                            # applied to both structured and non-structured `ContentItem`s.
+                          "name": "A String", # Name describing the field.
+                        },
+                        "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                            # This annotation will be applied to the surrogate by prefixing it with
+                            # the name of the custom info type followed by the number of
+                            # characters comprising the surrogate. The following scheme defines the
+                            # format: <info type name>(<surrogate character count>):<surrogate>
+                            #
+                            # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                            # the surrogate is 'abc', the full replacement value
+                            # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                            #
+                            # This annotation identifies the surrogate when inspecting content using the
+                            # custom info type 'Surrogate'. This facilitates reversal of the
+                            # surrogate when it occurs in free text.
+                            #
+                            # In order for inspection to work properly, the name of this info type must
+                            # not occur naturally anywhere in your data; otherwise, inspection may either
+                            #
+                            # - reverse a surrogate that does not correspond to an actual identifier
+                            # - be unable to parse the surrogate and result in an error
+                            #
+                            # Therefore, choose your custom info type name carefully after considering
+                            # what your data looks like. One way to select a name that has a high chance
+                            # of yielding reliable detection is to include one or more unicode characters
+                            # that are highly improbable to exist in your data.
+                            # For example, assuming your data is entered from a regular ASCII keyboard,
+                            # the symbol with the hex code point 29DD might be used like so:
+                            # ⧝MY_TOKEN_TYPE
+                          "name": "A String", # Name of the information type. Either a name of your choosing when
+                              # creating a CustomInfoType, or one of the names listed
+                              # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                              # a built-in type. InfoType names should conform to the pattern
+                              # [a-zA-Z0-9_]{1,64}.
+                        },
+                      },
+                      "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                          # Bucketing transformation can provide all of this functionality,
+                          # but requires more configuration. This message is provided as a convenience to
+                          # the user for simple bucketing strategies.
+                          #
+                          # The transformed value will be a hyphenated string of
+                          # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                          # all values that are within this bucket will be replaced with "10-20".
+                          #
+                          # This can be used on data of type: double, long.
+                          #
+                          # If the bound Value type differs from the type of data
+                          # being transformed, we will first attempt converting the type of the data to
+                          # be transformed to match the type of the bound before comparing.
+                          #
+                          # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                        "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                            # grouped together into a single bucket; for example if `lower_bound` = 10,
+                            # then all values less than 10 are replaced with the value “-10”. [Required].
+                            # Note that for the purposes of inspection or transformation, the number
+                            # of bytes considered to comprise a 'Value' is based on its representation
+                            # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                            # 123456789, the number of bytes would be counted as 9, even though an
+                            # int64 only holds up to 8 bytes of data.
+                          "floatValue": 3.14,
+                          "timestampValue": "A String",
+                          "dayOfWeekValue": "A String",
+                          "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                              # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                              # types are google.type.Date and `google.protobuf.Timestamp`.
+                            "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                # to allow the value "24:00:00" for scenarios like business closing time.
+                            "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                            "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                # allow the value 60 if it allows leap-seconds.
+                            "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                          },
+                          "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                              # and time zone are either specified elsewhere or are not significant. The date
+                              # is relative to the Proleptic Gregorian Calendar. This can represent:
+                              #
+                              # * A full date, with non-zero year, month and day values
+                              # * A month and day value, with a zero year, e.g. an anniversary
+                              # * A year on its own, with zero month and day values
+                              # * A year and month value, with a zero day, e.g. a credit card expiration date
+                              #
+                              # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                            "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                # a year.
+                            "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                # if specifying a year by itself or a year and month where the day is not
+                                # significant.
+                            "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                # month and day.
+                          },
+                          "stringValue": "A String",
+                          "booleanValue": True or False,
+                          "integerValue": "A String",
+                        },
+                        "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                            # grouped together into a single bucket; for example if `upper_bound` = 89,
+                            # then all values greater than 89 are replaced with the value “89+”.
+                            # [Required].
+                            # Note that for the purposes of inspection or transformation, the number
+                            # of bytes considered to comprise a 'Value' is based on its representation
+                            # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                            # 123456789, the number of bytes would be counted as 9, even though an
+                            # int64 only holds up to 8 bytes of data.
+                          "floatValue": 3.14,
+                          "timestampValue": "A String",
+                          "dayOfWeekValue": "A String",
+                          "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                              # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                              # types are google.type.Date and `google.protobuf.Timestamp`.
+                            "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                # to allow the value "24:00:00" for scenarios like business closing time.
+                            "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                            "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                # allow the value 60 if it allows leap-seconds.
+                            "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                          },
+                          "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                              # and time zone are either specified elsewhere or are not significant. The date
+                              # is relative to the Proleptic Gregorian Calendar. This can represent:
+                              #
+                              # * A full date, with non-zero year, month and day values
+                              # * A month and day value, with a zero year, e.g. an anniversary
+                              # * A year on its own, with zero month and day values
+                              # * A year and month value, with a zero day, e.g. a credit card expiration date
+                              #
+                              # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                            "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                # a year.
+                            "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                # if specifying a year by itself or a year and month where the day is not
+                                # significant.
+                            "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                # month and day.
+                          },
+                          "stringValue": "A String",
+                          "booleanValue": True or False,
+                          "integerValue": "A String",
+                        },
+                        "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                            # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                            # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                            # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+                      },
+                      "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+                      },
+                      "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                          # portion of the value.
+                        "partToExtract": "A String",
+                      },
+                      "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                          # Uses SHA-256.
+                          # The key size must be either 32 or 64 bytes.
+                          # Outputs a base64 encoded representation of the hashed output
+                          # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                          # Currently, only string and integer values can be hashed.
+                          # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+                        "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                            # a key encryption key (KEK) stored by KMS).
+                            # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                            # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                            # unwrap the data crypto key.
+                          "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                              # The wrapped key must be a 128/192/256 bit key.
+                              # Authorization requires the following IAM permissions when sending a request
+                              # to perform a crypto transformation using a kms-wrapped crypto key:
+                              # dlp.kms.encrypt
+                            "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                            "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                          },
+                          "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                              # leaking the key. Choose another type of key if possible.
+                            "key": "A String", # A 128/192/256 bit key. [required]
+                          },
+                          "transient": { # Use this to have a random data crypto key generated.
+                              # It will be discarded after the request finishes.
+                            "name": "A String", # Name of the key. [required]
+                                # This is an arbitrary string used to differentiate different keys.
+                                # A unique key is generated per name: two separate `TransientCryptoKey`
+                                # protos share the same generated key if their names are the same.
+                                # When the data crypto key is generated, this name is not used in any way
+                                # (repeating the api call will result in a different key being generated).
+                          },
+                        },
+                      },
+                      "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                          # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                          # to learn more.
+                        "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                            # results in the same shift for the same context and crypto_key.
+                            # a key encryption key (KEK) stored by KMS).
+                            # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                            # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                            # unwrap the data crypto key.
+                          "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                              # The wrapped key must be a 128/192/256 bit key.
+                              # Authorization requires the following IAM permissions when sending a request
+                              # to perform a crypto transformation using a kms-wrapped crypto key:
+                              # dlp.kms.encrypt
+                            "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                            "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                          },
+                          "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                              # leaking the key. Choose another type of key if possible.
+                            "key": "A String", # A 128/192/256 bit key. [required]
+                          },
+                          "transient": { # Use this to have a random data crypto key generated.
+                              # It will be discarded after the request finishes.
+                            "name": "A String", # Name of the key. [required]
+                                # This is an arbitrary string used to differentiate different keys.
+                                # A unique key is generated per name: two separate `TransientCryptoKey`
+                                # protos share the same generated key if their names are the same.
+                                # When the data crypto key is generated, this name is not used in any way
+                                # (repeating the api call will result in a different key being generated).
+                          },
+                        },
+                        "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                            # [Required]
+                        "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                            # range (inclusive ends). Negative means shift to earlier in time. Must not
+                            # be more than 365250 days (1000 years) each direction.
+                            #
+                            # For example, 3 means shift date to at most 3 days into the future.
+                            # [Required]
+                        "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                            # If set, must also set method. If set, shift will be consistent for the
+                            # given context.
+                          "name": "A String", # Name describing the field.
+                        },
+                      },
+                      "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                          # replacement values are dynamically provided by the user for custom behavior,
+                          # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                          # This can be used on
+                          # data of type: number, long, string, timestamp.
+                          # If the bound `Value` type differs from the type of data being transformed, we
+                          # will first attempt converting the type of the data to be transformed to match
+                          # the type of the bound before comparing.
+                          # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                        "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                          { # Bucket is represented as a range, along with replacement values.
+                            "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                                # Note that for the purposes of inspection or transformation, the number
+                                # of bytes considered to comprise a 'Value' is based on its representation
+                                # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                                # 123456789, the number of bytes would be counted as 9, even though an
+                                # int64 only holds up to 8 bytes of data.
+                              "floatValue": 3.14,
+                              "timestampValue": "A String",
+                              "dayOfWeekValue": "A String",
+                              "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                  # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                  # types are google.type.Date and `google.protobuf.Timestamp`.
+                                "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                    # to allow the value "24:00:00" for scenarios like business closing time.
+                                "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                                "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                    # allow the value 60 if it allows leap-seconds.
+                                "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                              },
+                              "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                  # and time zone are either specified elsewhere or are not significant. The date
+                                  # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                  #
+                                  # * A full date, with non-zero year, month and day values
+                                  # * A month and day value, with a zero year, e.g. an anniversary
+                                  # * A year on its own, with zero month and day values
+                                  # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                  #
+                                  # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                                "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                    # a year.
+                                "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                    # if specifying a year by itself or a year and month where the day is not
+                                    # significant.
+                                "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                    # month and day.
+                              },
+                              "stringValue": "A String",
+                              "booleanValue": True or False,
+                              "integerValue": "A String",
+                            },
+                            "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                                # the default behavior will be to hyphenate the min-max range.
+                                # Note that for the purposes of inspection or transformation, the number
+                                # of bytes considered to comprise a 'Value' is based on its representation
+                                # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                                # 123456789, the number of bytes would be counted as 9, even though an
+                                # int64 only holds up to 8 bytes of data.
+                              "floatValue": 3.14,
+                              "timestampValue": "A String",
+                              "dayOfWeekValue": "A String",
+                              "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                  # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                  # types are google.type.Date and `google.protobuf.Timestamp`.
+                                "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                    # to allow the value "24:00:00" for scenarios like business closing time.
+                                "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                                "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                    # allow the value 60 if it allows leap-seconds.
+                                "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                              },
+                              "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                  # and time zone are either specified elsewhere or are not significant. The date
+                                  # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                  #
+                                  # * A full date, with non-zero year, month and day values
+                                  # * A month and day value, with a zero year, e.g. an anniversary
+                                  # * A year on its own, with zero month and day values
+                                  # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                  #
+                                  # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                                "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                    # a year.
+                                "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                    # if specifying a year by itself or a year and month where the day is not
+                                    # significant.
+                                "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                    # month and day.
+                              },
+                              "stringValue": "A String",
+                              "booleanValue": True or False,
+                              "integerValue": "A String",
+                            },
+                            "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                                # used.
+                                # Note that for the purposes of inspection or transformation, the number
+                                # of bytes considered to comprise a 'Value' is based on its representation
+                                # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                                # 123456789, the number of bytes would be counted as 9, even though an
+                                # int64 only holds up to 8 bytes of data.
+                              "floatValue": 3.14,
+                              "timestampValue": "A String",
+                              "dayOfWeekValue": "A String",
+                              "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                                  # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                                  # types are google.type.Date and `google.protobuf.Timestamp`.
+                                "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                    # to allow the value "24:00:00" for scenarios like business closing time.
+                                "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                                "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                    # allow the value 60 if it allows leap-seconds.
+                                "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                              },
+                              "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                                  # and time zone are either specified elsewhere or are not significant. The date
+                                  # is relative to the Proleptic Gregorian Calendar. This can represent:
+                                  #
+                                  # * A full date, with non-zero year, month and day values
+                                  # * A month and day value, with a zero year, e.g. an anniversary
+                                  # * A year on its own, with zero month and day values
+                                  # * A year and month value, with a zero day, e.g. a credit card expiration date
+                                  #
+                                  # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                                "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                    # a year.
+                                "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                    # if specifying a year by itself or a year and month where the day is not
+                                    # significant.
+                                "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                    # month and day.
+                              },
+                              "stringValue": "A String",
+                              "booleanValue": True or False,
+                              "integerValue": "A String",
+                            },
+                          },
+                        ],
+                      },
+                      "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                          # (FPE) with the FFX mode of operation; however when used in the
+                          # `ReidentifyContent` API method, it serves the opposite function by reversing
+                          # the surrogate back into the original identifier. The identifier must be
+                          # encoded as ASCII. For a given crypto key and context, the same identifier
+                          # will be replaced with the same surrogate. Identifiers must be at least two
+                          # characters long. In the case that the identifier is the empty string, it will
+                          # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                          # more.
+                          #
+                          # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                          # do not require preserving the input alphabet space and size, plus warrant
+                          # referential integrity.
+                        "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                            # a key encryption key (KEK) stored by KMS).
+                            # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                            # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                            # unwrap the data crypto key.
+                          "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                              # The wrapped key must be a 128/192/256 bit key.
+                              # Authorization requires the following IAM permissions when sending a request
+                              # to perform a crypto transformation using a kms-wrapped crypto key:
+                              # dlp.kms.encrypt
+                            "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                            "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                          },
+                          "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                              # leaking the key. Choose another type of key if possible.
+                            "key": "A String", # A 128/192/256 bit key. [required]
+                          },
+                          "transient": { # Use this to have a random data crypto key generated.
+                              # It will be discarded after the request finishes.
+                            "name": "A String", # Name of the key. [required]
+                                # This is an arbitrary string used to differentiate different keys.
+                                # A unique key is generated per name: two separate `TransientCryptoKey`
+                                # protos share the same generated key if their names are the same.
+                                # When the data crypto key is generated, this name is not used in any way
+                                # (repeating the api call will result in a different key being generated).
+                          },
+                        },
+                        "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+                        "commonAlphabet": "A String",
+                        "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                            # that the FFX mode natively supports. This happens before/after
+                            # encryption/decryption.
+                            # Each character listed must appear only once.
+                            # Number of characters must be in the range [2, 62].
+                            # This must be encoded as ASCII.
+                            # The order of characters does not matter.
+                        "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                            # identifier in two different contexts won't be given the same surrogate. If
+                            # the context is not set, a default tweak will be used.
+                            #
+                            # If the context is set but:
+                            #
+                            # 1. there is no record present when transforming a given value or
+                            # 1. the field is not present when transforming a given value,
+                            #
+                            # a default tweak will be used.
+                            #
+                            # Note that case (1) is expected when an `InfoTypeTransformation` is
+                            # applied to both structured and non-structured `ContentItem`s.
+                            # Currently, the referenced field may be of value type integer or string.
+                            #
+                            # The tweak is constructed as a sequence of bytes in big endian byte order
+                            # such that:
+                            #
+                            # - a 64 bit integer is encoded followed by a single byte of value 1
+                            # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                          "name": "A String", # Name describing the field.
+                        },
+                        "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                            # This annotation will be applied to the surrogate by prefixing it with
+                            # the name of the custom infoType followed by the number of
+                            # characters comprising the surrogate. The following scheme defines the
+                            # format: info_type_name(surrogate_character_count):surrogate
+                            #
+                            # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                            # the surrogate is 'abc', the full replacement value
+                            # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                            #
+                            # This annotation identifies the surrogate when inspecting content using the
+                            # custom infoType
+                            # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                            # This facilitates reversal of the surrogate when it occurs in free text.
+                            #
+                            # In order for inspection to work properly, the name of this infoType must
+                            # not occur naturally anywhere in your data; otherwise, inspection may
+                            # find a surrogate that does not correspond to an actual identifier.
+                            # Therefore, choose your custom infoType name carefully after considering
+                            # what your data looks like. One way to select a name that has a high chance
+                            # of yielding reliable detection is to include one or more unicode characters
+                            # that are highly improbable to exist in your data.
+                            # For example, assuming your data is entered from a regular ASCII keyboard,
+                            # the symbol with the hex code point 29DD might be used like so:
+                            # ⧝MY_TOKEN_TYPE
+                          "name": "A String", # Name of the information type. Either a name of your choosing when
+                              # creating a CustomInfoType, or one of the names listed
+                              # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                              # a built-in type. InfoType names should conform to the pattern
+                              # [a-zA-Z0-9_]{1,64}.
+                        },
+                      },
+                      "replaceConfig": { # Replace each input value with a given `Value`.
+                        "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                            # Note that for the purposes of inspection or transformation, the number
+                            # of bytes considered to comprise a 'Value' is based on its representation
+                            # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                            # 123456789, the number of bytes would be counted as 9, even though an
+                            # int64 only holds up to 8 bytes of data.
+                          "floatValue": 3.14,
+                          "timestampValue": "A String",
+                          "dayOfWeekValue": "A String",
+                          "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                              # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                              # types are google.type.Date and `google.protobuf.Timestamp`.
+                            "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                # to allow the value "24:00:00" for scenarios like business closing time.
+                            "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                            "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                # allow the value 60 if it allows leap-seconds.
+                            "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                          },
+                          "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                              # and time zone are either specified elsewhere or are not significant. The date
+                              # is relative to the Proleptic Gregorian Calendar. This can represent:
+                              #
+                              # * A full date, with non-zero year, month and day values
+                              # * A month and day value, with a zero year, e.g. an anniversary
+                              # * A year on its own, with zero month and day values
+                              # * A year and month value, with a zero day, e.g. a credit card expiration date
+                              #
+                              # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                            "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                # a year.
+                            "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                # if specifying a year by itself or a year and month where the day is not
+                                # significant.
+                            "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                # month and day.
+                          },
+                          "stringValue": "A String",
+                          "booleanValue": True or False,
+                          "integerValue": "A String",
+                        },
+                      },
+                    },
+                    "infoTypes": [ # InfoTypes to apply the transformation to. An empty list will cause
+                        # this transformation to apply to all findings that correspond to
+                        # infoTypes that were requested in `InspectConfig`.
+                      { # Type of information detected by the API.
+                        "name": "A String", # Name of the information type. Either a name of your choosing when
+                            # creating a CustomInfoType, or one of the names listed
+                            # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                            # a built-in type. InfoType names should conform to the pattern
+                            # [a-zA-Z0-9_]{1,64}.
+                      },
+                    ],
+                  },
+                ],
+              },
+              "primitiveTransformation": { # A rule for transforming a value. # Apply the transformation to the entire field.
+                "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                    # fixed character. Masking can start from the beginning or end of the string.
+                    # This can be used on data of any type (numbers, longs, and so on) and when
+                    # de-identifying structured data we'll attempt to preserve the original data's
+                    # type. (This allows you to take a long like 123 and modify it to a string like
+                    # **3.
+                  "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                      # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                      # mask 5 chars with * we would produce ***-*55-5555.
+                    { # Characters to skip when doing deidentification of a value. These will be left
+                        # alone and skipped.
+                      "commonCharactersToIgnore": "A String",
+                      "charactersToSkip": "A String",
+                    },
+                  ],
+                  "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                      # masked. Skipped characters do not count towards this tally.
+                  "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                      # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                      # code or credit card number. String must have length 1. If not supplied, we
+                      # will default to "*" for strings, 0 for digits.
+                  "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                      # '0', number_to_mask is 14, and `reverse_order` is false, then
+                      # 1234-5678-9012-3456 -> 00000000000000-3456
+                      # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                      # is true, then 12345 -> 12***
+                },
+                "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                    # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                    # output would be 'My phone number is '.
+                },
+                "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                    # input. Outputs a base64 encoded representation of the encrypted output.
+                    # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+                  "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                      # a key encryption key (KEK) stored by KMS).
+                      # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                      # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                      # unwrap the data crypto key.
+                    "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                        # The wrapped key must be a 128/192/256 bit key.
+                        # Authorization requires the following IAM permissions when sending a request
+                        # to perform a crypto transformation using a kms-wrapped crypto key:
+                        # dlp.kms.encrypt
+                      "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                      "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                    },
+                    "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                        # leaking the key. Choose another type of key if possible.
+                      "key": "A String", # A 128/192/256 bit key. [required]
+                    },
+                    "transient": { # Use this to have a random data crypto key generated.
+                        # It will be discarded after the request finishes.
+                      "name": "A String", # Name of the key. [required]
+                          # This is an arbitrary string used to differentiate different keys.
+                          # A unique key is generated per name: two separate `TransientCryptoKey`
+                          # protos share the same generated key if their names are the same.
+                          # When the data crypto key is generated, this name is not used in any way
+                          # (repeating the api call will result in a different key being generated).
+                    },
+                  },
+                  "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                      # referential integrity such that the same identifier in two different
+                      # contexts will be given a distinct surrogate. The context is appended to
+                      # plaintext value being encrypted. On decryption the provided context is
+                      # validated against the value used during encryption. If a context was
+                      # provided during encryption, same context must be provided during decryption
+                      # as well.
+                      #
+                      # If the context is not set, plaintext would be used as is for encryption.
+                      # If the context is set but:
+                      #
+                      # 1. there is no record present when transforming a given value or
+                      # 2. the field is not present when transforming a given value,
+                      #
+                      # plaintext would be used as is for encryption.
+                      #
+                      # Note that case (1) is expected when an `InfoTypeTransformation` is
+                      # applied to both structured and non-structured `ContentItem`s.
+                    "name": "A String", # Name describing the field.
+                  },
+                  "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                      # This annotation will be applied to the surrogate by prefixing it with
+                      # the name of the custom info type followed by the number of
+                      # characters comprising the surrogate. The following scheme defines the
+                      # format: <info type name>(<surrogate character count>):<surrogate>
+                      #
+                      # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                      # the surrogate is 'abc', the full replacement value
+                      # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                      #
+                      # This annotation identifies the surrogate when inspecting content using the
+                      # custom info type 'Surrogate'. This facilitates reversal of the
+                      # surrogate when it occurs in free text.
+                      #
+                      # In order for inspection to work properly, the name of this info type must
+                      # not occur naturally anywhere in your data; otherwise, inspection may either
+                      #
+                      # - reverse a surrogate that does not correspond to an actual identifier
+                      # - be unable to parse the surrogate and result in an error
+                      #
+                      # Therefore, choose your custom info type name carefully after considering
+                      # what your data looks like. One way to select a name that has a high chance
+                      # of yielding reliable detection is to include one or more unicode characters
+                      # that are highly improbable to exist in your data.
+                      # For example, assuming your data is entered from a regular ASCII keyboard,
+                      # the symbol with the hex code point 29DD might be used like so:
+                      # ⧝MY_TOKEN_TYPE
+                    "name": "A String", # Name of the information type. Either a name of your choosing when
+                        # creating a CustomInfoType, or one of the names listed
+                        # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                        # a built-in type. InfoType names should conform to the pattern
+                        # [a-zA-Z0-9_]{1,64}.
+                  },
+                },
+                "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                    # Bucketing transformation can provide all of this functionality,
+                    # but requires more configuration. This message is provided as a convenience to
+                    # the user for simple bucketing strategies.
+                    #
+                    # The transformed value will be a hyphenated string of
+                    # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                    # all values that are within this bucket will be replaced with "10-20".
+                    #
+                    # This can be used on data of type: double, long.
+                    #
+                    # If the bound Value type differs from the type of data
+                    # being transformed, we will first attempt converting the type of the data to
+                    # be transformed to match the type of the bound before comparing.
+                    #
+                    # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                  "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                      # grouped together into a single bucket; for example if `lower_bound` = 10,
+                      # then all values less than 10 are replaced with the value “-10”. [Required].
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                  "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                      # grouped together into a single bucket; for example if `upper_bound` = 89,
+                      # then all values greater than 89 are replaced with the value “89+”.
+                      # [Required].
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                  "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                      # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                      # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                      # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+                },
+                "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+                },
+                "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                    # portion of the value.
+                  "partToExtract": "A String",
+                },
+                "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                    # Uses SHA-256.
+                    # The key size must be either 32 or 64 bytes.
+                    # Outputs a base64 encoded representation of the hashed output
+                    # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                    # Currently, only string and integer values can be hashed.
+                    # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+                  "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                      # a key encryption key (KEK) stored by KMS).
+                      # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                      # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                      # unwrap the data crypto key.
+                    "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                        # The wrapped key must be a 128/192/256 bit key.
+                        # Authorization requires the following IAM permissions when sending a request
+                        # to perform a crypto transformation using a kms-wrapped crypto key:
+                        # dlp.kms.encrypt
+                      "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                      "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                    },
+                    "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                        # leaking the key. Choose another type of key if possible.
+                      "key": "A String", # A 128/192/256 bit key. [required]
+                    },
+                    "transient": { # Use this to have a random data crypto key generated.
+                        # It will be discarded after the request finishes.
+                      "name": "A String", # Name of the key. [required]
+                          # This is an arbitrary string used to differentiate different keys.
+                          # A unique key is generated per name: two separate `TransientCryptoKey`
+                          # protos share the same generated key if their names are the same.
+                          # When the data crypto key is generated, this name is not used in any way
+                          # (repeating the api call will result in a different key being generated).
+                    },
+                  },
+                },
+                "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                    # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                    # to learn more.
+                  "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                      # results in the same shift for the same context and crypto_key.
+                      # a key encryption key (KEK) stored by KMS).
+                      # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                      # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                      # unwrap the data crypto key.
+                    "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                        # The wrapped key must be a 128/192/256 bit key.
+                        # Authorization requires the following IAM permissions when sending a request
+                        # to perform a crypto transformation using a kms-wrapped crypto key:
+                        # dlp.kms.encrypt
+                      "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                      "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                    },
+                    "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                        # leaking the key. Choose another type of key if possible.
+                      "key": "A String", # A 128/192/256 bit key. [required]
+                    },
+                    "transient": { # Use this to have a random data crypto key generated.
+                        # It will be discarded after the request finishes.
+                      "name": "A String", # Name of the key. [required]
+                          # This is an arbitrary string used to differentiate different keys.
+                          # A unique key is generated per name: two separate `TransientCryptoKey`
+                          # protos share the same generated key if their names are the same.
+                          # When the data crypto key is generated, this name is not used in any way
+                          # (repeating the api call will result in a different key being generated).
+                    },
+                  },
+                  "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                      # [Required]
+                  "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                      # range (inclusive ends). Negative means shift to earlier in time. Must not
+                      # be more than 365250 days (1000 years) each direction.
+                      #
+                      # For example, 3 means shift date to at most 3 days into the future.
+                      # [Required]
+                  "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                      # If set, must also set method. If set, shift will be consistent for the
+                      # given context.
+                    "name": "A String", # Name describing the field.
+                  },
+                },
+                "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                    # replacement values are dynamically provided by the user for custom behavior,
+                    # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                    # This can be used on
+                    # data of type: number, long, string, timestamp.
+                    # If the bound `Value` type differs from the type of data being transformed, we
+                    # will first attempt converting the type of the data to be transformed to match
+                    # the type of the bound before comparing.
+                    # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+                  "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                    { # Bucket is represented as a range, along with replacement values.
+                      "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                      "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                          # the default behavior will be to hyphenate the min-max range.
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                      "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                          # used.
+                          # Note that for the purposes of inspection or transformation, the number
+                          # of bytes considered to comprise a 'Value' is based on its representation
+                          # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                          # 123456789, the number of bytes would be counted as 9, even though an
+                          # int64 only holds up to 8 bytes of data.
+                        "floatValue": 3.14,
+                        "timestampValue": "A String",
+                        "dayOfWeekValue": "A String",
+                        "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                            # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                            # types are google.type.Date and `google.protobuf.Timestamp`.
+                          "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                              # to allow the value "24:00:00" for scenarios like business closing time.
+                          "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                          "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                              # allow the value 60 if it allows leap-seconds.
+                          "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                        },
+                        "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                            # and time zone are either specified elsewhere or are not significant. The date
+                            # is relative to the Proleptic Gregorian Calendar. This can represent:
+                            #
+                            # * A full date, with non-zero year, month and day values
+                            # * A month and day value, with a zero year, e.g. an anniversary
+                            # * A year on its own, with zero month and day values
+                            # * A year and month value, with a zero day, e.g. a credit card expiration date
+                            #
+                            # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                          "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                              # a year.
+                          "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                              # if specifying a year by itself or a year and month where the day is not
+                              # significant.
+                          "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                              # month and day.
+                        },
+                        "stringValue": "A String",
+                        "booleanValue": True or False,
+                        "integerValue": "A String",
+                      },
+                    },
+                  ],
+                },
+                "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                    # (FPE) with the FFX mode of operation; however when used in the
+                    # `ReidentifyContent` API method, it serves the opposite function by reversing
+                    # the surrogate back into the original identifier. The identifier must be
+                    # encoded as ASCII. For a given crypto key and context, the same identifier
+                    # will be replaced with the same surrogate. Identifiers must be at least two
+                    # characters long. In the case that the identifier is the empty string, it will
+                    # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                    # more.
+                    #
+                    # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                    # do not require preserving the input alphabet space and size, plus warrant
+                    # referential integrity.
+                  "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                      # a key encryption key (KEK) stored by KMS).
+                      # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                      # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                      # unwrap the data crypto key.
+                    "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                        # The wrapped key must be a 128/192/256 bit key.
+                        # Authorization requires the following IAM permissions when sending a request
+                        # to perform a crypto transformation using a kms-wrapped crypto key:
+                        # dlp.kms.encrypt
+                      "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                      "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                    },
+                    "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                        # leaking the key. Choose another type of key if possible.
+                      "key": "A String", # A 128/192/256 bit key. [required]
+                    },
+                    "transient": { # Use this to have a random data crypto key generated.
+                        # It will be discarded after the request finishes.
+                      "name": "A String", # Name of the key. [required]
+                          # This is an arbitrary string used to differentiate different keys.
+                          # A unique key is generated per name: two separate `TransientCryptoKey`
+                          # protos share the same generated key if their names are the same.
+                          # When the data crypto key is generated, this name is not used in any way
+                          # (repeating the api call will result in a different key being generated).
+                    },
+                  },
+                  "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+                  "commonAlphabet": "A String",
+                  "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                      # that the FFX mode natively supports. This happens before/after
+                      # encryption/decryption.
+                      # Each character listed must appear only once.
+                      # Number of characters must be in the range [2, 62].
+                      # This must be encoded as ASCII.
+                      # The order of characters does not matter.
+                  "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                      # identifier in two different contexts won't be given the same surrogate. If
+                      # the context is not set, a default tweak will be used.
+                      #
+                      # If the context is set but:
+                      #
+                      # 1. there is no record present when transforming a given value or
+                      # 1. the field is not present when transforming a given value,
+                      #
+                      # a default tweak will be used.
+                      #
+                      # Note that case (1) is expected when an `InfoTypeTransformation` is
+                      # applied to both structured and non-structured `ContentItem`s.
+                      # Currently, the referenced field may be of value type integer or string.
+                      #
+                      # The tweak is constructed as a sequence of bytes in big endian byte order
+                      # such that:
+                      #
+                      # - a 64 bit integer is encoded followed by a single byte of value 1
+                      # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                    "name": "A String", # Name describing the field.
+                  },
+                  "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                      # This annotation will be applied to the surrogate by prefixing it with
+                      # the name of the custom infoType followed by the number of
+                      # characters comprising the surrogate. The following scheme defines the
+                      # format: info_type_name(surrogate_character_count):surrogate
+                      #
+                      # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                      # the surrogate is 'abc', the full replacement value
+                      # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                      #
+                      # This annotation identifies the surrogate when inspecting content using the
+                      # custom infoType
+                      # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                      # This facilitates reversal of the surrogate when it occurs in free text.
+                      #
+                      # In order for inspection to work properly, the name of this infoType must
+                      # not occur naturally anywhere in your data; otherwise, inspection may
+                      # find a surrogate that does not correspond to an actual identifier.
+                      # Therefore, choose your custom infoType name carefully after considering
+                      # what your data looks like. One way to select a name that has a high chance
+                      # of yielding reliable detection is to include one or more unicode characters
+                      # that are highly improbable to exist in your data.
+                      # For example, assuming your data is entered from a regular ASCII keyboard,
+                      # the symbol with the hex code point 29DD might be used like so:
+                      # ⧝MY_TOKEN_TYPE
+                    "name": "A String", # Name of the information type. Either a name of your choosing when
+                        # creating a CustomInfoType, or one of the names listed
+                        # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                        # a built-in type. InfoType names should conform to the pattern
+                        # [a-zA-Z0-9_]{1,64}.
+                  },
+                },
+                "replaceConfig": { # Replace each input value with a given `Value`.
+                  "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                },
+              },
+              "condition": { # A condition for determining whether a transformation should be applied to # Only apply the transformation if the condition evaluates to true for the
+                  # given `RecordCondition`. The conditions are allowed to reference fields
+                  # that are not used in the actual transformation. [optional]
+                  #
+                  # Example Use Cases:
+                  #
+                  # - Apply a different bucket transformation to an age column if the zip code
+                  # column for the same record is within a specific range.
+                  # - Redact a field if the date of birth field is greater than 85.
+                  # a field.
+                "expressions": { # An expression, consisting or an operator and conditions. # An expression.
+                  "conditions": { # A collection of conditions.
+                    "conditions": [
+                      { # The field type of `value` and `field` do not need to match to be
+                          # considered equal, but not all comparisons are possible.
+                          # EQUAL_TO and NOT_EQUAL_TO attempt to compare even with incompatible types,
+                          # but all other comparisons are invalid with incompatible types.
+                          # A `value` of type:
+                          #
+                          # - `string` can be compared against all other types
+                          # - `boolean` can only be compared against other booleans
+                          # - `integer` can be compared against doubles or a string if the string value
+                          # can be parsed as an integer.
+                          # - `double` can be compared against integers or a string if the string can
+                          # be parsed as a double.
+                          # - `Timestamp` can be compared against strings in RFC 3339 date string
+                          # format.
+                          # - `TimeOfDay` can be compared against timestamps and strings in the format
+                          # of 'HH:mm:ss'.
+                          #
+                          # If we fail to compare do to type mismatch, a warning will be given and
+                          # the condition will evaluate to false.
+                        "operator": "A String", # Operator used to compare the field or infoType to the value. [required]
+                        "field": { # General identifier of a data field in a storage service. # Field within the record this condition is evaluated against. [required]
+                          "name": "A String", # Name describing the field.
+                        },
+                        "value": { # Set of primitive values supported by the system. # Value to compare against. [Required, except for `EXISTS` tests.]
+                            # Note that for the purposes of inspection or transformation, the number
+                            # of bytes considered to comprise a 'Value' is based on its representation
+                            # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                            # 123456789, the number of bytes would be counted as 9, even though an
+                            # int64 only holds up to 8 bytes of data.
+                          "floatValue": 3.14,
+                          "timestampValue": "A String",
+                          "dayOfWeekValue": "A String",
+                          "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                              # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                              # types are google.type.Date and `google.protobuf.Timestamp`.
+                            "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                                # to allow the value "24:00:00" for scenarios like business closing time.
+                            "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                            "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                                # allow the value 60 if it allows leap-seconds.
+                            "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                          },
+                          "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                              # and time zone are either specified elsewhere or are not significant. The date
+                              # is relative to the Proleptic Gregorian Calendar. This can represent:
+                              #
+                              # * A full date, with non-zero year, month and day values
+                              # * A month and day value, with a zero year, e.g. an anniversary
+                              # * A year on its own, with zero month and day values
+                              # * A year and month value, with a zero day, e.g. a credit card expiration date
+                              #
+                              # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                            "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                                # a year.
+                            "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                                # if specifying a year by itself or a year and month where the day is not
+                                # significant.
+                            "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                                # month and day.
+                          },
+                          "stringValue": "A String",
+                          "booleanValue": True or False,
+                          "integerValue": "A String",
+                        },
+                      },
+                    ],
+                  },
+                  "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently
+                      # only supported value is `AND`.
+                },
+              },
+              "fields": [ # Input field(s) to apply the transformation to. [required]
+                { # General identifier of a data field in a storage service.
+                  "name": "A String", # Name describing the field.
+                },
+              ],
+            },
+          ],
+          "transformedBytes": "A String", # Total size in bytes that were transformed in some way.
+          "transformation": { # A rule for transforming a value. # The specific transformation these stats apply to.
+            "characterMaskConfig": { # Partially mask a string by replacing a given number of characters with a
+                # fixed character. Masking can start from the beginning or end of the string.
+                # This can be used on data of any type (numbers, longs, and so on) and when
+                # de-identifying structured data we'll attempt to preserve the original data's
+                # type. (This allows you to take a long like 123 and modify it to a string like
+                # **3.
+              "charactersToIgnore": [ # When masking a string, items in this list will be skipped when replacing.
+                  # For example, if your string is 555-555-5555 and you ask us to skip `-` and
+                  # mask 5 chars with * we would produce ***-*55-5555.
+                { # Characters to skip when doing deidentification of a value. These will be left
+                    # alone and skipped.
+                  "commonCharactersToIgnore": "A String",
+                  "charactersToSkip": "A String",
+                },
+              ],
+              "numberToMask": 42, # Number of characters to mask. If not set, all matching chars will be
+                  # masked. Skipped characters do not count towards this tally.
+              "maskingCharacter": "A String", # Character to mask the sensitive values&mdash;for example, "*" for an
+                  # alphabetic string such as name, or "0" for a numeric string such as ZIP
+                  # code or credit card number. String must have length 1. If not supplied, we
+                  # will default to "*" for strings, 0 for digits.
+              "reverseOrder": True or False, # Mask characters in reverse order. For example, if `masking_character` is
+                  # '0', number_to_mask is 14, and `reverse_order` is false, then
+                  # 1234-5678-9012-3456 -> 00000000000000-3456
+                  # If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
+                  # is true, then 12345 -> 12***
+            },
+            "redactConfig": { # Redact a given value. For example, if used with an `InfoTypeTransformation`
+                # transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
+                # output would be 'My phone number is '.
+            },
+            "cryptoDeterministicConfig": { # Pseudonymization method that generates deterministic encryption for the given
+                # input. Outputs a base64 encoded representation of the encrypted output.
+                # Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
+              "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption function.
+                  # a key encryption key (KEK) stored by KMS).
+                  # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                  # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                  # unwrap the data crypto key.
+                "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                    # The wrapped key must be a 128/192/256 bit key.
+                    # Authorization requires the following IAM permissions when sending a request
+                    # to perform a crypto transformation using a kms-wrapped crypto key:
+                    # dlp.kms.encrypt
+                  "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                  "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                },
+                "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                    # leaking the key. Choose another type of key if possible.
+                  "key": "A String", # A 128/192/256 bit key. [required]
+                },
+                "transient": { # Use this to have a random data crypto key generated.
+                    # It will be discarded after the request finishes.
+                  "name": "A String", # Name of the key. [required]
+                      # This is an arbitrary string used to differentiate different keys.
+                      # A unique key is generated per name: two separate `TransientCryptoKey`
+                      # protos share the same generated key if their names are the same.
+                      # When the data crypto key is generated, this name is not used in any way
+                      # (repeating the api call will result in a different key being generated).
+                },
+              },
+              "context": { # General identifier of a data field in a storage service. # Optional. A context may be used for higher security and maintaining
+                  # referential integrity such that the same identifier in two different
+                  # contexts will be given a distinct surrogate. The context is appended to
+                  # plaintext value being encrypted. On decryption the provided context is
+                  # validated against the value used during encryption. If a context was
+                  # provided during encryption, same context must be provided during decryption
+                  # as well.
+                  #
+                  # If the context is not set, plaintext would be used as is for encryption.
+                  # If the context is set but:
+                  #
+                  # 1. there is no record present when transforming a given value or
+                  # 2. the field is not present when transforming a given value,
+                  #
+                  # plaintext would be used as is for encryption.
+                  #
+                  # Note that case (1) is expected when an `InfoTypeTransformation` is
+                  # applied to both structured and non-structured `ContentItem`s.
+                "name": "A String", # Name describing the field.
+              },
+              "surrogateInfoType": { # Type of information detected by the API. # The custom info type to annotate the surrogate with.
+                  # This annotation will be applied to the surrogate by prefixing it with
+                  # the name of the custom info type followed by the number of
+                  # characters comprising the surrogate. The following scheme defines the
+                  # format: <info type name>(<surrogate character count>):<surrogate>
+                  #
+                  # For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
+                  # the surrogate is 'abc', the full replacement value
+                  # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                  #
+                  # This annotation identifies the surrogate when inspecting content using the
+                  # custom info type 'Surrogate'. This facilitates reversal of the
+                  # surrogate when it occurs in free text.
+                  #
+                  # In order for inspection to work properly, the name of this info type must
+                  # not occur naturally anywhere in your data; otherwise, inspection may either
+                  #
+                  # - reverse a surrogate that does not correspond to an actual identifier
+                  # - be unable to parse the surrogate and result in an error
+                  #
+                  # Therefore, choose your custom info type name carefully after considering
+                  # what your data looks like. One way to select a name that has a high chance
+                  # of yielding reliable detection is to include one or more unicode characters
+                  # that are highly improbable to exist in your data.
+                  # For example, assuming your data is entered from a regular ASCII keyboard,
+                  # the symbol with the hex code point 29DD might be used like so:
+                  # ⧝MY_TOKEN_TYPE
+                "name": "A String", # Name of the information type. Either a name of your choosing when
+                    # creating a CustomInfoType, or one of the names listed
+                    # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                    # a built-in type. InfoType names should conform to the pattern
+                    # [a-zA-Z0-9_]{1,64}.
+              },
+            },
+            "fixedSizeBucketingConfig": { # Buckets values based on fixed size ranges. The
+                # Bucketing transformation can provide all of this functionality,
+                # but requires more configuration. This message is provided as a convenience to
+                # the user for simple bucketing strategies.
+                #
+                # The transformed value will be a hyphenated string of
+                # <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
+                # all values that are within this bucket will be replaced with "10-20".
+                #
+                # This can be used on data of type: double, long.
+                #
+                # If the bound Value type differs from the type of data
+                # being transformed, we will first attempt converting the type of the data to
+                # be transformed to match the type of the bound before comparing.
+                #
+                # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+              "lowerBound": { # Set of primitive values supported by the system. # Lower bound value of buckets. All values less than `lower_bound` are
+                  # grouped together into a single bucket; for example if `lower_bound` = 10,
+                  # then all values less than 10 are replaced with the value “-10”. [Required].
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+              "upperBound": { # Set of primitive values supported by the system. # Upper bound value of buckets. All values greater than upper_bound are
+                  # grouped together into a single bucket; for example if `upper_bound` = 89,
+                  # then all values greater than 89 are replaced with the value “89+”.
+                  # [Required].
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+              "bucketSize": 3.14, # Size of each bucket (except for minimum and maximum buckets). So if
+                  # `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
+                  # following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
+                  # 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
+            },
+            "replaceWithInfoTypeConfig": { # Replace each matching finding with the name of the info_type.
+            },
+            "timePartConfig": { # For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
+                # portion of the value.
+              "partToExtract": "A String",
+            },
+            "cryptoHashConfig": { # Pseudonymization method that generates surrogates via cryptographic hashing.
+                # Uses SHA-256.
+                # The key size must be either 32 or 64 bytes.
+                # Outputs a base64 encoded representation of the hashed output
+                # (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
+                # Currently, only string and integer values can be hashed.
+                # See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
+              "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the hash function.
+                  # a key encryption key (KEK) stored by KMS).
+                  # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                  # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                  # unwrap the data crypto key.
+                "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                    # The wrapped key must be a 128/192/256 bit key.
+                    # Authorization requires the following IAM permissions when sending a request
+                    # to perform a crypto transformation using a kms-wrapped crypto key:
+                    # dlp.kms.encrypt
+                  "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                  "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                },
+                "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                    # leaking the key. Choose another type of key if possible.
+                  "key": "A String", # A 128/192/256 bit key. [required]
+                },
+                "transient": { # Use this to have a random data crypto key generated.
+                    # It will be discarded after the request finishes.
+                  "name": "A String", # Name of the key. [required]
+                      # This is an arbitrary string used to differentiate different keys.
+                      # A unique key is generated per name: two separate `TransientCryptoKey`
+                      # protos share the same generated key if their names are the same.
+                      # When the data crypto key is generated, this name is not used in any way
+                      # (repeating the api call will result in a different key being generated).
+                },
+              },
+            },
+            "dateShiftConfig": { # Shifts dates by random number of days, with option to be consistent for the
+                # same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
+                # to learn more.
+              "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # Causes the shift to be computed based on this key and the context. This
+                  # results in the same shift for the same context and crypto_key.
+                  # a key encryption key (KEK) stored by KMS).
+                  # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                  # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                  # unwrap the data crypto key.
+                "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                    # The wrapped key must be a 128/192/256 bit key.
+                    # Authorization requires the following IAM permissions when sending a request
+                    # to perform a crypto transformation using a kms-wrapped crypto key:
+                    # dlp.kms.encrypt
+                  "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                  "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                },
+                "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                    # leaking the key. Choose another type of key if possible.
+                  "key": "A String", # A 128/192/256 bit key. [required]
+                },
+                "transient": { # Use this to have a random data crypto key generated.
+                    # It will be discarded after the request finishes.
+                  "name": "A String", # Name of the key. [required]
+                      # This is an arbitrary string used to differentiate different keys.
+                      # A unique key is generated per name: two separate `TransientCryptoKey`
+                      # protos share the same generated key if their names are the same.
+                      # When the data crypto key is generated, this name is not used in any way
+                      # (repeating the api call will result in a different key being generated).
+                },
+              },
+              "lowerBoundDays": 42, # For example, -5 means shift date to at most 5 days back in the past.
+                  # [Required]
+              "upperBoundDays": 42, # Range of shift in days. Actual shift will be selected at random within this
+                  # range (inclusive ends). Negative means shift to earlier in time. Must not
+                  # be more than 365250 days (1000 years) each direction.
+                  #
+                  # For example, 3 means shift date to at most 3 days into the future.
+                  # [Required]
+              "context": { # General identifier of a data field in a storage service. # Points to the field that contains the context, for example, an entity id.
+                  # If set, must also set method. If set, shift will be consistent for the
+                  # given context.
+                "name": "A String", # Name describing the field.
+              },
+            },
+            "bucketingConfig": { # Generalization function that buckets values based on ranges. The ranges and
+                # replacement values are dynamically provided by the user for custom behavior,
+                # such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
+                # This can be used on
+                # data of type: number, long, string, timestamp.
+                # If the bound `Value` type differs from the type of data being transformed, we
+                # will first attempt converting the type of the data to be transformed to match
+                # the type of the bound before comparing.
+                # See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
+              "buckets": [ # Set of buckets. Ranges must be non-overlapping.
+                { # Bucket is represented as a range, along with replacement values.
+                  "max": { # Set of primitive values supported by the system. # Upper bound of the range, exclusive; type must match min.
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                  "replacementValue": { # Set of primitive values supported by the system. # Replacement value for this bucket. If not provided
+                      # the default behavior will be to hyphenate the min-max range.
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                  "min": { # Set of primitive values supported by the system. # Lower bound of the range, inclusive. Type should be the same as max if
+                      # used.
+                      # Note that for the purposes of inspection or transformation, the number
+                      # of bytes considered to comprise a 'Value' is based on its representation
+                      # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                      # 123456789, the number of bytes would be counted as 9, even though an
+                      # int64 only holds up to 8 bytes of data.
+                    "floatValue": 3.14,
+                    "timestampValue": "A String",
+                    "dayOfWeekValue": "A String",
+                    "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                        # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                        # types are google.type.Date and `google.protobuf.Timestamp`.
+                      "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                          # to allow the value "24:00:00" for scenarios like business closing time.
+                      "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                      "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                          # allow the value 60 if it allows leap-seconds.
+                      "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                    },
+                    "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                        # and time zone are either specified elsewhere or are not significant. The date
+                        # is relative to the Proleptic Gregorian Calendar. This can represent:
+                        #
+                        # * A full date, with non-zero year, month and day values
+                        # * A month and day value, with a zero year, e.g. an anniversary
+                        # * A year on its own, with zero month and day values
+                        # * A year and month value, with a zero day, e.g. a credit card expiration date
+                        #
+                        # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                      "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                          # a year.
+                      "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                          # if specifying a year by itself or a year and month where the day is not
+                          # significant.
+                      "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                          # month and day.
+                    },
+                    "stringValue": "A String",
+                    "booleanValue": True or False,
+                    "integerValue": "A String",
+                  },
+                },
+              ],
+            },
+            "cryptoReplaceFfxFpeConfig": { # Replaces an identifier with a surrogate using Format Preserving Encryption
+                # (FPE) with the FFX mode of operation; however when used in the
+                # `ReidentifyContent` API method, it serves the opposite function by reversing
+                # the surrogate back into the original identifier. The identifier must be
+                # encoded as ASCII. For a given crypto key and context, the same identifier
+                # will be replaced with the same surrogate. Identifiers must be at least two
+                # characters long. In the case that the identifier is the empty string, it will
+                # be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
+                # more.
+                #
+                # Note: We recommend using  CryptoDeterministicConfig for all use cases which
+                # do not require preserving the input alphabet space and size, plus warrant
+                # referential integrity.
+              "cryptoKey": { # This is a data encryption key (DEK) (as opposed to # The key used by the encryption algorithm. [required]
+                  # a key encryption key (KEK) stored by KMS).
+                  # When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
+                  # IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
+                  # unwrap the data crypto key.
+                "kmsWrapped": { # Include to use an existing data crypto key wrapped by KMS.
+                    # The wrapped key must be a 128/192/256 bit key.
+                    # Authorization requires the following IAM permissions when sending a request
+                    # to perform a crypto transformation using a kms-wrapped crypto key:
+                    # dlp.kms.encrypt
+                  "cryptoKeyName": "A String", # The resource name of the KMS CryptoKey to use for unwrapping. [required]
+                  "wrappedKey": "A String", # The wrapped data crypto key. [required]
+                },
+                "unwrapped": { # Using raw keys is prone to security risks due to accidentally
+                    # leaking the key. Choose another type of key if possible.
+                  "key": "A String", # A 128/192/256 bit key. [required]
+                },
+                "transient": { # Use this to have a random data crypto key generated.
+                    # It will be discarded after the request finishes.
+                  "name": "A String", # Name of the key. [required]
+                      # This is an arbitrary string used to differentiate different keys.
+                      # A unique key is generated per name: two separate `TransientCryptoKey`
+                      # protos share the same generated key if their names are the same.
+                      # When the data crypto key is generated, this name is not used in any way
+                      # (repeating the api call will result in a different key being generated).
+                },
+              },
+              "radix": 42, # The native way to select the alphabet. Must be in the range [2, 62].
+              "commonAlphabet": "A String",
+              "customAlphabet": "A String", # This is supported by mapping these to the alphanumeric characters
+                  # that the FFX mode natively supports. This happens before/after
+                  # encryption/decryption.
+                  # Each character listed must appear only once.
+                  # Number of characters must be in the range [2, 62].
+                  # This must be encoded as ASCII.
+                  # The order of characters does not matter.
+              "context": { # General identifier of a data field in a storage service. # The 'tweak', a context may be used for higher security since the same
+                  # identifier in two different contexts won't be given the same surrogate. If
+                  # the context is not set, a default tweak will be used.
+                  #
+                  # If the context is set but:
+                  #
+                  # 1. there is no record present when transforming a given value or
+                  # 1. the field is not present when transforming a given value,
+                  #
+                  # a default tweak will be used.
+                  #
+                  # Note that case (1) is expected when an `InfoTypeTransformation` is
+                  # applied to both structured and non-structured `ContentItem`s.
+                  # Currently, the referenced field may be of value type integer or string.
+                  #
+                  # The tweak is constructed as a sequence of bytes in big endian byte order
+                  # such that:
+                  #
+                  # - a 64 bit integer is encoded followed by a single byte of value 1
+                  # - a string is encoded in UTF-8 format followed by a single byte of value 2
+                "name": "A String", # Name describing the field.
+              },
+              "surrogateInfoType": { # Type of information detected by the API. # The custom infoType to annotate the surrogate with.
+                  # This annotation will be applied to the surrogate by prefixing it with
+                  # the name of the custom infoType followed by the number of
+                  # characters comprising the surrogate. The following scheme defines the
+                  # format: info_type_name(surrogate_character_count):surrogate
+                  #
+                  # For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
+                  # the surrogate is 'abc', the full replacement value
+                  # will be: 'MY_TOKEN_INFO_TYPE(3):abc'
+                  #
+                  # This annotation identifies the surrogate when inspecting content using the
+                  # custom infoType
+                  # [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+                  # This facilitates reversal of the surrogate when it occurs in free text.
+                  #
+                  # In order for inspection to work properly, the name of this infoType must
+                  # not occur naturally anywhere in your data; otherwise, inspection may
+                  # find a surrogate that does not correspond to an actual identifier.
+                  # Therefore, choose your custom infoType name carefully after considering
+                  # what your data looks like. One way to select a name that has a high chance
+                  # of yielding reliable detection is to include one or more unicode characters
+                  # that are highly improbable to exist in your data.
+                  # For example, assuming your data is entered from a regular ASCII keyboard,
+                  # the symbol with the hex code point 29DD might be used like so:
+                  # ⧝MY_TOKEN_TYPE
+                "name": "A String", # Name of the information type. Either a name of your choosing when
+                    # creating a CustomInfoType, or one of the names listed
+                    # at https://cloud.google.com/dlp/docs/infotypes-reference when specifying
+                    # a built-in type. InfoType names should conform to the pattern
+                    # [a-zA-Z0-9_]{1,64}.
+              },
+            },
+            "replaceConfig": { # Replace each input value with a given `Value`.
+              "newValue": { # Set of primitive values supported by the system. # Value to replace it with.
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+            },
+          },
+        },
+      ],
+      "transformedBytes": "A String", # Total size in bytes that were transformed in some way.
+    },
+    "item": { # Container structure for the content to inspect. # The re-identified item.
+      "table": { # Structured content to inspect. Up to 50,000 `Value`s per request allowed. # Structured content for inspection. See
+          # https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
+          # learn more.
+          # See https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
+          # learn more.
+        "headers": [
+          { # General identifier of a data field in a storage service.
+            "name": "A String", # Name describing the field.
+          },
+        ],
+        "rows": [
+          {
+            "values": [
+              { # Set of primitive values supported by the system.
+                  # Note that for the purposes of inspection or transformation, the number
+                  # of bytes considered to comprise a 'Value' is based on its representation
+                  # as a UTF-8 encoded string. For example, if 'integer_value' is set to
+                  # 123456789, the number of bytes would be counted as 9, even though an
+                  # int64 only holds up to 8 bytes of data.
+                "floatValue": 3.14,
+                "timestampValue": "A String",
+                "dayOfWeekValue": "A String",
+                "timeValue": { # Represents a time of day. The date and time zone are either not significant
+                    # or are specified elsewhere. An API may choose to allow leap seconds. Related
+                    # types are google.type.Date and `google.protobuf.Timestamp`.
+                  "hours": 42, # Hours of day in 24 hour format. Should be from 0 to 23. An API may choose
+                      # to allow the value "24:00:00" for scenarios like business closing time.
+                  "nanos": 42, # Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
+                  "seconds": 42, # Seconds of minutes of the time. Must normally be from 0 to 59. An API may
+                      # allow the value 60 if it allows leap-seconds.
+                  "minutes": 42, # Minutes of hour of day. Must be from 0 to 59.
+                },
+                "dateValue": { # Represents a whole or partial calendar date, e.g. a birthday. The time of day
+                    # and time zone are either specified elsewhere or are not significant. The date
+                    # is relative to the Proleptic Gregorian Calendar. This can represent:
+                    #
+                    # * A full date, with non-zero year, month and day values
+                    # * A month and day value, with a zero year, e.g. an anniversary
+                    # * A year on its own, with zero month and day values
+                    # * A year and month value, with a zero day, e.g. a credit card expiration date
+                    #
+                    # Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.
+                  "year": 42, # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+                      # a year.
+                  "day": 42, # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
+                      # if specifying a year by itself or a year and month where the day is not
+                      # significant.
+                  "month": 42, # Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+                      # month and day.
+                },
+                "stringValue": "A String",
+                "booleanValue": True or False,
+                "integerValue": "A String",
+              },
+            ],
+          },
+        ],
+      },
+      "byteItem": { # Container for bytes to inspect or redact. # Content data to inspect or redact. Replaces `type` and `data`.
+        "type": "A String", # The type of data stored in the bytes string. Default will be TEXT_UTF8.
+        "data": "A String", # Content data to inspect or redact.
+      },
+      "value": "A String", # String data to inspect or redact.
+    },
+  }</pre>
+</div>
+
+</body></html>
\ No newline at end of file