@tailor-platform/sdk 1.3.0 → 1.4.1

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.
@@ -1,5 +1,5 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./chunk-CIV_ash9.mjs";
2
- import { i as WORKFLOW_JOB_BRAND, r as getDistDir } from "./config-BmQRlW1j.mjs";
2
+ import { i as WORKFLOW_JOB_BRAND, r as getDistDir } from "./config-CBpYlVa-.mjs";
3
3
  import Module, { createRequire } from "node:module";
4
4
  import { defineCommand } from "citty";
5
5
  import * as fs$15 from "node:fs";
@@ -40,8 +40,8 @@ import ora from "ora";
40
40
  //#region src/cli/utils/errors.ts
41
41
  /**
42
42
  * Type guard to check if an error is a CLIError
43
- * @param {unknown} error - Error to check
44
- * @returns {error is CLIError} True if the error is a CLIError
43
+ * @param error - Error to check
44
+ * @returns True if the error is a CLIError
45
45
  */
46
46
  function isCLIError(error) {
47
47
  return error instanceof Error && error.name === "CLIError";
@@ -243,8 +243,8 @@ const durationSchema = z.templateLiteral([z.number().int().positive(), z.enum(du
243
243
  });
244
244
  /**
245
245
  * Parse a duration string (e.g., "3s", "500ms", "1m") to milliseconds
246
- * @param {string} duration - Duration string with unit suffix (ms, s, m)
247
- * @returns {number} Duration in milliseconds
246
+ * @param duration - Duration string with unit suffix (ms, s, m)
247
+ * @returns Duration in milliseconds
248
248
  */
249
249
  function parseDuration(duration) {
250
250
  return durationSchema.parse(duration);
@@ -256,8 +256,8 @@ function parseDuration(duration) {
256
256
  * Follows Node.js --env-file behavior:
257
257
  * - Variables already set in the environment are NOT overwritten
258
258
  * - Variables from later files override those from earlier files
259
- * @param {EnvFileArg} envFiles - Required env file path(s) that must exist
260
- * @param {EnvFileArg} envFilesIfExists - Optional env file path(s) that are loaded if they exist
259
+ * @param envFiles - Required env file path(s) that must exist
260
+ * @param envFilesIfExists - Optional env file path(s) that are loaded if they exist
261
261
  */
262
262
  function loadEnvFiles(envFiles, envFilesIfExists) {
263
263
  const originalEnvKeys = new Set(Object.keys(process.env));
@@ -352,10 +352,11 @@ const jsonArgs = { json: {
352
352
  * - Error handling with formatted output
353
353
  * - Exit code management
354
354
  * @template T
355
- * @param {(args: T) => Promise<void>} handler - Command handler function
356
- * @returns {(ctx: { args: T }) => Promise<void>} Wrapped handler
355
+ * @param handler - Command handler function
356
+ * @returns Wrapped handler
357
357
  */
358
- const withCommonArgs = (handler) => async ({ args }) => {
358
+ const withCommonArgs = (handler) => async (context) => {
359
+ const { args } = context;
359
360
  try {
360
361
  if ("json" in args && typeof args.json === "boolean") logger.jsonMode = args.json;
361
362
  loadEnvFiles(args["env-file"], args["env-file-if-exists"]);
@@ -476,7 +477,7 @@ const file_tailor_v1_secret_manager_resource = /* @__PURE__ */ fileDesc("Cid0YWl
476
477
  /**
477
478
  * Describes the file tailor/v1/auth_resource.proto.
478
479
  */
479
- const file_tailor_v1_auth_resource = /* @__PURE__ */ fileDesc("Ch10YWlsb3IvdjEvYXV0aF9yZXNvdXJjZS5wcm90bxIJdGFpbG9yLnYxIjYKC0F1dGhTZXJ2aWNlEicKCW5hbWVzcGFjZRgBIAEoCzIULnRhaWxvci52MS5OYW1lc3BhY2UitAYKDUF1dGhJRFBDb25maWcSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI0CglhdXRoX3R5cGUYAiABKA4yIS50YWlsb3IudjEuQXV0aElEUENvbmZpZy5BdXRoVHlwZRIvCgZjb25maWcYAyABKAsyHy50YWlsb3IudjEuQXV0aElEUENvbmZpZy5Db25maWcauAEKBkNvbmZpZxIzCgRvaWRjGAEgASgLMiMudGFpbG9yLnYxLkF1dGhJRFBDb25maWcuT0lEQ0NvbmZpZ0gAEjMKBHNhbWwYAiABKAsyIy50YWlsb3IudjEuQXV0aElEUENvbmZpZy5TQU1MQ29uZmlnSAASOgoIaWRfdG9rZW4YAyABKAsyJi50YWlsb3IudjEuQXV0aElEUENvbmZpZy5JRFRva2VuQ29uZmlnSABCCAoGY29uZmlnGpgBCgpPSURDQ29uZmlnEhUKDWNsaWVudF9pZF9rZXkYASABKAkSMQoRY2xpZW50X3NlY3JldF9rZXkYAiABKAsyFi50YWlsb3IudjEuU2VjcmV0VmFsdWUSFAoMcHJvdmlkZXJfdXJsGAMgASgJEhIKCmlzc3Vlcl91cmwYBCABKAkSFgoOdXNlcm5hbWVfY2xhaW0YBSABKAkaYQoKU0FNTENvbmZpZxIUCgxtZXRhZGF0YV91cmwYASABKAkSFAoMcmF3X21ldGFkYXRhGAQgASgJEhsKE2VuYWJsZV9zaWduX3JlcXVlc3QYBSABKAhKBAgCEANKBAgDEAQaZAoNSURUb2tlbkNvbmZpZxIUCgxwcm92aWRlcl91cmwYASABKAkSEQoJY2xpZW50X2lkGAIgASgJEhIKCmlzc3Vlcl91cmwYAyABKAkSFgoOdXNlcm5hbWVfY2xhaW0YBCABKAkiZQoIQXV0aFR5cGUSGQoVQVVUSF9UWVBFX1VOU1BFQ0lGSUVEEAASEgoOQVVUSF9UWVBFX09JREMQARISCg5BVVRIX1RZUEVfU0FNTBACEhYKEkFVVEhfVFlQRV9JRF9UT0tFThADIq0GChlVc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnEhQKCHByb3ZpZGVyGAEgASgJQgIYARJTCg1wcm92aWRlcl90eXBlGAIgASgOMjwudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcuVXNlclByb2ZpbGVQcm92aWRlclR5cGUSOwoGY29uZmlnGAMgASgLMisudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcuQ29uZmlnGmMKBkNvbmZpZxJPCgh0YWlsb3JkYhgBIAEoCzI7LnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnLlRhaWxvckRCUHJvdmlkZXJDb25maWdIAEIICgZjb25maWcakgMKFlRhaWxvckRCUHJvdmlkZXJDb25maWcSOwoJbmFtZXNwYWNlGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi0KBHR5cGUYAiABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQSFgoOdXNlcm5hbWVfZmllbGQYAyABKAkSGQoRYXR0cmlidXRlc19maWVsZHMYBCADKAkSFwoPdGVuYW50X2lkX2ZpZWxkGAUgASgJEooBCg1hdHRyaWJ1dGVfbWFwGAYgAygLMk0udGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcuVGFpbG9yREJQcm92aWRlckNvbmZpZy5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGjMKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEibgoXVXNlclByb2ZpbGVQcm92aWRlclR5cGUSKgomVVNFUl9QUk9GSUxFX1BST1ZJREVSX1RZUEVfVU5TUEVDSUZJRUQQABInCiNVU0VSX1BST0ZJTEVfUFJPVklERVJfVFlQRV9UQUlMT1JEQhABIr4DChRUZW5hbnRQcm92aWRlckNvbmZpZxIQCghwcm92aWRlchgBIAEoCRJJCg1wcm92aWRlcl90eXBlGAIgASgOMjIudGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnLlRlbmFudFByb3ZpZGVyVHlwZRI2CgZjb25maWcYAyABKAsyJi50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWcuQ29uZmlnGl4KBkNvbmZpZxJKCgh0YWlsb3JkYhgBIAEoCzI2LnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZy5UYWlsb3JEQlByb3ZpZGVyQ29uZmlnSABCCAoGY29uZmlnGlIKFlRhaWxvckRCUHJvdmlkZXJDb25maWcSEQoJbmFtZXNwYWNlGAEgASgJEgwKBHR5cGUYAiABKAkSFwoPc2lnbmF0dXJlX2ZpZWxkGAMgASgJIl0KElRlbmFudFByb3ZpZGVyVHlwZRIkCiBURU5BTlRfUFJPVklERVJfVFlQRV9VTlNQRUNJRklFRBAAEiEKHVRFTkFOVF9QUk9WSURFUl9UWVBFX1RBSUxPUkRCEAEiOwoLQXV0aEludm9rZXISEQoJbmFtZXNwYWNlGAEgASgJEhkKEW1hY2hpbmVfdXNlcl9uYW1lGAIgASgJIkgKE1BlcnNvbmFsQWNjZXNzVG9rZW4SDAoEbmFtZRgBIAEoCRIjCgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGUixgMKC01hY2hpbmVVc2VyEgoKAmlkGAEgASgJEjYKBG5hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSFgoJY2xpZW50X2lkGAMgASgJQgPgQQMSGgoNY2xpZW50X3NlY3JldBgEIAEoCUID4EEDEiEKCmF0dHJpYnV0ZXMYBSADKAlCDbpICpIBByIFcgOwAQESMwoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIzCgp1cGRhdGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEmUKDWF0dHJpYnV0ZV9tYXAYCCADKAsyKC50YWlsb3IudjEuTWFjaGluZVVzZXIuQXR0cmlidXRlTWFwRW50cnlCJLpIIZoBHiIcchoyGF5bYS16XVswLTlhLXpBLVpdezAsNjJ9JBpLChFBdHRyaWJ1dGVNYXBFbnRyeRILCgNrZXkYASABKAkSJQoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWU6AjgBIt4CCg5BdXRoU0NJTUNvbmZpZxJDChFtYWNoaW5lX3VzZXJfbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChJhdXRob3JpemF0aW9uX3R5cGUYAiABKA4yKy50YWlsb3IudjEuQXV0aFNDSU1Db25maWcuQXV0aG9yaXphdGlvblR5cGUSLwoNYmVhcmVyX3NlY3JldBgKIAEoCzIWLnRhaWxvci52MS5TZWNyZXRWYWx1ZUgAInUKEUF1dGhvcml6YXRpb25UeXBlEiIKHkFVVEhPUklaQVRJT05fVFlQRV9VTlNQRUNJRklFRBAAEh0KGUFVVEhPUklaQVRJT05fVFlQRV9CRUFSRVIQARIdChlBVVRIT1JJWkFUSU9OX1RZUEVfT0FVVEgyEAJCFgoUYXV0aG9yaXphdGlvbl9jb25maWciwwIKEEF1dGhTQ0lNUmVzb3VyY2USPwoEbmFtZRgBIAEoCUIxukguciwyKl5bQS1aYS16MC05XVtBLVphLXowLTktXXsxLDYxfVtBLVphLXowLTldJBJFChN0YWlsb3JfZGJfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjcKDnRhaWxvcl9kYl90eXBlGAMgASgJQh+6SBxyGjIYXltBLVpdW2EtekEtWjAtOV17MCw2Mn0kEj4KEWF0dHJpYnV0ZV9tYXBwaW5nGAQgAygLMiMudGFpbG9yLnYxLkF1dGhTQ0lNQXR0cmlidXRlTWFwcGluZxIuCgtjb3JlX3NjaGVtYRgFIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTVNjaGVtYSJGChhBdXRoU0NJTUF0dHJpYnV0ZU1hcHBpbmcSFwoPdGFpbG9yX2RiX2ZpZWxkGAEgASgJEhEKCXNjaW1fcGF0aBgCIAEoCSJQCg5BdXRoU0NJTVNjaGVtYRIMCgRuYW1lGAEgASgJEjAKCmF0dHJpYnV0ZXMYAiADKAsyHC50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUi2QUKEUF1dGhTQ0lNQXR0cmlidXRlEi8KBHR5cGUYASABKA4yIS50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUuVHlwZRIuCgRuYW1lGAIgASgJQiC6SB1yGzIZXltBLVphLXpdW2EtekEtWjAtOV8kLV0qJBITCgtkZXNjcmlwdGlvbhgDIAEoCRI7CgptdXRhYmlsaXR5GAQgASgOMicudGFpbG9yLnYxLkF1dGhTQ0lNQXR0cmlidXRlLk11dGFiaWxpdHkSEAoIcmVxdWlyZWQYBSABKAgSFAoMbXVsdGlfdmFsdWVkGAYgASgIEjsKCnVuaXF1ZW5lc3MYByABKA4yJy50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUuVW5pcXVlbmVzcxIYChBjYW5vbmljYWxfdmFsdWVzGAggAygJEjQKDnN1Yl9hdHRyaWJ1dGVzGAkgAygLMhwudGFpbG9yLnYxLkF1dGhTQ0lNQXR0cmlidXRlInUKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhAKDFRZUEVfQ09NUExFWBABEg8KC1RZUEVfU1RSSU5HEAISDwoLVFlQRV9OVU1CRVIQAxIQCgxUWVBFX0JPT0xFQU4QBBIRCg1UWVBFX0RBVEVUSU1FEAUieAoKTXV0YWJpbGl0eRIaChZNVVRBQklMSVRZX1VOU1BFQ0lGSUVEEAASGAoUTVVUQUJJTElUWV9SRUFEX09OTFkQARIZChVNVVRBQklMSVRZX1JFQURfV1JJVEUQAhIZChVNVVRBQklMSVRZX1dSSVRFX09OTFkQAyJrCgpVbmlxdWVuZXNzEhoKFlVOSVFVRU5FU1NfVU5TUEVDSUZJRUQQABITCg9VTklRVUVORVNTX05PTkUQARIVChFVTklRVUVORVNTX1NFUlZFUhACEhUKEVVOSVFVRU5FU1NfR0xPQkFMEAMivgQKDkF1dGhDb25uZWN0aW9uEjYKBG5hbWUYASABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoEdHlwZRgCIAEoDjIeLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbi5UeXBlEkYKBm9hdXRoMhgDIAEoCzI0LnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbi5BdXRoQ29ubmVjdGlvbk9BdXRoMkNvbmZpZ0gAEjMKCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMaiAIKGkF1dGhDb25uZWN0aW9uT0F1dGgyQ29uZmlnEhQKDHByb3ZpZGVyX3VybBgBIAEoCRISCgppc3N1ZXJfdXJsGAIgASgJEhEKCWNsaWVudF9pZBgDIAEoCRIaCg1jbGllbnRfc2VjcmV0GAQgASgJQgPgQQQSRwoIYXV0aF91cmwYBSABKAlCNbpIMtgBAXItMiheaHR0cHM6Ly9bQS1aYS16MC05Li1dKyg6WzAtOV0rKT8oLy4qKT8kiAEBEkgKCXRva2VuX3VybBgGIAEoCUI1ukgy2AEBci0yKF5odHRwczovL1tBLVphLXowLTkuLV0rKDpbMC05XSspPygvLiopPySIAQEiLQoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASDwoLVFlQRV9PQVVUSDIQAUIPCgZjb25maWcSBbpIAggBItAFChBBdXRoT0F1dGgyQ2xpZW50EgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSOgoLZ3JhbnRfdHlwZXMYAyADKA4yJS50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudC5HcmFudFR5cGUSFQoNcmVkaXJlY3RfdXJpcxgEIAMoCRIWCgljbGllbnRfaWQYBSABKAlCA+BBAxIaCg1jbGllbnRfc2VjcmV0GAYgASgJQgPgQQMSMwoKY3JlYXRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxJKCgtjbGllbnRfdHlwZRgIIAEoDjImLnRhaWxvci52MS5BdXRoT0F1dGgyQ2xpZW50LkNsaWVudFR5cGVCDbpICtgBAYIBBBABIAASSgoVYWNjZXNzX3Rva2VuX2xpZmV0aW1lGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQhC6SA2qAQoiBAiAowUyAgg8EksKFnJlZnJlc2hfdG9rZW5fbGlmZXRpbWUYCiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CELpIDaoBCiIECID1JDICCDwSFAoMcmVxdWlyZV9kcG9wGAsgASgIImgKCUdyYW50VHlwZRIaChZHUkFOVF9UWVBFX1VOU1BFQ0lGSUVEEAASIQodR1JBTlRfVFlQRV9BVVRIT1JJWkFUSU9OX0NPREUQARIcChhHUkFOVF9UWVBFX1JFRlJFU0hfVE9LRU4QAiJ4CgpDbGllbnRUeXBlEhsKF0NMSUVOVF9UWVBFX1VOU1BFQ0lGSUVEEAASHAoYQ0xJRU5UX1RZUEVfQ09ORklERU5USUFMEAESFgoSQ0xJRU5UX1RZUEVfUFVCTElDEAISFwoTQ0xJRU5UX1RZUEVfQlJPV1NFUhADIrcBChdDb250cm9scGxhbmVNYWNoaW5lVXNlchIPCgJpZBgBIAEoCUID4EEDEgwKBG5hbWUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSHAoPb3JnYW5pemF0aW9uX2lkGAQgASgJQgPgQQMSFgoJZm9sZGVyX2lkGAUgASgJQgPgQQMSFgoJY2xpZW50X2lkGAYgASgJQgPgQQMSGgoNY2xpZW50X3NlY3JldBgHIAEoCUID4EEDKk4KCFBBVFNjb3BlEhkKFVBBVF9TQ09QRV9VTlNQRUNJRklFRBAAEhIKDlBBVF9TQ09QRV9SRUFEEAESEwoPUEFUX1NDT1BFX1dSSVRFEAJiBnByb3RvMw", [
480
+ const file_tailor_v1_auth_resource = /* @__PURE__ */ fileDesc("Ch10YWlsb3IvdjEvYXV0aF9yZXNvdXJjZS5wcm90bxIJdGFpbG9yLnYxIlYKC0F1dGhTZXJ2aWNlEicKCW5hbWVzcGFjZRgBIAEoCzIULnRhaWxvci52MS5OYW1lc3BhY2USHgoWcHVibGlzaF9zZXNzaW9uX2V2ZW50cxgCIAEoCCK0BgoNQXV0aElEUENvbmZpZxI2CgRuYW1lGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjQKCWF1dGhfdHlwZRgCIAEoDjIhLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLkF1dGhUeXBlEi8KBmNvbmZpZxgDIAEoCzIfLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLkNvbmZpZxq4AQoGQ29uZmlnEjMKBG9pZGMYASABKAsyIy50YWlsb3IudjEuQXV0aElEUENvbmZpZy5PSURDQ29uZmlnSAASMwoEc2FtbBgCIAEoCzIjLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLlNBTUxDb25maWdIABI6CghpZF90b2tlbhgDIAEoCzImLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLklEVG9rZW5Db25maWdIAEIICgZjb25maWcamAEKCk9JRENDb25maWcSFQoNY2xpZW50X2lkX2tleRgBIAEoCRIxChFjbGllbnRfc2VjcmV0X2tleRgCIAEoCzIWLnRhaWxvci52MS5TZWNyZXRWYWx1ZRIUCgxwcm92aWRlcl91cmwYAyABKAkSEgoKaXNzdWVyX3VybBgEIAEoCRIWCg51c2VybmFtZV9jbGFpbRgFIAEoCRphCgpTQU1MQ29uZmlnEhQKDG1ldGFkYXRhX3VybBgBIAEoCRIUCgxyYXdfbWV0YWRhdGEYBCABKAkSGwoTZW5hYmxlX3NpZ25fcmVxdWVzdBgFIAEoCEoECAIQA0oECAMQBBpkCg1JRFRva2VuQ29uZmlnEhQKDHByb3ZpZGVyX3VybBgBIAEoCRIRCgljbGllbnRfaWQYAiABKAkSEgoKaXNzdWVyX3VybBgDIAEoCRIWCg51c2VybmFtZV9jbGFpbRgEIAEoCSJlCghBdXRoVHlwZRIZChVBVVRIX1RZUEVfVU5TUEVDSUZJRUQQABISCg5BVVRIX1RZUEVfT0lEQxABEhIKDkFVVEhfVFlQRV9TQU1MEAISFgoSQVVUSF9UWVBFX0lEX1RPS0VOEAMirQYKGVVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcSFAoIcHJvdmlkZXIYASABKAlCAhgBElMKDXByb3ZpZGVyX3R5cGUYAiABKA4yPC50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5Vc2VyUHJvZmlsZVByb3ZpZGVyVHlwZRI7CgZjb25maWcYAyABKAsyKy50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5Db25maWcaYwoGQ29uZmlnEk8KCHRhaWxvcmRiGAEgASgLMjsudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcuVGFpbG9yREJQcm92aWRlckNvbmZpZ0gAQggKBmNvbmZpZxqSAwoWVGFpbG9yREJQcm92aWRlckNvbmZpZxI7CgluYW1lc3BhY2UYASABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLQoEdHlwZRgCIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JBIWCg51c2VybmFtZV9maWVsZBgDIAEoCRIZChFhdHRyaWJ1dGVzX2ZpZWxkcxgEIAMoCRIXCg90ZW5hbnRfaWRfZmllbGQYBSABKAkSigEKDWF0dHJpYnV0ZV9tYXAYBiADKAsyTS50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5UYWlsb3JEQlByb3ZpZGVyQ29uZmlnLkF0dHJpYnV0ZU1hcEVudHJ5QiS6SCGaAR4iHHIaMhheW2Etel1bMC05YS16QS1aXXswLDYyfSQaMwoRQXR0cmlidXRlTWFwRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJuChdVc2VyUHJvZmlsZVByb3ZpZGVyVHlwZRIqCiZVU0VSX1BST0ZJTEVfUFJPVklERVJfVFlQRV9VTlNQRUNJRklFRBAAEicKI1VTRVJfUFJPRklMRV9QUk9WSURFUl9UWVBFX1RBSUxPUkRCEAEivgMKFFRlbmFudFByb3ZpZGVyQ29uZmlnEhAKCHByb3ZpZGVyGAEgASgJEkkKDXByb3ZpZGVyX3R5cGUYAiABKA4yMi50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWcuVGVuYW50UHJvdmlkZXJUeXBlEjYKBmNvbmZpZxgDIAEoCzImLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZy5Db25maWcaXgoGQ29uZmlnEkoKCHRhaWxvcmRiGAEgASgLMjYudGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnLlRhaWxvckRCUHJvdmlkZXJDb25maWdIAEIICgZjb25maWcaUgoWVGFpbG9yREJQcm92aWRlckNvbmZpZxIRCgluYW1lc3BhY2UYASABKAkSDAoEdHlwZRgCIAEoCRIXCg9zaWduYXR1cmVfZmllbGQYAyABKAkiXQoSVGVuYW50UHJvdmlkZXJUeXBlEiQKIFRFTkFOVF9QUk9WSURFUl9UWVBFX1VOU1BFQ0lGSUVEEAASIQodVEVOQU5UX1BST1ZJREVSX1RZUEVfVEFJTE9SREIQASI7CgtBdXRoSW52b2tlchIRCgluYW1lc3BhY2UYASABKAkSGQoRbWFjaGluZV91c2VyX25hbWUYAiABKAkiSAoTUGVyc29uYWxBY2Nlc3NUb2tlbhIMCgRuYW1lGAEgASgJEiMKBnNjb3BlcxgCIAMoDjITLnRhaWxvci52MS5QQVRTY29wZSLGAwoLTWFjaGluZVVzZXISCgoCaWQYASABKAkSNgoEbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIWCgljbGllbnRfaWQYAyABKAlCA+BBAxIaCg1jbGllbnRfc2VjcmV0GAQgASgJQgPgQQMSIQoKYXR0cmlidXRlcxgFIAMoCUINukgKkgEHIgVyA7ABARIzCgpjcmVhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjMKCnVwZGF0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSZQoNYXR0cmlidXRlX21hcBgIIAMoCzIoLnRhaWxvci52MS5NYWNoaW5lVXNlci5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEi3gIKDkF1dGhTQ0lNQ29uZmlnEkMKEW1hY2hpbmVfdXNlcl9uYW1lGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKEmF1dGhvcml6YXRpb25fdHlwZRgCIAEoDjIrLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZy5BdXRob3JpemF0aW9uVHlwZRIvCg1iZWFyZXJfc2VjcmV0GAogASgLMhYudGFpbG9yLnYxLlNlY3JldFZhbHVlSAAidQoRQXV0aG9yaXphdGlvblR5cGUSIgoeQVVUSE9SSVpBVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASHQoZQVVUSE9SSVpBVElPTl9UWVBFX0JFQVJFUhABEh0KGUFVVEhPUklaQVRJT05fVFlQRV9PQVVUSDIQAkIWChRhdXRob3JpemF0aW9uX2NvbmZpZyLDAgoQQXV0aFNDSU1SZXNvdXJjZRI/CgRuYW1lGAEgASgJQjG6SC5yLDIqXltBLVphLXowLTldW0EtWmEtejAtOS1dezEsNjF9W0EtWmEtejAtOV0kEkUKE3RhaWxvcl9kYl9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNwoOdGFpbG9yX2RiX3R5cGUYAyABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQSPgoRYXR0cmlidXRlX21hcHBpbmcYBCADKAsyIy50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGVNYXBwaW5nEi4KC2NvcmVfc2NoZW1hGAUgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNU2NoZW1hIkYKGEF1dGhTQ0lNQXR0cmlidXRlTWFwcGluZxIXCg90YWlsb3JfZGJfZmllbGQYASABKAkSEQoJc2NpbV9wYXRoGAIgASgJIlAKDkF1dGhTQ0lNU2NoZW1hEgwKBG5hbWUYASABKAkSMAoKYXR0cmlidXRlcxgCIAMoCzIcLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZSLZBQoRQXV0aFNDSU1BdHRyaWJ1dGUSLwoEdHlwZRgBIAEoDjIhLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZS5UeXBlEi4KBG5hbWUYAiABKAlCILpIHXIbMhleW0EtWmEtel1bYS16QS1aMC05XyQtXSokEhMKC2Rlc2NyaXB0aW9uGAMgASgJEjsKCm11dGFiaWxpdHkYBCABKA4yJy50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUuTXV0YWJpbGl0eRIQCghyZXF1aXJlZBgFIAEoCBIUCgxtdWx0aV92YWx1ZWQYBiABKAgSOwoKdW5pcXVlbmVzcxgHIAEoDjInLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZS5VbmlxdWVuZXNzEhgKEGNhbm9uaWNhbF92YWx1ZXMYCCADKAkSNAoOc3ViX2F0dHJpYnV0ZXMYCSADKAsyHC50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUidQoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEAoMVFlQRV9DT01QTEVYEAESDwoLVFlQRV9TVFJJTkcQAhIPCgtUWVBFX05VTUJFUhADEhAKDFRZUEVfQk9PTEVBThAEEhEKDVRZUEVfREFURVRJTUUQBSJ4CgpNdXRhYmlsaXR5EhoKFk1VVEFCSUxJVFlfVU5TUEVDSUZJRUQQABIYChRNVVRBQklMSVRZX1JFQURfT05MWRABEhkKFU1VVEFCSUxJVFlfUkVBRF9XUklURRACEhkKFU1VVEFCSUxJVFlfV1JJVEVfT05MWRADImsKClVuaXF1ZW5lc3MSGgoWVU5JUVVFTkVTU19VTlNQRUNJRklFRBAAEhMKD1VOSVFVRU5FU1NfTk9ORRABEhUKEVVOSVFVRU5FU1NfU0VSVkVSEAISFQoRVU5JUVVFTkVTU19HTE9CQUwQAyK+BAoOQXV0aENvbm5lY3Rpb24SNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIsCgR0eXBlGAIgASgOMh4udGFpbG9yLnYxLkF1dGhDb25uZWN0aW9uLlR5cGUSRgoGb2F1dGgyGAMgASgLMjQudGFpbG9yLnYxLkF1dGhDb25uZWN0aW9uLkF1dGhDb25uZWN0aW9uT0F1dGgyQ29uZmlnSAASMwoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxqIAgoaQXV0aENvbm5lY3Rpb25PQXV0aDJDb25maWcSFAoMcHJvdmlkZXJfdXJsGAEgASgJEhIKCmlzc3Vlcl91cmwYAiABKAkSEQoJY2xpZW50X2lkGAMgASgJEhoKDWNsaWVudF9zZWNyZXQYBCABKAlCA+BBBBJHCghhdXRoX3VybBgFIAEoCUI1ukgy2AEBci0yKF5odHRwczovL1tBLVphLXowLTkuLV0rKDpbMC05XSspPygvLiopPySIAQESSAoJdG9rZW5fdXJsGAYgASgJQjW6SDLYAQFyLTIoXmh0dHBzOi8vW0EtWmEtejAtOS4tXSsoOlswLTldKyk/KC8uKik/JIgBASItCgRUeXBlEhQKEFRZUEVfVU5TUEVDSUZJRUQQABIPCgtUWVBFX09BVVRIMhABQg8KBmNvbmZpZxIFukgCCAEi0AUKEEF1dGhPQXV0aDJDbGllbnQSDAoEbmFtZRgBIAEoCRITCgtkZXNjcmlwdGlvbhgCIAEoCRI6CgtncmFudF90eXBlcxgDIAMoDjIlLnRhaWxvci52MS5BdXRoT0F1dGgyQ2xpZW50LkdyYW50VHlwZRIVCg1yZWRpcmVjdF91cmlzGAQgAygJEhYKCWNsaWVudF9pZBgFIAEoCUID4EEDEhoKDWNsaWVudF9zZWNyZXQYBiABKAlCA+BBAxIzCgpjcmVhdGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEkoKC2NsaWVudF90eXBlGAggASgOMiYudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQuQ2xpZW50VHlwZUINukgK2AEBggEEEAEgABJKChVhY2Nlc3NfdG9rZW5fbGlmZXRpbWUYCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CELpIDaoBCiIECICjBTICCDwSSwoWcmVmcmVzaF90b2tlbl9saWZldGltZRgKIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkIQukgNqgEKIgQIgPUkMgIIPBIUCgxyZXF1aXJlX2Rwb3AYCyABKAgiaAoJR3JhbnRUeXBlEhoKFkdSQU5UX1RZUEVfVU5TUEVDSUZJRUQQABIhCh1HUkFOVF9UWVBFX0FVVEhPUklaQVRJT05fQ09ERRABEhwKGEdSQU5UX1RZUEVfUkVGUkVTSF9UT0tFThACIngKCkNsaWVudFR5cGUSGwoXQ0xJRU5UX1RZUEVfVU5TUEVDSUZJRUQQABIcChhDTElFTlRfVFlQRV9DT05GSURFTlRJQUwQARIWChJDTElFTlRfVFlQRV9QVUJMSUMQAhIXChNDTElFTlRfVFlQRV9CUk9XU0VSEAMitwEKF0NvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEg8KAmlkGAEgASgJQgPgQQMSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIcCg9vcmdhbml6YXRpb25faWQYBCABKAlCA+BBAxIWCglmb2xkZXJfaWQYBSABKAlCA+BBAxIWCgljbGllbnRfaWQYBiABKAlCA+BBAxIaCg1jbGllbnRfc2VjcmV0GAcgASgJQgPgQQMqTgoIUEFUU2NvcGUSGQoVUEFUX1NDT1BFX1VOU1BFQ0lGSUVEEAASEgoOUEFUX1NDT1BFX1JFQUQQARITCg9QQVRfU0NPUEVfV1JJVEUQAmIGcHJvdG8z", [
480
481
  file_buf_validate_validate,
481
482
  file_google_api_field_behavior,
482
483
  file_google_protobuf_duration,
@@ -576,7 +577,7 @@ const PATScope = /* @__PURE__ */ tsEnum(PATScopeSchema);
576
577
  /**
577
578
  * Describes the file tailor/v1/auth.proto.
578
579
  */
579
- const file_tailor_v1_auth = /* @__PURE__ */ fileDesc("ChR0YWlsb3IvdjEvYXV0aC5wcm90bxIJdGFpbG9yLnYxInwKGENyZWF0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIkkKGUNyZWF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlInwKGERlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhsKGURlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UieQoVR2V0QXV0aFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiRgoWR2V0QXV0aFNlcnZpY2VSZXNwb25zZRIsCgxhdXRoX3NlcnZpY2UYASABKAsyFi50YWlsb3IudjEuQXV0aFNlcnZpY2UikgEKF0xpc3RBdXRoU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ3ChhMaXN0QXV0aFNlcnZpY2VzUmVzcG9uc2USLQoNYXV0aF9zZXJ2aWNlcxgBIAMoCzIWLnRhaWxvci52MS5BdXRoU2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirAEKGkNyZWF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG0NyZWF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcirAEKGlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG1VwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcitgEKGkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIdChtEZWxldGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiswEKF0dldEF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJIChhHZXRBdXRoSURQQ29uZmlnUmVzcG9uc2USLAoKaWRwX2NvbmZpZxgBIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnItYBChlMaXN0QXV0aElEUENvbmZpZ3NSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ5ChpMaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZRItCgtpZHBfY29uZmlncxgBIAMoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLOAQoeQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgDIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIm0KH0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2USSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIs4BCh5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAMgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcibQofVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWciggEKHkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiEKH0RlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UifwobR2V0VXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiagocR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcixgEKGUNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAMgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnQga6SAPIAQEiXQoaQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyLGAQoZVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKFnRlbmFudF9wcm92aWRlcl9jb25maWcYAyABKAsyHy50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWdCBrpIA8gBASJdChpVcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZRI/ChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAEgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnIn0KGURlbGV0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIcChpEZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSJ6ChZHZXRUZW5hbnRDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiWgoXR2V0VGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyKSAQogQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGVCEbpIDpIBCwgBIgeCAQQQASAAIjkKIUNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZRIUCgxhY2Nlc3NfdG9rZW4YASABKAkiWgogRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIjCiFEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiegofTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIpABCiBMaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXNwb25zZRI+ChZwZXJzb25hbF9hY2Nlc3NfdG9rZW5zGAEgAygLMh4udGFpbG9yLnYxLlBlcnNvbmFsQWNjZXNzVG9rZW4SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIqMDChxDcmVhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOYXV0aF9uYW1lc3BhY2UYAiABKAlCK7pIKHImMiReKFthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0pPyQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIqADChxVcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIrgBChxEZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIfCh1EZWxldGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSK1AQoZR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDmF1dGhfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSgoaR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyItgBChtMaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5hdXRoX25hbWVzcGFjZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpwYWdlX3Rva2VuGAMgASgJEhEKCXBhZ2Vfc2l6ZRgEIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgFIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInsKHExpc3RBdXRoTWFjaGluZVVzZXJzUmVzcG9uc2USLQoNbWFjaGluZV91c2VycxgBIAMoCzIWLnRhaWxvci52MS5NYWNoaW5lVXNlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirwEKG0NyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHENyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcirwEKG1VwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHFVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcifAoYR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSwoZR2V0QXV0aFNDSU1Db25maWdSZXNwb25zZRIuCgtzY2ltX2NvbmZpZxgBIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZyJ/ChtEZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIeChxEZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIrUBCh1DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIrUBCh1VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIo8BCh1EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIrYBChpHZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlEjIKDXNjaW1fcmVzb3VyY2UYASABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJ/ChtHZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJTChxHZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlEjMKDnNjaW1fcmVzb3VyY2VzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhTQ0lNUmVzb3VyY2UidAobQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESNQoKY29ubmVjdGlvbhgCIAEoCzIZLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbkIGukgDyAEBIh4KHENyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UilQEKGkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ7ChtMaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS50YWlsb3IudjEuQXV0aENvbm5lY3Rpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIoABChtSZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHgocUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSLmAQokUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQQoPY29ubmVjdGlvbl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhQKDGFjY2Vzc190b2tlbhgDIAEoCRIVCg1yZWZyZXNoX3Rva2VuGAQgASgJEi4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIicKJVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVzcG9uc2Ui1wEKLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIwoSYXV0aG9yaXphdGlvbl9jb2RlGAMgASgJQge6SARyAhABEh0KDHJlZGlyZWN0X3VyaRgEIAEoCUIHukgEcgIQASIxCi9FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSKLAQodQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKLAQodVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCJlCh1EZWxldGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIrYBChpHZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKvAQocTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24iggEKHUxpc3RBdXRoT0F1dGgyQ2xpZW50c1Jlc3BvbnNlEjMKDm9hdXRoMl9jbGllbnRzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIrYBCiRDcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEwoLZGVzY3JpcHRpb24YBCABKAkiYQolQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIi/AEKJFVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABARI7CgRuYW1lGAQgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kSACIAQESGAoLZGVzY3JpcHRpb24YBSABKAlIAYgBAUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb24iYQolVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIiiQEKIUdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABASJeCiJHZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlEjgKDG1hY2hpbmVfdXNlchgBIAEoCzIiLnRhaWxvci52MS5Db250cm9scGxhbmVNYWNoaW5lVXNlciLBAQojTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ijwEKJExpc3RDb250cm9scGxhbmVNYWNoaW5lVXNlcnNSZXNwb25zZRI5Cg1tYWNoaW5lX3VzZXJzGAEgAygLMiIudGFpbG9yLnYxLkNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKMAQokRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAIgASgJQgu6SAjYAQFyA7ABARIhCg9tYWNoaW5lX3VzZXJfaWQYAyABKAlCCLpIBXIDsAEBIicKJURlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2ViBnByb3RvMw", [
580
+ const file_tailor_v1_auth = /* @__PURE__ */ fileDesc("ChR0YWlsb3IvdjEvYXV0aC5wcm90bxIJdGFpbG9yLnYxIpwBChhDcmVhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGUNyZWF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlIpwBChhVcGRhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGVVwZGF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlInwKGERlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhsKGURlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UieQoVR2V0QXV0aFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiRgoWR2V0QXV0aFNlcnZpY2VSZXNwb25zZRIsCgxhdXRoX3NlcnZpY2UYASABKAsyFi50YWlsb3IudjEuQXV0aFNlcnZpY2UikgEKF0xpc3RBdXRoU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ3ChhMaXN0QXV0aFNlcnZpY2VzUmVzcG9uc2USLQoNYXV0aF9zZXJ2aWNlcxgBIAMoCzIWLnRhaWxvci52MS5BdXRoU2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirAEKGkNyZWF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG0NyZWF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcirAEKGlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG1VwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcitgEKGkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIdChtEZWxldGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiswEKF0dldEF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJIChhHZXRBdXRoSURQQ29uZmlnUmVzcG9uc2USLAoKaWRwX2NvbmZpZxgBIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnItYBChlMaXN0QXV0aElEUENvbmZpZ3NSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ5ChpMaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZRItCgtpZHBfY29uZmlncxgBIAMoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLOAQoeQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgDIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIm0KH0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2USSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIs4BCh5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAMgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcibQofVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWciggEKHkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiEKH0RlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UifwobR2V0VXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiagocR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcixgEKGUNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAMgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnQga6SAPIAQEiXQoaQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyLGAQoZVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKFnRlbmFudF9wcm92aWRlcl9jb25maWcYAyABKAsyHy50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWdCBrpIA8gBASJdChpVcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZRI/ChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAEgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnIn0KGURlbGV0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIcChpEZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSJ6ChZHZXRUZW5hbnRDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiWgoXR2V0VGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyKSAQogQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGVCEbpIDpIBCwgBIgeCAQQQASAAIjkKIUNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZRIUCgxhY2Nlc3NfdG9rZW4YASABKAkiWgogRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIjCiFEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiegofTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIpABCiBMaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXNwb25zZRI+ChZwZXJzb25hbF9hY2Nlc3NfdG9rZW5zGAEgAygLMh4udGFpbG9yLnYxLlBlcnNvbmFsQWNjZXNzVG9rZW4SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIqMDChxDcmVhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOYXV0aF9uYW1lc3BhY2UYAiABKAlCK7pIKHImMiReKFthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0pPyQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIqADChxVcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIrgBChxEZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIfCh1EZWxldGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSK1AQoZR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDmF1dGhfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSgoaR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyItgBChtMaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5hdXRoX25hbWVzcGFjZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpwYWdlX3Rva2VuGAMgASgJEhEKCXBhZ2Vfc2l6ZRgEIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgFIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInsKHExpc3RBdXRoTWFjaGluZVVzZXJzUmVzcG9uc2USLQoNbWFjaGluZV91c2VycxgBIAMoCzIWLnRhaWxvci52MS5NYWNoaW5lVXNlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirwEKG0NyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHENyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcirwEKG1VwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHFVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcifAoYR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSwoZR2V0QXV0aFNDSU1Db25maWdSZXNwb25zZRIuCgtzY2ltX2NvbmZpZxgBIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZyJ/ChtEZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIeChxEZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIrUBCh1DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIrUBCh1VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIo8BCh1EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIrYBChpHZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlEjIKDXNjaW1fcmVzb3VyY2UYASABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJ/ChtHZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJTChxHZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlEjMKDnNjaW1fcmVzb3VyY2VzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhTQ0lNUmVzb3VyY2UidAobQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESNQoKY29ubmVjdGlvbhgCIAEoCzIZLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbkIGukgDyAEBIh4KHENyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UilQEKGkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ7ChtMaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS50YWlsb3IudjEuQXV0aENvbm5lY3Rpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIoABChtSZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHgocUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSLmAQokUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQQoPY29ubmVjdGlvbl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhQKDGFjY2Vzc190b2tlbhgDIAEoCRIVCg1yZWZyZXNoX3Rva2VuGAQgASgJEi4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIicKJVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVzcG9uc2Ui1wEKLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIwoSYXV0aG9yaXphdGlvbl9jb2RlGAMgASgJQge6SARyAhABEh0KDHJlZGlyZWN0X3VyaRgEIAEoCUIHukgEcgIQASIxCi9FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSKLAQodQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKLAQodVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCJlCh1EZWxldGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIrYBChpHZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKvAQocTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24iggEKHUxpc3RBdXRoT0F1dGgyQ2xpZW50c1Jlc3BvbnNlEjMKDm9hdXRoMl9jbGllbnRzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIrYBCiRDcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEwoLZGVzY3JpcHRpb24YBCABKAkiYQolQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIi/AEKJFVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABARI7CgRuYW1lGAQgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kSACIAQESGAoLZGVzY3JpcHRpb24YBSABKAlIAYgBAUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb24iYQolVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIiiQEKIUdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABASJeCiJHZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlEjgKDG1hY2hpbmVfdXNlchgBIAEoCzIiLnRhaWxvci52MS5Db250cm9scGxhbmVNYWNoaW5lVXNlciLBAQojTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ijwEKJExpc3RDb250cm9scGxhbmVNYWNoaW5lVXNlcnNSZXNwb25zZRI5Cg1tYWNoaW5lX3VzZXJzGAEgAygLMiIudGFpbG9yLnYxLkNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKMAQokRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAIgASgJQgu6SAjYAQFyA7ABARIhCg9tYWNoaW5lX3VzZXJfaWQYAyABKAlCCLpIBXIDsAEBIicKJURlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2ViBnByb3RvMw", [
580
581
  file_buf_validate_validate,
581
582
  file_google_protobuf_struct,
582
583
  file_google_protobuf_timestamp,
@@ -944,7 +945,7 @@ const file_tailor_v1_workspace = /* @__PURE__ */ fileDesc("Chl0YWlsb3IvdjEvd29ya
944
945
  /**
945
946
  * Describes the file tailor/v1/service.proto.
946
947
  */
947
- const file_tailor_v1_service = /* @__PURE__ */ fileDesc("Chd0YWlsb3IvdjEvc2VydmljZS5wcm90bxIJdGFpbG9yLnYxIg0KC1BpbmdSZXF1ZXN0Ig4KDFBpbmdSZXNwb25zZTKgswEKD09wZXJhdG9yU2VydmljZRI5CgRQaW5nEhYudGFpbG9yLnYxLlBpbmdSZXF1ZXN0GhcudGFpbG9yLnYxLlBpbmdSZXNwb25zZSIAEocBCh1MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9ucxIvLnRhaWxvci52MS5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9uc1JlcXVlc3QaMC50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZVdvcmtzcGFjZRIhLnRhaWxvci52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZVdvcmtzcGFjZVJlc3BvbnNlIgASWgoPVXBkYXRlV29ya3NwYWNlEiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVJlcXVlc3QaIi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUmVzcG9uc2UiABJaCg9EZWxldGVXb3Jrc3BhY2USIS50YWlsb3IudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBoiLnRhaWxvci52MS5EZWxldGVXb3Jrc3BhY2VSZXNwb25zZSIAEloKDkxpc3RXb3Jrc3BhY2VzEiAudGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdBohLnRhaWxvci52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlIgOQAgESfgoaTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXMSLC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVzcG9uc2UiA5ACARJdChBSZXN0b3JlV29ya3NwYWNlEiIudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSIAElQKDEdldFdvcmtzcGFjZRIeLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gh8udGFpbG9yLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgOQAgESfgoaTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnMSLC50YWlsb3IudjEuTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJzUmVzcG9uc2UiA5ACARKlAQonTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzEjkudGFpbG9yLnYxLkxpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1JlcXVlc3QaOi50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzUmVzcG9uc2UiA5ACARJ+ChtJbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISLS50YWlsb3IudjEuSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBouLnRhaWxvci52MS5JbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIAEn4KG1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlchItLnRhaWxvci52MS5SZW1vdmVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Gi4udGFpbG9yLnYxLlJlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIgASfgobVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyEi0udGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QaLi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiABJ4ChhHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISKi50YWlsb3IudjEuR2V0V29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBorLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIDkAIBEmAKEEdldFdvcmtzcGFjZVJvbGUSIi50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlc3BvbnNlIgOQAgESYwoSVXBkYXRlT3JnYW5pemF0aW9uEiQudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABJdCg9HZXRPcmdhbml6YXRpb24SIS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdBoiLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25SZXNwb25zZSIDkAIBEmMKEUxpc3RPcmdhbml6YXRpb25zEiMudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBokLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlIgOQAgESbwoVTGlzdFVzZXJPcmdhbml6YXRpb25zEicudGFpbG9yLnYxLkxpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdFVzZXJPcmdhbml6YXRpb25zUmVzcG9uc2UiA5ACARJyChdHcmFudE9yZ2FuaXphdGlvbkFjY2VzcxIpLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKi50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSIAEnUKGFVwZGF0ZU9yZ2FuaXphdGlvbkFjY2VzcxIqLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GisudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgASdQoYUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzEioudGFpbG9yLnYxLlJldm9rZU9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKy50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UiABJ4ChhMaXN0T3JnYW5pemF0aW9uQWNjZXNzZXMSKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBorLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uQWNjZXNzZXNSZXNwb25zZSIDkAIBEm8KFUdldE9yZ2FuaXphdGlvbkFjY2VzcxInLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GigudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgOQAgESdQoYQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyEioudGFpbG9yLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKy50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiABJ1ChhVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXISKi50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBorLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSIAEnUKGERlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlchIqLnRhaWxvci52MS5EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0GisudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlIgASbwoVR2V0T3JnYW5pemF0aW9uRm9sZGVyEicudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiA5ACARJ1ChdMaXN0T3JnYW5pemF0aW9uRm9sZGVycxIpLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlcnNSZXNwb25zZSIDkAIBEoQBCh1HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2VzcxIvLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QaMC50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEooBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXMSMC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVxdWVzdBoxLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZSIDkAIBEoEBChtHZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSLS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBouLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZU9yZ2FuaXphdGlvblRlYW0SKC50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgASbwoWVXBkYXRlT3JnYW5pemF0aW9uVGVhbRIoLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2UiABJvChZEZWxldGVPcmdhbml6YXRpb25UZWFtEigudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSIAEmkKE0dldE9yZ2FuaXphdGlvblRlYW0SJS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaJi50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgOQAgESbwoVTGlzdE9yZ2FuaXphdGlvblRlYW1zEicudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25UZWFtc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2UiA5ACARJ4ChlBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyEisudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0GiwudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxSZW1vdmVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChtMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnMSLS50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVxdWVzdBouLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXNwb25zZSIDkAIBEnsKGUdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXISKy50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QaLC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIgOQAgEScgoWR2V0UGxhdGZvcm1BY2NvdW50UGxhbhIoLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVxdWVzdBopLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBcHBsaWNhdGlvbhIjLnRhaWxvci52MS5DcmVhdGVBcHBsaWNhdGlvblJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXBwbGljYXRpb25SZXNwb25zZSIAEmAKEVVwZGF0ZUFwcGxpY2F0aW9uEiMudGFpbG9yLnYxLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBcHBsaWNhdGlvblJlc3BvbnNlIgASYAoRRGVsZXRlQXBwbGljYXRpb24SIy50YWlsb3IudjEuRGVsZXRlQXBwbGljYXRpb25SZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUFwcGxpY2F0aW9uUmVzcG9uc2UiABJgChBMaXN0QXBwbGljYXRpb25zEiIudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25zZSIDkAIBEloKDkdldEFwcGxpY2F0aW9uEiAudGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uUmVxdWVzdBohLnRhaWxvci52MS5HZXRBcHBsaWNhdGlvblJlc3BvbnNlIgOQAgESfgoaR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGgSLC50YWlsb3IudjEuR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uU2NoZW1hSGVhbHRoUmVzcG9uc2UiA5ACARJjChJDb21wb3NlVGFpbG9yREJTREwSJC50YWlsb3IudjEuQ29tcG9zZVRhaWxvckRCU0RMUmVxdWVzdBolLnRhaWxvci52MS5Db21wb3NlVGFpbG9yREJTRExSZXNwb25zZSIAEmwKFUNyZWF0ZVRhaWxvckRCU2VydmljZRInLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIgASbAoVVXBkYXRlVGFpbG9yREJTZXJ2aWNlEicudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuVXBkYXRlVGFpbG9yREJTZXJ2aWNlUmVzcG9uc2UiABJsChVEZWxldGVUYWlsb3JEQlNlcnZpY2USJy50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5EZWxldGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZSIAEmYKEkdldFRhaWxvckRCU2VydmljZRIkLnRhaWxvci52MS5HZXRUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GiUudGFpbG9yLnYxLkdldFRhaWxvckRCU2VydmljZVJlc3BvbnNlIgOQAgESbAoUTGlzdFRhaWxvckRCU2VydmljZXMSJi50YWlsb3IudjEuTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlNlcnZpY2VzUmVzcG9uc2UiA5ACARJjChJDcmVhdGVUYWlsb3JEQlR5cGUSJC50YWlsb3IudjEuQ3JlYXRlVGFpbG9yREJUeXBlUmVxdWVzdBolLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlR5cGVSZXNwb25zZSIAEmMKElVwZGF0ZVRhaWxvckRCVHlwZRIkLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0GiUudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoSRGVsZXRlVGFpbG9yREJUeXBlEiQudGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QaJS50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UiABJsChVUcnVuY2F0ZVRhaWxvckRCVHlwZXMSJy50YWlsb3IudjEuVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVxdWVzdBooLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXNwb25zZSIAEmkKFFRydW5jYXRlVGFpbG9yREJUeXBlEiYudGFpbG9yLnYxLlRydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBonLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoRTGlzdFRhaWxvckRCVHlwZXMSIy50YWlsb3IudjEuTGlzdFRhaWxvckRCVHlwZXNSZXF1ZXN0GiQudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlR5cGVzUmVzcG9uc2UiA5ACARJdCg9HZXRUYWlsb3JEQlR5cGUSIS50YWlsb3IudjEuR2V0VGFpbG9yREJUeXBlUmVxdWVzdBoiLnRhaWxvci52MS5HZXRUYWlsb3JEQlR5cGVSZXNwb25zZSIDkAIBEn4KG0NyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASeAoYR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uEioudGFpbG9yLnYxLkdldFRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaKy50YWlsb3IudjEuR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiA5ACARJ+ChpMaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9ucxIsLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1JlcXVlc3QaLS50YWlsb3IudjEuTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZSIDkAIBEn4KG1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASfgobRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uEi0udGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaLi50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiABJsChVDcmVhdGVQaXBlbGluZVNlcnZpY2USJy50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIAEmwKFVVwZGF0ZVBpcGVsaW5lU2VydmljZRInLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZVBpcGVsaW5lU2VydmljZVJlc3BvbnNlIgASbAoVRGVsZXRlUGlwZWxpbmVTZXJ2aWNlEicudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2UiABJmChJHZXRQaXBlbGluZVNlcnZpY2USJC50YWlsb3IudjEuR2V0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBolLnRhaWxvci52MS5HZXRQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIDkAIBEmwKFExpc3RQaXBlbGluZVNlcnZpY2VzEiYudGFpbG9yLnYxLkxpc3RQaXBlbGluZVNlcnZpY2VzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0UGlwZWxpbmVTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESaQoTR2V0UGlwZWxpbmVSZXNvbHZlchIlLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVxdWVzdBomLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiA5ACARJvChVMaXN0UGlwZWxpbmVSZXNvbHZlcnMSJy50YWlsb3IudjEuTGlzdFBpcGVsaW5lUmVzb2x2ZXJzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlcnNSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZVBpcGVsaW5lUmVzb2x2ZXISKC50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlIgASbwoWVXBkYXRlUGlwZWxpbmVSZXNvbHZlchIoLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZEZWxldGVQaXBlbGluZVJlc29sdmVyEigudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZSIAEmMKEkNvbXBvc2VQaXBlbGluZVNETBIkLnRhaWxvci52MS5Db21wb3NlUGlwZWxpbmVTRExSZXF1ZXN0GiUudGFpbG9yLnYxLkNvbXBvc2VQaXBlbGluZVNETFJlc3BvbnNlIgASnAEKJExpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0cxI2LnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdHNSZXF1ZXN0GjcudGFpbG9yLnYxLkxpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0c1Jlc3BvbnNlIgOQAgESlgEKIkdldFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHQSNC50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlcXVlc3QaNS50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlc3BvbnNlIgOQAgEScgoXUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXISKS50YWlsb3IudjEuUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GioudGFpbG9yLnYxLlJlc3RhcnRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZDcmVhdGVTdGF0ZWZsb3dTZXJ2aWNlEigudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIAEm8KFlVwZGF0ZVN0YXRlZmxvd1NlcnZpY2USKC50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlIgASbwoWRGVsZXRlU3RhdGVmbG93U2VydmljZRIoLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVzcG9uc2UiABJpChNHZXRTdGF0ZWZsb3dTZXJ2aWNlEiUudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIDkAIBEm8KFUxpc3RTdGF0ZWZsb3dTZXJ2aWNlcxInLnRhaWxvci52MS5MaXN0U3RhdGVmbG93U2VydmljZXNSZXF1ZXN0GigudGFpbG9yLnYxLkxpc3RTdGF0ZWZsb3dTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChZVcGRhdGVFeGVjdXRvckV4ZWN1dG9yEigudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXNwb25zZSIAEmkKE0dldEV4ZWN1dG9yRXhlY3V0b3ISJS50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlcXVlc3QaJi50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlc3BvbnNlIgOQAgESbwoWRGVsZXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChVMaXN0RXhlY3V0b3JFeGVjdXRvcnMSJy50YWlsb3IudjEuTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0RXhlY3V0b3JFeGVjdXRvcnNSZXNwb25zZSIDkAIBEloKDkdldEV4ZWN1dG9ySm9iEiAudGFpbG9yLnYxLkdldEV4ZWN1dG9ySm9iUmVxdWVzdBohLnRhaWxvci52MS5HZXRFeGVjdXRvckpvYlJlc3BvbnNlIgOQAgESYAoQTGlzdEV4ZWN1dG9ySm9icxIiLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVxdWVzdBojLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVzcG9uc2UiA5ACARJ1ChdMaXN0RXhlY3V0b3JKb2JBdHRlbXB0cxIpLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JBdHRlbXB0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdEV4ZWN1dG9ySm9iQXR0ZW1wdHNSZXNwb25zZSIDkAIBEoQBChxMaXN0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tzEi4udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXNwb25zZSIDkAIBEn4KGkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rEiwudGFpbG9yLnYxLkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rUmVxdWVzdBotLnRhaWxvci52MS5HZXRFeGVjdXRvckluY29taW5nV2ViaG9va1Jlc3BvbnNlIgOQAgESWgoPVHJpZ2dlckV4ZWN1dG9yEiEudGFpbG9yLnYxLlRyaWdnZXJFeGVjdXRvclJlcXVlc3QaIi50YWlsb3IudjEuVHJpZ2dlckV4ZWN1dG9yUmVzcG9uc2UiABJ1ChhDcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHQSKi50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclZhdWx0UmVxdWVzdBorLnRhaWxvci52MS5DcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXNwb25zZSIAEm8KFUdldFNlY3JldE1hbmFnZXJWYXVsdBInLnRhaWxvci52MS5HZXRTZWNyZXRNYW5hZ2VyVmF1bHRSZXF1ZXN0GigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJWYXVsdFJlc3BvbnNlIgOQAgESdQoYRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0EioudGFpbG9yLnYxLkRlbGV0ZVNlY3JldE1hbmFnZXJWYXVsdFJlcXVlc3QaKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0UmVzcG9uc2UiABJ1ChdMaXN0U2VjcmV0TWFuYWdlclZhdWx0cxIpLnRhaWxvci52MS5MaXN0U2VjcmV0TWFuYWdlclZhdWx0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJWYXVsdHNSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoZVXBkYXRlU2VjcmV0TWFuYWdlclNlY3JldBIrLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVzcG9uc2UiABJyChZHZXRTZWNyZXRNYW5hZ2VyU2VjcmV0EigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0GikudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXNwb25zZSIDkAIBEngKGURlbGV0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoYTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzEioudGFpbG9yLnYxLkxpc3RTZWNyZXRNYW5hZ2VyU2VjcmV0c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBdXRoU2VydmljZRIjLnRhaWxvci52MS5DcmVhdGVBdXRoU2VydmljZVJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXV0aFNlcnZpY2VSZXNwb25zZSIAEmAKEURlbGV0ZUF1dGhTZXJ2aWNlEiMudGFpbG9yLnYxLkRlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBokLnRhaWxvci52MS5EZWxldGVBdXRoU2VydmljZVJlc3BvbnNlIgASWgoOR2V0QXV0aFNlcnZpY2USIC50YWlsb3IudjEuR2V0QXV0aFNlcnZpY2VSZXF1ZXN0GiEudGFpbG9yLnYxLkdldEF1dGhTZXJ2aWNlUmVzcG9uc2UiA5ACARJgChBMaXN0QXV0aFNlcnZpY2VzEiIudGFpbG9yLnYxLkxpc3RBdXRoU2VydmljZXNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBdXRoU2VydmljZXNSZXNwb25zZSIDkAIBEmYKE0NyZWF0ZUF1dGhJRFBDb25maWcSJS50YWlsb3IudjEuQ3JlYXRlQXV0aElEUENvbmZpZ1JlcXVlc3QaJi50YWlsb3IudjEuQ3JlYXRlQXV0aElEUENvbmZpZ1Jlc3BvbnNlIgASZgoTVXBkYXRlQXV0aElEUENvbmZpZxIlLnRhaWxvci52MS5VcGRhdGVBdXRoSURQQ29uZmlnUmVxdWVzdBomLnRhaWxvci52MS5VcGRhdGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiABJmChNEZWxldGVBdXRoSURQQ29uZmlnEiUudGFpbG9yLnYxLkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0GiYudGFpbG9yLnYxLkRlbGV0ZUF1dGhJRFBDb25maWdSZXNwb25zZSIAEmAKEEdldEF1dGhJRFBDb25maWcSIi50YWlsb3IudjEuR2V0QXV0aElEUENvbmZpZ1JlcXVlc3QaIy50YWlsb3IudjEuR2V0QXV0aElEUENvbmZpZ1Jlc3BvbnNlIgOQAgESZgoSTGlzdEF1dGhJRFBDb25maWdzEiQudGFpbG9yLnYxLkxpc3RBdXRoSURQQ29uZmlnc1JlcXVlc3QaJS50YWlsb3IudjEuTGlzdEF1dGhJRFBDb25maWdzUmVzcG9uc2UiA5ACARJyChdDcmVhdGVVc2VyUHJvZmlsZUNvbmZpZxIpLnRhaWxvci52MS5DcmVhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaKi50YWlsb3IudjEuQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIAEnIKF1VwZGF0ZVVzZXJQcm9maWxlQ29uZmlnEikudGFpbG9yLnYxLlVwZGF0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBoqLnRhaWxvci52MS5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgAScgoXRGVsZXRlVXNlclByb2ZpbGVDb25maWcSKS50YWlsb3IudjEuRGVsZXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0GioudGFpbG9yLnYxLkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UiABJsChRHZXRVc2VyUHJvZmlsZUNvbmZpZxImLnRhaWxvci52MS5HZXRVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIDkAIBEmMKEkNyZWF0ZVRlbmFudENvbmZpZxIkLnRhaWxvci52MS5DcmVhdGVUZW5hbnRDb25maWdSZXF1ZXN0GiUudGFpbG9yLnYxLkNyZWF0ZVRlbmFudENvbmZpZ1Jlc3BvbnNlIgASYwoSVXBkYXRlVGVuYW50Q29uZmlnEiQudGFpbG9yLnYxLlVwZGF0ZVRlbmFudENvbmZpZ1JlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlVGVuYW50Q29uZmlnUmVzcG9uc2UiABJjChJEZWxldGVUZW5hbnRDb25maWcSJC50YWlsb3IudjEuRGVsZXRlVGVuYW50Q29uZmlnUmVxdWVzdBolLnRhaWxvci52MS5EZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSIAEl0KD0dldFRlbmFudENvbmZpZxIhLnRhaWxvci52MS5HZXRUZW5hbnRDb25maWdSZXF1ZXN0GiIudGFpbG9yLnYxLkdldFRlbmFudENvbmZpZ1Jlc3BvbnNlIgOQAgESeAoZQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlbhIrLnRhaWxvci52MS5DcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVxdWVzdBosLnRhaWxvci52MS5DcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiABJ4ChlEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuEisudGFpbG9yLnYxLkRlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXF1ZXN0GiwudGFpbG9yLnYxLkRlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZSIAEngKGExpc3RQZXJzb25hbEFjY2Vzc1Rva2VucxIqLnRhaWxvci52MS5MaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RQZXJzb25hbEFjY2Vzc1Rva2Vuc1Jlc3BvbnNlIgOQAgESbAoVQ3JlYXRlQXV0aE1hY2hpbmVVc2VyEicudGFpbG9yLnYxLkNyZWF0ZUF1dGhNYWNoaW5lVXNlclJlcXVlc3QaKC50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiABJsChVVcGRhdGVBdXRoTWFjaGluZVVzZXISJy50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdBooLnRhaWxvci52MS5VcGRhdGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIAEmwKFURlbGV0ZUF1dGhNYWNoaW5lVXNlchInLnRhaWxvci52MS5EZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0GigudGFpbG9yLnYxLkRlbGV0ZUF1dGhNYWNoaW5lVXNlclJlc3BvbnNlIgASZgoSR2V0QXV0aE1hY2hpbmVVc2VyEiQudGFpbG9yLnYxLkdldEF1dGhNYWNoaW5lVXNlclJlcXVlc3QaJS50YWlsb3IudjEuR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiA5ACARJsChRMaXN0QXV0aE1hY2hpbmVVc2VycxImLnRhaWxvci52MS5MaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QaJy50YWlsb3IudjEuTGlzdEF1dGhNYWNoaW5lVXNlcnNSZXNwb25zZSIDkAIBEmkKFENyZWF0ZUF1dGhTQ0lNQ29uZmlnEiYudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5DcmVhdGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgASaQoUVXBkYXRlQXV0aFNDSU1Db25maWcSJi50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1Db25maWdSZXF1ZXN0GicudGFpbG9yLnYxLlVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiABJpChREZWxldGVBdXRoU0NJTUNvbmZpZxImLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuRGVsZXRlQXV0aFNDSU1Db25maWdSZXNwb25zZSIAEmMKEUdldEF1dGhTQ0lNQ29uZmlnEiMudGFpbG9yLnYxLkdldEF1dGhTQ0lNQ29uZmlnUmVxdWVzdBokLnRhaWxvci52MS5HZXRBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlQXV0aFNDSU1SZXNvdXJjZRIoLnRhaWxvci52MS5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiABJvChZVcGRhdGVBdXRoU0NJTVJlc291cmNlEigudGFpbG9yLnYxLlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIAEm8KFkRlbGV0ZUF1dGhTQ0lNUmVzb3VyY2USKC50YWlsb3IudjEuRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIgASaQoTR2V0QXV0aFNDSU1SZXNvdXJjZRIlLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBomLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiA5ACARJsChRHZXRBdXRoU0NJTVJlc291cmNlcxImLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QaJy50YWlsb3IudjEuR2V0QXV0aFNDSU1SZXNvdXJjZXNSZXNwb25zZSIDkAIBEmkKFENyZWF0ZUF1dGhDb25uZWN0aW9uEiYudGFpbG9yLnYxLkNyZWF0ZUF1dGhDb25uZWN0aW9uUmVxdWVzdBonLnRhaWxvci52MS5DcmVhdGVBdXRoQ29ubmVjdGlvblJlc3BvbnNlIgASaQoTTGlzdEF1dGhDb25uZWN0aW9ucxIlLnRhaWxvci52MS5MaXN0QXV0aENvbm5lY3Rpb25zUmVxdWVzdBomLnRhaWxvci52MS5MaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2UiA5ACARJpChRSZXZva2VBdXRoQ29ubmVjdGlvbhImLnRhaWxvci52MS5SZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QaJy50YWlsb3IudjEuUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSIAEoQBCh1SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvbhIvLnRhaWxvci52MS5SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvblJlcXVlc3QaMC50YWlsb3IudjEuUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXNwb25zZSIAEqIBCidFeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGUSOS50YWlsb3IudjEuRXhjaGFuZ2VBdXRoQ29ubmVjdGlvbkF1dGhvcml6YXRpb25Db2RlUmVxdWVzdBo6LnRhaWxvci52MS5FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSIAEm8KFkNyZWF0ZUF1dGhPQXV0aDJDbGllbnQSKC50YWlsb3IudjEuQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgASbwoWVXBkYXRlQXV0aE9BdXRoMkNsaWVudBIoLnRhaWxvci52MS5VcGRhdGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiABJvChZEZWxldGVBdXRoT0F1dGgyQ2xpZW50EigudGFpbG9yLnYxLkRlbGV0ZUF1dGhPQXV0aDJDbGllbnRSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZUF1dGhPQXV0aDJDbGllbnRSZXNwb25zZSIAEmkKE0dldEF1dGhPQXV0aDJDbGllbnQSJS50YWlsb3IudjEuR2V0QXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaJi50YWlsb3IudjEuR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgOQAgESbwoVTGlzdEF1dGhPQXV0aDJDbGllbnRzEicudGFpbG9yLnYxLkxpc3RBdXRoT0F1dGgyQ2xpZW50c1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVzcG9uc2UiA5ACARJpChNMaXN0RGF0YXBsYW5lRXZlbnRzEiUudGFpbG9yLnYxLkxpc3REYXRhcGxhbmVFdmVudHNSZXF1ZXN0GiYudGFpbG9yLnYxLkxpc3REYXRhcGxhbmVFdmVudHNSZXNwb25zZSIDkAIBEoQBChxMaXN0Q29udHJvbHBsYW5lQWN0aXZpdHlMb2dzEi4udGFpbG9yLnYxLkxpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3NSZXNwb25zZSIDkAIBElcKDlRlc3RFeGVjU2NyaXB0EiAudGFpbG9yLnYxLlRlc3RFeGVjU2NyaXB0UmVxdWVzdBohLnRhaWxvci52MS5UZXN0RXhlY1NjcmlwdFJlc3BvbnNlIgASbAoUR2V0RnVuY3Rpb25FeGVjdXRpb24SJi50YWlsb3IudjEuR2V0RnVuY3Rpb25FeGVjdXRpb25SZXF1ZXN0GicudGFpbG9yLnYxLkdldEZ1bmN0aW9uRXhlY3V0aW9uUmVzcG9uc2UiA5ACARJyChZMaXN0RnVuY3Rpb25FeGVjdXRpb25zEigudGFpbG9yLnYxLkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnNSZXNwb25zZSIDkAIBEnEKFkNyZWF0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgAoARJxChZVcGRhdGVGdW5jdGlvblJlZ2lzdHJ5EigudGFpbG9yLnYxLlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnlSZXNwb25zZSIAKAESaQoTR2V0RnVuY3Rpb25SZWdpc3RyeRIlLnRhaWxvci52MS5HZXRGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBomLnRhaWxvci52MS5HZXRGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiA5ACARJyChZMaXN0RnVuY3Rpb25SZWdpc3RyaWVzEigudGFpbG9yLnYxLkxpc3RGdW5jdGlvblJlZ2lzdHJpZXNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RGdW5jdGlvblJlZ2lzdHJpZXNSZXNwb25zZSIDkAIBEm8KFkRlbGV0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuRGVsZXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgASjAEKHkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdBIwLnRhaWxvci52MS5Eb3dubG9hZEZ1bmN0aW9uUmVnaXN0cnlTY3JpcHRSZXF1ZXN0GjEudGFpbG9yLnYxLkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdFJlc3BvbnNlIgOQAgEwARJyChZMaXN0TWV0ZXJSZXF1ZXN0Q291bnRzEigudGFpbG9yLnYxLkxpc3RNZXRlclJlcXVlc3RDb3VudHNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RNZXRlclJlcXVlc3RDb3VudHNSZXNwb25zZSIDkAIBEngKGExpc3RNZXRlckV4ZWN1dGlvbkNvdW50cxIqLnRhaWxvci52MS5MaXN0TWV0ZXJFeGVjdXRpb25Db3VudHNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RNZXRlckV4ZWN1dGlvbkNvdW50c1Jlc3BvbnNlIgOQAgESbAoUTGlzdE1ldGVyRXZlbnRDb3VudHMSJi50YWlsb3IudjEuTGlzdE1ldGVyRXZlbnRDb3VudHNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RNZXRlckV2ZW50Q291bnRzUmVzcG9uc2UiA5ACARJdCg9MaXN0SWRQU2VydmljZXMSIS50YWlsb3IudjEuTGlzdElkUFNlcnZpY2VzUmVxdWVzdBoiLnRhaWxvci52MS5MaXN0SWRQU2VydmljZXNSZXNwb25zZSIDkAIBEl0KEENyZWF0ZUlkUFNlcnZpY2USIi50YWlsb3IudjEuQ3JlYXRlSWRQU2VydmljZVJlcXVlc3QaIy50YWlsb3IudjEuQ3JlYXRlSWRQU2VydmljZVJlc3BvbnNlIgASXQoQVXBkYXRlSWRQU2VydmljZRIiLnRhaWxvci52MS5VcGRhdGVJZFBTZXJ2aWNlUmVxdWVzdBojLnRhaWxvci52MS5VcGRhdGVJZFBTZXJ2aWNlUmVzcG9uc2UiABJdChBEZWxldGVJZFBTZXJ2aWNlEiIudGFpbG9yLnYxLkRlbGV0ZUlkUFNlcnZpY2VSZXF1ZXN0GiMudGFpbG9yLnYxLkRlbGV0ZUlkUFNlcnZpY2VSZXNwb25zZSIAElcKDUdldElkUFNlcnZpY2USHy50YWlsb3IudjEuR2V0SWRQU2VydmljZVJlcXVlc3QaIC50YWlsb3IudjEuR2V0SWRQU2VydmljZVJlc3BvbnNlIgOQAgESWgoOTGlzdElkUENsaWVudHMSIC50YWlsb3IudjEuTGlzdElkUENsaWVudHNSZXF1ZXN0GiEudGFpbG9yLnYxLkxpc3RJZFBDbGllbnRzUmVzcG9uc2UiA5ACARJaCg9DcmVhdGVJZFBDbGllbnQSIS50YWlsb3IudjEuQ3JlYXRlSWRQQ2xpZW50UmVxdWVzdBoiLnRhaWxvci52MS5DcmVhdGVJZFBDbGllbnRSZXNwb25zZSIAEloKD0RlbGV0ZUlkUENsaWVudBIhLnRhaWxvci52MS5EZWxldGVJZFBDbGllbnRSZXF1ZXN0GiIudGFpbG9yLnYxLkRlbGV0ZUlkUENsaWVudFJlc3BvbnNlIgASVAoMR2V0SWRQQ2xpZW50Eh4udGFpbG9yLnYxLkdldElkUENsaWVudFJlcXVlc3QaHy50YWlsb3IudjEuR2V0SWRQQ2xpZW50UmVzcG9uc2UiA5ACARJmChNDcmVhdGVTdGF0aWNXZWJzaXRlEiUudGFpbG9yLnYxLkNyZWF0ZVN0YXRpY1dlYnNpdGVSZXF1ZXN0GiYudGFpbG9yLnYxLkNyZWF0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZSIAEmYKE1VwZGF0ZVN0YXRpY1dlYnNpdGUSJS50YWlsb3IudjEuVXBkYXRlU3RhdGljV2Vic2l0ZVJlcXVlc3QaJi50YWlsb3IudjEuVXBkYXRlU3RhdGljV2Vic2l0ZVJlc3BvbnNlIgASZgoTRGVsZXRlU3RhdGljV2Vic2l0ZRIlLnRhaWxvci52MS5EZWxldGVTdGF0aWNXZWJzaXRlUmVxdWVzdBomLnRhaWxvci52MS5EZWxldGVTdGF0aWNXZWJzaXRlUmVzcG9uc2UiABJgChBHZXRTdGF0aWNXZWJzaXRlEiIudGFpbG9yLnYxLkdldFN0YXRpY1dlYnNpdGVSZXF1ZXN0GiMudGFpbG9yLnYxLkdldFN0YXRpY1dlYnNpdGVSZXNwb25zZSIDkAIBEmYKEkxpc3RTdGF0aWNXZWJzaXRlcxIkLnRhaWxvci52MS5MaXN0U3RhdGljV2Vic2l0ZXNSZXF1ZXN0GiUudGFpbG9yLnYxLkxpc3RTdGF0aWNXZWJzaXRlc1Jlc3BvbnNlIgOQAgESXQoQQ3JlYXRlRGVwbG95bWVudBIiLnRhaWxvci52MS5DcmVhdGVEZXBsb3ltZW50UmVxdWVzdBojLnRhaWxvci52MS5DcmVhdGVEZXBsb3ltZW50UmVzcG9uc2UiABJNCgpVcGxvYWRGaWxlEhwudGFpbG9yLnYxLlVwbG9hZEZpbGVSZXF1ZXN0Gh0udGFpbG9yLnYxLlVwbG9hZEZpbGVSZXNwb25zZSIAKAESYAoRUHVibGlzaERlcGxveW1lbnQSIy50YWlsb3IudjEuUHVibGlzaERlcGxveW1lbnRSZXF1ZXN0GiQudGFpbG9yLnYxLlB1Ymxpc2hEZXBsb3ltZW50UmVzcG9uc2UiABJXCg5DcmVhdGVXb3JrZmxvdxIgLnRhaWxvci52MS5DcmVhdGVXb3JrZmxvd1JlcXVlc3QaIS50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dSZXNwb25zZSIAElcKDlVwZGF0ZVdvcmtmbG93EiAudGFpbG9yLnYxLlVwZGF0ZVdvcmtmbG93UmVxdWVzdBohLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd1Jlc3BvbnNlIgASVwoORGVsZXRlV29ya2Zsb3cSIC50YWlsb3IudjEuRGVsZXRlV29ya2Zsb3dSZXF1ZXN0GiEudGFpbG9yLnYxLkRlbGV0ZVdvcmtmbG93UmVzcG9uc2UiABJRCgtHZXRXb3JrZmxvdxIdLnRhaWxvci52MS5HZXRXb3JrZmxvd1JlcXVlc3QaHi50YWlsb3IudjEuR2V0V29ya2Zsb3dSZXNwb25zZSIDkAIBEmMKEUdldFdvcmtmbG93QnlOYW1lEiMudGFpbG9yLnYxLkdldFdvcmtmbG93QnlOYW1lUmVxdWVzdBokLnRhaWxvci52MS5HZXRXb3JrZmxvd0J5TmFtZVJlc3BvbnNlIgOQAgESVwoNTGlzdFdvcmtmbG93cxIfLnRhaWxvci52MS5MaXN0V29ya2Zsb3dzUmVxdWVzdBogLnRhaWxvci52MS5MaXN0V29ya2Zsb3dzUmVzcG9uc2UiA5ACARJ4ChlDcmVhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uEisudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb25SZXF1ZXN0GiwudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZSIAEngKGVVwZGF0ZVdvcmtmbG93Sm9iRnVuY3Rpb24SKy50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QaLC50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlc3BvbnNlIgAScgoWR2V0V29ya2Zsb3dKb2JGdW5jdGlvbhIoLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uUmVxdWVzdBopLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uUmVzcG9uc2UiA5ACARKEAQocR2V0V29ya2Zsb3dKb2JGdW5jdGlvbkJ5TmFtZRIuLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lUmVxdWVzdBovLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lUmVzcG9uc2UiA5ACARJ4ChhMaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnMSKi50YWlsb3IudjEuTGlzdFdvcmtmbG93Sm9iRnVuY3Rpb25zUmVxdWVzdBorLnRhaWxvci52MS5MaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnNSZXNwb25zZSIDkAIBEmwKFEdldFdvcmtmbG93RXhlY3V0aW9uEiYudGFpbG9yLnYxLkdldFdvcmtmbG93RXhlY3V0aW9uUmVxdWVzdBonLnRhaWxvci52MS5HZXRXb3JrZmxvd0V4ZWN1dGlvblJlc3BvbnNlIgOQAgEScgoWTGlzdFdvcmtmbG93RXhlY3V0aW9ucxIoLnRhaWxvci52MS5MaXN0V29ya2Zsb3dFeGVjdXRpb25zUmVxdWVzdBopLnRhaWxvci52MS5MaXN0V29ya2Zsb3dFeGVjdXRpb25zUmVzcG9uc2UiA5ACARJgChFUZXN0U3RhcnRXb3JrZmxvdxIjLnRhaWxvci52MS5UZXN0U3RhcnRXb3JrZmxvd1JlcXVlc3QaJC50YWlsb3IudjEuVGVzdFN0YXJ0V29ya2Zsb3dSZXNwb25zZSIAEmMKElRlc3RSZXN1bWVXb3JrZmxvdxIkLnRhaWxvci52MS5UZXN0UmVzdW1lV29ya2Zsb3dSZXF1ZXN0GiUudGFpbG9yLnYxLlRlc3RSZXN1bWVXb3JrZmxvd1Jlc3BvbnNlIgASTgoLU2V0TWV0YWRhdGESHS50YWlsb3IudjEuU2V0TWV0YWRhdGFSZXF1ZXN0Gh4udGFpbG9yLnYxLlNldE1ldGFkYXRhUmVzcG9uc2UiABJRCgtHZXRNZXRhZGF0YRIdLnRhaWxvci52MS5HZXRNZXRhZGF0YVJlcXVlc3QaHi50YWlsb3IudjEuR2V0TWV0YWRhdGFSZXNwb25zZSIDkAIBEoQBCh1DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlchIvLnRhaWxvci52MS5DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QaMC50YWlsb3IudjEuQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZSIAEoQBCh1VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlchIvLnRhaWxvci52MS5VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QaMC50YWlsb3IudjEuVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZSIAEn4KGkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEiwudGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBotLnRhaWxvci52MS5HZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgOQAgEShAEKHExpc3RDb250cm9scGxhbmVNYWNoaW5lVXNlcnMSLi50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1JlcXVlc3QaLy50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1Jlc3BvbnNlIgOQAgEShAEKHURlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLkRlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5EZWxldGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgBiBnByb3RvMw", [
948
+ const file_tailor_v1_service = /* @__PURE__ */ fileDesc("Chd0YWlsb3IvdjEvc2VydmljZS5wcm90bxIJdGFpbG9yLnYxIg0KC1BpbmdSZXF1ZXN0Ig4KDFBpbmdSZXNwb25zZTKCtAEKD09wZXJhdG9yU2VydmljZRI5CgRQaW5nEhYudGFpbG9yLnYxLlBpbmdSZXF1ZXN0GhcudGFpbG9yLnYxLlBpbmdSZXNwb25zZSIAEocBCh1MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9ucxIvLnRhaWxvci52MS5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9uc1JlcXVlc3QaMC50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZVdvcmtzcGFjZRIhLnRhaWxvci52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZVdvcmtzcGFjZVJlc3BvbnNlIgASWgoPVXBkYXRlV29ya3NwYWNlEiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVJlcXVlc3QaIi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUmVzcG9uc2UiABJaCg9EZWxldGVXb3Jrc3BhY2USIS50YWlsb3IudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBoiLnRhaWxvci52MS5EZWxldGVXb3Jrc3BhY2VSZXNwb25zZSIAEloKDkxpc3RXb3Jrc3BhY2VzEiAudGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdBohLnRhaWxvci52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlIgOQAgESfgoaTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXMSLC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVzcG9uc2UiA5ACARJdChBSZXN0b3JlV29ya3NwYWNlEiIudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSIAElQKDEdldFdvcmtzcGFjZRIeLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gh8udGFpbG9yLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgOQAgESfgoaTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnMSLC50YWlsb3IudjEuTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJzUmVzcG9uc2UiA5ACARKlAQonTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzEjkudGFpbG9yLnYxLkxpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1JlcXVlc3QaOi50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzUmVzcG9uc2UiA5ACARJ+ChtJbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISLS50YWlsb3IudjEuSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBouLnRhaWxvci52MS5JbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIAEn4KG1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlchItLnRhaWxvci52MS5SZW1vdmVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Gi4udGFpbG9yLnYxLlJlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIgASfgobVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyEi0udGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QaLi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiABJ4ChhHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISKi50YWlsb3IudjEuR2V0V29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBorLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIDkAIBEmAKEEdldFdvcmtzcGFjZVJvbGUSIi50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlc3BvbnNlIgOQAgESYwoSVXBkYXRlT3JnYW5pemF0aW9uEiQudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABJdCg9HZXRPcmdhbml6YXRpb24SIS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdBoiLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25SZXNwb25zZSIDkAIBEmMKEUxpc3RPcmdhbml6YXRpb25zEiMudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBokLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlIgOQAgESbwoVTGlzdFVzZXJPcmdhbml6YXRpb25zEicudGFpbG9yLnYxLkxpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdFVzZXJPcmdhbml6YXRpb25zUmVzcG9uc2UiA5ACARJyChdHcmFudE9yZ2FuaXphdGlvbkFjY2VzcxIpLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKi50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSIAEnUKGFVwZGF0ZU9yZ2FuaXphdGlvbkFjY2VzcxIqLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GisudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgASdQoYUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzEioudGFpbG9yLnYxLlJldm9rZU9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKy50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UiABJ4ChhMaXN0T3JnYW5pemF0aW9uQWNjZXNzZXMSKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBorLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uQWNjZXNzZXNSZXNwb25zZSIDkAIBEm8KFUdldE9yZ2FuaXphdGlvbkFjY2VzcxInLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GigudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgOQAgESdQoYQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyEioudGFpbG9yLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKy50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiABJ1ChhVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXISKi50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBorLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSIAEnUKGERlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlchIqLnRhaWxvci52MS5EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0GisudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlIgASbwoVR2V0T3JnYW5pemF0aW9uRm9sZGVyEicudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiA5ACARJ1ChdMaXN0T3JnYW5pemF0aW9uRm9sZGVycxIpLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlcnNSZXNwb25zZSIDkAIBEoQBCh1HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2VzcxIvLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QaMC50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEooBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXMSMC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVxdWVzdBoxLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZSIDkAIBEoEBChtHZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSLS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBouLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZU9yZ2FuaXphdGlvblRlYW0SKC50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgASbwoWVXBkYXRlT3JnYW5pemF0aW9uVGVhbRIoLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2UiABJvChZEZWxldGVPcmdhbml6YXRpb25UZWFtEigudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSIAEmkKE0dldE9yZ2FuaXphdGlvblRlYW0SJS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaJi50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgOQAgESbwoVTGlzdE9yZ2FuaXphdGlvblRlYW1zEicudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25UZWFtc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2UiA5ACARJ4ChlBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyEisudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0GiwudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxSZW1vdmVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChtMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnMSLS50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVxdWVzdBouLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXNwb25zZSIDkAIBEnsKGUdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXISKy50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QaLC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIgOQAgEScgoWR2V0UGxhdGZvcm1BY2NvdW50UGxhbhIoLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVxdWVzdBopLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBcHBsaWNhdGlvbhIjLnRhaWxvci52MS5DcmVhdGVBcHBsaWNhdGlvblJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXBwbGljYXRpb25SZXNwb25zZSIAEmAKEVVwZGF0ZUFwcGxpY2F0aW9uEiMudGFpbG9yLnYxLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBcHBsaWNhdGlvblJlc3BvbnNlIgASYAoRRGVsZXRlQXBwbGljYXRpb24SIy50YWlsb3IudjEuRGVsZXRlQXBwbGljYXRpb25SZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUFwcGxpY2F0aW9uUmVzcG9uc2UiABJgChBMaXN0QXBwbGljYXRpb25zEiIudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25zZSIDkAIBEloKDkdldEFwcGxpY2F0aW9uEiAudGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uUmVxdWVzdBohLnRhaWxvci52MS5HZXRBcHBsaWNhdGlvblJlc3BvbnNlIgOQAgESfgoaR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGgSLC50YWlsb3IudjEuR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uU2NoZW1hSGVhbHRoUmVzcG9uc2UiA5ACARJjChJDb21wb3NlVGFpbG9yREJTREwSJC50YWlsb3IudjEuQ29tcG9zZVRhaWxvckRCU0RMUmVxdWVzdBolLnRhaWxvci52MS5Db21wb3NlVGFpbG9yREJTRExSZXNwb25zZSIAEmwKFUNyZWF0ZVRhaWxvckRCU2VydmljZRInLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIgASbAoVVXBkYXRlVGFpbG9yREJTZXJ2aWNlEicudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuVXBkYXRlVGFpbG9yREJTZXJ2aWNlUmVzcG9uc2UiABJsChVEZWxldGVUYWlsb3JEQlNlcnZpY2USJy50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5EZWxldGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZSIAEmYKEkdldFRhaWxvckRCU2VydmljZRIkLnRhaWxvci52MS5HZXRUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GiUudGFpbG9yLnYxLkdldFRhaWxvckRCU2VydmljZVJlc3BvbnNlIgOQAgESbAoUTGlzdFRhaWxvckRCU2VydmljZXMSJi50YWlsb3IudjEuTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlNlcnZpY2VzUmVzcG9uc2UiA5ACARJjChJDcmVhdGVUYWlsb3JEQlR5cGUSJC50YWlsb3IudjEuQ3JlYXRlVGFpbG9yREJUeXBlUmVxdWVzdBolLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlR5cGVSZXNwb25zZSIAEmMKElVwZGF0ZVRhaWxvckRCVHlwZRIkLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0GiUudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoSRGVsZXRlVGFpbG9yREJUeXBlEiQudGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QaJS50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UiABJsChVUcnVuY2F0ZVRhaWxvckRCVHlwZXMSJy50YWlsb3IudjEuVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVxdWVzdBooLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXNwb25zZSIAEmkKFFRydW5jYXRlVGFpbG9yREJUeXBlEiYudGFpbG9yLnYxLlRydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBonLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoRTGlzdFRhaWxvckRCVHlwZXMSIy50YWlsb3IudjEuTGlzdFRhaWxvckRCVHlwZXNSZXF1ZXN0GiQudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlR5cGVzUmVzcG9uc2UiA5ACARJdCg9HZXRUYWlsb3JEQlR5cGUSIS50YWlsb3IudjEuR2V0VGFpbG9yREJUeXBlUmVxdWVzdBoiLnRhaWxvci52MS5HZXRUYWlsb3JEQlR5cGVSZXNwb25zZSIDkAIBEn4KG0NyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASeAoYR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uEioudGFpbG9yLnYxLkdldFRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaKy50YWlsb3IudjEuR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiA5ACARJ+ChpMaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9ucxIsLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1JlcXVlc3QaLS50YWlsb3IudjEuTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZSIDkAIBEn4KG1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASfgobRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uEi0udGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaLi50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiABJsChVDcmVhdGVQaXBlbGluZVNlcnZpY2USJy50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIAEmwKFVVwZGF0ZVBpcGVsaW5lU2VydmljZRInLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZVBpcGVsaW5lU2VydmljZVJlc3BvbnNlIgASbAoVRGVsZXRlUGlwZWxpbmVTZXJ2aWNlEicudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2UiABJmChJHZXRQaXBlbGluZVNlcnZpY2USJC50YWlsb3IudjEuR2V0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBolLnRhaWxvci52MS5HZXRQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIDkAIBEmwKFExpc3RQaXBlbGluZVNlcnZpY2VzEiYudGFpbG9yLnYxLkxpc3RQaXBlbGluZVNlcnZpY2VzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0UGlwZWxpbmVTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESaQoTR2V0UGlwZWxpbmVSZXNvbHZlchIlLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVxdWVzdBomLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiA5ACARJvChVMaXN0UGlwZWxpbmVSZXNvbHZlcnMSJy50YWlsb3IudjEuTGlzdFBpcGVsaW5lUmVzb2x2ZXJzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlcnNSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZVBpcGVsaW5lUmVzb2x2ZXISKC50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlIgASbwoWVXBkYXRlUGlwZWxpbmVSZXNvbHZlchIoLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZEZWxldGVQaXBlbGluZVJlc29sdmVyEigudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZSIAEmMKEkNvbXBvc2VQaXBlbGluZVNETBIkLnRhaWxvci52MS5Db21wb3NlUGlwZWxpbmVTRExSZXF1ZXN0GiUudGFpbG9yLnYxLkNvbXBvc2VQaXBlbGluZVNETFJlc3BvbnNlIgASnAEKJExpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0cxI2LnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdHNSZXF1ZXN0GjcudGFpbG9yLnYxLkxpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0c1Jlc3BvbnNlIgOQAgESlgEKIkdldFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHQSNC50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlcXVlc3QaNS50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlc3BvbnNlIgOQAgEScgoXUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXISKS50YWlsb3IudjEuUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GioudGFpbG9yLnYxLlJlc3RhcnRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZDcmVhdGVTdGF0ZWZsb3dTZXJ2aWNlEigudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIAEm8KFlVwZGF0ZVN0YXRlZmxvd1NlcnZpY2USKC50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlIgASbwoWRGVsZXRlU3RhdGVmbG93U2VydmljZRIoLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVzcG9uc2UiABJpChNHZXRTdGF0ZWZsb3dTZXJ2aWNlEiUudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIDkAIBEm8KFUxpc3RTdGF0ZWZsb3dTZXJ2aWNlcxInLnRhaWxvci52MS5MaXN0U3RhdGVmbG93U2VydmljZXNSZXF1ZXN0GigudGFpbG9yLnYxLkxpc3RTdGF0ZWZsb3dTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChZVcGRhdGVFeGVjdXRvckV4ZWN1dG9yEigudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXNwb25zZSIAEmkKE0dldEV4ZWN1dG9yRXhlY3V0b3ISJS50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlcXVlc3QaJi50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlc3BvbnNlIgOQAgESbwoWRGVsZXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChVMaXN0RXhlY3V0b3JFeGVjdXRvcnMSJy50YWlsb3IudjEuTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0RXhlY3V0b3JFeGVjdXRvcnNSZXNwb25zZSIDkAIBEloKDkdldEV4ZWN1dG9ySm9iEiAudGFpbG9yLnYxLkdldEV4ZWN1dG9ySm9iUmVxdWVzdBohLnRhaWxvci52MS5HZXRFeGVjdXRvckpvYlJlc3BvbnNlIgOQAgESYAoQTGlzdEV4ZWN1dG9ySm9icxIiLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVxdWVzdBojLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVzcG9uc2UiA5ACARJ1ChdMaXN0RXhlY3V0b3JKb2JBdHRlbXB0cxIpLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JBdHRlbXB0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdEV4ZWN1dG9ySm9iQXR0ZW1wdHNSZXNwb25zZSIDkAIBEoQBChxMaXN0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tzEi4udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXNwb25zZSIDkAIBEn4KGkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rEiwudGFpbG9yLnYxLkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rUmVxdWVzdBotLnRhaWxvci52MS5HZXRFeGVjdXRvckluY29taW5nV2ViaG9va1Jlc3BvbnNlIgOQAgESWgoPVHJpZ2dlckV4ZWN1dG9yEiEudGFpbG9yLnYxLlRyaWdnZXJFeGVjdXRvclJlcXVlc3QaIi50YWlsb3IudjEuVHJpZ2dlckV4ZWN1dG9yUmVzcG9uc2UiABJ1ChhDcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHQSKi50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclZhdWx0UmVxdWVzdBorLnRhaWxvci52MS5DcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXNwb25zZSIAEm8KFUdldFNlY3JldE1hbmFnZXJWYXVsdBInLnRhaWxvci52MS5HZXRTZWNyZXRNYW5hZ2VyVmF1bHRSZXF1ZXN0GigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJWYXVsdFJlc3BvbnNlIgOQAgESdQoYRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0EioudGFpbG9yLnYxLkRlbGV0ZVNlY3JldE1hbmFnZXJWYXVsdFJlcXVlc3QaKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0UmVzcG9uc2UiABJ1ChdMaXN0U2VjcmV0TWFuYWdlclZhdWx0cxIpLnRhaWxvci52MS5MaXN0U2VjcmV0TWFuYWdlclZhdWx0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJWYXVsdHNSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoZVXBkYXRlU2VjcmV0TWFuYWdlclNlY3JldBIrLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVzcG9uc2UiABJyChZHZXRTZWNyZXRNYW5hZ2VyU2VjcmV0EigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0GikudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXNwb25zZSIDkAIBEngKGURlbGV0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoYTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzEioudGFpbG9yLnYxLkxpc3RTZWNyZXRNYW5hZ2VyU2VjcmV0c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBdXRoU2VydmljZRIjLnRhaWxvci52MS5DcmVhdGVBdXRoU2VydmljZVJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXV0aFNlcnZpY2VSZXNwb25zZSIAEmAKEVVwZGF0ZUF1dGhTZXJ2aWNlEiMudGFpbG9yLnYxLlVwZGF0ZUF1dGhTZXJ2aWNlUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBdXRoU2VydmljZVJlc3BvbnNlIgASYAoRRGVsZXRlQXV0aFNlcnZpY2USIy50YWlsb3IudjEuRGVsZXRlQXV0aFNlcnZpY2VSZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UiABJaCg5HZXRBdXRoU2VydmljZRIgLnRhaWxvci52MS5HZXRBdXRoU2VydmljZVJlcXVlc3QaIS50YWlsb3IudjEuR2V0QXV0aFNlcnZpY2VSZXNwb25zZSIDkAIBEmAKEExpc3RBdXRoU2VydmljZXMSIi50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1JlcXVlc3QaIy50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESZgoTQ3JlYXRlQXV0aElEUENvbmZpZxIlLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVxdWVzdBomLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiABJmChNVcGRhdGVBdXRoSURQQ29uZmlnEiUudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0GiYudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZSIAEmYKE0RlbGV0ZUF1dGhJRFBDb25maWcSJS50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1JlcXVlc3QaJi50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1Jlc3BvbnNlIgASYAoQR2V0QXV0aElEUENvbmZpZxIiLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVxdWVzdBojLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVzcG9uc2UiA5ACARJmChJMaXN0QXV0aElEUENvbmZpZ3MSJC50YWlsb3IudjEuTGlzdEF1dGhJRFBDb25maWdzUmVxdWVzdBolLnRhaWxvci52MS5MaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZSIDkAIBEnIKF0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnEikudGFpbG9yLnYxLkNyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBoqLnRhaWxvci52MS5DcmVhdGVVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgAScgoXVXBkYXRlVXNlclByb2ZpbGVDb25maWcSKS50YWlsb3IudjEuVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0GioudGFpbG9yLnYxLlVwZGF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UiABJyChdEZWxldGVVc2VyUHJvZmlsZUNvbmZpZxIpLnRhaWxvci52MS5EZWxldGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaKi50YWlsb3IudjEuRGVsZXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIAEmwKFEdldFVzZXJQcm9maWxlQ29uZmlnEiYudGFpbG9yLnYxLkdldFVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5HZXRVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgOQAgESYwoSQ3JlYXRlVGVuYW50Q29uZmlnEiQudGFpbG9yLnYxLkNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QaJS50YWlsb3IudjEuQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2UiABJjChJVcGRhdGVUZW5hbnRDb25maWcSJC50YWlsb3IudjEuVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBolLnRhaWxvci52MS5VcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZSIAEmMKEkRlbGV0ZVRlbmFudENvbmZpZxIkLnRhaWxvci52MS5EZWxldGVUZW5hbnRDb25maWdSZXF1ZXN0GiUudGFpbG9yLnYxLkRlbGV0ZVRlbmFudENvbmZpZ1Jlc3BvbnNlIgASXQoPR2V0VGVuYW50Q29uZmlnEiEudGFpbG9yLnYxLkdldFRlbmFudENvbmZpZ1JlcXVlc3QaIi50YWlsb3IudjEuR2V0VGVuYW50Q29uZmlnUmVzcG9uc2UiA5ACARJ4ChlDcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuEisudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXF1ZXN0GiwudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZSIAEngKGURlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW4SKy50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlc3BvbnNlIgASeAoYTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zEioudGFpbG9yLnYxLkxpc3RQZXJzb25hbEFjY2Vzc1Rva2Vuc1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVzcG9uc2UiA5ACARJsChVDcmVhdGVBdXRoTWFjaGluZVVzZXISJy50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIAEmwKFVVwZGF0ZUF1dGhNYWNoaW5lVXNlchInLnRhaWxvci52MS5VcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZUF1dGhNYWNoaW5lVXNlclJlc3BvbnNlIgASbAoVRGVsZXRlQXV0aE1hY2hpbmVVc2VyEicudGFpbG9yLnYxLkRlbGV0ZUF1dGhNYWNoaW5lVXNlclJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiABJmChJHZXRBdXRoTWFjaGluZVVzZXISJC50YWlsb3IudjEuR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBolLnRhaWxvci52MS5HZXRBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIDkAIBEmwKFExpc3RBdXRoTWFjaGluZVVzZXJzEiYudGFpbG9yLnYxLkxpc3RBdXRoTWFjaGluZVVzZXJzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0QXV0aE1hY2hpbmVVc2Vyc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aFNDSU1Db25maWcSJi50YWlsb3IudjEuQ3JlYXRlQXV0aFNDSU1Db25maWdSZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiABJpChRVcGRhdGVBdXRoU0NJTUNvbmZpZxImLnRhaWxvci52MS5VcGRhdGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1Db25maWdSZXNwb25zZSIAEmkKFERlbGV0ZUF1dGhTQ0lNQ29uZmlnEiYudGFpbG9yLnYxLkRlbGV0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgASYwoRR2V0QXV0aFNDSU1Db25maWcSIy50YWlsb3IudjEuR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0GiQudGFpbG9yLnYxLkdldEF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiA5ACARJvChZDcmVhdGVBdXRoU0NJTVJlc291cmNlEigudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIAEm8KFlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2USKC50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIgASbwoWRGVsZXRlQXV0aFNDSU1SZXNvdXJjZRIoLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiABJpChNHZXRBdXRoU0NJTVJlc291cmNlEiUudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIDkAIBEmwKFEdldEF1dGhTQ0lNUmVzb3VyY2VzEiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VzUmVxdWVzdBonLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aENvbm5lY3Rpb24SJi50YWlsb3IudjEuQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UiABJpChNMaXN0QXV0aENvbm5lY3Rpb25zEiUudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0GiYudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXNwb25zZSIDkAIBEmkKFFJldm9rZUF1dGhDb25uZWN0aW9uEiYudGFpbG9yLnYxLlJldm9rZUF1dGhDb25uZWN0aW9uUmVxdWVzdBonLnRhaWxvci52MS5SZXZva2VBdXRoQ29ubmVjdGlvblJlc3BvbnNlIgAShAEKHVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uEi8udGFpbG9yLnYxLlJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVxdWVzdBowLnRhaWxvci52MS5SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvblJlc3BvbnNlIgASogEKJ0V4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZRI5LnRhaWxvci52MS5FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0GjoudGFpbG9yLnYxLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlc3BvbnNlIgASbwoWQ3JlYXRlQXV0aE9BdXRoMkNsaWVudBIoLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiABJvChZVcGRhdGVBdXRoT0F1dGgyQ2xpZW50EigudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXNwb25zZSIAEm8KFkRlbGV0ZUF1dGhPQXV0aDJDbGllbnQSKC50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgASaQoTR2V0QXV0aE9BdXRoMkNsaWVudBIlLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBomLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiA5ACARJvChVMaXN0QXV0aE9BdXRoMkNsaWVudHMSJy50YWlsb3IudjEuTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0QXV0aE9BdXRoMkNsaWVudHNSZXNwb25zZSIDkAIBEmkKE0xpc3REYXRhcGxhbmVFdmVudHMSJS50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1JlcXVlc3QaJi50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1Jlc3BvbnNlIgOQAgEShAEKHExpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3MSLi50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1JlcXVlc3QaLy50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1Jlc3BvbnNlIgOQAgESVwoOVGVzdEV4ZWNTY3JpcHQSIC50YWlsb3IudjEuVGVzdEV4ZWNTY3JpcHRSZXF1ZXN0GiEudGFpbG9yLnYxLlRlc3RFeGVjU2NyaXB0UmVzcG9uc2UiABJsChRHZXRGdW5jdGlvbkV4ZWN1dGlvbhImLnRhaWxvci52MS5HZXRGdW5jdGlvbkV4ZWN1dGlvblJlcXVlc3QaJy50YWlsb3IudjEuR2V0RnVuY3Rpb25FeGVjdXRpb25SZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1Jlc3BvbnNlIgOQAgEScQoWQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiACgBEnEKFlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgAoARJpChNHZXRGdW5jdGlvblJlZ2lzdHJ5EiUudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvblJlZ2lzdHJpZXMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1Jlc3BvbnNlIgOQAgESbwoWRGVsZXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiABKMAQoeRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0EjAudGFpbG9yLnYxLkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdFJlcXVlc3QaMS50YWlsb3IudjEuRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0UmVzcG9uc2UiA5ACATABEnIKFkxpc3RNZXRlclJlcXVlc3RDb3VudHMSKC50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1Jlc3BvbnNlIgOQAgESeAoYTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzEioudGFpbG9yLnYxLkxpc3RNZXRlckV4ZWN1dGlvbkNvdW50c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzUmVzcG9uc2UiA5ACARJsChRMaXN0TWV0ZXJFdmVudENvdW50cxImLnRhaWxvci52MS5MaXN0TWV0ZXJFdmVudENvdW50c1JlcXVlc3QaJy50YWlsb3IudjEuTGlzdE1ldGVyRXZlbnRDb3VudHNSZXNwb25zZSIDkAIBEl0KD0xpc3RJZFBTZXJ2aWNlcxIhLnRhaWxvci52MS5MaXN0SWRQU2VydmljZXNSZXF1ZXN0GiIudGFpbG9yLnYxLkxpc3RJZFBTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESXQoQQ3JlYXRlSWRQU2VydmljZRIiLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVxdWVzdBojLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVzcG9uc2UiABJdChBVcGRhdGVJZFBTZXJ2aWNlEiIudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXNwb25zZSIAEl0KEERlbGV0ZUlkUFNlcnZpY2USIi50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlcXVlc3QaIy50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlc3BvbnNlIgASVwoNR2V0SWRQU2VydmljZRIfLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVxdWVzdBogLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVzcG9uc2UiA5ACARJaCg5MaXN0SWRQQ2xpZW50cxIgLnRhaWxvci52MS5MaXN0SWRQQ2xpZW50c1JlcXVlc3QaIS50YWlsb3IudjEuTGlzdElkUENsaWVudHNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZUlkUENsaWVudBIhLnRhaWxvci52MS5DcmVhdGVJZFBDbGllbnRSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZUlkUENsaWVudFJlc3BvbnNlIgASWgoPRGVsZXRlSWRQQ2xpZW50EiEudGFpbG9yLnYxLkRlbGV0ZUlkUENsaWVudFJlcXVlc3QaIi50YWlsb3IudjEuRGVsZXRlSWRQQ2xpZW50UmVzcG9uc2UiABJUCgxHZXRJZFBDbGllbnQSHi50YWlsb3IudjEuR2V0SWRQQ2xpZW50UmVxdWVzdBofLnRhaWxvci52MS5HZXRJZFBDbGllbnRSZXNwb25zZSIDkAIBEmYKE0NyZWF0ZVN0YXRpY1dlYnNpdGUSJS50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlcXVlc3QaJi50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlc3BvbnNlIgASZgoTVXBkYXRlU3RhdGljV2Vic2l0ZRIlLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVxdWVzdBomLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVzcG9uc2UiABJmChNEZWxldGVTdGF0aWNXZWJzaXRlEiUudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXF1ZXN0GiYudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZSIAEmAKEEdldFN0YXRpY1dlYnNpdGUSIi50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlc3BvbnNlIgOQAgESZgoSTGlzdFN0YXRpY1dlYnNpdGVzEiQudGFpbG9yLnYxLkxpc3RTdGF0aWNXZWJzaXRlc1JlcXVlc3QaJS50YWlsb3IudjEuTGlzdFN0YXRpY1dlYnNpdGVzUmVzcG9uc2UiA5ACARJdChBDcmVhdGVEZXBsb3ltZW50EiIudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXF1ZXN0GiMudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXNwb25zZSIAEk0KClVwbG9hZEZpbGUSHC50YWlsb3IudjEuVXBsb2FkRmlsZVJlcXVlc3QaHS50YWlsb3IudjEuVXBsb2FkRmlsZVJlc3BvbnNlIgAoARJgChFQdWJsaXNoRGVwbG95bWVudBIjLnRhaWxvci52MS5QdWJsaXNoRGVwbG95bWVudFJlcXVlc3QaJC50YWlsb3IudjEuUHVibGlzaERlcGxveW1lbnRSZXNwb25zZSIAElcKDkNyZWF0ZVdvcmtmbG93EiAudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93UmVxdWVzdBohLnRhaWxvci52MS5DcmVhdGVXb3JrZmxvd1Jlc3BvbnNlIgASVwoOVXBkYXRlV29ya2Zsb3cSIC50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dSZXF1ZXN0GiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtmbG93UmVzcG9uc2UiABJXCg5EZWxldGVXb3JrZmxvdxIgLnRhaWxvci52MS5EZWxldGVXb3JrZmxvd1JlcXVlc3QaIS50YWlsb3IudjEuRGVsZXRlV29ya2Zsb3dSZXNwb25zZSIAElEKC0dldFdvcmtmbG93Eh0udGFpbG9yLnYxLkdldFdvcmtmbG93UmVxdWVzdBoeLnRhaWxvci52MS5HZXRXb3JrZmxvd1Jlc3BvbnNlIgOQAgESYwoRR2V0V29ya2Zsb3dCeU5hbWUSIy50YWlsb3IudjEuR2V0V29ya2Zsb3dCeU5hbWVSZXF1ZXN0GiQudGFpbG9yLnYxLkdldFdvcmtmbG93QnlOYW1lUmVzcG9uc2UiA5ACARJXCg1MaXN0V29ya2Zsb3dzEh8udGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXF1ZXN0GiAudGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb24SKy50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlc3BvbnNlIgASeAoZVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvbhIrLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVzcG9uc2UiABJyChZHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uEigudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXF1ZXN0GikudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZSIDkAIBEoQBChxHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lEi4udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXF1ZXN0Gi8udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXNwb25zZSIDkAIBEngKGExpc3RXb3JrZmxvd0pvYkZ1bmN0aW9ucxIqLnRhaWxvci52MS5MaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0pvYkZ1bmN0aW9uc1Jlc3BvbnNlIgOQAgESbAoUR2V0V29ya2Zsb3dFeGVjdXRpb24SJi50YWlsb3IudjEuR2V0V29ya2Zsb3dFeGVjdXRpb25SZXF1ZXN0GicudGFpbG9yLnYxLkdldFdvcmtmbG93RXhlY3V0aW9uUmVzcG9uc2UiA5ACARJyChZMaXN0V29ya2Zsb3dFeGVjdXRpb25zEigudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXNwb25zZSIDkAIBEmAKEVRlc3RTdGFydFdvcmtmbG93EiMudGFpbG9yLnYxLlRlc3RTdGFydFdvcmtmbG93UmVxdWVzdBokLnRhaWxvci52MS5UZXN0U3RhcnRXb3JrZmxvd1Jlc3BvbnNlIgASYwoSVGVzdFJlc3VtZVdvcmtmbG93EiQudGFpbG9yLnYxLlRlc3RSZXN1bWVXb3JrZmxvd1JlcXVlc3QaJS50YWlsb3IudjEuVGVzdFJlc3VtZVdvcmtmbG93UmVzcG9uc2UiABJOCgtTZXRNZXRhZGF0YRIdLnRhaWxvci52MS5TZXRNZXRhZGF0YVJlcXVlc3QaHi50YWlsb3IudjEuU2V0TWV0YWRhdGFSZXNwb25zZSIAElEKC0dldE1ldGFkYXRhEh0udGFpbG9yLnYxLkdldE1ldGFkYXRhUmVxdWVzdBoeLnRhaWxvci52MS5HZXRNZXRhZGF0YVJlc3BvbnNlIgOQAgEShAEKHUNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLkNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgAShAEKHVVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLlVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgASfgoaR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXISLC50YWlsb3IudjEuR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiA5ACARKEAQocTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2VycxIuLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVxdWVzdBovLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVzcG9uc2UiA5ACARKEAQodRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXISLy50YWlsb3IudjEuRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0GjAudGFpbG9yLnYxLkRlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiAGIGcHJvdG8z", [
948
949
  file_tailor_v1_application,
949
950
  file_tailor_v1_auth,
950
951
  file_tailor_v1_events,
@@ -972,7 +973,7 @@ const OperatorService = /* @__PURE__ */ serviceDesc(file_tailor_v1_service, 0);
972
973
  let packageJson = null;
973
974
  /**
974
975
  * Read and cache the package.json of the SDK package.
975
- * @returns {Promise<PackageJson>} Parsed package.json contents
976
+ * @returns Parsed package.json contents
976
977
  */
977
978
  async function readPackageJson() {
978
979
  if (packageJson) return packageJson;
@@ -987,7 +988,7 @@ const oauth2ClientId = process.env.PLATFORM_OAUTH2_CLIENT_ID ?? "cpoc_0Iudir72fq
987
988
  const oauth2DiscoveryEndpoint = "/.well-known/oauth-authorization-server/oauth2/platform";
988
989
  /**
989
990
  * Initialize an OAuth2 client for Tailor Platform.
990
- * @returns {OAuth2Client} Configured OAuth2 client
991
+ * @returns Configured OAuth2 client
991
992
  */
992
993
  function initOAuth2Client() {
993
994
  return new OAuth2Client({
@@ -998,8 +999,8 @@ function initOAuth2Client() {
998
999
  }
999
1000
  /**
1000
1001
  * Initialize an Operator client with the given access token.
1001
- * @param {string} accessToken - Access token for authentication
1002
- * @returns {Promise<OperatorClient>} Configured Operator client
1002
+ * @param accessToken - Access token for authentication
1003
+ * @returns Configured Operator client
1003
1004
  */
1004
1005
  async function initOperatorClient(accessToken) {
1005
1006
  return createClient(OperatorService, createConnectTransport({
@@ -1015,7 +1016,7 @@ async function initOperatorClient(accessToken) {
1015
1016
  }
1016
1017
  /**
1017
1018
  * Create an interceptor that sets a User-Agent header.
1018
- * @returns {Promise<Interceptor>} User-Agent interceptor
1019
+ * @returns User-Agent interceptor
1019
1020
  */
1020
1021
  async function userAgentInterceptor() {
1021
1022
  const ua = await userAgent();
@@ -1026,15 +1027,15 @@ async function userAgentInterceptor() {
1026
1027
  }
1027
1028
  /**
1028
1029
  * Build the User-Agent string for CLI requests.
1029
- * @returns {Promise<string>} User-Agent header value
1030
+ * @returns User-Agent header value
1030
1031
  */
1031
1032
  async function userAgent() {
1032
1033
  return `tailor-sdk/${(await readPackageJson()).version ?? "unknown"}`;
1033
1034
  }
1034
1035
  /**
1035
1036
  * Create an interceptor that sets the Authorization bearer token.
1036
- * @param {string} accessToken - Access token to use
1037
- * @returns {Promise<Interceptor>} Bearer token interceptor
1037
+ * @param accessToken - Access token to use
1038
+ * @returns Bearer token interceptor
1038
1039
  */
1039
1040
  async function bearerTokenInterceptor(accessToken) {
1040
1041
  return (next) => async (req) => {
@@ -1044,7 +1045,7 @@ async function bearerTokenInterceptor(accessToken) {
1044
1045
  }
1045
1046
  /**
1046
1047
  * Create an interceptor that retries idempotent requests with backoff.
1047
- * @returns {Interceptor} Retry interceptor
1048
+ * @returns Retry interceptor
1048
1049
  */
1049
1050
  function retryInterceptor() {
1050
1051
  return (next) => async (req) => {
@@ -1067,8 +1068,8 @@ function retryInterceptor() {
1067
1068
  }
1068
1069
  /**
1069
1070
  * Wait for an exponential backoff delay with jitter.
1070
- * @param {number} attempt - Current retry attempt number (1-based)
1071
- * @returns {Promise<void>} Promise that resolves after the delay
1071
+ * @param attempt - Current retry attempt number (1-based)
1072
+ * @returns Promise that resolves after the delay
1072
1073
  */
1073
1074
  function waitRetryBackoff(attempt) {
1074
1075
  const backoff = 50 * 2 ** (attempt - 1) * (1 + .1 * (Math.random() * 2 - 1));
@@ -1076,9 +1077,9 @@ function waitRetryBackoff(attempt) {
1076
1077
  }
1077
1078
  /**
1078
1079
  * Determine whether the given error is retriable for the method idempotency.
1079
- * @param {unknown} error - Error thrown by the request
1080
- * @param {MethodOptions_IdempotencyLevel} idempotency - Method idempotency level
1081
- * @returns {boolean} True if the error should be retried
1080
+ * @param error - Error thrown by the request
1081
+ * @param idempotency - Method idempotency level
1082
+ * @returns True if the error should be retried
1082
1083
  */
1083
1084
  function isRetirable(error, idempotency) {
1084
1085
  if (!(error instanceof ConnectError)) return false;
@@ -1090,7 +1091,7 @@ function isRetirable(error, idempotency) {
1090
1091
  }
1091
1092
  /**
1092
1093
  * Create an interceptor that enhances error messages from the Operator API.
1093
- * @returns {Interceptor} Error handling interceptor
1094
+ * @returns Error handling interceptor
1094
1095
  */
1095
1096
  function errorHandlingInterceptor() {
1096
1097
  return (next) => async (req) => {
@@ -1108,8 +1109,8 @@ function errorHandlingInterceptor() {
1108
1109
  }
1109
1110
  /**
1110
1111
  * @internal
1111
- * @param {string} methodName - RPC method name (e.g., "CreateWorkspace")
1112
- * @returns {{ operation: string; resourceType: string }} Parsed operation and resource type
1112
+ * @param methodName - RPC method name (e.g., "CreateWorkspace")
1113
+ * @returns Parsed operation and resource type
1113
1114
  */
1114
1115
  function parseMethodName(methodName) {
1115
1116
  const match = methodName.match(/^(Create|Update|Delete|Set|List|Get)(.+)$/);
@@ -1125,8 +1126,8 @@ function parseMethodName(methodName) {
1125
1126
  }
1126
1127
  /**
1127
1128
  * @internal
1128
- * @param {unknown} message - Request message to format
1129
- * @returns {string} Pretty-printed JSON or error placeholder
1129
+ * @param message - Request message to format
1130
+ * @returns Pretty-printed JSON or error placeholder
1130
1131
  */
1131
1132
  function formatRequestParams(message) {
1132
1133
  try {
@@ -1139,8 +1140,8 @@ function formatRequestParams(message) {
1139
1140
  /**
1140
1141
  * Fetch all paginated resources by repeatedly calling the given function.
1141
1142
  * @template T
1142
- * @param {(pageToken: string) => Promise<[T[], string]>} fn - Page fetcher returning items and next page token
1143
- * @returns {Promise<T[]>} All fetched items
1143
+ * @param fn - Page fetcher returning items and next page token
1144
+ * @returns All fetched items
1144
1145
  */
1145
1146
  async function fetchAll(fn) {
1146
1147
  const items = [];
@@ -1155,8 +1156,8 @@ async function fetchAll(fn) {
1155
1156
  }
1156
1157
  /**
1157
1158
  * Fetch user info from the Tailor Platform userinfo endpoint.
1158
- * @param {string} accessToken - Access token for the current user
1159
- * @returns {Promise<{ email: string }>} Parsed user info
1159
+ * @param accessToken - Access token for the current user
1160
+ * @returns Parsed user info
1160
1161
  */
1161
1162
  async function fetchUserInfo(accessToken) {
1162
1163
  const userInfoUrl = new URL("/auth/platform/userinfo", platformBaseUrl).href;
@@ -1170,11 +1171,11 @@ async function fetchUserInfo(accessToken) {
1170
1171
  }
1171
1172
  /**
1172
1173
  * Resolve "name:url" patterns to actual Static Website URLs.
1173
- * @param {OperatorClient} client - Operator client instance
1174
- * @param {string} workspaceId - Workspace ID
1175
- * @param {string[] | undefined} urls - URLs or name:url patterns
1176
- * @param {string} context - Logging context (e.g., "CORS", "OAuth2 redirect URIs")
1177
- * @returns {Promise<string[]>} Resolved URLs
1174
+ * @param client - Operator client instance
1175
+ * @param workspaceId - Workspace ID
1176
+ * @param urls - URLs or name:url patterns
1177
+ * @param context - Logging context (e.g., "CORS", "OAuth2 redirect URIs")
1178
+ * @returns Resolved URLs
1178
1179
  */
1179
1180
  async function resolveStaticWebsiteUrls(client, workspaceId, urls, context) {
1180
1181
  if (!urls) return [];
@@ -1203,10 +1204,10 @@ async function resolveStaticWebsiteUrls(client, workspaceId, urls, context) {
1203
1204
  }
1204
1205
  /**
1205
1206
  * Fetch an OAuth2 access token for a machine user.
1206
- * @param {string} url - OAuth2 server base URL
1207
- * @param {string} clientId - Client ID for the machine user
1208
- * @param {string} clientSecret - Client secret for the machine user
1209
- * @returns {Promise<string>} Access token
1207
+ * @param url - OAuth2 server base URL
1208
+ * @param clientId - Client ID for the machine user
1209
+ * @param clientSecret - Client secret for the machine user
1210
+ * @returns Access token
1210
1211
  */
1211
1212
  async function fetchMachineUserToken(url, clientId, clientSecret) {
1212
1213
  const tokenEndpoint = new URL("/oauth2/token", url).href;
@@ -1252,7 +1253,7 @@ function platformConfigPath() {
1252
1253
  }
1253
1254
  /**
1254
1255
  * Read Tailor Platform CLI configuration, migrating from tailorctl if necessary.
1255
- * @returns {PfConfig} Parsed platform configuration
1256
+ * @returns Parsed platform configuration
1256
1257
  */
1257
1258
  function readPlatformConfig() {
1258
1259
  const configPath = platformConfigPath();
@@ -1273,8 +1274,7 @@ function readPlatformConfig() {
1273
1274
  }
1274
1275
  /**
1275
1276
  * Write Tailor Platform CLI configuration to disk.
1276
- * @param {PfConfig} config - Platform configuration to write
1277
- * @returns {void}
1277
+ * @param config - Platform configuration to write
1278
1278
  */
1279
1279
  function writePlatformConfig(config) {
1280
1280
  const configPath = platformConfigPath();
@@ -1331,10 +1331,8 @@ function validateUUID(value, source) {
1331
1331
  /**
1332
1332
  * Load workspace ID from command options, environment variables, or platform config.
1333
1333
  * Priority: opts/workspaceId > env/workspaceId > opts/profile > env/profile > error
1334
- * @param {{ workspaceId?: string; profile?: string }} [opts] - Workspace and profile options
1335
- * @param {string} [opts.workspaceId] - Workspace ID
1336
- * @param {string} [opts.profile] - Workspace profile name
1337
- * @returns {string} Resolved workspace ID
1334
+ * @param opts - Workspace and profile options
1335
+ * @returns Resolved workspace ID
1338
1336
  */
1339
1337
  function loadWorkspaceId(opts) {
1340
1338
  if (opts?.workspaceId) return validateUUID(opts.workspaceId, "--workspace-id option");
@@ -1353,10 +1351,8 @@ function loadWorkspaceId(opts) {
1353
1351
  /**
1354
1352
  * Load access token from command options, environment variables, or platform config.
1355
1353
  * Priority: env/TAILOR_PLATFORM_TOKEN > env/TAILOR_TOKEN (deprecated) > opts/profile > env/profile > config/currentUser > error
1356
- * @param {{ useProfile?: boolean; profile?: string }} [opts] - Profile options
1357
- * @param {boolean} [opts.useProfile] - Whether to use profile resolution
1358
- * @param {string} [opts.profile] - Profile name
1359
- * @returns {Promise<string>} Resolved access token
1354
+ * @param opts - Profile options
1355
+ * @returns Resolved access token
1360
1356
  */
1361
1357
  async function loadAccessToken(opts) {
1362
1358
  if (process.env.TAILOR_PLATFORM_TOKEN) return process.env.TAILOR_PLATFORM_TOKEN;
@@ -1383,9 +1379,9 @@ async function loadAccessToken(opts) {
1383
1379
  }
1384
1380
  /**
1385
1381
  * Fetch the latest access token, refreshing if necessary.
1386
- * @param {PfConfig} config - Platform config
1387
- * @param {string} user - User name
1388
- * @returns {Promise<string>} Latest access token
1382
+ * @param config - Platform config
1383
+ * @param user - User name
1384
+ * @returns Latest access token
1389
1385
  */
1390
1386
  async function fetchLatestToken(config, user) {
1391
1387
  const tokens = config.users[user];
@@ -1420,8 +1416,8 @@ const DEFAULT_CONFIG_FILENAME = "tailor.config.ts";
1420
1416
  /**
1421
1417
  * Load config path from command options or environment variables.
1422
1418
  * Priority: opts/config > env/config > search parent directories
1423
- * @param {string} [configPath] - Optional explicit config path
1424
- * @returns {string | undefined} Resolved config path or undefined
1419
+ * @param configPath - Optional explicit config path
1420
+ * @returns Resolved config path or undefined
1425
1421
  */
1426
1422
  function loadConfigPath(configPath) {
1427
1423
  if (configPath) return configPath;
@@ -1431,8 +1427,8 @@ function loadConfigPath(configPath) {
1431
1427
  /**
1432
1428
  * Load organization ID from command options or environment variables.
1433
1429
  * Priority: opts/organizationId > env/organizationId > undefined (optional)
1434
- * @param {string} [organizationId] - Organization ID override
1435
- * @returns {string | undefined} Resolved organization ID or undefined
1430
+ * @param organizationId - Organization ID override
1431
+ * @returns Resolved organization ID or undefined
1436
1432
  */
1437
1433
  function loadOrganizationId(organizationId) {
1438
1434
  if (organizationId) return validateUUID(organizationId, "--organization-id option");
@@ -1441,8 +1437,8 @@ function loadOrganizationId(organizationId) {
1441
1437
  /**
1442
1438
  * Load folder ID from command options or environment variables.
1443
1439
  * Priority: opts/folderId > env/folderId > undefined (optional)
1444
- * @param {string} [folderId] - Folder ID override
1445
- * @returns {string | undefined} Resolved folder ID or undefined
1440
+ * @param folderId - Folder ID override
1441
+ * @returns Resolved folder ID or undefined
1446
1442
  */
1447
1443
  function loadFolderId(folderId) {
1448
1444
  if (folderId) return validateUUID(folderId, "--folder-id option");
@@ -1454,8 +1450,8 @@ function loadFolderId(folderId) {
1454
1450
  /**
1455
1451
  * Call Tailor Platform API endpoints directly.
1456
1452
  * If the endpoint doesn't contain "/", it defaults to `tailor.v1.OperatorService/{endpoint}`.
1457
- * @param {ApiCallOptions} options - API call options (profile, endpoint, body)
1458
- * @returns {Promise<ApiCallResult>} Response status and data
1453
+ * @param options - API call options (profile, endpoint, body)
1454
+ * @returns Response status and data
1459
1455
  */
1460
1456
  async function apiCall(options) {
1461
1457
  const accessToken = await loadAccessToken({
@@ -1683,7 +1679,8 @@ const AuthConfigSchema = z.object({
1683
1679
  oauth2Clients: z.record(z.string(), OAuth2ClientSchema).optional(),
1684
1680
  idProvider: IdProviderSchema.optional(),
1685
1681
  scim: SCIMSchema.optional(),
1686
- tenantProvider: TenantProviderSchema.optional()
1682
+ tenantProvider: TenantProviderSchema.optional(),
1683
+ publishSessionEvents: z.boolean().optional()
1687
1684
  }).brand("AuthConfig");
1688
1685
 
1689
1686
  //#endregion
@@ -1751,8 +1748,8 @@ const DEFAULT_IGNORE_PATTERNS = ["**/*.test.ts", "**/*.spec.ts"];
1751
1748
  /**
1752
1749
  * Load files matching the given patterns, excluding files that match ignore patterns.
1753
1750
  * By default, test files (*.test.ts, *.spec.ts) are excluded unless ignores is explicitly specified.
1754
- * @param {FileLoadConfig} config - Configuration with files patterns and optional ignores patterns
1755
- * @returns {string[]} Array of absolute file paths
1751
+ * @param config - Configuration with files patterns and optional ignores patterns
1752
+ * @returns Array of absolute file paths
1756
1753
  */
1757
1754
  function loadFilesWithIgnores(config) {
1758
1755
  const ignorePatterns = config.ignores ?? DEFAULT_IGNORE_PATTERNS;
@@ -1986,8 +1983,8 @@ const tailorUserMap = `{ id: user.id, type: user.type, workspaceId: user.workspa
1986
1983
  * Convert a function to a string representation.
1987
1984
  * Handles method shorthand syntax (e.g., `create() { ... }`) by converting it to
1988
1985
  * a function expression (e.g., `function create() { ... }`).
1989
- * @param {(...args: unknown[]) => unknown} fn - Function to stringify
1990
- * @returns {string} Stringified function source
1986
+ * @param fn - Function to stringify
1987
+ * @returns Stringified function source
1991
1988
  */
1992
1989
  const stringifyFunction = (fn) => {
1993
1990
  const src = fn.toString().trim();
@@ -1996,8 +1993,8 @@ const stringifyFunction = (fn) => {
1996
1993
  };
1997
1994
  /**
1998
1995
  * Convert a hook function to a script expression.
1999
- * @param {NonNullable<Hook<unknown, unknown>["create"] | Hook<unknown, unknown>["update"]>} fn - Hook function
2000
- * @returns {string} JavaScript expression calling the hook
1996
+ * @param fn - Hook function
1997
+ * @returns JavaScript expression calling the hook
2001
1998
  */
2002
1999
  const convertHookToExpr = (fn) => {
2003
2000
  return `(${stringifyFunction(fn)})({ value: _value, data: _data, user: ${tailorUserMap} })`;
@@ -2005,8 +2002,8 @@ const convertHookToExpr = (fn) => {
2005
2002
  /**
2006
2003
  * Parse TailorDBField into OperatorFieldConfig.
2007
2004
  * This transforms user-defined functions into script expressions.
2008
- * @param {TailorAnyDBField} field - TailorDB field definition
2009
- * @returns {OperatorFieldConfig} Parsed operator field configuration
2005
+ * @param field - TailorDB field definition
2006
+ * @returns Parsed operator field configuration
2010
2007
  */
2011
2008
  function parseFieldConfig(field) {
2012
2009
  const metadata = field.metadata;
@@ -2078,8 +2075,8 @@ function isSingleArrayConditionFormat(cond) {
2078
2075
  * Normalize record-level permissions into a standard structure.
2079
2076
  * @template User
2080
2077
  * @template Type
2081
- * @param {TailorTypePermission<User, Type>} permission - Tailor type permission
2082
- * @returns {StandardTailorTypePermission} Normalized record permissions
2078
+ * @param permission - Tailor type permission
2079
+ * @returns Normalized record permissions
2083
2080
  */
2084
2081
  function normalizePermission(permission) {
2085
2082
  return Object.keys(permission).reduce((acc, action) => {
@@ -2089,8 +2086,8 @@ function normalizePermission(permission) {
2089
2086
  }
2090
2087
  /**
2091
2088
  * Normalize GraphQL permissions into a standard structure.
2092
- * @param {TailorTypeGqlPermission<unknown, unknown>} permission - Tailor GQL permission
2093
- * @returns {StandardTailorTypeGqlPermission} Normalized GQL permissions
2089
+ * @param permission - Tailor GQL permission
2090
+ * @returns Normalized GQL permissions
2094
2091
  */
2095
2092
  function normalizeGqlPermission(permission) {
2096
2093
  return permission.map((policy) => normalizeGqlPolicy(policy));
@@ -2106,8 +2103,8 @@ function normalizeGqlPolicy(policy) {
2106
2103
  /**
2107
2104
  * Parse raw permissions into normalized permissions.
2108
2105
  * This is the main entry point for permission parsing in the parser layer.
2109
- * @param {RawPermissions} rawPermissions - Raw permissions definition
2110
- * @returns {Permissions} Normalized permissions
2106
+ * @param rawPermissions - Raw permissions definition
2107
+ * @returns Normalized permissions
2111
2108
  */
2112
2109
  function parsePermissions(rawPermissions) {
2113
2110
  return {
@@ -2117,8 +2114,8 @@ function parsePermissions(rawPermissions) {
2117
2114
  }
2118
2115
  /**
2119
2116
  * Normalize a single action permission into the standard format.
2120
- * @param {unknown} permission - Raw permission definition
2121
- * @returns {StandardActionPermission} Normalized action permission
2117
+ * @param permission - Raw permission definition
2118
+ * @returns Normalized action permission
2122
2119
  */
2123
2120
  function normalizeActionPermission(permission) {
2124
2121
  if (isObjectFormat(permission)) {
@@ -2172,8 +2169,8 @@ function fieldRef(context) {
2172
2169
  }
2173
2170
  /**
2174
2171
  * Validate relation configuration.
2175
- * @param {RawRelationConfig} rawRelation - Raw relation configuration from TailorDB type definition
2176
- * @param {RelationProcessingContext} context - Context information for the relation (type name, field name, all type names)
2172
+ * @param rawRelation - Raw relation configuration from TailorDB type definition
2173
+ * @param context - Context information for the relation (type name, field name, all type names)
2177
2174
  */
2178
2175
  function validateRelationConfig(rawRelation, context) {
2179
2176
  if (!rawRelation.type) throw new Error(`${fieldRef(context)} has a relation but is missing the required 'type' property. Valid values: ${Object.keys(relationTypes).join(", ")}.`);
@@ -2182,10 +2179,10 @@ function validateRelationConfig(rawRelation, context) {
2182
2179
  }
2183
2180
  /**
2184
2181
  * Process raw relation config and compute derived metadata values.
2185
- * @param {RawRelationConfig} rawRelation - Raw relation configuration
2186
- * @param {RelationProcessingContext} context - Context information for the relation
2187
- * @param {boolean} [isArrayField=false] - Whether the target field is an array field
2188
- * @returns {ProcessedRelationMetadata} Computed relation metadata to apply to field config
2182
+ * @param rawRelation - Raw relation configuration
2183
+ * @param context - Context information for the relation
2184
+ * @param isArrayField - Whether the target field is an array field
2185
+ * @returns Computed relation metadata to apply to field config
2189
2186
  */
2190
2187
  function processRelationMetadata(rawRelation, context, isArrayField = false) {
2191
2188
  const isUnique = relationTypes[rawRelation.type] === "1-1";
@@ -2205,9 +2202,9 @@ function processRelationMetadata(rawRelation, context, isArrayField = false) {
2205
2202
  /**
2206
2203
  * Build relation info for creating forward/backward relationships.
2207
2204
  * Returns undefined for keyOnly relations.
2208
- * @param {RawRelationConfig} rawRelation - Raw relation configuration
2209
- * @param {RelationProcessingContext} context - Context information for the relation
2210
- * @returns {RelationInfo | undefined} Relation information or undefined for keyOnly relations
2205
+ * @param rawRelation - Raw relation configuration
2206
+ * @param context - Context information for the relation
2207
+ * @returns Relation information or undefined for keyOnly relations
2211
2208
  */
2212
2209
  function buildRelationInfo(rawRelation, context) {
2213
2210
  if (rawRelation.type === "keyOnly") return;
@@ -2227,9 +2224,9 @@ function buildRelationInfo(rawRelation, context) {
2227
2224
  }
2228
2225
  /**
2229
2226
  * Apply processed relation metadata to field config.
2230
- * @param {OperatorFieldConfig} fieldConfig - Original operator field configuration
2231
- * @param {ProcessedRelationMetadata} metadata - Processed relation metadata to apply
2232
- * @returns {OperatorFieldConfig} Field config with relation metadata applied
2227
+ * @param fieldConfig - Original operator field configuration
2228
+ * @param metadata - Processed relation metadata to apply
2229
+ * @returns Field config with relation metadata applied
2233
2230
  */
2234
2231
  function applyRelationMetadataToFieldConfig(fieldConfig, metadata) {
2235
2232
  return {
@@ -99013,9 +99010,8 @@ const eslintConfig = {
99013
99010
  };
99014
99011
  /**
99015
99012
  * Ensure that a TailorDB script expression does not reference external variables.
99016
- * @param {string} expr - JavaScript expression to validate
99017
- * @param {ScriptContext} ctx - Script context (type, field, kind)
99018
- * @returns {void}
99013
+ * @param expr - JavaScript expression to validate
99014
+ * @param ctx - Script context (type, field, kind)
99019
99015
  */
99020
99016
  function ensureNoExternalVariablesInScript(expr, ctx) {
99021
99017
  if (!expr.trim()) return;
@@ -99037,10 +99033,9 @@ function ensureNoExternalVariablesInScript(expr, ctx) {
99037
99033
  }
99038
99034
  /**
99039
99035
  * Ensure that TailorDB field scripts do not capture external variables.
99040
- * @param {string} typeName - TailorDB type name
99041
- * @param {string} fieldName - Field name
99042
- * @param {TailorDBFieldConfig} fieldConfig - Parsed field configuration
99043
- * @returns {void}
99036
+ * @param typeName - TailorDB type name
99037
+ * @param fieldName - Field name
99038
+ * @param fieldConfig - Parsed field configuration
99044
99039
  */
99045
99040
  function ensureNoExternalVariablesInFieldScripts(typeName, fieldName, fieldConfig) {
99046
99041
  for (const validateConfig of fieldConfig.validate ?? []) {
@@ -99068,10 +99063,10 @@ function ensureNoExternalVariablesInFieldScripts(typeName, fieldName, fieldConfi
99068
99063
  /**
99069
99064
  * Parse multiple TailorDB types, build relationships, and validate uniqueness.
99070
99065
  * This is the main entry point for parsing TailorDB types.
99071
- * @param {Record<string, TailorDBType>} rawTypes - Raw TailorDB types keyed by name
99072
- * @param {string} namespace - TailorDB namespace name
99073
- * @param {TypeSourceInfo} [typeSourceInfo] - Optional type source information
99074
- * @returns {Record<string, ParsedTailorDBType>} Parsed types
99066
+ * @param rawTypes - Raw TailorDB types keyed by name
99067
+ * @param namespace - TailorDB namespace name
99068
+ * @param typeSourceInfo - Optional type source information
99069
+ * @returns Parsed types
99075
99070
  */
99076
99071
  function parseTypes(rawTypes, namespace, typeSourceInfo) {
99077
99072
  const types$2 = {};
@@ -99083,10 +99078,10 @@ function parseTypes(rawTypes, namespace, typeSourceInfo) {
99083
99078
  }
99084
99079
  /**
99085
99080
  * Parse a TailorDBType into a ParsedTailorDBType.
99086
- * @param {TailorDBType} type - TailorDB type to parse
99087
- * @param {Set<string>} allTypeNames - Set of all TailorDB type names
99088
- * @param {Record<string, TailorDBType>} rawTypes - All raw TailorDB types keyed by name
99089
- * @returns {ParsedTailorDBType} Parsed TailorDB type
99081
+ * @param type - TailorDB type to parse
99082
+ * @param allTypeNames - Set of all TailorDB type names
99083
+ * @param rawTypes - All raw TailorDB types keyed by name
99084
+ * @returns Parsed TailorDB type
99090
99085
  */
99091
99086
  function parseTailorDBType(type, allTypeNames, rawTypes) {
99092
99087
  const metadata = type.metadata;
@@ -99144,10 +99139,9 @@ function parseTailorDBType(type, allTypeNames, rawTypes) {
99144
99139
  /**
99145
99140
  * Build backward relationships between parsed types.
99146
99141
  * Also validates that backward relation names are unique within each type.
99147
- * @param {Record<string, ParsedTailorDBType>} types - Parsed types
99148
- * @param {string} namespace - TailorDB namespace name
99149
- * @param {TypeSourceInfo} [typeSourceInfo] - Optional type source information
99150
- * @returns {void}
99142
+ * @param types - Parsed types
99143
+ * @param namespace - TailorDB namespace name
99144
+ * @param typeSourceInfo - Optional type source information
99151
99145
  */
99152
99146
  function buildBackwardRelationships(types$2, namespace, typeSourceInfo) {
99153
99147
  const backwardNameSources = {};
@@ -99207,10 +99201,9 @@ function buildBackwardRelationships(types$2, namespace, typeSourceInfo) {
99207
99201
  * Checks for:
99208
99202
  * 1. Each type's singular query name != plural query name
99209
99203
  * 2. No duplicate query names across all types
99210
- * @param {Record<string, ParsedTailorDBType>} types - Parsed types
99211
- * @param {string} namespace - TailorDB namespace name
99212
- * @param {TypeSourceInfo} [typeSourceInfo] - Optional type source information
99213
- * @returns {void}
99204
+ * @param types - Parsed types
99205
+ * @param namespace - TailorDB namespace name
99206
+ * @param typeSourceInfo - Optional type source information
99214
99207
  */
99215
99208
  function validatePluralFormUniqueness(types$2, namespace, typeSourceInfo) {
99216
99209
  const errors = [];
@@ -99468,8 +99461,8 @@ var Application = class {
99468
99461
  };
99469
99462
  /**
99470
99463
  * Define a Tailor application from the given configuration.
99471
- * @param {AppConfig} config - Application configuration object
99472
- * @returns {Application} Configured application instance
99464
+ * @param config - Application configuration object
99465
+ * @returns Configured application instance
99473
99466
  */
99474
99467
  function defineApplication(config) {
99475
99468
  const app = new Application(config.name, config);
@@ -99500,8 +99493,8 @@ const WorkflowSchema = z.object({
99500
99493
  /**
99501
99494
  * Load workflow files and collect all jobs in a single pass.
99502
99495
  * Dependencies are detected at bundle time via AST analysis.
99503
- * @param {WorkflowServiceConfig} config - Workflow service configuration
99504
- * @returns {Promise<WorkflowLoadResult>} Loaded workflows and collected jobs
99496
+ * @param config - Workflow service configuration
99497
+ * @returns Loaded workflows and collected jobs
99505
99498
  */
99506
99499
  async function loadAndCollectJobs(config) {
99507
99500
  const workflows = {};
@@ -99548,7 +99541,7 @@ async function loadAndCollectJobs(config) {
99548
99541
  }
99549
99542
  /**
99550
99543
  * Print workflow loading logs.
99551
- * @param {WorkflowLoadResult} result - Workflow load result to print
99544
+ * @param result - Workflow load result to print
99552
99545
  */
99553
99546
  function printLoadedWorkflows(result) {
99554
99547
  if (result.fileCount === 0) return;
@@ -99561,8 +99554,8 @@ function printLoadedWorkflows(result) {
99561
99554
  }
99562
99555
  /**
99563
99556
  * Load a single file and extract jobs and workflow
99564
- * @param {string} filePath - Path to the workflow file
99565
- * @returns {Promise<{ jobs: Array<{ name: string; exportName: string; sourceFile: string }>; workflow: Workflow | null }>} Extracted jobs and workflow
99557
+ * @param filePath - Path to the workflow file
99558
+ * @returns Extracted jobs and workflow
99566
99559
  */
99567
99560
  async function loadFileContent(filePath) {
99568
99561
  const jobs = [];
@@ -99597,8 +99590,8 @@ async function loadFileContent(filePath) {
99597
99590
  }
99598
99591
  /**
99599
99592
  * Check if a value is a WorkflowJob by looking for the brand symbol
99600
- * @param {unknown} value - Value to check
99601
- * @returns {boolean} True if the value is a branded WorkflowJob
99593
+ * @param value - Value to check
99594
+ * @returns True if the value is a branded WorkflowJob
99602
99595
  */
99603
99596
  function isWorkflowJob(value) {
99604
99597
  return value != null && typeof value === "object" && WORKFLOW_JOB_BRAND in value && value[WORKFLOW_JOB_BRAND] === true;
@@ -99612,16 +99605,16 @@ const enableInlineSourcemap = process.env.TAILOR_ENABLE_INLINE_SOURCEMAP === "tr
99612
99605
  //#region src/cli/bundler/workflow/ast-utils.ts
99613
99606
  /**
99614
99607
  * Check if a module source is from the Tailor SDK package (including subpaths)
99615
- * @param {string} source - Module source string
99616
- * @returns {boolean} True if the source is from the Tailor SDK package
99608
+ * @param source - Module source string
99609
+ * @returns True if the source is from the Tailor SDK package
99617
99610
  */
99618
99611
  function isTailorSdkSource(source) {
99619
99612
  return /^@tailor-platform\/sdk(\/|$)/.test(source);
99620
99613
  }
99621
99614
  /**
99622
99615
  * Get the source string from a dynamic import or require call
99623
- * @param {Expression | null | undefined} node - AST node to inspect
99624
- * @returns {string | null} Resolved import/require source string or null
99616
+ * @param node - AST node to inspect
99617
+ * @returns Resolved import/require source string or null
99625
99618
  */
99626
99619
  function getImportSource(node) {
99627
99620
  if (!node) return null;
@@ -99640,8 +99633,8 @@ function getImportSource(node) {
99640
99633
  }
99641
99634
  /**
99642
99635
  * Unwrap AwaitExpression to get the inner expression
99643
- * @param {Expression | null | undefined} node - AST expression node
99644
- * @returns {Expression | null | undefined} Inner expression if node is an AwaitExpression
99636
+ * @param node - AST expression node
99637
+ * @returns Inner expression if node is an AwaitExpression
99645
99638
  */
99646
99639
  function unwrapAwait(node) {
99647
99640
  if (node?.type === "AwaitExpression") return node.argument;
@@ -99649,25 +99642,25 @@ function unwrapAwait(node) {
99649
99642
  }
99650
99643
  /**
99651
99644
  * Check if a node is a string literal
99652
- * @param {Expression | null | undefined} node - AST expression node
99653
- * @returns {node is Expression & { type: "Literal"; value: string }} True if node is a string literal
99645
+ * @param node - AST expression node
99646
+ * @returns True if node is a string literal
99654
99647
  */
99655
99648
  function isStringLiteral(node) {
99656
99649
  return node?.type === "Literal" && typeof node.value === "string";
99657
99650
  }
99658
99651
  /**
99659
99652
  * Check if a node is a function expression (arrow or regular)
99660
- * @param {Expression | null | undefined} node - AST expression node
99661
- * @returns {node is ArrowFunctionExpression | FunctionExpression} True if node is a function expression
99653
+ * @param node - AST expression node
99654
+ * @returns True if node is a function expression
99662
99655
  */
99663
99656
  function isFunctionExpression(node) {
99664
99657
  return node?.type === "ArrowFunctionExpression" || node?.type === "FunctionExpression";
99665
99658
  }
99666
99659
  /**
99667
99660
  * Find a property in an object expression
99668
- * @param {ObjectPropertyKind[]} properties - Object properties to search
99669
- * @param {string} name - Property name to find
99670
- * @returns {FoundProperty | null} Found property info or null
99661
+ * @param properties - Object properties to search
99662
+ * @param name - Property name to find
99663
+ * @returns Found property info or null
99671
99664
  */
99672
99665
  function findProperty(properties, name$1) {
99673
99666
  for (const prop of properties) if (prop.type === "Property") {
@@ -99684,9 +99677,9 @@ function findProperty(properties, name$1) {
99684
99677
  /**
99685
99678
  * Apply string replacements to source code
99686
99679
  * Replacements are applied from end to start to maintain positions
99687
- * @param {string} source - Original source code
99688
- * @param {Replacement[]} replacements - Replacements to apply
99689
- * @returns {string} Transformed source code
99680
+ * @param source - Original source code
99681
+ * @param replacements - Replacements to apply
99682
+ * @returns Transformed source code
99690
99683
  */
99691
99684
  function applyReplacements(source, replacements) {
99692
99685
  const sorted = [...replacements].sort((a, b) => b.start - a.start);
@@ -99696,9 +99689,9 @@ function applyReplacements(source, replacements) {
99696
99689
  }
99697
99690
  /**
99698
99691
  * Find the end of a statement including any trailing newline
99699
- * @param {string} source - Source code
99700
- * @param {number} position - Start position of the statement
99701
- * @returns {number} Index of the end of the statement including trailing newline
99692
+ * @param source - Source code
99693
+ * @param position - Start position of the statement
99694
+ * @returns Index of the end of the statement including trailing newline
99702
99695
  */
99703
99696
  function findStatementEnd(source, position) {
99704
99697
  let i$1 = position;
@@ -99709,9 +99702,9 @@ function findStatementEnd(source, position) {
99709
99702
  /**
99710
99703
  * Resolve a relative path from a base directory
99711
99704
  * Simple implementation that handles ./ and ../ prefixes
99712
- * @param {string} baseDir - Base directory
99713
- * @param {string} relativePath - Relative path to resolve
99714
- * @returns {string} Resolved absolute path
99705
+ * @param baseDir - Base directory
99706
+ * @param relativePath - Relative path to resolve
99707
+ * @returns Resolved absolute path
99715
99708
  */
99716
99709
  function resolvePath(baseDir, relativePath) {
99717
99710
  const parts = relativePath.replace(/\\/g, "/").split("/");
@@ -99726,9 +99719,9 @@ function resolvePath(baseDir, relativePath) {
99726
99719
  /**
99727
99720
  * Collect all import bindings for a specific function from the Tailor SDK package
99728
99721
  * Returns a Set of local names that refer to the function
99729
- * @param {Program} program - Parsed TypeScript program
99730
- * @param {string} functionName - Function name to collect bindings for
99731
- * @returns {Set<string>} Set of local names bound to the SDK function
99722
+ * @param program - Parsed TypeScript program
99723
+ * @param functionName - Function name to collect bindings for
99724
+ * @returns Set of local names bound to the SDK function
99732
99725
  */
99733
99726
  function collectSdkBindings(program, functionName) {
99734
99727
  const bindings = /* @__PURE__ */ new Set();
@@ -99781,10 +99774,10 @@ function collectSdkBindings(program, functionName) {
99781
99774
  }
99782
99775
  /**
99783
99776
  * Check if a CallExpression is a call to a specific SDK function
99784
- * @param {ASTNode} node - AST node to inspect
99785
- * @param {Set<string>} bindings - Collected SDK bindings
99786
- * @param {string} functionName - SDK function name
99787
- * @returns {node is ASTNode & { type: "CallExpression" }} True if node is a call to the SDK function
99777
+ * @param node - AST node to inspect
99778
+ * @param bindings - Collected SDK bindings
99779
+ * @param functionName - SDK function name
99780
+ * @returns True if node is a call to the SDK function
99788
99781
  */
99789
99782
  function isSdkFunctionCall(node, bindings, functionName) {
99790
99783
  if (node.type !== "CallExpression") return false;
@@ -99807,10 +99800,10 @@ function isSdkFunctionCall(node, bindings, functionName) {
99807
99800
  //#endregion
99808
99801
  //#region src/cli/bundler/workflow/job-detector.ts
99809
99802
  /**
99810
- * Find all workflow jobs by detecting createWorkflowJob calls from \@tailor-platform/sdk
99811
- * @param {Program} program - Parsed TypeScript program
99812
- * @param {string} _sourceText - Source code text (currently unused)
99813
- * @returns {JobLocation[]} Detected job locations
99803
+ * Find all workflow jobs by detecting createWorkflowJob calls from @tailor-platform/sdk
99804
+ * @param program - Parsed TypeScript program
99805
+ * @param _sourceText - Source code text (currently unused)
99806
+ * @returns Detected job locations
99814
99807
  */
99815
99808
  function findAllJobs(program, _sourceText) {
99816
99809
  const jobs = [];
@@ -99865,8 +99858,8 @@ function findAllJobs(program, _sourceText) {
99865
99858
  }
99866
99859
  /**
99867
99860
  * Build a map from export name to job name from detected jobs
99868
- * @param {JobLocation[]} jobs - Detected job locations
99869
- * @returns {Map<string, string>} Map from export name to job name
99861
+ * @param jobs - Detected job locations
99862
+ * @returns Map from export name to job name
99870
99863
  */
99871
99864
  function buildJobNameMap(jobs) {
99872
99865
  const map = /* @__PURE__ */ new Map();
@@ -99876,9 +99869,9 @@ function buildJobNameMap(jobs) {
99876
99869
  /**
99877
99870
  * Detect all .trigger() calls in the source code
99878
99871
  * Returns information about each trigger call for transformation
99879
- * @param {Program} program - Parsed TypeScript program
99880
- * @param {string} sourceText - Source code text
99881
- * @returns {TriggerCall[]} Detected trigger calls
99872
+ * @param program - Parsed TypeScript program
99873
+ * @param sourceText - Source code text
99874
+ * @returns Detected trigger calls
99882
99875
  */
99883
99876
  function detectTriggerCalls(program, sourceText) {
99884
99877
  const calls = [];
@@ -99930,10 +99923,10 @@ function detectTriggerCalls(program, sourceText) {
99930
99923
  //#endregion
99931
99924
  //#region src/cli/bundler/workflow/workflow-detector.ts
99932
99925
  /**
99933
- * Find all workflows by detecting createWorkflow calls from \@tailor-platform/sdk
99934
- * @param {Program} program - Parsed TypeScript program
99935
- * @param {string} _sourceText - Source code text (currently unused)
99936
- * @returns {WorkflowLocation[]} Detected workflows
99926
+ * Find all workflows by detecting createWorkflow calls from @tailor-platform/sdk
99927
+ * @param program - Parsed TypeScript program
99928
+ * @param _sourceText - Source code text (currently unused)
99929
+ * @returns Detected workflows
99937
99930
  */
99938
99931
  function findAllWorkflows(program, _sourceText) {
99939
99932
  const workflows = [];
@@ -99979,8 +99972,8 @@ function findAllWorkflows(program, _sourceText) {
99979
99972
  }
99980
99973
  /**
99981
99974
  * Build a map from export name to workflow name from detected workflows
99982
- * @param {WorkflowLocation[]} workflows - Detected workflows
99983
- * @returns {Map<string, string>} Map from export name to workflow name
99975
+ * @param workflows - Detected workflows
99976
+ * @returns Map from export name to workflow name
99984
99977
  */
99985
99978
  function buildWorkflowNameMap(workflows) {
99986
99979
  const map = /* @__PURE__ */ new Map();
@@ -99989,8 +99982,8 @@ function buildWorkflowNameMap(workflows) {
99989
99982
  }
99990
99983
  /**
99991
99984
  * Detect default imports in a source file and return a map from local name to import source
99992
- * @param {Program} program - Parsed TypeScript program
99993
- * @returns {Map<string, string>} Map from local name to import source
99985
+ * @param program - Parsed TypeScript program
99986
+ * @returns Map from local name to import source
99994
99987
  */
99995
99988
  function detectDefaultImports(program) {
99996
99989
  const imports = /* @__PURE__ */ new Map();
@@ -100021,9 +100014,9 @@ function detectDefaultImports(program) {
100021
100014
  /**
100022
100015
  * Extract authInvoker info from a config object expression
100023
100016
  * Returns the authInvoker value text and whether it's a shorthand property
100024
- * @param {unknown} configArg - Config argument node
100025
- * @param {string} sourceText - Source code text
100026
- * @returns {AuthInvokerInfo | undefined} Extracted authInvoker info, if any
100017
+ * @param configArg - Config argument node
100018
+ * @param sourceText - Source code text
100019
+ * @returns Extracted authInvoker info, if any
100027
100020
  */
100028
100021
  function extractAuthInvokerInfo(configArg, sourceText) {
100029
100022
  if (!configArg || typeof configArg !== "object") return void 0;
@@ -100047,11 +100040,11 @@ function extractAuthInvokerInfo(configArg, sourceText) {
100047
100040
  /**
100048
100041
  * Detect .trigger() calls for known workflows and jobs
100049
100042
  * Only detects calls where the identifier is in workflowNames or jobNames
100050
- * @param {Program} program - The parsed AST program
100051
- * @param {string} sourceText - The source code text
100052
- * @param {Set<string>} workflowNames - Set of known workflow identifier names
100053
- * @param {Set<string>} jobNames - Set of known job identifier names
100054
- * @returns {ExtendedTriggerCall[]} Detected trigger call metadata
100043
+ * @param program - The parsed AST program
100044
+ * @param sourceText - The source code text
100045
+ * @param workflowNames - Set of known workflow identifier names
100046
+ * @param jobNames - Set of known job identifier names
100047
+ * @returns Detected trigger call metadata
100055
100048
  */
100056
100049
  function detectExtendedTriggerCalls(program, sourceText, workflowNames, jobNames) {
100057
100050
  const calls = [];
@@ -100118,12 +100111,12 @@ function detectExtendedTriggerCalls(program, sourceText, workflowNames, jobNames
100118
100111
  /**
100119
100112
  * Transform trigger calls for resolver/executor/workflow functions
100120
100113
  * Handles both job.trigger() and workflow.trigger() calls
100121
- * @param {string} source - The source code to transform
100122
- * @param {Map<string, string>} workflowNameMap - Map from variable name to workflow name
100123
- * @param {Map<string, string>} jobNameMap - Map from variable name to job name
100124
- * @param {Map<string, string>} [workflowFileMap] - Map from file path (without extension) to workflow name for default exports
100125
- * @param {string} [currentFilePath] - Path of the current file being transformed (for resolving relative imports)
100126
- * @returns {string} Transformed source code with trigger calls rewritten
100114
+ * @param source - The source code to transform
100115
+ * @param workflowNameMap - Map from variable name to workflow name
100116
+ * @param jobNameMap - Map from variable name to job name
100117
+ * @param workflowFileMap - Map from file path (without extension) to workflow name for default exports
100118
+ * @param currentFilePath - Path of the current file being transformed (for resolving relative imports)
100119
+ * @returns Transformed source code with trigger calls rewritten
100127
100120
  */
100128
100121
  function transformFunctionTriggers(source, workflowNameMap, jobNameMap, workflowFileMap, currentFilePath) {
100129
100122
  const { program } = parseSync("input.ts", source);
@@ -100170,8 +100163,8 @@ function transformFunctionTriggers(source, workflowNameMap, jobNameMap, workflow
100170
100163
  //#region src/cli/bundler/trigger-context.ts
100171
100164
  /**
100172
100165
  * Normalize a file path by removing extension and resolving to absolute path
100173
- * @param {string} filePath - File path to normalize
100174
- * @returns {string} Normalized absolute path without extension
100166
+ * @param filePath - File path to normalize
100167
+ * @returns Normalized absolute path without extension
100175
100168
  */
100176
100169
  function normalizeFilePath(filePath) {
100177
100170
  const absolutePath = path$20.resolve(filePath);
@@ -100181,8 +100174,8 @@ function normalizeFilePath(filePath) {
100181
100174
  /**
100182
100175
  * Build trigger context from workflow configuration
100183
100176
  * Scans workflow files to collect workflow and job mappings
100184
- * @param {FileLoadConfig | undefined} workflowConfig - Workflow file loading configuration
100185
- * @returns {Promise<TriggerContext>} Trigger context built from workflow sources
100177
+ * @param workflowConfig - Workflow file loading configuration
100178
+ * @returns Trigger context built from workflow sources
100186
100179
  */
100187
100180
  async function buildTriggerContext(workflowConfig) {
100188
100181
  const workflowNameMap = /* @__PURE__ */ new Map();
@@ -100220,8 +100213,8 @@ async function buildTriggerContext(workflowConfig) {
100220
100213
  /**
100221
100214
  * Create a rolldown plugin for transforming trigger calls
100222
100215
  * Returns undefined if no trigger context is provided
100223
- * @param {TriggerContext | undefined} triggerContext - Trigger context to use for transformations
100224
- * @returns {Plugin | undefined} Rolldown plugin or undefined when no context
100216
+ * @param triggerContext - Trigger context to use for transformations
100217
+ * @returns Rolldown plugin or undefined when no context
100225
100218
  */
100226
100219
  function createTriggerTransformPlugin(triggerContext) {
100227
100220
  if (!triggerContext) return;
@@ -100241,8 +100234,8 @@ function createTriggerTransformPlugin(triggerContext) {
100241
100234
  //#region src/cli/bundler/executor/loader.ts
100242
100235
  /**
100243
100236
  * Load and validate an executor definition from a file.
100244
- * @param {string} executorFilePath - Path to the executor file
100245
- * @returns {Promise<Executor | null>} Parsed executor or null if invalid
100237
+ * @param executorFilePath - Path to the executor file
100238
+ * @returns Parsed executor or null if invalid
100246
100239
  */
100247
100240
  async function loadExecutor(executorFilePath) {
100248
100241
  const executor = (await import(pathToFileURL(executorFilePath).href)).default;
@@ -100259,9 +100252,9 @@ async function loadExecutor(executorFilePath) {
100259
100252
  * This function:
100260
100253
  * 1. Creates entry file that extracts operation.body
100261
100254
  * 2. Bundles in a single step with tree-shaking
100262
- * @param {FileLoadConfig} config - Executor file loading configuration
100263
- * @param {TriggerContext} [triggerContext] - Trigger context for workflow/job transformations
100264
- * @returns {Promise<void>} Promise that resolves when bundling completes
100255
+ * @param config - Executor file loading configuration
100256
+ * @param triggerContext - Trigger context for workflow/job transformations
100257
+ * @returns Promise that resolves when bundling completes
100265
100258
  */
100266
100259
  async function bundleExecutors(config, triggerContext) {
100267
100260
  const files = loadFilesWithIgnores(config);
@@ -100339,8 +100332,8 @@ async function bundleSingleExecutor(executor, outputDir, tsconfig, triggerContex
100339
100332
  //#region src/cli/bundler/resolver/loader.ts
100340
100333
  /**
100341
100334
  * Load and validate a resolver definition from a file.
100342
- * @param {string} resolverFilePath - Path to the resolver file
100343
- * @returns {Promise<Resolver | null>} Parsed resolver or null if invalid
100335
+ * @param resolverFilePath - Path to the resolver file
100336
+ * @returns Parsed resolver or null if invalid
100344
100337
  */
100345
100338
  async function loadResolver(resolverFilePath) {
100346
100339
  const resolver = (await import(pathToFileURL(resolverFilePath).href)).default;
@@ -100358,10 +100351,10 @@ async function loadResolver(resolverFilePath) {
100358
100351
  * 1. Uses a transform plugin to add validation wrapper during bundling
100359
100352
  * 2. Creates entry file
100360
100353
  * 3. Bundles in a single step with tree-shaking
100361
- * @param {string} namespace - Resolver namespace name
100362
- * @param {FileLoadConfig} config - Resolver file loading configuration
100363
- * @param {TriggerContext} [triggerContext] - Trigger context for workflow/job transformations
100364
- * @returns {Promise<void>} Promise that resolves when bundling completes
100354
+ * @param namespace - Resolver namespace name
100355
+ * @param config - Resolver file loading configuration
100356
+ * @param triggerContext - Trigger context for workflow/job transformations
100357
+ * @returns Promise that resolves when bundling completes
100365
100358
  */
100366
100359
  async function bundleResolvers(namespace, config, triggerContext) {
100367
100360
  const files = loadFilesWithIgnores(config);
@@ -100453,8 +100446,8 @@ async function bundleSingleResolver(resolver, outputDir, tsconfig, triggerContex
100453
100446
  /**
100454
100447
  * Find variable declarations by export names
100455
100448
  * Returns a map of export name to statement range
100456
- * @param {Program} program - Parsed TypeScript program
100457
- * @returns {Map<string, { start: number; end: number }>} Map of export name to statement range
100449
+ * @param program - Parsed TypeScript program
100450
+ * @returns Map of export name to statement range
100458
100451
  */
100459
100452
  function findVariableDeclarationsByName(program) {
100460
100453
  const declarations = /* @__PURE__ */ new Map();
@@ -100493,8 +100486,8 @@ function findVariableDeclarationsByName(program) {
100493
100486
  /**
100494
100487
  * Find createWorkflow default export declarations
100495
100488
  * Returns the range of the export statement to remove
100496
- * @param {Program} program - Parsed TypeScript program
100497
- * @returns {{ start: number; end: number } | null} Range of the default export statement or null
100489
+ * @param program - Parsed TypeScript program
100490
+ * @returns Range of the default export statement or null
100498
100491
  */
100499
100492
  function findWorkflowDefaultExport(program) {
100500
100493
  const bindings = collectSdkBindings(program, "createWorkflow");
@@ -100516,12 +100509,12 @@ function findWorkflowDefaultExport(program) {
100516
100509
  * Transform workflow source code
100517
100510
  * - Transform .trigger() calls to tailor.workflow.triggerJobFunction()
100518
100511
  * - Other jobs: remove entire variable declaration
100519
- * @param {string} source - The source code to transform
100520
- * @param {string} targetJobName - The name of the target job (from job config)
100521
- * @param {string} [targetJobExportName] - The export name of the target job (optional, for enhanced detection)
100522
- * @param {string[]} [otherJobExportNames] - Export names of other jobs to remove (optional, for enhanced detection)
100523
- * @param {Map<string, string>} [allJobsMap] - Map from export name to job name for trigger transformation (optional)
100524
- * @returns {string} Transformed workflow source code
100512
+ * @param source - The source code to transform
100513
+ * @param targetJobName - The name of the target job (from job config)
100514
+ * @param targetJobExportName - The export name of the target job (optional, for enhanced detection)
100515
+ * @param otherJobExportNames - Export names of other jobs to remove (optional, for enhanced detection)
100516
+ * @param allJobsMap - Map from export name to job name for trigger transformation (optional)
100517
+ * @returns Transformed workflow source code
100525
100518
  */
100526
100519
  function transformWorkflowSource(source, targetJobName, targetJobExportName, otherJobExportNames, allJobsMap) {
100527
100520
  const { program } = parseSync("input.ts", source);
@@ -100611,11 +100604,11 @@ function transformWorkflowSource(source, targetJobName, targetJobExportName, oth
100611
100604
  * 3. Creates entry file and bundles with tree-shaking
100612
100605
  *
100613
100606
  * Returns metadata about which jobs each workflow uses.
100614
- * @param {JobInfo[]} allJobs - All available job infos
100615
- * @param {string[]} mainJobNames - Names of main jobs
100616
- * @param {Record<string, string | number | boolean>} [env={}] - Environment variables to inject
100617
- * @param {TriggerContext} [triggerContext] - Trigger context for transformations
100618
- * @returns {Promise<BundleWorkflowJobsResult>} Workflow job bundling result
100607
+ * @param allJobs - All available job infos
100608
+ * @param mainJobNames - Names of main jobs
100609
+ * @param env - Environment variables to inject
100610
+ * @param triggerContext - Trigger context for transformations
100611
+ * @returns Workflow job bundling result
100619
100612
  */
100620
100613
  async function bundleWorkflowJobs(allJobs, mainJobNames, env = {}, triggerContext) {
100621
100614
  if (allJobs.length === 0) {
@@ -100645,9 +100638,9 @@ async function bundleWorkflowJobs(allJobs, mainJobNames, env = {}, triggerContex
100645
100638
  * - It's called via .trigger() from another used job (transitively)
100646
100639
  *
100647
100640
  * Also returns a map of mainJob -> all jobs it depends on (for metadata).
100648
- * @param {JobInfo[]} allJobs - All available job infos
100649
- * @param {string[]} mainJobNames - Names of main jobs
100650
- * @returns {Promise<FilterUsedJobsResult>} Used jobs and main job dependency map
100641
+ * @param allJobs - All available job infos
100642
+ * @param mainJobNames - Names of main jobs
100643
+ * @returns Used jobs and main job dependency map
100651
100644
  */
100652
100645
  async function filterUsedJobs(allJobs, mainJobNames) {
100653
100646
  if (allJobs.length === 0 || mainJobNames.length === 0) return {
@@ -100792,8 +100785,8 @@ const BaseGeneratorConfigSchema = z.union([
100792
100785
  ]);
100793
100786
  /**
100794
100787
  * Creates a GeneratorConfigSchema with built-in generator support
100795
- * @param {Map<string, (options: unknown) => CodeGeneratorBase>} builtinGenerators - Map of generator IDs to their constructor functions
100796
- * @returns {z.ZodEffects<z.ZodUnion<[typeof KyselyTypeConfigSchema, typeof SeedConfigSchema, typeof EnumConstantsConfigSchema, typeof FileUtilsConfigSchema, typeof CodeGeneratorSchema]>, CodeGeneratorBase, unknown> | z.ZodUnion<[typeof KyselyTypeConfigSchema, typeof SeedConfigSchema, typeof EnumConstantsConfigSchema, typeof FileUtilsConfigSchema, typeof CodeGeneratorSchema]>} Generator config schema
100788
+ * @param builtinGenerators - Map of generator IDs to their constructor functions
100789
+ * @returns Generator config schema
100797
100790
  */
100798
100791
  function createGeneratorConfigSchema(builtinGenerators$1) {
100799
100792
  return z.union([
@@ -100818,10 +100811,9 @@ function createGeneratorConfigSchema(builtinGenerators$1) {
100818
100811
  /**
100819
100812
  * Type guard to check if a generator has a specific dependency.
100820
100813
  * @template D
100821
- * @param {{ dependencies: readonly DependencyKind[] }} generator - Code generator instance
100822
- * @param {readonly DependencyKind[]} generator.dependencies - Generator dependencies
100823
- * @param {D} dependency - Dependency kind to check
100824
- * @returns {boolean} True if the generator has the dependency
100814
+ * @param generator - Code generator instance
100815
+ * @param dependency - Dependency kind to check
100816
+ * @returns True if the generator has the dependency
100825
100817
  */
100826
100818
  function hasDependency(generator, dependency) {
100827
100819
  return generator.dependencies.includes(dependency);
@@ -100867,8 +100859,8 @@ var EnumProcessor = class {
100867
100859
  }
100868
100860
  /**
100869
100861
  * Generate enum constant definitions from collected metadata.
100870
- * @param {EnumDefinition[]} allEnums - All collected enum definitions
100871
- * @returns {string} Generated enum constant definitions
100862
+ * @param allEnums - All collected enum definitions
100863
+ * @returns Generated enum constant definitions
100872
100864
  */
100873
100865
  static generateUnifiedEnumConstants(allEnums) {
100874
100866
  if (allEnums.length === 0) return "";
@@ -101080,8 +101072,8 @@ var FileUtilsGenerator = class {
101080
101072
  var TypeProcessor = class {
101081
101073
  /**
101082
101074
  * Convert a ParsedTailorDBType into KyselyTypeMetadata.
101083
- * @param {ParsedTailorDBType} type - Parsed TailorDB type
101084
- * @returns {Promise<KyselyTypeMetadata>} Generated Kysely type metadata
101075
+ * @param type - Parsed TailorDB type
101076
+ * @returns Generated Kysely type metadata
101085
101077
  */
101086
101078
  static async processType(type) {
101087
101079
  const result = this.generateTableInterface(type);
@@ -101093,8 +101085,8 @@ var TypeProcessor = class {
101093
101085
  }
101094
101086
  /**
101095
101087
  * Generate the table interface.
101096
- * @param {ParsedTailorDBType} type - Parsed TailorDB type
101097
- * @returns {{ typeDef: string; usedUtilityTypes: { Timestamp: boolean; Serial: boolean } }} Table interface code and used utility types
101088
+ * @param type - Parsed TailorDB type
101089
+ * @returns Table interface code and used utility types
101098
101090
  */
101099
101091
  static generateTableInterface(type) {
101100
101092
  const fieldResults = Object.entries(type.fields).filter(([fieldName]) => fieldName !== "id").map(([fieldName, parsedField]) => ({
@@ -101120,8 +101112,8 @@ var TypeProcessor = class {
101120
101112
  }
101121
101113
  /**
101122
101114
  * Generate the complete field type including array and null modifiers.
101123
- * @param {OperatorFieldConfig} fieldConfig - Parsed field configuration
101124
- * @returns {{ type: string; usedUtilityTypes: { Timestamp: boolean; Serial: boolean } }} Field type and used utility types
101115
+ * @param fieldConfig - Parsed field configuration
101116
+ * @returns Field type and used utility types
101125
101117
  */
101126
101118
  static generateFieldType(fieldConfig) {
101127
101119
  const baseTypeResult = this.getBaseType(fieldConfig);
@@ -101143,8 +101135,8 @@ var TypeProcessor = class {
101143
101135
  }
101144
101136
  /**
101145
101137
  * Get the base Kysely type for a field (without array/null modifiers).
101146
- * @param {OperatorFieldConfig} fieldConfig - Parsed field configuration
101147
- * @returns {{ type: string; usedUtilityTypes: { Timestamp: boolean; Serial: boolean } }} Base field type and used utility types
101138
+ * @param fieldConfig - Parsed field configuration
101139
+ * @returns Base field type and used utility types
101148
101140
  */
101149
101141
  static getBaseType(fieldConfig) {
101150
101142
  const fieldType = fieldConfig.type;
@@ -101186,8 +101178,8 @@ var TypeProcessor = class {
101186
101178
  }
101187
101179
  /**
101188
101180
  * Get the enum type definition.
101189
- * @param {OperatorFieldConfig} fieldConfig - Parsed field configuration
101190
- * @returns {string} Enum type definition
101181
+ * @param fieldConfig - Parsed field configuration
101182
+ * @returns Enum type definition
101191
101183
  */
101192
101184
  static getEnumType(fieldConfig) {
101193
101185
  const allowedValues = fieldConfig.allowedValues;
@@ -101198,8 +101190,8 @@ var TypeProcessor = class {
101198
101190
  }
101199
101191
  /**
101200
101192
  * Get the nested object type definition.
101201
- * @param {OperatorFieldConfig} fieldConfig - Parsed field configuration
101202
- * @returns {{ type: string; usedUtilityTypes: { Timestamp: boolean; Serial: boolean } }} Nested object type and used utility types
101193
+ * @param fieldConfig - Parsed field configuration
101194
+ * @returns Nested object type and used utility types
101203
101195
  */
101204
101196
  static getNestedType(fieldConfig) {
101205
101197
  const fields = fieldConfig.fields;
@@ -101229,8 +101221,8 @@ var TypeProcessor = class {
101229
101221
  }
101230
101222
  /**
101231
101223
  * Generate unified types file from multiple namespaces.
101232
- * @param {KyselyNamespaceMetadata[]} namespaceData - Namespace metadata
101233
- * @returns {string} Generated types file contents
101224
+ * @param namespaceData - Namespace metadata
101225
+ * @returns Generated types file contents
101234
101226
  */
101235
101227
  static generateUnifiedTypes(namespaceData) {
101236
101228
  if (namespaceData.length === 0) return "";
@@ -101329,10 +101321,11 @@ var KyselyGenerator = class {
101329
101321
  //#region src/cli/generator/builtin/seed/gql-ingest-processor.ts
101330
101322
  /**
101331
101323
  * Processes TailorDB types to generate GraphQL Ingest metadata
101332
- * @param {ParsedTailorDBType} type - Parsed TailorDB type
101333
- * @returns {GqlIngestMetadata} Generated GraphQL Ingest metadata
101324
+ * @param type - Parsed TailorDB type
101325
+ * @param namespace - Namespace of the type
101326
+ * @returns Generated GraphQL Ingest metadata
101334
101327
  */
101335
- function processGqlIngest(type) {
101328
+ function processGqlIngest(type, namespace) {
101336
101329
  const dependencies = Array.from(Object.values(type.fields).reduce((set$1, field) => {
101337
101330
  if (field.relation?.targetType && field.relation.targetType !== type.name) set$1.add(field.relation.targetType);
101338
101331
  return set$1;
@@ -101345,6 +101338,7 @@ function processGqlIngest(type) {
101345
101338
  `;
101346
101339
  return {
101347
101340
  name: type.name,
101341
+ namespace,
101348
101342
  dependencies,
101349
101343
  mapping: {
101350
101344
  dataFile: `data/${type.name}.jsonl`,
@@ -101360,8 +101354,8 @@ function processGqlIngest(type) {
101360
101354
  //#region src/cli/generator/builtin/seed/idp-user-processor.ts
101361
101355
  /**
101362
101356
  * Processes auth configuration to generate IdP user seed metadata
101363
- * @param {GeneratorAuthInput} auth - Auth configuration from generator
101364
- * @returns {IdpUserMetadata | undefined} IdP user metadata or undefined if not applicable
101357
+ * @param auth - Auth configuration from generator
101358
+ * @returns IdP user metadata or undefined if not applicable
101365
101359
  */
101366
101360
  function processIdpUser(auth) {
101367
101361
  if (auth.idProvider?.kind !== "BuiltInIdP" || !auth.userProfile) return;
@@ -101389,9 +101383,9 @@ function processIdpUser(auth) {
101389
101383
  }
101390
101384
  /**
101391
101385
  * Generates the schema file content for IdP users with foreign key
101392
- * @param {string} usernameField - Username field name
101393
- * @param {string} userTypeName - TailorDB user type name
101394
- * @returns {string} Schema file contents
101386
+ * @param usernameField - Username field name
101387
+ * @param userTypeName - TailorDB user type name
101388
+ * @returns Schema file contents
101395
101389
  */
101396
101390
  function generateIdpUserSchemaFile(usernameField, userTypeName) {
101397
101391
  return ml`
@@ -101433,11 +101427,9 @@ function generateIdpUserSchemaFile(usernameField, userTypeName) {
101433
101427
  //#region src/cli/generator/builtin/seed/lines-db-processor.ts
101434
101428
  /**
101435
101429
  * Processes TailorDB types to generate lines-db metadata
101436
- * @param {ParsedTailorDBType} type - Parsed TailorDB type
101437
- * @param {{ filePath: string; exportName: string }} source - Source file info
101438
- * @param {string} source.filePath - Source file path
101439
- * @param {string} source.exportName - Source export name
101440
- * @returns {LinesDbMetadata} Generated lines-db metadata
101430
+ * @param type - Parsed TailorDB type
101431
+ * @param source - Source file info
101432
+ * @returns Generated lines-db metadata
101441
101433
  */
101442
101434
  function processLinesDb(type, source) {
101443
101435
  if (!source.filePath || !source.exportName) throw new Error(`Missing source info for type ${type.name}`);
@@ -101478,9 +101470,9 @@ function processLinesDb(type, source) {
101478
101470
  }
101479
101471
  /**
101480
101472
  * Generates the schema file content for lines-db
101481
- * @param {LinesDbMetadata} metadata - lines-db metadata
101482
- * @param {string} importPath - Import path for the TailorDB type
101483
- * @returns {string} Schema file contents
101473
+ * @param metadata - lines-db metadata
101474
+ * @param importPath - Import path for the TailorDB type
101475
+ * @returns Schema file contents
101484
101476
  */
101485
101477
  function generateLinesDbSchemaFile(metadata, importPath) {
101486
101478
  const { exportName, optionalFields, omitFields, foreignKeys, indexes } = metadata;
@@ -101530,40 +101522,249 @@ function generateLinesDbSchemaFile(metadata, importPath) {
101530
101522
  //#region src/cli/generator/builtin/seed/index.ts
101531
101523
  const SeedGeneratorID = "@tailor-platform/seed";
101532
101524
  /**
101533
- * Generates the exec.mjs script content (Node.js executable)
101534
- * @param {string} machineUserName - Machine user name for token retrieval
101535
- * @param {string} relativeConfigPath - Config path relative to exec script
101536
- * @returns {string} exec.mjs file contents
101525
+ * Generates the exec.mjs script content (Node.js executable) using gql-ingest Programmatic API
101526
+ * @param machineUserName - Machine user name for token retrieval
101527
+ * @param relativeConfigPath - Config path relative to exec script
101528
+ * @param entityDependencies - Entity dependencies mapping
101529
+ * @returns exec.mjs file contents
101537
101530
  */
101538
- function generateExecScript(machineUserName, relativeConfigPath) {
101531
+ function generateExecScript(machineUserName, relativeConfigPath, entityDependencies) {
101532
+ const namespaceMap = /* @__PURE__ */ new Map();
101533
+ for (const [type, meta] of Object.entries(entityDependencies)) if (meta.namespace) {
101534
+ if (!namespaceMap.has(meta.namespace)) namespaceMap.set(meta.namespace, []);
101535
+ namespaceMap.get(meta.namespace).push(type);
101536
+ }
101539
101537
  return ml`
101540
- import { execSync } from "node:child_process";
101538
+ import { GQLIngest } from "@jackchuka/gql-ingest";
101541
101539
  import { join } from "node:path";
101542
- import { show, getMachineUserToken } from "@tailor-platform/sdk/cli";
101540
+ import { parseArgs, styleText } from "node:util";
101541
+ import { createInterface } from "node:readline";
101542
+ import { show, getMachineUserToken, truncate } from "@tailor-platform/sdk/cli";
101543
+
101544
+ // Parse command-line arguments
101545
+ const { values, positionals } = parseArgs({
101546
+ options: {
101547
+ namespace: { type: "string", short: "n" },
101548
+ "skip-idp": { type: "boolean", default: false },
101549
+ truncate: { type: "boolean", default: false },
101550
+ yes: { type: "boolean", default: false },
101551
+ help: { type: "boolean", short: "h", default: false },
101552
+ },
101553
+ allowPositionals: true,
101554
+ });
101555
+
101556
+ if (values.help) {
101557
+ console.log(\`
101558
+ Usage: node exec.mjs [options] [types...]
101559
+
101560
+ Options:
101561
+ -n, --namespace <ns> Process all types in specified namespace (excludes _User)
101562
+ --skip-idp Skip IdP user (_User) entity
101563
+ --truncate Truncate tables before seeding
101564
+ --yes Skip confirmation prompts (for truncate)
101565
+ -h, --help Show help
101566
+
101567
+ Examples:
101568
+ node exec.mjs # Process all types (default)
101569
+ node exec.mjs --namespace <namespace> # Process tailordb namespace only (no _User)
101570
+ node exec.mjs User Order # Process specific types only
101571
+ node exec.mjs --skip-idp # Process all except _User
101572
+ node exec.mjs --truncate # Truncate all tables, then seed all
101573
+ node exec.mjs --truncate --yes # Truncate all tables without confirmation, then seed all
101574
+ node exec.mjs --truncate --namespace <namespace> # Truncate tailordb, then seed tailordb
101575
+ node exec.mjs --truncate User Order # Truncate User and Order, then seed them
101576
+ \`);
101577
+ process.exit(0);
101578
+ }
101579
+
101580
+ // Helper function to prompt for y/n confirmation
101581
+ const promptConfirmation = (question) => {
101582
+ const rl = createInterface({
101583
+ input: process.stdin,
101584
+ output: process.stdout,
101585
+ });
101586
+
101587
+ return new Promise((resolve) => {
101588
+ rl.question(styleText("yellow", question), (answer) => {
101589
+ rl.close();
101590
+ resolve(answer.toLowerCase().trim());
101591
+ });
101592
+ });
101593
+ };
101543
101594
 
101544
101595
  const configDir = import.meta.dirname;
101545
101596
  const configPath = join(configDir, "${relativeConfigPath}");
101546
101597
 
101547
- console.log("Starting seed data generation...");
101598
+ console.log(styleText("cyan", "Starting seed data generation..."));
101599
+
101600
+ // Entity configuration
101601
+ const namespaceEntities = {
101602
+ ${Array.from(namespaceMap.entries()).map(([namespace, entities]) => {
101603
+ return ` ${namespace}: [\n${entities.map((e) => ` "${e}",`).join("\n")}\n ]`;
101604
+ }).join(",\n")}
101605
+ };
101606
+ const entities = Object.values(namespaceEntities).flat();
101607
+
101608
+ // Determine which entities to process
101609
+ let entitiesToProcess = null;
101610
+
101611
+ const hasNamespace = !!values.namespace;
101612
+ const hasTypes = positionals.length > 0;
101613
+ const skipIdp = values["skip-idp"];
101614
+
101615
+ // Validate mutually exclusive options
101616
+ const optionCount = [hasNamespace, hasTypes].filter(Boolean).length;
101617
+ if (optionCount > 1) {
101618
+ console.error(styleText("red", "Error: Options --namespace and type names are mutually exclusive."));
101619
+ process.exit(1);
101620
+ }
101621
+
101622
+ // --skip-idp and --namespace are redundant (namespace already excludes _User)
101623
+ if (skipIdp && hasNamespace) {
101624
+ console.warn(styleText("yellow", "Warning: --skip-idp is redundant with --namespace (namespace filtering already excludes _User)."));
101625
+ }
101626
+
101627
+ // Filter by namespace (automatically excludes _User as it has no namespace)
101628
+ if (hasNamespace) {
101629
+ const namespace = values.namespace;
101630
+ entitiesToProcess = namespaceEntities[namespace];
101631
+
101632
+ if (!entitiesToProcess || entitiesToProcess.length === 0) {
101633
+ console.error(styleText("red", \`Error: No entities found in namespace "\${namespace}"\`));
101634
+ console.error(styleText("yellow", \`Available namespaces: \${Object.keys(namespaceEntities).join(", ")}\`));
101635
+ process.exit(1);
101636
+ }
101637
+
101638
+ console.log(styleText("cyan", \`Filtering by namespace: \${namespace}\`));
101639
+ console.log(styleText("dim", \`Entities: \${entitiesToProcess.join(", ")}\`));
101640
+ }
101641
+
101642
+ // Filter by specific types
101643
+ if (hasTypes) {
101644
+ const requestedTypes = positionals;
101645
+ const notFoundTypes = [];
101646
+
101647
+ entitiesToProcess = requestedTypes.filter((type) => {
101648
+ if (!entities.includes(type)) {
101649
+ notFoundTypes.push(type);
101650
+ return false;
101651
+ }
101652
+ return true;
101653
+ });
101654
+
101655
+ if (notFoundTypes.length > 0) {
101656
+ console.error(styleText("red", \`Error: The following types were not found: \${notFoundTypes.join(", ")}\`));
101657
+ console.error(styleText("yellow", \`Available types: \${entities.join(", ")}\`));
101658
+ process.exit(1);
101659
+ }
101660
+
101661
+ console.log(styleText("cyan", \`Filtering by types: \${entitiesToProcess.join(", ")}\`));
101662
+ }
101663
+
101664
+ // Apply --skip-idp filter
101665
+ if (skipIdp) {
101666
+ if (entitiesToProcess) {
101667
+ // Filter out _User from already filtered list
101668
+ entitiesToProcess = entitiesToProcess.filter((entity) => entity !== "_User");
101669
+ } else {
101670
+ // Get all entities except _User
101671
+ entitiesToProcess = entities.filter((entity) => entity !== "_User");
101672
+ }
101673
+ console.log(styleText("dim", \`Skipping IdP user (_User)\`));
101674
+ }
101675
+
101676
+ // Truncate tables if requested
101677
+ // Note: --skip-idp only affects seeding, not truncation
101678
+ if (values.truncate) {
101679
+ // Prompt user for confirmation
101680
+ const answer = values.yes ? "y" : await promptConfirmation("Are you sure you want to truncate? (y/n): ");
101681
+ if (answer !== "y") {
101682
+ console.log(styleText("yellow", "Truncate cancelled."));
101683
+ process.exit(0);
101684
+ }
101548
101685
 
101686
+ console.log(styleText("cyan", "\\nTruncating tables..."));
101687
+
101688
+ try {
101689
+ if (hasNamespace) {
101690
+ // Truncate specific namespace
101691
+ await truncate({
101692
+ configPath,
101693
+ namespace: values.namespace,
101694
+ });
101695
+ } else if (hasTypes) {
101696
+ // Truncate specific types
101697
+ await truncate({
101698
+ configPath,
101699
+ types: entitiesToProcess,
101700
+ });
101701
+ } else {
101702
+ // Truncate all (--skip-idp does not affect truncation)
101703
+ await truncate({
101704
+ configPath,
101705
+ all: true,
101706
+ });
101707
+ }
101708
+ console.log(styleText("green", "Truncate completed.\\n"));
101709
+ } catch (error) {
101710
+ console.error(styleText("red", \`Truncate failed: \${error.message}\`));
101711
+ process.exit(1);
101712
+ }
101713
+ }
101714
+
101715
+ // Get application info and endpoint
101549
101716
  const appInfo = await show({ configPath });
101550
101717
  const endpoint = \`\${appInfo.url}/query\`;
101551
101718
 
101719
+ // Get machine user token
101552
101720
  const tokenInfo = await getMachineUserToken({ name: "${machineUserName}", configPath });
101553
- const headers = JSON.stringify({ Authorization: \`Bearer \${tokenInfo.accessToken}\` });
101554
101721
 
101555
- const headersArg = process.platform === "win32"
101556
- ? \`"\${headers.replace(/"/g, '\\\\"')}"\`
101557
- : \`'\${headers}'\`;
101722
+ // Initialize GQLIngest client
101723
+ const client = new GQLIngest({
101724
+ endpoint,
101725
+ headers: {
101726
+ Authorization: \`Bearer \${tokenInfo.accessToken}\`,
101727
+ },
101728
+ });
101729
+
101730
+ // Progress monitoring event handlers
101731
+ client.on("started", (payload) => {
101732
+ console.log(styleText("cyan", \`Processing \${payload.totalEntities} entities...\`));
101733
+ });
101734
+
101735
+ client.on("entityStart", (payload) => {
101736
+ console.log(styleText("dim", \` Processing \${payload.entityName}...\`));
101737
+ });
101738
+
101739
+ client.on("entityComplete", (payload) => {
101740
+ const { entityName, metrics: { rowsProcessed } } = payload;
101741
+ console.log(styleText("green", \` ✓ \${entityName}: \${rowsProcessed} rows processed\`));
101742
+ });
101558
101743
 
101559
- const cmd = \`npx gql-ingest -c "\${configDir}" -e "\${endpoint}" --headers \${headersArg}\`;
101560
- console.log("Running:", cmd);
101744
+ client.on("rowFailure", (payload) => {
101745
+ console.error(styleText("red", \` ✗ Row \${payload.rowIndex} in \${payload.entityName} failed: \${payload.error.message}\`));
101746
+ });
101561
101747
 
101748
+ // Run ingestion
101562
101749
  try {
101563
- execSync(cmd, { stdio: "inherit" });
101750
+ let result;
101751
+ if (entitiesToProcess && entitiesToProcess.length > 0) {
101752
+ result = await client.ingestEntities(configDir, entitiesToProcess);
101753
+ } else {
101754
+ result = await client.ingest(configDir);
101755
+ }
101756
+
101757
+ if (result.success) {
101758
+ console.log(styleText("green", "\\n✓ Seed data generation completed successfully"));
101759
+ console.log(client.getMetricsSummary());
101760
+ } else {
101761
+ console.error(styleText("red", "\\n✗ Seed data generation failed"));
101762
+ console.error(client.getMetricsSummary());
101763
+ process.exit(1);
101764
+ }
101564
101765
  } catch (error) {
101565
- console.error("Seed failed with exit code:", error.status);
101566
- process.exit(error.status ?? 1);
101766
+ console.error(styleText("red", \`\\n✗ Seed data generation failed with error: \${error.message}\`));
101767
+ process.exit(1);
101567
101768
  }
101568
101769
 
101569
101770
  `;
@@ -101571,19 +101772,17 @@ function generateExecScript(machineUserName, relativeConfigPath) {
101571
101772
  /**
101572
101773
  * Factory function to create a Seed generator.
101573
101774
  * Combines GraphQL Ingest and lines-db schema generation.
101574
- * @param {{ distPath: string; machineUserName?: string }} options - Seed generator options
101575
- * @param {string} options.distPath - Output directory for generated files
101576
- * @param {string} [options.machineUserName] - Machine user name for seeding
101577
- * @returns {TailorDBGenerator<SeedTypeMetadata, Record<string, SeedTypeMetadata>>} Seed generator
101775
+ * @param options - Seed generator options
101776
+ * @returns Seed generator
101578
101777
  */
101579
101778
  function createSeedGenerator(options) {
101580
101779
  return {
101581
101780
  id: SeedGeneratorID,
101582
101781
  description: "Generates seed data files (GraphQL Ingest + lines-db schema)",
101583
101782
  dependencies: ["tailordb"],
101584
- processType: ({ type, source }) => {
101783
+ processType: ({ type, source, namespace }) => {
101585
101784
  return {
101586
- gqlIngest: processGqlIngest(type),
101785
+ gqlIngest: processGqlIngest(type, namespace),
101587
101786
  linesDb: processLinesDb(type, source)
101588
101787
  };
101589
101788
  },
@@ -101597,7 +101796,10 @@ function createSeedGenerator(options) {
101597
101796
  if (!(outputBaseDir in entityDependencies)) entityDependencies[outputBaseDir] = {};
101598
101797
  for (const [_typeName, metadata] of Object.entries(nsResult.types)) {
101599
101798
  const { gqlIngest, linesDb } = metadata;
101600
- entityDependencies[outputBaseDir][gqlIngest.name] = gqlIngest.dependencies;
101799
+ entityDependencies[outputBaseDir][gqlIngest.name] = {
101800
+ namespace: gqlIngest.namespace,
101801
+ dependencies: gqlIngest.dependencies
101802
+ };
101601
101803
  files.push({
101602
101804
  path: path$20.join(outputBaseDir, "mappings", `${gqlIngest.name}.json`),
101603
101805
  content: JSON.stringify(gqlIngest.mapping, null, 2) + "\n"
@@ -101623,7 +101825,7 @@ function createSeedGenerator(options) {
101623
101825
  if (idpUser) {
101624
101826
  const outputBaseDir = options.distPath;
101625
101827
  if (!(outputBaseDir in entityDependencies)) entityDependencies[outputBaseDir] = {};
101626
- entityDependencies[outputBaseDir][idpUser.name] = idpUser.dependencies;
101828
+ entityDependencies[outputBaseDir][idpUser.name] = { dependencies: idpUser.dependencies };
101627
101829
  files.push({
101628
101830
  path: path$20.join(outputBaseDir, idpUser.mapping.graphqlFile),
101629
101831
  content: idpUser.graphql
@@ -101647,14 +101849,14 @@ function createSeedGenerator(options) {
101647
101849
  files.push({
101648
101850
  path: path$20.join(outputDir, "config.yaml"),
101649
101851
  content: `entityDependencies:
101650
- ${Object.entries(dependencies).map(([type, deps]) => `${type}: [${deps.join(", ")}]`).join("\n ")}
101852
+ ${Object.entries(dependencies).map(([type, deps]) => `${type}: [${deps.dependencies.join(", ")}]`).join("\n ")}
101651
101853
  `
101652
101854
  });
101653
101855
  if (options.machineUserName) {
101654
101856
  const relativeConfigPath = path$20.relative(outputDir, configPath);
101655
101857
  files.push({
101656
101858
  path: path$20.join(outputDir, "exec.mjs"),
101657
- content: generateExecScript(options.machineUserName, relativeConfigPath)
101859
+ content: generateExecScript(options.machineUserName, relativeConfigPath, dependencies)
101658
101860
  });
101659
101861
  }
101660
101862
  }
@@ -101685,8 +101887,8 @@ const builtinGenerators = new Map([
101685
101887
  const GeneratorConfigSchema = createGeneratorConfigSchema(builtinGenerators);
101686
101888
  /**
101687
101889
  * Load Tailor configuration file and associated generators.
101688
- * @param {string} [configPath] - Optional explicit config path
101689
- * @returns {Promise<{ config: AppConfig; generators: Generator[]; configPath: string }>} Loaded config and generators
101890
+ * @param configPath - Optional explicit config path
101891
+ * @returns Loaded config and generators
101690
101892
  */
101691
101893
  async function loadConfig(configPath) {
101692
101894
  const foundPath = loadConfigPath(configPath);
@@ -101723,10 +101925,10 @@ function extractAttributesFromConfig(config) {
101723
101925
  }
101724
101926
  /**
101725
101927
  * Generate the contents of the user-defined type definition file.
101726
- * @param {AttributeMapConfig | undefined} attributeMap - Attribute map configuration
101727
- * @param {AttributeListConfig | undefined} attributeList - Attribute list configuration
101728
- * @param {Record<string, string | number | boolean>} [env] - Environment configuration
101729
- * @returns {string} Generated type definition source
101928
+ * @param attributeMap - Attribute map configuration
101929
+ * @param attributeList - Attribute list configuration
101930
+ * @param env - Environment configuration
101931
+ * @returns Generated type definition source
101730
101932
  */
101731
101933
  function generateTypeDefinition(attributeMap, attributeList, env) {
101732
101934
  const mapFields = attributeMap ? Object.entries(attributeMap).map(([key, value]) => ` ${key}: ${value};`).join("\n") : "";
@@ -101787,8 +101989,8 @@ function collectAttributesFromConfig(config) {
101787
101989
  }
101788
101990
  /**
101789
101991
  * Resolve the output path for the generated type definition file.
101790
- * @param {string} configPath - Path to Tailor config file
101791
- * @returns {string} Absolute path to the type definition file
101992
+ * @param configPath - Path to Tailor config file
101993
+ * @returns Absolute path to the type definition file
101792
101994
  */
101793
101995
  function resolveTypeDefinitionPath(configPath) {
101794
101996
  const typePath = process.env.TAILOR_PLATFORM_SDK_TYPE_PATH;
@@ -101800,9 +102002,9 @@ function resolveTypeDefinitionPath(configPath) {
101800
102002
  }
101801
102003
  /**
101802
102004
  * Generate user type definitions from the app config and write them to disk.
101803
- * @param {AppConfig} config - Application config
101804
- * @param {string} configPath - Path to Tailor config file
101805
- * @returns {Promise<void>} Promise that resolves when types are generated
102005
+ * @param config - Application config
102006
+ * @param configPath - Path to Tailor config file
102007
+ * @returns Promise that resolves when types are generated
101806
102008
  */
101807
102009
  async function generateUserTypes(config, configPath) {
101808
102010
  try {
@@ -101846,8 +102048,8 @@ function resolvePackageDirectory(startDir) {
101846
102048
  //#region src/cli/apply/services/label.ts
101847
102049
  /**
101848
102050
  * Build TRN prefix for a workspace.
101849
- * @param {string} workspaceId - Workspace ID
101850
- * @returns {string} TRN prefix string
102051
+ * @param workspaceId - Workspace ID
102052
+ * @returns TRN prefix string
101851
102053
  */
101852
102054
  function trnPrefix(workspaceId) {
101853
102055
  return `trn:v1:workspace:${workspaceId}`;
@@ -101855,9 +102057,9 @@ function trnPrefix(workspaceId) {
101855
102057
  const sdkNameLabelKey = "sdk-name";
101856
102058
  /**
101857
102059
  * Build metadata request with SDK labels.
101858
- * @param {string} trn - Target TRN
101859
- * @param {string} appName - Application name label
101860
- * @returns {Promise<MessageInitShape<typeof SetMetadataRequestSchema>>} Metadata request
102060
+ * @param trn - Target TRN
102061
+ * @param appName - Application name label
102062
+ * @returns Metadata request
101861
102063
  */
101862
102064
  async function buildMetaRequest(trn$7, appName) {
101863
102065
  const packageJson$1 = await readPackageJson();
@@ -101902,10 +102104,10 @@ var ChangeSet = class {
101902
102104
  //#region src/cli/apply/services/application.ts
101903
102105
  /**
101904
102106
  * Apply application changes for the given phase.
101905
- * @param {OperatorClient} client - Operator client instance
101906
- * @param {ReturnType<typeof planApplication>} changeSet - Planned application changes
101907
- * @param {"create-update" | "delete"} [phase="create-update"] - Apply phase
101908
- * @returns {Promise<void>} Promise that resolves when applications are applied
102107
+ * @param client - Operator client instance
102108
+ * @param changeSet - Planned application changes
102109
+ * @param phase - Apply phase
102110
+ * @returns Promise that resolves when applications are applied
101909
102111
  */
101910
102112
  async function applyApplication(client, changeSet, phase = "create-update") {
101911
102113
  if (phase === "create-update") await Promise.all([...changeSet.creates.map(async (create$1) => {
@@ -101926,10 +102128,11 @@ function trn$6(workspaceId, name$1) {
101926
102128
  }
101927
102129
  /**
101928
102130
  * Plan application changes based on current and desired state.
101929
- * @param {PlanContext} context - Planning context
101930
- * @returns {Promise<ChangeSet<CreateApplication, UpdateApplication, DeleteApplication>>} Planned changes
102131
+ * @param context - Planning context
102132
+ * @returns Planned changes
101931
102133
  */
101932
- async function planApplication({ client, workspaceId, application, forRemoval }) {
102134
+ async function planApplication(context) {
102135
+ const { client, workspaceId, application, forRemoval } = context;
101933
102136
  const changeSet = new ChangeSet("Applications");
101934
102137
  const existingApplications = await fetchAll(async (pageToken) => {
101935
102138
  try {
@@ -102036,28 +102239,28 @@ function protoSubgraph(subgraph) {
102036
102239
  //#region src/cli/apply/services/idp.ts
102037
102240
  /**
102038
102241
  * Build the vault name for an IdP client.
102039
- * @param {string} namespaceName - IdP namespace name
102040
- * @param {string} clientName - IdP client name
102041
- * @returns {string} Vault name
102242
+ * @param namespaceName - IdP namespace name
102243
+ * @param clientName - IdP client name
102244
+ * @returns Vault name
102042
102245
  */
102043
102246
  function idpClientVaultName(namespaceName, clientName) {
102044
102247
  return `idp-${namespaceName}-${clientName}`;
102045
102248
  }
102046
102249
  /**
102047
102250
  * Build the secret name for an IdP client.
102048
- * @param {string} namespaceName - IdP namespace name
102049
- * @param {string} clientName - IdP client name
102050
- * @returns {string} Secret name
102251
+ * @param namespaceName - IdP namespace name
102252
+ * @param clientName - IdP client name
102253
+ * @returns Secret name
102051
102254
  */
102052
102255
  function idpClientSecretName(namespaceName, clientName) {
102053
102256
  return `client-secret-${namespaceName}-${clientName}`;
102054
102257
  }
102055
102258
  /**
102056
102259
  * Apply IdP-related changes for the given phase.
102057
- * @param {OperatorClient} client - Operator client instance
102058
- * @param {Awaited<ReturnType<typeof planIdP>>} result - Planned IdP changes
102059
- * @param {Exclude<ApplyPhase, "delete">} [phase="create-update"] - Apply phase
102060
- * @returns {Promise<void>} Promise that resolves when IdP changes are applied
102260
+ * @param client - Operator client instance
102261
+ * @param result - Planned IdP changes
102262
+ * @param phase - Apply phase
102263
+ * @returns Promise that resolves when IdP changes are applied
102061
102264
  */
102062
102265
  async function applyIdP(client, result, phase = "create-update") {
102063
102266
  const { changeSet } = result;
@@ -102118,10 +102321,11 @@ async function applyIdP(client, result, phase = "create-update") {
102118
102321
  }
102119
102322
  /**
102120
102323
  * Plan IdP-related changes based on current and desired state.
102121
- * @param {PlanContext} context - Planning context
102122
- * @returns {Promise<unknown>} Planned changes and metadata
102324
+ * @param context - Planning context
102325
+ * @returns Planned changes and metadata
102123
102326
  */
102124
- async function planIdP({ client, workspaceId, application, forRemoval }) {
102327
+ async function planIdP(context) {
102328
+ const { client, workspaceId, application, forRemoval } = context;
102125
102329
  const idps = forRemoval ? [] : application.idpServices;
102126
102330
  const { changeSet: serviceChangeSet, conflicts, unmanaged, resourceOwners } = await planServices$3(client, workspaceId, application.name, idps);
102127
102331
  const clientChangeSet = await planClients(client, workspaceId, idps, serviceChangeSet.deletes.map((del) => del.name));
@@ -102311,10 +102515,10 @@ function convertLang(lang) {
102311
102515
  //#region src/cli/apply/services/auth.ts
102312
102516
  /**
102313
102517
  * Apply auth-related changes for the given phase.
102314
- * @param {OperatorClient} client - Operator client instance
102315
- * @param {Awaited<ReturnType<typeof planAuth>>} result - Planned auth changes
102316
- * @param {Exclude<ApplyPhase, "delete">} [phase] - Apply phase (defaults to "create-update")
102317
- * @returns {Promise<void>} Promise that resolves when auth changes are applied
102518
+ * @param client - Operator client instance
102519
+ * @param result - Planned auth changes
102520
+ * @param phase - Apply phase (defaults to "create-update")
102521
+ * @returns Promise that resolves when auth changes are applied
102318
102522
  */
102319
102523
  async function applyAuth(client, result, phase = "create-update") {
102320
102524
  const { changeSet } = result;
@@ -102322,7 +102526,10 @@ async function applyAuth(client, result, phase = "create-update") {
102322
102526
  await Promise.all([...changeSet.service.creates.map(async (create$1) => {
102323
102527
  await client.createAuthService(create$1.request);
102324
102528
  await client.setMetadata(create$1.metaRequest);
102325
- }), ...changeSet.service.updates.map((update) => client.setMetadata(update.metaRequest))]);
102529
+ }), ...changeSet.service.updates.map(async (update) => {
102530
+ await client.updateAuthService(update.request);
102531
+ await client.setMetadata(update.metaRequest);
102532
+ })]);
102326
102533
  await Promise.all([...changeSet.idpConfig.creates.map(async (create$1) => {
102327
102534
  if (create$1.idpConfig.kind === "BuiltInIdP") create$1.request.idpConfig.config = await protoBuiltinIdPConfig(client, create$1.request.workspaceId, create$1.idpConfig);
102328
102535
  return client.createAuthIDPConfig(create$1.request);
@@ -102354,10 +102561,11 @@ async function applyAuth(client, result, phase = "create-update") {
102354
102561
  }
102355
102562
  /**
102356
102563
  * Plan auth-related changes based on current and desired state.
102357
- * @param {PlanContext} context - Planning context
102358
- * @returns {Promise<unknown>} Planned auth changes and metadata
102564
+ * @param context - Planning context
102565
+ * @returns Planned auth changes and metadata
102359
102566
  */
102360
- async function planAuth({ client, workspaceId, application, forRemoval }) {
102567
+ async function planAuth(context) {
102568
+ const { client, workspaceId, application, forRemoval } = context;
102361
102569
  const auths = [];
102362
102570
  if (!forRemoval && application.authService) {
102363
102571
  await application.authService.resolveNamespaces();
@@ -102441,6 +102649,11 @@ async function planServices$2(client, workspaceId, appName, auths) {
102441
102649
  });
102442
102650
  changeSet.updates.push({
102443
102651
  name: config.name,
102652
+ request: {
102653
+ workspaceId,
102654
+ namespaceName: config.name,
102655
+ publishSessionEvents: config.publishSessionEvents
102656
+ },
102444
102657
  metaRequest
102445
102658
  });
102446
102659
  delete existingServices[config.name];
@@ -102448,7 +102661,8 @@ async function planServices$2(client, workspaceId, appName, auths) {
102448
102661
  name: config.name,
102449
102662
  request: {
102450
102663
  workspaceId,
102451
- namespaceName: config.name
102664
+ namespaceName: config.name,
102665
+ publishSessionEvents: config.publishSessionEvents
102452
102666
  },
102453
102667
  metaRequest
102454
102668
  });
@@ -103165,10 +103379,10 @@ function protoSCIMAttribute(attr) {
103165
103379
  //#region src/cli/apply/services/confirm.ts
103166
103380
  /**
103167
103381
  * Confirm reassignment of resources when owner conflicts are detected.
103168
- * @param {OwnerConflict[]} conflicts - Detected owner conflicts
103169
- * @param {string} appName - Target application name
103170
- * @param {boolean} yes - Whether to auto-confirm without prompting
103171
- * @returns {Promise<void>} Promise that resolves when confirmation completes
103382
+ * @param conflicts - Detected owner conflicts
103383
+ * @param appName - Target application name
103384
+ * @param yes - Whether to auto-confirm without prompting
103385
+ * @returns Promise that resolves when confirmation completes
103172
103386
  */
103173
103387
  async function confirmOwnerConflict(conflicts, appName, yes) {
103174
103388
  if (conflicts.length === 0) return;
@@ -103194,10 +103408,10 @@ async function confirmOwnerConflict(conflicts, appName, yes) {
103194
103408
  }
103195
103409
  /**
103196
103410
  * Confirm allowing tailor-sdk to manage previously unmanaged resources.
103197
- * @param {UnmanagedResource[]} resources - Unmanaged resources
103198
- * @param {string} appName - Target application name
103199
- * @param {boolean} yes - Whether to auto-confirm without prompting
103200
- * @returns {Promise<void>} Promise that resolves when confirmation completes
103411
+ * @param resources - Unmanaged resources
103412
+ * @param appName - Target application name
103413
+ * @param yes - Whether to auto-confirm without prompting
103414
+ * @returns Promise that resolves when confirmation completes
103201
103415
  */
103202
103416
  async function confirmUnmanagedResources(resources, appName, yes) {
103203
103417
  if (resources.length === 0) return;
@@ -103222,9 +103436,9 @@ async function confirmUnmanagedResources(resources, appName, yes) {
103222
103436
  }
103223
103437
  /**
103224
103438
  * Confirm deletion of important resources.
103225
- * @param {ImportantResourceDeletion[]} resources - Resources scheduled for deletion
103226
- * @param {boolean} yes - Whether to auto-confirm without prompting
103227
- * @returns {Promise<void>} Promise that resolves when confirmation completes
103439
+ * @param resources - Resources scheduled for deletion
103440
+ * @param yes - Whether to auto-confirm without prompting
103441
+ * @returns Promise that resolves when confirmation completes
103228
103442
  */
103229
103443
  async function confirmImportantResourceDeletion(resources, yes) {
103230
103444
  if (resources.length === 0) return;
@@ -103250,10 +103464,10 @@ async function confirmImportantResourceDeletion(resources, yes) {
103250
103464
  //#region src/cli/apply/services/executor.ts
103251
103465
  /**
103252
103466
  * Apply executor-related changes for the given phase.
103253
- * @param {OperatorClient} client - Operator client instance
103254
- * @param {Awaited<ReturnType<typeof planExecutor>>} result - Planned executor changes
103255
- * @param {Extract<ApplyPhase, "create-update" | "delete">} [phase] - Apply phase (defaults to "create-update")
103256
- * @returns {Promise<void>} Promise that resolves when executors are applied
103467
+ * @param client - Operator client instance
103468
+ * @param result - Planned executor changes
103469
+ * @param phase - Apply phase (defaults to "create-update")
103470
+ * @returns Promise that resolves when executors are applied
103257
103471
  */
103258
103472
  async function applyExecutor(client, result, phase = "create-update") {
103259
103473
  const { changeSet } = result;
@@ -103271,10 +103485,11 @@ function trn$3(workspaceId, name$1) {
103271
103485
  }
103272
103486
  /**
103273
103487
  * Plan executor-related changes based on current and desired state.
103274
- * @param {PlanContext} context - Planning context
103275
- * @returns {Promise<ChangeSet<CreateExecutor, UpdateExecutor, DeleteExecutor>>} Planned changes
103488
+ * @param context - Planning context
103489
+ * @returns Planned changes
103276
103490
  */
103277
- async function planExecutor({ client, workspaceId, application, forRemoval }) {
103491
+ async function planExecutor(context) {
103492
+ const { client, workspaceId, application, forRemoval } = context;
103278
103493
  const changeSet = new ChangeSet("Executors");
103279
103494
  const conflicts = [];
103280
103495
  const unmanaged = [];
@@ -103353,8 +103568,8 @@ async function planExecutor({ client, workspaceId, application, forRemoval }) {
103353
103568
  /**
103354
103569
  * Build args expression for resolverExecuted trigger.
103355
103570
  * Transforms server's succeeded/failed fields to success/result/error fields.
103356
- * @param {string} [additionalFields] - Additional fields to include in the args expression
103357
- * @returns {string} JavaScript expression for resolverExecuted trigger args
103571
+ * @param additionalFields - Additional fields to include in the args expression
103572
+ * @returns JavaScript expression for resolverExecuted trigger args
103358
103573
  */
103359
103574
  function buildResolverExecutedArgsExpr(additionalFields) {
103360
103575
  const baseFields = `...args, appNamespace: args.namespaceName, success: !!args.succeeded, result: args.succeeded?.result.resolver, error: args.failed?.error`;
@@ -103538,10 +103753,10 @@ const SCALAR_TYPE_MAP = {
103538
103753
  };
103539
103754
  /**
103540
103755
  * Apply resolver pipeline changes for the given phase.
103541
- * @param {OperatorClient} client - Operator client instance
103542
- * @param {Awaited<ReturnType<typeof planPipeline>>} result - Planned pipeline changes
103543
- * @param {Exclude<ApplyPhase, "delete">} [phase="create-update"] - Apply phase
103544
- * @returns {Promise<void>} Promise that resolves when pipeline changes are applied
103756
+ * @param client - Operator client instance
103757
+ * @param result - Planned pipeline changes
103758
+ * @param phase - Apply phase
103759
+ * @returns Promise that resolves when pipeline changes are applied
103545
103760
  */
103546
103761
  async function applyPipeline(client, result, phase = "create-update") {
103547
103762
  const { changeSet } = result;
@@ -103559,10 +103774,11 @@ async function applyPipeline(client, result, phase = "create-update") {
103559
103774
  }
103560
103775
  /**
103561
103776
  * Plan resolver pipeline changes based on current and desired state.
103562
- * @param {PlanContext} context - Planning context
103563
- * @returns {Promise<unknown>} Planned changes
103777
+ * @param context - Planning context
103778
+ * @returns Planned changes
103564
103779
  */
103565
- async function planPipeline({ client, workspaceId, application, forRemoval }) {
103780
+ async function planPipeline(context) {
103781
+ const { client, workspaceId, application, forRemoval } = context;
103566
103782
  const pipelines = [];
103567
103783
  if (!forRemoval) for (const pipeline of application.resolverServices) {
103568
103784
  await pipeline.loadResolvers();
@@ -103798,10 +104014,10 @@ function protoFields(fields, baseName, isInput) {
103798
104014
  //#region src/cli/apply/services/staticwebsite.ts
103799
104015
  /**
103800
104016
  * Apply static website changes for the given phase.
103801
- * @param {OperatorClient} client - Operator client instance
103802
- * @param {Awaited<ReturnType<typeof planStaticWebsite>>} result - Planned static website changes
103803
- * @param {Extract<ApplyPhase, "create-update" | "delete">} [phase="create-update"] - Apply phase
103804
- * @returns {Promise<void>} Promise that resolves when static websites are applied
104017
+ * @param client - Operator client instance
104018
+ * @param result - Planned static website changes
104019
+ * @param phase - Apply phase
104020
+ * @returns Promise that resolves when static websites are applied
103805
104021
  */
103806
104022
  async function applyStaticWebsite(client, result, phase = "create-update") {
103807
104023
  const { changeSet } = result;
@@ -103819,10 +104035,11 @@ function trn$1(workspaceId, name$1) {
103819
104035
  }
103820
104036
  /**
103821
104037
  * Plan static website changes based on current and desired state.
103822
- * @param {PlanContext} context - Planning context
103823
- * @returns {Promise<unknown>} Planned changes
104038
+ * @param context - Planning context
104039
+ * @returns Planned changes
103824
104040
  */
103825
- async function planStaticWebsite({ client, workspaceId, application, forRemoval }) {
104041
+ async function planStaticWebsite(context) {
104042
+ const { client, workspaceId, application, forRemoval } = context;
103826
104043
  const changeSet = new ChangeSet("StaticWebsites");
103827
104044
  const conflicts = [];
103828
104045
  const unmanaged = [];
@@ -103913,10 +104130,10 @@ async function planStaticWebsite({ client, workspaceId, application, forRemoval
103913
104130
  //#region src/cli/apply/services/tailordb.ts
103914
104131
  /**
103915
104132
  * Apply TailorDB-related changes for the given phase.
103916
- * @param {OperatorClient} client - Operator client instance
103917
- * @param {Awaited<ReturnType<typeof planTailorDB>>} result - Planned TailorDB changes
103918
- * @param {Exclude<ApplyPhase, "delete">} [phase] - Apply phase (defaults to "create-update")
103919
- * @returns {Promise<void>} Promise that resolves when TailorDB changes are applied
104133
+ * @param client - Operator client instance
104134
+ * @param result - Planned TailorDB changes
104135
+ * @param phase - Apply phase (defaults to "create-update")
104136
+ * @returns Promise that resolves when TailorDB changes are applied
103920
104137
  */
103921
104138
  async function applyTailorDB(client, result, phase = "create-update") {
103922
104139
  const { changeSet } = result;
@@ -103934,10 +104151,11 @@ async function applyTailorDB(client, result, phase = "create-update") {
103934
104151
  }
103935
104152
  /**
103936
104153
  * Plan TailorDB-related changes based on current and desired state.
103937
- * @param {PlanContext} context - Planning context
103938
- * @returns {Promise<unknown>} Planned changes
104154
+ * @param context - Planning context
104155
+ * @returns Planned changes
103939
104156
  */
103940
- async function planTailorDB({ client, workspaceId, application, forRemoval }) {
104157
+ async function planTailorDB(context) {
104158
+ const { client, workspaceId, application, forRemoval } = context;
103941
104159
  const tailordbs = [];
103942
104160
  if (!forRemoval) for (const tailordb of application.tailorDBServices) {
103943
104161
  await tailordb.loadTypes();
@@ -104467,10 +104685,10 @@ function protoGqlOperand(operand) {
104467
104685
  //#region src/cli/apply/services/workflow.ts
104468
104686
  /**
104469
104687
  * Apply workflow changes for the given phase.
104470
- * @param {OperatorClient} client - Operator client instance
104471
- * @param {Awaited<ReturnType<typeof planWorkflow>>} result - Planned workflow changes
104472
- * @param {Extract<ApplyPhase, "create-update" | "delete">} [phase="create-update"] - Apply phase
104473
- * @returns {Promise<void>} Promise that resolves when workflows are applied
104688
+ * @param client - Operator client instance
104689
+ * @param result - Planned workflow changes
104690
+ * @param phase - Apply phase
104691
+ * @returns Promise that resolves when workflows are applied
104474
104692
  */
104475
104693
  async function applyWorkflow(client, result, phase = "create-update") {
104476
104694
  const { changeSet, appName } = result;
@@ -104502,9 +104720,9 @@ async function applyWorkflow(client, result, phase = "create-update") {
104502
104720
  }
104503
104721
  /**
104504
104722
  * Filter job function versions to only include those used by a workflow
104505
- * @param {{ [key: string]: bigint }} allVersions - Map of job function names to versions
104506
- * @param {string[]} usedJobNames - Job names used by the workflow
104507
- * @returns {{ [key: string]: bigint }} Filtered job function versions
104723
+ * @param allVersions - Map of job function names to versions
104724
+ * @param usedJobNames - Job names used by the workflow
104725
+ * @returns Filtered job function versions
104508
104726
  */
104509
104727
  function filterJobFunctionVersions(allVersions, usedJobNames) {
104510
104728
  const filtered = {};
@@ -104516,10 +104734,10 @@ function filterJobFunctionVersions(allVersions, usedJobNames) {
104516
104734
  * Only registers jobs that are actually used (based on usedJobNames in changeSet).
104517
104735
  * Uses create for new jobs and update for existing jobs.
104518
104736
  * Sets metadata on used JobFunctions and removes metadata from unused ones.
104519
- * @param {OperatorClient} client - Operator client instance
104520
- * @param {ChangeSet<CreateWorkflow, UpdateWorkflow, DeleteWorkflow>} changeSet - Workflow change set
104521
- * @param {string} appName - Application name
104522
- * @returns {Promise<{ [key: string]: bigint }>} Map of job function names to versions
104737
+ * @param client - Operator client instance
104738
+ * @param changeSet - Workflow change set
104739
+ * @param appName - Application name
104740
+ * @returns Map of job function names to versions
104523
104741
  */
104524
104742
  async function registerJobFunctions(client, changeSet, appName) {
104525
104743
  const jobFunctionVersions = {};
@@ -104573,12 +104791,12 @@ function jobFunctionTrn(workspaceId, name$1) {
104573
104791
  }
104574
104792
  /**
104575
104793
  * Plan workflow changes and job functions based on current and desired state.
104576
- * @param {OperatorClient} client - Operator client instance
104577
- * @param {string} workspaceId - Workspace ID
104578
- * @param {string} appName - Application name
104579
- * @param {Record<string, Workflow>} workflows - Parsed workflows
104580
- * @param {Record<string, string[]>} mainJobDeps - Main job dependencies by workflow
104581
- * @returns {Promise<unknown>} Planned workflow changes
104794
+ * @param client - Operator client instance
104795
+ * @param workspaceId - Workspace ID
104796
+ * @param appName - Application name
104797
+ * @param workflows - Parsed workflows
104798
+ * @param mainJobDeps - Main job dependencies by workflow
104799
+ * @returns Planned workflow changes
104582
104800
  */
104583
104801
  async function planWorkflow(client, workspaceId, appName, workflows, mainJobDeps) {
104584
104802
  const changeSet = new ChangeSet("Workflows");
@@ -104608,7 +104826,7 @@ async function planWorkflow(client, workspaceId, appName, workflows, mainJobDeps
104608
104826
  const existing = existingWorkflows[workflow.name];
104609
104827
  const metaRequest = await buildMetaRequest(workflowTrn(workspaceId, workflow.name), appName);
104610
104828
  const usedJobNames = mainJobDeps[workflow.mainJob.name];
104611
- if (!usedJobNames) throw new Error(`No dependency info found for mainJob "${workflow.mainJob.name}". Please run "generate" command before "apply".`);
104829
+ if (!usedJobNames) throw new Error(`Job "${workflow.mainJob.name}" (mainJob of workflow "${workflow.name}") was not found.\n\nPossible causes:\n - The job is not exported as a named export\n - The file containing the job is not included in workflow.files glob pattern\n\nSolution:\n export const ${workflow.mainJob.name} = createWorkflowJob({ name: "${workflow.mainJob.name}", ... })`);
104612
104830
  if (existing) {
104613
104831
  if (!existing.label) unmanaged.push({
104614
104832
  resourceType: "Workflow",
@@ -104673,8 +104891,8 @@ async function loadWorkflowScripts() {
104673
104891
  //#region src/cli/apply/index.ts
104674
104892
  /**
104675
104893
  * Apply the configured application to the Tailor platform.
104676
- * @param {ApplyOptions} [options] - Options for apply execution
104677
- * @returns {Promise<void>} Promise that resolves when apply completes
104894
+ * @param options - Options for apply execution
104895
+ * @returns Promise that resolves when apply completes
104678
104896
  */
104679
104897
  async function apply(options) {
104680
104898
  const { config, configPath } = await loadConfig(options?.configPath);
@@ -104883,8 +105101,8 @@ var DependencyGraphManager = class {
104883
105101
  }
104884
105102
  /**
104885
105103
  * Build the dependency graph from the given files.
104886
- * @param {string[]} filePaths - File paths to analyze
104887
- * @returns {Promise<void>} Promise that resolves when the graph is built
105104
+ * @param filePaths - File paths to analyze
105105
+ * @returns Promise that resolves when the graph is built
104888
105106
  */
104889
105107
  async buildGraph(filePaths) {
104890
105108
  try {
@@ -104929,8 +105147,8 @@ var DependencyGraphManager = class {
104929
105147
  }
104930
105148
  /**
104931
105149
  * Get every file that depends on the specified file (all levels).
104932
- * @param {string} filePath - File path to inspect
104933
- * @returns {string[]} List of dependent files
105150
+ * @param filePath - File path to inspect
105151
+ * @returns List of dependent files
104934
105152
  */
104935
105153
  getDependents(filePath) {
104936
105154
  const visited = /* @__PURE__ */ new Set();
@@ -104938,8 +105156,8 @@ var DependencyGraphManager = class {
104938
105156
  }
104939
105157
  /**
104940
105158
  * Get every file the specified file depends on (all levels).
104941
- * @param {string} filePath - File path to inspect
104942
- * @returns {string[]} List of dependency files
105159
+ * @param filePath - File path to inspect
105160
+ * @returns List of dependency files
104943
105161
  */
104944
105162
  getDependencies(filePath) {
104945
105163
  const visited = /* @__PURE__ */ new Set();
@@ -104947,7 +105165,7 @@ var DependencyGraphManager = class {
104947
105165
  }
104948
105166
  /**
104949
105167
  * Detect circular dependencies.
104950
- * @returns {string[][]} List of circular dependency cycles
105168
+ * @returns List of circular dependency cycles
104951
105169
  */
104952
105170
  findCircularDependencies() {
104953
105171
  if (!this.madgeInstance) return [];
@@ -104960,7 +105178,7 @@ var DependencyGraphManager = class {
104960
105178
  }
104961
105179
  /**
104962
105180
  * Add a node to the graph.
104963
- * @param {string} filePath - File path to add as a node
105181
+ * @param filePath - File path to add as a node
104964
105182
  */
104965
105183
  addNode(filePath) {
104966
105184
  const absolutePath = path$20.resolve(filePath);
@@ -104972,7 +105190,7 @@ var DependencyGraphManager = class {
104972
105190
  }
104973
105191
  /**
104974
105192
  * Remove a node from the graph.
104975
- * @param {string} filePath - File path to remove from the graph
105193
+ * @param filePath - File path to remove from the graph
104976
105194
  */
104977
105195
  removeNode(filePath) {
104978
105196
  const absolutePath = path$20.resolve(filePath);
@@ -104990,7 +105208,7 @@ var DependencyGraphManager = class {
104990
105208
  }
104991
105209
  /**
104992
105210
  * Get graph statistics.
104993
- * @returns {GraphStats} Current dependency graph statistics
105211
+ * @returns Current dependency graph statistics
104994
105212
  */
104995
105213
  getGraphStats() {
104996
105214
  let edgeCount = 0;
@@ -105084,9 +105302,9 @@ var DependencyWatcher = class {
105084
105302
  }
105085
105303
  /**
105086
105304
  * Add a watch group.
105087
- * @param {string} groupId - Group identifier
105088
- * @param {string[]} patterns - Glob patterns to watch
105089
- * @returns {Promise<void>} Promise that resolves when the group is added
105305
+ * @param groupId - Group identifier
105306
+ * @param patterns - Glob patterns to watch
105307
+ * @returns Promise that resolves when the group is added
105090
105308
  */
105091
105309
  async addWatchGroup(groupId, patterns) {
105092
105310
  this.validateWatchGroup(groupId, patterns);
@@ -105110,8 +105328,8 @@ var DependencyWatcher = class {
105110
105328
  }
105111
105329
  /**
105112
105330
  * Remove a watch group.
105113
- * @param {string} groupId - Group identifier
105114
- * @returns {Promise<void>} Promise that resolves when the group is removed
105331
+ * @param groupId - Group identifier
105332
+ * @returns Promise that resolves when the group is removed
105115
105333
  */
105116
105334
  async removeWatchGroup(groupId) {
105117
105335
  const watchGroup = this.watchGroups.get(groupId);
@@ -105143,8 +105361,7 @@ var DependencyWatcher = class {
105143
105361
  }
105144
105362
  /**
105145
105363
  * Set the error handling callback.
105146
- * @param {ErrorCallback} callback - Error callback
105147
- * @returns {void}
105364
+ * @param callback - Error callback
105148
105365
  */
105149
105366
  onError(callback) {
105150
105367
  this.errorCallback = callback;
@@ -105164,8 +105381,8 @@ var DependencyWatcher = class {
105164
105381
  }
105165
105382
  /**
105166
105383
  * Compute the impact scope of a specific file.
105167
- * @param {string} filePath - File path to analyze
105168
- * @returns {ImpactAnalysisResult} Impact analysis result for the file
105384
+ * @param filePath - File path to analyze
105385
+ * @returns Impact analysis result for the file
105169
105386
  */
105170
105387
  calculateImpact(filePath) {
105171
105388
  const cacheKey = `impact:${filePath}`;
@@ -105183,14 +105400,14 @@ var DependencyWatcher = class {
105183
105400
  }
105184
105401
  /**
105185
105402
  * Detect circular dependencies.
105186
- * @returns {string[][]} List of circular dependency cycles
105403
+ * @returns List of circular dependency cycles
105187
105404
  */
105188
105405
  detectCircularDependencies() {
105189
105406
  return this.dependencyGraphManager.findCircularDependencies();
105190
105407
  }
105191
105408
  /**
105192
105409
  * Retrieve the current watcher status.
105193
- * @returns {WatchStatus} Snapshot of the current watcher status
105410
+ * @returns Snapshot of the current watcher status
105194
105411
  */
105195
105412
  getWatchStatus() {
105196
105413
  let fileCount = 0;
@@ -105215,7 +105432,7 @@ var DependencyWatcher = class {
105215
105432
  restartCallback = null;
105216
105433
  /**
105217
105434
  * Set the restart callback to be called when a file change is detected.
105218
- * @param {() => void} callback - Restart callback
105435
+ * @param callback - Restart callback
105219
105436
  */
105220
105437
  setRestartCallback(callback) {
105221
105438
  this.restartCallback = callback;
@@ -105271,7 +105488,6 @@ var DependencyWatcher = class {
105271
105488
  }
105272
105489
  /**
105273
105490
  * Register signal handlers.
105274
- * @returns {void}
105275
105491
  */
105276
105492
  setupSignalHandlers() {
105277
105493
  if (this.signalHandlersRegistered) return;
@@ -105291,7 +105507,6 @@ var DependencyWatcher = class {
105291
105507
  }
105292
105508
  /**
105293
105509
  * Remove signal handlers.
105294
- * @returns {void}
105295
105510
  */
105296
105511
  removeSignalHandlers() {
105297
105512
  if (!this.signalHandlersRegistered) return;
@@ -105591,8 +105806,8 @@ var GenerationManager = class {
105591
105806
  };
105592
105807
  /**
105593
105808
  * Run code generation using the Tailor configuration and generators.
105594
- * @param {GenerateOptions} [options] - Generation options
105595
- * @returns {Promise<void>} Promise that resolves when generation (and watch, if enabled) completes
105809
+ * @param options - Generation options
105810
+ * @returns Promise that resolves when generation (and watch, if enabled) completes
105596
105811
  */
105597
105812
  async function generate(options) {
105598
105813
  const { config, generators, configPath } = await loadConfig(options?.configPath);
@@ -105634,8 +105849,8 @@ const generateCommand = defineCommand({
105634
105849
  //#region src/cli/machineuser/list.ts
105635
105850
  /**
105636
105851
  * Map a MachineUser protobuf message to CLI-friendly info.
105637
- * @param {MachineUser} user - Machine user resource
105638
- * @returns {MachineUserInfo} Flattened machine user info
105852
+ * @param user - Machine user resource
105853
+ * @returns Flattened machine user info
105639
105854
  */
105640
105855
  function machineUserInfo(user) {
105641
105856
  return {
@@ -105648,8 +105863,8 @@ function machineUserInfo(user) {
105648
105863
  }
105649
105864
  /**
105650
105865
  * List machine users for the current application.
105651
- * @param {ListMachineUsersOptions} [options] - Machine user listing options
105652
- * @returns {Promise<MachineUserInfo[]>} List of machine users
105866
+ * @param options - Machine user listing options
105867
+ * @returns List of machine users
105653
105868
  */
105654
105869
  async function listMachineUsers(options) {
105655
105870
  const client = await initOperatorClient(await loadAccessToken({
@@ -105699,8 +105914,8 @@ const listCommand$3 = defineCommand({
105699
105914
  //#region src/cli/machineuser/token.ts
105700
105915
  /**
105701
105916
  * Get a machine user access token for the current application.
105702
- * @param {GetMachineUserTokenOptions} options - Token retrieval options
105703
- * @returns {Promise<MachineUserTokenInfo>} Machine user token info
105917
+ * @param options - Token retrieval options
105918
+ * @returns Machine user token info
105704
105919
  */
105705
105920
  async function getMachineUserToken(options) {
105706
105921
  const client = await initOperatorClient(await loadAccessToken({
@@ -105774,8 +105989,8 @@ const grantTypeToString = (grantType) => {
105774
105989
  };
105775
105990
  /**
105776
105991
  * Transform an AuthOAuth2Client into CLI-friendly OAuth2 client info.
105777
- * @param {AuthOAuth2Client} client - OAuth2 client resource
105778
- * @returns {OAuth2ClientInfo} Flattened OAuth2 client info
105992
+ * @param client - OAuth2 client resource
105993
+ * @returns Flattened OAuth2 client info
105779
105994
  */
105780
105995
  function toOAuth2ClientInfo(client) {
105781
105996
  return {
@@ -105789,8 +106004,8 @@ function toOAuth2ClientInfo(client) {
105789
106004
  }
105790
106005
  /**
105791
106006
  * Transform an AuthOAuth2Client into OAuth2 client credentials info.
105792
- * @param {AuthOAuth2Client} client - OAuth2 client resource
105793
- * @returns {OAuth2ClientCredentials} OAuth2 client credentials
106007
+ * @param client - OAuth2 client resource
106008
+ * @returns OAuth2 client credentials
105794
106009
  */
105795
106010
  function toOAuth2ClientCredentials(client) {
105796
106011
  return {
@@ -105808,8 +106023,8 @@ function toOAuth2ClientCredentials(client) {
105808
106023
  //#region src/cli/oauth2client/get.ts
105809
106024
  /**
105810
106025
  * Get OAuth2 client credentials for the current application.
105811
- * @param {GetOAuth2ClientOptions} options - OAuth2 client lookup options
105812
- * @returns {Promise<OAuth2ClientCredentials>} OAuth2 client credentials
106026
+ * @param options - OAuth2 client lookup options
106027
+ * @returns OAuth2 client credentials
105813
106028
  */
105814
106029
  async function getOAuth2Client(options) {
105815
106030
  const client = await initOperatorClient(await loadAccessToken({
@@ -105868,8 +106083,8 @@ const getCommand$1 = defineCommand({
105868
106083
  //#region src/cli/oauth2client/list.ts
105869
106084
  /**
105870
106085
  * List OAuth2 clients for the current application.
105871
- * @param {ListOAuth2ClientsOptions} [options] - OAuth2 client listing options
105872
- * @returns {Promise<OAuth2ClientInfo[]>} List of OAuth2 clients
106086
+ * @param options - OAuth2 client listing options
106087
+ * @returns List of OAuth2 clients
105873
106088
  */
105874
106089
  async function listOAuth2Clients(options) {
105875
106090
  const client = await initOperatorClient(await loadAccessToken({
@@ -105965,8 +106180,8 @@ async function execRemove(client, workspaceId, application, confirm) {
105965
106180
  }
105966
106181
  /**
105967
106182
  * Remove all resources managed by the current application.
105968
- * @param {RemoveOptions} [options] - Remove options
105969
- * @returns {Promise<void>} Promise that resolves when removal completes
106183
+ * @param options - Remove options
106184
+ * @returns Promise that resolves when removal completes
105970
106185
  */
105971
106186
  async function remove(options) {
105972
106187
  const { client, workspaceId, application } = await loadOptions$1(options);
@@ -106042,8 +106257,8 @@ function applicationInfo(app) {
106042
106257
  }
106043
106258
  /**
106044
106259
  * Show applied application information for the current workspace.
106045
- * @param {ShowOptions} [options] - Show options
106046
- * @returns {Promise<ApplicationInfo>} Application information
106260
+ * @param options - Show options
106261
+ * @returns Application information
106047
106262
  */
106048
106263
  async function show(options) {
106049
106264
  const client = await initOperatorClient(await loadAccessToken({
@@ -106095,14 +106310,191 @@ const showCommand = defineCommand({
106095
106310
  })
106096
106311
  });
106097
106312
 
106313
+ //#endregion
106314
+ //#region src/cli/tailordb/truncate.ts
106315
+ async function truncateSingleType(options, client) {
106316
+ await client.truncateTailorDBType({
106317
+ workspaceId: options.workspaceId,
106318
+ namespaceName: options.namespaceName,
106319
+ tailordbTypeName: options.typeName
106320
+ });
106321
+ logger.success(`Truncated type "${options.typeName}" in namespace "${options.namespaceName}"`);
106322
+ }
106323
+ async function truncateNamespace(workspaceId, namespaceName, client) {
106324
+ await client.truncateTailorDBTypes({
106325
+ workspaceId,
106326
+ namespaceName
106327
+ });
106328
+ logger.success(`Truncated all types in namespace "${namespaceName}"`);
106329
+ }
106330
+ async function getAllNamespaces(configPath) {
106331
+ const { config } = await loadConfig(configPath);
106332
+ const namespaces = /* @__PURE__ */ new Set();
106333
+ if (config.db) for (const [namespaceName] of Object.entries(config.db)) namespaces.add(namespaceName);
106334
+ return Array.from(namespaces);
106335
+ }
106336
+ async function getTypeNamespace(workspaceId, typeName, client, configPath) {
106337
+ const namespaces = await getAllNamespaces(configPath);
106338
+ for (const namespace of namespaces) try {
106339
+ const { tailordbTypes } = await client.listTailorDBTypes({
106340
+ workspaceId,
106341
+ namespaceName: namespace
106342
+ });
106343
+ if (tailordbTypes.some((type) => type.name === typeName)) return namespace;
106344
+ } catch {
106345
+ continue;
106346
+ }
106347
+ return null;
106348
+ }
106349
+ /**
106350
+ * Truncate TailorDB data based on the given options.
106351
+ * @param options - Truncate options (all, namespace, or types)
106352
+ * @returns Promise that resolves when truncation completes
106353
+ */
106354
+ async function truncate(options) {
106355
+ return await $truncate({
106356
+ ...options,
106357
+ yes: true
106358
+ });
106359
+ }
106360
+ async function $truncate(options) {
106361
+ const client = await initOperatorClient(await loadAccessToken({
106362
+ useProfile: true,
106363
+ profile: options?.profile
106364
+ }));
106365
+ const workspaceId = loadWorkspaceId({
106366
+ workspaceId: options?.workspaceId,
106367
+ profile: options?.profile
106368
+ });
106369
+ const hasTypes = options?.types && options.types.length > 0;
106370
+ const hasNamespace = !!options?.namespace;
106371
+ const hasAll = !!options?.all;
106372
+ const optionCount = [
106373
+ hasAll,
106374
+ hasNamespace,
106375
+ hasTypes
106376
+ ].filter(Boolean).length;
106377
+ if (optionCount === 0) throw new Error("Please specify one of: --all, --namespace <name>, or type names");
106378
+ if (optionCount > 1) throw new Error("Options --all, --namespace, and type names are mutually exclusive. Please specify only one.");
106379
+ const namespaces = await getAllNamespaces(options?.configPath);
106380
+ if (hasAll) {
106381
+ if (namespaces.length === 0) {
106382
+ logger.warn("No namespaces found in config file.");
106383
+ return;
106384
+ }
106385
+ if (!options?.yes) {
106386
+ const namespaceList = namespaces.join(", ");
106387
+ if (!await logger.prompt(`This will truncate ALL tables in the following namespaces: ${namespaceList}. Continue? (yes/no)`, {
106388
+ type: "confirm",
106389
+ initial: false
106390
+ })) {
106391
+ logger.info("Truncate cancelled.");
106392
+ return;
106393
+ }
106394
+ }
106395
+ for (const namespace of namespaces) await truncateNamespace(workspaceId, namespace, client);
106396
+ logger.success("Truncated all tables in all namespaces");
106397
+ return;
106398
+ }
106399
+ if (hasNamespace && options?.namespace) {
106400
+ const namespace = options.namespace;
106401
+ if (!namespaces.includes(namespace)) throw new Error(`Namespace "${namespace}" not found in config. Available namespaces: ${namespaces.join(", ")}`);
106402
+ if (!options.yes) {
106403
+ if (!await logger.prompt(`This will truncate ALL tables in namespace "${namespace}". Continue? (yes/no)`, {
106404
+ type: "confirm",
106405
+ initial: false
106406
+ })) {
106407
+ logger.info("Truncate cancelled.");
106408
+ return;
106409
+ }
106410
+ }
106411
+ await truncateNamespace(workspaceId, namespace, client);
106412
+ return;
106413
+ }
106414
+ if (hasTypes && options?.types) {
106415
+ const typeNames = options.types;
106416
+ const typeNamespaceMap = /* @__PURE__ */ new Map();
106417
+ const notFoundTypes = [];
106418
+ for (const typeName of typeNames) {
106419
+ const namespace = await getTypeNamespace(workspaceId, typeName, client, options.configPath);
106420
+ if (namespace) typeNamespaceMap.set(typeName, namespace);
106421
+ else notFoundTypes.push(typeName);
106422
+ }
106423
+ if (notFoundTypes.length > 0) throw new Error(`The following types were not found in any namespace: ${notFoundTypes.join(", ")}`);
106424
+ if (!options.yes) {
106425
+ const typeList = typeNames.join(", ");
106426
+ if (!await logger.prompt(`This will truncate the following types: ${typeList}. Continue? (yes/no)`, {
106427
+ type: "confirm",
106428
+ initial: false
106429
+ })) {
106430
+ logger.info("Truncate cancelled.");
106431
+ return;
106432
+ }
106433
+ }
106434
+ for (const typeName of typeNames) {
106435
+ const namespace = typeNamespaceMap.get(typeName);
106436
+ if (!namespace) continue;
106437
+ await truncateSingleType({
106438
+ workspaceId,
106439
+ namespaceName: namespace,
106440
+ typeName
106441
+ }, client);
106442
+ }
106443
+ }
106444
+ }
106445
+ const truncateCommand = defineCommand({
106446
+ meta: {
106447
+ name: "truncate",
106448
+ description: "Truncate TailorDB tables"
106449
+ },
106450
+ args: {
106451
+ ...commonArgs,
106452
+ types: {
106453
+ type: "positional",
106454
+ description: "Type names to truncate",
106455
+ required: false
106456
+ },
106457
+ all: {
106458
+ type: "boolean",
106459
+ description: "Truncate all tables in all namespaces",
106460
+ default: false,
106461
+ alias: "a"
106462
+ },
106463
+ namespace: {
106464
+ type: "string",
106465
+ description: "Truncate all tables in specified namespace",
106466
+ alias: "n"
106467
+ },
106468
+ yes: {
106469
+ type: "boolean",
106470
+ description: "Skip confirmation prompt",
106471
+ alias: "y",
106472
+ default: false
106473
+ },
106474
+ ...deploymentArgs
106475
+ },
106476
+ run: withCommonArgs(async (args) => {
106477
+ const types$2 = args._.length > 0 ? args._.map((arg) => String(arg)).filter(Boolean) : void 0;
106478
+ await $truncate({
106479
+ workspaceId: args["workspace-id"],
106480
+ profile: args.profile,
106481
+ configPath: args.config,
106482
+ all: args.all,
106483
+ namespace: args.namespace,
106484
+ types: types$2,
106485
+ yes: args.yes
106486
+ });
106487
+ })
106488
+ });
106489
+
106098
106490
  //#endregion
106099
106491
  //#region src/cli/utils/format.ts
106100
106492
  /**
106101
106493
  * Formats a table with consistent single-line border style.
106102
106494
  * Use this instead of importing `table` directly.
106103
- * @param {unknown[][]} data - Table data
106104
- * @param {TableUserConfig} [config] - Table configuration
106105
- * @returns {string} Formatted table string
106495
+ * @param data - Table data
106496
+ * @param config - Table configuration
106497
+ * @returns Formatted table string
106106
106498
  */
106107
106499
  function formatTable(data$1, config) {
106108
106500
  return table(data$1, {
@@ -106112,8 +106504,8 @@ function formatTable(data$1, config) {
106112
106504
  }
106113
106505
  /**
106114
106506
  * Formats a key-value table with single-line border style.
106115
- * @param {[string, string][]} data - Key-value pairs
106116
- * @returns {string} Formatted key-value table string
106507
+ * @param data - Key-value pairs
106508
+ * @returns Formatted key-value table string
106117
106509
  */
106118
106510
  function formatKeyValueTable(data$1) {
106119
106511
  return formatTable(data$1, { singleLine: true });
@@ -106121,9 +106513,9 @@ function formatKeyValueTable(data$1) {
106121
106513
  /**
106122
106514
  * Formats a table with headers, using single-line border style.
106123
106515
  * Draws horizontal lines only at top, after header, and bottom.
106124
- * @param {string[]} headers - Table header labels
106125
- * @param {string[][]} rows - Table rows
106126
- * @returns {string} Formatted table string with headers
106516
+ * @param headers - Table header labels
106517
+ * @param rows - Table rows
106518
+ * @returns Formatted table string with headers
106127
106519
  */
106128
106520
  function formatTableWithHeaders(headers, rows) {
106129
106521
  return formatTable([headers, ...rows], { drawHorizontalLine: (lineIndex, rowCount) => {
@@ -106132,8 +106524,8 @@ function formatTableWithHeaders(headers, rows) {
106132
106524
  }
106133
106525
  /**
106134
106526
  * Format an ISO timestamp string as a human-readable relative time.
106135
- * @param {string} isoString - ISO date string
106136
- * @returns {string} Relative time (e.g., "5 minutes ago")
106527
+ * @param isoString - ISO date string
106528
+ * @returns Relative time (e.g., "5 minutes ago")
106137
106529
  */
106138
106530
  function humanizeRelativeTime(isoString) {
106139
106531
  const date = new Date(isoString);
@@ -106173,8 +106565,8 @@ const waitArgs = {
106173
106565
  //#region src/cli/workflow/transform.ts
106174
106566
  /**
106175
106567
  * Convert a workflow execution status enum to a string.
106176
- * @param {WorkflowExecution_Status} status - Workflow execution status
106177
- * @returns {string} String representation of the status
106568
+ * @param status - Workflow execution status
106569
+ * @returns String representation of the status
106178
106570
  */
106179
106571
  function workflowExecutionStatusToString(status) {
106180
106572
  switch (status) {
@@ -106188,8 +106580,8 @@ function workflowExecutionStatusToString(status) {
106188
106580
  }
106189
106581
  /**
106190
106582
  * Convert a workflow job execution status enum to a string.
106191
- * @param {WorkflowJobExecution_Status} status - Workflow job execution status
106192
- * @returns {string} String representation of the status
106583
+ * @param status - Workflow job execution status
106584
+ * @returns String representation of the status
106193
106585
  */
106194
106586
  function workflowJobExecutionStatusToString(status) {
106195
106587
  switch (status) {
@@ -106202,8 +106594,8 @@ function workflowJobExecutionStatusToString(status) {
106202
106594
  }
106203
106595
  /**
106204
106596
  * Convert a Workflow proto to CLI-friendly list info.
106205
- * @param {Workflow} workflow - Workflow resource
106206
- * @returns {WorkflowListInfo} Flattened workflow list info
106597
+ * @param workflow - Workflow resource
106598
+ * @returns Flattened workflow list info
106207
106599
  */
106208
106600
  function toWorkflowListInfo(workflow) {
106209
106601
  return {
@@ -106215,8 +106607,8 @@ function toWorkflowListInfo(workflow) {
106215
106607
  }
106216
106608
  /**
106217
106609
  * Convert a Workflow proto to detailed workflow info for CLI output.
106218
- * @param {Workflow} workflow - Workflow resource
106219
- * @returns {WorkflowInfo} Detailed workflow info
106610
+ * @param workflow - Workflow resource
106611
+ * @returns Detailed workflow info
106220
106612
  */
106221
106613
  function toWorkflowInfo(workflow) {
106222
106614
  const jobFunctions = {};
@@ -106232,8 +106624,8 @@ function toWorkflowInfo(workflow) {
106232
106624
  }
106233
106625
  /**
106234
106626
  * Convert a WorkflowJobExecution proto to CLI-friendly job execution info.
106235
- * @param {WorkflowJobExecution} jobExecution - Workflow job execution resource
106236
- * @returns {WorkflowJobExecutionInfo} Flattened job execution info
106627
+ * @param jobExecution - Workflow job execution resource
106628
+ * @returns Flattened job execution info
106237
106629
  */
106238
106630
  function toWorkflowJobExecutionInfo(jobExecution) {
106239
106631
  return {
@@ -106247,8 +106639,8 @@ function toWorkflowJobExecutionInfo(jobExecution) {
106247
106639
  }
106248
106640
  /**
106249
106641
  * Convert a WorkflowExecution proto to CLI-friendly execution info.
106250
- * @param {WorkflowExecution} execution - Workflow execution resource
106251
- * @returns {WorkflowExecutionInfo} Flattened execution info
106642
+ * @param execution - Workflow execution resource
106643
+ * @returns Flattened execution info
106252
106644
  */
106253
106645
  function toWorkflowExecutionInfo(execution) {
106254
106646
  return {
@@ -106292,8 +106684,8 @@ function parseStatus(status) {
106292
106684
  }
106293
106685
  /**
106294
106686
  * List workflow executions with optional filters.
106295
- * @param {ListWorkflowExecutionsOptions} [options] - Workflow execution listing options
106296
- * @returns {Promise<WorkflowExecutionInfo[]>} List of workflow executions
106687
+ * @param options - Workflow execution listing options
106688
+ * @returns List of workflow executions
106297
106689
  */
106298
106690
  async function listWorkflowExecutions(options) {
106299
106691
  const client = await initOperatorClient(await loadAccessToken({
@@ -106337,8 +106729,8 @@ async function listWorkflowExecutions(options) {
106337
106729
  }
106338
106730
  /**
106339
106731
  * Get a single workflow execution with optional logs.
106340
- * @param {GetWorkflowExecutionOptions} options - Workflow execution lookup options
106341
- * @returns {Promise<GetWorkflowExecutionResult>} Workflow execution with optional logs
106732
+ * @param options - Workflow execution lookup options
106733
+ * @returns Workflow execution with optional logs
106342
106734
  */
106343
106735
  async function getWorkflowExecution(options) {
106344
106736
  const client = await initOperatorClient(await loadAccessToken({
@@ -106424,8 +106816,7 @@ async function waitWithSpinner(waitFn, interval, json) {
106424
106816
  }
106425
106817
  /**
106426
106818
  * Print a workflow execution and its logs in a human-readable format.
106427
- * @param {WorkflowExecutionDetailInfo} execution - Workflow execution detail info
106428
- * @returns {void}
106819
+ * @param execution - Workflow execution detail info
106429
106820
  */
106430
106821
  function printExecutionWithLogs(execution) {
106431
106822
  const summaryData = [
@@ -106522,10 +106913,10 @@ const executionsCommand = defineCommand({
106522
106913
  //#region src/cli/workflow/get.ts
106523
106914
  /**
106524
106915
  * Resolve a workflow definition by name.
106525
- * @param {Awaited<ReturnType<typeof initOperatorClient>>} client - Operator client
106526
- * @param {string} workspaceId - Workspace ID
106527
- * @param {string} name - Workflow name
106528
- * @returns {Promise<unknown>} Resolved workflow
106916
+ * @param client - Operator client
106917
+ * @param workspaceId - Workspace ID
106918
+ * @param name - Workflow name
106919
+ * @returns Resolved workflow
106529
106920
  */
106530
106921
  async function resolveWorkflow(client, workspaceId, name$1) {
106531
106922
  const { workflow } = await client.getWorkflowByName({
@@ -106537,8 +106928,8 @@ async function resolveWorkflow(client, workspaceId, name$1) {
106537
106928
  }
106538
106929
  /**
106539
106930
  * Get a workflow by name and return CLI-friendly info.
106540
- * @param {GetWorkflowOptions} options - Workflow lookup options
106541
- * @returns {Promise<WorkflowInfo>} Workflow information
106931
+ * @param options - Workflow lookup options
106932
+ * @returns Workflow information
106542
106933
  */
106543
106934
  async function getWorkflow(options) {
106544
106935
  const client = await initOperatorClient(await loadAccessToken({
@@ -106581,8 +106972,8 @@ const getCommand = defineCommand({
106581
106972
  //#region src/cli/workflow/list.ts
106582
106973
  /**
106583
106974
  * List workflows in the workspace and return CLI-friendly info.
106584
- * @param {ListWorkflowsOptions} [options] - Workflow listing options
106585
- * @returns {Promise<WorkflowListInfo[]>} List of workflows
106975
+ * @param options - Workflow listing options
106976
+ * @returns List of workflows
106586
106977
  */
106587
106978
  async function listWorkflows(options) {
106588
106979
  const client = await initOperatorClient(await loadAccessToken({
@@ -106660,8 +107051,8 @@ function colorizeStatus(status) {
106660
107051
  }
106661
107052
  /**
106662
107053
  * Wait for a workflow execution to reach a terminal state, optionally showing progress.
106663
- * @param {WaitForExecutionOptions} options - Wait options
106664
- * @returns {Promise<WorkflowExecutionInfo>} Final workflow execution info
107054
+ * @param options - Wait options
107055
+ * @returns Final workflow execution info
106665
107056
  */
106666
107057
  async function waitForExecution(options) {
106667
107058
  const { client, workspaceId, executionId, interval, showProgress, trackJobs } = options;
@@ -106721,8 +107112,8 @@ function isTerminalStatus(status) {
106721
107112
  }
106722
107113
  /**
106723
107114
  * Start a workflow and return a handle to wait for completion.
106724
- * @param {StartWorkflowOptions} options - Start options
106725
- * @returns {Promise<StartWorkflowResultWithWait>} Start result with wait helper
107115
+ * @param options - Start options
107116
+ * @returns Start result with wait helper
106726
107117
  */
106727
107118
  async function startWorkflow(options) {
106728
107119
  const client = await initOperatorClient(await loadAccessToken({
@@ -106822,8 +107213,8 @@ const startCommand = defineCommand({
106822
107213
  //#region src/cli/workflow/resume.ts
106823
107214
  /**
106824
107215
  * Resume a suspended workflow execution and return a handle to wait for completion.
106825
- * @param {ResumeWorkflowOptions} options - Resume options
106826
- * @returns {Promise<ResumeWorkflowResultWithWait>} Resume result with wait helper
107216
+ * @param options - Resume options
107217
+ * @returns Resume result with wait helper
106827
107218
  */
106828
107219
  async function resumeWorkflow(options) {
106829
107220
  const client = await initOperatorClient(await loadAccessToken({
@@ -106935,8 +107326,8 @@ const validateRegion = async (region, client) => {
106935
107326
  };
106936
107327
  /**
106937
107328
  * Create a new workspace with the given options.
106938
- * @param {CreateWorkspaceOptions} options - Workspace creation options
106939
- * @returns {Promise<WorkspaceInfo>} Created workspace info
107329
+ * @param options - Workspace creation options
107330
+ * @returns Created workspace info
106940
107331
  */
106941
107332
  async function createWorkspace(options) {
106942
107333
  const result = createWorkspaceOptionsSchema.safeParse(options);
@@ -107017,8 +107408,8 @@ async function loadOptions(options) {
107017
107408
  }
107018
107409
  /**
107019
107410
  * Delete a workspace by ID.
107020
- * @param {DeleteWorkspaceOptions} options - Workspace deletion options
107021
- * @returns {Promise<void>} Promise that resolves when deletion completes
107411
+ * @param options - Workspace deletion options
107412
+ * @returns Promise that resolves when deletion completes
107022
107413
  */
107023
107414
  async function deleteWorkspace(options) {
107024
107415
  const { client, workspaceId } = await loadOptions(options);
@@ -107068,8 +107459,8 @@ const deleteCommand = defineCommand({
107068
107459
  const limitSchema = z.coerce.number().int().positive().optional();
107069
107460
  /**
107070
107461
  * List workspaces with an optional limit.
107071
- * @param {ListWorkspacesOptions} [options] - Workspace listing options
107072
- * @returns {Promise<WorkspaceInfo[]>} List of workspaces
107462
+ * @param options - Workspace listing options
107463
+ * @returns List of workspaces
107073
107464
  */
107074
107465
  async function listWorkspaces(options) {
107075
107466
  const limit = options?.limit;
@@ -107124,5 +107515,5 @@ const listCommand = defineCommand({
107124
107515
  });
107125
107516
 
107126
107517
  //#endregion
107127
- export { withCommonArgs as $, generate as A, loadWorkspaceId as B, listOAuth2Clients as C, tokenCommand as D, getMachineUserToken as E, loadConfig as F, initOAuth2Client as G, writePlatformConfig as H, apiCall as I, PATScope as J, initOperatorClient as K, apiCommand as L, apply as M, applyCommand as N, listCommand$3 as O, generateUserTypes as P, jsonArgs as Q, fetchLatestToken as R, listCommand$2 as S, getOAuth2Client as T, fetchAll as U, readPlatformConfig as V, fetchUserInfo as W, confirmationArgs as X, commonArgs as Y, deploymentArgs as Z, listWorkflowExecutions as _, createCommand as a, remove as b, resumeWorkflow as c, listCommand$1 as d, workspaceArgs as et, listWorkflows as f, getWorkflowExecution as g, executionsCommand as h, deleteWorkspace as i, generateCommand as j, listMachineUsers as k, startCommand as l, getWorkflow as m, listWorkspaces as n, createWorkspace as o, getCommand as p, readPackageJson as q, deleteCommand as r, resumeCommand as s, listCommand as t, logger as tt, startWorkflow as u, show as v, getCommand$1 as w, removeCommand as x, showCommand as y, loadAccessToken as z };
107128
- //# sourceMappingURL=list-BCl3ViG0.mjs.map
107518
+ export { deploymentArgs as $, listCommand$3 as A, fetchLatestToken as B, removeCommand as C, getOAuth2Client as D, getCommand$1 as E, applyCommand as F, fetchAll as G, loadWorkspaceId as H, generateUserTypes as I, initOperatorClient as J, fetchUserInfo as K, loadConfig as L, generate as M, generateCommand as N, getMachineUserToken as O, apply as P, confirmationArgs as Q, apiCall as R, remove as S, listOAuth2Clients as T, readPlatformConfig as U, loadAccessToken as V, writePlatformConfig as W, PATScope as X, readPackageJson as Y, commonArgs as Z, listWorkflowExecutions as _, createCommand as a, show as b, resumeWorkflow as c, listCommand$1 as d, jsonArgs as et, listWorkflows as f, getWorkflowExecution as g, executionsCommand as h, deleteWorkspace as i, listMachineUsers as j, tokenCommand as k, startCommand as l, getWorkflow as m, listWorkspaces as n, workspaceArgs as nt, createWorkspace as o, getCommand as p, initOAuth2Client as q, deleteCommand as r, logger as rt, resumeCommand as s, listCommand as t, withCommonArgs as tt, startWorkflow as u, truncate as v, listCommand$2 as w, showCommand as x, truncateCommand as y, apiCommand as z };
107519
+ //# sourceMappingURL=list-CafRw3ao.mjs.map