{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "protobuf-provider", "title": "Protoform protobuf provider", "description": "Protobuf-ES v2 descriptors, ProtoValidate and CEL validation, AIP helpers, and Connect error mapping.", "dependencies": [ "@buf/googleapis_googleapis.bufbuild_es", "@bufbuild/protobuf", "@bufbuild/protovalidate", "@connectrpc/connect", "@standard-schema/spec" ], "registryDependencies": [ "@protoform/protoform-core" ], "files": [ { "path": "registry/base-nova/protoform/lib/protobuf-provider/aip-client-workflow.ts", "content": "import type { Operation } from \"@buf/googleapis_googleapis.bufbuild_es/google/longrunning/operations_pb.js\";\nimport { RetryInfoSchema } from \"@buf/googleapis_googleapis.bufbuild_es/google/rpc/error_details_pb.js\";\nimport type { Status } from \"@buf/googleapis_googleapis.bufbuild_es/google/rpc/status_pb.js\";\nimport type { DescMethod } from \"@bufbuild/protobuf\";\nimport { MethodOptions_IdempotencyLevel } from \"@bufbuild/protobuf/wkt\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\n\nconst ALPHA_VERSION_PATTERN = /(?:^|\\.)v\\d+alpha\\d+(?:\\.|$)/;\nconst BETA_VERSION_PATTERN = /(?:^|\\.)v\\d+beta\\d+(?:\\.|$)/;\n\nexport interface ProtoOperationRunner {\n cancel?: (name: string) => Promise;\n onProgress?: (operation: Operation) => void;\n poll: (name: string, signal: AbortSignal) => Promise;\n pollIntervalMs?: number;\n signal?: AbortSignal;\n sleep?: (delayMs: number, signal: AbortSignal) => Promise;\n start: (signal: AbortSignal) => Promise;\n}\n\nexport class ProtoOperationError extends Error {\n readonly status: Status;\n\n constructor(status: Status) {\n super(status.message || `Operation failed with status ${status.code}.`);\n this.name = \"ProtoOperationError\";\n this.status = status;\n }\n}\n\nfunction abortError(): DOMException {\n return new DOMException(\"The operation was aborted.\", \"AbortError\");\n}\n\nfunction defaultSleep(delayMs: number, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(abortError());\n return;\n }\n function handleAbort() {\n clearTimeout(timeout);\n reject(abortError());\n }\n const timeout = setTimeout(() => {\n signal.removeEventListener(\"abort\", handleAbort);\n resolve();\n }, delayMs);\n signal.addEventListener(\"abort\", handleAbort, { once: true });\n });\n}\n\nfunction requireActive(signal: AbortSignal): void {\n if (signal.aborted) {\n throw abortError();\n }\n}\n\nfunction finishOperation(operation: Operation): Operation {\n if (operation.result.case === \"error\") {\n throw new ProtoOperationError(operation.result.value);\n }\n if (operation.result.case !== \"response\") {\n throw new Error(\"A completed operation must contain a response or error.\");\n }\n return operation;\n}\n\nasync function pollUntilDone(\n operation: Operation,\n poll: ProtoOperationRunner[\"poll\"],\n sleep: NonNullable,\n pollIntervalMs: number,\n signal: AbortSignal,\n onProgress?: ProtoOperationRunner[\"onProgress\"]\n): Promise {\n let current = operation;\n while (!current.done) {\n if (!current.name) {\n throw new Error(\"An incomplete operation must have a name for polling.\");\n }\n // biome-ignore lint/performance/noAwaitInLoops: each LRO poll must follow the previous response.\n await sleep(pollIntervalMs, signal);\n requireActive(signal);\n current = await poll(current.name, signal);\n onProgress?.(current);\n }\n return current;\n}\n\nexport async function runProtoOperation({\n cancel,\n onProgress,\n poll,\n pollIntervalMs = 1000,\n signal = new AbortController().signal,\n sleep = defaultSleep,\n start,\n}: ProtoOperationRunner): Promise {\n let operationName: string | undefined;\n try {\n requireActive(signal);\n const operation = await start(signal);\n operationName = operation.name || undefined;\n onProgress?.(operation);\n const completed = await pollUntilDone(\n operation,\n poll,\n sleep,\n pollIntervalMs,\n signal,\n onProgress\n );\n return finishOperation(completed);\n } catch (error) {\n if (signal.aborted && operationName && cancel) {\n await cancel(operationName);\n }\n throw error;\n }\n}\n\nexport type ProtoRetryReason =\n | \"non-retryable-code\"\n | \"streaming\"\n | \"transient\"\n | \"unsafe\";\n\nexport interface ProtoRetryDecision {\n delayMs?: number;\n reason: ProtoRetryReason;\n retry: boolean;\n}\n\nfunction getRetryDelayMs(error: ConnectError): number | undefined {\n const delay = error.findDetails(RetryInfoSchema)[0]?.retryDelay;\n if (!delay) {\n return undefined;\n }\n return Math.max(0, Number(delay.seconds) * 1000 + delay.nanos / 1e6);\n}\n\nexport function getProtoRetryDecision(\n method: DescMethod,\n reason: unknown\n): ProtoRetryDecision {\n if (method.methodKind !== \"unary\") {\n return { reason: \"streaming\", retry: false };\n }\n if (\n method.idempotency !== MethodOptions_IdempotencyLevel.NO_SIDE_EFFECTS &&\n method.idempotency !== MethodOptions_IdempotencyLevel.IDEMPOTENT\n ) {\n return { reason: \"unsafe\", retry: false };\n }\n const error = ConnectError.from(reason);\n if (error.code !== Code.Unavailable) {\n return { reason: \"non-retryable-code\", retry: false };\n }\n const delayMs = getRetryDelayMs(error);\n return delayMs === undefined\n ? { reason: \"transient\", retry: true }\n : { delayMs, reason: \"transient\", retry: true };\n}\n\nexport interface ProtoPartialResultRecovery {\n label: string;\n resourceName: string;\n}\n\nexport interface ProtoPartialResult {\n complete: boolean;\n recovery: readonly ProtoPartialResultRecovery[];\n unreachable: readonly string[];\n warning?: string;\n}\n\nfunction resourceLabel(resourceName: string): string {\n const segments = resourceName.split(\"/\");\n return segments.at(-1) || resourceName;\n}\n\nexport function getProtoPartialResult(response: {\n unreachable?: unknown;\n}): ProtoPartialResult {\n const unreachable = Array.isArray(response.unreachable)\n ? response.unreachable.filter(\n (value): value is string => typeof value === \"string\" && value !== \"\"\n )\n : [];\n if (unreachable.length === 0) {\n return { complete: true, recovery: [], unreachable: [] };\n }\n const noun = unreachable.length === 1 ? \"resource\" : \"resources\";\n return {\n complete: false,\n recovery: unreachable.map((resourceName) => ({\n label: `Retry ${resourceLabel(resourceName)}`,\n resourceName,\n })),\n unreachable,\n warning: `Some results are unavailable from ${unreachable.length} ${noun}.`,\n };\n}\n\nexport interface ProtoPurgePlan {\n confirmationRequired: boolean;\n count: number;\n mode: \"execute\" | \"preview\";\n sample: readonly string[];\n warning: string;\n}\n\nexport function getProtoPurgePlan(\n request: { filter: string; force: boolean },\n response: { purgeCount: number; purgeSample: readonly string[] }\n): ProtoPurgePlan {\n if (!request.filter) {\n throw new Error(\"A purge plan requires a filter.\");\n }\n return {\n confirmationRequired: request.force,\n count: response.purgeCount,\n mode: request.force ? \"execute\" : \"preview\",\n sample: response.purgeSample,\n warning: request.force\n ? \"This permanently deletes every resource matching the filter.\"\n : \"Preview only. No resources will be deleted.\",\n };\n}\n\nexport type ProtoPolicyPreviewAction =\n | \"commit\"\n | \"start-preview\"\n | \"stop-preview\";\n\nexport interface ProtoPolicyPreviewPlan {\n action: ProtoPolicyPreviewAction;\n confirmationRequired: boolean;\n enforcesPolicy: boolean;\n notice: string;\n}\n\nexport function getProtoPolicyPreviewPlan(\n action: ProtoPolicyPreviewAction\n): ProtoPolicyPreviewPlan {\n switch (action) {\n case \"start-preview\":\n return {\n action,\n confirmationRequired: false,\n enforcesPolicy: false,\n notice:\n \"Preview compares the experiment with live traffic without enforcing it.\",\n };\n case \"stop-preview\":\n return {\n action,\n confirmationRequired: false,\n enforcesPolicy: false,\n notice: \"Stopping preview does not change the live policy.\",\n };\n case \"commit\":\n return {\n action,\n confirmationRequired: true,\n enforcesPolicy: true,\n notice: \"Commit replaces the live policy and deletes the experiment.\",\n };\n default:\n throw new Error(\n `Unsupported policy preview action: ${action satisfies never}`\n );\n }\n}\n\nexport type ProtoStabilityLevel = \"alpha\" | \"beta\" | \"deprecated\" | \"stable\";\n\nexport interface ProtoStability {\n guidance?: string;\n level: ProtoStabilityLevel;\n preview: boolean;\n}\n\nexport interface ProtoStabilityDescriptor {\n deprecated: boolean;\n typeName: string;\n}\n\nexport function getProtoStability({\n deprecated,\n typeName,\n}: ProtoStabilityDescriptor): ProtoStability {\n if (deprecated) {\n return {\n guidance:\n \"Deprecated: migrate before the documented support period ends.\",\n level: \"deprecated\",\n preview: false,\n };\n }\n if (ALPHA_VERSION_PATTERN.test(typeName)) {\n return {\n guidance: \"Alpha preview: breaking changes are expected.\",\n level: \"alpha\",\n preview: true,\n };\n }\n if (BETA_VERSION_PATTERN.test(typeName)) {\n return {\n guidance: \"Beta preview: changes remain possible before stability.\",\n level: \"beta\",\n preview: true,\n };\n }\n return { level: \"stable\", preview: false };\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/aip.ts", "content": "import {\n FieldBehavior,\n field_behavior,\n} from \"@buf/googleapis_googleapis.bufbuild_es/google/api/field_behavior_pb.js\";\nimport {\n resource,\n resource_reference,\n} from \"@buf/googleapis_googleapis.bufbuild_es/google/api/resource_pb.js\";\nimport {\n create,\n type DescField,\n type DescMessage,\n getExtension,\n} from \"@bufbuild/protobuf\";\nimport {\n FieldOptionsSchema,\n MessageOptionsSchema,\n} from \"@bufbuild/protobuf/wkt\";\n\nexport interface ProtoResourceMetadata {\n nameField: string;\n patterns: string[];\n plural: string;\n singular: string;\n type: string;\n}\n\nexport interface ProtoResourceReference {\n childType?: string;\n type?: string;\n}\n\nexport function getProtoResourceMetadata(\n desc: DescMessage\n): ProtoResourceMetadata | undefined {\n const metadata = getExtension(\n desc.proto.options ?? create(MessageOptionsSchema),\n resource\n );\n if (!metadata.type && metadata.pattern.length === 0) {\n return;\n }\n return {\n nameField: metadata.nameField || \"name\",\n patterns: [...metadata.pattern],\n plural: metadata.plural,\n singular: metadata.singular,\n type: metadata.type,\n };\n}\n\nexport function getProtoResourceReference(\n field: DescField\n): ProtoResourceReference | undefined {\n const reference = getExtension(\n field.proto.options ?? create(FieldOptionsSchema),\n resource_reference\n );\n if (!(reference.type || reference.childType)) {\n return;\n }\n return {\n childType: reference.childType || undefined,\n type: reference.type || undefined,\n };\n}\n\nexport function getProtoFieldBehaviors(\n field: DescField\n): readonly FieldBehavior[] {\n return getExtension(\n field.proto.options ?? create(FieldOptionsSchema),\n field_behavior\n ).filter((behavior) => behavior !== FieldBehavior.FIELD_BEHAVIOR_UNSPECIFIED);\n}\n\nexport function isSingletonProtoResource(desc: DescMessage): boolean {\n const metadata = getProtoResourceMetadata(desc);\n if (!metadata || metadata.patterns.length === 0) {\n return false;\n }\n return metadata.patterns.every((pattern) => {\n const lastSegment = pattern.split(\"/\").at(-1);\n return Boolean(lastSegment && !lastSegment.includes(\"{\"));\n });\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/annotations.ts", "content": "import type { DescMessage } from \"@bufbuild/protobuf\";\n\nexport interface ProtoAnnotations {\n fields?: Record;\n messages?: Record;\n oneofs?: Record;\n}\n\nconst protoAnnotationsRegistry = new WeakMap();\n\nexport function registerProtoAnnotations(\n desc: DescMessage,\n annotations: ProtoAnnotations\n): ProtoAnnotations {\n protoAnnotationsRegistry.set(desc, annotations);\n return annotations;\n}\n\nexport function getRegisteredProtoAnnotations(\n desc: DescMessage\n): ProtoAnnotations | undefined {\n return protoAnnotationsRegistry.get(desc);\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/auto-form-example-annotations.ts", "content": "// @generated by generate-proto-annotations.mts\n/* eslint-disable */\n\nimport {\n AddressSchema,\n AutoFormExampleSchema,\n AutoFormUiMetadataExampleSchema,\n GeoPointSchema,\n NestedSettingSchema,\n ProfileSettingsSchema,\n} from './gen/auto-form-example_pb.js';\nimport { type ProtoAnnotations, registerProtoAnnotations } from './index.js';\n\nexport const autoFormExampleAnnotations = {\n messages: {\n 'protoform.v1.Address': 'Postal address used by several nested object fields and maps.',\n 'protoform.v1.AutoFormExample':\n 'Primary protobuf fixture for AutoForm. It intentionally mixes scalar, nested,\\nrepeated, map, oneof, and well-known types so the form generator can exercise\\nthe sketchier corners of descriptor-driven rendering.',\n 'protoform.v1.AutoFormUiMetadataExample':\n 'Focused protobuf fixture for proto UI metadata and UI CEL demos.',\n 'protoform.v1.GeoPoint': 'Latitude/longitude pair used by the nested Address message.',\n 'protoform.v1.NestedSetting': 'Small nested settings entry used inside a protobuf map.',\n 'protoform.v1.ProfileSettings':\n 'Support workflow settings nested under the main example message.',\n },\n fields: {\n 'protoform.v1.AutoFormExample.avatarBytes':\n 'Optional avatar payload for attachment-based workflows.',\n 'protoform.v1.AutoFormExample.bio': 'Free-form summary shown on the profile card.',\n 'protoform.v1.AutoFormExample.createdAt': 'Timestamp captured when the record was created.',\n 'protoform.v1.AutoFormExample.dashboardBlocks':\n 'Ordered dashboard widgets stored as a dynamic list.',\n 'protoform.v1.AutoFormExample.doNotContact': 'Opt out of direct outreach entirely.',\n 'protoform.v1.AutoFormExample.externalPayload':\n 'External Any payload kept intentionally loose for edge-case coverage.',\n 'protoform.v1.AutoFormExample.featuredValue':\n 'Generic featured value for experiments and demos.',\n 'protoform.v1.AutoFormExample.homepageUrl': 'Optional personal or team homepage.',\n 'protoform.v1.AutoFormExample.labels': 'Flat metadata pairs for analytics and routing.',\n 'protoform.v1.AutoFormExample.officeLocations': 'Named office addresses keyed by a short slug.',\n 'protoform.v1.AutoFormExample.preferences':\n 'Arbitrary preference flags stored as a JSON-ish struct.',\n 'protoform.v1.AutoFormExample.preferredEmail': 'Route updates to an email inbox.',\n 'protoform.v1.AutoFormExample.preferredPhone': 'Route urgent notices to an E.164 phone number.',\n 'protoform.v1.AutoFormExample.primaryEmail':\n 'Main email address for notifications and login recovery.',\n 'protoform.v1.AutoFormExample.reminderInterval': 'Delay between reminder notifications.',\n 'protoform.v1.AutoFormExample.resourceId': 'UUID copied from an upstream system.',\n 'protoform.v1.AutoFormExample.settings':\n 'Nested support settings with their own CEL validation rule.',\n 'protoform.v1.AutoFormExample.shippingAddress':\n 'Shipping destination used for hardware deliveries.',\n 'protoform.v1.AutoFormExample.tags': 'Lightweight labels used for quick filtering.',\n 'protoform.v1.AutoFormExample.username': 'Public handle shown in mentions and admin lists.',\n 'protoform.v1.AutoFormExample.writablePaths': 'Fields the current actor is allowed to update.',\n 'protoform.v1.AutoFormUiMetadataExample.apiToken':\n 'API token for authenticating with the deployment service.',\n 'protoform.v1.AutoFormUiMetadataExample.approvalTicket':\n 'Approval or change-management ticket for the deployment.',\n 'protoform.v1.AutoFormUiMetadataExample.clusterName':\n 'Friendly cluster name shown in rollout summaries.',\n 'protoform.v1.AutoFormUiMetadataExample.enableDryRun':\n 'Keep a final dry-run toggle in the deploy step.',\n 'protoform.v1.AutoFormUiMetadataExample.enableSupportMode':\n 'Toggle the conditional support step on or off.',\n 'protoform.v1.AutoFormUiMetadataExample.escalationReason':\n 'Extra context only needed for platinum support requests.',\n 'protoform.v1.AutoFormUiMetadataExample.maintenanceWindow':\n 'Requested maintenance window for premium support coordination.',\n 'protoform.v1.AutoFormUiMetadataExample.noFollowUp': 'Explicitly avoid any follow-up contact.',\n 'protoform.v1.AutoFormUiMetadataExample.provider':\n 'Cloud provider where the request will be deployed.',\n 'protoform.v1.AutoFormUiMetadataExample.region': 'Region where the cluster will be created.',\n 'protoform.v1.AutoFormUiMetadataExample.slackChannel':\n 'Route follow-up through a Slack channel.',\n 'protoform.v1.AutoFormUiMetadataExample.supportEmail':\n 'Route follow-up through an email inbox.',\n 'protoform.v1.AutoFormUiMetadataExample.supportTier':\n 'Requested support tier for the deployment.',\n },\n oneofs: {\n 'protoform.v1.AutoFormExample.preferredContact':\n 'Exactly one preferred contact route can be selected at a time.',\n 'protoform.v1.AutoFormUiMetadataExample.supportContact':\n 'Pick exactly one support contact route once premium support is active.',\n },\n} satisfies ProtoAnnotations;\n\nfor (const schema of [\n AddressSchema,\n AutoFormExampleSchema,\n AutoFormUiMetadataExampleSchema,\n GeoPointSchema,\n NestedSettingSchema,\n ProfileSettingsSchema,\n]) {\n registerProtoAnnotations(schema, autoFormExampleAnnotations);\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/field-mask.ts", "content": "import {\n FieldBehavior,\n field_behavior as fieldBehaviorExtension,\n} from \"@buf/googleapis_googleapis.bufbuild_es/google/api/field_behavior_pb.js\";\nimport {\n create,\n type DescField,\n type DescMessage,\n type DescOneof,\n getExtension,\n} from \"@bufbuild/protobuf\";\nimport {\n type FieldMask,\n FieldMaskSchema,\n FieldOptionsSchema,\n} from \"@bufbuild/protobuf/wkt\";\n\ntype FormRecord = Record;\n\nconst NON_UPDATABLE_BEHAVIORS = new Set([\n FieldBehavior.IDENTIFIER,\n FieldBehavior.IMMUTABLE,\n FieldBehavior.OUTPUT_ONLY,\n]);\n\nfunction isRecord(value: unknown): value is FormRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) {\n return true;\n }\n if (left instanceof Date && right instanceof Date) {\n return left.getTime() === right.getTime();\n }\n if (left instanceof Uint8Array && right instanceof Uint8Array) {\n return (\n left.byteLength === right.byteLength &&\n left.every((value, index) => value === right[index])\n );\n }\n if (Array.isArray(left) && Array.isArray(right)) {\n return (\n left.length === right.length &&\n left.every((value, index) => valuesEqual(value, right[index]))\n );\n }\n if (!isRecord(left) || !isRecord(right)) {\n return false;\n }\n\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n return (\n leftKeys.length === rightKeys.length &&\n leftKeys.every(\n (key) => Object.hasOwn(right, key) && valuesEqual(left[key], right[key])\n )\n );\n}\n\n/** Build the dirty-field tree expected by createUpdateMask from two value snapshots. */\nexport function dirtyFieldsFromValues(\n current: unknown,\n initial: unknown\n): FormRecord {\n if (valuesEqual(current, initial)) {\n return {};\n }\n if (!isRecord(current) || !isRecord(initial)) {\n return {};\n }\n\n const dirtyFields: FormRecord = {};\n const keys = new Set([...Object.keys(current), ...Object.keys(initial)]);\n for (const key of keys) {\n const currentValue = current[key];\n const initialValue = initial[key];\n if (valuesEqual(currentValue, initialValue)) {\n continue;\n }\n dirtyFields[key] =\n isRecord(currentValue) && isRecord(initialValue)\n ? dirtyFieldsFromValues(currentValue, initialValue)\n : true;\n }\n return dirtyFields;\n}\n\nfunction hasDirtyValue(value: unknown): boolean {\n if (value === true) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.some(hasDirtyValue);\n }\n if (isRecord(value)) {\n return Object.values(value).some(hasDirtyValue);\n }\n return false;\n}\n\nfunction fieldPath(prefix: string, field: DescField): string {\n return prefix ? `${prefix}.${field.name}` : field.name;\n}\n\nfunction isUpdatableField(field: DescField): boolean {\n const behaviors = getExtension(\n field.proto.options ?? create(FieldOptionsSchema),\n fieldBehaviorExtension\n );\n return behaviors.every((behavior) => !NON_UPDATABLE_BEHAVIORS.has(behavior));\n}\n\nfunction findField(\n schema: DescMessage,\n segment: string\n): DescField | undefined {\n return schema.fields.find(\n (field) =>\n field.localName === segment ||\n field.name === segment ||\n field.jsonName === segment\n );\n}\n\nfunction normalizeFieldPath(schema: DescMessage, path: string): string {\n if (path === \"*\") {\n return path;\n }\n\n const segments = path.split(\".\").filter(Boolean);\n if (segments.length === 0) {\n throw new Error(\"Field mask paths cannot be empty.\");\n }\n\n const normalized: string[] = [];\n let currentSchema = schema;\n for (const [index, segment] of segments.entries()) {\n const field = findField(currentSchema, segment);\n if (!field) {\n throw new Error(`Unknown field mask path: ${path}`);\n }\n normalized.push(field.name);\n\n if (index === segments.length - 1) {\n break;\n }\n if (field.fieldKind === \"list\" || field.fieldKind === \"map\") {\n break;\n }\n if (field.fieldKind !== \"message\") {\n throw new Error(`Field mask path cannot traverse scalar field: ${path}`);\n }\n currentSchema = field.message;\n }\n return normalized.join(\".\");\n}\n\nfunction fieldOrder(schema: DescMessage, path: string): number[] {\n if (path === \"*\") {\n return [-1];\n }\n\n const order: number[] = [];\n let currentSchema = schema;\n for (const segment of path.split(\".\")) {\n const index = currentSchema.fields.findIndex(\n (candidate) => candidate.name === segment\n );\n order.push(index);\n const field = currentSchema.fields[index];\n if (field?.fieldKind !== \"message\") {\n break;\n }\n currentSchema = field.message;\n }\n return order;\n}\n\nfunction compareFieldOrder(\n schema: DescMessage,\n left: string,\n right: string\n): number {\n const leftOrder = fieldOrder(schema, left);\n const rightOrder = fieldOrder(schema, right);\n const length = Math.max(leftOrder.length, rightOrder.length);\n for (let index = 0; index < length; index += 1) {\n const difference = (leftOrder[index] ?? -1) - (rightOrder[index] ?? -1);\n if (difference !== 0) {\n return difference;\n }\n }\n return left.localeCompare(right);\n}\n\n/** Build a validated, canonical FieldMask from TypeScript or protobuf paths. */\nexport function createFieldMask(\n schema: DescMessage,\n paths: readonly string[]\n): FieldMask {\n const normalizedPaths = [\n ...new Set(paths.map((path) => normalizeFieldPath(schema, path))),\n ];\n if (normalizedPaths.includes(\"*\")) {\n return create(FieldMaskSchema, { paths: [\"*\"] });\n }\n const minimizedPaths = normalizedPaths.filter(\n (path) =>\n !normalizedPaths.some(\n (candidate) => candidate !== path && path.startsWith(`${candidate}.`)\n )\n );\n minimizedPaths.sort((left, right) => compareFieldOrder(schema, left, right));\n return create(FieldMaskSchema, { paths: minimizedPaths });\n}\n\nfunction collectFieldPaths(\n field: DescField,\n dirtyValue: unknown,\n currentValue: unknown,\n initialValue: unknown,\n prefix: string\n): string[] {\n if (!(hasDirtyValue(dirtyValue) && isUpdatableField(field))) {\n return [];\n }\n\n const path = fieldPath(prefix, field);\n if (\n dirtyValue === true ||\n field.fieldKind === \"list\" ||\n field.fieldKind === \"map\"\n ) {\n return [path];\n }\n if (field.fieldKind !== \"message\" || !isRecord(dirtyValue)) {\n return [path];\n }\n\n const nestedPaths = collectMessagePaths(\n field.message,\n dirtyValue,\n isRecord(currentValue) ? currentValue : {},\n isRecord(initialValue) ? initialValue : {},\n path\n );\n return nestedPaths.length > 0 ? nestedPaths : [path];\n}\n\nfunction collectOneofPaths(\n oneof: DescOneof,\n dirtyValue: unknown,\n currentValue: unknown,\n initialValue: unknown,\n prefix: string\n): string[] {\n if (!hasDirtyValue(dirtyValue)) {\n return [];\n }\n\n const selectedOneof =\n isRecord(currentValue) && typeof currentValue.case === \"string\"\n ? currentValue\n : initialValue;\n if (!isRecord(selectedOneof)) {\n return [];\n }\n const selectedCase = selectedOneof.case;\n if (typeof selectedCase !== \"string\") {\n return [];\n }\n const selectedField = oneof.fields.find(\n (field) => field.localName === selectedCase\n );\n if (!selectedField) {\n return [];\n }\n\n const nestedDirtyValue =\n isRecord(dirtyValue) &&\n dirtyValue.case !== true &&\n hasDirtyValue(dirtyValue.value)\n ? dirtyValue.value\n : true;\n const initialOneofValue = isRecord(initialValue)\n ? initialValue.value\n : undefined;\n return collectFieldPaths(\n selectedField,\n nestedDirtyValue,\n selectedOneof.value,\n initialOneofValue,\n prefix\n );\n}\n\nfunction collectMessagePaths(\n schema: DescMessage,\n dirtyFields: FormRecord,\n currentValues: FormRecord,\n initialValues: FormRecord,\n prefix = \"\"\n): string[] {\n return schema.members.flatMap((member) => {\n if (member.kind === \"oneof\") {\n return collectOneofPaths(\n member,\n dirtyFields[member.localName],\n currentValues[member.localName],\n initialValues[member.localName],\n prefix\n );\n }\n return collectFieldPaths(\n member,\n dirtyFields[member.localName],\n currentValues[member.localName],\n initialValues[member.localName],\n prefix\n );\n });\n}\n\n/** Build an update mask from react-hook-form's dirty field tree. */\nexport function createUpdateMask(\n schema: DescMessage,\n dirtyFields: unknown,\n currentValues: unknown,\n initialValues?: unknown\n): FieldMask {\n const paths = collectMessagePaths(\n schema,\n isRecord(dirtyFields) ? dirtyFields : {},\n isRecord(currentValues) ? currentValues : {},\n isRecord(initialValues) ? initialValues : {}\n );\n return createFieldMask(schema, paths);\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/form-schema.ts", "content": "import type { DescMessage, MessageValidType } from \"@bufbuild/protobuf\";\nimport type {\n FormValues,\n StandardSchemaV1,\n} from \"../core/index.js\";\n\nimport {\n type ProtoFormOptions,\n validateFormValuesAgainstProtoSchema,\n} from \"./provider.js\";\nimport { createDescriptorAwareStandardSchema } from \"./validation-schema.js\";\n\nfunction isFormValueObject(value: unknown): value is FormValues {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Expose protovalidate + CEL validation of a proto message as a Standard\n * Schema over FORM values: input is the form value bag, output is the\n * validated typed message, and failure issues carry form-shaped paths\n * (camelCase keys, oneofs flattened, map keys resolved to entry indices).\n *\n * This is the interop seam: anything that speaks Standard Schema v1\n * (React Hook Form via standardSchemaResolver, TanStack Form natively)\n * gets proto validation without importing protovalidate directly.\n */\nexport function createProtoFormSchema<\n Input extends object = FormValues,\n Desc extends DescMessage = DescMessage,\n>(\n desc: Desc,\n options: ProtoFormOptions = {}\n): StandardSchemaV1> {\n const messageSchema = createDescriptorAwareStandardSchema(desc, options);\n\n return {\n \"~standard\": {\n validate: (value) => {\n if (!isFormValueObject(value)) {\n return {\n issues: [\n { message: \"Expected form values to be an object.\", path: [] },\n ],\n };\n }\n return validateFormValuesAgainstProtoSchema(\n desc,\n value,\n messageSchema,\n options\n );\n },\n vendor: \"protoform\",\n version: 1,\n },\n };\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/format-error.ts", "content": "import {\n BadRequestSchema,\n DebugInfoSchema,\n ErrorInfoSchema,\n HelpSchema,\n LocalizedMessageSchema,\n PreconditionFailureSchema,\n QuotaFailureSchema,\n RequestInfoSchema,\n ResourceInfoSchema,\n RetryInfoSchema,\n} from \"@buf/googleapis_googleapis.bufbuild_es/google/rpc/error_details_pb.js\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\n\nconst CODE_LABELS: Record = {\n [Code.Canceled]: \"canceled\",\n [Code.Unknown]: \"unknown\",\n [Code.InvalidArgument]: \"invalid_argument\",\n [Code.DeadlineExceeded]: \"deadline_exceeded\",\n [Code.NotFound]: \"not_found\",\n [Code.AlreadyExists]: \"already_exists\",\n [Code.PermissionDenied]: \"permission_denied\",\n [Code.ResourceExhausted]: \"resource_exhausted\",\n [Code.FailedPrecondition]: \"failed_precondition\",\n [Code.Aborted]: \"aborted\",\n [Code.OutOfRange]: \"out_of_range\",\n [Code.Unimplemented]: \"unimplemented\",\n [Code.Internal]: \"internal\",\n [Code.Unavailable]: \"unavailable\",\n [Code.DataLoss]: \"data_loss\",\n [Code.Unauthenticated]: \"unauthenticated\",\n};\n\n/**\n * Get a human-readable label for a gRPC status code.\n */\nexport function grpcCodeLabel(code: number): string {\n return CODE_LABELS[code] ?? `code_${code}`;\n}\n\n/**\n * Extract a human-readable message from a Connect/gRPC error.\n * Preserves all available information: message, field violations, and gRPC code.\n */\nexport function formatConnectError(error: unknown): string {\n if (error instanceof ConnectError) {\n const violations = extractFieldViolations(error);\n const rawMessage = error.rawMessage;\n const codeLabel = grpcCodeLabel(error.code);\n\n const parts: string[] = [];\n if (rawMessage) {\n parts.push(rawMessage);\n }\n if (violations.length > 0) {\n parts.push(\n violations.map((v) => `${v.field}: ${v.description}`).join(\"; \")\n );\n }\n if (parts.length === 0) {\n return codeLabel;\n }\n return `${parts.join(\" — \")} (code: ${codeLabel})`;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nexport interface FieldViolation {\n description: string;\n field: string;\n}\n\n/**\n * Extract field violations from Connect error details via the generated\n * `google.rpc.BadRequest` schema. Returns an empty array when no\n * BadRequest detail is attached or parsing fails.\n */\nexport function extractFieldViolations(error: ConnectError): FieldViolation[] {\n const violations: FieldViolation[] = [];\n try {\n for (const badRequest of error.findDetails(BadRequestSchema)) {\n for (const v of badRequest.fieldViolations) {\n violations.push({ description: v.description, field: v.field });\n }\n }\n } catch {\n // Unexpected parse failure: fall through to empty.\n }\n return violations;\n}\n\n/**\n * Format a toast error message for API operations.\n * Pattern: \"Failed to {action} {entity}: {formatted error with code}\"\n */\nexport function formatToastErrorMessage({\n action,\n entity,\n error,\n}: {\n action: string;\n entity: string;\n error: unknown;\n}): string {\n return `Failed to ${action} ${entity}: ${formatConnectError(error)}`;\n}\n\nexport interface HelpLink {\n description: string;\n url: string;\n}\n\nexport interface PreconditionViolation {\n description: string;\n subject: string;\n type: string;\n}\n\nexport interface QuotaViolation {\n description: string;\n subject: string;\n}\n\nexport interface ConnectErrorContext {\n /** gRPC status code label (e.g. \"invalid_argument\"). Always populated for ConnectError. */\n code?: string;\n /** Dev-only stack frames / detail from google.rpc.DebugInfo. */\n debug?: { detail?: string; stackEntries?: string[] };\n /** Service domain from `google.rpc.ErrorInfo`. */\n domain?: string;\n /** Links the backend suggests the user follow (docs, status pages). */\n helpLinks: HelpLink[];\n /** Human-friendly top-level message. Prefers `LocalizedMessage.message` over `rawMessage`. */\n message?: string;\n /** Locale of the localized message if one was provided. */\n messageLocale?: string;\n /** Extra ErrorInfo metadata the server attached. */\n metadata?: Record;\n /** Precondition failures (typed, not per-field). */\n preconditionViolations: PreconditionViolation[];\n /** Quota failures. */\n quotaViolations: QuotaViolation[];\n /** Domain-scoped machine reason from `google.rpc.ErrorInfo` (useful for logs/telemetry). */\n reason?: string;\n /** Opaque request identifier for support tickets. */\n requestId?: string;\n /** Affected resource, if reported. */\n resource?: { name?: string; type?: string; description?: string };\n /** Retry hint in seconds. Set on rate-limit / resource-exhausted responses. */\n retryAfterSeconds?: number;\n /** Detail type names not interpreted by Protoform, preserved for fallback UI and telemetry. */\n unmappedDetails: string[];\n}\n\nconst MAPPED_DETAIL_TYPES: ReadonlySet = new Set([\n BadRequestSchema.typeName,\n DebugInfoSchema.typeName,\n ErrorInfoSchema.typeName,\n HelpSchema.typeName,\n LocalizedMessageSchema.typeName,\n PreconditionFailureSchema.typeName,\n QuotaFailureSchema.typeName,\n RequestInfoSchema.typeName,\n ResourceInfoSchema.typeName,\n RetryInfoSchema.typeName,\n]);\n\nfunction connectDetailTypeName(\n detail: ConnectError[\"details\"][number]\n): string | undefined {\n if (\"desc\" in detail) {\n return detail.desc.typeName;\n }\n return detail.type || undefined;\n}\n\n/**\n * Extract every surfacable detail from a `ConnectError` into one context object.\n * Non-ConnectError inputs yield an empty context (safe to render). All fields\n * optional; callers render only the pieces that are present.\n *\n * Uses `ConnectError.findDetails(Schema)` with the generated google.rpc.*\n * schemas so we don't hand-walk wire-format JSON. Types come from the proto\n * source of truth and handle both `value` (binary) and `debug` (JSON)\n * representations the Connect runtime surfaces.\n */\nexport function extractConnectErrorContext(\n error: unknown\n): ConnectErrorContext {\n const context: ConnectErrorContext = {\n helpLinks: [],\n preconditionViolations: [],\n quotaViolations: [],\n unmappedDetails: [],\n };\n\n if (!(error instanceof ConnectError)) {\n return context;\n }\n\n context.code = grpcCodeLabel(error.code);\n if (error.rawMessage) {\n context.message = error.rawMessage;\n }\n context.unmappedDetails = [\n ...new Set(\n error.details.flatMap((detail) => {\n const typeName = connectDetailTypeName(detail);\n return typeName && !MAPPED_DETAIL_TYPES.has(typeName) ? [typeName] : [];\n })\n ),\n ];\n\n try {\n // LocalizedMessage overrides rawMessage when present, carries locale.\n for (const localized of error.findDetails(LocalizedMessageSchema)) {\n if (localized.message) {\n context.message = localized.message;\n if (localized.locale) {\n context.messageLocale = localized.locale;\n }\n }\n }\n\n // Help: docs / status links the backend suggests.\n for (const help of error.findDetails(HelpSchema)) {\n for (const link of help.links) {\n if (link.url) {\n context.helpLinks.push({\n description: link.description || link.url,\n url: link.url,\n });\n }\n }\n }\n\n // ErrorInfo: machine reason/domain for telemetry, plus metadata (request_id stash).\n for (const info of error.findDetails(ErrorInfoSchema)) {\n if (info.reason) {\n context.reason = info.reason;\n }\n if (info.domain) {\n context.domain = info.domain;\n }\n const metaKeys = Object.keys(info.metadata);\n if (metaKeys.length > 0) {\n context.metadata = { ...info.metadata };\n const metaReq = info.metadata.request_id ?? info.metadata.requestId;\n if (metaReq && !context.requestId) {\n context.requestId = metaReq;\n }\n }\n }\n\n // RequestInfo: explicit request id (takes precedence over ErrorInfo.metadata).\n for (const req of error.findDetails(RequestInfoSchema)) {\n if (req.requestId) {\n context.requestId = req.requestId;\n }\n }\n\n // RetryInfo: seconds-until-retry hint. google.protobuf.Duration has\n // `seconds: bigint` + `nanos: number` in proto v2 generated types.\n for (const retry of error.findDetails(RetryInfoSchema)) {\n if (retry.retryDelay) {\n const seconds = Number(retry.retryDelay.seconds);\n const nanos = retry.retryDelay.nanos;\n context.retryAfterSeconds = seconds + nanos / 1e9;\n }\n }\n\n // DebugInfo: dev-only stack trace / detail.\n for (const dbg of error.findDetails(DebugInfoSchema)) {\n context.debug = { detail: dbg.detail, stackEntries: dbg.stackEntries };\n }\n\n // PreconditionFailure: typed violations (TOS, plan, etc.).\n for (const pre of error.findDetails(PreconditionFailureSchema)) {\n for (const v of pre.violations) {\n context.preconditionViolations.push({\n description: v.description,\n subject: v.subject,\n type: v.type,\n });\n }\n }\n\n // QuotaFailure: quota exhaustion details.\n for (const quota of error.findDetails(QuotaFailureSchema)) {\n for (const v of quota.violations) {\n context.quotaViolations.push({\n description: v.description,\n subject: v.subject,\n });\n }\n }\n\n // ResourceInfo: affected resource descriptor.\n for (const resource of error.findDetails(ResourceInfoSchema)) {\n context.resource = {\n description: resource.description || undefined,\n name: resource.resourceName || undefined,\n type: resource.resourceType || undefined,\n };\n }\n } catch {\n // Malformed details: fall through with whatever we extracted so far.\n }\n\n return context;\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/format-submitted-value.ts", "content": "/** Formats protobuf-shaped form output for display. */\nexport function formatSubmittedValue(value: Record): string {\n return JSON.stringify(\n value,\n (_key, nestedValue: unknown) => {\n if (typeof nestedValue === \"bigint\") {\n return nestedValue.toString();\n }\n if (nestedValue instanceof Uint8Array) {\n return Array.from(nestedValue);\n }\n return nestedValue;\n },\n 2\n );\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/gen/auto-form-example_form.ts", "content": "export * from './protoform/v1/auto_form_example_form';\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/gen/auto-form-example_pb.ts", "content": "export * from './protoform/v1/auto_form_example_pb.js';\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/gen/protoform/v1/auto_form_example_form.ts", "content": "// @generated by protoc-gen-protoform v1.0.0 with parameter \"target=ts,import_extension=js\"\n// @generated from file protoform/v1/auto_form_example.proto (package protoform.v1, syntax proto3)\n/* eslint-disable */\n\nimport { createProtoFormSchema, parseProtoSchema, protoToFormValues, registerProtoAnnotations } from \"@/lib/protobuf-provider\";\nimport { AddressSchema, AutoFormExampleSchema, AutoFormUiMetadataExampleSchema, GeoPointSchema, NestedSettingSchema, ProfileSettingsSchema } from \"./auto_form_example_pb.js\";\n\n/**\n * Source documentation for protoform.v1.AutoFormExample.\n */\nexport const AutoFormExampleFormAnnotations = {\n fields: {\n \"protoform.v1.AutoFormExample.username\": \"Public handle shown in mentions and admin lists.\",\n \"protoform.v1.AutoFormExample.primaryEmail\": \"Main email address for notifications and login recovery.\",\n \"protoform.v1.AutoFormExample.homepageUrl\": \"Optional personal or team homepage.\",\n \"protoform.v1.AutoFormExample.resourceId\": \"UUID copied from an upstream system.\",\n \"protoform.v1.AutoFormExample.bio\": \"Free-form summary shown on the profile card.\",\n \"protoform.v1.AutoFormExample.avatarBytes\": \"Optional avatar payload for attachment-based workflows.\",\n \"protoform.v1.AutoFormExample.shippingAddress\": \"Shipping destination used for hardware deliveries.\",\n \"protoform.v1.AutoFormExample.tags\": \"Lightweight labels used for quick filtering.\",\n \"protoform.v1.AutoFormExample.labels\": \"Flat metadata pairs for analytics and routing.\",\n \"protoform.v1.AutoFormExample.officeLocations\": \"Named office addresses keyed by a short slug.\",\n \"protoform.v1.AutoFormExample.preferredEmail\": \"Route updates to an email inbox.\",\n \"protoform.v1.AutoFormExample.preferredPhone\": \"Route urgent notices to an E.164 phone number.\",\n \"protoform.v1.AutoFormExample.doNotContact\": \"Opt out of direct outreach entirely.\",\n \"protoform.v1.AutoFormExample.createdAt\": \"Timestamp captured when the record was created.\",\n \"protoform.v1.AutoFormExample.reminderInterval\": \"Delay between reminder notifications.\",\n \"protoform.v1.AutoFormExample.writablePaths\": \"Fields the current actor is allowed to update.\",\n \"protoform.v1.AutoFormExample.preferences\": \"Arbitrary preference flags stored as a JSON-ish struct.\",\n \"protoform.v1.AutoFormExample.featuredValue\": \"Generic featured value for experiments and demos.\",\n \"protoform.v1.AutoFormExample.dashboardBlocks\": \"Ordered dashboard widgets stored as a dynamic list.\",\n \"protoform.v1.AutoFormExample.externalPayload\": \"External Any payload kept intentionally loose for edge-case coverage.\",\n \"protoform.v1.AutoFormExample.settings\": \"Nested support settings with their own CEL validation rule.\",\n },\n messages: {\n \"protoform.v1.AutoFormExample\": \"Primary protobuf fixture for AutoForm. It intentionally mixes scalar, nested,\\n repeated, map, oneof, and well-known types so the form generator can exercise\\n the sketchier corners of descriptor-driven rendering.\",\n \"protoform.v1.Address\": \"Postal address used by several nested object fields and maps.\",\n \"protoform.v1.GeoPoint\": \"Latitude/longitude pair used by the nested Address message.\",\n \"protoform.v1.ProfileSettings\": \"Support workflow settings nested under the main example message.\",\n \"protoform.v1.NestedSetting\": \"Small nested settings entry used inside a protobuf map.\",\n },\n oneofs: {\n \"protoform.v1.AutoFormExample.preferredContact\": \"Exactly one preferred contact route can be selected at a time.\",\n },\n} as const;\nregisterProtoAnnotations(AutoFormExampleSchema, AutoFormExampleFormAnnotations);\n\n/**\n * Form binding for message protoform.v1.AutoFormExample.\n */\nexport const AutoFormExampleFormBinding = {\n annotations: AutoFormExampleFormAnnotations,\n createFormSchema: (options?: Parameters[1]) => createProtoFormSchema(AutoFormExampleSchema, options),\n defaultValues: () => protoToFormValues(AutoFormExampleSchema),\n descriptor: AutoFormExampleSchema,\n parseSchema: () => parseProtoSchema(AutoFormExampleSchema),\n} as const;\n\n/**\n * Source documentation for protoform.v1.AutoFormUiMetadataExample.\n */\nexport const AutoFormUiMetadataExampleFormAnnotations = {\n fields: {\n \"protoform.v1.AutoFormUiMetadataExample.clusterName\": \"Friendly cluster name shown in rollout summaries.\",\n \"protoform.v1.AutoFormUiMetadataExample.provider\": \"Cloud provider where the request will be deployed.\",\n \"protoform.v1.AutoFormUiMetadataExample.region\": \"Region where the cluster will be created.\",\n \"protoform.v1.AutoFormUiMetadataExample.enableSupportMode\": \"Toggle the conditional support step on or off.\",\n \"protoform.v1.AutoFormUiMetadataExample.supportTier\": \"Requested support tier for the deployment.\",\n \"protoform.v1.AutoFormUiMetadataExample.maintenanceWindow\": \"Requested maintenance window for premium support coordination.\",\n \"protoform.v1.AutoFormUiMetadataExample.escalationReason\": \"Extra context only needed for platinum support requests.\",\n \"protoform.v1.AutoFormUiMetadataExample.supportEmail\": \"Route follow-up through an email inbox.\",\n \"protoform.v1.AutoFormUiMetadataExample.slackChannel\": \"Route follow-up through a Slack channel.\",\n \"protoform.v1.AutoFormUiMetadataExample.noFollowUp\": \"Explicitly avoid any follow-up contact.\",\n \"protoform.v1.AutoFormUiMetadataExample.apiToken\": \"API token for authenticating with the deployment service.\",\n \"protoform.v1.AutoFormUiMetadataExample.approvalTicket\": \"Approval or change-management ticket for the deployment.\",\n \"protoform.v1.AutoFormUiMetadataExample.enableDryRun\": \"Keep a final dry-run toggle in the deploy section.\",\n },\n messages: {\n \"protoform.v1.AutoFormUiMetadataExample\": \"Focused protobuf fixture for proto UI metadata and UI CEL demos.\",\n },\n oneofs: {\n \"protoform.v1.AutoFormUiMetadataExample.supportContact\": \"Pick exactly one support contact route once premium support is active.\",\n },\n} as const;\nregisterProtoAnnotations(AutoFormUiMetadataExampleSchema, AutoFormUiMetadataExampleFormAnnotations);\n\n/**\n * Form binding for message protoform.v1.AutoFormUiMetadataExample.\n */\nexport const AutoFormUiMetadataExampleFormBinding = {\n annotations: AutoFormUiMetadataExampleFormAnnotations,\n createFormSchema: (options?: Parameters[1]) => createProtoFormSchema(AutoFormUiMetadataExampleSchema, options),\n defaultValues: () => protoToFormValues(AutoFormUiMetadataExampleSchema),\n descriptor: AutoFormUiMetadataExampleSchema,\n parseSchema: () => parseProtoSchema(AutoFormUiMetadataExampleSchema),\n} as const;\n\n/**\n * Source documentation for protoform.v1.Address.\n */\nexport const AddressFormAnnotations = {\n messages: {\n \"protoform.v1.Address\": \"Postal address used by several nested object fields and maps.\",\n \"protoform.v1.GeoPoint\": \"Latitude/longitude pair used by the nested Address message.\",\n },\n} as const;\nregisterProtoAnnotations(AddressSchema, AddressFormAnnotations);\n\n/**\n * Form binding for message protoform.v1.Address.\n */\nexport const AddressFormBinding = {\n annotations: AddressFormAnnotations,\n createFormSchema: (options?: Parameters[1]) => createProtoFormSchema(AddressSchema, options),\n defaultValues: () => protoToFormValues(AddressSchema),\n descriptor: AddressSchema,\n parseSchema: () => parseProtoSchema(AddressSchema),\n} as const;\n\n/**\n * Source documentation for protoform.v1.GeoPoint.\n */\nexport const GeoPointFormAnnotations = {\n messages: {\n \"protoform.v1.GeoPoint\": \"Latitude/longitude pair used by the nested Address message.\",\n },\n} as const;\nregisterProtoAnnotations(GeoPointSchema, GeoPointFormAnnotations);\n\n/**\n * Form binding for message protoform.v1.GeoPoint.\n */\nexport const GeoPointFormBinding = {\n annotations: GeoPointFormAnnotations,\n createFormSchema: (options?: Parameters[1]) => createProtoFormSchema(GeoPointSchema, options),\n defaultValues: () => protoToFormValues(GeoPointSchema),\n descriptor: GeoPointSchema,\n parseSchema: () => parseProtoSchema(GeoPointSchema),\n} as const;\n\n/**\n * Source documentation for protoform.v1.ProfileSettings.\n */\nexport const ProfileSettingsFormAnnotations = {\n messages: {\n \"protoform.v1.ProfileSettings\": \"Support workflow settings nested under the main example message.\",\n \"protoform.v1.NestedSetting\": \"Small nested settings entry used inside a protobuf map.\",\n },\n} as const;\nregisterProtoAnnotations(ProfileSettingsSchema, ProfileSettingsFormAnnotations);\n\n/**\n * Form binding for message protoform.v1.ProfileSettings.\n */\nexport const ProfileSettingsFormBinding = {\n annotations: ProfileSettingsFormAnnotations,\n createFormSchema: (options?: Parameters[1]) => createProtoFormSchema(ProfileSettingsSchema, options),\n defaultValues: () => protoToFormValues(ProfileSettingsSchema),\n descriptor: ProfileSettingsSchema,\n parseSchema: () => parseProtoSchema(ProfileSettingsSchema),\n} as const;\n\n/**\n * Source documentation for protoform.v1.NestedSetting.\n */\nexport const NestedSettingFormAnnotations = {\n messages: {\n \"protoform.v1.NestedSetting\": \"Small nested settings entry used inside a protobuf map.\",\n },\n} as const;\nregisterProtoAnnotations(NestedSettingSchema, NestedSettingFormAnnotations);\n\n/**\n * Form binding for message protoform.v1.NestedSetting.\n */\nexport const NestedSettingFormBinding = {\n annotations: NestedSettingFormAnnotations,\n createFormSchema: (options?: Parameters[1]) => createProtoFormSchema(NestedSettingSchema, options),\n defaultValues: () => protoToFormValues(NestedSettingSchema),\n descriptor: NestedSettingSchema,\n parseSchema: () => parseProtoSchema(NestedSettingSchema),\n} as const;\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/gen/protoform/v1/auto_form_example_pb.ts", "content": "// @generated by protoc-gen-es v2.13.0 with parameter \"target=ts,import_extension=js\"\n// @generated from file protoform/v1/auto_form_example.proto (package protoform.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenEnum, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_protoform_v1_auto_form_ui } from \"./auto_form_ui_pb.js\";\nimport { file_buf_validate_validate } from \"../../buf/validate/validate_pb.js\";\nimport type { Any, Duration, FieldMask, ListValue, Timestamp, Value } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_any, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_struct, file_google_protobuf_timestamp, file_google_protobuf_wrappers } from \"@bufbuild/protobuf/wkt\";\nimport type { JsonObject, Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file protoform/v1/auto_form_example.proto.\n */\nexport const file_protoform_v1_auto_form_example: GenFile = /*@__PURE__*/\n fileDesc(\"CiRwcm90b2Zvcm0vdjEvYXV0b19mb3JtX2V4YW1wbGUucHJvdG8SDHByb3RvZm9ybS52MSKsFwoPQXV0b0Zvcm1FeGFtcGxlEiwKCHVzZXJuYW1lGAEgASgJQhq6SBfIAQFyEhADGCAyDF5bYS16MC05X10rJBJNCg1wcmltYXJ5X2VtYWlsGAIgASgJQja6SAfIAQFyAmAByvMYKAgEEhB0ZWFtQGV4YW1wbGUuY29tGhJhbGVydHNAZXhhbXBsZS5jb20SWwoMaG9tZXBhZ2VfdXJsGAMgASgJQkW6SAVyA4gBAcrzGDkIBRIYaHR0cHM6Ly9leGFtcGxlLmNvbS9kb2NzGhtodHRwczovL2V4YW1wbGUuY29tL3Byb2R1Y3QSHQoLcmVzb3VyY2VfaWQYBCABKAlCCLpIBXIDsAEBEmwKA2JpbxgFIAEoCUJfukgFcgMYmALK8xhTCAISJFNoYXJlIGEgc2hvcnQgc3VtbWFyeSBmb3IgcmV2aWV3ZXJzLhopUGxhdGZvcm0gYWRtaW4gZm9yIHRoZSB0aGUgY29udHJvbCBwbGFuZS4SSwoKaXNfZW5hYmxlZBgGIAEoCEI3yvMYMwgIIi9Ub2dnbGUgdGhlIHJlcXVlc3Qgb24gb3Igb2ZmIGJlZm9yZSBpdCBpcyBzZW50LhIWCgNhZ2UYByABKAVCCbpIBhoEGHgoDRIeCgtsb2dpbl9jb3VudBgIIAEoDUIJukgGKgQYoI0GEiUKEHJlcHV0YXRpb25fZGVsdGEYCSABKBFCC7pICDoGGNAPKM8PEiAKD2VtcGxveWVlX251bWJlchgKIAEoA0IHukgEIgIgABIlChNzdG9yYWdlX3F1b3RhX2J5dGVzGAsgASgEQgi6SAUyAyiACBImCg1wcm9maWxlX3Njb3JlGAwgASgCQg+6SAwKCh0AAMhCLQAAAAASQgoPYWNjb3VudF9iYWxhbmNlGA0gASgBQim6SBQSEhkAAAAAgIQuQSkAAAAAAAAAAMrzGA4IBhoKJDEyLDUwMC4wMBIeCgxhdmF0YXJfYnl0ZXMYDiABKAxCCLpIBXoDGIAEEnUKC2FjY2Vzc190aWVyGA8gASgOMhgucHJvdG9mb3JtLnYxLkFjY2Vzc1RpZXJCRrpIBYIBAhAByvMYOggKIjZDaG9vc2UgdGhlIGFjY2VzcyB0aWVyIHRoYXQgYmVzdCBtYXRjaGVzIHRoaXMgcmVxdWVzdC4SNwoQc2hpcHBpbmdfYWRkcmVzcxgQIAEoCzIVLnByb3RvZm9ybS52MS5BZGRyZXNzQga6SAPIAQESXQoPYmlsbGluZ19hZGRyZXNzGBEgASgLMhUucHJvdG9mb3JtLnYxLkFkZHJlc3NCLcrzGCkqJwoPYmlsbGluZy52aXNpYmxlEhRmb3JtLmFjY2Vzc1RpZXIgPT0gMxJNCghuaWNrbmFtZRgSIAEoCUI2ukgGcgQQAhgoyvMYKSonChBuaWNrbmFtZS52aXNpYmxlEhNmb3JtLnVzZXJuYW1lICE9ICcnSAGIAQESOgoLbWlkZGxlX25hbWUYEyABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWVCB7pIBHICGCgSZAoMYm9udXNfcG9pbnRzGBQgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVCMbpIBxoFGJBOKADK8xgjMiEKDmJvbnVzLmRpc2FibGVkEg8hZm9ybS5pc0VuYWJsZWQSgwEKC2JldGFfdGVzdGVyGBUgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZUJSyvMYTggJIkpVc2UgYSBjb21wYWN0IHRvZ2dsZSB3aGVuIHRoaXMgb3B0aW9uYWwgc2V0dGluZyBjYW4gYmUgc3dpdGNoZWQgb24gb3Igb2ZmLhIwCgR0YWdzGBYgAygJQiK6SB+SARwIARAFGAEiFHISEAIYGDIMXlthLXowLTktXSskEjsKEnByZXZpb3VzX2FkZHJlc3NlcxgXIAMoCzIVLnByb3RvZm9ybS52MS5BZGRyZXNzQgi6SAWSAQIQAxIpCg1sdWNreV9udW1iZXJzGBggAygFQhK6SA+SAQwQBBgBIgYaBBhjKAESegoGbGFiZWxzGBkgAygLMikucHJvdG9mb3JtLnYxLkF1dG9Gb3JtRXhhbXBsZS5MYWJlbHNFbnRyeUI/ukgnmgEkCAEQBCIWchQQAhgYMg5eW2EtejAtOV8uLV0rJCoGcgQQARhAyvMYEQgOGg10ZWFtPWZyb250ZW5kEm4KEG9mZmljZV9sb2NhdGlvbnMYGiADKAsyMi5wcm90b2Zvcm0udjEuQXV0b0Zvcm1FeGFtcGxlLk9mZmljZUxvY2F0aW9uc0VudHJ5QiC6SB2aARoQAyIWchQQAhgYMg5eW2EtejAtOV8uLV0rJBIiCg9wcmVmZXJyZWRfZW1haWwYGyABKAlCB7pIBHICYAFIABIzCg9wcmVmZXJyZWRfcGhvbmUYHCABKAlCGLpIFXITMhFeXCtbMS05XVxkezEsMTR9JEgAEhgKDmRvX25vdF9jb250YWN0GB0gASgISAASPAoKY3JlYXRlZF9hdBgeIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCDLpIA8gBAcrzGAIIERI/CgpleHBpcmVzX2F0GB8gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIPukgMsgEJSgUIgOeED0ABEkYKEXJlbWluZGVyX2ludGVydmFsGCAgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQhC6SA2qAQoiBAiA9SQyAgg8EnIKDndyaXRhYmxlX3BhdGhzGCEgASgLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza0I+ukg74gE4Egdwcm9maWxlEgtwcm9maWxlLmJpbxILcHJlZmVyZW5jZXMSE25vdGlmaWNhdGlvbnMuZW1haWwSLAoLcHJlZmVyZW5jZXMYIiABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0Ei4KDmZlYXR1cmVkX3ZhbHVlGCMgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlEjQKEGRhc2hib2FyZF9ibG9ja3MYJCABKAsyGi5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlEmIKEGV4dGVybmFsX3BheWxvYWQYJSABKAsyFC5nb29nbGUucHJvdG9idWYuQW55QjK6SC+iASwSKnR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlN0cnVjdBIkChFtaW5pbXVtX3RocmVzaG9sZBgmIAEoBUIJukgGGgQYZCgAEiQKEW1heGltdW1fdGhyZXNob2xkGCcgASgFQgm6SAYaBBhkKAASLwoIc2V0dGluZ3MYKCABKAsyHS5wcm90b2Zvcm0udjEuUHJvZmlsZVNldHRpbmdzGi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaTQoUT2ZmaWNlTG9jYXRpb25zRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUucHJvdG9mb3JtLnYxLkFkZHJlc3M6AjgBOo4BukiKARqHAQoPdGhyZXNob2xkLnJhbmdlEkJNaW5pbXVtIHRocmVzaG9sZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtYXhpbXVtIHRocmVzaG9sZC4aMHRoaXMubWluaW11bV90aHJlc2hvbGQgPD0gdGhpcy5tYXhpbXVtX3RocmVzaG9sZEJmChFwcmVmZXJyZWRfY29udGFjdBJRukgCCAHS8xhICjNQaWNrIGV4YWN0bHkgb25lIHJvdXRlIGZvciBmb2xsb3ctdXAgY29tbXVuaWNhdGlvbi4qEVByZWZlcnJlZCBjb250YWN0QgsKCV9uaWNrbmFtZSLyDAoZQXV0b0Zvcm1VaU1ldGFkYXRhRXhhbXBsZRKOAQoMY2x1c3Rlcl9uYW1lGAEgASgJQni6SAnIAQFyBBADGD/K8xhoEhZzY2FybGV0LWZvcmVzdC1kb2xwaGluIkZVc2UgdGhlIG5hbWUgb3BlcmF0b3JzIHdpbGwgcmVjb2duaXplIGluIGRlcGxveW1lbnQgYW5kIHN1cHBvcnQgdG9vbHMuOgZiYXNpY3MSgQEKCHByb3ZpZGVyGAIgASgOMhwucHJvdG9mb3JtLnYxLlVpRGVtb1Byb3ZpZGVyQlG6SAWCAQIQAcrzGEUICiJBUmFkaW8gYnV0dG9ucyBtYWtlIHNtYWxsIGVudW1zIGVhc2llciB0byBzY2FuIGluIGdlbmVyYXRlZCBmb3Jtcy4SiwEKBnJlZ2lvbhgDIAEoCUJ7ukgJyAEBcgQQAxggyvMYaxIJdXMtZWFzdC0yIjdUaGlzIGZpZWxkIHN0YXlzIGRpc2FibGVkIHVudGlsIGEgcHJvdmlkZXIgaXMgc2VsZWN0ZWQuMiUKD3JlZ2lvbi5kaXNhYmxlZBISZm9ybS5wcm92aWRlciA9PSAwEnIKE2VuYWJsZV9zdXBwb3J0X21vZGUYBCABKAhCVcrzGFEICSJNVHVybiB0aGlzIG9uIHRvIHJldmVhbCB0aGVzdXBwb3J0IGNvbnRyb2xzIHRoYXQgYXJlIGRyaXZlbiBieSBmaWVsZCBVSSBydWxlcy4SmgEKDHN1cHBvcnRfdGllchgFIAEoDjIfLnByb3RvZm9ybS52MS5VaURlbW9TdXBwb3J0VGllckJjyvMYXwgKIltTZWxlY3RpbmcgYSBzdXBwb3J0IHRpZXIgZW5hYmxlcyB0aGUgdGltZXN0YW1wIGZpZWxkIGFuZCByZXZlYWxzIHRoZSBzdXBwb3J0IGNvbnRhY3Qgb25lb2YuEqQBChJtYWludGVuYW5jZV93aW5kb3cYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQmzK8xhoCBEiNVRoaXMgc3RheXMgZGlzYWJsZWQgdW50aWwgYSBzdXBwb3J0IHRpZXIgaXMgc2VsZWN0ZWQuMi0KFG1haW50ZW5hbmNlLmRpc2FibGVkEhVmb3JtLnN1cHBvcnRUaWVyID09IDAS0AEKEWVzY2FsYXRpb25fcmVhc29uGAcgASgJQrQBukgFcgMYmALK8xinAQgCEjFFeHBsYWluIHdoeSB0aGlzIHJvbGxvdXQgbmVlZHMgcGxhdGludW0gY292ZXJhZ2UuIkFUaGlzIGZpZWxkIGlzIGhpZGRlbiB1bmxlc3MgdGhlIGhpZ2hlc3Qgc3VwcG9ydCB0aWVyIGlzIHNlbGVjdGVkLiorChJlc2NhbGF0aW9uLnZpc2libGUSFWZvcm0uc3VwcG9ydFRpZXIgPT0gM0gBEiAKDXN1cHBvcnRfZW1haWwYCCABKAlCB7pIBHICYAFIABI0Cg1zbGFja19jaGFubmVsGAkgASgJQhu6SBhyFjIUXiM/W2EtejAtOV8tXXszLDgwfSRIABIWCgxub19mb2xsb3dfdXAYCiABKAhIABItCglhcGlfdG9rZW4YDSABKAlCGrpIBXIDGIACyvMYDggDEgpycF90b2tfLi4uEocBCg9hcHByb3ZhbF90aWNrZXQYCyABKAlCbrpICcgBAXIEEAMYKMrzGF4SB09QUy0xNDIiU0ZpbmFsIGZpZWxkcyBjYW4gc3RheSBzaW1wbGUgd2hpbGUgb3RoZXIgZmllbGRzIHVzZSBDRUwgZm9yIHByb2dyZXNzaXZlIGRpc2Nsb3N1cmUuEh4KDmVuYWJsZV9kcnlfcnVuGAwgASgIQgbK8xgCCAlC3QEKD3N1cHBvcnRfY29udGFjdBLJAdLzGMQBClxUaGlzIG9uZW9mIGlzIGFsc28gZHJpdmVuIGJ5IFVJIG1ldGFkYXRhLCBzbyBpdCBvbmx5IGFwcGVhcnMgYWZ0ZXIgYSBzdXBwb3J0IHRpZXIgaXMgY2hvc2VuLhJKChdzdXBwb3J0LmNvbnRhY3QudmlzaWJsZRIvZm9ybS5lbmFibGVTdXBwb3J0TW9kZSAmJiBmb3JtLnN1cHBvcnRUaWVyICE9IDAiB3N1cHBvcnQqD1N1cHBvcnQgY29udGFjdCKNAgoHQWRkcmVzcxIcCghsaW5lX29uZRgBIAEoCUIKukgHyAEBcgIQAxIYCgRjaXR5GAIgASgJQgq6SAfIAQFyAhACEhYKBXN0YXRlGAMgASgJQge6SARyAhACEi4KC3Bvc3RhbF9jb2RlGAQgASgJQhm6SBZyFDISXltBLVowLTkgLV17MywxMn0kEjQKB2NvdW50cnkYBSABKA4yGS5wcm90b2Zvcm0udjEuQ291bnRyeUNvZGVCCLpIBYIBAhABEigKCGxvY2F0aW9uGAYgASgLMhYucHJvdG9mb3JtLnYxLkdlb1BvaW50EhUKCGxpbmVfdHdvGAcgASgJSACIAQFCCwoJX2xpbmVfdHdvImEKCEdlb1BvaW50EikKCGxhdGl0dWRlGAEgASgBQhe6SBQSEhkAAAAAAIBWQCkAAAAAAIBWwBIqCglsb25naXR1ZGUYAiABKAFCF7pIFBISGQAAAAAAgGZAKQAAAAAAgGbAIsMFCg9Qcm9maWxlU2V0dGluZ3MSIwoTZW5hYmxlX3N1cHBvcnRfbW9kZRgBIAEoCEIGyvMYAggIEoYBChBlc2NhbGF0aW9uX2xldmVsGAIgASgOMh0ucHJvdG9mb3JtLnYxLkVzY2FsYXRpb25MZXZlbEJNukgFggECEAHK8xhBMj8KG3N1cHBvcnQuZXNjYWxhdGlvbi5kaXNhYmxlZBIgIWZvcm0uc2V0dGluZ3MuZW5hYmxlU3VwcG9ydE1vZGUSaQoVbm90aWZpY2F0aW9uX2NoYW5uZWxzGAMgAygOMiEucHJvdG9mb3JtLnYxLk5vdGlmaWNhdGlvbkNoYW5uZWxCJ7pIEJIBDQgBEAQYASIFggECEAHK8xgQCA0aDEVNQUlMLCBTTEFDSxKmAQoPbmVzdGVkX3NldHRpbmdzGAQgAygLMjEucHJvdG9mb3JtLnYxLlByb2ZpbGVTZXR0aW5ncy5OZXN0ZWRTZXR0aW5nc0VudHJ5Qlq6SA2aAQoQAyIGcgQQAhgeyvMYRiJES2VlcCBzdXBwb3J0IHNldHRpbmdzIGdyb3VwZWQgYnkga2V5IHNvIHJlbGF0ZWQgcnVsZXMgc3RheSB0b2dldGhlci4aUgoTTmVzdGVkU2V0dGluZ3NFbnRyeRILCgNrZXkYASABKAkSKgoFdmFsdWUYAiABKAsyGy5wcm90b2Zvcm0udjEuTmVzdGVkU2V0dGluZzoCOAE6mQG6SJUBGpIBChtzdXBwb3J0LnJlcXVpcmVzLmVzY2FsYXRpb24SOkVzY2FsYXRpb24gbGV2ZWwgbXVzdCBiZSBzZXQgd2hlbiBzdXBwb3J0IG1vZGUgaXMgZW5hYmxlZC4aNyF0aGlzLmVuYWJsZV9zdXBwb3J0X21vZGUgfHwgdGhpcy5lc2NhbGF0aW9uX2xldmVsICE9IDAiWgoNTmVzdGVkU2V0dGluZxIWCgVsYWJlbBgBIAEoCUIHukgEcgIQAhIxCg1zY2hlZHVsZWRfZm9yGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCpwCgpBY2Nlc3NUaWVyEhsKF0FDQ0VTU19USUVSX1VOU1BFQ0lGSUVEEAASFgoSQUNDRVNTX1RJRVJfVklFV0VSEAESFgoSQUNDRVNTX1RJRVJfRURJVE9SEAISFQoRQUNDRVNTX1RJRVJfQURNSU4QAyqCAQoOVWlEZW1vUHJvdmlkZXISIAocVUlfREVNT19QUk9WSURFUl9VTlNQRUNJRklFRBAAEhgKFFVJX0RFTU9fUFJPVklERVJfQVdTEAESGAoUVUlfREVNT19QUk9WSURFUl9HQ1AQAhIaChZVSV9ERU1PX1BST1ZJREVSX0FaVVJFEAMqogEKEVVpRGVtb1N1cHBvcnRUaWVyEiQKIFVJX0RFTU9fU1VQUE9SVF9USUVSX1VOU1BFQ0lGSUVEEAASIQodVUlfREVNT19TVVBQT1JUX1RJRVJfU1RBTkRBUkQQARIhCh1VSV9ERU1PX1NVUFBPUlRfVElFUl9QUklPUklUWRACEiEKHVVJX0RFTU9fU1VQUE9SVF9USUVSX1BMQVRJTlVNEAMqfwoLQ291bnRyeUNvZGUSHAoYQ09VTlRSWV9DT0RFX1VOU1BFQ0lGSUVEEAASEwoPQ09VTlRSWV9DT0RFX1VTEAESEwoPQ09VTlRSWV9DT0RFX0NBEAISEwoPQ09VTlRSWV9DT0RFX0RFEAMSEwoPQ09VTlRSWV9DT0RFX1BMEAQqhQEKD0VzY2FsYXRpb25MZXZlbBIgChxFU0NBTEFUSU9OX0xFVkVMX1VOU1BFQ0lGSUVEEAASGAoURVNDQUxBVElPTl9MRVZFTF9MT1cQARIbChdFU0NBTEFUSU9OX0xFVkVMX01FRElVTRACEhkKFUVTQ0FMQVRJT05fTEVWRUxfSElHSBADKr0BChNOb3RpZmljYXRpb25DaGFubmVsEiQKIE5PVElGSUNBVElPTl9DSEFOTkVMX1VOU1BFQ0lGSUVEEAASHgoaTk9USUZJQ0FUSU9OX0NIQU5ORUxfRU1BSUwQARIcChhOT1RJRklDQVRJT05fQ0hBTk5FTF9TTVMQAhIeChpOT1RJRklDQVRJT05fQ0hBTk5FTF9TTEFDSxADEiIKHk5PVElGSUNBVElPTl9DSEFOTkVMX1BBR0VSRFVUWRAEQk1aS2dpdGh1Yi5jb20vbWFsaW5za2liZW5pYW1pbi9wcm90b2Zvcm0vcHJvdG8vZ2VuL2dvL3Byb3RvZm9ybS92MTtwcm90b2Zvcm12MWIGcHJvdG8z\", [file_protoform_v1_auto_form_ui, file_buf_validate_validate, file_google_protobuf_any, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_struct, file_google_protobuf_timestamp, file_google_protobuf_wrappers]);\n\n/**\n * Primary protobuf fixture for AutoForm. It intentionally mixes scalar, nested,\n * repeated, map, oneof, and well-known types so the form generator can exercise\n * the sketchier corners of descriptor-driven rendering.\n *\n * @generated from message protoform.v1.AutoFormExample\n */\nexport type AutoFormExample = Message<\"protoform.v1.AutoFormExample\"> & {\n /**\n * Public handle shown in mentions and admin lists.\n *\n * @generated from field: string username = 1;\n */\n username: string;\n\n /**\n * Main email address for notifications and login recovery.\n *\n * @generated from field: string primary_email = 2;\n */\n primaryEmail: string;\n\n /**\n * Optional personal or team homepage.\n *\n * @generated from field: string homepage_url = 3;\n */\n homepageUrl: string;\n\n /**\n * UUID copied from an upstream system.\n *\n * @generated from field: string resource_id = 4;\n */\n resourceId: string;\n\n /**\n * Free-form summary shown on the profile card.\n *\n * @generated from field: string bio = 5;\n */\n bio: string;\n\n /**\n * @generated from field: bool is_enabled = 6;\n */\n isEnabled: boolean;\n\n /**\n * @generated from field: int32 age = 7;\n */\n age: number;\n\n /**\n * @generated from field: uint32 login_count = 8;\n */\n loginCount: number;\n\n /**\n * @generated from field: sint32 reputation_delta = 9;\n */\n reputationDelta: number;\n\n /**\n * @generated from field: int64 employee_number = 10;\n */\n employeeNumber: bigint;\n\n /**\n * @generated from field: uint64 storage_quota_bytes = 11;\n */\n storageQuotaBytes: bigint;\n\n /**\n * @generated from field: float profile_score = 12;\n */\n profileScore: number;\n\n /**\n * @generated from field: double account_balance = 13;\n */\n accountBalance: number;\n\n /**\n * Optional avatar payload for attachment-based workflows.\n *\n * @generated from field: bytes avatar_bytes = 14;\n */\n avatarBytes: Uint8Array;\n\n /**\n * @generated from field: protoform.v1.AccessTier access_tier = 15;\n */\n accessTier: AccessTier;\n\n /**\n * Shipping destination used for hardware deliveries.\n *\n * @generated from field: protoform.v1.Address shipping_address = 16;\n */\n shippingAddress?: Address | undefined;\n\n /**\n * @generated from field: protoform.v1.Address billing_address = 17;\n */\n billingAddress?: Address | undefined;\n\n /**\n * @generated from field: optional string nickname = 18;\n */\n nickname?: string | undefined;\n\n /**\n * @generated from field: google.protobuf.StringValue middle_name = 19;\n */\n middleName?: string | undefined;\n\n /**\n * @generated from field: google.protobuf.Int32Value bonus_points = 20;\n */\n bonusPoints?: number | undefined;\n\n /**\n * @generated from field: google.protobuf.BoolValue beta_tester = 21;\n */\n betaTester?: boolean | undefined;\n\n /**\n * Lightweight labels used for quick filtering.\n *\n * @generated from field: repeated string tags = 22;\n */\n tags: string[];\n\n /**\n * @generated from field: repeated protoform.v1.Address previous_addresses = 23;\n */\n previousAddresses: Address[];\n\n /**\n * @generated from field: repeated int32 lucky_numbers = 24;\n */\n luckyNumbers: number[];\n\n /**\n * Flat metadata pairs for analytics and routing.\n *\n * @generated from field: map labels = 25;\n */\n labels: { [key: string]: string };\n\n /**\n * Named office addresses keyed by a short slug.\n *\n * @generated from field: map office_locations = 26;\n */\n officeLocations: { [key: string]: Address };\n\n /**\n * Exactly one preferred contact route can be selected at a time.\n *\n * @generated from oneof protoform.v1.AutoFormExample.preferred_contact\n */\n preferredContact: {\n /**\n * Route updates to an email inbox.\n *\n * @generated from field: string preferred_email = 27;\n */\n value: string;\n case: \"preferredEmail\";\n } | {\n /**\n * Route urgent notices to an E.164 phone number.\n *\n * @generated from field: string preferred_phone = 28;\n */\n value: string;\n case: \"preferredPhone\";\n } | {\n /**\n * Opt out of direct outreach entirely.\n *\n * @generated from field: bool do_not_contact = 29;\n */\n value: boolean;\n case: \"doNotContact\";\n } | { case: undefined; value?: undefined };\n\n /**\n * Timestamp captured when the record was created.\n *\n * @generated from field: google.protobuf.Timestamp created_at = 30;\n */\n createdAt?: Timestamp | undefined;\n\n /**\n * @generated from field: google.protobuf.Timestamp expires_at = 31;\n */\n expiresAt?: Timestamp | undefined;\n\n /**\n * Delay between reminder notifications.\n *\n * @generated from field: google.protobuf.Duration reminder_interval = 32;\n */\n reminderInterval?: Duration | undefined;\n\n /**\n * Fields the current actor is allowed to update.\n *\n * @generated from field: google.protobuf.FieldMask writable_paths = 33;\n */\n writablePaths?: FieldMask | undefined;\n\n /**\n * Arbitrary preference flags stored as a JSON-ish struct.\n *\n * @generated from field: google.protobuf.Struct preferences = 34;\n */\n preferences?: JsonObject | undefined;\n\n /**\n * Generic featured value for experiments and demos.\n *\n * @generated from field: google.protobuf.Value featured_value = 35;\n */\n featuredValue?: Value | undefined;\n\n /**\n * Ordered dashboard widgets stored as a dynamic list.\n *\n * @generated from field: google.protobuf.ListValue dashboard_blocks = 36;\n */\n dashboardBlocks?: ListValue | undefined;\n\n /**\n * External Any payload kept intentionally loose for edge-case coverage.\n *\n * @generated from field: google.protobuf.Any external_payload = 37;\n */\n externalPayload?: Any | undefined;\n\n /**\n * @generated from field: int32 minimum_threshold = 38;\n */\n minimumThreshold: number;\n\n /**\n * @generated from field: int32 maximum_threshold = 39;\n */\n maximumThreshold: number;\n\n /**\n * Nested support settings with their own CEL validation rule.\n *\n * @generated from field: protoform.v1.ProfileSettings settings = 40;\n */\n settings?: ProfileSettings | undefined;\n};\n\n/**\n * Describes the message protoform.v1.AutoFormExample.\n * Use `create(AutoFormExampleSchema)` to create a new message.\n */\nexport const AutoFormExampleSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_protoform_v1_auto_form_example, 0);\n\n/**\n * Focused protobuf fixture for proto UI metadata and UI CEL demos.\n *\n * @generated from message protoform.v1.AutoFormUiMetadataExample\n */\nexport type AutoFormUiMetadataExample = Message<\"protoform.v1.AutoFormUiMetadataExample\"> & {\n /**\n * Friendly cluster name shown in rollout summaries.\n *\n * @generated from field: string cluster_name = 1;\n */\n clusterName: string;\n\n /**\n * Cloud provider where the request will be deployed.\n *\n * @generated from field: protoform.v1.UiDemoProvider provider = 2;\n */\n provider: UiDemoProvider;\n\n /**\n * Region where the cluster will be created.\n *\n * @generated from field: string region = 3;\n */\n region: string;\n\n /**\n * Toggle the conditional support step on or off.\n *\n * @generated from field: bool enable_support_mode = 4;\n */\n enableSupportMode: boolean;\n\n /**\n * Requested support tier for the deployment.\n *\n * @generated from field: protoform.v1.UiDemoSupportTier support_tier = 5;\n */\n supportTier: UiDemoSupportTier;\n\n /**\n * Requested maintenance window for premium support coordination.\n *\n * @generated from field: google.protobuf.Timestamp maintenance_window = 6;\n */\n maintenanceWindow?: Timestamp | undefined;\n\n /**\n * Extra context only needed for platinum support requests.\n *\n * @generated from field: string escalation_reason = 7;\n */\n escalationReason: string;\n\n /**\n * Pick exactly one support contact route once premium support is active.\n *\n * @generated from oneof protoform.v1.AutoFormUiMetadataExample.support_contact\n */\n supportContact: {\n /**\n * Route follow-up through an email inbox.\n *\n * @generated from field: string support_email = 8;\n */\n value: string;\n case: \"supportEmail\";\n } | {\n /**\n * Route follow-up through a Slack channel.\n *\n * @generated from field: string slack_channel = 9;\n */\n value: string;\n case: \"slackChannel\";\n } | {\n /**\n * Explicitly avoid any follow-up contact.\n *\n * @generated from field: bool no_follow_up = 10;\n */\n value: boolean;\n case: \"noFollowUp\";\n } | { case: undefined; value?: undefined };\n\n /**\n * API token for authenticating with the deployment service.\n *\n * @generated from field: string api_token = 13;\n */\n apiToken: string;\n\n /**\n * Approval or change-management ticket for the deployment.\n *\n * @generated from field: string approval_ticket = 11;\n */\n approvalTicket: string;\n\n /**\n * Keep a final dry-run toggle in the deploy section.\n *\n * @generated from field: bool enable_dry_run = 12;\n */\n enableDryRun: boolean;\n};\n\n/**\n * Describes the message protoform.v1.AutoFormUiMetadataExample.\n * Use `create(AutoFormUiMetadataExampleSchema)` to create a new message.\n */\nexport const AutoFormUiMetadataExampleSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_protoform_v1_auto_form_example, 1);\n\n/**\n * Postal address used by several nested object fields and maps.\n *\n * @generated from message protoform.v1.Address\n */\nexport type Address = Message<\"protoform.v1.Address\"> & {\n /**\n * @generated from field: string line_one = 1;\n */\n lineOne: string;\n\n /**\n * @generated from field: string city = 2;\n */\n city: string;\n\n /**\n * @generated from field: string state = 3;\n */\n state: string;\n\n /**\n * @generated from field: string postal_code = 4;\n */\n postalCode: string;\n\n /**\n * @generated from field: protoform.v1.CountryCode country = 5;\n */\n country: CountryCode;\n\n /**\n * @generated from field: protoform.v1.GeoPoint location = 6;\n */\n location?: GeoPoint | undefined;\n\n /**\n * @generated from field: optional string line_two = 7;\n */\n lineTwo?: string | undefined;\n};\n\n/**\n * Describes the message protoform.v1.Address.\n * Use `create(AddressSchema)` to create a new message.\n */\nexport const AddressSchema: GenMessage
= /*@__PURE__*/\n messageDesc(file_protoform_v1_auto_form_example, 2);\n\n/**\n * Latitude/longitude pair used by the nested Address message.\n *\n * @generated from message protoform.v1.GeoPoint\n */\nexport type GeoPoint = Message<\"protoform.v1.GeoPoint\"> & {\n /**\n * @generated from field: double latitude = 1;\n */\n latitude: number;\n\n /**\n * @generated from field: double longitude = 2;\n */\n longitude: number;\n};\n\n/**\n * Describes the message protoform.v1.GeoPoint.\n * Use `create(GeoPointSchema)` to create a new message.\n */\nexport const GeoPointSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_protoform_v1_auto_form_example, 3);\n\n/**\n * Support workflow settings nested under the main example message.\n *\n * @generated from message protoform.v1.ProfileSettings\n */\nexport type ProfileSettings = Message<\"protoform.v1.ProfileSettings\"> & {\n /**\n * @generated from field: bool enable_support_mode = 1;\n */\n enableSupportMode: boolean;\n\n /**\n * @generated from field: protoform.v1.EscalationLevel escalation_level = 2;\n */\n escalationLevel: EscalationLevel;\n\n /**\n * @generated from field: repeated protoform.v1.NotificationChannel notification_channels = 3;\n */\n notificationChannels: NotificationChannel[];\n\n /**\n * @generated from field: map nested_settings = 4;\n */\n nestedSettings: { [key: string]: NestedSetting };\n};\n\n/**\n * Describes the message protoform.v1.ProfileSettings.\n * Use `create(ProfileSettingsSchema)` to create a new message.\n */\nexport const ProfileSettingsSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_protoform_v1_auto_form_example, 4);\n\n/**\n * Small nested settings entry used inside a protobuf map.\n *\n * @generated from message protoform.v1.NestedSetting\n */\nexport type NestedSetting = Message<\"protoform.v1.NestedSetting\"> & {\n /**\n * @generated from field: string label = 1;\n */\n label: string;\n\n /**\n * @generated from field: google.protobuf.Timestamp scheduled_for = 2;\n */\n scheduledFor?: Timestamp | undefined;\n};\n\n/**\n * Describes the message protoform.v1.NestedSetting.\n * Use `create(NestedSettingSchema)` to create a new message.\n */\nexport const NestedSettingSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_protoform_v1_auto_form_example, 5);\n\n/**\n * @generated from enum protoform.v1.AccessTier\n */\nexport enum AccessTier {\n /**\n * @generated from enum value: ACCESS_TIER_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: ACCESS_TIER_VIEWER = 1;\n */\n VIEWER = 1,\n\n /**\n * @generated from enum value: ACCESS_TIER_EDITOR = 2;\n */\n EDITOR = 2,\n\n /**\n * @generated from enum value: ACCESS_TIER_ADMIN = 3;\n */\n ADMIN = 3,\n}\n\n/**\n * Describes the enum protoform.v1.AccessTier.\n */\nexport const AccessTierSchema: GenEnum = /*@__PURE__*/\n enumDesc(file_protoform_v1_auto_form_example, 0);\n\n/**\n * @generated from enum protoform.v1.UiDemoProvider\n */\nexport enum UiDemoProvider {\n /**\n * @generated from enum value: UI_DEMO_PROVIDER_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: UI_DEMO_PROVIDER_AWS = 1;\n */\n AWS = 1,\n\n /**\n * @generated from enum value: UI_DEMO_PROVIDER_GCP = 2;\n */\n GCP = 2,\n\n /**\n * @generated from enum value: UI_DEMO_PROVIDER_AZURE = 3;\n */\n AZURE = 3,\n}\n\n/**\n * Describes the enum protoform.v1.UiDemoProvider.\n */\nexport const UiDemoProviderSchema: GenEnum = /*@__PURE__*/\n enumDesc(file_protoform_v1_auto_form_example, 1);\n\n/**\n * @generated from enum protoform.v1.UiDemoSupportTier\n */\nexport enum UiDemoSupportTier {\n /**\n * @generated from enum value: UI_DEMO_SUPPORT_TIER_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: UI_DEMO_SUPPORT_TIER_STANDARD = 1;\n */\n STANDARD = 1,\n\n /**\n * @generated from enum value: UI_DEMO_SUPPORT_TIER_PRIORITY = 2;\n */\n PRIORITY = 2,\n\n /**\n * @generated from enum value: UI_DEMO_SUPPORT_TIER_PLATINUM = 3;\n */\n PLATINUM = 3,\n}\n\n/**\n * Describes the enum protoform.v1.UiDemoSupportTier.\n */\nexport const UiDemoSupportTierSchema: GenEnum = /*@__PURE__*/\n enumDesc(file_protoform_v1_auto_form_example, 2);\n\n/**\n * @generated from enum protoform.v1.CountryCode\n */\nexport enum CountryCode {\n /**\n * @generated from enum value: COUNTRY_CODE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: COUNTRY_CODE_US = 1;\n */\n US = 1,\n\n /**\n * @generated from enum value: COUNTRY_CODE_CA = 2;\n */\n CA = 2,\n\n /**\n * @generated from enum value: COUNTRY_CODE_DE = 3;\n */\n DE = 3,\n\n /**\n * @generated from enum value: COUNTRY_CODE_PL = 4;\n */\n PL = 4,\n}\n\n/**\n * Describes the enum protoform.v1.CountryCode.\n */\nexport const CountryCodeSchema: GenEnum = /*@__PURE__*/\n enumDesc(file_protoform_v1_auto_form_example, 3);\n\n/**\n * @generated from enum protoform.v1.EscalationLevel\n */\nexport enum EscalationLevel {\n /**\n * @generated from enum value: ESCALATION_LEVEL_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: ESCALATION_LEVEL_LOW = 1;\n */\n LOW = 1,\n\n /**\n * @generated from enum value: ESCALATION_LEVEL_MEDIUM = 2;\n */\n MEDIUM = 2,\n\n /**\n * @generated from enum value: ESCALATION_LEVEL_HIGH = 3;\n */\n HIGH = 3,\n}\n\n/**\n * Describes the enum protoform.v1.EscalationLevel.\n */\nexport const EscalationLevelSchema: GenEnum = /*@__PURE__*/\n enumDesc(file_protoform_v1_auto_form_example, 4);\n\n/**\n * @generated from enum protoform.v1.NotificationChannel\n */\nexport enum NotificationChannel {\n /**\n * @generated from enum value: NOTIFICATION_CHANNEL_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: NOTIFICATION_CHANNEL_EMAIL = 1;\n */\n EMAIL = 1,\n\n /**\n * @generated from enum value: NOTIFICATION_CHANNEL_SMS = 2;\n */\n SMS = 2,\n\n /**\n * @generated from enum value: NOTIFICATION_CHANNEL_SLACK = 3;\n */\n SLACK = 3,\n\n /**\n * @generated from enum value: NOTIFICATION_CHANNEL_PAGERDUTY = 4;\n */\n PAGERDUTY = 4,\n}\n\n/**\n * Describes the enum protoform.v1.NotificationChannel.\n */\nexport const NotificationChannelSchema: GenEnum = /*@__PURE__*/\n enumDesc(file_protoform_v1_auto_form_example, 5);\n\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/gen/auto_form_ui_pb.ts", "content": "export * from \"./protoform/v1/auto_form_ui_pb.js\";\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/gen/buf/validate/validate_pb.ts", "content": "// Copyright 2023-2026 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.13.0 with parameter \"target=ts,import_extension=js\"\n// @generated from file buf/validate/validate.proto (package buf.validate, syntax proto2)\n/* eslint-disable */\n\n// [Protovalidate](https://protovalidate.com/) is the semantic validation library for Protobuf.\n// It provides standard annotations to validate common rules on messages and fields, as well as the ability to use [CEL](https://cel.dev) to write custom rules.\n// It's the next generation of [protoc-gen-validate](https://github.com/bufbuild/protoc-gen-validate).\n//\n// This package provides the options, messages, and enums that power Protovalidate.\n// Apply its options to messages, fields, and oneofs in your Protobuf schemas to add validation rules:\n//\n// ```proto\n// message User {\n// string id = 1 [(buf.validate.field).string.uuid = true];\n// string first_name = 2 [(buf.validate.field).string.max_len = 64];\n// string last_name = 3 [(buf.validate.field).string.max_len = 64];\n//\n// option (buf.validate.message).cel = {\n// id: \"first_name_requires_last_name\"\n// message: \"last_name must be present if first_name is present\"\n// expression: \"!has(this.first_name) || has(this.last_name)\"\n// };\n// }\n// ```\n//\n// These rules are enforced at runtime by language-specific libraries.\n// See the [developer quickstart](https://protovalidate.com/quickstart/) to get started, or go directly to the runtime library for your language:\n// [Go](https://github.com/bufbuild/protovalidate-go),\n// [JavaScript/TypeScript](https://github.com/bufbuild/protovalidate-es),\n// [Java](https://github.com/bufbuild/protovalidate-java),\n// [Python](https://github.com/bufbuild/protovalidate-python),\n// or [C++](https://github.com/bufbuild/protovalidate-cc).\n\nimport type { GenEnum, GenExtension, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, extDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Duration, FieldDescriptorProto_Type, FieldMask, FieldOptions, MessageOptions, OneofOptions, Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file buf/validate/validate.proto.\n */\nexport const file_buf_validate_validate: GenFile = /*@__PURE__*/\n fileDesc(\"ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI3CgRSdWxlEgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSKGAQoMTWVzc2FnZVJ1bGVzEhYKDmNlbF9leHByZXNzaW9uGAUgAygJEh8KA2NlbBgDIAMoCzISLmJ1Zi52YWxpZGF0ZS5SdWxlEi0KBW9uZW9mGAQgAygLMh4uYnVmLnZhbGlkYXRlLk1lc3NhZ2VPbmVvZlJ1bGVKBAgBEAJSCGRpc2FibGVkIjQKEE1lc3NhZ2VPbmVvZlJ1bGUSDgoGZmllbGRzGAEgAygJEhAKCHJlcXVpcmVkGAIgASgIIh4KCk9uZW9mUnVsZXMSEAoIcmVxdWlyZWQYASABKAgiiwkKCkZpZWxkUnVsZXMSFgoOY2VsX2V4cHJlc3Npb24YHSADKAkSHwoDY2VsGBcgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGUSEAoIcmVxdWlyZWQYGSABKAgSJAoGaWdub3JlGBsgASgOMhQuYnVmLnZhbGlkYXRlLklnbm9yZRIpCgVmbG9hdBgBIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GbG9hdFJ1bGVzSAASKwoGZG91YmxlGAIgASgLMhkuYnVmLnZhbGlkYXRlLkRvdWJsZVJ1bGVzSAASKQoFaW50MzIYAyABKAsyGC5idWYudmFsaWRhdGUuSW50MzJSdWxlc0gAEikKBWludDY0GAQgASgLMhguYnVmLnZhbGlkYXRlLkludDY0UnVsZXNIABIrCgZ1aW50MzIYBSABKAsyGS5idWYudmFsaWRhdGUuVUludDMyUnVsZXNIABIrCgZ1aW50NjQYBiABKAsyGS5idWYudmFsaWRhdGUuVUludDY0UnVsZXNIABIrCgZzaW50MzIYByABKAsyGS5idWYudmFsaWRhdGUuU0ludDMyUnVsZXNIABIrCgZzaW50NjQYCCABKAsyGS5idWYudmFsaWRhdGUuU0ludDY0UnVsZXNIABItCgdmaXhlZDMyGAkgASgLMhouYnVmLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAEi0KB2ZpeGVkNjQYCiABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQ2NFJ1bGVzSAASLwoIc2ZpeGVkMzIYCyABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkMzJSdWxlc0gAEi8KCHNmaXhlZDY0GAwgASgLMhsuYnVmLnZhbGlkYXRlLlNGaXhlZDY0UnVsZXNIABInCgRib29sGA0gASgLMhcuYnVmLnZhbGlkYXRlLkJvb2xSdWxlc0gAEisKBnN0cmluZxgOIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAEikKBWJ5dGVzGA8gASgLMhguYnVmLnZhbGlkYXRlLkJ5dGVzUnVsZXNIABInCgRlbnVtGBAgASgLMhcuYnVmLnZhbGlkYXRlLkVudW1SdWxlc0gAEi8KCHJlcGVhdGVkGBIgASgLMhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIABIlCgNtYXAYEyABKAsyFi5idWYudmFsaWRhdGUuTWFwUnVsZXNIABIlCgNhbnkYFCABKAsyFi5idWYudmFsaWRhdGUuQW55UnVsZXNIABIvCghkdXJhdGlvbhgVIAEoCzIbLmJ1Zi52YWxpZGF0ZS5EdXJhdGlvblJ1bGVzSAASMgoKZmllbGRfbWFzaxgcIAEoCzIcLmJ1Zi52YWxpZGF0ZS5GaWVsZE1hc2tSdWxlc0gAEjEKCXRpbWVzdGFtcBgWIAEoCzIcLmJ1Zi52YWxpZGF0ZS5UaW1lc3RhbXBSdWxlc0gAQgYKBHR5cGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSJVCg9QcmVkZWZpbmVkUnVsZXMSHwoDY2VsGAEgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSL4FgoKRmxvYXRSdWxlcxJ9CgVjb25zdBgBIAEoAkJuwkhrCmkKC2Zsb2F0LmNvbnN0Glp0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICdtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSmQEKAmx0GAIgASgCQooBwkiGAQqDAQoIZmxvYXQubHQadyFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASqQEKA2x0ZRgDIAEoAkKZAcJIlQEKkgEKCWZsb2F0Lmx0ZRqEASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEtAHCgJndBgEIAEoAkLBB8JIvQcKhgEKCGZsb2F0Lmd0GnohaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq9AQoLZmxvYXQuZ3RfbHQarQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrHAQoVZmxvYXQuZ3RfbHRfZXhjbHVzaXZlGq0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzQEKDGZsb2F0Lmd0X2x0ZRq8AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCtcBChZmbG9hdC5ndF9sdGVfZXhjbHVzaXZlGrwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARKcCAoDZ3RlGAUgASgCQowIwkiICAqVAQoJZmxvYXQuZ3RlGocBIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCswBCgxmbG9hdC5ndGVfbHQauwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtYBChZmbG9hdC5ndGVfbHRfZXhjbHVzaXZlGrsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrcAQoNZmxvYXQuZ3RlX2x0ZRrKAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK5gEKF2Zsb2F0Lmd0ZV9sdGVfZXhjbHVzaXZlGsoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnkKAmluGAYgAygCQm3CSGoKaAoIZmxvYXQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnAKBm5vdF9pbhgHIAMoAkJgwkhdClsKDGZsb2F0Lm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEm8KBmZpbml0ZRgIIAEoCEJfwkhcCloKDGZsb2F0LmZpbml0ZRpKcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAnbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSKwoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIooXCgtEb3VibGVSdWxlcxJ+CgVjb25zdBgBIAEoAUJvwkhsCmoKDGRvdWJsZS5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEpoBCgJsdBgCIAEoAUKLAcJIhwEKhAEKCWRvdWJsZS5sdBp3IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCk/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKqAQoDbHRlGAMgASgBQpoBwkiWAQqTAQoKZG91YmxlLmx0ZRqEASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEtUHCgJndBgEIAEoAULGB8JIwgcKhwEKCWRvdWJsZS5ndBp6IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKvgEKDGRvdWJsZS5ndF9sdBqtAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsgBChZkb3VibGUuZ3RfbHRfZXhjbHVzaXZlGq0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzgEKDWRvdWJsZS5ndF9sdGUavAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrYAQoXZG91YmxlLmd0X2x0ZV9leGNsdXNpdmUavAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEqEICgNndGUYBSABKAFCkQjCSI0ICpYBCgpkb3VibGUuZ3RlGocBIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCs0BCg1kb3VibGUuZ3RlX2x0GrsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrXAQoXZG91YmxlLmd0ZV9sdF9leGNsdXNpdmUauwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCt0BCg5kb3VibGUuZ3RlX2x0ZRrKAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK5wEKGGRvdWJsZS5ndGVfbHRlX2V4Y2x1c2l2ZRrKAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ6CgJpbhgGIAMoAUJuwkhrCmkKCWRvdWJsZS5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAcgAygBQmHCSF4KXAoNZG91YmxlLm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnAKBmZpbml0ZRgIIAEoCEJgwkhdClsKDWRvdWJsZS5maW5pdGUaSnJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ211c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnEiwKB2V4YW1wbGUYCSADKAFCG8JIGAoWCg5kb3VibGUuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4isBQKCkludDMyUnVsZXMSfQoFY29uc3QYASABKAVCbsJIawppCgtpbnQzMi5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEoQBCgJsdBgCIAEoBUJ2wkhzCnEKCGludDMyLmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpUBCgNsdGUYAyABKAVChQHCSIEBCn8KCWludDMyLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS+QYKAmd0GAQgASgFQuoGwkjmBgp0CghpbnQzMi5ndBpoIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKrQEKC2ludDMyLmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq1AQoVaW50MzIuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKDGludDMyLmd0X2x0ZRqsAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKxQEKFmludDMyLmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEsUHCgNndGUYBSABKAVCtQfCSLEHCoIBCglpbnQzMi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq8AQoMaW50MzIuZ3RlX2x0GqsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsQBChZpbnQzMi5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrMAQoNaW50MzIuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrUAQoXaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUauAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESeQoCaW4YBiADKAVCbcJIagpoCghpbnQzMi5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScAoGbm90X2luGAcgAygFQmDCSF0KWwoMaW50MzIubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKwoHZXhhbXBsZRgIIAMoBUIawkgXChUKDWludDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIrAUCgpJbnQ2NFJ1bGVzEn0KBWNvbnN0GAEgASgDQm7CSGsKaQoLaW50NjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKEAQoCbHQYAiABKANCdsJIcwpxCghpbnQ2NC5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKVAQoDbHRlGAMgASgDQoUBwkiBAQp/CglpbnQ2NC5sdGUaciFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEvkGCgJndBgEIAEoA0LqBsJI5gYKdAoIaW50NjQuZ3QaaCFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCq0BCgtpbnQ2NC5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtQEKFWludDY0Lmd0X2x0X2V4Y2x1c2l2ZRqbAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr0BCgxpbnQ2NC5ndF9sdGUarAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCsUBChZpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLFBwoDZ3RlGAUgASgDQrUHwkixBwqCAQoJaW50NjQuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKvAEKDGludDY0Lmd0ZV9sdBqrAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrEAQoWaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKDWludDY0Lmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK1AEKF2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGrgBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnkKAmluGAYgAygDQm3CSGoKaAoIaW50NjQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnAKBm5vdF9pbhgHIAMoA0JgwkhdClsKDGludDY0Lm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEisKB2V4YW1wbGUYCSADKANCGsJIFwoVCg1pbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLCFAoLVUludDMyUnVsZXMSfgoFY29uc3QYASABKA1Cb8JIbApqCgx1aW50MzIuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKFAQoCbHQYAiABKA1Cd8JIdApyCgl1aW50MzIubHQaZSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASlwEKA2x0ZRgDIAEoDUKHAcJIgwEKgAEKCnVpbnQzMi5sdGUaciFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEv4GCgJndBgEIAEoDULvBsJI6wYKdQoJdWludDMyLmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwquAQoMdWludDMyLmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq2AQoWdWludDMyLmd0X2x0X2V4Y2x1c2l2ZRqbAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BCg11aW50MzIuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrGAQoXdWludDMyLmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEsoHCgNndGUYBSABKA1CugfCSLYHCoMBCgp1aW50MzIuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKvQEKDXVpbnQzMi5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxQEKF3VpbnQzMi5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrNAQoOdWludDMyLmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK1QEKGHVpbnQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ6CgJpbhgGIAMoDUJuwkhrCmkKCXVpbnQzMi5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAcgAygNQmHCSF4KXAoNdWludDMyLm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKA1CG8JIGAoWCg51aW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iwhQKC1VJbnQ2NFJ1bGVzEn4KBWNvbnN0GAEgASgEQm/CSGwKagoMdWludDY0LmNvbnN0Glp0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICdtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycShQEKAmx0GAIgASgEQnfCSHQKcgoJdWludDY0Lmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpcBCgNsdGUYAyABKARChwHCSIMBCoABCgp1aW50NjQubHRlGnIhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ211c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABL+BgoCZ3QYBCABKARC7wbCSOsGCnUKCXVpbnQ2NC5ndBpoIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKrgEKDHVpbnQ2NC5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtgEKFnVpbnQ2NC5ndF9sdF9leGNsdXNpdmUamwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoNdWludDY0Lmd0X2x0ZRqsAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKxgEKF3VpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLKBwoDZ3RlGAUgASgEQroHwki2BwqDAQoKdWludDY0Lmd0ZRp1IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCr0BCg11aW50NjQuZ3RlX2x0GqsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsUBChd1aW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKDnVpbnQ2NC5ndGVfbHRlGroBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtUBChh1aW50NjQuZ3RlX2x0ZV9leGNsdXNpdmUauAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESegoCaW4YBiADKARCbsJIawppCgl1aW50NjQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnEKBm5vdF9pbhgHIAMoBEJhwkheClwKDXVpbnQ2NC5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIsCgdleGFtcGxlGAggAygEQhvCSBgKFgoOdWludDY0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIsIUCgtTSW50MzJSdWxlcxJ+CgVjb25zdBgBIAEoEUJvwkhsCmoKDHNpbnQzMi5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEoUBCgJsdBgCIAEoEUJ3wkh0CnIKCXNpbnQzMi5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKXAQoDbHRlGAMgASgRQocBwkiDAQqAAQoKc2ludDMyLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS/gYKAmd0GAQgASgRQu8GwkjrBgp1CglzaW50MzIuZ3QaaCFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCq4BCgxzaW50MzIuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrYBChZzaW50MzIuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKDXNpbnQzMi5ndF9sdGUarAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCsYBChdzaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESygcKA2d0ZRgFIAEoEUK6B8JItgcKgwEKCnNpbnQzMi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq9AQoNc2ludDMyLmd0ZV9sdBqrAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrFAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUaqQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BCg5zaW50MzIuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrVAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGrgBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnoKAmluGAYgAygRQm7CSGsKaQoJc2ludDMyLmluGlwhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJxCgZub3RfaW4YByADKBFCYcJIXgpcCg1zaW50MzIubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoEUIbwkgYChYKDnNpbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLCFAoLU0ludDY0UnVsZXMSfgoFY29uc3QYASABKBJCb8JIbApqCgxzaW50NjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKFAQoCbHQYAiABKBJCd8JIdApyCglzaW50NjQubHQaZSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASlwEKA2x0ZRgDIAEoEkKHAcJIgwEKgAEKCnNpbnQ2NC5sdGUaciFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEv4GCgJndBgEIAEoEkLvBsJI6wYKdQoJc2ludDY0Lmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwquAQoMc2ludDY0Lmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq2AQoWc2ludDY0Lmd0X2x0X2V4Y2x1c2l2ZRqbAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BCg1zaW50NjQuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrGAQoXc2ludDY0Lmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEsoHCgNndGUYBSABKBJCugfCSLYHCoMBCgpzaW50NjQuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKvQEKDXNpbnQ2NC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxQEKF3NpbnQ2NC5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrNAQoOc2ludDY0Lmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK1QEKGHNpbnQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ6CgJpbhgGIAMoEkJuwkhrCmkKCXNpbnQ2NC5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAcgAygSQmHCSF4KXAoNc2ludDY0Lm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBJCG8JIGAoWCg5zaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i0xQKDEZpeGVkMzJSdWxlcxJ/CgVjb25zdBgBIAEoB0JwwkhtCmsKDWZpeGVkMzIuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKGAQoCbHQYAiABKAdCeMJIdQpzCgpmaXhlZDMyLmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpgBCgNsdGUYAyABKAdCiAHCSIQBCoEBCgtmaXhlZDMyLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASgwcKAmd0GAQgASgHQvQGwkjwBgp2CgpmaXhlZDMyLmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqvAQoNZml4ZWQzMi5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtwEKF2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvwEKDmZpeGVkMzIuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrHAQoYZml4ZWQzMi5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLPBwoDZ3RlGAUgASgHQr8Hwki7BwqEAQoLZml4ZWQzMi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq+AQoOZml4ZWQzMi5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxgEKGGZpeGVkMzIuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzgEKD2ZpeGVkMzIuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrWAQoZZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ7CgJpbhgGIAMoB0JvwkhsCmoKCmZpeGVkMzIuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnIKBm5vdF9pbhgHIAMoB0JiwkhfCl0KDmZpeGVkMzIubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLQoHZXhhbXBsZRgIIAMoB0IcwkgZChcKD2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i0xQKDEZpeGVkNjRSdWxlcxJ/CgVjb25zdBgBIAEoBkJwwkhtCmsKDWZpeGVkNjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKGAQoCbHQYAiABKAZCeMJIdQpzCgpmaXhlZDY0Lmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpgBCgNsdGUYAyABKAZCiAHCSIQBCoEBCgtmaXhlZDY0Lmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASgwcKAmd0GAQgASgGQvQGwkjwBgp2CgpmaXhlZDY0Lmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqvAQoNZml4ZWQ2NC5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtwEKF2ZpeGVkNjQuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvwEKDmZpeGVkNjQuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrHAQoYZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLPBwoDZ3RlGAUgASgGQr8Hwki7BwqEAQoLZml4ZWQ2NC5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq+AQoOZml4ZWQ2NC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxgEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzgEKD2ZpeGVkNjQuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrWAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ7CgJpbhgGIAMoBkJvwkhsCmoKCmZpeGVkNjQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnIKBm5vdF9pbhgHIAMoBkJiwkhfCl0KDmZpeGVkNjQubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLQoHZXhhbXBsZRgIIAMoBkIcwkgZChcKD2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i5RQKDVNGaXhlZDMyUnVsZXMSgAEKBWNvbnN0GAEgASgPQnHCSG4KbAoOc2ZpeGVkMzIuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKHAQoCbHQYAiABKA9CecJIdgp0CgtzZml4ZWQzMi5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKZAQoDbHRlGAMgASgPQokBwkiFAQqCAQoMc2ZpeGVkMzIubHRlGnIhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ211c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKIBwoCZ3QYBCABKA9C+QbCSPUGCncKC3NmaXhlZDMyLmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqwAQoOc2ZpeGVkMzIuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrgBChhzZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUamwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrAAQoPc2ZpeGVkMzIuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrIAQoZc2ZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES1AcKA2d0ZRgFIAEoD0LEB8JIwAcKhQEKDHNmaXhlZDMyLmd0ZRp1IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCr8BCg9zZml4ZWQzMi5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxwEKGXNmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUaqQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs8BChBzZml4ZWQzMi5ndGVfbHRlGroBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtcBChpzZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ8CgJpbhgGIAMoD0JwwkhtCmsKC3NmaXhlZDMyLmluGlwhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJzCgZub3RfaW4YByADKA9CY8JIYApeCg9zZml4ZWQzMi5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygPQh3CSBoKGAoQc2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i5RQKDVNGaXhlZDY0UnVsZXMSgAEKBWNvbnN0GAEgASgQQnHCSG4KbAoOc2ZpeGVkNjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKHAQoCbHQYAiABKBBCecJIdgp0CgtzZml4ZWQ2NC5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKZAQoDbHRlGAMgASgQQokBwkiFAQqCAQoMc2ZpeGVkNjQubHRlGnIhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ211c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKIBwoCZ3QYBCABKBBC+QbCSPUGCncKC3NmaXhlZDY0Lmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqwAQoOc2ZpeGVkNjQuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrgBChhzZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUamwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrAAQoPc2ZpeGVkNjQuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrIAQoZc2ZpeGVkNjQuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES1AcKA2d0ZRgFIAEoEELEB8JIwAcKhQEKDHNmaXhlZDY0Lmd0ZRp1IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCr8BCg9zZml4ZWQ2NC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxwEKGXNmaXhlZDY0Lmd0ZV9sdF9leGNsdXNpdmUaqQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs8BChBzZml4ZWQ2NC5ndGVfbHRlGroBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtcBChpzZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ8CgJpbhgGIAMoEEJwwkhtCmsKC3NmaXhlZDY0LmluGlwhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJzCgZub3RfaW4YByADKBBCY8JIYApeCg9zZml4ZWQ2NC5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iwAEKCUJvb2xSdWxlcxJ8CgVjb25zdBgBIAEoCEJtwkhqCmgKCmJvb2wuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxIqCgdleGFtcGxlGAIgAygIQhnCSBYKFAoMYm9vbC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIi6jwKC1N0cmluZ1J1bGVzEoABCgVjb25zdBgBIAEoCUJxwkhuCmwKDHN0cmluZy5jb25zdBpcdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCBgJXNgJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycScQoDbGVuGBMgASgEQmTCSGEKXwoKc3RyaW5nLmxlbhpRdWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ211c3QgYmUgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5sZW5dKSA6ICcnEokBCgdtaW5fbGVuGAIgASgEQnjCSHUKcwoOc3RyaW5nLm1pbl9sZW4aYXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICdtdXN0IGJlIGF0IGxlYXN0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWluX2xlbl0pIDogJycSiAEKB21heF9sZW4YAyABKARCd8JIdApyCg5zdHJpbmcubWF4X2xlbhpgdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ211c3QgYmUgYXQgbW9zdCAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLm1heF9sZW5dKSA6ICcnEosBCglsZW5fYnl0ZXMYFCABKARCeMJIdQpzChBzdHJpbmcubGVuX2J5dGVzGl91aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ211c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuX2J5dGVzXSkgOiAnJxKUAQoJbWluX2J5dGVzGAQgASgEQoABwkh9CnsKEHN0cmluZy5taW5fYnl0ZXMaZ3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9ieXRlcyA/ICdtdXN0IGJlIGF0IGxlYXN0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1pbl9ieXRlc10pIDogJycSkgEKCW1heF9ieXRlcxgFIAEoBEJ/wkh8CnoKEHN0cmluZy5tYXhfYnl0ZXMaZnVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICdtdXN0IGJlIGF0IG1vc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWF4X2J5dGVzXSkgOiAnJxKHAQoHcGF0dGVybhgGIAEoCUJ2wkhzCnEKDnN0cmluZy5wYXR0ZXJuGl8hdGhpcy5tYXRjaGVzKHJ1bGVzLnBhdHRlcm4pID8gJ2RvZXMgbm90IG1hdGNoIHJlZ2V4IHBhdHRlcm4gYCVzYCcuZm9ybWF0KFtydWxlcy5wYXR0ZXJuXSkgOiAnJxJ+CgZwcmVmaXgYByABKAlCbsJIawppCg1zdHJpbmcucHJlZml4GlghdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAnZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnEnwKBnN1ZmZpeBgIIAEoCUJswkhpCmcKDXN0cmluZy5zdWZmaXgaViF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAnZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnEooBCghjb250YWlucxgJIAEoCUJ4wkh1CnMKD3N0cmluZy5jb250YWlucxpgIXRoaXMuY29udGFpbnMocnVsZXMuY29udGFpbnMpID8gJ2RvZXMgbm90IGNvbnRhaW4gc3Vic3RyaW5nIGAlc2AnLmZvcm1hdChbcnVsZXMuY29udGFpbnNdKSA6ICcnEpEBCgxub3RfY29udGFpbnMYFyABKAlCe8JIeAp2ChNzdHJpbmcubm90X2NvbnRhaW5zGl90aGlzLmNvbnRhaW5zKHJ1bGVzLm5vdF9jb250YWlucykgPyAnY29udGFpbnMgc3Vic3RyaW5nIGAlc2AnLmZvcm1hdChbcnVsZXMubm90X2NvbnRhaW5zXSkgOiAnJxJ6CgJpbhgKIAMoCUJuwkhrCmkKCXN0cmluZy5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAsgAygJQmHCSF4KXAoNc3RyaW5nLm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEtkBCgVlbWFpbBgMIAEoCELHAcJIwwEKWwoMc3RyaW5nLmVtYWlsEh1tdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcxosIXJ1bGVzLmVtYWlsIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0VtYWlsKCkKZAoSc3RyaW5nLmVtYWlsX2VtcHR5EjJ2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcxoaIXJ1bGVzLmVtYWlsIHx8IHRoaXMgIT0gJydIABLhAQoIaG9zdG5hbWUYDSABKAhCzAHCSMgBCl8KD3N0cmluZy5ob3N0bmFtZRIYbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIABLBAQoCaXAYDiABKAhCsgHCSK4BCk8KCXN0cmluZy5pcBIabXVzdCBiZSBhIHZhbGlkIElQIGFkZHJlc3MaJiFydWxlcy5pcCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCgpClsKD3N0cmluZy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaFyFydWxlcy5pcCB8fCB0aGlzICE9ICcnSAAS0AEKBGlwdjQYDyABKAhCvwHCSLsBClYKC3N0cmluZy5pcHY0EhxtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzGikhcnVsZXMuaXB2NCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg0KQphChFzdHJpbmcuaXB2NF9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcxoZIXJ1bGVzLmlwdjQgfHwgdGhpcyAhPSAnJ0gAEtABCgRpcHY2GBAgASgIQr8Bwki7AQpWCgtzdHJpbmcuaXB2NhIcbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxopIXJ1bGVzLmlwdjYgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoNikKYQoRc3RyaW5nLmlwdjZfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MaGSFydWxlcy5pcHY2IHx8IHRoaXMgIT0gJydIABK5AQoDdXJpGBEgASgIQqkBwkilAQpLCgpzdHJpbmcudXJpEhNtdXN0IGJlIGEgdmFsaWQgVVJJGighcnVsZXMudXJpIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc1VyaSgpClYKEHN0cmluZy51cmlfZW1wdHkSKHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVUkkaGCFydWxlcy51cmkgfHwgdGhpcyAhPSAnJ0gAEmoKB3VyaV9yZWYYEiABKAhCV8JIVApSCg5zdHJpbmcudXJpX3JlZhIdbXVzdCBiZSBhIHZhbGlkIFVSSSBSZWZlcmVuY2UaISFydWxlcy51cmlfcmVmIHx8IHRoaXMuaXNVcmlSZWYoKUgAEokCCgdhZGRyZXNzGBUgASgIQvUBwkjxAQp7Cg5zdHJpbmcuYWRkcmVzcxInbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGkAhcnVsZXMuYWRkcmVzcyB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0bmFtZSgpIHx8IHRoaXMuaXNJcCgpCnIKFHN0cmluZy5hZGRyZXNzX2VtcHR5Ejx2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgaG9zdG5hbWUsIG9yIGlwIGFkZHJlc3MaHCFydWxlcy5hZGRyZXNzIHx8IHRoaXMgIT0gJydIABKSAgoEdXVpZBgWIAEoCEKBAsJI/QEKnwEKC3N0cmluZy51dWlkEhRtdXN0IGJlIGEgdmFsaWQgVVVJRBp6IXJ1bGVzLnV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykKWQoRc3RyaW5nLnV1aWRfZW1wdHkSKXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVVUlEGhkhcnVsZXMudXVpZCB8fCB0aGlzICE9ICcnSAAS6gEKBXR1dWlkGCEgASgIQtgBwkjUAQptCgxzdHJpbmcudHV1aWQSHG11c3QgYmUgYSB2YWxpZCB0cmltbWVkIFVVSUQaPyFydWxlcy50dXVpZCB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcygnXlswLTlhLWZBLUZdezMyfSQnKQpjChJzdHJpbmcudHV1aWRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCB0cmltbWVkIFVVSUQaGiFydWxlcy50dXVpZCB8fCB0aGlzICE9ICcnSAASkAIKEWlwX3dpdGhfcHJlZml4bGVuGBogASgIQvIBwkjuAQpyChhzdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW4SGW11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaOyFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCgpCngKHnN0cmluZy5pcF93aXRoX3ByZWZpeGxlbl9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBomIXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLJAgoTaXB2NF93aXRoX3ByZWZpeGxlbhgbIAEoCEKpAsJIpQIKjQEKGnN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuEi9tdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCkKkgEKIHN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEskCChNpcHY2X3dpdGhfcHJlZml4bGVuGBwgASgIQqkCwkilAgqNAQoac3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW4SL211c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGj4hcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2KQqSAQogc3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW5fZW1wdHkSRHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGighcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAAS7AEKCWlwX3ByZWZpeBgdIAEoCELWAcJI0gEKZgoQc3RyaW5nLmlwX3ByZWZpeBIZbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIABL9AQoLaXB2NF9wcmVmaXgYHiABKAhC5QHCSOEBCm8KEnN0cmluZy5pcHY0X3ByZWZpeBIbbXVzdCBiZSBhIHZhbGlkIElQdjQgcHJlZml4GjwhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCwgdHJ1ZSkKbgoYc3RyaW5nLmlwdjRfcHJlZml4X2VtcHR5EjB2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBwcmVmaXgaICFydWxlcy5pcHY0X3ByZWZpeCB8fCB0aGlzICE9ICcnSAAS/QEKC2lwdjZfcHJlZml4GB8gASgIQuUBwkjhAQpvChJzdHJpbmcuaXB2Nl9wcmVmaXgSG211c3QgYmUgYSB2YWxpZCBJUHY2IHByZWZpeBo8IXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYsIHRydWUpCm4KGHN0cmluZy5pcHY2X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgcHJlZml4GiAhcnVsZXMuaXB2Nl9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAEq8CCg1ob3N0X2FuZF9wb3J0GCAgASgIQpUCwkiRAgqTAQoUc3RyaW5nLmhvc3RfYW5kX3BvcnQSO211c3QgYmUgYSB2YWxpZCBob3N0IChob3N0bmFtZSBvciBJUCBhZGRyZXNzKSBhbmQgcG9ydCBwYWlyGj4hcnVsZXMuaG9zdF9hbmRfcG9ydCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0QW5kUG9ydCh0cnVlKQp5ChpzdHJpbmcuaG9zdF9hbmRfcG9ydF9lbXB0eRI3dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3QgYW5kIHBvcnQgcGFpchoiIXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyAhPSAnJ0gAEu4BCgR1bGlkGCMgASgIQt0BwkjZAQp8CgtzdHJpbmcudWxpZBIUbXVzdCBiZSBhIHZhbGlkIFVMSUQaVyFydWxlcy51bGlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtN11bMC05QS1ISktNTlAtVFYtWmEtaGprbW5wLXR2LXpdezI1fSQnKQpZChFzdHJpbmcudWxpZF9lbXB0eRIpdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVMSUQaGSFydWxlcy51bGlkIHx8IHRoaXMgIT0gJydIABLUAgoMcHJvdG9idWZfZnFuGCUgASgIQrsCwki3AgqvAQoTc3RyaW5nLnByb3RvYnVmX2ZxbhItbXVzdCBiZSBhIHZhbGlkIGZ1bGx5LXF1YWxpZmllZCBQcm90b2J1ZiBuYW1lGmkhcnVsZXMucHJvdG9idWZfZnFuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeW0EtWmEtel9dW0EtWmEtel8wLTldKihcXC5bQS1aYS16X11bQS1aYS16XzAtOV0qKSokJykKggEKGXN0cmluZy5wcm90b2J1Zl9mcW5fZW1wdHkSQnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBmdWxseS1xdWFsaWZpZWQgUHJvdG9idWYgbmFtZRohIXJ1bGVzLnByb3RvYnVmX2ZxbiB8fCB0aGlzICE9ICcnSAASkQMKEHByb3RvYnVmX2RvdF9mcW4YJiABKAhC9ALCSPACCs0BChdzdHJpbmcucHJvdG9idWZfZG90X2ZxbhJAbXVzdCBiZSBhIHZhbGlkIGZ1bGx5LXF1YWxpZmllZCBQcm90b2J1ZiBuYW1lIHdpdGggYSBsZWFkaW5nIGRvdBpwIXJ1bGVzLnByb3RvYnVmX2RvdF9mcW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15cXC5bQS1aYS16X11bQS1aYS16XzAtOV0qKFxcLltBLVphLXpfXVtBLVphLXpfMC05XSopKiQnKQqdAQodc3RyaW5nLnByb3RvYnVmX2RvdF9mcW5fZW1wdHkSVXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBmdWxseS1xdWFsaWZpZWQgUHJvdG9idWYgbmFtZSB3aXRoIGEgbGVhZGluZyBkb3QaJSFydWxlcy5wcm90b2J1Zl9kb3RfZnFuIHx8IHRoaXMgIT0gJydIABKcBQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QuUEwkjhBArqAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrhAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEiFtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAEg4KBnN0cmljdBgZIAEoCBIsCgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIt0RCgpCeXRlc1J1bGVzEnoKBWNvbnN0GAEgASgMQmvCSGgKZgoLYnl0ZXMuY29uc3QaV3RoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgYmUgJXgnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxJrCgNsZW4YDSABKARCXsJIWwpZCglieXRlcy5sZW4aTHVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICdtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJycSgwEKB21pbl9sZW4YAiABKARCcsJIbwptCg1ieXRlcy5taW5fbGVuGlx1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAnbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKCAQoHbWF4X2xlbhgDIAEoBEJxwkhuCmwKDWJ5dGVzLm1heF9sZW4aW3VpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICdtdXN0IGJlIGF0IG1vc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSigEKB3BhdHRlcm4YBCABKAlCecJIdgp0Cg1ieXRlcy5wYXR0ZXJuGmMhc3RyaW5nKHRoaXMpLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAnbXVzdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycSewoGcHJlZml4GAUgASgMQmvCSGgKZgoMYnl0ZXMucHJlZml4GlYhdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAnZG9lcyBub3QgaGF2ZSBwcmVmaXggJXgnLmZvcm1hdChbcnVsZXMucHJlZml4XSkgOiAnJxJ5CgZzdWZmaXgYBiABKAxCacJIZgpkCgxieXRlcy5zdWZmaXgaVCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAnZG9lcyBub3QgaGF2ZSBzdWZmaXggJXgnLmZvcm1hdChbcnVsZXMuc3VmZml4XSkgOiAnJxJ9Cghjb250YWlucxgHIAEoDEJrwkhoCmYKDmJ5dGVzLmNvbnRhaW5zGlQhdGhpcy5jb250YWlucyhydWxlcy5jb250YWlucykgPyAnZG9lcyBub3QgY29udGFpbiAleCcuZm9ybWF0KFtydWxlcy5jb250YWluc10pIDogJycSoQEKAmluGAggAygMQpQBwkiQAQqNAQoIYnl0ZXMuaW4agAFnZXRGaWVsZChydWxlcywgJ2luJykuc2l6ZSgpID4gMCAmJiAhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJwCgZub3RfaW4YCSADKAxCYMJIXQpbCgxieXRlcy5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxLlAQoCaXAYCiABKAhC1gHCSNIBCm4KCGJ5dGVzLmlwEhptdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcxpGIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNCB8fCB0aGlzLnNpemUoKSA9PSAxNgpgCg5ieXRlcy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaHSFydWxlcy5pcCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS3gEKBGlwdjQYCyABKAhCzQHCSMkBCl8KCmJ5dGVzLmlwdjQSHG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS3wEKBGlwdjYYDCABKAhCzgHCSMoBCmAKCmJ5dGVzLmlwdjYSHG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAEs8BCgR1dWlkGA8gASgIQr4Bwki6AQpYCgpieXRlcy51dWlkEhRtdXN0IGJlIGEgdmFsaWQgVVVJRBo0IXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpeChBieXRlcy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBofIXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgIT0gMEgAEisKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biLBAwoJRW51bVJ1bGVzEnwKBWNvbnN0GAEgASgFQm3CSGoKaAoKZW51bS5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEhQKDGRlZmluZWRfb25seRgCIAEoCBJ4CgJpbhgDIAMoBUJswkhpCmcKB2VudW0uaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEm8KBm5vdF9pbhgEIAMoBUJfwkhcCloKC2VudW0ubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKgoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIu0DCg1SZXBlYXRlZFJ1bGVzEpYBCgltaW5faXRlbXMYASABKARCggHCSH8KfQoScmVwZWF0ZWQubWluX2l0ZW1zGmd1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9pdGVtcyA/ICdtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJWQgaXRlbShzKScuZm9ybWF0KFtydWxlcy5taW5faXRlbXNdKSA6ICcnEpwBCgltYXhfaXRlbXMYAiABKARCiAHCSIQBCoEBChJyZXBlYXRlZC5tYXhfaXRlbXMaa3VpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2l0ZW1zID8gJ211c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJXMgaXRlbShzKScuZm9ybWF0KFtydWxlcy5tYXhfaXRlbXNdKSA6ICcnEnAKBnVuaXF1ZRgDIAEoCEJgwkhdClsKD3JlcGVhdGVkLnVuaXF1ZRIocmVwZWF0ZWQgdmFsdWUgbXVzdCBjb250YWluIHVuaXF1ZSBpdGVtcxoeIXJ1bGVzLnVuaXF1ZSB8fCB0aGlzLnVuaXF1ZSgpEicKBWl0ZW1zGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMqCQjoBxCAgICAAiKKAwoITWFwUnVsZXMSjwEKCW1pbl9wYWlycxgBIAEoBEJ8wkh5CncKDW1hcC5taW5fcGFpcnMaZnVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX3BhaXJzID8gJ21hcCBtdXN0IGJlIGF0IGxlYXN0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWluX3BhaXJzXSkgOiAnJxKOAQoJbWF4X3BhaXJzGAIgASgEQnvCSHgKdgoNbWFwLm1heF9wYWlycxpldWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbW9zdCAlZCBlbnRyaWVzJy5mb3JtYXQoW3J1bGVzLm1heF9wYWlyc10pIDogJycSJgoEa2V5cxgEIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzEigKBnZhbHVlcxgFIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzKgkI6AcQgICAgAIiJgoIQW55UnVsZXMSCgoCaW4YAiADKAkSDgoGbm90X2luGAMgAygJIr8WCg1EdXJhdGlvblJ1bGVzEpsBCgVjb25zdBgCIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJxwkhuCmwKDmR1cmF0aW9uLmNvbnN0Glp0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICdtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSogEKAmx0GAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnnCSHYKdAoLZHVyYXRpb24ubHQaZSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAAStAEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKJAcJIhQEKggEKDGR1cmF0aW9uLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASowcKAmd0GAUgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQvkGwkj1Bgp3CgtkdXJhdGlvbi5ndBpoIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKsAEKDmR1cmF0aW9uLmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq4AQoYZHVyYXRpb24uZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwAEKD2R1cmF0aW9uLmd0X2x0ZRqsAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKyAEKGWR1cmF0aW9uLmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEu8HCgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CxAfCSMAHCoUBCgxkdXJhdGlvbi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq/AQoPZHVyYXRpb24uZ3RlX2x0GqsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCscBChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrPAQoQZHVyYXRpb24uZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrXAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUauAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESlwEKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnDCSG0KawoLZHVyYXRpb24uaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEo4BCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CY8JIYApeCg9kdXJhdGlvbi5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxJJCgdleGFtcGxlGAkgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQh3CSBoKGAoQZHVyYXRpb24uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i6wUKDkZpZWxkTWFza1J1bGVzErkBCgVjb25zdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCjQHCSIkBCoYBChBmaWVsZF9tYXNrLmNvbnN0GnJ0aGlzLnBhdGhzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRocyA/ICdtdXN0IGVxdWFsIHBhdGhzICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRoc10pIDogJycS0wEKAmluGAIgAygJQsYBwkjCAQq/AQoNZmllbGRfbWFzay5pbhqtASF0aGlzLnBhdGhzLmFsbChwLCBwIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ2luJykuZXhpc3RzKGYsIHAuc3RhcnRzV2l0aChmKycuJykpKSA/ICdtdXN0IG9ubHkgY29udGFpbiBwYXRocyBpbiAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEu0BCgZub3RfaW4YAyADKAlC3AHCSNgBCtUBChFmaWVsZF9tYXNrLm5vdF9pbhq/ASF0aGlzLnBhdGhzLmFsbChwLCAhKHAgaW4gZ2V0RmllbGQocnVsZXMsICdub3RfaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ25vdF9pbicpLmV4aXN0cyhmLCBwLnN0YXJ0c1dpdGgoZisnLicpKSkpID8gJ211c3Qgbm90IGNvbnRhaW4gYW55IHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnbm90X2luJyldKSA6ICcnEkwKB2V4YW1wbGUYBCADKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQh/CSBwKGgoSZmllbGRfbWFzay5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIisBcKDlRpbWVzdGFtcFJ1bGVzEp0BCgVjb25zdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCcsJIbwptCg90aW1lc3RhbXAuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKkAQoCbHQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQnrCSHcKdQoMdGltZXN0YW1wLmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAErYBCgNsdGUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQooBwkiGAQqDAQoNdGltZXN0YW1wLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASZgoGbHRfbm93GAcgASgIQlTCSFEKTwoQdGltZXN0YW1wLmx0X25vdxo7KHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICdtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIABKpBwoCZ3QYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQv4Gwkj6Bgp4Cgx0aW1lc3RhbXAuZ3QaaCFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrEBCg90aW1lc3RhbXAuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrkBChl0aW1lc3RhbXAuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwQEKEHRpbWVzdGFtcC5ndF9sdGUarAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCskBChp0aW1lc3RhbXAuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES9QcKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCyQfCSMUHCoYBCg10aW1lc3RhbXAuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwAEKEHRpbWVzdGFtcC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKyAEKGnRpbWVzdGFtcC5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrQAQoRdGltZXN0YW1wLmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2AEKG3RpbWVzdGFtcC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJpCgZndF9ub3cYCCABKAhCV8JIVApSChB0aW1lc3RhbXAuZ3Rfbm93Gj4ocnVsZXMuZ3Rfbm93ICYmIHRoaXMgPCBub3cpID8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG5vdycgOiAnJ0gBErEBCgZ3aXRoaW4YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ChQHCSIEBCn8KEHRpbWVzdGFtcC53aXRoaW4aa3RoaXMgPCBub3ctcnVsZXMud2l0aGluIHx8IHRoaXMgPiBub3crcnVsZXMud2l0aGluID8gJ211c3QgYmUgd2l0aGluICVzIG9mIG5vdycuZm9ybWF0KFtydWxlcy53aXRoaW5dKSA6ICcnEksKB2V4YW1wbGUYCiADKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQh7CSBsKGQoRdGltZXN0YW1wLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIjkKClZpb2xhdGlvbnMSKwoKdmlvbGF0aW9ucxgBIAMoCzIXLmJ1Zi52YWxpZGF0ZS5WaW9sYXRpb24inwEKCVZpb2xhdGlvbhImCgVmaWVsZBgFIAEoCzIXLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGgSJQoEcnVsZRgGIAEoCzIXLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGgSDwoHcnVsZV9pZBgCIAEoCRIPCgdtZXNzYWdlGAMgASgJEg8KB2Zvcl9rZXkYBCABKAhKBAgBEAJSCmZpZWxkX3BhdGgiPQoJRmllbGRQYXRoEjAKCGVsZW1lbnRzGAEgAygLMh4uYnVmLnZhbGlkYXRlLkZpZWxkUGF0aEVsZW1lbnQi6QIKEEZpZWxkUGF0aEVsZW1lbnQSFAoMZmllbGRfbnVtYmVyGAEgASgFEhIKCmZpZWxkX25hbWUYAiABKAkSPgoKZmllbGRfdHlwZRgDIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlEjwKCGtleV90eXBlGAQgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSPgoKdmFsdWVfdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlEg8KBWluZGV4GAYgASgESAASEgoIYm9vbF9rZXkYByABKAhIABIRCgdpbnRfa2V5GAggASgDSAASEgoIdWludF9rZXkYCSABKARIABIUCgpzdHJpbmdfa2V5GAogASgJSABCCwoJc3Vic2NyaXB0KqEBCgZJZ25vcmUSFgoSSUdOT1JFX1VOU1BFQ0lGSUVEEAASGAoUSUdOT1JFX0lGX1pFUk9fVkFMVUUQARIRCg1JR05PUkVfQUxXQVlTEAMiBAgCEAIqDElHTk9SRV9FTVBUWSoOSUdOT1JFX0RFRkFVTFQqF0lHTk9SRV9JRl9ERUZBVUxUX1ZBTFVFKhVJR05PUkVfSUZfVU5QT1BVTEFURUQqbgoKS25vd25SZWdleBIbChdLTk9XTl9SRUdFWF9VTlNQRUNJRklFRBAAEiAKHEtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX05BTUUQARIhCh1LTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9WQUxVRRACOlYKB21lc3NhZ2USHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYhwkgASgLMhouYnVmLnZhbGlkYXRlLk1lc3NhZ2VSdWxlc1IHbWVzc2FnZTpOCgVvbmVvZhIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMYhwkgASgLMhguYnVmLnZhbGlkYXRlLk9uZW9mUnVsZXNSBW9uZW9mOk4KBWZpZWxkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiHCSABKAsyGC5idWYudmFsaWRhdGUuRmllbGRSdWxlc1IFZmllbGQ6XQoKcHJlZGVmaW5lZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYiAkgASgLMh0uYnVmLnZhbGlkYXRlLlByZWRlZmluZWRSdWxlc1IKcHJlZGVmaW5lZEJuChJidWlsZC5idWYudmFsaWRhdGVCDVZhbGlkYXRlUHJvdG9QAVpHYnVmLmJ1aWxkL2dlbi9nby9idWZidWlsZC9wcm90b3ZhbGlkYXRlL3Byb3RvY29sYnVmZmVycy9nby9idWYvdmFsaWRhdGU\", [file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_timestamp]);\n\n/**\n * `Rule` represents a validation rule written in the Common Expression\n * Language (CEL) syntax. Each Rule includes a unique identifier, an\n * optional error message, and the CEL expression to evaluate. For more\n * information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message Foo {\n * option (buf.validate.message).cel = {\n * id: \"foo.bar\"\n * message: \"bar must be greater than 0\"\n * expression: \"this.bar > 0\"\n * };\n * int32 bar = 1;\n * }\n * ```\n *\n * @generated from message buf.validate.Rule\n */\nexport type Rule = Message<\"buf.validate.Rule\"> & {\n /**\n * `id` is a string that serves as a machine-readable name for this Rule.\n * It should be unique within its scope, which could be either a message or a field.\n *\n * @generated from field: optional string id = 1;\n */\n id: string;\n\n /**\n * `message` is an optional field that provides a human-readable error message\n * for this Rule when the CEL expression evaluates to false. If a\n * non-empty message is provided, any strings resulting from the CEL\n * expression evaluation are ignored.\n *\n * @generated from field: optional string message = 2;\n */\n message: string;\n\n /**\n * `expression` is the actual CEL expression that will be evaluated for\n * validation. This string must resolve to either a boolean or a string\n * value. If the expression evaluates to false or a non-empty string, the\n * validation is considered failed, and the message is rejected.\n *\n * @generated from field: optional string expression = 3;\n */\n expression: string;\n};\n\n/**\n * Describes the message buf.validate.Rule.\n * Use `create(RuleSchema)` to create a new message.\n */\nexport const RuleSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 0);\n\n/**\n * MessageRules represents validation rules that are applied to the entire message.\n * It includes disabling options and a list of Rule messages representing Common Expression Language (CEL) validation rules.\n *\n * @generated from message buf.validate.MessageRules\n */\nexport type MessageRules = Message<\"buf.validate.MessageRules\"> & {\n /**\n * `cel_expression` is a repeated field CEL expressions. Each expression specifies a validation\n * rule to be applied to this message. These rules are written in Common Expression Language (CEL) syntax.\n *\n * This is a simplified form of the `cel` Rule field, where only `expression` is set. This allows for\n * simpler syntax when defining CEL Rules where `id` and `message` derived from the `expression`. `id` will\n * be same as the `expression`.\n *\n * For more information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `foo` must be greater than 42.\n * option (buf.validate.message).cel_expression = \"this.foo > 42\";\n * // The field `foo` must be less than 84.\n * option (buf.validate.message).cel_expression = \"this.foo < 84\";\n * optional int32 foo = 1;\n * }\n * ```\n *\n * @generated from field: repeated string cel_expression = 5;\n */\n celExpression: string[];\n\n /**\n * `cel` is a repeated field of type Rule. Each Rule specifies a validation rule to be applied to this message.\n * These rules are written in Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n *\n * ```proto\n * message MyMessage {\n * // The field `foo` must be greater than 42.\n * option (buf.validate.message).cel = {\n * id: \"my_message.value\",\n * message: \"must be greater than 42\",\n * expression: \"this.foo > 42\",\n * };\n * optional int32 foo = 1;\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 3;\n */\n cel: Rule[];\n\n /**\n * `oneof` is a repeated field of type MessageOneofRule that specifies a list of fields\n * of which at most one can be present. If `required` is also specified, then exactly one\n * of the specified fields _must_ be present.\n *\n * This will enforce oneof-like constraints with a few features not provided by\n * actual Protobuf oneof declarations:\n * 1. Repeated and map fields are allowed in this validation. In a Protobuf oneof,\n * only scalar fields are allowed.\n * 2. Fields with implicit presence are allowed. In a Protobuf oneof, all member\n * fields have explicit presence. This means that, for the purpose of determining\n * how many fields are set, explicitly setting such a field to its zero value is\n * effectively the same as not setting it at all.\n * 3. This will always generate validation errors for a message unmarshalled from\n * serialized data that sets more than one field. With a Protobuf oneof, when\n * multiple fields are present in the serialized form, earlier values are usually\n * silently ignored when unmarshalling, with only the last field being set when\n * unmarshalling completes.\n *\n * Note that adding a field to a `oneof` will also set the IGNORE_IF_ZERO_VALUE on the fields. This means\n * only the field that is set will be validated and the unset fields are not validated according to the field rules.\n * This behavior can be overridden by setting `ignore` against a field.\n *\n * ```proto\n * message MyMessage {\n * // Only one of `field1` or `field2` _can_ be present in this message.\n * option (buf.validate.message).oneof = { fields: [\"field1\", \"field2\"] };\n * // Exactly one of `field3` or `field4` _must_ be present in this message.\n * option (buf.validate.message).oneof = { fields: [\"field3\", \"field4\"], required: true };\n * string field1 = 1;\n * bytes field2 = 2;\n * bool field3 = 3;\n * int32 field4 = 4;\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.MessageOneofRule oneof = 4;\n */\n oneof: MessageOneofRule[];\n};\n\n/**\n * Describes the message buf.validate.MessageRules.\n * Use `create(MessageRulesSchema)` to create a new message.\n */\nexport const MessageRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 1);\n\n/**\n * @generated from message buf.validate.MessageOneofRule\n */\nexport type MessageOneofRule = Message<\"buf.validate.MessageOneofRule\"> & {\n /**\n * A list of field names to include in the oneof. All field names must be\n * defined in the message. At least one field must be specified, and\n * duplicates are not permitted.\n *\n * @generated from field: repeated string fields = 1;\n */\n fields: string[];\n\n /**\n * If true, one of the fields specified _must_ be set.\n *\n * @generated from field: optional bool required = 2;\n */\n required: boolean;\n};\n\n/**\n * Describes the message buf.validate.MessageOneofRule.\n * Use `create(MessageOneofRuleSchema)` to create a new message.\n */\nexport const MessageOneofRuleSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 2);\n\n/**\n * The `OneofRules` message type enables you to manage rules for\n * oneof fields in your protobuf messages.\n *\n * @generated from message buf.validate.OneofRules\n */\nexport type OneofRules = Message<\"buf.validate.OneofRules\"> & {\n /**\n * If `required` is true, exactly one field of the oneof must be set. A\n * validation error is returned if no fields in the oneof are set. Further rules\n * should be placed on the fields themselves to ensure they are valid values,\n * such as `min_len` or `gt`.\n *\n * ```proto\n * message MyMessage {\n * oneof value {\n * // Either `a` or `b` must be set. If `a` is set, it must also be\n * // non-empty; whereas if `b` is set, it can still be an empty string.\n * option (buf.validate.oneof).required = true;\n * string a = 1 [(buf.validate.field).string.min_len = 1];\n * string b = 2;\n * }\n * }\n * ```\n *\n * @generated from field: optional bool required = 1;\n */\n required: boolean;\n};\n\n/**\n * Describes the message buf.validate.OneofRules.\n * Use `create(OneofRulesSchema)` to create a new message.\n */\nexport const OneofRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 3);\n\n/**\n * FieldRules encapsulates the rules for each type of field. Depending on\n * the field, the correct set should be used to ensure proper validations.\n *\n * @generated from message buf.validate.FieldRules\n */\nexport type FieldRules = Message<\"buf.validate.FieldRules\"> & {\n /**\n * `cel_expression` is a repeated field CEL expressions. Each expression specifies a validation\n * rule to be applied to this message. These rules are written in Common Expression Language (CEL) syntax.\n *\n * This is a simplified form of the `cel` Rule field, where only `expression` is set. This allows for\n * simpler syntax when defining CEL Rules where `id` and `message` derived from the `expression`. `id` will\n * be same as the `expression`.\n *\n * For more information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.field).cel_expression = \"this > 42\"];\n * }\n * ```\n *\n * @generated from field: repeated string cel_expression = 29;\n */\n celExpression: string[];\n\n /**\n * `cel` is a repeated field used to represent a textual expression\n * in the Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.field).cel = {\n * id: \"my_message.value\",\n * message: \"must be greater than 42\",\n * expression: \"this > 42\",\n * }];\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 23;\n */\n cel: Rule[];\n\n /**\n * If `required` is true, the field must be set. A validation error is returned\n * if the field is not set.\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message FieldsWithPresence {\n * // Requires any string to be set, including the empty string.\n * optional string link = 1 [\n * (buf.validate.field).required = true\n * ];\n * // Requires true or false to be set.\n * optional bool disabled = 2 [\n * (buf.validate.field).required = true\n * ];\n * // Requires a message to be set, including the empty message.\n * SomeMessage msg = 4 [\n * (buf.validate.field).required = true\n * ];\n * }\n * ```\n *\n * All fields in the example above track presence. By default, Protovalidate\n * ignores rules on those fields if no value is set. `required` ensures that\n * the fields are set and valid.\n *\n * Fields that don't track presence are always validated by Protovalidate,\n * whether they are set or not. It is not necessary to add `required`. It\n * can be added to indicate that the field cannot be the zero value.\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message FieldsWithoutPresence {\n * // `string.email` always applies, even to an empty string.\n * string link = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * // `repeated.min_items` always applies, even to an empty list.\n * repeated string labels = 2 [\n * (buf.validate.field).repeated.min_items = 1\n * ];\n * // `required`, for fields that don't track presence, indicates\n * // the value of the field can't be the zero value.\n * int32 zero_value_not_allowed = 3 [\n * (buf.validate.field).required = true\n * ];\n * }\n * ```\n *\n * To learn which fields track presence, see the\n * [Field Presence cheat sheet](https://protobuf.dev/programming-guides/field_presence/#cheat).\n *\n * Note: While field rules can be applied to repeated items, map keys, and map\n * values, the elements are always considered to be set. Consequently,\n * specifying `repeated.items.required` is redundant.\n *\n * @generated from field: optional bool required = 25;\n */\n required: boolean;\n\n /**\n * Ignore validation rules on the field if its value matches the specified\n * criteria. See the `Ignore` enum for details.\n *\n * ```proto\n * message UpdateRequest {\n * // The uri rule only applies if the field is not an empty string.\n * string url = 1 [\n * (buf.validate.field).ignore = IGNORE_IF_ZERO_VALUE,\n * (buf.validate.field).string.uri = true\n * ];\n * }\n * ```\n *\n * @generated from field: optional buf.validate.Ignore ignore = 27;\n */\n ignore: Ignore;\n\n /**\n * @generated from oneof buf.validate.FieldRules.type\n */\n type: {\n /**\n * Scalar Field Types\n *\n * @generated from field: buf.validate.FloatRules float = 1;\n */\n value: FloatRules;\n case: \"float\";\n } | {\n /**\n * @generated from field: buf.validate.DoubleRules double = 2;\n */\n value: DoubleRules;\n case: \"double\";\n } | {\n /**\n * @generated from field: buf.validate.Int32Rules int32 = 3;\n */\n value: Int32Rules;\n case: \"int32\";\n } | {\n /**\n * @generated from field: buf.validate.Int64Rules int64 = 4;\n */\n value: Int64Rules;\n case: \"int64\";\n } | {\n /**\n * @generated from field: buf.validate.UInt32Rules uint32 = 5;\n */\n value: UInt32Rules;\n case: \"uint32\";\n } | {\n /**\n * @generated from field: buf.validate.UInt64Rules uint64 = 6;\n */\n value: UInt64Rules;\n case: \"uint64\";\n } | {\n /**\n * @generated from field: buf.validate.SInt32Rules sint32 = 7;\n */\n value: SInt32Rules;\n case: \"sint32\";\n } | {\n /**\n * @generated from field: buf.validate.SInt64Rules sint64 = 8;\n */\n value: SInt64Rules;\n case: \"sint64\";\n } | {\n /**\n * @generated from field: buf.validate.Fixed32Rules fixed32 = 9;\n */\n value: Fixed32Rules;\n case: \"fixed32\";\n } | {\n /**\n * @generated from field: buf.validate.Fixed64Rules fixed64 = 10;\n */\n value: Fixed64Rules;\n case: \"fixed64\";\n } | {\n /**\n * @generated from field: buf.validate.SFixed32Rules sfixed32 = 11;\n */\n value: SFixed32Rules;\n case: \"sfixed32\";\n } | {\n /**\n * @generated from field: buf.validate.SFixed64Rules sfixed64 = 12;\n */\n value: SFixed64Rules;\n case: \"sfixed64\";\n } | {\n /**\n * @generated from field: buf.validate.BoolRules bool = 13;\n */\n value: BoolRules;\n case: \"bool\";\n } | {\n /**\n * @generated from field: buf.validate.StringRules string = 14;\n */\n value: StringRules;\n case: \"string\";\n } | {\n /**\n * @generated from field: buf.validate.BytesRules bytes = 15;\n */\n value: BytesRules;\n case: \"bytes\";\n } | {\n /**\n * Complex Field Types\n *\n * @generated from field: buf.validate.EnumRules enum = 16;\n */\n value: EnumRules;\n case: \"enum\";\n } | {\n /**\n * @generated from field: buf.validate.RepeatedRules repeated = 18;\n */\n value: RepeatedRules;\n case: \"repeated\";\n } | {\n /**\n * @generated from field: buf.validate.MapRules map = 19;\n */\n value: MapRules;\n case: \"map\";\n } | {\n /**\n * Well-Known Field Types\n *\n * @generated from field: buf.validate.AnyRules any = 20;\n */\n value: AnyRules;\n case: \"any\";\n } | {\n /**\n * @generated from field: buf.validate.DurationRules duration = 21;\n */\n value: DurationRules;\n case: \"duration\";\n } | {\n /**\n * @generated from field: buf.validate.FieldMaskRules field_mask = 28;\n */\n value: FieldMaskRules;\n case: \"fieldMask\";\n } | {\n /**\n * @generated from field: buf.validate.TimestampRules timestamp = 22;\n */\n value: TimestampRules;\n case: \"timestamp\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * Describes the message buf.validate.FieldRules.\n * Use `create(FieldRulesSchema)` to create a new message.\n */\nexport const FieldRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 4);\n\n/**\n * PredefinedRules are custom rules that can be re-used with\n * multiple fields.\n *\n * @generated from message buf.validate.PredefinedRules\n */\nexport type PredefinedRules = Message<\"buf.validate.PredefinedRules\"> & {\n /**\n * `cel` is a repeated field used to represent a textual expression\n * in the Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/predefined-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.predefined).cel = {\n * id: \"my_message.value\",\n * message: \"must be greater than 42\",\n * expression: \"this > 42\",\n * }];\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 1;\n */\n cel: Rule[];\n};\n\n/**\n * Describes the message buf.validate.PredefinedRules.\n * Use `create(PredefinedRulesSchema)` to create a new message.\n */\nexport const PredefinedRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 5);\n\n/**\n * FloatRules describes the rules applied to `float` values. These\n * rules may also be applied to the `google.protobuf.FloatValue` Well-Known-Type.\n *\n * @generated from message buf.validate.FloatRules\n */\nexport type FloatRules = Message<\"buf.validate.FloatRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must equal 42.0\n * float value = 1 [(buf.validate.field).float.const = 42.0];\n * }\n * ```\n *\n * @generated from field: optional float const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.FloatRules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // must be less than 10.0\n * float value = 1 [(buf.validate.field).float.lt = 10.0];\n * }\n * ```\n *\n * @generated from field: float lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // must be less than or equal to 10.0\n * float value = 1 [(buf.validate.field).float.lte = 10.0];\n * }\n * ```\n *\n * @generated from field: float lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.FloatRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // must be greater than 5.0 [float.gt]\n * float value = 1 [(buf.validate.field).float.gt = 5.0];\n *\n * // must be greater than 5 and less than 10.0 [float.gt_lt]\n * float other_value = 2 [(buf.validate.field).float = { gt: 5.0, lt: 10.0 }];\n *\n * // must be greater than 10 or less than 5.0 [float.gt_lt_exclusive]\n * float another_value = 3 [(buf.validate.field).float = { gt: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: float gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // must be greater than or equal to 5.0 [float.gte]\n * float value = 1 [(buf.validate.field).float.gte = 5.0];\n *\n * // must be greater than or equal to 5.0 and less than 10.0 [float.gte_lt]\n * float other_value = 2 [(buf.validate.field).float = { gte: 5.0, lt: 10.0 }];\n *\n * // must be greater than or equal to 10.0 or less than 5.0 [float.gte_lt_exclusive]\n * float another_value = 3 [(buf.validate.field).float = { gte: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: float gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyFloat {\n * // must be in list [1.0, 2.0, 3.0]\n * float value = 1 [(buf.validate.field).float = { in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated float in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must not be in list [1.0, 2.0, 3.0]\n * float value = 1 [(buf.validate.field).float = { not_in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated float not_in = 7;\n */\n notIn: number[];\n\n /**\n * `finite` requires the field value to be finite. If the field value is\n * infinite or NaN, an error message is generated.\n *\n * @generated from field: optional bool finite = 8;\n */\n finite: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFloat {\n * float value = 1 [\n * (buf.validate.field).float.example = 1.0,\n * (buf.validate.field).float.example = inf\n * ];\n * }\n * ```\n *\n * @generated from field: repeated float example = 9;\n */\n example: number[];\n};\n\n/**\n * Describes the message buf.validate.FloatRules.\n * Use `create(FloatRulesSchema)` to create a new message.\n */\nexport const FloatRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 6);\n\n/**\n * DoubleRules describes the rules applied to `double` values. These\n * rules may also be applied to the `google.protobuf.DoubleValue` Well-Known-Type.\n *\n * @generated from message buf.validate.DoubleRules\n */\nexport type DoubleRules = Message<\"buf.validate.DoubleRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must equal 42.0\n * double value = 1 [(buf.validate.field).double.const = 42.0];\n * }\n * ```\n *\n * @generated from field: optional double const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.DoubleRules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // must be less than 10.0\n * double value = 1 [(buf.validate.field).double.lt = 10.0];\n * }\n * ```\n *\n * @generated from field: double lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified value\n * (field <= value). If the field value is greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // must be less than or equal to 10.0\n * double value = 1 [(buf.validate.field).double.lte = 10.0];\n * }\n * ```\n *\n * @generated from field: double lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.DoubleRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or `lte`,\n * the range is reversed, and the field value must be outside the specified\n * range. If the field value doesn't meet the required conditions, an error\n * message is generated.\n *\n * ```proto\n * message MyDouble {\n * // must be greater than 5.0 [double.gt]\n * double value = 1 [(buf.validate.field).double.gt = 5.0];\n *\n * // must be greater than 5 and less than 10.0 [double.gt_lt]\n * double other_value = 2 [(buf.validate.field).double = { gt: 5.0, lt: 10.0 }];\n *\n * // must be greater than 10 or less than 5.0 [double.gt_lt_exclusive]\n * double another_value = 3 [(buf.validate.field).double = { gt: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: double gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // must be greater than or equal to 5.0 [double.gte]\n * double value = 1 [(buf.validate.field).double.gte = 5.0];\n *\n * // must be greater than or equal to 5.0 and less than 10.0 [double.gte_lt]\n * double other_value = 2 [(buf.validate.field).double = { gte: 5.0, lt: 10.0 }];\n *\n * // must be greater than or equal to 10.0 or less than 5.0 [double.gte_lt_exclusive]\n * double another_value = 3 [(buf.validate.field).double = { gte: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: double gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyDouble {\n * // must be in list [1.0, 2.0, 3.0]\n * double value = 1 [(buf.validate.field).double = { in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated double in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must not be in list [1.0, 2.0, 3.0]\n * double value = 1 [(buf.validate.field).double = { not_in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated double not_in = 7;\n */\n notIn: number[];\n\n /**\n * `finite` requires the field value to be finite. If the field value is\n * infinite or NaN, an error message is generated.\n *\n * @generated from field: optional bool finite = 8;\n */\n finite: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyDouble {\n * double value = 1 [\n * (buf.validate.field).double.example = 1.0,\n * (buf.validate.field).double.example = inf\n * ];\n * }\n * ```\n *\n * @generated from field: repeated double example = 9;\n */\n example: number[];\n};\n\n/**\n * Describes the message buf.validate.DoubleRules.\n * Use `create(DoubleRulesSchema)` to create a new message.\n */\nexport const DoubleRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 7);\n\n/**\n * Int32Rules describes the rules applied to `int32` values. These\n * rules may also be applied to the `google.protobuf.Int32Value` Well-Known-Type.\n *\n * @generated from message buf.validate.Int32Rules\n */\nexport type Int32Rules = Message<\"buf.validate.Int32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must equal 42\n * int32 value = 1 [(buf.validate.field).int32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional int32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.Int32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // must be less than 10\n * int32 value = 1 [(buf.validate.field).int32.lt = 10];\n * }\n * ```\n *\n * @generated from field: int32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // must be less than or equal to 10\n * int32 value = 1 [(buf.validate.field).int32.lte = 10];\n * }\n * ```\n *\n * @generated from field: int32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Int32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // must be greater than 5 [int32.gt]\n * int32 value = 1 [(buf.validate.field).int32.gt = 5];\n *\n * // must be greater than 5 and less than 10 [int32.gt_lt]\n * int32 other_value = 2 [(buf.validate.field).int32 = { gt: 5, lt: 10 }];\n *\n * // must be greater than 10 or less than 5 [int32.gt_lt_exclusive]\n * int32 another_value = 3 [(buf.validate.field).int32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified value\n * (exclusive). If the value of `gte` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // must be greater than or equal to 5 [int32.gte]\n * int32 value = 1 [(buf.validate.field).int32.gte = 5];\n *\n * // must be greater than or equal to 5 and less than 10 [int32.gte_lt]\n * int32 other_value = 2 [(buf.validate.field).int32 = { gte: 5, lt: 10 }];\n *\n * // must be greater than or equal to 10 or less than 5 [int32.gte_lt_exclusive]\n * int32 another_value = 3 [(buf.validate.field).int32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyInt32 {\n * // must be in list [1, 2, 3]\n * int32 value = 1 [(buf.validate.field).int32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must not be in list [1, 2, 3]\n * int32 value = 1 [(buf.validate.field).int32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyInt32 {\n * int32 value = 1 [\n * (buf.validate.field).int32.example = 1,\n * (buf.validate.field).int32.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 8;\n */\n example: number[];\n};\n\n/**\n * Describes the message buf.validate.Int32Rules.\n * Use `create(Int32RulesSchema)` to create a new message.\n */\nexport const Int32RulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 8);\n\n/**\n * Int64Rules describes the rules applied to `int64` values. These\n * rules may also be applied to the `google.protobuf.Int64Value` Well-Known-Type.\n *\n * @generated from message buf.validate.Int64Rules\n */\nexport type Int64Rules = Message<\"buf.validate.Int64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must equal 42\n * int64 value = 1 [(buf.validate.field).int64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional int64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.Int64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // must be less than 10\n * int64 value = 1 [(buf.validate.field).int64.lt = 10];\n * }\n * ```\n *\n * @generated from field: int64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // must be less than or equal to 10\n * int64 value = 1 [(buf.validate.field).int64.lte = 10];\n * }\n * ```\n *\n * @generated from field: int64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Int64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // must be greater than 5 [int64.gt]\n * int64 value = 1 [(buf.validate.field).int64.gt = 5];\n *\n * // must be greater than 5 and less than 10 [int64.gt_lt]\n * int64 other_value = 2 [(buf.validate.field).int64 = { gt: 5, lt: 10 }];\n *\n * // must be greater than 10 or less than 5 [int64.gt_lt_exclusive]\n * int64 another_value = 3 [(buf.validate.field).int64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // must be greater than or equal to 5 [int64.gte]\n * int64 value = 1 [(buf.validate.field).int64.gte = 5];\n *\n * // must be greater than or equal to 5 and less than 10 [int64.gte_lt]\n * int64 other_value = 2 [(buf.validate.field).int64 = { gte: 5, lt: 10 }];\n *\n * // must be greater than or equal to 10 or less than 5 [int64.gte_lt_exclusive]\n * int64 another_value = 3 [(buf.validate.field).int64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyInt64 {\n * // must be in list [1, 2, 3]\n * int64 value = 1 [(buf.validate.field).int64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must not be in list [1, 2, 3]\n * int64 value = 1 [(buf.validate.field).int64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyInt64 {\n * int64 value = 1 [\n * (buf.validate.field).int64.example = 1,\n * (buf.validate.field).int64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int64 example = 9;\n */\n example: bigint[];\n};\n\n/**\n * Describes the message buf.validate.Int64Rules.\n * Use `create(Int64RulesSchema)` to create a new message.\n */\nexport const Int64RulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 9);\n\n/**\n * UInt32Rules describes the rules applied to `uint32` values. These\n * rules may also be applied to the `google.protobuf.UInt32Value` Well-Known-Type.\n *\n * @generated from message buf.validate.UInt32Rules\n */\nexport type UInt32Rules = Message<\"buf.validate.UInt32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must equal 42\n * uint32 value = 1 [(buf.validate.field).uint32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional uint32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.UInt32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // must be less than 10\n * uint32 value = 1 [(buf.validate.field).uint32.lt = 10];\n * }\n * ```\n *\n * @generated from field: uint32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // must be less than or equal to 10\n * uint32 value = 1 [(buf.validate.field).uint32.lte = 10];\n * }\n * ```\n *\n * @generated from field: uint32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.UInt32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // must be greater than 5 [uint32.gt]\n * uint32 value = 1 [(buf.validate.field).uint32.gt = 5];\n *\n * // must be greater than 5 and less than 10 [uint32.gt_lt]\n * uint32 other_value = 2 [(buf.validate.field).uint32 = { gt: 5, lt: 10 }];\n *\n * // must be greater than 10 or less than 5 [uint32.gt_lt_exclusive]\n * uint32 another_value = 3 [(buf.validate.field).uint32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // must be greater than or equal to 5 [uint32.gte]\n * uint32 value = 1 [(buf.validate.field).uint32.gte = 5];\n *\n * // must be greater than or equal to 5 and less than 10 [uint32.gte_lt]\n * uint32 other_value = 2 [(buf.validate.field).uint32 = { gte: 5, lt: 10 }];\n *\n * // must be greater than or equal to 10 or less than 5 [uint32.gte_lt_exclusive]\n * uint32 another_value = 3 [(buf.validate.field).uint32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyUInt32 {\n * // must be in list [1, 2, 3]\n * uint32 value = 1 [(buf.validate.field).uint32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must not be in list [1, 2, 3]\n * uint32 value = 1 [(buf.validate.field).uint32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyUInt32 {\n * uint32 value = 1 [\n * (buf.validate.field).uint32.example = 1,\n * (buf.validate.field).uint32.example = 10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated uint32 example = 8;\n */\n example: number[];\n};\n\n/**\n * Describes the message buf.validate.UInt32Rules.\n * Use `create(UInt32RulesSchema)` to create a new message.\n */\nexport const UInt32RulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 10);\n\n/**\n * UInt64Rules describes the rules applied to `uint64` values. These\n * rules may also be applied to the `google.protobuf.UInt64Value` Well-Known-Type.\n *\n * @generated from message buf.validate.UInt64Rules\n */\nexport type UInt64Rules = Message<\"buf.validate.UInt64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must equal 42\n * uint64 value = 1 [(buf.validate.field).uint64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional uint64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.UInt64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // must be less than 10\n * uint64 value = 1 [(buf.validate.field).uint64.lt = 10];\n * }\n * ```\n *\n * @generated from field: uint64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // must be less than or equal to 10\n * uint64 value = 1 [(buf.validate.field).uint64.lte = 10];\n * }\n * ```\n *\n * @generated from field: uint64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.UInt64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // must be greater than 5 [uint64.gt]\n * uint64 value = 1 [(buf.validate.field).uint64.gt = 5];\n *\n * // must be greater than 5 and less than 10 [uint64.gt_lt]\n * uint64 other_value = 2 [(buf.validate.field).uint64 = { gt: 5, lt: 10 }];\n *\n * // must be greater than 10 or less than 5 [uint64.gt_lt_exclusive]\n * uint64 another_value = 3 [(buf.validate.field).uint64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // must be greater than or equal to 5 [uint64.gte]\n * uint64 value = 1 [(buf.validate.field).uint64.gte = 5];\n *\n * // must be greater than or equal to 5 and less than 10 [uint64.gte_lt]\n * uint64 other_value = 2 [(buf.validate.field).uint64 = { gte: 5, lt: 10 }];\n *\n * // must be greater than or equal to 10 or less than 5 [uint64.gte_lt_exclusive]\n * uint64 another_value = 3 [(buf.validate.field).uint64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyUInt64 {\n * // must be in list [1, 2, 3]\n * uint64 value = 1 [(buf.validate.field).uint64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must not be in list [1, 2, 3]\n * uint64 value = 1 [(buf.validate.field).uint64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyUInt64 {\n * uint64 value = 1 [\n * (buf.validate.field).uint64.example = 1,\n * (buf.validate.field).uint64.example = 10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated uint64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * Describes the message buf.validate.UInt64Rules.\n * Use `create(UInt64RulesSchema)` to create a new message.\n */\nexport const UInt64RulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 11);\n\n/**\n * SInt32Rules describes the rules applied to `sint32` values.\n *\n * @generated from message buf.validate.SInt32Rules\n */\nexport type SInt32Rules = Message<\"buf.validate.SInt32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must equal 42\n * sint32 value = 1 [(buf.validate.field).sint32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sint32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.SInt32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // must be less than 10\n * sint32 value = 1 [(buf.validate.field).sint32.lt = 10];\n * }\n * ```\n *\n * @generated from field: sint32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // must be less than or equal to 10\n * sint32 value = 1 [(buf.validate.field).sint32.lte = 10];\n * }\n * ```\n *\n * @generated from field: sint32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SInt32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // must be greater than 5 [sint32.gt]\n * sint32 value = 1 [(buf.validate.field).sint32.gt = 5];\n *\n * // must be greater than 5 and less than 10 [sint32.gt_lt]\n * sint32 other_value = 2 [(buf.validate.field).sint32 = { gt: 5, lt: 10 }];\n *\n * // must be greater than 10 or less than 5 [sint32.gt_lt_exclusive]\n * sint32 another_value = 3 [(buf.validate.field).sint32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // must be greater than or equal to 5 [sint32.gte]\n * sint32 value = 1 [(buf.validate.field).sint32.gte = 5];\n *\n * // must be greater than or equal to 5 and less than 10 [sint32.gte_lt]\n * sint32 other_value = 2 [(buf.validate.field).sint32 = { gte: 5, lt: 10 }];\n *\n * // must be greater than or equal to 10 or less than 5 [sint32.gte_lt_exclusive]\n * sint32 another_value = 3 [(buf.validate.field).sint32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySInt32 {\n * // must be in list [1, 2, 3]\n * sint32 value = 1 [(buf.validate.field).sint32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must not be in list [1, 2, 3]\n * sint32 value = 1 [(buf.validate.field).sint32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySInt32 {\n * sint32 value = 1 [\n * (buf.validate.field).sint32.example = 1,\n * (buf.validate.field).sint32.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sint32 example = 8;\n */\n example: number[];\n};\n\n/**\n * Describes the message buf.validate.SInt32Rules.\n * Use `create(SInt32RulesSchema)` to create a new message.\n */\nexport const SInt32RulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 12);\n\n/**\n * SInt64Rules describes the rules applied to `sint64` values.\n *\n * @generated from message buf.validate.SInt64Rules\n */\nexport type SInt64Rules = Message<\"buf.validate.SInt64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must equal 42\n * sint64 value = 1 [(buf.validate.field).sint64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sint64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.SInt64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // must be less than 10\n * sint64 value = 1 [(buf.validate.field).sint64.lt = 10];\n * }\n * ```\n *\n * @generated from field: sint64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // must be less than or equal to 10\n * sint64 value = 1 [(buf.validate.field).sint64.lte = 10];\n * }\n * ```\n *\n * @generated from field: sint64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SInt64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // must be greater than 5 [sint64.gt]\n * sint64 value = 1 [(buf.validate.field).sint64.gt = 5];\n *\n * // must be greater than 5 and less than 10 [sint64.gt_lt]\n * sint64 other_value = 2 [(buf.validate.field).sint64 = { gt: 5, lt: 10 }];\n *\n * // must be greater than 10 or less than 5 [sint64.gt_lt_exclusive]\n * sint64 another_value = 3 [(buf.validate.field).sint64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // must be greater than or equal to 5 [sint64.gte]\n * sint64 value = 1 [(buf.validate.field).sint64.gte = 5];\n *\n * // must be greater than or equal to 5 and less than 10 [sint64.gte_lt]\n * sint64 other_value = 2 [(buf.validate.field).sint64 = { gte: 5, lt: 10 }];\n *\n * // must be greater than or equal to 10 or less than 5 [sint64.gte_lt_exclusive]\n * sint64 another_value = 3 [(buf.validate.field).sint64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MySInt64 {\n * // must be in list [1, 2, 3]\n * sint64 value = 1 [(buf.validate.field).sint64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must not be in list [1, 2, 3]\n * sint64 value = 1 [(buf.validate.field).sint64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySInt64 {\n * sint64 value = 1 [\n * (buf.validate.field).sint64.example = 1,\n * (buf.validate.field).sint64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sint64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * Describes the message buf.validate.SInt64Rules.\n * Use `create(SInt64RulesSchema)` to create a new message.\n */\nexport const SInt64RulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 13);\n\n/**\n * Fixed32Rules describes the rules applied to `fixed32` values.\n *\n * @generated from message buf.validate.Fixed32Rules\n */\nexport type Fixed32Rules = Message<\"buf.validate.Fixed32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must equal 42\n * fixed32 value = 1 [(buf.validate.field).fixed32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional fixed32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.Fixed32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // must be less than 10\n * fixed32 value = 1 [(buf.validate.field).fixed32.lt = 10];\n * }\n * ```\n *\n * @generated from field: fixed32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // must be less than or equal to 10\n * fixed32 value = 1 [(buf.validate.field).fixed32.lte = 10];\n * }\n * ```\n *\n * @generated from field: fixed32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Fixed32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // must be greater than 5 [fixed32.gt]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gt = 5];\n *\n * // must be greater than 5 and less than 10 [fixed32.gt_lt]\n * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gt: 5, lt: 10 }];\n *\n * // must be greater than 10 or less than 5 [fixed32.gt_lt_exclusive]\n * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // must be greater than or equal to 5 [fixed32.gte]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gte = 5];\n *\n * // must be greater than or equal to 5 and less than 10 [fixed32.gte_lt]\n * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gte: 5, lt: 10 }];\n *\n * // must be greater than or equal to 10 or less than 5 [fixed32.gte_lt_exclusive]\n * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // must be in list [1, 2, 3]\n * fixed32 value = 1 [(buf.validate.field).fixed32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must not be in list [1, 2, 3]\n * fixed32 value = 1 [(buf.validate.field).fixed32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFixed32 {\n * fixed32 value = 1 [\n * (buf.validate.field).fixed32.example = 1,\n * (buf.validate.field).fixed32.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 example = 8;\n */\n example: number[];\n};\n\n/**\n * Describes the message buf.validate.Fixed32Rules.\n * Use `create(Fixed32RulesSchema)` to create a new message.\n */\nexport const Fixed32RulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 14);\n\n/**\n * Fixed64Rules describes the rules applied to `fixed64` values.\n *\n * @generated from message buf.validate.Fixed64Rules\n */\nexport type Fixed64Rules = Message<\"buf.validate.Fixed64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must equal 42\n * fixed64 value = 1 [(buf.validate.field).fixed64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional fixed64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.Fixed64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // must be less than 10\n * fixed64 value = 1 [(buf.validate.field).fixed64.lt = 10];\n * }\n * ```\n *\n * @generated from field: fixed64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // must be less than or equal to 10\n * fixed64 value = 1 [(buf.validate.field).fixed64.lte = 10];\n * }\n * ```\n *\n * @generated from field: fixed64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Fixed64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // must be greater than 5 [fixed64.gt]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gt = 5];\n *\n * // must be greater than 5 and less than 10 [fixed64.gt_lt]\n * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gt: 5, lt: 10 }];\n *\n * // must be greater than 10 or less than 5 [fixed64.gt_lt_exclusive]\n * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // must be greater than or equal to 5 [fixed64.gte]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gte = 5];\n *\n * // must be greater than or equal to 5 and less than 10 [fixed64.gte_lt]\n * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gte: 5, lt: 10 }];\n *\n * // must be greater than or equal to 10 or less than 5 [fixed64.gte_lt_exclusive]\n * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyFixed64 {\n * // must be in list [1, 2, 3]\n * fixed64 value = 1 [(buf.validate.field).fixed64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must not be in list [1, 2, 3]\n * fixed64 value = 1 [(buf.validate.field).fixed64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFixed64 {\n * fixed64 value = 1 [\n * (buf.validate.field).fixed64.example = 1,\n * (buf.validate.field).fixed64.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * Describes the message buf.validate.Fixed64Rules.\n * Use `create(Fixed64RulesSchema)` to create a new message.\n */\nexport const Fixed64RulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 15);\n\n/**\n * SFixed32Rules describes the rules applied to `fixed32` values.\n *\n * @generated from message buf.validate.SFixed32Rules\n */\nexport type SFixed32Rules = Message<\"buf.validate.SFixed32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must equal 42\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sfixed32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.SFixed32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // must be less than 10\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.lt = 10];\n * }\n * ```\n *\n * @generated from field: sfixed32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // must be less than or equal to 10\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.lte = 10];\n * }\n * ```\n *\n * @generated from field: sfixed32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SFixed32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // must be greater than 5 [sfixed32.gt]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gt = 5];\n *\n * // must be greater than 5 and less than 10 [sfixed32.gt_lt]\n * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gt: 5, lt: 10 }];\n *\n * // must be greater than 10 or less than 5 [sfixed32.gt_lt_exclusive]\n * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // must be greater than or equal to 5 [sfixed32.gte]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gte = 5];\n *\n * // must be greater than or equal to 5 and less than 10 [sfixed32.gte_lt]\n * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gte: 5, lt: 10 }];\n *\n * // must be greater than or equal to 10 or less than 5 [sfixed32.gte_lt_exclusive]\n * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySFixed32 {\n * // must be in list [1, 2, 3]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must not be in list [1, 2, 3]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySFixed32 {\n * sfixed32 value = 1 [\n * (buf.validate.field).sfixed32.example = 1,\n * (buf.validate.field).sfixed32.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 example = 8;\n */\n example: number[];\n};\n\n/**\n * Describes the message buf.validate.SFixed32Rules.\n * Use `create(SFixed32RulesSchema)` to create a new message.\n */\nexport const SFixed32RulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 16);\n\n/**\n * SFixed64Rules describes the rules applied to `fixed64` values.\n *\n * @generated from message buf.validate.SFixed64Rules\n */\nexport type SFixed64Rules = Message<\"buf.validate.SFixed64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must equal 42\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sfixed64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.SFixed64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // must be less than 10\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.lt = 10];\n * }\n * ```\n *\n * @generated from field: sfixed64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // must be less than or equal to 10\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.lte = 10];\n * }\n * ```\n *\n * @generated from field: sfixed64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SFixed64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // must be greater than 5 [sfixed64.gt]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gt = 5];\n *\n * // must be greater than 5 and less than 10 [sfixed64.gt_lt]\n * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gt: 5, lt: 10 }];\n *\n * // must be greater than 10 or less than 5 [sfixed64.gt_lt_exclusive]\n * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // must be greater than or equal to 5 [sfixed64.gte]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gte = 5];\n *\n * // must be greater than or equal to 5 and less than 10 [sfixed64.gte_lt]\n * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gte: 5, lt: 10 }];\n *\n * // must be greater than or equal to 10 or less than 5 [sfixed64.gte_lt_exclusive]\n * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySFixed64 {\n * // must be in list [1, 2, 3]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must not be in list [1, 2, 3]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySFixed64 {\n * sfixed64 value = 1 [\n * (buf.validate.field).sfixed64.example = 1,\n * (buf.validate.field).sfixed64.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * Describes the message buf.validate.SFixed64Rules.\n * Use `create(SFixed64RulesSchema)` to create a new message.\n */\nexport const SFixed64RulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 17);\n\n/**\n * BoolRules describes the rules applied to `bool` values. These rules\n * may also be applied to the `google.protobuf.BoolValue` Well-Known-Type.\n *\n * @generated from message buf.validate.BoolRules\n */\nexport type BoolRules = Message<\"buf.validate.BoolRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified boolean value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBool {\n * // value must equal true\n * bool value = 1 [(buf.validate.field).bool.const = true];\n * }\n * ```\n *\n * @generated from field: optional bool const = 1;\n */\n const: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyBool {\n * bool value = 1 [\n * (buf.validate.field).bool.example = true,\n * (buf.validate.field).bool.example = false\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bool example = 2;\n */\n example: boolean[];\n};\n\n/**\n * Describes the message buf.validate.BoolRules.\n * Use `create(BoolRulesSchema)` to create a new message.\n */\nexport const BoolRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 18);\n\n/**\n * StringRules describes the rules applied to `string` values These\n * rules may also be applied to the `google.protobuf.StringValue` Well-Known-Type.\n *\n * @generated from message buf.validate.StringRules\n */\nexport type StringRules = Message<\"buf.validate.StringRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyString {\n * // value must equal `hello`\n * string value = 1 [(buf.validate.field).string.const = \"hello\"];\n * }\n * ```\n *\n * @generated from field: optional string const = 1;\n */\n const: string;\n\n /**\n * `len` dictates that the field value must have the specified\n * number of characters (Unicode code points), which may differ from the number\n * of bytes in the string. If the field value does not meet the specified\n * length, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be 5 characters\n * string value = 1 [(buf.validate.field).string.len = 5];\n * }\n * ```\n *\n * @generated from field: optional uint64 len = 19;\n */\n len: bigint;\n\n /**\n * `min_len` specifies that the field value must have at least the specified\n * number of characters (Unicode code points), which may differ from the number\n * of bytes in the string. If the field value contains fewer characters, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at least 3 characters\n * string value = 1 [(buf.validate.field).string.min_len = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_len = 2;\n */\n minLen: bigint;\n\n /**\n * `max_len` specifies that the field value must have no more than the specified\n * number of characters (Unicode code points), which may differ from the\n * number of bytes in the string. If the field value contains more characters,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at most 10 characters\n * string value = 1 [(buf.validate.field).string.max_len = 10];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_len = 3;\n */\n maxLen: bigint;\n\n /**\n * `len_bytes` dictates that the field value must have the specified number of\n * bytes. If the field value does not match the specified length in bytes,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be 6 bytes\n * string value = 1 [(buf.validate.field).string.len_bytes = 6];\n * }\n * ```\n *\n * @generated from field: optional uint64 len_bytes = 20;\n */\n lenBytes: bigint;\n\n /**\n * `min_bytes` specifies that the field value must have at least the specified\n * number of bytes. If the field value contains fewer bytes, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at least 4 bytes\n * string value = 1 [(buf.validate.field).string.min_bytes = 4];\n * }\n *\n * ```\n *\n * @generated from field: optional uint64 min_bytes = 4;\n */\n minBytes: bigint;\n\n /**\n * `max_bytes` specifies that the field value must have no more than the\n * specified number of bytes. If the field value contains more bytes, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at most 8 bytes\n * string value = 1 [(buf.validate.field).string.max_bytes = 8];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_bytes = 5;\n */\n maxBytes: bigint;\n\n /**\n * `pattern` specifies that the field value must match the specified\n * regular expression (RE2 syntax), with the expression provided without any\n * delimiters. If the field value doesn't match the regular expression, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not match regex pattern `^[a-zA-Z]//$`\n * string value = 1 [(buf.validate.field).string.pattern = \"^[a-zA-Z]//$\"];\n * }\n * ```\n *\n * @generated from field: optional string pattern = 6;\n */\n pattern: string;\n\n /**\n * `prefix` specifies that the field value must have the\n * specified substring at the beginning of the string. If the field value\n * doesn't start with the specified prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value does not have prefix `pre`\n * string value = 1 [(buf.validate.field).string.prefix = \"pre\"];\n * }\n * ```\n *\n * @generated from field: optional string prefix = 7;\n */\n prefix: string;\n\n /**\n * `suffix` specifies that the field value must have the\n * specified substring at the end of the string. If the field value doesn't\n * end with the specified suffix, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not have suffix `post`\n * string value = 1 [(buf.validate.field).string.suffix = \"post\"];\n * }\n * ```\n *\n * @generated from field: optional string suffix = 8;\n */\n suffix: string;\n\n /**\n * `contains` specifies that the field value must have the\n * specified substring anywhere in the string. If the field value doesn't\n * contain the specified substring, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not contain substring `inside`.\n * string value = 1 [(buf.validate.field).string.contains = \"inside\"];\n * }\n * ```\n *\n * @generated from field: optional string contains = 9;\n */\n contains: string;\n\n /**\n * `not_contains` specifies that the field value must not have the\n * specified substring anywhere in the string. If the field value contains\n * the specified substring, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value contains substring `inside`.\n * string value = 1 [(buf.validate.field).string.not_contains = \"inside\"];\n * }\n * ```\n *\n * @generated from field: optional string not_contains = 23;\n */\n notContains: string;\n\n /**\n * `in` specifies that the field value must be equal to one of the specified\n * values. If the field value isn't one of the specified values, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be in list [\"apple\", \"banana\"]\n * string value = 1 [(buf.validate.field).string = { in: [\"apple\", \"banana\"] }];\n * }\n * ```\n *\n * @generated from field: repeated string in = 10;\n */\n in: string[];\n\n /**\n * `not_in` specifies that the field value cannot be equal to any\n * of the specified values. If the field value is one of the specified values,\n * an error message will be generated.\n * ```proto\n * message MyString {\n * // value must not be in list [\"orange\", \"grape\"]\n * string value = 1 [(buf.validate.field).string = { not_in: [\"orange\", \"grape\"] }];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 11;\n */\n notIn: string[];\n\n /**\n * `WellKnown` rules provide advanced rules against common string\n * patterns.\n *\n * @generated from oneof buf.validate.StringRules.well_known\n */\n wellKnown: {\n /**\n * `email` specifies that the field value must be a valid email address, for\n * example \"foo@example.com\".\n *\n * Conforms to the definition for a valid email address from the [HTML standard](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address).\n * Note that this standard willfully deviates from [RFC 5322](https://datatracker.ietf.org/doc/html/rfc5322),\n * which allows many unexpected forms of email addresses and will easily match\n * a typographical error.\n *\n * If the field value isn't a valid email address, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid email address\n * string value = 1 [(buf.validate.field).string.email = true];\n * }\n * ```\n *\n * @generated from field: bool email = 12;\n */\n value: boolean;\n case: \"email\";\n } | {\n /**\n * `hostname` specifies that the field value must be a valid hostname, for\n * example \"foo.example.com\".\n *\n * A valid hostname follows the rules below:\n * - The name consists of one or more labels, separated by a dot (\".\").\n * - Each label can be 1 to 63 alphanumeric characters.\n * - A label can contain hyphens (\"-\"), but must not start or end with a hyphen.\n * - The right-most label must not be digits only.\n * - The name can have a trailing dot—for example, \"foo.example.com.\".\n * - The name can be 253 characters at most, excluding the optional trailing dot.\n *\n * If the field value isn't a valid hostname, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid hostname\n * string value = 1 [(buf.validate.field).string.hostname = true];\n * }\n * ```\n *\n * @generated from field: bool hostname = 13;\n */\n value: boolean;\n case: \"hostname\";\n } | {\n /**\n * `ip` specifies that the field value must be a valid IP (v4 or v6) address.\n *\n * IPv4 addresses are expected in the dotted decimal format—for example, \"192.168.5.21\".\n * IPv6 addresses are expected in their text representation—for example, \"::1\",\n * or \"2001:0DB8:ABCD:0012::0\".\n *\n * Both formats are well-defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).\n * Zone identifiers for IPv6 addresses (for example, \"fe80::a%en1\") are supported.\n *\n * If the field value isn't a valid IP address, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid IP address\n * string value = 1 [(buf.validate.field).string.ip = true];\n * }\n * ```\n *\n * @generated from field: bool ip = 14;\n */\n value: boolean;\n case: \"ip\";\n } | {\n /**\n * `ipv4` specifies that the field value must be a valid IPv4 address—for\n * example \"192.168.5.21\". If the field value isn't a valid IPv4 address, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid IPv4 address\n * string value = 1 [(buf.validate.field).string.ipv4 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4 = 15;\n */\n value: boolean;\n case: \"ipv4\";\n } | {\n /**\n * `ipv6` specifies that the field value must be a valid IPv6 address—for\n * example \"::1\", or \"d7a:115c:a1e0:ab12:4843:cd96:626b:430b\". If the field\n * value is not a valid IPv6 address, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid IPv6 address\n * string value = 1 [(buf.validate.field).string.ipv6 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6 = 16;\n */\n value: boolean;\n case: \"ipv6\";\n } | {\n /**\n * `uri` specifies that the field value must be a valid URI, for example\n * \"https://example.com/foo/bar?baz=quux#frag\".\n *\n * URI is defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).\n * Zone Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)).\n *\n * If the field value isn't a valid URI, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid URI\n * string value = 1 [(buf.validate.field).string.uri = true];\n * }\n * ```\n *\n * @generated from field: bool uri = 17;\n */\n value: boolean;\n case: \"uri\";\n } | {\n /**\n * `uri_ref` specifies that the field value must be a valid URI Reference—either\n * a URI such as \"https://example.com/foo/bar?baz=quux#frag\", or a Relative\n * Reference such as \"./foo/bar?query\".\n *\n * URI, URI Reference, and Relative Reference are defined in the internet\n * standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986). Zone\n * Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)).\n *\n * If the field value isn't a valid URI Reference, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid URI Reference\n * string value = 1 [(buf.validate.field).string.uri_ref = true];\n * }\n * ```\n *\n * @generated from field: bool uri_ref = 18;\n */\n value: boolean;\n case: \"uriRef\";\n } | {\n /**\n * `address` specifies that the field value must be either a valid hostname\n * (for example, \"example.com\"), or a valid IP (v4 or v6) address (for example,\n * \"192.168.0.1\", or \"::1\"). If the field value isn't a valid hostname or IP,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid hostname, or ip address\n * string value = 1 [(buf.validate.field).string.address = true];\n * }\n * ```\n *\n * @generated from field: bool address = 21;\n */\n value: boolean;\n case: \"address\";\n } | {\n /**\n * `uuid` specifies that the field value must be a valid UUID as defined by\n * [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2). If the\n * field value isn't a valid UUID, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid UUID\n * string value = 1 [(buf.validate.field).string.uuid = true];\n * }\n * ```\n *\n * @generated from field: bool uuid = 22;\n */\n value: boolean;\n case: \"uuid\";\n } | {\n /**\n * `tuuid` (trimmed UUID) specifies that the field value must be a valid UUID as\n * defined by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2) with all dashes\n * omitted. If the field value isn't a valid UUID without dashes, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid trimmed UUID\n * string value = 1 [(buf.validate.field).string.tuuid = true];\n * }\n * ```\n *\n * @generated from field: bool tuuid = 33;\n */\n value: boolean;\n case: \"tuuid\";\n } | {\n /**\n * `ip_with_prefixlen` specifies that the field value must be a valid IP\n * (v4 or v6) address with prefix length—for example, \"192.168.5.21/16\" or\n * \"2001:0DB8:ABCD:0012::F1/64\". If the field value isn't a valid IP with\n * prefix length, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid IP with prefix length\n * string value = 1 [(buf.validate.field).string.ip_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ip_with_prefixlen = 26;\n */\n value: boolean;\n case: \"ipWithPrefixlen\";\n } | {\n /**\n * `ipv4_with_prefixlen` specifies that the field value must be a valid\n * IPv4 address with prefix length—for example, \"192.168.5.21/16\". If the\n * field value isn't a valid IPv4 address with prefix length, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid IPv4 address with prefix length\n * string value = 1 [(buf.validate.field).string.ipv4_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4_with_prefixlen = 27;\n */\n value: boolean;\n case: \"ipv4WithPrefixlen\";\n } | {\n /**\n * `ipv6_with_prefixlen` specifies that the field value must be a valid\n * IPv6 address with prefix length—for example, \"2001:0DB8:ABCD:0012::F1/64\".\n * If the field value is not a valid IPv6 address with prefix length,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid IPv6 address prefix length\n * string value = 1 [(buf.validate.field).string.ipv6_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6_with_prefixlen = 28;\n */\n value: boolean;\n case: \"ipv6WithPrefixlen\";\n } | {\n /**\n * `ip_prefix` specifies that the field value must be a valid IP (v4 or v6)\n * prefix—for example, \"192.168.0.0/16\" or \"2001:0DB8:ABCD:0012::0/64\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"2001:0DB8:ABCD:0012::0/64\" designates the left-most 64 bits for the\n * prefix, and the remaining 64 bits must be zero.\n *\n * If the field value isn't a valid IP prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid IP prefix\n * string value = 1 [(buf.validate.field).string.ip_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ip_prefix = 29;\n */\n value: boolean;\n case: \"ipPrefix\";\n } | {\n /**\n * `ipv4_prefix` specifies that the field value must be a valid IPv4\n * prefix, for example \"192.168.0.0/16\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"192.168.0.0/16\" designates the left-most 16 bits for the prefix,\n * and the remaining 16 bits must be zero.\n *\n * If the field value isn't a valid IPv4 prefix, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid IPv4 prefix\n * string value = 1 [(buf.validate.field).string.ipv4_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4_prefix = 30;\n */\n value: boolean;\n case: \"ipv4Prefix\";\n } | {\n /**\n * `ipv6_prefix` specifies that the field value must be a valid IPv6 prefix—for\n * example, \"2001:0DB8:ABCD:0012::0/64\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"2001:0DB8:ABCD:0012::0/64\" designates the left-most 64 bits for the\n * prefix, and the remaining 64 bits must be zero.\n *\n * If the field value is not a valid IPv6 prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid IPv6 prefix\n * string value = 1 [(buf.validate.field).string.ipv6_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6_prefix = 31;\n */\n value: boolean;\n case: \"ipv6Prefix\";\n } | {\n /**\n * `host_and_port` specifies that the field value must be a valid host/port\n * pair—for example, \"example.com:8080\".\n *\n * The host can be one of:\n * - An IPv4 address in dotted decimal format—for example, \"192.168.5.21\".\n * - An IPv6 address enclosed in square brackets—for example, \"[2001:0DB8:ABCD:0012::F1]\".\n * - A hostname—for example, \"example.com\".\n *\n * The port is separated by a colon. It must be non-empty, with a decimal number\n * in the range of 0-65535, inclusive.\n *\n * @generated from field: bool host_and_port = 32;\n */\n value: boolean;\n case: \"hostAndPort\";\n } | {\n /**\n * `ulid` specifies that the field value must be a valid ULID (Universally Unique\n * Lexicographically Sortable Identifier) as defined by the [ULID specification](https://github.com/ulid/spec).\n * If the field value isn't a valid ULID, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid ULID\n * string value = 1 [(buf.validate.field).string.ulid = true];\n * }\n * ```\n *\n * @generated from field: bool ulid = 35;\n */\n value: boolean;\n case: \"ulid\";\n } | {\n /**\n * `protobuf_fqn` specifies that the field value must be a valid fully-qualified\n * Protobuf name as defined by the [Protobuf Language Specification](https://protobuf.com/docs/language-spec).\n *\n * A fully-qualified Protobuf name is a dot-separated list of Protobuf identifiers,\n * where each identifier starts with a letter or underscore and is followed by zero or\n * more letters, underscores, or digits.\n *\n * Examples: \"buf.validate\", \"google.protobuf.Timestamp\", \"my_package.MyMessage\".\n *\n * Note: historically, fully-qualified Protobuf names were represented with a leading\n * dot (for example, \".buf.validate.StringRules\"). Modern Protobuf does not use the\n * leading dot, and most fully-qualified names are represented without it. Use\n * `protobuf_dot_fqn` if a leading dot is required.\n *\n * If the field value isn't a valid fully-qualified Protobuf name, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid fully-qualified Protobuf name\n * string value = 1 [(buf.validate.field).string.protobuf_fqn = true];\n * }\n * ```\n *\n * @generated from field: bool protobuf_fqn = 37;\n */\n value: boolean;\n case: \"protobufFqn\";\n } | {\n /**\n * `protobuf_dot_fqn` specifies that the field value must be a valid fully-qualified\n * Protobuf name with a leading dot, as defined by the\n * [Protobuf Language Specification](https://protobuf.com/docs/language-spec).\n *\n * A fully-qualified Protobuf name with a leading dot is a dot followed by a\n * dot-separated list of Protobuf identifiers, where each identifier starts with a\n * letter or underscore and is followed by zero or more letters, underscores, or\n * digits.\n *\n * Examples: \".buf.validate\", \".google.protobuf.Timestamp\", \".my_package.MyMessage\".\n *\n * Note: this is the historical representation of fully-qualified Protobuf names,\n * where a leading dot denotes an absolute reference. Modern Protobuf does not use\n * the leading dot, and most fully-qualified names are represented without it. Most\n * users will want to use `protobuf_fqn` instead.\n *\n * If the field value isn't a valid fully-qualified Protobuf name with a leading dot,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid fully-qualified Protobuf name with a leading dot\n * string value = 1 [(buf.validate.field).string.protobuf_dot_fqn = true];\n * }\n * ```\n *\n * @generated from field: bool protobuf_dot_fqn = 38;\n */\n value: boolean;\n case: \"protobufDotFqn\";\n } | {\n /**\n * `well_known_regex` specifies a common well-known pattern\n * defined as a regex. If the field value doesn't match the well-known\n * regex, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // must be a valid HTTP header value\n * string value = 1 [(buf.validate.field).string.well_known_regex = KNOWN_REGEX_HTTP_HEADER_VALUE];\n * }\n * ```\n *\n * #### KnownRegex\n *\n * `well_known_regex` contains some well-known patterns.\n *\n * | Name | Number | Description |\n * |-------------------------------|--------|-------------------------------------------|\n * | KNOWN_REGEX_UNSPECIFIED | 0 | |\n * | KNOWN_REGEX_HTTP_HEADER_NAME | 1 | HTTP header name as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2) |\n * | KNOWN_REGEX_HTTP_HEADER_VALUE | 2 | HTTP header value as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4) |\n *\n * @generated from field: buf.validate.KnownRegex well_known_regex = 24;\n */\n value: KnownRegex;\n case: \"wellKnownRegex\";\n } | { case: undefined; value?: undefined };\n\n /**\n * This applies to regexes `HTTP_HEADER_NAME` and `HTTP_HEADER_VALUE` to\n * enable strict header validation. By default, this is true, and HTTP header\n * validations are [RFC-compliant](https://datatracker.ietf.org/doc/html/rfc7230#section-3). Setting to false will enable looser\n * validations that only disallow `\\r\\n\\0` characters, which can be used to\n * bypass header matching rules.\n *\n * ```proto\n * message MyString {\n * // The field `value` must have be a valid HTTP headers, but not enforced with strict rules.\n * string value = 1 [(buf.validate.field).string.strict = false];\n * }\n * ```\n *\n * @generated from field: optional bool strict = 25;\n */\n strict: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyString {\n * string value = 1 [\n * (buf.validate.field).string.example = \"hello\",\n * (buf.validate.field).string.example = \"world\"\n * ];\n * }\n * ```\n *\n * @generated from field: repeated string example = 34;\n */\n example: string[];\n};\n\n/**\n * Describes the message buf.validate.StringRules.\n * Use `create(StringRulesSchema)` to create a new message.\n */\nexport const StringRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 19);\n\n/**\n * BytesRules describe the rules applied to `bytes` values. These rules\n * may also be applied to the `google.protobuf.BytesValue` Well-Known-Type.\n *\n * @generated from message buf.validate.BytesRules\n */\nexport type BytesRules = Message<\"buf.validate.BytesRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified bytes\n * value. If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // must be \"\\x01\\x02\\x03\\x04\"\n * bytes value = 1 [(buf.validate.field).bytes.const = \"\\x01\\x02\\x03\\x04\"];\n * }\n * ```\n *\n * @generated from field: optional bytes const = 1;\n */\n const: Uint8Array;\n\n /**\n * `len` requires the field value to have the specified length in bytes.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value length must be 4 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.len = 4];\n * }\n * ```\n *\n * @generated from field: optional uint64 len = 13;\n */\n len: bigint;\n\n /**\n * `min_len` requires the field value to have at least the specified minimum\n * length in bytes.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value length must be at least 2 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.min_len = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_len = 2;\n */\n minLen: bigint;\n\n /**\n * `max_len` requires the field value to have at most the specified maximum\n * length in bytes.\n * If the field value exceeds the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // must be at most 6 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.max_len = 6];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_len = 3;\n */\n maxLen: bigint;\n\n /**\n * `pattern` requires the field value to match the specified regular\n * expression ([RE2 syntax](https://github.com/google/re2/wiki/Syntax)).\n * The value of the field must be valid UTF-8 or validation will fail with a\n * runtime error.\n * If the field value doesn't match the pattern, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must match regex pattern \"^[a-zA-Z0-9]+$\".\n * optional bytes value = 1 [(buf.validate.field).bytes.pattern = \"^[a-zA-Z0-9]+$\"];\n * }\n * ```\n *\n * @generated from field: optional string pattern = 4;\n */\n pattern: string;\n\n /**\n * `prefix` requires the field value to have the specified bytes at the\n * beginning of the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not have prefix \\x01\\x02\n * optional bytes value = 1 [(buf.validate.field).bytes.prefix = \"\\x01\\x02\"];\n * }\n * ```\n *\n * @generated from field: optional bytes prefix = 5;\n */\n prefix: Uint8Array;\n\n /**\n * `suffix` requires the field value to have the specified bytes at the end\n * of the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not have suffix \\x03\\x04\n * optional bytes value = 1 [(buf.validate.field).bytes.suffix = \"\\x03\\x04\"];\n * }\n * ```\n *\n * @generated from field: optional bytes suffix = 6;\n */\n suffix: Uint8Array;\n\n /**\n * `contains` requires the field value to have the specified bytes anywhere in\n * the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not contain \\x02\\x03\n * optional bytes value = 1 [(buf.validate.field).bytes.contains = \"\\x02\\x03\"];\n * }\n * ```\n *\n * @generated from field: optional bytes contains = 7;\n */\n contains: Uint8Array;\n\n /**\n * `in` requires the field value to be equal to one of the specified\n * values. If the field value doesn't match any of the specified values, an\n * error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must in [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"]\n * optional bytes value = 1 [(buf.validate.field).bytes = { in: [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"] }];\n * }\n * ```\n *\n * @generated from field: repeated bytes in = 8;\n */\n in: Uint8Array[];\n\n /**\n * `not_in` requires the field value to be not equal to any of the specified\n * values.\n * If the field value matches any of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyBytes {\n * // value must not in [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"]\n * optional bytes value = 1 [(buf.validate.field).bytes = { not_in: [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"] }];\n * }\n * ```\n *\n * @generated from field: repeated bytes not_in = 9;\n */\n notIn: Uint8Array[];\n\n /**\n * WellKnown rules provide advanced rules against common byte\n * patterns\n *\n * @generated from oneof buf.validate.BytesRules.well_known\n */\n wellKnown: {\n /**\n * `ip` ensures that the field `value` is a valid IP address (v4 or v6) in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // must be a valid IP address\n * optional bytes value = 1 [(buf.validate.field).bytes.ip = true];\n * }\n * ```\n *\n * @generated from field: bool ip = 10;\n */\n value: boolean;\n case: \"ip\";\n } | {\n /**\n * `ipv4` ensures that the field `value` is a valid IPv4 address in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // must be a valid IPv4 address\n * optional bytes value = 1 [(buf.validate.field).bytes.ipv4 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4 = 11;\n */\n value: boolean;\n case: \"ipv4\";\n } | {\n /**\n * `ipv6` ensures that the field `value` is a valid IPv6 address in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n * ```proto\n * message MyBytes {\n * // must be a valid IPv6 address\n * optional bytes value = 1 [(buf.validate.field).bytes.ipv6 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6 = 12;\n */\n value: boolean;\n case: \"ipv6\";\n } | {\n /**\n * `uuid` ensures that the field value encodes 128-bit UUID data as defined\n * by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2).\n * The field must contain exactly 16 bytes representing the UUID. If the\n * field value isn't a valid UUID, an error message will be generated.\n *\n * ```proto\n * message MyBytes {\n * // must be a valid UUID\n * optional bytes value = 1 [(buf.validate.field).bytes.uuid = true];\n * }\n * ```\n *\n * @generated from field: bool uuid = 15;\n */\n value: boolean;\n case: \"uuid\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyBytes {\n * bytes value = 1 [\n * (buf.validate.field).bytes.example = \"\\x01\\x02\",\n * (buf.validate.field).bytes.example = \"\\x02\\x03\"\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bytes example = 14;\n */\n example: Uint8Array[];\n};\n\n/**\n * Describes the message buf.validate.BytesRules.\n * Use `create(BytesRulesSchema)` to create a new message.\n */\nexport const BytesRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 20);\n\n/**\n * EnumRules describe the rules applied to `enum` values.\n *\n * @generated from message buf.validate.EnumRules\n */\nexport type EnumRules = Message<\"buf.validate.EnumRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified enum value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be exactly MY_ENUM_VALUE1.\n * MyEnum value = 1 [(buf.validate.field).enum.const = 1];\n * }\n * ```\n *\n * @generated from field: optional int32 const = 1;\n */\n const: number;\n\n /**\n * `defined_only` requires the field value to be one of the defined values for\n * this enum, failing on any undefined value.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be a defined value of MyEnum.\n * MyEnum value = 1 [(buf.validate.field).enum.defined_only = true];\n * }\n * ```\n *\n * @generated from field: optional bool defined_only = 2;\n */\n definedOnly: boolean;\n\n /**\n * `in` requires the field value to be equal to one of the\n * specified enum values. If the field value doesn't match any of the\n * specified values, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be equal to one of the specified values.\n * MyEnum value = 1 [(buf.validate.field).enum = { in: [1, 2]}];\n * }\n * ```\n *\n * @generated from field: repeated int32 in = 3;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to be not equal to any of the\n * specified enum values. If the field value matches one of the specified\n * values, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must not be equal to any of the specified values.\n * MyEnum value = 1 [(buf.validate.field).enum = { not_in: [1, 2]}];\n * }\n * ```\n *\n * @generated from field: repeated int32 not_in = 4;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * MyEnum value = 1 [\n * (buf.validate.field).enum.example = 1,\n * (buf.validate.field).enum.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 5;\n */\n example: number[];\n};\n\n/**\n * Describes the message buf.validate.EnumRules.\n * Use `create(EnumRulesSchema)` to create a new message.\n */\nexport const EnumRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 21);\n\n/**\n * RepeatedRules describe the rules applied to `repeated` values.\n *\n * @generated from message buf.validate.RepeatedRules\n */\nexport type RepeatedRules = Message<\"buf.validate.RepeatedRules\"> & {\n /**\n * `min_items` requires that this field must contain at least the specified\n * minimum number of items.\n *\n * Note that `min_items = 1` is equivalent to setting a field as `required`.\n *\n * ```proto\n * message MyRepeated {\n * // value must contain at least 2 items\n * repeated string value = 1 [(buf.validate.field).repeated.min_items = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_items = 1;\n */\n minItems: bigint;\n\n /**\n * `max_items` denotes that this field must not exceed a\n * certain number of items as the upper limit. If the field contains more\n * items than specified, an error message will be generated, requiring the\n * field to maintain no more than the specified number of items.\n *\n * ```proto\n * message MyRepeated {\n * // value must contain no more than 3 item(s)\n * repeated string value = 1 [(buf.validate.field).repeated.max_items = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_items = 2;\n */\n maxItems: bigint;\n\n /**\n * `unique` indicates that all elements in this field must\n * be unique. This rule is strictly applicable to scalar and enum\n * types, with message types not being supported.\n *\n * ```proto\n * message MyRepeated {\n * // repeated value must contain unique items\n * repeated string value = 1 [(buf.validate.field).repeated.unique = true];\n * }\n * ```\n *\n * @generated from field: optional bool unique = 3;\n */\n unique: boolean;\n\n /**\n * `items` details the rules to be applied to each item\n * in the field. Even for repeated message fields, validation is executed\n * against each item unless `ignore` is specified.\n *\n * ```proto\n * message MyRepeated {\n * // The items in the field `value` must follow the specified rules.\n * repeated string value = 1 [(buf.validate.field).repeated.items = {\n * string: {\n * min_len: 3\n * max_len: 10\n * }\n * }];\n * }\n * ```\n *\n * Note that the `required` rule does not apply. Repeated items\n * cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules items = 4;\n */\n items?: FieldRules | undefined;\n};\n\n/**\n * Describes the message buf.validate.RepeatedRules.\n * Use `create(RepeatedRulesSchema)` to create a new message.\n */\nexport const RepeatedRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 22);\n\n/**\n * MapRules describe the rules applied to `map` values.\n *\n * @generated from message buf.validate.MapRules\n */\nexport type MapRules = Message<\"buf.validate.MapRules\"> & {\n /**\n * Specifies the minimum number of key-value pairs allowed. If the field has\n * fewer key-value pairs than specified, an error message is generated.\n *\n * ```proto\n * message MyMap {\n * // The field `value` must have at least 2 key-value pairs.\n * map value = 1 [(buf.validate.field).map.min_pairs = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_pairs = 1;\n */\n minPairs: bigint;\n\n /**\n * Specifies the maximum number of key-value pairs allowed. If the field has\n * more key-value pairs than specified, an error message is generated.\n *\n * ```proto\n * message MyMap {\n * // The field `value` must have at most 3 key-value pairs.\n * map value = 1 [(buf.validate.field).map.max_pairs = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_pairs = 2;\n */\n maxPairs: bigint;\n\n /**\n * Specifies the rules to be applied to each key in the field.\n *\n * ```proto\n * message MyMap {\n * // The keys in the field `value` must follow the specified rules.\n * map value = 1 [(buf.validate.field).map.keys = {\n * string: {\n * min_len: 3\n * max_len: 10\n * }\n * }];\n * }\n * ```\n *\n * Note that the `required` rule does not apply. Map keys cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules keys = 4;\n */\n keys?: FieldRules | undefined;\n\n /**\n * Specifies the rules to be applied to the value of each key in the\n * field. Message values will still have their validations evaluated unless\n * `ignore` is specified.\n *\n * ```proto\n * message MyMap {\n * // The values in the field `value` must follow the specified rules.\n * map value = 1 [(buf.validate.field).map.values = {\n * string: {\n * min_len: 5\n * max_len: 20\n * }\n * }];\n * }\n * ```\n * Note that the `required` rule does not apply. Map values cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules values = 5;\n */\n values?: FieldRules | undefined;\n};\n\n/**\n * Describes the message buf.validate.MapRules.\n * Use `create(MapRulesSchema)` to create a new message.\n */\nexport const MapRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 23);\n\n/**\n * AnyRules describe rules applied exclusively to the `google.protobuf.Any` well-known type.\n *\n * @generated from message buf.validate.AnyRules\n */\nexport type AnyRules = Message<\"buf.validate.AnyRules\"> & {\n /**\n * `in` requires the field's `type_url` to be equal to one of the\n * specified values. If it doesn't match any of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyAny {\n * // The `value` field must have a `type_url` equal to one of the specified values.\n * google.protobuf.Any value = 1 [(buf.validate.field).any = {\n * in: [\"type.googleapis.com/MyType1\", \"type.googleapis.com/MyType2\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string in = 2;\n */\n in: string[];\n\n /**\n * `not_in` requires the field's type_url to be not equal to any of the specified values. If it matches any of the specified values, an error message is generated.\n *\n * ```proto\n * message MyAny {\n * // The `value` field must not have a `type_url` equal to any of the specified values.\n * google.protobuf.Any value = 1 [(buf.validate.field).any = {\n * not_in: [\"type.googleapis.com/ForbiddenType1\", \"type.googleapis.com/ForbiddenType2\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 3;\n */\n notIn: string[];\n};\n\n/**\n * Describes the message buf.validate.AnyRules.\n * Use `create(AnyRulesSchema)` to create a new message.\n */\nexport const AnyRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 24);\n\n/**\n * DurationRules describe the rules applied exclusively to the `google.protobuf.Duration` well-known type.\n *\n * @generated from message buf.validate.DurationRules\n */\nexport type DurationRules = Message<\"buf.validate.DurationRules\"> & {\n /**\n * `const` dictates that the field must match the specified value of the `google.protobuf.Duration` type exactly.\n * If the field's value deviates from the specified value, an error message\n * will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must equal 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = { seconds: 5 }];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Duration const = 2;\n */\n const?: Duration | undefined;\n\n /**\n * @generated from oneof buf.validate.DurationRules.less_than\n */\n lessThan: {\n /**\n * `lt` stipulates that the field must be less than the specified value of the `google.protobuf.Duration` type,\n * exclusive. If the field's value is greater than or equal to the specified\n * value, an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // must be less than 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = { seconds: 5 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration lt = 3;\n */\n value: Duration;\n case: \"lt\";\n } | {\n /**\n * `lte` indicates that the field must be less than or equal to the specified\n * value of the `google.protobuf.Duration` type, inclusive. If the field's value is greater than the specified value,\n * an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // must be less than or equal to 10s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = { seconds: 10 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration lte = 4;\n */\n value: Duration;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.DurationRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the duration field value to be greater than the specified\n * value (exclusive). If the value of `gt` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be greater than 5s [duration.gt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gt = { seconds: 5 }];\n *\n * // duration must be greater than 5s and less than 10s [duration.gt_lt]\n * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gt: { seconds: 5 }, lt: { seconds: 10 } }];\n *\n * // duration must be greater than 10s or less than 5s [duration.gt_lt_exclusive]\n * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gt: { seconds: 10 }, lt: { seconds: 5 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration gt = 5;\n */\n value: Duration;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the duration field value to be greater than or equal to the\n * specified value (exclusive). If the value of `gte` is larger than a\n * specified `lt` or `lte`, the range is reversed, and the field value must\n * be outside the specified range. If the field value doesn't meet the\n * required conditions, an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be greater than or equal to 5s [duration.gte]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gte = { seconds: 5 }];\n *\n * // duration must be greater than or equal to 5s and less than 10s [duration.gte_lt]\n * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gte: { seconds: 5 }, lt: { seconds: 10 } }];\n *\n * // duration must be greater than or equal to 10s or less than 5s [duration.gte_lt_exclusive]\n * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gte: { seconds: 10 }, lt: { seconds: 5 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration gte = 6;\n */\n value: Duration;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` asserts that the field must be equal to one of the specified values of the `google.protobuf.Duration` type.\n * If the field's value doesn't correspond to any of the specified values,\n * an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // must be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration = {\n * in: [{ seconds: 1 }, { seconds: 2 }, { seconds: 3 }]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration in = 7;\n */\n in: Duration[];\n\n /**\n * `not_in` denotes that the field must not be equal to\n * any of the specified values of the `google.protobuf.Duration` type.\n * If the field's value matches any of these values, an error message will be\n * generated.\n *\n * ```proto\n * message MyDuration {\n * // value must not be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration = {\n * not_in: [{ seconds: 1 }, { seconds: 2 }, { seconds: 3 }]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration not_in = 8;\n */\n notIn: Duration[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyDuration {\n * google.protobuf.Duration value = 1 [\n * (buf.validate.field).duration.example = { seconds: 1 },\n * (buf.validate.field).duration.example = { seconds: 2 }\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration example = 9;\n */\n example: Duration[];\n};\n\n/**\n * Describes the message buf.validate.DurationRules.\n * Use `create(DurationRulesSchema)` to create a new message.\n */\nexport const DurationRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 25);\n\n/**\n * FieldMaskRules describe rules applied exclusively to the `google.protobuf.FieldMask` well-known type.\n *\n * @generated from message buf.validate.FieldMaskRules\n */\nexport type FieldMaskRules = Message<\"buf.validate.FieldMaskRules\"> & {\n /**\n * `const` dictates that the field must match the specified value of the `google.protobuf.FieldMask` type exactly.\n * If the field's value deviates from the specified value, an error message\n * will be generated.\n *\n * ```proto\n * message MyFieldMask {\n * // value must equal [\"a\"]\n * google.protobuf.FieldMask value = 1 [(buf.validate.field).field_mask.const = {\n * paths: [\"a\"]\n * }];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.FieldMask const = 1;\n */\n const?: FieldMask | undefined;\n\n /**\n * `in` requires the field value to only contain paths matching specified\n * values or their subpaths.\n * If any of the field value's paths doesn't match the rule,\n * an error message is generated.\n * See: https://protobuf.dev/reference/protobuf/google.protobuf/#field-mask\n *\n * ```proto\n * message MyFieldMask {\n * // The `value` FieldMask must only contain paths listed in `in`.\n * google.protobuf.FieldMask value = 1 [(buf.validate.field).field_mask = {\n * in: [\"a\", \"b\", \"c.a\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string in = 2;\n */\n in: string[];\n\n /**\n * `not_in` requires the field value to not contain paths matching specified\n * values or their subpaths.\n * If any of the field value's paths matches the rule,\n * an error message is generated.\n * See: https://protobuf.dev/reference/protobuf/google.protobuf/#field-mask\n *\n * ```proto\n * message MyFieldMask {\n * // The `value` FieldMask shall not contain paths listed in `not_in`.\n * google.protobuf.FieldMask value = 1 [(buf.validate.field).field_mask = {\n * not_in: [\"forbidden\", \"immutable\", \"c.a\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 3;\n */\n notIn: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFieldMask {\n * google.protobuf.FieldMask value = 1 [\n * (buf.validate.field).field_mask.example = { paths: [\"a\", \"b\"] },\n * (buf.validate.field).field_mask.example = { paths: [\"c.a\", \"d\"] }\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.FieldMask example = 4;\n */\n example: FieldMask[];\n};\n\n/**\n * Describes the message buf.validate.FieldMaskRules.\n * Use `create(FieldMaskRulesSchema)` to create a new message.\n */\nexport const FieldMaskRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 26);\n\n/**\n * TimestampRules describe the rules applied exclusively to the `google.protobuf.Timestamp` well-known type.\n *\n * @generated from message buf.validate.TimestampRules\n */\nexport type TimestampRules = Message<\"buf.validate.TimestampRules\"> & {\n /**\n * `const` dictates that this field, of the `google.protobuf.Timestamp` type, must exactly match the specified value. If the field value doesn't correspond to the specified timestamp, an error message will be generated.\n *\n * ```proto\n * message MyTimestamp {\n * // value must equal 2023-05-03T10:00:00Z\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.const = {seconds: 1727998800}];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Timestamp const = 2;\n */\n const?: Timestamp | undefined;\n\n /**\n * @generated from oneof buf.validate.TimestampRules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the timestamp field value to be less than the specified value (field < value). If the field value doesn't meet the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be less than '2023-01-01T00:00:00Z' [timestamp.lt]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.lt = { seconds: 1672444800 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lt = 3;\n */\n value: Timestamp;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the timestamp field value to be less than or equal to the specified value (field <= value). If the field value doesn't meet the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be less than or equal to '2023-05-14T00:00:00Z' [timestamp.lte]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.lte = { seconds: 1678867200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lte = 4;\n */\n value: Timestamp;\n case: \"lte\";\n } | {\n /**\n * `lt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be less than the current time. `lt_now` can only be used with the `within` rule.\n *\n * ```proto\n * message MyTimestamp {\n * // must be less than now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.lt_now = true];\n * }\n * ```\n *\n * @generated from field: bool lt_now = 7;\n */\n value: boolean;\n case: \"ltNow\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.TimestampRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the timestamp field value to be greater than the specified\n * value (exclusive). If the value of `gt` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be greater than '2023-01-01T00:00:00Z' [timestamp.gt]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gt = { seconds: 1672444800 }];\n *\n * // timestamp must be greater than '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gt_lt]\n * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gt: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];\n *\n * // timestamp must be greater than '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gt_lt_exclusive]\n * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gt: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp gt = 5;\n */\n value: Timestamp;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the timestamp field value to be greater than or equal to the\n * specified value (exclusive). If the value of `gte` is larger than a\n * specified `lt` or `lte`, the range is reversed, and the field value\n * must be outside the specified range. If the field value doesn't meet\n * the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' [timestamp.gte]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gte = { seconds: 1672444800 }];\n *\n * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gte_lt]\n * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gte: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];\n *\n * // timestamp must be greater than or equal to '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gte_lt_exclusive]\n * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gte: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp gte = 6;\n */\n value: Timestamp;\n case: \"gte\";\n } | {\n /**\n * `gt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be greater than the current time. `gt_now` can only be used with the `within` rule.\n *\n * ```proto\n * message MyTimestamp {\n * // must be greater than now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.gt_now = true];\n * }\n * ```\n *\n * @generated from field: bool gt_now = 8;\n */\n value: boolean;\n case: \"gtNow\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `within` specifies that this field, of the `google.protobuf.Timestamp` type, must be within the specified duration of the current time. If the field value isn't within the duration, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // must be within 1 hour of now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.within = {seconds: 3600}];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Duration within = 9;\n */\n within?: Duration | undefined;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyTimestamp {\n * google.protobuf.Timestamp value = 1 [\n * (buf.validate.field).timestamp.example = { seconds: 1672444800 },\n * (buf.validate.field).timestamp.example = { seconds: 1672531200 }\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Timestamp example = 10;\n */\n example: Timestamp[];\n};\n\n/**\n * Describes the message buf.validate.TimestampRules.\n * Use `create(TimestampRulesSchema)` to create a new message.\n */\nexport const TimestampRulesSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 27);\n\n/**\n * `Violations` is a collection of `Violation` messages. This message type is returned by\n * Protovalidate when a proto message fails to meet the requirements set by the `Rule` validation rules.\n * Each individual violation is represented by a `Violation` message.\n *\n * @generated from message buf.validate.Violations\n */\nexport type Violations = Message<\"buf.validate.Violations\"> & {\n /**\n * `violations` is a repeated field that contains all the `Violation` messages corresponding to the violations detected.\n *\n * @generated from field: repeated buf.validate.Violation violations = 1;\n */\n violations: Violation[];\n};\n\n/**\n * Describes the message buf.validate.Violations.\n * Use `create(ViolationsSchema)` to create a new message.\n */\nexport const ViolationsSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 28);\n\n/**\n * `Violation` represents a single instance where a validation rule, expressed\n * as a `Rule`, was not met. It provides information about the field that\n * caused the violation, the specific rule that wasn't fulfilled, and a\n * human-readable error message.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message User {\n * int32 age = 1 [(buf.validate.field).cel = {\n * id: \"user.age\",\n * expression: \"this < 18 ? 'User must be at least 18 years old' : ''\",\n * }];\n * }\n * ```\n *\n * It could produce the following violation:\n *\n * ```json\n * {\n * \"ruleId\": \"user.age\",\n * \"message\": \"User must be at least 18 years old\",\n * \"field\": {\n * \"elements\": [\n * {\n * \"fieldNumber\": 1,\n * \"fieldName\": \"age\",\n * \"fieldType\": \"TYPE_INT32\"\n * }\n * ]\n * },\n * \"rule\": {\n * \"elements\": [\n * {\n * \"fieldNumber\": 23,\n * \"fieldName\": \"cel\",\n * \"fieldType\": \"TYPE_MESSAGE\",\n * \"index\": \"0\"\n * }\n * ]\n * }\n * }\n * ```\n *\n * @generated from message buf.validate.Violation\n */\nexport type Violation = Message<\"buf.validate.Violation\"> & {\n /**\n * `field` is a machine-readable path to the field that failed validation.\n * This could be a nested field, in which case the path will include all the parent fields leading to the actual field that caused the violation.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message Message {\n * bool a = 1 [(buf.validate.field).required = true];\n * }\n * ```\n *\n * It could produce the following violation:\n *\n * ```textproto\n * violation {\n * field { element { field_number: 1, field_name: \"a\", field_type: 8 } }\n * ...\n * }\n * ```\n *\n * @generated from field: optional buf.validate.FieldPath field = 5;\n */\n field?: FieldPath | undefined;\n\n /**\n * `rule` is a machine-readable path that points to the specific rule that failed validation.\n * This will be a nested field starting from the FieldRules of the field that failed validation.\n * For custom rules, this will provide the path of the rule, e.g. `cel[0]`.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message Message {\n * bool a = 1 [(buf.validate.field).required = true];\n * bool b = 2 [(buf.validate.field).cel = {\n * id: \"custom_rule\",\n * expression: \"!this ? 'b must be true': ''\"\n * }];\n * }\n * ```\n *\n * It could produce the following violations:\n *\n * ```textproto\n * violation {\n * rule { element { field_number: 25, field_name: \"required\", field_type: 8 } }\n * ...\n * }\n * violation {\n * rule { element { field_number: 23, field_name: \"cel\", field_type: 11, index: 0 } }\n * ...\n * }\n * ```\n *\n * @generated from field: optional buf.validate.FieldPath rule = 6;\n */\n rule?: FieldPath | undefined;\n\n /**\n * `rule_id` is the unique identifier of the `Rule` that was not fulfilled.\n * This is the same `id` that was specified in the `Rule` message, allowing easy tracing of which rule was violated.\n *\n * @generated from field: optional string rule_id = 2;\n */\n ruleId: string;\n\n /**\n * `message` is a human-readable error message that describes the nature of the violation.\n * This can be the default error message from the violated `Rule`, or it can be a custom message that gives more context about the violation.\n *\n * @generated from field: optional string message = 3;\n */\n message: string;\n\n /**\n * `for_key` indicates whether the violation was caused by a map key, rather than a value.\n *\n * @generated from field: optional bool for_key = 4;\n */\n forKey: boolean;\n};\n\n/**\n * Describes the message buf.validate.Violation.\n * Use `create(ViolationSchema)` to create a new message.\n */\nexport const ViolationSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 29);\n\n/**\n * `FieldPath` provides a path to a nested protobuf field.\n *\n * This message provides enough information to render a dotted field path even without protobuf descriptors.\n * It also provides enough information to resolve a nested field through unknown wire data.\n *\n * @generated from message buf.validate.FieldPath\n */\nexport type FieldPath = Message<\"buf.validate.FieldPath\"> & {\n /**\n * `elements` contains each element of the path, starting from the root and recursing downward.\n *\n * @generated from field: repeated buf.validate.FieldPathElement elements = 1;\n */\n elements: FieldPathElement[];\n};\n\n/**\n * Describes the message buf.validate.FieldPath.\n * Use `create(FieldPathSchema)` to create a new message.\n */\nexport const FieldPathSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 30);\n\n/**\n * `FieldPathElement` provides enough information to nest through a single protobuf field.\n *\n * If the selected field is a map or repeated field, the `subscript` value selects a specific element from it.\n * A path that refers to a value nested under a map key or repeated field index will have a `subscript` value.\n * The `field_type` field allows unambiguous resolution of a field even if descriptors are not available.\n *\n * @generated from message buf.validate.FieldPathElement\n */\nexport type FieldPathElement = Message<\"buf.validate.FieldPathElement\"> & {\n /**\n * `field_number` is the field number this path element refers to.\n *\n * @generated from field: optional int32 field_number = 1;\n */\n fieldNumber: number;\n\n /**\n * `field_name` contains the field name this path element refers to.\n * This can be used to display a human-readable path even if the field number is unknown.\n *\n * @generated from field: optional string field_name = 2;\n */\n fieldName: string;\n\n /**\n * `field_type` specifies the type of this field. When using reflection, this value is not needed.\n *\n * This value is provided to make it possible to traverse unknown fields through wire data.\n * When traversing wire data, be mindful of both packed[1] and delimited[2] encoding schemes.\n *\n * [1]: https://protobuf.dev/programming-guides/encoding/#packed\n * [2]: https://protobuf.dev/programming-guides/encoding/#groups\n *\n * N.B.: Although groups are deprecated, the corresponding delimited encoding scheme is not, and\n * can be explicitly used in Protocol Buffers 2023 Edition.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type field_type = 3;\n */\n fieldType: FieldDescriptorProto_Type;\n\n /**\n * `key_type` specifies the map key type of this field. This value is useful when traversing\n * unknown fields through wire data: specifically, it allows handling the differences between\n * different integer encodings.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type key_type = 4;\n */\n keyType: FieldDescriptorProto_Type;\n\n /**\n * `value_type` specifies map value type of this field. This is useful if you want to display a\n * value inside unknown fields through wire data.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type value_type = 5;\n */\n valueType: FieldDescriptorProto_Type;\n\n /**\n * `subscript` contains a repeated index or map key, if this path element nests into a repeated or map field.\n *\n * @generated from oneof buf.validate.FieldPathElement.subscript\n */\n subscript: {\n /**\n * `index` specifies a 0-based index into a repeated field.\n *\n * @generated from field: uint64 index = 6;\n */\n value: bigint;\n case: \"index\";\n } | {\n /**\n * `bool_key` specifies a map key of type bool.\n *\n * @generated from field: bool bool_key = 7;\n */\n value: boolean;\n case: \"boolKey\";\n } | {\n /**\n * `int_key` specifies a map key of type int32, int64, sint32, sint64, sfixed32 or sfixed64.\n *\n * @generated from field: int64 int_key = 8;\n */\n value: bigint;\n case: \"intKey\";\n } | {\n /**\n * `uint_key` specifies a map key of type uint32, uint64, fixed32 or fixed64.\n *\n * @generated from field: uint64 uint_key = 9;\n */\n value: bigint;\n case: \"uintKey\";\n } | {\n /**\n * `string_key` specifies a map key of type string.\n *\n * @generated from field: string string_key = 10;\n */\n value: string;\n case: \"stringKey\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * Describes the message buf.validate.FieldPathElement.\n * Use `create(FieldPathElementSchema)` to create a new message.\n */\nexport const FieldPathElementSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 31);\n\n/**\n * Specifies how `FieldRules.ignore` behaves, depending on the field's value, and\n * whether the field tracks presence.\n *\n * @generated from enum buf.validate.Ignore\n */\nexport enum Ignore {\n /**\n * Ignore rules if the field tracks presence and is unset. This is the default\n * behavior.\n *\n * In proto3, only message fields, members of a Protobuf `oneof`, and fields\n * with the `optional` label track presence. Consequently, the following fields\n * are always validated, whether a value is set or not:\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message RulesApply {\n * string email = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * int32 age = 2 [\n * (buf.validate.field).int32.gt = 0\n * ];\n * repeated string labels = 3 [\n * (buf.validate.field).repeated.min_items = 1\n * ];\n * }\n * ```\n *\n * In contrast, the following fields track presence, and are only validated if\n * a value is set:\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message RulesApplyIfSet {\n * optional string email = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * oneof ref {\n * string reference = 2 [\n * (buf.validate.field).string.uuid = true\n * ];\n * string name = 3 [\n * (buf.validate.field).string.min_len = 4\n * ];\n * }\n * SomeMessage msg = 4 [\n * (buf.validate.field).cel = {/* ... *\\/}\n * ];\n * }\n * ```\n *\n * To ensure that such a field is set, add the `required` rule.\n *\n * To learn which fields track presence, see the\n * [Field Presence cheat sheet](https://protobuf.dev/programming-guides/field_presence/#cheat).\n *\n * @generated from enum value: IGNORE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Ignore rules if the field is unset, or set to the zero value.\n *\n * The zero value depends on the field type:\n * - For strings, the zero value is the empty string.\n * - For bytes, the zero value is empty bytes.\n * - For bool, the zero value is false.\n * - For numeric types, the zero value is zero.\n * - For enums, the zero value is the first defined enum value.\n * - For repeated fields, the zero is an empty list.\n * - For map fields, the zero is an empty map.\n * - For message fields, absence of the message (typically a null-value) is considered zero value.\n *\n * For fields that track presence (e.g. adding the `optional` label in proto3),\n * this a no-op and behavior is the same as the default `IGNORE_UNSPECIFIED`.\n *\n * @generated from enum value: IGNORE_IF_ZERO_VALUE = 1;\n */\n IF_ZERO_VALUE = 1,\n\n /**\n * Always ignore rules, including the `required` rule.\n *\n * This is useful for ignoring the rules of a referenced message, or to\n * temporarily ignore rules during development.\n *\n * ```proto\n * message MyMessage {\n * // The field's rules will always be ignored, including any validations\n * // on value's fields.\n * MyOtherMessage value = 1 [\n * (buf.validate.field).ignore = IGNORE_ALWAYS\n * ];\n * }\n * ```\n *\n * @generated from enum value: IGNORE_ALWAYS = 3;\n */\n ALWAYS = 3,\n}\n\n/**\n * Describes the enum buf.validate.Ignore.\n */\nexport const IgnoreSchema: GenEnum = /*@__PURE__*/\n enumDesc(file_buf_validate_validate, 0);\n\n/**\n * KnownRegex contains some well-known patterns.\n *\n * @generated from enum buf.validate.KnownRegex\n */\nexport enum KnownRegex {\n /**\n * @generated from enum value: KNOWN_REGEX_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * HTTP header name as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2).\n *\n * @generated from enum value: KNOWN_REGEX_HTTP_HEADER_NAME = 1;\n */\n HTTP_HEADER_NAME = 1,\n\n /**\n * HTTP header value as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4).\n *\n * @generated from enum value: KNOWN_REGEX_HTTP_HEADER_VALUE = 2;\n */\n HTTP_HEADER_VALUE = 2,\n}\n\n/**\n * Describes the enum buf.validate.KnownRegex.\n */\nexport const KnownRegexSchema: GenEnum = /*@__PURE__*/\n enumDesc(file_buf_validate_validate, 1);\n\n/**\n * Rules specify the validations to be performed on this message. By default,\n * no validation is performed against a message.\n *\n * @generated from extension: optional buf.validate.MessageRules message = 1159;\n */\nexport const message: GenExtension = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 0);\n\n/**\n * Rules specify the validations to be performed on this oneof. By default,\n * no validation is performed against a oneof.\n *\n * @generated from extension: optional buf.validate.OneofRules oneof = 1159;\n */\nexport const oneof: GenExtension = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 1);\n\n/**\n * Rules specify the validations to be performed on this field. By default,\n * no validation is performed against a field.\n *\n * @generated from extension: optional buf.validate.FieldRules field = 1159;\n */\nexport const field: GenExtension = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 2);\n\n/**\n * Specifies predefined rules. When extending a standard rule message,\n * this adds additional CEL expressions that apply when the extension is used.\n *\n * ```proto\n * extend buf.validate.Int32Rules {\n * bool is_zero = 1001 [(buf.validate.predefined).cel = {\n * id: \"int32.is_zero\",\n * message: \"must be zero\",\n * expression: \"!rule || this == 0\",\n * }];\n * }\n *\n * message Foo {\n * int32 reserved = 1 [(buf.validate.field).int32.(is_zero) = true];\n * }\n * ```\n *\n * @generated from extension: optional buf.validate.PredefinedRules predefined = 1160;\n */\nexport const predefined: GenExtension = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 3);\n\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/gen/protoform/v1/auto_form_ui_form.ts", "content": "// Auto-form UI extensions for protobuf field, message, and oneof options.\n\n// @generated by protoc-gen-protoform v1.0.0 with parameter \"target=ts,import_extension=js\"\n// @generated from file protoform/v1/auto_form_ui.proto (package protoform.v1, syntax proto2)\n/* eslint-disable */\n\nimport { createProtoFormSchema, parseProtoSchema, protoToFormValues, registerProtoAnnotations } from \"@/lib/protobuf-provider\";\nimport { FieldUiOptionsSchema, MessageUiOptionsSchema, OneofUiOptionsSchema, UiRuleSchema } from \"./auto_form_ui_pb.js\";\n\n/**\n * Source documentation for protoform.v1.UiRule.\n */\nexport const UiRuleFormAnnotations = {\n} as const;\nregisterProtoAnnotations(UiRuleSchema, UiRuleFormAnnotations);\n\n/**\n * Form binding for message protoform.v1.UiRule.\n */\nexport const UiRuleFormBinding = {\n annotations: UiRuleFormAnnotations,\n createFormSchema: (options?: Parameters[1]) => createProtoFormSchema(UiRuleSchema, options),\n defaultValues: () => protoToFormValues(UiRuleSchema),\n descriptor: UiRuleSchema,\n parseSchema: () => parseProtoSchema(UiRuleSchema),\n} as const;\n\n/**\n * Source documentation for protoform.v1.MessageUiOptions.\n */\nexport const MessageUiOptionsFormAnnotations = {\n fields: {\n \"protoform.v1.MessageUiOptions.title\": \"Root-level title shown above the AutoForm body.\",\n \"protoform.v1.MessageUiOptions.description\": \"One-line subtitle shown under `title`.\",\n },\n} as const;\nregisterProtoAnnotations(MessageUiOptionsSchema, MessageUiOptionsFormAnnotations);\n\n/**\n * Form binding for message protoform.v1.MessageUiOptions.\n */\nexport const MessageUiOptionsFormBinding = {\n annotations: MessageUiOptionsFormAnnotations,\n createFormSchema: (options?: Parameters[1]) => createProtoFormSchema(MessageUiOptionsSchema, options),\n defaultValues: () => protoToFormValues(MessageUiOptionsSchema),\n descriptor: MessageUiOptionsSchema,\n parseSchema: () => parseProtoSchema(MessageUiOptionsSchema),\n} as const;\n\n/**\n * Source documentation for protoform.v1.FieldUiOptions.\n */\nexport const FieldUiOptionsFormAnnotations = {\n fields: {\n \"protoform.v1.FieldUiOptions.help\": \"Detailed help text shown in the tooltip (hover the info icon).\\n Use for examples, edge cases, and extended explanations.\",\n \"protoform.v1.FieldUiOptions.description\": \"Concise one-liner shown directly below the input field.\\n Keep it short — most users will read this first.\\n When omitted, the UI falls back to `help`.\",\n \"protoform.v1.FieldUiOptions.dataProvider\": \"Named data source for dropdown-style controls.\",\n \"protoform.v1.FieldUiOptions.dropzone\": \"When CONTROL_TYPE_JSON: enables a drag-and-drop zone that reads\\n a .json file into the field value alongside the editor.\",\n \"protoform.v1.FieldUiOptions.docsUrl\": \"Link to the upstream source of truth for the values this field\\n accepts. Rendered as a \\\"Learn more\\\" anchor next to the help text.\",\n },\n} as const;\nregisterProtoAnnotations(FieldUiOptionsSchema, FieldUiOptionsFormAnnotations);\n\n/**\n * Form binding for message protoform.v1.FieldUiOptions.\n */\nexport const FieldUiOptionsFormBinding = {\n annotations: FieldUiOptionsFormAnnotations,\n createFormSchema: (options?: Parameters[1]) => createProtoFormSchema(FieldUiOptionsSchema, options),\n defaultValues: () => protoToFormValues(FieldUiOptionsSchema),\n descriptor: FieldUiOptionsSchema,\n parseSchema: () => parseProtoSchema(FieldUiOptionsSchema),\n} as const;\n\n/**\n * Source documentation for protoform.v1.OneofUiOptions.\n */\nexport const OneofUiOptionsFormAnnotations = {\n fields: {\n \"protoform.v1.OneofUiOptions.help\": \"Detailed help text shown in the tooltip.\",\n \"protoform.v1.OneofUiOptions.description\": \"Concise one-liner shown below the selector.\",\n },\n} as const;\nregisterProtoAnnotations(OneofUiOptionsSchema, OneofUiOptionsFormAnnotations);\n\n/**\n * Form binding for message protoform.v1.OneofUiOptions.\n */\nexport const OneofUiOptionsFormBinding = {\n annotations: OneofUiOptionsFormAnnotations,\n createFormSchema: (options?: Parameters[1]) => createProtoFormSchema(OneofUiOptionsSchema, options),\n defaultValues: () => protoToFormValues(OneofUiOptionsSchema),\n descriptor: OneofUiOptionsSchema,\n parseSchema: () => parseProtoSchema(OneofUiOptionsSchema),\n} as const;\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/gen/protoform/v1/auto_form_ui_pb.ts", "content": "// Auto-form UI extensions for protobuf field, message, and oneof options.\n\n// @generated by protoc-gen-es v2.13.0 with parameter \"target=ts,import_extension=js\"\n// @generated from file protoform/v1/auto_form_ui.proto (package protoform.v1, syntax proto2)\n/* eslint-disable */\n\nimport type { GenEnum, GenExtension, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, extDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { FieldOptions, MessageOptions, OneofOptions } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_descriptor } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file protoform/v1/auto_form_ui.proto.\n */\nexport const file_protoform_v1_auto_form_ui: GenFile = /*@__PURE__*/\n fileDesc(\"Ch9wcm90b2Zvcm0vdjEvYXV0b19mb3JtX3VpLnByb3RvEgxwcm90b2Zvcm0udjEiOQoGVWlSdWxlEgoKAmlkGAEgASgJEhIKCmV4cHJlc3Npb24YAiABKAkSDwoHbWVzc2FnZRgDIAEoCSJMChBNZXNzYWdlVWlPcHRpb25zEhQKDHNlY3JldF9zY29wZRgCIAEoCRINCgV0aXRsZRgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCSKnAwoORmllbGRVaU9wdGlvbnMSRAoHY29udHJvbBgBIAEoDjIZLnByb3RvZm9ybS52MS5Db250cm9sVHlwZToYQ09OVFJPTF9UWVBFX1VOU1BFQ0lGSUVEEhMKC3BsYWNlaG9sZGVyGAIgASgJEg8KB2V4YW1wbGUYAyABKAkSDAoEaGVscBgEIAEoCRIqCgx2aXNpYmxlX3doZW4YBSADKAsyFC5wcm90b2Zvcm0udjEuVWlSdWxlEisKDWRpc2FibGVkX3doZW4YBiADKAsyFC5wcm90b2Zvcm0udjEuVWlSdWxlEgwKBHN0ZXAYByABKAkSFQoNc3VtbWFyeV9sYWJlbBgIIAEoCRIRCglzZW5zaXRpdmUYCSABKAgSEwoLZGVzY3JpcHRpb24YCiABKAkSUQoNZGF0YV9wcm92aWRlchgLIAEoDjIcLnByb3RvZm9ybS52MS5EYXRhUHJvdmlkZXJJZDocREFUQV9QUk9WSURFUl9JRF9VTlNQRUNJRklFRBIQCghkcm9wem9uZRgMIAEoCBIQCghkb2NzX3VybBgNIAEoCSKxAQoOT25lb2ZVaU9wdGlvbnMSDAoEaGVscBgBIAEoCRIqCgx2aXNpYmxlX3doZW4YAiADKAsyFC5wcm90b2Zvcm0udjEuVWlSdWxlEisKDWRpc2FibGVkX3doZW4YAyADKAsyFC5wcm90b2Zvcm0udjEuVWlSdWxlEgwKBHN0ZXAYBCABKAkSFQoNc3VtbWFyeV9sYWJlbBgFIAEoCRITCgtkZXNjcmlwdGlvbhgGIAEoCSr+AwoLQ29udHJvbFR5cGUSHAoYQ09OVFJPTF9UWVBFX1VOU1BFQ0lGSUVEEAASFQoRQ09OVFJPTF9UWVBFX1RFWFQQARIZChVDT05UUk9MX1RZUEVfVEVYVEFSRUEQAhIZChVDT05UUk9MX1RZUEVfUEFTU1dPUkQQAxIWChJDT05UUk9MX1RZUEVfRU1BSUwQBBIUChBDT05UUk9MX1RZUEVfVVJMEAUSGQoVQ09OVFJPTF9UWVBFX0NVUlJFTkNZEAYSGQoVQ09OVFJPTF9UWVBFX0NIRUNLQk9YEAcSFwoTQ09OVFJPTF9UWVBFX1NXSVRDSBAIEhcKE0NPTlRST0xfVFlQRV9UT0dHTEUQCRIcChhDT05UUk9MX1RZUEVfUkFESU9fR1JPVVAQChIXChNDT05UUk9MX1RZUEVfU0VMRUNUEAsSGQoVQ09OVFJPTF9UWVBFX0NPTUJPQk9YEAwSHQoZQ09OVFJPTF9UWVBFX01VTFRJX1NFTEVDVBANEhoKFkNPTlRST0xfVFlQRV9LRVlfVkFMVUUQDhIVChFDT05UUk9MX1RZUEVfSlNPThAPEhUKEUNPTlRST0xfVFlQRV9EQVRFEBASGgoWQ09OVFJPTF9UWVBFX1RJTUVTVEFNUBAREhcKE0NPTlRST0xfVFlQRV9TTElERVIQEyqoBQoORGF0YVByb3ZpZGVySWQSIAocREFUQV9QUk9WSURFUl9JRF9VTlNQRUNJRklFRBAAEiAKHERBVEFfUFJPVklERVJfSURfQVdTX1JFR0lPTlMQARIgChxEQVRBX1BST1ZJREVSX0lEX0dDUF9SRUdJT05TEAISIgoeREFUQV9QUk9WSURFUl9JRF9BWlVSRV9SRUdJT05TEAMSLAooREFUQV9QUk9WSURFUl9JRF9DT0hFUkVfRU1CRURESU5HX01PREVMUxAEEiwKKERBVEFfUFJPVklERVJfSURfT1BFTkFJX0VNQkVERElOR19NT0RFTFMQBRImCiJEQVRBX1BST1ZJREVSX0lEX09QRU5BSV9UVFNfTU9ERUxTEAYSIQodREFUQV9QUk9WSURFUl9JRF9IVFRQX01FVEhPRFMQBxIkCiBEQVRBX1BST1ZJREVSX0lEX1NBU0xfTUVDSEFOSVNNUxAIEikKJURBVEFfUFJPVklERVJfSURfQ09IRVJFX1JFUkFOS19NT0RFTFMQCRIoCiREQVRBX1BST1ZJREVSX0lEX09QRU5BSV9JTUFHRV9NT0RFTFMQChIpCiVEQVRBX1BST1ZJREVSX0lEX09QRU5BSV9TUEVFQ0hfTU9ERUxTEAsSLQopREFUQV9QUk9WSURFUl9JRF9CRURST0NLX0VNQkVERElOR19NT0RFTFMQDBItCilEQVRBX1BST1ZJREVSX0lEX0tBRktBX0NPTVBSRVNTSU9OX0NPREVDUxANEi0KKURBVEFfUFJPVklERVJfSURfT1BFTkFJX1RUU19BVURJT19GT1JNQVRTEA4SIAocREFUQV9QUk9WSURFUl9JRF9TUUxfRFJJVkVSUxASIgQIDxAPIgQIEBAQIgQIERAROmAKCm1lc3NhZ2VfdWkSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYuI4DIAEoCzIeLnByb3RvZm9ybS52MS5NZXNzYWdlVWlPcHRpb25zUgltZXNzYWdlVWk6WAoIZmllbGRfdWkSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGLmOAyABKAsyHC5wcm90b2Zvcm0udjEuRmllbGRVaU9wdGlvbnNSB2ZpZWxkVWk6WAoIb25lb2ZfdWkSHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zGLqOAyABKAsyHC5wcm90b2Zvcm0udjEuT25lb2ZVaU9wdGlvbnNSB29uZW9mVWlCTVpLZ2l0aHViLmNvbS9tYWxpbnNraWJlbmlhbWluL3Byb3RvZm9ybS9wcm90by9nZW4vZ28vcHJvdG9mb3JtL3YxO3Byb3RvZm9ybXYx\", [file_google_protobuf_descriptor]);\n\n/**\n * @generated from message protoform.v1.UiRule\n */\nexport type UiRule = Message<\"protoform.v1.UiRule\"> & {\n /**\n * @generated from field: optional string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: optional string expression = 2;\n */\n expression: string;\n\n /**\n * @generated from field: optional string message = 3;\n */\n message: string;\n};\n\n/**\n * Describes the message protoform.v1.UiRule.\n * Use `create(UiRuleSchema)` to create a new message.\n */\nexport const UiRuleSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_protoform_v1_auto_form_ui, 0);\n\n/**\n * @generated from message protoform.v1.MessageUiOptions\n */\nexport type MessageUiOptions = Message<\"protoform.v1.MessageUiOptions\"> & {\n /**\n * @generated from field: optional string secret_scope = 2;\n */\n secretScope: string;\n\n /**\n * Root-level title shown above the AutoForm body.\n *\n * @generated from field: optional string title = 3;\n */\n title: string;\n\n /**\n * One-line subtitle shown under `title`.\n *\n * @generated from field: optional string description = 4;\n */\n description: string;\n};\n\n/**\n * Describes the message protoform.v1.MessageUiOptions.\n * Use `create(MessageUiOptionsSchema)` to create a new message.\n */\nexport const MessageUiOptionsSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_protoform_v1_auto_form_ui, 1);\n\n/**\n * @generated from message protoform.v1.FieldUiOptions\n */\nexport type FieldUiOptions = Message<\"protoform.v1.FieldUiOptions\"> & {\n /**\n * @generated from field: optional protoform.v1.ControlType control = 1 [default = CONTROL_TYPE_UNSPECIFIED];\n */\n control: ControlType;\n\n /**\n * @generated from field: optional string placeholder = 2;\n */\n placeholder: string;\n\n /**\n * @generated from field: optional string example = 3;\n */\n example: string;\n\n /**\n * Detailed help text shown in the tooltip (hover the info icon).\n * Use for examples, edge cases, and extended explanations.\n *\n * @generated from field: optional string help = 4;\n */\n help: string;\n\n /**\n * @generated from field: repeated protoform.v1.UiRule visible_when = 5;\n */\n visibleWhen: UiRule[];\n\n /**\n * @generated from field: repeated protoform.v1.UiRule disabled_when = 6;\n */\n disabledWhen: UiRule[];\n\n /**\n * @generated from field: optional string step = 7;\n */\n step: string;\n\n /**\n * @generated from field: optional string summary_label = 8;\n */\n summaryLabel: string;\n\n /**\n * @generated from field: optional bool sensitive = 9;\n */\n sensitive: boolean;\n\n /**\n * Concise one-liner shown directly below the input field.\n * Keep it short — most users will read this first.\n * When omitted, the UI falls back to `help`.\n *\n * @generated from field: optional string description = 10;\n */\n description: string;\n\n /**\n * Named data source for dropdown-style controls.\n *\n * @generated from field: optional protoform.v1.DataProviderId data_provider = 11 [default = DATA_PROVIDER_ID_UNSPECIFIED];\n */\n dataProvider: DataProviderId;\n\n /**\n * When CONTROL_TYPE_JSON: enables a drag-and-drop zone that reads\n * a .json file into the field value alongside the editor.\n *\n * @generated from field: optional bool dropzone = 12;\n */\n dropzone: boolean;\n\n /**\n * Link to the upstream source of truth for the values this field\n * accepts. Rendered as a \"Learn more\" anchor next to the help text.\n *\n * @generated from field: optional string docs_url = 13;\n */\n docsUrl: string;\n};\n\n/**\n * Describes the message protoform.v1.FieldUiOptions.\n * Use `create(FieldUiOptionsSchema)` to create a new message.\n */\nexport const FieldUiOptionsSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_protoform_v1_auto_form_ui, 2);\n\n/**\n * @generated from message protoform.v1.OneofUiOptions\n */\nexport type OneofUiOptions = Message<\"protoform.v1.OneofUiOptions\"> & {\n /**\n * Detailed help text shown in the tooltip.\n *\n * @generated from field: optional string help = 1;\n */\n help: string;\n\n /**\n * @generated from field: repeated protoform.v1.UiRule visible_when = 2;\n */\n visibleWhen: UiRule[];\n\n /**\n * @generated from field: repeated protoform.v1.UiRule disabled_when = 3;\n */\n disabledWhen: UiRule[];\n\n /**\n * @generated from field: optional string step = 4;\n */\n step: string;\n\n /**\n * @generated from field: optional string summary_label = 5;\n */\n summaryLabel: string;\n\n /**\n * Concise one-liner shown below the selector.\n *\n * @generated from field: optional string description = 6;\n */\n description: string;\n};\n\n/**\n * Describes the message protoform.v1.OneofUiOptions.\n * Use `create(OneofUiOptionsSchema)` to create a new message.\n */\nexport const OneofUiOptionsSchema: GenMessage = /*@__PURE__*/\n messageDesc(file_protoform_v1_auto_form_ui, 3);\n\n/**\n * @generated from enum protoform.v1.ControlType\n */\nexport enum ControlType {\n /**\n * @generated from enum value: CONTROL_TYPE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: CONTROL_TYPE_TEXT = 1;\n */\n TEXT = 1,\n\n /**\n * @generated from enum value: CONTROL_TYPE_TEXTAREA = 2;\n */\n TEXTAREA = 2,\n\n /**\n * @generated from enum value: CONTROL_TYPE_PASSWORD = 3;\n */\n PASSWORD = 3,\n\n /**\n * @generated from enum value: CONTROL_TYPE_EMAIL = 4;\n */\n EMAIL = 4,\n\n /**\n * @generated from enum value: CONTROL_TYPE_URL = 5;\n */\n URL = 5,\n\n /**\n * @generated from enum value: CONTROL_TYPE_CURRENCY = 6;\n */\n CURRENCY = 6,\n\n /**\n * @generated from enum value: CONTROL_TYPE_CHECKBOX = 7;\n */\n CHECKBOX = 7,\n\n /**\n * @generated from enum value: CONTROL_TYPE_SWITCH = 8;\n */\n SWITCH = 8,\n\n /**\n * @generated from enum value: CONTROL_TYPE_TOGGLE = 9;\n */\n TOGGLE = 9,\n\n /**\n * @generated from enum value: CONTROL_TYPE_RADIO_GROUP = 10;\n */\n RADIO_GROUP = 10,\n\n /**\n * @generated from enum value: CONTROL_TYPE_SELECT = 11;\n */\n SELECT = 11,\n\n /**\n * @generated from enum value: CONTROL_TYPE_COMBOBOX = 12;\n */\n COMBOBOX = 12,\n\n /**\n * @generated from enum value: CONTROL_TYPE_MULTI_SELECT = 13;\n */\n MULTI_SELECT = 13,\n\n /**\n * @generated from enum value: CONTROL_TYPE_KEY_VALUE = 14;\n */\n KEY_VALUE = 14,\n\n /**\n * @generated from enum value: CONTROL_TYPE_JSON = 15;\n */\n JSON = 15,\n\n /**\n * @generated from enum value: CONTROL_TYPE_DATE = 16;\n */\n DATE = 16,\n\n /**\n * @generated from enum value: CONTROL_TYPE_TIMESTAMP = 17;\n */\n TIMESTAMP = 17,\n\n /**\n * @generated from enum value: CONTROL_TYPE_SLIDER = 19;\n */\n SLIDER = 19,\n}\n\n/**\n * Describes the enum protoform.v1.ControlType.\n */\nexport const ControlTypeSchema: GenEnum = /*@__PURE__*/\n enumDesc(file_protoform_v1_auto_form_ui, 0);\n\n/**\n * @generated from enum protoform.v1.DataProviderId\n */\nexport enum DataProviderId {\n /**\n * @generated from enum value: DATA_PROVIDER_ID_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_AWS_REGIONS = 1;\n */\n AWS_REGIONS = 1,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_GCP_REGIONS = 2;\n */\n GCP_REGIONS = 2,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_AZURE_REGIONS = 3;\n */\n AZURE_REGIONS = 3,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_COHERE_EMBEDDING_MODELS = 4;\n */\n COHERE_EMBEDDING_MODELS = 4,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_OPENAI_EMBEDDING_MODELS = 5;\n */\n OPENAI_EMBEDDING_MODELS = 5,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_OPENAI_TTS_MODELS = 6;\n */\n OPENAI_TTS_MODELS = 6,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_HTTP_METHODS = 7;\n */\n HTTP_METHODS = 7,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_SASL_MECHANISMS = 8;\n */\n SASL_MECHANISMS = 8,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_COHERE_RERANK_MODELS = 9;\n */\n COHERE_RERANK_MODELS = 9,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_OPENAI_IMAGE_MODELS = 10;\n */\n OPENAI_IMAGE_MODELS = 10,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_OPENAI_SPEECH_MODELS = 11;\n */\n OPENAI_SPEECH_MODELS = 11,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_BEDROCK_EMBEDDING_MODELS = 12;\n */\n BEDROCK_EMBEDDING_MODELS = 12,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_KAFKA_COMPRESSION_CODECS = 13;\n */\n KAFKA_COMPRESSION_CODECS = 13,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_OPENAI_TTS_AUDIO_FORMATS = 14;\n */\n OPENAI_TTS_AUDIO_FORMATS = 14,\n\n /**\n * @generated from enum value: DATA_PROVIDER_ID_SQL_DRIVERS = 18;\n */\n SQL_DRIVERS = 18,\n}\n\n/**\n * Describes the enum protoform.v1.DataProviderId.\n */\nexport const DataProviderIdSchema: GenEnum = /*@__PURE__*/\n enumDesc(file_protoform_v1_auto_form_ui, 1);\n\n/**\n * @generated from extension: optional protoform.v1.MessageUiOptions message_ui = 51000;\n */\nexport const message_ui: GenExtension = /*@__PURE__*/\n extDesc(file_protoform_v1_auto_form_ui, 0);\n\n/**\n * @generated from extension: optional protoform.v1.FieldUiOptions field_ui = 51001;\n */\nexport const field_ui: GenExtension = /*@__PURE__*/\n extDesc(file_protoform_v1_auto_form_ui, 1);\n\n/**\n * @generated from extension: optional protoform.v1.OneofUiOptions oneof_ui = 51002;\n */\nexport const oneof_ui: GenExtension = /*@__PURE__*/\n extDesc(file_protoform_v1_auto_form_ui, 2);\n\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/humanize-validation-error.ts", "content": "// Converts raw protovalidate error messages into human-readable messages.\n// Acts as a safety net for standard buf.validate constraints that cannot carry\n// custom messages. Proto-level CEL expressions with custom messages take\n// priority. This utility only fires for generic fallback messages.\n\nconst REGEX_ERROR_PATTERN = /regex pattern\\s*`([^`]+)`/;\nconst MIN_LEN_PATTERN = /^value length must be at least (\\d+)/;\nconst MAX_LEN_PATTERN = /^value length must be at most (\\d+)/;\nconst MIN_ITEMS_PATTERN = /^(?:value )?must contain at least (\\d+)(?: item(?:\\(s\\)|s)?)?/;\nconst MAX_ITEMS_PATTERN = /^(?:value )?must contain at most (\\d+)(?: item(?:\\(s\\)|s)?)?/;\nconst GTE_PATTERN = /^value must be greater than or equal to ([\\d.]+)/;\nconst LTE_PATTERN = /^value must be less than or equal to ([\\d.]+)/;\nconst GT_PATTERN = /^value must be greater than ([\\d.]+)/;\nconst LT_PATTERN = /^value must be less than ([\\d.]+)/;\n\ninterface PatternDescription {\n description: string;\n example: string;\n}\n\nconst KNOWN_PATTERNS: Record = {\n \"^[A-Z][A-Z0-9_]*$\": {\n description:\n \"Must be UPPER_SNAKE_CASE (start with a letter, then uppercase letters, digits, and underscores)\",\n example: \"AWS_ACCESS_KEY_ID\",\n },\n \"^[a-z][a-z0-9-]*$\": {\n description:\n \"Must be lowercase letters, digits, and hyphens (start with a letter)\",\n example: \"my-resource-name\",\n },\n \"^[a-z0-9][a-z0-9-]*$\": {\n description:\n \"Must be lowercase letters, digits, and hyphens (start with a letter or digit)\",\n example: \"my-resource-1\",\n },\n \"^$|^[A-Z][A-Z0-9_]*$\": {\n description:\n \"Must be empty or UPPER_SNAKE_CASE (uppercase letters, digits, and underscores)\",\n example: \"MY_API_KEY\",\n },\n // Match the URL pattern with or without a trailing `$` anchor. Both\n // appear in protovalidate output depending on how the rule was authored.\n \"^https?://.+\": {\n description: \"Must be a valid URL starting with http:// or https://\",\n example: \"https://example.com\",\n },\n \"^https?://.+$\": {\n description: \"Must be a valid URL starting with http:// or https://\",\n example: \"https://example.com\",\n },\n};\n\n/** Known generic protovalidate messages that should be replaced by custom CEL messages when available. */\nconst GENERIC_MESSAGES = new Set([\n \"value is required\",\n \"exactly one field is required in oneof\",\n]);\n\n/**\n * Returns true if the message is a generic protovalidate constraint message\n * (i.e., not a custom CEL message). Used by the resolver to prefer custom\n * messages over generic ones when a field has multiple validation errors.\n */\nexport function isGenericValidationMessage(message: string): boolean {\n if (GENERIC_MESSAGES.has(message)) {\n return true;\n }\n if (MIN_LEN_PATTERN.test(message) || MAX_LEN_PATTERN.test(message)) {\n return true;\n }\n if (REGEX_ERROR_PATTERN.test(message)) {\n return true;\n }\n if (\n MIN_ITEMS_PATTERN.test(message) ||\n MAX_ITEMS_PATTERN.test(message) ||\n GTE_PATTERN.test(message) ||\n LTE_PATTERN.test(message) ||\n GT_PATTERN.test(message) ||\n LT_PATTERN.test(message)\n ) {\n return true;\n }\n return false;\n}\n\nfunction humanizeLengthConstraint(message: string): string | undefined {\n const minLenMatch = MIN_LEN_PATTERN.exec(message);\n if (minLenMatch?.[1]) {\n return minLenMatch[1] === \"1\"\n ? \"This field is required.\"\n : `Must be at least ${minLenMatch[1]} characters.`;\n }\n const maxLenMatch = MAX_LEN_PATTERN.exec(message);\n if (maxLenMatch?.[1]) {\n return `Must be at most ${maxLenMatch[1]} characters.`;\n }\n return;\n}\n\nfunction humanizeItemConstraint(message: string): string | undefined {\n const minItemsMatch = MIN_ITEMS_PATTERN.exec(message);\n if (minItemsMatch?.[1]) {\n return minItemsMatch[1] === \"1\"\n ? \"Add at least one item.\"\n : `Add at least ${minItemsMatch[1]} items.`;\n }\n const maxItemsMatch = MAX_ITEMS_PATTERN.exec(message);\n if (maxItemsMatch?.[1]) {\n return maxItemsMatch[1] === \"1\"\n ? \"At most one item is allowed.\"\n : `At most ${maxItemsMatch[1]} items are allowed.`;\n }\n return;\n}\n\nfunction humanizeNumericBound(message: string): string | undefined {\n const gteMatch = GTE_PATTERN.exec(message);\n if (gteMatch?.[1]) {\n return `Must be ${gteMatch[1]} or greater.`;\n }\n const lteMatch = LTE_PATTERN.exec(message);\n if (lteMatch?.[1]) {\n return `Must be ${lteMatch[1]} or less.`;\n }\n const gtMatch = GT_PATTERN.exec(message);\n if (gtMatch?.[1]) {\n return `Must be greater than ${gtMatch[1]}.`;\n }\n const ltMatch = LT_PATTERN.exec(message);\n if (ltMatch?.[1]) {\n return `Must be less than ${ltMatch[1]}.`;\n }\n return;\n}\n\nfunction humanizeRegexError(message: string): string | undefined {\n const regexMatch = REGEX_ERROR_PATTERN.exec(message);\n if (!regexMatch?.[1]) {\n return;\n }\n const known = KNOWN_PATTERNS[regexMatch[1]];\n return known ? `${known.description}. Example: ${known.example}` : message;\n}\n\n/**\n * Replace raw protovalidate error messages with human-readable descriptions.\n * Returns the original message if it's already a custom CEL message.\n */\nexport function humanizeValidationError(message: string): string {\n if (message === \"value is required\") {\n return \"Enter a value.\";\n }\n if (message === \"exactly one field is required in oneof\") {\n return \"Select an option.\";\n }\n\n return (\n humanizeLengthConstraint(message) ??\n humanizeItemConstraint(message) ??\n humanizeNumericBound(message) ??\n humanizeRegexError(message) ??\n message\n );\n}\n\nexport const SERVER_FIELD_ERROR_FALLBACK = \"Review this value and try again.\";\n\n/** Humanize a server field violation and ensure blank descriptions stay actionable. */\nexport function humanizeServerFieldError(description: string): string {\n const message = description.trim();\n return message ? humanizeValidationError(message) : SERVER_FIELD_ERROR_FALLBACK;\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/index.ts", "content": "export {\n getProtoFieldBehaviors,\n getProtoResourceMetadata,\n getProtoResourceReference,\n isSingletonProtoResource,\n type ProtoResourceMetadata,\n type ProtoResourceReference,\n} from \"./aip.js\";\nexport {\n getRegisteredProtoAnnotations,\n type ProtoAnnotations,\n registerProtoAnnotations,\n} from \"./annotations.js\";\nexport {\n createFieldMask,\n createUpdateMask,\n dirtyFieldsFromValues,\n} from \"./field-mask.js\";\nexport { createProtoFormSchema } from \"./form-schema.js\";\nexport {\n type ConnectErrorContext,\n extractConnectErrorContext,\n extractFieldViolations,\n type FieldViolation,\n formatConnectError,\n formatToastErrorMessage,\n grpcCodeLabel,\n type HelpLink,\n type PreconditionViolation,\n type QuotaViolation,\n} from \"./format-error.js\";\nexport { formatSubmittedValue } from \"./format-submitted-value.js\";\nexport {\n humanizeValidationError,\n humanizeServerFieldError,\n isGenericValidationMessage,\n SERVER_FIELD_ERROR_FALLBACK,\n} from \"./humanize-validation-error.js\";\nexport { protoPathToFormPath } from \"./proto-error-path.js\";\nexport {\n formValuesToProto,\n formValuesToProtoInit,\n getProtoFieldCustomData,\n getProtoMessageUiConfig,\n isProtoMessageDescriptor,\n isProtoProvider,\n type NormalizedProtoIssue,\n type NormalizedProtoValidationResult,\n PROTO_FORM_ROOT_ERROR_KEY,\n type ProtoAnyFormValue,\n type ProtoFieldCustomData,\n type ProtoFieldRenderType,\n type ProtoFieldType,\n type ProtoMapFormEntry,\n type ProtoConversionOptions,\n type ProtoFormOptions,\n type ProtoValidationContext,\n ProtoProvider,\n parseProtoSchema,\n preserveProtoMessageSource,\n protoFormValuesToPayload,\n protoPayloadToFormValues,\n protoToFormValues,\n validateFormValuesAgainstProtoSchema,\n} from \"./provider.js\";\nexport {\n getProtoFieldUi,\n getProtoMessageUi,\n getProtoOneofUi,\n type ProtoFieldUiConfig,\n type ProtoMessageUiConfig,\n type ProtoUiRule,\n} from \"./ui-options.js\";\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/method-workflow.ts", "content": "import { http } from \"@buf/googleapis_googleapis.bufbuild_es/google/api/annotations_pb.js\";\nimport type { HttpRule } from \"@buf/googleapis_googleapis.bufbuild_es/google/api/http_pb.js\";\nimport {\n OperationSchema,\n operation_info,\n} from \"@buf/googleapis_googleapis.bufbuild_es/google/longrunning/operations_pb.js\";\nimport {\n create,\n type DescMethod,\n getExtension,\n hasExtension,\n} from \"@bufbuild/protobuf\";\nimport { MethodOptionsSchema } from \"@bufbuild/protobuf/wkt\";\n\nexport type ProtoMethodCategory = \"batch\" | \"custom\" | \"standard\";\nexport type ProtoMethodExecution = \"long-running\" | \"streaming\" | \"unary\";\n\nexport interface ProtoHttpBinding {\n bodyFields: readonly string[];\n method: string;\n path: string;\n pathFields: readonly string[];\n queryFields: readonly string[];\n}\n\nexport interface ProtoOperationInfo {\n metadataType: string;\n responseType: string;\n}\n\nexport interface ProtoMethodWorkflow {\n category: ProtoMethodCategory;\n execution: ProtoMethodExecution;\n httpBindings: readonly ProtoHttpBinding[];\n method: DescMethod;\n operation?: ProtoOperationInfo;\n}\n\nconst STANDARD_METHOD_PATTERN = /^(Create|Delete|Get|List|Update)[A-Z]/;\nconst PATH_FIELD_PATTERN = /\\{([^}=]+)(?:=[^}]*)?\\}/g;\n\nfunction getMethodCategory(name: string): ProtoMethodCategory {\n if (name.startsWith(\"Batch\")) {\n return \"batch\";\n }\n return STANDARD_METHOD_PATTERN.test(name) ? \"standard\" : \"custom\";\n}\n\nfunction getHttpPattern(rule: HttpRule): { method: string; path: string } {\n const { pattern } = rule;\n if (pattern.case === undefined) {\n return { method: \"\", path: \"\" };\n }\n if (pattern.case === \"custom\") {\n return {\n method: pattern.value.kind.toUpperCase(),\n path: pattern.value.path,\n };\n }\n return {\n method: pattern.case.toUpperCase(),\n path: pattern.value,\n };\n}\n\nfunction parseHttpBinding(\n method: DescMethod,\n rule: HttpRule\n): ProtoHttpBinding {\n const pattern = getHttpPattern(rule);\n const pathFields = Array.from(\n pattern.path.matchAll(PATH_FIELD_PATTERN),\n (match) => match[1]\n ).filter((field): field is string => field !== undefined);\n const requestFields = method.input.fields.map((field) => field.name);\n let bodyFields: string[] = [];\n let queryFields: string[] = [];\n if (rule.body === \"*\") {\n bodyFields = requestFields.filter((field) => !pathFields.includes(field));\n } else if (rule.body) {\n bodyFields = [rule.body];\n queryFields = requestFields.filter(\n (field) => !pathFields.includes(field) && field !== rule.body\n );\n } else {\n queryFields = requestFields.filter((field) => !pathFields.includes(field));\n }\n\n return {\n bodyFields,\n method: pattern.method,\n path: pattern.path,\n pathFields,\n queryFields,\n };\n}\n\nexport function getProtoMethodWorkflow(\n method: DescMethod\n): ProtoMethodWorkflow {\n const options = method.proto.options ?? create(MethodOptionsSchema);\n const httpRule = hasExtension(options, http)\n ? getExtension(options, http)\n : undefined;\n const operationInfo = hasExtension(options, operation_info)\n ? getExtension(options, operation_info)\n : undefined;\n const streaming = method.methodKind !== \"unary\";\n const longRunning = method.output.typeName === OperationSchema.typeName;\n let execution: ProtoMethodExecution = \"unary\";\n if (streaming) {\n execution = \"streaming\";\n } else if (longRunning) {\n execution = \"long-running\";\n }\n const operation =\n operationInfo?.metadataType && operationInfo.responseType\n ? {\n metadataType: operationInfo.metadataType,\n responseType: operationInfo.responseType,\n }\n : undefined;\n\n return {\n category: getMethodCategory(method.name),\n execution,\n httpBindings: httpRule\n ? [httpRule, ...httpRule.additionalBindings].map((rule) =>\n parseHttpBinding(method, rule)\n )\n : [],\n method,\n operation,\n };\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/proto-error-path.ts", "content": "import type { DescField, DescMessage, DescOneof } from \"@bufbuild/protobuf\";\n\n/**\n * Convert a server-side proto field path into the camelCase form path used by\n * Protoform adapters. Oneof branches flatten under `{oneofLocalName}.value`.\n */\nexport function protoPathToFormPath(\n schema: DescMessage,\n serverPath: string\n): string | null {\n if (!serverPath) {\n return null;\n }\n const path = walk(schema, serverPath.split(\".\"));\n return path ? path.join(\".\") : null;\n}\n\nfunction walk(\n current: DescMessage,\n segments: readonly string[]\n): string[] | null {\n if (segments.length === 0) {\n return [];\n }\n const [head, ...rest] = segments;\n if (!head) {\n return null;\n }\n const resolved = findMember(current, head);\n if (!resolved) {\n return null;\n }\n\n if (resolved.kind === \"oneof\") {\n if (rest.length === 0) {\n return [resolved.oneof.localName];\n }\n const [branchName, ...afterBranch] = rest;\n if (!branchName) {\n return null;\n }\n const branch = resolved.oneof.fields.find(\n (candidate) => candidate.name === branchName\n );\n if (!branch) {\n return null;\n }\n const tail = walkInto(branch, afterBranch);\n return tail === null ? null : [resolved.oneof.localName, \"value\", ...tail];\n }\n\n const { field } = resolved;\n const formPath = field.oneof\n ? [field.oneof.localName, \"value\"]\n : [field.localName];\n if (rest.length === 0) {\n return formPath;\n }\n if (!field.message) {\n return null;\n }\n const tail = walk(field.message, rest);\n return tail === null ? null : [...formPath, ...tail];\n}\n\nfunction walkInto(\n field: DescField,\n segments: readonly string[]\n): string[] | null {\n if (segments.length === 0) {\n return [];\n }\n return field.message ? walk(field.message, segments) : null;\n}\n\ntype Resolved =\n | { kind: \"field\"; field: DescField }\n | { kind: \"oneof\"; oneof: DescOneof };\n\nfunction findMember(\n message: DescMessage,\n protoName: string\n): Resolved | undefined {\n for (const member of message.members) {\n if (member.kind === \"oneof\") {\n if (member.name === protoName) {\n return { kind: \"oneof\", oneof: member };\n }\n const field = member.fields.find(\n (candidate) => candidate.name === protoName\n );\n if (field) {\n return { field, kind: \"field\" };\n }\n } else if (member.name === protoName) {\n return { field: member, kind: \"field\" };\n }\n }\n return;\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/provider.ts", "content": "import { FieldBehavior } from \"@buf/googleapis_googleapis.bufbuild_es/google/api/field_behavior_pb.js\";\nimport {\n clone,\n create,\n type DescField,\n type DescMessage,\n type DescOneof,\n fromJson,\n fromJsonString,\n getExtension,\n isMessage,\n type JsonValue,\n type MessageInitShape,\n type MessageShape,\n type MessageValidType,\n ScalarType,\n toJson,\n toJsonString,\n} from \"@bufbuild/protobuf\";\nimport { base64Decode, base64Encode } from \"@bufbuild/protobuf/wire\";\nimport {\n DurationSchema,\n FeatureSet_FieldPresence,\n type FieldMask,\n FieldOptionsSchema,\n isWrapperDesc,\n ListValueSchema,\n MessageOptionsSchema,\n OneofOptionsSchema,\n StructSchema,\n type TimestampSchema,\n timestampDate,\n timestampFromDate,\n ValueSchema,\n} from \"@bufbuild/protobuf/wkt\";\nimport {\n type ValidatorOptions,\n} from \"@bufbuild/protovalidate\";\nimport type {\n EmptyRepeatedStringPolicy,\n FieldRenderHints,\n FormValues,\n ParsedField,\n ParsedSchema,\n ProviderCustomData,\n SchemaProvider,\n SchemaValidation,\n StandardSchemaV1,\n} from \"../core/index.js\";\nimport {\n getProtoFieldBehaviors,\n getProtoResourceMetadata,\n getProtoResourceReference,\n type ProtoResourceMetadata,\n type ProtoResourceReference,\n} from \"./aip.js\";\nimport type { ProtoAnnotations } from \"./annotations.js\";\nimport { getRegisteredProtoAnnotations } from \"./annotations.js\";\nimport type {\n FieldRules,\n MessageRules,\n OneofRules,\n StringRules,\n} from \"./gen/buf/validate/validate_pb.js\";\nimport {\n field as fieldExtension,\n message as messageExtension,\n oneof as oneofExtension,\n} from \"./gen/buf/validate/validate_pb.js\";\nimport type { ProtoFieldUiConfig, ProtoMessageUiConfig } from \"./ui-options.js\";\nimport {\n getProtoFieldUi,\n getProtoMessageUi,\n getProtoOneofUi,\n} from \"./ui-options.js\";\nimport { createDescriptorAwareStandardSchema } from \"./validation-schema.js\";\nimport { protoPathToFormPath } from \"./proto-error-path.js\";\n\nconst GOOGLE_PROTOBUF_PREFIX = \"google.protobuf.\";\nconst TIMESTAMP_TYPE = `${GOOGLE_PROTOBUF_PREFIX}Timestamp`;\nconst DURATION_TYPE = `${GOOGLE_PROTOBUF_PREFIX}Duration`;\nconst FIELD_MASK_TYPE = `${GOOGLE_PROTOBUF_PREFIX}FieldMask`;\nconst STRUCT_TYPE = `${GOOGLE_PROTOBUF_PREFIX}Struct`;\nconst VALUE_TYPE = `${GOOGLE_PROTOBUF_PREFIX}Value`;\nconst LIST_VALUE_TYPE = `${GOOGLE_PROTOBUF_PREFIX}ListValue`;\nconst ANY_TYPE = `${GOOGLE_PROTOBUF_PREFIX}Any`;\nconst PROTO_JSON_FALLBACK_TYPES = [\n TIMESTAMP_TYPE,\n DURATION_TYPE,\n FIELD_MASK_TYPE,\n STRUCT_TYPE,\n VALUE_TYPE,\n LIST_VALUE_TYPE,\n ANY_TYPE,\n];\nexport const PROTO_FORM_ROOT_ERROR_KEY = \"__protoFormRoot__\";\nconst IMPLICIT_FIELD_PRESENCE = FeatureSet_FieldPresence.IMPLICIT;\n\nexport type ProtoFieldType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"select\"\n | \"object\"\n | \"array\"\n | \"oneof\"\n | \"map\"\n | \"bytes\"\n | \"int64\"\n | \"timestamp\"\n | \"duration\"\n | \"fieldMask\"\n | \"json\";\n\nexport type ProtoFieldRenderType =\n | ProtoFieldType\n | \"textarea\"\n | \"password\"\n | \"email\"\n | \"url\"\n | \"currency\"\n | \"checkbox\"\n | \"switch\"\n | \"toggle\"\n | \"radio\"\n | \"combobox\"\n | \"multiselect\"\n | \"choicebox\"\n | \"toggleGroup\"\n | \"keyValue\"\n // Widget routing derived from field_ui annotations — `data_provider`\n // promotes a string/number field to `dataProviderSelect`, and a JSON\n // field with `dropzone: true` promotes to `dropzone-json`.\n | \"dataProviderSelect\"\n | \"dropzone-json\";\n\ntype ProtoJsonKind = \"struct\" | \"value\" | \"listValue\" | \"any\";\n\ntype ParsedProtoField = ParsedField;\ntype ParsedProtoSchema = ParsedSchema;\n\nexport interface ProtoFieldCustomData extends ProviderCustomData {\n allowedPaths?: string[];\n deprecated?: boolean;\n desc?: DescField;\n fieldBehaviors?: readonly FieldBehavior[];\n fieldRules?: FieldRules;\n hidden?: boolean;\n identifier?: boolean;\n immutable?: boolean;\n inputOnly?: boolean;\n inputType?: string;\n jsonKind?: ProtoJsonKind;\n keyField?: ParsedProtoField;\n maxItems?: number;\n maxPairs?: number;\n messageRules?: MessageRules;\n minItems?: number;\n minPairs?: number;\n oneof?: DescOneof;\n oneofRules?: OneofRules;\n recursive?: boolean;\n resource?: ProtoResourceMetadata;\n resourceReference?: ProtoResourceReference;\n ruleExample?: string;\n secretScope?: string;\n source: \"proto\";\n supportsUnset?: boolean;\n ui?: ProtoFieldUiConfig;\n valueField?: ParsedProtoField;\n}\n\ntype ProtoFieldConfig = ParsedProtoField[\"fieldConfig\"] & {\n customData?: ProtoFieldCustomData;\n};\n\ntype SchemaIssue = StandardSchemaV1.Issue;\n\ntype AnyObject = Record;\ntype ScalarField = Extract;\ntype EnumField = Extract;\ntype MessageField = Extract;\ntype ListField = Extract;\ntype MapField = Extract;\n\nexport interface ProtoAnyFormValue {\n typeUrl?: string;\n valueBase64?: string;\n}\n\nexport interface ProtoMapFormEntry {\n key: unknown;\n value: unknown;\n}\n\nexport interface ProtoConversionOptions {\n /**\n * Per-field policies keyed by descriptor path. Empty and whitespace-only\n * repeated strings are discarded unless the field is set to `preserve`.\n */\n emptyRepeatedStringPolicies?: Readonly<\n Record\n >;\n}\n\nexport interface ProtoFormOptions\n extends ValidatorOptions,\n ProtoConversionOptions {}\n\ninterface ProtoParserContext {\n ancestors: ReadonlySet;\n annotations?: ProtoAnnotations;\n messageUi?: ProtoMessageUiConfig;\n operation?: \"create\" | \"update\";\n secretScope?: string;\n}\n\nexport function isProtoMessageDescriptor(value: unknown): value is DescMessage {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"message\" &&\n \"typeName\" in value &&\n typeof (value as { typeName?: unknown }).typeName === \"string\" &&\n \"members\" in value &&\n Array.isArray((value as { members?: unknown }).members)\n );\n}\n\nexport function getProtoFieldCustomData(\n field: ParsedField\n): ProtoFieldCustomData | undefined {\n return (field.fieldConfig as ProtoFieldConfig | undefined)?.customData;\n}\n\nfunction getFieldRules(field: DescField): FieldRules {\n return getExtension(\n field.proto.options ?? create(FieldOptionsSchema),\n fieldExtension\n );\n}\n\nfunction getMessageRules(desc: DescMessage): MessageRules {\n return getExtension(\n desc.proto.options ?? create(MessageOptionsSchema),\n messageExtension\n );\n}\n\nfunction getOneofRules(oneof: DescOneof): OneofRules {\n return getExtension(\n oneof.proto.options ?? create(OneofOptionsSchema),\n oneofExtension\n );\n}\n\nfunction tracksPresence(field: DescField): boolean {\n return field.presence !== IMPLICIT_FIELD_PRESENCE;\n}\n\nfunction is64BitScalar(scalar: ScalarType | undefined): boolean {\n return (\n scalar === ScalarType.INT64 ||\n scalar === ScalarType.UINT64 ||\n scalar === ScalarType.SINT64 ||\n scalar === ScalarType.FIXED64 ||\n scalar === ScalarType.SFIXED64\n );\n}\n\nfunction isPlainObject(value: unknown): value is Record {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nconst UNSPECIFIED_PATTERN = /(unspecified|unknown)$/i;\nconst CAMEL_BOUNDARY_PATTERN = /([a-z0-9])([A-Z])/g;\nconst WORD_SEPARATOR_PATTERN = /[_.-]+/g;\nconst WHITESPACE_PATTERN = /\\s+/g;\n\nfunction isUnspecifiedEnumValue(enumValue: {\n number: number;\n localName: string;\n name?: string;\n}): boolean {\n if (enumValue.number !== 0) {\n return false;\n }\n // Check both localName (camelCase) and name (SCREAMING_SNAKE_CASE) for unspecified/unknown suffix\n return (\n UNSPECIFIED_PATTERN.test(enumValue.localName) ||\n (typeof enumValue.name === \"string\" &&\n UNSPECIFIED_PATTERN.test(enumValue.name))\n );\n}\n\nfunction humanize(input: string): string {\n return input\n .replace(CAMEL_BOUNDARY_PATTERN, \"$1 $2\")\n .replace(WORD_SEPARATOR_PATTERN, \" \")\n .replace(WHITESPACE_PATTERN, \" \")\n .trim()\n .split(\" \")\n .map((word) => {\n const lower = word.toLowerCase();\n if (word === word.toUpperCase() && word.length > 1) {\n return word.charAt(0) + lower.slice(1);\n }\n return word.charAt(0).toUpperCase() + lower.slice(1);\n })\n .join(\" \");\n}\n\nconst NORMALIZE_SEPARATOR_PATTERN = /[\\s_-]+/g;\n\n// Returns the raw localName for enum values.\n// Consumers can override labels via optionLabels in fieldConfig.\n// We intentionally do NOT humanize enum values because the transformed\n// names are often confusing (e.g., \"Api Key Location Header\" vs \"HEADER\").\nfunction formatEnumLabel(enumLocalName: string, enumTypeName: string): string {\n // Proto-gen-es v2 pre-strips the type prefix from localName in most cases.\n // If the localName still starts with the type name (camelCase), strip it.\n const typePrefixNormalized = enumTypeName\n .toLowerCase()\n .replace(NORMALIZE_SEPARATOR_PATTERN, \"\");\n const valueNormalized = enumLocalName\n .toLowerCase()\n .replace(NORMALIZE_SEPARATOR_PATTERN, \"\");\n if (\n valueNormalized.startsWith(typePrefixNormalized) &&\n valueNormalized.length > typePrefixNormalized.length\n ) {\n const stripped = enumLocalName.slice(typePrefixNormalized.length);\n if (stripped.length > 0) {\n return humanize(stripped);\n }\n }\n return humanize(enumLocalName);\n}\n\nfunction buildEnumOptions(\n values: readonly {\n number: number;\n localName: string;\n name?: string;\n }[],\n enumTypeName: string\n): [string, string][] {\n const seenNumbers = new Set();\n\n return values\n .filter((value) => {\n if (isUnspecifiedEnumValue(value) || seenNumbers.has(value.number)) {\n return false;\n }\n seenNumbers.add(value.number);\n return true;\n })\n .map((value) => [\n String(value.number),\n formatEnumLabel(value.localName, enumTypeName),\n ]);\n}\n\nfunction bigIntToNumber(value: bigint | undefined): number | undefined {\n if (value === undefined) {\n return;\n }\n const numericValue = Number(value);\n return Number.isFinite(numericValue) ? numericValue : undefined;\n}\n\nfunction cloneField(\n field: DescField,\n overrides: Partial\n): DescField {\n return {\n ...field,\n ...overrides,\n } as DescField;\n}\n\nfunction getStringInputType(\n rules: StringRules | undefined\n): string | undefined {\n switch (rules?.wellKnown.case) {\n case \"email\":\n return \"email\";\n case \"uri\":\n return \"url\";\n case \"uuid\":\n return \"text\";\n default:\n return;\n }\n}\n\nfunction withFieldUi(\n customData: ProtoFieldCustomData,\n field: DescField\n): ProtoFieldCustomData {\n return {\n ...customData,\n ui: getProtoFieldUi(field),\n };\n}\n\nfunction withOneofUi(\n customData: ProtoFieldCustomData,\n oneof: DescOneof\n): ProtoFieldCustomData {\n return {\n ...customData,\n ui: getProtoOneofUi(oneof),\n };\n}\n\ntype ProtoInputProps = Record;\n\n/**\n * Derive the schema-agnostic render hints for a field from its\n * proto-private customData. The rendering engine reads hints via\n * `getFieldHints`; customData stays provider-internal.\n */\nfunction hintsFromCustomData(\n data: ProtoFieldCustomData | undefined\n): FieldRenderHints | undefined {\n if (!data) {\n return undefined;\n }\n const ui = data.ui;\n const hints: FieldRenderHints = {};\n const assign = (\n key: Key,\n value: FieldRenderHints[Key] | undefined\n ) => {\n if (value !== undefined) {\n hints[key] = value;\n }\n };\n\n assign(\"control\", ui?.control);\n assign(\"inputType\", data.inputType);\n assign(\"placeholder\", ui?.placeholder);\n assign(\"example\", ui?.example ?? data.ruleExample);\n assign(\"help\", ui?.help);\n assign(\"description\", ui?.description);\n assign(\"summaryLabel\", ui?.summaryLabel);\n assign(\"sensitive\", ui?.sensitive);\n assign(\"step\", ui?.step);\n assign(\"secretScope\", data.secretScope);\n assign(\"docsUrl\", ui?.docsUrl);\n assign(\"visibleWhen\", ui?.visibleWhen);\n assign(\"disabledWhen\", ui?.disabledWhen);\n assign(\"supportsUnset\", data.supportsUnset);\n assign(\"jsonKind\", data.jsonKind);\n assign(\"minItems\", data.minItems);\n assign(\"maxItems\", data.maxItems);\n assign(\"minPairs\", data.minPairs);\n assign(\"maxPairs\", data.maxPairs);\n assign(\"allowedPaths\", data.allowedPaths);\n assign(\"dataProvider\", ui?.dataProvider);\n assign(\"deprecated\", data.deprecated);\n assign(\"dropzone\", ui?.dropzone);\n\n return Object.keys(hints).length > 0 ? hints : undefined;\n}\n\n/** Attach derived render hints to a parsed field, in place. */\nfunction attachRenderHints(field: ParsedProtoField): ParsedProtoField {\n const hints = hintsFromCustomData(\n (field.fieldConfig as ProtoFieldConfig | undefined)?.customData\n );\n if (hints) {\n field.hints = hints;\n }\n return field;\n}\n\nfunction buildFieldConfig(\n customData: ProtoFieldCustomData,\n inputProps: ProtoInputProps = {},\n description?: string\n): ProtoFieldConfig {\n const fieldType = customData.ui?.control as ProtoFieldRenderType | undefined;\n\n return {\n customData,\n description,\n fieldType,\n inputProps: {\n ...(customData.ui?.placeholder\n ? { placeholder: customData.ui.placeholder }\n : {}),\n ...inputProps,\n },\n };\n}\n\nfunction getMessageDescription(\n desc: DescMessage,\n context: ProtoParserContext\n): string | undefined {\n return context.annotations?.messages?.[desc.typeName];\n}\n\nfunction getFieldDescription(\n field: DescField,\n context: ProtoParserContext\n): string | undefined {\n return context.annotations?.fields?.[\n `${field.parent.typeName}.${field.localName}`\n ];\n}\n\nfunction getOneofDescription(\n oneof: DescOneof,\n context: ProtoParserContext\n): string | undefined {\n return context.annotations?.oneofs?.[\n `${oneof.parent.typeName}.${oneof.localName}`\n ];\n}\n\nfunction extractNumericBounds(rules: FieldRules | undefined): {\n min?: number;\n max?: number;\n step?: string;\n} {\n const typeCase = rules?.type.case;\n if (!typeCase) {\n return {};\n }\n\n const numericRules = rules.type.value as {\n lessThan?: { case?: string; value?: number | bigint };\n greaterThan?: { case?: string; value?: number | bigint };\n };\n\n const step = [\"float\", \"double\"].includes(typeCase) ? \"any\" : \"1\";\n let min: number | undefined;\n let max: number | undefined;\n\n if (numericRules.greaterThan?.case === \"gte\") {\n min = Number(numericRules.greaterThan.value);\n } else if (numericRules.greaterThan?.case === \"gt\") {\n const greaterThan = Number(numericRules.greaterThan.value);\n min = Number.isFinite(greaterThan)\n ? greaterThan + (step === \"1\" ? 1 : 0)\n : undefined;\n }\n\n if (numericRules.lessThan?.case === \"lte\") {\n max = Number(numericRules.lessThan.value);\n } else if (numericRules.lessThan?.case === \"lt\") {\n const lessThan = Number(numericRules.lessThan.value);\n max = Number.isFinite(lessThan)\n ? lessThan - (step === \"1\" ? 1 : 0)\n : undefined;\n }\n\n if (min !== undefined && max !== undefined && min > max) {\n return { step };\n }\n\n return { max, min, step };\n}\n\nfunction buildStringField(\n field: DescField,\n rules: FieldRules,\n context: ProtoParserContext\n): ParsedProtoField {\n const stringRules =\n rules.type.case === \"string\" ? rules.type.value : undefined;\n const inputType = getStringInputType(stringRules);\n\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n inputType,\n ruleExample: stringRules?.example[0],\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n field\n ),\n {\n maxLength: bigIntToNumber(stringRules?.maxLen),\n minLength: bigIntToNumber(stringRules?.minLen),\n pattern: stringRules?.pattern || undefined,\n type: inputType,\n },\n getFieldDescription(field, context)\n ),\n key: field.localName,\n required: rules.required,\n type: \"string\",\n };\n}\n\nfunction buildNumberField(\n field: DescField,\n rules: FieldRules,\n context: ProtoParserContext\n): ParsedProtoField {\n const { min, max, step } = extractNumericBounds(rules);\n const isInt64 = is64BitScalar(field.scalar);\n\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n field\n ),\n {\n ...(max === undefined ? {} : { max }),\n ...(min === undefined ? {} : { min }),\n step,\n },\n getFieldDescription(field, context)\n ),\n key: field.localName,\n required: rules.required,\n type: isInt64 ? \"int64\" : \"number\",\n };\n}\n\nfunction buildBooleanField(\n field: DescField,\n rules: FieldRules,\n context: ProtoParserContext\n): ParsedProtoField {\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n field\n ),\n {},\n getFieldDescription(field, context)\n ),\n key: field.localName,\n required: rules.required,\n type: \"boolean\",\n };\n}\n\nfunction buildBytesField(\n field: DescField,\n rules: FieldRules,\n context: ProtoParserContext\n): ParsedProtoField {\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n field\n ),\n {},\n getFieldDescription(field, context)\n ),\n key: field.localName,\n required: rules.required,\n type: \"bytes\",\n };\n}\n\nfunction buildEnumField(\n field: EnumField,\n rules: FieldRules,\n context: ProtoParserContext\n): ParsedProtoField {\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n field\n ),\n {},\n getFieldDescription(field, context)\n ),\n key: field.localName,\n options: buildEnumOptions(field.enum.values, field.enum.name),\n required: rules.required,\n type: \"select\",\n };\n}\n\nfunction buildJsonField(\n field: DescField,\n rules: FieldRules,\n jsonKind: ProtoJsonKind,\n context: ProtoParserContext\n): ParsedProtoField {\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n jsonKind,\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n field\n ),\n {},\n getFieldDescription(field, context)\n ),\n key: field.localName,\n required: rules.required,\n type: \"json\",\n };\n}\n\nfunction buildRecursiveField(\n field: DescField,\n rules: FieldRules | undefined,\n context: ProtoParserContext,\n key = field.localName\n): ParsedProtoField {\n return {\n fieldConfig: buildFieldConfig(\n {\n desc: field,\n fieldRules: rules,\n recursive: true,\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n {},\n getFieldDescription(field, context)\n ),\n key,\n required: Boolean(rules?.required),\n type: \"json\",\n };\n}\n\nfunction buildMessageField(\n field: MessageField,\n rules: FieldRules,\n context: ProtoParserContext\n): ParsedProtoField {\n if (isWrapperDesc(field.message)) {\n const wrappedScalar = field.message.fields[0]?.scalar;\n if (wrappedScalar === ScalarType.BOOL) {\n return buildBooleanField(field as DescField, rules, context);\n }\n if (wrappedScalar === ScalarType.BYTES) {\n return buildBytesField(field, rules, context);\n }\n if (wrappedScalar === ScalarType.STRING) {\n return buildStringField(field, rules, context);\n }\n return buildNumberField(field as DescField, rules, context);\n }\n\n const description = getFieldDescription(field, context);\n\n if (context.ancestors.has(field.message.typeName)) {\n return buildRecursiveField(field, rules, context);\n }\n\n switch (field.message.typeName) {\n case TIMESTAMP_TYPE:\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n field\n ),\n {},\n description\n ),\n key: field.localName,\n required: rules.required,\n type: \"timestamp\",\n };\n case DURATION_TYPE:\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n field\n ),\n {},\n description\n ),\n key: field.localName,\n required: rules.required,\n type: \"duration\",\n };\n case FIELD_MASK_TYPE:\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n allowedPaths:\n rules.type.case === \"fieldMask\"\n ? rules.type.value.in\n : undefined,\n desc: field,\n fieldRules: rules,\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n field\n ),\n {},\n description\n ),\n key: field.localName,\n required: rules.required,\n type: \"fieldMask\",\n };\n case STRUCT_TYPE:\n return buildJsonField(field, rules, \"struct\", context);\n case VALUE_TYPE:\n return buildJsonField(field, rules, \"value\", context);\n case LIST_VALUE_TYPE:\n return buildJsonField(field, rules, \"listValue\", context);\n case ANY_TYPE:\n return buildJsonField(field, rules, \"any\", context);\n default:\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n messageRules: getMessageRules(field.message),\n source: \"proto\",\n supportsUnset: tracksPresence(field),\n },\n field\n ),\n {},\n description ?? getMessageDescription(field.message, context)\n ),\n key: field.localName,\n required: rules.required,\n schema: parseProtoSchemaInternal(\n field.message,\n context.annotations,\n context.secretScope,\n context.ancestors,\n context.operation\n ).fields,\n type: \"object\",\n };\n }\n}\n\nfunction buildListItemField(\n field: ListField,\n context: ProtoParserContext,\n itemRules?: FieldRules\n): ParsedProtoField {\n const syntheticField = cloneField(field, {\n localName: \"value\",\n });\n\n if (field.listKind === \"scalar\") {\n if (field.scalar === ScalarType.STRING) {\n return buildStringField(\n syntheticField,\n itemRules ?? getFieldRules(field),\n context\n );\n }\n if (field.scalar === ScalarType.BOOL) {\n return buildBooleanField(\n syntheticField,\n itemRules ?? getFieldRules(field),\n context\n );\n }\n if (field.scalar === ScalarType.BYTES) {\n return buildBytesField(\n syntheticField,\n itemRules ?? getFieldRules(field),\n context\n );\n }\n return buildNumberField(\n syntheticField,\n itemRules ?? getFieldRules(field),\n context\n );\n }\n\n if (field.listKind === \"enum\") {\n return {\n fieldConfig: buildFieldConfig({\n desc: field,\n fieldRules: itemRules,\n source: \"proto\",\n }),\n key: \"value\",\n options: buildEnumOptions(field.enum.values, field.enum.name),\n required: false,\n type: \"select\",\n };\n }\n\n if (context.ancestors.has(field.message.typeName)) {\n return buildRecursiveField(field, itemRules, context, \"value\");\n }\n\n return {\n fieldConfig: buildFieldConfig(\n {\n desc: field,\n fieldRules: itemRules,\n source: \"proto\",\n },\n {},\n getMessageDescription(field.message, context)\n ),\n key: \"value\",\n required: false,\n schema: parseProtoSchemaInternal(\n field.message,\n context.annotations,\n context.secretScope,\n context.ancestors,\n context.operation\n ).fields,\n type: \"object\",\n };\n}\n\nfunction buildArrayField(\n field: ListField,\n rules: FieldRules,\n context: ProtoParserContext\n): ParsedProtoField {\n const repeatedRules =\n rules.type.case === \"repeated\" ? rules.type.value : undefined;\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n maxItems: bigIntToNumber(repeatedRules?.maxItems),\n minItems: bigIntToNumber(repeatedRules?.minItems),\n source: \"proto\",\n },\n field\n ),\n {},\n getFieldDescription(field, context)\n ),\n key: field.localName,\n required: Boolean(rules.required || repeatedRules?.minItems),\n schema: [buildListItemField(field, context, repeatedRules?.items)],\n type: \"array\",\n };\n}\n\nfunction buildMapKeyField(\n field: MapField,\n rules: FieldRules | undefined,\n context: ProtoParserContext\n): ParsedProtoField {\n const syntheticField = cloneField(field, {\n fieldKind: \"scalar\",\n localName: \"key\",\n oneof: undefined,\n scalar: field.mapKey,\n });\n\n if (field.mapKey === ScalarType.BOOL) {\n return buildBooleanField(\n syntheticField,\n rules ?? getFieldRules(field),\n context\n );\n }\n if (field.mapKey === ScalarType.STRING) {\n return buildStringField(\n syntheticField,\n rules ?? getFieldRules(field),\n context\n );\n }\n return buildNumberField(\n syntheticField,\n rules ?? getFieldRules(field),\n context\n );\n}\n\nfunction buildMapValueField(\n field: MapField,\n rules: FieldRules | undefined,\n context: ProtoParserContext\n): ParsedProtoField {\n const syntheticField = cloneField(field, {\n localName: \"value\",\n });\n\n if (field.mapKind === \"scalar\") {\n if (field.scalar === ScalarType.STRING) {\n return buildStringField(\n syntheticField,\n rules ?? getFieldRules(field),\n context\n );\n }\n if (field.scalar === ScalarType.BOOL) {\n return buildBooleanField(\n syntheticField,\n rules ?? getFieldRules(field),\n context\n );\n }\n if (field.scalar === ScalarType.BYTES) {\n return buildBytesField(\n syntheticField,\n rules ?? getFieldRules(field),\n context\n );\n }\n return buildNumberField(\n syntheticField,\n rules ?? getFieldRules(field),\n context\n );\n }\n\n if (field.mapKind === \"enum\") {\n return {\n fieldConfig: buildFieldConfig({\n desc: field,\n fieldRules: rules,\n source: \"proto\",\n }),\n key: \"value\",\n options: buildEnumOptions(field.enum.values, field.enum.name),\n required: false,\n type: \"select\",\n };\n }\n\n return buildMessageField(\n syntheticField as MessageField,\n rules ?? getFieldRules(field),\n context\n );\n}\n\nfunction buildMapField(\n field: MapField,\n rules: FieldRules,\n context: ProtoParserContext\n): ParsedProtoField {\n const mapRules = rules.type.case === \"map\" ? rules.type.value : undefined;\n const keyField = buildMapKeyField(field, mapRules?.keys, context);\n const valueField = buildMapValueField(field, mapRules?.values, context);\n\n return {\n fieldConfig: buildFieldConfig(\n withFieldUi(\n {\n desc: field,\n fieldRules: rules,\n keyField,\n maxPairs: bigIntToNumber(mapRules?.maxPairs),\n minPairs: bigIntToNumber(mapRules?.minPairs),\n source: \"proto\",\n valueField,\n },\n field\n ),\n {},\n getFieldDescription(field, context)\n ),\n key: field.localName,\n required: Boolean(rules.required || mapRules?.minPairs),\n schema: [keyField, valueField],\n type: \"map\",\n };\n}\n\nfunction buildOneofField(\n oneof: DescOneof,\n context: ProtoParserContext\n): ParsedProtoField {\n const oneofRules = getOneofRules(oneof);\n return attachRenderHints({\n fieldConfig: buildFieldConfig(\n withOneofUi(\n {\n oneof,\n oneofRules,\n source: \"proto\",\n },\n oneof\n ),\n {},\n getOneofDescription(oneof, context)\n ),\n key: oneof.localName,\n required: oneofRules.required,\n schema: oneof.fields.map((field) => buildProtoField(field, context)),\n type: \"oneof\",\n });\n}\n\nfunction buildProtoField(\n field: DescField,\n context: ProtoParserContext\n): ParsedProtoField {\n const rules = getFieldRules(field);\n\n let result: ParsedProtoField;\n switch (field.fieldKind) {\n case \"scalar\": {\n if (field.scalar === ScalarType.STRING) {\n result = buildStringField(field, rules, context);\n break;\n }\n if (field.scalar === ScalarType.BOOL) {\n result = buildBooleanField(field, rules, context);\n break;\n }\n if (field.scalar === ScalarType.BYTES) {\n result = buildBytesField(field, rules, context);\n break;\n }\n result = buildNumberField(field, rules, context);\n break;\n }\n case \"enum\":\n result = buildEnumField(field, rules, context);\n break;\n case \"message\":\n result = buildMessageField(field, rules, context);\n break;\n case \"list\":\n result = buildArrayField(field, rules, context);\n break;\n case \"map\":\n result = buildMapField(field, rules, context);\n break;\n default:\n throw new Error(\n `Unsupported protobuf field kind: ${String((field as DescField).fieldKind)}`\n );\n }\n\n if (result.fieldConfig) {\n const customData = (result.fieldConfig as ProtoFieldConfig).customData;\n if (customData) {\n if (context.secretScope) {\n customData.secretScope = context.secretScope;\n }\n const fieldBehaviors = getProtoFieldBehaviors(field);\n const isIdentifier = fieldBehaviors.includes(FieldBehavior.IDENTIFIER);\n const isImmutable = fieldBehaviors.includes(FieldBehavior.IMMUTABLE);\n customData.fieldBehaviors = fieldBehaviors;\n if (field.proto.options?.deprecated === true) {\n customData.deprecated = true;\n }\n customData.hidden =\n fieldBehaviors.includes(FieldBehavior.OUTPUT_ONLY) ||\n (isIdentifier && context.operation === \"create\");\n customData.identifier = isIdentifier;\n customData.immutable =\n (isImmutable && context.operation !== \"create\") ||\n (isIdentifier && context.operation === \"update\");\n customData.inputOnly = fieldBehaviors.includes(FieldBehavior.INPUT_ONLY);\n customData.resourceReference = getProtoResourceReference(field);\n const messageDesc =\n field.fieldKind === \"message\" ||\n (field.fieldKind === \"list\" && field.listKind === \"message\") ||\n (field.fieldKind === \"map\" && field.mapKind === \"message\")\n ? field.message\n : undefined;\n customData.resource = messageDesc\n ? getProtoResourceMetadata(messageDesc)\n : undefined;\n result.required = Boolean(\n result.required ||\n fieldBehaviors.includes(FieldBehavior.REQUIRED) ||\n (isIdentifier && context.operation === \"update\")\n );\n }\n }\n\n return attachRenderHints(result);\n}\n\nexport function getProtoMessageUiConfig(\n desc: DescMessage\n): ProtoMessageUiConfig | undefined {\n return getProtoMessageUi(desc);\n}\n\nfunction parseProtoSchemaInternal(\n desc: DescMessage,\n annotations: ProtoAnnotations | undefined,\n parentSecretScope: string | undefined,\n ancestors: ReadonlySet,\n operation?: \"create\" | \"update\"\n): ParsedProtoSchema {\n const messageUi = getProtoMessageUi(desc);\n const context: ProtoParserContext = {\n ancestors: new Set([...ancestors, desc.typeName]),\n annotations,\n messageUi,\n operation: operation ?? inferProtoOperation(desc),\n secretScope: messageUi?.secretScope ?? parentSecretScope,\n };\n return {\n fields: desc.members.map((member) =>\n member.kind === \"oneof\"\n ? buildOneofField(member, context)\n : buildProtoField(member, context)\n ),\n };\n}\n\nexport function parseProtoSchema(\n desc: DescMessage,\n annotations = getRegisteredProtoAnnotations(desc),\n parentSecretScope?: string\n): ParsedProtoSchema {\n return parseProtoSchemaInternal(\n desc,\n annotations,\n parentSecretScope,\n new Set(),\n undefined\n );\n}\n\nfunction inferProtoOperation(\n desc: DescMessage\n): \"create\" | \"update\" | undefined {\n const messageName = desc.typeName.split(\".\").at(-1) ?? \"\";\n if (/^Create.+Request$/.test(messageName)) {\n return \"create\";\n }\n if (/^Update.+Request$/.test(messageName)) {\n return \"update\";\n }\n return;\n}\n\nfunction toDateTimeLocalValue(\n timestamp: MessageShape | undefined\n): string | undefined {\n if (!timestamp) {\n return;\n }\n\n const date = timestampDate(timestamp);\n if (Number.isNaN(date.getTime())) {\n return;\n }\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n\n return `${year}-${month}-${day}T${hours}:${minutes}`;\n}\n\nfunction objectHasValues(value: Record): boolean {\n return Object.values(value).some((entry) => {\n if (entry === undefined || entry === null) {\n return false;\n }\n if (typeof entry === \"string\") {\n return entry.trim().length > 0;\n }\n if (Array.isArray(entry)) {\n return entry.length > 0;\n }\n if (typeof entry === \"object\") {\n return isPlainObject(entry) ? objectHasValues(entry) : true;\n }\n return true;\n });\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value);\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n return isPlainObject(value) && Object.values(value).every(isJsonValue);\n}\n\nfunction fieldToFormValue(field: DescField, value: unknown): unknown {\n switch (field.fieldKind) {\n case \"scalar\": {\n if (field.scalar === ScalarType.BYTES) {\n return value instanceof Uint8Array ? base64Encode(value) : undefined;\n }\n if (is64BitScalar(field.scalar)) {\n return typeof value === \"bigint\"\n ? value.toString()\n : (value ?? undefined);\n }\n return value;\n }\n case \"enum\":\n return value;\n case \"message\": {\n if (isWrapperDesc(field.message)) {\n const wrappedScalar = field.message.fields[0]?.scalar;\n if (wrappedScalar === ScalarType.BYTES) {\n return value instanceof Uint8Array ? base64Encode(value) : undefined;\n }\n if (is64BitScalar(wrappedScalar)) {\n return typeof value === \"bigint\"\n ? value.toString()\n : (value ?? undefined);\n }\n return value;\n }\n\n switch (field.message.typeName) {\n case TIMESTAMP_TYPE:\n return toDateTimeLocalValue(\n value as MessageShape | undefined\n );\n case DURATION_TYPE:\n return value\n ? toJsonString(\n DurationSchema,\n value as MessageShape\n ).replace(/\"/g, \"\")\n : undefined;\n case FIELD_MASK_TYPE:\n return isPlainObject(value) &&\n Array.isArray((value as { paths?: unknown[] }).paths)\n ? (value as { paths: string[] }).paths\n : undefined;\n case STRUCT_TYPE:\n if (isMessage(value, StructSchema)) {\n return toJson(StructSchema, value);\n }\n return isPlainObject(value) && isJsonValue(value)\n ? structuredClone(value)\n : undefined;\n case VALUE_TYPE:\n if (isMessage(value, ValueSchema)) {\n return toJson(ValueSchema, value);\n }\n return isJsonValue(value) ? structuredClone(value) : undefined;\n case LIST_VALUE_TYPE:\n if (isMessage(value, ListValueSchema)) {\n return toJson(ListValueSchema, value);\n }\n return Array.isArray(value) && isJsonValue(value)\n ? structuredClone(value)\n : undefined;\n case ANY_TYPE:\n return value && isPlainObject(value)\n ? {\n typeUrl:\n typeof (value as { typeUrl?: unknown }).typeUrl === \"string\"\n ? (value as { typeUrl: string }).typeUrl\n : \"\",\n valueBase64:\n (value as { value?: unknown }).value instanceof Uint8Array\n ? base64Encode((value as { value: Uint8Array }).value)\n : \"\",\n }\n : undefined;\n default:\n return value\n ? messageToFormValues(field.message, value as AnyObject)\n : undefined;\n }\n }\n case \"list\":\n return Array.isArray(value)\n ? value.map((item) => listItemToFormValue(field, item))\n : [];\n case \"map\": {\n if (!isPlainObject(value)) {\n return [];\n }\n return Object.entries(value).map(\n ([key, entryValue]) =>\n ({\n key: mapKeyToFormValue(field, key),\n value: mapValueToFormValue(field, entryValue),\n }) satisfies ProtoMapFormEntry\n );\n }\n default:\n return value;\n }\n}\n\nfunction listItemToFormValue(field: ListField, value: unknown): unknown {\n if (field.listKind === \"message\" && value) {\n if (isWrapperDesc(field.message)) {\n return value;\n }\n return messageToFormValues(field.message, value as AnyObject);\n }\n\n if (field.listKind === \"scalar\" && field.scalar === ScalarType.BYTES) {\n return value instanceof Uint8Array ? base64Encode(value) : undefined;\n }\n\n if (field.listKind === \"scalar\" && is64BitScalar(field.scalar)) {\n return typeof value === \"bigint\" ? value.toString() : value;\n }\n\n return value;\n}\n\nfunction mapValueToFormValue(field: MapField, value: unknown): unknown {\n if (field.mapKind === \"message\" && value) {\n if (isWrapperDesc(field.message)) {\n return value;\n }\n return messageToFormValues(field.message, value as AnyObject);\n }\n\n if (field.mapKind === \"scalar\" && field.scalar === ScalarType.BYTES) {\n return value instanceof Uint8Array ? base64Encode(value) : undefined;\n }\n\n if (field.mapKind === \"scalar\" && is64BitScalar(field.scalar)) {\n return typeof value === \"bigint\" ? value.toString() : value;\n }\n\n return value;\n}\n\nfunction mapKeyToFormValue(\n field: MapField,\n key: string\n): string | number | boolean {\n if (field.mapKey === ScalarType.BOOL) {\n return key === \"true\";\n }\n if (is64BitScalar(field.mapKey) || field.mapKey === ScalarType.STRING) {\n return key;\n }\n return Number(key);\n}\n\nfunction messageToFormValues(\n desc: DescMessage,\n value: AnyObject\n): Record {\n const result: Record = {};\n\n for (const member of desc.members) {\n if (member.kind === \"oneof\") {\n const oneofValue = value[member.localName] as\n | { case?: string; value?: unknown }\n | undefined;\n if (!oneofValue?.case) {\n result[member.localName] = { case: undefined, value: undefined };\n continue;\n }\n\n const activeField = member.fields.find(\n (field) => field.localName === oneofValue.case\n );\n result[member.localName] = {\n case: oneofValue.case,\n value: activeField\n ? fieldToFormValue(activeField, oneofValue.value)\n : oneofValue.value,\n };\n continue;\n }\n\n result[member.localName] = fieldToFormValue(\n member,\n value[member.localName]\n );\n }\n\n return result;\n}\n\nexport function protoToFormValues(\n desc: Desc,\n value?: MessageShape\n): Record {\n const baseValue = (value ?? create(desc)) as AnyObject;\n return messageToFormValues(desc, baseValue);\n}\n\nfunction normalizeBooleanValue(value: unknown): boolean | undefined {\n if (value === undefined || value === null || value === \"\") {\n return;\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n return Boolean(value);\n}\n\nfunction normalizeNumberValue(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") {\n return;\n }\n if (typeof value === \"number\") {\n return Number.isNaN(value) ? undefined : value;\n }\n const parsed = Number(value);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nfunction normalizeFloatingPointValue(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") {\n return;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (value === \"NaN\") {\n return Number.NaN;\n }\n const parsed = Number(value);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nfunction normalizeBigIntValue(value: unknown): bigint | undefined {\n if (value === undefined || value === null || value === \"\") {\n return;\n }\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\" && Number.isSafeInteger(value)) {\n return BigInt(value);\n }\n if (typeof value === \"string\") {\n try {\n return BigInt(value);\n } catch {\n return;\n }\n }\n return;\n}\n\nfunction normalizeScalarValue(field: DescField, value: unknown): unknown {\n if (field.scalar === ScalarType.STRING) {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined || value === null) {\n return;\n }\n\n return String(value);\n }\n if (field.scalar === ScalarType.BOOL) {\n return normalizeBooleanValue(value);\n }\n if (field.scalar === ScalarType.BYTES) {\n if (typeof value === \"string\") {\n return base64Decode(value);\n }\n\n return value instanceof Uint8Array ? value : undefined;\n }\n if (field.scalar === ScalarType.FLOAT || field.scalar === ScalarType.DOUBLE) {\n return normalizeFloatingPointValue(value);\n }\n if (is64BitScalar(field.scalar)) {\n return normalizeBigIntValue(value);\n }\n return normalizeNumberValue(value);\n}\n\nfunction normalizeMessageFieldValue(\n field: MessageField,\n value: unknown,\n options: ProtoConversionOptions,\n path: readonly string[]\n): unknown {\n if (isWrapperDesc(field.message)) {\n const wrappedScalar = field.message.fields[0]?.scalar;\n const wrappedField = cloneField(field, {\n fieldKind: \"scalar\",\n scalar: wrappedScalar,\n });\n return normalizeScalarValue(wrappedField, value);\n }\n\n switch (field.message.typeName) {\n case TIMESTAMP_TYPE:\n return typeof value === \"string\" && value\n ? timestampFromDate(new Date(value))\n : undefined;\n case DURATION_TYPE:\n return typeof value === \"string\" && value\n ? fromJsonString(DurationSchema, JSON.stringify(value))\n : undefined;\n case FIELD_MASK_TYPE:\n return Array.isArray(value) && value.length > 0\n ? {\n paths: value.filter(\n (entry): entry is string => typeof entry === \"string\"\n ),\n }\n : undefined;\n case STRUCT_TYPE:\n return value === undefined\n ? undefined\n : fromJson(StructSchema, (value ?? {}) as JsonValue);\n case VALUE_TYPE:\n return value === undefined\n ? undefined\n : fromJson(ValueSchema, value as JsonValue);\n case LIST_VALUE_TYPE:\n return value === undefined\n ? undefined\n : fromJson(ListValueSchema, value as JsonValue);\n case ANY_TYPE: {\n const anyValue = isPlainObject(value)\n ? (value as ProtoAnyFormValue)\n : undefined;\n if (!(anyValue?.typeUrl || anyValue?.valueBase64)) {\n return;\n }\n return {\n typeUrl: anyValue?.typeUrl ?? \"\",\n value: base64Decode(anyValue?.valueBase64 ?? \"\"),\n };\n }\n default: {\n const nested = isPlainObject(value)\n ? messageToProtoInit(field.message, value, options, path)\n : undefined;\n if (!(nested && objectHasValues(nested))) {\n return tracksPresence(field) ? undefined : nested;\n }\n return nested;\n }\n }\n}\n\nfunction listItemToProtoValue(\n field: ListField,\n value: unknown,\n options: ProtoConversionOptions,\n path: readonly string[]\n): unknown {\n if (field.listKind === \"scalar\") {\n return normalizeScalarValue(\n cloneField(field, {\n fieldKind: \"scalar\",\n oneof: undefined,\n }),\n value\n );\n }\n if (field.listKind === \"enum\") {\n return value === undefined || value === \"\" ? undefined : Number(value);\n }\n if (isWrapperDesc(field.message)) {\n return value;\n }\n return isPlainObject(value)\n ? messageToProtoInit(field.message, value, options, path)\n : undefined;\n}\n\nfunction mapValueToProtoValue(\n field: MapField,\n value: unknown,\n options: ProtoConversionOptions,\n path: readonly string[]\n): unknown {\n if (field.mapKind === \"scalar\") {\n return normalizeScalarValue(\n cloneField(field, {\n fieldKind: \"scalar\",\n oneof: undefined,\n }),\n value\n );\n }\n if (field.mapKind === \"enum\") {\n return value === undefined || value === \"\" ? undefined : Number(value);\n }\n if (isWrapperDesc(field.message)) {\n return value;\n }\n return isPlainObject(value)\n ? messageToProtoInit(field.message, value, options, path)\n : undefined;\n}\n\nfunction repeatedListEntries(\n field: ListField,\n value: unknown,\n options: ProtoConversionOptions,\n path: readonly string[]\n): unknown[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const policy = options.emptyRepeatedStringPolicies?.[path.join(\".\")];\n if (\n field.listKind !== \"scalar\" ||\n field.scalar !== ScalarType.STRING ||\n policy === \"preserve\"\n ) {\n return value;\n }\n return value.filter(\n (entry) => typeof entry !== \"string\" || entry.trim().length > 0\n );\n}\n\nfunction fieldToProtoValue(\n field: DescField,\n value: unknown,\n options: ProtoConversionOptions,\n path: readonly string[]\n): unknown {\n switch (field.fieldKind) {\n case \"scalar\":\n return normalizeScalarValue(field, value);\n case \"enum\":\n return value === undefined || value === \"\" ? undefined : Number(value);\n case \"message\":\n return normalizeMessageFieldValue(field, value, options, path);\n case \"list\":\n return repeatedListEntries(field, value, options, path).map((entry) =>\n listItemToProtoValue(field, entry, options, path)\n );\n case \"map\":\n return Array.isArray(value)\n ? Object.fromEntries(\n value\n .map((entry) => {\n if (!isPlainObject(entry)) {\n return null;\n }\n const mapKey = entry.key;\n if (mapKey === undefined || mapKey === null || mapKey === \"\") {\n return null;\n }\n return [\n String(mapKey),\n mapValueToProtoValue(field, entry.value, options, path),\n ] as const;\n })\n .filter(\n (entry): entry is readonly [string, unknown] => entry !== null\n )\n )\n : {};\n default:\n return value;\n }\n}\n\nfunction messageToProtoInit(\n desc: DescMessage,\n value: AnyObject,\n options: ProtoConversionOptions,\n path: readonly string[]\n): Record {\n const result: Record = {};\n\n for (const member of desc.members) {\n if (member.kind === \"oneof\") {\n const oneofValue = value[member.localName] as\n | { case?: string; value?: unknown }\n | undefined;\n if (!oneofValue?.case) {\n continue;\n }\n\n const activeField = member.fields.find(\n (field) => field.localName === oneofValue.case\n );\n if (!activeField) {\n continue;\n }\n\n result[member.localName] = {\n case: oneofValue.case,\n value: fieldToProtoValue(\n activeField,\n oneofValue.value,\n options,\n [...path, member.localName, activeField.localName]\n ),\n };\n continue;\n }\n\n const normalized = fieldToProtoValue(\n member,\n value[member.localName],\n options,\n [...path, member.localName]\n );\n if (normalized === undefined && tracksPresence(member)) {\n continue;\n }\n result[member.localName] = normalized;\n }\n\n return result;\n}\n\nexport function formValuesToProtoInit(\n desc: Desc,\n values: Record,\n options: ProtoConversionOptions = {}\n): MessageInitShape {\n return messageToProtoInit(desc, values, options, []) as MessageInitShape;\n}\n\nfunction knownMessageValuesEqual(\n desc: DescMessage,\n left: AnyObject,\n right: AnyObject\n): boolean {\n return toJsonString(desc, left as never) === toJsonString(desc, right as never);\n}\n\nfunction preserveRepeatedMessageUnknownFields(\n desc: DescMessage,\n target: unknown[],\n source: unknown[]\n): void {\n const matchedSourceIndexes = new Set();\n const matchedTargetIndexes = new Set();\n\n for (const [targetIndex, targetValue] of target.entries()) {\n if (!isPlainObject(targetValue)) {\n continue;\n }\n const candidates = source.flatMap((sourceValue, sourceIndex) =>\n !matchedSourceIndexes.has(sourceIndex) &&\n isPlainObject(sourceValue) &&\n knownMessageValuesEqual(desc, targetValue, sourceValue)\n ? [sourceIndex]\n : []\n );\n if (candidates.length !== 1) {\n continue;\n }\n const [sourceIndex] = candidates;\n if (sourceIndex === undefined) {\n continue;\n }\n const sourceValue = source[sourceIndex];\n if (!isPlainObject(sourceValue)) {\n continue;\n }\n const competingTargetCount = target.filter(\n (candidate, candidateIndex) =>\n !matchedTargetIndexes.has(candidateIndex) &&\n isPlainObject(candidate) &&\n knownMessageValuesEqual(desc, candidate, sourceValue)\n ).length;\n if (competingTargetCount !== 1) {\n continue;\n }\n preserveMessageUnknownFields(\n desc,\n targetValue,\n sourceValue\n );\n matchedSourceIndexes.add(sourceIndex);\n matchedTargetIndexes.add(targetIndex);\n }\n\n if (target.length !== source.length) {\n return;\n }\n\n for (const [index, targetValue] of target.entries()) {\n const sourceValue = source[index];\n if (\n matchedTargetIndexes.has(index) ||\n matchedSourceIndexes.has(index) ||\n !isPlainObject(targetValue) ||\n !isPlainObject(sourceValue)\n ) {\n continue;\n }\n preserveMessageUnknownFields(desc, targetValue, sourceValue);\n }\n}\n\nfunction preserveFieldUnknownFields(\n field: DescField,\n target: unknown,\n source: unknown\n): void {\n switch (field.fieldKind) {\n case \"message\":\n if (isPlainObject(target) && isPlainObject(source)) {\n preserveMessageUnknownFields(field.message, target, source);\n }\n return;\n case \"list\":\n if (\n field.listKind === \"message\" &&\n Array.isArray(target) &&\n Array.isArray(source)\n ) {\n preserveRepeatedMessageUnknownFields(field.message, target, source);\n }\n return;\n case \"map\":\n if (\n field.mapKind === \"message\" &&\n isPlainObject(target) &&\n isPlainObject(source)\n ) {\n for (const [key, targetValue] of Object.entries(target)) {\n const sourceValue = source[key];\n if (isPlainObject(targetValue) && isPlainObject(sourceValue)) {\n preserveMessageUnknownFields(\n field.message,\n targetValue,\n sourceValue\n );\n }\n }\n }\n return;\n case \"enum\":\n case \"scalar\":\n return;\n default:\n field satisfies never;\n }\n}\n\nfunction preserveMessageUnknownFields(\n desc: DescMessage,\n target: AnyObject,\n source: AnyObject\n): void {\n if (source.$unknown) {\n target.$unknown = structuredClone(source.$unknown);\n }\n\n for (const member of desc.members) {\n if (member.kind === \"oneof\") {\n const targetOneof = target[member.localName];\n const sourceOneof = source[member.localName];\n if (!(isPlainObject(targetOneof) && isPlainObject(sourceOneof))) {\n continue;\n }\n const targetCase = targetOneof.case;\n if (\n typeof targetCase !== \"string\" ||\n targetCase !== sourceOneof.case\n ) {\n continue;\n }\n const activeField = member.fields.find(\n (field) => field.localName === targetCase\n );\n if (activeField) {\n preserveFieldUnknownFields(\n activeField,\n targetOneof.value,\n sourceOneof.value\n );\n }\n continue;\n }\n\n preserveFieldUnknownFields(\n member,\n target[member.localName],\n source[member.localName]\n );\n }\n}\n\n/**\n * Returns a validated protobuf message with unknown wire fields restored from\n * the corresponding surviving nodes in its edit source. The target is cloned\n * when a source is present.\n */\nexport function preserveProtoMessageSource(\n desc: Desc,\n target: MessageShape,\n source?: MessageShape\n): MessageShape {\n if (!source) {\n return target;\n }\n const message = clone(desc, target);\n preserveMessageUnknownFields(desc, message, source);\n return message;\n}\n\n/**\n * Builds an edited message from form values while retaining unknown wire\n * fields from the parsed source message. Unknown fields are not part of the\n * form model, so reconstructing a message from values alone would drop them.\n */\nexport function formValuesToProto(\n desc: Desc,\n values: Record,\n source?: MessageShape,\n options: ProtoConversionOptions = {}\n): MessageShape {\n const message = create(desc, formValuesToProtoInit(desc, values, options));\n if (source) {\n preserveMessageUnknownFields(desc, message, source);\n }\n return message;\n}\n\nexport function protoFormValuesToPayload(\n desc: Desc,\n values: Record,\n options: ProtoConversionOptions = {}\n): unknown {\n try {\n const init = formValuesToProtoInit(desc, values, options);\n const message = create(desc, init);\n // `alwaysEmitImplicit: true` forces every scalar / message field to\n // appear in the serialized JSON even when the form hasn't been\n // touched. Without it, an untouched form renders as `{}` in the\n // summary panel — so users have to start typing just to see the\n // request shape. Emitting defaults gives them the full schema\n // skeleton up front and reduces the interactions needed to\n // visualise what will actually be sent.\n return toJson(desc, message, { alwaysEmitImplicit: true }) as unknown;\n } catch {\n try {\n return formValuesToProtoInit(desc, values, options);\n } catch {\n return values;\n }\n }\n}\n\nexport function protoPayloadToFormValues(\n desc: Desc,\n payload: unknown\n): FormValues | undefined {\n try {\n const message = fromJson(desc, (payload ?? {}) as JsonValue);\n return protoToFormValues(desc, message);\n } catch {\n return;\n }\n}\n\nfunction normalizeIssuePath(\n desc: DescMessage,\n issue: SchemaIssue,\n values: Record\n): (string | number)[] {\n if (!issue.path || issue.path.length === 0) {\n return [];\n }\n\n const normalizedPath: (string | number)[] = [];\n let currentDesc: DescMessage | undefined = desc;\n\n for (let index = 0; index < issue.path.length; index += 1) {\n const segment: StandardSchemaV1.PathSegment | PropertyKey | undefined =\n issue.path[index];\n const key =\n typeof segment === \"object\" && segment && \"key\" in segment\n ? segment.key\n : segment;\n\n if (typeof key === \"number\") {\n normalizedPath.push(key);\n continue;\n }\n\n if (!currentDesc || typeof key !== \"string\") {\n normalizedPath.push(String(key));\n continue;\n }\n\n const matchedField: DescField | undefined = currentDesc.field[key];\n const oneof = currentDesc.oneofs.find(\n (candidate) => candidate.localName === key\n );\n\n if (oneof) {\n normalizedPath.push(oneof.localName);\n currentDesc = undefined;\n continue;\n }\n\n if (!matchedField) {\n normalizedPath.push(key);\n currentDesc = undefined;\n continue;\n }\n\n normalizedPath.push(matchedField.localName);\n\n if (matchedField.fieldKind === \"map\") {\n const nextSegment = issue.path[index + 1];\n const mapKey =\n typeof nextSegment === \"object\" && nextSegment && \"key\" in nextSegment\n ? nextSegment.key\n : nextSegment;\n const mapEntries = Array.isArray(values[matchedField.localName])\n ? (values[matchedField.localName] as ProtoMapFormEntry[])\n : [];\n const mapIndex =\n typeof mapKey === \"string\"\n ? mapEntries.findIndex((entry) => entry.key === mapKey)\n : -1;\n\n if (\n mapIndex !== -1 &&\n issue.path.length > index + 2 &&\n matchedField.mapKind === \"message\"\n ) {\n normalizedPath.push(mapIndex, \"value\");\n currentDesc = matchedField.message;\n index += 1;\n continue;\n }\n\n // If the protovalidate key no longer matches a rendered map entry, keep the error on the\n // map field itself instead of targeting a stale array index in RHF state.\n return normalizedPath;\n }\n\n if (matchedField.fieldKind === \"message\") {\n if (\n isWrapperDesc(matchedField.message) ||\n PROTO_JSON_FALLBACK_TYPES.includes(matchedField.message.typeName)\n ) {\n return normalizedPath;\n }\n currentDesc = matchedField.message;\n continue;\n }\n\n if (\n matchedField.fieldKind === \"list\" &&\n matchedField.listKind === \"message\"\n ) {\n if (\n isWrapperDesc(matchedField.message) ||\n PROTO_JSON_FALLBACK_TYPES.includes(matchedField.message.typeName)\n ) {\n return normalizedPath;\n }\n // Guard against stale array indices: if the next segment is a numeric index,\n // verify the array still has that many entries. If not, anchor the error on\n // the list field itself (same fallback strategy as map fields).\n const nextSegment = issue.path[index + 1];\n const nextKey =\n typeof nextSegment === \"object\" && nextSegment && \"key\" in nextSegment\n ? nextSegment.key\n : nextSegment;\n if (typeof nextKey === \"number\") {\n const listEntries = values[matchedField.localName];\n if (!Array.isArray(listEntries) || nextKey >= listEntries.length) {\n return normalizedPath;\n }\n }\n currentDesc = matchedField.message;\n continue;\n }\n\n currentDesc = undefined;\n }\n\n return normalizedPath;\n}\n\n/** A Standard Schema issue whose path is already normalized to form paths. */\nexport interface NormalizedProtoIssue {\n message: string;\n path: (string | number)[];\n}\n\nexport type NormalizedProtoValidationResult =\n | StandardSchemaV1.SuccessResult\n | { readonly issues: readonly NormalizedProtoIssue[] };\n\nexport interface ProtoValidationContext {\n /**\n * Restrict pathful issues to fields overlapping this mask. Message-level\n * issues remain visible because they cannot be attributed safely.\n */\n validationMask?: FieldMask;\n}\n\nconst SIGNED_32_SCALARS = [\n ScalarType.INT32,\n ScalarType.SINT32,\n ScalarType.SFIXED32,\n];\nconst UNSIGNED_32_SCALARS = [ScalarType.UINT32, ScalarType.FIXED32];\nconst SIGNED_64_SCALARS = [\n ScalarType.INT64,\n ScalarType.SINT64,\n ScalarType.SFIXED64,\n];\nconst UNSIGNED_64_SCALARS = [ScalarType.UINT64, ScalarType.FIXED64];\nconst SIGNED_32_MIN = -2_147_483_648;\nconst SIGNED_32_MAX = 2_147_483_647;\nconst UNSIGNED_32_MAX = 4_294_967_295;\nconst SIGNED_64_MIN = -9_223_372_036_854_775_808n;\nconst SIGNED_64_MAX = 9_223_372_036_854_775_807n;\nconst UNSIGNED_64_MAX = 18_446_744_073_709_551_615n;\n\nfunction getScalarConversionIssue(\n field: ScalarField,\n value: unknown\n): string | undefined {\n if (value === undefined || value === null || value === \"\") {\n return;\n }\n if (SIGNED_32_SCALARS.includes(field.scalar)) {\n const numericValue = normalizeNumberValue(value);\n if (\n numericValue === undefined ||\n !Number.isInteger(numericValue) ||\n numericValue < SIGNED_32_MIN ||\n numericValue > SIGNED_32_MAX\n ) {\n return \"Enter a signed 32-bit integer.\";\n }\n }\n if (UNSIGNED_32_SCALARS.includes(field.scalar)) {\n const numericValue = normalizeNumberValue(value);\n if (\n numericValue === undefined ||\n !Number.isInteger(numericValue) ||\n numericValue < 0 ||\n numericValue > UNSIGNED_32_MAX\n ) {\n return \"Enter an unsigned 32-bit integer.\";\n }\n }\n if (SIGNED_64_SCALARS.includes(field.scalar)) {\n const bigintValue = normalizeBigIntValue(value);\n if (\n bigintValue === undefined ||\n bigintValue < SIGNED_64_MIN ||\n bigintValue > SIGNED_64_MAX\n ) {\n return \"Enter a signed 64-bit integer.\";\n }\n }\n if (UNSIGNED_64_SCALARS.includes(field.scalar)) {\n const bigintValue = normalizeBigIntValue(value);\n if (\n bigintValue === undefined ||\n bigintValue < 0n ||\n bigintValue > UNSIGNED_64_MAX\n ) {\n return \"Enter an unsigned 64-bit integer.\";\n }\n }\n return;\n}\n\nfunction getMessageConversionIssue(\n field: MessageField,\n value: unknown\n): string | undefined {\n if (value === undefined || value === null || value === \"\") {\n return;\n }\n if (field.message.typeName === TIMESTAMP_TYPE) {\n return typeof value === \"string\" && !Number.isNaN(new Date(value).getTime())\n ? undefined\n : \"Enter a valid date and time.\";\n }\n if (field.message.typeName === DURATION_TYPE) {\n if (typeof value !== \"string\") {\n return \"Enter a valid duration.\";\n }\n try {\n fromJsonString(DurationSchema, JSON.stringify(value));\n return;\n } catch {\n return \"Enter a valid duration.\";\n }\n }\n if (field.message.typeName !== ANY_TYPE || !isPlainObject(value)) {\n return;\n }\n const valueBase64 = (value as ProtoAnyFormValue).valueBase64;\n if (valueBase64 === undefined || valueBase64 === \"\") {\n return;\n }\n try {\n base64Decode(valueBase64);\n return;\n } catch {\n return \"Enter valid base64 data.\";\n }\n}\n\nfunction getMapConversionIssue(value: unknown): string | undefined {\n if (!Array.isArray(value)) {\n return;\n }\n const keys = value.flatMap((entry) => {\n if (!isPlainObject(entry)) {\n return [];\n }\n const key = entry.key;\n return key === undefined || key === null || key === \"\" ? [] : [String(key)];\n });\n return new Set(keys).size === keys.length\n ? undefined\n : \"Map keys must be unique.\";\n}\n\nfunction getFormConversionIssues(\n desc: DescMessage,\n values: Record\n): NormalizedProtoIssue[] {\n return desc.members.flatMap((member) => {\n if (member.kind === \"oneof\") {\n return [];\n }\n let message: string | undefined;\n if (member.fieldKind === \"scalar\") {\n message = getScalarConversionIssue(member, values[member.localName]);\n } else if (member.fieldKind === \"message\") {\n message = getMessageConversionIssue(member, values[member.localName]);\n } else if (member.fieldKind === \"map\") {\n message = getMapConversionIssue(values[member.localName]);\n }\n return message ? [{ message, path: [member.localName] }] : [];\n });\n}\n\nfunction toFailureResult(error: unknown): {\n readonly issues: readonly NormalizedProtoIssue[];\n} {\n return {\n issues: [\n {\n message:\n error instanceof Error\n ? error.message\n : \"Failed to validate protobuf form values.\",\n path: [],\n },\n ],\n };\n}\n\nfunction normalizeValidationResult(\n desc: Desc,\n values: Record,\n validationResult: StandardSchemaV1.Result>,\n fallbackValue: MessageShape,\n context: ProtoValidationContext\n): NormalizedProtoValidationResult> {\n if (validationResult.issues) {\n const issues = filterValidationIssues(\n desc,\n validationResult.issues.map((issue) => ({\n message: issue.message,\n path: normalizeIssuePath(desc, issue, values),\n })),\n context.validationMask\n );\n if (issues.length === 0) {\n return { value: fallbackValue as MessageValidType };\n }\n return {\n issues,\n };\n }\n\n return validationResult;\n}\n\nfunction filterValidationIssues(\n desc: DescMessage,\n issues: readonly NormalizedProtoIssue[],\n validationMask?: FieldMask\n): readonly NormalizedProtoIssue[] {\n if (!validationMask || validationMask.paths.includes(\"*\")) {\n return issues;\n }\n\n const formPaths = validationMask.paths.flatMap((path) => {\n const formPath = protoPathToFormPath(desc, path);\n return formPath ? [formPath] : [];\n });\n\n return issues.filter((issue) => {\n if (issue.path.length === 0) {\n return true;\n }\n const issuePath = issue.path.join(\".\");\n return formPaths.some(\n (formPath) =>\n issuePath === formPath ||\n issuePath.startsWith(`${formPath}.`) ||\n formPath.startsWith(`${issuePath}.`)\n );\n });\n}\n\n/**\n * Shared validation pipeline: form values → proto init → `create()` →\n * protovalidate Standard Schema → issues re-pathed to FORM paths\n * (camelCase keys, oneofs flattened, map keys resolved to entry indices).\n *\n * Both `createProtoFormSchema` and `ProtoProvider.validateSchema` (and the\n * registry's react-hook-form resolver) flow through this single function.\n */\nexport function validateFormValuesAgainstProtoSchema(\n desc: Desc,\n values: Record,\n schema: StandardSchemaV1, MessageValidType>,\n options: ProtoConversionOptions = {},\n source?: MessageShape,\n context: ProtoValidationContext = {}\n):\n | NormalizedProtoValidationResult>\n | Promise>> {\n try {\n const conversionIssues = filterValidationIssues(\n desc,\n getFormConversionIssues(desc, values),\n context.validationMask\n );\n if (conversionIssues.length > 0) {\n return { issues: conversionIssues };\n }\n const message = formValuesToProto(desc, values, source, options);\n const validationResult = schema[\"~standard\"].validate(message);\n\n if (validationResult instanceof Promise) {\n return validationResult\n .then((result) =>\n normalizeValidationResult(desc, values, result, message, context)\n )\n .catch((error: unknown) => toFailureResult(error));\n }\n\n return normalizeValidationResult(\n desc,\n values,\n validationResult,\n message,\n context\n );\n } catch (error) {\n return toFailureResult(error);\n }\n}\n\nfunction mapResultToSchemaValidation(\n result: NormalizedProtoValidationResult>\n): SchemaValidation {\n if (result.issues) {\n return {\n errors: result.issues.map((issue) => ({\n message: issue.message,\n path: issue.path,\n })),\n success: false,\n };\n }\n\n return {\n data: result.value,\n success: true,\n };\n}\n\nfunction validateProtoValues(\n desc: Desc,\n values: Record,\n schema: StandardSchemaV1, MessageValidType>,\n options: ProtoConversionOptions\n): SchemaValidation | Promise {\n const result = validateFormValuesAgainstProtoSchema(\n desc,\n values,\n schema,\n options\n );\n if (result instanceof Promise) {\n return result.then((resolved) =>\n mapResultToSchemaValidation(resolved)\n );\n }\n return mapResultToSchemaValidation(result);\n}\n\nexport class ProtoProvider\n implements SchemaProvider>\n{\n private readonly desc: Desc;\n private readonly options: ProtoFormOptions;\n private readonly parsedSchema: ParsedProtoSchema;\n private readonly standardSchema: StandardSchemaV1<\n MessageShape,\n MessageValidType\n >;\n\n constructor(desc: Desc, options: ProtoFormOptions = {}) {\n this.desc = desc;\n this.options = options;\n this.parsedSchema = parseProtoSchema(desc);\n this.standardSchema = createDescriptorAwareStandardSchema(desc, options);\n }\n\n parseSchema(): ParsedSchema {\n return this.parsedSchema;\n }\n\n validateSchema(values: Record): SchemaValidation {\n const validationResult = validateProtoValues(\n this.desc,\n values,\n this.standardSchema,\n this.options\n );\n if (validationResult instanceof Promise) {\n return {\n errors: [\n {\n message:\n // Provider-based AutoForm consumers expect a synchronous result. Async protovalidate\n // flows should go through createProtoResolver(), which RHF can await.\n \"ProtoProvider does not support async validation rules. Use createProtoResolver() for async protovalidate flows.\",\n path: [],\n },\n ],\n success: false,\n };\n }\n return validationResult;\n }\n\n getDefaultValues(): Record {\n return protoToFormValues(this.desc);\n }\n\n getMessageDescriptor(): Desc {\n return this.desc;\n }\n}\n\nexport function isProtoProvider(value: unknown): value is ProtoProvider {\n return value instanceof ProtoProvider;\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/ui-options.ts", "content": "import {\n create,\n type DescField,\n type DescMessage,\n type DescOneof,\n getExtension,\n} from \"@bufbuild/protobuf\";\nimport {\n FieldOptionsSchema,\n MessageOptionsSchema,\n OneofOptionsSchema,\n} from \"@bufbuild/protobuf/wkt\";\n\nimport type {\n FieldUiOptions,\n MessageUiOptions,\n OneofUiOptions,\n UiRule as ProtoUiRuleMessage,\n} from \"./gen/auto_form_ui_pb.js\";\nimport {\n ControlType,\n DataProviderId,\n field_ui,\n message_ui,\n oneof_ui,\n} from \"./gen/auto_form_ui_pb.js\";\n\nexport interface ProtoUiRule {\n expression: string;\n id?: string;\n message?: string;\n}\n\nexport interface ProtoFieldUiConfig {\n control?: string;\n /** Named data source for dropdown-style controls. Matches a key in\n * the UI-side `AutoForm.dataProviders` registry. Snake-cased string\n * derived from the proto `DataProviderId` enum. */\n dataProvider?: string;\n /** Concise one-liner shown directly below the input field. */\n description?: string;\n disabledWhen?: ProtoUiRule[];\n /** Upstream doc link — rendered as a \"Learn more\" anchor next to\n * the field's help text. Useful for vendor model catalogs, region\n * lists, API parameter references, etc. where keeping the canonical\n * list inline would be stale the moment the vendor ships a change. */\n docsUrl?: string;\n /** When `control === 'json'`: render a drag-and-drop zone alongside\n * the editor. */\n dropzone?: boolean;\n example?: string;\n /** Detailed help text for tooltip (hover the info icon). */\n help?: string;\n placeholder?: string;\n sensitive?: boolean;\n /** Stable step id used by opt-in multi-step forms. */\n step?: string;\n summaryLabel?: string;\n visibleWhen?: ProtoUiRule[];\n}\n\nexport interface ProtoMessageUiConfig {\n /** One-line subtitle rendered under the title. */\n description?: string;\n secretScope?: string;\n /** Root-level title rendered above the AutoForm body. */\n title?: string;\n}\n\nfunction normalizeRule(rule: ProtoUiRuleMessage): ProtoUiRule | undefined {\n if (!rule.expression) {\n return;\n }\n\n return {\n expression: rule.expression,\n id: rule.id || undefined,\n message: rule.message || undefined,\n };\n}\n\nfunction normalizeRules(\n rules: ProtoUiRuleMessage[] | undefined\n): ProtoUiRule[] | undefined {\n if (!rules?.length) {\n return;\n }\n\n const normalized: ProtoUiRule[] = [];\n for (const rule of rules) {\n const nextRule = normalizeRule(rule);\n if (nextRule) {\n normalized.push(nextRule);\n }\n }\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction controlTypeToFieldType(control: ControlType): string | undefined {\n switch (control) {\n case ControlType.TEXT:\n return \"string\";\n case ControlType.TEXTAREA:\n return \"textarea\";\n case ControlType.PASSWORD:\n return \"password\";\n case ControlType.EMAIL:\n return \"email\";\n case ControlType.URL:\n return \"url\";\n case ControlType.CURRENCY:\n return \"currency\";\n case ControlType.CHECKBOX:\n return \"checkbox\";\n case ControlType.SWITCH:\n return \"switch\";\n case ControlType.TOGGLE:\n return \"toggle\";\n case ControlType.RADIO_GROUP:\n return \"radio\";\n case ControlType.SELECT:\n return \"select\";\n case ControlType.COMBOBOX:\n return \"combobox\";\n case ControlType.MULTI_SELECT:\n return \"multiselect\";\n case ControlType.KEY_VALUE:\n return \"keyValue\";\n case ControlType.JSON:\n return \"json\";\n case ControlType.DATE:\n return \"date\";\n case ControlType.TIMESTAMP:\n return \"timestamp\";\n case ControlType.SLIDER:\n return \"slider\";\n default:\n return;\n }\n}\n\n/**\n * Convert the generated `DataProviderId` enum value (e.g. `AWS_REGIONS`)\n * into the snake-cased string key used in the UI-side registry\n * (`aws_regions`). Returns `undefined` for `UNSPECIFIED` — the annotation\n * was not set.\n */\nfunction dataProviderIdToKey(id: DataProviderId): string | undefined {\n if (id === DataProviderId.UNSPECIFIED) {\n return;\n }\n // Generated enum member names are already uppercase snake-case\n // (e.g. `AWS_REGIONS`); just lowercase. The UI registry keys use\n // the lowercase form so the mapping is lossless and obvious.\n const name = DataProviderId[id];\n return typeof name === \"string\" ? name.toLowerCase() : undefined;\n}\n\n/**\n * Safely extract the `description` field from proto UI options.\n * The field was added to the proto schema but may not yet appear in the\n * generated TypeScript types until the next `./taskw generate` run.\n */\nfunction extractDescription(\n options: FieldUiOptions | OneofUiOptions\n): string | undefined {\n if (\"description\" in options) {\n const value = options.description;\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n }\n return;\n}\n\nfunction isFieldUiEmpty(options: FieldUiOptions): boolean {\n return !(\n options.control !== ControlType.UNSPECIFIED ||\n options.placeholder ||\n options.example ||\n options.help ||\n (\"description\" in options && options.description) ||\n options.visibleWhen.length > 0 ||\n options.disabledWhen.length > 0 ||\n options.step ||\n options.summaryLabel ||\n options.sensitive ||\n (\"dataProvider\" in options &&\n options.dataProvider !== DataProviderId.UNSPECIFIED) ||\n (\"dropzone\" in options && options.dropzone) ||\n (\"docsUrl\" in options && options.docsUrl)\n );\n}\n\nfunction isOneofUiEmpty(options: OneofUiOptions): boolean {\n return !(\n options.help ||\n (\"description\" in options && options.description) ||\n options.visibleWhen.length > 0 ||\n options.disabledWhen.length > 0 ||\n options.step ||\n options.summaryLabel\n );\n}\n\nfunction isMessageUiEmpty(options: MessageUiOptions): boolean {\n return !(options.secretScope || options.title || options.description);\n}\n\nexport function getProtoMessageUi(\n desc: DescMessage\n): ProtoMessageUiConfig | undefined {\n const options = getExtension(\n desc.proto.options ?? create(MessageOptionsSchema),\n message_ui\n );\n if (isMessageUiEmpty(options)) {\n return;\n }\n\n return {\n description: options.description || undefined,\n secretScope: options.secretScope || undefined,\n title: options.title || undefined,\n };\n}\n\nexport function getProtoFieldUi(\n field: DescField\n): ProtoFieldUiConfig | undefined {\n const options = getExtension(\n field.proto.options ?? create(FieldOptionsSchema),\n field_ui\n );\n if (isFieldUiEmpty(options)) {\n return;\n }\n\n const dataProviderKey =\n \"dataProvider\" in options\n ? dataProviderIdToKey(options.dataProvider)\n : undefined;\n const dropzone =\n \"dropzone\" in options && typeof options.dropzone === \"boolean\"\n ? options.dropzone\n : undefined;\n const docsUrl =\n \"docsUrl\" in options &&\n typeof options.docsUrl === \"string\" &&\n options.docsUrl\n ? options.docsUrl\n : undefined;\n\n return {\n control: controlTypeToFieldType(options.control),\n dataProvider: dataProviderKey,\n description: extractDescription(options),\n disabledWhen: normalizeRules(options.disabledWhen),\n docsUrl,\n dropzone: dropzone || undefined,\n example: options.example || undefined,\n help: options.help || undefined,\n placeholder: options.placeholder || undefined,\n sensitive:\n options.sensitive ||\n options.control === ControlType.PASSWORD ||\n undefined,\n step: options.step || undefined,\n summaryLabel: options.summaryLabel || undefined,\n visibleWhen: normalizeRules(options.visibleWhen),\n };\n}\n\nexport function getProtoOneofUi(\n oneof: DescOneof\n): ProtoFieldUiConfig | undefined {\n const options = getExtension(\n oneof.proto.options ?? create(OneofOptionsSchema),\n oneof_ui\n );\n if (isOneofUiEmpty(options)) {\n return;\n }\n\n return {\n description: extractDescription(options),\n disabledWhen: normalizeRules(options.disabledWhen),\n help: options.help || undefined,\n step: options.step || undefined,\n summaryLabel: options.summaryLabel || undefined,\n visibleWhen: normalizeRules(options.visibleWhen),\n };\n}\n", "type": "registry:lib" }, { "path": "registry/base-nova/protoform/lib/protobuf-provider/validation-schema.ts", "content": "import {\n createRegistry,\n type DescMessage,\n isMessage,\n type MessageShape,\n type MessageValidType,\n} from \"@bufbuild/protobuf\";\nimport { usedTypes } from \"@bufbuild/protobuf/reflect\";\nimport {\n createValidator,\n RuntimeError,\n type Violation,\n type ValidatorOptions,\n} from \"@bufbuild/protovalidate\";\nimport type { StandardSchemaV1 } from \"../core/index.js\";\n\nfunction violationToIssue(violation: Violation): StandardSchemaV1.Issue {\n const path: PropertyKey[] = [];\n\n for (const segment of violation.field) {\n switch (segment.kind) {\n case \"field\":\n if (segment.oneof) {\n path.push(segment.oneof.localName, \"value\");\n } else {\n path.push(segment.localName);\n }\n break;\n case \"oneof\":\n path.push(segment.localName);\n break;\n case \"list_sub\":\n path.push(segment.index);\n break;\n case \"map_sub\":\n path.push(\n typeof segment.key === \"string\" ||\n typeof segment.key === \"number\"\n ? segment.key\n : String(segment.key)\n );\n break;\n case \"extension\":\n path.push(`[${segment.typeName}]`);\n break;\n default:\n segment satisfies never;\n }\n }\n\n return path.length > 0\n ? { message: violation.message, path }\n : { message: violation.message };\n}\n\nexport function createDescriptorAwareStandardSchema<\n Desc extends DescMessage,\n>(\n desc: Desc,\n options?: ValidatorOptions\n): StandardSchemaV1, MessageValidType> {\n const registry = createRegistry(\n desc,\n ...usedTypes(desc),\n ...(options?.registry ? [options.registry] : [])\n );\n const validator = createValidator({ ...options, registry });\n\n return {\n \"~standard\": {\n validate: (value) => {\n if (typeof value !== \"object\" || value === null) {\n return { issues: [{ message: \"Expected an object\" }] };\n }\n if (!isMessage(value, desc)) {\n return { issues: [{ message: \"Expected a protobuf message\" }] };\n }\n\n const result = validator.validate(desc, value);\n switch (result.kind) {\n case \"valid\":\n return { value: result.message };\n case \"invalid\":\n return { issues: result.violations.map(violationToIssue) };\n case \"error\":\n if (result.error instanceof RuntimeError) {\n // Runtime failures are schema defects, not user input errors. Fail\n // open so form adapters never surface CEL internals to end users.\n return {\n value: result.message as MessageValidType,\n };\n }\n return { issues: [{ message: result.error.message }] };\n default:\n return result satisfies never;\n }\n },\n vendor: \"protoform\",\n version: 1,\n },\n };\n}\n", "type": "registry:lib" } ], "type": "registry:lib" }