import { defaultFetch } from '@aztec/foundation/json-rpc/client'; import { z } from 'zod'; import type { ApiSchemaFor } from '../schemas/schemas.js'; import { type Offense, type SlashPayloadRound } from '../slashing/index.js'; import { type ComponentsVersions } from '../versioning/index.js'; import { type ArchiverSpecificConfig } from './archiver.js'; import { type SequencerConfig } from './configs.js'; import { type ProverConfig } from './prover-client.js'; import { type SlasherConfig } from './slasher.js'; import { type ValidatorClientFullConfig } from './validator.js'; /** * Aztec node admin API. */ export interface AztecNodeAdmin { /** * Retrieves the configuration of this node. */ getConfig(): Promise; /** * Updates the configuration of this node. * @param config - Updated configuration to be merged with the current one. */ setConfig(config: Partial): Promise; /** * Pauses syncing, creates a backup of archiver and world-state databases, and uploads them. Returns immediately. * @param location - The location to upload the snapshot to. */ startSnapshotUpload(location: string): Promise; /** * Pauses syncing and rolls back the database to the target L2 block number. * @param targetBlockNumber - The block number to roll back to. * @param force - If true, clears the world state db and p2p dbs if rolling back to behind the finalized block. */ rollbackTo(targetBlockNumber: number, force?: boolean): Promise; /** Pauses archiver and world state syncing. */ pauseSync(): Promise; /** Resumes archiver and world state syncing. */ resumeSync(): Promise; /** Returns all monitored payloads by the slasher for the current round. */ getSlashPayloads(): Promise; /** Returns all offenses applicable for the given round. */ getSlashOffenses(round: bigint | 'all' | 'current'): Promise; /** * Reloads keystore configuration from disk. * * What is updated: * - Validator attester keys * - Coinbase address per validator * - Fee recipient address per validator * * What is NOT updated (requires node restart): * - L1 publisher signers (the funded accounts that send L1 transactions) * - Prover keys * - HA signer PostgreSQL connections * * Notes: * - New validators must use a publisher key that was already configured at node * startup (or omit the publisher field to fall back to the attester key). * A validator with an unknown publisher key will cause the reload to be rejected. */ reloadKeystore(): Promise; } export type AztecNodeAdminConfig = Omit & SequencerConfig & ProverConfig & SlasherConfig & Pick & { maxPendingTxCount: number; }; export declare const AztecNodeAdminConfigSchema: z.ZodObject<{ sequencerPollingIntervalMS: z.ZodOptional; maxTxsPerBlock: z.ZodOptional; maxTxsPerCheckpoint: z.ZodOptional; minValidTxsPerBlock: z.ZodOptional; minTxsPerBlock: z.ZodOptional; maxL2BlockGas: z.ZodOptional; publishTxsWithProposals: z.ZodOptional; maxDABlockGas: z.ZodOptional; perBlockAllocationMultiplier: z.ZodOptional; redistributeCheckpointBudget: z.ZodOptional; coinbase: z.ZodOptional>; feeRecipient: z.ZodOptional>; acvmWorkingDirectory: z.ZodOptional; acvmBinaryPath: z.ZodOptional; governanceProposerPayload: z.ZodOptional>; l1PublishingTime: z.ZodOptional; enforceTimeTable: z.ZodOptional; fakeProcessingDelayPerTxMs: z.ZodOptional; fakeThrowAfterProcessingTxCount: z.ZodOptional; attestationPropagationTime: z.ZodOptional; skipCollectingAttestations: z.ZodOptional; skipInvalidateBlockAsProposer: z.ZodOptional; secondsBeforeInvalidatingBlockAsCommitteeMember: z.ZodNumber; secondsBeforeInvalidatingBlockAsNonCommitteeMember: z.ZodNumber; injectFakeAttestation: z.ZodOptional; injectHighSValueAttestation: z.ZodOptional; injectUnrecoverableSignatureAttestation: z.ZodOptional; shuffleAttestationOrdering: z.ZodOptional; blockDurationMs: z.ZodOptional; expectedBlockProposalsPerSlot: z.ZodOptional; buildCheckpointIfEmpty: z.ZodOptional; minBlocksForCheckpoint: z.ZodOptional; skipPublishingCheckpointsPercent: z.ZodOptional; slashOverridePayload: z.ZodOptional>; slashMinPenaltyPercentage: z.ZodNumber; slashMaxPenaltyPercentage: z.ZodNumber; slashValidatorsAlways: z.ZodArray, "many">; slashValidatorsNever: z.ZodArray, "many">; slashPrunePenalty: z.ZodPipeline, z.ZodBigInt>; slashDataWithholdingPenalty: z.ZodPipeline, z.ZodBigInt>; slashInactivityTargetPercentage: z.ZodNumber; slashInactivityConsecutiveEpochThreshold: z.ZodNumber; slashInactivityPenalty: z.ZodPipeline, z.ZodBigInt>; slashProposeInvalidAttestationsPenalty: z.ZodPipeline, z.ZodBigInt>; slashAttestDescendantOfInvalidPenalty: z.ZodPipeline, z.ZodBigInt>; slashUnknownPenalty: z.ZodPipeline, z.ZodBigInt>; slashOffenseExpirationRounds: z.ZodNumber; slashMaxPayloadSize: z.ZodNumber; slashGracePeriodL2Slots: z.ZodNumber; slashExecuteRoundsLookBack: z.ZodNumber; slashSelfAllowed: z.ZodOptional; nodeUrl: z.ZodOptional; realProofs: z.ZodBoolean; proverId: z.ZodOptional>; proverTestDelayType: z.ZodEnum<["fixed", "realistic"]>; proverTestDelayMs: z.ZodNumber; proverTestDelayFactor: z.ZodNumber; proverAgentCount: z.ZodNumber; proofStore: z.ZodOptional; failedProofStore: z.ZodOptional; cancelJobsOnStop: z.ZodBoolean; enqueueConcurrency: z.ZodNumber; } & { haSigningEnabled: z.ZodBoolean; nodeId: z.ZodString; pollingIntervalMs: z.ZodNumber; signingTimeoutMs: z.ZodNumber; maxStuckDutiesAgeMs: z.ZodOptional; cleanupOldDutiesAfterHours: z.ZodOptional; databaseUrl: z.ZodOptional; poolMaxCount: z.ZodOptional; poolMinCount: z.ZodOptional; poolIdleTimeoutMs: z.ZodOptional; poolConnectionTimeoutMs: z.ZodOptional; validatorAddresses: z.ZodOptional, "many">>; disableValidator: z.ZodBoolean; disabledValidators: z.ZodArray, "many">; attestationPollingIntervalMs: z.ZodNumber; validatorReexecute: z.ZodBoolean; alwaysReexecuteBlockProposals: z.ZodOptional; fishermanMode: z.ZodOptional; skipCheckpointProposalValidation: z.ZodOptional; skipPushProposedBlocksToArchiver: z.ZodOptional; attestToEquivocatedProposals: z.ZodOptional; validateMaxL2BlockGas: z.ZodOptional; validateMaxDABlockGas: z.ZodOptional; validateMaxTxsPerBlock: z.ZodOptional; validateMaxTxsPerCheckpoint: z.ZodOptional; txPublicSetupAllowListExtend: z.ZodOptional; selector: import("../schemas/schemas.js").ZodFor; onlySelf: z.ZodOptional; rejectNullMsgSender: z.ZodOptional; calldataLength: z.ZodOptional; }, "strip", z.ZodTypeAny, { address: import("../aztec-address/index.js").AztecAddress; selector: import("../abi/function_selector.js").FunctionSelector; onlySelf?: boolean | undefined; rejectNullMsgSender?: boolean | undefined; calldataLength?: number | undefined; }, { address?: any; selector?: any; onlySelf?: boolean | undefined; rejectNullMsgSender?: boolean | undefined; calldataLength?: number | undefined; }>, z.ZodObject<{ classId: import("../schemas/schemas.js").ZodFor; selector: import("../schemas/schemas.js").ZodFor; onlySelf: z.ZodOptional; rejectNullMsgSender: z.ZodOptional; calldataLength: z.ZodOptional; }, "strip", z.ZodTypeAny, { classId: import("@aztec/foundation/schemas").Fr; selector: import("../abi/function_selector.js").FunctionSelector; onlySelf?: boolean | undefined; rejectNullMsgSender?: boolean | undefined; calldataLength?: number | undefined; }, { classId?: any; selector?: any; onlySelf?: boolean | undefined; rejectNullMsgSender?: boolean | undefined; calldataLength?: number | undefined; }>]>, "many">>; broadcastInvalidBlockProposal: z.ZodOptional; slashBroadcastedInvalidBlockPenalty: z.ZodPipeline, z.ZodBigInt>; slashDuplicateProposalPenalty: z.ZodPipeline, z.ZodBigInt>; slashDuplicateAttestationPenalty: z.ZodPipeline, z.ZodBigInt>; disableTransactions: z.ZodOptional; } & Pick<{ archiverPollingIntervalMS: z.ZodOptional, z.ZodNumber>>; archiverBatchSize: z.ZodOptional, z.ZodNumber>>; viemPollingIntervalMS: z.ZodOptional, z.ZodNumber>>; maxLogs: z.ZodOptional, z.ZodNumber>>; archiverStoreMapSizeKb: z.ZodOptional, z.ZodNumber>>; maxAllowedEthClientDriftSeconds: z.ZodOptional, z.ZodNumber>>; ethereumAllowNoDebugHosts: z.ZodOptional; skipValidateCheckpointAttestations: z.ZodOptional; }, "archiverBatchSize" | "archiverPollingIntervalMS" | "skipValidateCheckpointAttestations"> & { maxPendingTxCount: z.ZodNumber; }, "strip", z.ZodTypeAny, { sequencerPollingIntervalMS?: number | undefined; maxTxsPerBlock?: number | undefined; maxTxsPerCheckpoint?: number | undefined; minValidTxsPerBlock?: number | undefined; minTxsPerBlock?: number | undefined; maxL2BlockGas?: number | undefined; publishTxsWithProposals?: boolean | undefined; maxDABlockGas?: number | undefined; perBlockAllocationMultiplier?: number | undefined; redistributeCheckpointBudget?: boolean | undefined; coinbase?: import("@aztec/foundation/eth-address").EthAddress | undefined; feeRecipient?: import("../aztec-address/index.js").AztecAddress | undefined; acvmWorkingDirectory?: string | undefined; acvmBinaryPath?: string | undefined; governanceProposerPayload?: import("@aztec/foundation/eth-address").EthAddress | undefined; l1PublishingTime?: number | undefined; enforceTimeTable?: boolean | undefined; fakeProcessingDelayPerTxMs?: number | undefined; fakeThrowAfterProcessingTxCount?: number | undefined; attestationPropagationTime?: number | undefined; skipCollectingAttestations?: boolean | undefined; skipInvalidateBlockAsProposer?: boolean | undefined; secondsBeforeInvalidatingBlockAsCommitteeMember: number; secondsBeforeInvalidatingBlockAsNonCommitteeMember: number; injectFakeAttestation?: boolean | undefined; injectHighSValueAttestation?: boolean | undefined; injectUnrecoverableSignatureAttestation?: boolean | undefined; shuffleAttestationOrdering?: boolean | undefined; blockDurationMs?: number | undefined; expectedBlockProposalsPerSlot?: number | undefined; buildCheckpointIfEmpty?: boolean | undefined; minBlocksForCheckpoint?: number | undefined; skipPublishingCheckpointsPercent?: number | undefined; haSigningEnabled: boolean; nodeId: string; pollingIntervalMs: number; signingTimeoutMs: number; maxStuckDutiesAgeMs?: number | undefined; cleanupOldDutiesAfterHours?: number | undefined; databaseUrl?: string | undefined; poolMaxCount?: number | undefined; poolMinCount?: number | undefined; poolIdleTimeoutMs?: number | undefined; poolConnectionTimeoutMs?: number | undefined; archiverPollingIntervalMS?: number | undefined; archiverBatchSize?: number | undefined; skipValidateCheckpointAttestations?: boolean | undefined; slashOverridePayload?: import("@aztec/foundation/eth-address").EthAddress | undefined; slashMinPenaltyPercentage: number; slashMaxPenaltyPercentage: number; slashValidatorsAlways: import("@aztec/foundation/eth-address").EthAddress[]; slashValidatorsNever: import("@aztec/foundation/eth-address").EthAddress[]; slashPrunePenalty: bigint; slashDataWithholdingPenalty: bigint; slashInactivityTargetPercentage: number; slashInactivityConsecutiveEpochThreshold: number; slashInactivityPenalty: bigint; slashProposeInvalidAttestationsPenalty: bigint; slashAttestDescendantOfInvalidPenalty: bigint; slashUnknownPenalty: bigint; slashOffenseExpirationRounds: number; slashMaxPayloadSize: number; slashGracePeriodL2Slots: number; slashExecuteRoundsLookBack: number; slashSelfAllowed?: boolean | undefined; nodeUrl?: string | undefined; realProofs: boolean; proverId?: import("@aztec/foundation/eth-address").EthAddress | undefined; proverTestDelayType: "fixed" | "realistic"; proverTestDelayMs: number; proverTestDelayFactor: number; proverAgentCount: number; proofStore?: string | undefined; failedProofStore?: string | undefined; cancelJobsOnStop: boolean; enqueueConcurrency: number; validatorAddresses?: import("@aztec/foundation/eth-address").EthAddress[] | undefined; disableValidator: boolean; disabledValidators: import("@aztec/foundation/eth-address").EthAddress[]; attestationPollingIntervalMs: number; validatorReexecute: boolean; alwaysReexecuteBlockProposals?: boolean | undefined; fishermanMode?: boolean | undefined; skipCheckpointProposalValidation?: boolean | undefined; skipPushProposedBlocksToArchiver?: boolean | undefined; attestToEquivocatedProposals?: boolean | undefined; validateMaxL2BlockGas?: number | undefined; validateMaxDABlockGas?: number | undefined; validateMaxTxsPerBlock?: number | undefined; validateMaxTxsPerCheckpoint?: number | undefined; txPublicSetupAllowListExtend?: ({ address: import("../aztec-address/index.js").AztecAddress; selector: import("../abi/function_selector.js").FunctionSelector; onlySelf?: boolean | undefined; rejectNullMsgSender?: boolean | undefined; calldataLength?: number | undefined; } | { classId: import("@aztec/foundation/schemas").Fr; selector: import("../abi/function_selector.js").FunctionSelector; onlySelf?: boolean | undefined; rejectNullMsgSender?: boolean | undefined; calldataLength?: number | undefined; })[] | undefined; broadcastInvalidBlockProposal?: boolean | undefined; slashBroadcastedInvalidBlockPenalty: bigint; slashDuplicateProposalPenalty: bigint; slashDuplicateAttestationPenalty: bigint; disableTransactions?: boolean | undefined; maxPendingTxCount: number; }, { sequencerPollingIntervalMS?: number | undefined; maxTxsPerBlock?: number | undefined; maxTxsPerCheckpoint?: number | undefined; minValidTxsPerBlock?: number | undefined; minTxsPerBlock?: number | undefined; maxL2BlockGas?: number | undefined; publishTxsWithProposals?: boolean | undefined; maxDABlockGas?: number | undefined; perBlockAllocationMultiplier?: number | undefined; redistributeCheckpointBudget?: boolean | undefined; coinbase?: any; feeRecipient?: any; acvmWorkingDirectory?: string | undefined; acvmBinaryPath?: string | undefined; governanceProposerPayload?: any; l1PublishingTime?: number | undefined; enforceTimeTable?: boolean | undefined; fakeProcessingDelayPerTxMs?: number | undefined; fakeThrowAfterProcessingTxCount?: number | undefined; attestationPropagationTime?: number | undefined; skipCollectingAttestations?: boolean | undefined; skipInvalidateBlockAsProposer?: boolean | undefined; secondsBeforeInvalidatingBlockAsCommitteeMember: number; secondsBeforeInvalidatingBlockAsNonCommitteeMember: number; injectFakeAttestation?: boolean | undefined; injectHighSValueAttestation?: boolean | undefined; injectUnrecoverableSignatureAttestation?: boolean | undefined; shuffleAttestationOrdering?: boolean | undefined; blockDurationMs?: number | undefined; expectedBlockProposalsPerSlot?: number | undefined; buildCheckpointIfEmpty?: boolean | undefined; minBlocksForCheckpoint?: number | undefined; skipPublishingCheckpointsPercent?: number | undefined; haSigningEnabled: boolean; nodeId: string; pollingIntervalMs: number; signingTimeoutMs: number; maxStuckDutiesAgeMs?: number | undefined; cleanupOldDutiesAfterHours?: number | undefined; databaseUrl?: string | undefined; poolMaxCount?: number | undefined; poolMinCount?: number | undefined; poolIdleTimeoutMs?: number | undefined; poolConnectionTimeoutMs?: number | undefined; archiverPollingIntervalMS?: string | number | bigint | undefined; archiverBatchSize?: string | number | bigint | undefined; skipValidateCheckpointAttestations?: boolean | undefined; slashOverridePayload?: string | undefined; slashMinPenaltyPercentage: number; slashMaxPenaltyPercentage: number; slashValidatorsAlways: string[]; slashValidatorsNever: string[]; slashPrunePenalty: string | number | bigint; slashDataWithholdingPenalty: string | number | bigint; slashInactivityTargetPercentage: number; slashInactivityConsecutiveEpochThreshold: number; slashInactivityPenalty: string | number | bigint; slashProposeInvalidAttestationsPenalty: string | number | bigint; slashAttestDescendantOfInvalidPenalty: string | number | bigint; slashUnknownPenalty: string | number | bigint; slashOffenseExpirationRounds: number; slashMaxPayloadSize: number; slashGracePeriodL2Slots: number; slashExecuteRoundsLookBack: number; slashSelfAllowed?: boolean | undefined; nodeUrl?: string | undefined; realProofs: boolean; proverId?: any; proverTestDelayType: "fixed" | "realistic"; proverTestDelayMs: number; proverTestDelayFactor: number; proverAgentCount: number; proofStore?: string | undefined; failedProofStore?: string | undefined; cancelJobsOnStop: boolean; enqueueConcurrency: number; validatorAddresses?: string[] | undefined; disableValidator: boolean; disabledValidators: string[]; attestationPollingIntervalMs: number; validatorReexecute: boolean; alwaysReexecuteBlockProposals?: boolean | undefined; fishermanMode?: boolean | undefined; skipCheckpointProposalValidation?: boolean | undefined; skipPushProposedBlocksToArchiver?: boolean | undefined; attestToEquivocatedProposals?: boolean | undefined; validateMaxL2BlockGas?: number | undefined; validateMaxDABlockGas?: number | undefined; validateMaxTxsPerBlock?: number | undefined; validateMaxTxsPerCheckpoint?: number | undefined; txPublicSetupAllowListExtend?: ({ address?: any; selector?: any; onlySelf?: boolean | undefined; rejectNullMsgSender?: boolean | undefined; calldataLength?: number | undefined; } | { classId?: any; selector?: any; onlySelf?: boolean | undefined; rejectNullMsgSender?: boolean | undefined; calldataLength?: number | undefined; })[] | undefined; broadcastInvalidBlockProposal?: boolean | undefined; slashBroadcastedInvalidBlockPenalty: string | number | bigint; slashDuplicateProposalPenalty: string | number | bigint; slashDuplicateAttestationPenalty: string | number | bigint; disableTransactions?: boolean | undefined; maxPendingTxCount: number; }>; export declare const AztecNodeAdminApiSchema: ApiSchemaFor; export declare function createAztecNodeAdminClient(url: string, versions?: Partial, fetch?: typeof defaultFetch, apiKey?: string): AztecNodeAdmin; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWMtbm9kZS1hZG1pbi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVyZmFjZXMvYXp0ZWMtbm9kZS1hZG1pbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTJCLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRTFGLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFpQixLQUFLLGlCQUFpQixFQUEyQixNQUFNLHNCQUFzQixDQUFDO0FBQ3BILE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUFnQyxNQUFNLHdCQUF3QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxLQUFLLHNCQUFzQixFQUFnQyxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXlCLE1BQU0sY0FBYyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBc0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsS0FBSyxhQUFhLEVBQXVCLE1BQU0sY0FBYyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxLQUFLLHlCQUF5QixFQUFtQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpHOztHQUVHO0FBQ0gsTUFBTSxXQUFXLGNBQWM7SUFDN0I7O09BRUc7SUFDSCxTQUFTLElBQUksT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFM0M7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsb0JBQW9CLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFaEU7OztPQUdHO0lBQ0gsbUJBQW1CLENBQUMsUUFBUSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFckQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV0RSwrQ0FBK0M7SUFDL0MsU0FBUyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUUzQixnREFBZ0Q7SUFDaEQsVUFBVSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU1QiwyRUFBMkU7SUFDM0UsZ0JBQWdCLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUVqRCwyREFBMkQ7SUFDM0QsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxLQUFLLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRXhFOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILGNBQWMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDakM7QUFHRCxNQUFNLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLGFBQWEsQ0FBQyxHQUMvRSxlQUFlLEdBQ2YsWUFBWSxHQUNaLGFBQWEsR0FDYixJQUFJLENBQ0Ysc0JBQXNCLEVBQ3RCLDJCQUEyQixHQUFHLG1CQUFtQixHQUFHLG9DQUFvQyxDQUN6RixHQUFHO0lBQ0YsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO0NBQzNCLENBQUM7QUFFSixlQUFPLE1BQU0sMEJBQTBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQVVjLENBQUM7QUFFdEQsZUFBTyxNQUFNLHVCQUF1QixFQUFFLFlBQVksQ0FBQyxjQUFjLENBYWhFLENBQUM7QUFFRix3QkFBZ0IsMEJBQTBCLENBQ3hDLEdBQUcsRUFBRSxNQUFNLEVBQ1gsUUFBUSxHQUFFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBTSxFQUMxQyxLQUFLLHNCQUFlLEVBQ3BCLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FDZCxjQUFjLENBT2hCIn0=