{"version":3,"file":"index.mjs","sources":["../../../src/services/entity-validator/index.ts"],"sourcesContent":["/**\n * Entity validator\n * Module that will validate input data for entity creation or edition\n */\n\nimport { uniqBy, castArray, isNil, isArray, mergeWith } from 'lodash';\nimport { has, prop, isObject, isEmpty } from 'lodash/fp';\nimport jsonLogic from 'json-logic-js';\nimport strapiUtils from '@strapi/utils';\nimport type { Modules, UID, Struct, Schema } from '@strapi/types';\nimport { Validators, ValidatorMetas } from './validators';\n\ntype CreateOrUpdate = 'creation' | 'update';\n\nconst { yup, validateYupSchema } = strapiUtils;\nconst { isMediaAttribute, isScalarAttribute, getWritableAttributes } = strapiUtils.contentTypes;\nconst { ValidationError } = strapiUtils.errors;\n\ntype ID = { id: string | number };\n\ntype RelationSource = string | number | ID;\n\nexport type ComponentContext = {\n  parentContent: {\n    // The model of the parent content type that contains the current component.\n    model: Struct.Schema;\n    // The numeric id of the parent entity that contains the component.\n    id?: number;\n    // The options passed to the entity validator. From which we can extract\n    // entity dimensions such as locale and publication state.\n    options?: ValidatorContext;\n  };\n  // The path to the component within the parent content type schema.\n  pathToComponent: string[];\n  // If working with a repeatable component this contains the\n  // full data of the repeatable component in the current entity.\n  repeatableData: Modules.EntityValidator.Entity[];\n  fullDynamicZoneContent?: Schema.Attribute.Value<Schema.Attribute.DynamicZone>;\n};\n\ninterface WithComponentContext {\n  componentContext?: ComponentContext;\n}\n\ninterface ValidatorMeta<TAttribute = Schema.Attribute.AnyAttribute> extends WithComponentContext {\n  attr: TAttribute;\n  updatedAttribute: { name: string; value: any };\n}\n\ninterface ValidatorContext {\n  isDraft?: boolean;\n  locale?: string | null;\n}\n\ninterface ModelValidatorMetas extends WithComponentContext {\n  model: Struct.Schema;\n  data: Record<string, unknown>;\n  entity?: Modules.EntityValidator.Entity;\n}\n\nconst isInteger = (value: unknown): value is number => Number.isInteger(value);\n\nconst addMinMax = <\n  T extends {\n    min(value: number): T;\n    max(value: number): T;\n  },\n>(\n  validator: T,\n  {\n    attr,\n    updatedAttribute,\n  }: ValidatorMeta<Schema.Attribute.AnyAttribute & Schema.Attribute.MinMaxOption<string | number>>\n): T => {\n  let nextValidator: T = validator;\n\n  if (\n    isInteger(attr.min) &&\n    (('required' in attr && attr.required) ||\n      (Array.isArray(updatedAttribute.value) && updatedAttribute.value.length > 0))\n  ) {\n    nextValidator = nextValidator.min(attr.min);\n  }\n  if (isInteger(attr.max)) {\n    nextValidator = nextValidator.max(attr.max);\n  }\n  return nextValidator;\n};\n\nconst addRequiredValidation = (createOrUpdate: CreateOrUpdate) => {\n  return <T extends strapiUtils.yup.AnySchema>(\n    validator: T,\n    {\n      attr: { required },\n    }: ValidatorMeta<Partial<Schema.Attribute.AnyAttribute & Schema.Attribute.RequiredOption>>\n  ): T => {\n    let nextValidator = validator;\n\n    if (required) {\n      if (createOrUpdate === 'creation') {\n        nextValidator = nextValidator.notNil();\n      } else if (createOrUpdate === 'update') {\n        nextValidator = nextValidator.notNull();\n      }\n    } else {\n      nextValidator = nextValidator.nullable();\n    }\n    return nextValidator;\n  };\n};\n\nconst addDefault = (createOrUpdate: CreateOrUpdate) => {\n  return (\n    validator: strapiUtils.yup.BaseSchema,\n    { attr }: ValidatorMeta<Schema.Attribute.AnyAttribute & Schema.Attribute.DefaultOption<unknown>>\n  ) => {\n    let nextValidator = validator;\n\n    if (createOrUpdate === 'creation') {\n      if (\n        ((attr.type === 'component' && attr.repeatable) || attr.type === 'dynamiczone') &&\n        !attr.required\n      ) {\n        nextValidator = nextValidator.default([]);\n      } else {\n        nextValidator = nextValidator.default(attr.default);\n      }\n    } else {\n      nextValidator = nextValidator.default(undefined);\n    }\n\n    return nextValidator;\n  };\n};\n\nconst preventCast = (validator: strapiUtils.yup.AnySchema) =>\n  validator.transform((val, originalVal) => originalVal);\n\nconst createComponentValidator =\n  (createOrUpdate: CreateOrUpdate) =>\n  (\n    {\n      attr,\n      updatedAttribute,\n      componentContext,\n    }: ValidatorMeta<Schema.Attribute.Component<UID.Component, boolean>>,\n    { isDraft }: ValidatorContext\n  ) => {\n    const model = strapi.getModel(attr.component);\n    if (!model) {\n      throw new Error('Validation failed: Model not found');\n    }\n\n    if (attr?.repeatable) {\n      // FIXME: yup v1\n\n      let validator = yup\n        .array()\n        .of(\n          yup.lazy((item) =>\n            createModelValidator(createOrUpdate)(\n              { componentContext, model, data: item },\n              { isDraft }\n            ).notNull()\n          ) as any\n        );\n\n      validator = addRequiredValidation(createOrUpdate)(validator, {\n        attr: { required: true },\n        updatedAttribute,\n      });\n\n      if (!isDraft) {\n        validator = addMinMax(validator, { attr, updatedAttribute });\n      }\n\n      return validator;\n    }\n\n    let validator = createModelValidator(createOrUpdate)(\n      {\n        model,\n        data: updatedAttribute.value,\n        componentContext,\n      },\n      { isDraft }\n    );\n\n    validator = addRequiredValidation(createOrUpdate)(validator, {\n      attr: { required: !isDraft && attr.required },\n      updatedAttribute,\n    });\n\n    return validator;\n  };\n\nconst createDzValidator =\n  (createOrUpdate: CreateOrUpdate) =>\n  ({ attr, updatedAttribute, componentContext }: ValidatorMeta, { isDraft }: ValidatorContext) => {\n    let validator;\n\n    validator = yup.array().of(\n      yup.lazy((item) => {\n        const model = strapi.getModel(prop('__component', item));\n        const schema = yup\n          .object()\n          .shape({\n            __component: yup.string().required().oneOf(Object.keys(strapi.components)),\n          })\n          .notNull();\n\n        return model\n          ? schema.concat(\n              createModelValidator(createOrUpdate)(\n                { model, data: item, componentContext },\n                { isDraft }\n              )\n            )\n          : schema;\n      }) as any // FIXME: yup v1\n    );\n\n    validator = addRequiredValidation(createOrUpdate)(validator, {\n      attr: { required: true },\n      updatedAttribute,\n    });\n\n    if (!isDraft) {\n      validator = addMinMax(validator, { attr, updatedAttribute });\n    }\n\n    return validator;\n  };\n\nconst createRelationValidator = ({\n  updatedAttribute,\n}: ValidatorMeta<Schema.Attribute.Relation>) => {\n  let validator;\n\n  if (Array.isArray(updatedAttribute.value)) {\n    validator = yup.array().of(yup.mixed());\n  } else {\n    validator = yup.mixed();\n  }\n\n  return validator;\n};\n\nconst createScalarAttributeValidator =\n  (createOrUpdate: CreateOrUpdate) => (metas: ValidatorMeta, options: ValidatorContext) => {\n    let validator;\n\n    if (has(metas.attr.type, Validators)) {\n      validator = (Validators as any)[metas.attr.type](metas, options);\n    } else {\n      // No validators specified - fall back to mixed\n      validator = yup.mixed();\n    }\n\n    validator = addRequiredValidation(createOrUpdate)(validator, {\n      attr: { required: !options.isDraft && metas.attr.required },\n      updatedAttribute: metas.updatedAttribute,\n    });\n\n    return validator;\n  };\n\nconst createAttributeValidator =\n  (createOrUpdate: CreateOrUpdate) => (metas: ValidatorMetas, options: ValidatorContext) => {\n    let validator = yup.mixed();\n\n    // If field is conditionally invisible, skip all validation for it\n    if (metas.attr.conditions?.visible) {\n      const isVisible = jsonLogic.apply(metas.attr.conditions.visible, metas.data);\n\n      if (!isVisible) {\n        return yup.mixed().notRequired(); // Completely skip validation\n      }\n    }\n\n    if (isMediaAttribute(metas.attr)) {\n      validator = yup.mixed();\n    } else if (isScalarAttribute(metas.attr)) {\n      validator = createScalarAttributeValidator(createOrUpdate)(metas, options);\n    } else {\n      if (metas.attr.type === 'component' && metas.componentContext) {\n        // Build the path to the component within the parent content type schema.\n        const pathToComponent = [\n          ...(metas?.componentContext?.pathToComponent ?? []),\n          metas.updatedAttribute.name,\n        ];\n\n        // If working with a repeatable component, determine the repeatable data\n        // based on the component's path.\n\n        // In order to validate the repeatable within this entity we need\n        // access to the full repeatable data. In case we are validating a\n        // nested component within a repeatable.\n        // Hence why we set this up when the path to the component is only one level deep.\n        const repeatableData = (\n          metas.attr.repeatable && pathToComponent.length === 1\n            ? metas.updatedAttribute.value\n            : metas.componentContext?.repeatableData\n        ) as Modules.EntityValidator.Entity[];\n\n        const newComponentContext: ComponentContext = {\n          ...metas.componentContext,\n          pathToComponent,\n          repeatableData,\n        };\n\n        validator = createComponentValidator(createOrUpdate)(\n          {\n            componentContext: newComponentContext,\n            attr: metas.attr,\n            updatedAttribute: metas.updatedAttribute,\n          },\n          options\n        );\n      } else if (metas.attr.type === 'dynamiczone' && metas.componentContext) {\n        const newComponentContext: ComponentContext = {\n          ...metas.componentContext,\n          fullDynamicZoneContent: metas.updatedAttribute.value,\n          pathToComponent: [...metas.componentContext.pathToComponent, metas.updatedAttribute.name],\n        };\n\n        Object.assign(metas, { componentContext: newComponentContext });\n\n        validator = createDzValidator(createOrUpdate)(metas, options);\n      } else if (metas.attr.type === 'relation') {\n        validator = createRelationValidator({\n          attr: metas.attr,\n          updatedAttribute: metas.updatedAttribute,\n        });\n      }\n\n      validator = preventCast(validator);\n    }\n\n    validator = addDefault(createOrUpdate)(validator, metas);\n\n    return validator;\n  };\n\nconst createModelValidator =\n  (createOrUpdate: CreateOrUpdate) =>\n  ({ componentContext, model, data, entity }: ModelValidatorMetas, options: ValidatorContext) => {\n    const writableAttributes = model ? getWritableAttributes(model as any) : [];\n\n    const schema = writableAttributes.reduce(\n      (validators, attributeName) => {\n        const metas = {\n          attr: model.attributes[attributeName],\n          updatedAttribute: { name: attributeName, value: prop(attributeName, data) },\n          data,\n          model,\n          entity,\n          componentContext,\n        };\n\n        const validator = createAttributeValidator(createOrUpdate)(metas, options);\n\n        validators[attributeName] = validator;\n\n        return validators;\n      },\n      {} as Record<string, strapiUtils.yup.BaseSchema>\n    );\n\n    return yup.object().shape(schema);\n  };\n\nconst createValidateEntity = (createOrUpdate: CreateOrUpdate) => {\n  return async <\n    TUID extends UID.ContentType,\n    TData extends Modules.EntityService.Params.Data.Input<TUID>,\n  >(\n    model: Schema.ContentType<TUID>,\n    data: TData | Partial<TData> | undefined,\n    options?: ValidatorContext,\n    entity?: Modules.EntityValidator.Entity\n  ): Promise<TData> => {\n    if (!isObject(data)) {\n      const { displayName } = model.info;\n\n      throw new ValidationError(\n        `Invalid payload submitted for the ${createOrUpdate} of an entity of type ${displayName}. Expected an object, but got ${typeof data}`\n      );\n    }\n\n    const validator = createModelValidator(createOrUpdate)(\n      {\n        model,\n        data,\n        entity,\n        componentContext: {\n          // Set up the initial component context.\n          // Keeping track of parent content type context in which a component will be used.\n          // This is necessary to validate component field constraints such as uniqueness.\n          parentContent: {\n            id: entity?.id,\n            model,\n            options,\n          },\n          pathToComponent: [],\n          repeatableData: [],\n        },\n      },\n      {\n        isDraft: options?.isDraft ?? false,\n        locale: options?.locale ?? null,\n      }\n    )\n      .test(\n        'relations-test',\n        'check that all relations exist',\n        async function relationsValidation(data) {\n          try {\n            await checkRelationsExist(buildRelationsStore({ uid: model.uid, data }));\n          } catch (e) {\n            return this.createError({\n              path: this.path,\n              message: (e instanceof ValidationError && e.message) || 'Invalid relations',\n            });\n          }\n          return true;\n        }\n      )\n      .required();\n\n    return validateYupSchema(validator, {\n      strict: false,\n      abortEarly: false,\n    })(data);\n  };\n};\n\n/**\n * Builds an object containing all the media and relations being associated with an entity\n */\nconst buildRelationsStore = <TUID extends UID.Schema>({\n  uid,\n  data,\n}: {\n  uid: TUID;\n  data: Record<string, unknown> | null;\n}): Record<string, ID[]> => {\n  if (!uid) {\n    throw new ValidationError(`Cannot build relations store: \"uid\" is undefined`);\n  }\n\n  if (isEmpty(data)) {\n    return {};\n  }\n\n  const currentModel = strapi.getModel(uid);\n\n  return Object.keys(currentModel.attributes).reduce(\n    (result, attributeName: string) => {\n      const attribute = currentModel.attributes[attributeName];\n      const value = data[attributeName];\n\n      if (isNil(value)) {\n        return result;\n      }\n\n      switch (attribute.type) {\n        case 'relation':\n        case 'media': {\n          if (\n            attribute.type === 'relation' &&\n            (attribute.relation === 'morphToMany' || attribute.relation === 'morphToOne')\n          ) {\n            // TODO: handle polymorphic relations\n            break;\n          }\n\n          const target =\n            // eslint-disable-next-line no-nested-ternary\n            attribute.type === 'media' ? 'plugin::upload.file' : attribute.target;\n          // As there are multiple formats supported for associating relations\n          // with an entity, the value here can be an: array, object or number.\n          let source: RelationSource[];\n          if (Array.isArray(value)) {\n            source = value;\n          } else if (isObject(value)) {\n            if ('connect' in value && !isNil(value.connect)) {\n              source = value.connect as RelationSource[];\n            } else if ('set' in value && !isNil(value.set)) {\n              source = value.set as RelationSource[];\n            } else {\n              source = [];\n            }\n          } else {\n            source = castArray(value as RelationSource);\n          }\n          const idArray = source.map((v) => ({\n            id: typeof v === 'object' ? v.id : v,\n          }));\n\n          // Update the relationStore to keep track of all associations being made\n          // with relations and media.\n          result[target] = result[target] || [];\n          result[target].push(...idArray);\n          break;\n        }\n        case 'component': {\n          return castArray(value).reduce((relationsStore, componentValue) => {\n            if (!attribute.component) {\n              throw new ValidationError(\n                `Cannot build relations store from component, component identifier is undefined`\n              );\n            }\n\n            return mergeWith(\n              relationsStore,\n              buildRelationsStore({\n                uid: attribute.component,\n                data: componentValue as Record<string, unknown>,\n              }),\n              (objValue, srcValue) => {\n                if (isArray(objValue)) {\n                  return objValue.concat(srcValue);\n                }\n              }\n            );\n          }, result) as Record<string, ID[]>;\n        }\n        case 'dynamiczone': {\n          return castArray(value).reduce((relationsStore, dzValue) => {\n            const value = dzValue as Record<string, unknown>;\n            if (!value.__component) {\n              throw new ValidationError(\n                `Cannot build relations store from dynamiczone, component identifier is undefined`\n              );\n            }\n\n            return mergeWith(\n              relationsStore,\n              buildRelationsStore({\n                uid: value.__component as UID.Component,\n                data: value,\n              }),\n              (objValue, srcValue) => {\n                if (isArray(objValue)) {\n                  return objValue.concat(srcValue);\n                }\n              }\n            );\n          }, result) as Record<string, ID[]>;\n        }\n        default:\n          break;\n      }\n\n      return result;\n    },\n    {} as Record<string, ID[]>\n  );\n};\n\n/**\n * Iterate through the relations store and validates that every relation or media\n * mentioned exists\n */\nconst checkRelationsExist = async (relationsStore: Record<string, ID[]> = {}) => {\n  const promises: Promise<void>[] = [];\n\n  for (const [key, value] of Object.entries(relationsStore)) {\n    const evaluate = async () => {\n      const uniqueValues = uniqBy(value, `id`);\n      const count = await strapi.db.query(key as UID.Schema).count({\n        where: {\n          id: {\n            $in: uniqueValues.map((v) => v.id),\n          },\n        },\n      });\n\n      if (count !== uniqueValues.length) {\n        throw new ValidationError(\n          `${\n            uniqueValues.length - count\n          } relation(s) of type ${key} associated with this entity do not exist`\n        );\n      }\n    };\n    promises.push(evaluate());\n  }\n\n  return Promise.all(promises);\n};\n\nconst entityValidator: Modules.EntityValidator.EntityValidator = {\n  validateEntityCreation: createValidateEntity('creation'),\n  validateEntityUpdate: createValidateEntity('update'),\n};\n\nexport default entityValidator;\n"],"names":["yup","validateYupSchema","strapiUtils","isMediaAttribute","isScalarAttribute","getWritableAttributes","contentTypes","ValidationError","errors","isInteger","value","Number","addMinMax","validator","attr","updatedAttribute","nextValidator","min","required","Array","isArray","length","max","addRequiredValidation","createOrUpdate","notNil","notNull","nullable","addDefault","type","repeatable","default","undefined","preventCast","transform","val","originalVal","createComponentValidator","componentContext","isDraft","model","strapi","getModel","component","Error","array","of","lazy","item","createModelValidator","data","createDzValidator","prop","schema","object","shape","__component","string","oneOf","Object","keys","components","concat","createRelationValidator","mixed","createScalarAttributeValidator","metas","options","has","Validators","createAttributeValidator","conditions","visible","isVisible","jsonLogic","apply","notRequired","pathToComponent","name","repeatableData","newComponentContext","fullDynamicZoneContent","assign","entity","writableAttributes","reduce","validators","attributeName","attributes","createValidateEntity","isObject","displayName","info","parentContent","id","locale","test","relationsValidation","checkRelationsExist","buildRelationsStore","uid","e","createError","path","message","strict","abortEarly","isEmpty","currentModel","result","attribute","isNil","relation","target","source","connect","set","castArray","idArray","map","v","push","relationsStore","componentValue","mergeWith","objValue","srcValue","dzValue","promises","key","entries","evaluate","uniqueValues","uniqBy","count","db","query","where","$in","Promise","all","entityValidator","validateEntityCreation","validateEntityUpdate"],"mappings":";;;;;;AAcA,MAAM,EAAEA,GAAG,EAAEC,iBAAiB,EAAE,GAAGC,WAAAA;AACnC,MAAM,EAAEC,gBAAgB,EAAEC,iBAAiB,EAAEC,qBAAqB,EAAE,GAAGH,WAAAA,CAAYI,YAAY;AAC/F,MAAM,EAAEC,eAAe,EAAE,GAAGL,YAAYM,MAAM;AA4C9C,MAAMC,SAAAA,GAAY,CAACC,KAAAA,GAAoCC,MAAAA,CAAOF,SAAS,CAACC,KAAAA,CAAAA;AAExE,MAAME,YAAY,CAMhBC,SAAAA,EACA,EACEC,IAAI,EACJC,gBAAgB,EAC8E,GAAA;AAEhG,IAAA,IAAIC,aAAAA,GAAmBH,SAAAA;IAEvB,IACEJ,SAAAA,CAAUK,KAAKG,GAAG,CAAA,KACjB,UAAC,IAAcH,IAAAA,IAAQA,IAAAA,CAAKI,QAAQ,IAClCC,MAAMC,OAAO,CAACL,gBAAAA,CAAiBL,KAAK,CAAA,IAAKK,gBAAAA,CAAiBL,KAAK,CAACW,MAAM,GAAG,CAAC,CAAA,EAC7E;AACAL,QAAAA,aAAAA,GAAgBA,aAAAA,CAAcC,GAAG,CAACH,IAAAA,CAAKG,GAAG,CAAA;AAC5C,IAAA;IACA,IAAIR,SAAAA,CAAUK,IAAAA,CAAKQ,GAAG,CAAA,EAAG;AACvBN,QAAAA,aAAAA,GAAgBA,aAAAA,CAAcM,GAAG,CAACR,IAAAA,CAAKQ,GAAG,CAAA;AAC5C,IAAA;IACA,OAAON,aAAAA;AACT,CAAA;AAEA,MAAMO,wBAAwB,CAACC,cAAAA,GAAAA;AAC7B,IAAA,OAAO,CACLX,SAAAA,EACA,EACEC,MAAM,EAAEI,QAAQ,EAAE,EACsE,GAAA;AAE1F,QAAA,IAAIF,aAAAA,GAAgBH,SAAAA;AAEpB,QAAA,IAAIK,QAAAA,EAAU;AACZ,YAAA,IAAIM,mBAAmB,UAAA,EAAY;AACjCR,gBAAAA,aAAAA,GAAgBA,cAAcS,MAAM,EAAA;YACtC,CAAA,MAAO,IAAID,mBAAmB,QAAA,EAAU;AACtCR,gBAAAA,aAAAA,GAAgBA,cAAcU,OAAO,EAAA;AACvC,YAAA;QACF,CAAA,MAAO;AACLV,YAAAA,aAAAA,GAAgBA,cAAcW,QAAQ,EAAA;AACxC,QAAA;QACA,OAAOX,aAAAA;AACT,IAAA,CAAA;AACF,CAAA;AAEA,MAAMY,aAAa,CAACJ,cAAAA,GAAAA;AAClB,IAAA,OAAO,CACLX,SAAAA,EACA,EAAEC,IAAI,EAA0F,GAAA;AAEhG,QAAA,IAAIE,aAAAA,GAAgBH,SAAAA;AAEpB,QAAA,IAAIW,mBAAmB,UAAA,EAAY;AACjC,YAAA,IACE,CAAEV,KAAKe,IAAI,KAAK,eAAef,IAAAA,CAAKgB,UAAU,IAAKhB,IAAAA,CAAKe,IAAI,KAAK,aAAY,KAC7E,CAACf,IAAAA,CAAKI,QAAQ,EACd;gBACAF,aAAAA,GAAgBA,aAAAA,CAAce,OAAO,CAAC,EAAE,CAAA;YAC1C,CAAA,MAAO;AACLf,gBAAAA,aAAAA,GAAgBA,aAAAA,CAAce,OAAO,CAACjB,IAAAA,CAAKiB,OAAO,CAAA;AACpD,YAAA;QACF,CAAA,MAAO;YACLf,aAAAA,GAAgBA,aAAAA,CAAce,OAAO,CAACC,SAAAA,CAAAA;AACxC,QAAA;QAEA,OAAOhB,aAAAA;AACT,IAAA,CAAA;AACF,CAAA;AAEA,MAAMiB,WAAAA,GAAc,CAACpB,SAAAA,GACnBA,SAAAA,CAAUqB,SAAS,CAAC,CAACC,KAAKC,WAAAA,GAAgBA,WAAAA,CAAAA;AAE5C,MAAMC,wBAAAA,GACJ,CAACb,cAAAA,GACD,CACE,EACEV,IAAI,EACJC,gBAAgB,EAChBuB,gBAAgB,EACkD,EACpE,EAAEC,OAAO,EAAoB,GAAA;AAE7B,QAAA,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAAC5B,KAAK6B,SAAS,CAAA;AAC5C,QAAA,IAAI,CAACH,KAAAA,EAAO;AACV,YAAA,MAAM,IAAII,KAAAA,CAAM,oCAAA,CAAA;AAClB,QAAA;AAEA,QAAA,IAAI9B,MAAMgB,UAAAA,EAAY;;AAGpB,YAAA,IAAIjB,SAAAA,GAAYb,GAAAA,CACb6C,KAAK,EAAA,CACLC,EAAE,CACD9C,GAAAA,CAAI+C,IAAI,CAAC,CAACC,IAAAA,GACRC,oBAAAA,CAAqBzB,cAAAA,CAAAA,CACnB;AAAEc,oBAAAA,gBAAAA;AAAkBE,oBAAAA,KAAAA;oBAAOU,IAAAA,EAAMF;iBAAK,EACtC;AAAET,oBAAAA;AAAQ,iBAAA,CAAA,CACVb,OAAO,EAAA,CAAA,CAAA;YAIfb,SAAAA,GAAYU,qBAAAA,CAAsBC,gBAAgBX,SAAAA,EAAW;gBAC3DC,IAAAA,EAAM;oBAAEI,QAAAA,EAAU;AAAK,iBAAA;AACvBH,gBAAAA;AACF,aAAA,CAAA;AAEA,YAAA,IAAI,CAACwB,OAAAA,EAAS;AACZ1B,gBAAAA,SAAAA,GAAYD,UAAUC,SAAAA,EAAW;AAAEC,oBAAAA,IAAAA;AAAMC,oBAAAA;AAAiB,iBAAA,CAAA;AAC5D,YAAA;YAEA,OAAOF,SAAAA;AACT,QAAA;QAEA,IAAIA,SAAAA,GAAYoC,qBAAqBzB,cAAAA,CAAAA,CACnC;AACEgB,YAAAA,KAAAA;AACAU,YAAAA,IAAAA,EAAMnC,iBAAiBL,KAAK;AAC5B4B,YAAAA;SACF,EACA;AAAEC,YAAAA;AAAQ,SAAA,CAAA;QAGZ1B,SAAAA,GAAYU,qBAAAA,CAAsBC,gBAAgBX,SAAAA,EAAW;YAC3DC,IAAAA,EAAM;gBAAEI,QAAAA,EAAU,CAACqB,OAAAA,IAAWzB,IAAAA,CAAKI;AAAS,aAAA;AAC5CH,YAAAA;AACF,SAAA,CAAA;QAEA,OAAOF,SAAAA;AACT,IAAA,CAAA;AAEF,MAAMsC,iBAAAA,GACJ,CAAC3B,cAAAA,GACD,CAAC,EAAEV,IAAI,EAAEC,gBAAgB,EAAEuB,gBAAgB,EAAiB,EAAE,EAAEC,OAAO,EAAoB,GAAA;QACzF,IAAI1B,SAAAA;QAEJA,SAAAA,GAAYb,GAAAA,CAAI6C,KAAK,EAAA,CAAGC,EAAE,CACxB9C,GAAAA,CAAI+C,IAAI,CAAC,CAACC,IAAAA,GAAAA;AACR,YAAA,MAAMR,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACU,KAAK,aAAA,EAAeJ,IAAAA,CAAAA,CAAAA;AAClD,YAAA,MAAMK,MAAAA,GAASrD,GAAAA,CACZsD,MAAM,EAAA,CACNC,KAAK,CAAC;gBACLC,WAAAA,EAAaxD,GAAAA,CAAIyD,MAAM,EAAA,CAAGvC,QAAQ,EAAA,CAAGwC,KAAK,CAACC,MAAAA,CAAOC,IAAI,CAACnB,MAAAA,CAAOoB,UAAU,CAAA;AAC1E,aAAA,CAAA,CACCnC,OAAO,EAAA;AAEV,YAAA,OAAOc,KAAAA,GACHa,MAAAA,CAAOS,MAAM,CACXb,qBAAqBzB,cAAAA,CAAAA,CACnB;AAAEgB,gBAAAA,KAAAA;gBAAOU,IAAAA,EAAMF,IAAAA;AAAMV,gBAAAA;aAAiB,EACtC;AAAEC,gBAAAA;aAAQ,CAAA,CAAA,GAGdc,MAAAA;AACN,QAAA,CAAA,CAAA,CAAA;QAGFxC,SAAAA,GAAYU,qBAAAA,CAAsBC,gBAAgBX,SAAAA,EAAW;YAC3DC,IAAAA,EAAM;gBAAEI,QAAAA,EAAU;AAAK,aAAA;AACvBH,YAAAA;AACF,SAAA,CAAA;AAEA,QAAA,IAAI,CAACwB,OAAAA,EAAS;AACZ1B,YAAAA,SAAAA,GAAYD,UAAUC,SAAAA,EAAW;AAAEC,gBAAAA,IAAAA;AAAMC,gBAAAA;AAAiB,aAAA,CAAA;AAC5D,QAAA;QAEA,OAAOF,SAAAA;AACT,IAAA,CAAA;AAEF,MAAMkD,uBAAAA,GAA0B,CAAC,EAC/BhD,gBAAgB,EACyB,GAAA;IACzC,IAAIF,SAAAA;AAEJ,IAAA,IAAIM,KAAAA,CAAMC,OAAO,CAACL,gBAAAA,CAAiBL,KAAK,CAAA,EAAG;AACzCG,QAAAA,SAAAA,GAAYb,IAAI6C,KAAK,EAAA,CAAGC,EAAE,CAAC9C,IAAIgE,KAAK,EAAA,CAAA;IACtC,CAAA,MAAO;AACLnD,QAAAA,SAAAA,GAAYb,IAAIgE,KAAK,EAAA;AACvB,IAAA;IAEA,OAAOnD,SAAAA;AACT,CAAA;AAEA,MAAMoD,8BAAAA,GACJ,CAACzC,cAAAA,GAAmC,CAAC0C,KAAAA,EAAsBC,OAAAA,GAAAA;QACzD,IAAItD,SAAAA;AAEJ,QAAA,IAAIuD,IAAIF,KAAAA,CAAMpD,IAAI,CAACe,IAAI,EAAEwC,UAAAA,CAAAA,EAAa;YACpCxD,SAAAA,GAAawD,UAAkB,CAACH,KAAAA,CAAMpD,IAAI,CAACe,IAAI,CAAC,CAACqC,KAAAA,EAAOC,OAAAA,CAAAA;QAC1D,CAAA,MAAO;;AAELtD,YAAAA,SAAAA,GAAYb,IAAIgE,KAAK,EAAA;AACvB,QAAA;QAEAnD,SAAAA,GAAYU,qBAAAA,CAAsBC,gBAAgBX,SAAAA,EAAW;YAC3DC,IAAAA,EAAM;AAAEI,gBAAAA,QAAAA,EAAU,CAACiD,OAAAA,CAAQ5B,OAAO,IAAI2B,KAAAA,CAAMpD,IAAI,CAACI;AAAS,aAAA;AAC1DH,YAAAA,gBAAAA,EAAkBmD,MAAMnD;AAC1B,SAAA,CAAA;QAEA,OAAOF,SAAAA;AACT,IAAA,CAAA;AAEF,MAAMyD,wBAAAA,GACJ,CAAC9C,cAAAA,GAAmC,CAAC0C,KAAAA,EAAuBC,OAAAA,GAAAA;QAC1D,IAAItD,SAAAA,GAAYb,IAAIgE,KAAK,EAAA;;AAGzB,QAAA,IAAIE,KAAAA,CAAMpD,IAAI,CAACyD,UAAU,EAAEC,OAAAA,EAAS;AAClC,YAAA,MAAMC,SAAAA,GAAYC,SAAAA,CAAUC,KAAK,CAACT,KAAAA,CAAMpD,IAAI,CAACyD,UAAU,CAACC,OAAO,EAAEN,KAAAA,CAAMhB,IAAI,CAAA;AAE3E,YAAA,IAAI,CAACuB,SAAAA,EAAW;AACd,gBAAA,OAAOzE,GAAAA,CAAIgE,KAAK,EAAA,CAAGY,WAAW;AAChC,YAAA;AACF,QAAA;QAEA,IAAIzE,gBAAAA,CAAiB+D,KAAAA,CAAMpD,IAAI,CAAA,EAAG;AAChCD,YAAAA,SAAAA,GAAYb,IAAIgE,KAAK,EAAA;AACvB,QAAA,CAAA,MAAO,IAAI5D,iBAAAA,CAAkB8D,KAAAA,CAAMpD,IAAI,CAAA,EAAG;YACxCD,SAAAA,GAAYoD,8BAAAA,CAA+BzC,gBAAgB0C,KAAAA,EAAOC,OAAAA,CAAAA;QACpE,CAAA,MAAO;YACL,IAAID,KAAAA,CAAMpD,IAAI,CAACe,IAAI,KAAK,WAAA,IAAeqC,KAAAA,CAAM5B,gBAAgB,EAAE;;AAE7D,gBAAA,MAAMuC,eAAAA,GAAkB;uBAClBX,KAAAA,EAAO5B,gBAAAA,EAAkBuC,mBAAmB,EAAE;oBAClDX,KAAAA,CAAMnD,gBAAgB,CAAC+D;AACxB,iBAAA;;;;;;;AASD,gBAAA,MAAMC,iBACJb,KAAAA,CAAMpD,IAAI,CAACgB,UAAU,IAAI+C,eAAAA,CAAgBxD,MAAM,KAAK,CAAA,GAChD6C,MAAMnD,gBAAgB,CAACL,KAAK,GAC5BwD,KAAAA,CAAM5B,gBAAgB,EAAEyC,cAAAA;AAG9B,gBAAA,MAAMC,mBAAAA,GAAwC;AAC5C,oBAAA,GAAGd,MAAM5B,gBAAgB;AACzBuC,oBAAAA,eAAAA;AACAE,oBAAAA;AACF,iBAAA;AAEAlE,gBAAAA,SAAAA,GAAYwB,yBAAyBb,cAAAA,CAAAA,CACnC;oBACEc,gBAAAA,EAAkB0C,mBAAAA;AAClBlE,oBAAAA,IAAAA,EAAMoD,MAAMpD,IAAI;AAChBC,oBAAAA,gBAAAA,EAAkBmD,MAAMnD;iBAC1B,EACAoD,OAAAA,CAAAA;YAEJ,CAAA,MAAO,IAAID,MAAMpD,IAAI,CAACe,IAAI,KAAK,aAAA,IAAiBqC,KAAAA,CAAM5B,gBAAgB,EAAE;AACtE,gBAAA,MAAM0C,mBAAAA,GAAwC;AAC5C,oBAAA,GAAGd,MAAM5B,gBAAgB;oBACzB2C,sBAAAA,EAAwBf,KAAAA,CAAMnD,gBAAgB,CAACL,KAAK;oBACpDmE,eAAAA,EAAiB;2BAAIX,KAAAA,CAAM5B,gBAAgB,CAACuC,eAAe;wBAAEX,KAAAA,CAAMnD,gBAAgB,CAAC+D;AAAK;AAC3F,iBAAA;gBAEAnB,MAAAA,CAAOuB,MAAM,CAAChB,KAAAA,EAAO;oBAAE5B,gBAAAA,EAAkB0C;AAAoB,iBAAA,CAAA;gBAE7DnE,SAAAA,GAAYsC,iBAAAA,CAAkB3B,gBAAgB0C,KAAAA,EAAOC,OAAAA,CAAAA;AACvD,YAAA,CAAA,MAAO,IAAID,KAAAA,CAAMpD,IAAI,CAACe,IAAI,KAAK,UAAA,EAAY;AACzChB,gBAAAA,SAAAA,GAAYkD,uBAAAA,CAAwB;AAClCjD,oBAAAA,IAAAA,EAAMoD,MAAMpD,IAAI;AAChBC,oBAAAA,gBAAAA,EAAkBmD,MAAMnD;AAC1B,iBAAA,CAAA;AACF,YAAA;AAEAF,YAAAA,SAAAA,GAAYoB,WAAAA,CAAYpB,SAAAA,CAAAA;AAC1B,QAAA;QAEAA,SAAAA,GAAYe,UAAAA,CAAWJ,gBAAgBX,SAAAA,EAAWqD,KAAAA,CAAAA;QAElD,OAAOrD,SAAAA;AACT,IAAA,CAAA;AAEF,MAAMoC,oBAAAA,GACJ,CAACzB,cAAAA,GACD,CAAC,EAAEc,gBAAgB,EAAEE,KAAK,EAAEU,IAAI,EAAEiC,MAAM,EAAuB,EAAEhB,OAAAA,GAAAA;AAC/D,QAAA,MAAMiB,kBAAAA,GAAqB5C,KAAAA,GAAQnC,qBAAAA,CAAsBmC,KAAAA,CAAAA,GAAgB,EAAE;AAE3E,QAAA,MAAMa,MAAAA,GAAS+B,kBAAAA,CAAmBC,MAAM,CACtC,CAACC,UAAAA,EAAYC,aAAAA,GAAAA;AACX,YAAA,MAAMrB,KAAAA,GAAQ;gBACZpD,IAAAA,EAAM0B,KAAAA,CAAMgD,UAAU,CAACD,aAAAA,CAAc;gBACrCxE,gBAAAA,EAAkB;oBAAE+D,IAAAA,EAAMS,aAAAA;AAAe7E,oBAAAA,KAAAA,EAAO0C,KAAKmC,aAAAA,EAAerC,IAAAA;AAAM,iBAAA;AAC1EA,gBAAAA,IAAAA;AACAV,gBAAAA,KAAAA;AACA2C,gBAAAA,MAAAA;AACA7C,gBAAAA;AACF,aAAA;YAEA,MAAMzB,SAAAA,GAAYyD,wBAAAA,CAAyB9C,cAAAA,CAAAA,CAAgB0C,KAAAA,EAAOC,OAAAA,CAAAA;YAElEmB,UAAU,CAACC,cAAc,GAAG1E,SAAAA;YAE5B,OAAOyE,UAAAA;AACT,QAAA,CAAA,EACA,EAAC,CAAA;AAGH,QAAA,OAAOtF,GAAAA,CAAIsD,MAAM,EAAA,CAAGC,KAAK,CAACF,MAAAA,CAAAA;AAC5B,IAAA,CAAA;AAEF,MAAMoC,uBAAuB,CAACjE,cAAAA,GAAAA;IAC5B,OAAO,OAILgB,KAAAA,EACAU,IAAAA,EACAiB,OAAAA,EACAgB,MAAAA,GAAAA;QAEA,IAAI,CAACO,SAASxC,IAAAA,CAAAA,EAAO;AACnB,YAAA,MAAM,EAAEyC,WAAW,EAAE,GAAGnD,MAAMoD,IAAI;AAElC,YAAA,MAAM,IAAIrF,eAAAA,CACR,CAAC,kCAAkC,EAAEiB,cAAAA,CAAe,sBAAsB,EAAEmE,WAAAA,CAAY,8BAA8B,EAAE,OAAOzC,IAAAA,CAAAA,CAAM,CAAA;AAEzI,QAAA;QAEA,MAAMrC,SAAAA,GAAYoC,qBAAqBzB,cAAAA,CAAAA,CACrC;AACEgB,YAAAA,KAAAA;AACAU,YAAAA,IAAAA;AACAiC,YAAAA,MAAAA;YACA7C,gBAAAA,EAAkB;;;;gBAIhBuD,aAAAA,EAAe;AACbC,oBAAAA,EAAAA,EAAIX,MAAAA,EAAQW,EAAAA;AACZtD,oBAAAA,KAAAA;AACA2B,oBAAAA;AACF,iBAAA;AACAU,gBAAAA,eAAAA,EAAiB,EAAE;AACnBE,gBAAAA,cAAAA,EAAgB;AAClB;SACF,EACA;AACExC,YAAAA,OAAAA,EAAS4B,SAAS5B,OAAAA,IAAW,KAAA;AAC7BwD,YAAAA,MAAAA,EAAQ5B,SAAS4B,MAAAA,IAAU;AAC7B,SAAA,CAAA,CAECC,IAAI,CACH,gBAAA,EACA,gCAAA,EACA,eAAeC,oBAAoB/C,IAAI,EAAA;YACrC,IAAI;AACF,gBAAA,MAAMgD,oBAAoBC,mBAAAA,CAAoB;AAAEC,oBAAAA,GAAAA,EAAK5D,MAAM4D,GAAG;AAAElD,oBAAAA;AAAK,iBAAA,CAAA,CAAA;AACvE,YAAA,CAAA,CAAE,OAAOmD,CAAAA,EAAG;gBACV,OAAO,IAAI,CAACC,WAAW,CAAC;oBACtBC,IAAAA,EAAM,IAAI,CAACA,IAAI;AACfC,oBAAAA,OAAAA,EAAS,CAACH,YAAa9F,eAAAA,IAAmB8F,CAAAA,CAAEG,OAAO,IAAK;AAC1D,iBAAA,CAAA;AACF,YAAA;YACA,OAAO,IAAA;AACT,QAAA,CAAA,CAAA,CAEDtF,QAAQ,EAAA;AAEX,QAAA,OAAOjB,kBAAkBY,SAAAA,EAAW;YAClC4F,MAAAA,EAAQ,KAAA;YACRC,UAAAA,EAAY;SACd,CAAA,CAAGxD,IAAAA,CAAAA;AACL,IAAA,CAAA;AACF,CAAA;AAEA;;AAEC,IACD,MAAMiD,mBAAAA,GAAsB,CAA0B,EACpDC,GAAG,EACHlD,IAAI,EAIL,GAAA;AACC,IAAA,IAAI,CAACkD,GAAAA,EAAK;AACR,QAAA,MAAM,IAAI7F,eAAAA,CAAgB,CAAC,gDAAgD,CAAC,CAAA;AAC9E,IAAA;AAEA,IAAA,IAAIoG,QAAQzD,IAAAA,CAAAA,EAAO;AACjB,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,MAAM0D,YAAAA,GAAenE,MAAAA,CAAOC,QAAQ,CAAC0D,GAAAA,CAAAA;IAErC,OAAOzC,MAAAA,CAAOC,IAAI,CAACgD,YAAAA,CAAapB,UAAU,CAAA,CAAEH,MAAM,CAChD,CAACwB,MAAAA,EAAQtB,aAAAA,GAAAA;AACP,QAAA,MAAMuB,SAAAA,GAAYF,YAAAA,CAAapB,UAAU,CAACD,aAAAA,CAAc;QACxD,MAAM7E,KAAAA,GAAQwC,IAAI,CAACqC,aAAAA,CAAc;AAEjC,QAAA,IAAIwB,MAAMrG,KAAAA,CAAAA,EAAQ;YAChB,OAAOmG,MAAAA;AACT,QAAA;AAEA,QAAA,OAAQC,UAAUjF,IAAI;YACpB,KAAK,UAAA;YACL,KAAK,OAAA;AAAS,gBAAA;AACZ,oBAAA,IACEiF,SAAAA,CAAUjF,IAAI,KAAK,UAAA,KAClBiF,SAAAA,CAAUE,QAAQ,KAAK,aAAA,IAAiBF,SAAAA,CAAUE,QAAQ,KAAK,YAAW,CAAA,EAC3E;AAEA,wBAAA;AACF,oBAAA;AAEA,oBAAA,MAAMC;AAEJH,oBAAAA,SAAAA,CAAUjF,IAAI,KAAK,OAAA,GAAU,qBAAA,GAAwBiF,UAAUG,MAAM;;;oBAGvE,IAAIC,MAAAA;oBACJ,IAAI/F,KAAAA,CAAMC,OAAO,CAACV,KAAAA,CAAAA,EAAQ;wBACxBwG,MAAAA,GAASxG,KAAAA;oBACX,CAAA,MAAO,IAAIgF,SAAShF,KAAAA,CAAAA,EAAQ;AAC1B,wBAAA,IAAI,aAAaA,KAAAA,IAAS,CAACqG,KAAAA,CAAMrG,KAAAA,CAAMyG,OAAO,CAAA,EAAG;AAC/CD,4BAAAA,MAAAA,GAASxG,MAAMyG,OAAO;AACxB,wBAAA,CAAA,MAAO,IAAI,KAAA,IAASzG,KAAAA,IAAS,CAACqG,KAAAA,CAAMrG,KAAAA,CAAM0G,GAAG,CAAA,EAAG;AAC9CF,4BAAAA,MAAAA,GAASxG,MAAM0G,GAAG;wBACpB,CAAA,MAAO;AACLF,4BAAAA,MAAAA,GAAS,EAAE;AACb,wBAAA;oBACF,CAAA,MAAO;AACLA,wBAAAA,MAAAA,GAASG,SAAAA,CAAU3G,KAAAA,CAAAA;AACrB,oBAAA;AACA,oBAAA,MAAM4G,UAAUJ,MAAAA,CAAOK,GAAG,CAAC,CAACC,KAAO;AACjC1B,4BAAAA,EAAAA,EAAI,OAAO0B,CAAAA,KAAM,QAAA,GAAWA,CAAAA,CAAE1B,EAAE,GAAG0B;yBACrC,CAAA,CAAA;;;AAIAX,oBAAAA,MAAM,CAACI,MAAAA,CAAO,GAAGJ,MAAM,CAACI,MAAAA,CAAO,IAAI,EAAE;AACrCJ,oBAAAA,MAAM,CAACI,MAAAA,CAAO,CAACQ,IAAI,CAAA,GAAIH,OAAAA,CAAAA;AACvB,oBAAA;AACF,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,OAAOD,SAAAA,CAAU3G,KAAAA,CAAAA,CAAO2E,MAAM,CAAC,CAACqC,cAAAA,EAAgBC,cAAAA,GAAAA;wBAC9C,IAAI,CAACb,SAAAA,CAAUnE,SAAS,EAAE;AACxB,4BAAA,MAAM,IAAIpC,eAAAA,CACR,CAAC,8EAA8E,CAAC,CAAA;AAEpF,wBAAA;wBAEA,OAAOqH,SAAAA,CACLF,gBACAvB,mBAAAA,CAAoB;AAClBC,4BAAAA,GAAAA,EAAKU,UAAUnE,SAAS;4BACxBO,IAAAA,EAAMyE;AACR,yBAAA,CAAA,EACA,CAACE,QAAAA,EAAUC,QAAAA,GAAAA;AACT,4BAAA,IAAI1G,QAAQyG,QAAAA,CAAAA,EAAW;gCACrB,OAAOA,QAAAA,CAAS/D,MAAM,CAACgE,QAAAA,CAAAA;AACzB,4BAAA;AACF,wBAAA,CAAA,CAAA;oBAEJ,CAAA,EAAGjB,MAAAA,CAAAA;AACL,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,OAAOQ,SAAAA,CAAU3G,KAAAA,CAAAA,CAAO2E,MAAM,CAAC,CAACqC,cAAAA,EAAgBK,OAAAA,GAAAA;AAC9C,wBAAA,MAAMrH,KAAAA,GAAQqH,OAAAA;wBACd,IAAI,CAACrH,KAAAA,CAAM8C,WAAW,EAAE;AACtB,4BAAA,MAAM,IAAIjD,eAAAA,CACR,CAAC,gFAAgF,CAAC,CAAA;AAEtF,wBAAA;wBAEA,OAAOqH,SAAAA,CACLF,gBACAvB,mBAAAA,CAAoB;AAClBC,4BAAAA,GAAAA,EAAK1F,MAAM8C,WAAW;4BACtBN,IAAAA,EAAMxC;AACR,yBAAA,CAAA,EACA,CAACmH,QAAAA,EAAUC,QAAAA,GAAAA;AACT,4BAAA,IAAI1G,QAAQyG,QAAAA,CAAAA,EAAW;gCACrB,OAAOA,QAAAA,CAAS/D,MAAM,CAACgE,QAAAA,CAAAA;AACzB,4BAAA;AACF,wBAAA,CAAA,CAAA;oBAEJ,CAAA,EAAGjB,MAAAA,CAAAA;AACL,gBAAA;AAGF;QAEA,OAAOA,MAAAA;AACT,IAAA,CAAA,EACA,EAAC,CAAA;AAEL,CAAA;AAEA;;;AAGC,IACD,MAAMX,mBAAAA,GAAsB,OAAOwB,cAAAA,GAAuC,EAAE,GAAA;AAC1E,IAAA,MAAMM,WAA4B,EAAE;IAEpC,KAAK,MAAM,CAACC,GAAAA,EAAKvH,KAAAA,CAAM,IAAIiD,MAAAA,CAAOuE,OAAO,CAACR,cAAAA,CAAAA,CAAiB;AACzD,QAAA,MAAMS,QAAAA,GAAW,UAAA;AACf,YAAA,MAAMC,YAAAA,GAAeC,MAAAA,CAAO3H,KAAAA,EAAO,CAAC,EAAE,CAAC,CAAA;YACvC,MAAM4H,KAAAA,GAAQ,MAAM7F,MAAAA,CAAO8F,EAAE,CAACC,KAAK,CAACP,GAAAA,CAAAA,CAAmBK,KAAK,CAAC;gBAC3DG,KAAAA,EAAO;oBACL3C,EAAAA,EAAI;AACF4C,wBAAAA,GAAAA,EAAKN,aAAab,GAAG,CAAC,CAACC,CAAAA,GAAMA,EAAE1B,EAAE;AACnC;AACF;AACF,aAAA,CAAA;YAEA,IAAIwC,KAAAA,KAAUF,YAAAA,CAAa/G,MAAM,EAAE;gBACjC,MAAM,IAAId,eAAAA,CACR,CAAA,EACE6H,YAAAA,CAAa/G,MAAM,GAAGiH,KAAAA,CACvB,qBAAqB,EAAEL,GAAAA,CAAI,yCAAyC,CAAC,CAAA;AAE1E,YAAA;AACF,QAAA,CAAA;AACAD,QAAAA,QAAAA,CAASP,IAAI,CAACU,QAAAA,EAAAA,CAAAA;AAChB,IAAA;IAEA,OAAOQ,OAAAA,CAAQC,GAAG,CAACZ,QAAAA,CAAAA;AACrB,CAAA;AAEA,MAAMa,eAAAA,GAA2D;AAC/DC,IAAAA,sBAAAA,EAAwBrD,oBAAAA,CAAqB,UAAA,CAAA;AAC7CsD,IAAAA,oBAAAA,EAAsBtD,oBAAAA,CAAqB,QAAA;AAC7C;;;;"}