@fluxlay/cli 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/native/fluxlay-core.darwin-arm64.node +0 -0
- package/dist/native/fluxlay-core.darwin-x64.node +0 -0
- package/dist/native/fluxlay-core.linux-x64-gnu.node +0 -0
- package/dist/native/fluxlay-core.win32-arm64-msvc.node +0 -0
- package/dist/native/fluxlay-core.win32-x64-msvc.node +0 -0
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/lib/native.ts","../../proto/gen/ts/fluxlay/admin/v1/admin_pb.ts","../../proto/gen/ts/fluxlay/auth/v1/auth_pb.ts","../../proto/gen/ts/fluxlay/checkout/v1/checkout_pb.ts","../../proto/gen/ts/buf/validate/validate_pb.ts","../../proto/gen/ts/fluxlay/contact/v1/contact_pb.ts","../../proto/gen/ts/fluxlay/notification/v1/notification_pb.ts","../../proto/gen/ts/fluxlay/stats/v1/stats_pb.ts","../../proto/gen/ts/fluxlay/stripe/v1/stripe_pb.ts","../../proto/gen/ts/fluxlay/common/v1/bucket_object_pb.ts","../../proto/gen/ts/fluxlay/user/v1/user_pb.ts","../../proto/gen/ts/fluxlay/wallpaper/v1/wallpaper_pb.ts","../../proto/gen/ts/fluxlay/v1/service_pb.ts","../src/lib/AuthStore.ts","../src/lib/env.ts","../src/lib/api.ts","../src/lib/bundle.ts","../src/lib/DeviceStore.ts","../src/lib/key_wrap.ts","../src/lib/KeyStore.ts","../src/lib/legacy_bundle.ts","../src/lib/session_crypto.ts","../src/commands/build.ts","../src/commands/dev.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/publish.ts","../src/commands/rebuild.ts","../src/lib/supabase.ts","../src/commands/whoami.ts","../src/lib/sentry.ts","../src/index.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst require = createRequire(import.meta.url);\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// 開発時 (FLUXLAY_CLI_DEV=1) は workspace の @fluxlay/core を使い、\n// ビルド後は copy された native/index.js を使う\nconst corePath = process.env.FLUXLAY_CLI_DEV === \"1\" ? \"@fluxlay/core\" : path.resolve(__dirname, \"./native/index.js\");\n\nconst core = require(corePath);\n\nexport const {\n getDeveloperKey,\n setDeveloperKey,\n validateManifest,\n packContent,\n unpackContent,\n getContentKey,\n setContentKey\n} = core;\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/admin/v1/admin.proto (package fluxlay.admin.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/admin/v1/admin.proto.\n */\nexport const file_fluxlay_admin_v1_admin: GenFile = /*@__PURE__*/\n fileDesc(\"ChxmbHV4bGF5L2FkbWluL3YxL2FkbWluLnByb3RvEhBmbHV4bGF5LmFkbWluLnYxIg8KDVdob2FtaVJlcXVlc3QiPgoOV2hvYW1pUmVzcG9uc2USDwoHdXNlcl9pZBgBIAEoCRINCgVlbWFpbBgCIAEoCRIMCgRraW5kGAMgASgJQsUBChRjb20uZmx1eGxheS5hZG1pbi52MUIKQWRtaW5Qcm90b1ABWj9naXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L2FkbWluL3YxO2FkbWludjGiAgNGQViqAhBGbHV4bGF5LkFkbWluLlYxygIQRmx1eGxheVxBZG1pblxWMeICHEZsdXhsYXlcQWRtaW5cVjFcR1BCTWV0YWRhdGHqAhJGbHV4bGF5OjpBZG1pbjo6VjFiBnByb3RvMw\");\n\n/**\n * @generated from message fluxlay.admin.v1.WhoamiRequest\n */\nexport type WhoamiRequest = Message<\"fluxlay.admin.v1.WhoamiRequest\"> & {\n};\n\nexport type WhoamiRequestValid = WhoamiRequest;\n\n/**\n * Describes the message fluxlay.admin.v1.WhoamiRequest.\n * Use `create(WhoamiRequestSchema)` to create a new message.\n */\nexport const WhoamiRequestSchema: GenMessage<WhoamiRequest, {validType: WhoamiRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_admin_v1_admin, 0);\n\n/**\n * admin 認可基盤の疎通確認用レスポンス。\n * AdminService は admin interceptor(user_kind = internal 必須)を通るため、\n * このレスポンスが返る時点で kind は internal であることが保証される。\n *\n * @generated from message fluxlay.admin.v1.WhoamiResponse\n */\nexport type WhoamiResponse = Message<\"fluxlay.admin.v1.WhoamiResponse\"> & {\n /**\n * @generated from field: string user_id = 1;\n */\n userId: string;\n\n /**\n * @generated from field: string email = 2;\n */\n email: string;\n\n /**\n * ユーザー種別 (organic | internal | test)\n *\n * @generated from field: string kind = 3;\n */\n kind: string;\n};\n\nexport type WhoamiResponseValid = WhoamiResponse;\n\n/**\n * Describes the message fluxlay.admin.v1.WhoamiResponse.\n * Use `create(WhoamiResponseSchema)` to create a new message.\n */\nexport const WhoamiResponseSchema: GenMessage<WhoamiResponse, {validType: WhoamiResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_admin_v1_admin, 1);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/auth/v1/auth.proto (package fluxlay.auth.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 type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/auth/v1/auth.proto.\n */\nexport const file_fluxlay_auth_v1_auth: GenFile = /*@__PURE__*/\n fileDesc(\"ChpmbHV4bGF5L2F1dGgvdjEvYXV0aC5wcm90bxIPZmx1eGxheS5hdXRoLnYxIhkKF0NyZWF0ZURldmljZUNvZGVSZXF1ZXN0IoIBChhDcmVhdGVEZXZpY2VDb2RlUmVzcG9uc2USEwoLZGV2aWNlX2NvZGUYASABKAkSEQoJdXNlcl9jb2RlGAIgASgJEhgKEHZlcmlmaWNhdGlvbl91cmkYAyABKAkSEgoKZXhwaXJlc19pbhgEIAEoBRIQCghpbnRlcnZhbBgFIAEoBSItChZQb2xsRGV2aWNlVG9rZW5SZXF1ZXN0EhMKC2RldmljZV9jb2RlGAEgASgJInMKDURldmljZVNlc3Npb24SFAoMYWNjZXNzX3Rva2VuGAEgASgJEhUKDXJlZnJlc2hfdG9rZW4YAiABKAkSEgoKdG9rZW5fdHlwZRgDIAEoCRISCgpleHBpcmVzX2F0GAQgASgDEg0KBWVtYWlsGAUgASgJIn4KF1BvbGxEZXZpY2VUb2tlblJlc3BvbnNlEjIKBnN0YXR1cxgBIAEoDjIiLmZsdXhsYXkuYXV0aC52MS5EZXZpY2VUb2tlblN0YXR1cxIvCgdzZXNzaW9uGAIgASgLMh4uZmx1eGxheS5hdXRoLnYxLkRldmljZVNlc3Npb24iKQoUQXBwcm92ZURldmljZVJlcXVlc3QSEQoJdXNlcl9jb2RlGAEgASgJIhcKFUFwcHJvdmVEZXZpY2VSZXNwb25zZSrKAQoRRGV2aWNlVG9rZW5TdGF0dXMSIwofREVWSUNFX1RPS0VOX1NUQVRVU19VTlNQRUNJRklFRBAAEi0KKURFVklDRV9UT0tFTl9TVEFUVVNfQVVUSE9SSVpBVElPTl9QRU5ESU5HEAESIAocREVWSUNFX1RPS0VOX1NUQVRVU19BUFBST1ZFRBACEh8KG0RFVklDRV9UT0tFTl9TVEFUVVNfRVhQSVJFRBADEh4KGkRFVklDRV9UT0tFTl9TVEFUVVNfREVOSUVEEARCvQEKE2NvbS5mbHV4bGF5LmF1dGgudjFCCUF1dGhQcm90b1ABWj1naXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L2F1dGgvdjE7YXV0aHYxogIDRkFYqgIPRmx1eGxheS5BdXRoLlYxygIPRmx1eGxheVxBdXRoXFYx4gIbRmx1eGxheVxBdXRoXFYxXEdQQk1ldGFkYXRh6gIRRmx1eGxheTo6QXV0aDo6VjFiBnByb3RvMw\");\n\n/**\n * @generated from message fluxlay.auth.v1.CreateDeviceCodeRequest\n */\nexport type CreateDeviceCodeRequest = Message<\"fluxlay.auth.v1.CreateDeviceCodeRequest\"> & {\n};\n\nexport type CreateDeviceCodeRequestValid = CreateDeviceCodeRequest;\n\n/**\n * Describes the message fluxlay.auth.v1.CreateDeviceCodeRequest.\n * Use `create(CreateDeviceCodeRequestSchema)` to create a new message.\n */\nexport const CreateDeviceCodeRequestSchema: GenMessage<CreateDeviceCodeRequest, {validType: CreateDeviceCodeRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 0);\n\n/**\n * @generated from message fluxlay.auth.v1.CreateDeviceCodeResponse\n */\nexport type CreateDeviceCodeResponse = Message<\"fluxlay.auth.v1.CreateDeviceCodeResponse\"> & {\n /**\n * @generated from field: string device_code = 1;\n */\n deviceCode: string;\n\n /**\n * @generated from field: string user_code = 2;\n */\n userCode: string;\n\n /**\n * @generated from field: string verification_uri = 3;\n */\n verificationUri: string;\n\n /**\n * @generated from field: int32 expires_in = 4;\n */\n expiresIn: number;\n\n /**\n * @generated from field: int32 interval = 5;\n */\n interval: number;\n};\n\nexport type CreateDeviceCodeResponseValid = CreateDeviceCodeResponse;\n\n/**\n * Describes the message fluxlay.auth.v1.CreateDeviceCodeResponse.\n * Use `create(CreateDeviceCodeResponseSchema)` to create a new message.\n */\nexport const CreateDeviceCodeResponseSchema: GenMessage<CreateDeviceCodeResponse, {validType: CreateDeviceCodeResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 1);\n\n/**\n * @generated from message fluxlay.auth.v1.PollDeviceTokenRequest\n */\nexport type PollDeviceTokenRequest = Message<\"fluxlay.auth.v1.PollDeviceTokenRequest\"> & {\n /**\n * @generated from field: string device_code = 1;\n */\n deviceCode: string;\n};\n\nexport type PollDeviceTokenRequestValid = PollDeviceTokenRequest;\n\n/**\n * Describes the message fluxlay.auth.v1.PollDeviceTokenRequest.\n * Use `create(PollDeviceTokenRequestSchema)` to create a new message.\n */\nexport const PollDeviceTokenRequestSchema: GenMessage<PollDeviceTokenRequest, {validType: PollDeviceTokenRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 2);\n\n/**\n * @generated from message fluxlay.auth.v1.DeviceSession\n */\nexport type DeviceSession = Message<\"fluxlay.auth.v1.DeviceSession\"> & {\n /**\n * @generated from field: string access_token = 1;\n */\n accessToken: string;\n\n /**\n * @generated from field: string refresh_token = 2;\n */\n refreshToken: string;\n\n /**\n * @generated from field: string token_type = 3;\n */\n tokenType: string;\n\n /**\n * @generated from field: int64 expires_at = 4;\n */\n expiresAt: bigint;\n\n /**\n * @generated from field: string email = 5;\n */\n email: string;\n};\n\nexport type DeviceSessionValid = DeviceSession;\n\n/**\n * Describes the message fluxlay.auth.v1.DeviceSession.\n * Use `create(DeviceSessionSchema)` to create a new message.\n */\nexport const DeviceSessionSchema: GenMessage<DeviceSession, {validType: DeviceSessionValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 3);\n\n/**\n * @generated from message fluxlay.auth.v1.PollDeviceTokenResponse\n */\nexport type PollDeviceTokenResponse = Message<\"fluxlay.auth.v1.PollDeviceTokenResponse\"> & {\n /**\n * @generated from field: fluxlay.auth.v1.DeviceTokenStatus status = 1;\n */\n status: DeviceTokenStatus;\n\n /**\n * @generated from field: fluxlay.auth.v1.DeviceSession session = 2;\n */\n session?: DeviceSession | undefined;\n};\n\nexport type PollDeviceTokenResponseValid = PollDeviceTokenResponse;\n\n/**\n * Describes the message fluxlay.auth.v1.PollDeviceTokenResponse.\n * Use `create(PollDeviceTokenResponseSchema)` to create a new message.\n */\nexport const PollDeviceTokenResponseSchema: GenMessage<PollDeviceTokenResponse, {validType: PollDeviceTokenResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 4);\n\n/**\n * @generated from message fluxlay.auth.v1.ApproveDeviceRequest\n */\nexport type ApproveDeviceRequest = Message<\"fluxlay.auth.v1.ApproveDeviceRequest\"> & {\n /**\n * @generated from field: string user_code = 1;\n */\n userCode: string;\n};\n\nexport type ApproveDeviceRequestValid = ApproveDeviceRequest;\n\n/**\n * Describes the message fluxlay.auth.v1.ApproveDeviceRequest.\n * Use `create(ApproveDeviceRequestSchema)` to create a new message.\n */\nexport const ApproveDeviceRequestSchema: GenMessage<ApproveDeviceRequest, {validType: ApproveDeviceRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 5);\n\n/**\n * @generated from message fluxlay.auth.v1.ApproveDeviceResponse\n */\nexport type ApproveDeviceResponse = Message<\"fluxlay.auth.v1.ApproveDeviceResponse\"> & {\n};\n\nexport type ApproveDeviceResponseValid = ApproveDeviceResponse;\n\n/**\n * Describes the message fluxlay.auth.v1.ApproveDeviceResponse.\n * Use `create(ApproveDeviceResponseSchema)` to create a new message.\n */\nexport const ApproveDeviceResponseSchema: GenMessage<ApproveDeviceResponse, {validType: ApproveDeviceResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 6);\n\n/**\n * @generated from enum fluxlay.auth.v1.DeviceTokenStatus\n */\nexport enum DeviceTokenStatus {\n /**\n * @generated from enum value: DEVICE_TOKEN_STATUS_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: DEVICE_TOKEN_STATUS_AUTHORIZATION_PENDING = 1;\n */\n AUTHORIZATION_PENDING = 1,\n\n /**\n * @generated from enum value: DEVICE_TOKEN_STATUS_APPROVED = 2;\n */\n APPROVED = 2,\n\n /**\n * @generated from enum value: DEVICE_TOKEN_STATUS_EXPIRED = 3;\n */\n EXPIRED = 3,\n\n /**\n * @generated from enum value: DEVICE_TOKEN_STATUS_DENIED = 4;\n */\n DENIED = 4,\n}\n\n/**\n * Describes the enum fluxlay.auth.v1.DeviceTokenStatus.\n */\nexport const DeviceTokenStatusSchema: GenEnum<DeviceTokenStatus> = /*@__PURE__*/\n enumDesc(file_fluxlay_auth_v1_auth, 0);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/checkout/v1/checkout.proto (package fluxlay.checkout.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/checkout/v1/checkout.proto.\n */\nexport const file_fluxlay_checkout_v1_checkout: GenFile = /*@__PURE__*/\n fileDesc(\"CiJmbHV4bGF5L2NoZWNrb3V0L3YxL2NoZWNrb3V0LnByb3RvEhNmbHV4bGF5LmNoZWNrb3V0LnYxIkQKGkNyZWF0ZVBheW1lbnRJbnRlbnRSZXF1ZXN0EhQKDHdhbGxwYXBlcl9pZBgBIAEoCRIQCghjdXJyZW5jeRgCIAEoCSI0ChtDcmVhdGVQYXltZW50SW50ZW50UmVzcG9uc2USFQoNY2xpZW50X3NlY3JldBgBIAEoCULdAQoXY29tLmZsdXhsYXkuY2hlY2tvdXQudjFCDUNoZWNrb3V0UHJvdG9QAVpFZ2l0aHViLmNvbS9rZW4xMDkvZmx1eGxheS1wcm90by9nZW4vZ28vZmx1eGxheS9jaGVja291dC92MTtjaGVja291dHYxogIDRkNYqgITRmx1eGxheS5DaGVja291dC5WMcoCE0ZsdXhsYXlcQ2hlY2tvdXRcVjHiAh9GbHV4bGF5XENoZWNrb3V0XFYxXEdQQk1ldGFkYXRh6gIVRmx1eGxheTo6Q2hlY2tvdXQ6OlYxYgZwcm90bzM\");\n\n/**\n * @generated from message fluxlay.checkout.v1.CreatePaymentIntentRequest\n */\nexport type CreatePaymentIntentRequest = Message<\"fluxlay.checkout.v1.CreatePaymentIntentRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: string currency = 2;\n */\n currency: string;\n};\n\nexport type CreatePaymentIntentRequestValid = CreatePaymentIntentRequest;\n\n/**\n * Describes the message fluxlay.checkout.v1.CreatePaymentIntentRequest.\n * Use `create(CreatePaymentIntentRequestSchema)` to create a new message.\n */\nexport const CreatePaymentIntentRequestSchema: GenMessage<CreatePaymentIntentRequest, {validType: CreatePaymentIntentRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_checkout_v1_checkout, 0);\n\n/**\n * @generated from message fluxlay.checkout.v1.CreatePaymentIntentResponse\n */\nexport type CreatePaymentIntentResponse = Message<\"fluxlay.checkout.v1.CreatePaymentIntentResponse\"> & {\n /**\n * @generated from field: string client_secret = 1;\n */\n clientSecret: string;\n};\n\nexport type CreatePaymentIntentResponseValid = CreatePaymentIntentResponse;\n\n/**\n * Describes the message fluxlay.checkout.v1.CreatePaymentIntentResponse.\n * Use `create(CreatePaymentIntentResponseSchema)` to create a new message.\n */\nexport const CreatePaymentIntentResponseSchema: GenMessage<CreatePaymentIntentResponse, {validType: CreatePaymentIntentResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_checkout_v1_checkout, 1);\n\n","// 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.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\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(\"ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI3CgRSdWxlEgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSKGAQoMTWVzc2FnZVJ1bGVzEhYKDmNlbF9leHByZXNzaW9uGAUgAygJEh8KA2NlbBgDIAMoCzISLmJ1Zi52YWxpZGF0ZS5SdWxlEi0KBW9uZW9mGAQgAygLMh4uYnVmLnZhbGlkYXRlLk1lc3NhZ2VPbmVvZlJ1bGVKBAgBEAJSCGRpc2FibGVkIjQKEE1lc3NhZ2VPbmVvZlJ1bGUSDgoGZmllbGRzGAEgAygJEhAKCHJlcXVpcmVkGAIgASgIIh4KCk9uZW9mUnVsZXMSEAoIcmVxdWlyZWQYASABKAgiiwkKCkZpZWxkUnVsZXMSFgoOY2VsX2V4cHJlc3Npb24YHSADKAkSHwoDY2VsGBcgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGUSEAoIcmVxdWlyZWQYGSABKAgSJAoGaWdub3JlGBsgASgOMhQuYnVmLnZhbGlkYXRlLklnbm9yZRIpCgVmbG9hdBgBIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GbG9hdFJ1bGVzSAASKwoGZG91YmxlGAIgASgLMhkuYnVmLnZhbGlkYXRlLkRvdWJsZVJ1bGVzSAASKQoFaW50MzIYAyABKAsyGC5idWYudmFsaWRhdGUuSW50MzJSdWxlc0gAEikKBWludDY0GAQgASgLMhguYnVmLnZhbGlkYXRlLkludDY0UnVsZXNIABIrCgZ1aW50MzIYBSABKAsyGS5idWYudmFsaWRhdGUuVUludDMyUnVsZXNIABIrCgZ1aW50NjQYBiABKAsyGS5idWYudmFsaWRhdGUuVUludDY0UnVsZXNIABIrCgZzaW50MzIYByABKAsyGS5idWYudmFsaWRhdGUuU0ludDMyUnVsZXNIABIrCgZzaW50NjQYCCABKAsyGS5idWYudmFsaWRhdGUuU0ludDY0UnVsZXNIABItCgdmaXhlZDMyGAkgASgLMhouYnVmLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAEi0KB2ZpeGVkNjQYCiABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQ2NFJ1bGVzSAASLwoIc2ZpeGVkMzIYCyABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkMzJSdWxlc0gAEi8KCHNmaXhlZDY0GAwgASgLMhsuYnVmLnZhbGlkYXRlLlNGaXhlZDY0UnVsZXNIABInCgRib29sGA0gASgLMhcuYnVmLnZhbGlkYXRlLkJvb2xSdWxlc0gAEisKBnN0cmluZxgOIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAEikKBWJ5dGVzGA8gASgLMhguYnVmLnZhbGlkYXRlLkJ5dGVzUnVsZXNIABInCgRlbnVtGBAgASgLMhcuYnVmLnZhbGlkYXRlLkVudW1SdWxlc0gAEi8KCHJlcGVhdGVkGBIgASgLMhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIABIlCgNtYXAYEyABKAsyFi5idWYudmFsaWRhdGUuTWFwUnVsZXNIABIlCgNhbnkYFCABKAsyFi5idWYudmFsaWRhdGUuQW55UnVsZXNIABIvCghkdXJhdGlvbhgVIAEoCzIbLmJ1Zi52YWxpZGF0ZS5EdXJhdGlvblJ1bGVzSAASMgoKZmllbGRfbWFzaxgcIAEoCzIcLmJ1Zi52YWxpZGF0ZS5GaWVsZE1hc2tSdWxlc0gAEjEKCXRpbWVzdGFtcBgWIAEoCzIcLmJ1Zi52YWxpZGF0ZS5UaW1lc3RhbXBSdWxlc0gAQgYKBHR5cGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSJVCg9QcmVkZWZpbmVkUnVsZXMSHwoDY2VsGAEgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSLaFwoKRmxvYXRSdWxlcxKDAQoFY29uc3QYASABKAJCdMJIcQpvCgtmbG9hdC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEp8BCgJsdBgCIAEoAkKQAcJIjAEKiQEKCGZsb2F0Lmx0Gn0haGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0KT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEq8BCgNsdGUYAyABKAJCnwHCSJsBCpgBCglmbG9hdC5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABLvBwoCZ3QYBCABKAJC4AfCSNwHCo0BCghmbG9hdC5ndBqAASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCsMBCgtmbG9hdC5ndF9sdBqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCs0BChVmbG9hdC5ndF9sdF9leGNsdXNpdmUaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrTAQoMZmxvYXQuZ3RfbHRlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycK3QEKFmZsb2F0Lmd0X2x0ZV9leGNsdXNpdmUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEroICgNndGUYBSABKAJCqgjCSKYICpsBCglmbG9hdC5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0gEKDGZsb2F0Lmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3AEKFmZsb2F0Lmd0ZV9sdF9leGNsdXNpdmUawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCuIBCg1mbG9hdC5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrsAQoXZmxvYXQuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESfwoCaW4YBiADKAJCc8JIcApuCghmbG9hdC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdgoGbm90X2luGAcgAygCQmbCSGMKYQoMZmxvYXQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSdQoGZmluaXRlGAggASgIQmXCSGIKYAoMZmxvYXQuZmluaXRlGlBydWxlcy5maW5pdGUgPyAodGhpcy5pc05hbigpIHx8IHRoaXMuaXNJbmYoKSA/ICd2YWx1ZSBtdXN0IGJlIGZpbml0ZScgOiAnJykgOiAnJxIrCgdleGFtcGxlGAkgAygCQhrCSBcKFQoNZmxvYXQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i7RcKC0RvdWJsZVJ1bGVzEoQBCgVjb25zdBgBIAEoAUJ1wkhyCnAKDGRvdWJsZS5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEqABCgJsdBgCIAEoAUKRAcJIjQEKigEKCWRvdWJsZS5sdBp9IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKwAQoDbHRlGAMgASgBQqABwkicAQqZAQoKZG91YmxlLmx0ZRqKASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEvQHCgJndBgEIAEoAULlB8JI4QcKjgEKCWRvdWJsZS5ndBqAASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCsQBCgxkb3VibGUuZ3RfbHQaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrOAQoWZG91YmxlLmd0X2x0X2V4Y2x1c2l2ZRqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCtQBCg1kb3VibGUuZ3RfbHRlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycK3gEKF2RvdWJsZS5ndF9sdGVfZXhjbHVzaXZlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARK/CAoDZ3RlGAUgASgBQq8IwkirCAqcAQoKZG91YmxlLmd0ZRqNASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrTAQoNZG91YmxlLmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3QEKF2RvdWJsZS5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrjAQoOZG91YmxlLmd0ZV9sdGUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCu0BChhkb3VibGUuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygBQnTCSHEKbwoJZG91YmxlLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKAFCZ8JIZApiCg1kb3VibGUubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSdgoGZmluaXRlGAggASgIQmbCSGMKYQoNZG91YmxlLmZpbml0ZRpQcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAndmFsdWUgbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSLAoHZXhhbXBsZRgJIAMoAUIbwkgYChYKDmRvdWJsZS5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKMFQoKSW50MzJSdWxlcxKDAQoFY29uc3QYASABKAVCdMJIcQpvCgtpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEooBCgJsdBgCIAEoBUJ8wkh5CncKCGludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpwBCgNsdGUYAyABKAVCjAHCSIgBCoUBCglpbnQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEpcHCgJndBgEIAEoBUKIB8JIhAcKegoIaW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrMBCgtpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKuwEKFWludDMyLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsMBCgxpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCssBChZpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLjBwoDZ3RlGAUgASgFQtMHwkjPBwqIAQoJaW50MzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEn8KAmluGAYgAygFQnPCSHAKbgoIaW50MzIuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgHIAMoBUJmwkhjCmEKDGludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEisKB2V4YW1wbGUYCCADKAVCGsJIFwoVCg1pbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKMFQoKSW50NjRSdWxlcxKDAQoFY29uc3QYASABKANCdMJIcQpvCgtpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEooBCgJsdBgCIAEoA0J8wkh5CncKCGludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpwBCgNsdGUYAyABKANCjAHCSIgBCoUBCglpbnQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEpcHCgJndBgEIAEoA0KIB8JIhAcKegoIaW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrMBCgtpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKuwEKFWludDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsMBCgxpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCssBChZpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLjBwoDZ3RlGAUgASgDQtMHwkjPBwqIAQoJaW50NjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEn8KAmluGAYgAygDQnPCSHAKbgoIaW50NjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgHIAMoA0JmwkhjCmEKDGludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEisKB2V4YW1wbGUYCSADKANCGsJIFwoVCg1pbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLVUludDMyUnVsZXMShAEKBWNvbnN0GAEgASgNQnXCSHIKcAoMdWludDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgNQn3CSHoKeAoJdWludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKA1CjQHCSIkBCoYBCgp1aW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKA1CjQfCSIkHCnsKCXVpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgNQtgHwkjUBwqJAQoKdWludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg11aW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChd1aW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnVpbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChh1aW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygNQnTCSHEKbwoJdWludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKA1CZ8JIZApiCg11aW50MzIubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoDUIbwkgYChYKDnVpbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLVUludDY0UnVsZXMShAEKBWNvbnN0GAEgASgEQnXCSHIKcAoMdWludDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgEQn3CSHoKeAoJdWludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKARCjQHCSIkBCoYBCgp1aW50NjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKARCjQfCSIkHCnsKCXVpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgEQtgHwkjUBwqJAQoKdWludDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg11aW50NjQuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChd1aW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnVpbnQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChh1aW50NjQuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygEQnTCSHEKbwoJdWludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKARCZ8JIZApiCg11aW50NjQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoBEIbwkgYChYKDnVpbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLU0ludDMyUnVsZXMShAEKBWNvbnN0GAEgASgRQnXCSHIKcAoMc2ludDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgRQn3CSHoKeAoJc2ludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKBFCjQHCSIkBCoYBCgpzaW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKBFCjQfCSIkHCnsKCXNpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgRQtgHwkjUBwqJAQoKc2ludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg1zaW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChdzaW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnNpbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChhzaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygRQnTCSHEKbwoJc2ludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKBFCZ8JIZApiCg1zaW50MzIubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoEUIbwkgYChYKDnNpbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLU0ludDY0UnVsZXMShAEKBWNvbnN0GAEgASgSQnXCSHIKcAoMc2ludDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgSQn3CSHoKeAoJc2ludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKBJCjQHCSIkBCoYBCgpzaW50NjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKBJCjQfCSIkHCnsKCXNpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgSQtgHwkjUBwqJAQoKc2ludDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg1zaW50NjQuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChdzaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnNpbnQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChhzaW50NjQuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygSQnTCSHEKbwoJc2ludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKBJCZ8JIZApiCg1zaW50NjQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoEkIbwkgYChYKDnNpbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKvFQoMRml4ZWQzMlJ1bGVzEoUBCgVjb25zdBgBIAEoB0J2wkhzCnEKDWZpeGVkMzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKMAQoCbHQYAiABKAdCfsJIewp5CgpmaXhlZDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp4BCgNsdGUYAyABKAdCjgHCSIoBCocBCgtmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASoQcKAmd0GAQgASgHQpIHwkiOBwp8CgpmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLtBwoDZ3RlGAUgASgHQt0HwkjZBwqKAQoLZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQzMi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkMzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKBAQoCaW4YBiADKAdCdcJIcgpwCgpmaXhlZDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ4CgZub3RfaW4YByADKAdCaMJIZQpjCg5maXhlZDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi0KB2V4YW1wbGUYCCADKAdCHMJIGQoXCg9maXhlZDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIq8VCgxGaXhlZDY0UnVsZXMShQEKBWNvbnN0GAEgASgGQnbCSHMKcQoNZml4ZWQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEowBCgJsdBgCIAEoBkJ+wkh7CnkKCmZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASngEKA2x0ZRgDIAEoBkKOAcJIigEKhwEKC2ZpeGVkNjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKhBwoCZ3QYBCABKAZCkgfCSI4HCnwKCmZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrUBCg1maXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq9AQoXZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrFAQoOZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs0BChhmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEu0HCgNndGUYBSABKAZC3QfCSNkHCooBCgtmaXhlZDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsQBCg5maXhlZDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrMAQoYZml4ZWQ2NC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrUAQoPZml4ZWQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtwBChlmaXhlZDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoEBCgJpbhgGIAMoBkJ1wkhyCnAKCmZpeGVkNjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEngKBm5vdF9pbhgHIAMoBkJowkhlCmMKDmZpeGVkNjQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLQoHZXhhbXBsZRgIIAMoBkIcwkgZChcKD2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iwBUKDVNGaXhlZDMyUnVsZXMShgEKBWNvbnN0GAEgASgPQnfCSHQKcgoOc2ZpeGVkMzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKNAQoCbHQYAiABKA9Cf8JIfAp6CgtzZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKfAQoDbHRlGAMgASgPQo8BwkiLAQqIAQoMc2ZpeGVkMzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKmBwoCZ3QYBCABKA9ClwfCSJMHCn0KC3NmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOc2ZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhzZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPc2ZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZc2ZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES8gcKA2d0ZRgFIAEoD0LiB8JI3gcKiwEKDHNmaXhlZDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9zZml4ZWQzMi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGXNmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBzZml4ZWQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpzZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKCAQoCaW4YBiADKA9CdsJIcwpxCgtzZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSeQoGbm90X2luGAcgAygPQmnCSGYKZAoPc2ZpeGVkMzIubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLgoHZXhhbXBsZRgIIAMoD0IdwkgaChgKEHNmaXhlZDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIsAVCg1TRml4ZWQ2NFJ1bGVzEoYBCgVjb25zdBgBIAEoEEJ3wkh0CnIKDnNmaXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjQEKAmx0GAIgASgQQn/CSHwKegoLc2ZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASnwEKA2x0ZRgDIAEoEEKPAcJIiwEKiAEKDHNmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASpgcKAmd0GAQgASgQQpcHwkiTBwp9CgtzZml4ZWQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDnNmaXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYc2ZpeGVkNjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD3NmaXhlZDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGXNmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEvIHCgNndGUYBSABKBBC4gfCSN4HCosBCgxzZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkNjQuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQ2NC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkNjQuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESggEKAmluGAYgAygQQnbCSHMKcQoLc2ZpeGVkNjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnkKBm5vdF9pbhgHIAMoEEJpwkhmCmQKD3NmaXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi4KB2V4YW1wbGUYCCADKBBCHcJIGgoYChBzZml4ZWQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLHAQoJQm9vbFJ1bGVzEoIBCgVjb25zdBgBIAEoCEJzwkhwCm4KCmJvb2wuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxIqCgdleGFtcGxlGAIgAygIQhnCSBYKFAoMYm9vbC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIiiDkKC1N0cmluZ1J1bGVzEoYBCgVjb25zdBgBIAEoCUJ3wkh0CnIKDHN0cmluZy5jb25zdBpidGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCBgJXNgJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSfgoDbGVuGBMgASgEQnHCSG4KbAoKc3RyaW5nLmxlbhpedWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubGVuXSkgOiAnJxKZAQoHbWluX2xlbhgCIAEoBEKHAcJIgwEKgAEKDnN0cmluZy5taW5fbGVuGm51aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKXAQoHbWF4X2xlbhgDIAEoBEKFAcJIgQEKfwoOc3RyaW5nLm1heF9sZW4abXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSmwEKCWxlbl9ieXRlcxgUIAEoBEKHAcJIgwEKgAEKEHN0cmluZy5sZW5fYnl0ZXMabHVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSAhPSBydWxlcy5sZW5fYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuX2J5dGVzXSkgOiAnJxKjAQoJbWluX2J5dGVzGAQgASgEQo8BwkiLAQqIAQoQc3RyaW5nLm1pbl9ieXRlcxp0dWludChieXRlcyh0aGlzKS5zaXplKCkpIDwgcnVsZXMubWluX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1pbl9ieXRlc10pIDogJycSogEKCW1heF9ieXRlcxgFIAEoBEKOAcJIigEKhwEKEHN0cmluZy5tYXhfYnl0ZXMac3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9ieXRlc10pIDogJycSjQEKB3BhdHRlcm4YBiABKAlCfMJIeQp3Cg5zdHJpbmcucGF0dGVybhplIXRoaXMubWF0Y2hlcyhydWxlcy5wYXR0ZXJuKSA/ICd2YWx1ZSBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycShAEKBnByZWZpeBgHIAEoCUJ0wkhxCm8KDXN0cmluZy5wcmVmaXgaXiF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCBgJXNgJy5mb3JtYXQoW3J1bGVzLnByZWZpeF0pIDogJycSggEKBnN1ZmZpeBgIIAEoCUJywkhvCm0KDXN0cmluZy5zdWZmaXgaXCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnEpABCghjb250YWlucxgJIAEoCUJ+wkh7CnkKD3N0cmluZy5jb250YWlucxpmIXRoaXMuY29udGFpbnMocnVsZXMuY29udGFpbnMpID8gJ3ZhbHVlIGRvZXMgbm90IGNvbnRhaW4gc3Vic3RyaW5nIGAlc2AnLmZvcm1hdChbcnVsZXMuY29udGFpbnNdKSA6ICcnEpgBCgxub3RfY29udGFpbnMYFyABKAlCgQHCSH4KfAoTc3RyaW5nLm5vdF9jb250YWlucxpldGhpcy5jb250YWlucyhydWxlcy5ub3RfY29udGFpbnMpID8gJ3ZhbHVlIGNvbnRhaW5zIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLm5vdF9jb250YWluc10pIDogJycSgAEKAmluGAogAygJQnTCSHEKbwoJc3RyaW5nLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YCyADKAlCZ8JIZApiCg1zdHJpbmcubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycS3wEKBWVtYWlsGAwgASgIQs0BwkjJAQphCgxzdHJpbmcuZW1haWwSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGiwhcnVsZXMuZW1haWwgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzRW1haWwoKQpkChJzdHJpbmcuZW1haWxfZW1wdHkSMnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGhohcnVsZXMuZW1haWwgfHwgdGhpcyAhPSAnJ0gAEucBCghob3N0bmFtZRgNIAEoCELSAcJIzgEKZQoPc3RyaW5nLmhvc3RuYW1lEh52YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdG5hbWUaMiFydWxlcy5ob3N0bmFtZSB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0bmFtZSgpCmUKFXN0cmluZy5ob3N0bmFtZV9lbXB0eRItdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lGh0hcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyAhPSAnJ0gAEscBCgJpcBgOIAEoCEK4AcJItAEKVQoJc3RyaW5nLmlwEiB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcxomIXJ1bGVzLmlwIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwKCkKWwoPc3RyaW5nLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxoXIXJ1bGVzLmlwIHx8IHRoaXMgIT0gJydIABLWAQoEaXB2NBgPIAEoCELFAcJIwQEKXAoLc3RyaW5nLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaKSFydWxlcy5pcHY0IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwKDQpCmEKEXN0cmluZy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGhkhcnVsZXMuaXB2NCB8fCB0aGlzICE9ICcnSAAS1gEKBGlwdjYYECABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY2EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzGikhcnVsZXMuaXB2NiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg2KQphChFzdHJpbmcuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxoZIXJ1bGVzLmlwdjYgfHwgdGhpcyAhPSAnJ0gAEr8BCgN1cmkYESABKAhCrwHCSKsBClEKCnN0cmluZy51cmkSGXZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkaKCFydWxlcy51cmkgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzVXJpKCkKVgoQc3RyaW5nLnVyaV9lbXB0eRIodmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVSSRoYIXJ1bGVzLnVyaSB8fCB0aGlzICE9ICcnSAAScAoHdXJpX3JlZhgSIAEoCEJdwkhaClgKDnN0cmluZy51cmlfcmVmEiN2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVJJIFJlZmVyZW5jZRohIXJ1bGVzLnVyaV9yZWYgfHwgdGhpcy5pc1VyaVJlZigpSAASkAIKB2FkZHJlc3MYFSABKAhC/AHCSPgBCoEBCg5zdHJpbmcuYWRkcmVzcxItdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGkAhcnVsZXMuYWRkcmVzcyB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0bmFtZSgpIHx8IHRoaXMuaXNJcCgpCnIKFHN0cmluZy5hZGRyZXNzX2VtcHR5Ejx2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgaG9zdG5hbWUsIG9yIGlwIGFkZHJlc3MaHCFydWxlcy5hZGRyZXNzIHx8IHRoaXMgIT0gJydIABKYAgoEdXVpZBgWIAEoCEKHAsJIgwIKpQEKC3N0cmluZy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBp6IXJ1bGVzLnV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykKWQoRc3RyaW5nLnV1aWRfZW1wdHkSKXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVVUlEGhkhcnVsZXMudXVpZCB8fCB0aGlzICE9ICcnSAAS8AEKBXR1dWlkGCEgASgIQt4BwkjaAQpzCgxzdHJpbmcudHV1aWQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCB0cmltbWVkIFVVSUQaPyFydWxlcy50dXVpZCB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcygnXlswLTlhLWZBLUZdezMyfSQnKQpjChJzdHJpbmcudHV1aWRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCB0cmltbWVkIFVVSUQaGiFydWxlcy50dXVpZCB8fCB0aGlzICE9ICcnSAASlgIKEWlwX3dpdGhfcHJlZml4bGVuGBogASgIQvgBwkj0AQp4ChhzdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW4SH3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaOyFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCgpCngKHnN0cmluZy5pcF93aXRoX3ByZWZpeGxlbl9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBomIXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLPAgoTaXB2NF93aXRoX3ByZWZpeGxlbhgbIAEoCEKvAsJIqwIKkwEKGnN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuEjV2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCkKkgEKIHN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEs8CChNpcHY2X3dpdGhfcHJlZml4bGVuGBwgASgIQq8CwkirAgqTAQoac3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW4SNXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGj4hcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2KQqSAQogc3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW5fZW1wdHkSRHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGighcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAAS8gEKCWlwX3ByZWZpeBgdIAEoCELcAcJI2AEKbAoQc3RyaW5nLmlwX3ByZWZpeBIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIABKDAgoLaXB2NF9wcmVmaXgYHiABKAhC6wHCSOcBCnUKEnN0cmluZy5pcHY0X3ByZWZpeBIhdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgcHJlZml4GjwhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCwgdHJ1ZSkKbgoYc3RyaW5nLmlwdjRfcHJlZml4X2VtcHR5EjB2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBwcmVmaXgaICFydWxlcy5pcHY0X3ByZWZpeCB8fCB0aGlzICE9ICcnSAASgwIKC2lwdjZfcHJlZml4GB8gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2Nl9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IHByZWZpeBo8IXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYsIHRydWUpCm4KGHN0cmluZy5pcHY2X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgcHJlZml4GiAhcnVsZXMuaXB2Nl9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAErUCCg1ob3N0X2FuZF9wb3J0GCAgASgIQpsCwkiXAgqZAQoUc3RyaW5nLmhvc3RfYW5kX3BvcnQSQXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0IChob3N0bmFtZSBvciBJUCBhZGRyZXNzKSBhbmQgcG9ydCBwYWlyGj4hcnVsZXMuaG9zdF9hbmRfcG9ydCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0QW5kUG9ydCh0cnVlKQp5ChpzdHJpbmcuaG9zdF9hbmRfcG9ydF9lbXB0eRI3dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3QgYW5kIHBvcnQgcGFpchoiIXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyAhPSAnJ0gAEvUBCgR1bGlkGCMgASgIQuQBwkjgAQqCAQoLc3RyaW5nLnVsaWQSGnZhbHVlIG11c3QgYmUgYSB2YWxpZCBVTElEGlchcnVsZXMudWxpZCB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcygnXlswLTddWzAtOUEtSEpLTU5QLVRWLVphLWhqa21ucC10di16XXsyNX0kJykKWQoRc3RyaW5nLnVsaWRfZW1wdHkSKXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVTElEGhkhcnVsZXMudWxpZCB8fCB0aGlzICE9ICcnSAASqAUKEHdlbGxfa25vd25fcmVnZXgYGCABKA4yGC5idWYudmFsaWRhdGUuS25vd25SZWdleELxBMJI7QQK8AEKI3N0cmluZy53ZWxsX2tub3duX3JlZ2V4LmhlYWRlcl9uYW1lEiZ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgbmFtZRqgAXJ1bGVzLndlbGxfa25vd25fcmVnZXggIT0gMSB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcyghaGFzKHJ1bGVzLnN0cmljdCkgfHwgcnVsZXMuc3RyaWN0ID8nXjo/WzAtOWEtekEtWiEjJCUmXCcqKy0uXl98flx4NjBdKyQnIDonXlteXHUwMDAwXHUwMDBBXHUwMDBEXSskJykKjQEKKXN0cmluZy53ZWxsX2tub3duX3JlZ2V4LmhlYWRlcl9uYW1lX2VtcHR5EjV2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSFRUUCBoZWFkZXIgbmFtZRopcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgIT0gJycK5wEKJHN0cmluZy53ZWxsX2tub3duX3JlZ2V4LmhlYWRlcl92YWx1ZRIndmFsdWUgbXVzdCBiZSBhIHZhbGlkIEhUVFAgaGVhZGVyIHZhbHVlGpUBcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAyIHx8IHRoaXMubWF0Y2hlcyghaGFzKHJ1bGVzLnN0cmljdCkgfHwgcnVsZXMuc3RyaWN0ID8nXlteXHUwMDAwLVx1MDAwOFx1MDAwQS1cdTAwMUZcdTAwN0ZdKiQnIDonXlteXHUwMDAwXHUwMDBBXHUwMDBEXSokJylIABIOCgZzdHJpY3QYGSABKAgSLAoHZXhhbXBsZRgiIAMoCUIbwkgYChYKDnN0cmluZy5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biLCEgoKQnl0ZXNSdWxlcxKAAQoFY29uc3QYASABKAxCccJIbgpsCgtieXRlcy5jb25zdBpddGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBiZSAleCcuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEngKA2xlbhgNIAEoBEJrwkhoCmYKCWJ5dGVzLmxlbhpZdWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJycSkAEKB21pbl9sZW4YAiABKARCf8JIfAp6Cg1ieXRlcy5taW5fbGVuGml1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWluX2xlbl0pIDogJycSiAEKB21heF9sZW4YAyABKARCd8JIdApyCg1ieXRlcy5tYXhfbGVuGmF1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9sZW4gPyAndmFsdWUgbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9sZW5dKSA6ICcnEpABCgdwYXR0ZXJuGAQgASgJQn/CSHwKegoNYnl0ZXMucGF0dGVybhppIXN0cmluZyh0aGlzKS5tYXRjaGVzKHJ1bGVzLnBhdHRlcm4pID8gJ3ZhbHVlIG11c3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnEoEBCgZwcmVmaXgYBSABKAxCccJIbgpsCgxieXRlcy5wcmVmaXgaXCF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCAleCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnEn8KBnN1ZmZpeBgGIAEoDEJvwkhsCmoKDGJ5dGVzLnN1ZmZpeBpaIXRoaXMuZW5kc1dpdGgocnVsZXMuc3VmZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpeCAleCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnEoMBCghjb250YWlucxgHIAEoDEJxwkhuCmwKDmJ5dGVzLmNvbnRhaW5zGlohdGhpcy5jb250YWlucyhydWxlcy5jb250YWlucykgPyAndmFsdWUgZG9lcyBub3QgY29udGFpbiAleCcuZm9ybWF0KFtydWxlcy5jb250YWluc10pIDogJycSpwEKAmluGAggAygMQpoBwkiWAQqTAQoIYnl0ZXMuaW4ahgFnZXRGaWVsZChydWxlcywgJ2luJykuc2l6ZSgpID4gMCAmJiAhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YCSADKAxCZsJIYwphCgxieXRlcy5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxLrAQoCaXAYCiABKAhC3AHCSNgBCnQKCGJ5dGVzLmlwEiB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcxpGIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNCB8fCB0aGlzLnNpemUoKSA9PSAxNgpgCg5ieXRlcy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaHSFydWxlcy5pcCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS5AEKBGlwdjQYCyABKAhC0wHCSM8BCmUKCmJ5dGVzLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS5QEKBGlwdjYYDCABKAhC1AHCSNABCmYKCmJ5dGVzLmlwdjYSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAEtUBCgR1dWlkGA8gASgIQsQBwkjAAQpeCgpieXRlcy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBo0IXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpeChBieXRlcy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBofIXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgIT0gMEgAEisKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biLUAwoJRW51bVJ1bGVzEoIBCgVjb25zdBgBIAEoBUJzwkhwCm4KCmVudW0uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxIUCgxkZWZpbmVkX29ubHkYAiABKAgSfgoCaW4YAyADKAVCcsJIbwptCgdlbnVtLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ1CgZub3RfaW4YBCADKAVCZcJIYgpgCgtlbnVtLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEioKB2V4YW1wbGUYBSADKAVCGcJIFgoUCgxlbnVtLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAiL7AwoNUmVwZWF0ZWRSdWxlcxKeAQoJbWluX2l0ZW1zGAEgASgEQooBwkiGAQqDAQoScmVwZWF0ZWQubWluX2l0ZW1zGm11aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9pdGVtcyA/ICd2YWx1ZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJWQgaXRlbShzKScuZm9ybWF0KFtydWxlcy5taW5faXRlbXNdKSA6ICcnEqIBCgltYXhfaXRlbXMYAiABKARCjgHCSIoBCocBChJyZXBlYXRlZC5tYXhfaXRlbXMacXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJXMgaXRlbShzKScuZm9ybWF0KFtydWxlcy5tYXhfaXRlbXNdKSA6ICcnEnAKBnVuaXF1ZRgDIAEoCEJgwkhdClsKD3JlcGVhdGVkLnVuaXF1ZRIocmVwZWF0ZWQgdmFsdWUgbXVzdCBjb250YWluIHVuaXF1ZSBpdGVtcxoeIXJ1bGVzLnVuaXF1ZSB8fCB0aGlzLnVuaXF1ZSgpEicKBWl0ZW1zGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMqCQjoBxCAgICAAiKKAwoITWFwUnVsZXMSjwEKCW1pbl9wYWlycxgBIAEoBEJ8wkh5CncKDW1hcC5taW5fcGFpcnMaZnVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX3BhaXJzID8gJ21hcCBtdXN0IGJlIGF0IGxlYXN0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWluX3BhaXJzXSkgOiAnJxKOAQoJbWF4X3BhaXJzGAIgASgEQnvCSHgKdgoNbWFwLm1heF9wYWlycxpldWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbW9zdCAlZCBlbnRyaWVzJy5mb3JtYXQoW3J1bGVzLm1heF9wYWlyc10pIDogJycSJgoEa2V5cxgEIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzEigKBnZhbHVlcxgFIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzKgkI6AcQgICAgAIiJgoIQW55UnVsZXMSCgoCaW4YAiADKAkSDgoGbm90X2luGAMgAygJIpkXCg1EdXJhdGlvblJ1bGVzEqEBCgVjb25zdBgCIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJ3wkh0CnIKDmR1cmF0aW9uLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSqAEKAmx0GAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQn/CSHwKegoLZHVyYXRpb24ubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASugEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKPAcJIiwEKiAEKDGR1cmF0aW9uLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASwQcKAmd0GAUgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQpcHwkiTBwp9CgtkdXJhdGlvbi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDmR1cmF0aW9uLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYZHVyYXRpb24uZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD2R1cmF0aW9uLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGWR1cmF0aW9uLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEo0ICgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25C4gfCSN4HCosBCgxkdXJhdGlvbi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPZHVyYXRpb24uZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQZHVyYXRpb24uZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESnQEKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnbCSHMKcQoLZHVyYXRpb24uaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEpQBCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CacJIZgpkCg9kdXJhdGlvbi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxJJCgdleGFtcGxlGAkgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQh3CSBoKGAoQZHVyYXRpb24uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i/QUKDkZpZWxkTWFza1J1bGVzEr8BCgVjb25zdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCkwHCSI8BCowBChBmaWVsZF9tYXNrLmNvbnN0Gnh0aGlzLnBhdGhzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRocyA/ICd2YWx1ZSBtdXN0IGVxdWFsIHBhdGhzICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRoc10pIDogJycS2QEKAmluGAIgAygJQswBwkjIAQrFAQoNZmllbGRfbWFzay5pbhqzASF0aGlzLnBhdGhzLmFsbChwLCBwIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ2luJykuZXhpc3RzKGYsIHAuc3RhcnRzV2l0aChmKycuJykpKSA/ICd2YWx1ZSBtdXN0IG9ubHkgY29udGFpbiBwYXRocyBpbiAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEvMBCgZub3RfaW4YAyADKAlC4gHCSN4BCtsBChFmaWVsZF9tYXNrLm5vdF9pbhrFASF0aGlzLnBhdGhzLmFsbChwLCAhKHAgaW4gZ2V0RmllbGQocnVsZXMsICdub3RfaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ25vdF9pbicpLmV4aXN0cyhmLCBwLnN0YXJ0c1dpdGgoZisnLicpKSkpID8gJ3ZhbHVlIG11c3Qgbm90IGNvbnRhaW4gYW55IHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnbm90X2luJyldKSA6ICcnEkwKB2V4YW1wbGUYBCADKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQh/CSBwKGgoSZmllbGRfbWFzay5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIikhgKDlRpbWVzdGFtcFJ1bGVzEqMBCgVjb25zdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCeMJIdQpzCg90aW1lc3RhbXAuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKrAQoCbHQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQoABwkh9CnsKDHRpbWVzdGFtcC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABK8AQoDbHRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKQAcJIjAEKiQEKDXRpbWVzdGFtcC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEmwKBmx0X25vdxgHIAEoCEJawkhXClUKEHRpbWVzdGFtcC5sdF9ub3caQShydWxlcy5sdF9ub3cgJiYgdGhpcyA+IG5vdykgPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gbm93JyA6ICcnSAASxwcKAmd0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKcB8JImAcKfgoMdGltZXN0YW1wLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq3AQoPdGltZXN0YW1wLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq/AQoZdGltZXN0YW1wLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCscBChB0aW1lc3RhbXAuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrPAQoadGltZXN0YW1wLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEpMICgNndGUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQucHwkjjBwqMAQoNdGltZXN0YW1wLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsYBChB0aW1lc3RhbXAuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs4BChp0aW1lc3RhbXAuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1gEKEXRpbWVzdGFtcC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt4BCht0aW1lc3RhbXAuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESbwoGZ3Rfbm93GAggASgIQl3CSFoKWAoQdGltZXN0YW1wLmd0X25vdxpEKHJ1bGVzLmd0X25vdyAmJiB0aGlzIDwgbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cnIDogJydIARK4AQoGd2l0aGluGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQowBwkiIAQqFAQoQdGltZXN0YW1wLndpdGhpbhpxdGhpcyA8IG5vdy1ydWxlcy53aXRoaW4gfHwgdGhpcyA+IG5vdytydWxlcy53aXRoaW4gPyAndmFsdWUgbXVzdCBiZSB3aXRoaW4gJXMgb2Ygbm93Jy5mb3JtYXQoW3J1bGVzLndpdGhpbl0pIDogJycSSwoHZXhhbXBsZRgKIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCHsJIGwoZChF0aW1lc3RhbXAuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iOQoKVmlvbGF0aW9ucxIrCgp2aW9sYXRpb25zGAEgAygLMhcuYnVmLnZhbGlkYXRlLlZpb2xhdGlvbiKfAQoJVmlvbGF0aW9uEiYKBWZpZWxkGAUgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aBIlCgRydWxlGAYgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aBIPCgdydWxlX2lkGAIgASgJEg8KB21lc3NhZ2UYAyABKAkSDwoHZm9yX2tleRgEIAEoCEoECAEQAlIKZmllbGRfcGF0aCI9CglGaWVsZFBhdGgSMAoIZWxlbWVudHMYASADKAsyHi5idWYudmFsaWRhdGUuRmllbGRQYXRoRWxlbWVudCLpAgoQRmllbGRQYXRoRWxlbWVudBIUCgxmaWVsZF9udW1iZXIYASABKAUSEgoKZmllbGRfbmFtZRgCIAEoCRI+CgpmaWVsZF90eXBlGAMgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSPAoIa2V5X3R5cGUYBCABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRI+Cgp2YWx1ZV90eXBlGAUgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSDwoFaW5kZXgYBiABKARIABISCghib29sX2tleRgHIAEoCEgAEhEKB2ludF9rZXkYCCABKANIABISCgh1aW50X2tleRgJIAEoBEgAEhQKCnN0cmluZ19rZXkYCiABKAlIAEILCglzdWJzY3JpcHQqoQEKBklnbm9yZRIWChJJR05PUkVfVU5TUEVDSUZJRUQQABIYChRJR05PUkVfSUZfWkVST19WQUxVRRABEhEKDUlHTk9SRV9BTFdBWVMQAyIECAIQAioMSUdOT1JFX0VNUFRZKg5JR05PUkVfREVGQVVMVCoXSUdOT1JFX0lGX0RFRkFVTFRfVkFMVUUqFUlHTk9SRV9JRl9VTlBPUFVMQVRFRCpuCgpLbm93blJlZ2V4EhsKF0tOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEEAASIAocS05PV05fUkVHRVhfSFRUUF9IRUFERVJfTkFNRRABEiEKHUtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFEAI6VgoHbWVzc2FnZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiHCSABKAsyGi5idWYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlOk4KBW9uZW9mEh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucxiHCSABKAsyGC5idWYudmFsaWRhdGUuT25lb2ZSdWxlc1IFb25lb2Y6TgoFZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVmaWVsZDpdCgpwcmVkZWZpbmVkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiICSABKAsyHS5idWYudmFsaWRhdGUuUHJlZGVmaW5lZFJ1bGVzUgpwcmVkZWZpbmVkQrsBChBjb20uYnVmLnZhbGlkYXRlQg1WYWxpZGF0ZVByb3RvUAFaR2J1Zi5idWlsZC9nZW4vZ28vYnVmYnVpbGQvcHJvdG92YWxpZGF0ZS9wcm90b2NvbGJ1ZmZlcnMvZ28vYnVmL3ZhbGlkYXRlogIDQlZYqgIMQnVmLlZhbGlkYXRlygIMQnVmXFZhbGlkYXRl4gIYQnVmXFZhbGlkYXRlXEdQQk1ldGFkYXRh6gINQnVmOjpWYWxpZGF0ZQ\", [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\nexport type RuleValid = Rule;\n\n/**\n * Describes the message buf.validate.Rule.\n * Use `create(RuleSchema)` to create a new message.\n */\nexport const RuleSchema: GenMessage<Rule, {validType: RuleValid}> = /*@__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: \"value 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\nexport type MessageRulesValid = MessageRules;\n\n/**\n * Describes the message buf.validate.MessageRules.\n * Use `create(MessageRulesSchema)` to create a new message.\n */\nexport const MessageRulesSchema: GenMessage<MessageRules, {validType: MessageRulesValid}> = /*@__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\nexport type MessageOneofRuleValid = MessageOneofRule;\n\n/**\n * Describes the message buf.validate.MessageOneofRule.\n * Use `create(MessageOneofRuleSchema)` to create a new message.\n */\nexport const MessageOneofRuleSchema: GenMessage<MessageOneofRule, {validType: MessageOneofRuleValid}> = /*@__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\nexport type OneofRulesValid = OneofRules;\n\n/**\n * Describes the message buf.validate.OneofRules.\n * Use `create(OneofRulesSchema)` to create a new message.\n */\nexport const OneofRulesSchema: GenMessage<OneofRules, {validType: OneofRulesValid}> = /*@__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: \"value 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\nexport type FieldRulesValid = FieldRules;\n\n/**\n * Describes the message buf.validate.FieldRules.\n * Use `create(FieldRulesSchema)` to create a new message.\n */\nexport const FieldRulesSchema: GenMessage<FieldRules, {validType: FieldRulesValid}> = /*@__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: \"value 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\nexport type PredefinedRulesValid = PredefinedRules;\n\n/**\n * Describes the message buf.validate.PredefinedRules.\n * Use `create(PredefinedRulesSchema)` to create a new message.\n */\nexport const PredefinedRulesSchema: GenMessage<PredefinedRules, {validType: PredefinedRulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5.0 [float.gt]\n * float value = 1 [(buf.validate.field).float.gt = 5.0];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5.0 [float.gte]\n * float value = 1 [(buf.validate.field).float.gte = 5.0];\n *\n * // value 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 * // value 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 * // value 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 * `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\nexport type FloatRulesValid = FloatRules;\n\n/**\n * Describes the message buf.validate.FloatRules.\n * Use `create(FloatRulesSchema)` to create a new message.\n */\nexport const FloatRulesSchema: GenMessage<FloatRules, {validType: FloatRulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5.0 [double.gt]\n * double value = 1 [(buf.validate.field).double.gt = 5.0];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5.0 [double.gte]\n * double value = 1 [(buf.validate.field).double.gte = 5.0];\n *\n * // value 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 * // value 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 * // value 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\nexport type DoubleRulesValid = DoubleRules;\n\n/**\n * Describes the message buf.validate.DoubleRules.\n * Use `create(DoubleRulesSchema)` to create a new message.\n */\nexport const DoubleRulesSchema: GenMessage<DoubleRules, {validType: DoubleRulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [int32.gt]\n * int32 value = 1 [(buf.validate.field).int32.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [int32.gte]\n * int32 value = 1 [(buf.validate.field).int32.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type Int32RulesValid = Int32Rules;\n\n/**\n * Describes the message buf.validate.Int32Rules.\n * Use `create(Int32RulesSchema)` to create a new message.\n */\nexport const Int32RulesSchema: GenMessage<Int32Rules, {validType: Int32RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [int64.gt]\n * int64 value = 1 [(buf.validate.field).int64.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [int64.gte]\n * int64 value = 1 [(buf.validate.field).int64.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type Int64RulesValid = Int64Rules;\n\n/**\n * Describes the message buf.validate.Int64Rules.\n * Use `create(Int64RulesSchema)` to create a new message.\n */\nexport const Int64RulesSchema: GenMessage<Int64Rules, {validType: Int64RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [uint32.gt]\n * uint32 value = 1 [(buf.validate.field).uint32.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [uint32.gte]\n * uint32 value = 1 [(buf.validate.field).uint32.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type UInt32RulesValid = UInt32Rules;\n\n/**\n * Describes the message buf.validate.UInt32Rules.\n * Use `create(UInt32RulesSchema)` to create a new message.\n */\nexport const UInt32RulesSchema: GenMessage<UInt32Rules, {validType: UInt32RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [uint64.gt]\n * uint64 value = 1 [(buf.validate.field).uint64.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [uint64.gte]\n * uint64 value = 1 [(buf.validate.field).uint64.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type UInt64RulesValid = UInt64Rules;\n\n/**\n * Describes the message buf.validate.UInt64Rules.\n * Use `create(UInt64RulesSchema)` to create a new message.\n */\nexport const UInt64RulesSchema: GenMessage<UInt64Rules, {validType: UInt64RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [sint32.gt]\n * sint32 value = 1 [(buf.validate.field).sint32.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [sint32.gte]\n * sint32 value = 1 [(buf.validate.field).sint32.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type SInt32RulesValid = SInt32Rules;\n\n/**\n * Describes the message buf.validate.SInt32Rules.\n * Use `create(SInt32RulesSchema)` to create a new message.\n */\nexport const SInt32RulesSchema: GenMessage<SInt32Rules, {validType: SInt32RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [sint64.gt]\n * sint64 value = 1 [(buf.validate.field).sint64.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [sint64.gte]\n * sint64 value = 1 [(buf.validate.field).sint64.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type SInt64RulesValid = SInt64Rules;\n\n/**\n * Describes the message buf.validate.SInt64Rules.\n * Use `create(SInt64RulesSchema)` to create a new message.\n */\nexport const SInt64RulesSchema: GenMessage<SInt64Rules, {validType: SInt64RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [fixed32.gt]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [fixed32.gte]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type Fixed32RulesValid = Fixed32Rules;\n\n/**\n * Describes the message buf.validate.Fixed32Rules.\n * Use `create(Fixed32RulesSchema)` to create a new message.\n */\nexport const Fixed32RulesSchema: GenMessage<Fixed32Rules, {validType: Fixed32RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [fixed64.gt]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [fixed64.gte]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type Fixed64RulesValid = Fixed64Rules;\n\n/**\n * Describes the message buf.validate.Fixed64Rules.\n * Use `create(Fixed64RulesSchema)` to create a new message.\n */\nexport const Fixed64RulesSchema: GenMessage<Fixed64Rules, {validType: Fixed64RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [sfixed32.gt]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [sfixed32.gte]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type SFixed32RulesValid = SFixed32Rules;\n\n/**\n * Describes the message buf.validate.SFixed32Rules.\n * Use `create(SFixed32RulesSchema)` to create a new message.\n */\nexport const SFixed32RulesSchema: GenMessage<SFixed32Rules, {validType: SFixed32RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [sfixed64.gt]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [sfixed64.gte]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type SFixed64RulesValid = SFixed64Rules;\n\n/**\n * Describes the message buf.validate.SFixed64Rules.\n * Use `create(SFixed64RulesSchema)` to create a new message.\n */\nexport const SFixed64RulesSchema: GenMessage<SFixed64Rules, {validType: SFixed64RulesValid}> = /*@__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 = 1,\n * (buf.validate.field).bool.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bool example = 2;\n */\n example: boolean[];\n};\n\nexport type BoolRulesValid = BoolRules;\n\n/**\n * Describes the message buf.validate.BoolRules.\n * Use `create(BoolRulesSchema)` to create a new message.\n */\nexport const BoolRulesSchema: GenMessage<BoolRules, {validType: BoolRulesValid}> = /*@__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 * // value must be in list [\"apple\", \"banana\"]\n * string value = 1 [(buf.validate.field).string.in = \"apple\", (buf.validate.field).string.in = \"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\", (buf.validate.field).string.not_in = \"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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 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 * // value 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 * `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 * // value 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\nexport type StringRulesValid = StringRules;\n\n/**\n * Describes the message buf.validate.StringRules.\n * Use `create(StringRulesSchema)` to create a new message.\n */\nexport const StringRulesSchema: GenMessage<StringRules, {validType: StringRulesValid}> = /*@__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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 the 128-bit UUID data as\n * defined by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2).\n * The field must contain exactly 16 bytes\n * representing the UUID. If the field value isn't a valid UUID, an error\n * message will be generated.\n *\n * ```proto\n * message MyBytes {\n * // value 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\nexport type BytesRulesValid = BytesRules;\n\n/**\n * Describes the message buf.validate.BytesRules.\n * Use `create(BytesRulesSchema)` to create a new message.\n */\nexport const BytesRulesSchema: GenMessage<BytesRules, {validType: BytesRulesValid}> = /*@__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 * (buf.validate.field).enum.example = 1,\n * (buf.validate.field).enum.example = 2\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 5;\n */\n example: number[];\n};\n\nexport type EnumRulesValid = EnumRules;\n\n/**\n * Describes the message buf.validate.EnumRules.\n * Use `create(EnumRulesSchema)` to create a new message.\n */\nexport const EnumRulesSchema: GenMessage<EnumRules, {validType: EnumRulesValid}> = /*@__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\nexport type RepeatedRulesValid = RepeatedRules;\n\n/**\n * Describes the message buf.validate.RepeatedRules.\n * Use `create(RepeatedRulesSchema)` to create a new message.\n */\nexport const RepeatedRulesSchema: GenMessage<RepeatedRules, {validType: RepeatedRulesValid}> = /*@__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<string, string> 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<string, string> 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<string, string> 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<string, string> 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\nexport type MapRulesValid = MapRules;\n\n/**\n * Describes the message buf.validate.MapRules.\n * Use `create(MapRulesSchema)` to create a new message.\n */\nexport const MapRulesSchema: GenMessage<MapRules, {validType: MapRulesValid}> = /*@__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 * 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\nexport type AnyRulesValid = AnyRules;\n\n/**\n * Describes the message buf.validate.AnyRules.\n * Use `create(AnyRulesSchema)` to create a new message.\n */\nexport const AnyRulesSchema: GenMessage<AnyRules, {validType: AnyRulesValid}> = /*@__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 = \"5s\"];\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 * // value must be less than 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = \"5s\"];\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 * // value must be less than or equal to 10s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = \"10s\"];\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 * // value must be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.in = [\"1s\", \"2s\", \"3s\"]];\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.not_in = [\"1s\", \"2s\", \"3s\"]];\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\nexport type DurationRulesValid = DurationRules;\n\n/**\n * Describes the message buf.validate.DurationRules.\n * Use `create(DurationRulesSchema)` to create a new message.\n */\nexport const DurationRulesSchema: GenMessage<DurationRules, {validType: DurationRulesValid}> = /*@__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\nexport type FieldMaskRulesValid = FieldMaskRules;\n\n/**\n * Describes the message buf.validate.FieldMaskRules.\n * Use `create(FieldMaskRulesSchema)` to create a new message.\n */\nexport const FieldMaskRulesSchema: GenMessage<FieldMaskRules, {validType: FieldMaskRulesValid}> = /*@__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 * requires the duration 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 MyDuration {\n * // duration must be less than 'P3D' [duration.lt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = { seconds: 259200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lt = 3;\n */\n value: Timestamp;\n case: \"lt\";\n } | {\n /**\n * 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 * // value 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 * // value 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 * // value 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\nexport type TimestampRulesValid = TimestampRules;\n\n/**\n * Describes the message buf.validate.TimestampRules.\n * Use `create(TimestampRulesSchema)` to create a new message.\n */\nexport const TimestampRulesSchema: GenMessage<TimestampRules, {validType: TimestampRulesValid}> = /*@__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\nexport type ViolationsValid = Violations;\n\n/**\n * Describes the message buf.validate.Violations.\n * Use `create(ViolationsSchema)` to create a new message.\n */\nexport const ViolationsSchema: GenMessage<Violations, {validType: ViolationsValid}> = /*@__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\nexport type ViolationValid = Violation;\n\n/**\n * Describes the message buf.validate.Violation.\n * Use `create(ViolationSchema)` to create a new message.\n */\nexport const ViolationSchema: GenMessage<Violation, {validType: ViolationValid}> = /*@__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\nexport type FieldPathValid = FieldPath;\n\n/**\n * Describes the message buf.validate.FieldPath.\n * Use `create(FieldPathSchema)` to create a new message.\n */\nexport const FieldPathSchema: GenMessage<FieldPath, {validType: FieldPathValid}> = /*@__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\nexport type FieldPathElementValid = FieldPathElement;\n\n/**\n * Describes the message buf.validate.FieldPathElement.\n * Use `create(FieldPathElementSchema)` to create a new message.\n */\nexport const FieldPathElementSchema: GenMessage<FieldPathElement, {validType: FieldPathElementValid}> = /*@__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<Ignore> = /*@__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<KnownRegex> = /*@__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<MessageOptions, MessageRules> = /*@__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<OneofOptions, OneofRules> = /*@__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<FieldOptions, FieldRules> = /*@__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 [(buf.validate.predefined).cel = {\n * id: \"int32.is_zero\",\n * message: \"value 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<FieldOptions, PredefinedRules> = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 3);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/contact/v1/contact.proto (package fluxlay.contact.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_buf_validate_validate } from \"../../../buf/validate/validate_pb.ts\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/contact/v1/contact.proto.\n */\nexport const file_fluxlay_contact_v1_contact: GenFile = /*@__PURE__*/\n fileDesc(\"CiBmbHV4bGF5L2NvbnRhY3QvdjEvY29udGFjdC5wcm90bxISZmx1eGxheS5jb250YWN0LnYxIrUBChJTZW5kQ29udGFjdFJlcXVlc3QSPwoIY2F0ZWdvcnkYASABKA4yIy5mbHV4bGF5LmNvbnRhY3QudjEuQ29udGFjdENhdGVnb3J5Qgi6SAWCAQIgABIVCgRuYW1lGAIgASgJQge6SARyAhABEhYKBWVtYWlsGAMgASgJQge6SARyAmABEhgKB3N1YmplY3QYBCABKAlCB7pIBHICEAESFQoEYm9keRgFIAEoCUIHukgEcgIQASIVChNTZW5kQ29udGFjdFJlc3BvbnNlKsMCCg9Db250YWN0Q2F0ZWdvcnkSIAocQ09OVEFDVF9DQVRFR09SWV9VTlNQRUNJRklFRBAAEh8KG0NPTlRBQ1RfQ0FURUdPUllfQlVHX1JFUE9SVBABEiQKIENPTlRBQ1RfQ0FURUdPUllfRkVBVFVSRV9SRVFVRVNUEAISIgoeQ09OVEFDVF9DQVRFR09SWV9BQ0NPVU5UX0lTU1VFEAMSHgoaQ09OVEFDVF9DQVRFR09SWV9DT1BZUklHSFQQBBIaChZDT05UQUNUX0NBVEVHT1JZX09USEVSEAUSHAoYQ09OVEFDVF9DQVRFR09SWV9SRVZFTlVFEAYSIwofQ09OVEFDVF9DQVRFR09SWV9DT05URU5UX1JFVklFVxAHEiQKIENPTlRBQ1RfQ0FURUdPUllfQ1JFQVRPUl9QUk9HUkFNEAhC1QEKFmNvbS5mbHV4bGF5LmNvbnRhY3QudjFCDENvbnRhY3RQcm90b1ABWkNnaXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L2NvbnRhY3QvdjE7Y29udGFjdHYxogIDRkNYqgISRmx1eGxheS5Db250YWN0LlYxygISRmx1eGxheVxDb250YWN0XFYx4gIeRmx1eGxheVxDb250YWN0XFYxXEdQQk1ldGFkYXRh6gIURmx1eGxheTo6Q29udGFjdDo6VjFiBnByb3RvMw\", [file_buf_validate_validate]);\n\n/**\n * @generated from message fluxlay.contact.v1.SendContactRequest\n */\nexport type SendContactRequest = Message<\"fluxlay.contact.v1.SendContactRequest\"> & {\n /**\n * @generated from field: fluxlay.contact.v1.ContactCategory category = 1;\n */\n category: ContactCategory;\n\n /**\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: string email = 3;\n */\n email: string;\n\n /**\n * @generated from field: string subject = 4;\n */\n subject: string;\n\n /**\n * @generated from field: string body = 5;\n */\n body: string;\n};\n\nexport type SendContactRequestValid = SendContactRequest;\n\n/**\n * Describes the message fluxlay.contact.v1.SendContactRequest.\n * Use `create(SendContactRequestSchema)` to create a new message.\n */\nexport const SendContactRequestSchema: GenMessage<SendContactRequest, {validType: SendContactRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_contact_v1_contact, 0);\n\n/**\n * @generated from message fluxlay.contact.v1.SendContactResponse\n */\nexport type SendContactResponse = Message<\"fluxlay.contact.v1.SendContactResponse\"> & {\n};\n\nexport type SendContactResponseValid = SendContactResponse;\n\n/**\n * Describes the message fluxlay.contact.v1.SendContactResponse.\n * Use `create(SendContactResponseSchema)` to create a new message.\n */\nexport const SendContactResponseSchema: GenMessage<SendContactResponse, {validType: SendContactResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_contact_v1_contact, 1);\n\n/**\n * @generated from enum fluxlay.contact.v1.ContactCategory\n */\nexport enum ContactCategory {\n /**\n * @generated from enum value: CONTACT_CATEGORY_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_BUG_REPORT = 1;\n */\n BUG_REPORT = 1,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_FEATURE_REQUEST = 2;\n */\n FEATURE_REQUEST = 2,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_ACCOUNT_ISSUE = 3;\n */\n ACCOUNT_ISSUE = 3,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_COPYRIGHT = 4;\n */\n COPYRIGHT = 4,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_OTHER = 5;\n */\n OTHER = 5,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_REVENUE = 6;\n */\n REVENUE = 6,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_CONTENT_REVIEW = 7;\n */\n CONTENT_REVIEW = 7,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_CREATOR_PROGRAM = 8;\n */\n CREATOR_PROGRAM = 8,\n}\n\n/**\n * Describes the enum fluxlay.contact.v1.ContactCategory.\n */\nexport const ContactCategorySchema: GenEnum<ContactCategory> = /*@__PURE__*/\n enumDesc(file_fluxlay_contact_v1_contact, 0);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/notification/v1/notification.proto (package fluxlay.notification.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../buf/validate/validate_pb.ts\";\nimport type { Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/notification/v1/notification.proto.\n */\nexport const file_fluxlay_notification_v1_notification: GenFile = /*@__PURE__*/\n fileDesc(\"CipmbHV4bGF5L25vdGlmaWNhdGlvbi92MS9ub3RpZmljYXRpb24ucHJvdG8SF2ZsdXhsYXkubm90aWZpY2F0aW9uLnYxIncKDE5vdGlmaWNhdGlvbhIKCgJpZBgBIAEoCRIMCgRraW5kGAIgASgJEg8KB3BheWxvYWQYAyABKAkSDAoEcmVhZBgEIAEoCBIuCgpjcmVhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJMChhMaXN0Tm90aWZpY2F0aW9uc1JlcXVlc3QSHAoJcGFnZV9zaXplGAEgASgFQgm6SAYaBBhkKAASEgoKcGFnZV90b2tlbhgCIAEoCSJyChlMaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlEjwKDW5vdGlmaWNhdGlvbnMYASADKAsyJS5mbHV4bGF5Lm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIiMKIUdldFVucmVhZE5vdGlmaWNhdGlvbkNvdW50UmVxdWVzdCIzCiJHZXRVbnJlYWROb3RpZmljYXRpb25Db3VudFJlc3BvbnNlEg0KBWNvdW50GAEgASgFIkAKG01hcmtOb3RpZmljYXRpb25SZWFkUmVxdWVzdBIhCg9ub3RpZmljYXRpb25faWQYASABKAlCCLpIBXIDsAEBIh4KHE1hcmtOb3RpZmljYXRpb25SZWFkUmVzcG9uc2UiIQofTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdCIiCiBNYXJrQWxsTm90aWZpY2F0aW9uc1JlYWRSZXNwb25zZUL9AQobY29tLmZsdXhsYXkubm90aWZpY2F0aW9uLnYxQhFOb3RpZmljYXRpb25Qcm90b1ABWk1naXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L25vdGlmaWNhdGlvbi92MTtub3RpZmljYXRpb252MaICA0ZOWKoCF0ZsdXhsYXkuTm90aWZpY2F0aW9uLlYxygIXRmx1eGxheVxOb3RpZmljYXRpb25cVjHiAiNGbHV4bGF5XE5vdGlmaWNhdGlvblxWMVxHUEJNZXRhZGF0YeoCGUZsdXhsYXk6Ok5vdGlmaWNhdGlvbjo6VjFiBnByb3RvMw\", [file_buf_validate_validate, file_google_protobuf_timestamp]);\n\n/**\n * アプリ内通知(FLX-112)。\n * 通知の文言はサーバーで持たず、kind + payload からクライアントが i18n レンダリングする。\n *\n * @generated from message fluxlay.notification.v1.Notification\n */\nexport type Notification = Message<\"fluxlay.notification.v1.Notification\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * 通知種別(例: thread_reply, review_rejected)。種別は API 側の定義で追加していく\n *\n * @generated from field: string kind = 2;\n */\n kind: string;\n\n /**\n * kind ごとの内容(参照リソース ID・件数等)の JSON 文字列\n *\n * @generated from field: string payload = 3;\n */\n payload: string;\n\n /**\n * @generated from field: bool read = 4;\n */\n read: boolean;\n\n /**\n * @generated from field: google.protobuf.Timestamp created_at = 5;\n */\n createdAt?: Timestamp | undefined;\n};\n\nexport type NotificationValid = Notification;\n\n/**\n * Describes the message fluxlay.notification.v1.Notification.\n * Use `create(NotificationSchema)` to create a new message.\n */\nexport const NotificationSchema: GenMessage<Notification, {validType: NotificationValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 0);\n\n/**\n * @generated from message fluxlay.notification.v1.ListNotificationsRequest\n */\nexport type ListNotificationsRequest = Message<\"fluxlay.notification.v1.ListNotificationsRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n};\n\nexport type ListNotificationsRequestValid = ListNotificationsRequest;\n\n/**\n * Describes the message fluxlay.notification.v1.ListNotificationsRequest.\n * Use `create(ListNotificationsRequestSchema)` to create a new message.\n */\nexport const ListNotificationsRequestSchema: GenMessage<ListNotificationsRequest, {validType: ListNotificationsRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 1);\n\n/**\n * @generated from message fluxlay.notification.v1.ListNotificationsResponse\n */\nexport type ListNotificationsResponse = Message<\"fluxlay.notification.v1.ListNotificationsResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.notification.v1.Notification notifications = 1;\n */\n notifications: Notification[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n};\n\nexport type ListNotificationsResponseValid = ListNotificationsResponse;\n\n/**\n * Describes the message fluxlay.notification.v1.ListNotificationsResponse.\n * Use `create(ListNotificationsResponseSchema)` to create a new message.\n */\nexport const ListNotificationsResponseSchema: GenMessage<ListNotificationsResponse, {validType: ListNotificationsResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 2);\n\n/**\n * @generated from message fluxlay.notification.v1.GetUnreadNotificationCountRequest\n */\nexport type GetUnreadNotificationCountRequest = Message<\"fluxlay.notification.v1.GetUnreadNotificationCountRequest\"> & {\n};\n\nexport type GetUnreadNotificationCountRequestValid = GetUnreadNotificationCountRequest;\n\n/**\n * Describes the message fluxlay.notification.v1.GetUnreadNotificationCountRequest.\n * Use `create(GetUnreadNotificationCountRequestSchema)` to create a new message.\n */\nexport const GetUnreadNotificationCountRequestSchema: GenMessage<GetUnreadNotificationCountRequest, {validType: GetUnreadNotificationCountRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 3);\n\n/**\n * @generated from message fluxlay.notification.v1.GetUnreadNotificationCountResponse\n */\nexport type GetUnreadNotificationCountResponse = Message<\"fluxlay.notification.v1.GetUnreadNotificationCountResponse\"> & {\n /**\n * @generated from field: int32 count = 1;\n */\n count: number;\n};\n\nexport type GetUnreadNotificationCountResponseValid = GetUnreadNotificationCountResponse;\n\n/**\n * Describes the message fluxlay.notification.v1.GetUnreadNotificationCountResponse.\n * Use `create(GetUnreadNotificationCountResponseSchema)` to create a new message.\n */\nexport const GetUnreadNotificationCountResponseSchema: GenMessage<GetUnreadNotificationCountResponse, {validType: GetUnreadNotificationCountResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 4);\n\n/**\n * @generated from message fluxlay.notification.v1.MarkNotificationReadRequest\n */\nexport type MarkNotificationReadRequest = Message<\"fluxlay.notification.v1.MarkNotificationReadRequest\"> & {\n /**\n * @generated from field: string notification_id = 1;\n */\n notificationId: string;\n};\n\nexport type MarkNotificationReadRequestValid = MarkNotificationReadRequest;\n\n/**\n * Describes the message fluxlay.notification.v1.MarkNotificationReadRequest.\n * Use `create(MarkNotificationReadRequestSchema)` to create a new message.\n */\nexport const MarkNotificationReadRequestSchema: GenMessage<MarkNotificationReadRequest, {validType: MarkNotificationReadRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 5);\n\n/**\n * @generated from message fluxlay.notification.v1.MarkNotificationReadResponse\n */\nexport type MarkNotificationReadResponse = Message<\"fluxlay.notification.v1.MarkNotificationReadResponse\"> & {\n};\n\nexport type MarkNotificationReadResponseValid = MarkNotificationReadResponse;\n\n/**\n * Describes the message fluxlay.notification.v1.MarkNotificationReadResponse.\n * Use `create(MarkNotificationReadResponseSchema)` to create a new message.\n */\nexport const MarkNotificationReadResponseSchema: GenMessage<MarkNotificationReadResponse, {validType: MarkNotificationReadResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 6);\n\n/**\n * @generated from message fluxlay.notification.v1.MarkAllNotificationsReadRequest\n */\nexport type MarkAllNotificationsReadRequest = Message<\"fluxlay.notification.v1.MarkAllNotificationsReadRequest\"> & {\n};\n\nexport type MarkAllNotificationsReadRequestValid = MarkAllNotificationsReadRequest;\n\n/**\n * Describes the message fluxlay.notification.v1.MarkAllNotificationsReadRequest.\n * Use `create(MarkAllNotificationsReadRequestSchema)` to create a new message.\n */\nexport const MarkAllNotificationsReadRequestSchema: GenMessage<MarkAllNotificationsReadRequest, {validType: MarkAllNotificationsReadRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 7);\n\n/**\n * @generated from message fluxlay.notification.v1.MarkAllNotificationsReadResponse\n */\nexport type MarkAllNotificationsReadResponse = Message<\"fluxlay.notification.v1.MarkAllNotificationsReadResponse\"> & {\n};\n\nexport type MarkAllNotificationsReadResponseValid = MarkAllNotificationsReadResponse;\n\n/**\n * Describes the message fluxlay.notification.v1.MarkAllNotificationsReadResponse.\n * Use `create(MarkAllNotificationsReadResponseSchema)` to create a new message.\n */\nexport const MarkAllNotificationsReadResponseSchema: GenMessage<MarkAllNotificationsReadResponse, {validType: MarkAllNotificationsReadResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 8);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/stats/v1/stats.proto (package fluxlay.stats.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/stats/v1/stats.proto.\n */\nexport const file_fluxlay_stats_v1_stats: GenFile = /*@__PURE__*/\n fileDesc(\"ChxmbHV4bGF5L3N0YXRzL3YxL3N0YXRzLnByb3RvEhBmbHV4bGF5LnN0YXRzLnYxIhcKFUdldFB1YmxpY1N0YXRzUmVxdWVzdCJsChZHZXRQdWJsaWNTdGF0c1Jlc3BvbnNlEh4KFnB1YmxpY193YWxscGFwZXJfY291bnQYASABKAUSFQoNY3JlYXRvcl9jb3VudBgCIAEoBRIbChN0b3RhbF9saWNlbnNlX2NvdW50GAMgASgDQsUBChRjb20uZmx1eGxheS5zdGF0cy52MUIKU3RhdHNQcm90b1ABWj9naXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L3N0YXRzL3YxO3N0YXRzdjGiAgNGU1iqAhBGbHV4bGF5LlN0YXRzLlYxygIQRmx1eGxheVxTdGF0c1xWMeICHEZsdXhsYXlcU3RhdHNcVjFcR1BCTWV0YWRhdGHqAhJGbHV4bGF5OjpTdGF0czo6VjFiBnByb3RvMw\");\n\n/**\n * @generated from message fluxlay.stats.v1.GetPublicStatsRequest\n */\nexport type GetPublicStatsRequest = Message<\"fluxlay.stats.v1.GetPublicStatsRequest\"> & {\n};\n\nexport type GetPublicStatsRequestValid = GetPublicStatsRequest;\n\n/**\n * Describes the message fluxlay.stats.v1.GetPublicStatsRequest.\n * Use `create(GetPublicStatsRequestSchema)` to create a new message.\n */\nexport const GetPublicStatsRequestSchema: GenMessage<GetPublicStatsRequest, {validType: GetPublicStatsRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stats_v1_stats, 0);\n\n/**\n * プラットフォームの公開統計。認証不要で誰でも取得できる。\n *\n * @generated from message fluxlay.stats.v1.GetPublicStatsResponse\n */\nexport type GetPublicStatsResponse = Message<\"fluxlay.stats.v1.GetPublicStatsResponse\"> & {\n /**\n * 公開中の壁紙数\n *\n * @generated from field: int32 public_wallpaper_count = 1;\n */\n publicWallpaperCount: number;\n\n /**\n * 公開壁紙を持つクリエイター数\n *\n * @generated from field: int32 creator_count = 2;\n */\n creatorCount: number;\n\n /**\n * 累計ライセンス取得数 (ダウンロード数)\n *\n * @generated from field: int64 total_license_count = 3;\n */\n totalLicenseCount: bigint;\n};\n\nexport type GetPublicStatsResponseValid = GetPublicStatsResponse;\n\n/**\n * Describes the message fluxlay.stats.v1.GetPublicStatsResponse.\n * Use `create(GetPublicStatsResponseSchema)` to create a new message.\n */\nexport const GetPublicStatsResponseSchema: GenMessage<GetPublicStatsResponse, {validType: GetPublicStatsResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stats_v1_stats, 1);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/stripe/v1/stripe.proto (package fluxlay.stripe.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/stripe/v1/stripe.proto.\n */\nexport const file_fluxlay_stripe_v1_stripe: GenFile = /*@__PURE__*/\n fileDesc(\"Ch5mbHV4bGF5L3N0cmlwZS92MS9zdHJpcGUucHJvdG8SEWZsdXhsYXkuc3RyaXBlLnYxIhYKFENyZWF0ZUFjY291bnRSZXF1ZXN0IlAKFUNyZWF0ZUFjY291bnRSZXNwb25zZRIZChFzdHJpcGVfYWNjb3VudF9pZBgBIAEoCRIcChRvbmJvYXJkaW5nX2NvbXBsZXRlZBgCIAEoCCIdChtDcmVhdGVBY2NvdW50U2Vzc2lvblJlcXVlc3QiNQocQ3JlYXRlQWNjb3VudFNlc3Npb25SZXNwb25zZRIVCg1jbGllbnRfc2VjcmV0GAEgASgJIhkKF0dldEFjY291bnRTdGF0dXNSZXF1ZXN0Iq0BChhHZXRBY2NvdW50U3RhdHVzUmVzcG9uc2USEwoLaGFzX2FjY291bnQYASABKAgSHAoUb25ib2FyZGluZ19jb21wbGV0ZWQYAiABKAgSHAoUcGVuZGluZ192ZXJpZmljYXRpb24YAyADKAkSFQoNY3VycmVudGx5X2R1ZRgEIAMoCRIQCghwYXN0X2R1ZRgFIAMoCRIXCg9kaXNhYmxlZF9yZWFzb24YBiABKAlCzQEKFWNvbS5mbHV4bGF5LnN0cmlwZS52MUILU3RyaXBlUHJvdG9QAVpBZ2l0aHViLmNvbS9rZW4xMDkvZmx1eGxheS1wcm90by9nZW4vZ28vZmx1eGxheS9zdHJpcGUvdjE7c3RyaXBldjGiAgNGU1iqAhFGbHV4bGF5LlN0cmlwZS5WMcoCEUZsdXhsYXlcU3RyaXBlXFYx4gIdRmx1eGxheVxTdHJpcGVcVjFcR1BCTWV0YWRhdGHqAhNGbHV4bGF5OjpTdHJpcGU6OlYxYgZwcm90bzM\");\n\n/**\n * @generated from message fluxlay.stripe.v1.CreateAccountRequest\n */\nexport type CreateAccountRequest = Message<\"fluxlay.stripe.v1.CreateAccountRequest\"> & {\n};\n\nexport type CreateAccountRequestValid = CreateAccountRequest;\n\n/**\n * Describes the message fluxlay.stripe.v1.CreateAccountRequest.\n * Use `create(CreateAccountRequestSchema)` to create a new message.\n */\nexport const CreateAccountRequestSchema: GenMessage<CreateAccountRequest, {validType: CreateAccountRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 0);\n\n/**\n * @generated from message fluxlay.stripe.v1.CreateAccountResponse\n */\nexport type CreateAccountResponse = Message<\"fluxlay.stripe.v1.CreateAccountResponse\"> & {\n /**\n * @generated from field: string stripe_account_id = 1;\n */\n stripeAccountId: string;\n\n /**\n * @generated from field: bool onboarding_completed = 2;\n */\n onboardingCompleted: boolean;\n};\n\nexport type CreateAccountResponseValid = CreateAccountResponse;\n\n/**\n * Describes the message fluxlay.stripe.v1.CreateAccountResponse.\n * Use `create(CreateAccountResponseSchema)` to create a new message.\n */\nexport const CreateAccountResponseSchema: GenMessage<CreateAccountResponse, {validType: CreateAccountResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 1);\n\n/**\n * @generated from message fluxlay.stripe.v1.CreateAccountSessionRequest\n */\nexport type CreateAccountSessionRequest = Message<\"fluxlay.stripe.v1.CreateAccountSessionRequest\"> & {\n};\n\nexport type CreateAccountSessionRequestValid = CreateAccountSessionRequest;\n\n/**\n * Describes the message fluxlay.stripe.v1.CreateAccountSessionRequest.\n * Use `create(CreateAccountSessionRequestSchema)` to create a new message.\n */\nexport const CreateAccountSessionRequestSchema: GenMessage<CreateAccountSessionRequest, {validType: CreateAccountSessionRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 2);\n\n/**\n * @generated from message fluxlay.stripe.v1.CreateAccountSessionResponse\n */\nexport type CreateAccountSessionResponse = Message<\"fluxlay.stripe.v1.CreateAccountSessionResponse\"> & {\n /**\n * @generated from field: string client_secret = 1;\n */\n clientSecret: string;\n};\n\nexport type CreateAccountSessionResponseValid = CreateAccountSessionResponse;\n\n/**\n * Describes the message fluxlay.stripe.v1.CreateAccountSessionResponse.\n * Use `create(CreateAccountSessionResponseSchema)` to create a new message.\n */\nexport const CreateAccountSessionResponseSchema: GenMessage<CreateAccountSessionResponse, {validType: CreateAccountSessionResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 3);\n\n/**\n * @generated from message fluxlay.stripe.v1.GetAccountStatusRequest\n */\nexport type GetAccountStatusRequest = Message<\"fluxlay.stripe.v1.GetAccountStatusRequest\"> & {\n};\n\nexport type GetAccountStatusRequestValid = GetAccountStatusRequest;\n\n/**\n * Describes the message fluxlay.stripe.v1.GetAccountStatusRequest.\n * Use `create(GetAccountStatusRequestSchema)` to create a new message.\n */\nexport const GetAccountStatusRequestSchema: GenMessage<GetAccountStatusRequest, {validType: GetAccountStatusRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 4);\n\n/**\n * @generated from message fluxlay.stripe.v1.GetAccountStatusResponse\n */\nexport type GetAccountStatusResponse = Message<\"fluxlay.stripe.v1.GetAccountStatusResponse\"> & {\n /**\n * @generated from field: bool has_account = 1;\n */\n hasAccount: boolean;\n\n /**\n * @generated from field: bool onboarding_completed = 2;\n */\n onboardingCompleted: boolean;\n\n /**\n * 審査中の項目\n *\n * @generated from field: repeated string pending_verification = 3;\n */\n pendingVerification: string[];\n\n /**\n * 未提出の必須項目\n *\n * @generated from field: repeated string currently_due = 4;\n */\n currentlyDue: string[];\n\n /**\n * 期限切れの項目\n *\n * @generated from field: repeated string past_due = 5;\n */\n pastDue: string[];\n\n /**\n * @generated from field: string disabled_reason = 6;\n */\n disabledReason: string;\n};\n\nexport type GetAccountStatusResponseValid = GetAccountStatusResponse;\n\n/**\n * Describes the message fluxlay.stripe.v1.GetAccountStatusResponse.\n * Use `create(GetAccountStatusResponseSchema)` to create a new message.\n */\nexport const GetAccountStatusResponseSchema: GenMessage<GetAccountStatusResponse, {validType: GetAccountStatusResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 5);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/common/v1/bucket_object.proto (package fluxlay.common.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/common/v1/bucket_object.proto.\n */\nexport const file_fluxlay_common_v1_bucket_object: GenFile = /*@__PURE__*/\n fileDesc(\"CiVmbHV4bGF5L2NvbW1vbi92MS9idWNrZXRfb2JqZWN0LnByb3RvEhFmbHV4bGF5LmNvbW1vbi52MSI5ChBCdWNrZXRPYmplY3RNZXRhEg8KB3VzZXJfaWQYASABKAkSFAoMd2FsbHBhcGVyX2lkGAIgASgJIoYBCgxCdWNrZXRPYmplY3QSEwoLb2JqZWN0X3R5cGUYASABKAkSFAoMY29udGVudF90eXBlGAIgASgJEgoKAmlkGAMgASgJEgwKBG5hbWUYBCABKAkSMQoEbWV0YRgFIAEoCzIjLmZsdXhsYXkuY29tbW9uLnYxLkJ1Y2tldE9iamVjdE1ldGFC0wEKFWNvbS5mbHV4bGF5LmNvbW1vbi52MUIRQnVja2V0T2JqZWN0UHJvdG9QAVpBZ2l0aHViLmNvbS9rZW4xMDkvZmx1eGxheS1wcm90by9nZW4vZ28vZmx1eGxheS9jb21tb24vdjE7Y29tbW9udjGiAgNGQ1iqAhFGbHV4bGF5LkNvbW1vbi5WMcoCEUZsdXhsYXlcQ29tbW9uXFYx4gIdRmx1eGxheVxDb21tb25cVjFcR1BCTWV0YWRhdGHqAhNGbHV4bGF5OjpDb21tb246OlYxYgZwcm90bzM\");\n\n/**\n * @generated from message fluxlay.common.v1.BucketObjectMeta\n */\nexport type BucketObjectMeta = Message<\"fluxlay.common.v1.BucketObjectMeta\"> & {\n /**\n * @generated from field: string user_id = 1;\n */\n userId: string;\n\n /**\n * @generated from field: string wallpaper_id = 2;\n */\n wallpaperId: string;\n};\n\nexport type BucketObjectMetaValid = BucketObjectMeta;\n\n/**\n * Describes the message fluxlay.common.v1.BucketObjectMeta.\n * Use `create(BucketObjectMetaSchema)` to create a new message.\n */\nexport const BucketObjectMetaSchema: GenMessage<BucketObjectMeta, {validType: BucketObjectMetaValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_common_v1_bucket_object, 0);\n\n/**\n * @generated from message fluxlay.common.v1.BucketObject\n */\nexport type BucketObject = Message<\"fluxlay.common.v1.BucketObject\"> & {\n /**\n * @generated from field: string object_type = 1;\n */\n objectType: string;\n\n /**\n * @generated from field: string content_type = 2;\n */\n contentType: string;\n\n /**\n * @generated from field: string id = 3;\n */\n id: string;\n\n /**\n * @generated from field: string name = 4;\n */\n name: string;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObjectMeta meta = 5;\n */\n meta?: BucketObjectMeta | undefined;\n};\n\nexport type BucketObjectValid = BucketObject;\n\n/**\n * Describes the message fluxlay.common.v1.BucketObject.\n * Use `create(BucketObjectSchema)` to create a new message.\n */\nexport const BucketObjectSchema: GenMessage<BucketObject, {validType: BucketObjectValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_common_v1_bucket_object, 1);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/user/v1/user.proto (package fluxlay.user.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_buf_validate_validate } from \"../../../buf/validate/validate_pb.ts\";\nimport type { BucketObject, BucketObjectValid } from \"../../common/v1/bucket_object_pb.ts\";\nimport { file_fluxlay_common_v1_bucket_object } from \"../../common/v1/bucket_object_pb.ts\";\nimport type { Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/user/v1/user.proto.\n */\nexport const file_fluxlay_user_v1_user: GenFile = /*@__PURE__*/\n fileDesc(\"ChpmbHV4bGF5L3VzZXIvdjEvdXNlci5wcm90bxIPZmx1eGxheS51c2VyLnYxIrICCgdQcm9maWxlEg4KBmhhbmRsZRgBIAEoCRIMCgRuYW1lGAIgASgJEi8KBmF2YXRhchgDIAEoCzIfLmZsdXhsYXkuY29tbW9uLnYxLkJ1Y2tldE9iamVjdBIvCgZoZWFkZXIYBCABKAsyHy5mbHV4bGF5LmNvbW1vbi52MS5CdWNrZXRPYmplY3QSCwoDYmlvGAUgASgJEhMKC3dlYnNpdGVfdXJsGAYgASgJEgwKBHhfaWQYByABKAkSFAoMaW5zdGFncmFtX2lkGAggASgJEhEKCWdpdGh1Yl9pZBgJIAEoCRIQCghsb2NhdGlvbhgKIAEoCRIMCgR0YWdzGAsgAygJEi4KCnVwZGF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIqIBCgRVc2VyEg8KB3VzZXJfaWQYASABKAkSKQoHcHJvZmlsZRgCIAEoCzIYLmZsdXhsYXkudXNlci52MS5Qcm9maWxlEi4KCmNyZWF0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIhcKFUdldEN1cnJlbnRVc2VyUmVxdWVzdCI9ChZHZXRDdXJyZW50VXNlclJlc3BvbnNlEiMKBHVzZXIYASABKAsyFS5mbHV4bGF5LnVzZXIudjEuVXNlciJNCg5HZXRVc2VyUmVxdWVzdBIbCgd1c2VyX2lkGAEgASgJQgi6SAVyA7ABAUgAEhAKBmhhbmRsZRgCIAEoCUgAQgwKCmlkZW50aWZpZXIiNgoPR2V0VXNlclJlc3BvbnNlEiMKBHVzZXIYASABKAsyFS5mbHV4bGF5LnVzZXIudjEuVXNlciLfAwofVXBkYXRlQ3VycmVudFVzZXJQcm9maWxlUmVxdWVzdBIvCgZoYW5kbGUYASABKAlCGrpIF8gBAXISMhBeW2EtekEtWjAtOV8tXSskSACIAQESEQoEbmFtZRgCIAEoCUgBiAEBEjQKBmF2YXRhchgDIAEoCzIfLmZsdXhsYXkuY29tbW9uLnYxLkJ1Y2tldE9iamVjdEgCiAEBEjQKBmhlYWRlchgEIAEoCzIfLmZsdXhsYXkuY29tbW9uLnYxLkJ1Y2tldE9iamVjdEgDiAEBEhAKA2JpbxgFIAEoCUgEiAEBEhgKC3dlYnNpdGVfdXJsGAYgASgJSAWIAQESEQoEeF9pZBgHIAEoCUgGiAEBEhkKDGluc3RhZ3JhbV9pZBgIIAEoCUgHiAEBEhYKCWdpdGh1Yl9pZBgJIAEoCUgIiAEBEhUKCGxvY2F0aW9uGAogASgJSAmIAQESDAoEdGFncxgLIAMoCUIJCgdfaGFuZGxlQgcKBV9uYW1lQgkKB19hdmF0YXJCCQoHX2hlYWRlckIGCgRfYmlvQg4KDF93ZWJzaXRlX3VybEIHCgVfeF9pZEIPCg1faW5zdGFncmFtX2lkQgwKCl9naXRodWJfaWRCCwoJX2xvY2F0aW9uIk0KIFVwZGF0ZUN1cnJlbnRVc2VyUHJvZmlsZVJlc3BvbnNlEikKB3Byb2ZpbGUYASABKAsyGC5mbHV4bGF5LnVzZXIudjEuUHJvZmlsZSLaAQodQ3JlYXRlUHJvZmlsZVVwbG9hZFVSTFJlcXVlc3QSFAoMY29udGVudF90eXBlGAEgASgJEkwKCmFzc2V0X3R5cGUYAiABKA4yOC5mbHV4bGF5LnVzZXIudjEuQ3JlYXRlUHJvZmlsZVVwbG9hZFVSTFJlcXVlc3QuQXNzZXRUeXBlIlUKCUFzc2V0VHlwZRIaChZBU1NFVF9UWVBFX1VOU1BFQ0lGSUVEEAASFQoRQVNTRVRfVFlQRV9BVkFUQVIQARIVChFBU1NFVF9UWVBFX0hFQURFUhACImUKHkNyZWF0ZVByb2ZpbGVVcGxvYWRVUkxSZXNwb25zZRISCgp1cGxvYWRfdXJsGAEgASgJEi8KBm9iamVjdBgCIAEoCzIfLmZsdXhsYXkuY29tbW9uLnYxLkJ1Y2tldE9iamVjdCLnAQoZVXBkYXRlUHJvZmlsZUltYWdlUmVxdWVzdBJCCgR0eXBlGAEgASgOMjQuZmx1eGxheS51c2VyLnYxLlVwZGF0ZVByb2ZpbGVJbWFnZVJlcXVlc3QuSW1hZ2VUeXBlEi8KBm9iamVjdBgCIAEoCzIfLmZsdXhsYXkuY29tbW9uLnYxLkJ1Y2tldE9iamVjdCJVCglJbWFnZVR5cGUSGgoWSU1BR0VfVFlQRV9VTlNQRUNJRklFRBAAEhUKEUlNQUdFX1RZUEVfQVZBVEFSEAESFQoRSU1BR0VfVFlQRV9IRUFERVIQAiJHChpVcGRhdGVQcm9maWxlSW1hZ2VSZXNwb25zZRIpCgdwcm9maWxlGAEgASgLMhguZmx1eGxheS51c2VyLnYxLlByb2ZpbGUiHAoaR2V0T25ib2FyZGluZ1N0YXR1c1JlcXVlc3QiZgobR2V0T25ib2FyZGluZ1N0YXR1c1Jlc3BvbnNlEhQKDHRlcm1zX2FncmVlZBgBIAEoCBIZChFoYW5kbGVfY29uZmlndXJlZBgCIAEoCBIWCg5jdXJyZW50X2hhbmRsZRgDIAEoCSJkChlDb21wbGV0ZU9uYm9hcmRpbmdSZXF1ZXN0Eg4KBmhhbmRsZRgBIAEoCRIWCg50ZXJtc19hY2NlcHRlZBgCIAEoCBIfChdtYXJrZXRpbmdfZW1haWxfY29uc2VudBgDIAEoCCIcChpDb21wbGV0ZU9uYm9hcmRpbmdSZXNwb25zZSJeChBMaXN0VXNlcnNSZXF1ZXN0EhoKCXBhZ2Vfc2l6ZRgBIAEoBUIHukgEGgIgABISCgpwYWdlX3Rva2VuGAIgASgJEhEKBHBhZ2UYAyABKAVIAIgBAUIHCgVfcGFnZSJtChFMaXN0VXNlcnNSZXNwb25zZRIqCghwcm9maWxlcxgBIAMoCzIYLmZsdXhsYXkudXNlci52MS5Qcm9maWxlEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoBUK9AQoTY29tLmZsdXhsYXkudXNlci52MUIJVXNlclByb3RvUAFaPWdpdGh1Yi5jb20va2VuMTA5L2ZsdXhsYXktcHJvdG8vZ2VuL2dvL2ZsdXhsYXkvdXNlci92MTt1c2VydjGiAgNGVViqAg9GbHV4bGF5LlVzZXIuVjHKAg9GbHV4bGF5XFVzZXJcVjHiAhtGbHV4bGF5XFVzZXJcVjFcR1BCTWV0YWRhdGHqAhFGbHV4bGF5OjpVc2VyOjpWMWIGcHJvdG8z\", [file_buf_validate_validate, file_fluxlay_common_v1_bucket_object, file_google_protobuf_timestamp]);\n\n/**\n * @generated from message fluxlay.user.v1.Profile\n */\nexport type Profile = Message<\"fluxlay.user.v1.Profile\"> & {\n /**\n * @generated from field: string handle = 1;\n */\n handle: string;\n\n /**\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject avatar = 3;\n */\n avatar?: BucketObject | undefined;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject header = 4;\n */\n header?: BucketObject | undefined;\n\n /**\n * @generated from field: string bio = 5;\n */\n bio: string;\n\n /**\n * @generated from field: string website_url = 6;\n */\n websiteUrl: string;\n\n /**\n * @generated from field: string x_id = 7;\n */\n xId: string;\n\n /**\n * @generated from field: string instagram_id = 8;\n */\n instagramId: string;\n\n /**\n * @generated from field: string github_id = 9;\n */\n githubId: string;\n\n /**\n * @generated from field: string location = 10;\n */\n location: string;\n\n /**\n * @generated from field: repeated string tags = 11;\n */\n tags: string[];\n\n /**\n * @generated from field: google.protobuf.Timestamp updated_at = 12;\n */\n updatedAt?: Timestamp | undefined;\n};\n\nexport type ProfileValid = Profile;\n\n/**\n * Describes the message fluxlay.user.v1.Profile.\n * Use `create(ProfileSchema)` to create a new message.\n */\nexport const ProfileSchema: GenMessage<Profile, {validType: ProfileValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 0);\n\n/**\n * @generated from message fluxlay.user.v1.User\n */\nexport type User = Message<\"fluxlay.user.v1.User\"> & {\n /**\n * @generated from field: string user_id = 1;\n */\n userId: string;\n\n /**\n * @generated from field: fluxlay.user.v1.Profile profile = 2;\n */\n profile?: Profile | undefined;\n\n /**\n * @generated from field: google.protobuf.Timestamp created_at = 3;\n */\n createdAt?: Timestamp | undefined;\n\n /**\n * @generated from field: google.protobuf.Timestamp updated_at = 4;\n */\n updatedAt?: Timestamp | undefined;\n};\n\nexport type UserValid = User;\n\n/**\n * Describes the message fluxlay.user.v1.User.\n * Use `create(UserSchema)` to create a new message.\n */\nexport const UserSchema: GenMessage<User, {validType: UserValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 1);\n\n/**\n * @generated from message fluxlay.user.v1.GetCurrentUserRequest\n */\nexport type GetCurrentUserRequest = Message<\"fluxlay.user.v1.GetCurrentUserRequest\"> & {\n};\n\nexport type GetCurrentUserRequestValid = GetCurrentUserRequest;\n\n/**\n * Describes the message fluxlay.user.v1.GetCurrentUserRequest.\n * Use `create(GetCurrentUserRequestSchema)` to create a new message.\n */\nexport const GetCurrentUserRequestSchema: GenMessage<GetCurrentUserRequest, {validType: GetCurrentUserRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 2);\n\n/**\n * @generated from message fluxlay.user.v1.GetCurrentUserResponse\n */\nexport type GetCurrentUserResponse = Message<\"fluxlay.user.v1.GetCurrentUserResponse\"> & {\n /**\n * @generated from field: fluxlay.user.v1.User user = 1;\n */\n user?: User | undefined;\n};\n\nexport type GetCurrentUserResponseValid = GetCurrentUserResponse;\n\n/**\n * Describes the message fluxlay.user.v1.GetCurrentUserResponse.\n * Use `create(GetCurrentUserResponseSchema)` to create a new message.\n */\nexport const GetCurrentUserResponseSchema: GenMessage<GetCurrentUserResponse, {validType: GetCurrentUserResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 3);\n\n/**\n * @generated from message fluxlay.user.v1.GetUserRequest\n */\nexport type GetUserRequest = Message<\"fluxlay.user.v1.GetUserRequest\"> & {\n /**\n * @generated from oneof fluxlay.user.v1.GetUserRequest.identifier\n */\n identifier: {\n /**\n * @generated from field: string user_id = 1;\n */\n value: string;\n case: \"userId\";\n } | {\n /**\n * @generated from field: string handle = 2;\n */\n value: string;\n case: \"handle\";\n } | { case: undefined; value?: undefined };\n};\n\nexport type GetUserRequestValid = GetUserRequest;\n\n/**\n * Describes the message fluxlay.user.v1.GetUserRequest.\n * Use `create(GetUserRequestSchema)` to create a new message.\n */\nexport const GetUserRequestSchema: GenMessage<GetUserRequest, {validType: GetUserRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 4);\n\n/**\n * @generated from message fluxlay.user.v1.GetUserResponse\n */\nexport type GetUserResponse = Message<\"fluxlay.user.v1.GetUserResponse\"> & {\n /**\n * @generated from field: fluxlay.user.v1.User user = 1;\n */\n user?: User | undefined;\n};\n\nexport type GetUserResponseValid = GetUserResponse;\n\n/**\n * Describes the message fluxlay.user.v1.GetUserResponse.\n * Use `create(GetUserResponseSchema)` to create a new message.\n */\nexport const GetUserResponseSchema: GenMessage<GetUserResponse, {validType: GetUserResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 5);\n\n/**\n * @generated from message fluxlay.user.v1.UpdateCurrentUserProfileRequest\n */\nexport type UpdateCurrentUserProfileRequest = Message<\"fluxlay.user.v1.UpdateCurrentUserProfileRequest\"> & {\n /**\n * @generated from field: optional string handle = 1;\n */\n handle?: string | undefined;\n\n /**\n * @generated from field: optional string name = 2;\n */\n name?: string | undefined;\n\n /**\n * @generated from field: optional fluxlay.common.v1.BucketObject avatar = 3;\n */\n avatar?: BucketObject | undefined;\n\n /**\n * @generated from field: optional fluxlay.common.v1.BucketObject header = 4;\n */\n header?: BucketObject | undefined;\n\n /**\n * @generated from field: optional string bio = 5;\n */\n bio?: string | undefined;\n\n /**\n * @generated from field: optional string website_url = 6;\n */\n websiteUrl?: string | undefined;\n\n /**\n * @generated from field: optional string x_id = 7;\n */\n xId?: string | undefined;\n\n /**\n * @generated from field: optional string instagram_id = 8;\n */\n instagramId?: string | undefined;\n\n /**\n * @generated from field: optional string github_id = 9;\n */\n githubId?: string | undefined;\n\n /**\n * @generated from field: optional string location = 10;\n */\n location?: string | undefined;\n\n /**\n * @generated from field: repeated string tags = 11;\n */\n tags: string[];\n};\n\n/**\n * @generated from message fluxlay.user.v1.UpdateCurrentUserProfileRequest\n */\nexport type UpdateCurrentUserProfileRequestValid = Message<\"fluxlay.user.v1.UpdateCurrentUserProfileRequest\"> & {\n /**\n * @generated from field: optional string handle = 1;\n */\n handle: string;\n\n /**\n * @generated from field: optional string name = 2;\n */\n name?: string | undefined;\n\n /**\n * @generated from field: optional fluxlay.common.v1.BucketObject avatar = 3;\n */\n avatar?: BucketObjectValid | undefined;\n\n /**\n * @generated from field: optional fluxlay.common.v1.BucketObject header = 4;\n */\n header?: BucketObjectValid | undefined;\n\n /**\n * @generated from field: optional string bio = 5;\n */\n bio?: string | undefined;\n\n /**\n * @generated from field: optional string website_url = 6;\n */\n websiteUrl?: string | undefined;\n\n /**\n * @generated from field: optional string x_id = 7;\n */\n xId?: string | undefined;\n\n /**\n * @generated from field: optional string instagram_id = 8;\n */\n instagramId?: string | undefined;\n\n /**\n * @generated from field: optional string github_id = 9;\n */\n githubId?: string | undefined;\n\n /**\n * @generated from field: optional string location = 10;\n */\n location?: string | undefined;\n\n /**\n * @generated from field: repeated string tags = 11;\n */\n tags: string[];\n};\n\n/**\n * Describes the message fluxlay.user.v1.UpdateCurrentUserProfileRequest.\n * Use `create(UpdateCurrentUserProfileRequestSchema)` to create a new message.\n */\nexport const UpdateCurrentUserProfileRequestSchema: GenMessage<UpdateCurrentUserProfileRequest, {validType: UpdateCurrentUserProfileRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 6);\n\n/**\n * @generated from message fluxlay.user.v1.UpdateCurrentUserProfileResponse\n */\nexport type UpdateCurrentUserProfileResponse = Message<\"fluxlay.user.v1.UpdateCurrentUserProfileResponse\"> & {\n /**\n * @generated from field: fluxlay.user.v1.Profile profile = 1;\n */\n profile?: Profile | undefined;\n};\n\nexport type UpdateCurrentUserProfileResponseValid = UpdateCurrentUserProfileResponse;\n\n/**\n * Describes the message fluxlay.user.v1.UpdateCurrentUserProfileResponse.\n * Use `create(UpdateCurrentUserProfileResponseSchema)` to create a new message.\n */\nexport const UpdateCurrentUserProfileResponseSchema: GenMessage<UpdateCurrentUserProfileResponse, {validType: UpdateCurrentUserProfileResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 7);\n\n/**\n * @generated from message fluxlay.user.v1.CreateProfileUploadURLRequest\n */\nexport type CreateProfileUploadURLRequest = Message<\"fluxlay.user.v1.CreateProfileUploadURLRequest\"> & {\n /**\n * @generated from field: string content_type = 1;\n */\n contentType: string;\n\n /**\n * @generated from field: fluxlay.user.v1.CreateProfileUploadURLRequest.AssetType asset_type = 2;\n */\n assetType: CreateProfileUploadURLRequest_AssetType;\n};\n\nexport type CreateProfileUploadURLRequestValid = CreateProfileUploadURLRequest;\n\n/**\n * Describes the message fluxlay.user.v1.CreateProfileUploadURLRequest.\n * Use `create(CreateProfileUploadURLRequestSchema)` to create a new message.\n */\nexport const CreateProfileUploadURLRequestSchema: GenMessage<CreateProfileUploadURLRequest, {validType: CreateProfileUploadURLRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 8);\n\n/**\n * @generated from enum fluxlay.user.v1.CreateProfileUploadURLRequest.AssetType\n */\nexport enum CreateProfileUploadURLRequest_AssetType {\n /**\n * @generated from enum value: ASSET_TYPE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: ASSET_TYPE_AVATAR = 1;\n */\n AVATAR = 1,\n\n /**\n * @generated from enum value: ASSET_TYPE_HEADER = 2;\n */\n HEADER = 2,\n}\n\n/**\n * Describes the enum fluxlay.user.v1.CreateProfileUploadURLRequest.AssetType.\n */\nexport const CreateProfileUploadURLRequest_AssetTypeSchema: GenEnum<CreateProfileUploadURLRequest_AssetType> = /*@__PURE__*/\n enumDesc(file_fluxlay_user_v1_user, 8, 0);\n\n/**\n * @generated from message fluxlay.user.v1.CreateProfileUploadURLResponse\n */\nexport type CreateProfileUploadURLResponse = Message<\"fluxlay.user.v1.CreateProfileUploadURLResponse\"> & {\n /**\n * @generated from field: string upload_url = 1;\n */\n uploadUrl: string;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject object = 2;\n */\n object?: BucketObject | undefined;\n};\n\nexport type CreateProfileUploadURLResponseValid = CreateProfileUploadURLResponse;\n\n/**\n * Describes the message fluxlay.user.v1.CreateProfileUploadURLResponse.\n * Use `create(CreateProfileUploadURLResponseSchema)` to create a new message.\n */\nexport const CreateProfileUploadURLResponseSchema: GenMessage<CreateProfileUploadURLResponse, {validType: CreateProfileUploadURLResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 9);\n\n/**\n * @generated from message fluxlay.user.v1.UpdateProfileImageRequest\n */\nexport type UpdateProfileImageRequest = Message<\"fluxlay.user.v1.UpdateProfileImageRequest\"> & {\n /**\n * @generated from field: fluxlay.user.v1.UpdateProfileImageRequest.ImageType type = 1;\n */\n type: UpdateProfileImageRequest_ImageType;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject object = 2;\n */\n object?: BucketObject | undefined;\n};\n\nexport type UpdateProfileImageRequestValid = UpdateProfileImageRequest;\n\n/**\n * Describes the message fluxlay.user.v1.UpdateProfileImageRequest.\n * Use `create(UpdateProfileImageRequestSchema)` to create a new message.\n */\nexport const UpdateProfileImageRequestSchema: GenMessage<UpdateProfileImageRequest, {validType: UpdateProfileImageRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 10);\n\n/**\n * @generated from enum fluxlay.user.v1.UpdateProfileImageRequest.ImageType\n */\nexport enum UpdateProfileImageRequest_ImageType {\n /**\n * @generated from enum value: IMAGE_TYPE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: IMAGE_TYPE_AVATAR = 1;\n */\n AVATAR = 1,\n\n /**\n * @generated from enum value: IMAGE_TYPE_HEADER = 2;\n */\n HEADER = 2,\n}\n\n/**\n * Describes the enum fluxlay.user.v1.UpdateProfileImageRequest.ImageType.\n */\nexport const UpdateProfileImageRequest_ImageTypeSchema: GenEnum<UpdateProfileImageRequest_ImageType> = /*@__PURE__*/\n enumDesc(file_fluxlay_user_v1_user, 10, 0);\n\n/**\n * @generated from message fluxlay.user.v1.UpdateProfileImageResponse\n */\nexport type UpdateProfileImageResponse = Message<\"fluxlay.user.v1.UpdateProfileImageResponse\"> & {\n /**\n * @generated from field: fluxlay.user.v1.Profile profile = 1;\n */\n profile?: Profile | undefined;\n};\n\nexport type UpdateProfileImageResponseValid = UpdateProfileImageResponse;\n\n/**\n * Describes the message fluxlay.user.v1.UpdateProfileImageResponse.\n * Use `create(UpdateProfileImageResponseSchema)` to create a new message.\n */\nexport const UpdateProfileImageResponseSchema: GenMessage<UpdateProfileImageResponse, {validType: UpdateProfileImageResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 11);\n\n/**\n * @generated from message fluxlay.user.v1.GetOnboardingStatusRequest\n */\nexport type GetOnboardingStatusRequest = Message<\"fluxlay.user.v1.GetOnboardingStatusRequest\"> & {\n};\n\nexport type GetOnboardingStatusRequestValid = GetOnboardingStatusRequest;\n\n/**\n * Describes the message fluxlay.user.v1.GetOnboardingStatusRequest.\n * Use `create(GetOnboardingStatusRequestSchema)` to create a new message.\n */\nexport const GetOnboardingStatusRequestSchema: GenMessage<GetOnboardingStatusRequest, {validType: GetOnboardingStatusRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 12);\n\n/**\n * @generated from message fluxlay.user.v1.GetOnboardingStatusResponse\n */\nexport type GetOnboardingStatusResponse = Message<\"fluxlay.user.v1.GetOnboardingStatusResponse\"> & {\n /**\n * @generated from field: bool terms_agreed = 1;\n */\n termsAgreed: boolean;\n\n /**\n * @generated from field: bool handle_configured = 2;\n */\n handleConfigured: boolean;\n\n /**\n * @generated from field: string current_handle = 3;\n */\n currentHandle: string;\n};\n\nexport type GetOnboardingStatusResponseValid = GetOnboardingStatusResponse;\n\n/**\n * Describes the message fluxlay.user.v1.GetOnboardingStatusResponse.\n * Use `create(GetOnboardingStatusResponseSchema)` to create a new message.\n */\nexport const GetOnboardingStatusResponseSchema: GenMessage<GetOnboardingStatusResponse, {validType: GetOnboardingStatusResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 13);\n\n/**\n * @generated from message fluxlay.user.v1.CompleteOnboardingRequest\n */\nexport type CompleteOnboardingRequest = Message<\"fluxlay.user.v1.CompleteOnboardingRequest\"> & {\n /**\n * @generated from field: string handle = 1;\n */\n handle: string;\n\n /**\n * @generated from field: bool terms_accepted = 2;\n */\n termsAccepted: boolean;\n\n /**\n * @generated from field: bool marketing_email_consent = 3;\n */\n marketingEmailConsent: boolean;\n};\n\nexport type CompleteOnboardingRequestValid = CompleteOnboardingRequest;\n\n/**\n * Describes the message fluxlay.user.v1.CompleteOnboardingRequest.\n * Use `create(CompleteOnboardingRequestSchema)` to create a new message.\n */\nexport const CompleteOnboardingRequestSchema: GenMessage<CompleteOnboardingRequest, {validType: CompleteOnboardingRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 14);\n\n/**\n * @generated from message fluxlay.user.v1.CompleteOnboardingResponse\n */\nexport type CompleteOnboardingResponse = Message<\"fluxlay.user.v1.CompleteOnboardingResponse\"> & {\n};\n\nexport type CompleteOnboardingResponseValid = CompleteOnboardingResponse;\n\n/**\n * Describes the message fluxlay.user.v1.CompleteOnboardingResponse.\n * Use `create(CompleteOnboardingResponseSchema)` to create a new message.\n */\nexport const CompleteOnboardingResponseSchema: GenMessage<CompleteOnboardingResponse, {validType: CompleteOnboardingResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 15);\n\n/**\n * @generated from message fluxlay.user.v1.ListUsersRequest\n */\nexport type ListUsersRequest = Message<\"fluxlay.user.v1.ListUsersRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n\n /**\n * @generated from field: optional int32 page = 3;\n */\n page?: number | undefined;\n};\n\nexport type ListUsersRequestValid = ListUsersRequest;\n\n/**\n * Describes the message fluxlay.user.v1.ListUsersRequest.\n * Use `create(ListUsersRequestSchema)` to create a new message.\n */\nexport const ListUsersRequestSchema: GenMessage<ListUsersRequest, {validType: ListUsersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 16);\n\n/**\n * @generated from message fluxlay.user.v1.ListUsersResponse\n */\nexport type ListUsersResponse = Message<\"fluxlay.user.v1.ListUsersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.user.v1.Profile profiles = 1;\n */\n profiles: Profile[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n\n /**\n * @generated from field: int32 total_count = 3;\n */\n totalCount: number;\n};\n\nexport type ListUsersResponseValid = ListUsersResponse;\n\n/**\n * Describes the message fluxlay.user.v1.ListUsersResponse.\n * Use `create(ListUsersResponseSchema)` to create a new message.\n */\nexport const ListUsersResponseSchema: GenMessage<ListUsersResponse, {validType: ListUsersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 17);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/wallpaper/v1/wallpaper.proto (package fluxlay.wallpaper.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_buf_validate_validate } from \"../../../buf/validate/validate_pb.ts\";\nimport type { BucketObject } from \"../../common/v1/bucket_object_pb.ts\";\nimport { file_fluxlay_common_v1_bucket_object } from \"../../common/v1/bucket_object_pb.ts\";\nimport type { Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/wallpaper/v1/wallpaper.proto.\n */\nexport const file_fluxlay_wallpaper_v1_wallpaper: GenFile = /*@__PURE__*/\n fileDesc(\"CiRmbHV4bGF5L3dhbGxwYXBlci92MS93YWxscGFwZXIucHJvdG8SFGZsdXhsYXkud2FsbHBhcGVyLnYxIlcKBkF1dGhvchIOCgZoYW5kbGUYASABKAkSDAoEbmFtZRgCIAEoCRIvCgZhdmF0YXIYAyABKAsyHy5mbHV4bGF5LmNvbW1vbi52MS5CdWNrZXRPYmplY3Qi6QUKCVdhbGxwYXBlchIKCgJpZBgBIAEoCRIMCgRzbHVnGA0gASgJEgwKBG5hbWUYAiABKAkSDwoHdmVyc2lvbhgDIAEoCRITCgtkZXNjcmlwdGlvbhgFIAEoCRIVCg10aHVtYm5haWxfdXJsGAYgASgJEhEKCWVudHJ5X3VybBgHIAEoCRIMCgR0YWdzGAggAygJEjgKCHByZXZpZXdzGAkgAygLMiYuZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyUHJldmlldxI1CgZzdGF0dXMYCiABKA4yJS5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXJTdGF0dXMSLgoKY3JlYXRlZF9hdBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgMIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEAoIaXNfb3duZWQYDiABKAgSEgoKbGljZW5zZV9pZBgPIAEoCRIPCgd1c2VyX2lkGBAgASgJEhkKEWxhdGVzdF92ZXJzaW9uX2lkGBEgASgJEjQKDmF1dGhvcl9wcm9maWxlGBIgASgLMhwuZmx1eGxheS53YWxscGFwZXIudjEuQXV0aG9yEjMKBXByaWNlGBMgASgLMiQuZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyUHJpY2USNAoGcHJpY2VzGBQgAygLMiQuZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyUHJpY2USNQoMcHVibGlzaGVkX2F0GBUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBEjQKB25ldHdvcmsYFiADKAsyIy5mbHV4bGF5LndhbGxwYXBlci52MS5OZXR3b3JrT3JpZ2luEhQKDGlzX2Zhdm9yaXRlZBgXIAEoCEIPCg1fcHVibGlzaGVkX2F0IjIKDldhbGxwYXBlclByaWNlEhAKCGN1cnJlbmN5GAEgASgJEg4KBmFtb3VudBgCIAEoAyIvCg1OZXR3b3JrT3JpZ2luEg4KBm9yaWdpbhgBIAEoCRIOCgZyZWFzb24YAiABKAki0AEKEFdhbGxwYXBlclByZXZpZXcSCgoCaWQYASABKAkSLwoGb2JqZWN0GAIgASgLMh8uZmx1eGxheS5jb21tb24udjEuQnVja2V0T2JqZWN0Eg0KBW9yZGVyGAMgASgFEhIKBXdpZHRoGAQgASgFSACIAQESEwoGaGVpZ2h0GAUgASgFSAGIAQESHQoQZHVyYXRpb25fc2Vjb25kcxgGIAEoBUgCiAEBQggKBl93aWR0aEIJCgdfaGVpZ2h0QhMKEV9kdXJhdGlvbl9zZWNvbmRzIjkKF0FjcXVpcmVXYWxscGFwZXJSZXF1ZXN0Eh4KDHdhbGxwYXBlcl9pZBgBIAEoCUIIukgFcgOwAQEiGgoYQWNxdWlyZVdhbGxwYXBlclJlc3BvbnNlIkwKGkxpc3RPd25lZFdhbGxwYXBlcnNSZXF1ZXN0EhoKCXBhZ2Vfc2l6ZRgBIAEoBUIHukgEGgIgABISCgpwYWdlX3Rva2VuGAIgASgJImsKG0xpc3RPd25lZFdhbGxwYXBlcnNSZXNwb25zZRIzCgp3YWxscGFwZXJzGAEgAygLMh8uZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCSI6ChhGYXZvcml0ZVdhbGxwYXBlclJlcXVlc3QSHgoMd2FsbHBhcGVyX2lkGAEgASgJQgi6SAVyA7ABASIbChlGYXZvcml0ZVdhbGxwYXBlclJlc3BvbnNlIjwKGlVuZmF2b3JpdGVXYWxscGFwZXJSZXF1ZXN0Eh4KDHdhbGxwYXBlcl9pZBgBIAEoCUIIukgFcgOwAQEiHQobVW5mYXZvcml0ZVdhbGxwYXBlclJlc3BvbnNlIksKGUxpc3RVc2VyV2FsbHBhcGVyc1JlcXVlc3QSGgoJcGFnZV9zaXplGAEgASgFQge6SAQaAiAAEhIKCnBhZ2VfdG9rZW4YAiABKAkiagoaTGlzdFVzZXJXYWxscGFwZXJzUmVzcG9uc2USMwoKd2FsbHBhcGVycxgBIAMoCzIfLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkilgEKHlVwZGF0ZVdhbGxwYXBlck1ldGFkYXRhUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQESHQoEbmFtZRgCIAEoCUIKukgHyAEBcgIQAUgAiAEBEhgKC2Rlc2NyaXB0aW9uGAMgASgJSAGIAQESDAoEdGFncxgEIAMoCUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb24iVQofVXBkYXRlV2FsbHBhcGVyTWV0YWRhdGFSZXNwb25zZRIyCgl3YWxscGFwZXIYASABKAsyHy5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXIijAEKHUNyZWF0ZVByZXZpZXdVcGxvYWRVUkxSZXF1ZXN0Eh4KDHdhbGxwYXBlcl9pZBgBIAEoCUIIukgFcgOwAQESSwoMY29udGVudF90eXBlGAIgASgJQjW6SDJyMDIuXihpbWFnZS8ocG5nfGpwZWd8d2VicHxnaWYpfHZpZGVvLyhtcDR8d2VibSkpJCJICh5DcmVhdGVQcmV2aWV3VXBsb2FkVVJMUmVzcG9uc2USEgoKcHJldmlld19pZBgBIAEoCRISCgp1cGxvYWRfdXJsGAIgASgJImwKFkFkZFByZXZpZXdJbWFnZVJlcXVlc3QSHgoMd2FsbHBhcGVyX2lkGAEgASgJQgi6SAVyA7ABARIcCgpwcmV2aWV3X2lkGAIgASgJQgi6SAVyA7ABARIUCgxjb250ZW50X3R5cGUYAyABKAkiUgoXQWRkUHJldmlld0ltYWdlUmVzcG9uc2USNwoHcHJldmlldxgBIAEoCzImLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlclByZXZpZXciMQoZRGVsZXRlUHJldmlld0ltYWdlUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiHAoaRGVsZXRlUHJldmlld0ltYWdlUmVzcG9uc2UiLwoXUHVibGlzaFdhbGxwYXBlclJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBIk4KGFB1Ymxpc2hXYWxscGFwZXJSZXNwb25zZRIyCgl3YWxscGFwZXIYASABKAsyHy5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXIiMQoZVW5wdWJsaXNoV2FsbHBhcGVyUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiUAoaVW5wdWJsaXNoV2FsbHBhcGVyUmVzcG9uc2USMgoJd2FsbHBhcGVyGAEgASgLMh8uZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyIi4KFkRlbGV0ZVdhbGxwYXBlclJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBIhkKF0RlbGV0ZVdhbGxwYXBlclJlc3BvbnNlIr0BChVMaXN0V2FsbHBhcGVyc1JlcXVlc3QSGgoJcGFnZV9zaXplGAEgASgFQge6SAQaAiAAEhIKCnBhZ2VfdG9rZW4YAiABKAkSFAoHdXNlcl9pZBgDIAEoCUgAiAEBEhEKBHBhZ2UYBCABKAVIAYgBARI2Cgdzb3J0X2J5GAUgASgOMiUuZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyU29ydEJ5QgoKCF91c2VyX2lkQgcKBV9wYWdlInsKFkxpc3RXYWxscGFwZXJzUmVzcG9uc2USMwoKd2FsbHBhcGVycxgBIAMoCzIfLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAUibgoXU2VhcmNoV2FsbHBhcGVyc1JlcXVlc3QSDQoFcXVlcnkYASABKAkSDAoEdGFncxgCIAMoCRIaCglwYWdlX3NpemUYAyABKAVCB7pIBBoCIAASEQoEcGFnZRgEIAEoBUgAiAEBQgcKBV9wYWdlIk8KGFNlYXJjaFdhbGxwYXBlcnNSZXNwb25zZRIzCgp3YWxscGFwZXJzGAEgAygLMh8uZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyIjkKHUxpc3RGZWF0dXJlZFdhbGxwYXBlcnNSZXF1ZXN0EhgKBWxpbWl0GAEgASgFQgm6SAYaBBgUIAAiVQoeTGlzdEZlYXR1cmVkV2FsbHBhcGVyc1Jlc3BvbnNlEjMKCndhbGxwYXBlcnMYASADKAsyHy5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXIiXAocTGlzdFJlbGF0ZWRXYWxscGFwZXJzUmVxdWVzdBIeCgx3YWxscGFwZXJfaWQYASABKAlCCLpIBXIDsAEBEhIKBWxpbWl0GAIgASgFSACIAQFCCAoGX2xpbWl0IlQKHUxpc3RSZWxhdGVkV2FsbHBhcGVyc1Jlc3BvbnNlEjMKCndhbGxwYXBlcnMYASADKAsyHy5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXIiKgoKSGFuZGxlU2x1ZxIOCgZoYW5kbGUYASABKAkSDAoEc2x1ZxgCIAEoCSKPAQoTR2V0V2FsbHBhcGVyUmVxdWVzdBIMCgJpZBgBIAEoCUgAEg4KBHNsdWcYAiABKAlIABI3CgtoYW5kbGVfc2x1ZxgDIAEoCzIgLmZsdXhsYXkud2FsbHBhcGVyLnYxLkhhbmRsZVNsdWdIABITCgthY3RpdmVfb25seRgEIAEoCEIMCgppZGVudGlmaWVyIkoKFEdldFdhbGxwYXBlclJlc3BvbnNlEjIKCXdhbGxwYXBlchgBIAEoCzIfLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlciJtChZHZXREZXZlbG9wZXJLZXlSZXF1ZXN0EhUKBHNhbHQYASABKAxCB7pIBHoCaCASGAoQcHJvdG9jb2xfdmVyc2lvbhgCIAEoDRIiChFkZXZpY2VfcHVibGljX2tleRgDIAEoDEIHukgEegJoICJyChdHZXREZXZlbG9wZXJLZXlSZXNwb25zZRIVCg1kZXZlbG9wZXJfa2V5GAEgASgMEhIKCmV4cGlyZXNfYXQYAiABKAMSGQoRc2VydmVyX3B1YmxpY19rZXkYAyABKAwSEQoJa2V5X2Vwb2NoGAQgASgDIrYBChhSZWdpc3RlcldhbGxwYXBlclJlcXVlc3QSFQoEc2x1ZxgBIAEoCUIHukgEcgIQARIVCgRuYW1lGAIgASgJQge6SARyAhABEhgKB3ZlcnNpb24YAyABKAlCB7pIBHICEAESHAoLY29udGVudF9rZXkYBCABKAxCB7pIBHoCaCASNAoHbmV0d29yaxgFIAMoCzIjLmZsdXhsYXkud2FsbHBhcGVyLnYxLk5ldHdvcmtPcmlnaW4iWQoZUmVnaXN0ZXJXYWxscGFwZXJSZXNwb25zZRIUCgx3YWxscGFwZXJfaWQYASABKAkSEgoKdmVyc2lvbl9pZBgCIAEoCRISCgp1cGxvYWRfdXJsGAMgASgJIokBChRHZXRDb250ZW50S2V5UmVxdWVzdBIcCgp2ZXJzaW9uX2lkGAEgASgJQgi6SAVyA7ABARIVCgRzYWx0GAIgASgMQge6SAR6AmggEhgKEHByb3RvY29sX3ZlcnNpb24YAyABKA0SIgoRZGV2aWNlX3B1YmxpY19rZXkYBCABKAxCB7pIBHoCaCAibgoVR2V0Q29udGVudEtleVJlc3BvbnNlEhMKC2NvbnRlbnRfa2V5GAEgASgMEhIKCmV4cGlyZXNfYXQYAiABKAMSGQoRc2VydmVyX3B1YmxpY19rZXkYAyABKAwSEQoJa2V5X2Vwb2NoGAQgASgDIloKGFJlZ2lzdGVyRGV2aWNlS2V5UmVxdWVzdBIaCglkZXZpY2VfaWQYASABKAlCB7pIBHICEAESIgoRZGV2aWNlX3B1YmxpY19rZXkYAiABKAxCB7pIBHoCaCAiGwoZUmVnaXN0ZXJEZXZpY2VLZXlSZXNwb25zZSIUChJHZXRLZXlFcG9jaFJlcXVlc3QiKAoTR2V0S2V5RXBvY2hSZXNwb25zZRIRCglrZXlfZXBvY2gYASABKAMiMwoUQ29uZmlybVVwbG9hZFJlcXVlc3QSGwoKdmVyc2lvbl9pZBgBIAEoCUIHukgEcgIQASIXChVDb25maXJtVXBsb2FkUmVzcG9uc2UiMgoTQ2FuY2VsVXBsb2FkUmVxdWVzdBIbCgp2ZXJzaW9uX2lkGAEgASgJQge6SARyAhABIhYKFENhbmNlbFVwbG9hZFJlc3BvbnNlIi4KClByaWNlRW50cnkSEAoIY3VycmVuY3kYASABKAkSDgoGYW1vdW50GAIgASgDImwKGFNldFdhbGxwYXBlclByaWNlUmVxdWVzdBIeCgx3YWxscGFwZXJfaWQYASABKAlCCLpIBXIDsAEBEjAKBnByaWNlcxgCIAMoCzIgLmZsdXhsYXkud2FsbHBhcGVyLnYxLlByaWNlRW50cnkiTwoZU2V0V2FsbHBhcGVyUHJpY2VSZXNwb25zZRIyCgl3YWxscGFwZXIYASABKAsyHy5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXIqjAEKD1dhbGxwYXBlclN0YXR1cxIgChxXQUxMUEFQRVJfU1RBVFVTX1VOU1BFQ0lGSUVEEAASHgoaV0FMTFBBUEVSX1NUQVRVU19VUExPQURJTkcQARIaChZXQUxMUEFQRVJfU1RBVFVTX0RSQUZUEAISGwoXV0FMTFBBUEVSX1NUQVRVU19BQ1RJVkUQAyp7Cg9XYWxscGFwZXJTb3J0QnkSIQodV0FMTFBBUEVSX1NPUlRfQllfVU5TUEVDSUZJRUQQABIgChxXQUxMUEFQRVJfU09SVF9CWV9DUkVBVEVEX0FUEAESIwofV0FMTFBBUEVSX1NPUlRfQllfTElDRU5TRV9DT1VOVBACQuUBChhjb20uZmx1eGxheS53YWxscGFwZXIudjFCDldhbGxwYXBlclByb3RvUAFaR2dpdGh1Yi5jb20va2VuMTA5L2ZsdXhsYXktcHJvdG8vZ2VuL2dvL2ZsdXhsYXkvd2FsbHBhcGVyL3YxO3dhbGxwYXBlcnYxogIDRldYqgIURmx1eGxheS5XYWxscGFwZXIuVjHKAhRGbHV4bGF5XFdhbGxwYXBlclxWMeICIEZsdXhsYXlcV2FsbHBhcGVyXFYxXEdQQk1ldGFkYXRh6gIWRmx1eGxheTo6V2FsbHBhcGVyOjpWMWIGcHJvdG8z\", [file_buf_validate_validate, file_fluxlay_common_v1_bucket_object, file_google_protobuf_timestamp]);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.Author\n */\nexport type Author = Message<\"fluxlay.wallpaper.v1.Author\"> & {\n /**\n * @generated from field: string handle = 1;\n */\n handle: string;\n\n /**\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject avatar = 3;\n */\n avatar?: BucketObject | undefined;\n};\n\nexport type AuthorValid = Author;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.Author.\n * Use `create(AuthorSchema)` to create a new message.\n */\nexport const AuthorSchema: GenMessage<Author, {validType: AuthorValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 0);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.Wallpaper\n */\nexport type Wallpaper = Message<\"fluxlay.wallpaper.v1.Wallpaper\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: string slug = 13;\n */\n slug: string;\n\n /**\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: string version = 3;\n */\n version: string;\n\n /**\n * @generated from field: string description = 5;\n */\n description: string;\n\n /**\n * @generated from field: string thumbnail_url = 6;\n */\n thumbnailUrl: string;\n\n /**\n * @generated from field: string entry_url = 7;\n */\n entryUrl: string;\n\n /**\n * @generated from field: repeated string tags = 8;\n */\n tags: string[];\n\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.WallpaperPreview previews = 9;\n */\n previews: WallpaperPreview[];\n\n /**\n * @generated from field: fluxlay.wallpaper.v1.WallpaperStatus status = 10;\n */\n status: WallpaperStatus;\n\n /**\n * @generated from field: google.protobuf.Timestamp created_at = 11;\n */\n createdAt?: Timestamp | undefined;\n\n /**\n * @generated from field: google.protobuf.Timestamp updated_at = 12;\n */\n updatedAt?: Timestamp | undefined;\n\n /**\n * @generated from field: bool is_owned = 14;\n */\n isOwned: boolean;\n\n /**\n * @generated from field: string license_id = 15;\n */\n licenseId: string;\n\n /**\n * @generated from field: string user_id = 16;\n */\n userId: string;\n\n /**\n * @generated from field: string latest_version_id = 17;\n */\n latestVersionId: string;\n\n /**\n * @generated from field: fluxlay.wallpaper.v1.Author author_profile = 18;\n */\n authorProfile?: Author | undefined;\n\n /**\n * @generated from field: fluxlay.wallpaper.v1.WallpaperPrice price = 19;\n */\n price?: WallpaperPrice | undefined;\n\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.WallpaperPrice prices = 20;\n */\n prices: WallpaperPrice[];\n\n /**\n * 初回公開日時。一度公開された後はバージョンアップで active が入れ替わっても不変。\n * VideoObject.uploadDate / sitemap lastmod のソースに使う。\n *\n * @generated from field: optional google.protobuf.Timestamp published_at = 21;\n */\n publishedAt?: Timestamp | undefined;\n\n /**\n * この壁紙が宣言する外部ネットワークアクセス先(返却バージョン単位)。\n * 詳細ページでインストール前にユーザーへ提示する。\n *\n * @generated from field: repeated fluxlay.wallpaper.v1.NetworkOrigin network = 22;\n */\n network: NetworkOrigin[];\n\n /**\n * ログインユーザーがこの壁紙をお気に入り登録しているか。未ログイン時は false。\n *\n * @generated from field: bool is_favorited = 23;\n */\n isFavorited: boolean;\n};\n\nexport type WallpaperValid = Wallpaper;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.Wallpaper.\n * Use `create(WallpaperSchema)` to create a new message.\n */\nexport const WallpaperSchema: GenMessage<Wallpaper, {validType: WallpaperValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 1);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.WallpaperPrice\n */\nexport type WallpaperPrice = Message<\"fluxlay.wallpaper.v1.WallpaperPrice\"> & {\n /**\n * @generated from field: string currency = 1;\n */\n currency: string;\n\n /**\n * @generated from field: int64 amount = 2;\n */\n amount: bigint;\n};\n\nexport type WallpaperPriceValid = WallpaperPrice;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.WallpaperPrice.\n * Use `create(WallpaperPriceSchema)` to create a new message.\n */\nexport const WallpaperPriceSchema: GenMessage<WallpaperPrice, {validType: WallpaperPriceValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 2);\n\n/**\n * 壁紙が fluxlay.yaml の network[] で宣言する外部通信先。\n *\n * @generated from message fluxlay.wallpaper.v1.NetworkOrigin\n */\nexport type NetworkOrigin = Message<\"fluxlay.wallpaper.v1.NetworkOrigin\"> & {\n /**\n * @generated from field: string origin = 1;\n */\n origin: string;\n\n /**\n * @generated from field: string reason = 2;\n */\n reason: string;\n};\n\nexport type NetworkOriginValid = NetworkOrigin;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.NetworkOrigin.\n * Use `create(NetworkOriginSchema)` to create a new message.\n */\nexport const NetworkOriginSchema: GenMessage<NetworkOrigin, {validType: NetworkOriginValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 3);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.WallpaperPreview\n */\nexport type WallpaperPreview = Message<\"fluxlay.wallpaper.v1.WallpaperPreview\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject object = 2;\n */\n object?: BucketObject | undefined;\n\n /**\n * @generated from field: int32 order = 3;\n */\n order: number;\n\n /**\n * メディアの寸法(画像・動画ともに保存)。VideoObject / ImageObject の width / height に利用。\n *\n * @generated from field: optional int32 width = 4;\n */\n width?: number | undefined;\n\n /**\n * @generated from field: optional int32 height = 5;\n */\n height?: number | undefined;\n\n /**\n * 動画のみ。VideoObject.duration (ISO 8601 PT<n>S 形式) に利用。\n *\n * @generated from field: optional int32 duration_seconds = 6;\n */\n durationSeconds?: number | undefined;\n};\n\nexport type WallpaperPreviewValid = WallpaperPreview;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.WallpaperPreview.\n * Use `create(WallpaperPreviewSchema)` to create a new message.\n */\nexport const WallpaperPreviewSchema: GenMessage<WallpaperPreview, {validType: WallpaperPreviewValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 4);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.AcquireWallpaperRequest\n */\nexport type AcquireWallpaperRequest = Message<\"fluxlay.wallpaper.v1.AcquireWallpaperRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n};\n\nexport type AcquireWallpaperRequestValid = AcquireWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.AcquireWallpaperRequest.\n * Use `create(AcquireWallpaperRequestSchema)` to create a new message.\n */\nexport const AcquireWallpaperRequestSchema: GenMessage<AcquireWallpaperRequest, {validType: AcquireWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 5);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.AcquireWallpaperResponse\n */\nexport type AcquireWallpaperResponse = Message<\"fluxlay.wallpaper.v1.AcquireWallpaperResponse\"> & {\n};\n\nexport type AcquireWallpaperResponseValid = AcquireWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.AcquireWallpaperResponse.\n * Use `create(AcquireWallpaperResponseSchema)` to create a new message.\n */\nexport const AcquireWallpaperResponseSchema: GenMessage<AcquireWallpaperResponse, {validType: AcquireWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 6);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListOwnedWallpapersRequest\n */\nexport type ListOwnedWallpapersRequest = Message<\"fluxlay.wallpaper.v1.ListOwnedWallpapersRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n};\n\nexport type ListOwnedWallpapersRequestValid = ListOwnedWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListOwnedWallpapersRequest.\n * Use `create(ListOwnedWallpapersRequestSchema)` to create a new message.\n */\nexport const ListOwnedWallpapersRequestSchema: GenMessage<ListOwnedWallpapersRequest, {validType: ListOwnedWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 7);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListOwnedWallpapersResponse\n */\nexport type ListOwnedWallpapersResponse = Message<\"fluxlay.wallpaper.v1.ListOwnedWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n};\n\nexport type ListOwnedWallpapersResponseValid = ListOwnedWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListOwnedWallpapersResponse.\n * Use `create(ListOwnedWallpapersResponseSchema)` to create a new message.\n */\nexport const ListOwnedWallpapersResponseSchema: GenMessage<ListOwnedWallpapersResponse, {validType: ListOwnedWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 8);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.FavoriteWallpaperRequest\n */\nexport type FavoriteWallpaperRequest = Message<\"fluxlay.wallpaper.v1.FavoriteWallpaperRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n};\n\nexport type FavoriteWallpaperRequestValid = FavoriteWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.FavoriteWallpaperRequest.\n * Use `create(FavoriteWallpaperRequestSchema)` to create a new message.\n */\nexport const FavoriteWallpaperRequestSchema: GenMessage<FavoriteWallpaperRequest, {validType: FavoriteWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 9);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.FavoriteWallpaperResponse\n */\nexport type FavoriteWallpaperResponse = Message<\"fluxlay.wallpaper.v1.FavoriteWallpaperResponse\"> & {\n};\n\nexport type FavoriteWallpaperResponseValid = FavoriteWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.FavoriteWallpaperResponse.\n * Use `create(FavoriteWallpaperResponseSchema)` to create a new message.\n */\nexport const FavoriteWallpaperResponseSchema: GenMessage<FavoriteWallpaperResponse, {validType: FavoriteWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 10);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UnfavoriteWallpaperRequest\n */\nexport type UnfavoriteWallpaperRequest = Message<\"fluxlay.wallpaper.v1.UnfavoriteWallpaperRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n};\n\nexport type UnfavoriteWallpaperRequestValid = UnfavoriteWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UnfavoriteWallpaperRequest.\n * Use `create(UnfavoriteWallpaperRequestSchema)` to create a new message.\n */\nexport const UnfavoriteWallpaperRequestSchema: GenMessage<UnfavoriteWallpaperRequest, {validType: UnfavoriteWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 11);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UnfavoriteWallpaperResponse\n */\nexport type UnfavoriteWallpaperResponse = Message<\"fluxlay.wallpaper.v1.UnfavoriteWallpaperResponse\"> & {\n};\n\nexport type UnfavoriteWallpaperResponseValid = UnfavoriteWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UnfavoriteWallpaperResponse.\n * Use `create(UnfavoriteWallpaperResponseSchema)` to create a new message.\n */\nexport const UnfavoriteWallpaperResponseSchema: GenMessage<UnfavoriteWallpaperResponse, {validType: UnfavoriteWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 12);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListUserWallpapersRequest\n */\nexport type ListUserWallpapersRequest = Message<\"fluxlay.wallpaper.v1.ListUserWallpapersRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n};\n\nexport type ListUserWallpapersRequestValid = ListUserWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListUserWallpapersRequest.\n * Use `create(ListUserWallpapersRequestSchema)` to create a new message.\n */\nexport const ListUserWallpapersRequestSchema: GenMessage<ListUserWallpapersRequest, {validType: ListUserWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 13);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListUserWallpapersResponse\n */\nexport type ListUserWallpapersResponse = Message<\"fluxlay.wallpaper.v1.ListUserWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n};\n\nexport type ListUserWallpapersResponseValid = ListUserWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListUserWallpapersResponse.\n * Use `create(ListUserWallpapersResponseSchema)` to create a new message.\n */\nexport const ListUserWallpapersResponseSchema: GenMessage<ListUserWallpapersResponse, {validType: ListUserWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 14);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UpdateWallpaperMetadataRequest\n */\nexport type UpdateWallpaperMetadataRequest = Message<\"fluxlay.wallpaper.v1.UpdateWallpaperMetadataRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: optional string name = 2;\n */\n name?: string | undefined;\n\n /**\n * @generated from field: optional string description = 3;\n */\n description?: string | undefined;\n\n /**\n * @generated from field: repeated string tags = 4;\n */\n tags: string[];\n};\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UpdateWallpaperMetadataRequest\n */\nexport type UpdateWallpaperMetadataRequestValid = Message<\"fluxlay.wallpaper.v1.UpdateWallpaperMetadataRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: optional string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: optional string description = 3;\n */\n description?: string | undefined;\n\n /**\n * @generated from field: repeated string tags = 4;\n */\n tags: string[];\n};\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UpdateWallpaperMetadataRequest.\n * Use `create(UpdateWallpaperMetadataRequestSchema)` to create a new message.\n */\nexport const UpdateWallpaperMetadataRequestSchema: GenMessage<UpdateWallpaperMetadataRequest, {validType: UpdateWallpaperMetadataRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 15);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UpdateWallpaperMetadataResponse\n */\nexport type UpdateWallpaperMetadataResponse = Message<\"fluxlay.wallpaper.v1.UpdateWallpaperMetadataResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.Wallpaper wallpaper = 1;\n */\n wallpaper?: Wallpaper | undefined;\n};\n\nexport type UpdateWallpaperMetadataResponseValid = UpdateWallpaperMetadataResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UpdateWallpaperMetadataResponse.\n * Use `create(UpdateWallpaperMetadataResponseSchema)` to create a new message.\n */\nexport const UpdateWallpaperMetadataResponseSchema: GenMessage<UpdateWallpaperMetadataResponse, {validType: UpdateWallpaperMetadataResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 16);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.CreatePreviewUploadURLRequest\n */\nexport type CreatePreviewUploadURLRequest = Message<\"fluxlay.wallpaper.v1.CreatePreviewUploadURLRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: string content_type = 2;\n */\n contentType: string;\n};\n\nexport type CreatePreviewUploadURLRequestValid = CreatePreviewUploadURLRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.CreatePreviewUploadURLRequest.\n * Use `create(CreatePreviewUploadURLRequestSchema)` to create a new message.\n */\nexport const CreatePreviewUploadURLRequestSchema: GenMessage<CreatePreviewUploadURLRequest, {validType: CreatePreviewUploadURLRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 17);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.CreatePreviewUploadURLResponse\n */\nexport type CreatePreviewUploadURLResponse = Message<\"fluxlay.wallpaper.v1.CreatePreviewUploadURLResponse\"> & {\n /**\n * @generated from field: string preview_id = 1;\n */\n previewId: string;\n\n /**\n * @generated from field: string upload_url = 2;\n */\n uploadUrl: string;\n};\n\nexport type CreatePreviewUploadURLResponseValid = CreatePreviewUploadURLResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.CreatePreviewUploadURLResponse.\n * Use `create(CreatePreviewUploadURLResponseSchema)` to create a new message.\n */\nexport const CreatePreviewUploadURLResponseSchema: GenMessage<CreatePreviewUploadURLResponse, {validType: CreatePreviewUploadURLResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 18);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.AddPreviewImageRequest\n */\nexport type AddPreviewImageRequest = Message<\"fluxlay.wallpaper.v1.AddPreviewImageRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: string preview_id = 2;\n */\n previewId: string;\n\n /**\n * @generated from field: string content_type = 3;\n */\n contentType: string;\n};\n\nexport type AddPreviewImageRequestValid = AddPreviewImageRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.AddPreviewImageRequest.\n * Use `create(AddPreviewImageRequestSchema)` to create a new message.\n */\nexport const AddPreviewImageRequestSchema: GenMessage<AddPreviewImageRequest, {validType: AddPreviewImageRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 19);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.AddPreviewImageResponse\n */\nexport type AddPreviewImageResponse = Message<\"fluxlay.wallpaper.v1.AddPreviewImageResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.WallpaperPreview preview = 1;\n */\n preview?: WallpaperPreview | undefined;\n};\n\nexport type AddPreviewImageResponseValid = AddPreviewImageResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.AddPreviewImageResponse.\n * Use `create(AddPreviewImageResponseSchema)` to create a new message.\n */\nexport const AddPreviewImageResponseSchema: GenMessage<AddPreviewImageResponse, {validType: AddPreviewImageResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 20);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.DeletePreviewImageRequest\n */\nexport type DeletePreviewImageRequest = Message<\"fluxlay.wallpaper.v1.DeletePreviewImageRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n};\n\nexport type DeletePreviewImageRequestValid = DeletePreviewImageRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.DeletePreviewImageRequest.\n * Use `create(DeletePreviewImageRequestSchema)` to create a new message.\n */\nexport const DeletePreviewImageRequestSchema: GenMessage<DeletePreviewImageRequest, {validType: DeletePreviewImageRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 21);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.DeletePreviewImageResponse\n */\nexport type DeletePreviewImageResponse = Message<\"fluxlay.wallpaper.v1.DeletePreviewImageResponse\"> & {\n};\n\nexport type DeletePreviewImageResponseValid = DeletePreviewImageResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.DeletePreviewImageResponse.\n * Use `create(DeletePreviewImageResponseSchema)` to create a new message.\n */\nexport const DeletePreviewImageResponseSchema: GenMessage<DeletePreviewImageResponse, {validType: DeletePreviewImageResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 22);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.PublishWallpaperRequest\n */\nexport type PublishWallpaperRequest = Message<\"fluxlay.wallpaper.v1.PublishWallpaperRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n};\n\nexport type PublishWallpaperRequestValid = PublishWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.PublishWallpaperRequest.\n * Use `create(PublishWallpaperRequestSchema)` to create a new message.\n */\nexport const PublishWallpaperRequestSchema: GenMessage<PublishWallpaperRequest, {validType: PublishWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 23);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.PublishWallpaperResponse\n */\nexport type PublishWallpaperResponse = Message<\"fluxlay.wallpaper.v1.PublishWallpaperResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.Wallpaper wallpaper = 1;\n */\n wallpaper?: Wallpaper | undefined;\n};\n\nexport type PublishWallpaperResponseValid = PublishWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.PublishWallpaperResponse.\n * Use `create(PublishWallpaperResponseSchema)` to create a new message.\n */\nexport const PublishWallpaperResponseSchema: GenMessage<PublishWallpaperResponse, {validType: PublishWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 24);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UnpublishWallpaperRequest\n */\nexport type UnpublishWallpaperRequest = Message<\"fluxlay.wallpaper.v1.UnpublishWallpaperRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n};\n\nexport type UnpublishWallpaperRequestValid = UnpublishWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UnpublishWallpaperRequest.\n * Use `create(UnpublishWallpaperRequestSchema)` to create a new message.\n */\nexport const UnpublishWallpaperRequestSchema: GenMessage<UnpublishWallpaperRequest, {validType: UnpublishWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 25);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UnpublishWallpaperResponse\n */\nexport type UnpublishWallpaperResponse = Message<\"fluxlay.wallpaper.v1.UnpublishWallpaperResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.Wallpaper wallpaper = 1;\n */\n wallpaper?: Wallpaper | undefined;\n};\n\nexport type UnpublishWallpaperResponseValid = UnpublishWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UnpublishWallpaperResponse.\n * Use `create(UnpublishWallpaperResponseSchema)` to create a new message.\n */\nexport const UnpublishWallpaperResponseSchema: GenMessage<UnpublishWallpaperResponse, {validType: UnpublishWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 26);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.DeleteWallpaperRequest\n */\nexport type DeleteWallpaperRequest = Message<\"fluxlay.wallpaper.v1.DeleteWallpaperRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n};\n\nexport type DeleteWallpaperRequestValid = DeleteWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.DeleteWallpaperRequest.\n * Use `create(DeleteWallpaperRequestSchema)` to create a new message.\n */\nexport const DeleteWallpaperRequestSchema: GenMessage<DeleteWallpaperRequest, {validType: DeleteWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 27);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.DeleteWallpaperResponse\n */\nexport type DeleteWallpaperResponse = Message<\"fluxlay.wallpaper.v1.DeleteWallpaperResponse\"> & {\n};\n\nexport type DeleteWallpaperResponseValid = DeleteWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.DeleteWallpaperResponse.\n * Use `create(DeleteWallpaperResponseSchema)` to create a new message.\n */\nexport const DeleteWallpaperResponseSchema: GenMessage<DeleteWallpaperResponse, {validType: DeleteWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 28);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListWallpapersRequest\n */\nexport type ListWallpapersRequest = Message<\"fluxlay.wallpaper.v1.ListWallpapersRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n\n /**\n * @generated from field: optional string user_id = 3;\n */\n userId?: string | undefined;\n\n /**\n * 任意のページに直接ジャンプするためのページ番号(1始まり)\n *\n * @generated from field: optional int32 page = 4;\n */\n page?: number | undefined;\n\n /**\n * ソート順\n *\n * @generated from field: fluxlay.wallpaper.v1.WallpaperSortBy sort_by = 5;\n */\n sortBy: WallpaperSortBy;\n};\n\nexport type ListWallpapersRequestValid = ListWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListWallpapersRequest.\n * Use `create(ListWallpapersRequestSchema)` to create a new message.\n */\nexport const ListWallpapersRequestSchema: GenMessage<ListWallpapersRequest, {validType: ListWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 29);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListWallpapersResponse\n */\nexport type ListWallpapersResponse = Message<\"fluxlay.wallpaper.v1.ListWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n\n /**\n * @generated from field: int32 total_count = 3;\n */\n totalCount: number;\n};\n\nexport type ListWallpapersResponseValid = ListWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListWallpapersResponse.\n * Use `create(ListWallpapersResponseSchema)` to create a new message.\n */\nexport const ListWallpapersResponseSchema: GenMessage<ListWallpapersResponse, {validType: ListWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 30);\n\n/**\n * 壁紙のハイブリッド検索(キーワード + セマンティックの RRF 融合)。\n *\n * @generated from message fluxlay.wallpaper.v1.SearchWallpapersRequest\n */\nexport type SearchWallpapersRequest = Message<\"fluxlay.wallpaper.v1.SearchWallpapersRequest\"> & {\n /**\n * 検索クエリ。空ならタグ絞り込み + 新着順の一覧になる。\n *\n * @generated from field: string query = 1;\n */\n query: string;\n\n /**\n * タグ絞り込み(指定タグをすべて含む壁紙のみ)。\n *\n * @generated from field: repeated string tags = 2;\n */\n tags: string[];\n\n /**\n * @generated from field: int32 page_size = 3;\n */\n pageSize: number;\n\n /**\n * 1 始まりのページ番号。\n *\n * @generated from field: optional int32 page = 4;\n */\n page?: number | undefined;\n};\n\nexport type SearchWallpapersRequestValid = SearchWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.SearchWallpapersRequest.\n * Use `create(SearchWallpapersRequestSchema)` to create a new message.\n */\nexport const SearchWallpapersRequestSchema: GenMessage<SearchWallpapersRequest, {validType: SearchWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 31);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.SearchWallpapersResponse\n */\nexport type SearchWallpapersResponse = Message<\"fluxlay.wallpaper.v1.SearchWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n};\n\nexport type SearchWallpapersResponseValid = SearchWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.SearchWallpapersResponse.\n * Use `create(SearchWallpapersResponseSchema)` to create a new message.\n */\nexport const SearchWallpapersResponseSchema: GenMessage<SearchWallpapersResponse, {validType: SearchWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 32);\n\n/**\n * ギャラリーの Hero 用ピックアップ。動画プレビューを持つ壁紙から\n * trending(直近のライセンス取得数) / fresh(新着) / popular(全期間ライセンス数)\n * を重み付き RRF で融合し、時間バケット seed でシャッフルして返す。\n *\n * @generated from message fluxlay.wallpaper.v1.ListFeaturedWallpapersRequest\n */\nexport type ListFeaturedWallpapersRequest = Message<\"fluxlay.wallpaper.v1.ListFeaturedWallpapersRequest\"> & {\n /**\n * @generated from field: int32 limit = 1;\n */\n limit: number;\n};\n\nexport type ListFeaturedWallpapersRequestValid = ListFeaturedWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListFeaturedWallpapersRequest.\n * Use `create(ListFeaturedWallpapersRequestSchema)` to create a new message.\n */\nexport const ListFeaturedWallpapersRequestSchema: GenMessage<ListFeaturedWallpapersRequest, {validType: ListFeaturedWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 33);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListFeaturedWallpapersResponse\n */\nexport type ListFeaturedWallpapersResponse = Message<\"fluxlay.wallpaper.v1.ListFeaturedWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n};\n\nexport type ListFeaturedWallpapersResponseValid = ListFeaturedWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListFeaturedWallpapersResponse.\n * Use `create(ListFeaturedWallpapersResponseSchema)` to create a new message.\n */\nexport const ListFeaturedWallpapersResponseSchema: GenMessage<ListFeaturedWallpapersResponse, {validType: ListFeaturedWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 34);\n\n/**\n * ある壁紙の事前計算済み関連壁紙を返す。\n *\n * @generated from message fluxlay.wallpaper.v1.ListRelatedWallpapersRequest\n */\nexport type ListRelatedWallpapersRequest = Message<\"fluxlay.wallpaper.v1.ListRelatedWallpapersRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: optional int32 limit = 2;\n */\n limit?: number | undefined;\n};\n\nexport type ListRelatedWallpapersRequestValid = ListRelatedWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListRelatedWallpapersRequest.\n * Use `create(ListRelatedWallpapersRequestSchema)` to create a new message.\n */\nexport const ListRelatedWallpapersRequestSchema: GenMessage<ListRelatedWallpapersRequest, {validType: ListRelatedWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 35);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListRelatedWallpapersResponse\n */\nexport type ListRelatedWallpapersResponse = Message<\"fluxlay.wallpaper.v1.ListRelatedWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n};\n\nexport type ListRelatedWallpapersResponseValid = ListRelatedWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListRelatedWallpapersResponse.\n * Use `create(ListRelatedWallpapersResponseSchema)` to create a new message.\n */\nexport const ListRelatedWallpapersResponseSchema: GenMessage<ListRelatedWallpapersResponse, {validType: ListRelatedWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 36);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.HandleSlug\n */\nexport type HandleSlug = Message<\"fluxlay.wallpaper.v1.HandleSlug\"> & {\n /**\n * @generated from field: string handle = 1;\n */\n handle: string;\n\n /**\n * @generated from field: string slug = 2;\n */\n slug: string;\n};\n\nexport type HandleSlugValid = HandleSlug;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.HandleSlug.\n * Use `create(HandleSlugSchema)` to create a new message.\n */\nexport const HandleSlugSchema: GenMessage<HandleSlug, {validType: HandleSlugValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 37);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetWallpaperRequest\n */\nexport type GetWallpaperRequest = Message<\"fluxlay.wallpaper.v1.GetWallpaperRequest\"> & {\n /**\n * @generated from oneof fluxlay.wallpaper.v1.GetWallpaperRequest.identifier\n */\n identifier: {\n /**\n * @generated from field: string id = 1;\n */\n value: string;\n case: \"id\";\n } | {\n /**\n * @generated from field: string slug = 2;\n */\n value: string;\n case: \"slug\";\n } | {\n /**\n * @generated from field: fluxlay.wallpaper.v1.HandleSlug handle_slug = 3;\n */\n value: HandleSlug;\n case: \"handleSlug\";\n } | { case: undefined; value?: undefined };\n\n /**\n * trueの場合、公開済み(active)バージョンのみ含める\n *\n * @generated from field: bool active_only = 4;\n */\n activeOnly: boolean;\n};\n\nexport type GetWallpaperRequestValid = GetWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetWallpaperRequest.\n * Use `create(GetWallpaperRequestSchema)` to create a new message.\n */\nexport const GetWallpaperRequestSchema: GenMessage<GetWallpaperRequest, {validType: GetWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 38);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetWallpaperResponse\n */\nexport type GetWallpaperResponse = Message<\"fluxlay.wallpaper.v1.GetWallpaperResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.Wallpaper wallpaper = 1;\n */\n wallpaper?: Wallpaper | undefined;\n};\n\nexport type GetWallpaperResponseValid = GetWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetWallpaperResponse.\n * Use `create(GetWallpaperResponseSchema)` to create a new message.\n */\nexport const GetWallpaperResponseSchema: GenMessage<GetWallpaperResponse, {validType: GetWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 39);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetDeveloperKeyRequest\n */\nexport type GetDeveloperKeyRequest = Message<\"fluxlay.wallpaper.v1.GetDeveloperKeyRequest\"> & {\n /**\n * @generated from field: bytes salt = 1;\n */\n salt: Uint8Array;\n\n /**\n * 鍵配送プロトコルのバージョン。FLX3 では 2 を要求する。\n *\n * @generated from field: uint32 protocol_version = 2;\n */\n protocolVersion: number;\n\n /**\n * 端末の X25519 公開鍵(32B)。サーバーはこれと静的秘密鍵で IKM を導出する。\n *\n * @generated from field: bytes device_public_key = 3;\n */\n devicePublicKey: Uint8Array;\n};\n\nexport type GetDeveloperKeyRequestValid = GetDeveloperKeyRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetDeveloperKeyRequest.\n * Use `create(GetDeveloperKeyRequestSchema)` to create a new message.\n */\nexport const GetDeveloperKeyRequestSchema: GenMessage<GetDeveloperKeyRequest, {validType: GetDeveloperKeyRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 40);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetDeveloperKeyResponse\n */\nexport type GetDeveloperKeyResponse = Message<\"fluxlay.wallpaper.v1.GetDeveloperKeyResponse\"> & {\n /**\n * @generated from field: bytes developer_key = 1;\n */\n developerKey: Uint8Array;\n\n /**\n * 鍵キャッシュの有効期限(UNIX 秒)。app はこの期限内のみキャッシュを使う。\n *\n * @generated from field: int64 expires_at = 2;\n */\n expiresAt: bigint;\n\n /**\n * この wrap に使ったサーバー静的 X25519 公開鍵(32B)。クライアントはこれで IKM を導出する。\n * レスポンスに含めることで、ピン留め無しでサーバー側だけで鍵ローテーション可能にする。\n *\n * @generated from field: bytes server_public_key = 3;\n */\n serverPublicKey: Uint8Array;\n\n /**\n * 発行時点のユーザー鍵 epoch。app はキャッシュにこれを保存し、GetKeyEpoch と照合する。\n *\n * @generated from field: int64 key_epoch = 4;\n */\n keyEpoch: bigint;\n};\n\nexport type GetDeveloperKeyResponseValid = GetDeveloperKeyResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetDeveloperKeyResponse.\n * Use `create(GetDeveloperKeyResponseSchema)` to create a new message.\n */\nexport const GetDeveloperKeyResponseSchema: GenMessage<GetDeveloperKeyResponse, {validType: GetDeveloperKeyResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 41);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.RegisterWallpaperRequest\n */\nexport type RegisterWallpaperRequest = Message<\"fluxlay.wallpaper.v1.RegisterWallpaperRequest\"> & {\n /**\n * @generated from field: string slug = 1;\n */\n slug: string;\n\n /**\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: string version = 3;\n */\n version: string;\n\n /**\n * @generated from field: bytes content_key = 4;\n */\n contentKey: Uint8Array;\n\n /**\n * fluxlay.yaml の network[] 宣言。公開バージョンに紐づけて保存する。\n *\n * @generated from field: repeated fluxlay.wallpaper.v1.NetworkOrigin network = 5;\n */\n network: NetworkOrigin[];\n};\n\nexport type RegisterWallpaperRequestValid = RegisterWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.RegisterWallpaperRequest.\n * Use `create(RegisterWallpaperRequestSchema)` to create a new message.\n */\nexport const RegisterWallpaperRequestSchema: GenMessage<RegisterWallpaperRequest, {validType: RegisterWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 42);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.RegisterWallpaperResponse\n */\nexport type RegisterWallpaperResponse = Message<\"fluxlay.wallpaper.v1.RegisterWallpaperResponse\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: string version_id = 2;\n */\n versionId: string;\n\n /**\n * @generated from field: string upload_url = 3;\n */\n uploadUrl: string;\n};\n\nexport type RegisterWallpaperResponseValid = RegisterWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.RegisterWallpaperResponse.\n * Use `create(RegisterWallpaperResponseSchema)` to create a new message.\n */\nexport const RegisterWallpaperResponseSchema: GenMessage<RegisterWallpaperResponse, {validType: RegisterWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 43);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetContentKeyRequest\n */\nexport type GetContentKeyRequest = Message<\"fluxlay.wallpaper.v1.GetContentKeyRequest\"> & {\n /**\n * @generated from field: string version_id = 1;\n */\n versionId: string;\n\n /**\n * @generated from field: bytes salt = 2;\n */\n salt: Uint8Array;\n\n /**\n * 鍵配送プロトコルのバージョン。FLX3 では 2 を要求する。\n *\n * @generated from field: uint32 protocol_version = 3;\n */\n protocolVersion: number;\n\n /**\n * 端末の X25519 公開鍵(32B)。\n *\n * @generated from field: bytes device_public_key = 4;\n */\n devicePublicKey: Uint8Array;\n};\n\nexport type GetContentKeyRequestValid = GetContentKeyRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetContentKeyRequest.\n * Use `create(GetContentKeyRequestSchema)` to create a new message.\n */\nexport const GetContentKeyRequestSchema: GenMessage<GetContentKeyRequest, {validType: GetContentKeyRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 44);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetContentKeyResponse\n */\nexport type GetContentKeyResponse = Message<\"fluxlay.wallpaper.v1.GetContentKeyResponse\"> & {\n /**\n * @generated from field: bytes content_key = 1;\n */\n contentKey: Uint8Array;\n\n /**\n * 鍵キャッシュの有効期限(UNIX 秒)。期限切れ時は app が再取得する。\n *\n * @generated from field: int64 expires_at = 2;\n */\n expiresAt: bigint;\n\n /**\n * この wrap に使ったサーバー静的 X25519 公開鍵(32B)。クライアントはこれで IKM を導出する。\n *\n * @generated from field: bytes server_public_key = 3;\n */\n serverPublicKey: Uint8Array;\n\n /**\n * 発行時点のユーザー鍵 epoch。app はキャッシュにこれを保存し、GetKeyEpoch と照合する。\n *\n * @generated from field: int64 key_epoch = 4;\n */\n keyEpoch: bigint;\n};\n\nexport type GetContentKeyResponseValid = GetContentKeyResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetContentKeyResponse.\n * Use `create(GetContentKeyResponseSchema)` to create a new message.\n */\nexport const GetContentKeyResponseSchema: GenMessage<GetContentKeyResponse, {validType: GetContentKeyResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 45);\n\n/**\n * 端末ごとの X25519 公開鍵を登録する。鍵配送 v2 の前提。\n *\n * @generated from message fluxlay.wallpaper.v1.RegisterDeviceKeyRequest\n */\nexport type RegisterDeviceKeyRequest = Message<\"fluxlay.wallpaper.v1.RegisterDeviceKeyRequest\"> & {\n /**\n * 端末を一意に識別する ID(app が生成・永続化)。\n *\n * @generated from field: string device_id = 1;\n */\n deviceId: string;\n\n /**\n * 端末の X25519 公開鍵(32B)。\n *\n * @generated from field: bytes device_public_key = 2;\n */\n devicePublicKey: Uint8Array;\n};\n\nexport type RegisterDeviceKeyRequestValid = RegisterDeviceKeyRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.RegisterDeviceKeyRequest.\n * Use `create(RegisterDeviceKeyRequestSchema)` to create a new message.\n */\nexport const RegisterDeviceKeyRequestSchema: GenMessage<RegisterDeviceKeyRequest, {validType: RegisterDeviceKeyRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 46);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.RegisterDeviceKeyResponse\n */\nexport type RegisterDeviceKeyResponse = Message<\"fluxlay.wallpaper.v1.RegisterDeviceKeyResponse\"> & {\n};\n\nexport type RegisterDeviceKeyResponseValid = RegisterDeviceKeyResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.RegisterDeviceKeyResponse.\n * Use `create(RegisterDeviceKeyResponseSchema)` to create a new message.\n */\nexport const RegisterDeviceKeyResponseSchema: GenMessage<RegisterDeviceKeyResponse, {validType: RegisterDeviceKeyResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 47);\n\n/**\n * 鍵キャッシュの強制無効化(即時失効)用 epoch を返す。\n * app はセッション開始時にこれを取得し、キャッシュ済み鍵の epoch と不一致なら\n * キャッシュを破棄して再取得する(サーバー側でライセンス再評価が走る)。\n *\n * @generated from message fluxlay.wallpaper.v1.GetKeyEpochRequest\n */\nexport type GetKeyEpochRequest = Message<\"fluxlay.wallpaper.v1.GetKeyEpochRequest\"> & {\n};\n\nexport type GetKeyEpochRequestValid = GetKeyEpochRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetKeyEpochRequest.\n * Use `create(GetKeyEpochRequestSchema)` to create a new message.\n */\nexport const GetKeyEpochRequestSchema: GenMessage<GetKeyEpochRequest, {validType: GetKeyEpochRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 48);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetKeyEpochResponse\n */\nexport type GetKeyEpochResponse = Message<\"fluxlay.wallpaper.v1.GetKeyEpochResponse\"> & {\n /**\n * 現在のユーザー鍵 epoch。失効オペレーションでインクリメントされる。\n *\n * @generated from field: int64 key_epoch = 1;\n */\n keyEpoch: bigint;\n};\n\nexport type GetKeyEpochResponseValid = GetKeyEpochResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetKeyEpochResponse.\n * Use `create(GetKeyEpochResponseSchema)` to create a new message.\n */\nexport const GetKeyEpochResponseSchema: GenMessage<GetKeyEpochResponse, {validType: GetKeyEpochResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 49);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ConfirmUploadRequest\n */\nexport type ConfirmUploadRequest = Message<\"fluxlay.wallpaper.v1.ConfirmUploadRequest\"> & {\n /**\n * @generated from field: string version_id = 1;\n */\n versionId: string;\n};\n\nexport type ConfirmUploadRequestValid = ConfirmUploadRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ConfirmUploadRequest.\n * Use `create(ConfirmUploadRequestSchema)` to create a new message.\n */\nexport const ConfirmUploadRequestSchema: GenMessage<ConfirmUploadRequest, {validType: ConfirmUploadRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 50);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ConfirmUploadResponse\n */\nexport type ConfirmUploadResponse = Message<\"fluxlay.wallpaper.v1.ConfirmUploadResponse\"> & {\n};\n\nexport type ConfirmUploadResponseValid = ConfirmUploadResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ConfirmUploadResponse.\n * Use `create(ConfirmUploadResponseSchema)` to create a new message.\n */\nexport const ConfirmUploadResponseSchema: GenMessage<ConfirmUploadResponse, {validType: ConfirmUploadResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 51);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.CancelUploadRequest\n */\nexport type CancelUploadRequest = Message<\"fluxlay.wallpaper.v1.CancelUploadRequest\"> & {\n /**\n * @generated from field: string version_id = 1;\n */\n versionId: string;\n};\n\nexport type CancelUploadRequestValid = CancelUploadRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.CancelUploadRequest.\n * Use `create(CancelUploadRequestSchema)` to create a new message.\n */\nexport const CancelUploadRequestSchema: GenMessage<CancelUploadRequest, {validType: CancelUploadRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 52);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.CancelUploadResponse\n */\nexport type CancelUploadResponse = Message<\"fluxlay.wallpaper.v1.CancelUploadResponse\"> & {\n};\n\nexport type CancelUploadResponseValid = CancelUploadResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.CancelUploadResponse.\n * Use `create(CancelUploadResponseSchema)` to create a new message.\n */\nexport const CancelUploadResponseSchema: GenMessage<CancelUploadResponse, {validType: CancelUploadResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 53);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.PriceEntry\n */\nexport type PriceEntry = Message<\"fluxlay.wallpaper.v1.PriceEntry\"> & {\n /**\n * @generated from field: string currency = 1;\n */\n currency: string;\n\n /**\n * @generated from field: int64 amount = 2;\n */\n amount: bigint;\n};\n\nexport type PriceEntryValid = PriceEntry;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.PriceEntry.\n * Use `create(PriceEntrySchema)` to create a new message.\n */\nexport const PriceEntrySchema: GenMessage<PriceEntry, {validType: PriceEntryValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 54);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.SetWallpaperPriceRequest\n */\nexport type SetWallpaperPriceRequest = Message<\"fluxlay.wallpaper.v1.SetWallpaperPriceRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.PriceEntry prices = 2;\n */\n prices: PriceEntry[];\n};\n\nexport type SetWallpaperPriceRequestValid = SetWallpaperPriceRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.SetWallpaperPriceRequest.\n * Use `create(SetWallpaperPriceRequestSchema)` to create a new message.\n */\nexport const SetWallpaperPriceRequestSchema: GenMessage<SetWallpaperPriceRequest, {validType: SetWallpaperPriceRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 55);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.SetWallpaperPriceResponse\n */\nexport type SetWallpaperPriceResponse = Message<\"fluxlay.wallpaper.v1.SetWallpaperPriceResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.Wallpaper wallpaper = 1;\n */\n wallpaper?: Wallpaper | undefined;\n};\n\nexport type SetWallpaperPriceResponseValid = SetWallpaperPriceResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.SetWallpaperPriceResponse.\n * Use `create(SetWallpaperPriceResponseSchema)` to create a new message.\n */\nexport const SetWallpaperPriceResponseSchema: GenMessage<SetWallpaperPriceResponse, {validType: SetWallpaperPriceResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 56);\n\n/**\n * @generated from enum fluxlay.wallpaper.v1.WallpaperStatus\n */\nexport enum WallpaperStatus {\n /**\n * @generated from enum value: WALLPAPER_STATUS_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: WALLPAPER_STATUS_UPLOADING = 1;\n */\n UPLOADING = 1,\n\n /**\n * @generated from enum value: WALLPAPER_STATUS_DRAFT = 2;\n */\n DRAFT = 2,\n\n /**\n * @generated from enum value: WALLPAPER_STATUS_ACTIVE = 3;\n */\n ACTIVE = 3,\n}\n\n/**\n * Describes the enum fluxlay.wallpaper.v1.WallpaperStatus.\n */\nexport const WallpaperStatusSchema: GenEnum<WallpaperStatus> = /*@__PURE__*/\n enumDesc(file_fluxlay_wallpaper_v1_wallpaper, 0);\n\n/**\n * @generated from enum fluxlay.wallpaper.v1.WallpaperSortBy\n */\nexport enum WallpaperSortBy {\n /**\n * @generated from enum value: WALLPAPER_SORT_BY_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * 作成日時の降順(デフォルト)\n *\n * @generated from enum value: WALLPAPER_SORT_BY_CREATED_AT = 1;\n */\n CREATED_AT = 1,\n\n /**\n * ライセンス数の降順(人気順)\n *\n * @generated from enum value: WALLPAPER_SORT_BY_LICENSE_COUNT = 2;\n */\n LICENSE_COUNT = 2,\n}\n\n/**\n * Describes the enum fluxlay.wallpaper.v1.WallpaperSortBy.\n */\nexport const WallpaperSortBySchema: GenEnum<WallpaperSortBy> = /*@__PURE__*/\n enumDesc(file_fluxlay_wallpaper_v1_wallpaper, 1);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/v1/service.proto (package fluxlay.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenService } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, serviceDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { WhoamiRequestSchema, WhoamiResponseSchema } from \"../admin/v1/admin_pb.ts\";\nimport { file_fluxlay_admin_v1_admin } from \"../admin/v1/admin_pb.ts\";\nimport type { ApproveDeviceRequestSchema, ApproveDeviceResponseSchema, CreateDeviceCodeRequestSchema, CreateDeviceCodeResponseSchema, PollDeviceTokenRequestSchema, PollDeviceTokenResponseSchema } from \"../auth/v1/auth_pb.ts\";\nimport { file_fluxlay_auth_v1_auth } from \"../auth/v1/auth_pb.ts\";\nimport type { CreatePaymentIntentRequestSchema, CreatePaymentIntentResponseSchema } from \"../checkout/v1/checkout_pb.ts\";\nimport { file_fluxlay_checkout_v1_checkout } from \"../checkout/v1/checkout_pb.ts\";\nimport type { SendContactRequestSchema, SendContactResponseSchema } from \"../contact/v1/contact_pb.ts\";\nimport { file_fluxlay_contact_v1_contact } from \"../contact/v1/contact_pb.ts\";\nimport type { GetUnreadNotificationCountRequestSchema, GetUnreadNotificationCountResponseSchema, ListNotificationsRequestSchema, ListNotificationsResponseSchema, MarkAllNotificationsReadRequestSchema, MarkAllNotificationsReadResponseSchema, MarkNotificationReadRequestSchema, MarkNotificationReadResponseSchema } from \"../notification/v1/notification_pb.ts\";\nimport { file_fluxlay_notification_v1_notification } from \"../notification/v1/notification_pb.ts\";\nimport type { GetPublicStatsRequestSchema, GetPublicStatsResponseSchema } from \"../stats/v1/stats_pb.ts\";\nimport { file_fluxlay_stats_v1_stats } from \"../stats/v1/stats_pb.ts\";\nimport type { CreateAccountRequestSchema, CreateAccountResponseSchema, CreateAccountSessionRequestSchema, CreateAccountSessionResponseSchema, GetAccountStatusRequestSchema, GetAccountStatusResponseSchema } from \"../stripe/v1/stripe_pb.ts\";\nimport { file_fluxlay_stripe_v1_stripe } from \"../stripe/v1/stripe_pb.ts\";\nimport type { CompleteOnboardingRequestSchema, CompleteOnboardingResponseSchema, CreateProfileUploadURLRequestSchema, CreateProfileUploadURLResponseSchema, GetCurrentUserRequestSchema, GetCurrentUserResponseSchema, GetOnboardingStatusRequestSchema, GetOnboardingStatusResponseSchema, GetUserRequestSchema, GetUserResponseSchema, ListUsersRequestSchema, ListUsersResponseSchema, UpdateCurrentUserProfileRequestSchema, UpdateCurrentUserProfileResponseSchema, UpdateProfileImageRequestSchema, UpdateProfileImageResponseSchema } from \"../user/v1/user_pb.ts\";\nimport { file_fluxlay_user_v1_user } from \"../user/v1/user_pb.ts\";\nimport type { AcquireWallpaperRequestSchema, AcquireWallpaperResponseSchema, AddPreviewImageRequestSchema, AddPreviewImageResponseSchema, CancelUploadRequestSchema, CancelUploadResponseSchema, ConfirmUploadRequestSchema, ConfirmUploadResponseSchema, CreatePreviewUploadURLRequestSchema, CreatePreviewUploadURLResponseSchema, DeletePreviewImageRequestSchema, DeletePreviewImageResponseSchema, DeleteWallpaperRequestSchema, DeleteWallpaperResponseSchema, FavoriteWallpaperRequestSchema, FavoriteWallpaperResponseSchema, GetContentKeyRequestSchema, GetContentKeyResponseSchema, GetDeveloperKeyRequestSchema, GetDeveloperKeyResponseSchema, GetKeyEpochRequestSchema, GetKeyEpochResponseSchema, GetWallpaperRequestSchema, GetWallpaperResponseSchema, ListFeaturedWallpapersRequestSchema, ListFeaturedWallpapersResponseSchema, ListOwnedWallpapersRequestSchema, ListOwnedWallpapersResponseSchema, ListRelatedWallpapersRequestSchema, ListRelatedWallpapersResponseSchema, ListUserWallpapersRequestSchema, ListUserWallpapersResponseSchema, ListWallpapersRequestSchema, ListWallpapersResponseSchema, PublishWallpaperRequestSchema, PublishWallpaperResponseSchema, RegisterDeviceKeyRequestSchema, RegisterDeviceKeyResponseSchema, RegisterWallpaperRequestSchema, RegisterWallpaperResponseSchema, SearchWallpapersRequestSchema, SearchWallpapersResponseSchema, SetWallpaperPriceRequestSchema, SetWallpaperPriceResponseSchema, UnfavoriteWallpaperRequestSchema, UnfavoriteWallpaperResponseSchema, UnpublishWallpaperRequestSchema, UnpublishWallpaperResponseSchema, UpdateWallpaperMetadataRequestSchema, UpdateWallpaperMetadataResponseSchema } from \"../wallpaper/v1/wallpaper_pb.ts\";\nimport { file_fluxlay_wallpaper_v1_wallpaper } from \"../wallpaper/v1/wallpaper_pb.ts\";\n\n/**\n * Describes the file fluxlay/v1/service.proto.\n */\nexport const file_fluxlay_v1_service: GenFile = /*@__PURE__*/\n fileDesc(\"ChhmbHV4bGF5L3YxL3NlcnZpY2UucHJvdG8SCmZsdXhsYXkudjEy8gYKC1VzZXJTZXJ2aWNlEmYKDkdldEN1cnJlbnRVc2VyEiYuZmx1eGxheS51c2VyLnYxLkdldEN1cnJlbnRVc2VyUmVxdWVzdBonLmZsdXhsYXkudXNlci52MS5HZXRDdXJyZW50VXNlclJlc3BvbnNlIgOQAgESUQoHR2V0VXNlchIfLmZsdXhsYXkudXNlci52MS5HZXRVc2VyUmVxdWVzdBogLmZsdXhsYXkudXNlci52MS5HZXRVc2VyUmVzcG9uc2UiA5ACARJ/ChhVcGRhdGVDdXJyZW50VXNlclByb2ZpbGUSMC5mbHV4bGF5LnVzZXIudjEuVXBkYXRlQ3VycmVudFVzZXJQcm9maWxlUmVxdWVzdBoxLmZsdXhsYXkudXNlci52MS5VcGRhdGVDdXJyZW50VXNlclByb2ZpbGVSZXNwb25zZRJtChJVcGRhdGVQcm9maWxlSW1hZ2USKi5mbHV4bGF5LnVzZXIudjEuVXBkYXRlUHJvZmlsZUltYWdlUmVxdWVzdBorLmZsdXhsYXkudXNlci52MS5VcGRhdGVQcm9maWxlSW1hZ2VSZXNwb25zZRJ5ChZDcmVhdGVQcm9maWxlVXBsb2FkVVJMEi4uZmx1eGxheS51c2VyLnYxLkNyZWF0ZVByb2ZpbGVVcGxvYWRVUkxSZXF1ZXN0Gi8uZmx1eGxheS51c2VyLnYxLkNyZWF0ZVByb2ZpbGVVcGxvYWRVUkxSZXNwb25zZRJ1ChNHZXRPbmJvYXJkaW5nU3RhdHVzEisuZmx1eGxheS51c2VyLnYxLkdldE9uYm9hcmRpbmdTdGF0dXNSZXF1ZXN0GiwuZmx1eGxheS51c2VyLnYxLkdldE9uYm9hcmRpbmdTdGF0dXNSZXNwb25zZSIDkAIBEm0KEkNvbXBsZXRlT25ib2FyZGluZxIqLmZsdXhsYXkudXNlci52MS5Db21wbGV0ZU9uYm9hcmRpbmdSZXF1ZXN0GisuZmx1eGxheS51c2VyLnYxLkNvbXBsZXRlT25ib2FyZGluZ1Jlc3BvbnNlElcKCUxpc3RVc2VycxIhLmZsdXhsYXkudXNlci52MS5MaXN0VXNlcnNSZXF1ZXN0GiIuZmx1eGxheS51c2VyLnYxLkxpc3RVc2Vyc1Jlc3BvbnNlIgOQAgEyYAoMQWRtaW5TZXJ2aWNlElAKBldob2FtaRIfLmZsdXhsYXkuYWRtaW4udjEuV2hvYW1pUmVxdWVzdBogLmZsdXhsYXkuYWRtaW4udjEuV2hvYW1pUmVzcG9uc2UiA5ACATK8AgoLQXV0aFNlcnZpY2USZwoQQ3JlYXRlRGV2aWNlQ29kZRIoLmZsdXhsYXkuYXV0aC52MS5DcmVhdGVEZXZpY2VDb2RlUmVxdWVzdBopLmZsdXhsYXkuYXV0aC52MS5DcmVhdGVEZXZpY2VDb2RlUmVzcG9uc2USZAoPUG9sbERldmljZVRva2VuEicuZmx1eGxheS5hdXRoLnYxLlBvbGxEZXZpY2VUb2tlblJlcXVlc3QaKC5mbHV4bGF5LmF1dGgudjEuUG9sbERldmljZVRva2VuUmVzcG9uc2USXgoNQXBwcm92ZURldmljZRIlLmZsdXhsYXkuYXV0aC52MS5BcHByb3ZlRGV2aWNlUmVxdWVzdBomLmZsdXhsYXkuYXV0aC52MS5BcHByb3ZlRGV2aWNlUmVzcG9uc2UyywQKE05vdGlmaWNhdGlvblNlcnZpY2USfwoRTGlzdE5vdGlmaWNhdGlvbnMSMS5mbHV4bGF5Lm5vdGlmaWNhdGlvbi52MS5MaXN0Tm90aWZpY2F0aW9uc1JlcXVlc3QaMi5mbHV4bGF5Lm5vdGlmaWNhdGlvbi52MS5MaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlIgOQAgESmgEKGkdldFVucmVhZE5vdGlmaWNhdGlvbkNvdW50EjouZmx1eGxheS5ub3RpZmljYXRpb24udjEuR2V0VW5yZWFkTm90aWZpY2F0aW9uQ291bnRSZXF1ZXN0GjsuZmx1eGxheS5ub3RpZmljYXRpb24udjEuR2V0VW5yZWFkTm90aWZpY2F0aW9uQ291bnRSZXNwb25zZSIDkAIBEoMBChRNYXJrTm90aWZpY2F0aW9uUmVhZBI0LmZsdXhsYXkubm90aWZpY2F0aW9uLnYxLk1hcmtOb3RpZmljYXRpb25SZWFkUmVxdWVzdBo1LmZsdXhsYXkubm90aWZpY2F0aW9uLnYxLk1hcmtOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USjwEKGE1hcmtBbGxOb3RpZmljYXRpb25zUmVhZBI4LmZsdXhsYXkubm90aWZpY2F0aW9uLnYxLk1hcmtBbGxOb3RpZmljYXRpb25zUmVhZFJlcXVlc3QaOS5mbHV4bGF5Lm5vdGlmaWNhdGlvbi52MS5NYXJrQWxsTm90aWZpY2F0aW9uc1JlYWRSZXNwb25zZTJwCg5Db250YWN0U2VydmljZRJeCgtTZW5kQ29udGFjdBImLmZsdXhsYXkuY29udGFjdC52MS5TZW5kQ29udGFjdFJlcXVlc3QaJy5mbHV4bGF5LmNvbnRhY3QudjEuU2VuZENvbnRhY3RSZXNwb25zZTJ4CgxTdGF0c1NlcnZpY2USaAoOR2V0UHVibGljU3RhdHMSJy5mbHV4bGF5LnN0YXRzLnYxLkdldFB1YmxpY1N0YXRzUmVxdWVzdBooLmZsdXhsYXkuc3RhdHMudjEuR2V0UHVibGljU3RhdHNSZXNwb25zZSIDkAIBMuUCChRTdHJpcGVDb25uZWN0U2VydmljZRJiCg1DcmVhdGVBY2NvdW50EicuZmx1eGxheS5zdHJpcGUudjEuQ3JlYXRlQWNjb3VudFJlcXVlc3QaKC5mbHV4bGF5LnN0cmlwZS52MS5DcmVhdGVBY2NvdW50UmVzcG9uc2USdwoUQ3JlYXRlQWNjb3VudFNlc3Npb24SLi5mbHV4bGF5LnN0cmlwZS52MS5DcmVhdGVBY2NvdW50U2Vzc2lvblJlcXVlc3QaLy5mbHV4bGF5LnN0cmlwZS52MS5DcmVhdGVBY2NvdW50U2Vzc2lvblJlc3BvbnNlEnAKEEdldEFjY291bnRTdGF0dXMSKi5mbHV4bGF5LnN0cmlwZS52MS5HZXRBY2NvdW50U3RhdHVzUmVxdWVzdBorLmZsdXhsYXkuc3RyaXBlLnYxLkdldEFjY291bnRTdGF0dXNSZXNwb25zZSIDkAIBMosBCg9DaGVja291dFNlcnZpY2USeAoTQ3JlYXRlUGF5bWVudEludGVudBIvLmZsdXhsYXkuY2hlY2tvdXQudjEuQ3JlYXRlUGF5bWVudEludGVudFJlcXVlc3QaMC5mbHV4bGF5LmNoZWNrb3V0LnYxLkNyZWF0ZVBheW1lbnRJbnRlbnRSZXNwb25zZTKkFwoQV2FsbHBhcGVyU2VydmljZRJwCg5MaXN0V2FsbHBhcGVycxIrLmZsdXhsYXkud2FsbHBhcGVyLnYxLkxpc3RXYWxscGFwZXJzUmVxdWVzdBosLmZsdXhsYXkud2FsbHBhcGVyLnYxLkxpc3RXYWxscGFwZXJzUmVzcG9uc2UiA5ACARJqCgxHZXRXYWxscGFwZXISKS5mbHV4bGF5LndhbGxwYXBlci52MS5HZXRXYWxscGFwZXJSZXF1ZXN0GiouZmx1eGxheS53YWxscGFwZXIudjEuR2V0V2FsbHBhcGVyUmVzcG9uc2UiA5ACARJ2ChBTZWFyY2hXYWxscGFwZXJzEi0uZmx1eGxheS53YWxscGFwZXIudjEuU2VhcmNoV2FsbHBhcGVyc1JlcXVlc3QaLi5mbHV4bGF5LndhbGxwYXBlci52MS5TZWFyY2hXYWxscGFwZXJzUmVzcG9uc2UiA5ACARKIAQoWTGlzdEZlYXR1cmVkV2FsbHBhcGVycxIzLmZsdXhsYXkud2FsbHBhcGVyLnYxLkxpc3RGZWF0dXJlZFdhbGxwYXBlcnNSZXF1ZXN0GjQuZmx1eGxheS53YWxscGFwZXIudjEuTGlzdEZlYXR1cmVkV2FsbHBhcGVyc1Jlc3BvbnNlIgOQAgEShQEKFUxpc3RSZWxhdGVkV2FsbHBhcGVycxIyLmZsdXhsYXkud2FsbHBhcGVyLnYxLkxpc3RSZWxhdGVkV2FsbHBhcGVyc1JlcXVlc3QaMy5mbHV4bGF5LndhbGxwYXBlci52MS5MaXN0UmVsYXRlZFdhbGxwYXBlcnNSZXNwb25zZSIDkAIBEnEKEEFjcXVpcmVXYWxscGFwZXISLS5mbHV4bGF5LndhbGxwYXBlci52MS5BY3F1aXJlV2FsbHBhcGVyUmVxdWVzdBouLmZsdXhsYXkud2FsbHBhcGVyLnYxLkFjcXVpcmVXYWxscGFwZXJSZXNwb25zZRJ/ChNMaXN0T3duZWRXYWxscGFwZXJzEjAuZmx1eGxheS53YWxscGFwZXIudjEuTGlzdE93bmVkV2FsbHBhcGVyc1JlcXVlc3QaMS5mbHV4bGF5LndhbGxwYXBlci52MS5MaXN0T3duZWRXYWxscGFwZXJzUmVzcG9uc2UiA5ACARJ0ChFGYXZvcml0ZVdhbGxwYXBlchIuLmZsdXhsYXkud2FsbHBhcGVyLnYxLkZhdm9yaXRlV2FsbHBhcGVyUmVxdWVzdBovLmZsdXhsYXkud2FsbHBhcGVyLnYxLkZhdm9yaXRlV2FsbHBhcGVyUmVzcG9uc2USegoTVW5mYXZvcml0ZVdhbGxwYXBlchIwLmZsdXhsYXkud2FsbHBhcGVyLnYxLlVuZmF2b3JpdGVXYWxscGFwZXJSZXF1ZXN0GjEuZmx1eGxheS53YWxscGFwZXIudjEuVW5mYXZvcml0ZVdhbGxwYXBlclJlc3BvbnNlEnwKEkxpc3RVc2VyV2FsbHBhcGVycxIvLmZsdXhsYXkud2FsbHBhcGVyLnYxLkxpc3RVc2VyV2FsbHBhcGVyc1JlcXVlc3QaMC5mbHV4bGF5LndhbGxwYXBlci52MS5MaXN0VXNlcldhbGxwYXBlcnNSZXNwb25zZSIDkAIBEoYBChdVcGRhdGVXYWxscGFwZXJNZXRhZGF0YRI0LmZsdXhsYXkud2FsbHBhcGVyLnYxLlVwZGF0ZVdhbGxwYXBlck1ldGFkYXRhUmVxdWVzdBo1LmZsdXhsYXkud2FsbHBhcGVyLnYxLlVwZGF0ZVdhbGxwYXBlck1ldGFkYXRhUmVzcG9uc2USgwEKFkNyZWF0ZVByZXZpZXdVcGxvYWRVUkwSMy5mbHV4bGF5LndhbGxwYXBlci52MS5DcmVhdGVQcmV2aWV3VXBsb2FkVVJMUmVxdWVzdBo0LmZsdXhsYXkud2FsbHBhcGVyLnYxLkNyZWF0ZVByZXZpZXdVcGxvYWRVUkxSZXNwb25zZRJuCg9BZGRQcmV2aWV3SW1hZ2USLC5mbHV4bGF5LndhbGxwYXBlci52MS5BZGRQcmV2aWV3SW1hZ2VSZXF1ZXN0Gi0uZmx1eGxheS53YWxscGFwZXIudjEuQWRkUHJldmlld0ltYWdlUmVzcG9uc2USdwoSRGVsZXRlUHJldmlld0ltYWdlEi8uZmx1eGxheS53YWxscGFwZXIudjEuRGVsZXRlUHJldmlld0ltYWdlUmVxdWVzdBowLmZsdXhsYXkud2FsbHBhcGVyLnYxLkRlbGV0ZVByZXZpZXdJbWFnZVJlc3BvbnNlEnEKEFB1Ymxpc2hXYWxscGFwZXISLS5mbHV4bGF5LndhbGxwYXBlci52MS5QdWJsaXNoV2FsbHBhcGVyUmVxdWVzdBouLmZsdXhsYXkud2FsbHBhcGVyLnYxLlB1Ymxpc2hXYWxscGFwZXJSZXNwb25zZRJ3ChJVbnB1Ymxpc2hXYWxscGFwZXISLy5mbHV4bGF5LndhbGxwYXBlci52MS5VbnB1Ymxpc2hXYWxscGFwZXJSZXF1ZXN0GjAuZmx1eGxheS53YWxscGFwZXIudjEuVW5wdWJsaXNoV2FsbHBhcGVyUmVzcG9uc2USbgoPRGVsZXRlV2FsbHBhcGVyEiwuZmx1eGxheS53YWxscGFwZXIudjEuRGVsZXRlV2FsbHBhcGVyUmVxdWVzdBotLmZsdXhsYXkud2FsbHBhcGVyLnYxLkRlbGV0ZVdhbGxwYXBlclJlc3BvbnNlEm4KD0dldERldmVsb3BlcktleRIsLmZsdXhsYXkud2FsbHBhcGVyLnYxLkdldERldmVsb3BlcktleVJlcXVlc3QaLS5mbHV4bGF5LndhbGxwYXBlci52MS5HZXREZXZlbG9wZXJLZXlSZXNwb25zZRJ0ChFSZWdpc3RlcldhbGxwYXBlchIuLmZsdXhsYXkud2FsbHBhcGVyLnYxLlJlZ2lzdGVyV2FsbHBhcGVyUmVxdWVzdBovLmZsdXhsYXkud2FsbHBhcGVyLnYxLlJlZ2lzdGVyV2FsbHBhcGVyUmVzcG9uc2USaAoNR2V0Q29udGVudEtleRIqLmZsdXhsYXkud2FsbHBhcGVyLnYxLkdldENvbnRlbnRLZXlSZXF1ZXN0GisuZmx1eGxheS53YWxscGFwZXIudjEuR2V0Q29udGVudEtleVJlc3BvbnNlEmgKDUNvbmZpcm1VcGxvYWQSKi5mbHV4bGF5LndhbGxwYXBlci52MS5Db25maXJtVXBsb2FkUmVxdWVzdBorLmZsdXhsYXkud2FsbHBhcGVyLnYxLkNvbmZpcm1VcGxvYWRSZXNwb25zZRJlCgxDYW5jZWxVcGxvYWQSKS5mbHV4bGF5LndhbGxwYXBlci52MS5DYW5jZWxVcGxvYWRSZXF1ZXN0GiouZmx1eGxheS53YWxscGFwZXIudjEuQ2FuY2VsVXBsb2FkUmVzcG9uc2USdAoRU2V0V2FsbHBhcGVyUHJpY2USLi5mbHV4bGF5LndhbGxwYXBlci52MS5TZXRXYWxscGFwZXJQcmljZVJlcXVlc3QaLy5mbHV4bGF5LndhbGxwYXBlci52MS5TZXRXYWxscGFwZXJQcmljZVJlc3BvbnNlEnQKEVJlZ2lzdGVyRGV2aWNlS2V5Ei4uZmx1eGxheS53YWxscGFwZXIudjEuUmVnaXN0ZXJEZXZpY2VLZXlSZXF1ZXN0Gi8uZmx1eGxheS53YWxscGFwZXIudjEuUmVnaXN0ZXJEZXZpY2VLZXlSZXNwb25zZRJiCgtHZXRLZXlFcG9jaBIoLmZsdXhsYXkud2FsbHBhcGVyLnYxLkdldEtleUVwb2NoUmVxdWVzdBopLmZsdXhsYXkud2FsbHBhcGVyLnYxLkdldEtleUVwb2NoUmVzcG9uc2VCpAEKDmNvbS5mbHV4bGF5LnYxQgxTZXJ2aWNlUHJvdG9QAVo7Z2l0aHViLmNvbS9rZW4xMDkvZmx1eGxheS1wcm90by9nZW4vZ28vZmx1eGxheS92MTtmbHV4bGF5djGiAgNGWFiqAgpGbHV4bGF5LlYxygIKRmx1eGxheVxWMeICFkZsdXhsYXlcVjFcR1BCTWV0YWRhdGHqAgtGbHV4bGF5OjpWMWIGcHJvdG8z\", [file_fluxlay_admin_v1_admin, file_fluxlay_auth_v1_auth, file_fluxlay_checkout_v1_checkout, file_fluxlay_contact_v1_contact, file_fluxlay_notification_v1_notification, file_fluxlay_stats_v1_stats, file_fluxlay_stripe_v1_stripe, file_fluxlay_user_v1_user, file_fluxlay_wallpaper_v1_wallpaper]);\n\n/**\n * @generated from service fluxlay.v1.UserService\n */\nexport const UserService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.UserService.GetCurrentUser\n */\n getCurrentUser: {\n methodKind: \"unary\";\n input: typeof GetCurrentUserRequestSchema;\n output: typeof GetCurrentUserResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.GetUser\n */\n getUser: {\n methodKind: \"unary\";\n input: typeof GetUserRequestSchema;\n output: typeof GetUserResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.UpdateCurrentUserProfile\n */\n updateCurrentUserProfile: {\n methodKind: \"unary\";\n input: typeof UpdateCurrentUserProfileRequestSchema;\n output: typeof UpdateCurrentUserProfileResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.UpdateProfileImage\n */\n updateProfileImage: {\n methodKind: \"unary\";\n input: typeof UpdateProfileImageRequestSchema;\n output: typeof UpdateProfileImageResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.CreateProfileUploadURL\n */\n createProfileUploadURL: {\n methodKind: \"unary\";\n input: typeof CreateProfileUploadURLRequestSchema;\n output: typeof CreateProfileUploadURLResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.GetOnboardingStatus\n */\n getOnboardingStatus: {\n methodKind: \"unary\";\n input: typeof GetOnboardingStatusRequestSchema;\n output: typeof GetOnboardingStatusResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.CompleteOnboarding\n */\n completeOnboarding: {\n methodKind: \"unary\";\n input: typeof CompleteOnboardingRequestSchema;\n output: typeof CompleteOnboardingResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.ListUsers\n */\n listUsers: {\n methodKind: \"unary\";\n input: typeof ListUsersRequestSchema;\n output: typeof ListUsersResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 0);\n\n/**\n * 運営向け管理 RPC。全メソッドが admin interceptor(user_kind = internal 必須)を通る。\n * FLX-107 / 108 / 110 の admin RPC もこのサービスに追加していく。\n *\n * @generated from service fluxlay.v1.AdminService\n */\nexport const AdminService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.AdminService.Whoami\n */\n whoami: {\n methodKind: \"unary\";\n input: typeof WhoamiRequestSchema;\n output: typeof WhoamiResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 1);\n\n/**\n * @generated from service fluxlay.v1.AuthService\n */\nexport const AuthService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.AuthService.CreateDeviceCode\n */\n createDeviceCode: {\n methodKind: \"unary\";\n input: typeof CreateDeviceCodeRequestSchema;\n output: typeof CreateDeviceCodeResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.AuthService.PollDeviceToken\n */\n pollDeviceToken: {\n methodKind: \"unary\";\n input: typeof PollDeviceTokenRequestSchema;\n output: typeof PollDeviceTokenResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.AuthService.ApproveDevice\n */\n approveDevice: {\n methodKind: \"unary\";\n input: typeof ApproveDeviceRequestSchema;\n output: typeof ApproveDeviceResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 2);\n\n/**\n * アプリ内通知(FLX-112)。全 RPC が認証必須。\n * 通知の発行はサーバー内部(各機能のユースケース)からのみ行い、RPC では公開しない。\n *\n * @generated from service fluxlay.v1.NotificationService\n */\nexport const NotificationService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.NotificationService.ListNotifications\n */\n listNotifications: {\n methodKind: \"unary\";\n input: typeof ListNotificationsRequestSchema;\n output: typeof ListNotificationsResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.NotificationService.GetUnreadNotificationCount\n */\n getUnreadNotificationCount: {\n methodKind: \"unary\";\n input: typeof GetUnreadNotificationCountRequestSchema;\n output: typeof GetUnreadNotificationCountResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.NotificationService.MarkNotificationRead\n */\n markNotificationRead: {\n methodKind: \"unary\";\n input: typeof MarkNotificationReadRequestSchema;\n output: typeof MarkNotificationReadResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.NotificationService.MarkAllNotificationsRead\n */\n markAllNotificationsRead: {\n methodKind: \"unary\";\n input: typeof MarkAllNotificationsReadRequestSchema;\n output: typeof MarkAllNotificationsReadResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 3);\n\n/**\n * @generated from service fluxlay.v1.ContactService\n */\nexport const ContactService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.ContactService.SendContact\n */\n sendContact: {\n methodKind: \"unary\";\n input: typeof SendContactRequestSchema;\n output: typeof SendContactResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 4);\n\n/**\n * @generated from service fluxlay.v1.StatsService\n */\nexport const StatsService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.StatsService.GetPublicStats\n */\n getPublicStats: {\n methodKind: \"unary\";\n input: typeof GetPublicStatsRequestSchema;\n output: typeof GetPublicStatsResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 5);\n\n/**\n * @generated from service fluxlay.v1.StripeConnectService\n */\nexport const StripeConnectService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.StripeConnectService.CreateAccount\n */\n createAccount: {\n methodKind: \"unary\";\n input: typeof CreateAccountRequestSchema;\n output: typeof CreateAccountResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.StripeConnectService.CreateAccountSession\n */\n createAccountSession: {\n methodKind: \"unary\";\n input: typeof CreateAccountSessionRequestSchema;\n output: typeof CreateAccountSessionResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.StripeConnectService.GetAccountStatus\n */\n getAccountStatus: {\n methodKind: \"unary\";\n input: typeof GetAccountStatusRequestSchema;\n output: typeof GetAccountStatusResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 6);\n\n/**\n * @generated from service fluxlay.v1.CheckoutService\n */\nexport const CheckoutService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.CheckoutService.CreatePaymentIntent\n */\n createPaymentIntent: {\n methodKind: \"unary\";\n input: typeof CreatePaymentIntentRequestSchema;\n output: typeof CreatePaymentIntentResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 7);\n\n/**\n * @generated from service fluxlay.v1.WallpaperService\n */\nexport const WallpaperService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ListWallpapers\n */\n listWallpapers: {\n methodKind: \"unary\";\n input: typeof ListWallpapersRequestSchema;\n output: typeof ListWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.GetWallpaper\n */\n getWallpaper: {\n methodKind: \"unary\";\n input: typeof GetWallpaperRequestSchema;\n output: typeof GetWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.SearchWallpapers\n */\n searchWallpapers: {\n methodKind: \"unary\";\n input: typeof SearchWallpapersRequestSchema;\n output: typeof SearchWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ListFeaturedWallpapers\n */\n listFeaturedWallpapers: {\n methodKind: \"unary\";\n input: typeof ListFeaturedWallpapersRequestSchema;\n output: typeof ListFeaturedWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ListRelatedWallpapers\n */\n listRelatedWallpapers: {\n methodKind: \"unary\";\n input: typeof ListRelatedWallpapersRequestSchema;\n output: typeof ListRelatedWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.AcquireWallpaper\n */\n acquireWallpaper: {\n methodKind: \"unary\";\n input: typeof AcquireWallpaperRequestSchema;\n output: typeof AcquireWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ListOwnedWallpapers\n */\n listOwnedWallpapers: {\n methodKind: \"unary\";\n input: typeof ListOwnedWallpapersRequestSchema;\n output: typeof ListOwnedWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.FavoriteWallpaper\n */\n favoriteWallpaper: {\n methodKind: \"unary\";\n input: typeof FavoriteWallpaperRequestSchema;\n output: typeof FavoriteWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.UnfavoriteWallpaper\n */\n unfavoriteWallpaper: {\n methodKind: \"unary\";\n input: typeof UnfavoriteWallpaperRequestSchema;\n output: typeof UnfavoriteWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ListUserWallpapers\n */\n listUserWallpapers: {\n methodKind: \"unary\";\n input: typeof ListUserWallpapersRequestSchema;\n output: typeof ListUserWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.UpdateWallpaperMetadata\n */\n updateWallpaperMetadata: {\n methodKind: \"unary\";\n input: typeof UpdateWallpaperMetadataRequestSchema;\n output: typeof UpdateWallpaperMetadataResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.CreatePreviewUploadURL\n */\n createPreviewUploadURL: {\n methodKind: \"unary\";\n input: typeof CreatePreviewUploadURLRequestSchema;\n output: typeof CreatePreviewUploadURLResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.AddPreviewImage\n */\n addPreviewImage: {\n methodKind: \"unary\";\n input: typeof AddPreviewImageRequestSchema;\n output: typeof AddPreviewImageResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.DeletePreviewImage\n */\n deletePreviewImage: {\n methodKind: \"unary\";\n input: typeof DeletePreviewImageRequestSchema;\n output: typeof DeletePreviewImageResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.PublishWallpaper\n */\n publishWallpaper: {\n methodKind: \"unary\";\n input: typeof PublishWallpaperRequestSchema;\n output: typeof PublishWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.UnpublishWallpaper\n */\n unpublishWallpaper: {\n methodKind: \"unary\";\n input: typeof UnpublishWallpaperRequestSchema;\n output: typeof UnpublishWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.DeleteWallpaper\n */\n deleteWallpaper: {\n methodKind: \"unary\";\n input: typeof DeleteWallpaperRequestSchema;\n output: typeof DeleteWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.GetDeveloperKey\n */\n getDeveloperKey: {\n methodKind: \"unary\";\n input: typeof GetDeveloperKeyRequestSchema;\n output: typeof GetDeveloperKeyResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.RegisterWallpaper\n */\n registerWallpaper: {\n methodKind: \"unary\";\n input: typeof RegisterWallpaperRequestSchema;\n output: typeof RegisterWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.GetContentKey\n */\n getContentKey: {\n methodKind: \"unary\";\n input: typeof GetContentKeyRequestSchema;\n output: typeof GetContentKeyResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ConfirmUpload\n */\n confirmUpload: {\n methodKind: \"unary\";\n input: typeof ConfirmUploadRequestSchema;\n output: typeof ConfirmUploadResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.CancelUpload\n */\n cancelUpload: {\n methodKind: \"unary\";\n input: typeof CancelUploadRequestSchema;\n output: typeof CancelUploadResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.SetWallpaperPrice\n */\n setWallpaperPrice: {\n methodKind: \"unary\";\n input: typeof SetWallpaperPriceRequestSchema;\n output: typeof SetWallpaperPriceResponseSchema;\n },\n /**\n * 鍵配送 v2: 端末公開鍵の登録。\n *\n * @generated from rpc fluxlay.v1.WallpaperService.RegisterDeviceKey\n */\n registerDeviceKey: {\n methodKind: \"unary\";\n input: typeof RegisterDeviceKeyRequestSchema;\n output: typeof RegisterDeviceKeyResponseSchema;\n },\n /**\n * 鍵キャッシュ即時失効用の epoch 取得。キャッシュ照合に使う。\n *\n * @generated from rpc fluxlay.v1.WallpaperService.GetKeyEpoch\n */\n getKeyEpoch: {\n methodKind: \"unary\";\n input: typeof GetKeyEpochRequestSchema;\n output: typeof GetKeyEpochResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 8);\n\n","import path from \"node:path\";\n\nimport type { Session } from \"@supabase/supabase-js\";\nimport envPaths from \"env-paths\";\nimport fs from \"fs-extra\";\n\nconst paths = envPaths(\"com.fluxlay.core\", { suffix: \"\" });\n\nexport class AuthStore {\n private static readonly filePath = path.join(paths.data, \"auth.json\");\n\n static async saveSession(session: Session): Promise<void> {\n await fs.ensureDir(paths.data);\n await fs.writeJson(AuthStore.filePath, session, { spaces: 2 });\n await fs.chmod(AuthStore.filePath, 0o600);\n }\n\n static async getSession(): Promise<Session | null> {\n if (!(await fs.pathExists(AuthStore.filePath))) {\n return null;\n }\n try {\n return await fs.readJson(AuthStore.filePath);\n } catch (error) {\n return null;\n }\n }\n\n static async clearSession(): Promise<void> {\n if (await fs.pathExists(AuthStore.filePath)) {\n await fs.remove(AuthStore.filePath);\n }\n }\n\n /**\n * JWT の有効期限を確認し、期限切れなら auth.json を削除して null を返す。\n * 独立セッションのためリフレッシュは行わない(期限切れ時は再ログインが必要)。\n */\n static async getValidSession(): Promise<Session | null> {\n const session = await AuthStore.getSession();\n if (!session) return null;\n\n const payloadBase64 = session.access_token.split(\".\")[1];\n const payload = JSON.parse(Buffer.from(payloadBase64, \"base64\").toString(\"utf8\"));\n if (payload.exp * 1000 < Date.now()) {\n await AuthStore.clearSession();\n return null;\n }\n\n return session;\n }\n}\n","// ビルド時に tsdown の `define` で埋め込まれるデフォルト値。\n// 実行時に同名の環境変数が設定されていればそちらを優先する。\ndeclare const __BUILD_ENV__: {\n FLUXLAY_API_URL: string;\n FLUXLAY_APP_URL: string;\n FLUXLAY_SUPABASE_URL: string;\n FLUXLAY_SUPABASE_KEY: string;\n};\n\nconst pick = (key: keyof typeof __BUILD_ENV__): string => process.env[key] || __BUILD_ENV__[key];\n\nexport const env = {\n API_URL: pick(\"FLUXLAY_API_URL\"),\n APP_URL: pick(\"FLUXLAY_APP_URL\"),\n SUPABASE_URL: pick(\"FLUXLAY_SUPABASE_URL\"),\n SUPABASE_ANON_KEY: pick(\"FLUXLAY_SUPABASE_KEY\")\n};\n","import { createClient } from \"@connectrpc/connect\";\nimport { createConnectTransport } from \"@connectrpc/connect-node\";\n\nimport { AuthService, WallpaperService } from \"@fluxlay/proto/gen/ts/fluxlay/v1/service_pb.ts\";\n\nimport { AuthStore } from \"./AuthStore.ts\";\nimport { env } from \"./env.ts\";\n\nconst API_URL = env.API_URL || \"http://localhost:8080\";\n\n// 認証不要トランスポート(デバイス認証フロー用)\nconst unauthTransport = createConnectTransport({\n baseUrl: API_URL,\n httpVersion: \"1.1\"\n});\n\n// 認証ありトランスポート(壁紙などの API 用)\nconst authedTransport = createConnectTransport({\n baseUrl: API_URL,\n httpVersion: \"1.1\",\n interceptors: [\n next => async req => {\n const session = await AuthStore.getValidSession();\n if (session?.access_token) {\n req.header.set(\"Authorization\", `Bearer ${session.access_token}`);\n }\n return next(req);\n }\n ]\n});\n\nexport const authClient = createClient(AuthService, unauthTransport);\nexport const wallpaperClient = createClient(WallpaperService, authedTransport);\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { build as viteBuild } from \"vite\";\n\nexport type BundleKind = \"web\" | \"video\" | \"image\";\n\nconst VIDEO_EXTENSIONS = new Set([\"mp4\", \"webm\"]);\nconst IMAGE_EXTENSIONS = new Set([\"png\", \"jpg\", \"jpeg\", \"webp\", \"gif\"]);\n\nexport function assertValidKind(kind: unknown): asserts kind is BundleKind {\n if (kind !== \"web\" && kind !== \"video\" && kind !== \"image\") {\n throw new Error(\n `fluxlay.yaml の kind は \"web\" / \"video\" / \"image\" のいずれかが必須です(実際: ${JSON.stringify(kind)})`\n );\n }\n}\n\nfunction assertKindMatchesExtension(kind: BundleKind, mediaPath: string): void {\n const ext = path.extname(mediaPath).slice(1).toLowerCase();\n if (kind === \"video\" && !VIDEO_EXTENSIONS.has(ext)) {\n throw new Error(`kind: video には mp4/webm を指定してください(実際: .${ext})`);\n }\n if (kind === \"image\" && !IMAGE_EXTENSIONS.has(ext)) {\n throw new Error(`kind: image には png/jpg/jpeg/webp/gif を指定してください(実際: .${ext})`);\n }\n}\n\ninterface ManifestLike {\n name: string;\n slug: string;\n version: string;\n source?: string;\n}\n\n/**\n * video / image kind 用にメディアファイル単体を `media.<ext>` として\n * 一時ディレクトリに配置し、fluxlay.yaml も書き出す。\n * 戻り値は packContent に渡すソースディレクトリのパス。\n */\nfunction prepareMediaBundleDir(kind: BundleKind, manifest: ManifestLike, mediaPath: string): string {\n const ext = path.extname(mediaPath).slice(1).toLowerCase();\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"fluxlay-bundle-\"));\n\n fs.copyFileSync(mediaPath, path.join(tempDir, `media.${ext}`));\n\n const yamlBody = [\n `name: ${manifest.name}`,\n `slug: ${manifest.slug}`,\n `version: ${manifest.version}`,\n `kind: ${kind}`\n ].join(\"\\n\");\n fs.writeFileSync(path.join(tempDir, \"fluxlay.yaml\"), yamlBody + \"\\n\");\n\n return tempDir;\n}\n\nexport interface PreparedBundle {\n /** packContent に渡すソースディレクトリ */\n packSrcDir: string;\n /** 後始末で削除すべき一時ディレクトリ(video/image kind の場合のみ) */\n cleanup: () => void;\n}\n\n/**\n * kind に応じたバンドル準備:\n * - web: Vite ビルドを実行し dist/ を返す\n * - video/image: source で指定されたメディアを media.<ext> にして一時ディレクトリを作る\n */\nexport async function prepareBundle(kind: BundleKind, root: string, manifest: ManifestLike): Promise<PreparedBundle> {\n if (kind === \"web\") {\n await viteBuild({\n root,\n configFile: path.resolve(root, \"vite.config.ts\"),\n build: { outDir: \"dist\" },\n logLevel: \"error\"\n });\n return {\n packSrcDir: path.join(root, \"dist\"),\n cleanup: () => {}\n };\n }\n\n if (!manifest.source) {\n throw new Error(`kind: ${kind} では fluxlay.yaml に source を指定してください`);\n }\n const mediaPath = path.isAbsolute(manifest.source) ? manifest.source : path.resolve(root, manifest.source);\n if (!fs.existsSync(mediaPath)) {\n throw new Error(`メディアファイルが見つかりません: ${mediaPath}`);\n }\n assertKindMatchesExtension(kind, mediaPath);\n\n const dir = prepareMediaBundleDir(kind, manifest, mediaPath);\n return {\n packSrcDir: dir,\n cleanup: () => {\n if (fs.existsSync(dir)) fs.rmSync(dir, { recursive: true, force: true });\n }\n };\n}\n","import crypto from \"node:crypto\";\nimport path from \"node:path\";\n\nimport envPaths from \"env-paths\";\nimport fs from \"fs-extra\";\n\nconst paths = envPaths(\"com.fluxlay.core\", { suffix: \"\" });\n\nexport interface DeviceKeypair {\n deviceId: string;\n privateRaw: Buffer;\n publicRaw: Buffer;\n}\n\n/**\n * 端末 X25519 鍵ペアを取得(無ければ生成)する。鍵配送 v2 のセッション IKM 導出と\n * RegisterDeviceKey に使う。秘密鍵は config dir に 0600 で永続化する。\n */\nexport class DeviceStore {\n private static readonly filePath = path.join(paths.data, \"device.json\");\n\n static async loadOrCreate(): Promise<DeviceKeypair> {\n if (await fs.pathExists(DeviceStore.filePath)) {\n try {\n const j = await fs.readJson(DeviceStore.filePath);\n return {\n deviceId: j.deviceId,\n privateRaw: Buffer.from(j.privateKey, \"base64\"),\n publicRaw: Buffer.from(j.publicKey, \"base64\")\n };\n } catch {\n // 壊れていたら作り直す\n }\n }\n\n const { privateKey, publicKey } = crypto.generateKeyPairSync(\"x25519\");\n const jwkPriv = privateKey.export({ format: \"jwk\" }) as { d: string };\n const jwkPub = publicKey.export({ format: \"jwk\" }) as { x: string };\n const privateRaw = Buffer.from(jwkPriv.d, \"base64url\");\n const publicRaw = Buffer.from(jwkPub.x, \"base64url\");\n const deviceId = crypto.randomUUID();\n\n await fs.ensureDir(paths.data);\n await fs.writeJson(\n DeviceStore.filePath,\n { deviceId, privateKey: privateRaw.toString(\"base64\"), publicKey: publicRaw.toString(\"base64\") },\n { spaces: 2 }\n );\n await fs.chmod(DeviceStore.filePath, 0o600);\n\n return { deviceId, privateRaw, publicRaw };\n }\n}\n","import crypto from \"node:crypto\";\n\n// HKDF-SHA256 + AES-256-GCM key unwrapping. Mirrors the Rust `crypto::unwrap_key`\n// in `packages/go/crypto` and `apps/fluxlay/core/src/crypto.rs`.\n// Nonce is fixed to 12 zero bytes by design (key is single-use per salt).\nexport function unwrapKey(wrapped: Uint8Array, salt: Uint8Array, ikm: Uint8Array): Uint8Array {\n const kek = crypto.hkdfSync(\"sha256\", ikm, salt, Buffer.from(\"KeyWrapping\"), 32);\n const nonce = Buffer.alloc(12);\n const wrappedBuf = Buffer.from(wrapped);\n // AES-GCM tag is the last 16 bytes\n const tag = wrappedBuf.subarray(wrappedBuf.length - 16);\n const ciphertext = wrappedBuf.subarray(0, wrappedBuf.length - 16);\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", Buffer.from(kek), nonce, { authTagLength: 16 });\n decipher.setAuthTag(tag);\n const out = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return new Uint8Array(out.buffer, out.byteOffset, out.byteLength);\n}\n","import { getDeveloperKey as getNativeDeveloperKey, setDeveloperKey as setNativeDeveloperKey } from \"@/lib/native\";\n\nexport class KeyStore {\n // OS キーチェーン (macOS Keychain / Windows Credential Manager) は権限プロンプトの\n // キャンセル・ロック・SSH/CI 環境などで失敗しうる。保存失敗はビルド進行の妨げに\n // しないため、呼び出し側で握れるよう boolean を返す。\n static async saveDeveloperKey(key: Uint8Array): Promise<boolean> {\n try {\n setNativeDeveloperKey(key);\n return true;\n } catch (error) {\n console.error(`[KeyStore] Failed to cache developer key: ${String(error)}`);\n return false;\n }\n }\n\n static async getDeveloperKey(): Promise<Uint8Array | null> {\n try {\n const key = await getNativeDeveloperKey();\n return key || null;\n } catch (error) {\n console.error(`[KeyStore] Error getting developer key: ${String(error)}`);\n return null;\n }\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nconst FLX2_MAGIC = Buffer.from(\"FLX2\");\nconst FLX3_MAGIC = Buffer.from(\"FLX3\");\n\n/** ファイルの先頭 4 バイトの magic を読む(読めなければ null)。 */\nfunction readMagic(file: string): Buffer | null {\n try {\n const fd = fs.openSync(file, \"r\");\n try {\n const buf = Buffer.alloc(4);\n const n = fs.readSync(fd, buf, 0, 4, 0);\n return n === 4 ? buf : null;\n } finally {\n fs.closeSync(fd);\n }\n } catch {\n return null;\n }\n}\n\n/** 指定パスが旧 FLX2 バンドルか。 */\nexport function isLegacyFlx2Bundle(file: string): boolean {\n const magic = readMagic(file);\n return magic !== null && magic.equals(FLX2_MAGIC);\n}\n\n/** 指定パスが FLX3 バンドルか。 */\nexport function isFlx3Bundle(file: string): boolean {\n const magic = readMagic(file);\n return magic !== null && magic.equals(FLX3_MAGIC);\n}\n\n/** ディレクトリ直下に旧 FLX2 の .fluxlay 成果物があるか。 */\nexport function hasLegacyFlx2Bundle(dir: string): boolean {\n let entries: string[];\n try {\n entries = fs.readdirSync(dir);\n } catch {\n return false;\n }\n return entries.filter(e => e.endsWith(\".fluxlay\")).some(e => isLegacyFlx2Bundle(path.join(dir, e)));\n}\n","import crypto from \"node:crypto\";\n\n// 鍵配送 v2(FLX3)のセッション IKM 導出。Rust(`fluxlay_core::crypto`) / Go(`packages/go/crypto`) と一致させる。\n// サーバー公開鍵はピン留めせず、鍵レスポンスの `server_public_key` を使う(ローテーションをサーバー側だけで完結させるため)。\n\nconst SESSION_IKM_LABEL = Buffer.from(\"fluxlay-ikm-v2\");\n\n/** セッション IKM 導出に使う固定 salt(sha256(\"fluxlay-ikm-v2\"))。 */\nexport function sessionIkmSalt(): Buffer {\n return crypto.createHash(\"sha256\").update(SESSION_IKM_LABEL).digest();\n}\n\n/**\n * セッション IKM を導出する。\n * IKM = HKDF-SHA256(salt, ikm = X25519(devicePriv, serverPub) || info, info_label = \"fluxlay-ikm-v2\")\n */\nexport function deriveSessionIKM(\n devicePrivRaw: Uint8Array,\n devicePubRaw: Uint8Array,\n serverPubRaw: Uint8Array,\n salt: Uint8Array,\n info: Uint8Array\n): Buffer {\n const privateKey = crypto.createPrivateKey({\n format: \"jwk\",\n key: {\n kty: \"OKP\",\n crv: \"X25519\",\n d: Buffer.from(devicePrivRaw).toString(\"base64url\"),\n x: Buffer.from(devicePubRaw).toString(\"base64url\")\n }\n });\n const publicKey = crypto.createPublicKey({\n format: \"jwk\",\n key: { kty: \"OKP\", crv: \"X25519\", x: Buffer.from(serverPubRaw).toString(\"base64url\") }\n });\n\n const shared = crypto.diffieHellman({ privateKey, publicKey });\n const ikmInput = Buffer.concat([shared, Buffer.from(info)]);\n return Buffer.from(crypto.hkdfSync(\"sha256\", ikmInput, salt, SESSION_IKM_LABEL, 32));\n}\n\n/** UUID 文字列を 16 バイトに変換する(IKM の info に使う)。 */\nexport function uuidToBytes(uuid: string): Buffer {\n return Buffer.from(uuid.replace(/-/g, \"\"), \"hex\");\n}\n\n/** JWT(検証なし)の payload から sub クレームを取り出す。 */\nexport function jwtSub(token: string): string {\n const payloadBase64 = token.split(\".\")[1];\n if (!payloadBase64) throw new Error(\"malformed JWT\");\n const payload = JSON.parse(Buffer.from(payloadBase64, \"base64\").toString(\"utf8\"));\n if (typeof payload.sub !== \"string\") throw new Error(\"JWT missing sub claim\");\n return payload.sub;\n}\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport yaml from \"js-yaml\";\n\nimport { packContent, validateManifest } from \"@/lib/native\";\n\nimport { wallpaperClient } from \"../lib/api.ts\";\nimport { AuthStore } from \"../lib/AuthStore.ts\";\nimport { type BundleKind, assertValidKind, prepareBundle } from \"../lib/bundle.ts\";\nimport { DeviceStore } from \"../lib/DeviceStore.ts\";\nimport { unwrapKey } from \"../lib/key_wrap.ts\";\nimport { KeyStore } from \"../lib/KeyStore.ts\";\nimport { hasLegacyFlx2Bundle } from \"../lib/legacy_bundle.ts\";\nimport { deriveSessionIKM, jwtSub, sessionIkmSalt, uuidToBytes } from \"../lib/session_crypto.ts\";\n\nexport async function buildCommand(dir: string, options: { output: string }) {\n const session = await AuthStore.getSession();\n if (!session) {\n p.log.error(chalk.red(\"You must be logged in to build. Run `fluxlay login`.\"));\n process.exit(1);\n }\n\n const root = path.resolve(process.cwd(), dir);\n const yamlPath = path.join(root, \"fluxlay.yaml\");\n\n // 旧 FLX2 成果物を検出したら、FLX3 への再 pack を促す(新 app では旧形式は再生不可)。\n if (hasLegacyFlx2Bundle(root)) {\n p.log.warn(\n chalk.yellow(\n \"旧 FLX2 形式の .fluxlay を検出しました。新しい app では再生できないため、`fluxlay rebuild` で FLX3 に作り直してください。\"\n )\n );\n }\n\n if (!fs.existsSync(yamlPath)) {\n p.log.error(chalk.red(\"fluxlay.yaml is required in the project root.\"));\n process.exit(1);\n }\n\n const s = p.spinner();\n\n // バリデーション + マニフェスト解析\n s.start(chalk.yellow(\"Validating manifest...\"));\n let manifest: any;\n try {\n const yamlContent = fs.readFileSync(yamlPath, \"utf-8\");\n validateManifest(yamlContent);\n manifest = yaml.load(yamlContent);\n s.stop(`${chalk.green(\"✔\")} Manifest validated.`);\n } catch (e: any) {\n s.stop(chalk.red(\"Manifest validation failed\"));\n p.log.error(e.message);\n process.exit(1);\n }\n\n assertValidKind(manifest.kind);\n const kind: BundleKind = manifest.kind;\n\n const outputPath = path.resolve(root, options.output);\n let cleanup: (() => void) | null = null;\n\n try {\n s.start(`Preparing ${kind} bundle in ${chalk.cyan(root)}...`);\n const prepared = await prepareBundle(kind, root, manifest);\n cleanup = prepared.cleanup;\n s.stop(`${chalk.green(\"✔\")} ${kind === \"web\" ? \"Component built\" : `${kind} bundle prepared`}.`);\n\n // APIからDeveloperKeyを取得(キャッシュ → API の順)\n s.start(chalk.yellow(\"Fetching developer key...\"));\n let developerKeyHex: string;\n try {\n const cachedKey = await KeyStore.getDeveloperKey();\n if (cachedKey) {\n developerKeyHex = Buffer.from(cachedKey).toString(\"hex\");\n s.stop(`${chalk.green(\"✔\")} Using cached developer key.`);\n } else {\n // 鍵配送 v2: 端末鍵ペアを用意して登録し、protocol_version=2 + device_public_key で取得する。\n // IKM は X25519(devicePriv, serverPub) || user.ID から導出し、wrap を解く。\n const device = await DeviceStore.loadOrCreate();\n await wallpaperClient.registerDeviceKey({\n deviceId: device.deviceId,\n devicePublicKey: device.publicRaw\n });\n\n const userId = jwtSub(session.access_token);\n const salt = crypto.randomBytes(32);\n const { developerKey: wrapped, serverPublicKey } = await wallpaperClient.getDeveloperKey({\n salt,\n protocolVersion: 2,\n devicePublicKey: device.publicRaw\n });\n const ikm = deriveSessionIKM(\n device.privateRaw,\n device.publicRaw,\n serverPublicKey,\n sessionIkmSalt(),\n uuidToBytes(userId)\n );\n const developerKey = unwrapKey(wrapped, salt, ikm);\n developerKeyHex = Buffer.from(developerKey).toString(\"hex\");\n s.stop(`${chalk.green(\"✔\")} Developer key fetched from API.`);\n // OS キーチェーンへの保存失敗はビルドを止めない(次回 API から再取得)\n const saved = await KeyStore.saveDeveloperKey(developerKey);\n if (!saved) {\n p.log.warn(\n chalk.yellow(\n `Could not cache developer key in ${process.platform === \"darwin\" ? \"Keychain\" : \"Credential Manager\"}. Build will continue.`\n )\n );\n }\n }\n } catch (e: any) {\n s.stop(chalk.red(\"Failed to fetch developer key\"));\n p.log.error(`${e.message} (platform: ${process.platform})`);\n throw e;\n }\n\n // パッケージング\n s.start(chalk.yellow(\"Packaging with DRM...\"));\n await packContent(prepared.packSrcDir, outputPath, developerKeyHex, 0, kind);\n s.stop(`${chalk.green(\"✔\")} Packaging completed.`);\n\n p.note(`Output: ${chalk.underline.cyan(outputPath)}`, \"Success!\");\n } catch (e: any) {\n s.stop(chalk.red(\"Build failed\"));\n p.log.error(e.message);\n throw e;\n } finally {\n if (cleanup) cleanup();\n }\n}\n","import fs from \"node:fs\";\nimport net from \"node:net\";\nimport path from \"node:path\";\n\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport envPaths from \"env-paths\";\nimport { createServer, type Plugin } from \"vite\";\n\nimport { validateManifest } from \"@/lib/native\";\n\n/**\n * Fluxlay 開発用プラグイン\n */\nfunction fluxlayDevWallpaper(): Plugin {\n let version = Date.now();\n\n return {\n name: \"fluxlay-dev-server\",\n configureServer(server) {\n server.watcher.on(\"change\", () => {\n version = Date.now();\n });\n\n server.middlewares.use(\"/version\", (req, res) => {\n res.setHeader(\"Content-Type\", \"application/json\");\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.end(JSON.stringify({ version }));\n });\n }\n };\n}\n\nexport async function devCommand(dir: string) {\n const root = path.resolve(process.cwd(), dir);\n const yamlPath = path.join(root, \"fluxlay.yaml\");\n\n if (!fs.existsSync(yamlPath)) {\n p.log.error(chalk.red(\"fluxlay.yaml is required in the project root.\"));\n process.exit(1);\n }\n\n // バリデーション実行\n try {\n const yamlContent = fs.readFileSync(yamlPath, \"utf-8\");\n validateManifest(yamlContent);\n } catch (e: any) {\n p.log.error(`Manifest Validation Error: ${e.message}`);\n process.exit(1);\n }\n\n const port = await findAvailablePort(3000);\n\n const s = p.spinner();\n s.start(chalk.yellow(`Starting server on port ${port}...`));\n\n const server = await createServer({\n root,\n configFile: path.resolve(root, \"vite.config.ts\"),\n plugins: [fluxlayDevWallpaper()],\n server: {\n port,\n strictPort: true,\n cors: true,\n host: \"127.0.0.1\"\n },\n logLevel: \"error\"\n });\n\n await server.listen();\n s.stop(`${chalk.green(\"✔\")} Server started on port ${port}.`);\n\n const devServerUrl = `http://127.0.0.1:${port}`;\n p.log.info(`Wallpaper server running at ${chalk.underline.cyan(devServerUrl)}`);\n\n const appDataDir = envPaths(\"com.fluxlay.core\", { suffix: \"\" }).data;\n const devJsonPath = path.join(appDataDir, \"dev.json\");\n\n const cleanup = () => {\n if (fs.existsSync(devJsonPath)) {\n try {\n fs.unlinkSync(devJsonPath);\n } catch (e) {}\n }\n };\n\n if (!fs.existsSync(appDataDir)) fs.mkdirSync(appDataDir, { recursive: true });\n fs.writeFileSync(devJsonPath, JSON.stringify({ url: devServerUrl, root }, null, 2));\n\n process.on(\"SIGINT\", () => {\n cleanup();\n process.exit();\n });\n process.on(\"SIGTERM\", () => {\n cleanup();\n process.exit();\n });\n process.on(\"exit\", cleanup);\n\n p.note(`Root: ${chalk.gray(root)}\\nWatching for changes...`, \"Dev Server Active\");\n}\n\nasync function findAvailablePort(startPort: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n server.unref();\n server.on(\"error\", (err: any) => {\n if (err.code === \"EADDRINUSE\") {\n resolve(findAvailablePort(startPort + 1));\n } else {\n reject(err);\n }\n });\n server.listen(startPort, () => {\n server.close(() => resolve(startPort));\n });\n });\n}\n","import * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport open from \"open\";\n\nimport type { DeviceSession } from \"@fluxlay/proto/gen/ts/fluxlay/auth/v1/auth_pb.ts\";\nimport { DeviceTokenStatus } from \"@fluxlay/proto/gen/ts/fluxlay/auth/v1/auth_pb.ts\";\n\nimport { authClient } from \"../lib/api.ts\";\nimport { AuthStore } from \"../lib/AuthStore.ts\";\n\nconst POLL_TIMEOUT_MS = 900 * 1000; // 15分\n\nasync function pollDeviceToken(deviceCode: string, intervalSec: number): Promise<DeviceSession | null> {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n await new Promise(resolve => setTimeout(resolve, intervalSec * 1000));\n\n const res = await authClient.pollDeviceToken({ deviceCode });\n\n if (res.status === DeviceTokenStatus.APPROVED && res.session) {\n return res.session;\n }\n if (res.status === DeviceTokenStatus.EXPIRED || res.status === DeviceTokenStatus.DENIED) {\n return null;\n }\n // AUTHORIZATION_PENDING → 続けてポーリング\n }\n\n return null;\n}\n\nexport const loginCommand = async () => {\n const s = p.spinner();\n\n try {\n // 1. デバイスコードを取得\n const { deviceCode, userCode, verificationUri, interval } = await authClient.createDeviceCode({});\n\n // 2. ユーザーに表示してブラウザを開く\n p.log.message(`ブラウザで以下を開いてください: ${chalk.underline.cyan(verificationUri)}`);\n p.log.message(`認証コード: ${chalk.bold.yellow(userCode)}`);\n\n const url = `${verificationUri}?user_code=${encodeURIComponent(userCode)}`;\n await open(url);\n\n // 3. 認証完了を待つ\n s.start(chalk.yellow(\"認証を待っています...\"));\n const session = await pollDeviceToken(deviceCode, interval || 5);\n\n if (!session) {\n s.stop(chalk.red(\"認証がタイムアウトまたはキャンセルされました\"));\n process.exit(1);\n }\n\n // 4. セッションを保存\n await AuthStore.saveSession({\n access_token: session.accessToken,\n refresh_token: session.refreshToken,\n token_type: (session.tokenType || \"bearer\") as \"bearer\",\n expires_at: Number(session.expiresAt),\n expires_in: 3600,\n user: {\n email: session.email,\n id: \"\",\n aud: \"\",\n role: \"\",\n email_confirmed_at: \"\",\n phone: \"\",\n confirmed_at: \"\",\n last_sign_in_at: \"\",\n app_metadata: {},\n user_metadata: {},\n created_at: \"\",\n updated_at: \"\",\n is_anonymous: false\n }\n });\n\n s.stop(`${chalk.green(\"✔\")} ${chalk.cyan(session.email)} としてログインしました`);\n } catch (err) {\n s.stop(chalk.red(\"認証に失敗しました\"));\n p.log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n};\n","import * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\n\nimport { AuthStore } from \"../lib/AuthStore.ts\";\n\nexport const logoutCommand = async () => {\n await AuthStore.clearSession();\n p.log.success(chalk.green(\"Logged out successfully.\"));\n};\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport yaml from \"js-yaml\";\n\nimport { packContent, validateManifest } from \"@/lib/native\";\n\nimport { wallpaperClient } from \"../lib/api.ts\";\nimport { AuthStore } from \"../lib/AuthStore.ts\";\nimport { type BundleKind, assertValidKind, prepareBundle } from \"../lib/bundle.ts\";\n\nexport async function publishCommand(dir: string) {\n const session = await AuthStore.getSession();\n if (!session) {\n p.log.error(chalk.red(\"You must be logged in to publish. Run `fluxlay login`.\"));\n process.exit(1);\n }\n\n const root = path.resolve(process.cwd(), dir);\n const yamlPath = path.join(root, \"fluxlay.yaml\");\n\n if (!fs.existsSync(yamlPath)) {\n p.log.error(chalk.red(\"fluxlay.yaml is required in the project root.\"));\n process.exit(1);\n }\n\n const s = p.spinner();\n\n // 1. Parse manifest\n s.start(chalk.yellow(\"Validating manifest...\"));\n let manifest: any;\n try {\n const yamlContent = fs.readFileSync(yamlPath, \"utf-8\");\n validateManifest(yamlContent);\n manifest = yaml.load(yamlContent);\n s.stop(`${chalk.green(\"✔\")} Manifest validated: ${chalk.cyan(manifest.name)} (v${manifest.version})`);\n } catch (e: any) {\n s.stop(chalk.red(\"Manifest validation failed\"));\n p.log.error(e.message);\n process.exit(1);\n }\n\n // 2. Generate random Content Key (CK)\n const contentKey = crypto.randomBytes(32);\n const contentKeyHex = contentKey.toString(\"hex\");\n\n // 3. Register with API and get upload URL\n s.start(chalk.yellow(\"Registering wallpaper with API...\"));\n let wallpaperId: string;\n let versionId: string;\n let uploadUrl: string;\n try {\n const res = await wallpaperClient.registerWallpaper({\n slug: manifest.slug,\n name: manifest.name,\n version: manifest.version,\n contentKey: contentKey,\n // fluxlay.yaml の network[] を公開メタデータとして送信(詳細ページで表示)\n network: (manifest.network ?? []).map((n: { origin: string; reason: string }) => ({\n origin: n.origin,\n reason: n.reason\n }))\n });\n wallpaperId = res.wallpaperId;\n versionId = res.versionId;\n uploadUrl = res.uploadUrl;\n s.stop(`${chalk.green(\"✔\")} Wallpaper registered.`);\n } catch (e: any) {\n s.stop(chalk.red(\"Registration failed\"));\n p.log.error(e.message);\n process.exit(1);\n }\n\n // 4. Build archive\n // kind は fluxlay.yaml で必須。CLI フラグでの上書きはしない。\n assertValidKind(manifest.kind);\n const kind: BundleKind = manifest.kind;\n const tempArchive = path.join(root, `.fluxlay-${versionId}.tmp`);\n let cleanupBundle: (() => void) | null = null;\n\n try {\n s.start(chalk.yellow(kind === \"web\" ? \"Building component with Vite...\" : `Preparing ${kind} bundle...`));\n const prepared = await prepareBundle(kind, root, manifest);\n cleanupBundle = prepared.cleanup;\n s.stop(`${chalk.green(\"✔\")} ${kind === \"web\" ? \"Component built\" : `${kind} bundle prepared`}.`);\n\n s.start(chalk.yellow(\"Packaging with Content Key...\"));\n await packContent(prepared.packSrcDir, tempArchive, contentKeyHex, 1, kind);\n s.stop(`${chalk.green(\"✔\")} Package created.`);\n\n // 5. Upload to R2\n s.start(chalk.yellow(\"Uploading to storage...\"));\n const fileBuffer = fs.readFileSync(tempArchive);\n const uploadRes = await fetch(uploadUrl, {\n method: \"PUT\",\n body: fileBuffer,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n // API の署名付き URL に含まれる Cache-Control と一致させる必要がある。\n \"Cache-Control\": \"public, max-age=31536000, immutable\"\n }\n });\n\n if (!uploadRes.ok) {\n throw new Error(`Upload failed: ${uploadRes.statusText}`);\n }\n s.stop(`${chalk.green(\"✔\")} Upload completed.`);\n\n // 6. Confirm upload\n s.start(chalk.yellow(\"Confirming upload with API...\"));\n await wallpaperClient.confirmUpload({ versionId });\n s.stop(`${chalk.green(\"✔\")} Upload confirmed.`);\n\n // 7. メタデータ更新(description がある場合)\n if (manifest.description) {\n s.start(chalk.yellow(\"Updating metadata...\"));\n try {\n await wallpaperClient.updateWallpaperMetadata({\n id: wallpaperId,\n name: manifest.name,\n description: manifest.description\n });\n s.stop(`${chalk.green(\"✔\")} Metadata updated.`);\n } catch (e: any) {\n s.stop(chalk.yellow(\"⚠ メタデータの更新に失敗(壁紙のアップロードは成功)\"));\n p.log.warn(e.message);\n }\n }\n\n p.note(`Wallpaper ID: ${chalk.cyan(versionId)}`, \"Success!\");\n } catch (e: any) {\n s.stop(chalk.red(\"Publishing process failed\"));\n p.log.error(e.message);\n\n p.log.warn(chalk.yellow(\"Cancelling upload...\"));\n try {\n await wallpaperClient.cancelUpload({ versionId });\n } catch (cancelErr: any) {\n p.log.error(`Failed to cancel upload: ${cancelErr.message}`);\n }\n throw e;\n } finally {\n if (fs.existsSync(tempArchive)) {\n fs.unlinkSync(tempArchive);\n }\n if (cleanupBundle) cleanupBundle();\n }\n}\n","import * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\n\nimport { buildCommand } from \"./build.ts\";\n\n/**\n * 既存のプレビュー資産をソースから FLX3 で作り直す。\n *\n * 旧 FLX2 バンドルは新 app/CLI では読めないため、互換変換ではなくソースから\n * 再 pack する。鍵は OS キーチェーン(または API 再取得)で解決されるため\n * クリエイターの追加操作は不要。\n */\nexport async function rebuildCommand(dir: string, options: { output: string }) {\n p.log.info(chalk.cyan(\"Rebuilding preview asset in FLX3 format...\"));\n await buildCommand(dir, options);\n}\n","import { createClient } from \"@supabase/supabase-js\";\n\nimport { AuthStore } from \"./AuthStore.ts\";\nimport { env } from \"./env.ts\";\n\nconst SUPABASE_URL = env.SUPABASE_URL || \"https://your-project.supabase.co\";\nconst SUPABASE_ANON_KEY = env.SUPABASE_ANON_KEY || \"your-anon-key\";\n\nexport const getSupabaseClient = async () => {\n const session = await AuthStore.getValidSession();\n\n const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {\n auth: {\n persistSession: false,\n autoRefreshToken: false, // 独立セッションのためリフレッシュ無効\n detectSessionInUrl: false\n }\n });\n\n if (session) {\n const { error } = await supabase.auth.setSession({\n access_token: session.access_token,\n refresh_token: session.refresh_token\n });\n if (error) {\n console.error(\"[Fluxlay] Error setting session:\", error.message);\n }\n }\n\n return supabase;\n};\n","import * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\n\nimport { getSupabaseClient } from \"../lib/supabase.ts\";\n\nexport const whoamiCommand = async () => {\n const supabase = await getSupabaseClient();\n const {\n data: { user },\n error\n } = await supabase.auth.getUser();\n\n if (error || !user) {\n if (error) {\n p.log.error(`Auth error: ${error.message}`);\n }\n p.log.warn(\"Not logged in.\");\n return;\n }\n\n p.log.info(`Logged in as: ${chalk.green(user.email ?? \"unknown\")}`);\n};\n","import os from \"node:os\";\n\nimport * as Sentry from \"@sentry/node\";\n\n// __CLI_VERSION__ は tsdown.config.ts の define でビルド時に埋め込まれる。\n// dev (vitest 等) では未定義になるので fallback を用意する。\ndeclare const __CLI_VERSION__: string | undefined;\nconst CLI_VERSION = typeof __CLI_VERSION__ === \"string\" ? __CLI_VERSION__ : \"0.0.0-dev\";\n\nconst SENTRY_DSN = \"https://6889e8a4b3ba33afde93a276b7c288ad@o4511289442566144.ingest.us.sentry.io/4511440417652736\";\n\nlet initialized = false;\n\n// テレメトリ無効化フラグ(CI / プライバシー配慮で opt-out できるようにする)\n// - FLUXLAY_TELEMETRY: 「テレメトリ有効」フラグ。\"0\" / \"false\" で opt-out\n// - DO_NOT_TRACK: 業界慣習の「追跡しない」フラグ。\"1\" / \"true\" で opt-out\nfunction isTelemetryDisabled(): boolean {\n const fluxlay = process.env.FLUXLAY_TELEMETRY;\n if (fluxlay && (fluxlay === \"0\" || fluxlay.toLowerCase() === \"false\")) {\n return true;\n }\n const dnt = process.env.DO_NOT_TRACK;\n if (dnt && (dnt === \"1\" || dnt.toLowerCase() === \"true\")) {\n return true;\n }\n return false;\n}\n\nexport function initSentry(): void {\n if (initialized || isTelemetryDisabled()) return;\n\n Sentry.init({\n dsn: SENTRY_DSN,\n release: `fluxlay-cli@${CLI_VERSION}`,\n environment: process.env.NODE_ENV ?? \"production\",\n // ヘッドレス CLI ではトレーシング不要。エラー報告のみに絞る。\n tracesSampleRate: 0,\n // hostname など PII を載せない\n serverName: \"\"\n });\n\n Sentry.setTags({\n \"cli.version\": CLI_VERSION,\n \"os.platform\": process.platform,\n \"os.release\": os.release(),\n \"node.version\": process.version\n });\n\n initialized = true;\n}\n\nexport async function captureError(error: unknown, context?: { command?: string }): Promise<void> {\n if (!initialized) return;\n if (context?.command) {\n Sentry.setTag(\"cli.command\", context.command);\n }\n Sentry.captureException(error);\n // CLI はすぐ exit するので、明示的に flush して送信を完了させる\n await Sentry.flush(2000).catch(() => {});\n}\n","import \"dotenv/config\";\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { buildCommand } from \"./commands/build.ts\";\nimport { devCommand } from \"./commands/dev.ts\";\nimport { loginCommand } from \"./commands/login.ts\";\nimport { logoutCommand } from \"./commands/logout.ts\";\nimport { publishCommand } from \"./commands/publish.ts\";\nimport { rebuildCommand } from \"./commands/rebuild.ts\";\nimport { whoamiCommand } from \"./commands/whoami.ts\";\nimport { captureError, initSentry } from \"./lib/sentry.ts\";\n\ninitSentry();\n\nasync function reportAndExit(error: unknown, command: string, label: string): Promise<never> {\n await captureError(error, { command });\n p.cancel(chalk.red(`${label}: ${String(error)}`));\n process.exit(1);\n}\n\nconst program = new Command();\n\nprogram.name(\"fluxlay\").description(\"Fluxlay CLI for building and managing wallpapers\").version(\"0.1.0\");\n\nprogram\n .command(\"login\")\n .description(\"Login to Supabase\")\n .action(async () => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await loginCommand();\n p.outro(chalk.green(\"Login process completed.\"));\n } catch (error) {\n await reportAndExit(error, \"login\", \"Login failed\");\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Logout from Supabase\")\n .action(async () => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await logoutCommand();\n p.outro(chalk.green(\"Logged out successfully.\"));\n } catch (error) {\n await reportAndExit(error, \"logout\", \"Logout failed\");\n }\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show current logged in user\")\n .action(async () => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await whoamiCommand();\n p.outro(chalk.green(\"Done.\"));\n } catch (error) {\n await reportAndExit(error, \"whoami\", \"Failed to get user info\");\n }\n });\n\nprogram\n .command(\"build\")\n .description(\"Build a Fluxlay wallpaper\")\n .argument(\"[dir]\", \"Directory to build\", \".\")\n .option(\"-o, --output <name>\", \"Output filename\", \"wallpaper.fluxlay\")\n .action(async (dir, options) => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await buildCommand(dir, options);\n p.outro(chalk.green(\"Build completed.\"));\n } catch (error) {\n await reportAndExit(error, \"build\", \"Build failed\");\n }\n });\n\nprogram\n .command(\"rebuild\")\n .description(\"Rebuild a preview asset in the FLX3 format (re-pack from source)\")\n .argument(\"[dir]\", \"Directory to rebuild\", \".\")\n .option(\"-o, --output <name>\", \"Output filename\", \"wallpaper.fluxlay\")\n .action(async (dir, options) => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await rebuildCommand(dir, options);\n p.outro(chalk.green(\"Rebuild completed.\"));\n } catch (error) {\n await reportAndExit(error, \"rebuild\", \"Rebuild failed\");\n }\n });\n\nprogram\n .command(\"publish\")\n .description(\"Publish a Fluxlay wallpaper to the store\")\n .argument(\"[dir]\", \"Directory to publish\", \".\")\n .action(async dir => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await publishCommand(dir);\n p.outro(chalk.green(\"Published successfully.\"));\n } catch (error) {\n await reportAndExit(error, \"publish\", \"Publish failed\");\n }\n });\n\nprogram\n .command(\"dev\")\n .description(\"Start development server for a Fluxlay wallpaper\")\n .argument(\"[dir]\", \"Directory to watch\", \".\")\n .action(async dir => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await devCommand(dir);\n } catch (error) {\n await reportAndExit(error, \"dev\", \"Dev server failed\");\n }\n });\n\nprogram.parse();\n"],"names":["paths","fs","viteBuild","fs","getNativeDeveloperKey","createClient"],"mappings":";;;m5BAIA,MAAM,EAAU,EAAc,OAAO,KAAK,GAAG,EACvC,GAAY,EAAK,QAAQ,EAAc,OAAO,KAAK,GAAG,CAAC,EAQhD,CACX,mBACA,kBACA,mBACA,cACA,iBACA,iBACA,kBAXe,QAAQ,IAAI,kBAAoB,IAAA,EAAM,eAAA,EAAA,EAAkB,EAAK,QAAQ,GAAW,mBAAmB,CAAA,ECEvG,EACX,EAAS,ocAAoc,ECDlc,EACX,EAAS,gxCAAgxC,ECD9wC,GACX,EAAS,yiBAAyiB,EC4CviB,EACX,EAAS,6guEAA8guE,CAAC,EAAiC,EAA+B,EAAiC,CAA8B,CAAC,EC7C7ouE,GACX,EAAS,6jCAA8jC,CAAC,CAA0B,CAAC,ECCxlC,GACX,EAAS,6rCAA8rC,CAAC,EAA4B,CAA8B,CAAC,ECJxvC,GACX,EAAS,4gBAA4gB,ECD1gB,GACX,EAAS,q3BAAq3B,ECDn3B,EACX,EAAS,6nBAA6nB,EGgB3nB,EACX,EAAS,2lPAA4lP,CAAC,EAA6B,EAA2B,GAAmC,GAAiC,GAA2C,GAA6B,GFZ1yP,EAAS,u5GAAw5G,CAAC,EAA4B,EAAsC,CAA8B,CEYu0I,EDZz0P,EAAS,2oPAA4oP,CAAC,EAA4B,EAAsC,CAA8B,CCY8G,CAAmC,CAAC,EA8F73P,GA0BX,EAAY,EAAyB,CAAC,EA2H3B,GA8MX,EAAY,EAAyB,CAAC,ECxdlCA,EAAQ,EAAS,mBAAoB,CAAE,OAAQ,EAAG,CAAC,EAEzD,IAAa,EAAb,MAAa,CAAU,CACrB,OAAwB,SAAW,EAAK,KAAKA,EAAM,KAAM,WAAW,EAEpE,aAAa,YAAY,EAAiC,CACxD,MAAMC,EAAG,UAAUD,EAAM,IAAI,EAC7B,MAAMC,EAAG,UAAU,EAAU,SAAU,EAAS,CAAE,OAAQ,CAAE,CAAC,EAC7D,MAAMA,EAAG,MAAM,EAAU,SAAU,GAAK,CAC1C,CAEA,aAAa,YAAsC,CACjD,GAAI,CAAE,MAAMA,EAAG,WAAW,EAAU,QAAQ,EAC1C,OAAO,KAET,GAAI,CACF,OAAO,MAAMA,EAAG,SAAS,EAAU,QAAQ,CAC7C,MAAgB,CACd,OAAO,IACT,CACF,CAEA,aAAa,cAA8B,CACrC,MAAMA,EAAG,WAAW,EAAU,QAAQ,GACxC,MAAMA,EAAG,OAAO,EAAU,QAAQ,CAEtC,CAMA,aAAa,iBAA2C,CACtD,IAAM,EAAU,MAAM,EAAU,WAAW,EAC3C,GAAI,CAAC,EAAS,OAAO,KAErB,IAAM,EAAgB,EAAQ,aAAa,MAAM,GAAG,EAAE,GAOtD,OANgB,KAAK,MAAM,OAAO,KAAK,EAAe,QAAQ,EAAE,SAAS,MAAM,CACrE,EAAE,IAAM,IAAO,KAAK,IAAI,GAChC,MAAM,EAAU,aAAa,EACtB,MAGF,CACT,CACF,EC1CA,MAAM,EAAQ,GAA4C,QAAQ,IAAI,IAAA,wNAAsB,GAE/E,EAAM,CACjB,QAAS,EAAK,iBAAiB,EAC/B,QAAS,EAAK,iBAAiB,EAC/B,aAAc,EAAK,sBAAsB,EACzC,kBAAmB,EAAK,sBAAsB,CAChD,ECRM,EAAU,EAAI,SAAW,wBAGzB,EAAkB,EAAuB,CAC7C,QAAS,EACT,YAAa,KACf,CAAC,EAGK,EAAkB,EAAuB,CAC7C,QAAS,EACT,YAAa,MACb,aAAc,CACZ,GAAQ,KAAM,IAAO,CACnB,IAAM,EAAU,MAAM,EAAU,gBAAgB,EAIhD,OAHI,GAAS,cACX,EAAI,OAAO,IAAI,gBAAiB,UAAU,EAAQ,cAAc,EAE3D,EAAK,CAAG,CACjB,CACF,CACF,CAAC,EAEY,EAAa,EAAa,GAAa,CAAe,EACtD,EAAkB,EAAa,GAAkB,CAAe,ECxBvE,GAAmB,IAAI,IAAI,CAAC,MAAO,MAAM,CAAC,EAC1C,GAAmB,IAAI,IAAI,CAAC,MAAO,MAAO,OAAQ,OAAQ,KAAK,CAAC,EAEtE,SAAgB,EAAgB,EAA2C,CACzE,GAAI,IAAS,OAAS,IAAS,SAAW,IAAS,QACjD,MAAU,MACR,kEAAkE,KAAK,UAAU,CAAI,EAAE,EACzF,CAEJ,CAEA,SAAS,GAA2B,EAAkB,EAAyB,CAC7E,IAAM,EAAM,EAAK,QAAQ,CAAS,EAAE,MAAM,CAAC,EAAE,YAAY,EACzD,GAAI,IAAS,SAAW,CAAC,GAAiB,IAAI,CAAG,EAC/C,MAAU,MAAM,0CAA0C,EAAI,EAAE,EAElE,GAAI,IAAS,SAAW,CAAC,GAAiB,IAAI,CAAG,EAC/C,MAAU,MAAM,uDAAuD,EAAI,EAAE,CAEjF,CAcA,SAAS,GAAsB,EAAkB,EAAwB,EAA2B,CAClG,IAAM,EAAM,EAAK,QAAQ,CAAS,EAAE,MAAM,CAAC,EAAE,YAAY,EACnD,EAAU,EAAG,YAAY,EAAK,KAAK,EAAG,OAAO,EAAG,iBAAiB,CAAC,EAExE,EAAG,aAAa,EAAW,EAAK,KAAK,EAAS,SAAS,GAAK,CAAC,EAE7D,IAAM,EAAW,CACf,SAAS,EAAS,OAClB,SAAS,EAAS,OAClB,YAAY,EAAS,UACrB,SAAS,GACX,EAAE,KAAK;CAAI,EAGX,OAFA,EAAG,cAAc,EAAK,KAAK,EAAS,cAAc,EAAG,EAAW;CAAI,EAE7D,CACT,CAcA,eAAsB,EAAc,EAAkB,EAAc,EAAiD,CACnH,GAAI,IAAS,MAOX,OANA,MAAMC,GAAU,CACd,OACA,WAAY,EAAK,QAAQ,EAAM,gBAAgB,EAC/C,MAAO,CAAE,OAAQ,MAAO,EACxB,SAAU,OACZ,CAAC,EACM,CACL,WAAY,EAAK,KAAK,EAAM,MAAM,EAClC,YAAe,CAAC,CAClB,EAGF,GAAI,CAAC,EAAS,OACZ,MAAU,MAAM,SAAS,EAAK,oCAAoC,EAEpE,IAAM,EAAY,EAAK,WAAW,EAAS,MAAM,EAAI,EAAS,OAAS,EAAK,QAAQ,EAAM,EAAS,MAAM,EACzG,GAAI,CAAC,EAAG,WAAW,CAAS,EAC1B,MAAU,MAAM,qBAAqB,GAAW,EAElD,GAA2B,EAAM,CAAS,EAE1C,IAAM,EAAM,GAAsB,EAAM,EAAU,CAAS,EAC3D,MAAO,CACL,WAAY,EACZ,YAAe,CACT,EAAG,WAAW,CAAG,GAAG,EAAG,OAAO,EAAK,CAAE,UAAW,GAAM,MAAO,EAAK,CAAC,CACzE,CACF,CACF,CC9FA,MAAM,EAAQ,EAAS,mBAAoB,CAAE,OAAQ,EAAG,CAAC,EAYzD,IAAa,GAAb,MAAa,CAAY,CACvB,OAAwB,SAAW,EAAK,KAAK,EAAM,KAAM,aAAa,EAEtE,aAAa,cAAuC,CAClD,GAAI,MAAMC,EAAG,WAAW,EAAY,QAAQ,EAC1C,GAAI,CACF,IAAM,EAAI,MAAMA,EAAG,SAAS,EAAY,QAAQ,EAChD,MAAO,CACL,SAAU,EAAE,SACZ,WAAY,OAAO,KAAK,EAAE,WAAY,QAAQ,EAC9C,UAAW,OAAO,KAAK,EAAE,UAAW,QAAQ,CAC9C,CACF,MAAQ,CAER,CAGF,GAAM,CAAE,aAAY,aAAc,EAAO,oBAAoB,QAAQ,EAC/D,EAAU,EAAW,OAAO,CAAE,OAAQ,KAAM,CAAC,EAC7C,EAAS,EAAU,OAAO,CAAE,OAAQ,KAAM,CAAC,EAC3C,EAAa,OAAO,KAAK,EAAQ,EAAG,WAAW,EAC/C,EAAY,OAAO,KAAK,EAAO,EAAG,WAAW,EAC7C,EAAW,EAAO,WAAW,EAUnC,OARA,MAAMA,EAAG,UAAU,EAAM,IAAI,EAC7B,MAAMA,EAAG,UACP,EAAY,SACZ,CAAE,WAAU,WAAY,EAAW,SAAS,QAAQ,EAAG,UAAW,EAAU,SAAS,QAAQ,CAAE,EAC/F,CAAE,OAAQ,CAAE,CACd,EACA,MAAMA,EAAG,MAAM,EAAY,SAAU,GAAK,EAEnC,CAAE,WAAU,aAAY,WAAU,CAC3C,CACF,EC/CA,SAAgB,GAAU,EAAqB,EAAkB,EAA6B,CAC5F,IAAM,EAAM,EAAO,SAAS,SAAU,EAAK,EAAM,OAAO,KAAK,aAAa,EAAG,EAAE,EACzE,EAAQ,OAAO,MAAM,EAAE,EACvB,EAAa,OAAO,KAAK,CAAO,EAEhC,EAAM,EAAW,SAAS,EAAW,OAAS,EAAE,EAChD,EAAa,EAAW,SAAS,EAAG,EAAW,OAAS,EAAE,EAC1D,EAAW,EAAO,iBAAiB,cAAe,OAAO,KAAK,CAAG,EAAG,EAAO,CAAE,cAAe,EAAG,CAAC,EACtG,EAAS,WAAW,CAAG,EACvB,IAAM,EAAM,OAAO,OAAO,CAAC,EAAS,OAAO,CAAU,EAAG,EAAS,MAAM,CAAC,CAAC,EACzE,OAAO,IAAI,WAAW,EAAI,OAAQ,EAAI,WAAY,EAAI,UAAU,CAClE,CCdA,IAAa,EAAb,KAAsB,CAIpB,aAAa,iBAAiB,EAAmC,CAC/D,GAAI,CAEF,OADA,EAAsB,CAAG,EAClB,EACT,OAAS,EAAO,CAEd,OADA,QAAQ,MAAM,6CAA6C,OAAO,CAAK,GAAG,EACnE,EACT,CACF,CAEA,aAAa,iBAA8C,CACzD,GAAI,CAEF,OAAO,MADWC,GAAsB,GAC1B,IAChB,OAAS,EAAO,CAEd,OADA,QAAQ,MAAM,2CAA2C,OAAO,CAAK,GAAG,EACjE,IACT,CACF,CACF,ECtBA,MAAM,GAAa,OAAO,KAAK,MAAM,EAClB,OAAO,KAAK,MAAM,EAGrC,SAAS,GAAU,EAA6B,CAC9C,GAAI,CACF,IAAM,EAAK,EAAG,SAAS,EAAM,GAAG,EAChC,GAAI,CACF,IAAM,EAAM,OAAO,MAAM,CAAC,EAE1B,OADU,EAAG,SAAS,EAAI,EAAK,EAAG,EAAG,CAC9B,IAAM,EAAI,EAAM,IACzB,QAAU,CACR,EAAG,UAAU,CAAE,CACjB,CACF,MAAQ,CACN,OAAO,IACT,CACF,CAGA,SAAgB,GAAmB,EAAuB,CACxD,IAAM,EAAQ,GAAU,CAAI,EAC5B,OAAO,IAAU,MAAQ,EAAM,OAAO,EAAU,CAClD,CASA,SAAgB,EAAoB,EAAsB,CACxD,IAAI,EACJ,GAAI,CACF,EAAU,EAAG,YAAY,CAAG,CAC9B,MAAQ,CACN,MAAO,EACT,CACA,OAAO,EAAQ,OAAO,GAAK,EAAE,SAAS,UAAU,CAAC,EAAE,KAAK,GAAK,GAAmB,EAAK,KAAK,EAAK,CAAC,CAAC,CAAC,CACpG,CCtCA,MAAM,EAAoB,OAAO,KAAK,gBAAgB,EAGtD,SAAgB,IAAyB,CACvC,OAAO,EAAO,WAAW,QAAQ,EAAE,OAAO,CAAiB,EAAE,OAAO,CACtE,CAMA,SAAgB,GACd,EACA,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAa,EAAO,iBAAiB,CACzC,OAAQ,MACR,IAAK,CACH,IAAK,MACL,IAAK,SACL,EAAG,OAAO,KAAK,CAAa,EAAE,SAAS,WAAW,EAClD,EAAG,OAAO,KAAK,CAAY,EAAE,SAAS,WAAW,CACnD,CACF,CAAC,EACK,EAAY,EAAO,gBAAgB,CACvC,OAAQ,MACR,IAAK,CAAE,IAAK,MAAO,IAAK,SAAU,EAAG,OAAO,KAAK,CAAY,EAAE,SAAS,WAAW,CAAE,CACvF,CAAC,EAEK,EAAS,EAAO,cAAc,CAAE,aAAY,WAAU,CAAC,EACvD,EAAW,OAAO,OAAO,CAAC,EAAQ,OAAO,KAAK,CAAI,CAAC,CAAC,EAC1D,OAAO,OAAO,KAAK,EAAO,SAAS,SAAU,EAAU,EAAM,EAAmB,EAAE,CAAC,CACrF,CAGA,SAAgB,GAAY,EAAsB,CAChD,OAAO,OAAO,KAAK,EAAK,QAAQ,KAAM,EAAE,EAAG,KAAK,CAClD,CAGA,SAAgB,GAAO,EAAuB,CAC5C,IAAM,EAAgB,EAAM,MAAM,GAAG,EAAE,GACvC,GAAI,CAAC,EAAe,MAAU,MAAM,eAAe,EACnD,IAAM,EAAU,KAAK,MAAM,OAAO,KAAK,EAAe,QAAQ,EAAE,SAAS,MAAM,CAAC,EAChF,GAAI,OAAO,EAAQ,KAAQ,SAAU,MAAU,MAAM,uBAAuB,EAC5E,OAAO,EAAQ,GACjB,CCnCA,eAAsB,EAAa,EAAa,EAA6B,CAC3E,IAAM,EAAU,MAAM,EAAU,WAAW,EACtC,IACH,EAAE,IAAI,MAAM,EAAM,IAAI,sDAAsD,CAAC,EAC7E,QAAQ,KAAK,CAAC,GAGhB,IAAM,EAAO,EAAK,QAAQ,QAAQ,IAAI,EAAG,CAAG,EACtC,EAAW,EAAK,KAAK,EAAM,cAAc,EAG3C,EAAoB,CAAI,GAC1B,EAAE,IAAI,KACJ,EAAM,OACJ,qFACF,CACF,EAGG,EAAG,WAAW,CAAQ,IACzB,EAAE,IAAI,MAAM,EAAM,IAAI,+CAA+C,CAAC,EACtE,QAAQ,KAAK,CAAC,GAGhB,IAAM,EAAI,EAAE,QAAQ,EAGpB,EAAE,MAAM,EAAM,OAAO,wBAAwB,CAAC,EAC9C,IAAI,EACJ,GAAI,CACF,IAAM,EAAc,EAAG,aAAa,EAAU,OAAO,EACrD,EAAiB,CAAW,EAC5B,EAAW,EAAK,KAAK,CAAW,EAChC,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,qBAAqB,CAClD,OAAS,EAAQ,CACf,EAAE,KAAK,EAAM,IAAI,4BAA4B,CAAC,EAC9C,EAAE,IAAI,MAAM,EAAE,OAAO,EACrB,QAAQ,KAAK,CAAC,CAChB,CAEA,EAAgB,EAAS,IAAI,EAC7B,IAAM,EAAmB,EAAS,KAE5B,EAAa,EAAK,QAAQ,EAAM,EAAQ,MAAM,EAChD,EAA+B,KAEnC,GAAI,CACF,EAAE,MAAM,aAAa,EAAK,aAAa,EAAM,KAAK,CAAI,EAAE,IAAI,EAC5D,IAAM,EAAW,MAAM,EAAc,EAAM,EAAM,CAAQ,EACzD,EAAU,EAAS,QACnB,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,GAAG,IAAS,MAAQ,kBAAoB,GAAG,EAAK,kBAAkB,EAAE,EAG/F,EAAE,MAAM,EAAM,OAAO,2BAA2B,CAAC,EACjD,IAAI,EACJ,GAAI,CACF,IAAM,EAAY,MAAM,EAAS,gBAAgB,EACjD,GAAI,EACF,EAAkB,OAAO,KAAK,CAAS,EAAE,SAAS,KAAK,EACvD,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,6BAA6B,MACnD,CAGL,IAAM,EAAS,MAAM,GAAY,aAAa,EAC9C,MAAM,EAAgB,kBAAkB,CACtC,SAAU,EAAO,SACjB,gBAAiB,EAAO,SAC1B,CAAC,EAED,IAAM,EAAS,GAAO,EAAQ,YAAY,EACpC,EAAO,EAAO,YAAY,EAAE,EAC5B,CAAE,aAAc,EAAS,mBAAoB,MAAM,EAAgB,gBAAgB,CACvF,OACA,gBAAiB,EACjB,gBAAiB,EAAO,SAC1B,CAAC,EAQK,EAAe,GAAU,EAAS,EAP5B,GACV,EAAO,WACP,EAAO,UACP,EACA,GAAe,EACf,GAAY,CAAM,CAE4B,CAAC,EACjD,EAAkB,OAAO,KAAK,CAAY,EAAE,SAAS,KAAK,EAC1D,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,iCAAiC,EAGvD,MADe,EAAS,iBAAiB,CAAY,GAExD,EAAE,IAAI,KACJ,EAAM,OACJ,oCAAoC,QAAQ,WAAa,SAAW,WAAa,qBAAqB,uBACxG,CACF,CAEJ,CACF,OAAS,EAAQ,CAGf,MAFA,EAAE,KAAK,EAAM,IAAI,+BAA+B,CAAC,EACjD,EAAE,IAAI,MAAM,GAAG,EAAE,QAAQ,cAAc,QAAQ,SAAS,EAAE,EACpD,CACR,CAGA,EAAE,MAAM,EAAM,OAAO,uBAAuB,CAAC,EAC7C,MAAM,EAAY,EAAS,WAAY,EAAY,EAAiB,EAAG,CAAI,EAC3E,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,sBAAsB,EAEjD,EAAE,KAAK,WAAW,EAAM,UAAU,KAAK,CAAU,IAAK,UAAU,CAClE,OAAS,EAAQ,CAGf,MAFA,EAAE,KAAK,EAAM,IAAI,cAAc,CAAC,EAChC,EAAE,IAAI,MAAM,EAAE,OAAO,EACf,CACR,QAAU,CACJ,GAAS,EAAQ,CACvB,CACF,CCxHA,SAAS,IAA8B,CACrC,IAAI,EAAU,KAAK,IAAI,EAEvB,MAAO,CACL,KAAM,qBACN,gBAAgB,EAAQ,CACtB,EAAO,QAAQ,GAAG,aAAgB,CAChC,EAAU,KAAK,IAAI,CACrB,CAAC,EAED,EAAO,YAAY,IAAI,YAAa,EAAK,IAAQ,CAC/C,EAAI,UAAU,eAAgB,kBAAkB,EAChD,EAAI,UAAU,8BAA+B,GAAG,EAChD,EAAI,IAAI,KAAK,UAAU,CAAE,SAAQ,CAAC,CAAC,CACrC,CAAC,CACH,CACF,CACF,CAEA,eAAsB,GAAW,EAAa,CAC5C,IAAM,EAAO,EAAK,QAAQ,QAAQ,IAAI,EAAG,CAAG,EACtC,EAAW,EAAK,KAAK,EAAM,cAAc,EAE1C,EAAG,WAAW,CAAQ,IACzB,EAAE,IAAI,MAAM,EAAM,IAAI,+CAA+C,CAAC,EACtE,QAAQ,KAAK,CAAC,GAIhB,GAAI,CAEF,EADoB,EAAG,aAAa,EAAU,OACnB,CAAC,CAC9B,OAAS,EAAQ,CACf,EAAE,IAAI,MAAM,8BAA8B,EAAE,SAAS,EACrD,QAAQ,KAAK,CAAC,CAChB,CAEA,IAAM,EAAO,MAAM,EAAkB,GAAI,EAEnC,EAAI,EAAE,QAAQ,EACpB,EAAE,MAAM,EAAM,OAAO,2BAA2B,EAAK,IAAI,CAAC,EAe1D,MAAM,MAbe,GAAa,CAChC,OACA,WAAY,EAAK,QAAQ,EAAM,gBAAgB,EAC/C,QAAS,CAAC,GAAoB,CAAC,EAC/B,OAAQ,CACN,OACA,WAAY,GACZ,KAAM,GACN,KAAM,WACR,EACA,SAAU,OACZ,CAAC,GAEY,OAAO,EACpB,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,0BAA0B,EAAK,EAAE,EAE5D,IAAM,EAAe,oBAAoB,IACzC,EAAE,IAAI,KAAK,+BAA+B,EAAM,UAAU,KAAK,CAAY,GAAG,EAE9E,IAAM,EAAa,EAAS,mBAAoB,CAAE,OAAQ,EAAG,CAAC,EAAE,KAC1D,EAAc,EAAK,KAAK,EAAY,UAAU,EAE9C,MAAgB,CACpB,GAAI,EAAG,WAAW,CAAW,EAC3B,GAAI,CACF,EAAG,WAAW,CAAW,CAC3B,MAAY,CAAC,CAEjB,EAEK,EAAG,WAAW,CAAU,GAAG,EAAG,UAAU,EAAY,CAAE,UAAW,EAAK,CAAC,EAC5E,EAAG,cAAc,EAAa,KAAK,UAAU,CAAE,IAAK,EAAc,MAAK,EAAG,KAAM,CAAC,CAAC,EAElF,QAAQ,GAAG,aAAgB,CACzB,EAAQ,EACR,QAAQ,KAAK,CACf,CAAC,EACD,QAAQ,GAAG,cAAiB,CAC1B,EAAQ,EACR,QAAQ,KAAK,CACf,CAAC,EACD,QAAQ,GAAG,OAAQ,CAAO,EAE1B,EAAE,KAAK,SAAS,EAAM,KAAK,CAAI,EAAE,2BAA4B,mBAAmB,CAClF,CAEA,eAAe,EAAkB,EAAoC,CACnE,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,IAAM,EAAS,EAAI,aAAa,EAChC,EAAO,MAAM,EACb,EAAO,GAAG,QAAU,GAAa,CAC3B,EAAI,OAAS,aACf,EAAQ,EAAkB,EAAY,CAAC,CAAC,EAExC,EAAO,CAAG,CAEd,CAAC,EACD,EAAO,OAAO,MAAiB,CAC7B,EAAO,UAAY,EAAQ,CAAS,CAAC,CACvC,CAAC,CACH,CAAC,CACH,CCzGA,eAAe,GAAgB,EAAoB,EAAoD,CACrG,IAAM,EAAW,KAAK,IAAI,EAAI,IAE9B,KAAO,KAAK,IAAI,EAAI,GAAU,CAC5B,MAAM,IAAI,QAAQ,GAAW,WAAW,EAAS,EAAc,GAAI,CAAC,EAEpE,IAAM,EAAM,MAAM,EAAW,gBAAgB,CAAE,YAAW,CAAC,EAE3D,GAAI,EAAI,SAAA,GAAyC,EAAI,QACnD,OAAO,EAAI,QAEb,GAAI,EAAI,SAAA,GAAwC,EAAI,SAAA,EAClD,OAAO,IAGX,CAEA,OAAO,IACT,CAEA,MAAa,GAAe,SAAY,CACtC,IAAM,EAAI,EAAE,QAAQ,EAEpB,GAAI,CAEF,GAAM,CAAE,aAAY,WAAU,kBAAiB,YAAa,MAAM,EAAW,iBAAiB,CAAC,CAAC,EAGhG,EAAE,IAAI,QAAQ,oBAAoB,EAAM,UAAU,KAAK,CAAe,GAAG,EACzE,EAAE,IAAI,QAAQ,UAAU,EAAM,KAAK,OAAO,CAAQ,GAAG,EAGrD,MAAM,EAAK,GADI,EAAgB,aAAa,mBAAmB,CAAQ,GACzD,EAGd,EAAE,MAAM,EAAM,OAAO,cAAc,CAAC,EACpC,IAAM,EAAU,MAAM,GAAgB,EAAY,GAAY,CAAC,EAE1D,IACH,EAAE,KAAK,EAAM,IAAI,wBAAwB,CAAC,EAC1C,QAAQ,KAAK,CAAC,GAIhB,MAAM,EAAU,YAAY,CAC1B,aAAc,EAAQ,YACtB,cAAe,EAAQ,aACvB,WAAa,EAAQ,WAAa,SAClC,WAAY,OAAO,EAAQ,SAAS,EACpC,WAAY,KACZ,KAAM,CACJ,MAAO,EAAQ,MACf,GAAI,GACJ,IAAK,GACL,KAAM,GACN,mBAAoB,GACpB,MAAO,GACP,aAAc,GACd,gBAAiB,GACjB,aAAc,CAAC,EACf,cAAe,CAAC,EAChB,WAAY,GACZ,WAAY,GACZ,aAAc,EAChB,CACF,CAAC,EAED,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,GAAG,EAAM,KAAK,EAAQ,KAAK,EAAE,aAAa,CACvE,OAAS,EAAK,CACZ,EAAE,KAAK,EAAM,IAAI,WAAW,CAAC,EAC7B,EAAE,IAAI,MAAM,aAAe,MAAQ,EAAI,QAAU,OAAO,CAAG,CAAC,EAC5D,QAAQ,KAAK,CAAC,CAChB,CACF,EChFa,GAAgB,SAAY,CACvC,MAAM,EAAU,aAAa,EAC7B,EAAE,IAAI,QAAQ,EAAM,MAAM,0BAA0B,CAAC,CACvD,ECMA,eAAsB,GAAe,EAAa,CAE3C,MADiB,EAAU,WAAW,IAEzC,EAAE,IAAI,MAAM,EAAM,IAAI,wDAAwD,CAAC,EAC/E,QAAQ,KAAK,CAAC,GAGhB,IAAM,EAAO,EAAK,QAAQ,QAAQ,IAAI,EAAG,CAAG,EACtC,EAAW,EAAK,KAAK,EAAM,cAAc,EAE1C,EAAG,WAAW,CAAQ,IACzB,EAAE,IAAI,MAAM,EAAM,IAAI,+CAA+C,CAAC,EACtE,QAAQ,KAAK,CAAC,GAGhB,IAAM,EAAI,EAAE,QAAQ,EAGpB,EAAE,MAAM,EAAM,OAAO,wBAAwB,CAAC,EAC9C,IAAI,EACJ,GAAI,CACF,IAAM,EAAc,EAAG,aAAa,EAAU,OAAO,EACrD,EAAiB,CAAW,EAC5B,EAAW,EAAK,KAAK,CAAW,EAChC,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,uBAAuB,EAAM,KAAK,EAAS,IAAI,EAAE,KAAK,EAAS,QAAQ,EAAE,CACtG,OAAS,EAAQ,CACf,EAAE,KAAK,EAAM,IAAI,4BAA4B,CAAC,EAC9C,EAAE,IAAI,MAAM,EAAE,OAAO,EACrB,QAAQ,KAAK,CAAC,CAChB,CAGA,IAAM,EAAa,EAAO,YAAY,EAAE,EAClC,EAAgB,EAAW,SAAS,KAAK,EAG/C,EAAE,MAAM,EAAM,OAAO,mCAAmC,CAAC,EACzD,IAAI,EACA,EACA,EACJ,GAAI,CACF,IAAM,EAAM,MAAM,EAAgB,kBAAkB,CAClD,KAAM,EAAS,KACf,KAAM,EAAS,KACf,QAAS,EAAS,QACN,aAEZ,SAAU,EAAS,SAAW,CAAC,GAAG,IAAK,IAA2C,CAChF,OAAQ,EAAE,OACV,OAAQ,EAAE,MACZ,EAAE,CACJ,CAAC,EACD,EAAc,EAAI,YAClB,EAAY,EAAI,UAChB,EAAY,EAAI,UAChB,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,uBAAuB,CACpD,OAAS,EAAQ,CACf,EAAE,KAAK,EAAM,IAAI,qBAAqB,CAAC,EACvC,EAAE,IAAI,MAAM,EAAE,OAAO,EACrB,QAAQ,KAAK,CAAC,CAChB,CAIA,EAAgB,EAAS,IAAI,EAC7B,IAAM,EAAmB,EAAS,KAC5B,EAAc,EAAK,KAAK,EAAM,YAAY,EAAU,KAAK,EAC3D,EAAqC,KAEzC,GAAI,CACF,EAAE,MAAM,EAAM,OAAO,IAAS,MAAQ,kCAAoC,aAAa,EAAK,WAAW,CAAC,EACxG,IAAM,EAAW,MAAM,EAAc,EAAM,EAAM,CAAQ,EACzD,EAAgB,EAAS,QACzB,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,GAAG,IAAS,MAAQ,kBAAoB,GAAG,EAAK,kBAAkB,EAAE,EAE/F,EAAE,MAAM,EAAM,OAAO,+BAA+B,CAAC,EACrD,MAAM,EAAY,EAAS,WAAY,EAAa,EAAe,EAAG,CAAI,EAC1E,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,kBAAkB,EAG7C,EAAE,MAAM,EAAM,OAAO,yBAAyB,CAAC,EAC/C,IAAM,EAAa,EAAG,aAAa,CAAW,EACxC,EAAY,MAAM,MAAM,EAAW,CACvC,OAAQ,MACR,KAAM,EACN,QAAS,CACP,eAAgB,2BAEhB,gBAAiB,qCACnB,CACF,CAAC,EAED,GAAI,CAAC,EAAU,GACb,MAAU,MAAM,kBAAkB,EAAU,YAAY,EAU1D,GARA,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,mBAAmB,EAG9C,EAAE,MAAM,EAAM,OAAO,+BAA+B,CAAC,EACrD,MAAM,EAAgB,cAAc,CAAE,WAAU,CAAC,EACjD,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,mBAAmB,EAG1C,EAAS,YAAa,CACxB,EAAE,MAAM,EAAM,OAAO,sBAAsB,CAAC,EAC5C,GAAI,CACF,MAAM,EAAgB,wBAAwB,CAC5C,GAAI,EACJ,KAAM,EAAS,KACf,YAAa,EAAS,WACxB,CAAC,EACD,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,mBAAmB,CAChD,OAAS,EAAQ,CACf,EAAE,KAAK,EAAM,OAAO,6BAA6B,CAAC,EAClD,EAAE,IAAI,KAAK,EAAE,OAAO,CACtB,CACF,CAEA,EAAE,KAAK,iBAAiB,EAAM,KAAK,CAAS,IAAK,UAAU,CAC7D,OAAS,EAAQ,CACf,EAAE,KAAK,EAAM,IAAI,2BAA2B,CAAC,EAC7C,EAAE,IAAI,MAAM,EAAE,OAAO,EAErB,EAAE,IAAI,KAAK,EAAM,OAAO,sBAAsB,CAAC,EAC/C,GAAI,CACF,MAAM,EAAgB,aAAa,CAAE,WAAU,CAAC,CAClD,OAAS,EAAgB,CACvB,EAAE,IAAI,MAAM,4BAA4B,EAAU,SAAS,CAC7D,CACA,MAAM,CACR,QAAU,CACJ,EAAG,WAAW,CAAW,GAC3B,EAAG,WAAW,CAAW,EAEvB,GAAe,EAAc,CACnC,CACF,CC1IA,eAAsB,GAAe,EAAa,EAA6B,CAC7E,EAAE,IAAI,KAAK,EAAM,KAAK,4CAA4C,CAAC,EACnE,MAAM,EAAa,EAAK,CAAO,CACjC,CCVA,MAAM,GAAe,EAAI,cAAgB,mCACnC,GAAoB,EAAI,mBAAqB,gBAEtC,GAAoB,SAAY,CAC3C,IAAM,EAAU,MAAM,EAAU,gBAAgB,EAE1C,EAAWC,EAAa,GAAc,GAAmB,CAC7D,KAAM,CACJ,eAAgB,GAChB,iBAAkB,GAClB,mBAAoB,EACtB,CACF,CAAC,EAED,GAAI,EAAS,CACX,GAAM,CAAE,SAAU,MAAM,EAAS,KAAK,WAAW,CAC/C,aAAc,EAAQ,aACtB,cAAe,EAAQ,aACzB,CAAC,EACG,GACF,QAAQ,MAAM,mCAAoC,EAAM,OAAO,CAEnE,CAEA,OAAO,CACT,ECzBa,GAAgB,SAAY,CAEvC,GAAM,CACJ,KAAM,CAAE,QACR,SACE,MAAM,MAJa,GAAkB,GAItB,KAAK,QAAQ,EAEhC,GAAI,GAAS,CAAC,EAAM,CACd,GACF,EAAE,IAAI,MAAM,eAAe,EAAM,SAAS,EAE5C,EAAE,IAAI,KAAK,gBAAgB,EAC3B,MACF,CAEA,EAAE,IAAI,KAAK,iBAAiB,EAAM,MAAM,EAAK,OAAS,SAAS,GAAG,CACpE,ECdM,EAAA,QAIN,IAAI,EAAc,GAKlB,SAAS,IAA+B,CACtC,IAAM,EAAU,QAAQ,IAAI,kBAC5B,GAAI,IAAY,IAAY,KAAO,EAAQ,YAAY,IAAM,SAC3D,MAAO,GAET,IAAM,EAAM,QAAQ,IAAI,aAIxB,MAHA,GAAI,IAAQ,IAAQ,KAAO,EAAI,YAAY,IAAM,QAInD,CAEA,SAAgB,IAAmB,CAC7B,GAAe,GAAoB,IAEvC,EAAO,KAAK,CACV,IAAK,kGACL,QAAS,eAAe,IACxB,YAAa,QAAQ,IAAI,UAAY,aAErC,iBAAkB,EAElB,WAAY,EACd,CAAC,EAED,EAAO,QAAQ,CACb,cAAe,EACf,cAAe,QAAQ,SACvB,aAAc,EAAG,QAAQ,EACzB,eAAgB,QAAQ,OAC1B,CAAC,EAED,EAAc,GAChB,CAEA,eAAsB,GAAa,EAAgB,EAA+C,CAC3F,IACD,GAAS,SACX,EAAO,OAAO,cAAe,EAAQ,OAAO,EAE9C,EAAO,iBAAiB,CAAK,EAE7B,MAAM,EAAO,MAAM,GAAI,EAAE,UAAY,CAAC,CAAC,EACzC,CC7CA,GAAW,EAEX,eAAe,EAAc,EAAgB,EAAiB,EAA+B,CAC3F,MAAM,GAAa,EAAO,CAAE,SAAQ,CAAC,EACrC,EAAE,OAAO,EAAM,IAAI,GAAG,EAAM,IAAI,OAAO,CAAK,GAAG,CAAC,EAChD,QAAQ,KAAK,CAAC,CAChB,CAEA,MAAM,EAAU,IAAI,EAEpB,EAAQ,KAAK,SAAS,EAAE,YAAY,kDAAkD,EAAE,QAAQ,OAAO,EAEvG,EACG,QAAQ,OAAO,EACf,YAAY,mBAAmB,EAC/B,OAAO,SAAY,CAClB,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAa,EACnB,EAAE,MAAM,EAAM,MAAM,0BAA0B,CAAC,CACjD,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,QAAS,cAAc,CACpD,CACF,CAAC,EAEH,EACG,QAAQ,QAAQ,EAChB,YAAY,sBAAsB,EAClC,OAAO,SAAY,CAClB,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAc,EACpB,EAAE,MAAM,EAAM,MAAM,0BAA0B,CAAC,CACjD,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,SAAU,eAAe,CACtD,CACF,CAAC,EAEH,EACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC,OAAO,SAAY,CAClB,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAc,EACpB,EAAE,MAAM,EAAM,MAAM,OAAO,CAAC,CAC9B,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,SAAU,yBAAyB,CAChE,CACF,CAAC,EAEH,EACG,QAAQ,OAAO,EACf,YAAY,2BAA2B,EACvC,SAAS,QAAS,qBAAsB,GAAG,EAC3C,OAAO,sBAAuB,kBAAmB,mBAAmB,EACpE,OAAO,MAAO,EAAK,IAAY,CAC9B,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,EAAa,EAAK,CAAO,EAC/B,EAAE,MAAM,EAAM,MAAM,kBAAkB,CAAC,CACzC,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,QAAS,cAAc,CACpD,CACF,CAAC,EAEH,EACG,QAAQ,SAAS,EACjB,YAAY,kEAAkE,EAC9E,SAAS,QAAS,uBAAwB,GAAG,EAC7C,OAAO,sBAAuB,kBAAmB,mBAAmB,EACpE,OAAO,MAAO,EAAK,IAAY,CAC9B,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAe,EAAK,CAAO,EACjC,EAAE,MAAM,EAAM,MAAM,oBAAoB,CAAC,CAC3C,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,UAAW,gBAAgB,CACxD,CACF,CAAC,EAEH,EACG,QAAQ,SAAS,EACjB,YAAY,0CAA0C,EACtD,SAAS,QAAS,uBAAwB,GAAG,EAC7C,OAAO,KAAM,IAAO,CACnB,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAe,CAAG,EACxB,EAAE,MAAM,EAAM,MAAM,yBAAyB,CAAC,CAChD,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,UAAW,gBAAgB,CACxD,CACF,CAAC,EAEH,EACG,QAAQ,KAAK,EACb,YAAY,kDAAkD,EAC9D,SAAS,QAAS,qBAAsB,GAAG,EAC3C,OAAO,KAAM,IAAO,CACnB,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAW,CAAG,CACtB,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,MAAO,mBAAmB,CACvD,CACF,CAAC,EAEH,EAAQ,MAAM","debug_id":"5bf61465-e773-5b42-a521-0efe23588e64"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/lib/native.ts","../../proto/gen/ts/fluxlay/admin/v1/admin_pb.ts","../../proto/gen/ts/fluxlay/auth/v1/auth_pb.ts","../../proto/gen/ts/fluxlay/checkout/v1/checkout_pb.ts","../../proto/gen/ts/buf/validate/validate_pb.ts","../../proto/gen/ts/fluxlay/contact/v1/contact_pb.ts","../../proto/gen/ts/fluxlay/moderation/v1/moderation_pb.ts","../../proto/gen/ts/fluxlay/notification/v1/notification_pb.ts","../../proto/gen/ts/fluxlay/stats/v1/stats_pb.ts","../../proto/gen/ts/fluxlay/stripe/v1/stripe_pb.ts","../../proto/gen/ts/fluxlay/common/v1/bucket_object_pb.ts","../../proto/gen/ts/fluxlay/user/v1/user_pb.ts","../../proto/gen/ts/fluxlay/wallpaper/v1/wallpaper_pb.ts","../../proto/gen/ts/fluxlay/v1/service_pb.ts","../src/lib/AuthStore.ts","../src/lib/env.ts","../src/lib/api.ts","../src/lib/bundle.ts","../src/lib/DeviceStore.ts","../src/lib/key_wrap.ts","../src/lib/KeyStore.ts","../src/lib/legacy_bundle.ts","../src/lib/session_crypto.ts","../src/commands/build.ts","../src/commands/dev.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/publish.ts","../src/commands/rebuild.ts","../src/lib/supabase.ts","../src/commands/whoami.ts","../src/lib/sentry.ts","../src/index.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst require = createRequire(import.meta.url);\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// 開発時 (FLUXLAY_CLI_DEV=1) は workspace の @fluxlay/core を使い、\n// ビルド後は copy された native/index.js を使う\nconst corePath = process.env.FLUXLAY_CLI_DEV === \"1\" ? \"@fluxlay/core\" : path.resolve(__dirname, \"./native/index.js\");\n\nconst core = require(corePath);\n\nexport const {\n getDeveloperKey,\n setDeveloperKey,\n validateManifest,\n packContent,\n unpackContent,\n getContentKey,\n setContentKey\n} = core;\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/admin/v1/admin.proto (package fluxlay.admin.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/admin/v1/admin.proto.\n */\nexport const file_fluxlay_admin_v1_admin: GenFile = /*@__PURE__*/\n fileDesc(\"ChxmbHV4bGF5L2FkbWluL3YxL2FkbWluLnByb3RvEhBmbHV4bGF5LmFkbWluLnYxIg8KDVdob2FtaVJlcXVlc3QiPgoOV2hvYW1pUmVzcG9uc2USDwoHdXNlcl9pZBgBIAEoCRINCgVlbWFpbBgCIAEoCRIMCgRraW5kGAMgASgJQsUBChRjb20uZmx1eGxheS5hZG1pbi52MUIKQWRtaW5Qcm90b1ABWj9naXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L2FkbWluL3YxO2FkbWludjGiAgNGQViqAhBGbHV4bGF5LkFkbWluLlYxygIQRmx1eGxheVxBZG1pblxWMeICHEZsdXhsYXlcQWRtaW5cVjFcR1BCTWV0YWRhdGHqAhJGbHV4bGF5OjpBZG1pbjo6VjFiBnByb3RvMw\");\n\n/**\n * @generated from message fluxlay.admin.v1.WhoamiRequest\n */\nexport type WhoamiRequest = Message<\"fluxlay.admin.v1.WhoamiRequest\"> & {\n};\n\nexport type WhoamiRequestValid = WhoamiRequest;\n\n/**\n * Describes the message fluxlay.admin.v1.WhoamiRequest.\n * Use `create(WhoamiRequestSchema)` to create a new message.\n */\nexport const WhoamiRequestSchema: GenMessage<WhoamiRequest, {validType: WhoamiRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_admin_v1_admin, 0);\n\n/**\n * admin 認可基盤の疎通確認用レスポンス。\n * AdminService は admin interceptor(user_kind = internal 必須)を通るため、\n * このレスポンスが返る時点で kind は internal であることが保証される。\n *\n * @generated from message fluxlay.admin.v1.WhoamiResponse\n */\nexport type WhoamiResponse = Message<\"fluxlay.admin.v1.WhoamiResponse\"> & {\n /**\n * @generated from field: string user_id = 1;\n */\n userId: string;\n\n /**\n * @generated from field: string email = 2;\n */\n email: string;\n\n /**\n * ユーザー種別 (organic | internal | test)\n *\n * @generated from field: string kind = 3;\n */\n kind: string;\n};\n\nexport type WhoamiResponseValid = WhoamiResponse;\n\n/**\n * Describes the message fluxlay.admin.v1.WhoamiResponse.\n * Use `create(WhoamiResponseSchema)` to create a new message.\n */\nexport const WhoamiResponseSchema: GenMessage<WhoamiResponse, {validType: WhoamiResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_admin_v1_admin, 1);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/auth/v1/auth.proto (package fluxlay.auth.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 type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/auth/v1/auth.proto.\n */\nexport const file_fluxlay_auth_v1_auth: GenFile = /*@__PURE__*/\n fileDesc(\"ChpmbHV4bGF5L2F1dGgvdjEvYXV0aC5wcm90bxIPZmx1eGxheS5hdXRoLnYxIikKF0NyZWF0ZURldmljZUNvZGVSZXF1ZXN0Eg4KBmNsaWVudBgBIAEoCSKCAQoYQ3JlYXRlRGV2aWNlQ29kZVJlc3BvbnNlEhMKC2RldmljZV9jb2RlGAEgASgJEhEKCXVzZXJfY29kZRgCIAEoCRIYChB2ZXJpZmljYXRpb25fdXJpGAMgASgJEhIKCmV4cGlyZXNfaW4YBCABKAUSEAoIaW50ZXJ2YWwYBSABKAUiLQoWUG9sbERldmljZVRva2VuUmVxdWVzdBITCgtkZXZpY2VfY29kZRgBIAEoCSJzCg1EZXZpY2VTZXNzaW9uEhQKDGFjY2Vzc190b2tlbhgBIAEoCRIVCg1yZWZyZXNoX3Rva2VuGAIgASgJEhIKCnRva2VuX3R5cGUYAyABKAkSEgoKZXhwaXJlc19hdBgEIAEoAxINCgVlbWFpbBgFIAEoCSJ+ChdQb2xsRGV2aWNlVG9rZW5SZXNwb25zZRIyCgZzdGF0dXMYASABKA4yIi5mbHV4bGF5LmF1dGgudjEuRGV2aWNlVG9rZW5TdGF0dXMSLwoHc2Vzc2lvbhgCIAEoCzIeLmZsdXhsYXkuYXV0aC52MS5EZXZpY2VTZXNzaW9uIikKFEFwcHJvdmVEZXZpY2VSZXF1ZXN0EhEKCXVzZXJfY29kZRgBIAEoCSInChVBcHByb3ZlRGV2aWNlUmVzcG9uc2USDgoGY2xpZW50GAEgASgJKsoBChFEZXZpY2VUb2tlblN0YXR1cxIjCh9ERVZJQ0VfVE9LRU5fU1RBVFVTX1VOU1BFQ0lGSUVEEAASLQopREVWSUNFX1RPS0VOX1NUQVRVU19BVVRIT1JJWkFUSU9OX1BFTkRJTkcQARIgChxERVZJQ0VfVE9LRU5fU1RBVFVTX0FQUFJPVkVEEAISHwobREVWSUNFX1RPS0VOX1NUQVRVU19FWFBJUkVEEAMSHgoaREVWSUNFX1RPS0VOX1NUQVRVU19ERU5JRUQQBEK9AQoTY29tLmZsdXhsYXkuYXV0aC52MUIJQXV0aFByb3RvUAFaPWdpdGh1Yi5jb20va2VuMTA5L2ZsdXhsYXktcHJvdG8vZ2VuL2dvL2ZsdXhsYXkvYXV0aC92MTthdXRodjGiAgNGQViqAg9GbHV4bGF5LkF1dGguVjHKAg9GbHV4bGF5XEF1dGhcVjHiAhtGbHV4bGF5XEF1dGhcVjFcR1BCTWV0YWRhdGHqAhFGbHV4bGF5OjpBdXRoOjpWMWIGcHJvdG8z\");\n\n/**\n * @generated from message fluxlay.auth.v1.CreateDeviceCodeRequest\n */\nexport type CreateDeviceCodeRequest = Message<\"fluxlay.auth.v1.CreateDeviceCodeRequest\"> & {\n /**\n * 認証を開始したクライアント種別(\"app\" / \"cli\")。承認後の完了画面の挙動\n * (app は自動でアプリへ戻す等)を出し分けるために使う。未指定でも可。\n *\n * @generated from field: string client = 1;\n */\n client: string;\n};\n\nexport type CreateDeviceCodeRequestValid = CreateDeviceCodeRequest;\n\n/**\n * Describes the message fluxlay.auth.v1.CreateDeviceCodeRequest.\n * Use `create(CreateDeviceCodeRequestSchema)` to create a new message.\n */\nexport const CreateDeviceCodeRequestSchema: GenMessage<CreateDeviceCodeRequest, {validType: CreateDeviceCodeRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 0);\n\n/**\n * @generated from message fluxlay.auth.v1.CreateDeviceCodeResponse\n */\nexport type CreateDeviceCodeResponse = Message<\"fluxlay.auth.v1.CreateDeviceCodeResponse\"> & {\n /**\n * @generated from field: string device_code = 1;\n */\n deviceCode: string;\n\n /**\n * @generated from field: string user_code = 2;\n */\n userCode: string;\n\n /**\n * @generated from field: string verification_uri = 3;\n */\n verificationUri: string;\n\n /**\n * @generated from field: int32 expires_in = 4;\n */\n expiresIn: number;\n\n /**\n * @generated from field: int32 interval = 5;\n */\n interval: number;\n};\n\nexport type CreateDeviceCodeResponseValid = CreateDeviceCodeResponse;\n\n/**\n * Describes the message fluxlay.auth.v1.CreateDeviceCodeResponse.\n * Use `create(CreateDeviceCodeResponseSchema)` to create a new message.\n */\nexport const CreateDeviceCodeResponseSchema: GenMessage<CreateDeviceCodeResponse, {validType: CreateDeviceCodeResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 1);\n\n/**\n * @generated from message fluxlay.auth.v1.PollDeviceTokenRequest\n */\nexport type PollDeviceTokenRequest = Message<\"fluxlay.auth.v1.PollDeviceTokenRequest\"> & {\n /**\n * @generated from field: string device_code = 1;\n */\n deviceCode: string;\n};\n\nexport type PollDeviceTokenRequestValid = PollDeviceTokenRequest;\n\n/**\n * Describes the message fluxlay.auth.v1.PollDeviceTokenRequest.\n * Use `create(PollDeviceTokenRequestSchema)` to create a new message.\n */\nexport const PollDeviceTokenRequestSchema: GenMessage<PollDeviceTokenRequest, {validType: PollDeviceTokenRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 2);\n\n/**\n * @generated from message fluxlay.auth.v1.DeviceSession\n */\nexport type DeviceSession = Message<\"fluxlay.auth.v1.DeviceSession\"> & {\n /**\n * @generated from field: string access_token = 1;\n */\n accessToken: string;\n\n /**\n * @generated from field: string refresh_token = 2;\n */\n refreshToken: string;\n\n /**\n * @generated from field: string token_type = 3;\n */\n tokenType: string;\n\n /**\n * @generated from field: int64 expires_at = 4;\n */\n expiresAt: bigint;\n\n /**\n * @generated from field: string email = 5;\n */\n email: string;\n};\n\nexport type DeviceSessionValid = DeviceSession;\n\n/**\n * Describes the message fluxlay.auth.v1.DeviceSession.\n * Use `create(DeviceSessionSchema)` to create a new message.\n */\nexport const DeviceSessionSchema: GenMessage<DeviceSession, {validType: DeviceSessionValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 3);\n\n/**\n * @generated from message fluxlay.auth.v1.PollDeviceTokenResponse\n */\nexport type PollDeviceTokenResponse = Message<\"fluxlay.auth.v1.PollDeviceTokenResponse\"> & {\n /**\n * @generated from field: fluxlay.auth.v1.DeviceTokenStatus status = 1;\n */\n status: DeviceTokenStatus;\n\n /**\n * @generated from field: fluxlay.auth.v1.DeviceSession session = 2;\n */\n session?: DeviceSession | undefined;\n};\n\nexport type PollDeviceTokenResponseValid = PollDeviceTokenResponse;\n\n/**\n * Describes the message fluxlay.auth.v1.PollDeviceTokenResponse.\n * Use `create(PollDeviceTokenResponseSchema)` to create a new message.\n */\nexport const PollDeviceTokenResponseSchema: GenMessage<PollDeviceTokenResponse, {validType: PollDeviceTokenResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 4);\n\n/**\n * @generated from message fluxlay.auth.v1.ApproveDeviceRequest\n */\nexport type ApproveDeviceRequest = Message<\"fluxlay.auth.v1.ApproveDeviceRequest\"> & {\n /**\n * @generated from field: string user_code = 1;\n */\n userCode: string;\n};\n\nexport type ApproveDeviceRequestValid = ApproveDeviceRequest;\n\n/**\n * Describes the message fluxlay.auth.v1.ApproveDeviceRequest.\n * Use `create(ApproveDeviceRequestSchema)` to create a new message.\n */\nexport const ApproveDeviceRequestSchema: GenMessage<ApproveDeviceRequest, {validType: ApproveDeviceRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 5);\n\n/**\n * @generated from message fluxlay.auth.v1.ApproveDeviceResponse\n */\nexport type ApproveDeviceResponse = Message<\"fluxlay.auth.v1.ApproveDeviceResponse\"> & {\n /**\n * 承認したデバイスコードを開始したクライアント種別(\"app\" / \"cli\")。\n * 完了画面の遷移先・自動でアプリへ戻すかの判定に使う。\n *\n * @generated from field: string client = 1;\n */\n client: string;\n};\n\nexport type ApproveDeviceResponseValid = ApproveDeviceResponse;\n\n/**\n * Describes the message fluxlay.auth.v1.ApproveDeviceResponse.\n * Use `create(ApproveDeviceResponseSchema)` to create a new message.\n */\nexport const ApproveDeviceResponseSchema: GenMessage<ApproveDeviceResponse, {validType: ApproveDeviceResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_auth_v1_auth, 6);\n\n/**\n * @generated from enum fluxlay.auth.v1.DeviceTokenStatus\n */\nexport enum DeviceTokenStatus {\n /**\n * @generated from enum value: DEVICE_TOKEN_STATUS_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: DEVICE_TOKEN_STATUS_AUTHORIZATION_PENDING = 1;\n */\n AUTHORIZATION_PENDING = 1,\n\n /**\n * @generated from enum value: DEVICE_TOKEN_STATUS_APPROVED = 2;\n */\n APPROVED = 2,\n\n /**\n * @generated from enum value: DEVICE_TOKEN_STATUS_EXPIRED = 3;\n */\n EXPIRED = 3,\n\n /**\n * @generated from enum value: DEVICE_TOKEN_STATUS_DENIED = 4;\n */\n DENIED = 4,\n}\n\n/**\n * Describes the enum fluxlay.auth.v1.DeviceTokenStatus.\n */\nexport const DeviceTokenStatusSchema: GenEnum<DeviceTokenStatus> = /*@__PURE__*/\n enumDesc(file_fluxlay_auth_v1_auth, 0);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/checkout/v1/checkout.proto (package fluxlay.checkout.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/checkout/v1/checkout.proto.\n */\nexport const file_fluxlay_checkout_v1_checkout: GenFile = /*@__PURE__*/\n fileDesc(\"CiJmbHV4bGF5L2NoZWNrb3V0L3YxL2NoZWNrb3V0LnByb3RvEhNmbHV4bGF5LmNoZWNrb3V0LnYxIkQKGkNyZWF0ZVBheW1lbnRJbnRlbnRSZXF1ZXN0EhQKDHdhbGxwYXBlcl9pZBgBIAEoCRIQCghjdXJyZW5jeRgCIAEoCSI0ChtDcmVhdGVQYXltZW50SW50ZW50UmVzcG9uc2USFQoNY2xpZW50X3NlY3JldBgBIAEoCULdAQoXY29tLmZsdXhsYXkuY2hlY2tvdXQudjFCDUNoZWNrb3V0UHJvdG9QAVpFZ2l0aHViLmNvbS9rZW4xMDkvZmx1eGxheS1wcm90by9nZW4vZ28vZmx1eGxheS9jaGVja291dC92MTtjaGVja291dHYxogIDRkNYqgITRmx1eGxheS5DaGVja291dC5WMcoCE0ZsdXhsYXlcQ2hlY2tvdXRcVjHiAh9GbHV4bGF5XENoZWNrb3V0XFYxXEdQQk1ldGFkYXRh6gIVRmx1eGxheTo6Q2hlY2tvdXQ6OlYxYgZwcm90bzM\");\n\n/**\n * @generated from message fluxlay.checkout.v1.CreatePaymentIntentRequest\n */\nexport type CreatePaymentIntentRequest = Message<\"fluxlay.checkout.v1.CreatePaymentIntentRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: string currency = 2;\n */\n currency: string;\n};\n\nexport type CreatePaymentIntentRequestValid = CreatePaymentIntentRequest;\n\n/**\n * Describes the message fluxlay.checkout.v1.CreatePaymentIntentRequest.\n * Use `create(CreatePaymentIntentRequestSchema)` to create a new message.\n */\nexport const CreatePaymentIntentRequestSchema: GenMessage<CreatePaymentIntentRequest, {validType: CreatePaymentIntentRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_checkout_v1_checkout, 0);\n\n/**\n * @generated from message fluxlay.checkout.v1.CreatePaymentIntentResponse\n */\nexport type CreatePaymentIntentResponse = Message<\"fluxlay.checkout.v1.CreatePaymentIntentResponse\"> & {\n /**\n * @generated from field: string client_secret = 1;\n */\n clientSecret: string;\n};\n\nexport type CreatePaymentIntentResponseValid = CreatePaymentIntentResponse;\n\n/**\n * Describes the message fluxlay.checkout.v1.CreatePaymentIntentResponse.\n * Use `create(CreatePaymentIntentResponseSchema)` to create a new message.\n */\nexport const CreatePaymentIntentResponseSchema: GenMessage<CreatePaymentIntentResponse, {validType: CreatePaymentIntentResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_checkout_v1_checkout, 1);\n\n","// 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.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\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(\"ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI3CgRSdWxlEgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSKGAQoMTWVzc2FnZVJ1bGVzEhYKDmNlbF9leHByZXNzaW9uGAUgAygJEh8KA2NlbBgDIAMoCzISLmJ1Zi52YWxpZGF0ZS5SdWxlEi0KBW9uZW9mGAQgAygLMh4uYnVmLnZhbGlkYXRlLk1lc3NhZ2VPbmVvZlJ1bGVKBAgBEAJSCGRpc2FibGVkIjQKEE1lc3NhZ2VPbmVvZlJ1bGUSDgoGZmllbGRzGAEgAygJEhAKCHJlcXVpcmVkGAIgASgIIh4KCk9uZW9mUnVsZXMSEAoIcmVxdWlyZWQYASABKAgiiwkKCkZpZWxkUnVsZXMSFgoOY2VsX2V4cHJlc3Npb24YHSADKAkSHwoDY2VsGBcgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGUSEAoIcmVxdWlyZWQYGSABKAgSJAoGaWdub3JlGBsgASgOMhQuYnVmLnZhbGlkYXRlLklnbm9yZRIpCgVmbG9hdBgBIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GbG9hdFJ1bGVzSAASKwoGZG91YmxlGAIgASgLMhkuYnVmLnZhbGlkYXRlLkRvdWJsZVJ1bGVzSAASKQoFaW50MzIYAyABKAsyGC5idWYudmFsaWRhdGUuSW50MzJSdWxlc0gAEikKBWludDY0GAQgASgLMhguYnVmLnZhbGlkYXRlLkludDY0UnVsZXNIABIrCgZ1aW50MzIYBSABKAsyGS5idWYudmFsaWRhdGUuVUludDMyUnVsZXNIABIrCgZ1aW50NjQYBiABKAsyGS5idWYudmFsaWRhdGUuVUludDY0UnVsZXNIABIrCgZzaW50MzIYByABKAsyGS5idWYudmFsaWRhdGUuU0ludDMyUnVsZXNIABIrCgZzaW50NjQYCCABKAsyGS5idWYudmFsaWRhdGUuU0ludDY0UnVsZXNIABItCgdmaXhlZDMyGAkgASgLMhouYnVmLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAEi0KB2ZpeGVkNjQYCiABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQ2NFJ1bGVzSAASLwoIc2ZpeGVkMzIYCyABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkMzJSdWxlc0gAEi8KCHNmaXhlZDY0GAwgASgLMhsuYnVmLnZhbGlkYXRlLlNGaXhlZDY0UnVsZXNIABInCgRib29sGA0gASgLMhcuYnVmLnZhbGlkYXRlLkJvb2xSdWxlc0gAEisKBnN0cmluZxgOIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAEikKBWJ5dGVzGA8gASgLMhguYnVmLnZhbGlkYXRlLkJ5dGVzUnVsZXNIABInCgRlbnVtGBAgASgLMhcuYnVmLnZhbGlkYXRlLkVudW1SdWxlc0gAEi8KCHJlcGVhdGVkGBIgASgLMhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIABIlCgNtYXAYEyABKAsyFi5idWYudmFsaWRhdGUuTWFwUnVsZXNIABIlCgNhbnkYFCABKAsyFi5idWYudmFsaWRhdGUuQW55UnVsZXNIABIvCghkdXJhdGlvbhgVIAEoCzIbLmJ1Zi52YWxpZGF0ZS5EdXJhdGlvblJ1bGVzSAASMgoKZmllbGRfbWFzaxgcIAEoCzIcLmJ1Zi52YWxpZGF0ZS5GaWVsZE1hc2tSdWxlc0gAEjEKCXRpbWVzdGFtcBgWIAEoCzIcLmJ1Zi52YWxpZGF0ZS5UaW1lc3RhbXBSdWxlc0gAQgYKBHR5cGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSJVCg9QcmVkZWZpbmVkUnVsZXMSHwoDY2VsGAEgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSLaFwoKRmxvYXRSdWxlcxKDAQoFY29uc3QYASABKAJCdMJIcQpvCgtmbG9hdC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEp8BCgJsdBgCIAEoAkKQAcJIjAEKiQEKCGZsb2F0Lmx0Gn0haGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0KT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEq8BCgNsdGUYAyABKAJCnwHCSJsBCpgBCglmbG9hdC5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABLvBwoCZ3QYBCABKAJC4AfCSNwHCo0BCghmbG9hdC5ndBqAASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCsMBCgtmbG9hdC5ndF9sdBqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCs0BChVmbG9hdC5ndF9sdF9leGNsdXNpdmUaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrTAQoMZmxvYXQuZ3RfbHRlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycK3QEKFmZsb2F0Lmd0X2x0ZV9leGNsdXNpdmUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEroICgNndGUYBSABKAJCqgjCSKYICpsBCglmbG9hdC5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0gEKDGZsb2F0Lmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3AEKFmZsb2F0Lmd0ZV9sdF9leGNsdXNpdmUawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCuIBCg1mbG9hdC5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrsAQoXZmxvYXQuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESfwoCaW4YBiADKAJCc8JIcApuCghmbG9hdC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdgoGbm90X2luGAcgAygCQmbCSGMKYQoMZmxvYXQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSdQoGZmluaXRlGAggASgIQmXCSGIKYAoMZmxvYXQuZmluaXRlGlBydWxlcy5maW5pdGUgPyAodGhpcy5pc05hbigpIHx8IHRoaXMuaXNJbmYoKSA/ICd2YWx1ZSBtdXN0IGJlIGZpbml0ZScgOiAnJykgOiAnJxIrCgdleGFtcGxlGAkgAygCQhrCSBcKFQoNZmxvYXQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i7RcKC0RvdWJsZVJ1bGVzEoQBCgVjb25zdBgBIAEoAUJ1wkhyCnAKDGRvdWJsZS5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEqABCgJsdBgCIAEoAUKRAcJIjQEKigEKCWRvdWJsZS5sdBp9IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKwAQoDbHRlGAMgASgBQqABwkicAQqZAQoKZG91YmxlLmx0ZRqKASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEvQHCgJndBgEIAEoAULlB8JI4QcKjgEKCWRvdWJsZS5ndBqAASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCsQBCgxkb3VibGUuZ3RfbHQaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrOAQoWZG91YmxlLmd0X2x0X2V4Y2x1c2l2ZRqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCtQBCg1kb3VibGUuZ3RfbHRlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycK3gEKF2RvdWJsZS5ndF9sdGVfZXhjbHVzaXZlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARK/CAoDZ3RlGAUgASgBQq8IwkirCAqcAQoKZG91YmxlLmd0ZRqNASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrTAQoNZG91YmxlLmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3QEKF2RvdWJsZS5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrjAQoOZG91YmxlLmd0ZV9sdGUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCu0BChhkb3VibGUuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygBQnTCSHEKbwoJZG91YmxlLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKAFCZ8JIZApiCg1kb3VibGUubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSdgoGZmluaXRlGAggASgIQmbCSGMKYQoNZG91YmxlLmZpbml0ZRpQcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAndmFsdWUgbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSLAoHZXhhbXBsZRgJIAMoAUIbwkgYChYKDmRvdWJsZS5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKMFQoKSW50MzJSdWxlcxKDAQoFY29uc3QYASABKAVCdMJIcQpvCgtpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEooBCgJsdBgCIAEoBUJ8wkh5CncKCGludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpwBCgNsdGUYAyABKAVCjAHCSIgBCoUBCglpbnQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEpcHCgJndBgEIAEoBUKIB8JIhAcKegoIaW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrMBCgtpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKuwEKFWludDMyLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsMBCgxpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCssBChZpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLjBwoDZ3RlGAUgASgFQtMHwkjPBwqIAQoJaW50MzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEn8KAmluGAYgAygFQnPCSHAKbgoIaW50MzIuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgHIAMoBUJmwkhjCmEKDGludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEisKB2V4YW1wbGUYCCADKAVCGsJIFwoVCg1pbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKMFQoKSW50NjRSdWxlcxKDAQoFY29uc3QYASABKANCdMJIcQpvCgtpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEooBCgJsdBgCIAEoA0J8wkh5CncKCGludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpwBCgNsdGUYAyABKANCjAHCSIgBCoUBCglpbnQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEpcHCgJndBgEIAEoA0KIB8JIhAcKegoIaW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrMBCgtpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKuwEKFWludDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsMBCgxpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCssBChZpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLjBwoDZ3RlGAUgASgDQtMHwkjPBwqIAQoJaW50NjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEn8KAmluGAYgAygDQnPCSHAKbgoIaW50NjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgHIAMoA0JmwkhjCmEKDGludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEisKB2V4YW1wbGUYCSADKANCGsJIFwoVCg1pbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLVUludDMyUnVsZXMShAEKBWNvbnN0GAEgASgNQnXCSHIKcAoMdWludDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgNQn3CSHoKeAoJdWludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKA1CjQHCSIkBCoYBCgp1aW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKA1CjQfCSIkHCnsKCXVpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgNQtgHwkjUBwqJAQoKdWludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg11aW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChd1aW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnVpbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChh1aW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygNQnTCSHEKbwoJdWludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKA1CZ8JIZApiCg11aW50MzIubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoDUIbwkgYChYKDnVpbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLVUludDY0UnVsZXMShAEKBWNvbnN0GAEgASgEQnXCSHIKcAoMdWludDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgEQn3CSHoKeAoJdWludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKARCjQHCSIkBCoYBCgp1aW50NjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKARCjQfCSIkHCnsKCXVpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgEQtgHwkjUBwqJAQoKdWludDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg11aW50NjQuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChd1aW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnVpbnQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChh1aW50NjQuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygEQnTCSHEKbwoJdWludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKARCZ8JIZApiCg11aW50NjQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoBEIbwkgYChYKDnVpbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLU0ludDMyUnVsZXMShAEKBWNvbnN0GAEgASgRQnXCSHIKcAoMc2ludDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgRQn3CSHoKeAoJc2ludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKBFCjQHCSIkBCoYBCgpzaW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKBFCjQfCSIkHCnsKCXNpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgRQtgHwkjUBwqJAQoKc2ludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg1zaW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChdzaW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnNpbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChhzaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygRQnTCSHEKbwoJc2ludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKBFCZ8JIZApiCg1zaW50MzIubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoEUIbwkgYChYKDnNpbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKeFQoLU0ludDY0UnVsZXMShAEKBWNvbnN0GAEgASgSQnXCSHIKcAoMc2ludDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSiwEKAmx0GAIgASgSQn3CSHoKeAoJc2ludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKBJCjQHCSIkBCoYBCgpzaW50NjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKBJCjQfCSIkHCnsKCXNpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgSQtgHwkjUBwqJAQoKc2ludDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg1zaW50NjQuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChdzaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnNpbnQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChhzaW50NjQuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgAEKAmluGAYgAygSQnTCSHEKbwoJc2ludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YByADKBJCZ8JIZApiCg1zaW50NjQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoEkIbwkgYChYKDnNpbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKvFQoMRml4ZWQzMlJ1bGVzEoUBCgVjb25zdBgBIAEoB0J2wkhzCnEKDWZpeGVkMzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKMAQoCbHQYAiABKAdCfsJIewp5CgpmaXhlZDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp4BCgNsdGUYAyABKAdCjgHCSIoBCocBCgtmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASoQcKAmd0GAQgASgHQpIHwkiOBwp8CgpmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLtBwoDZ3RlGAUgASgHQt0HwkjZBwqKAQoLZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQzMi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkMzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKBAQoCaW4YBiADKAdCdcJIcgpwCgpmaXhlZDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ4CgZub3RfaW4YByADKAdCaMJIZQpjCg5maXhlZDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi0KB2V4YW1wbGUYCCADKAdCHMJIGQoXCg9maXhlZDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIq8VCgxGaXhlZDY0UnVsZXMShQEKBWNvbnN0GAEgASgGQnbCSHMKcQoNZml4ZWQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEowBCgJsdBgCIAEoBkJ+wkh7CnkKCmZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASngEKA2x0ZRgDIAEoBkKOAcJIigEKhwEKC2ZpeGVkNjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKhBwoCZ3QYBCABKAZCkgfCSI4HCnwKCmZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrUBCg1maXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq9AQoXZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrFAQoOZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs0BChhmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEu0HCgNndGUYBSABKAZC3QfCSNkHCooBCgtmaXhlZDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsQBCg5maXhlZDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrMAQoYZml4ZWQ2NC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrUAQoPZml4ZWQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtwBChlmaXhlZDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoEBCgJpbhgGIAMoBkJ1wkhyCnAKCmZpeGVkNjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEngKBm5vdF9pbhgHIAMoBkJowkhlCmMKDmZpeGVkNjQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLQoHZXhhbXBsZRgIIAMoBkIcwkgZChcKD2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iwBUKDVNGaXhlZDMyUnVsZXMShgEKBWNvbnN0GAEgASgPQnfCSHQKcgoOc2ZpeGVkMzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKNAQoCbHQYAiABKA9Cf8JIfAp6CgtzZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKfAQoDbHRlGAMgASgPQo8BwkiLAQqIAQoMc2ZpeGVkMzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKmBwoCZ3QYBCABKA9ClwfCSJMHCn0KC3NmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOc2ZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhzZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPc2ZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZc2ZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES8gcKA2d0ZRgFIAEoD0LiB8JI3gcKiwEKDHNmaXhlZDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9zZml4ZWQzMi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGXNmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBzZml4ZWQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpzZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKCAQoCaW4YBiADKA9CdsJIcwpxCgtzZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSeQoGbm90X2luGAcgAygPQmnCSGYKZAoPc2ZpeGVkMzIubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLgoHZXhhbXBsZRgIIAMoD0IdwkgaChgKEHNmaXhlZDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIsAVCg1TRml4ZWQ2NFJ1bGVzEoYBCgVjb25zdBgBIAEoEEJ3wkh0CnIKDnNmaXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjQEKAmx0GAIgASgQQn/CSHwKegoLc2ZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASnwEKA2x0ZRgDIAEoEEKPAcJIiwEKiAEKDHNmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASpgcKAmd0GAQgASgQQpcHwkiTBwp9CgtzZml4ZWQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDnNmaXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYc2ZpeGVkNjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD3NmaXhlZDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGXNmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEvIHCgNndGUYBSABKBBC4gfCSN4HCosBCgxzZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkNjQuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQ2NC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkNjQuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESggEKAmluGAYgAygQQnbCSHMKcQoLc2ZpeGVkNjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnkKBm5vdF9pbhgHIAMoEEJpwkhmCmQKD3NmaXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi4KB2V4YW1wbGUYCCADKBBCHcJIGgoYChBzZml4ZWQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLHAQoJQm9vbFJ1bGVzEoIBCgVjb25zdBgBIAEoCEJzwkhwCm4KCmJvb2wuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxIqCgdleGFtcGxlGAIgAygIQhnCSBYKFAoMYm9vbC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIiiDkKC1N0cmluZ1J1bGVzEoYBCgVjb25zdBgBIAEoCUJ3wkh0CnIKDHN0cmluZy5jb25zdBpidGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCBgJXNgJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSfgoDbGVuGBMgASgEQnHCSG4KbAoKc3RyaW5nLmxlbhpedWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubGVuXSkgOiAnJxKZAQoHbWluX2xlbhgCIAEoBEKHAcJIgwEKgAEKDnN0cmluZy5taW5fbGVuGm51aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKXAQoHbWF4X2xlbhgDIAEoBEKFAcJIgQEKfwoOc3RyaW5nLm1heF9sZW4abXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSmwEKCWxlbl9ieXRlcxgUIAEoBEKHAcJIgwEKgAEKEHN0cmluZy5sZW5fYnl0ZXMabHVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSAhPSBydWxlcy5sZW5fYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuX2J5dGVzXSkgOiAnJxKjAQoJbWluX2J5dGVzGAQgASgEQo8BwkiLAQqIAQoQc3RyaW5nLm1pbl9ieXRlcxp0dWludChieXRlcyh0aGlzKS5zaXplKCkpIDwgcnVsZXMubWluX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1pbl9ieXRlc10pIDogJycSogEKCW1heF9ieXRlcxgFIAEoBEKOAcJIigEKhwEKEHN0cmluZy5tYXhfYnl0ZXMac3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9ieXRlc10pIDogJycSjQEKB3BhdHRlcm4YBiABKAlCfMJIeQp3Cg5zdHJpbmcucGF0dGVybhplIXRoaXMubWF0Y2hlcyhydWxlcy5wYXR0ZXJuKSA/ICd2YWx1ZSBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycShAEKBnByZWZpeBgHIAEoCUJ0wkhxCm8KDXN0cmluZy5wcmVmaXgaXiF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCBgJXNgJy5mb3JtYXQoW3J1bGVzLnByZWZpeF0pIDogJycSggEKBnN1ZmZpeBgIIAEoCUJywkhvCm0KDXN0cmluZy5zdWZmaXgaXCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnEpABCghjb250YWlucxgJIAEoCUJ+wkh7CnkKD3N0cmluZy5jb250YWlucxpmIXRoaXMuY29udGFpbnMocnVsZXMuY29udGFpbnMpID8gJ3ZhbHVlIGRvZXMgbm90IGNvbnRhaW4gc3Vic3RyaW5nIGAlc2AnLmZvcm1hdChbcnVsZXMuY29udGFpbnNdKSA6ICcnEpgBCgxub3RfY29udGFpbnMYFyABKAlCgQHCSH4KfAoTc3RyaW5nLm5vdF9jb250YWlucxpldGhpcy5jb250YWlucyhydWxlcy5ub3RfY29udGFpbnMpID8gJ3ZhbHVlIGNvbnRhaW5zIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLm5vdF9jb250YWluc10pIDogJycSgAEKAmluGAogAygJQnTCSHEKbwoJc3RyaW5nLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ3CgZub3RfaW4YCyADKAlCZ8JIZApiCg1zdHJpbmcubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycS3wEKBWVtYWlsGAwgASgIQs0BwkjJAQphCgxzdHJpbmcuZW1haWwSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGiwhcnVsZXMuZW1haWwgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzRW1haWwoKQpkChJzdHJpbmcuZW1haWxfZW1wdHkSMnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGhohcnVsZXMuZW1haWwgfHwgdGhpcyAhPSAnJ0gAEucBCghob3N0bmFtZRgNIAEoCELSAcJIzgEKZQoPc3RyaW5nLmhvc3RuYW1lEh52YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdG5hbWUaMiFydWxlcy5ob3N0bmFtZSB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0bmFtZSgpCmUKFXN0cmluZy5ob3N0bmFtZV9lbXB0eRItdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lGh0hcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyAhPSAnJ0gAEscBCgJpcBgOIAEoCEK4AcJItAEKVQoJc3RyaW5nLmlwEiB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcxomIXJ1bGVzLmlwIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwKCkKWwoPc3RyaW5nLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxoXIXJ1bGVzLmlwIHx8IHRoaXMgIT0gJydIABLWAQoEaXB2NBgPIAEoCELFAcJIwQEKXAoLc3RyaW5nLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaKSFydWxlcy5pcHY0IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwKDQpCmEKEXN0cmluZy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGhkhcnVsZXMuaXB2NCB8fCB0aGlzICE9ICcnSAAS1gEKBGlwdjYYECABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY2EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzGikhcnVsZXMuaXB2NiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg2KQphChFzdHJpbmcuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxoZIXJ1bGVzLmlwdjYgfHwgdGhpcyAhPSAnJ0gAEr8BCgN1cmkYESABKAhCrwHCSKsBClEKCnN0cmluZy51cmkSGXZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkaKCFydWxlcy51cmkgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzVXJpKCkKVgoQc3RyaW5nLnVyaV9lbXB0eRIodmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVSSRoYIXJ1bGVzLnVyaSB8fCB0aGlzICE9ICcnSAAScAoHdXJpX3JlZhgSIAEoCEJdwkhaClgKDnN0cmluZy51cmlfcmVmEiN2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVJJIFJlZmVyZW5jZRohIXJ1bGVzLnVyaV9yZWYgfHwgdGhpcy5pc1VyaVJlZigpSAASkAIKB2FkZHJlc3MYFSABKAhC/AHCSPgBCoEBCg5zdHJpbmcuYWRkcmVzcxItdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGkAhcnVsZXMuYWRkcmVzcyB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0bmFtZSgpIHx8IHRoaXMuaXNJcCgpCnIKFHN0cmluZy5hZGRyZXNzX2VtcHR5Ejx2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgaG9zdG5hbWUsIG9yIGlwIGFkZHJlc3MaHCFydWxlcy5hZGRyZXNzIHx8IHRoaXMgIT0gJydIABKYAgoEdXVpZBgWIAEoCEKHAsJIgwIKpQEKC3N0cmluZy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBp6IXJ1bGVzLnV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykKWQoRc3RyaW5nLnV1aWRfZW1wdHkSKXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVVUlEGhkhcnVsZXMudXVpZCB8fCB0aGlzICE9ICcnSAAS8AEKBXR1dWlkGCEgASgIQt4BwkjaAQpzCgxzdHJpbmcudHV1aWQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCB0cmltbWVkIFVVSUQaPyFydWxlcy50dXVpZCB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcygnXlswLTlhLWZBLUZdezMyfSQnKQpjChJzdHJpbmcudHV1aWRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCB0cmltbWVkIFVVSUQaGiFydWxlcy50dXVpZCB8fCB0aGlzICE9ICcnSAASlgIKEWlwX3dpdGhfcHJlZml4bGVuGBogASgIQvgBwkj0AQp4ChhzdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW4SH3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaOyFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCgpCngKHnN0cmluZy5pcF93aXRoX3ByZWZpeGxlbl9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBomIXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLPAgoTaXB2NF93aXRoX3ByZWZpeGxlbhgbIAEoCEKvAsJIqwIKkwEKGnN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuEjV2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCkKkgEKIHN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEs8CChNpcHY2X3dpdGhfcHJlZml4bGVuGBwgASgIQq8CwkirAgqTAQoac3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW4SNXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGj4hcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2KQqSAQogc3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW5fZW1wdHkSRHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGighcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAAS8gEKCWlwX3ByZWZpeBgdIAEoCELcAcJI2AEKbAoQc3RyaW5nLmlwX3ByZWZpeBIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIABKDAgoLaXB2NF9wcmVmaXgYHiABKAhC6wHCSOcBCnUKEnN0cmluZy5pcHY0X3ByZWZpeBIhdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgcHJlZml4GjwhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCwgdHJ1ZSkKbgoYc3RyaW5nLmlwdjRfcHJlZml4X2VtcHR5EjB2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBwcmVmaXgaICFydWxlcy5pcHY0X3ByZWZpeCB8fCB0aGlzICE9ICcnSAASgwIKC2lwdjZfcHJlZml4GB8gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2Nl9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IHByZWZpeBo8IXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYsIHRydWUpCm4KGHN0cmluZy5pcHY2X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgcHJlZml4GiAhcnVsZXMuaXB2Nl9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAErUCCg1ob3N0X2FuZF9wb3J0GCAgASgIQpsCwkiXAgqZAQoUc3RyaW5nLmhvc3RfYW5kX3BvcnQSQXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0IChob3N0bmFtZSBvciBJUCBhZGRyZXNzKSBhbmQgcG9ydCBwYWlyGj4hcnVsZXMuaG9zdF9hbmRfcG9ydCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0QW5kUG9ydCh0cnVlKQp5ChpzdHJpbmcuaG9zdF9hbmRfcG9ydF9lbXB0eRI3dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3QgYW5kIHBvcnQgcGFpchoiIXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyAhPSAnJ0gAEvUBCgR1bGlkGCMgASgIQuQBwkjgAQqCAQoLc3RyaW5nLnVsaWQSGnZhbHVlIG11c3QgYmUgYSB2YWxpZCBVTElEGlchcnVsZXMudWxpZCB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcygnXlswLTddWzAtOUEtSEpLTU5QLVRWLVphLWhqa21ucC10di16XXsyNX0kJykKWQoRc3RyaW5nLnVsaWRfZW1wdHkSKXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVTElEGhkhcnVsZXMudWxpZCB8fCB0aGlzICE9ICcnSAASqAUKEHdlbGxfa25vd25fcmVnZXgYGCABKA4yGC5idWYudmFsaWRhdGUuS25vd25SZWdleELxBMJI7QQK8AEKI3N0cmluZy53ZWxsX2tub3duX3JlZ2V4LmhlYWRlcl9uYW1lEiZ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgbmFtZRqgAXJ1bGVzLndlbGxfa25vd25fcmVnZXggIT0gMSB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcyghaGFzKHJ1bGVzLnN0cmljdCkgfHwgcnVsZXMuc3RyaWN0ID8nXjo/WzAtOWEtekEtWiEjJCUmXCcqKy0uXl98flx4NjBdKyQnIDonXlteXHUwMDAwXHUwMDBBXHUwMDBEXSskJykKjQEKKXN0cmluZy53ZWxsX2tub3duX3JlZ2V4LmhlYWRlcl9uYW1lX2VtcHR5EjV2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSFRUUCBoZWFkZXIgbmFtZRopcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgIT0gJycK5wEKJHN0cmluZy53ZWxsX2tub3duX3JlZ2V4LmhlYWRlcl92YWx1ZRIndmFsdWUgbXVzdCBiZSBhIHZhbGlkIEhUVFAgaGVhZGVyIHZhbHVlGpUBcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAyIHx8IHRoaXMubWF0Y2hlcyghaGFzKHJ1bGVzLnN0cmljdCkgfHwgcnVsZXMuc3RyaWN0ID8nXlteXHUwMDAwLVx1MDAwOFx1MDAwQS1cdTAwMUZcdTAwN0ZdKiQnIDonXlteXHUwMDAwXHUwMDBBXHUwMDBEXSokJylIABIOCgZzdHJpY3QYGSABKAgSLAoHZXhhbXBsZRgiIAMoCUIbwkgYChYKDnN0cmluZy5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biLCEgoKQnl0ZXNSdWxlcxKAAQoFY29uc3QYASABKAxCccJIbgpsCgtieXRlcy5jb25zdBpddGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBiZSAleCcuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEngKA2xlbhgNIAEoBEJrwkhoCmYKCWJ5dGVzLmxlbhpZdWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJycSkAEKB21pbl9sZW4YAiABKARCf8JIfAp6Cg1ieXRlcy5taW5fbGVuGml1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWluX2xlbl0pIDogJycSiAEKB21heF9sZW4YAyABKARCd8JIdApyCg1ieXRlcy5tYXhfbGVuGmF1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9sZW4gPyAndmFsdWUgbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9sZW5dKSA6ICcnEpABCgdwYXR0ZXJuGAQgASgJQn/CSHwKegoNYnl0ZXMucGF0dGVybhppIXN0cmluZyh0aGlzKS5tYXRjaGVzKHJ1bGVzLnBhdHRlcm4pID8gJ3ZhbHVlIG11c3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnEoEBCgZwcmVmaXgYBSABKAxCccJIbgpsCgxieXRlcy5wcmVmaXgaXCF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCAleCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnEn8KBnN1ZmZpeBgGIAEoDEJvwkhsCmoKDGJ5dGVzLnN1ZmZpeBpaIXRoaXMuZW5kc1dpdGgocnVsZXMuc3VmZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpeCAleCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnEoMBCghjb250YWlucxgHIAEoDEJxwkhuCmwKDmJ5dGVzLmNvbnRhaW5zGlohdGhpcy5jb250YWlucyhydWxlcy5jb250YWlucykgPyAndmFsdWUgZG9lcyBub3QgY29udGFpbiAleCcuZm9ybWF0KFtydWxlcy5jb250YWluc10pIDogJycSpwEKAmluGAggAygMQpoBwkiWAQqTAQoIYnl0ZXMuaW4ahgFnZXRGaWVsZChydWxlcywgJ2luJykuc2l6ZSgpID4gMCAmJiAhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YCSADKAxCZsJIYwphCgxieXRlcy5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxLrAQoCaXAYCiABKAhC3AHCSNgBCnQKCGJ5dGVzLmlwEiB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcxpGIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNCB8fCB0aGlzLnNpemUoKSA9PSAxNgpgCg5ieXRlcy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaHSFydWxlcy5pcCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS5AEKBGlwdjQYCyABKAhC0wHCSM8BCmUKCmJ5dGVzLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS5QEKBGlwdjYYDCABKAhC1AHCSNABCmYKCmJ5dGVzLmlwdjYSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAEtUBCgR1dWlkGA8gASgIQsQBwkjAAQpeCgpieXRlcy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBo0IXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpeChBieXRlcy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBofIXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgIT0gMEgAEisKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biLUAwoJRW51bVJ1bGVzEoIBCgVjb25zdBgBIAEoBUJzwkhwCm4KCmVudW0uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxIUCgxkZWZpbmVkX29ubHkYAiABKAgSfgoCaW4YAyADKAVCcsJIbwptCgdlbnVtLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ1CgZub3RfaW4YBCADKAVCZcJIYgpgCgtlbnVtLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEioKB2V4YW1wbGUYBSADKAVCGcJIFgoUCgxlbnVtLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAiL7AwoNUmVwZWF0ZWRSdWxlcxKeAQoJbWluX2l0ZW1zGAEgASgEQooBwkiGAQqDAQoScmVwZWF0ZWQubWluX2l0ZW1zGm11aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9pdGVtcyA/ICd2YWx1ZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJWQgaXRlbShzKScuZm9ybWF0KFtydWxlcy5taW5faXRlbXNdKSA6ICcnEqIBCgltYXhfaXRlbXMYAiABKARCjgHCSIoBCocBChJyZXBlYXRlZC5tYXhfaXRlbXMacXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJXMgaXRlbShzKScuZm9ybWF0KFtydWxlcy5tYXhfaXRlbXNdKSA6ICcnEnAKBnVuaXF1ZRgDIAEoCEJgwkhdClsKD3JlcGVhdGVkLnVuaXF1ZRIocmVwZWF0ZWQgdmFsdWUgbXVzdCBjb250YWluIHVuaXF1ZSBpdGVtcxoeIXJ1bGVzLnVuaXF1ZSB8fCB0aGlzLnVuaXF1ZSgpEicKBWl0ZW1zGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMqCQjoBxCAgICAAiKKAwoITWFwUnVsZXMSjwEKCW1pbl9wYWlycxgBIAEoBEJ8wkh5CncKDW1hcC5taW5fcGFpcnMaZnVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX3BhaXJzID8gJ21hcCBtdXN0IGJlIGF0IGxlYXN0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWluX3BhaXJzXSkgOiAnJxKOAQoJbWF4X3BhaXJzGAIgASgEQnvCSHgKdgoNbWFwLm1heF9wYWlycxpldWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbW9zdCAlZCBlbnRyaWVzJy5mb3JtYXQoW3J1bGVzLm1heF9wYWlyc10pIDogJycSJgoEa2V5cxgEIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzEigKBnZhbHVlcxgFIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzKgkI6AcQgICAgAIiJgoIQW55UnVsZXMSCgoCaW4YAiADKAkSDgoGbm90X2luGAMgAygJIpkXCg1EdXJhdGlvblJ1bGVzEqEBCgVjb25zdBgCIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJ3wkh0CnIKDmR1cmF0aW9uLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSqAEKAmx0GAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQn/CSHwKegoLZHVyYXRpb24ubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASugEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKPAcJIiwEKiAEKDGR1cmF0aW9uLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASwQcKAmd0GAUgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQpcHwkiTBwp9CgtkdXJhdGlvbi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDmR1cmF0aW9uLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYZHVyYXRpb24uZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD2R1cmF0aW9uLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGWR1cmF0aW9uLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEo0ICgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25C4gfCSN4HCosBCgxkdXJhdGlvbi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPZHVyYXRpb24uZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQZHVyYXRpb24uZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESnQEKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnbCSHMKcQoLZHVyYXRpb24uaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEpQBCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CacJIZgpkCg9kdXJhdGlvbi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxJJCgdleGFtcGxlGAkgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQh3CSBoKGAoQZHVyYXRpb24uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i/QUKDkZpZWxkTWFza1J1bGVzEr8BCgVjb25zdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCkwHCSI8BCowBChBmaWVsZF9tYXNrLmNvbnN0Gnh0aGlzLnBhdGhzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRocyA/ICd2YWx1ZSBtdXN0IGVxdWFsIHBhdGhzICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRoc10pIDogJycS2QEKAmluGAIgAygJQswBwkjIAQrFAQoNZmllbGRfbWFzay5pbhqzASF0aGlzLnBhdGhzLmFsbChwLCBwIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ2luJykuZXhpc3RzKGYsIHAuc3RhcnRzV2l0aChmKycuJykpKSA/ICd2YWx1ZSBtdXN0IG9ubHkgY29udGFpbiBwYXRocyBpbiAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEvMBCgZub3RfaW4YAyADKAlC4gHCSN4BCtsBChFmaWVsZF9tYXNrLm5vdF9pbhrFASF0aGlzLnBhdGhzLmFsbChwLCAhKHAgaW4gZ2V0RmllbGQocnVsZXMsICdub3RfaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ25vdF9pbicpLmV4aXN0cyhmLCBwLnN0YXJ0c1dpdGgoZisnLicpKSkpID8gJ3ZhbHVlIG11c3Qgbm90IGNvbnRhaW4gYW55IHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnbm90X2luJyldKSA6ICcnEkwKB2V4YW1wbGUYBCADKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQh/CSBwKGgoSZmllbGRfbWFzay5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIikhgKDlRpbWVzdGFtcFJ1bGVzEqMBCgVjb25zdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCeMJIdQpzCg90aW1lc3RhbXAuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKrAQoCbHQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQoABwkh9CnsKDHRpbWVzdGFtcC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABK8AQoDbHRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKQAcJIjAEKiQEKDXRpbWVzdGFtcC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEmwKBmx0X25vdxgHIAEoCEJawkhXClUKEHRpbWVzdGFtcC5sdF9ub3caQShydWxlcy5sdF9ub3cgJiYgdGhpcyA+IG5vdykgPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gbm93JyA6ICcnSAASxwcKAmd0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKcB8JImAcKfgoMdGltZXN0YW1wLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq3AQoPdGltZXN0YW1wLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq/AQoZdGltZXN0YW1wLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCscBChB0aW1lc3RhbXAuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrPAQoadGltZXN0YW1wLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEpMICgNndGUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQucHwkjjBwqMAQoNdGltZXN0YW1wLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsYBChB0aW1lc3RhbXAuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs4BChp0aW1lc3RhbXAuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1gEKEXRpbWVzdGFtcC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt4BCht0aW1lc3RhbXAuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESbwoGZ3Rfbm93GAggASgIQl3CSFoKWAoQdGltZXN0YW1wLmd0X25vdxpEKHJ1bGVzLmd0X25vdyAmJiB0aGlzIDwgbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cnIDogJydIARK4AQoGd2l0aGluGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQowBwkiIAQqFAQoQdGltZXN0YW1wLndpdGhpbhpxdGhpcyA8IG5vdy1ydWxlcy53aXRoaW4gfHwgdGhpcyA+IG5vdytydWxlcy53aXRoaW4gPyAndmFsdWUgbXVzdCBiZSB3aXRoaW4gJXMgb2Ygbm93Jy5mb3JtYXQoW3J1bGVzLndpdGhpbl0pIDogJycSSwoHZXhhbXBsZRgKIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCHsJIGwoZChF0aW1lc3RhbXAuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iOQoKVmlvbGF0aW9ucxIrCgp2aW9sYXRpb25zGAEgAygLMhcuYnVmLnZhbGlkYXRlLlZpb2xhdGlvbiKfAQoJVmlvbGF0aW9uEiYKBWZpZWxkGAUgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aBIlCgRydWxlGAYgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aBIPCgdydWxlX2lkGAIgASgJEg8KB21lc3NhZ2UYAyABKAkSDwoHZm9yX2tleRgEIAEoCEoECAEQAlIKZmllbGRfcGF0aCI9CglGaWVsZFBhdGgSMAoIZWxlbWVudHMYASADKAsyHi5idWYudmFsaWRhdGUuRmllbGRQYXRoRWxlbWVudCLpAgoQRmllbGRQYXRoRWxlbWVudBIUCgxmaWVsZF9udW1iZXIYASABKAUSEgoKZmllbGRfbmFtZRgCIAEoCRI+CgpmaWVsZF90eXBlGAMgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSPAoIa2V5X3R5cGUYBCABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRI+Cgp2YWx1ZV90eXBlGAUgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSDwoFaW5kZXgYBiABKARIABISCghib29sX2tleRgHIAEoCEgAEhEKB2ludF9rZXkYCCABKANIABISCgh1aW50X2tleRgJIAEoBEgAEhQKCnN0cmluZ19rZXkYCiABKAlIAEILCglzdWJzY3JpcHQqoQEKBklnbm9yZRIWChJJR05PUkVfVU5TUEVDSUZJRUQQABIYChRJR05PUkVfSUZfWkVST19WQUxVRRABEhEKDUlHTk9SRV9BTFdBWVMQAyIECAIQAioMSUdOT1JFX0VNUFRZKg5JR05PUkVfREVGQVVMVCoXSUdOT1JFX0lGX0RFRkFVTFRfVkFMVUUqFUlHTk9SRV9JRl9VTlBPUFVMQVRFRCpuCgpLbm93blJlZ2V4EhsKF0tOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEEAASIAocS05PV05fUkVHRVhfSFRUUF9IRUFERVJfTkFNRRABEiEKHUtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFEAI6VgoHbWVzc2FnZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiHCSABKAsyGi5idWYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlOk4KBW9uZW9mEh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucxiHCSABKAsyGC5idWYudmFsaWRhdGUuT25lb2ZSdWxlc1IFb25lb2Y6TgoFZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVmaWVsZDpdCgpwcmVkZWZpbmVkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiICSABKAsyHS5idWYudmFsaWRhdGUuUHJlZGVmaW5lZFJ1bGVzUgpwcmVkZWZpbmVkQrsBChBjb20uYnVmLnZhbGlkYXRlQg1WYWxpZGF0ZVByb3RvUAFaR2J1Zi5idWlsZC9nZW4vZ28vYnVmYnVpbGQvcHJvdG92YWxpZGF0ZS9wcm90b2NvbGJ1ZmZlcnMvZ28vYnVmL3ZhbGlkYXRlogIDQlZYqgIMQnVmLlZhbGlkYXRlygIMQnVmXFZhbGlkYXRl4gIYQnVmXFZhbGlkYXRlXEdQQk1ldGFkYXRh6gINQnVmOjpWYWxpZGF0ZQ\", [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\nexport type RuleValid = Rule;\n\n/**\n * Describes the message buf.validate.Rule.\n * Use `create(RuleSchema)` to create a new message.\n */\nexport const RuleSchema: GenMessage<Rule, {validType: RuleValid}> = /*@__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: \"value 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\nexport type MessageRulesValid = MessageRules;\n\n/**\n * Describes the message buf.validate.MessageRules.\n * Use `create(MessageRulesSchema)` to create a new message.\n */\nexport const MessageRulesSchema: GenMessage<MessageRules, {validType: MessageRulesValid}> = /*@__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\nexport type MessageOneofRuleValid = MessageOneofRule;\n\n/**\n * Describes the message buf.validate.MessageOneofRule.\n * Use `create(MessageOneofRuleSchema)` to create a new message.\n */\nexport const MessageOneofRuleSchema: GenMessage<MessageOneofRule, {validType: MessageOneofRuleValid}> = /*@__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\nexport type OneofRulesValid = OneofRules;\n\n/**\n * Describes the message buf.validate.OneofRules.\n * Use `create(OneofRulesSchema)` to create a new message.\n */\nexport const OneofRulesSchema: GenMessage<OneofRules, {validType: OneofRulesValid}> = /*@__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: \"value 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\nexport type FieldRulesValid = FieldRules;\n\n/**\n * Describes the message buf.validate.FieldRules.\n * Use `create(FieldRulesSchema)` to create a new message.\n */\nexport const FieldRulesSchema: GenMessage<FieldRules, {validType: FieldRulesValid}> = /*@__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: \"value 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\nexport type PredefinedRulesValid = PredefinedRules;\n\n/**\n * Describes the message buf.validate.PredefinedRules.\n * Use `create(PredefinedRulesSchema)` to create a new message.\n */\nexport const PredefinedRulesSchema: GenMessage<PredefinedRules, {validType: PredefinedRulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5.0 [float.gt]\n * float value = 1 [(buf.validate.field).float.gt = 5.0];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5.0 [float.gte]\n * float value = 1 [(buf.validate.field).float.gte = 5.0];\n *\n * // value 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 * // value 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 * // value 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 * `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\nexport type FloatRulesValid = FloatRules;\n\n/**\n * Describes the message buf.validate.FloatRules.\n * Use `create(FloatRulesSchema)` to create a new message.\n */\nexport const FloatRulesSchema: GenMessage<FloatRules, {validType: FloatRulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5.0 [double.gt]\n * double value = 1 [(buf.validate.field).double.gt = 5.0];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5.0 [double.gte]\n * double value = 1 [(buf.validate.field).double.gte = 5.0];\n *\n * // value 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 * // value 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 * // value 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\nexport type DoubleRulesValid = DoubleRules;\n\n/**\n * Describes the message buf.validate.DoubleRules.\n * Use `create(DoubleRulesSchema)` to create a new message.\n */\nexport const DoubleRulesSchema: GenMessage<DoubleRules, {validType: DoubleRulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [int32.gt]\n * int32 value = 1 [(buf.validate.field).int32.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [int32.gte]\n * int32 value = 1 [(buf.validate.field).int32.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type Int32RulesValid = Int32Rules;\n\n/**\n * Describes the message buf.validate.Int32Rules.\n * Use `create(Int32RulesSchema)` to create a new message.\n */\nexport const Int32RulesSchema: GenMessage<Int32Rules, {validType: Int32RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [int64.gt]\n * int64 value = 1 [(buf.validate.field).int64.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [int64.gte]\n * int64 value = 1 [(buf.validate.field).int64.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type Int64RulesValid = Int64Rules;\n\n/**\n * Describes the message buf.validate.Int64Rules.\n * Use `create(Int64RulesSchema)` to create a new message.\n */\nexport const Int64RulesSchema: GenMessage<Int64Rules, {validType: Int64RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [uint32.gt]\n * uint32 value = 1 [(buf.validate.field).uint32.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [uint32.gte]\n * uint32 value = 1 [(buf.validate.field).uint32.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type UInt32RulesValid = UInt32Rules;\n\n/**\n * Describes the message buf.validate.UInt32Rules.\n * Use `create(UInt32RulesSchema)` to create a new message.\n */\nexport const UInt32RulesSchema: GenMessage<UInt32Rules, {validType: UInt32RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [uint64.gt]\n * uint64 value = 1 [(buf.validate.field).uint64.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [uint64.gte]\n * uint64 value = 1 [(buf.validate.field).uint64.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type UInt64RulesValid = UInt64Rules;\n\n/**\n * Describes the message buf.validate.UInt64Rules.\n * Use `create(UInt64RulesSchema)` to create a new message.\n */\nexport const UInt64RulesSchema: GenMessage<UInt64Rules, {validType: UInt64RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [sint32.gt]\n * sint32 value = 1 [(buf.validate.field).sint32.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [sint32.gte]\n * sint32 value = 1 [(buf.validate.field).sint32.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type SInt32RulesValid = SInt32Rules;\n\n/**\n * Describes the message buf.validate.SInt32Rules.\n * Use `create(SInt32RulesSchema)` to create a new message.\n */\nexport const SInt32RulesSchema: GenMessage<SInt32Rules, {validType: SInt32RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [sint64.gt]\n * sint64 value = 1 [(buf.validate.field).sint64.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [sint64.gte]\n * sint64 value = 1 [(buf.validate.field).sint64.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type SInt64RulesValid = SInt64Rules;\n\n/**\n * Describes the message buf.validate.SInt64Rules.\n * Use `create(SInt64RulesSchema)` to create a new message.\n */\nexport const SInt64RulesSchema: GenMessage<SInt64Rules, {validType: SInt64RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [fixed32.gt]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [fixed32.gte]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type Fixed32RulesValid = Fixed32Rules;\n\n/**\n * Describes the message buf.validate.Fixed32Rules.\n * Use `create(Fixed32RulesSchema)` to create a new message.\n */\nexport const Fixed32RulesSchema: GenMessage<Fixed32Rules, {validType: Fixed32RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [fixed64.gt]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [fixed64.gte]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type Fixed64RulesValid = Fixed64Rules;\n\n/**\n * Describes the message buf.validate.Fixed64Rules.\n * Use `create(Fixed64RulesSchema)` to create a new message.\n */\nexport const Fixed64RulesSchema: GenMessage<Fixed64Rules, {validType: Fixed64RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [sfixed32.gt]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [sfixed32.gte]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type SFixed32RulesValid = SFixed32Rules;\n\n/**\n * Describes the message buf.validate.SFixed32Rules.\n * Use `create(SFixed32RulesSchema)` to create a new message.\n */\nexport const SFixed32RulesSchema: GenMessage<SFixed32Rules, {validType: SFixed32RulesValid}> = /*@__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 * // value 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 * // value 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 * // value must be greater than 5 [sfixed64.gt]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gt = 5];\n *\n * // value 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 * // value 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 * // value must be greater than or equal to 5 [sfixed64.gte]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gte = 5];\n *\n * // value 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 * // value 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 * // value 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\nexport type SFixed64RulesValid = SFixed64Rules;\n\n/**\n * Describes the message buf.validate.SFixed64Rules.\n * Use `create(SFixed64RulesSchema)` to create a new message.\n */\nexport const SFixed64RulesSchema: GenMessage<SFixed64Rules, {validType: SFixed64RulesValid}> = /*@__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 = 1,\n * (buf.validate.field).bool.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bool example = 2;\n */\n example: boolean[];\n};\n\nexport type BoolRulesValid = BoolRules;\n\n/**\n * Describes the message buf.validate.BoolRules.\n * Use `create(BoolRulesSchema)` to create a new message.\n */\nexport const BoolRulesSchema: GenMessage<BoolRules, {validType: BoolRulesValid}> = /*@__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 * // value must be in list [\"apple\", \"banana\"]\n * string value = 1 [(buf.validate.field).string.in = \"apple\", (buf.validate.field).string.in = \"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\", (buf.validate.field).string.not_in = \"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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 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 * // value 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 * `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 * // value 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\nexport type StringRulesValid = StringRules;\n\n/**\n * Describes the message buf.validate.StringRules.\n * Use `create(StringRulesSchema)` to create a new message.\n */\nexport const StringRulesSchema: GenMessage<StringRules, {validType: StringRulesValid}> = /*@__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 * // value 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 * // value 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 * // value 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 * // value 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 * // value 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 the 128-bit UUID data as\n * defined by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2).\n * The field must contain exactly 16 bytes\n * representing the UUID. If the field value isn't a valid UUID, an error\n * message will be generated.\n *\n * ```proto\n * message MyBytes {\n * // value 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\nexport type BytesRulesValid = BytesRules;\n\n/**\n * Describes the message buf.validate.BytesRules.\n * Use `create(BytesRulesSchema)` to create a new message.\n */\nexport const BytesRulesSchema: GenMessage<BytesRules, {validType: BytesRulesValid}> = /*@__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 * (buf.validate.field).enum.example = 1,\n * (buf.validate.field).enum.example = 2\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 5;\n */\n example: number[];\n};\n\nexport type EnumRulesValid = EnumRules;\n\n/**\n * Describes the message buf.validate.EnumRules.\n * Use `create(EnumRulesSchema)` to create a new message.\n */\nexport const EnumRulesSchema: GenMessage<EnumRules, {validType: EnumRulesValid}> = /*@__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\nexport type RepeatedRulesValid = RepeatedRules;\n\n/**\n * Describes the message buf.validate.RepeatedRules.\n * Use `create(RepeatedRulesSchema)` to create a new message.\n */\nexport const RepeatedRulesSchema: GenMessage<RepeatedRules, {validType: RepeatedRulesValid}> = /*@__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<string, string> 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<string, string> 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<string, string> 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<string, string> 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\nexport type MapRulesValid = MapRules;\n\n/**\n * Describes the message buf.validate.MapRules.\n * Use `create(MapRulesSchema)` to create a new message.\n */\nexport const MapRulesSchema: GenMessage<MapRules, {validType: MapRulesValid}> = /*@__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 * 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\nexport type AnyRulesValid = AnyRules;\n\n/**\n * Describes the message buf.validate.AnyRules.\n * Use `create(AnyRulesSchema)` to create a new message.\n */\nexport const AnyRulesSchema: GenMessage<AnyRules, {validType: AnyRulesValid}> = /*@__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 = \"5s\"];\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 * // value must be less than 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = \"5s\"];\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 * // value must be less than or equal to 10s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = \"10s\"];\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 * // value must be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.in = [\"1s\", \"2s\", \"3s\"]];\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.not_in = [\"1s\", \"2s\", \"3s\"]];\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\nexport type DurationRulesValid = DurationRules;\n\n/**\n * Describes the message buf.validate.DurationRules.\n * Use `create(DurationRulesSchema)` to create a new message.\n */\nexport const DurationRulesSchema: GenMessage<DurationRules, {validType: DurationRulesValid}> = /*@__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\nexport type FieldMaskRulesValid = FieldMaskRules;\n\n/**\n * Describes the message buf.validate.FieldMaskRules.\n * Use `create(FieldMaskRulesSchema)` to create a new message.\n */\nexport const FieldMaskRulesSchema: GenMessage<FieldMaskRules, {validType: FieldMaskRulesValid}> = /*@__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 * requires the duration 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 MyDuration {\n * // duration must be less than 'P3D' [duration.lt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = { seconds: 259200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lt = 3;\n */\n value: Timestamp;\n case: \"lt\";\n } | {\n /**\n * 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 * // value 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 * // value 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 * // value 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\nexport type TimestampRulesValid = TimestampRules;\n\n/**\n * Describes the message buf.validate.TimestampRules.\n * Use `create(TimestampRulesSchema)` to create a new message.\n */\nexport const TimestampRulesSchema: GenMessage<TimestampRules, {validType: TimestampRulesValid}> = /*@__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\nexport type ViolationsValid = Violations;\n\n/**\n * Describes the message buf.validate.Violations.\n * Use `create(ViolationsSchema)` to create a new message.\n */\nexport const ViolationsSchema: GenMessage<Violations, {validType: ViolationsValid}> = /*@__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\nexport type ViolationValid = Violation;\n\n/**\n * Describes the message buf.validate.Violation.\n * Use `create(ViolationSchema)` to create a new message.\n */\nexport const ViolationSchema: GenMessage<Violation, {validType: ViolationValid}> = /*@__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\nexport type FieldPathValid = FieldPath;\n\n/**\n * Describes the message buf.validate.FieldPath.\n * Use `create(FieldPathSchema)` to create a new message.\n */\nexport const FieldPathSchema: GenMessage<FieldPath, {validType: FieldPathValid}> = /*@__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\nexport type FieldPathElementValid = FieldPathElement;\n\n/**\n * Describes the message buf.validate.FieldPathElement.\n * Use `create(FieldPathElementSchema)` to create a new message.\n */\nexport const FieldPathElementSchema: GenMessage<FieldPathElement, {validType: FieldPathElementValid}> = /*@__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<Ignore> = /*@__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<KnownRegex> = /*@__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<MessageOptions, MessageRules> = /*@__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<OneofOptions, OneofRules> = /*@__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<FieldOptions, FieldRules> = /*@__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 [(buf.validate.predefined).cel = {\n * id: \"int32.is_zero\",\n * message: \"value 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<FieldOptions, PredefinedRules> = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 3);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/contact/v1/contact.proto (package fluxlay.contact.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_buf_validate_validate } from \"../../../buf/validate/validate_pb.ts\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/contact/v1/contact.proto.\n */\nexport const file_fluxlay_contact_v1_contact: GenFile = /*@__PURE__*/\n fileDesc(\"CiBmbHV4bGF5L2NvbnRhY3QvdjEvY29udGFjdC5wcm90bxISZmx1eGxheS5jb250YWN0LnYxIrUBChJTZW5kQ29udGFjdFJlcXVlc3QSPwoIY2F0ZWdvcnkYASABKA4yIy5mbHV4bGF5LmNvbnRhY3QudjEuQ29udGFjdENhdGVnb3J5Qgi6SAWCAQIgABIVCgRuYW1lGAIgASgJQge6SARyAhABEhYKBWVtYWlsGAMgASgJQge6SARyAmABEhgKB3N1YmplY3QYBCABKAlCB7pIBHICEAESFQoEYm9keRgFIAEoCUIHukgEcgIQASIVChNTZW5kQ29udGFjdFJlc3BvbnNlKsMCCg9Db250YWN0Q2F0ZWdvcnkSIAocQ09OVEFDVF9DQVRFR09SWV9VTlNQRUNJRklFRBAAEh8KG0NPTlRBQ1RfQ0FURUdPUllfQlVHX1JFUE9SVBABEiQKIENPTlRBQ1RfQ0FURUdPUllfRkVBVFVSRV9SRVFVRVNUEAISIgoeQ09OVEFDVF9DQVRFR09SWV9BQ0NPVU5UX0lTU1VFEAMSHgoaQ09OVEFDVF9DQVRFR09SWV9DT1BZUklHSFQQBBIaChZDT05UQUNUX0NBVEVHT1JZX09USEVSEAUSHAoYQ09OVEFDVF9DQVRFR09SWV9SRVZFTlVFEAYSIwofQ09OVEFDVF9DQVRFR09SWV9DT05URU5UX1JFVklFVxAHEiQKIENPTlRBQ1RfQ0FURUdPUllfQ1JFQVRPUl9QUk9HUkFNEAhC1QEKFmNvbS5mbHV4bGF5LmNvbnRhY3QudjFCDENvbnRhY3RQcm90b1ABWkNnaXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L2NvbnRhY3QvdjE7Y29udGFjdHYxogIDRkNYqgISRmx1eGxheS5Db250YWN0LlYxygISRmx1eGxheVxDb250YWN0XFYx4gIeRmx1eGxheVxDb250YWN0XFYxXEdQQk1ldGFkYXRh6gIURmx1eGxheTo6Q29udGFjdDo6VjFiBnByb3RvMw\", [file_buf_validate_validate]);\n\n/**\n * @generated from message fluxlay.contact.v1.SendContactRequest\n */\nexport type SendContactRequest = Message<\"fluxlay.contact.v1.SendContactRequest\"> & {\n /**\n * @generated from field: fluxlay.contact.v1.ContactCategory category = 1;\n */\n category: ContactCategory;\n\n /**\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: string email = 3;\n */\n email: string;\n\n /**\n * @generated from field: string subject = 4;\n */\n subject: string;\n\n /**\n * @generated from field: string body = 5;\n */\n body: string;\n};\n\nexport type SendContactRequestValid = SendContactRequest;\n\n/**\n * Describes the message fluxlay.contact.v1.SendContactRequest.\n * Use `create(SendContactRequestSchema)` to create a new message.\n */\nexport const SendContactRequestSchema: GenMessage<SendContactRequest, {validType: SendContactRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_contact_v1_contact, 0);\n\n/**\n * @generated from message fluxlay.contact.v1.SendContactResponse\n */\nexport type SendContactResponse = Message<\"fluxlay.contact.v1.SendContactResponse\"> & {\n};\n\nexport type SendContactResponseValid = SendContactResponse;\n\n/**\n * Describes the message fluxlay.contact.v1.SendContactResponse.\n * Use `create(SendContactResponseSchema)` to create a new message.\n */\nexport const SendContactResponseSchema: GenMessage<SendContactResponse, {validType: SendContactResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_contact_v1_contact, 1);\n\n/**\n * @generated from enum fluxlay.contact.v1.ContactCategory\n */\nexport enum ContactCategory {\n /**\n * @generated from enum value: CONTACT_CATEGORY_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_BUG_REPORT = 1;\n */\n BUG_REPORT = 1,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_FEATURE_REQUEST = 2;\n */\n FEATURE_REQUEST = 2,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_ACCOUNT_ISSUE = 3;\n */\n ACCOUNT_ISSUE = 3,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_COPYRIGHT = 4;\n */\n COPYRIGHT = 4,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_OTHER = 5;\n */\n OTHER = 5,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_REVENUE = 6;\n */\n REVENUE = 6,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_CONTENT_REVIEW = 7;\n */\n CONTENT_REVIEW = 7,\n\n /**\n * @generated from enum value: CONTACT_CATEGORY_CREATOR_PROGRAM = 8;\n */\n CREATOR_PROGRAM = 8,\n}\n\n/**\n * Describes the enum fluxlay.contact.v1.ContactCategory.\n */\nexport const ContactCategorySchema: GenEnum<ContactCategory> = /*@__PURE__*/\n enumDesc(file_fluxlay_contact_v1_contact, 0);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/moderation/v1/moderation.proto (package fluxlay.moderation.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_buf_validate_validate } from \"../../../buf/validate/validate_pb.ts\";\nimport type { Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/moderation/v1/moderation.proto.\n */\nexport const file_fluxlay_moderation_v1_moderation: GenFile = /*@__PURE__*/\n fileDesc(\"CiZmbHV4bGF5L21vZGVyYXRpb24vdjEvbW9kZXJhdGlvbi5wcm90bxIVZmx1eGxheS5tb2RlcmF0aW9uLnYxIqEBChBBaVJlY29tbWVuZGF0aW9uEjMKBmFjdGlvbhgBIAEoDjIjLmZsdXhsYXkubW9kZXJhdGlvbi52MS5SZXZpZXdBY3Rpb24SEwoLcmVhc29uX2NvZGUYAiABKAkSMwoGdGFyZ2V0GAMgASgOMiMuZmx1eGxheS5tb2RlcmF0aW9uLnYxLlJldmlld1RhcmdldBIOCgZyZWFzb24YBCABKAkijwIKDURlY2lzaW9uRW50cnkSJgoCYXQYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDWFjdG9yX3VzZXJfaWQYAiABKAkSDQoFZXZlbnQYAyABKAkSEgoFbW9kZWwYBCABKAlIAIgBARIbCg5wcm9tcHRfdmVyc2lvbhgFIAEoCUgBiAEBEhIKBXNjb3JlGAYgASgFSAKIAQESFgoJdGhyZXNob2xkGAcgASgFSAOIAQESEwoGZGV0YWlsGAggASgJSASIAQFCCAoGX21vZGVsQhEKD19wcm9tcHRfdmVyc2lvbkIICgZfc2NvcmVCDAoKX3RocmVzaG9sZEIJCgdfZGV0YWlsIoICCg1QcmV2aWV3U2lnbmFsEhIKCnByZXZpZXdfaWQYASABKAkSOgoFYWR1bHQYAiABKA4yKy5mbHV4bGF5Lm1vZGVyYXRpb24udjEuU2FmZVNlYXJjaExpa2VsaWhvb2QSOQoEcmFjeRgDIAEoDjIrLmZsdXhsYXkubW9kZXJhdGlvbi52MS5TYWZlU2VhcmNoTGlrZWxpaG9vZBITCgt3ZWJfbWF0Y2hlcxgEIAEoBRISCgptYXRjaF91cmxzGAUgAygJEhQKDHdlYl9lbnRpdGllcxgGIAMoCRIRCglpbWFnZV91cmwYByABKAkSFAoMY29udGVudF90eXBlGAggASgJIjQKEEV4dGVybmFsRW5kcG9pbnQSDgoGZG9tYWluGAEgASgJEhAKCGRlY2xhcmVkGAIgASgIImQKC0NvZGVTaWduYWxzEkMKEmV4dGVybmFsX2VuZHBvaW50cxgBIAMoCzInLmZsdXhsYXkubW9kZXJhdGlvbi52MS5FeHRlcm5hbEVuZHBvaW50EhAKCGZpbmRpbmdzGAIgAygJIkEKDlJldmlld01ldGFkYXRhEgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSDAoEdGFncxgDIAMoCSLPAQoGQXBwZWFsEgoKAmlkGAEgASgJEjMKBnN0YXR1cxgCIAEoDjIjLmZsdXhsYXkubW9kZXJhdGlvbi52MS5BcHBlYWxTdGF0dXMSDAoEYm9keRgDIAEoCRIwCgxzdWJtaXR0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjQKC3Jlc29sdmVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBQg4KDF9yZXNvbHZlZF9hdCJuCg5QcmlvclJlamVjdGlvbhIPCgd2ZXJzaW9uGAEgASgJEhMKC3JlYXNvbl9jb2RlGAIgASgJEg4KBnJlYXNvbhgDIAEoCRImCgJhdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAijgcKC1Jldmlld0V2ZW50EgoKAmlkGAEgASgJEhQKDHdhbGxwYXBlcl9pZBgCIAEoCRIWCg53YWxscGFwZXJfbmFtZRgDIAEoCRIWCg5jcmVhdG9yX2hhbmRsZRgEIAEoCRISCgp2ZXJzaW9uX2lkGAUgASgJEg8KB3ZlcnNpb24YBiABKAkSOgoKZXZlbnRfdHlwZRgHIAEoDjImLmZsdXhsYXkubW9kZXJhdGlvbi52MS5SZXZpZXdFdmVudFR5cGUSMwoGc3RhdHVzGAggASgOMiMuZmx1eGxheS5tb2RlcmF0aW9uLnYxLlJldmlld1N0YXR1cxIVCghhaV9zY29yZRgJIAEoBUgAiAEBEjMKAmFpGAogASgLMicuZmx1eGxheS5tb2RlcmF0aW9uLnYxLkFpUmVjb21tZW5kYXRpb24SMAoIYWlfc3RhdGUYCyABKA4yHi5mbHV4bGF5Lm1vZGVyYXRpb24udjEuQWlTdGF0ZRI3CghtZXRhZGF0YRgMIAEoCzIlLmZsdXhsYXkubW9kZXJhdGlvbi52MS5SZXZpZXdNZXRhZGF0YRISCgphc3NldF9pbmZvGA0gASgJEj0KD3ByZXZpZXdfc2lnbmFscxgOIAMoCzIkLmZsdXhsYXkubW9kZXJhdGlvbi52MS5QcmV2aWV3U2lnbmFsEjgKDGNvZGVfc2lnbmFscxgPIAEoCzIiLmZsdXhsYXkubW9kZXJhdGlvbi52MS5Db2RlU2lnbmFscxI6CgxkZWNpc2lvbl9sb2cYECADKAsyJC5mbHV4bGF5Lm1vZGVyYXRpb24udjEuRGVjaXNpb25FbnRyeRIyCgZhcHBlYWwYESABKAsyHS5mbHV4bGF5Lm1vZGVyYXRpb24udjEuQXBwZWFsSAGIAQESQwoPcHJpb3JfcmVqZWN0aW9uGBIgASgLMiUuZmx1eGxheS5tb2RlcmF0aW9uLnYxLlByaW9yUmVqZWN0aW9uSAKIAQESLgoKY3JlYXRlZF9hdBgTIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMwoKZGVjaWRlZF9hdBgUIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIA4gBAUILCglfYWlfc2NvcmVCCQoHX2FwcGVhbEISChBfcHJpb3JfcmVqZWN0aW9uQg0KC19kZWNpZGVkX2F0In0KFkxpc3RSZXZpZXdRdWV1ZVJlcXVlc3QSMwoGc3RhdHVzGAEgASgOMiMuZmx1eGxheS5tb2RlcmF0aW9uLnYxLlJldmlld1N0YXR1cxIaCglwYWdlX3NpemUYAiABKAVCB7pIBBoCIAASEgoKcGFnZV90b2tlbhgDIAEoCSKYAQoXTGlzdFJldmlld1F1ZXVlUmVzcG9uc2USMgoGZXZlbnRzGAEgAygLMiIuZmx1eGxheS5tb2RlcmF0aW9uLnYxLlJldmlld0V2ZW50EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRIVCg1wZW5kaW5nX2NvdW50GAMgASgFEhkKEW9wZW5fYXBwZWFsX2NvdW50GAQgASgFIigKEEdldFJldmlld1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBIkYKEUdldFJldmlld1Jlc3BvbnNlEjEKBWV2ZW50GAEgASgLMiIuZmx1eGxheS5tb2RlcmF0aW9uLnYxLlJldmlld0V2ZW50IsYBChNEZWNpZGVSZXZpZXdSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARI/CgZhY3Rpb24YAiABKA4yIy5mbHV4bGF5Lm1vZGVyYXRpb24udjEuUmV2aWV3QWN0aW9uQgq6SAeCAQQYARgCEhMKC3JlYXNvbl9jb2RlGAMgASgJEjMKBnRhcmdldBgEIAEoDjIjLmZsdXhsYXkubW9kZXJhdGlvbi52MS5SZXZpZXdUYXJnZXQSDgoGcmVhc29uGAUgASgJIkkKFERlY2lkZVJldmlld1Jlc3BvbnNlEjEKBWV2ZW50GAEgASgLMiIuZmx1eGxheS5tb2RlcmF0aW9uLnYxLlJldmlld0V2ZW50IkQKEkxpc3RBcHBlYWxzUmVxdWVzdBIaCglwYWdlX3NpemUYASABKAVCB7pIBBoCIAASEgoKcGFnZV90b2tlbhgCIAEoCSJiChNMaXN0QXBwZWFsc1Jlc3BvbnNlEjIKBmV2ZW50cxgBIAMoCzIiLmZsdXhsYXkubW9kZXJhdGlvbi52MS5SZXZpZXdFdmVudBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiSQoUUmVzb2x2ZUFwcGVhbFJlcXVlc3QSIQoPcmV2aWV3X2V2ZW50X2lkGAEgASgJQgi6SAVyA7ABARIOCgZhY2NlcHQYAiABKAgiSgoVUmVzb2x2ZUFwcGVhbFJlc3BvbnNlEjEKBWV2ZW50GAEgASgLMiIuZmx1eGxheS5tb2RlcmF0aW9uLnYxLlJldmlld0V2ZW50IlIKE1N1Ym1pdEFwcGVhbFJlcXVlc3QSIQoPcmV2aWV3X2V2ZW50X2lkGAEgASgJQgi6SAVyA7ABARIYCgRib2R5GAIgASgJQgq6SAdyBRABGNAPIhYKFFN1Ym1pdEFwcGVhbFJlc3BvbnNlKqgBCg9SZXZpZXdFdmVudFR5cGUSIQodUkVWSUVXX0VWRU5UX1RZUEVfVU5TUEVDSUZJRUQQABIlCiFSRVZJRVdfRVZFTlRfVFlQRV9JTklUSUFMX1BVQkxJU0gQARIkCiBSRVZJRVdfRVZFTlRfVFlQRV9WRVJTSU9OX1VQREFURRACEiUKIVJFVklFV19FVkVOVF9UWVBFX01FVEFEQVRBX1VQREFURRADKqEBCgxSZXZpZXdTdGF0dXMSHQoZUkVWSUVXX1NUQVRVU19VTlNQRUNJRklFRBAAEhkKFVJFVklFV19TVEFUVVNfUEVORElORxABEhoKFlJFVklFV19TVEFUVVNfQVBQUk9WRUQQAhIfChtSRVZJRVdfU1RBVFVTX0FVVE9fQVBQUk9WRUQQAxIaChZSRVZJRVdfU1RBVFVTX1JFSkVDVEVEEAQqYgoMUmV2aWV3QWN0aW9uEh0KGVJFVklFV19BQ1RJT05fVU5TUEVDSUZJRUQQABIZChVSRVZJRVdfQUNUSU9OX0FQUFJPVkUQARIYChRSRVZJRVdfQUNUSU9OX1JFSkVDVBACKmQKDFJldmlld1RhcmdldBIdChlSRVZJRVdfVEFSR0VUX1VOU1BFQ0lGSUVEEAASGgoWUkVWSUVXX1RBUkdFVF9NRVRBREFUQRABEhkKFVJFVklFV19UQVJHRVRfVkVSU0lPThACKkkKB0FpU3RhdGUSGAoUQUlfU1RBVEVfVU5TUEVDSUZJRUQQABIPCgtBSV9TVEFURV9PSxABEhMKD0FJX1NUQVRFX0ZBSUxFRBACKn0KDEFwcGVhbFN0YXR1cxIdChlBUFBFQUxfU1RBVFVTX1VOU1BFQ0lGSUVEEAASFgoSQVBQRUFMX1NUQVRVU19PUEVOEAESGgoWQVBQRUFMX1NUQVRVU19BQ0NFUFRFRBACEhoKFkFQUEVBTF9TVEFUVVNfUkVKRUNURUQQAyr9AQoUU2FmZVNlYXJjaExpa2VsaWhvb2QSJgoiU0FGRV9TRUFSQ0hfTElLRUxJSE9PRF9VTlNQRUNJRklFRBAAEigKJFNBRkVfU0VBUkNIX0xJS0VMSUhPT0RfVkVSWV9VTkxJS0VMWRABEiMKH1NBRkVfU0VBUkNIX0xJS0VMSUhPT0RfVU5MSUtFTFkQAhIjCh9TQUZFX1NFQVJDSF9MSUtFTElIT09EX1BPU1NJQkxFEAMSIQodU0FGRV9TRUFSQ0hfTElLRUxJSE9PRF9MSUtFTFkQBBImCiJTQUZFX1NFQVJDSF9MSUtFTElIT09EX1ZFUllfTElLRUxZEAVC7QEKGWNvbS5mbHV4bGF5Lm1vZGVyYXRpb24udjFCD01vZGVyYXRpb25Qcm90b1ABWklnaXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L21vZGVyYXRpb24vdjE7bW9kZXJhdGlvbnYxogIDRk1YqgIVRmx1eGxheS5Nb2RlcmF0aW9uLlYxygIVRmx1eGxheVxNb2RlcmF0aW9uXFYx4gIhRmx1eGxheVxNb2RlcmF0aW9uXFYxXEdQQk1ldGFkYXRh6gIXRmx1eGxheTo6TW9kZXJhdGlvbjo6VjFiBnByb3RvMw\", [file_buf_validate_validate, file_google_protobuf_timestamp]);\n\n/**\n * AI の判定起案。却下推奨の場合は理由コード・対象リソース・理由文までプリフィルされ、\n * 管理者は確認して確定するだけ。\n *\n * @generated from message fluxlay.moderation.v1.AiRecommendation\n */\nexport type AiRecommendation = Message<\"fluxlay.moderation.v1.AiRecommendation\"> & {\n /**\n * @generated from field: fluxlay.moderation.v1.ReviewAction action = 1;\n */\n action: ReviewAction;\n\n /**\n * @generated from field: string reason_code = 2;\n */\n reasonCode: string;\n\n /**\n * @generated from field: fluxlay.moderation.v1.ReviewTarget target = 3;\n */\n target: ReviewTarget;\n\n /**\n * @generated from field: string reason = 4;\n */\n reason: string;\n};\n\nexport type AiRecommendationValid = AiRecommendation;\n\n/**\n * Describes the message fluxlay.moderation.v1.AiRecommendation.\n * Use `create(AiRecommendationSchema)` to create a new message.\n */\nexport const AiRecommendationSchema: GenMessage<AiRecommendation, {validType: AiRecommendationValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 0);\n\n/**\n * 判定スナップショット(監査ログ 1 行)。追記専用。\n *\n * @generated from message fluxlay.moderation.v1.DecisionEntry\n */\nexport type DecisionEntry = Message<\"fluxlay.moderation.v1.DecisionEntry\"> & {\n /**\n * @generated from field: google.protobuf.Timestamp at = 1;\n */\n at?: Timestamp | undefined;\n\n /**\n * 実行主体の管理者ユーザー ID。空 = AI 自動 / システム\n *\n * @generated from field: string actor_user_id = 2;\n */\n actorUserId: string;\n\n /**\n * 何が起きたか(AI 起案 / 自動却下 / 管理者が確定 / appeal 受理 など)\n *\n * @generated from field: string event = 3;\n */\n event: string;\n\n /**\n * AI が関与した行のみ\n *\n * @generated from field: optional string model = 4;\n */\n model?: string | undefined;\n\n /**\n * @generated from field: optional string prompt_version = 5;\n */\n promptVersion?: string | undefined;\n\n /**\n * @generated from field: optional int32 score = 6;\n */\n score?: number | undefined;\n\n /**\n * @generated from field: optional int32 threshold = 7;\n */\n threshold?: number | undefined;\n\n /**\n * @generated from field: optional string detail = 8;\n */\n detail?: string | undefined;\n};\n\nexport type DecisionEntryValid = DecisionEntry;\n\n/**\n * Describes the message fluxlay.moderation.v1.DecisionEntry.\n * Use `create(DecisionEntrySchema)` to create a new message.\n */\nexport const DecisionEntrySchema: GenMessage<DecisionEntry, {validType: DecisionEntryValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 1);\n\n/**\n * プレビューごとの機械シグナル(Cloud Vision SafeSearch + WebDetection)。\n *\n * @generated from message fluxlay.moderation.v1.PreviewSignal\n */\nexport type PreviewSignal = Message<\"fluxlay.moderation.v1.PreviewSignal\"> & {\n /**\n * @generated from field: string preview_id = 1;\n */\n previewId: string;\n\n /**\n * @generated from field: fluxlay.moderation.v1.SafeSearchLikelihood adult = 2;\n */\n adult: SafeSearchLikelihood;\n\n /**\n * @generated from field: fluxlay.moderation.v1.SafeSearchLikelihood racy = 3;\n */\n racy: SafeSearchLikelihood;\n\n /**\n * ウェブ上の完全一致画像数。> 0 は転載の可能性(自動却下のトリガーにはしない)\n *\n * @generated from field: int32 web_matches = 4;\n */\n webMatches: number;\n\n /**\n * @generated from field: repeated string match_urls = 5;\n */\n matchUrls: string[];\n\n /**\n * @generated from field: repeated string web_entities = 6;\n */\n webEntities: string[];\n\n /**\n * 審査者が中身を確認するためのプレビュー実体(公開 R2 URL)と MIME。\n * content_type が video/* の場合はクライアントで <video>、それ以外は <img> で表示する。\n *\n * @generated from field: string image_url = 7;\n */\n imageUrl: string;\n\n /**\n * @generated from field: string content_type = 8;\n */\n contentType: string;\n};\n\nexport type PreviewSignalValid = PreviewSignal;\n\n/**\n * Describes the message fluxlay.moderation.v1.PreviewSignal.\n * Use `create(PreviewSignalSchema)` to create a new message.\n */\nexport const PreviewSignalSchema: GenMessage<PreviewSignal, {validType: PreviewSignalValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 2);\n\n/**\n * コード静的解析で検出した外部通信先と fluxlay.yaml の network[] 宣言の突き合わせ。\n *\n * @generated from message fluxlay.moderation.v1.ExternalEndpoint\n */\nexport type ExternalEndpoint = Message<\"fluxlay.moderation.v1.ExternalEndpoint\"> & {\n /**\n * @generated from field: string domain = 1;\n */\n domain: string;\n\n /**\n * @generated from field: bool declared = 2;\n */\n declared: boolean;\n};\n\nexport type ExternalEndpointValid = ExternalEndpoint;\n\n/**\n * Describes the message fluxlay.moderation.v1.ExternalEndpoint.\n * Use `create(ExternalEndpointSchema)` to create a new message.\n */\nexport const ExternalEndpointSchema: GenMessage<ExternalEndpoint, {validType: ExternalEndpointValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 3);\n\n/**\n * コードの静的解析シグナル(審査 AI への入力と同じものを管理者にも見せる)。\n *\n * @generated from message fluxlay.moderation.v1.CodeSignals\n */\nexport type CodeSignals = Message<\"fluxlay.moderation.v1.CodeSignals\"> & {\n /**\n * @generated from field: repeated fluxlay.moderation.v1.ExternalEndpoint external_endpoints = 1;\n */\n externalEndpoints: ExternalEndpoint[];\n\n /**\n * @generated from field: repeated string findings = 2;\n */\n findings: string[];\n};\n\nexport type CodeSignalsValid = CodeSignals;\n\n/**\n * Describes the message fluxlay.moderation.v1.CodeSignals.\n * Use `create(CodeSignalsSchema)` to create a new message.\n */\nexport const CodeSignalsSchema: GenMessage<CodeSignals, {validType: CodeSignalsValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 4);\n\n/**\n * 審査対象スナップショットのメタデータ。\n *\n * @generated from message fluxlay.moderation.v1.ReviewMetadata\n */\nexport type ReviewMetadata = Message<\"fluxlay.moderation.v1.ReviewMetadata\"> & {\n /**\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * @generated from field: string description = 2;\n */\n description: string;\n\n /**\n * @generated from field: repeated string tags = 3;\n */\n tags: string[];\n};\n\nexport type ReviewMetadataValid = ReviewMetadata;\n\n/**\n * Describes the message fluxlay.moderation.v1.ReviewMetadata.\n * Use `create(ReviewMetadataSchema)` to create a new message.\n */\nexport const ReviewMetadataSchema: GenMessage<ReviewMetadata, {validType: ReviewMetadataValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 5);\n\n/**\n * 異議申し立て。1 審査イベントにつき 1 回。\n *\n * @generated from message fluxlay.moderation.v1.Appeal\n */\nexport type Appeal = Message<\"fluxlay.moderation.v1.Appeal\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: fluxlay.moderation.v1.AppealStatus status = 2;\n */\n status: AppealStatus;\n\n /**\n * @generated from field: string body = 3;\n */\n body: string;\n\n /**\n * @generated from field: google.protobuf.Timestamp submitted_at = 4;\n */\n submittedAt?: Timestamp | undefined;\n\n /**\n * @generated from field: optional google.protobuf.Timestamp resolved_at = 5;\n */\n resolvedAt?: Timestamp | undefined;\n};\n\nexport type AppealValid = Appeal;\n\n/**\n * Describes the message fluxlay.moderation.v1.Appeal.\n * Use `create(AppealSchema)` to create a new message.\n */\nexport const AppealSchema: GenMessage<Appeal, {validType: AppealValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 6);\n\n/**\n * 再提出検知: 同じ壁紙が直近で却下されたときの情報(再審査時に突き合わせる)。\n *\n * @generated from message fluxlay.moderation.v1.PriorRejection\n */\nexport type PriorRejection = Message<\"fluxlay.moderation.v1.PriorRejection\"> & {\n /**\n * @generated from field: string version = 1;\n */\n version: string;\n\n /**\n * @generated from field: string reason_code = 2;\n */\n reasonCode: string;\n\n /**\n * @generated from field: string reason = 3;\n */\n reason: string;\n\n /**\n * @generated from field: google.protobuf.Timestamp at = 4;\n */\n at?: Timestamp | undefined;\n};\n\nexport type PriorRejectionValid = PriorRejection;\n\n/**\n * Describes the message fluxlay.moderation.v1.PriorRejection.\n * Use `create(PriorRejectionSchema)` to create a new message.\n */\nexport const PriorRejectionSchema: GenMessage<PriorRejection, {validType: PriorRejectionValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 7);\n\n/**\n * 審査イベント(キュー項目 + 詳細)。\n *\n * @generated from message fluxlay.moderation.v1.ReviewEvent\n */\nexport type ReviewEvent = Message<\"fluxlay.moderation.v1.ReviewEvent\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: string wallpaper_id = 2;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: string wallpaper_name = 3;\n */\n wallpaperName: string;\n\n /**\n * 投稿者の表示用情報\n *\n * @generated from field: string creator_handle = 4;\n */\n creatorHandle: string;\n\n /**\n * 審査対象バージョン。metadata_update の場合は空\n *\n * @generated from field: string version_id = 5;\n */\n versionId: string;\n\n /**\n * @generated from field: string version = 6;\n */\n version: string;\n\n /**\n * @generated from field: fluxlay.moderation.v1.ReviewEventType event_type = 7;\n */\n eventType: ReviewEventType;\n\n /**\n * @generated from field: fluxlay.moderation.v1.ReviewStatus status = 8;\n */\n status: ReviewStatus;\n\n /**\n * AI リスクスコア (0-100)。未評価時は未設定。キューはこの降順で表示する\n *\n * @generated from field: optional int32 ai_score = 9;\n */\n aiScore?: number | undefined;\n\n /**\n * @generated from field: fluxlay.moderation.v1.AiRecommendation ai = 10;\n */\n ai?: AiRecommendation | undefined;\n\n /**\n * @generated from field: fluxlay.moderation.v1.AiState ai_state = 11;\n */\n aiState: AiState;\n\n /**\n * @generated from field: fluxlay.moderation.v1.ReviewMetadata metadata = 12;\n */\n metadata?: ReviewMetadata | undefined;\n\n /**\n * 実測アセット情報(宣言との突き合わせ用)\n *\n * @generated from field: string asset_info = 13;\n */\n assetInfo: string;\n\n /**\n * @generated from field: repeated fluxlay.moderation.v1.PreviewSignal preview_signals = 14;\n */\n previewSignals: PreviewSignal[];\n\n /**\n * @generated from field: fluxlay.moderation.v1.CodeSignals code_signals = 15;\n */\n codeSignals?: CodeSignals | undefined;\n\n /**\n * @generated from field: repeated fluxlay.moderation.v1.DecisionEntry decision_log = 16;\n */\n decisionLog: DecisionEntry[];\n\n /**\n * @generated from field: optional fluxlay.moderation.v1.Appeal appeal = 17;\n */\n appeal?: Appeal | undefined;\n\n /**\n * @generated from field: optional fluxlay.moderation.v1.PriorRejection prior_rejection = 18;\n */\n priorRejection?: PriorRejection | undefined;\n\n /**\n * @generated from field: google.protobuf.Timestamp created_at = 19;\n */\n createdAt?: Timestamp | undefined;\n\n /**\n * @generated from field: optional google.protobuf.Timestamp decided_at = 20;\n */\n decidedAt?: Timestamp | undefined;\n};\n\nexport type ReviewEventValid = ReviewEvent;\n\n/**\n * Describes the message fluxlay.moderation.v1.ReviewEvent.\n * Use `create(ReviewEventSchema)` to create a new message.\n */\nexport const ReviewEventSchema: GenMessage<ReviewEvent, {validType: ReviewEventValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 8);\n\n/**\n * @generated from message fluxlay.moderation.v1.ListReviewQueueRequest\n */\nexport type ListReviewQueueRequest = Message<\"fluxlay.moderation.v1.ListReviewQueueRequest\"> & {\n /**\n * 未指定(UNSPECIFIED)は pending のみを返す\n *\n * @generated from field: fluxlay.moderation.v1.ReviewStatus status = 1;\n */\n status: ReviewStatus;\n\n /**\n * @generated from field: int32 page_size = 2;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 3;\n */\n pageToken: string;\n};\n\nexport type ListReviewQueueRequestValid = ListReviewQueueRequest;\n\n/**\n * Describes the message fluxlay.moderation.v1.ListReviewQueueRequest.\n * Use `create(ListReviewQueueRequestSchema)` to create a new message.\n */\nexport const ListReviewQueueRequestSchema: GenMessage<ListReviewQueueRequest, {validType: ListReviewQueueRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 9);\n\n/**\n * @generated from message fluxlay.moderation.v1.ListReviewQueueResponse\n */\nexport type ListReviewQueueResponse = Message<\"fluxlay.moderation.v1.ListReviewQueueResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.moderation.v1.ReviewEvent events = 1;\n */\n events: ReviewEvent[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n\n /**\n * ヘッダーバッジ用の未対応件数\n *\n * @generated from field: int32 pending_count = 3;\n */\n pendingCount: number;\n\n /**\n * appeal の審査待ち件数(最優先で人手レビューする)\n *\n * @generated from field: int32 open_appeal_count = 4;\n */\n openAppealCount: number;\n};\n\nexport type ListReviewQueueResponseValid = ListReviewQueueResponse;\n\n/**\n * Describes the message fluxlay.moderation.v1.ListReviewQueueResponse.\n * Use `create(ListReviewQueueResponseSchema)` to create a new message.\n */\nexport const ListReviewQueueResponseSchema: GenMessage<ListReviewQueueResponse, {validType: ListReviewQueueResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 10);\n\n/**\n * @generated from message fluxlay.moderation.v1.GetReviewRequest\n */\nexport type GetReviewRequest = Message<\"fluxlay.moderation.v1.GetReviewRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n};\n\nexport type GetReviewRequestValid = GetReviewRequest;\n\n/**\n * Describes the message fluxlay.moderation.v1.GetReviewRequest.\n * Use `create(GetReviewRequestSchema)` to create a new message.\n */\nexport const GetReviewRequestSchema: GenMessage<GetReviewRequest, {validType: GetReviewRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 11);\n\n/**\n * @generated from message fluxlay.moderation.v1.GetReviewResponse\n */\nexport type GetReviewResponse = Message<\"fluxlay.moderation.v1.GetReviewResponse\"> & {\n /**\n * @generated from field: fluxlay.moderation.v1.ReviewEvent event = 1;\n */\n event?: ReviewEvent | undefined;\n};\n\nexport type GetReviewResponseValid = GetReviewResponse;\n\n/**\n * Describes the message fluxlay.moderation.v1.GetReviewResponse.\n * Use `create(GetReviewResponseSchema)` to create a new message.\n */\nexport const GetReviewResponseSchema: GenMessage<GetReviewResponse, {validType: GetReviewResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 12);\n\n/**\n * @generated from message fluxlay.moderation.v1.DecideReviewRequest\n */\nexport type DecideReviewRequest = Message<\"fluxlay.moderation.v1.DecideReviewRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: fluxlay.moderation.v1.ReviewAction action = 2;\n */\n action: ReviewAction;\n\n /**\n * reject の場合のみ必須。AI 起案を編集して確定できる\n *\n * @generated from field: string reason_code = 3;\n */\n reasonCode: string;\n\n /**\n * @generated from field: fluxlay.moderation.v1.ReviewTarget target = 4;\n */\n target: ReviewTarget;\n\n /**\n * @generated from field: string reason = 5;\n */\n reason: string;\n};\n\nexport type DecideReviewRequestValid = DecideReviewRequest;\n\n/**\n * Describes the message fluxlay.moderation.v1.DecideReviewRequest.\n * Use `create(DecideReviewRequestSchema)` to create a new message.\n */\nexport const DecideReviewRequestSchema: GenMessage<DecideReviewRequest, {validType: DecideReviewRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 13);\n\n/**\n * @generated from message fluxlay.moderation.v1.DecideReviewResponse\n */\nexport type DecideReviewResponse = Message<\"fluxlay.moderation.v1.DecideReviewResponse\"> & {\n /**\n * @generated from field: fluxlay.moderation.v1.ReviewEvent event = 1;\n */\n event?: ReviewEvent | undefined;\n};\n\nexport type DecideReviewResponseValid = DecideReviewResponse;\n\n/**\n * Describes the message fluxlay.moderation.v1.DecideReviewResponse.\n * Use `create(DecideReviewResponseSchema)` to create a new message.\n */\nexport const DecideReviewResponseSchema: GenMessage<DecideReviewResponse, {validType: DecideReviewResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 14);\n\n/**\n * @generated from message fluxlay.moderation.v1.ListAppealsRequest\n */\nexport type ListAppealsRequest = Message<\"fluxlay.moderation.v1.ListAppealsRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n};\n\nexport type ListAppealsRequestValid = ListAppealsRequest;\n\n/**\n * Describes the message fluxlay.moderation.v1.ListAppealsRequest.\n * Use `create(ListAppealsRequestSchema)` to create a new message.\n */\nexport const ListAppealsRequestSchema: GenMessage<ListAppealsRequest, {validType: ListAppealsRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 15);\n\n/**\n * @generated from message fluxlay.moderation.v1.ListAppealsResponse\n */\nexport type ListAppealsResponse = Message<\"fluxlay.moderation.v1.ListAppealsResponse\"> & {\n /**\n * appeal が open の審査イベント(appeal フィールドつき)\n *\n * @generated from field: repeated fluxlay.moderation.v1.ReviewEvent events = 1;\n */\n events: ReviewEvent[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n};\n\nexport type ListAppealsResponseValid = ListAppealsResponse;\n\n/**\n * Describes the message fluxlay.moderation.v1.ListAppealsResponse.\n * Use `create(ListAppealsResponseSchema)` to create a new message.\n */\nexport const ListAppealsResponseSchema: GenMessage<ListAppealsResponse, {validType: ListAppealsResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 16);\n\n/**\n * @generated from message fluxlay.moderation.v1.ResolveAppealRequest\n */\nexport type ResolveAppealRequest = Message<\"fluxlay.moderation.v1.ResolveAppealRequest\"> & {\n /**\n * @generated from field: string review_event_id = 1;\n */\n reviewEventId: string;\n\n /**\n * true = 受理(判定取消・公開復帰)、false = 却下(判定維持)\n *\n * @generated from field: bool accept = 2;\n */\n accept: boolean;\n};\n\nexport type ResolveAppealRequestValid = ResolveAppealRequest;\n\n/**\n * Describes the message fluxlay.moderation.v1.ResolveAppealRequest.\n * Use `create(ResolveAppealRequestSchema)` to create a new message.\n */\nexport const ResolveAppealRequestSchema: GenMessage<ResolveAppealRequest, {validType: ResolveAppealRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 17);\n\n/**\n * @generated from message fluxlay.moderation.v1.ResolveAppealResponse\n */\nexport type ResolveAppealResponse = Message<\"fluxlay.moderation.v1.ResolveAppealResponse\"> & {\n /**\n * @generated from field: fluxlay.moderation.v1.ReviewEvent event = 1;\n */\n event?: ReviewEvent | undefined;\n};\n\nexport type ResolveAppealResponseValid = ResolveAppealResponse;\n\n/**\n * Describes the message fluxlay.moderation.v1.ResolveAppealResponse.\n * Use `create(ResolveAppealResponseSchema)` to create a new message.\n */\nexport const ResolveAppealResponseSchema: GenMessage<ResolveAppealResponse, {validType: ResolveAppealResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 18);\n\n/**\n * @generated from message fluxlay.moderation.v1.SubmitAppealRequest\n */\nexport type SubmitAppealRequest = Message<\"fluxlay.moderation.v1.SubmitAppealRequest\"> & {\n /**\n * @generated from field: string review_event_id = 1;\n */\n reviewEventId: string;\n\n /**\n * @generated from field: string body = 2;\n */\n body: string;\n};\n\nexport type SubmitAppealRequestValid = SubmitAppealRequest;\n\n/**\n * Describes the message fluxlay.moderation.v1.SubmitAppealRequest.\n * Use `create(SubmitAppealRequestSchema)` to create a new message.\n */\nexport const SubmitAppealRequestSchema: GenMessage<SubmitAppealRequest, {validType: SubmitAppealRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 19);\n\n/**\n * @generated from message fluxlay.moderation.v1.SubmitAppealResponse\n */\nexport type SubmitAppealResponse = Message<\"fluxlay.moderation.v1.SubmitAppealResponse\"> & {\n};\n\nexport type SubmitAppealResponseValid = SubmitAppealResponse;\n\n/**\n * Describes the message fluxlay.moderation.v1.SubmitAppealResponse.\n * Use `create(SubmitAppealResponseSchema)` to create a new message.\n */\nexport const SubmitAppealResponseSchema: GenMessage<SubmitAppealResponse, {validType: SubmitAppealResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_moderation_v1_moderation, 20);\n\n/**\n * 審査イベントの種別。壁紙の全変更イベントが審査対象になる。\n *\n * @generated from enum fluxlay.moderation.v1.ReviewEventType\n */\nexport enum ReviewEventType {\n /**\n * @generated from enum value: REVIEW_EVENT_TYPE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: REVIEW_EVENT_TYPE_INITIAL_PUBLISH = 1;\n */\n INITIAL_PUBLISH = 1,\n\n /**\n * @generated from enum value: REVIEW_EVENT_TYPE_VERSION_UPDATE = 2;\n */\n VERSION_UPDATE = 2,\n\n /**\n * @generated from enum value: REVIEW_EVENT_TYPE_METADATA_UPDATE = 3;\n */\n METADATA_UPDATE = 3,\n}\n\n/**\n * Describes the enum fluxlay.moderation.v1.ReviewEventType.\n */\nexport const ReviewEventTypeSchema: GenEnum<ReviewEventType> = /*@__PURE__*/\n enumDesc(file_fluxlay_moderation_v1_moderation, 0);\n\n/**\n * 審査イベントの確定状態。pending は「未評価」と「人手キュー在中」の両方を表す\n * (AI 評価済みかは ai_state で判別する)。\n *\n * @generated from enum fluxlay.moderation.v1.ReviewStatus\n */\nexport enum ReviewStatus {\n /**\n * @generated from enum value: REVIEW_STATUS_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: REVIEW_STATUS_PENDING = 1;\n */\n PENDING = 1,\n\n /**\n * @generated from enum value: REVIEW_STATUS_APPROVED = 2;\n */\n APPROVED = 2,\n\n /**\n * @generated from enum value: REVIEW_STATUS_AUTO_APPROVED = 3;\n */\n AUTO_APPROVED = 3,\n\n /**\n * @generated from enum value: REVIEW_STATUS_REJECTED = 4;\n */\n REJECTED = 4,\n}\n\n/**\n * Describes the enum fluxlay.moderation.v1.ReviewStatus.\n */\nexport const ReviewStatusSchema: GenEnum<ReviewStatus> = /*@__PURE__*/\n enumDesc(file_fluxlay_moderation_v1_moderation, 1);\n\n/**\n * AI の判定起案・人手確定のアクション。\n *\n * @generated from enum fluxlay.moderation.v1.ReviewAction\n */\nexport enum ReviewAction {\n /**\n * @generated from enum value: REVIEW_ACTION_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: REVIEW_ACTION_APPROVE = 1;\n */\n APPROVE = 1,\n\n /**\n * @generated from enum value: REVIEW_ACTION_REJECT = 2;\n */\n REJECT = 2,\n}\n\n/**\n * Describes the enum fluxlay.moderation.v1.ReviewAction.\n */\nexport const ReviewActionSchema: GenEnum<ReviewAction> = /*@__PURE__*/\n enumDesc(file_fluxlay_moderation_v1_moderation, 2);\n\n/**\n * 却下理由の対象リソース。却下はこのリソースに紐付き、該当リソースの更新で再審査される。\n *\n * @generated from enum fluxlay.moderation.v1.ReviewTarget\n */\nexport enum ReviewTarget {\n /**\n * @generated from enum value: REVIEW_TARGET_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: REVIEW_TARGET_METADATA = 1;\n */\n METADATA = 1,\n\n /**\n * @generated from enum value: REVIEW_TARGET_VERSION = 2;\n */\n VERSION = 2,\n}\n\n/**\n * Describes the enum fluxlay.moderation.v1.ReviewTarget.\n */\nexport const ReviewTargetSchema: GenEnum<ReviewTarget> = /*@__PURE__*/\n enumDesc(file_fluxlay_moderation_v1_moderation, 3);\n\n/**\n * AI 評価の実行状態。FAILED はリトライ上限超過で人手フォールバックした状態(自動アクションなし)。\n *\n * @generated from enum fluxlay.moderation.v1.AiState\n */\nexport enum AiState {\n /**\n * @generated from enum value: AI_STATE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: AI_STATE_OK = 1;\n */\n OK = 1,\n\n /**\n * @generated from enum value: AI_STATE_FAILED = 2;\n */\n FAILED = 2,\n}\n\n/**\n * Describes the enum fluxlay.moderation.v1.AiState.\n */\nexport const AiStateSchema: GenEnum<AiState> = /*@__PURE__*/\n enumDesc(file_fluxlay_moderation_v1_moderation, 4);\n\n/**\n * 異議申し立ての状態。\n *\n * @generated from enum fluxlay.moderation.v1.AppealStatus\n */\nexport enum AppealStatus {\n /**\n * @generated from enum value: APPEAL_STATUS_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: APPEAL_STATUS_OPEN = 1;\n */\n OPEN = 1,\n\n /**\n * @generated from enum value: APPEAL_STATUS_ACCEPTED = 2;\n */\n ACCEPTED = 2,\n\n /**\n * @generated from enum value: APPEAL_STATUS_REJECTED = 3;\n */\n REJECTED = 3,\n}\n\n/**\n * Describes the enum fluxlay.moderation.v1.AppealStatus.\n */\nexport const AppealStatusSchema: GenEnum<AppealStatus> = /*@__PURE__*/\n enumDesc(file_fluxlay_moderation_v1_moderation, 5);\n\n/**\n * Cloud Vision SafeSearch の尤度。\n *\n * @generated from enum fluxlay.moderation.v1.SafeSearchLikelihood\n */\nexport enum SafeSearchLikelihood {\n /**\n * @generated from enum value: SAFE_SEARCH_LIKELIHOOD_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: SAFE_SEARCH_LIKELIHOOD_VERY_UNLIKELY = 1;\n */\n VERY_UNLIKELY = 1,\n\n /**\n * @generated from enum value: SAFE_SEARCH_LIKELIHOOD_UNLIKELY = 2;\n */\n UNLIKELY = 2,\n\n /**\n * @generated from enum value: SAFE_SEARCH_LIKELIHOOD_POSSIBLE = 3;\n */\n POSSIBLE = 3,\n\n /**\n * @generated from enum value: SAFE_SEARCH_LIKELIHOOD_LIKELY = 4;\n */\n LIKELY = 4,\n\n /**\n * @generated from enum value: SAFE_SEARCH_LIKELIHOOD_VERY_LIKELY = 5;\n */\n VERY_LIKELY = 5,\n}\n\n/**\n * Describes the enum fluxlay.moderation.v1.SafeSearchLikelihood.\n */\nexport const SafeSearchLikelihoodSchema: GenEnum<SafeSearchLikelihood> = /*@__PURE__*/\n enumDesc(file_fluxlay_moderation_v1_moderation, 6);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/notification/v1/notification.proto (package fluxlay.notification.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../buf/validate/validate_pb.ts\";\nimport type { Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/notification/v1/notification.proto.\n */\nexport const file_fluxlay_notification_v1_notification: GenFile = /*@__PURE__*/\n fileDesc(\"CipmbHV4bGF5L25vdGlmaWNhdGlvbi92MS9ub3RpZmljYXRpb24ucHJvdG8SF2ZsdXhsYXkubm90aWZpY2F0aW9uLnYxIncKDE5vdGlmaWNhdGlvbhIKCgJpZBgBIAEoCRIMCgRraW5kGAIgASgJEg8KB3BheWxvYWQYAyABKAkSDAoEcmVhZBgEIAEoCBIuCgpjcmVhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJMChhMaXN0Tm90aWZpY2F0aW9uc1JlcXVlc3QSHAoJcGFnZV9zaXplGAEgASgFQgm6SAYaBBhkKAASEgoKcGFnZV90b2tlbhgCIAEoCSJyChlMaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlEjwKDW5vdGlmaWNhdGlvbnMYASADKAsyJS5mbHV4bGF5Lm5vdGlmaWNhdGlvbi52MS5Ob3RpZmljYXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIiMKIUdldFVucmVhZE5vdGlmaWNhdGlvbkNvdW50UmVxdWVzdCIzCiJHZXRVbnJlYWROb3RpZmljYXRpb25Db3VudFJlc3BvbnNlEg0KBWNvdW50GAEgASgFIkAKG01hcmtOb3RpZmljYXRpb25SZWFkUmVxdWVzdBIhCg9ub3RpZmljYXRpb25faWQYASABKAlCCLpIBXIDsAEBIh4KHE1hcmtOb3RpZmljYXRpb25SZWFkUmVzcG9uc2UiIQofTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdCIiCiBNYXJrQWxsTm90aWZpY2F0aW9uc1JlYWRSZXNwb25zZUL9AQobY29tLmZsdXhsYXkubm90aWZpY2F0aW9uLnYxQhFOb3RpZmljYXRpb25Qcm90b1ABWk1naXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L25vdGlmaWNhdGlvbi92MTtub3RpZmljYXRpb252MaICA0ZOWKoCF0ZsdXhsYXkuTm90aWZpY2F0aW9uLlYxygIXRmx1eGxheVxOb3RpZmljYXRpb25cVjHiAiNGbHV4bGF5XE5vdGlmaWNhdGlvblxWMVxHUEJNZXRhZGF0YeoCGUZsdXhsYXk6Ok5vdGlmaWNhdGlvbjo6VjFiBnByb3RvMw\", [file_buf_validate_validate, file_google_protobuf_timestamp]);\n\n/**\n * アプリ内通知(FLX-112)。\n * 通知の文言はサーバーで持たず、kind + payload からクライアントが i18n レンダリングする。\n *\n * @generated from message fluxlay.notification.v1.Notification\n */\nexport type Notification = Message<\"fluxlay.notification.v1.Notification\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * 通知種別(例: thread_reply, review_rejected)。種別は API 側の定義で追加していく\n *\n * @generated from field: string kind = 2;\n */\n kind: string;\n\n /**\n * kind ごとの内容(参照リソース ID・件数等)の JSON 文字列\n *\n * @generated from field: string payload = 3;\n */\n payload: string;\n\n /**\n * @generated from field: bool read = 4;\n */\n read: boolean;\n\n /**\n * @generated from field: google.protobuf.Timestamp created_at = 5;\n */\n createdAt?: Timestamp | undefined;\n};\n\nexport type NotificationValid = Notification;\n\n/**\n * Describes the message fluxlay.notification.v1.Notification.\n * Use `create(NotificationSchema)` to create a new message.\n */\nexport const NotificationSchema: GenMessage<Notification, {validType: NotificationValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 0);\n\n/**\n * @generated from message fluxlay.notification.v1.ListNotificationsRequest\n */\nexport type ListNotificationsRequest = Message<\"fluxlay.notification.v1.ListNotificationsRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n};\n\nexport type ListNotificationsRequestValid = ListNotificationsRequest;\n\n/**\n * Describes the message fluxlay.notification.v1.ListNotificationsRequest.\n * Use `create(ListNotificationsRequestSchema)` to create a new message.\n */\nexport const ListNotificationsRequestSchema: GenMessage<ListNotificationsRequest, {validType: ListNotificationsRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 1);\n\n/**\n * @generated from message fluxlay.notification.v1.ListNotificationsResponse\n */\nexport type ListNotificationsResponse = Message<\"fluxlay.notification.v1.ListNotificationsResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.notification.v1.Notification notifications = 1;\n */\n notifications: Notification[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n};\n\nexport type ListNotificationsResponseValid = ListNotificationsResponse;\n\n/**\n * Describes the message fluxlay.notification.v1.ListNotificationsResponse.\n * Use `create(ListNotificationsResponseSchema)` to create a new message.\n */\nexport const ListNotificationsResponseSchema: GenMessage<ListNotificationsResponse, {validType: ListNotificationsResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 2);\n\n/**\n * @generated from message fluxlay.notification.v1.GetUnreadNotificationCountRequest\n */\nexport type GetUnreadNotificationCountRequest = Message<\"fluxlay.notification.v1.GetUnreadNotificationCountRequest\"> & {\n};\n\nexport type GetUnreadNotificationCountRequestValid = GetUnreadNotificationCountRequest;\n\n/**\n * Describes the message fluxlay.notification.v1.GetUnreadNotificationCountRequest.\n * Use `create(GetUnreadNotificationCountRequestSchema)` to create a new message.\n */\nexport const GetUnreadNotificationCountRequestSchema: GenMessage<GetUnreadNotificationCountRequest, {validType: GetUnreadNotificationCountRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 3);\n\n/**\n * @generated from message fluxlay.notification.v1.GetUnreadNotificationCountResponse\n */\nexport type GetUnreadNotificationCountResponse = Message<\"fluxlay.notification.v1.GetUnreadNotificationCountResponse\"> & {\n /**\n * @generated from field: int32 count = 1;\n */\n count: number;\n};\n\nexport type GetUnreadNotificationCountResponseValid = GetUnreadNotificationCountResponse;\n\n/**\n * Describes the message fluxlay.notification.v1.GetUnreadNotificationCountResponse.\n * Use `create(GetUnreadNotificationCountResponseSchema)` to create a new message.\n */\nexport const GetUnreadNotificationCountResponseSchema: GenMessage<GetUnreadNotificationCountResponse, {validType: GetUnreadNotificationCountResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 4);\n\n/**\n * @generated from message fluxlay.notification.v1.MarkNotificationReadRequest\n */\nexport type MarkNotificationReadRequest = Message<\"fluxlay.notification.v1.MarkNotificationReadRequest\"> & {\n /**\n * @generated from field: string notification_id = 1;\n */\n notificationId: string;\n};\n\nexport type MarkNotificationReadRequestValid = MarkNotificationReadRequest;\n\n/**\n * Describes the message fluxlay.notification.v1.MarkNotificationReadRequest.\n * Use `create(MarkNotificationReadRequestSchema)` to create a new message.\n */\nexport const MarkNotificationReadRequestSchema: GenMessage<MarkNotificationReadRequest, {validType: MarkNotificationReadRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 5);\n\n/**\n * @generated from message fluxlay.notification.v1.MarkNotificationReadResponse\n */\nexport type MarkNotificationReadResponse = Message<\"fluxlay.notification.v1.MarkNotificationReadResponse\"> & {\n};\n\nexport type MarkNotificationReadResponseValid = MarkNotificationReadResponse;\n\n/**\n * Describes the message fluxlay.notification.v1.MarkNotificationReadResponse.\n * Use `create(MarkNotificationReadResponseSchema)` to create a new message.\n */\nexport const MarkNotificationReadResponseSchema: GenMessage<MarkNotificationReadResponse, {validType: MarkNotificationReadResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 6);\n\n/**\n * @generated from message fluxlay.notification.v1.MarkAllNotificationsReadRequest\n */\nexport type MarkAllNotificationsReadRequest = Message<\"fluxlay.notification.v1.MarkAllNotificationsReadRequest\"> & {\n};\n\nexport type MarkAllNotificationsReadRequestValid = MarkAllNotificationsReadRequest;\n\n/**\n * Describes the message fluxlay.notification.v1.MarkAllNotificationsReadRequest.\n * Use `create(MarkAllNotificationsReadRequestSchema)` to create a new message.\n */\nexport const MarkAllNotificationsReadRequestSchema: GenMessage<MarkAllNotificationsReadRequest, {validType: MarkAllNotificationsReadRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 7);\n\n/**\n * @generated from message fluxlay.notification.v1.MarkAllNotificationsReadResponse\n */\nexport type MarkAllNotificationsReadResponse = Message<\"fluxlay.notification.v1.MarkAllNotificationsReadResponse\"> & {\n};\n\nexport type MarkAllNotificationsReadResponseValid = MarkAllNotificationsReadResponse;\n\n/**\n * Describes the message fluxlay.notification.v1.MarkAllNotificationsReadResponse.\n * Use `create(MarkAllNotificationsReadResponseSchema)` to create a new message.\n */\nexport const MarkAllNotificationsReadResponseSchema: GenMessage<MarkAllNotificationsReadResponse, {validType: MarkAllNotificationsReadResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_notification_v1_notification, 8);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/stats/v1/stats.proto (package fluxlay.stats.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/stats/v1/stats.proto.\n */\nexport const file_fluxlay_stats_v1_stats: GenFile = /*@__PURE__*/\n fileDesc(\"ChxmbHV4bGF5L3N0YXRzL3YxL3N0YXRzLnByb3RvEhBmbHV4bGF5LnN0YXRzLnYxIhcKFUdldFB1YmxpY1N0YXRzUmVxdWVzdCJsChZHZXRQdWJsaWNTdGF0c1Jlc3BvbnNlEh4KFnB1YmxpY193YWxscGFwZXJfY291bnQYASABKAUSFQoNY3JlYXRvcl9jb3VudBgCIAEoBRIbChN0b3RhbF9saWNlbnNlX2NvdW50GAMgASgDQsUBChRjb20uZmx1eGxheS5zdGF0cy52MUIKU3RhdHNQcm90b1ABWj9naXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L3N0YXRzL3YxO3N0YXRzdjGiAgNGU1iqAhBGbHV4bGF5LlN0YXRzLlYxygIQRmx1eGxheVxTdGF0c1xWMeICHEZsdXhsYXlcU3RhdHNcVjFcR1BCTWV0YWRhdGHqAhJGbHV4bGF5OjpTdGF0czo6VjFiBnByb3RvMw\");\n\n/**\n * @generated from message fluxlay.stats.v1.GetPublicStatsRequest\n */\nexport type GetPublicStatsRequest = Message<\"fluxlay.stats.v1.GetPublicStatsRequest\"> & {\n};\n\nexport type GetPublicStatsRequestValid = GetPublicStatsRequest;\n\n/**\n * Describes the message fluxlay.stats.v1.GetPublicStatsRequest.\n * Use `create(GetPublicStatsRequestSchema)` to create a new message.\n */\nexport const GetPublicStatsRequestSchema: GenMessage<GetPublicStatsRequest, {validType: GetPublicStatsRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stats_v1_stats, 0);\n\n/**\n * プラットフォームの公開統計。認証不要で誰でも取得できる。\n *\n * @generated from message fluxlay.stats.v1.GetPublicStatsResponse\n */\nexport type GetPublicStatsResponse = Message<\"fluxlay.stats.v1.GetPublicStatsResponse\"> & {\n /**\n * 公開中の壁紙数\n *\n * @generated from field: int32 public_wallpaper_count = 1;\n */\n publicWallpaperCount: number;\n\n /**\n * 公開壁紙を持つクリエイター数\n *\n * @generated from field: int32 creator_count = 2;\n */\n creatorCount: number;\n\n /**\n * 累計ライセンス取得数 (ダウンロード数)\n *\n * @generated from field: int64 total_license_count = 3;\n */\n totalLicenseCount: bigint;\n};\n\nexport type GetPublicStatsResponseValid = GetPublicStatsResponse;\n\n/**\n * Describes the message fluxlay.stats.v1.GetPublicStatsResponse.\n * Use `create(GetPublicStatsResponseSchema)` to create a new message.\n */\nexport const GetPublicStatsResponseSchema: GenMessage<GetPublicStatsResponse, {validType: GetPublicStatsResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stats_v1_stats, 1);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/stripe/v1/stripe.proto (package fluxlay.stripe.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/stripe/v1/stripe.proto.\n */\nexport const file_fluxlay_stripe_v1_stripe: GenFile = /*@__PURE__*/\n fileDesc(\"Ch5mbHV4bGF5L3N0cmlwZS92MS9zdHJpcGUucHJvdG8SEWZsdXhsYXkuc3RyaXBlLnYxIhYKFENyZWF0ZUFjY291bnRSZXF1ZXN0IlAKFUNyZWF0ZUFjY291bnRSZXNwb25zZRIZChFzdHJpcGVfYWNjb3VudF9pZBgBIAEoCRIcChRvbmJvYXJkaW5nX2NvbXBsZXRlZBgCIAEoCCIdChtDcmVhdGVBY2NvdW50U2Vzc2lvblJlcXVlc3QiNQocQ3JlYXRlQWNjb3VudFNlc3Npb25SZXNwb25zZRIVCg1jbGllbnRfc2VjcmV0GAEgASgJIhkKF0dldEFjY291bnRTdGF0dXNSZXF1ZXN0Iq0BChhHZXRBY2NvdW50U3RhdHVzUmVzcG9uc2USEwoLaGFzX2FjY291bnQYASABKAgSHAoUb25ib2FyZGluZ19jb21wbGV0ZWQYAiABKAgSHAoUcGVuZGluZ192ZXJpZmljYXRpb24YAyADKAkSFQoNY3VycmVudGx5X2R1ZRgEIAMoCRIQCghwYXN0X2R1ZRgFIAMoCRIXCg9kaXNhYmxlZF9yZWFzb24YBiABKAlCzQEKFWNvbS5mbHV4bGF5LnN0cmlwZS52MUILU3RyaXBlUHJvdG9QAVpBZ2l0aHViLmNvbS9rZW4xMDkvZmx1eGxheS1wcm90by9nZW4vZ28vZmx1eGxheS9zdHJpcGUvdjE7c3RyaXBldjGiAgNGU1iqAhFGbHV4bGF5LlN0cmlwZS5WMcoCEUZsdXhsYXlcU3RyaXBlXFYx4gIdRmx1eGxheVxTdHJpcGVcVjFcR1BCTWV0YWRhdGHqAhNGbHV4bGF5OjpTdHJpcGU6OlYxYgZwcm90bzM\");\n\n/**\n * @generated from message fluxlay.stripe.v1.CreateAccountRequest\n */\nexport type CreateAccountRequest = Message<\"fluxlay.stripe.v1.CreateAccountRequest\"> & {\n};\n\nexport type CreateAccountRequestValid = CreateAccountRequest;\n\n/**\n * Describes the message fluxlay.stripe.v1.CreateAccountRequest.\n * Use `create(CreateAccountRequestSchema)` to create a new message.\n */\nexport const CreateAccountRequestSchema: GenMessage<CreateAccountRequest, {validType: CreateAccountRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 0);\n\n/**\n * @generated from message fluxlay.stripe.v1.CreateAccountResponse\n */\nexport type CreateAccountResponse = Message<\"fluxlay.stripe.v1.CreateAccountResponse\"> & {\n /**\n * @generated from field: string stripe_account_id = 1;\n */\n stripeAccountId: string;\n\n /**\n * @generated from field: bool onboarding_completed = 2;\n */\n onboardingCompleted: boolean;\n};\n\nexport type CreateAccountResponseValid = CreateAccountResponse;\n\n/**\n * Describes the message fluxlay.stripe.v1.CreateAccountResponse.\n * Use `create(CreateAccountResponseSchema)` to create a new message.\n */\nexport const CreateAccountResponseSchema: GenMessage<CreateAccountResponse, {validType: CreateAccountResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 1);\n\n/**\n * @generated from message fluxlay.stripe.v1.CreateAccountSessionRequest\n */\nexport type CreateAccountSessionRequest = Message<\"fluxlay.stripe.v1.CreateAccountSessionRequest\"> & {\n};\n\nexport type CreateAccountSessionRequestValid = CreateAccountSessionRequest;\n\n/**\n * Describes the message fluxlay.stripe.v1.CreateAccountSessionRequest.\n * Use `create(CreateAccountSessionRequestSchema)` to create a new message.\n */\nexport const CreateAccountSessionRequestSchema: GenMessage<CreateAccountSessionRequest, {validType: CreateAccountSessionRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 2);\n\n/**\n * @generated from message fluxlay.stripe.v1.CreateAccountSessionResponse\n */\nexport type CreateAccountSessionResponse = Message<\"fluxlay.stripe.v1.CreateAccountSessionResponse\"> & {\n /**\n * @generated from field: string client_secret = 1;\n */\n clientSecret: string;\n};\n\nexport type CreateAccountSessionResponseValid = CreateAccountSessionResponse;\n\n/**\n * Describes the message fluxlay.stripe.v1.CreateAccountSessionResponse.\n * Use `create(CreateAccountSessionResponseSchema)` to create a new message.\n */\nexport const CreateAccountSessionResponseSchema: GenMessage<CreateAccountSessionResponse, {validType: CreateAccountSessionResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 3);\n\n/**\n * @generated from message fluxlay.stripe.v1.GetAccountStatusRequest\n */\nexport type GetAccountStatusRequest = Message<\"fluxlay.stripe.v1.GetAccountStatusRequest\"> & {\n};\n\nexport type GetAccountStatusRequestValid = GetAccountStatusRequest;\n\n/**\n * Describes the message fluxlay.stripe.v1.GetAccountStatusRequest.\n * Use `create(GetAccountStatusRequestSchema)` to create a new message.\n */\nexport const GetAccountStatusRequestSchema: GenMessage<GetAccountStatusRequest, {validType: GetAccountStatusRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 4);\n\n/**\n * @generated from message fluxlay.stripe.v1.GetAccountStatusResponse\n */\nexport type GetAccountStatusResponse = Message<\"fluxlay.stripe.v1.GetAccountStatusResponse\"> & {\n /**\n * @generated from field: bool has_account = 1;\n */\n hasAccount: boolean;\n\n /**\n * @generated from field: bool onboarding_completed = 2;\n */\n onboardingCompleted: boolean;\n\n /**\n * 審査中の項目\n *\n * @generated from field: repeated string pending_verification = 3;\n */\n pendingVerification: string[];\n\n /**\n * 未提出の必須項目\n *\n * @generated from field: repeated string currently_due = 4;\n */\n currentlyDue: string[];\n\n /**\n * 期限切れの項目\n *\n * @generated from field: repeated string past_due = 5;\n */\n pastDue: string[];\n\n /**\n * @generated from field: string disabled_reason = 6;\n */\n disabledReason: string;\n};\n\nexport type GetAccountStatusResponseValid = GetAccountStatusResponse;\n\n/**\n * Describes the message fluxlay.stripe.v1.GetAccountStatusResponse.\n * Use `create(GetAccountStatusResponseSchema)` to create a new message.\n */\nexport const GetAccountStatusResponseSchema: GenMessage<GetAccountStatusResponse, {validType: GetAccountStatusResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_stripe_v1_stripe, 5);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/common/v1/bucket_object.proto (package fluxlay.common.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/common/v1/bucket_object.proto.\n */\nexport const file_fluxlay_common_v1_bucket_object: GenFile = /*@__PURE__*/\n fileDesc(\"CiVmbHV4bGF5L2NvbW1vbi92MS9idWNrZXRfb2JqZWN0LnByb3RvEhFmbHV4bGF5LmNvbW1vbi52MSI5ChBCdWNrZXRPYmplY3RNZXRhEg8KB3VzZXJfaWQYASABKAkSFAoMd2FsbHBhcGVyX2lkGAIgASgJIoYBCgxCdWNrZXRPYmplY3QSEwoLb2JqZWN0X3R5cGUYASABKAkSFAoMY29udGVudF90eXBlGAIgASgJEgoKAmlkGAMgASgJEgwKBG5hbWUYBCABKAkSMQoEbWV0YRgFIAEoCzIjLmZsdXhsYXkuY29tbW9uLnYxLkJ1Y2tldE9iamVjdE1ldGFC0wEKFWNvbS5mbHV4bGF5LmNvbW1vbi52MUIRQnVja2V0T2JqZWN0UHJvdG9QAVpBZ2l0aHViLmNvbS9rZW4xMDkvZmx1eGxheS1wcm90by9nZW4vZ28vZmx1eGxheS9jb21tb24vdjE7Y29tbW9udjGiAgNGQ1iqAhFGbHV4bGF5LkNvbW1vbi5WMcoCEUZsdXhsYXlcQ29tbW9uXFYx4gIdRmx1eGxheVxDb21tb25cVjFcR1BCTWV0YWRhdGHqAhNGbHV4bGF5OjpDb21tb246OlYxYgZwcm90bzM\");\n\n/**\n * @generated from message fluxlay.common.v1.BucketObjectMeta\n */\nexport type BucketObjectMeta = Message<\"fluxlay.common.v1.BucketObjectMeta\"> & {\n /**\n * @generated from field: string user_id = 1;\n */\n userId: string;\n\n /**\n * @generated from field: string wallpaper_id = 2;\n */\n wallpaperId: string;\n};\n\nexport type BucketObjectMetaValid = BucketObjectMeta;\n\n/**\n * Describes the message fluxlay.common.v1.BucketObjectMeta.\n * Use `create(BucketObjectMetaSchema)` to create a new message.\n */\nexport const BucketObjectMetaSchema: GenMessage<BucketObjectMeta, {validType: BucketObjectMetaValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_common_v1_bucket_object, 0);\n\n/**\n * @generated from message fluxlay.common.v1.BucketObject\n */\nexport type BucketObject = Message<\"fluxlay.common.v1.BucketObject\"> & {\n /**\n * @generated from field: string object_type = 1;\n */\n objectType: string;\n\n /**\n * @generated from field: string content_type = 2;\n */\n contentType: string;\n\n /**\n * @generated from field: string id = 3;\n */\n id: string;\n\n /**\n * @generated from field: string name = 4;\n */\n name: string;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObjectMeta meta = 5;\n */\n meta?: BucketObjectMeta | undefined;\n};\n\nexport type BucketObjectValid = BucketObject;\n\n/**\n * Describes the message fluxlay.common.v1.BucketObject.\n * Use `create(BucketObjectSchema)` to create a new message.\n */\nexport const BucketObjectSchema: GenMessage<BucketObject, {validType: BucketObjectValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_common_v1_bucket_object, 1);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/user/v1/user.proto (package fluxlay.user.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_buf_validate_validate } from \"../../../buf/validate/validate_pb.ts\";\nimport type { BucketObject, BucketObjectValid } from \"../../common/v1/bucket_object_pb.ts\";\nimport { file_fluxlay_common_v1_bucket_object } from \"../../common/v1/bucket_object_pb.ts\";\nimport type { Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/user/v1/user.proto.\n */\nexport const file_fluxlay_user_v1_user: GenFile = /*@__PURE__*/\n fileDesc(\"ChpmbHV4bGF5L3VzZXIvdjEvdXNlci5wcm90bxIPZmx1eGxheS51c2VyLnYxIrICCgdQcm9maWxlEg4KBmhhbmRsZRgBIAEoCRIMCgRuYW1lGAIgASgJEi8KBmF2YXRhchgDIAEoCzIfLmZsdXhsYXkuY29tbW9uLnYxLkJ1Y2tldE9iamVjdBIvCgZoZWFkZXIYBCABKAsyHy5mbHV4bGF5LmNvbW1vbi52MS5CdWNrZXRPYmplY3QSCwoDYmlvGAUgASgJEhMKC3dlYnNpdGVfdXJsGAYgASgJEgwKBHhfaWQYByABKAkSFAoMaW5zdGFncmFtX2lkGAggASgJEhEKCWdpdGh1Yl9pZBgJIAEoCRIQCghsb2NhdGlvbhgKIAEoCRIMCgR0YWdzGAsgAygJEi4KCnVwZGF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIqIBCgRVc2VyEg8KB3VzZXJfaWQYASABKAkSKQoHcHJvZmlsZRgCIAEoCzIYLmZsdXhsYXkudXNlci52MS5Qcm9maWxlEi4KCmNyZWF0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIhcKFUdldEN1cnJlbnRVc2VyUmVxdWVzdCJXChZHZXRDdXJyZW50VXNlclJlc3BvbnNlEiMKBHVzZXIYASABKAsyFS5mbHV4bGF5LnVzZXIudjEuVXNlchIYChBwcmVmZXJyZWRfbG9jYWxlGAIgASgJIk0KDkdldFVzZXJSZXF1ZXN0EhsKB3VzZXJfaWQYASABKAlCCLpIBXIDsAEBSAASEAoGaGFuZGxlGAIgASgJSABCDAoKaWRlbnRpZmllciI2Cg9HZXRVc2VyUmVzcG9uc2USIwoEdXNlchgBIAEoCzIVLmZsdXhsYXkudXNlci52MS5Vc2VyIpMECh9VcGRhdGVDdXJyZW50VXNlclByb2ZpbGVSZXF1ZXN0Ei8KBmhhbmRsZRgBIAEoCUIaukgXyAEBchIyEF5bYS16QS1aMC05Xy1dKyRIAIgBARIRCgRuYW1lGAIgASgJSAGIAQESNAoGYXZhdGFyGAMgASgLMh8uZmx1eGxheS5jb21tb24udjEuQnVja2V0T2JqZWN0SAKIAQESNAoGaGVhZGVyGAQgASgLMh8uZmx1eGxheS5jb21tb24udjEuQnVja2V0T2JqZWN0SAOIAQESEAoDYmlvGAUgASgJSASIAQESGAoLd2Vic2l0ZV91cmwYBiABKAlIBYgBARIRCgR4X2lkGAcgASgJSAaIAQESGQoMaW5zdGFncmFtX2lkGAggASgJSAeIAQESFgoJZ2l0aHViX2lkGAkgASgJSAiIAQESFQoIbG9jYXRpb24YCiABKAlICYgBARIMCgR0YWdzGAsgAygJEh0KEHByZWZlcnJlZF9sb2NhbGUYDCABKAlICogBAUIJCgdfaGFuZGxlQgcKBV9uYW1lQgkKB19hdmF0YXJCCQoHX2hlYWRlckIGCgRfYmlvQg4KDF93ZWJzaXRlX3VybEIHCgVfeF9pZEIPCg1faW5zdGFncmFtX2lkQgwKCl9naXRodWJfaWRCCwoJX2xvY2F0aW9uQhMKEV9wcmVmZXJyZWRfbG9jYWxlIk0KIFVwZGF0ZUN1cnJlbnRVc2VyUHJvZmlsZVJlc3BvbnNlEikKB3Byb2ZpbGUYASABKAsyGC5mbHV4bGF5LnVzZXIudjEuUHJvZmlsZSLaAQodQ3JlYXRlUHJvZmlsZVVwbG9hZFVSTFJlcXVlc3QSFAoMY29udGVudF90eXBlGAEgASgJEkwKCmFzc2V0X3R5cGUYAiABKA4yOC5mbHV4bGF5LnVzZXIudjEuQ3JlYXRlUHJvZmlsZVVwbG9hZFVSTFJlcXVlc3QuQXNzZXRUeXBlIlUKCUFzc2V0VHlwZRIaChZBU1NFVF9UWVBFX1VOU1BFQ0lGSUVEEAASFQoRQVNTRVRfVFlQRV9BVkFUQVIQARIVChFBU1NFVF9UWVBFX0hFQURFUhACImUKHkNyZWF0ZVByb2ZpbGVVcGxvYWRVUkxSZXNwb25zZRISCgp1cGxvYWRfdXJsGAEgASgJEi8KBm9iamVjdBgCIAEoCzIfLmZsdXhsYXkuY29tbW9uLnYxLkJ1Y2tldE9iamVjdCLnAQoZVXBkYXRlUHJvZmlsZUltYWdlUmVxdWVzdBJCCgR0eXBlGAEgASgOMjQuZmx1eGxheS51c2VyLnYxLlVwZGF0ZVByb2ZpbGVJbWFnZVJlcXVlc3QuSW1hZ2VUeXBlEi8KBm9iamVjdBgCIAEoCzIfLmZsdXhsYXkuY29tbW9uLnYxLkJ1Y2tldE9iamVjdCJVCglJbWFnZVR5cGUSGgoWSU1BR0VfVFlQRV9VTlNQRUNJRklFRBAAEhUKEUlNQUdFX1RZUEVfQVZBVEFSEAESFQoRSU1BR0VfVFlQRV9IRUFERVIQAiJHChpVcGRhdGVQcm9maWxlSW1hZ2VSZXNwb25zZRIpCgdwcm9maWxlGAEgASgLMhguZmx1eGxheS51c2VyLnYxLlByb2ZpbGUiHAoaR2V0T25ib2FyZGluZ1N0YXR1c1JlcXVlc3QiZgobR2V0T25ib2FyZGluZ1N0YXR1c1Jlc3BvbnNlEhQKDHRlcm1zX2FncmVlZBgBIAEoCBIZChFoYW5kbGVfY29uZmlndXJlZBgCIAEoCBIWCg5jdXJyZW50X2hhbmRsZRgDIAEoCSJ+ChlDb21wbGV0ZU9uYm9hcmRpbmdSZXF1ZXN0Eg4KBmhhbmRsZRgBIAEoCRIWCg50ZXJtc19hY2NlcHRlZBgCIAEoCBIfChdtYXJrZXRpbmdfZW1haWxfY29uc2VudBgDIAEoCBIYChBwcmVmZXJyZWRfbG9jYWxlGAQgASgJIhwKGkNvbXBsZXRlT25ib2FyZGluZ1Jlc3BvbnNlIl4KEExpc3RVc2Vyc1JlcXVlc3QSGgoJcGFnZV9zaXplGAEgASgFQge6SAQaAiAAEhIKCnBhZ2VfdG9rZW4YAiABKAkSEQoEcGFnZRgDIAEoBUgAiAEBQgcKBV9wYWdlIm0KEUxpc3RVc2Vyc1Jlc3BvbnNlEioKCHByb2ZpbGVzGAEgAygLMhguZmx1eGxheS51c2VyLnYxLlByb2ZpbGUSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgFIhYKFERlbGV0ZUFjY291bnRSZXF1ZXN0IhcKFURlbGV0ZUFjY291bnRSZXNwb25zZUK9AQoTY29tLmZsdXhsYXkudXNlci52MUIJVXNlclByb3RvUAFaPWdpdGh1Yi5jb20va2VuMTA5L2ZsdXhsYXktcHJvdG8vZ2VuL2dvL2ZsdXhsYXkvdXNlci92MTt1c2VydjGiAgNGVViqAg9GbHV4bGF5LlVzZXIuVjHKAg9GbHV4bGF5XFVzZXJcVjHiAhtGbHV4bGF5XFVzZXJcVjFcR1BCTWV0YWRhdGHqAhFGbHV4bGF5OjpVc2VyOjpWMWIGcHJvdG8z\", [file_buf_validate_validate, file_fluxlay_common_v1_bucket_object, file_google_protobuf_timestamp]);\n\n/**\n * @generated from message fluxlay.user.v1.Profile\n */\nexport type Profile = Message<\"fluxlay.user.v1.Profile\"> & {\n /**\n * @generated from field: string handle = 1;\n */\n handle: string;\n\n /**\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject avatar = 3;\n */\n avatar?: BucketObject | undefined;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject header = 4;\n */\n header?: BucketObject | undefined;\n\n /**\n * @generated from field: string bio = 5;\n */\n bio: string;\n\n /**\n * @generated from field: string website_url = 6;\n */\n websiteUrl: string;\n\n /**\n * @generated from field: string x_id = 7;\n */\n xId: string;\n\n /**\n * @generated from field: string instagram_id = 8;\n */\n instagramId: string;\n\n /**\n * @generated from field: string github_id = 9;\n */\n githubId: string;\n\n /**\n * @generated from field: string location = 10;\n */\n location: string;\n\n /**\n * @generated from field: repeated string tags = 11;\n */\n tags: string[];\n\n /**\n * @generated from field: google.protobuf.Timestamp updated_at = 12;\n */\n updatedAt?: Timestamp | undefined;\n};\n\nexport type ProfileValid = Profile;\n\n/**\n * Describes the message fluxlay.user.v1.Profile.\n * Use `create(ProfileSchema)` to create a new message.\n */\nexport const ProfileSchema: GenMessage<Profile, {validType: ProfileValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 0);\n\n/**\n * @generated from message fluxlay.user.v1.User\n */\nexport type User = Message<\"fluxlay.user.v1.User\"> & {\n /**\n * @generated from field: string user_id = 1;\n */\n userId: string;\n\n /**\n * @generated from field: fluxlay.user.v1.Profile profile = 2;\n */\n profile?: Profile | undefined;\n\n /**\n * @generated from field: google.protobuf.Timestamp created_at = 3;\n */\n createdAt?: Timestamp | undefined;\n\n /**\n * @generated from field: google.protobuf.Timestamp updated_at = 4;\n */\n updatedAt?: Timestamp | undefined;\n};\n\nexport type UserValid = User;\n\n/**\n * Describes the message fluxlay.user.v1.User.\n * Use `create(UserSchema)` to create a new message.\n */\nexport const UserSchema: GenMessage<User, {validType: UserValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 1);\n\n/**\n * @generated from message fluxlay.user.v1.GetCurrentUserRequest\n */\nexport type GetCurrentUserRequest = Message<\"fluxlay.user.v1.GetCurrentUserRequest\"> & {\n};\n\nexport type GetCurrentUserRequestValid = GetCurrentUserRequest;\n\n/**\n * Describes the message fluxlay.user.v1.GetCurrentUserRequest.\n * Use `create(GetCurrentUserRequestSchema)` to create a new message.\n */\nexport const GetCurrentUserRequestSchema: GenMessage<GetCurrentUserRequest, {validType: GetCurrentUserRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 2);\n\n/**\n * @generated from message fluxlay.user.v1.GetCurrentUserResponse\n */\nexport type GetCurrentUserResponse = Message<\"fluxlay.user.v1.GetCurrentUserResponse\"> & {\n /**\n * @generated from field: fluxlay.user.v1.User user = 1;\n */\n user?: User | undefined;\n\n /**\n * preferred_locale はメール送信時の言語(en / ja・未設定なら空)。本人のみ取得・公開しない。\n *\n * @generated from field: string preferred_locale = 2;\n */\n preferredLocale: string;\n};\n\nexport type GetCurrentUserResponseValid = GetCurrentUserResponse;\n\n/**\n * Describes the message fluxlay.user.v1.GetCurrentUserResponse.\n * Use `create(GetCurrentUserResponseSchema)` to create a new message.\n */\nexport const GetCurrentUserResponseSchema: GenMessage<GetCurrentUserResponse, {validType: GetCurrentUserResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 3);\n\n/**\n * @generated from message fluxlay.user.v1.GetUserRequest\n */\nexport type GetUserRequest = Message<\"fluxlay.user.v1.GetUserRequest\"> & {\n /**\n * @generated from oneof fluxlay.user.v1.GetUserRequest.identifier\n */\n identifier: {\n /**\n * @generated from field: string user_id = 1;\n */\n value: string;\n case: \"userId\";\n } | {\n /**\n * @generated from field: string handle = 2;\n */\n value: string;\n case: \"handle\";\n } | { case: undefined; value?: undefined };\n};\n\nexport type GetUserRequestValid = GetUserRequest;\n\n/**\n * Describes the message fluxlay.user.v1.GetUserRequest.\n * Use `create(GetUserRequestSchema)` to create a new message.\n */\nexport const GetUserRequestSchema: GenMessage<GetUserRequest, {validType: GetUserRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 4);\n\n/**\n * @generated from message fluxlay.user.v1.GetUserResponse\n */\nexport type GetUserResponse = Message<\"fluxlay.user.v1.GetUserResponse\"> & {\n /**\n * @generated from field: fluxlay.user.v1.User user = 1;\n */\n user?: User | undefined;\n};\n\nexport type GetUserResponseValid = GetUserResponse;\n\n/**\n * Describes the message fluxlay.user.v1.GetUserResponse.\n * Use `create(GetUserResponseSchema)` to create a new message.\n */\nexport const GetUserResponseSchema: GenMessage<GetUserResponse, {validType: GetUserResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 5);\n\n/**\n * @generated from message fluxlay.user.v1.UpdateCurrentUserProfileRequest\n */\nexport type UpdateCurrentUserProfileRequest = Message<\"fluxlay.user.v1.UpdateCurrentUserProfileRequest\"> & {\n /**\n * @generated from field: optional string handle = 1;\n */\n handle?: string | undefined;\n\n /**\n * @generated from field: optional string name = 2;\n */\n name?: string | undefined;\n\n /**\n * @generated from field: optional fluxlay.common.v1.BucketObject avatar = 3;\n */\n avatar?: BucketObject | undefined;\n\n /**\n * @generated from field: optional fluxlay.common.v1.BucketObject header = 4;\n */\n header?: BucketObject | undefined;\n\n /**\n * @generated from field: optional string bio = 5;\n */\n bio?: string | undefined;\n\n /**\n * @generated from field: optional string website_url = 6;\n */\n websiteUrl?: string | undefined;\n\n /**\n * @generated from field: optional string x_id = 7;\n */\n xId?: string | undefined;\n\n /**\n * @generated from field: optional string instagram_id = 8;\n */\n instagramId?: string | undefined;\n\n /**\n * @generated from field: optional string github_id = 9;\n */\n githubId?: string | undefined;\n\n /**\n * @generated from field: optional string location = 10;\n */\n location?: string | undefined;\n\n /**\n * @generated from field: repeated string tags = 11;\n */\n tags: string[];\n\n /**\n * preferred_locale はメール送信時の言語(en / ja)。プロフィール編集で変更できる。\n *\n * @generated from field: optional string preferred_locale = 12;\n */\n preferredLocale?: string | undefined;\n};\n\n/**\n * @generated from message fluxlay.user.v1.UpdateCurrentUserProfileRequest\n */\nexport type UpdateCurrentUserProfileRequestValid = Message<\"fluxlay.user.v1.UpdateCurrentUserProfileRequest\"> & {\n /**\n * @generated from field: optional string handle = 1;\n */\n handle: string;\n\n /**\n * @generated from field: optional string name = 2;\n */\n name?: string | undefined;\n\n /**\n * @generated from field: optional fluxlay.common.v1.BucketObject avatar = 3;\n */\n avatar?: BucketObjectValid | undefined;\n\n /**\n * @generated from field: optional fluxlay.common.v1.BucketObject header = 4;\n */\n header?: BucketObjectValid | undefined;\n\n /**\n * @generated from field: optional string bio = 5;\n */\n bio?: string | undefined;\n\n /**\n * @generated from field: optional string website_url = 6;\n */\n websiteUrl?: string | undefined;\n\n /**\n * @generated from field: optional string x_id = 7;\n */\n xId?: string | undefined;\n\n /**\n * @generated from field: optional string instagram_id = 8;\n */\n instagramId?: string | undefined;\n\n /**\n * @generated from field: optional string github_id = 9;\n */\n githubId?: string | undefined;\n\n /**\n * @generated from field: optional string location = 10;\n */\n location?: string | undefined;\n\n /**\n * @generated from field: repeated string tags = 11;\n */\n tags: string[];\n\n /**\n * preferred_locale はメール送信時の言語(en / ja)。プロフィール編集で変更できる。\n *\n * @generated from field: optional string preferred_locale = 12;\n */\n preferredLocale?: string | undefined;\n};\n\n/**\n * Describes the message fluxlay.user.v1.UpdateCurrentUserProfileRequest.\n * Use `create(UpdateCurrentUserProfileRequestSchema)` to create a new message.\n */\nexport const UpdateCurrentUserProfileRequestSchema: GenMessage<UpdateCurrentUserProfileRequest, {validType: UpdateCurrentUserProfileRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 6);\n\n/**\n * @generated from message fluxlay.user.v1.UpdateCurrentUserProfileResponse\n */\nexport type UpdateCurrentUserProfileResponse = Message<\"fluxlay.user.v1.UpdateCurrentUserProfileResponse\"> & {\n /**\n * @generated from field: fluxlay.user.v1.Profile profile = 1;\n */\n profile?: Profile | undefined;\n};\n\nexport type UpdateCurrentUserProfileResponseValid = UpdateCurrentUserProfileResponse;\n\n/**\n * Describes the message fluxlay.user.v1.UpdateCurrentUserProfileResponse.\n * Use `create(UpdateCurrentUserProfileResponseSchema)` to create a new message.\n */\nexport const UpdateCurrentUserProfileResponseSchema: GenMessage<UpdateCurrentUserProfileResponse, {validType: UpdateCurrentUserProfileResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 7);\n\n/**\n * @generated from message fluxlay.user.v1.CreateProfileUploadURLRequest\n */\nexport type CreateProfileUploadURLRequest = Message<\"fluxlay.user.v1.CreateProfileUploadURLRequest\"> & {\n /**\n * @generated from field: string content_type = 1;\n */\n contentType: string;\n\n /**\n * @generated from field: fluxlay.user.v1.CreateProfileUploadURLRequest.AssetType asset_type = 2;\n */\n assetType: CreateProfileUploadURLRequest_AssetType;\n};\n\nexport type CreateProfileUploadURLRequestValid = CreateProfileUploadURLRequest;\n\n/**\n * Describes the message fluxlay.user.v1.CreateProfileUploadURLRequest.\n * Use `create(CreateProfileUploadURLRequestSchema)` to create a new message.\n */\nexport const CreateProfileUploadURLRequestSchema: GenMessage<CreateProfileUploadURLRequest, {validType: CreateProfileUploadURLRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 8);\n\n/**\n * @generated from enum fluxlay.user.v1.CreateProfileUploadURLRequest.AssetType\n */\nexport enum CreateProfileUploadURLRequest_AssetType {\n /**\n * @generated from enum value: ASSET_TYPE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: ASSET_TYPE_AVATAR = 1;\n */\n AVATAR = 1,\n\n /**\n * @generated from enum value: ASSET_TYPE_HEADER = 2;\n */\n HEADER = 2,\n}\n\n/**\n * Describes the enum fluxlay.user.v1.CreateProfileUploadURLRequest.AssetType.\n */\nexport const CreateProfileUploadURLRequest_AssetTypeSchema: GenEnum<CreateProfileUploadURLRequest_AssetType> = /*@__PURE__*/\n enumDesc(file_fluxlay_user_v1_user, 8, 0);\n\n/**\n * @generated from message fluxlay.user.v1.CreateProfileUploadURLResponse\n */\nexport type CreateProfileUploadURLResponse = Message<\"fluxlay.user.v1.CreateProfileUploadURLResponse\"> & {\n /**\n * @generated from field: string upload_url = 1;\n */\n uploadUrl: string;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject object = 2;\n */\n object?: BucketObject | undefined;\n};\n\nexport type CreateProfileUploadURLResponseValid = CreateProfileUploadURLResponse;\n\n/**\n * Describes the message fluxlay.user.v1.CreateProfileUploadURLResponse.\n * Use `create(CreateProfileUploadURLResponseSchema)` to create a new message.\n */\nexport const CreateProfileUploadURLResponseSchema: GenMessage<CreateProfileUploadURLResponse, {validType: CreateProfileUploadURLResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 9);\n\n/**\n * @generated from message fluxlay.user.v1.UpdateProfileImageRequest\n */\nexport type UpdateProfileImageRequest = Message<\"fluxlay.user.v1.UpdateProfileImageRequest\"> & {\n /**\n * @generated from field: fluxlay.user.v1.UpdateProfileImageRequest.ImageType type = 1;\n */\n type: UpdateProfileImageRequest_ImageType;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject object = 2;\n */\n object?: BucketObject | undefined;\n};\n\nexport type UpdateProfileImageRequestValid = UpdateProfileImageRequest;\n\n/**\n * Describes the message fluxlay.user.v1.UpdateProfileImageRequest.\n * Use `create(UpdateProfileImageRequestSchema)` to create a new message.\n */\nexport const UpdateProfileImageRequestSchema: GenMessage<UpdateProfileImageRequest, {validType: UpdateProfileImageRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 10);\n\n/**\n * @generated from enum fluxlay.user.v1.UpdateProfileImageRequest.ImageType\n */\nexport enum UpdateProfileImageRequest_ImageType {\n /**\n * @generated from enum value: IMAGE_TYPE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: IMAGE_TYPE_AVATAR = 1;\n */\n AVATAR = 1,\n\n /**\n * @generated from enum value: IMAGE_TYPE_HEADER = 2;\n */\n HEADER = 2,\n}\n\n/**\n * Describes the enum fluxlay.user.v1.UpdateProfileImageRequest.ImageType.\n */\nexport const UpdateProfileImageRequest_ImageTypeSchema: GenEnum<UpdateProfileImageRequest_ImageType> = /*@__PURE__*/\n enumDesc(file_fluxlay_user_v1_user, 10, 0);\n\n/**\n * @generated from message fluxlay.user.v1.UpdateProfileImageResponse\n */\nexport type UpdateProfileImageResponse = Message<\"fluxlay.user.v1.UpdateProfileImageResponse\"> & {\n /**\n * @generated from field: fluxlay.user.v1.Profile profile = 1;\n */\n profile?: Profile | undefined;\n};\n\nexport type UpdateProfileImageResponseValid = UpdateProfileImageResponse;\n\n/**\n * Describes the message fluxlay.user.v1.UpdateProfileImageResponse.\n * Use `create(UpdateProfileImageResponseSchema)` to create a new message.\n */\nexport const UpdateProfileImageResponseSchema: GenMessage<UpdateProfileImageResponse, {validType: UpdateProfileImageResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 11);\n\n/**\n * @generated from message fluxlay.user.v1.GetOnboardingStatusRequest\n */\nexport type GetOnboardingStatusRequest = Message<\"fluxlay.user.v1.GetOnboardingStatusRequest\"> & {\n};\n\nexport type GetOnboardingStatusRequestValid = GetOnboardingStatusRequest;\n\n/**\n * Describes the message fluxlay.user.v1.GetOnboardingStatusRequest.\n * Use `create(GetOnboardingStatusRequestSchema)` to create a new message.\n */\nexport const GetOnboardingStatusRequestSchema: GenMessage<GetOnboardingStatusRequest, {validType: GetOnboardingStatusRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 12);\n\n/**\n * @generated from message fluxlay.user.v1.GetOnboardingStatusResponse\n */\nexport type GetOnboardingStatusResponse = Message<\"fluxlay.user.v1.GetOnboardingStatusResponse\"> & {\n /**\n * @generated from field: bool terms_agreed = 1;\n */\n termsAgreed: boolean;\n\n /**\n * @generated from field: bool handle_configured = 2;\n */\n handleConfigured: boolean;\n\n /**\n * @generated from field: string current_handle = 3;\n */\n currentHandle: string;\n};\n\nexport type GetOnboardingStatusResponseValid = GetOnboardingStatusResponse;\n\n/**\n * Describes the message fluxlay.user.v1.GetOnboardingStatusResponse.\n * Use `create(GetOnboardingStatusResponseSchema)` to create a new message.\n */\nexport const GetOnboardingStatusResponseSchema: GenMessage<GetOnboardingStatusResponse, {validType: GetOnboardingStatusResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 13);\n\n/**\n * @generated from message fluxlay.user.v1.CompleteOnboardingRequest\n */\nexport type CompleteOnboardingRequest = Message<\"fluxlay.user.v1.CompleteOnboardingRequest\"> & {\n /**\n * @generated from field: string handle = 1;\n */\n handle: string;\n\n /**\n * @generated from field: bool terms_accepted = 2;\n */\n termsAccepted: boolean;\n\n /**\n * @generated from field: bool marketing_email_consent = 3;\n */\n marketingEmailConsent: boolean;\n\n /**\n * preferred_locale はメール送信時の言語。クライアントの表示言語で初期化する(en / ja)。\n *\n * @generated from field: string preferred_locale = 4;\n */\n preferredLocale: string;\n};\n\nexport type CompleteOnboardingRequestValid = CompleteOnboardingRequest;\n\n/**\n * Describes the message fluxlay.user.v1.CompleteOnboardingRequest.\n * Use `create(CompleteOnboardingRequestSchema)` to create a new message.\n */\nexport const CompleteOnboardingRequestSchema: GenMessage<CompleteOnboardingRequest, {validType: CompleteOnboardingRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 14);\n\n/**\n * @generated from message fluxlay.user.v1.CompleteOnboardingResponse\n */\nexport type CompleteOnboardingResponse = Message<\"fluxlay.user.v1.CompleteOnboardingResponse\"> & {\n};\n\nexport type CompleteOnboardingResponseValid = CompleteOnboardingResponse;\n\n/**\n * Describes the message fluxlay.user.v1.CompleteOnboardingResponse.\n * Use `create(CompleteOnboardingResponseSchema)` to create a new message.\n */\nexport const CompleteOnboardingResponseSchema: GenMessage<CompleteOnboardingResponse, {validType: CompleteOnboardingResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 15);\n\n/**\n * @generated from message fluxlay.user.v1.ListUsersRequest\n */\nexport type ListUsersRequest = Message<\"fluxlay.user.v1.ListUsersRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n\n /**\n * @generated from field: optional int32 page = 3;\n */\n page?: number | undefined;\n};\n\nexport type ListUsersRequestValid = ListUsersRequest;\n\n/**\n * Describes the message fluxlay.user.v1.ListUsersRequest.\n * Use `create(ListUsersRequestSchema)` to create a new message.\n */\nexport const ListUsersRequestSchema: GenMessage<ListUsersRequest, {validType: ListUsersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 16);\n\n/**\n * @generated from message fluxlay.user.v1.ListUsersResponse\n */\nexport type ListUsersResponse = Message<\"fluxlay.user.v1.ListUsersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.user.v1.Profile profiles = 1;\n */\n profiles: Profile[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n\n /**\n * @generated from field: int32 total_count = 3;\n */\n totalCount: number;\n};\n\nexport type ListUsersResponseValid = ListUsersResponse;\n\n/**\n * Describes the message fluxlay.user.v1.ListUsersResponse.\n * Use `create(ListUsersResponseSchema)` to create a new message.\n */\nexport const ListUsersResponseSchema: GenMessage<ListUsersResponse, {validType: ListUsersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 17);\n\n/**\n * 退会(アカウント削除)。認証ユーザー自身を対象とするためリクエストは空。\n *\n * @generated from message fluxlay.user.v1.DeleteAccountRequest\n */\nexport type DeleteAccountRequest = Message<\"fluxlay.user.v1.DeleteAccountRequest\"> & {\n};\n\nexport type DeleteAccountRequestValid = DeleteAccountRequest;\n\n/**\n * Describes the message fluxlay.user.v1.DeleteAccountRequest.\n * Use `create(DeleteAccountRequestSchema)` to create a new message.\n */\nexport const DeleteAccountRequestSchema: GenMessage<DeleteAccountRequest, {validType: DeleteAccountRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 18);\n\n/**\n * @generated from message fluxlay.user.v1.DeleteAccountResponse\n */\nexport type DeleteAccountResponse = Message<\"fluxlay.user.v1.DeleteAccountResponse\"> & {\n};\n\nexport type DeleteAccountResponseValid = DeleteAccountResponse;\n\n/**\n * Describes the message fluxlay.user.v1.DeleteAccountResponse.\n * Use `create(DeleteAccountResponseSchema)` to create a new message.\n */\nexport const DeleteAccountResponseSchema: GenMessage<DeleteAccountResponse, {validType: DeleteAccountResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_user_v1_user, 19);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/wallpaper/v1/wallpaper.proto (package fluxlay.wallpaper.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_buf_validate_validate } from \"../../../buf/validate/validate_pb.ts\";\nimport type { BucketObject } from \"../../common/v1/bucket_object_pb.ts\";\nimport { file_fluxlay_common_v1_bucket_object } from \"../../common/v1/bucket_object_pb.ts\";\nimport type { Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file fluxlay/wallpaper/v1/wallpaper.proto.\n */\nexport const file_fluxlay_wallpaper_v1_wallpaper: GenFile = /*@__PURE__*/\n fileDesc(\"CiRmbHV4bGF5L3dhbGxwYXBlci92MS93YWxscGFwZXIucHJvdG8SFGZsdXhsYXkud2FsbHBhcGVyLnYxIlcKBkF1dGhvchIOCgZoYW5kbGUYASABKAkSDAoEbmFtZRgCIAEoCRIvCgZhdmF0YXIYAyABKAsyHy5mbHV4bGF5LmNvbW1vbi52MS5CdWNrZXRPYmplY3Qi5QYKCVdhbGxwYXBlchIKCgJpZBgBIAEoCRIMCgRzbHVnGA0gASgJEgwKBG5hbWUYAiABKAkSEwoLZGVzY3JpcHRpb24YBSABKAkSFQoNdGh1bWJuYWlsX3VybBgGIAEoCRIRCgllbnRyeV91cmwYByABKAkSDAoEdGFncxgIIAMoCRI4CghwcmV2aWV3cxgJIAMoCzImLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlclByZXZpZXcSNQoGc3RhdHVzGAogASgOMiUuZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyU3RhdHVzEi4KCmNyZWF0ZWRfYXQYCyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhAKCGlzX293bmVkGA4gASgIEhIKCmxpY2Vuc2VfaWQYDyABKAkSDwoHdXNlcl9pZBgQIAEoCRIZChFsYXRlc3RfdmVyc2lvbl9pZBgRIAEoCRI0Cg5hdXRob3JfcHJvZmlsZRgSIAEoCzIcLmZsdXhsYXkud2FsbHBhcGVyLnYxLkF1dGhvchIzCgVwcmljZRgTIAEoCzIkLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlclByaWNlEjQKBnByaWNlcxgUIAMoCzIkLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlclByaWNlEjUKDHB1Ymxpc2hlZF9hdBgVIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBARI0CgduZXR3b3JrGBYgAygLMiMuZmx1eGxheS53YWxscGFwZXIudjEuTmV0d29ya09yaWdpbhIRCglpc19waW5uZWQYFyABKAgSEgoKdmlld19jb3VudBgYIAEoAxJHCg1jcmVhdG9yX3N0YXRzGBkgASgLMisuZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyQ3JlYXRvclN0YXRzSAGIAQESEAoIcmV2aXNpb24YGiABKAVCDwoNX3B1Ymxpc2hlZF9hdEIQCg5fY3JlYXRvcl9zdGF0c0oECAMQBFIHdmVyc2lvbiJxChVXYWxscGFwZXJDcmVhdG9yU3RhdHMSFQoNbGljZW5zZV9jb3VudBgBIAEoAxIRCgl2aWV3c18zMGQYAiABKAMSFAoMbGljZW5zZXNfMzBkGAMgASgDEhgKEHZpZXdfZ3Jvd3RoX3JhdGUYBCABKAEiMgoOV2FsbHBhcGVyUHJpY2USEAoIY3VycmVuY3kYASABKAkSDgoGYW1vdW50GAIgASgDIi8KDU5ldHdvcmtPcmlnaW4SDgoGb3JpZ2luGAEgASgJEg4KBnJlYXNvbhgCIAEoCSLQAQoQV2FsbHBhcGVyUHJldmlldxIKCgJpZBgBIAEoCRIvCgZvYmplY3QYAiABKAsyHy5mbHV4bGF5LmNvbW1vbi52MS5CdWNrZXRPYmplY3QSDQoFb3JkZXIYAyABKAUSEgoFd2lkdGgYBCABKAVIAIgBARITCgZoZWlnaHQYBSABKAVIAYgBARIdChBkdXJhdGlvbl9zZWNvbmRzGAYgASgFSAKIAQFCCAoGX3dpZHRoQgkKB19oZWlnaHRCEwoRX2R1cmF0aW9uX3NlY29uZHMiOQoXQWNxdWlyZVdhbGxwYXBlclJlcXVlc3QSHgoMd2FsbHBhcGVyX2lkGAEgASgJQgi6SAVyA7ABASIaChhBY3F1aXJlV2FsbHBhcGVyUmVzcG9uc2UiTAoaTGlzdE93bmVkV2FsbHBhcGVyc1JlcXVlc3QSGgoJcGFnZV9zaXplGAEgASgFQge6SAQaAiAAEhIKCnBhZ2VfdG9rZW4YAiABKAkiawobTGlzdE93bmVkV2FsbHBhcGVyc1Jlc3BvbnNlEjMKCndhbGxwYXBlcnMYASADKAsyHy5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXISFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIjUKE1BpbldhbGxwYXBlclJlcXVlc3QSHgoMd2FsbHBhcGVyX2lkGAEgASgJQgi6SAVyA7ABASIWChRQaW5XYWxscGFwZXJSZXNwb25zZSI3ChVVbnBpbldhbGxwYXBlclJlcXVlc3QSHgoMd2FsbHBhcGVyX2lkGAEgASgJQgi6SAVyA7ABASIYChZVbnBpbldhbGxwYXBlclJlc3BvbnNlIsEBChlMaXN0VXNlcldhbGxwYXBlcnNSZXF1ZXN0EhoKCXBhZ2Vfc2l6ZRgBIAEoBUIHukgEGgIgABISCgpwYWdlX3Rva2VuGAIgASgJEjYKB3NvcnRfYnkYAyABKA4yJS5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXJTb3J0QnkSPAoNc3RhdHVzX2ZpbHRlchgEIAEoDjIlLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlclN0YXR1cyJqChpMaXN0VXNlcldhbGxwYXBlcnNSZXNwb25zZRIzCgp3YWxscGFwZXJzGAEgAygLMh8uZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCSKWAQoeVXBkYXRlV2FsbHBhcGVyTWV0YWRhdGFSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARIdCgRuYW1lGAIgASgJQgq6SAfIAQFyAhABSACIAQESGAoLZGVzY3JpcHRpb24YAyABKAlIAYgBARIMCgR0YWdzGAQgAygJQgcKBV9uYW1lQg4KDF9kZXNjcmlwdGlvbiJVCh9VcGRhdGVXYWxscGFwZXJNZXRhZGF0YVJlc3BvbnNlEjIKCXdhbGxwYXBlchgBIAEoCzIfLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlciKMAQodQ3JlYXRlUHJldmlld1VwbG9hZFVSTFJlcXVlc3QSHgoMd2FsbHBhcGVyX2lkGAEgASgJQgi6SAVyA7ABARJLCgxjb250ZW50X3R5cGUYAiABKAlCNbpIMnIwMi5eKGltYWdlLyhwbmd8anBlZ3x3ZWJwfGdpZil8dmlkZW8vKG1wNHx3ZWJtKSkkIkgKHkNyZWF0ZVByZXZpZXdVcGxvYWRVUkxSZXNwb25zZRISCgpwcmV2aWV3X2lkGAEgASgJEhIKCnVwbG9hZF91cmwYAiABKAkibAoWQWRkUHJldmlld0ltYWdlUmVxdWVzdBIeCgx3YWxscGFwZXJfaWQYASABKAlCCLpIBXIDsAEBEhwKCnByZXZpZXdfaWQYAiABKAlCCLpIBXIDsAEBEhQKDGNvbnRlbnRfdHlwZRgDIAEoCSJSChdBZGRQcmV2aWV3SW1hZ2VSZXNwb25zZRI3CgdwcmV2aWV3GAEgASgLMiYuZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyUHJldmlldyIxChlEZWxldGVQcmV2aWV3SW1hZ2VSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABASIcChpEZWxldGVQcmV2aWV3SW1hZ2VSZXNwb25zZSIvChdQdWJsaXNoV2FsbHBhcGVyUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiTgoYUHVibGlzaFdhbGxwYXBlclJlc3BvbnNlEjIKCXdhbGxwYXBlchgBIAEoCzIfLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlciIxChlVbnB1Ymxpc2hXYWxscGFwZXJSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABASJQChpVbnB1Ymxpc2hXYWxscGFwZXJSZXNwb25zZRIyCgl3YWxscGFwZXIYASABKAsyHy5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXIiLgoWRGVsZXRlV2FsbHBhcGVyUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiGQoXRGVsZXRlV2FsbHBhcGVyUmVzcG9uc2UivQEKFUxpc3RXYWxscGFwZXJzUmVxdWVzdBIaCglwYWdlX3NpemUYASABKAVCB7pIBBoCIAASEgoKcGFnZV90b2tlbhgCIAEoCRIUCgd1c2VyX2lkGAMgASgJSACIAQESEQoEcGFnZRgEIAEoBUgBiAEBEjYKB3NvcnRfYnkYBSABKA4yJS5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXJTb3J0QnlCCgoIX3VzZXJfaWRCBwoFX3BhZ2UiewoWTGlzdFdhbGxwYXBlcnNSZXNwb25zZRIzCgp3YWxscGFwZXJzGAEgAygLMh8uZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoBSJuChdTZWFyY2hXYWxscGFwZXJzUmVxdWVzdBINCgVxdWVyeRgBIAEoCRIMCgR0YWdzGAIgAygJEhoKCXBhZ2Vfc2l6ZRgDIAEoBUIHukgEGgIgABIRCgRwYWdlGAQgASgFSACIAQFCBwoFX3BhZ2UiTwoYU2VhcmNoV2FsbHBhcGVyc1Jlc3BvbnNlEjMKCndhbGxwYXBlcnMYASADKAsyHy5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXIiOQodTGlzdEZlYXR1cmVkV2FsbHBhcGVyc1JlcXVlc3QSGAoFbGltaXQYASABKAVCCbpIBhoEGBQgACJVCh5MaXN0RmVhdHVyZWRXYWxscGFwZXJzUmVzcG9uc2USMwoKd2FsbHBhcGVycxgBIAMoCzIfLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlciJcChxMaXN0UmVsYXRlZFdhbGxwYXBlcnNSZXF1ZXN0Eh4KDHdhbGxwYXBlcl9pZBgBIAEoCUIIukgFcgOwAQESEgoFbGltaXQYAiABKAVIAIgBAUIICgZfbGltaXQiVAodTGlzdFJlbGF0ZWRXYWxscGFwZXJzUmVzcG9uc2USMwoKd2FsbHBhcGVycxgBIAMoCzIfLmZsdXhsYXkud2FsbHBhcGVyLnYxLldhbGxwYXBlciIqCgpIYW5kbGVTbHVnEg4KBmhhbmRsZRgBIAEoCRIMCgRzbHVnGAIgASgJIo8BChNHZXRXYWxscGFwZXJSZXF1ZXN0EgwKAmlkGAEgASgJSAASDgoEc2x1ZxgCIAEoCUgAEjcKC2hhbmRsZV9zbHVnGAMgASgLMiAuZmx1eGxheS53YWxscGFwZXIudjEuSGFuZGxlU2x1Z0gAEhMKC2FjdGl2ZV9vbmx5GAQgASgIQgwKCmlkZW50aWZpZXIiSgoUR2V0V2FsbHBhcGVyUmVzcG9uc2USMgoJd2FsbHBhcGVyGAEgASgLMh8uZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyIm0KFkdldERldmVsb3BlcktleVJlcXVlc3QSFQoEc2FsdBgBIAEoDEIHukgEegJoIBIYChBwcm90b2NvbF92ZXJzaW9uGAIgASgNEiIKEWRldmljZV9wdWJsaWNfa2V5GAMgASgMQge6SAR6AmggInIKF0dldERldmVsb3BlcktleVJlc3BvbnNlEhUKDWRldmVsb3Blcl9rZXkYASABKAwSEgoKZXhwaXJlc19hdBgCIAEoAxIZChFzZXJ2ZXJfcHVibGljX2tleRgDIAEoDBIRCglrZXlfZXBvY2gYBCABKAMiqwEKGFJlZ2lzdGVyV2FsbHBhcGVyUmVxdWVzdBIVCgRzbHVnGAEgASgJQge6SARyAhABEhUKBG5hbWUYAiABKAlCB7pIBHICEAESHAoLY29udGVudF9rZXkYBCABKAxCB7pIBHoCaCASNAoHbmV0d29yaxgFIAMoCzIjLmZsdXhsYXkud2FsbHBhcGVyLnYxLk5ldHdvcmtPcmlnaW5KBAgDEARSB3ZlcnNpb24iawoZUmVnaXN0ZXJXYWxscGFwZXJSZXNwb25zZRIUCgx3YWxscGFwZXJfaWQYASABKAkSEgoKdmVyc2lvbl9pZBgCIAEoCRISCgp1cGxvYWRfdXJsGAMgASgJEhAKCHJldmlzaW9uGAQgASgFIokBChRHZXRDb250ZW50S2V5UmVxdWVzdBIcCgp2ZXJzaW9uX2lkGAEgASgJQgi6SAVyA7ABARIVCgRzYWx0GAIgASgMQge6SAR6AmggEhgKEHByb3RvY29sX3ZlcnNpb24YAyABKA0SIgoRZGV2aWNlX3B1YmxpY19rZXkYBCABKAxCB7pIBHoCaCAibgoVR2V0Q29udGVudEtleVJlc3BvbnNlEhMKC2NvbnRlbnRfa2V5GAEgASgMEhIKCmV4cGlyZXNfYXQYAiABKAMSGQoRc2VydmVyX3B1YmxpY19rZXkYAyABKAwSEQoJa2V5X2Vwb2NoGAQgASgDIloKGFJlZ2lzdGVyRGV2aWNlS2V5UmVxdWVzdBIaCglkZXZpY2VfaWQYASABKAlCB7pIBHICEAESIgoRZGV2aWNlX3B1YmxpY19rZXkYAiABKAxCB7pIBHoCaCAiGwoZUmVnaXN0ZXJEZXZpY2VLZXlSZXNwb25zZSIUChJHZXRLZXlFcG9jaFJlcXVlc3QiKAoTR2V0S2V5RXBvY2hSZXNwb25zZRIRCglrZXlfZXBvY2gYASABKAMiMwoUQ29uZmlybVVwbG9hZFJlcXVlc3QSGwoKdmVyc2lvbl9pZBgBIAEoCUIHukgEcgIQASIXChVDb25maXJtVXBsb2FkUmVzcG9uc2UiMgoTQ2FuY2VsVXBsb2FkUmVxdWVzdBIbCgp2ZXJzaW9uX2lkGAEgASgJQge6SARyAhABIhYKFENhbmNlbFVwbG9hZFJlc3BvbnNlIi4KClByaWNlRW50cnkSEAoIY3VycmVuY3kYASABKAkSDgoGYW1vdW50GAIgASgDImwKGFNldFdhbGxwYXBlclByaWNlUmVxdWVzdBIeCgx3YWxscGFwZXJfaWQYASABKAlCCLpIBXIDsAEBEjAKBnByaWNlcxgCIAMoCzIgLmZsdXhsYXkud2FsbHBhcGVyLnYxLlByaWNlRW50cnkiTwoZU2V0V2FsbHBhcGVyUHJpY2VSZXNwb25zZRIyCgl3YWxscGFwZXIYASABKAsyHy5mbHV4bGF5LndhbGxwYXBlci52MS5XYWxscGFwZXIiPAoaUmVjb3JkV2FsbHBhcGVyVmlld1JlcXVlc3QSHgoMd2FsbHBhcGVyX2lkGAEgASgJQgi6SAVyA7ABASIdChtSZWNvcmRXYWxscGFwZXJWaWV3UmVzcG9uc2UiJQojR2V0Q3JlYXRvclBlcmZvcm1hbmNlU3VtbWFyeVJlcXVlc3QiiAEKJEdldENyZWF0b3JQZXJmb3JtYW5jZVN1bW1hcnlSZXNwb25zZRIRCgl2aWV3c18zMGQYASABKAMSFAoMbGljZW5zZXNfMzBkGAIgASgDEjcKDnRvcF93YWxscGFwZXJzGAMgAygLMh8uZmx1eGxheS53YWxscGFwZXIudjEuV2FsbHBhcGVyKu8BCg9XYWxscGFwZXJTdGF0dXMSIAocV0FMTFBBUEVSX1NUQVRVU19VTlNQRUNJRklFRBAAEh4KGldBTExQQVBFUl9TVEFUVVNfVVBMT0FESU5HEAESGgoWV0FMTFBBUEVSX1NUQVRVU19EUkFGVBACEhsKF1dBTExQQVBFUl9TVEFUVVNfQUNUSVZFEAMSHwobV0FMTFBBUEVSX1NUQVRVU19QVUJMSVNISU5HEAQSIQodV0FMTFBBUEVSX1NUQVRVU19VTkRFUl9SRVZJRVcQBRIdChlXQUxMUEFQRVJfU1RBVFVTX1JFSkVDVEVEEAYqnQEKD1dhbGxwYXBlclNvcnRCeRIhCh1XQUxMUEFQRVJfU09SVF9CWV9VTlNQRUNJRklFRBAAEiAKHFdBTExQQVBFUl9TT1JUX0JZX0NSRUFURURfQVQQARIjCh9XQUxMUEFQRVJfU09SVF9CWV9MSUNFTlNFX0NPVU5UEAISIAocV0FMTFBBUEVSX1NPUlRfQllfVklFV19DT1VOVBADQuUBChhjb20uZmx1eGxheS53YWxscGFwZXIudjFCDldhbGxwYXBlclByb3RvUAFaR2dpdGh1Yi5jb20va2VuMTA5L2ZsdXhsYXktcHJvdG8vZ2VuL2dvL2ZsdXhsYXkvd2FsbHBhcGVyL3YxO3dhbGxwYXBlcnYxogIDRldYqgIURmx1eGxheS5XYWxscGFwZXIuVjHKAhRGbHV4bGF5XFdhbGxwYXBlclxWMeICIEZsdXhsYXlcV2FsbHBhcGVyXFYxXEdQQk1ldGFkYXRh6gIWRmx1eGxheTo6V2FsbHBhcGVyOjpWMWIGcHJvdG8z\", [file_buf_validate_validate, file_fluxlay_common_v1_bucket_object, file_google_protobuf_timestamp]);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.Author\n */\nexport type Author = Message<\"fluxlay.wallpaper.v1.Author\"> & {\n /**\n * @generated from field: string handle = 1;\n */\n handle: string;\n\n /**\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject avatar = 3;\n */\n avatar?: BucketObject | undefined;\n};\n\nexport type AuthorValid = Author;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.Author.\n * Use `create(AuthorSchema)` to create a new message.\n */\nexport const AuthorSchema: GenMessage<Author, {validType: AuthorValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 0);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.Wallpaper\n */\nexport type Wallpaper = Message<\"fluxlay.wallpaper.v1.Wallpaper\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: string slug = 13;\n */\n slug: string;\n\n /**\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: string description = 5;\n */\n description: string;\n\n /**\n * @generated from field: string thumbnail_url = 6;\n */\n thumbnailUrl: string;\n\n /**\n * @generated from field: string entry_url = 7;\n */\n entryUrl: string;\n\n /**\n * @generated from field: repeated string tags = 8;\n */\n tags: string[];\n\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.WallpaperPreview previews = 9;\n */\n previews: WallpaperPreview[];\n\n /**\n * @generated from field: fluxlay.wallpaper.v1.WallpaperStatus status = 10;\n */\n status: WallpaperStatus;\n\n /**\n * @generated from field: google.protobuf.Timestamp created_at = 11;\n */\n createdAt?: Timestamp | undefined;\n\n /**\n * @generated from field: google.protobuf.Timestamp updated_at = 12;\n */\n updatedAt?: Timestamp | undefined;\n\n /**\n * @generated from field: bool is_owned = 14;\n */\n isOwned: boolean;\n\n /**\n * @generated from field: string license_id = 15;\n */\n licenseId: string;\n\n /**\n * @generated from field: string user_id = 16;\n */\n userId: string;\n\n /**\n * @generated from field: string latest_version_id = 17;\n */\n latestVersionId: string;\n\n /**\n * @generated from field: fluxlay.wallpaper.v1.Author author_profile = 18;\n */\n authorProfile?: Author | undefined;\n\n /**\n * @generated from field: fluxlay.wallpaper.v1.WallpaperPrice price = 19;\n */\n price?: WallpaperPrice | undefined;\n\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.WallpaperPrice prices = 20;\n */\n prices: WallpaperPrice[];\n\n /**\n * 初回公開日時。一度公開された後はバージョンアップで active が入れ替わっても不変。\n * VideoObject.uploadDate / sitemap lastmod のソースに使う。\n *\n * @generated from field: optional google.protobuf.Timestamp published_at = 21;\n */\n publishedAt?: Timestamp | undefined;\n\n /**\n * この壁紙が宣言する外部ネットワークアクセス先(返却バージョン単位)。\n * 詳細ページでインストール前にユーザーへ提示する。\n *\n * @generated from field: repeated fluxlay.wallpaper.v1.NetworkOrigin network = 22;\n */\n network: NetworkOrigin[];\n\n /**\n * ログインユーザーがこの壁紙をピン留めしているか。未ログイン時は false。\n *\n * @generated from field: bool is_pinned = 23;\n */\n isPinned: boolean;\n\n /**\n * 累計ビュー数。公開ギャラリー・詳細でも誰でも閲覧可(社会的証明)。\n *\n * @generated from field: int64 view_count = 24;\n */\n viewCount: bigint;\n\n /**\n * 作者本人にのみ返すクリエイター統計。requester == owner のときのみ populate される。\n * 販売数(license_count)は競争的に敏感なためここに隔離し、公開しない。\n *\n * @generated from field: optional fluxlay.wallpaper.v1.WallpaperCreatorStats creator_stats = 25;\n */\n creatorStats?: WallpaperCreatorStats | undefined;\n\n /**\n * サーバー自動採番の整数リビジョン(壁紙ごとに 1 起点の連番)。返却バージョンの\n * リビジョン。詳細・履歴で `rev N` として表示する。未公開等で不定なら 0。\n *\n * @generated from field: int32 revision = 26;\n */\n revision: number;\n};\n\nexport type WallpaperValid = Wallpaper;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.Wallpaper.\n * Use `create(WallpaperSchema)` to create a new message.\n */\nexport const WallpaperSchema: GenMessage<Wallpaper, {validType: WallpaperValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 1);\n\n/**\n * WallpaperCreatorStats は作者本人だけに見せるクリエイター向け作品統計。\n *\n * @generated from message fluxlay.wallpaper.v1.WallpaperCreatorStats\n */\nexport type WallpaperCreatorStats = Message<\"fluxlay.wallpaper.v1.WallpaperCreatorStats\"> & {\n /**\n * 累計ライセンス取得数(= 販売/取得数)。\n *\n * @generated from field: int64 license_count = 1;\n */\n licenseCount: bigint;\n\n /**\n * 直近 30 日のビュー数。\n *\n * @generated from field: int64 views_30d = 2;\n */\n views30d: bigint;\n\n /**\n * 直近 30 日のライセンス取得数。\n *\n * @generated from field: int64 licenses_30d = 3;\n */\n licenses30d: bigint;\n\n /**\n * ビュー増加率(直近 30 日 vs その前 30 日)。前期間が 0 の場合、当期間に\n * ビューがあれば 1.0、無ければ 0。例: 0.5 = +50%、-0.2 = -20%。\n *\n * @generated from field: double view_growth_rate = 4;\n */\n viewGrowthRate: number;\n};\n\nexport type WallpaperCreatorStatsValid = WallpaperCreatorStats;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.WallpaperCreatorStats.\n * Use `create(WallpaperCreatorStatsSchema)` to create a new message.\n */\nexport const WallpaperCreatorStatsSchema: GenMessage<WallpaperCreatorStats, {validType: WallpaperCreatorStatsValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 2);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.WallpaperPrice\n */\nexport type WallpaperPrice = Message<\"fluxlay.wallpaper.v1.WallpaperPrice\"> & {\n /**\n * @generated from field: string currency = 1;\n */\n currency: string;\n\n /**\n * @generated from field: int64 amount = 2;\n */\n amount: bigint;\n};\n\nexport type WallpaperPriceValid = WallpaperPrice;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.WallpaperPrice.\n * Use `create(WallpaperPriceSchema)` to create a new message.\n */\nexport const WallpaperPriceSchema: GenMessage<WallpaperPrice, {validType: WallpaperPriceValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 3);\n\n/**\n * 壁紙が fluxlay.yaml の network[] で宣言する外部通信先。\n *\n * @generated from message fluxlay.wallpaper.v1.NetworkOrigin\n */\nexport type NetworkOrigin = Message<\"fluxlay.wallpaper.v1.NetworkOrigin\"> & {\n /**\n * @generated from field: string origin = 1;\n */\n origin: string;\n\n /**\n * @generated from field: string reason = 2;\n */\n reason: string;\n};\n\nexport type NetworkOriginValid = NetworkOrigin;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.NetworkOrigin.\n * Use `create(NetworkOriginSchema)` to create a new message.\n */\nexport const NetworkOriginSchema: GenMessage<NetworkOrigin, {validType: NetworkOriginValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 4);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.WallpaperPreview\n */\nexport type WallpaperPreview = Message<\"fluxlay.wallpaper.v1.WallpaperPreview\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: fluxlay.common.v1.BucketObject object = 2;\n */\n object?: BucketObject | undefined;\n\n /**\n * @generated from field: int32 order = 3;\n */\n order: number;\n\n /**\n * メディアの寸法(画像・動画ともに保存)。VideoObject / ImageObject の width / height に利用。\n *\n * @generated from field: optional int32 width = 4;\n */\n width?: number | undefined;\n\n /**\n * @generated from field: optional int32 height = 5;\n */\n height?: number | undefined;\n\n /**\n * 動画のみ。VideoObject.duration (ISO 8601 PT<n>S 形式) に利用。\n *\n * @generated from field: optional int32 duration_seconds = 6;\n */\n durationSeconds?: number | undefined;\n};\n\nexport type WallpaperPreviewValid = WallpaperPreview;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.WallpaperPreview.\n * Use `create(WallpaperPreviewSchema)` to create a new message.\n */\nexport const WallpaperPreviewSchema: GenMessage<WallpaperPreview, {validType: WallpaperPreviewValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 5);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.AcquireWallpaperRequest\n */\nexport type AcquireWallpaperRequest = Message<\"fluxlay.wallpaper.v1.AcquireWallpaperRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n};\n\nexport type AcquireWallpaperRequestValid = AcquireWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.AcquireWallpaperRequest.\n * Use `create(AcquireWallpaperRequestSchema)` to create a new message.\n */\nexport const AcquireWallpaperRequestSchema: GenMessage<AcquireWallpaperRequest, {validType: AcquireWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 6);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.AcquireWallpaperResponse\n */\nexport type AcquireWallpaperResponse = Message<\"fluxlay.wallpaper.v1.AcquireWallpaperResponse\"> & {\n};\n\nexport type AcquireWallpaperResponseValid = AcquireWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.AcquireWallpaperResponse.\n * Use `create(AcquireWallpaperResponseSchema)` to create a new message.\n */\nexport const AcquireWallpaperResponseSchema: GenMessage<AcquireWallpaperResponse, {validType: AcquireWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 7);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListOwnedWallpapersRequest\n */\nexport type ListOwnedWallpapersRequest = Message<\"fluxlay.wallpaper.v1.ListOwnedWallpapersRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n};\n\nexport type ListOwnedWallpapersRequestValid = ListOwnedWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListOwnedWallpapersRequest.\n * Use `create(ListOwnedWallpapersRequestSchema)` to create a new message.\n */\nexport const ListOwnedWallpapersRequestSchema: GenMessage<ListOwnedWallpapersRequest, {validType: ListOwnedWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 8);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListOwnedWallpapersResponse\n */\nexport type ListOwnedWallpapersResponse = Message<\"fluxlay.wallpaper.v1.ListOwnedWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n};\n\nexport type ListOwnedWallpapersResponseValid = ListOwnedWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListOwnedWallpapersResponse.\n * Use `create(ListOwnedWallpapersResponseSchema)` to create a new message.\n */\nexport const ListOwnedWallpapersResponseSchema: GenMessage<ListOwnedWallpapersResponse, {validType: ListOwnedWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 9);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.PinWallpaperRequest\n */\nexport type PinWallpaperRequest = Message<\"fluxlay.wallpaper.v1.PinWallpaperRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n};\n\nexport type PinWallpaperRequestValid = PinWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.PinWallpaperRequest.\n * Use `create(PinWallpaperRequestSchema)` to create a new message.\n */\nexport const PinWallpaperRequestSchema: GenMessage<PinWallpaperRequest, {validType: PinWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 10);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.PinWallpaperResponse\n */\nexport type PinWallpaperResponse = Message<\"fluxlay.wallpaper.v1.PinWallpaperResponse\"> & {\n};\n\nexport type PinWallpaperResponseValid = PinWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.PinWallpaperResponse.\n * Use `create(PinWallpaperResponseSchema)` to create a new message.\n */\nexport const PinWallpaperResponseSchema: GenMessage<PinWallpaperResponse, {validType: PinWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 11);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UnpinWallpaperRequest\n */\nexport type UnpinWallpaperRequest = Message<\"fluxlay.wallpaper.v1.UnpinWallpaperRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n};\n\nexport type UnpinWallpaperRequestValid = UnpinWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UnpinWallpaperRequest.\n * Use `create(UnpinWallpaperRequestSchema)` to create a new message.\n */\nexport const UnpinWallpaperRequestSchema: GenMessage<UnpinWallpaperRequest, {validType: UnpinWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 12);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UnpinWallpaperResponse\n */\nexport type UnpinWallpaperResponse = Message<\"fluxlay.wallpaper.v1.UnpinWallpaperResponse\"> & {\n};\n\nexport type UnpinWallpaperResponseValid = UnpinWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UnpinWallpaperResponse.\n * Use `create(UnpinWallpaperResponseSchema)` to create a new message.\n */\nexport const UnpinWallpaperResponseSchema: GenMessage<UnpinWallpaperResponse, {validType: UnpinWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 13);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListUserWallpapersRequest\n */\nexport type ListUserWallpapersRequest = Message<\"fluxlay.wallpaper.v1.ListUserWallpapersRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n\n /**\n * 並び順(新着 / ビュー / ライセンス)。クリエイターの作品一覧タブで使う。\n *\n * @generated from field: fluxlay.wallpaper.v1.WallpaperSortBy sort_by = 3;\n */\n sortBy: WallpaperSortBy;\n\n /**\n * ステータス絞り込み。UNSPECIFIED なら全件、指定時はそのステータス(最新バージョン基準)のみ返す。\n * 下書きフィルタ等に使う。\n *\n * @generated from field: fluxlay.wallpaper.v1.WallpaperStatus status_filter = 4;\n */\n statusFilter: WallpaperStatus;\n};\n\nexport type ListUserWallpapersRequestValid = ListUserWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListUserWallpapersRequest.\n * Use `create(ListUserWallpapersRequestSchema)` to create a new message.\n */\nexport const ListUserWallpapersRequestSchema: GenMessage<ListUserWallpapersRequest, {validType: ListUserWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 14);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListUserWallpapersResponse\n */\nexport type ListUserWallpapersResponse = Message<\"fluxlay.wallpaper.v1.ListUserWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n};\n\nexport type ListUserWallpapersResponseValid = ListUserWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListUserWallpapersResponse.\n * Use `create(ListUserWallpapersResponseSchema)` to create a new message.\n */\nexport const ListUserWallpapersResponseSchema: GenMessage<ListUserWallpapersResponse, {validType: ListUserWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 15);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UpdateWallpaperMetadataRequest\n */\nexport type UpdateWallpaperMetadataRequest = Message<\"fluxlay.wallpaper.v1.UpdateWallpaperMetadataRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: optional string name = 2;\n */\n name?: string | undefined;\n\n /**\n * @generated from field: optional string description = 3;\n */\n description?: string | undefined;\n\n /**\n * @generated from field: repeated string tags = 4;\n */\n tags: string[];\n};\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UpdateWallpaperMetadataRequest\n */\nexport type UpdateWallpaperMetadataRequestValid = Message<\"fluxlay.wallpaper.v1.UpdateWallpaperMetadataRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: optional string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: optional string description = 3;\n */\n description?: string | undefined;\n\n /**\n * @generated from field: repeated string tags = 4;\n */\n tags: string[];\n};\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UpdateWallpaperMetadataRequest.\n * Use `create(UpdateWallpaperMetadataRequestSchema)` to create a new message.\n */\nexport const UpdateWallpaperMetadataRequestSchema: GenMessage<UpdateWallpaperMetadataRequest, {validType: UpdateWallpaperMetadataRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 16);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UpdateWallpaperMetadataResponse\n */\nexport type UpdateWallpaperMetadataResponse = Message<\"fluxlay.wallpaper.v1.UpdateWallpaperMetadataResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.Wallpaper wallpaper = 1;\n */\n wallpaper?: Wallpaper | undefined;\n};\n\nexport type UpdateWallpaperMetadataResponseValid = UpdateWallpaperMetadataResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UpdateWallpaperMetadataResponse.\n * Use `create(UpdateWallpaperMetadataResponseSchema)` to create a new message.\n */\nexport const UpdateWallpaperMetadataResponseSchema: GenMessage<UpdateWallpaperMetadataResponse, {validType: UpdateWallpaperMetadataResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 17);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.CreatePreviewUploadURLRequest\n */\nexport type CreatePreviewUploadURLRequest = Message<\"fluxlay.wallpaper.v1.CreatePreviewUploadURLRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: string content_type = 2;\n */\n contentType: string;\n};\n\nexport type CreatePreviewUploadURLRequestValid = CreatePreviewUploadURLRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.CreatePreviewUploadURLRequest.\n * Use `create(CreatePreviewUploadURLRequestSchema)` to create a new message.\n */\nexport const CreatePreviewUploadURLRequestSchema: GenMessage<CreatePreviewUploadURLRequest, {validType: CreatePreviewUploadURLRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 18);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.CreatePreviewUploadURLResponse\n */\nexport type CreatePreviewUploadURLResponse = Message<\"fluxlay.wallpaper.v1.CreatePreviewUploadURLResponse\"> & {\n /**\n * @generated from field: string preview_id = 1;\n */\n previewId: string;\n\n /**\n * @generated from field: string upload_url = 2;\n */\n uploadUrl: string;\n};\n\nexport type CreatePreviewUploadURLResponseValid = CreatePreviewUploadURLResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.CreatePreviewUploadURLResponse.\n * Use `create(CreatePreviewUploadURLResponseSchema)` to create a new message.\n */\nexport const CreatePreviewUploadURLResponseSchema: GenMessage<CreatePreviewUploadURLResponse, {validType: CreatePreviewUploadURLResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 19);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.AddPreviewImageRequest\n */\nexport type AddPreviewImageRequest = Message<\"fluxlay.wallpaper.v1.AddPreviewImageRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: string preview_id = 2;\n */\n previewId: string;\n\n /**\n * @generated from field: string content_type = 3;\n */\n contentType: string;\n};\n\nexport type AddPreviewImageRequestValid = AddPreviewImageRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.AddPreviewImageRequest.\n * Use `create(AddPreviewImageRequestSchema)` to create a new message.\n */\nexport const AddPreviewImageRequestSchema: GenMessage<AddPreviewImageRequest, {validType: AddPreviewImageRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 20);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.AddPreviewImageResponse\n */\nexport type AddPreviewImageResponse = Message<\"fluxlay.wallpaper.v1.AddPreviewImageResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.WallpaperPreview preview = 1;\n */\n preview?: WallpaperPreview | undefined;\n};\n\nexport type AddPreviewImageResponseValid = AddPreviewImageResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.AddPreviewImageResponse.\n * Use `create(AddPreviewImageResponseSchema)` to create a new message.\n */\nexport const AddPreviewImageResponseSchema: GenMessage<AddPreviewImageResponse, {validType: AddPreviewImageResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 21);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.DeletePreviewImageRequest\n */\nexport type DeletePreviewImageRequest = Message<\"fluxlay.wallpaper.v1.DeletePreviewImageRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n};\n\nexport type DeletePreviewImageRequestValid = DeletePreviewImageRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.DeletePreviewImageRequest.\n * Use `create(DeletePreviewImageRequestSchema)` to create a new message.\n */\nexport const DeletePreviewImageRequestSchema: GenMessage<DeletePreviewImageRequest, {validType: DeletePreviewImageRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 22);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.DeletePreviewImageResponse\n */\nexport type DeletePreviewImageResponse = Message<\"fluxlay.wallpaper.v1.DeletePreviewImageResponse\"> & {\n};\n\nexport type DeletePreviewImageResponseValid = DeletePreviewImageResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.DeletePreviewImageResponse.\n * Use `create(DeletePreviewImageResponseSchema)` to create a new message.\n */\nexport const DeletePreviewImageResponseSchema: GenMessage<DeletePreviewImageResponse, {validType: DeletePreviewImageResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 23);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.PublishWallpaperRequest\n */\nexport type PublishWallpaperRequest = Message<\"fluxlay.wallpaper.v1.PublishWallpaperRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n};\n\nexport type PublishWallpaperRequestValid = PublishWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.PublishWallpaperRequest.\n * Use `create(PublishWallpaperRequestSchema)` to create a new message.\n */\nexport const PublishWallpaperRequestSchema: GenMessage<PublishWallpaperRequest, {validType: PublishWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 24);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.PublishWallpaperResponse\n */\nexport type PublishWallpaperResponse = Message<\"fluxlay.wallpaper.v1.PublishWallpaperResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.Wallpaper wallpaper = 1;\n */\n wallpaper?: Wallpaper | undefined;\n};\n\nexport type PublishWallpaperResponseValid = PublishWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.PublishWallpaperResponse.\n * Use `create(PublishWallpaperResponseSchema)` to create a new message.\n */\nexport const PublishWallpaperResponseSchema: GenMessage<PublishWallpaperResponse, {validType: PublishWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 25);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UnpublishWallpaperRequest\n */\nexport type UnpublishWallpaperRequest = Message<\"fluxlay.wallpaper.v1.UnpublishWallpaperRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n};\n\nexport type UnpublishWallpaperRequestValid = UnpublishWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UnpublishWallpaperRequest.\n * Use `create(UnpublishWallpaperRequestSchema)` to create a new message.\n */\nexport const UnpublishWallpaperRequestSchema: GenMessage<UnpublishWallpaperRequest, {validType: UnpublishWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 26);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.UnpublishWallpaperResponse\n */\nexport type UnpublishWallpaperResponse = Message<\"fluxlay.wallpaper.v1.UnpublishWallpaperResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.Wallpaper wallpaper = 1;\n */\n wallpaper?: Wallpaper | undefined;\n};\n\nexport type UnpublishWallpaperResponseValid = UnpublishWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.UnpublishWallpaperResponse.\n * Use `create(UnpublishWallpaperResponseSchema)` to create a new message.\n */\nexport const UnpublishWallpaperResponseSchema: GenMessage<UnpublishWallpaperResponse, {validType: UnpublishWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 27);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.DeleteWallpaperRequest\n */\nexport type DeleteWallpaperRequest = Message<\"fluxlay.wallpaper.v1.DeleteWallpaperRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n};\n\nexport type DeleteWallpaperRequestValid = DeleteWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.DeleteWallpaperRequest.\n * Use `create(DeleteWallpaperRequestSchema)` to create a new message.\n */\nexport const DeleteWallpaperRequestSchema: GenMessage<DeleteWallpaperRequest, {validType: DeleteWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 28);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.DeleteWallpaperResponse\n */\nexport type DeleteWallpaperResponse = Message<\"fluxlay.wallpaper.v1.DeleteWallpaperResponse\"> & {\n};\n\nexport type DeleteWallpaperResponseValid = DeleteWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.DeleteWallpaperResponse.\n * Use `create(DeleteWallpaperResponseSchema)` to create a new message.\n */\nexport const DeleteWallpaperResponseSchema: GenMessage<DeleteWallpaperResponse, {validType: DeleteWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 29);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListWallpapersRequest\n */\nexport type ListWallpapersRequest = Message<\"fluxlay.wallpaper.v1.ListWallpapersRequest\"> & {\n /**\n * @generated from field: int32 page_size = 1;\n */\n pageSize: number;\n\n /**\n * @generated from field: string page_token = 2;\n */\n pageToken: string;\n\n /**\n * @generated from field: optional string user_id = 3;\n */\n userId?: string | undefined;\n\n /**\n * 任意のページに直接ジャンプするためのページ番号(1始まり)\n *\n * @generated from field: optional int32 page = 4;\n */\n page?: number | undefined;\n\n /**\n * ソート順\n *\n * @generated from field: fluxlay.wallpaper.v1.WallpaperSortBy sort_by = 5;\n */\n sortBy: WallpaperSortBy;\n};\n\nexport type ListWallpapersRequestValid = ListWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListWallpapersRequest.\n * Use `create(ListWallpapersRequestSchema)` to create a new message.\n */\nexport const ListWallpapersRequestSchema: GenMessage<ListWallpapersRequest, {validType: ListWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 30);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListWallpapersResponse\n */\nexport type ListWallpapersResponse = Message<\"fluxlay.wallpaper.v1.ListWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n\n /**\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n\n /**\n * @generated from field: int32 total_count = 3;\n */\n totalCount: number;\n};\n\nexport type ListWallpapersResponseValid = ListWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListWallpapersResponse.\n * Use `create(ListWallpapersResponseSchema)` to create a new message.\n */\nexport const ListWallpapersResponseSchema: GenMessage<ListWallpapersResponse, {validType: ListWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 31);\n\n/**\n * 壁紙のハイブリッド検索(キーワード + セマンティックの RRF 融合)。\n *\n * @generated from message fluxlay.wallpaper.v1.SearchWallpapersRequest\n */\nexport type SearchWallpapersRequest = Message<\"fluxlay.wallpaper.v1.SearchWallpapersRequest\"> & {\n /**\n * 検索クエリ。空ならタグ絞り込み + 新着順の一覧になる。\n *\n * @generated from field: string query = 1;\n */\n query: string;\n\n /**\n * タグ絞り込み(指定タグをすべて含む壁紙のみ)。\n *\n * @generated from field: repeated string tags = 2;\n */\n tags: string[];\n\n /**\n * @generated from field: int32 page_size = 3;\n */\n pageSize: number;\n\n /**\n * 1 始まりのページ番号。\n *\n * @generated from field: optional int32 page = 4;\n */\n page?: number | undefined;\n};\n\nexport type SearchWallpapersRequestValid = SearchWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.SearchWallpapersRequest.\n * Use `create(SearchWallpapersRequestSchema)` to create a new message.\n */\nexport const SearchWallpapersRequestSchema: GenMessage<SearchWallpapersRequest, {validType: SearchWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 32);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.SearchWallpapersResponse\n */\nexport type SearchWallpapersResponse = Message<\"fluxlay.wallpaper.v1.SearchWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n};\n\nexport type SearchWallpapersResponseValid = SearchWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.SearchWallpapersResponse.\n * Use `create(SearchWallpapersResponseSchema)` to create a new message.\n */\nexport const SearchWallpapersResponseSchema: GenMessage<SearchWallpapersResponse, {validType: SearchWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 33);\n\n/**\n * ギャラリーの Hero 用ピックアップ。動画プレビューを持つ壁紙から\n * trending(直近のライセンス取得数) / fresh(新着) / popular(全期間ライセンス数)\n * を重み付き RRF で融合し、時間バケット seed でシャッフルして返す。\n *\n * @generated from message fluxlay.wallpaper.v1.ListFeaturedWallpapersRequest\n */\nexport type ListFeaturedWallpapersRequest = Message<\"fluxlay.wallpaper.v1.ListFeaturedWallpapersRequest\"> & {\n /**\n * @generated from field: int32 limit = 1;\n */\n limit: number;\n};\n\nexport type ListFeaturedWallpapersRequestValid = ListFeaturedWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListFeaturedWallpapersRequest.\n * Use `create(ListFeaturedWallpapersRequestSchema)` to create a new message.\n */\nexport const ListFeaturedWallpapersRequestSchema: GenMessage<ListFeaturedWallpapersRequest, {validType: ListFeaturedWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 34);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListFeaturedWallpapersResponse\n */\nexport type ListFeaturedWallpapersResponse = Message<\"fluxlay.wallpaper.v1.ListFeaturedWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n};\n\nexport type ListFeaturedWallpapersResponseValid = ListFeaturedWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListFeaturedWallpapersResponse.\n * Use `create(ListFeaturedWallpapersResponseSchema)` to create a new message.\n */\nexport const ListFeaturedWallpapersResponseSchema: GenMessage<ListFeaturedWallpapersResponse, {validType: ListFeaturedWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 35);\n\n/**\n * ある壁紙の事前計算済み関連壁紙を返す。\n *\n * @generated from message fluxlay.wallpaper.v1.ListRelatedWallpapersRequest\n */\nexport type ListRelatedWallpapersRequest = Message<\"fluxlay.wallpaper.v1.ListRelatedWallpapersRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: optional int32 limit = 2;\n */\n limit?: number | undefined;\n};\n\nexport type ListRelatedWallpapersRequestValid = ListRelatedWallpapersRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListRelatedWallpapersRequest.\n * Use `create(ListRelatedWallpapersRequestSchema)` to create a new message.\n */\nexport const ListRelatedWallpapersRequestSchema: GenMessage<ListRelatedWallpapersRequest, {validType: ListRelatedWallpapersRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 36);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ListRelatedWallpapersResponse\n */\nexport type ListRelatedWallpapersResponse = Message<\"fluxlay.wallpaper.v1.ListRelatedWallpapersResponse\"> & {\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper wallpapers = 1;\n */\n wallpapers: Wallpaper[];\n};\n\nexport type ListRelatedWallpapersResponseValid = ListRelatedWallpapersResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ListRelatedWallpapersResponse.\n * Use `create(ListRelatedWallpapersResponseSchema)` to create a new message.\n */\nexport const ListRelatedWallpapersResponseSchema: GenMessage<ListRelatedWallpapersResponse, {validType: ListRelatedWallpapersResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 37);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.HandleSlug\n */\nexport type HandleSlug = Message<\"fluxlay.wallpaper.v1.HandleSlug\"> & {\n /**\n * @generated from field: string handle = 1;\n */\n handle: string;\n\n /**\n * @generated from field: string slug = 2;\n */\n slug: string;\n};\n\nexport type HandleSlugValid = HandleSlug;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.HandleSlug.\n * Use `create(HandleSlugSchema)` to create a new message.\n */\nexport const HandleSlugSchema: GenMessage<HandleSlug, {validType: HandleSlugValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 38);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetWallpaperRequest\n */\nexport type GetWallpaperRequest = Message<\"fluxlay.wallpaper.v1.GetWallpaperRequest\"> & {\n /**\n * @generated from oneof fluxlay.wallpaper.v1.GetWallpaperRequest.identifier\n */\n identifier: {\n /**\n * @generated from field: string id = 1;\n */\n value: string;\n case: \"id\";\n } | {\n /**\n * @generated from field: string slug = 2;\n */\n value: string;\n case: \"slug\";\n } | {\n /**\n * @generated from field: fluxlay.wallpaper.v1.HandleSlug handle_slug = 3;\n */\n value: HandleSlug;\n case: \"handleSlug\";\n } | { case: undefined; value?: undefined };\n\n /**\n * trueの場合、公開済み(active)バージョンのみ含める\n *\n * @generated from field: bool active_only = 4;\n */\n activeOnly: boolean;\n};\n\nexport type GetWallpaperRequestValid = GetWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetWallpaperRequest.\n * Use `create(GetWallpaperRequestSchema)` to create a new message.\n */\nexport const GetWallpaperRequestSchema: GenMessage<GetWallpaperRequest, {validType: GetWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 39);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetWallpaperResponse\n */\nexport type GetWallpaperResponse = Message<\"fluxlay.wallpaper.v1.GetWallpaperResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.Wallpaper wallpaper = 1;\n */\n wallpaper?: Wallpaper | undefined;\n};\n\nexport type GetWallpaperResponseValid = GetWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetWallpaperResponse.\n * Use `create(GetWallpaperResponseSchema)` to create a new message.\n */\nexport const GetWallpaperResponseSchema: GenMessage<GetWallpaperResponse, {validType: GetWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 40);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetDeveloperKeyRequest\n */\nexport type GetDeveloperKeyRequest = Message<\"fluxlay.wallpaper.v1.GetDeveloperKeyRequest\"> & {\n /**\n * @generated from field: bytes salt = 1;\n */\n salt: Uint8Array;\n\n /**\n * 鍵配送プロトコルのバージョン。FLX3 では 2 を要求する。\n *\n * @generated from field: uint32 protocol_version = 2;\n */\n protocolVersion: number;\n\n /**\n * 端末の X25519 公開鍵(32B)。サーバーはこれと静的秘密鍵で IKM を導出する。\n *\n * @generated from field: bytes device_public_key = 3;\n */\n devicePublicKey: Uint8Array;\n};\n\nexport type GetDeveloperKeyRequestValid = GetDeveloperKeyRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetDeveloperKeyRequest.\n * Use `create(GetDeveloperKeyRequestSchema)` to create a new message.\n */\nexport const GetDeveloperKeyRequestSchema: GenMessage<GetDeveloperKeyRequest, {validType: GetDeveloperKeyRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 41);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetDeveloperKeyResponse\n */\nexport type GetDeveloperKeyResponse = Message<\"fluxlay.wallpaper.v1.GetDeveloperKeyResponse\"> & {\n /**\n * @generated from field: bytes developer_key = 1;\n */\n developerKey: Uint8Array;\n\n /**\n * 鍵キャッシュの有効期限(UNIX 秒)。app はこの期限内のみキャッシュを使う。\n *\n * @generated from field: int64 expires_at = 2;\n */\n expiresAt: bigint;\n\n /**\n * この wrap に使ったサーバー静的 X25519 公開鍵(32B)。クライアントはこれで IKM を導出する。\n * レスポンスに含めることで、ピン留め無しでサーバー側だけで鍵ローテーション可能にする。\n *\n * @generated from field: bytes server_public_key = 3;\n */\n serverPublicKey: Uint8Array;\n\n /**\n * 発行時点のユーザー鍵 epoch。app はキャッシュにこれを保存し、GetKeyEpoch と照合する。\n *\n * @generated from field: int64 key_epoch = 4;\n */\n keyEpoch: bigint;\n};\n\nexport type GetDeveloperKeyResponseValid = GetDeveloperKeyResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetDeveloperKeyResponse.\n * Use `create(GetDeveloperKeyResponseSchema)` to create a new message.\n */\nexport const GetDeveloperKeyResponseSchema: GenMessage<GetDeveloperKeyResponse, {validType: GetDeveloperKeyResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 42);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.RegisterWallpaperRequest\n */\nexport type RegisterWallpaperRequest = Message<\"fluxlay.wallpaper.v1.RegisterWallpaperRequest\"> & {\n /**\n * @generated from field: string slug = 1;\n */\n slug: string;\n\n /**\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * @generated from field: bytes content_key = 4;\n */\n contentKey: Uint8Array;\n\n /**\n * fluxlay.yaml の network[] 宣言。公開バージョンに紐づけて保存する。\n *\n * @generated from field: repeated fluxlay.wallpaper.v1.NetworkOrigin network = 5;\n */\n network: NetworkOrigin[];\n};\n\nexport type RegisterWallpaperRequestValid = RegisterWallpaperRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.RegisterWallpaperRequest.\n * Use `create(RegisterWallpaperRequestSchema)` to create a new message.\n */\nexport const RegisterWallpaperRequestSchema: GenMessage<RegisterWallpaperRequest, {validType: RegisterWallpaperRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 43);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.RegisterWallpaperResponse\n */\nexport type RegisterWallpaperResponse = Message<\"fluxlay.wallpaper.v1.RegisterWallpaperResponse\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: string version_id = 2;\n */\n versionId: string;\n\n /**\n * @generated from field: string upload_url = 3;\n */\n uploadUrl: string;\n\n /**\n * サーバーが採番したリビジョン(壁紙ごとに 1 起点の連番)。\n *\n * @generated from field: int32 revision = 4;\n */\n revision: number;\n};\n\nexport type RegisterWallpaperResponseValid = RegisterWallpaperResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.RegisterWallpaperResponse.\n * Use `create(RegisterWallpaperResponseSchema)` to create a new message.\n */\nexport const RegisterWallpaperResponseSchema: GenMessage<RegisterWallpaperResponse, {validType: RegisterWallpaperResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 44);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetContentKeyRequest\n */\nexport type GetContentKeyRequest = Message<\"fluxlay.wallpaper.v1.GetContentKeyRequest\"> & {\n /**\n * @generated from field: string version_id = 1;\n */\n versionId: string;\n\n /**\n * @generated from field: bytes salt = 2;\n */\n salt: Uint8Array;\n\n /**\n * 鍵配送プロトコルのバージョン。FLX3 では 2 を要求する。\n *\n * @generated from field: uint32 protocol_version = 3;\n */\n protocolVersion: number;\n\n /**\n * 端末の X25519 公開鍵(32B)。\n *\n * @generated from field: bytes device_public_key = 4;\n */\n devicePublicKey: Uint8Array;\n};\n\nexport type GetContentKeyRequestValid = GetContentKeyRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetContentKeyRequest.\n * Use `create(GetContentKeyRequestSchema)` to create a new message.\n */\nexport const GetContentKeyRequestSchema: GenMessage<GetContentKeyRequest, {validType: GetContentKeyRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 45);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetContentKeyResponse\n */\nexport type GetContentKeyResponse = Message<\"fluxlay.wallpaper.v1.GetContentKeyResponse\"> & {\n /**\n * @generated from field: bytes content_key = 1;\n */\n contentKey: Uint8Array;\n\n /**\n * 鍵キャッシュの有効期限(UNIX 秒)。期限切れ時は app が再取得する。\n *\n * @generated from field: int64 expires_at = 2;\n */\n expiresAt: bigint;\n\n /**\n * この wrap に使ったサーバー静的 X25519 公開鍵(32B)。クライアントはこれで IKM を導出する。\n *\n * @generated from field: bytes server_public_key = 3;\n */\n serverPublicKey: Uint8Array;\n\n /**\n * 発行時点のユーザー鍵 epoch。app はキャッシュにこれを保存し、GetKeyEpoch と照合する。\n *\n * @generated from field: int64 key_epoch = 4;\n */\n keyEpoch: bigint;\n};\n\nexport type GetContentKeyResponseValid = GetContentKeyResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetContentKeyResponse.\n * Use `create(GetContentKeyResponseSchema)` to create a new message.\n */\nexport const GetContentKeyResponseSchema: GenMessage<GetContentKeyResponse, {validType: GetContentKeyResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 46);\n\n/**\n * 端末ごとの X25519 公開鍵を登録する。鍵配送 v2 の前提。\n *\n * @generated from message fluxlay.wallpaper.v1.RegisterDeviceKeyRequest\n */\nexport type RegisterDeviceKeyRequest = Message<\"fluxlay.wallpaper.v1.RegisterDeviceKeyRequest\"> & {\n /**\n * 端末を一意に識別する ID(app が生成・永続化)。\n *\n * @generated from field: string device_id = 1;\n */\n deviceId: string;\n\n /**\n * 端末の X25519 公開鍵(32B)。\n *\n * @generated from field: bytes device_public_key = 2;\n */\n devicePublicKey: Uint8Array;\n};\n\nexport type RegisterDeviceKeyRequestValid = RegisterDeviceKeyRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.RegisterDeviceKeyRequest.\n * Use `create(RegisterDeviceKeyRequestSchema)` to create a new message.\n */\nexport const RegisterDeviceKeyRequestSchema: GenMessage<RegisterDeviceKeyRequest, {validType: RegisterDeviceKeyRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 47);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.RegisterDeviceKeyResponse\n */\nexport type RegisterDeviceKeyResponse = Message<\"fluxlay.wallpaper.v1.RegisterDeviceKeyResponse\"> & {\n};\n\nexport type RegisterDeviceKeyResponseValid = RegisterDeviceKeyResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.RegisterDeviceKeyResponse.\n * Use `create(RegisterDeviceKeyResponseSchema)` to create a new message.\n */\nexport const RegisterDeviceKeyResponseSchema: GenMessage<RegisterDeviceKeyResponse, {validType: RegisterDeviceKeyResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 48);\n\n/**\n * 鍵キャッシュの強制無効化(即時失効)用 epoch を返す。\n * app はセッション開始時にこれを取得し、キャッシュ済み鍵の epoch と不一致なら\n * キャッシュを破棄して再取得する(サーバー側でライセンス再評価が走る)。\n *\n * @generated from message fluxlay.wallpaper.v1.GetKeyEpochRequest\n */\nexport type GetKeyEpochRequest = Message<\"fluxlay.wallpaper.v1.GetKeyEpochRequest\"> & {\n};\n\nexport type GetKeyEpochRequestValid = GetKeyEpochRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetKeyEpochRequest.\n * Use `create(GetKeyEpochRequestSchema)` to create a new message.\n */\nexport const GetKeyEpochRequestSchema: GenMessage<GetKeyEpochRequest, {validType: GetKeyEpochRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 49);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetKeyEpochResponse\n */\nexport type GetKeyEpochResponse = Message<\"fluxlay.wallpaper.v1.GetKeyEpochResponse\"> & {\n /**\n * 現在のユーザー鍵 epoch。失効オペレーションでインクリメントされる。\n *\n * @generated from field: int64 key_epoch = 1;\n */\n keyEpoch: bigint;\n};\n\nexport type GetKeyEpochResponseValid = GetKeyEpochResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetKeyEpochResponse.\n * Use `create(GetKeyEpochResponseSchema)` to create a new message.\n */\nexport const GetKeyEpochResponseSchema: GenMessage<GetKeyEpochResponse, {validType: GetKeyEpochResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 50);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ConfirmUploadRequest\n */\nexport type ConfirmUploadRequest = Message<\"fluxlay.wallpaper.v1.ConfirmUploadRequest\"> & {\n /**\n * @generated from field: string version_id = 1;\n */\n versionId: string;\n};\n\nexport type ConfirmUploadRequestValid = ConfirmUploadRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ConfirmUploadRequest.\n * Use `create(ConfirmUploadRequestSchema)` to create a new message.\n */\nexport const ConfirmUploadRequestSchema: GenMessage<ConfirmUploadRequest, {validType: ConfirmUploadRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 51);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.ConfirmUploadResponse\n */\nexport type ConfirmUploadResponse = Message<\"fluxlay.wallpaper.v1.ConfirmUploadResponse\"> & {\n};\n\nexport type ConfirmUploadResponseValid = ConfirmUploadResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.ConfirmUploadResponse.\n * Use `create(ConfirmUploadResponseSchema)` to create a new message.\n */\nexport const ConfirmUploadResponseSchema: GenMessage<ConfirmUploadResponse, {validType: ConfirmUploadResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 52);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.CancelUploadRequest\n */\nexport type CancelUploadRequest = Message<\"fluxlay.wallpaper.v1.CancelUploadRequest\"> & {\n /**\n * @generated from field: string version_id = 1;\n */\n versionId: string;\n};\n\nexport type CancelUploadRequestValid = CancelUploadRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.CancelUploadRequest.\n * Use `create(CancelUploadRequestSchema)` to create a new message.\n */\nexport const CancelUploadRequestSchema: GenMessage<CancelUploadRequest, {validType: CancelUploadRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 53);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.CancelUploadResponse\n */\nexport type CancelUploadResponse = Message<\"fluxlay.wallpaper.v1.CancelUploadResponse\"> & {\n};\n\nexport type CancelUploadResponseValid = CancelUploadResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.CancelUploadResponse.\n * Use `create(CancelUploadResponseSchema)` to create a new message.\n */\nexport const CancelUploadResponseSchema: GenMessage<CancelUploadResponse, {validType: CancelUploadResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 54);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.PriceEntry\n */\nexport type PriceEntry = Message<\"fluxlay.wallpaper.v1.PriceEntry\"> & {\n /**\n * @generated from field: string currency = 1;\n */\n currency: string;\n\n /**\n * @generated from field: int64 amount = 2;\n */\n amount: bigint;\n};\n\nexport type PriceEntryValid = PriceEntry;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.PriceEntry.\n * Use `create(PriceEntrySchema)` to create a new message.\n */\nexport const PriceEntrySchema: GenMessage<PriceEntry, {validType: PriceEntryValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 55);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.SetWallpaperPriceRequest\n */\nexport type SetWallpaperPriceRequest = Message<\"fluxlay.wallpaper.v1.SetWallpaperPriceRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n\n /**\n * @generated from field: repeated fluxlay.wallpaper.v1.PriceEntry prices = 2;\n */\n prices: PriceEntry[];\n};\n\nexport type SetWallpaperPriceRequestValid = SetWallpaperPriceRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.SetWallpaperPriceRequest.\n * Use `create(SetWallpaperPriceRequestSchema)` to create a new message.\n */\nexport const SetWallpaperPriceRequestSchema: GenMessage<SetWallpaperPriceRequest, {validType: SetWallpaperPriceRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 56);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.SetWallpaperPriceResponse\n */\nexport type SetWallpaperPriceResponse = Message<\"fluxlay.wallpaper.v1.SetWallpaperPriceResponse\"> & {\n /**\n * @generated from field: fluxlay.wallpaper.v1.Wallpaper wallpaper = 1;\n */\n wallpaper?: Wallpaper | undefined;\n};\n\nexport type SetWallpaperPriceResponseValid = SetWallpaperPriceResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.SetWallpaperPriceResponse.\n * Use `create(SetWallpaperPriceResponseSchema)` to create a new message.\n */\nexport const SetWallpaperPriceResponseSchema: GenMessage<SetWallpaperPriceResponse, {validType: SetWallpaperPriceResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 57);\n\n/**\n * 公開詳細ページのマウント時にクライアント(web / app)から発火するビュー計測。\n * 作者本人のビューはサーバー側で除外する。v1 は素朴なページビューカウント。\n *\n * @generated from message fluxlay.wallpaper.v1.RecordWallpaperViewRequest\n */\nexport type RecordWallpaperViewRequest = Message<\"fluxlay.wallpaper.v1.RecordWallpaperViewRequest\"> & {\n /**\n * @generated from field: string wallpaper_id = 1;\n */\n wallpaperId: string;\n};\n\nexport type RecordWallpaperViewRequestValid = RecordWallpaperViewRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.RecordWallpaperViewRequest.\n * Use `create(RecordWallpaperViewRequestSchema)` to create a new message.\n */\nexport const RecordWallpaperViewRequestSchema: GenMessage<RecordWallpaperViewRequest, {validType: RecordWallpaperViewRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 58);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.RecordWallpaperViewResponse\n */\nexport type RecordWallpaperViewResponse = Message<\"fluxlay.wallpaper.v1.RecordWallpaperViewResponse\"> & {\n};\n\nexport type RecordWallpaperViewResponseValid = RecordWallpaperViewResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.RecordWallpaperViewResponse.\n * Use `create(RecordWallpaperViewResponseSchema)` to create a new message.\n */\nexport const RecordWallpaperViewResponseSchema: GenMessage<RecordWallpaperViewResponse, {validType: RecordWallpaperViewResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 59);\n\n/**\n * クリエイターダッシュボードのトップ(Overview)用サマリ。認証必須・本人の作品のみ。\n *\n * @generated from message fluxlay.wallpaper.v1.GetCreatorPerformanceSummaryRequest\n */\nexport type GetCreatorPerformanceSummaryRequest = Message<\"fluxlay.wallpaper.v1.GetCreatorPerformanceSummaryRequest\"> & {\n};\n\nexport type GetCreatorPerformanceSummaryRequestValid = GetCreatorPerformanceSummaryRequest;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetCreatorPerformanceSummaryRequest.\n * Use `create(GetCreatorPerformanceSummaryRequestSchema)` to create a new message.\n */\nexport const GetCreatorPerformanceSummaryRequestSchema: GenMessage<GetCreatorPerformanceSummaryRequest, {validType: GetCreatorPerformanceSummaryRequestValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 60);\n\n/**\n * @generated from message fluxlay.wallpaper.v1.GetCreatorPerformanceSummaryResponse\n */\nexport type GetCreatorPerformanceSummaryResponse = Message<\"fluxlay.wallpaper.v1.GetCreatorPerformanceSummaryResponse\"> & {\n /**\n * 直近 30 日の自作品合計ビュー数。\n *\n * @generated from field: int64 views_30d = 1;\n */\n views30d: bigint;\n\n /**\n * 直近 30 日の自作品合計ライセンス取得数。\n *\n * @generated from field: int64 licenses_30d = 2;\n */\n licenses30d: bigint;\n\n /**\n * 直近で伸びた作品 Top3(ビュー増加率の降順)。各 creator_stats を populate 済み。\n *\n * @generated from field: repeated fluxlay.wallpaper.v1.Wallpaper top_wallpapers = 3;\n */\n topWallpapers: Wallpaper[];\n};\n\nexport type GetCreatorPerformanceSummaryResponseValid = GetCreatorPerformanceSummaryResponse;\n\n/**\n * Describes the message fluxlay.wallpaper.v1.GetCreatorPerformanceSummaryResponse.\n * Use `create(GetCreatorPerformanceSummaryResponseSchema)` to create a new message.\n */\nexport const GetCreatorPerformanceSummaryResponseSchema: GenMessage<GetCreatorPerformanceSummaryResponse, {validType: GetCreatorPerformanceSummaryResponseValid}> = /*@__PURE__*/\n messageDesc(file_fluxlay_wallpaper_v1_wallpaper, 61);\n\n/**\n * @generated from enum fluxlay.wallpaper.v1.WallpaperStatus\n */\nexport enum WallpaperStatus {\n /**\n * @generated from enum value: WALLPAPER_STATUS_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: WALLPAPER_STATUS_UPLOADING = 1;\n */\n UPLOADING = 1,\n\n /**\n * @generated from enum value: WALLPAPER_STATUS_DRAFT = 2;\n */\n DRAFT = 2,\n\n /**\n * @generated from enum value: WALLPAPER_STATUS_ACTIVE = 3;\n */\n ACTIVE = 3,\n\n /**\n * 公開処理中(公開前 AI ゲートの審査パス・数秒)。FLX-110\n *\n * @generated from enum value: WALLPAPER_STATUS_PUBLISHING = 4;\n */\n PUBLISHING = 4,\n\n /**\n * 人手審査中(中間帯 / NSFW 疑い / AI 失敗 → 公開保留)。FLX-110\n *\n * @generated from enum value: WALLPAPER_STATUS_UNDER_REVIEW = 5;\n */\n UNDER_REVIEW = 5,\n\n /**\n * 審査で却下(非公開のまま + 通知 / appeal)。FLX-110\n *\n * @generated from enum value: WALLPAPER_STATUS_REJECTED = 6;\n */\n REJECTED = 6,\n}\n\n/**\n * Describes the enum fluxlay.wallpaper.v1.WallpaperStatus.\n */\nexport const WallpaperStatusSchema: GenEnum<WallpaperStatus> = /*@__PURE__*/\n enumDesc(file_fluxlay_wallpaper_v1_wallpaper, 0);\n\n/**\n * @generated from enum fluxlay.wallpaper.v1.WallpaperSortBy\n */\nexport enum WallpaperSortBy {\n /**\n * @generated from enum value: WALLPAPER_SORT_BY_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * 作成日時の降順(デフォルト)\n *\n * @generated from enum value: WALLPAPER_SORT_BY_CREATED_AT = 1;\n */\n CREATED_AT = 1,\n\n /**\n * ライセンス数の降順(人気順)\n *\n * @generated from enum value: WALLPAPER_SORT_BY_LICENSE_COUNT = 2;\n */\n LICENSE_COUNT = 2,\n\n /**\n * ビュー数の降順\n *\n * @generated from enum value: WALLPAPER_SORT_BY_VIEW_COUNT = 3;\n */\n VIEW_COUNT = 3,\n}\n\n/**\n * Describes the enum fluxlay.wallpaper.v1.WallpaperSortBy.\n */\nexport const WallpaperSortBySchema: GenEnum<WallpaperSortBy> = /*@__PURE__*/\n enumDesc(file_fluxlay_wallpaper_v1_wallpaper, 1);\n\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts,import_extension=.ts,valid_types=protovalidate_required\"\n// @generated from file fluxlay/v1/service.proto (package fluxlay.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenFile, GenService } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, serviceDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { WhoamiRequestSchema, WhoamiResponseSchema } from \"../admin/v1/admin_pb.ts\";\nimport { file_fluxlay_admin_v1_admin } from \"../admin/v1/admin_pb.ts\";\nimport type { ApproveDeviceRequestSchema, ApproveDeviceResponseSchema, CreateDeviceCodeRequestSchema, CreateDeviceCodeResponseSchema, PollDeviceTokenRequestSchema, PollDeviceTokenResponseSchema } from \"../auth/v1/auth_pb.ts\";\nimport { file_fluxlay_auth_v1_auth } from \"../auth/v1/auth_pb.ts\";\nimport type { CreatePaymentIntentRequestSchema, CreatePaymentIntentResponseSchema } from \"../checkout/v1/checkout_pb.ts\";\nimport { file_fluxlay_checkout_v1_checkout } from \"../checkout/v1/checkout_pb.ts\";\nimport type { SendContactRequestSchema, SendContactResponseSchema } from \"../contact/v1/contact_pb.ts\";\nimport { file_fluxlay_contact_v1_contact } from \"../contact/v1/contact_pb.ts\";\nimport type { DecideReviewRequestSchema, DecideReviewResponseSchema, GetReviewRequestSchema, GetReviewResponseSchema, ListAppealsRequestSchema, ListAppealsResponseSchema, ListReviewQueueRequestSchema, ListReviewQueueResponseSchema, ResolveAppealRequestSchema, ResolveAppealResponseSchema, SubmitAppealRequestSchema, SubmitAppealResponseSchema } from \"../moderation/v1/moderation_pb.ts\";\nimport { file_fluxlay_moderation_v1_moderation } from \"../moderation/v1/moderation_pb.ts\";\nimport type { GetUnreadNotificationCountRequestSchema, GetUnreadNotificationCountResponseSchema, ListNotificationsRequestSchema, ListNotificationsResponseSchema, MarkAllNotificationsReadRequestSchema, MarkAllNotificationsReadResponseSchema, MarkNotificationReadRequestSchema, MarkNotificationReadResponseSchema } from \"../notification/v1/notification_pb.ts\";\nimport { file_fluxlay_notification_v1_notification } from \"../notification/v1/notification_pb.ts\";\nimport type { GetPublicStatsRequestSchema, GetPublicStatsResponseSchema } from \"../stats/v1/stats_pb.ts\";\nimport { file_fluxlay_stats_v1_stats } from \"../stats/v1/stats_pb.ts\";\nimport type { CreateAccountRequestSchema, CreateAccountResponseSchema, CreateAccountSessionRequestSchema, CreateAccountSessionResponseSchema, GetAccountStatusRequestSchema, GetAccountStatusResponseSchema } from \"../stripe/v1/stripe_pb.ts\";\nimport { file_fluxlay_stripe_v1_stripe } from \"../stripe/v1/stripe_pb.ts\";\nimport type { CompleteOnboardingRequestSchema, CompleteOnboardingResponseSchema, CreateProfileUploadURLRequestSchema, CreateProfileUploadURLResponseSchema, DeleteAccountRequestSchema, DeleteAccountResponseSchema, GetCurrentUserRequestSchema, GetCurrentUserResponseSchema, GetOnboardingStatusRequestSchema, GetOnboardingStatusResponseSchema, GetUserRequestSchema, GetUserResponseSchema, ListUsersRequestSchema, ListUsersResponseSchema, UpdateCurrentUserProfileRequestSchema, UpdateCurrentUserProfileResponseSchema, UpdateProfileImageRequestSchema, UpdateProfileImageResponseSchema } from \"../user/v1/user_pb.ts\";\nimport { file_fluxlay_user_v1_user } from \"../user/v1/user_pb.ts\";\nimport type { AcquireWallpaperRequestSchema, AcquireWallpaperResponseSchema, AddPreviewImageRequestSchema, AddPreviewImageResponseSchema, CancelUploadRequestSchema, CancelUploadResponseSchema, ConfirmUploadRequestSchema, ConfirmUploadResponseSchema, CreatePreviewUploadURLRequestSchema, CreatePreviewUploadURLResponseSchema, DeletePreviewImageRequestSchema, DeletePreviewImageResponseSchema, DeleteWallpaperRequestSchema, DeleteWallpaperResponseSchema, GetContentKeyRequestSchema, GetContentKeyResponseSchema, GetCreatorPerformanceSummaryRequestSchema, GetCreatorPerformanceSummaryResponseSchema, GetDeveloperKeyRequestSchema, GetDeveloperKeyResponseSchema, GetKeyEpochRequestSchema, GetKeyEpochResponseSchema, GetWallpaperRequestSchema, GetWallpaperResponseSchema, ListFeaturedWallpapersRequestSchema, ListFeaturedWallpapersResponseSchema, ListOwnedWallpapersRequestSchema, ListOwnedWallpapersResponseSchema, ListRelatedWallpapersRequestSchema, ListRelatedWallpapersResponseSchema, ListUserWallpapersRequestSchema, ListUserWallpapersResponseSchema, ListWallpapersRequestSchema, ListWallpapersResponseSchema, PinWallpaperRequestSchema, PinWallpaperResponseSchema, PublishWallpaperRequestSchema, PublishWallpaperResponseSchema, RecordWallpaperViewRequestSchema, RecordWallpaperViewResponseSchema, RegisterDeviceKeyRequestSchema, RegisterDeviceKeyResponseSchema, RegisterWallpaperRequestSchema, RegisterWallpaperResponseSchema, SearchWallpapersRequestSchema, SearchWallpapersResponseSchema, SetWallpaperPriceRequestSchema, SetWallpaperPriceResponseSchema, UnpinWallpaperRequestSchema, UnpinWallpaperResponseSchema, UnpublishWallpaperRequestSchema, UnpublishWallpaperResponseSchema, UpdateWallpaperMetadataRequestSchema, UpdateWallpaperMetadataResponseSchema } from \"../wallpaper/v1/wallpaper_pb.ts\";\nimport { file_fluxlay_wallpaper_v1_wallpaper } from \"../wallpaper/v1/wallpaper_pb.ts\";\n\n/**\n * Describes the file fluxlay/v1/service.proto.\n */\nexport const file_fluxlay_v1_service: GenFile = /*@__PURE__*/\n fileDesc(\"ChhmbHV4bGF5L3YxL3NlcnZpY2UucHJvdG8SCmZsdXhsYXkudjEy0gcKC1VzZXJTZXJ2aWNlEmYKDkdldEN1cnJlbnRVc2VyEiYuZmx1eGxheS51c2VyLnYxLkdldEN1cnJlbnRVc2VyUmVxdWVzdBonLmZsdXhsYXkudXNlci52MS5HZXRDdXJyZW50VXNlclJlc3BvbnNlIgOQAgESUQoHR2V0VXNlchIfLmZsdXhsYXkudXNlci52MS5HZXRVc2VyUmVxdWVzdBogLmZsdXhsYXkudXNlci52MS5HZXRVc2VyUmVzcG9uc2UiA5ACARJ/ChhVcGRhdGVDdXJyZW50VXNlclByb2ZpbGUSMC5mbHV4bGF5LnVzZXIudjEuVXBkYXRlQ3VycmVudFVzZXJQcm9maWxlUmVxdWVzdBoxLmZsdXhsYXkudXNlci52MS5VcGRhdGVDdXJyZW50VXNlclByb2ZpbGVSZXNwb25zZRJtChJVcGRhdGVQcm9maWxlSW1hZ2USKi5mbHV4bGF5LnVzZXIudjEuVXBkYXRlUHJvZmlsZUltYWdlUmVxdWVzdBorLmZsdXhsYXkudXNlci52MS5VcGRhdGVQcm9maWxlSW1hZ2VSZXNwb25zZRJ5ChZDcmVhdGVQcm9maWxlVXBsb2FkVVJMEi4uZmx1eGxheS51c2VyLnYxLkNyZWF0ZVByb2ZpbGVVcGxvYWRVUkxSZXF1ZXN0Gi8uZmx1eGxheS51c2VyLnYxLkNyZWF0ZVByb2ZpbGVVcGxvYWRVUkxSZXNwb25zZRJ1ChNHZXRPbmJvYXJkaW5nU3RhdHVzEisuZmx1eGxheS51c2VyLnYxLkdldE9uYm9hcmRpbmdTdGF0dXNSZXF1ZXN0GiwuZmx1eGxheS51c2VyLnYxLkdldE9uYm9hcmRpbmdTdGF0dXNSZXNwb25zZSIDkAIBEm0KEkNvbXBsZXRlT25ib2FyZGluZxIqLmZsdXhsYXkudXNlci52MS5Db21wbGV0ZU9uYm9hcmRpbmdSZXF1ZXN0GisuZmx1eGxheS51c2VyLnYxLkNvbXBsZXRlT25ib2FyZGluZ1Jlc3BvbnNlElcKCUxpc3RVc2VycxIhLmZsdXhsYXkudXNlci52MS5MaXN0VXNlcnNSZXF1ZXN0GiIuZmx1eGxheS51c2VyLnYxLkxpc3RVc2Vyc1Jlc3BvbnNlIgOQAgESXgoNRGVsZXRlQWNjb3VudBIlLmZsdXhsYXkudXNlci52MS5EZWxldGVBY2NvdW50UmVxdWVzdBomLmZsdXhsYXkudXNlci52MS5EZWxldGVBY2NvdW50UmVzcG9uc2UyYAoMQWRtaW5TZXJ2aWNlElAKBldob2FtaRIfLmZsdXhsYXkuYWRtaW4udjEuV2hvYW1pUmVxdWVzdBogLmZsdXhsYXkuYWRtaW4udjEuV2hvYW1pUmVzcG9uc2UiA5ACATKvBAoRTW9kZXJhdGlvblNlcnZpY2USdQoPTGlzdFJldmlld1F1ZXVlEi0uZmx1eGxheS5tb2RlcmF0aW9uLnYxLkxpc3RSZXZpZXdRdWV1ZVJlcXVlc3QaLi5mbHV4bGF5Lm1vZGVyYXRpb24udjEuTGlzdFJldmlld1F1ZXVlUmVzcG9uc2UiA5ACARJjCglHZXRSZXZpZXcSJy5mbHV4bGF5Lm1vZGVyYXRpb24udjEuR2V0UmV2aWV3UmVxdWVzdBooLmZsdXhsYXkubW9kZXJhdGlvbi52MS5HZXRSZXZpZXdSZXNwb25zZSIDkAIBEmcKDERlY2lkZVJldmlldxIqLmZsdXhsYXkubW9kZXJhdGlvbi52MS5EZWNpZGVSZXZpZXdSZXF1ZXN0GisuZmx1eGxheS5tb2RlcmF0aW9uLnYxLkRlY2lkZVJldmlld1Jlc3BvbnNlEmkKC0xpc3RBcHBlYWxzEikuZmx1eGxheS5tb2RlcmF0aW9uLnYxLkxpc3RBcHBlYWxzUmVxdWVzdBoqLmZsdXhsYXkubW9kZXJhdGlvbi52MS5MaXN0QXBwZWFsc1Jlc3BvbnNlIgOQAgESagoNUmVzb2x2ZUFwcGVhbBIrLmZsdXhsYXkubW9kZXJhdGlvbi52MS5SZXNvbHZlQXBwZWFsUmVxdWVzdBosLmZsdXhsYXkubW9kZXJhdGlvbi52MS5SZXNvbHZlQXBwZWFsUmVzcG9uc2UyeAoNQXBwZWFsU2VydmljZRJnCgxTdWJtaXRBcHBlYWwSKi5mbHV4bGF5Lm1vZGVyYXRpb24udjEuU3VibWl0QXBwZWFsUmVxdWVzdBorLmZsdXhsYXkubW9kZXJhdGlvbi52MS5TdWJtaXRBcHBlYWxSZXNwb25zZTK8AgoLQXV0aFNlcnZpY2USZwoQQ3JlYXRlRGV2aWNlQ29kZRIoLmZsdXhsYXkuYXV0aC52MS5DcmVhdGVEZXZpY2VDb2RlUmVxdWVzdBopLmZsdXhsYXkuYXV0aC52MS5DcmVhdGVEZXZpY2VDb2RlUmVzcG9uc2USZAoPUG9sbERldmljZVRva2VuEicuZmx1eGxheS5hdXRoLnYxLlBvbGxEZXZpY2VUb2tlblJlcXVlc3QaKC5mbHV4bGF5LmF1dGgudjEuUG9sbERldmljZVRva2VuUmVzcG9uc2USXgoNQXBwcm92ZURldmljZRIlLmZsdXhsYXkuYXV0aC52MS5BcHByb3ZlRGV2aWNlUmVxdWVzdBomLmZsdXhsYXkuYXV0aC52MS5BcHByb3ZlRGV2aWNlUmVzcG9uc2UyywQKE05vdGlmaWNhdGlvblNlcnZpY2USfwoRTGlzdE5vdGlmaWNhdGlvbnMSMS5mbHV4bGF5Lm5vdGlmaWNhdGlvbi52MS5MaXN0Tm90aWZpY2F0aW9uc1JlcXVlc3QaMi5mbHV4bGF5Lm5vdGlmaWNhdGlvbi52MS5MaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlIgOQAgESmgEKGkdldFVucmVhZE5vdGlmaWNhdGlvbkNvdW50EjouZmx1eGxheS5ub3RpZmljYXRpb24udjEuR2V0VW5yZWFkTm90aWZpY2F0aW9uQ291bnRSZXF1ZXN0GjsuZmx1eGxheS5ub3RpZmljYXRpb24udjEuR2V0VW5yZWFkTm90aWZpY2F0aW9uQ291bnRSZXNwb25zZSIDkAIBEoMBChRNYXJrTm90aWZpY2F0aW9uUmVhZBI0LmZsdXhsYXkubm90aWZpY2F0aW9uLnYxLk1hcmtOb3RpZmljYXRpb25SZWFkUmVxdWVzdBo1LmZsdXhsYXkubm90aWZpY2F0aW9uLnYxLk1hcmtOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USjwEKGE1hcmtBbGxOb3RpZmljYXRpb25zUmVhZBI4LmZsdXhsYXkubm90aWZpY2F0aW9uLnYxLk1hcmtBbGxOb3RpZmljYXRpb25zUmVhZFJlcXVlc3QaOS5mbHV4bGF5Lm5vdGlmaWNhdGlvbi52MS5NYXJrQWxsTm90aWZpY2F0aW9uc1JlYWRSZXNwb25zZTJwCg5Db250YWN0U2VydmljZRJeCgtTZW5kQ29udGFjdBImLmZsdXhsYXkuY29udGFjdC52MS5TZW5kQ29udGFjdFJlcXVlc3QaJy5mbHV4bGF5LmNvbnRhY3QudjEuU2VuZENvbnRhY3RSZXNwb25zZTJ4CgxTdGF0c1NlcnZpY2USaAoOR2V0UHVibGljU3RhdHMSJy5mbHV4bGF5LnN0YXRzLnYxLkdldFB1YmxpY1N0YXRzUmVxdWVzdBooLmZsdXhsYXkuc3RhdHMudjEuR2V0UHVibGljU3RhdHNSZXNwb25zZSIDkAIBMuUCChRTdHJpcGVDb25uZWN0U2VydmljZRJiCg1DcmVhdGVBY2NvdW50EicuZmx1eGxheS5zdHJpcGUudjEuQ3JlYXRlQWNjb3VudFJlcXVlc3QaKC5mbHV4bGF5LnN0cmlwZS52MS5DcmVhdGVBY2NvdW50UmVzcG9uc2USdwoUQ3JlYXRlQWNjb3VudFNlc3Npb24SLi5mbHV4bGF5LnN0cmlwZS52MS5DcmVhdGVBY2NvdW50U2Vzc2lvblJlcXVlc3QaLy5mbHV4bGF5LnN0cmlwZS52MS5DcmVhdGVBY2NvdW50U2Vzc2lvblJlc3BvbnNlEnAKEEdldEFjY291bnRTdGF0dXMSKi5mbHV4bGF5LnN0cmlwZS52MS5HZXRBY2NvdW50U3RhdHVzUmVxdWVzdBorLmZsdXhsYXkuc3RyaXBlLnYxLkdldEFjY291bnRTdGF0dXNSZXNwb25zZSIDkAIBMosBCg9DaGVja291dFNlcnZpY2USeAoTQ3JlYXRlUGF5bWVudEludGVudBIvLmZsdXhsYXkuY2hlY2tvdXQudjEuQ3JlYXRlUGF5bWVudEludGVudFJlcXVlc3QaMC5mbHV4bGF5LmNoZWNrb3V0LnYxLkNyZWF0ZVBheW1lbnRJbnRlbnRSZXNwb25zZTKfGQoQV2FsbHBhcGVyU2VydmljZRJwCg5MaXN0V2FsbHBhcGVycxIrLmZsdXhsYXkud2FsbHBhcGVyLnYxLkxpc3RXYWxscGFwZXJzUmVxdWVzdBosLmZsdXhsYXkud2FsbHBhcGVyLnYxLkxpc3RXYWxscGFwZXJzUmVzcG9uc2UiA5ACARJqCgxHZXRXYWxscGFwZXISKS5mbHV4bGF5LndhbGxwYXBlci52MS5HZXRXYWxscGFwZXJSZXF1ZXN0GiouZmx1eGxheS53YWxscGFwZXIudjEuR2V0V2FsbHBhcGVyUmVzcG9uc2UiA5ACARJ2ChBTZWFyY2hXYWxscGFwZXJzEi0uZmx1eGxheS53YWxscGFwZXIudjEuU2VhcmNoV2FsbHBhcGVyc1JlcXVlc3QaLi5mbHV4bGF5LndhbGxwYXBlci52MS5TZWFyY2hXYWxscGFwZXJzUmVzcG9uc2UiA5ACARKIAQoWTGlzdEZlYXR1cmVkV2FsbHBhcGVycxIzLmZsdXhsYXkud2FsbHBhcGVyLnYxLkxpc3RGZWF0dXJlZFdhbGxwYXBlcnNSZXF1ZXN0GjQuZmx1eGxheS53YWxscGFwZXIudjEuTGlzdEZlYXR1cmVkV2FsbHBhcGVyc1Jlc3BvbnNlIgOQAgEShQEKFUxpc3RSZWxhdGVkV2FsbHBhcGVycxIyLmZsdXhsYXkud2FsbHBhcGVyLnYxLkxpc3RSZWxhdGVkV2FsbHBhcGVyc1JlcXVlc3QaMy5mbHV4bGF5LndhbGxwYXBlci52MS5MaXN0UmVsYXRlZFdhbGxwYXBlcnNSZXNwb25zZSIDkAIBEnEKEEFjcXVpcmVXYWxscGFwZXISLS5mbHV4bGF5LndhbGxwYXBlci52MS5BY3F1aXJlV2FsbHBhcGVyUmVxdWVzdBouLmZsdXhsYXkud2FsbHBhcGVyLnYxLkFjcXVpcmVXYWxscGFwZXJSZXNwb25zZRJ/ChNMaXN0T3duZWRXYWxscGFwZXJzEjAuZmx1eGxheS53YWxscGFwZXIudjEuTGlzdE93bmVkV2FsbHBhcGVyc1JlcXVlc3QaMS5mbHV4bGF5LndhbGxwYXBlci52MS5MaXN0T3duZWRXYWxscGFwZXJzUmVzcG9uc2UiA5ACARJlCgxQaW5XYWxscGFwZXISKS5mbHV4bGF5LndhbGxwYXBlci52MS5QaW5XYWxscGFwZXJSZXF1ZXN0GiouZmx1eGxheS53YWxscGFwZXIudjEuUGluV2FsbHBhcGVyUmVzcG9uc2USawoOVW5waW5XYWxscGFwZXISKy5mbHV4bGF5LndhbGxwYXBlci52MS5VbnBpbldhbGxwYXBlclJlcXVlc3QaLC5mbHV4bGF5LndhbGxwYXBlci52MS5VbnBpbldhbGxwYXBlclJlc3BvbnNlEnwKEkxpc3RVc2VyV2FsbHBhcGVycxIvLmZsdXhsYXkud2FsbHBhcGVyLnYxLkxpc3RVc2VyV2FsbHBhcGVyc1JlcXVlc3QaMC5mbHV4bGF5LndhbGxwYXBlci52MS5MaXN0VXNlcldhbGxwYXBlcnNSZXNwb25zZSIDkAIBEnoKE1JlY29yZFdhbGxwYXBlclZpZXcSMC5mbHV4bGF5LndhbGxwYXBlci52MS5SZWNvcmRXYWxscGFwZXJWaWV3UmVxdWVzdBoxLmZsdXhsYXkud2FsbHBhcGVyLnYxLlJlY29yZFdhbGxwYXBlclZpZXdSZXNwb25zZRKaAQocR2V0Q3JlYXRvclBlcmZvcm1hbmNlU3VtbWFyeRI5LmZsdXhsYXkud2FsbHBhcGVyLnYxLkdldENyZWF0b3JQZXJmb3JtYW5jZVN1bW1hcnlSZXF1ZXN0GjouZmx1eGxheS53YWxscGFwZXIudjEuR2V0Q3JlYXRvclBlcmZvcm1hbmNlU3VtbWFyeVJlc3BvbnNlIgOQAgEShgEKF1VwZGF0ZVdhbGxwYXBlck1ldGFkYXRhEjQuZmx1eGxheS53YWxscGFwZXIudjEuVXBkYXRlV2FsbHBhcGVyTWV0YWRhdGFSZXF1ZXN0GjUuZmx1eGxheS53YWxscGFwZXIudjEuVXBkYXRlV2FsbHBhcGVyTWV0YWRhdGFSZXNwb25zZRKDAQoWQ3JlYXRlUHJldmlld1VwbG9hZFVSTBIzLmZsdXhsYXkud2FsbHBhcGVyLnYxLkNyZWF0ZVByZXZpZXdVcGxvYWRVUkxSZXF1ZXN0GjQuZmx1eGxheS53YWxscGFwZXIudjEuQ3JlYXRlUHJldmlld1VwbG9hZFVSTFJlc3BvbnNlEm4KD0FkZFByZXZpZXdJbWFnZRIsLmZsdXhsYXkud2FsbHBhcGVyLnYxLkFkZFByZXZpZXdJbWFnZVJlcXVlc3QaLS5mbHV4bGF5LndhbGxwYXBlci52MS5BZGRQcmV2aWV3SW1hZ2VSZXNwb25zZRJ3ChJEZWxldGVQcmV2aWV3SW1hZ2USLy5mbHV4bGF5LndhbGxwYXBlci52MS5EZWxldGVQcmV2aWV3SW1hZ2VSZXF1ZXN0GjAuZmx1eGxheS53YWxscGFwZXIudjEuRGVsZXRlUHJldmlld0ltYWdlUmVzcG9uc2UScQoQUHVibGlzaFdhbGxwYXBlchItLmZsdXhsYXkud2FsbHBhcGVyLnYxLlB1Ymxpc2hXYWxscGFwZXJSZXF1ZXN0Gi4uZmx1eGxheS53YWxscGFwZXIudjEuUHVibGlzaFdhbGxwYXBlclJlc3BvbnNlEncKElVucHVibGlzaFdhbGxwYXBlchIvLmZsdXhsYXkud2FsbHBhcGVyLnYxLlVucHVibGlzaFdhbGxwYXBlclJlcXVlc3QaMC5mbHV4bGF5LndhbGxwYXBlci52MS5VbnB1Ymxpc2hXYWxscGFwZXJSZXNwb25zZRJuCg9EZWxldGVXYWxscGFwZXISLC5mbHV4bGF5LndhbGxwYXBlci52MS5EZWxldGVXYWxscGFwZXJSZXF1ZXN0Gi0uZmx1eGxheS53YWxscGFwZXIudjEuRGVsZXRlV2FsbHBhcGVyUmVzcG9uc2USbgoPR2V0RGV2ZWxvcGVyS2V5EiwuZmx1eGxheS53YWxscGFwZXIudjEuR2V0RGV2ZWxvcGVyS2V5UmVxdWVzdBotLmZsdXhsYXkud2FsbHBhcGVyLnYxLkdldERldmVsb3BlcktleVJlc3BvbnNlEnQKEVJlZ2lzdGVyV2FsbHBhcGVyEi4uZmx1eGxheS53YWxscGFwZXIudjEuUmVnaXN0ZXJXYWxscGFwZXJSZXF1ZXN0Gi8uZmx1eGxheS53YWxscGFwZXIudjEuUmVnaXN0ZXJXYWxscGFwZXJSZXNwb25zZRJoCg1HZXRDb250ZW50S2V5EiouZmx1eGxheS53YWxscGFwZXIudjEuR2V0Q29udGVudEtleVJlcXVlc3QaKy5mbHV4bGF5LndhbGxwYXBlci52MS5HZXRDb250ZW50S2V5UmVzcG9uc2USaAoNQ29uZmlybVVwbG9hZBIqLmZsdXhsYXkud2FsbHBhcGVyLnYxLkNvbmZpcm1VcGxvYWRSZXF1ZXN0GisuZmx1eGxheS53YWxscGFwZXIudjEuQ29uZmlybVVwbG9hZFJlc3BvbnNlEmUKDENhbmNlbFVwbG9hZBIpLmZsdXhsYXkud2FsbHBhcGVyLnYxLkNhbmNlbFVwbG9hZFJlcXVlc3QaKi5mbHV4bGF5LndhbGxwYXBlci52MS5DYW5jZWxVcGxvYWRSZXNwb25zZRJ0ChFTZXRXYWxscGFwZXJQcmljZRIuLmZsdXhsYXkud2FsbHBhcGVyLnYxLlNldFdhbGxwYXBlclByaWNlUmVxdWVzdBovLmZsdXhsYXkud2FsbHBhcGVyLnYxLlNldFdhbGxwYXBlclByaWNlUmVzcG9uc2USdAoRUmVnaXN0ZXJEZXZpY2VLZXkSLi5mbHV4bGF5LndhbGxwYXBlci52MS5SZWdpc3RlckRldmljZUtleVJlcXVlc3QaLy5mbHV4bGF5LndhbGxwYXBlci52MS5SZWdpc3RlckRldmljZUtleVJlc3BvbnNlEmIKC0dldEtleUVwb2NoEiguZmx1eGxheS53YWxscGFwZXIudjEuR2V0S2V5RXBvY2hSZXF1ZXN0GikuZmx1eGxheS53YWxscGFwZXIudjEuR2V0S2V5RXBvY2hSZXNwb25zZUKkAQoOY29tLmZsdXhsYXkudjFCDFNlcnZpY2VQcm90b1ABWjtnaXRodWIuY29tL2tlbjEwOS9mbHV4bGF5LXByb3RvL2dlbi9nby9mbHV4bGF5L3YxO2ZsdXhsYXl2MaICA0ZYWKoCCkZsdXhsYXkuVjHKAgpGbHV4bGF5XFYx4gIWRmx1eGxheVxWMVxHUEJNZXRhZGF0YeoCC0ZsdXhsYXk6OlYxYgZwcm90bzM\", [file_fluxlay_admin_v1_admin, file_fluxlay_auth_v1_auth, file_fluxlay_checkout_v1_checkout, file_fluxlay_contact_v1_contact, file_fluxlay_moderation_v1_moderation, file_fluxlay_notification_v1_notification, file_fluxlay_stats_v1_stats, file_fluxlay_stripe_v1_stripe, file_fluxlay_user_v1_user, file_fluxlay_wallpaper_v1_wallpaper]);\n\n/**\n * @generated from service fluxlay.v1.UserService\n */\nexport const UserService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.UserService.GetCurrentUser\n */\n getCurrentUser: {\n methodKind: \"unary\";\n input: typeof GetCurrentUserRequestSchema;\n output: typeof GetCurrentUserResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.GetUser\n */\n getUser: {\n methodKind: \"unary\";\n input: typeof GetUserRequestSchema;\n output: typeof GetUserResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.UpdateCurrentUserProfile\n */\n updateCurrentUserProfile: {\n methodKind: \"unary\";\n input: typeof UpdateCurrentUserProfileRequestSchema;\n output: typeof UpdateCurrentUserProfileResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.UpdateProfileImage\n */\n updateProfileImage: {\n methodKind: \"unary\";\n input: typeof UpdateProfileImageRequestSchema;\n output: typeof UpdateProfileImageResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.CreateProfileUploadURL\n */\n createProfileUploadURL: {\n methodKind: \"unary\";\n input: typeof CreateProfileUploadURLRequestSchema;\n output: typeof CreateProfileUploadURLResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.GetOnboardingStatus\n */\n getOnboardingStatus: {\n methodKind: \"unary\";\n input: typeof GetOnboardingStatusRequestSchema;\n output: typeof GetOnboardingStatusResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.CompleteOnboarding\n */\n completeOnboarding: {\n methodKind: \"unary\";\n input: typeof CompleteOnboardingRequestSchema;\n output: typeof CompleteOnboardingResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.UserService.ListUsers\n */\n listUsers: {\n methodKind: \"unary\";\n input: typeof ListUsersRequestSchema;\n output: typeof ListUsersResponseSchema;\n },\n /**\n * 認証ユーザー自身のアカウントを削除(退会)する。論理削除+個人情報の匿名化を行う。\n *\n * @generated from rpc fluxlay.v1.UserService.DeleteAccount\n */\n deleteAccount: {\n methodKind: \"unary\";\n input: typeof DeleteAccountRequestSchema;\n output: typeof DeleteAccountResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 0);\n\n/**\n * 運営向け管理 RPC。全メソッドが admin interceptor(user_kind = internal 必須)を通る。\n * FLX-107 / 108 / 110 の admin RPC もこのサービスに追加していく。\n *\n * @generated from service fluxlay.v1.AdminService\n */\nexport const AdminService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.AdminService.Whoami\n */\n whoami: {\n methodKind: \"unary\";\n input: typeof WhoamiRequestSchema;\n output: typeof WhoamiResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 1);\n\n/**\n * 壁紙審査(FLX-110)の internal 向けモデレーション RPC。\n * 全メソッドが admin interceptor(user_kind = internal 必須)を通る。\n * 通報対応(FLX-108)の RPC も将来このサービスに追加する。\n *\n * @generated from service fluxlay.v1.ModerationService\n */\nexport const ModerationService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.ModerationService.ListReviewQueue\n */\n listReviewQueue: {\n methodKind: \"unary\";\n input: typeof ListReviewQueueRequestSchema;\n output: typeof ListReviewQueueResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.ModerationService.GetReview\n */\n getReview: {\n methodKind: \"unary\";\n input: typeof GetReviewRequestSchema;\n output: typeof GetReviewResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.ModerationService.DecideReview\n */\n decideReview: {\n methodKind: \"unary\";\n input: typeof DecideReviewRequestSchema;\n output: typeof DecideReviewResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.ModerationService.ListAppeals\n */\n listAppeals: {\n methodKind: \"unary\";\n input: typeof ListAppealsRequestSchema;\n output: typeof ListAppealsResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.ModerationService.ResolveAppeal\n */\n resolveAppeal: {\n methodKind: \"unary\";\n input: typeof ResolveAppealRequestSchema;\n output: typeof ResolveAppealResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 2);\n\n/**\n * 異議申し立て(appeal)の投稿者向け公開 RPC。認証必須・本人のみ・レート制限つき。\n *\n * @generated from service fluxlay.v1.AppealService\n */\nexport const AppealService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.AppealService.SubmitAppeal\n */\n submitAppeal: {\n methodKind: \"unary\";\n input: typeof SubmitAppealRequestSchema;\n output: typeof SubmitAppealResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 3);\n\n/**\n * @generated from service fluxlay.v1.AuthService\n */\nexport const AuthService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.AuthService.CreateDeviceCode\n */\n createDeviceCode: {\n methodKind: \"unary\";\n input: typeof CreateDeviceCodeRequestSchema;\n output: typeof CreateDeviceCodeResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.AuthService.PollDeviceToken\n */\n pollDeviceToken: {\n methodKind: \"unary\";\n input: typeof PollDeviceTokenRequestSchema;\n output: typeof PollDeviceTokenResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.AuthService.ApproveDevice\n */\n approveDevice: {\n methodKind: \"unary\";\n input: typeof ApproveDeviceRequestSchema;\n output: typeof ApproveDeviceResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 4);\n\n/**\n * アプリ内通知(FLX-112)。全 RPC が認証必須。\n * 通知の発行はサーバー内部(各機能のユースケース)からのみ行い、RPC では公開しない。\n *\n * @generated from service fluxlay.v1.NotificationService\n */\nexport const NotificationService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.NotificationService.ListNotifications\n */\n listNotifications: {\n methodKind: \"unary\";\n input: typeof ListNotificationsRequestSchema;\n output: typeof ListNotificationsResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.NotificationService.GetUnreadNotificationCount\n */\n getUnreadNotificationCount: {\n methodKind: \"unary\";\n input: typeof GetUnreadNotificationCountRequestSchema;\n output: typeof GetUnreadNotificationCountResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.NotificationService.MarkNotificationRead\n */\n markNotificationRead: {\n methodKind: \"unary\";\n input: typeof MarkNotificationReadRequestSchema;\n output: typeof MarkNotificationReadResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.NotificationService.MarkAllNotificationsRead\n */\n markAllNotificationsRead: {\n methodKind: \"unary\";\n input: typeof MarkAllNotificationsReadRequestSchema;\n output: typeof MarkAllNotificationsReadResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 5);\n\n/**\n * @generated from service fluxlay.v1.ContactService\n */\nexport const ContactService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.ContactService.SendContact\n */\n sendContact: {\n methodKind: \"unary\";\n input: typeof SendContactRequestSchema;\n output: typeof SendContactResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 6);\n\n/**\n * @generated from service fluxlay.v1.StatsService\n */\nexport const StatsService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.StatsService.GetPublicStats\n */\n getPublicStats: {\n methodKind: \"unary\";\n input: typeof GetPublicStatsRequestSchema;\n output: typeof GetPublicStatsResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 7);\n\n/**\n * @generated from service fluxlay.v1.StripeConnectService\n */\nexport const StripeConnectService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.StripeConnectService.CreateAccount\n */\n createAccount: {\n methodKind: \"unary\";\n input: typeof CreateAccountRequestSchema;\n output: typeof CreateAccountResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.StripeConnectService.CreateAccountSession\n */\n createAccountSession: {\n methodKind: \"unary\";\n input: typeof CreateAccountSessionRequestSchema;\n output: typeof CreateAccountSessionResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.StripeConnectService.GetAccountStatus\n */\n getAccountStatus: {\n methodKind: \"unary\";\n input: typeof GetAccountStatusRequestSchema;\n output: typeof GetAccountStatusResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 8);\n\n/**\n * @generated from service fluxlay.v1.CheckoutService\n */\nexport const CheckoutService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.CheckoutService.CreatePaymentIntent\n */\n createPaymentIntent: {\n methodKind: \"unary\";\n input: typeof CreatePaymentIntentRequestSchema;\n output: typeof CreatePaymentIntentResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 9);\n\n/**\n * @generated from service fluxlay.v1.WallpaperService\n */\nexport const WallpaperService: GenService<{\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ListWallpapers\n */\n listWallpapers: {\n methodKind: \"unary\";\n input: typeof ListWallpapersRequestSchema;\n output: typeof ListWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.GetWallpaper\n */\n getWallpaper: {\n methodKind: \"unary\";\n input: typeof GetWallpaperRequestSchema;\n output: typeof GetWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.SearchWallpapers\n */\n searchWallpapers: {\n methodKind: \"unary\";\n input: typeof SearchWallpapersRequestSchema;\n output: typeof SearchWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ListFeaturedWallpapers\n */\n listFeaturedWallpapers: {\n methodKind: \"unary\";\n input: typeof ListFeaturedWallpapersRequestSchema;\n output: typeof ListFeaturedWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ListRelatedWallpapers\n */\n listRelatedWallpapers: {\n methodKind: \"unary\";\n input: typeof ListRelatedWallpapersRequestSchema;\n output: typeof ListRelatedWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.AcquireWallpaper\n */\n acquireWallpaper: {\n methodKind: \"unary\";\n input: typeof AcquireWallpaperRequestSchema;\n output: typeof AcquireWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ListOwnedWallpapers\n */\n listOwnedWallpapers: {\n methodKind: \"unary\";\n input: typeof ListOwnedWallpapersRequestSchema;\n output: typeof ListOwnedWallpapersResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.PinWallpaper\n */\n pinWallpaper: {\n methodKind: \"unary\";\n input: typeof PinWallpaperRequestSchema;\n output: typeof PinWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.UnpinWallpaper\n */\n unpinWallpaper: {\n methodKind: \"unary\";\n input: typeof UnpinWallpaperRequestSchema;\n output: typeof UnpinWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ListUserWallpapers\n */\n listUserWallpapers: {\n methodKind: \"unary\";\n input: typeof ListUserWallpapersRequestSchema;\n output: typeof ListUserWallpapersResponseSchema;\n },\n /**\n * 公開詳細ページのビュー計測(公開・未認証可、作者本人は除外)。\n *\n * @generated from rpc fluxlay.v1.WallpaperService.RecordWallpaperView\n */\n recordWallpaperView: {\n methodKind: \"unary\";\n input: typeof RecordWallpaperViewRequestSchema;\n output: typeof RecordWallpaperViewResponseSchema;\n },\n /**\n * クリエイターダッシュボードのパフォーマンスサマリ(認証必須・本人のみ)。\n *\n * @generated from rpc fluxlay.v1.WallpaperService.GetCreatorPerformanceSummary\n */\n getCreatorPerformanceSummary: {\n methodKind: \"unary\";\n input: typeof GetCreatorPerformanceSummaryRequestSchema;\n output: typeof GetCreatorPerformanceSummaryResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.UpdateWallpaperMetadata\n */\n updateWallpaperMetadata: {\n methodKind: \"unary\";\n input: typeof UpdateWallpaperMetadataRequestSchema;\n output: typeof UpdateWallpaperMetadataResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.CreatePreviewUploadURL\n */\n createPreviewUploadURL: {\n methodKind: \"unary\";\n input: typeof CreatePreviewUploadURLRequestSchema;\n output: typeof CreatePreviewUploadURLResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.AddPreviewImage\n */\n addPreviewImage: {\n methodKind: \"unary\";\n input: typeof AddPreviewImageRequestSchema;\n output: typeof AddPreviewImageResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.DeletePreviewImage\n */\n deletePreviewImage: {\n methodKind: \"unary\";\n input: typeof DeletePreviewImageRequestSchema;\n output: typeof DeletePreviewImageResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.PublishWallpaper\n */\n publishWallpaper: {\n methodKind: \"unary\";\n input: typeof PublishWallpaperRequestSchema;\n output: typeof PublishWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.UnpublishWallpaper\n */\n unpublishWallpaper: {\n methodKind: \"unary\";\n input: typeof UnpublishWallpaperRequestSchema;\n output: typeof UnpublishWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.DeleteWallpaper\n */\n deleteWallpaper: {\n methodKind: \"unary\";\n input: typeof DeleteWallpaperRequestSchema;\n output: typeof DeleteWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.GetDeveloperKey\n */\n getDeveloperKey: {\n methodKind: \"unary\";\n input: typeof GetDeveloperKeyRequestSchema;\n output: typeof GetDeveloperKeyResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.RegisterWallpaper\n */\n registerWallpaper: {\n methodKind: \"unary\";\n input: typeof RegisterWallpaperRequestSchema;\n output: typeof RegisterWallpaperResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.GetContentKey\n */\n getContentKey: {\n methodKind: \"unary\";\n input: typeof GetContentKeyRequestSchema;\n output: typeof GetContentKeyResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.ConfirmUpload\n */\n confirmUpload: {\n methodKind: \"unary\";\n input: typeof ConfirmUploadRequestSchema;\n output: typeof ConfirmUploadResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.CancelUpload\n */\n cancelUpload: {\n methodKind: \"unary\";\n input: typeof CancelUploadRequestSchema;\n output: typeof CancelUploadResponseSchema;\n },\n /**\n * @generated from rpc fluxlay.v1.WallpaperService.SetWallpaperPrice\n */\n setWallpaperPrice: {\n methodKind: \"unary\";\n input: typeof SetWallpaperPriceRequestSchema;\n output: typeof SetWallpaperPriceResponseSchema;\n },\n /**\n * 鍵配送 v2: 端末公開鍵の登録。\n *\n * @generated from rpc fluxlay.v1.WallpaperService.RegisterDeviceKey\n */\n registerDeviceKey: {\n methodKind: \"unary\";\n input: typeof RegisterDeviceKeyRequestSchema;\n output: typeof RegisterDeviceKeyResponseSchema;\n },\n /**\n * 鍵キャッシュ即時失効用の epoch 取得。キャッシュ照合に使う。\n *\n * @generated from rpc fluxlay.v1.WallpaperService.GetKeyEpoch\n */\n getKeyEpoch: {\n methodKind: \"unary\";\n input: typeof GetKeyEpochRequestSchema;\n output: typeof GetKeyEpochResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_fluxlay_v1_service, 10);\n\n","import path from \"node:path\";\n\nimport type { Session } from \"@supabase/supabase-js\";\nimport envPaths from \"env-paths\";\nimport fs from \"fs-extra\";\n\nconst paths = envPaths(\"com.fluxlay.core\", { suffix: \"\" });\n\nexport class AuthStore {\n private static readonly filePath = path.join(paths.data, \"auth.json\");\n\n static async saveSession(session: Session): Promise<void> {\n await fs.ensureDir(paths.data);\n await fs.writeJson(AuthStore.filePath, session, { spaces: 2 });\n await fs.chmod(AuthStore.filePath, 0o600);\n }\n\n static async getSession(): Promise<Session | null> {\n if (!(await fs.pathExists(AuthStore.filePath))) {\n return null;\n }\n try {\n return await fs.readJson(AuthStore.filePath);\n } catch (error) {\n return null;\n }\n }\n\n static async clearSession(): Promise<void> {\n if (await fs.pathExists(AuthStore.filePath)) {\n await fs.remove(AuthStore.filePath);\n }\n }\n\n /**\n * JWT の有効期限を確認し、期限切れなら auth.json を削除して null を返す。\n * 独立セッションのためリフレッシュは行わない(期限切れ時は再ログインが必要)。\n */\n static async getValidSession(): Promise<Session | null> {\n const session = await AuthStore.getSession();\n if (!session) return null;\n\n const payloadBase64 = session.access_token.split(\".\")[1];\n const payload = JSON.parse(Buffer.from(payloadBase64, \"base64\").toString(\"utf8\"));\n if (payload.exp * 1000 < Date.now()) {\n await AuthStore.clearSession();\n return null;\n }\n\n return session;\n }\n}\n","// ビルド時に tsdown の `define` で埋め込まれるデフォルト値。\n// 実行時に同名の環境変数が設定されていればそちらを優先する。\ndeclare const __BUILD_ENV__: {\n FLUXLAY_API_URL: string;\n FLUXLAY_APP_URL: string;\n FLUXLAY_SUPABASE_URL: string;\n FLUXLAY_SUPABASE_KEY: string;\n};\n\nconst pick = (key: keyof typeof __BUILD_ENV__): string => process.env[key] || __BUILD_ENV__[key];\n\nexport const env = {\n API_URL: pick(\"FLUXLAY_API_URL\"),\n APP_URL: pick(\"FLUXLAY_APP_URL\"),\n SUPABASE_URL: pick(\"FLUXLAY_SUPABASE_URL\"),\n SUPABASE_ANON_KEY: pick(\"FLUXLAY_SUPABASE_KEY\")\n};\n","import { createClient } from \"@connectrpc/connect\";\nimport { createConnectTransport } from \"@connectrpc/connect-node\";\n\nimport { AuthService, WallpaperService } from \"@fluxlay/proto/gen/ts/fluxlay/v1/service_pb.ts\";\n\nimport { AuthStore } from \"./AuthStore.ts\";\nimport { env } from \"./env.ts\";\n\nconst API_URL = env.API_URL || \"http://localhost:8080\";\n\n// 認証不要トランスポート(デバイス認証フロー用)\nconst unauthTransport = createConnectTransport({\n baseUrl: API_URL,\n httpVersion: \"1.1\"\n});\n\n// 認証ありトランスポート(壁紙などの API 用)\nconst authedTransport = createConnectTransport({\n baseUrl: API_URL,\n httpVersion: \"1.1\",\n interceptors: [\n next => async req => {\n const session = await AuthStore.getValidSession();\n if (session?.access_token) {\n req.header.set(\"Authorization\", `Bearer ${session.access_token}`);\n }\n return next(req);\n }\n ]\n});\n\nexport const authClient = createClient(AuthService, unauthTransport);\nexport const wallpaperClient = createClient(WallpaperService, authedTransport);\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { build as viteBuild } from \"vite\";\n\nexport type BundleKind = \"web\" | \"video\" | \"image\";\n\nconst VIDEO_EXTENSIONS = new Set([\"mp4\", \"webm\"]);\nconst IMAGE_EXTENSIONS = new Set([\"png\", \"jpg\", \"jpeg\", \"webp\", \"gif\"]);\n\nexport function assertValidKind(kind: unknown): asserts kind is BundleKind {\n if (kind !== \"web\" && kind !== \"video\" && kind !== \"image\") {\n throw new Error(\n `fluxlay.yaml の kind は \"web\" / \"video\" / \"image\" のいずれかが必須です(実際: ${JSON.stringify(kind)})`\n );\n }\n}\n\nfunction assertKindMatchesExtension(kind: BundleKind, mediaPath: string): void {\n const ext = path.extname(mediaPath).slice(1).toLowerCase();\n if (kind === \"video\" && !VIDEO_EXTENSIONS.has(ext)) {\n throw new Error(`kind: video には mp4/webm を指定してください(実際: .${ext})`);\n }\n if (kind === \"image\" && !IMAGE_EXTENSIONS.has(ext)) {\n throw new Error(`kind: image には png/jpg/jpeg/webp/gif を指定してください(実際: .${ext})`);\n }\n}\n\ninterface ManifestLike {\n name: string;\n slug: string;\n // version はサーバー自動採番リビジョンへ移行したため任意(記述されても無視)。\n version?: string;\n source?: string;\n}\n\n/**\n * video / image kind 用にメディアファイル単体を `media.<ext>` として\n * 一時ディレクトリに配置し、fluxlay.yaml も書き出す。\n * 戻り値は packContent に渡すソースディレクトリのパス。\n */\nfunction prepareMediaBundleDir(kind: BundleKind, manifest: ManifestLike, mediaPath: string): string {\n const ext = path.extname(mediaPath).slice(1).toLowerCase();\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"fluxlay-bundle-\"));\n\n fs.copyFileSync(mediaPath, path.join(tempDir, `media.${ext}`));\n\n const yamlBody = [`name: ${manifest.name}`, `slug: ${manifest.slug}`, `kind: ${kind}`].join(\"\\n\");\n fs.writeFileSync(path.join(tempDir, \"fluxlay.yaml\"), yamlBody + \"\\n\");\n\n return tempDir;\n}\n\nexport interface PreparedBundle {\n /** packContent に渡すソースディレクトリ */\n packSrcDir: string;\n /** 後始末で削除すべき一時ディレクトリ(video/image kind の場合のみ) */\n cleanup: () => void;\n}\n\n/**\n * kind に応じたバンドル準備:\n * - web: Vite ビルドを実行し dist/ を返す\n * - video/image: source で指定されたメディアを media.<ext> にして一時ディレクトリを作る\n */\nexport async function prepareBundle(kind: BundleKind, root: string, manifest: ManifestLike): Promise<PreparedBundle> {\n if (kind === \"web\") {\n await viteBuild({\n root,\n configFile: path.resolve(root, \"vite.config.ts\"),\n build: { outDir: \"dist\" },\n logLevel: \"error\"\n });\n return {\n packSrcDir: path.join(root, \"dist\"),\n cleanup: () => {}\n };\n }\n\n if (!manifest.source) {\n throw new Error(`kind: ${kind} では fluxlay.yaml に source を指定してください`);\n }\n const mediaPath = path.isAbsolute(manifest.source) ? manifest.source : path.resolve(root, manifest.source);\n if (!fs.existsSync(mediaPath)) {\n throw new Error(`メディアファイルが見つかりません: ${mediaPath}`);\n }\n assertKindMatchesExtension(kind, mediaPath);\n\n const dir = prepareMediaBundleDir(kind, manifest, mediaPath);\n return {\n packSrcDir: dir,\n cleanup: () => {\n if (fs.existsSync(dir)) fs.rmSync(dir, { recursive: true, force: true });\n }\n };\n}\n","import crypto from \"node:crypto\";\nimport path from \"node:path\";\n\nimport envPaths from \"env-paths\";\nimport fs from \"fs-extra\";\n\nconst paths = envPaths(\"com.fluxlay.core\", { suffix: \"\" });\n\nexport interface DeviceKeypair {\n deviceId: string;\n privateRaw: Buffer;\n publicRaw: Buffer;\n}\n\n/**\n * 端末 X25519 鍵ペアを取得(無ければ生成)する。鍵配送 v2 のセッション IKM 導出と\n * RegisterDeviceKey に使う。秘密鍵は config dir に 0600 で永続化する。\n */\nexport class DeviceStore {\n private static readonly filePath = path.join(paths.data, \"device.json\");\n\n static async loadOrCreate(): Promise<DeviceKeypair> {\n if (await fs.pathExists(DeviceStore.filePath)) {\n try {\n const j = await fs.readJson(DeviceStore.filePath);\n return {\n deviceId: j.deviceId,\n privateRaw: Buffer.from(j.privateKey, \"base64\"),\n publicRaw: Buffer.from(j.publicKey, \"base64\")\n };\n } catch {\n // 壊れていたら作り直す\n }\n }\n\n const { privateKey, publicKey } = crypto.generateKeyPairSync(\"x25519\");\n const jwkPriv = privateKey.export({ format: \"jwk\" }) as { d: string };\n const jwkPub = publicKey.export({ format: \"jwk\" }) as { x: string };\n const privateRaw = Buffer.from(jwkPriv.d, \"base64url\");\n const publicRaw = Buffer.from(jwkPub.x, \"base64url\");\n const deviceId = crypto.randomUUID();\n\n await fs.ensureDir(paths.data);\n await fs.writeJson(\n DeviceStore.filePath,\n { deviceId, privateKey: privateRaw.toString(\"base64\"), publicKey: publicRaw.toString(\"base64\") },\n { spaces: 2 }\n );\n await fs.chmod(DeviceStore.filePath, 0o600);\n\n return { deviceId, privateRaw, publicRaw };\n }\n}\n","import crypto from \"node:crypto\";\n\n// HKDF-SHA256 + AES-256-GCM key unwrapping. Mirrors the Rust `crypto::unwrap_key`\n// in `packages/go/crypto` and `apps/fluxlay/core/src/crypto.rs`.\n// Nonce is fixed to 12 zero bytes by design (key is single-use per salt).\nexport function unwrapKey(wrapped: Uint8Array, salt: Uint8Array, ikm: Uint8Array): Uint8Array {\n const kek = crypto.hkdfSync(\"sha256\", ikm, salt, Buffer.from(\"KeyWrapping\"), 32);\n const nonce = Buffer.alloc(12);\n const wrappedBuf = Buffer.from(wrapped);\n // AES-GCM tag is the last 16 bytes\n const tag = wrappedBuf.subarray(wrappedBuf.length - 16);\n const ciphertext = wrappedBuf.subarray(0, wrappedBuf.length - 16);\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", Buffer.from(kek), nonce, { authTagLength: 16 });\n decipher.setAuthTag(tag);\n const out = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return new Uint8Array(out.buffer, out.byteOffset, out.byteLength);\n}\n","import { getDeveloperKey as getNativeDeveloperKey, setDeveloperKey as setNativeDeveloperKey } from \"@/lib/native\";\n\nexport class KeyStore {\n // OS キーチェーン (macOS Keychain / Windows Credential Manager) は権限プロンプトの\n // キャンセル・ロック・SSH/CI 環境などで失敗しうる。保存失敗はビルド進行の妨げに\n // しないため、呼び出し側で握れるよう boolean を返す。\n static async saveDeveloperKey(key: Uint8Array): Promise<boolean> {\n try {\n setNativeDeveloperKey(key);\n return true;\n } catch (error) {\n console.error(`[KeyStore] Failed to cache developer key: ${String(error)}`);\n return false;\n }\n }\n\n static async getDeveloperKey(): Promise<Uint8Array | null> {\n try {\n const key = await getNativeDeveloperKey();\n return key || null;\n } catch (error) {\n console.error(`[KeyStore] Error getting developer key: ${String(error)}`);\n return null;\n }\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nconst FLX2_MAGIC = Buffer.from(\"FLX2\");\nconst FLX3_MAGIC = Buffer.from(\"FLX3\");\n\n/** ファイルの先頭 4 バイトの magic を読む(読めなければ null)。 */\nfunction readMagic(file: string): Buffer | null {\n try {\n const fd = fs.openSync(file, \"r\");\n try {\n const buf = Buffer.alloc(4);\n const n = fs.readSync(fd, buf, 0, 4, 0);\n return n === 4 ? buf : null;\n } finally {\n fs.closeSync(fd);\n }\n } catch {\n return null;\n }\n}\n\n/** 指定パスが旧 FLX2 バンドルか。 */\nexport function isLegacyFlx2Bundle(file: string): boolean {\n const magic = readMagic(file);\n return magic !== null && magic.equals(FLX2_MAGIC);\n}\n\n/** 指定パスが FLX3 バンドルか。 */\nexport function isFlx3Bundle(file: string): boolean {\n const magic = readMagic(file);\n return magic !== null && magic.equals(FLX3_MAGIC);\n}\n\n/** ディレクトリ直下に旧 FLX2 の .fluxlay 成果物があるか。 */\nexport function hasLegacyFlx2Bundle(dir: string): boolean {\n let entries: string[];\n try {\n entries = fs.readdirSync(dir);\n } catch {\n return false;\n }\n return entries.filter(e => e.endsWith(\".fluxlay\")).some(e => isLegacyFlx2Bundle(path.join(dir, e)));\n}\n","import crypto from \"node:crypto\";\n\n// 鍵配送 v2(FLX3)のセッション IKM 導出。Rust(`fluxlay_core::crypto`) / Go(`packages/go/crypto`) と一致させる。\n// サーバー公開鍵はピン留めせず、鍵レスポンスの `server_public_key` を使う(ローテーションをサーバー側だけで完結させるため)。\n\nconst SESSION_IKM_LABEL = Buffer.from(\"fluxlay-ikm-v2\");\n\n/** セッション IKM 導出に使う固定 salt(sha256(\"fluxlay-ikm-v2\"))。 */\nexport function sessionIkmSalt(): Buffer {\n return crypto.createHash(\"sha256\").update(SESSION_IKM_LABEL).digest();\n}\n\n/**\n * セッション IKM を導出する。\n * IKM = HKDF-SHA256(salt, ikm = X25519(devicePriv, serverPub) || info, info_label = \"fluxlay-ikm-v2\")\n */\nexport function deriveSessionIKM(\n devicePrivRaw: Uint8Array,\n devicePubRaw: Uint8Array,\n serverPubRaw: Uint8Array,\n salt: Uint8Array,\n info: Uint8Array\n): Buffer {\n const privateKey = crypto.createPrivateKey({\n format: \"jwk\",\n key: {\n kty: \"OKP\",\n crv: \"X25519\",\n d: Buffer.from(devicePrivRaw).toString(\"base64url\"),\n x: Buffer.from(devicePubRaw).toString(\"base64url\")\n }\n });\n const publicKey = crypto.createPublicKey({\n format: \"jwk\",\n key: { kty: \"OKP\", crv: \"X25519\", x: Buffer.from(serverPubRaw).toString(\"base64url\") }\n });\n\n const shared = crypto.diffieHellman({ privateKey, publicKey });\n const ikmInput = Buffer.concat([shared, Buffer.from(info)]);\n return Buffer.from(crypto.hkdfSync(\"sha256\", ikmInput, salt, SESSION_IKM_LABEL, 32));\n}\n\n/** UUID 文字列を 16 バイトに変換する(IKM の info に使う)。 */\nexport function uuidToBytes(uuid: string): Buffer {\n return Buffer.from(uuid.replace(/-/g, \"\"), \"hex\");\n}\n\n/** JWT(検証なし)の payload から sub クレームを取り出す。 */\nexport function jwtSub(token: string): string {\n const payloadBase64 = token.split(\".\")[1];\n if (!payloadBase64) throw new Error(\"malformed JWT\");\n const payload = JSON.parse(Buffer.from(payloadBase64, \"base64\").toString(\"utf8\"));\n if (typeof payload.sub !== \"string\") throw new Error(\"JWT missing sub claim\");\n return payload.sub;\n}\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport yaml from \"js-yaml\";\n\nimport { packContent, validateManifest } from \"@/lib/native\";\n\nimport { wallpaperClient } from \"../lib/api.ts\";\nimport { AuthStore } from \"../lib/AuthStore.ts\";\nimport { type BundleKind, assertValidKind, prepareBundle } from \"../lib/bundle.ts\";\nimport { DeviceStore } from \"../lib/DeviceStore.ts\";\nimport { unwrapKey } from \"../lib/key_wrap.ts\";\nimport { KeyStore } from \"../lib/KeyStore.ts\";\nimport { hasLegacyFlx2Bundle } from \"../lib/legacy_bundle.ts\";\nimport { deriveSessionIKM, jwtSub, sessionIkmSalt, uuidToBytes } from \"../lib/session_crypto.ts\";\n\nexport async function buildCommand(dir: string, options: { output: string }) {\n const session = await AuthStore.getSession();\n if (!session) {\n p.log.error(chalk.red(\"You must be logged in to build. Run `fluxlay login`.\"));\n process.exit(1);\n }\n\n const root = path.resolve(process.cwd(), dir);\n const yamlPath = path.join(root, \"fluxlay.yaml\");\n\n // 旧 FLX2 成果物を検出したら、FLX3 への再 pack を促す(新 app では旧形式は再生不可)。\n if (hasLegacyFlx2Bundle(root)) {\n p.log.warn(\n chalk.yellow(\n \"旧 FLX2 形式の .fluxlay を検出しました。新しい app では再生できないため、`fluxlay rebuild` で FLX3 に作り直してください。\"\n )\n );\n }\n\n if (!fs.existsSync(yamlPath)) {\n p.log.error(chalk.red(\"fluxlay.yaml is required in the project root.\"));\n process.exit(1);\n }\n\n const s = p.spinner();\n\n // バリデーション + マニフェスト解析\n s.start(chalk.yellow(\"Validating manifest...\"));\n let manifest: any;\n try {\n const yamlContent = fs.readFileSync(yamlPath, \"utf-8\");\n validateManifest(yamlContent);\n manifest = yaml.load(yamlContent);\n s.stop(`${chalk.green(\"✔\")} Manifest validated.`);\n } catch (e: any) {\n s.stop(chalk.red(\"Manifest validation failed\"));\n p.log.error(e.message);\n process.exit(1);\n }\n\n assertValidKind(manifest.kind);\n const kind: BundleKind = manifest.kind;\n\n const outputPath = path.resolve(root, options.output);\n let cleanup: (() => void) | null = null;\n\n try {\n s.start(`Preparing ${kind} bundle in ${chalk.cyan(root)}...`);\n const prepared = await prepareBundle(kind, root, manifest);\n cleanup = prepared.cleanup;\n s.stop(`${chalk.green(\"✔\")} ${kind === \"web\" ? \"Component built\" : `${kind} bundle prepared`}.`);\n\n // APIからDeveloperKeyを取得(キャッシュ → API の順)\n s.start(chalk.yellow(\"Fetching developer key...\"));\n let developerKeyHex: string;\n try {\n const cachedKey = await KeyStore.getDeveloperKey();\n if (cachedKey) {\n developerKeyHex = Buffer.from(cachedKey).toString(\"hex\");\n s.stop(`${chalk.green(\"✔\")} Using cached developer key.`);\n } else {\n // 鍵配送 v2: 端末鍵ペアを用意して登録し、protocol_version=2 + device_public_key で取得する。\n // IKM は X25519(devicePriv, serverPub) || user.ID から導出し、wrap を解く。\n const device = await DeviceStore.loadOrCreate();\n await wallpaperClient.registerDeviceKey({\n deviceId: device.deviceId,\n devicePublicKey: device.publicRaw\n });\n\n const userId = jwtSub(session.access_token);\n const salt = crypto.randomBytes(32);\n const { developerKey: wrapped, serverPublicKey } = await wallpaperClient.getDeveloperKey({\n salt,\n protocolVersion: 2,\n devicePublicKey: device.publicRaw\n });\n const ikm = deriveSessionIKM(\n device.privateRaw,\n device.publicRaw,\n serverPublicKey,\n sessionIkmSalt(),\n uuidToBytes(userId)\n );\n const developerKey = unwrapKey(wrapped, salt, ikm);\n developerKeyHex = Buffer.from(developerKey).toString(\"hex\");\n s.stop(`${chalk.green(\"✔\")} Developer key fetched from API.`);\n // OS キーチェーンへの保存失敗はビルドを止めない(次回 API から再取得)\n const saved = await KeyStore.saveDeveloperKey(developerKey);\n if (!saved) {\n p.log.warn(\n chalk.yellow(\n `Could not cache developer key in ${process.platform === \"darwin\" ? \"Keychain\" : \"Credential Manager\"}. Build will continue.`\n )\n );\n }\n }\n } catch (e: any) {\n s.stop(chalk.red(\"Failed to fetch developer key\"));\n p.log.error(`${e.message} (platform: ${process.platform})`);\n throw e;\n }\n\n // パッケージング\n s.start(chalk.yellow(\"Packaging with DRM...\"));\n await packContent(prepared.packSrcDir, outputPath, developerKeyHex, 0, kind);\n s.stop(`${chalk.green(\"✔\")} Packaging completed.`);\n\n p.note(`Output: ${chalk.underline.cyan(outputPath)}`, \"Success!\");\n } catch (e: any) {\n s.stop(chalk.red(\"Build failed\"));\n p.log.error(e.message);\n throw e;\n } finally {\n if (cleanup) cleanup();\n }\n}\n","import fs from \"node:fs\";\nimport net from \"node:net\";\nimport path from \"node:path\";\n\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport envPaths from \"env-paths\";\nimport { createServer, type Plugin } from \"vite\";\n\nimport { validateManifest } from \"@/lib/native\";\n\n/**\n * Fluxlay 開発用プラグイン\n */\nfunction fluxlayDevWallpaper(): Plugin {\n let version = Date.now();\n\n return {\n name: \"fluxlay-dev-server\",\n configureServer(server) {\n server.watcher.on(\"change\", () => {\n version = Date.now();\n });\n\n server.middlewares.use(\"/version\", (req, res) => {\n res.setHeader(\"Content-Type\", \"application/json\");\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.end(JSON.stringify({ version }));\n });\n }\n };\n}\n\nexport async function devCommand(dir: string) {\n const root = path.resolve(process.cwd(), dir);\n const yamlPath = path.join(root, \"fluxlay.yaml\");\n\n if (!fs.existsSync(yamlPath)) {\n p.log.error(chalk.red(\"fluxlay.yaml is required in the project root.\"));\n process.exit(1);\n }\n\n // バリデーション実行\n try {\n const yamlContent = fs.readFileSync(yamlPath, \"utf-8\");\n validateManifest(yamlContent);\n } catch (e: any) {\n p.log.error(`Manifest Validation Error: ${e.message}`);\n process.exit(1);\n }\n\n const port = await findAvailablePort(3000);\n\n const s = p.spinner();\n s.start(chalk.yellow(`Starting server on port ${port}...`));\n\n const server = await createServer({\n root,\n configFile: path.resolve(root, \"vite.config.ts\"),\n plugins: [fluxlayDevWallpaper()],\n server: {\n port,\n strictPort: true,\n cors: true,\n host: \"127.0.0.1\"\n },\n logLevel: \"error\"\n });\n\n await server.listen();\n s.stop(`${chalk.green(\"✔\")} Server started on port ${port}.`);\n\n const devServerUrl = `http://127.0.0.1:${port}`;\n p.log.info(`Wallpaper server running at ${chalk.underline.cyan(devServerUrl)}`);\n\n const appDataDir = envPaths(\"com.fluxlay.core\", { suffix: \"\" }).data;\n const devJsonPath = path.join(appDataDir, \"dev.json\");\n\n const cleanup = () => {\n if (fs.existsSync(devJsonPath)) {\n try {\n fs.unlinkSync(devJsonPath);\n } catch (e) {}\n }\n };\n\n if (!fs.existsSync(appDataDir)) fs.mkdirSync(appDataDir, { recursive: true });\n fs.writeFileSync(devJsonPath, JSON.stringify({ url: devServerUrl, root }, null, 2));\n\n process.on(\"SIGINT\", () => {\n cleanup();\n process.exit();\n });\n process.on(\"SIGTERM\", () => {\n cleanup();\n process.exit();\n });\n process.on(\"exit\", cleanup);\n\n p.note(`Root: ${chalk.gray(root)}\\nWatching for changes...`, \"Dev Server Active\");\n}\n\nasync function findAvailablePort(startPort: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n server.unref();\n server.on(\"error\", (err: any) => {\n if (err.code === \"EADDRINUSE\") {\n resolve(findAvailablePort(startPort + 1));\n } else {\n reject(err);\n }\n });\n server.listen(startPort, () => {\n server.close(() => resolve(startPort));\n });\n });\n}\n","import * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport open from \"open\";\n\nimport type { DeviceSession } from \"@fluxlay/proto/gen/ts/fluxlay/auth/v1/auth_pb.ts\";\nimport { DeviceTokenStatus } from \"@fluxlay/proto/gen/ts/fluxlay/auth/v1/auth_pb.ts\";\n\nimport { authClient } from \"../lib/api.ts\";\nimport { AuthStore } from \"../lib/AuthStore.ts\";\n\nconst POLL_TIMEOUT_MS = 900 * 1000; // 15分\n\nasync function pollDeviceToken(deviceCode: string, intervalSec: number): Promise<DeviceSession | null> {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n await new Promise(resolve => setTimeout(resolve, intervalSec * 1000));\n\n const res = await authClient.pollDeviceToken({ deviceCode });\n\n if (res.status === DeviceTokenStatus.APPROVED && res.session) {\n return res.session;\n }\n if (res.status === DeviceTokenStatus.EXPIRED || res.status === DeviceTokenStatus.DENIED) {\n return null;\n }\n // AUTHORIZATION_PENDING → 続けてポーリング\n }\n\n return null;\n}\n\nexport const loginCommand = async () => {\n const s = p.spinner();\n\n try {\n // 1. デバイスコードを取得(client=cli。承認後の完了画面でアプリへ自動で戻さないため)\n const { deviceCode, userCode, verificationUri, interval } = await authClient.createDeviceCode({ client: \"cli\" });\n\n // 2. ユーザーに表示してブラウザを開く\n p.log.message(`ブラウザで以下を開いてください: ${chalk.underline.cyan(verificationUri)}`);\n p.log.message(`認証コード: ${chalk.bold.yellow(userCode)}`);\n\n const url = `${verificationUri}?user_code=${encodeURIComponent(userCode)}`;\n await open(url);\n\n // 3. 認証完了を待つ\n s.start(chalk.yellow(\"認証を待っています...\"));\n const session = await pollDeviceToken(deviceCode, interval || 5);\n\n if (!session) {\n s.stop(chalk.red(\"認証がタイムアウトまたはキャンセルされました\"));\n process.exit(1);\n }\n\n // 4. セッションを保存\n await AuthStore.saveSession({\n access_token: session.accessToken,\n refresh_token: session.refreshToken,\n token_type: (session.tokenType || \"bearer\") as \"bearer\",\n expires_at: Number(session.expiresAt),\n expires_in: 3600,\n user: {\n email: session.email,\n id: \"\",\n aud: \"\",\n role: \"\",\n email_confirmed_at: \"\",\n phone: \"\",\n confirmed_at: \"\",\n last_sign_in_at: \"\",\n app_metadata: {},\n user_metadata: {},\n created_at: \"\",\n updated_at: \"\",\n is_anonymous: false\n }\n });\n\n s.stop(`${chalk.green(\"✔\")} ${chalk.cyan(session.email)} としてログインしました`);\n } catch (err) {\n s.stop(chalk.red(\"認証に失敗しました\"));\n p.log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n};\n","import * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\n\nimport { AuthStore } from \"../lib/AuthStore.ts\";\n\nexport const logoutCommand = async () => {\n await AuthStore.clearSession();\n p.log.success(chalk.green(\"Logged out successfully.\"));\n};\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport yaml from \"js-yaml\";\n\nimport { packContent, validateManifest } from \"@/lib/native\";\n\nimport { wallpaperClient } from \"../lib/api.ts\";\nimport { AuthStore } from \"../lib/AuthStore.ts\";\nimport { type BundleKind, assertValidKind, prepareBundle } from \"../lib/bundle.ts\";\n\nexport async function publishCommand(dir: string) {\n const session = await AuthStore.getSession();\n if (!session) {\n p.log.error(chalk.red(\"You must be logged in to publish. Run `fluxlay login`.\"));\n process.exit(1);\n }\n\n const root = path.resolve(process.cwd(), dir);\n const yamlPath = path.join(root, \"fluxlay.yaml\");\n\n if (!fs.existsSync(yamlPath)) {\n p.log.error(chalk.red(\"fluxlay.yaml is required in the project root.\"));\n process.exit(1);\n }\n\n const s = p.spinner();\n\n // 1. Parse manifest\n s.start(chalk.yellow(\"Validating manifest...\"));\n let manifest: any;\n try {\n const yamlContent = fs.readFileSync(yamlPath, \"utf-8\");\n validateManifest(yamlContent);\n manifest = yaml.load(yamlContent);\n s.stop(`${chalk.green(\"✔\")} Manifest validated: ${chalk.cyan(manifest.name)}`);\n } catch (e: any) {\n s.stop(chalk.red(\"Manifest validation failed\"));\n p.log.error(e.message);\n process.exit(1);\n }\n\n // 2. Generate random Content Key (CK)\n const contentKey = crypto.randomBytes(32);\n const contentKeyHex = contentKey.toString(\"hex\");\n\n // 3. Register with API and get upload URL\n s.start(chalk.yellow(\"Registering wallpaper with API...\"));\n let wallpaperId: string;\n let versionId: string;\n let uploadUrl: string;\n try {\n const res = await wallpaperClient.registerWallpaper({\n slug: manifest.slug,\n name: manifest.name,\n contentKey: contentKey,\n // fluxlay.yaml の network[] を公開メタデータとして送信(詳細ページで表示)\n network: (manifest.network ?? []).map((n: { origin: string; reason: string }) => ({\n origin: n.origin,\n reason: n.reason\n }))\n });\n wallpaperId = res.wallpaperId;\n versionId = res.versionId;\n uploadUrl = res.uploadUrl;\n s.stop(`${chalk.green(\"✔\")} Wallpaper registered.`);\n } catch (e: any) {\n s.stop(chalk.red(\"Registration failed\"));\n p.log.error(e.message);\n process.exit(1);\n }\n\n // 4. Build archive\n // kind は fluxlay.yaml で必須。CLI フラグでの上書きはしない。\n assertValidKind(manifest.kind);\n const kind: BundleKind = manifest.kind;\n const tempArchive = path.join(root, `.fluxlay-${versionId}.tmp`);\n let cleanupBundle: (() => void) | null = null;\n\n try {\n s.start(chalk.yellow(kind === \"web\" ? \"Building component with Vite...\" : `Preparing ${kind} bundle...`));\n const prepared = await prepareBundle(kind, root, manifest);\n cleanupBundle = prepared.cleanup;\n s.stop(`${chalk.green(\"✔\")} ${kind === \"web\" ? \"Component built\" : `${kind} bundle prepared`}.`);\n\n s.start(chalk.yellow(\"Packaging with Content Key...\"));\n await packContent(prepared.packSrcDir, tempArchive, contentKeyHex, 1, kind);\n s.stop(`${chalk.green(\"✔\")} Package created.`);\n\n // 5. Upload to R2\n s.start(chalk.yellow(\"Uploading to storage...\"));\n const fileBuffer = fs.readFileSync(tempArchive);\n const uploadRes = await fetch(uploadUrl, {\n method: \"PUT\",\n body: fileBuffer,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n // API の署名付き URL に含まれる Cache-Control と一致させる必要がある。\n \"Cache-Control\": \"public, max-age=31536000, immutable\"\n }\n });\n\n if (!uploadRes.ok) {\n throw new Error(`Upload failed: ${uploadRes.statusText}`);\n }\n s.stop(`${chalk.green(\"✔\")} Upload completed.`);\n\n // 6. Confirm upload\n s.start(chalk.yellow(\"Confirming upload with API...\"));\n await wallpaperClient.confirmUpload({ versionId });\n s.stop(`${chalk.green(\"✔\")} Upload confirmed.`);\n\n // 7. メタデータ更新(description がある場合)\n if (manifest.description) {\n s.start(chalk.yellow(\"Updating metadata...\"));\n try {\n await wallpaperClient.updateWallpaperMetadata({\n id: wallpaperId,\n name: manifest.name,\n description: manifest.description\n });\n s.stop(`${chalk.green(\"✔\")} Metadata updated.`);\n } catch (e: any) {\n s.stop(chalk.yellow(\"⚠ メタデータの更新に失敗(壁紙のアップロードは成功)\"));\n p.log.warn(e.message);\n }\n }\n\n p.note(`Wallpaper ID: ${chalk.cyan(versionId)}`, \"Success!\");\n } catch (e: any) {\n s.stop(chalk.red(\"Publishing process failed\"));\n p.log.error(e.message);\n\n p.log.warn(chalk.yellow(\"Cancelling upload...\"));\n try {\n await wallpaperClient.cancelUpload({ versionId });\n } catch (cancelErr: any) {\n p.log.error(`Failed to cancel upload: ${cancelErr.message}`);\n }\n throw e;\n } finally {\n if (fs.existsSync(tempArchive)) {\n fs.unlinkSync(tempArchive);\n }\n if (cleanupBundle) cleanupBundle();\n }\n}\n","import * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\n\nimport { buildCommand } from \"./build.ts\";\n\n/**\n * 既存のプレビュー資産をソースから FLX3 で作り直す。\n *\n * 旧 FLX2 バンドルは新 app/CLI では読めないため、互換変換ではなくソースから\n * 再 pack する。鍵は OS キーチェーン(または API 再取得)で解決されるため\n * クリエイターの追加操作は不要。\n */\nexport async function rebuildCommand(dir: string, options: { output: string }) {\n p.log.info(chalk.cyan(\"Rebuilding preview asset in FLX3 format...\"));\n await buildCommand(dir, options);\n}\n","import { createClient } from \"@supabase/supabase-js\";\n\nimport { AuthStore } from \"./AuthStore.ts\";\nimport { env } from \"./env.ts\";\n\nconst SUPABASE_URL = env.SUPABASE_URL || \"https://your-project.supabase.co\";\nconst SUPABASE_ANON_KEY = env.SUPABASE_ANON_KEY || \"your-anon-key\";\n\nexport const getSupabaseClient = async () => {\n const session = await AuthStore.getValidSession();\n\n const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {\n auth: {\n persistSession: false,\n autoRefreshToken: false, // 独立セッションのためリフレッシュ無効\n detectSessionInUrl: false\n }\n });\n\n if (session) {\n const { error } = await supabase.auth.setSession({\n access_token: session.access_token,\n refresh_token: session.refresh_token\n });\n if (error) {\n console.error(\"[Fluxlay] Error setting session:\", error.message);\n }\n }\n\n return supabase;\n};\n","import * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\n\nimport { getSupabaseClient } from \"../lib/supabase.ts\";\n\nexport const whoamiCommand = async () => {\n const supabase = await getSupabaseClient();\n const {\n data: { user },\n error\n } = await supabase.auth.getUser();\n\n if (error || !user) {\n if (error) {\n p.log.error(`Auth error: ${error.message}`);\n }\n p.log.warn(\"Not logged in.\");\n return;\n }\n\n p.log.info(`Logged in as: ${chalk.green(user.email ?? \"unknown\")}`);\n};\n","import os from \"node:os\";\n\nimport * as Sentry from \"@sentry/node\";\n\n// __CLI_VERSION__ は tsdown.config.ts の define でビルド時に埋め込まれる。\n// dev (vitest 等) では未定義になるので fallback を用意する。\ndeclare const __CLI_VERSION__: string | undefined;\nconst CLI_VERSION = typeof __CLI_VERSION__ === \"string\" ? __CLI_VERSION__ : \"0.0.0-dev\";\n\nconst SENTRY_DSN = \"https://6889e8a4b3ba33afde93a276b7c288ad@o4511289442566144.ingest.us.sentry.io/4511440417652736\";\n\nlet initialized = false;\n\n// テレメトリ無効化フラグ(CI / プライバシー配慮で opt-out できるようにする)\n// - FLUXLAY_TELEMETRY: 「テレメトリ有効」フラグ。\"0\" / \"false\" で opt-out\n// - DO_NOT_TRACK: 業界慣習の「追跡しない」フラグ。\"1\" / \"true\" で opt-out\nfunction isTelemetryDisabled(): boolean {\n const fluxlay = process.env.FLUXLAY_TELEMETRY;\n if (fluxlay && (fluxlay === \"0\" || fluxlay.toLowerCase() === \"false\")) {\n return true;\n }\n const dnt = process.env.DO_NOT_TRACK;\n if (dnt && (dnt === \"1\" || dnt.toLowerCase() === \"true\")) {\n return true;\n }\n return false;\n}\n\nexport function initSentry(): void {\n if (initialized || isTelemetryDisabled()) return;\n\n Sentry.init({\n dsn: SENTRY_DSN,\n release: `fluxlay-cli@${CLI_VERSION}`,\n environment: process.env.NODE_ENV ?? \"production\",\n // ヘッドレス CLI ではトレーシング不要。エラー報告のみに絞る。\n tracesSampleRate: 0,\n // hostname など PII を載せない\n serverName: \"\"\n });\n\n Sentry.setTags({\n \"cli.version\": CLI_VERSION,\n \"os.platform\": process.platform,\n \"os.release\": os.release(),\n \"node.version\": process.version\n });\n\n initialized = true;\n}\n\nexport async function captureError(error: unknown, context?: { command?: string }): Promise<void> {\n if (!initialized) return;\n if (context?.command) {\n Sentry.setTag(\"cli.command\", context.command);\n }\n Sentry.captureException(error);\n // CLI はすぐ exit するので、明示的に flush して送信を完了させる\n await Sentry.flush(2000).catch(() => {});\n}\n","import \"dotenv/config\";\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { buildCommand } from \"./commands/build.ts\";\nimport { devCommand } from \"./commands/dev.ts\";\nimport { loginCommand } from \"./commands/login.ts\";\nimport { logoutCommand } from \"./commands/logout.ts\";\nimport { publishCommand } from \"./commands/publish.ts\";\nimport { rebuildCommand } from \"./commands/rebuild.ts\";\nimport { whoamiCommand } from \"./commands/whoami.ts\";\nimport { captureError, initSentry } from \"./lib/sentry.ts\";\n\ninitSentry();\n\nasync function reportAndExit(error: unknown, command: string, label: string): Promise<never> {\n await captureError(error, { command });\n p.cancel(chalk.red(`${label}: ${String(error)}`));\n process.exit(1);\n}\n\nconst program = new Command();\n\nprogram.name(\"fluxlay\").description(\"Fluxlay CLI for building and managing wallpapers\").version(\"0.1.0\");\n\nprogram\n .command(\"login\")\n .description(\"Login to Supabase\")\n .action(async () => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await loginCommand();\n p.outro(chalk.green(\"Login process completed.\"));\n } catch (error) {\n await reportAndExit(error, \"login\", \"Login failed\");\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Logout from Supabase\")\n .action(async () => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await logoutCommand();\n p.outro(chalk.green(\"Logged out successfully.\"));\n } catch (error) {\n await reportAndExit(error, \"logout\", \"Logout failed\");\n }\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show current logged in user\")\n .action(async () => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await whoamiCommand();\n p.outro(chalk.green(\"Done.\"));\n } catch (error) {\n await reportAndExit(error, \"whoami\", \"Failed to get user info\");\n }\n });\n\nprogram\n .command(\"build\")\n .description(\"Build a Fluxlay wallpaper\")\n .argument(\"[dir]\", \"Directory to build\", \".\")\n .option(\"-o, --output <name>\", \"Output filename\", \"wallpaper.fluxlay\")\n .action(async (dir, options) => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await buildCommand(dir, options);\n p.outro(chalk.green(\"Build completed.\"));\n } catch (error) {\n await reportAndExit(error, \"build\", \"Build failed\");\n }\n });\n\nprogram\n .command(\"rebuild\")\n .description(\"Rebuild a preview asset in the FLX3 format (re-pack from source)\")\n .argument(\"[dir]\", \"Directory to rebuild\", \".\")\n .option(\"-o, --output <name>\", \"Output filename\", \"wallpaper.fluxlay\")\n .action(async (dir, options) => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await rebuildCommand(dir, options);\n p.outro(chalk.green(\"Rebuild completed.\"));\n } catch (error) {\n await reportAndExit(error, \"rebuild\", \"Rebuild failed\");\n }\n });\n\nprogram\n .command(\"publish\")\n .description(\"Publish a Fluxlay wallpaper to the store\")\n .argument(\"[dir]\", \"Directory to publish\", \".\")\n .action(async dir => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await publishCommand(dir);\n p.outro(chalk.green(\"Published successfully.\"));\n } catch (error) {\n await reportAndExit(error, \"publish\", \"Publish failed\");\n }\n });\n\nprogram\n .command(\"dev\")\n .description(\"Start development server for a Fluxlay wallpaper\")\n .argument(\"[dir]\", \"Directory to watch\", \".\")\n .action(async dir => {\n p.intro(chalk.bgCyan.black.bold(\" Fluxlay CLI \"));\n try {\n await devCommand(dir);\n } catch (error) {\n await reportAndExit(error, \"dev\", \"Dev server failed\");\n }\n });\n\nprogram.parse();\n"],"names":["paths","fs","viteBuild","fs","getNativeDeveloperKey","createClient"],"mappings":";;;m5BAIA,MAAM,EAAU,EAAc,OAAO,KAAK,GAAG,EACvC,EAAY,EAAK,QAAQ,EAAc,OAAO,KAAK,GAAG,CAAC,EAQhD,CACX,mBACA,mBACA,mBACA,cACA,iBACA,iBACA,kBAXe,QAAQ,IAAI,kBAAoB,IAAA,EAAM,eAAA,EAAA,EAAkB,EAAK,QAAQ,EAAW,mBAAmB,CAAA,ECEvG,EACX,EAAS,ocAAoc,ECDlc,EACX,EAAS,0zCAA0zC,ECDxzC,GACX,EAAS,yiBAAyiB,EC4CviB,EACX,EAAS,6guEAA8guE,CAAC,EAAiC,EAA+B,EAAiC,CAA8B,CAAC,EC7C7ouE,GACX,EAAS,6jCAA8jC,CAAC,CAA0B,CAAC,ECCxlC,GACX,EAAS,y8LAA08L,CAAC,EAA4B,CAA8B,CAAC,ECDpgM,GACX,EAAS,6rCAA8rC,CAAC,EAA4B,CAA8B,CAAC,ECJxvC,GACX,EAAS,4gBAA4gB,ECD1gB,GACX,EAAS,q3BAAq3B,ECDn3B,EACX,EAAS,6nBAA6nB,EGkB3nB,EACX,EAAS,07RAA27R,CAAC,EAA6B,EAA2B,GAAmC,GAAiC,GAAuC,GAA2C,GAA6B,GFdhrS,EAAS,mmHAAomH,CAAC,EAA4B,EAAsC,CAA8B,CEcigL,EDd/sS,EAAS,mnRAAonR,CAAC,EAA4B,EAAsC,CAA8B,CCc4gB,CAAmC,CAAC,EA4KnwS,GA0BX,EAAY,EAAyB,CAAC,EA2H3B,EAkOX,EAAY,EAAyB,EAAE,EC5jBnCA,EAAQ,EAAS,mBAAoB,CAAE,OAAQ,EAAG,CAAC,EAEzD,IAAa,EAAb,MAAa,CAAU,CACrB,OAAwB,SAAW,EAAK,KAAKA,EAAM,KAAM,WAAW,EAEpE,aAAa,YAAY,EAAiC,CACxD,MAAMC,EAAG,UAAUD,EAAM,IAAI,EAC7B,MAAMC,EAAG,UAAU,EAAU,SAAU,EAAS,CAAE,OAAQ,CAAE,CAAC,EAC7D,MAAMA,EAAG,MAAM,EAAU,SAAU,GAAK,CAC1C,CAEA,aAAa,YAAsC,CACjD,GAAI,CAAE,MAAMA,EAAG,WAAW,EAAU,QAAQ,EAC1C,OAAO,KAET,GAAI,CACF,OAAO,MAAMA,EAAG,SAAS,EAAU,QAAQ,CAC7C,MAAgB,CACd,OAAO,IACT,CACF,CAEA,aAAa,cAA8B,CACrC,MAAMA,EAAG,WAAW,EAAU,QAAQ,GACxC,MAAMA,EAAG,OAAO,EAAU,QAAQ,CAEtC,CAMA,aAAa,iBAA2C,CACtD,IAAM,EAAU,MAAM,EAAU,WAAW,EAC3C,GAAI,CAAC,EAAS,OAAO,KAErB,IAAM,EAAgB,EAAQ,aAAa,MAAM,GAAG,EAAE,GAOtD,OANgB,KAAK,MAAM,OAAO,KAAK,EAAe,QAAQ,EAAE,SAAS,MAAM,CACrE,EAAE,IAAM,IAAO,KAAK,IAAI,GAChC,MAAM,EAAU,aAAa,EACtB,MAGF,CACT,CACF,EC1CA,MAAM,EAAQ,GAA4C,QAAQ,IAAI,IAAA,wNAAsB,GAE/E,EAAM,CACjB,QAAS,EAAK,iBAAiB,EAC/B,QAAS,EAAK,iBAAiB,EAC/B,aAAc,EAAK,sBAAsB,EACzC,kBAAmB,EAAK,sBAAsB,CAChD,ECRM,EAAU,EAAI,SAAW,wBAGzB,EAAkB,EAAuB,CAC7C,QAAS,EACT,YAAa,KACf,CAAC,EAGK,EAAkB,EAAuB,CAC7C,QAAS,EACT,YAAa,MACb,aAAc,CACZ,GAAQ,KAAM,IAAO,CACnB,IAAM,EAAU,MAAM,EAAU,gBAAgB,EAIhD,OAHI,GAAS,cACX,EAAI,OAAO,IAAI,gBAAiB,UAAU,EAAQ,cAAc,EAE3D,EAAK,CAAG,CACjB,CACF,CACF,CAAC,EAEY,EAAa,EAAa,GAAa,CAAe,EACtD,EAAkB,EAAa,EAAkB,CAAe,ECxBvE,GAAmB,IAAI,IAAI,CAAC,MAAO,MAAM,CAAC,EAC1C,GAAmB,IAAI,IAAI,CAAC,MAAO,MAAO,OAAQ,OAAQ,KAAK,CAAC,EAEtE,SAAgB,EAAgB,EAA2C,CACzE,GAAI,IAAS,OAAS,IAAS,SAAW,IAAS,QACjD,MAAU,MACR,kEAAkE,KAAK,UAAU,CAAI,EAAE,EACzF,CAEJ,CAEA,SAAS,GAA2B,EAAkB,EAAyB,CAC7E,IAAM,EAAM,EAAK,QAAQ,CAAS,EAAE,MAAM,CAAC,EAAE,YAAY,EACzD,GAAI,IAAS,SAAW,CAAC,GAAiB,IAAI,CAAG,EAC/C,MAAU,MAAM,0CAA0C,EAAI,EAAE,EAElE,GAAI,IAAS,SAAW,CAAC,GAAiB,IAAI,CAAG,EAC/C,MAAU,MAAM,uDAAuD,EAAI,EAAE,CAEjF,CAeA,SAAS,GAAsB,EAAkB,EAAwB,EAA2B,CAClG,IAAM,EAAM,EAAK,QAAQ,CAAS,EAAE,MAAM,CAAC,EAAE,YAAY,EACnD,EAAU,EAAG,YAAY,EAAK,KAAK,EAAG,OAAO,EAAG,iBAAiB,CAAC,EAExE,EAAG,aAAa,EAAW,EAAK,KAAK,EAAS,SAAS,GAAK,CAAC,EAE7D,IAAM,EAAW,CAAC,SAAS,EAAS,OAAQ,SAAS,EAAS,OAAQ,SAAS,GAAM,EAAE,KAAK;CAAI,EAGhG,OAFA,EAAG,cAAc,EAAK,KAAK,EAAS,cAAc,EAAG,EAAW;CAAI,EAE7D,CACT,CAcA,eAAsB,EAAc,EAAkB,EAAc,EAAiD,CACnH,GAAI,IAAS,MAOX,OANA,MAAMC,GAAU,CACd,OACA,WAAY,EAAK,QAAQ,EAAM,gBAAgB,EAC/C,MAAO,CAAE,OAAQ,MAAO,EACxB,SAAU,OACZ,CAAC,EACM,CACL,WAAY,EAAK,KAAK,EAAM,MAAM,EAClC,YAAe,CAAC,CAClB,EAGF,GAAI,CAAC,EAAS,OACZ,MAAU,MAAM,SAAS,EAAK,oCAAoC,EAEpE,IAAM,EAAY,EAAK,WAAW,EAAS,MAAM,EAAI,EAAS,OAAS,EAAK,QAAQ,EAAM,EAAS,MAAM,EACzG,GAAI,CAAC,EAAG,WAAW,CAAS,EAC1B,MAAU,MAAM,qBAAqB,GAAW,EAElD,GAA2B,EAAM,CAAS,EAE1C,IAAM,EAAM,GAAsB,EAAM,EAAU,CAAS,EAC3D,MAAO,CACL,WAAY,EACZ,YAAe,CACT,EAAG,WAAW,CAAG,GAAG,EAAG,OAAO,EAAK,CAAE,UAAW,GAAM,MAAO,EAAK,CAAC,CACzE,CACF,CACF,CC1FA,MAAM,EAAQ,EAAS,mBAAoB,CAAE,OAAQ,EAAG,CAAC,EAYzD,IAAa,GAAb,MAAa,CAAY,CACvB,OAAwB,SAAW,EAAK,KAAK,EAAM,KAAM,aAAa,EAEtE,aAAa,cAAuC,CAClD,GAAI,MAAMC,EAAG,WAAW,EAAY,QAAQ,EAC1C,GAAI,CACF,IAAM,EAAI,MAAMA,EAAG,SAAS,EAAY,QAAQ,EAChD,MAAO,CACL,SAAU,EAAE,SACZ,WAAY,OAAO,KAAK,EAAE,WAAY,QAAQ,EAC9C,UAAW,OAAO,KAAK,EAAE,UAAW,QAAQ,CAC9C,CACF,MAAQ,CAER,CAGF,GAAM,CAAE,aAAY,aAAc,EAAO,oBAAoB,QAAQ,EAC/D,EAAU,EAAW,OAAO,CAAE,OAAQ,KAAM,CAAC,EAC7C,EAAS,EAAU,OAAO,CAAE,OAAQ,KAAM,CAAC,EAC3C,EAAa,OAAO,KAAK,EAAQ,EAAG,WAAW,EAC/C,EAAY,OAAO,KAAK,EAAO,EAAG,WAAW,EAC7C,EAAW,EAAO,WAAW,EAUnC,OARA,MAAMA,EAAG,UAAU,EAAM,IAAI,EAC7B,MAAMA,EAAG,UACP,EAAY,SACZ,CAAE,WAAU,WAAY,EAAW,SAAS,QAAQ,EAAG,UAAW,EAAU,SAAS,QAAQ,CAAE,EAC/F,CAAE,OAAQ,CAAE,CACd,EACA,MAAMA,EAAG,MAAM,EAAY,SAAU,GAAK,EAEnC,CAAE,WAAU,aAAY,WAAU,CAC3C,CACF,EC/CA,SAAgB,GAAU,EAAqB,EAAkB,EAA6B,CAC5F,IAAM,EAAM,EAAO,SAAS,SAAU,EAAK,EAAM,OAAO,KAAK,aAAa,EAAG,EAAE,EACzE,EAAQ,OAAO,MAAM,EAAE,EACvB,EAAa,OAAO,KAAK,CAAO,EAEhC,EAAM,EAAW,SAAS,EAAW,OAAS,EAAE,EAChD,EAAa,EAAW,SAAS,EAAG,EAAW,OAAS,EAAE,EAC1D,EAAW,EAAO,iBAAiB,cAAe,OAAO,KAAK,CAAG,EAAG,EAAO,CAAE,cAAe,EAAG,CAAC,EACtG,EAAS,WAAW,CAAG,EACvB,IAAM,EAAM,OAAO,OAAO,CAAC,EAAS,OAAO,CAAU,EAAG,EAAS,MAAM,CAAC,CAAC,EACzE,OAAO,IAAI,WAAW,EAAI,OAAQ,EAAI,WAAY,EAAI,UAAU,CAClE,CCdA,IAAa,EAAb,KAAsB,CAIpB,aAAa,iBAAiB,EAAmC,CAC/D,GAAI,CAEF,OADA,GAAsB,CAAG,EAClB,EACT,OAAS,EAAO,CAEd,OADA,QAAQ,MAAM,6CAA6C,OAAO,CAAK,GAAG,EACnE,EACT,CACF,CAEA,aAAa,iBAA8C,CACzD,GAAI,CAEF,OAAO,MADWC,GAAsB,GAC1B,IAChB,OAAS,EAAO,CAEd,OADA,QAAQ,MAAM,2CAA2C,OAAO,CAAK,GAAG,EACjE,IACT,CACF,CACF,ECtBA,MAAM,GAAa,OAAO,KAAK,MAAM,EAClB,OAAO,KAAK,MAAM,EAGrC,SAAS,GAAU,EAA6B,CAC9C,GAAI,CACF,IAAM,EAAK,EAAG,SAAS,EAAM,GAAG,EAChC,GAAI,CACF,IAAM,EAAM,OAAO,MAAM,CAAC,EAE1B,OADU,EAAG,SAAS,EAAI,EAAK,EAAG,EAAG,CAC9B,IAAM,EAAI,EAAM,IACzB,QAAU,CACR,EAAG,UAAU,CAAE,CACjB,CACF,MAAQ,CACN,OAAO,IACT,CACF,CAGA,SAAgB,GAAmB,EAAuB,CACxD,IAAM,EAAQ,GAAU,CAAI,EAC5B,OAAO,IAAU,MAAQ,EAAM,OAAO,EAAU,CAClD,CASA,SAAgB,GAAoB,EAAsB,CACxD,IAAI,EACJ,GAAI,CACF,EAAU,EAAG,YAAY,CAAG,CAC9B,MAAQ,CACN,MAAO,EACT,CACA,OAAO,EAAQ,OAAO,GAAK,EAAE,SAAS,UAAU,CAAC,EAAE,KAAK,GAAK,GAAmB,EAAK,KAAK,EAAK,CAAC,CAAC,CAAC,CACpG,CCtCA,MAAM,EAAoB,OAAO,KAAK,gBAAgB,EAGtD,SAAgB,IAAyB,CACvC,OAAO,EAAO,WAAW,QAAQ,EAAE,OAAO,CAAiB,EAAE,OAAO,CACtE,CAMA,SAAgB,GACd,EACA,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAa,EAAO,iBAAiB,CACzC,OAAQ,MACR,IAAK,CACH,IAAK,MACL,IAAK,SACL,EAAG,OAAO,KAAK,CAAa,EAAE,SAAS,WAAW,EAClD,EAAG,OAAO,KAAK,CAAY,EAAE,SAAS,WAAW,CACnD,CACF,CAAC,EACK,EAAY,EAAO,gBAAgB,CACvC,OAAQ,MACR,IAAK,CAAE,IAAK,MAAO,IAAK,SAAU,EAAG,OAAO,KAAK,CAAY,EAAE,SAAS,WAAW,CAAE,CACvF,CAAC,EAEK,EAAS,EAAO,cAAc,CAAE,aAAY,WAAU,CAAC,EACvD,EAAW,OAAO,OAAO,CAAC,EAAQ,OAAO,KAAK,CAAI,CAAC,CAAC,EAC1D,OAAO,OAAO,KAAK,EAAO,SAAS,SAAU,EAAU,EAAM,EAAmB,EAAE,CAAC,CACrF,CAGA,SAAgB,GAAY,EAAsB,CAChD,OAAO,OAAO,KAAK,EAAK,QAAQ,KAAM,EAAE,EAAG,KAAK,CAClD,CAGA,SAAgB,GAAO,EAAuB,CAC5C,IAAM,EAAgB,EAAM,MAAM,GAAG,EAAE,GACvC,GAAI,CAAC,EAAe,MAAU,MAAM,eAAe,EACnD,IAAM,EAAU,KAAK,MAAM,OAAO,KAAK,EAAe,QAAQ,EAAE,SAAS,MAAM,CAAC,EAChF,GAAI,OAAO,EAAQ,KAAQ,SAAU,MAAU,MAAM,uBAAuB,EAC5E,OAAO,EAAQ,GACjB,CCnCA,eAAsB,EAAa,EAAa,EAA6B,CAC3E,IAAM,EAAU,MAAM,EAAU,WAAW,EACtC,IACH,EAAE,IAAI,MAAM,EAAM,IAAI,sDAAsD,CAAC,EAC7E,QAAQ,KAAK,CAAC,GAGhB,IAAM,EAAO,EAAK,QAAQ,QAAQ,IAAI,EAAG,CAAG,EACtC,EAAW,EAAK,KAAK,EAAM,cAAc,EAG3C,GAAoB,CAAI,GAC1B,EAAE,IAAI,KACJ,EAAM,OACJ,qFACF,CACF,EAGG,EAAG,WAAW,CAAQ,IACzB,EAAE,IAAI,MAAM,EAAM,IAAI,+CAA+C,CAAC,EACtE,QAAQ,KAAK,CAAC,GAGhB,IAAM,EAAI,EAAE,QAAQ,EAGpB,EAAE,MAAM,EAAM,OAAO,wBAAwB,CAAC,EAC9C,IAAI,EACJ,GAAI,CACF,IAAM,EAAc,EAAG,aAAa,EAAU,OAAO,EACrD,EAAiB,CAAW,EAC5B,EAAW,EAAK,KAAK,CAAW,EAChC,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,qBAAqB,CAClD,OAAS,EAAQ,CACf,EAAE,KAAK,EAAM,IAAI,4BAA4B,CAAC,EAC9C,EAAE,IAAI,MAAM,EAAE,OAAO,EACrB,QAAQ,KAAK,CAAC,CAChB,CAEA,EAAgB,EAAS,IAAI,EAC7B,IAAM,EAAmB,EAAS,KAE5B,EAAa,EAAK,QAAQ,EAAM,EAAQ,MAAM,EAChD,EAA+B,KAEnC,GAAI,CACF,EAAE,MAAM,aAAa,EAAK,aAAa,EAAM,KAAK,CAAI,EAAE,IAAI,EAC5D,IAAM,EAAW,MAAM,EAAc,EAAM,EAAM,CAAQ,EACzD,EAAU,EAAS,QACnB,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,GAAG,IAAS,MAAQ,kBAAoB,GAAG,EAAK,kBAAkB,EAAE,EAG/F,EAAE,MAAM,EAAM,OAAO,2BAA2B,CAAC,EACjD,IAAI,EACJ,GAAI,CACF,IAAM,EAAY,MAAM,EAAS,gBAAgB,EACjD,GAAI,EACF,EAAkB,OAAO,KAAK,CAAS,EAAE,SAAS,KAAK,EACvD,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,6BAA6B,MACnD,CAGL,IAAM,EAAS,MAAM,GAAY,aAAa,EAC9C,MAAM,EAAgB,kBAAkB,CACtC,SAAU,EAAO,SACjB,gBAAiB,EAAO,SAC1B,CAAC,EAED,IAAM,EAAS,GAAO,EAAQ,YAAY,EACpC,EAAO,EAAO,YAAY,EAAE,EAC5B,CAAE,aAAc,EAAS,mBAAoB,MAAM,EAAgB,gBAAgB,CACvF,OACA,gBAAiB,EACjB,gBAAiB,EAAO,SAC1B,CAAC,EAQK,EAAe,GAAU,EAAS,EAP5B,GACV,EAAO,WACP,EAAO,UACP,EACA,GAAe,EACf,GAAY,CAAM,CAE4B,CAAC,EACjD,EAAkB,OAAO,KAAK,CAAY,EAAE,SAAS,KAAK,EAC1D,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,iCAAiC,EAGvD,MADe,EAAS,iBAAiB,CAAY,GAExD,EAAE,IAAI,KACJ,EAAM,OACJ,oCAAoC,QAAQ,WAAa,SAAW,WAAa,qBAAqB,uBACxG,CACF,CAEJ,CACF,OAAS,EAAQ,CAGf,MAFA,EAAE,KAAK,EAAM,IAAI,+BAA+B,CAAC,EACjD,EAAE,IAAI,MAAM,GAAG,EAAE,QAAQ,cAAc,QAAQ,SAAS,EAAE,EACpD,CACR,CAGA,EAAE,MAAM,EAAM,OAAO,uBAAuB,CAAC,EAC7C,MAAM,EAAY,EAAS,WAAY,EAAY,EAAiB,EAAG,CAAI,EAC3E,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,sBAAsB,EAEjD,EAAE,KAAK,WAAW,EAAM,UAAU,KAAK,CAAU,IAAK,UAAU,CAClE,OAAS,EAAQ,CAGf,MAFA,EAAE,KAAK,EAAM,IAAI,cAAc,CAAC,EAChC,EAAE,IAAI,MAAM,EAAE,OAAO,EACf,CACR,QAAU,CACJ,GAAS,EAAQ,CACvB,CACF,CCxHA,SAAS,IAA8B,CACrC,IAAI,EAAU,KAAK,IAAI,EAEvB,MAAO,CACL,KAAM,qBACN,gBAAgB,EAAQ,CACtB,EAAO,QAAQ,GAAG,aAAgB,CAChC,EAAU,KAAK,IAAI,CACrB,CAAC,EAED,EAAO,YAAY,IAAI,YAAa,EAAK,IAAQ,CAC/C,EAAI,UAAU,eAAgB,kBAAkB,EAChD,EAAI,UAAU,8BAA+B,GAAG,EAChD,EAAI,IAAI,KAAK,UAAU,CAAE,SAAQ,CAAC,CAAC,CACrC,CAAC,CACH,CACF,CACF,CAEA,eAAsB,GAAW,EAAa,CAC5C,IAAM,EAAO,EAAK,QAAQ,QAAQ,IAAI,EAAG,CAAG,EACtC,EAAW,EAAK,KAAK,EAAM,cAAc,EAE1C,EAAG,WAAW,CAAQ,IACzB,EAAE,IAAI,MAAM,EAAM,IAAI,+CAA+C,CAAC,EACtE,QAAQ,KAAK,CAAC,GAIhB,GAAI,CAEF,EADoB,EAAG,aAAa,EAAU,OACnB,CAAC,CAC9B,OAAS,EAAQ,CACf,EAAE,IAAI,MAAM,8BAA8B,EAAE,SAAS,EACrD,QAAQ,KAAK,CAAC,CAChB,CAEA,IAAM,EAAO,MAAM,EAAkB,GAAI,EAEnC,EAAI,EAAE,QAAQ,EACpB,EAAE,MAAM,EAAM,OAAO,2BAA2B,EAAK,IAAI,CAAC,EAe1D,MAAM,MAbe,GAAa,CAChC,OACA,WAAY,EAAK,QAAQ,EAAM,gBAAgB,EAC/C,QAAS,CAAC,GAAoB,CAAC,EAC/B,OAAQ,CACN,OACA,WAAY,GACZ,KAAM,GACN,KAAM,WACR,EACA,SAAU,OACZ,CAAC,GAEY,OAAO,EACpB,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,0BAA0B,EAAK,EAAE,EAE5D,IAAM,EAAe,oBAAoB,IACzC,EAAE,IAAI,KAAK,+BAA+B,EAAM,UAAU,KAAK,CAAY,GAAG,EAE9E,IAAM,EAAa,EAAS,mBAAoB,CAAE,OAAQ,EAAG,CAAC,EAAE,KAC1D,EAAc,EAAK,KAAK,EAAY,UAAU,EAE9C,MAAgB,CACpB,GAAI,EAAG,WAAW,CAAW,EAC3B,GAAI,CACF,EAAG,WAAW,CAAW,CAC3B,MAAY,CAAC,CAEjB,EAEK,EAAG,WAAW,CAAU,GAAG,EAAG,UAAU,EAAY,CAAE,UAAW,EAAK,CAAC,EAC5E,EAAG,cAAc,EAAa,KAAK,UAAU,CAAE,IAAK,EAAc,MAAK,EAAG,KAAM,CAAC,CAAC,EAElF,QAAQ,GAAG,aAAgB,CACzB,EAAQ,EACR,QAAQ,KAAK,CACf,CAAC,EACD,QAAQ,GAAG,cAAiB,CAC1B,EAAQ,EACR,QAAQ,KAAK,CACf,CAAC,EACD,QAAQ,GAAG,OAAQ,CAAO,EAE1B,EAAE,KAAK,SAAS,EAAM,KAAK,CAAI,EAAE,2BAA4B,mBAAmB,CAClF,CAEA,eAAe,EAAkB,EAAoC,CACnE,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,IAAM,EAAS,EAAI,aAAa,EAChC,EAAO,MAAM,EACb,EAAO,GAAG,QAAU,GAAa,CAC3B,EAAI,OAAS,aACf,EAAQ,EAAkB,EAAY,CAAC,CAAC,EAExC,EAAO,CAAG,CAEd,CAAC,EACD,EAAO,OAAO,MAAiB,CAC7B,EAAO,UAAY,EAAQ,CAAS,CAAC,CACvC,CAAC,CACH,CAAC,CACH,CCzGA,eAAe,GAAgB,EAAoB,EAAoD,CACrG,IAAM,EAAW,KAAK,IAAI,EAAI,IAE9B,KAAO,KAAK,IAAI,EAAI,GAAU,CAC5B,MAAM,IAAI,QAAQ,GAAW,WAAW,EAAS,EAAc,GAAI,CAAC,EAEpE,IAAM,EAAM,MAAM,EAAW,gBAAgB,CAAE,YAAW,CAAC,EAE3D,GAAI,EAAI,SAAA,GAAyC,EAAI,QACnD,OAAO,EAAI,QAEb,GAAI,EAAI,SAAA,GAAwC,EAAI,SAAA,EAClD,OAAO,IAGX,CAEA,OAAO,IACT,CAEA,MAAa,GAAe,SAAY,CACtC,IAAM,EAAI,EAAE,QAAQ,EAEpB,GAAI,CAEF,GAAM,CAAE,aAAY,WAAU,kBAAiB,YAAa,MAAM,EAAW,iBAAiB,CAAE,OAAQ,KAAM,CAAC,EAG/G,EAAE,IAAI,QAAQ,oBAAoB,EAAM,UAAU,KAAK,CAAe,GAAG,EACzE,EAAE,IAAI,QAAQ,UAAU,EAAM,KAAK,OAAO,CAAQ,GAAG,EAGrD,MAAM,EAAK,GADI,EAAgB,aAAa,mBAAmB,CAAQ,GACzD,EAGd,EAAE,MAAM,EAAM,OAAO,cAAc,CAAC,EACpC,IAAM,EAAU,MAAM,GAAgB,EAAY,GAAY,CAAC,EAE1D,IACH,EAAE,KAAK,EAAM,IAAI,wBAAwB,CAAC,EAC1C,QAAQ,KAAK,CAAC,GAIhB,MAAM,EAAU,YAAY,CAC1B,aAAc,EAAQ,YACtB,cAAe,EAAQ,aACvB,WAAa,EAAQ,WAAa,SAClC,WAAY,OAAO,EAAQ,SAAS,EACpC,WAAY,KACZ,KAAM,CACJ,MAAO,EAAQ,MACf,GAAI,GACJ,IAAK,GACL,KAAM,GACN,mBAAoB,GACpB,MAAO,GACP,aAAc,GACd,gBAAiB,GACjB,aAAc,CAAC,EACf,cAAe,CAAC,EAChB,WAAY,GACZ,WAAY,GACZ,aAAc,EAChB,CACF,CAAC,EAED,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,GAAG,EAAM,KAAK,EAAQ,KAAK,EAAE,aAAa,CACvE,OAAS,EAAK,CACZ,EAAE,KAAK,EAAM,IAAI,WAAW,CAAC,EAC7B,EAAE,IAAI,MAAM,aAAe,MAAQ,EAAI,QAAU,OAAO,CAAG,CAAC,EAC5D,QAAQ,KAAK,CAAC,CAChB,CACF,EChFa,GAAgB,SAAY,CACvC,MAAM,EAAU,aAAa,EAC7B,EAAE,IAAI,QAAQ,EAAM,MAAM,0BAA0B,CAAC,CACvD,ECMA,eAAsB,GAAe,EAAa,CAE3C,MADiB,EAAU,WAAW,IAEzC,EAAE,IAAI,MAAM,EAAM,IAAI,wDAAwD,CAAC,EAC/E,QAAQ,KAAK,CAAC,GAGhB,IAAM,EAAO,EAAK,QAAQ,QAAQ,IAAI,EAAG,CAAG,EACtC,EAAW,EAAK,KAAK,EAAM,cAAc,EAE1C,EAAG,WAAW,CAAQ,IACzB,EAAE,IAAI,MAAM,EAAM,IAAI,+CAA+C,CAAC,EACtE,QAAQ,KAAK,CAAC,GAGhB,IAAM,EAAI,EAAE,QAAQ,EAGpB,EAAE,MAAM,EAAM,OAAO,wBAAwB,CAAC,EAC9C,IAAI,EACJ,GAAI,CACF,IAAM,EAAc,EAAG,aAAa,EAAU,OAAO,EACrD,EAAiB,CAAW,EAC5B,EAAW,EAAK,KAAK,CAAW,EAChC,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,uBAAuB,EAAM,KAAK,EAAS,IAAI,GAAG,CAC/E,OAAS,EAAQ,CACf,EAAE,KAAK,EAAM,IAAI,4BAA4B,CAAC,EAC9C,EAAE,IAAI,MAAM,EAAE,OAAO,EACrB,QAAQ,KAAK,CAAC,CAChB,CAGA,IAAM,EAAa,EAAO,YAAY,EAAE,EAClC,EAAgB,EAAW,SAAS,KAAK,EAG/C,EAAE,MAAM,EAAM,OAAO,mCAAmC,CAAC,EACzD,IAAI,EACA,EACA,EACJ,GAAI,CACF,IAAM,EAAM,MAAM,EAAgB,kBAAkB,CAClD,KAAM,EAAS,KACf,KAAM,EAAS,KACH,aAEZ,SAAU,EAAS,SAAW,CAAC,GAAG,IAAK,IAA2C,CAChF,OAAQ,EAAE,OACV,OAAQ,EAAE,MACZ,EAAE,CACJ,CAAC,EACD,EAAc,EAAI,YAClB,EAAY,EAAI,UAChB,EAAY,EAAI,UAChB,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,uBAAuB,CACpD,OAAS,EAAQ,CACf,EAAE,KAAK,EAAM,IAAI,qBAAqB,CAAC,EACvC,EAAE,IAAI,MAAM,EAAE,OAAO,EACrB,QAAQ,KAAK,CAAC,CAChB,CAIA,EAAgB,EAAS,IAAI,EAC7B,IAAM,EAAmB,EAAS,KAC5B,EAAc,EAAK,KAAK,EAAM,YAAY,EAAU,KAAK,EAC3D,EAAqC,KAEzC,GAAI,CACF,EAAE,MAAM,EAAM,OAAO,IAAS,MAAQ,kCAAoC,aAAa,EAAK,WAAW,CAAC,EACxG,IAAM,EAAW,MAAM,EAAc,EAAM,EAAM,CAAQ,EACzD,EAAgB,EAAS,QACzB,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,GAAG,IAAS,MAAQ,kBAAoB,GAAG,EAAK,kBAAkB,EAAE,EAE/F,EAAE,MAAM,EAAM,OAAO,+BAA+B,CAAC,EACrD,MAAM,EAAY,EAAS,WAAY,EAAa,EAAe,EAAG,CAAI,EAC1E,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,kBAAkB,EAG7C,EAAE,MAAM,EAAM,OAAO,yBAAyB,CAAC,EAC/C,IAAM,EAAa,EAAG,aAAa,CAAW,EACxC,EAAY,MAAM,MAAM,EAAW,CACvC,OAAQ,MACR,KAAM,EACN,QAAS,CACP,eAAgB,2BAEhB,gBAAiB,qCACnB,CACF,CAAC,EAED,GAAI,CAAC,EAAU,GACb,MAAU,MAAM,kBAAkB,EAAU,YAAY,EAU1D,GARA,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,mBAAmB,EAG9C,EAAE,MAAM,EAAM,OAAO,+BAA+B,CAAC,EACrD,MAAM,EAAgB,cAAc,CAAE,WAAU,CAAC,EACjD,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,mBAAmB,EAG1C,EAAS,YAAa,CACxB,EAAE,MAAM,EAAM,OAAO,sBAAsB,CAAC,EAC5C,GAAI,CACF,MAAM,EAAgB,wBAAwB,CAC5C,GAAI,EACJ,KAAM,EAAS,KACf,YAAa,EAAS,WACxB,CAAC,EACD,EAAE,KAAK,GAAG,EAAM,MAAM,GAAG,EAAE,mBAAmB,CAChD,OAAS,EAAQ,CACf,EAAE,KAAK,EAAM,OAAO,6BAA6B,CAAC,EAClD,EAAE,IAAI,KAAK,EAAE,OAAO,CACtB,CACF,CAEA,EAAE,KAAK,iBAAiB,EAAM,KAAK,CAAS,IAAK,UAAU,CAC7D,OAAS,EAAQ,CACf,EAAE,KAAK,EAAM,IAAI,2BAA2B,CAAC,EAC7C,EAAE,IAAI,MAAM,EAAE,OAAO,EAErB,EAAE,IAAI,KAAK,EAAM,OAAO,sBAAsB,CAAC,EAC/C,GAAI,CACF,MAAM,EAAgB,aAAa,CAAE,WAAU,CAAC,CAClD,OAAS,EAAgB,CACvB,EAAE,IAAI,MAAM,4BAA4B,EAAU,SAAS,CAC7D,CACA,MAAM,CACR,QAAU,CACJ,EAAG,WAAW,CAAW,GAC3B,EAAG,WAAW,CAAW,EAEvB,GAAe,EAAc,CACnC,CACF,CCzIA,eAAsB,GAAe,EAAa,EAA6B,CAC7E,EAAE,IAAI,KAAK,EAAM,KAAK,4CAA4C,CAAC,EACnE,MAAM,EAAa,EAAK,CAAO,CACjC,CCVA,MAAM,GAAe,EAAI,cAAgB,mCACnC,GAAoB,EAAI,mBAAqB,gBAEtC,GAAoB,SAAY,CAC3C,IAAM,EAAU,MAAM,EAAU,gBAAgB,EAE1C,EAAWC,EAAa,GAAc,GAAmB,CAC7D,KAAM,CACJ,eAAgB,GAChB,iBAAkB,GAClB,mBAAoB,EACtB,CACF,CAAC,EAED,GAAI,EAAS,CACX,GAAM,CAAE,SAAU,MAAM,EAAS,KAAK,WAAW,CAC/C,aAAc,EAAQ,aACtB,cAAe,EAAQ,aACzB,CAAC,EACG,GACF,QAAQ,MAAM,mCAAoC,EAAM,OAAO,CAEnE,CAEA,OAAO,CACT,ECzBa,GAAgB,SAAY,CAEvC,GAAM,CACJ,KAAM,CAAE,QACR,SACE,MAAM,MAJa,GAAkB,GAItB,KAAK,QAAQ,EAEhC,GAAI,GAAS,CAAC,EAAM,CACd,GACF,EAAE,IAAI,MAAM,eAAe,EAAM,SAAS,EAE5C,EAAE,IAAI,KAAK,gBAAgB,EAC3B,MACF,CAEA,EAAE,IAAI,KAAK,iBAAiB,EAAM,MAAM,EAAK,OAAS,SAAS,GAAG,CACpE,ECdM,EAAA,QAIN,IAAI,EAAc,GAKlB,SAAS,IAA+B,CACtC,IAAM,EAAU,QAAQ,IAAI,kBAC5B,GAAI,IAAY,IAAY,KAAO,EAAQ,YAAY,IAAM,SAC3D,MAAO,GAET,IAAM,EAAM,QAAQ,IAAI,aAIxB,MAHA,GAAI,IAAQ,IAAQ,KAAO,EAAI,YAAY,IAAM,QAInD,CAEA,SAAgB,IAAmB,CAC7B,GAAe,GAAoB,IAEvC,EAAO,KAAK,CACV,IAAK,kGACL,QAAS,eAAe,IACxB,YAAa,QAAQ,IAAI,UAAY,aAErC,iBAAkB,EAElB,WAAY,EACd,CAAC,EAED,EAAO,QAAQ,CACb,cAAe,EACf,cAAe,QAAQ,SACvB,aAAc,EAAG,QAAQ,EACzB,eAAgB,QAAQ,OAC1B,CAAC,EAED,EAAc,GAChB,CAEA,eAAsB,GAAa,EAAgB,EAA+C,CAC3F,IACD,GAAS,SACX,EAAO,OAAO,cAAe,EAAQ,OAAO,EAE9C,EAAO,iBAAiB,CAAK,EAE7B,MAAM,EAAO,MAAM,GAAI,EAAE,UAAY,CAAC,CAAC,EACzC,CC7CA,GAAW,EAEX,eAAe,EAAc,EAAgB,EAAiB,EAA+B,CAC3F,MAAM,GAAa,EAAO,CAAE,SAAQ,CAAC,EACrC,EAAE,OAAO,EAAM,IAAI,GAAG,EAAM,IAAI,OAAO,CAAK,GAAG,CAAC,EAChD,QAAQ,KAAK,CAAC,CAChB,CAEA,MAAM,EAAU,IAAI,EAEpB,EAAQ,KAAK,SAAS,EAAE,YAAY,kDAAkD,EAAE,QAAQ,OAAO,EAEvG,EACG,QAAQ,OAAO,EACf,YAAY,mBAAmB,EAC/B,OAAO,SAAY,CAClB,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAa,EACnB,EAAE,MAAM,EAAM,MAAM,0BAA0B,CAAC,CACjD,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,QAAS,cAAc,CACpD,CACF,CAAC,EAEH,EACG,QAAQ,QAAQ,EAChB,YAAY,sBAAsB,EAClC,OAAO,SAAY,CAClB,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAc,EACpB,EAAE,MAAM,EAAM,MAAM,0BAA0B,CAAC,CACjD,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,SAAU,eAAe,CACtD,CACF,CAAC,EAEH,EACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC,OAAO,SAAY,CAClB,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAc,EACpB,EAAE,MAAM,EAAM,MAAM,OAAO,CAAC,CAC9B,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,SAAU,yBAAyB,CAChE,CACF,CAAC,EAEH,EACG,QAAQ,OAAO,EACf,YAAY,2BAA2B,EACvC,SAAS,QAAS,qBAAsB,GAAG,EAC3C,OAAO,sBAAuB,kBAAmB,mBAAmB,EACpE,OAAO,MAAO,EAAK,IAAY,CAC9B,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,EAAa,EAAK,CAAO,EAC/B,EAAE,MAAM,EAAM,MAAM,kBAAkB,CAAC,CACzC,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,QAAS,cAAc,CACpD,CACF,CAAC,EAEH,EACG,QAAQ,SAAS,EACjB,YAAY,kEAAkE,EAC9E,SAAS,QAAS,uBAAwB,GAAG,EAC7C,OAAO,sBAAuB,kBAAmB,mBAAmB,EACpE,OAAO,MAAO,EAAK,IAAY,CAC9B,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAe,EAAK,CAAO,EACjC,EAAE,MAAM,EAAM,MAAM,oBAAoB,CAAC,CAC3C,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,UAAW,gBAAgB,CACxD,CACF,CAAC,EAEH,EACG,QAAQ,SAAS,EACjB,YAAY,0CAA0C,EACtD,SAAS,QAAS,uBAAwB,GAAG,EAC7C,OAAO,KAAM,IAAO,CACnB,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAe,CAAG,EACxB,EAAE,MAAM,EAAM,MAAM,yBAAyB,CAAC,CAChD,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,UAAW,gBAAgB,CACxD,CACF,CAAC,EAEH,EACG,QAAQ,KAAK,EACb,YAAY,kDAAkD,EAC9D,SAAS,QAAS,qBAAsB,GAAG,EAC3C,OAAO,KAAM,IAAO,CACnB,EAAE,MAAM,EAAM,OAAO,MAAM,KAAK,eAAe,CAAC,EAChD,GAAI,CACF,MAAM,GAAW,CAAG,CACtB,OAAS,EAAO,CACd,MAAM,EAAc,EAAO,MAAO,mBAAmB,CACvD,CACF,CAAC,EAEH,EAAQ,MAAM","debug_id":"16bb9cc5-45ac-5bb6-89ae-0f2d85b72fa0"}
|